Commit 8a2aca49 authored by norvell's avatar norvell
Browse files

Add FIX_550_FIRST_FRAME_ACCESS_ALT to integrate non-diegetic panning with TD...

Add FIX_550_FIRST_FRAME_ACCESS_ALT to integrate non-diegetic panning with TD renderer filter states and ITD to handle transitions properly
parent 3009ea05
Loading
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -1555,14 +1555,22 @@ typedef enum
typedef enum
{
    TDREND_POSTYPE_ABSOLUTE,                                                /* The source position is in absolute coordinates  */
#ifdef FIX_550_FIRST_FRAME_ACCESS_ALT
    TDREND_POSTYPE_NON_DIEGETIC                                             /* The source position is non-diegetic */
#else
    TDREND_POSTYPE_RELATIVE_TO_LISTENER                                     /* The source position is relative to the listener */
#endif
} TDREND_PosType_t;

typedef enum
{
    TDREND_PLAYSTATUS_INITIAL,
#ifndef FIX_550_FIRST_FRAME_ACCESS_ALT
    TDREND_PLAYSTATUS_PLAYING,
    TDREND_PLAYSTATUS_PLAYING_NON_DIEGETIC
#else
    TDREND_PLAYSTATUS_PLAYING
#endif
} TDREND_PlayStatus_t;

typedef enum
+1 −0
Original line number Diff line number Diff line
@@ -159,6 +159,7 @@
#define FIX_TCX_LOWRATE_LIMITATION                      /* VA: issue 577: TCX bitrate limitation only when DEBUGGING is active */
#define FIX_575_LOW_OVERLAP_PLC_RECOVERY                /* FhG: Issue 575 fix for PLC and transistion to TCX5*/
#define FIX_550_FIRST_FRAME_ACCESS                      /* Eri: Issue 550: TD Object renderer: first frame accesses wrong transport channel offsets */
#define FIX_550_FIRST_FRAME_ACCESS_ALT

/* ################## End DEVELOPMENT switches ######################### */
/* clang-format on */
+14 −0
Original line number Diff line number Diff line
@@ -291,6 +291,7 @@ ivas_error ivas_td_binaural_renderer_unwrap(
            hBinRendererTd->Sources[c_indx]->SrcRend_p->InputAvailable = TRUE;
            c_indx++;
        }
#ifndef FIX_550_FIRST_FRAME_ACCESS_ALT
#ifdef FIX_550_FIRST_FRAME_ACCESS
        if ( ivas_format == ISM_FORMAT )
        {
@@ -303,6 +304,7 @@ ivas_error ivas_td_binaural_renderer_unwrap(
                TDREND_MIX_SRC_SetPlayState( hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING );
            }
        }
#endif
#endif
    }

@@ -378,7 +380,9 @@ ivas_error TDREND_GetMix(
    float hrf_left_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH];
    float hrf_right_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH];
    int16_t intp_count;
#ifndef FIX_550_FIRST_FRAME_ACCESS_ALT
    float pan_left, pan_right;
#endif
    int16_t subframe_update_flag;

    subframe_update_flag = subframe_idx == ism_md_subframe_update;
@@ -415,6 +419,7 @@ ivas_error TDREND_GetMix(
            error = TDREND_REND_RenderSourceHRFilt( Src_p, hrf_left_delta, hrf_right_delta, intp_count, output_buf, subframe_length );
        }

#ifndef FIX_550_FIRST_FRAME_ACCESS_ALT
        if ( ( SrcRend_p->InputAvailable == TRUE ) && ( SrcRend_p->PlayStatus == TDREND_PLAYSTATUS_PLAYING_NON_DIEGETIC ) )
        {
            pan_left = ( SrcSpatial_p->Pos_p[1] + 1.f ) * 0.5f;
@@ -427,6 +432,7 @@ ivas_error TDREND_GetMix(
            v_multc_acc( &Src_p->InputFrame_p[subframe_idx * subframe_length], pan_right, output_buf[1], subframe_length );
#endif
        }
#endif
    }

    /* Populate output variable */
