Commit 136c886a authored by Archit Tamarapu's avatar Archit Tamarapu
Browse files

avoid computing gains if ISM position didnt change for renderIsmTo{BinauralRoom,Mc,Sba}

parent 93521388
Loading
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -167,6 +167,7 @@

#define FIX_718_JBM_MD_UDPATE                           /* Fhg: fix issue #718, wrong setting of the update flag in the TD obj renderer in the JBM path */
#define FIX_719_CRASH_IN_CLEANUP                        /* VA: issue 719: fix Decoder crash after call to goto to cleanup */
#define FIX_518_ISM_BRIR_EXTREND                        /* FhG: fix issue #518, cleanup ISM to BINAURAL_ROOM_IR rendering in the external renderer */


/* ################## End BE DEVELOPMENT switches ######################### */
+168 −25
Original line number Diff line number Diff line
@@ -144,6 +144,9 @@ typedef struct
    CREND_WRAPPER_HANDLE crendWrapper;
    REVERB_HANDLE hReverb;
    rotation_matrix rot_mat_prev;
#ifdef FIX_518_ISM_BRIR_EXTREND
    pan_vector prev_pan_gains;
#endif
#ifdef SPLIT_REND_WITH_HEAD_ROT
    TDREND_WRAPPER splitTdRendWrappers[MAX_HEAD_ROT_POSES - 1]; /* Additional TD Rend instances used for split rendering */
