Commit 419b46ef authored by Sandesh Venkatesh's avatar Sandesh Venkatesh Committed by Fabian Bauer
Browse files

Fix for 3GPP issue 1127: MLD in the range of 5 to 12 between signals decoded...

Fix for 3GPP issue 1127: MLD in the range of 5 to 12 between signals decoded from 128kbps encoded SBA bitstreams at input level -16LKFS

Link #1127
parent 8e9f2907
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -101,6 +101,7 @@
#define FIX_1009_OPT_PARAMMC_RENDER             /* FhG: Optimize ivas_param_mc_dec_render_fx() */
#define FIX_1109_OPTIM_MCT_STEREO_IGF_DEC       /* FhG: optimize mctStereoIGF_dec_fx() */
#define FIX_1110_OPTIM_DIRAC_DECORR_PROC        /* FhG: optimize ivas_dirac_dec_decorr_process() */
#define FIX_1127_IMPROVE_SBA_MLD                /* Ittiam: Avoid saturation for DiRAC reference power */
#define FIX_1100_REMOVE_LPC_RESCALING           /* VA: Remove the rescaling of LPC coefficient to Q12 as residu and syn-filt are already taking care of it*/

#define FIX_ISSUE_1122                          /* Ittiam: Fix issue 1122: corrected incorrect scaling of a buffer leading to incorrect metadata bits */
+31 −5
Original line number Diff line number Diff line
@@ -748,7 +748,21 @@ void computeReferencePower_enc_fx_dirac(
        *dirac_mono_flag = ivas_dirac_get_mono_flag_fx( band_grouping, Cldfb_RealBuffer, Cldfb_ImagBuffer, e_Cldfb, nchan_ana, mono_frame_count );
        move16();
    }

#ifdef FIX_1127_IMPROVE_SBA_MLD
    Word16 gb = 0;
    move16();
    FOR( i = 0; i < num_freq_bands; i++ )
    {
        brange[0] = band_grouping[i + enc_param_start_band];
        brange[1] = band_grouping[i + enc_param_start_band + 1];
        move16();
        move16();
        gb = s_max( gb, find_guarded_bits_fx( sub( brange[1], brange[0] ) ) );
    }
    e_reference_W = sub( 31, sub( add( shl( sub( 31, e_Cldfb ), 1 ), 1 ), gb ) );
    e_reference_temp = e_reference_W;
#endif
    move16();
    FOR( i = 0; i < num_freq_bands; i++ )
    {
        brange[0] = band_grouping[i + enc_param_start_band];
@@ -764,12 +778,16 @@ void computeReferencePower_enc_fx_dirac(

        FOR( j = brange[0]; j < brange[1]; j++ )
        {
#ifdef FIX_1127_IMPROVE_SBA_MLD
            reference_power_W[i] = W_add( reference_power_W[i], W_shr( W_mult_32_32( Cldfb_RealBuffer[0][j], Cldfb_RealBuffer[0][j] ), gb ) );
            reference_power_W[i] = W_add( reference_power_W[i], W_shr( W_mult_32_32( Cldfb_ImagBuffer[0][j], Cldfb_ImagBuffer[0][j] ), gb ) );
#else
            reference_power_W[i] = W_mac_32_32( reference_power_W[i], Cldfb_RealBuffer[0][j], Cldfb_RealBuffer[0][j] );
            reference_power_W[i] = W_mac_32_32( reference_power_W[i], Cldfb_ImagBuffer[0][j], Cldfb_ImagBuffer[0][j] );
            e_reference_W = imult1616( (Word16) 2, e_Cldfb );
#endif
            move64();
            move64();

            e_reference_W = imult1616( (Word16) 2, e_Cldfb );
        }
        reference_power_temp[i] = W_add( reference_power_temp[i], reference_power_W[i] );
        move64();
@@ -779,12 +797,16 @@ void computeReferencePower_enc_fx_dirac(
            /* abs()^2 */
            FOR( j = brange[0]; j < brange[1]; j++ )
            {
#ifdef FIX_1127_IMPROVE_SBA_MLD
                reference_power_temp[i] = W_add( reference_power_temp[i], W_shr( W_mult_32_32( Cldfb_RealBuffer[ch_idx][j], Cldfb_RealBuffer[ch_idx][j] ), gb ) );
                reference_power_temp[i] = W_add( reference_power_temp[i], W_shr( W_mult_32_32( Cldfb_ImagBuffer[ch_idx][j], Cldfb_ImagBuffer[ch_idx][j] ), gb ) );
#else
                reference_power_temp[i] = W_mac_32_32( reference_power_temp[i], Cldfb_RealBuffer[ch_idx][j], Cldfb_RealBuffer[ch_idx][j] );
                reference_power_temp[i] = W_mac_32_32( reference_power_temp[i], Cldfb_ImagBuffer[ch_idx][j], Cldfb_ImagBuffer[ch_idx][j] );
                e_reference_temp = imult1616( (Word16) 2, e_Cldfb );
#endif
                move64();
                move64();

                e_reference_temp = imult1616( (Word16) 2, e_Cldfb );
            }
        }
    }
@@ -819,7 +841,11 @@ void computeReferencePower_enc_fx_dirac(
        reference_power[i] = W_extract_h( W_shl( reference_power_temp[i], min_norm ) ); // Right shift with min_norm and extract high bits
        move32();
    }
#ifdef FIX_1127_IMPROVE_SBA_MLD
    *e_reference = sub( 31, sub( add( sub( 31, e_reference_temp ), min_norm ), 32 ) );
#else
    *e_reference = sub( e_reference_temp, min_norm );
#endif
    move16();

    return;