Commit 5bc4034f authored by norvell's avatar norvell
Browse files

Add NONBE_1300_TDREND_LARGE_ITD to port MR2070

parent bef81052
Loading
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -151,6 +151,7 @@
#define FIX_1387_INIT_PRM_SQQ                           /* FhG: initialize pointer prm_sqQ, which might be uninitialized in case of bfi == 1 */
#define NONBE_1296_TDREND_ITD_OUT_OF_BOUNDS_ACCESS      /* Eri: issue 1296: ITD resampling can occasionally read out of bounds, especially when the requested subframes are short (1.25 ms). Seen for headtracking+JBM. */
#define FIX_1349_TNS_CRASH                              /* FhG: Fix crash in TNS entropy coding, in case order of joint TNS coding is reduced to 0 */
#define NONBE_1300_TDREND_LARGE_ITD                     /* Eri: issue 1300: There was a bug feeding 1.25 ms frames to the TD renderer, causing out-of-buffer access. This was resolved. However, it is still possible that modeled HRTF with large ITDs could trigger out-of-buffer access. This adds a check to prevent this.*/

/* #################### End BASOP porting switches ############################ */

+29 −0
Original line number Diff line number Diff line
@@ -508,6 +508,10 @@ ivas_error TDREND_GetMix_fx(
    Word32 hrf_left_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH];
    Word32 hrf_right_delta[SFX_SPAT_BIN_MAX_FILTER_LENGTH];
    Word16 intp_count;
#ifdef NONBE_1300_TDREND_LARGE_ITD
    Word16 currShift, prevShift, transition_len, length_in2;
    Word16 tmp1, tmp2, tmp_e, tmp3, tmp4, tmp_e2, tlen1, tlen2;
#endif

    Word16 hrf_left_delta_e = 0, hrf_right_delta_e = 0;
    move16();
@@ -544,6 +548,31 @@ ivas_error TDREND_GetMix_fx(
                                                               &intp_count, &Src_p->filterlength, &Src_p->itd,
                                                               &Src_p->Gain_fx,
                                                               Src_p );
#ifdef NONBE_1300_TDREND_LARGE_ITD
            /* For large ITD values at lower sampling rate, check if the transition can be done */
            IF( i_mult( Src_p->previtd, Src_p->itd ) < 0 )
            {
                currShift = abs_s( Src_p->itd ); // Q0
                prevShift = abs_s( Src_p->previtd );
                transition_len = subframe_length - max( 0, SFX_SPAT_BIN_SINC_M - currShift );
                tmp1 = imult1616( transition_len, prevShift );                        // Q0
                tmp2 = add( prevShift, currShift );                                   // Q0
                tmp3 = BASOP_Util_Divide1616_Scale( tmp1, tmp2, &tmp_e );             // exp(tmp_e)
                tmp_e2 = BASOP_Util_Add_MantExp( tmp3, tmp_e, ONE_IN_Q14, 0, &tmp4 ); // exp(tmp4)
                tmp4 = shr( tmp4, sub( 15, tmp_e2 ) );                                // Q0
                tlen1 = tmp4;                                                         // Q0
                move16();
                tlen2 = sub( transition_len, tlen1 ); // Q0
                length_in2 = sub( tlen2, currShift ); // Q0

                IF( LE_16( length_in2, 0 ) )
                {
                    /* Subframe too short for ITD transition -- change to ITD=0 and push the rest of the transition to next subframe */
                    Src_p->itd = 0;
                    move16();
                }
            }
#endif
        }

        /* Render source if needed */