#endif
@@ -1384,6 +1387,9 @@ static ivas_error setRendInputActiveIsm(
    inputIsm->hReverb = NULL;
    inputIsm->tdRendWrapper = defaultTdRendWrapper();
    initRotMatrix( inputIsm->rot_mat_prev );
#ifdef FIX_518_ISM_BRIR_EXTREND
    set_zero( inputIsm->prev_pan_gains, MAX_OUTPUT_CHANNELS );
#endif

#ifdef SPLIT_REND_WITH_HEAD_ROT
    for ( i = 0; i < (int16_t) ( sizeof( inputIsm->splitTdRendWrappers ) / sizeof( *inputIsm->splitTdRendWrappers ) ); ++i )
@@ -6132,7 +6138,10 @@ static ivas_error renderIsmToBinauralRoom(
    input_ism *ismInput,
    IVAS_REND_AudioBuffer outAudio )
{
    int16_t i;
#ifdef FIX_518_ISM_BRIR_EXTREND
    int16_t position_changed;
#endif
    int16_t i, j;
    int16_t azi_rot, ele_rot;
    int16_t subframe_idx;
#ifndef API_5MS
@@ -6143,12 +6152,16 @@ static ivas_error renderIsmToBinauralRoom(
    float tmpRendBuffer[MAX_OUTPUT_CHANNELS][L_FRAME48k];
    ivas_error error;
    pan_vector currentPanGains;
#ifndef FIX_518_ISM_BRIR_EXTREND
    pan_vector previousPanGains;
#endif
    IVAS_REND_AudioBuffer tmpMcBuffer;
#ifdef FIX_518_ISM_BRIR_EXTREND
    IVAS_REND_AudioObjectPosition rotatedPosPrev;
#endif
    IVAS_REND_AudioObjectPosition rotatedPos;
    const COMBINED_ORIENTATION_HANDLE *hCombinedOrientationData;
    int8_t combinedOrientationEnabled;
    int16_t j;
    float *p_tmpRendBuffer[MAX_OUTPUT_CHANNELS];

    for ( i = 0; i < MAX_OUTPUT_CHANNELS; i++ )
@@ -6158,6 +6171,10 @@ static ivas_error renderIsmToBinauralRoom(

    push_wmops( "renderIsmToBinauralRoom" );

#ifdef FIX_518_ISM_BRIR_EXTREND
    position_changed = FALSE;
    rotatedPosPrev = defaultObjectPosition();
#endif
    rotatedPos = defaultObjectPosition();

    hCombinedOrientationData = ismInput->base.ctx.pCombinedOrientationData;
@@ -6212,6 +6229,7 @@ static ivas_error renderIsmToBinauralRoom(
#endif
    }

#ifndef FIX_518_ISM_BRIR_EXTREND
    /* TODO tmu : see issue #518 */
    /* Possible optimization: less processing needed if position didn't change
     * needs a lot of cleanup, we could also add rot_gains_prev to ismInput and use that */
@@ -6230,15 +6248,41 @@ static ivas_error renderIsmToBinauralRoom(
    {
        return error;
    }
#else
    /* get previous position */
    if ( combinedOrientationEnabled )
    {
        rotateAziEle( ismInput->previousPos.azimuth, ismInput->previousPos.elevation, &azi_rot, &ele_rot, ismInput->rot_mat_prev, 0 );
        rotatedPosPrev.azimuth = (float) azi_rot;
        rotatedPosPrev.elevation = (float) ele_rot;
    }
    else
    {
        rotatedPosPrev.azimuth = ismInput->previousPos.azimuth;
        rotatedPosPrev.elevation = ismInput->previousPos.elevation;
    }
#endif

    /* current position gains */
    /* get current position */
    if ( combinedOrientationEnabled )
    {
        rotateAziEle( ismInput->currentPos.azimuth, ismInput->currentPos.elevation, &azi_rot, &ele_rot, Rmat, 0 );
        rotatedPos.azimuth = (float) azi_rot;
        rotatedPos.elevation = (float) ele_rot;
    }
#ifdef FIX_518_ISM_BRIR_EXTREND
    else
    {
        rotatedPos.azimuth = ismInput->currentPos.azimuth;
        rotatedPos.elevation = ismInput->currentPos.elevation;
    }

    /* compute gains only if position changed */
    if ( rotatedPos.azimuth != rotatedPosPrev.azimuth &&
         rotatedPos.elevation != rotatedPosPrev.elevation )
    {
        position_changed = TRUE;
#endif
        if ( ( error = getEfapGains( *ismInput->base.ctx.pEfapOutWrapper,
                                     ( combinedOrientationEnabled ) ? rotatedPos.azimuth : ismInput->currentPos.azimuth,
                                     ( combinedOrientationEnabled ) ? rotatedPos.elevation : ismInput->currentPos.elevation,
@@ -6246,11 +6290,10 @@ static ivas_error renderIsmToBinauralRoom(
        {
            return error;
        }

    for ( i = 0; i < 3; i++ )
    {
        mvr2r( Rmat[i], ismInput->rot_mat_prev[i], 3 );
#ifdef FIX_518_ISM_BRIR_EXTREND
    }
#endif


    /* intermediate rendering to 7_1_4 */
    tmpMcBuffer = ismInput->base.inputBuffer;
@@ -6264,10 +6307,31 @@ static ivas_error renderIsmToBinauralRoom(
    tmpMcBuffer.data = malloc( tmpMcBuffer.config.numSamplesPerChannel * tmpMcBuffer.config.numChannels * sizeof( float ) );
    set_zero( tmpMcBuffer.data, tmpMcBuffer.config.numSamplesPerChannel * tmpMcBuffer.config.numChannels );

    renderBufferChannelLerp( ismInput->base.inputBuffer, 0, currentPanGains, previousPanGains, tmpMcBuffer );
    renderBufferChannelLerp( ismInput->base.inputBuffer, 0,
#ifdef FIX_518_ISM_BRIR_EXTREND
                             position_changed ? currentPanGains : ismInput->prev_pan_gains,
                             position_changed ? ismInput->prev_pan_gains : NULL,
#else
                             currentPanGains,
                             previousPanGains,
#endif
                             tmpMcBuffer );

    copyBufferTo2dArray( tmpMcBuffer, tmpRendBuffer );

    /* save gains for next frame */
    for ( i = 0; i < 3; i++ )
    {
        mvr2r( Rmat[i], ismInput->rot_mat_prev[i], 3 );
    }
#ifdef FIX_518_ISM_BRIR_EXTREND
    if ( position_changed )
    {
        mvr2r( currentPanGains, ismInput->prev_pan_gains, MAX_OUTPUT_CHANNELS );
    }

#endif
    /* render 7_1_4 with BRIRs */
    if ( ( error = ivas_rend_crendProcess( ismInput->crendWrapper, AUDIO_CONFIG_7_1_4, AUDIO_CONFIG_BINAURAL_ROOM_IR,
                                           NULL, NULL, NULL, NULL, p_tmpRendBuffer, *ismInput->base.ctx.pOutSampleRate
#ifdef API_5MS
@@ -6330,37 +6394,67 @@ static ivas_error renderIsmToBinauralReverb(


static ivas_error renderIsmToMc(
    const input_ism *ismInput,
#ifndef FIX_518_ISM_BRIR_EXTREND
    const
#endif
    input_ism *ismInput,
    const IVAS_REND_AudioBuffer outAudio )
{
#ifdef FIX_518_ISM_BRIR_EXTREND
    int8_t position_changed;
#endif
    pan_vector currentPanGains;
#ifndef FIX_518_ISM_BRIR_EXTREND
    pan_vector previousPanGains;
#endif
    ivas_error error;

    push_wmops( "renderIsmToMc" );

#ifdef FIX_518_ISM_BRIR_EXTREND
    position_changed = FALSE;
#else
    /* TODO(sgi): Possible optimization: less processing needed if position didn't change */
#endif
    if ( *ismInput->base.ctx.pOutConfig == AUDIO_CONFIG_STEREO )
    {
        if ( ismInput->nonDiegeticPan )
        {
#ifdef FIX_518_ISM_BRIR_EXTREND
            ismInput->prev_pan_gains[0] = currentPanGains[0] = ( ismInput->nonDiegeticPanGain + 1.f ) * 0.5f;
            ismInput->prev_pan_gains[1] = currentPanGains[1] = 1.f - currentPanGains[0];
#else
            previousPanGains[0] = currentPanGains[0] = ( ismInput->nonDiegeticPanGain + 1.f ) * 0.5f;
            previousPanGains[1] = currentPanGains[1] = 1.f - currentPanGains[0];
            error = IVAS_ERR_OK;
#endif
        }
        else
        {
            set_zero( currentPanGains, 16 );
            set_zero( currentPanGains, MAX_OUTPUT_CHANNELS );

            ivas_ism_get_stereo_gains( ismInput->currentPos.azimuth, ismInput->currentPos.elevation, &currentPanGains[0], &currentPanGains[1] );

            set_zero( previousPanGains, 16 );
#ifdef FIX_518_ISM_BRIR_EXTREND
            set_zero( ismInput->prev_pan_gains, MAX_OUTPUT_CHANNELS );

            ivas_ism_get_stereo_gains( ismInput->previousPos.azimuth, ismInput->previousPos.elevation, &ismInput->prev_pan_gains[0], &ismInput->prev_pan_gains[1] );
#else
            set_zero( previousPanGains, MAX_OUTPUT_CHANNELS );

            ivas_ism_get_stereo_gains( ismInput->previousPos.azimuth, ismInput->previousPos.elevation, &previousPanGains[0], &previousPanGains[1] );
#endif
        }
    }
    else
    {
#ifdef FIX_518_ISM_BRIR_EXTREND
        /* compute gains only if position changed */
        if ( ismInput->currentPos.azimuth != ismInput->previousPos.azimuth &&
             ismInput->currentPos.elevation != ismInput->previousPos.elevation )
        {
            position_changed = TRUE;
#endif
            // TODO tmu review when #215 is resolved
            if ( ( error = getEfapGains( *ismInput->base.ctx.pEfapOutWrapper,
                                         (int16_t) floorf( ismInput->currentPos.azimuth + 0.5f ),
@@ -6369,7 +6463,9 @@ static ivas_error renderIsmToMc(
            {
                return error;
            }

#ifdef FIX_518_ISM_BRIR_EXTREND
        }
#else
        // TODO tmu review when #215 is resolved
        if ( ( error = getEfapGains( *ismInput->base.ctx.pEfapOutWrapper,
                                     (int16_t) floorf( ismInput->previousPos.azimuth + 0.5f ),
@@ -6378,11 +6474,27 @@ static ivas_error renderIsmToMc(
        {
            return error;
        }
#endif
    }

    /* Assume num channels in audio buffer to be 1.
     * This should have been validated in IVAS_REND_FeedInputAudio() */
    renderBufferChannelLerp( ismInput->base.inputBuffer, 0, currentPanGains, previousPanGains, outAudio );
    renderBufferChannelLerp( ismInput->base.inputBuffer, 0,
#ifdef FIX_518_ISM_BRIR_EXTREND
                             position_changed ? currentPanGains : ismInput->prev_pan_gains,
                             position_changed ? ismInput->prev_pan_gains : NULL,
#else
                             currentPanGains,
                             previousPanGains,
#endif
                             outAudio );

#ifdef FIX_518_ISM_BRIR_EXTREND
    if ( position_changed )
    {
        mvr2r( currentPanGains, ismInput->prev_pan_gains, MAX_OUTPUT_CHANNELS );
    }
#endif

    pop_wmops();

@@ -6391,18 +6503,29 @@ static ivas_error renderIsmToMc(


static ivas_error renderIsmToSba(
    const input_ism *ismInput,
#ifndef FIX_518_ISM_BRIR_EXTREND
    const
#endif
    input_ism *ismInput,
    const AUDIO_CONFIG outConfig,
    const IVAS_REND_AudioBuffer outAudio )
{
#ifdef FIX_518_ISM_BRIR_EXTREND
    int8_t position_changed;
#endif
    int16_t ambiOrderOut;
    int16_t numOutChannels;
    pan_vector currentPanGains;
#ifndef FIX_518_ISM_BRIR_EXTREND
    pan_vector previousPanGains;
#endif
    ivas_error error;
    error = IVAS_ERR_OK;

    push_wmops( "renderIsmToSba" );
#ifdef FIX_518_ISM_BRIR_EXTREND
    position_changed = FALSE;
#endif

    if ( ( error = getAudioConfigNumChannels( outConfig, &numOutChannels ) ) != IVAS_ERR_OK )
    {
@@ -6414,19 +6537,25 @@ static ivas_error renderIsmToSba(
        return error;
    }

#ifndef FIX_518_ISM_BRIR_EXTREND
    // 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 );

#endif
    if ( ( ismInput->currentPos.azimuth == ismInput->previousPos.azimuth ) &&
         ( ismInput->currentPos.elevation == ismInput->previousPos.elevation ) )
    {
#ifdef FIX_518_ISM_BRIR_EXTREND
        position_changed = TRUE;
#else
        mvr2r( previousPanGains, currentPanGains, MAX_OUTPUT_CHANNELS );
    }
    else
    {
#endif
        // 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 ),
@@ -6436,8 +6565,22 @@ static ivas_error renderIsmToSba(

    /* Assume num channels in audio buffer to be 1.
     * This should have been validated in IVAS_REND_FeedInputAudio() */
    renderBufferChannelLerp( ismInput->base.inputBuffer, 0, currentPanGains, previousPanGains, outAudio );
    renderBufferChannelLerp( ismInput->base.inputBuffer, 0,
#ifdef FIX_518_ISM_BRIR_EXTREND
                             position_changed ? currentPanGains : ismInput->prev_pan_gains,
                             position_changed ? ismInput->prev_pan_gains : NULL,
#else
                             currentPanGains,
                             previousPanGains,
#endif
                             outAudio );

#ifdef FIX_518_ISM_BRIR_EXTREND
    if ( position_changed )
    {
        mvr2r( currentPanGains, ismInput->prev_pan_gains, MAX_OUTPUT_CHANNELS );
    }
#endif
    pop_wmops();

    return error;