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

Q documentation updates, bug fixes

[x] Added fix for dct calculation
[x] Bug fix in ivas_mct_core_enc_fx
[x] LTV crash fixes
parent b24649ae
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -1652,9 +1652,9 @@ void InternalTCXDecoder(

void stereo_mdct_core_enc_fx(
    CPE_ENC_HANDLE hCPE,                                        /* i/o: CPE encoder structure                   */
    Word16 new_samples[CPE_CHANNELS][L_INP],                     /* i  : new samples                             */
    Word16 old_wsp[CPE_CHANNELS][L_WSP],                         /* i  : 12.8kHz weighted speech (for LTP        */
    Word16 pitch_buf_fx[CPE_CHANNELS][NB_SUBFR16k]                  /* o  : floating pitch for each subframe        */
    Word16 new_samples[CPE_CHANNELS][L_INP],                     /* i  : new samples                             Q0*/
    Word16 old_wsp[CPE_CHANNELS][L_WSP],                         /* i  : 12.8kHz weighted speech (for LTP        Qx*/
    Word16 pitch_buf_fx[CPE_CHANNELS][NB_SUBFR16k]                  /* o  : floating pitch for each subframe     Q6*/
);

void initMdctStereoEncData(
@@ -1931,12 +1931,12 @@ void splitAvailableBits(
    int16_t *bits_ch1                                           /* o  : bits for channel 1                      */
);

int16_t write_stereo_to_bitstream
Word16 write_stereo_to_bitstream_fx
(
    STEREO_MDCT_ENC_DATA_HANDLE hStereoMdct,                    /* i/o: Stereo MDCT encoder structure           */
    Encoder_State **sts,                                        /* i/o: Encoder state structure                 */
    int16_t ms_mask[NB_DIV][MAX_SFB],                           /* i  : bandwise MS mask                        */
    const int16_t mct_on,                                       /* i  : flag mct block (1) or stereo (0)        */
    Word16 ms_mask[NB_DIV][MAX_SFB],                           /* i  : bandwise MS mask                         Q0*/
    const Word16 mct_on,                                       /* i  : flag mct block (1) or stereo (0)         Q0*/
    BSTR_ENC_HANDLE hBstr                                       /* i/o: bitstream handle                        */
);

+2 −2
Original line number Diff line number Diff line
@@ -3799,7 +3799,7 @@ void QuantizeTCXSpectrum_fx(
            }

            /* Quantize original spectrum */
            sqGain_fx = SQ_gain_fx( spectrum_fx, *spectrum_e, shl( mult( hTcxEnc->tcx_target_bits_fac, sqTargetBits ), 1 ), L_spec, &sqGain_e );
            sqGain_fx = SQ_gain_ivas_fx( spectrum_fx, *spectrum_e, shl( mult( hTcxEnc->tcx_target_bits_fac, sqTargetBits ), 1 ), L_spec, &sqGain_e );

            tcx_scalar_quantization_ivas_fx( spectrum_fx, *spectrum_e, sqQ, L_spec, sqGain_fx, sqGain_e, st->hTcxCfg->sq_rounding, hTcxEnc->memQuantZeros, st->tcxonly );

@@ -3887,7 +3887,7 @@ void QuantizeTCXSpectrum_fx(
            }
            ELSE
            {
                sqGain_fx = SQ_gain_fx( spectrum_fx, *spectrum_e, shl( mult( hTcxEnc->tcx_target_bits_fac, sqTargetBits ), 1 ), L_spec, &sqGain_e );
                sqGain_fx = SQ_gain_ivas_fx( spectrum_fx, *spectrum_e, shl( mult( hTcxEnc->tcx_target_bits_fac, sqTargetBits ), 1 ), L_spec, &sqGain_e );
            }
            /* Quantize spectrum */
            tcx_scalar_quantization_ivas_fx( spectrum_fx, *spectrum_e, sqQ, L_spec, sqGain_fx, sqGain_e, st->hTcxCfg->sq_rounding, hTcxEnc->memQuantZeros, st->tcxonly );
+4 −4
Original line number Diff line number Diff line
@@ -496,13 +496,13 @@ void ivas_mct_core_enc_fx(

                FOR( i = 1; i < L_subframeTCX - 1; i++ )
                {
                    mdst_fx = L_sub( L_shr( sts[ch]->hTcxEnc->spectrum_fx[n][i + 1], 1 ), L_shr( sts[ch]->hTcxEnc->spectrum_fx[n][i - 1], 1 ) ); /* An MDST estimate */
                    mdst_fx = L_sub( L_shr( sts[ch]->hTcxEnc->spectrum_fx[n][i + 1], 1 ), L_shr( sts[ch]->hTcxEnc->spectrum_fx[n][i - 1], 1 ) ); /* An MDST estimate, Q = q_spec - 1 */

                    W_tmp = W_mac_32_32( W_mult_32_32( mdst_fx, mdst_fx ), L_shr( sts[ch]->hTcxEnc->spectrum_fx[n][i], 1 ), L_shr( sts[ch]->hTcxEnc->spectrum_fx[n][i], 1 ) );
                    W_tmp = W_mac_32_32( W_mult_32_32( mdst_fx, mdst_fx ), L_shr( sts[ch]->hTcxEnc->spectrum_fx[n][i], 1 ), L_shr( sts[ch]->hTcxEnc->spectrum_fx[n][i], 1 ) ); // Q = 2 * (q_spec - 1) + 1
                    tmp_s = W_norm( W_tmp );
                    W_tmp = W_shl( W_tmp, tmp_s );
                    powerSpec_fx[ch][add( i, imult1616( n, L_subframeTCX ) )] = W_extract_h( W_tmp );
                    tmp_q_powSpec[add( i, imult1616( n, L_subframeTCX ) )] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 31 ); // Q = 2 * q_spec + 1 + tmp_s - 32
                    powerSpec_fx[ch][i + ( n * L_subframeTCX )] = W_extract_h( W_tmp );
                    tmp_q_powSpec[i + ( n * L_subframeTCX )] = sub( add( imult1616( q_spec, 2 ), tmp_s ), 33 ); // Q = 2 * (q_spec - 1) + 1 + tmp_s - 32
                    move32();
                    move16();
                }
+1 −1
Original line number Diff line number Diff line
@@ -959,7 +959,7 @@ void write_mct_bitstream_fx(
        p_st[1] = sts[hBlock->ch2];

        /*then business as usual for each block pair */
        write_stereo_to_bitstream( hMCT->hBlockData[pair]->hStereoMdct, p_st, hBlock->mask, 1, hBstr );
        write_stereo_to_bitstream_fx( hMCT->hBlockData[pair]->hStereoMdct, p_st, hBlock->mask, 1, hBstr );
    }

    hMCT->nBitsMCT = sub( hBstr->nb_bits_tot, nbits_start );
+19 −32
Original line number Diff line number Diff line
@@ -6542,7 +6542,6 @@ void ivas_omasa_encode_masa_to_total_fx(
    Word16 q_idx[MAX_PARAM_SPATIAL_SUBFRAMES * MASA_FREQUENCY_BANDS];
    Word32 dct_data_tmp[MAX_PARAM_SPATIAL_SUBFRAMES * MASA_FREQUENCY_BANDS];
    Word32 dct_data[MAX_PARAM_SPATIAL_SUBFRAMES * MASA_FREQUENCY_BANDS];
    Word16 dct_data_e = 0, dct_data_tmp_e, q_dct_data_e;
    Word16 bits_pos, nb_bits;
    Word16 n_streams, len_stream, tmp_e;
    Word32 L_tmp;
@@ -6558,7 +6557,7 @@ void ivas_omasa_encode_masa_to_total_fx(
    {
        FOR( j = 0; j < nblocks; j++ )
        {
            data[k] = masa_to_total_energy_ratio[j][i];
            data[k] = L_shr( masa_to_total_energy_ratio[j][i], Q5 );
            move32();
            k = add( k, 1 );
        }
@@ -6571,42 +6570,42 @@ void ivas_omasa_encode_masa_to_total_fx(
    SWITCH( len_stream )
    {
        case 4:
            matrix_product_mant_exp_fx( dct4_fx, 0 /* Q31 */, nblocks, nblocks, 0, data, 1 /* Q30*/, 1, nblocks, 1, dct_data, &dct_data_e );
            matrix_product_q30_fx( dct4_fx, nblocks, nblocks, 0, data, 1, nblocks, 1, dct_data );
            n_streams = 1;
            len_stream = 4;
            move16();
            BREAK;
        case 5:
            matrix_product_mant_exp_fx( dct5_fx, 0 /* Q31 */, nbands, nbands, 0, data, 1 /* Q30 */, 1, nbands, 1, dct_data, &dct_data_e );
            matrix_product_q30_fx( dct5_fx, nbands, nbands, 0, data, 1, nbands, 1, dct_data );
            n_streams = 1;
            len_stream = nbands;
            move16();
            move16();
            BREAK;
        case 8:
            matrix_product_mant_exp_fx( dct8_fx, 0 /* Q31 */, nbands, nbands, 0, data, 1 /* Q30 */, 1, nbands, 1, dct_data, &dct_data_e );
            matrix_product_q30_fx( dct8_fx, nbands, nbands, 0, data, 1, nbands, 1, dct_data );
            n_streams = 1;
            len_stream = nbands;
            move16();
            BREAK;
        case 12:
            matrix_product_mant_exp_fx( dct12_fx, 0 /* Q31 */, nbands, nbands, 0, data, 1 /* Q30 */, 1, nbands, 1, dct_data, &dct_data_e );
            matrix_product_q30_fx( dct12_fx, nbands, nbands, 0, data, 1, nbands, 1, dct_data );
            n_streams = 1;
            len_stream = nbands;
            move16();
            move16();
            BREAK;
        case 20:
            matrix_product_mant_exp_fx( dct5_fx, 0 /* Q31 */, nbands, nbands, 0, data, 1 /* Q30 */, nblocks, nbands, 1, dct_data_tmp, &dct_data_e );
            matrix_product_mant_exp_fx( dct_data_tmp, dct_data_e, nbands, nblocks, 0, dct4_fx, 0 /* Q31 */, nblocks, nblocks, 1, dct_data, &dct_data_e );
            matrix_product_fx( dct5_fx, nbands, nbands, 0, data, nblocks, nbands, 1, dct_data_tmp );
            matrix_product_q30_fx( dct_data_tmp, nbands, nblocks, 0, dct4_fx, nblocks, nblocks, 1, dct_data );
            n_streams = 1;
            len_stream = imult1616( nbands, nblocks );
            move16();
            move16();
            BREAK;
        case 32:
            matrix_product_mant_exp_fx( dct8_fx, 0 /* Q31 */, nbands, nbands, 0, data, 1 /* Q30 */, nblocks, nbands, 1, dct_data_tmp, &dct_data_e );
            matrix_product_mant_exp_fx( dct_data_tmp, dct_data_e, nbands, nblocks, 0, dct4_fx, 0 /* Q31 */, nblocks, nblocks, 1, dct_data, &dct_data_e );
            matrix_product_fx( dct8_fx, nbands, nbands, 0, data, nblocks, nbands, 1, dct_data_tmp );
            matrix_product_q30_fx( dct_data_tmp, nbands, nblocks, 0, dct4_fx, nblocks, nblocks, 1, dct_data );
            n_streams = nblocks;
            len_stream = nbands;
            move16();
@@ -6622,7 +6621,7 @@ void ivas_omasa_encode_masa_to_total_fx(
        j = imult1616( k, len_stream );
        /* quantize with fixed common step */
        L_tmp = BASOP_Util_Divide3232_Scale_cadence( dct_data[j], step, &tmp_e );
        tmp_e = add( tmp_e, dct_data_e );
        tmp_e = add( tmp_e, Q1 );
        q_idx[j] = rint_new_fx( L_shr( L_tmp, sub( 15, tmp_e ) ) /* Q16 */ ); // Q0
        move16();

@@ -6645,7 +6644,7 @@ void ivas_omasa_encode_masa_to_total_fx(
            FOR( i = 1; i < len_stream; i++ )
            {
                L_tmp = BASOP_Util_Divide3232_Scale_cadence( dct_data[j + i], step, &tmp_e );
                tmp_e = add( tmp_e, dct_data_e );
                tmp_e = add( tmp_e, Q1 );
                q_idx[j + i] = rint_new_fx( L_shr( L_tmp, sub( 15, tmp_e ) ) );
                move16();
                q_dct_data[j + i] = Mpy_32_16_1( step, shl( q_idx[j + i], 9 ) /* Q9 */ ); // Q25
@@ -6689,50 +6688,38 @@ void ivas_omasa_encode_masa_to_total_fx(
        }
    }

    q_dct_data_e = 6; // Q25
    move16();
    /* inverse DCT2 transform */
    SWITCH( len_stream )
    {
        case 4:
            matrix_product_mant_exp_fx( dct4_fx, 0 /* Q31 */, nblocks, nblocks, 1, q_dct_data, q_dct_data_e, nblocks, 1, 0, dct_data_tmp, &dct_data_tmp_e );
            matrix_product_q30_fx( dct4_fx, nblocks, nblocks, 1, q_dct_data, nblocks, 1, 0, dct_data_tmp );
            Copy32( dct_data_tmp, q_dct_data, nblocks );
            q_dct_data_e = dct_data_tmp_e;
            move16();
            BREAK;
        case 5:
            matrix_product_mant_exp_fx( dct5_fx, 0 /* Q31 */, nbands, nbands, 1, q_dct_data, q_dct_data_e, nbands, 1, 0, dct_data_tmp, &dct_data_tmp_e );
            matrix_product_q30_fx( dct5_fx, nbands, nbands, 1, q_dct_data, nbands, 1, 0, dct_data_tmp );
            Copy32( dct_data_tmp, q_dct_data, nbands );
            q_dct_data_e = dct_data_tmp_e;
            move16();
            BREAK;
        case 8:
            matrix_product_mant_exp_fx( dct8_fx, 0 /* Q31 */, nbands, nbands, 1, q_dct_data, q_dct_data_e, nbands, 1, 0, dct_data_tmp, &dct_data_tmp_e );
            matrix_product_q30_fx( dct8_fx, nbands, nbands, 1, q_dct_data, nbands, 1, 0, dct_data_tmp );
            Copy32( dct_data_tmp, q_dct_data, nbands );
            q_dct_data_e = dct_data_tmp_e;
            move16();
            BREAK;
        case 12:
            matrix_product_mant_exp_fx( dct12_fx, 0 /* Q31 */, nbands, nbands, 1, q_dct_data, q_dct_data_e, nbands, 1, 0, dct_data_tmp, &dct_data_tmp_e );
            matrix_product_q30_fx( dct12_fx, nbands, nbands, 1, q_dct_data, nbands, 1, 0, dct_data_tmp );
            Copy32( dct_data_tmp, q_dct_data, nbands );
            q_dct_data_e = dct_data_tmp_e;
            move16();
            BREAK;
        case 20:
            matrix_product_mant_exp_fx( dct5_fx, 0 /* Q31 */, nbands, nbands, 1, q_dct_data, q_dct_data_e, nbands, nblocks, 0, dct_data_tmp, &dct_data_tmp_e );
            matrix_product_mant_exp_fx( dct_data_tmp, dct_data_tmp_e, nbands, nblocks, 0, dct4_fx, 0 /* Q31 */, nblocks, nblocks, 0, q_dct_data, &q_dct_data_e ); /* reuse of variable*/
            matrix_product_fx( dct5_fx, nbands, nbands, 1, q_dct_data, nbands, nblocks, 0, dct_data_tmp );
            matrix_product_q30_fx( dct_data_tmp, nbands, nblocks, 0, dct4_fx, nblocks, nblocks, 0, q_dct_data ); /* reuse of variable*/
            BREAK;
        case 32:
            matrix_product_mant_exp_fx( dct8_fx, 0 /* Q31 */, nbands, nbands, 1, q_dct_data, q_dct_data_e, nbands, nblocks, 0, dct_data_tmp, &dct_data_tmp_e );
            matrix_product_mant_exp_fx( dct_data_tmp, dct_data_tmp_e, nbands, nblocks, 0, dct4_fx, 0 /* Q31 */, nblocks, nblocks, 0, q_dct_data, &q_dct_data_e );
            matrix_product_fx( dct8_fx, nbands, nbands, 1, q_dct_data, nbands, nblocks, 0, dct_data_tmp );
            matrix_product_q30_fx( dct_data_tmp, nbands, nblocks, 0, dct4_fx, nblocks, nblocks, 0, q_dct_data );
            BREAK;
        default:
            printf( "Incorrect number of coefficients for OMASA.\n" );
            BREAK;
    }

    scale_sig32( q_dct_data, MAX_PARAM_SPATIAL_SUBFRAMES * MASA_FREQUENCY_BANDS, sub( Q30, sub( 31, q_dct_data_e ) ) ); // Scaling to Q30

    k = 0;
    move16();
    FOR( i = 0; i < nblocks; i++ )
Loading