Commit 74a6561c authored by lefort's avatar lefort
Browse files

Aligned on branch 947-issues_with_stereo_dmx_evs.

parent 087a55e4
Loading
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -119,8 +119,16 @@

#endif

#define BE_FIX_567_DOUBLE_STEREO_DMX                          /* NTT: Fix formal issues */   
#define NONBE_FIX_567_DOUBLE_STEREO_DMX                       /* Orange: Double-precision replaced by single-precision */  
#define NONBE_FIX_947_STEREO_DMX_EVS_POC                      /* Orange: Fix clicks on POC */
#ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC
#define NONBE_FIX_947_STEREO_DMX_ROMOPT                       /* Orange: ROM optimisation for POC*/  
#endif
#define NONBE_FIX_947_STEREO_DMX_EVS_PHA                      /* Orange: Fix issues on PHA */
#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA
#define NONBE_FIX_947_STEREO_DMX_FADOPT                       /* Orange: Fading optimisation */  
#endif     

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

+6 −0
Original line number Diff line number Diff line
@@ -112,9 +112,15 @@ extern const UWord16 ECSQ_tab_vals[ECSQ_PARAM_COUNT - 1][1 + ECSQ_TAB_VALS_SIZE]
 * Stereo downmix to EVS ROM tables
 *----------------------------------------------------------------------------------*/
#ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC
#ifdef NONBE_FIX_947_STEREO_DMX_ROMOPT
extern const Word32 Stereo_dmx_s_wnd_coef_16k_fx[L_FRAME16k >> 2];
extern const Word32 Stereo_dmx_s_wnd_coef_32k_fx[L_FRAME32k >> 2];
extern const Word32 Stereo_dmx_s_wnd_coef_48k_fx[L_FRAME48k >> 2];
#else
extern const Word32 Stereo_dmx_s_wnd_coef_16k_fx[L_FRAME16k >> 1];
extern const Word32 Stereo_dmx_s_wnd_coef_32k_fx[L_FRAME32k >> 1];
extern const Word32 Stereo_dmx_s_wnd_coef_48k_fx[L_FRAME48k >> 1];
#endif
#else
extern const Word32 Stereo_dmx_s_wnd_coef_16k_fx[L_FRAME16k >> 4];
extern const Word32 Stereo_dmx_s_wnd_coef_32k_fx[L_FRAME32k >> 4];
+64 −2
Original line number Diff line number Diff line
@@ -510,6 +510,66 @@ const Word32 ari_bit_estimate_s17_LC_fx[RANGE_N_CONTEXT][RANGE_N_SYMBOLS] = // Q
 *----------------------------------------------------------------------------------*/

#ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC

#ifdef NONBE_FIX_947_STEREO_DMX_ROMOPT
// Q31
 const Word32 Stereo_dmx_s_wnd_coef_16k_fx[L_FRAME16k >> 2] = {
    204411, 817566, 1839231, 3269018, 5106382, 7350624, 10000889, 13056168, 16515298, 20376962, 
    24639688, 29301856, 34361688, 39817260, 45666492, 51907160, 58536884, 65553148, 72953272, 80734440, 
    88893688, 97427912, 106333872, 115608160, 125247248, 135247472, 145605040, 156315968, 167376224, 178781552, 
    190527648, 202610016, 215024064, 227765072, 240828160, 254208400, 267900656, 281899744, 296200320, 310796928, 
    325684032, 340855968, 356306944, 372031072, 388022368, 404274752, 420782016, 437537920, 454536032, 471769920, 
    489232992, 506918624, 524820096, 542930496, 561243072, 579750720, 598446528, 617323264, 636373760, 655590784, 
    674967040, 694495104, 714167552, 733976960, 753915712, 773976192, 794150848, 814431936, 834811776, 855282624, 
    875836544, 896465920, 917162752, 937919168, 958727360, 979579264, 1000467072, 1021382784, 1042318400, 1063266048
 };
 // Q31
 const Word32 Stereo_dmx_s_wnd_coef_32k_fx[L_FRAME32k >> 2] = {
    51423, 205686, 462776, 822667, 1285325, 1850705, 2518754, 3289407, 4162591, 5138222, 
    6216206, 7396441, 8678813, 10063200, 11549468, 13137475, 14827070, 16618091, 18510366, 20503712, 
    22597942, 24792852, 27088232, 29483864, 31979518, 34574956, 37269924, 40064172, 42957428, 45949412, 
    49039844, 52228420, 55514844, 58898792, 62379948, 65957972, 69632528, 73403256, 77269800, 81231792, 
    85288840, 89440576, 93686584, 98026464, 102459800, 106986176, 111605144, 116316264, 121119096, 126013168, 
    130998016, 136073168, 141238128, 146492400, 151835488, 157266880, 162786064, 168392496, 174085632, 179864960, 
    185729888, 191679888, 197714368, 203832752, 210034448, 216318896, 222685456, 229133536, 235662512, 242271760, 
    248960656, 255728544, 262574784, 269498720, 276499680, 283577024, 290730048, 297958048, 305260384, 312636288, 
    320085120, 327606144, 335198624, 342861856, 350595072, 358397568, 366268576, 374207360, 382213120, 390285152, 
    398422624, 406624768, 414890848, 423220000, 431611456, 440064448, 448578112, 457151680, 465784288, 474475136, 
    483223360, 492028160, 500888704, 509804096, 518773504, 527796064, 536870912, 545997184, 555174016, 564400512, 
    573675776, 582998976, 592369152, 601785472, 611246976, 620752768, 630301952, 639893568, 649526784, 659200640, 
    668914176, 678666496, 688456704, 698283776, 708146816, 718044864, 727976960, 737942208, 747939584, 757968192, 
    768027072, 778115200, 788231680, 798375424, 808545600, 818741184, 828961216, 839204672, 849470528, 859757952, 
    870065856, 880393216, 890739136, 901102592, 911482560, 921878080, 932288192, 942711808, 953147968, 963595648, 
    974053952, 984521728, 994998080, 1005481984, 1015972480, 1026468416, 1036968960, 1047472960, 1057979520, 1068487552
 };
 // Q31
 const Word32 Stereo_dmx_s_wnd_coef_48k_fx[L_FRAME48k >> 2] = {
    22902, 91608, 206114, 366416, 572507, 824378, 1122018, 1465415, 1854554, 2289418, 
    2769989, 3296246, 3868167, 4485728, 5148901, 5857660, 6611973, 7411808, 8257132, 9147909, 
    10084099, 11065664, 12092561, 13164746, 14282175, 15444799, 16652568, 17905432, 19203336, 20546226, 
    21934042, 23366728, 24844222, 26366462, 27933380, 29544910, 31200986, 32901534, 34646484, 36435760, 
    38269288, 40146984, 42068776, 44034576, 46044300, 48097868, 50195188, 52336168, 54520724, 56748756, 
    59020172, 61334876, 63692768, 66093744, 68537712, 71024552, 73554176, 76126456, 78741304, 81398592, 
    84098208, 86840048, 89623984, 92449904, 95317680, 98227200, 101178336, 104170952, 107204936, 110280144, 
    113396456, 116553736, 119751848, 122990656, 126270024, 129589808, 132949864, 136350064, 139790240, 143270256, 
    146789968, 150349232, 153947888, 157585760, 161262736, 164978624, 168733280, 172526544, 176358256, 180228256, 
    184136368, 188082416, 192066256, 196087712, 200146592, 204242752, 208376000, 212546160, 216753072, 220996528, 
    225276352, 229592384, 233944432, 238332288, 242755792, 247214752, 251708960, 256238240, 260802384, 265401216, 
    270034528, 274702112, 279403808, 284139392, 288908640, 293711360, 298547360, 303416448, 308318400, 313252960, 
    318220000, 323219264, 328250528, 333313632, 338408288, 343534304, 348691488, 353879616, 359098432, 364347744, 
    369627296, 374936928, 380276320, 385645312, 391043680, 396471168, 401927520, 407412544, 412925984, 418467616, 
    424037216, 429634528, 435259328, 440911328, 446590336, 452296128, 458028416, 463786944, 469571520, 475381856, 
    481217728, 487078848, 492965024, 498875968, 504811424, 510771168, 516754912, 522762432, 528793440, 534847712, 
    540924928, 547024960, 553147392, 559292032, 565458624, 571646912, 577856640, 584087488, 590339264, 596611584, 
    602904320, 609217152, 615549760, 621901888, 628273344, 634663808, 641072960, 647500608, 653946432, 660410176, 
    666891520, 673390208, 679906048, 686438592, 692987712, 699553088, 706134400, 712731392, 719343808, 725971328, 
    732613696, 739270592, 745941760, 752626880, 759325760, 766038016, 772763456, 779501696, 786252480, 793015488, 
    799790528, 806577216, 813375360, 820184576, 827004608, 833835136, 840675968, 847526656, 854387072, 861256832, 
    868135616, 875023168, 881919232, 888823488, 895735616, 902655296, 909582336, 916516352, 923457088, 930404224, 
    937357504, 944316544, 951281152, 958250944, 965225728, 972205056, 979188800, 986176512, 993168000, 1000162880, 
    1007160960, 1014161856, 1021165248, 1028170944, 1035178560, 1042187776, 1049198400, 1056210048, 1063222464, 1070235328
 };