@@ -503,14 +509,22 @@ void TDREND_Update_object_positions(
                Pos[1] = hIsmMetaData[nS]->azimuth / 90.f;
                Pos[2] = 0;
                TDREND_MIX_SRC_SetPos( hBinRendererTd, nS, Pos );
#ifdef FIX_550_FIRST_FRAME_ACCESS_ALT
                hBinRendererTd->Sources[nS]->SrcSpatial_p->PosType = TDREND_POSTYPE_NON_DIEGETIC;
#else
#ifndef FIX_550_FIRST_FRAME_ACCESS
                TDREND_MIX_SRC_SetPlayState( hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING_NON_DIEGETIC );
#endif
#endif
            }
            else
            {
#ifdef FIX_550_FIRST_FRAME_ACCESS_ALT
                hBinRendererTd->Sources[nS]->SrcSpatial_p->PosType = TDREND_POSTYPE_ABSOLUTE;
#else
#ifndef FIX_550_FIRST_FRAME_ACCESS
                TDREND_MIX_SRC_SetPlayState( hBinRendererTd, nS, TDREND_PLAYSTATUS_PLAYING );
#endif
#endif
            }
            TDREND_MIX_SRC_SetDir( hBinRendererTd, nS, Dir );
+4 −0
Original line number Diff line number Diff line
@@ -309,7 +309,11 @@ ivas_error TDREND_MIX_AddSrc(
    }
    else
    {
#ifdef FIX_550_FIRST_FRAME_ACCESS_ALT
        if ( ( PosType < TDREND_POSTYPE_ABSOLUTE ) || ( PosType > TDREND_POSTYPE_NON_DIEGETIC ) )
#else
        if ( ( PosType < TDREND_POSTYPE_ABSOLUTE ) || ( PosType > TDREND_POSTYPE_RELATIVE_TO_LISTENER ) )
#endif
        {
            return ( IVAS_ERROR( IVAS_ERR_INTERNAL, "Invalid position type!\n" ) );
        }
+45 −18
Original line number Diff line number Diff line
@@ -218,7 +218,11 @@ static void TDREND_SRC_REND_Init(

    /* Internal state */
    SrcRend_p->InputAvailable = FALSE;
#ifdef FIX_550_FIRST_FRAME_ACCESS_ALT
    SrcRend_p->PlayStatus = TDREND_PLAYSTATUS_PLAYING;
#else
    SrcRend_p->PlayStatus = TDREND_PLAYSTATUS_INITIAL;
#endif
    /* SrcGain  */
    for ( nC = 0; nC < SPAT_BIN_MAX_INPUT_CHANNELS; nC++ )
    {
@@ -277,6 +281,7 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams(

    *filterlength = HrFiltSet_p->FiltLength;

#ifndef FIX_550_FIRST_FRAME_ACCESS_ALT
    /* 1. Map source pos to the coordinate system of the listener */
    switch ( SrcSpatial_p->PosType )
    {
@@ -296,6 +301,13 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams(
            TDREND_SPATIAL_VecMapToNewCoordSystem( SrcSpatial_p->Pos_p, Listener_p->Pos, Listener_p->Front, Listener_p->Up, Listener_p->Right, ListRelPos, ListRelPosAbs );
            break;
    }
#else
    if ( SrcSpatial_p->PosType == TDREND_POSTYPE_ABSOLUTE )
    {

        /* Absolute position */
        TDREND_SPATIAL_VecMapToNewCoordSystem( SrcSpatial_p->Pos_p, Listener_p->Pos, Listener_p->Front, Listener_p->Up, Listener_p->Right, ListRelPos, ListRelPosAbs );
#endif

    ListRelDist = TDREND_SPATIAL_VecNorm( ListRelPos );

@@ -351,6 +363,21 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams(

    azim_delta = ( azim_delta > 180.0f ) ? ( azim_delta - 360 ) : ( ( azim_delta < -180.0f ) ? ( azim_delta + 360 ) : ( azim_delta ) ); /* map to -180:180 range */
    *intp_count = min( MAX_INTERPOLATION_STEPS, max( (int16_t) ( fabsf( azim_delta ) * MAX_ANGULAR_STEP_INV ), (int16_t) ( fabsf( elev_delta ) * MAX_ANGULAR_STEP_INV ) ) );
#ifdef FIX_550_FIRST_FRAME_ACCESS_ALT
}
else /* TDREND_POSTYPE_NON_DIEGETIC */
{
    *itd = 0;
    *Gain = 1.0f;
    set_f( hrf_left, 0.0f, *filterlength );
    set_f( hrf_right, 0.0f, *filterlength );
    hrf_left[0] = ( SrcSpatial_p->Pos_p[1] + 1.f ) * 0.5f;
    hrf_right[0] = 1.f - hrf_left[0];
    *intp_count = MAX_INTERPOLATION_STEPS;
    Src_p->elev_prev = 0;
    Src_p->azim_prev = 360.0f; /* Dummy angle -- sets max interpolation if switching to TDREND_POSTYPE_ABSOLUTE */
}
#endif

if ( ( *intp_count > 0 ) && subframe_update_flag )
{