#else
// Q31
 const Word32 Stereo_dmx_s_wnd_coef_16k_fx[L_FRAME16k >> 1] = {
    204411, 817566, 1839231, 3269018, 5106382, 7350624, 10000889, 13056168, 16515298, 20376962, 
@@ -615,6 +675,8 @@ const Word32 ari_bit_estimate_s17_LC_fx[RANGE_N_CONTEXT][RANGE_N_SYMBOLS] = // Q
    2138335743, 2139226495, 2140071807, 2140871679, 2141625983, 2142334719, 2142997887, 2143615487, 2144187391, 2144713599, 
    2145194239, 2145629055, 2146018175, 2146361599, 2146659327, 2146911103, 2147117183, 2147277567, 2147391999, 2147460735
 };
#endif

#else
// Q31
const Word32 Stereo_dmx_s_wnd_coef_16k_fx[L_FRAME16k >> 4] = {
+192 −8
Original line number Diff line number Diff line
@@ -102,6 +102,9 @@

#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA
#define STEREO_DMX_EVS_FAD_R 3
#ifdef NONBE_FIX_947_STEREO_DMX_FADOPT
#define STEREO_DMX_EVS_FAD_IR 10923 /* 1/3 in Q15 */
#endif
#define STEREO_DMX_EVS_SGC_EGY_FORGETTING_Q15 29491 // 0.9f
#define STEREO_DMX_EVS_SGC_GR_S               32919 // 1.00461543f
#define STEREO_DMX_EVS_SGC_GIR_S              32617 // 1/1.00461543f
@@ -1933,14 +1936,60 @@ static void weighted_ave_fx(
    const Word32 wnd_fx[]     /* i  : window coef                 Q31   */
)
{
#ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC

#ifdef NONBE_FIX_947_STEREO_DMX_ROMOPT
    Word16 i, j, len, len2;
    Word32 gain_tmp_fx = 0, gain_sub_fx;
    move32();

    len = shr( input_frame, 1 );
    len2 = shr( input_frame, 2 );
    gain_sub_fx = L_sub( gain_fx, old_gain_fx );

    FOR( i = 0; i < len2; i++ )
    {
        gain_tmp_fx = L_add( old_gain_fx, Mpy_32_32( gain_sub_fx, wnd_fx[i] ) );                                              // Q31
        dst_fx[i] = L_add_sat( Mpy_32_32( src1_fx[i], gain_tmp_fx ), Mpy_32_32( src2_fx[i], L_sub( MAX_32, gain_tmp_fx ) ) ); // Q16
        move32();
    }
    FOR( ; i < len; i++ )
    {
        j = add( i, 1 );
        gain_tmp_fx = L_add( old_gain_fx, Mpy_32_32( gain_sub_fx, L_sub( MAX_32, wnd_fx[sub( len, j )] ) ) );                 // Q31
        dst_fx[i] = L_add_sat( Mpy_32_32( src1_fx[i], gain_tmp_fx ), Mpy_32_32( src2_fx[i], L_sub( MAX_32, gain_tmp_fx ) ) ); // Q16
        move32();
    }
    FOR( ; i < input_frame; i++ )
    {
        dst_fx[i] = L_add_sat( Mpy_32_32( src1_fx[i], gain_fx ), Mpy_32_32( src2_fx[i], L_sub( MAX_32, gain_tmp_fx ) ) ); // Q16
        move32();
    }
#else
    Word16 i, len;
    Word32 gain_tmp_fx = 0, gain_sub_fx;
    move32();
#ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC
    len = shr( input_frame, 1 );
    gain_sub_fx = L_sub( gain_fx, old_gain_fx );
    FOR( i = 0; i < len; i++ )
    {
        gain_tmp_fx = L_add( old_gain_fx, Mpy_32_32( gain_sub_fx, wnd_fx[i] ) );                                              // Q31
        dst_fx[i] = L_add_sat( Mpy_32_32( src1_fx[i], gain_tmp_fx ), Mpy_32_32( src2_fx[i], L_sub( MAX_32, gain_tmp_fx ) ) ); // Q16
        move32();
    }
    FOR( ; i < input_frame; i++ )
    {
        dst_fx[i] = L_add_sat( Mpy_32_32( src1_fx[i], gain_fx ), Mpy_32_32( src2_fx[i], L_sub( MAX_32, gain_tmp_fx ) ) ); // Q16
        move32();
    }
#endif

#else

    Word16 i, len;
    Word32 gain_tmp_fx = 0, gain_sub_fx;
    move32();
    len = shr( input_frame, 4 );
#endif
    gain_sub_fx = L_sub( gain_fx, old_gain_fx );
    FOR( i = 0; i < len; i++ )
    {
@@ -1954,6 +2003,8 @@ static void weighted_ave_fx(
        move32();
    }

#endif

    return;
}

@@ -2144,14 +2195,64 @@ static void adapt_gain_fx(
    const Word32 wnd_fx[]     /* i  : window coef                  Q31  */
)
{
#ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC

#ifdef NONBE_FIX_947_STEREO_DMX_ROMOPT
    Word16 i, j, len, len2;
    Word32 gain_tmp_fx, gain_sub_fx;

    len = shr( input_frame, 1 );
    len2 = shr( input_frame, 2 );
    gain_sub_fx = L_sub( gain_fx, old_gain_fx );

    FOR( i = 0; i < len2; i++ )
    {
        gain_tmp_fx = L_add( old_gain_fx, Mpy_32_32( gain_sub_fx, wnd_fx[i] ) ); // Q31
        dst_fx[i] = Mpy_32_32( src_fx[i], gain_tmp_fx );                         // Q16
        move32();
    }
    FOR( ; i < len; i++ )
    {
        j = add( i, 1 );
        gain_tmp_fx = L_add( old_gain_fx, Mpy_32_32( gain_sub_fx, L_sub( MAX_32, wnd_fx[sub( len, j )] ) ) ); // Q31
        dst_fx[i] = Mpy_32_32( src_fx[i], gain_tmp_fx );                                                      // Q16
        move32();
    }
    FOR( ; i < input_frame; i++ )
    {
        dst_fx[i] = Mpy_32_32( src_fx[i], gain_fx ); // Q16
        move32();
    }
#else
    Word16 i, len;
    Word32 gain_tmp_fx, gain_sub_fx;

#ifdef NONBE_FIX_947_STEREO_DMX_EVS_POC
    len = shr( input_frame, 1 );

    //  gain_sub = gain - old_gain;
    gain_sub_fx = L_sub( gain_fx, old_gain_fx ); // Q31

    FOR( i = 0; i < len; i++ )
    {
        //  gain_tmp = old_gain + gain_sub * wnd[i];
        gain_tmp_fx = L_add( old_gain_fx, Mpy_32_32( gain_sub_fx, wnd_fx[i] ) ); // Q31                                                                          //  dst[i] = src[i] * gain_tmp;
        dst_fx[i] = Mpy_32_32( src_fx[i], gain_tmp_fx );                         // Q16
        move32();
    }
    FOR( ; i < input_frame; i++ )
    {
        //  dst[i] = src[i] * gain;
        dst_fx[i] = Mpy_32_32( src_fx[i], gain_fx ); // Q16
        move32();
    }
#endif

#else

    Word16 i, len;
    Word32 gain_tmp_fx, gain_sub_fx;

    len = shr( input_frame, 4 );
#endif

    //  gain_sub = gain - old_gain;
    gain_sub_fx = L_sub( gain_fx, old_gain_fx ); // Q31
@@ -2169,6 +2270,7 @@ static void adapt_gain_fx(
        dst_fx[i] = Mpy_32_32( src_fx[i], gain_fx ); // Q16
        move32();
    }
#endif

    return;
}
@@ -2328,9 +2430,15 @@ void stereo_dmx_evs_enc_fx(
#ifdef NONBE_FIX_947_STEREO_DMX_EVS_PHA
    Word16 n;
    Word16 dmx_weight, corr; // Q15
    Word32 data_fx[CPE_CHANNELS][L_FRAME48k]; // Q16/Q11

#ifdef NONBE_FIX_947_STEREO_DMX_FADOPT
    Word16 k, m, pha_len, fad_len, sbfad_len;
#else
    Word16 k, m, pha_len, fad_len;
#endif

    Word32 data_fx[CPE_CHANNELS][L_FRAME48k]; // Q16/Q11

    Word32 mem_prev[STEREO_DMX_EVS_FAD_LEN_MAX], data_mem[STEREO_DMX_EVS_DATA_LEN_MAX]; // Q11
    Word32 *p_data_mem, *p_prev_taps, *p_curr_taps, *fad_g, *p_data;

@@ -2725,6 +2833,9 @@ void stereo_dmx_evs_enc_fx(
        ELSE
        {
            hStereoDmxEVS->hPHA->n_fad_g = sub( input_frame, add( hStereoDmxEVS->hPHA->n_fad_g, 1 ) );
#ifdef NONBE_FIX_947_STEREO_DMX_FADOPT
            hStereoDmxEVS->hPHA->n_fad_cnt = 0;
#else
            IF( EQ_16( is_transient, 1 ) )
            {
                hStereoDmxEVS->hPHA->n_fad_cnt = 0;
@@ -2734,6 +2845,7 @@ void stereo_dmx_evs_enc_fx(
            {
                hStereoDmxEVS->hPHA->n_fad_cnt = sub( n_fad_r, hStereoDmxEVS->hPHA->n_fad_cnt );
            }
#endif
        }
    }
    ELSE IF( is_transient )
@@ -2754,6 +2866,73 @@ void stereo_dmx_evs_enc_fx(
        move16();
        m_fad_g = sub( input_frame, add( n_fad_g, 1 ) );

#ifdef NONBE_FIX_947_STEREO_DMX_FADOPT
        IF( EQ_16( n_fad_r, 1 ) )
        {
            n_fad_cnt = 0;
            move16();
            FOR( n = 0; n < fad_len; n++ )
            {
                p_dmx_data[n] = Mpy_32_32( p_dmx_data[n], fad_g[n_fad_g] ); // Q26;
                n_fad_g = add( n_fad_g, 1 );

                p_dmx_data[n] = L_add( p_dmx_data[n], Mpy_32_32( fad_g[m_fad_g], p_dmx_data_fo[n] ) ); // Q26
                m_fad_g = sub( m_fad_g, 1 );
            }
        }
        ELSE
        {
            n = 0;
            sbfad_len = 0;
            move16();
            move16();
            IF( NE_16( n_fad_cnt, 0 ) )
            {
                sbfad_len = s_min( fad_len, sub( n_fad_r, n_fad_cnt ) );
                FOR( ; n < sbfad_len; n++ )
                {
                    p_dmx_data[n] = Mpy_32_32( p_dmx_data[n], fad_g[n_fad_g] );                            // Q26;
                    p_dmx_data[n] = L_add( p_dmx_data[n], Mpy_32_32( fad_g[m_fad_g], p_dmx_data_fo[n] ) ); // Q26
                }
                n_fad_cnt = 0;
                move16();
                n_fad_g = add( n_fad_g, 1 );
                m_fad_g = sub( m_fad_g, 1 );
            }

            sbfad_len = sub( fad_len, sbfad_len );
            IF( EQ_16( n_fad_r, STEREO_DMX_EVS_FAD_R ) )
            {
                sbfad_len = L_mult( sbfad_len, STEREO_DMX_EVS_FAD_IR ) >> 16;
            }

            FOR( k = 0; k < sbfad_len; k++ )
            {
                FOR( m = 0; m < n_fad_r; m++ )
                {
                    p_dmx_data[n] = Mpy_32_32( p_dmx_data[n], fad_g[n_fad_g] );                            // Q26;
                    p_dmx_data[n] = L_add( p_dmx_data[n], Mpy_32_32( fad_g[m_fad_g], p_dmx_data_fo[n] ) ); // Q26
                    n = add( n, 1 );
                }
                n_fad_g = add( n_fad_g, 1 );
                m_fad_g = sub( m_fad_g, 1 );
            }

            FOR( ; n < fad_len; n++ )
            {
                p_dmx_data[n] = Mpy_32_32( p_dmx_data[n], fad_g[n_fad_g] );                            // Q26;
                p_dmx_data[n] = L_add( p_dmx_data[n], Mpy_32_32( fad_g[m_fad_g], p_dmx_data_fo[n] ) ); // Q26
                n_fad_cnt = add( n_fad_cnt, 1 );
                IF( GE_16( n_fad_cnt, n_fad_r ) )
                {
                    n_fad_cnt = 0;
                    move16();
                    n_fad_g = add( n_fad_g, 1 );
                    m_fad_g = sub( m_fad_g, 1 );
                }
            }
        }
#else
        FOR( n = 0; n < fad_len; n++ )
        {
            p_dmx_data[n] = Mpy_32_32( p_dmx_data[n], fad_g[n_fad_g] );                                // Q26;
@@ -2768,6 +2947,7 @@ void stereo_dmx_evs_enc_fx(
                m_fad_g = sub( m_fad_g, 1 );
            }
        }
#endif

        hStereoDmxEVS->hPHA->n_fad_g = n_fad_g;
        hStereoDmxEVS->hPHA->n_fad_cnt = n_fad_cnt;
@@ -3558,9 +3738,13 @@ ivas_error stereo_dmx_evs_init_encoder_fx(
            IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "invalid sample rate\n" );
            BREAK;
    }
#endif
    fad_len = hStereoDmxEVS->hPHA->fad_len_prc;
    move16();
#else
    fad_len = input_frame;
    move16();
#endif

    fad_g = hStereoDmxEVS->hPHA->fad_g_prc_fx;
    move32();
    // fad_r = 1.0f / (float) ( fad_len + 1 );