Commit 46331437 authored by fotopoulou's avatar fotopoulou
Browse files

Merge branch 'main' into...

Merge branch 'main' into basop-2614-assert-in-stereo_dft_generate_comfort_noise_fx-for-stereo-bitstream-with-dtx-and-bit
parents 550558d4 f08d96c0
Loading
Loading
Loading
Loading
Loading
+114 −4
Original line number Diff line number Diff line
@@ -163,6 +163,9 @@ static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS
static ivas_error decodeVoIP( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HRTF_BINARY_WRAPPER *hHrtf, RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, RotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, ObjectEditFileReader *objectEditFileReader, ISAR_SPLIT_REND_BITS_DATA *splitRendBits, IVAS_DEC_HANDLE *phIvasDec, int16_t *pcmBuf );
static ivas_error load_hrtf_from_file( IVAS_DEC_HRTF_BINARY_WRAPPER *hHrtfBinary, IVAS_DEC_HANDLE hIvasDec, const IVAS_AUDIO_CONFIG OutputConfig, const int32_t output_Fs );
static void do_object_editing_fx( IVAS_EDITABLE_PARAMETERS *editableParameters, ObjectEditFileReader *objectEditFileReader );
#ifdef FIX_FMSW_DEC_EXT
static ivas_error updateOnFormatSwitching( IVAS_DEC_HANDLE hIvasDec, IVAS_DEC_BS_FORMAT *pBsFormat, const char *outputWavFilename, MasaFileWriter **ppMasaWriter, IsmFileWriter *ismWriters[IVAS_MAX_NUM_OBJECTS], int16_t *pNumOutChannels, uint16_t *pNumObj, const bool delayCompensationEnabled );
#endif


/*------------------------------------------------------------------------------------------*
@@ -203,7 +206,6 @@ int main(
    reset_mem( USE_BYTES );
#endif


    splitRendBits.bits_buf = splitRendBitsBuf;

    /*------------------------------------------------------------------------------------------*
@@ -453,7 +455,6 @@ int main(
        }
    }


    /*-------------------------------------------------------------------*
     * Load renderer configuration from file
     *--------------------------------------------------------------------*/
@@ -538,6 +539,7 @@ int main(
            fprintf( stderr, "Failed to get directivity patterns for one or more of IDs: %d %d %d %d\n\n", arg.directivityPatternId[0], arg.directivityPatternId[1], arg.directivityPatternId[2], arg.directivityPatternId[3] );
            goto cleanup;
        }

        if ( ( error = RenderConfigReader_getDistanceAttenuation( renderConfigReader, renderConfig.distAtt_fx ) ) != IVAS_ERR_OK )
        {
            fprintf( stderr, "Failed to get Distance Attenuation \n\n" );
@@ -608,6 +610,7 @@ int main(
            hLsCustomData.azimuth_fx[i] = (Word32) ( hLsCustomData.azimuth[i] * ( 1u << 22 ) );
            hLsCustomData.elevation_fx[i] = (Word32) ( hLsCustomData.elevation[i] * ( 1u << 22 ) );
        }

        if ( ( error = IVAS_DEC_FeedCustomLsData( hIvasDec, hLsCustomData ) ) != IVAS_ERR_OK )
        {
            fprintf( stderr, "\nIVAS_DEC_FeedCustomLsData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) );
@@ -686,7 +689,6 @@ int main(
        goto cleanup;
    }


    /*------------------------------------------------------------------------------------------*
     * Close files and deallocate resources
     *------------------------------------------------------------------------------------------*/
@@ -734,7 +736,6 @@ cleanup:
    print_wmops();
    print_mem( NULL );
#endif

    if ( !arg.quietModeEnabled )
    {
        printf( "\n" );
@@ -2026,7 +2027,11 @@ static ivas_error decodeG192(
    int16_t isSplitRend, isSplitCoded;
    IVAS_RENDER_CONFIG_DATA renderConfig;
    RenderConfigReader *renderConfigReader = NULL;
#ifdef FIX_FMSW_DEC_EXT
    bool restartNeeded = false;
#else
    bool restartNeeded;
#endif

#ifdef VARIABLE_SPEED_DECODING
    if ( arg.tsmEnabled )
@@ -2117,6 +2122,7 @@ static ivas_error decodeG192(
        fprintf( stderr, "\nError getting render frame size in samples\n" );
        return error;
    }

    if ( ( error = IVAS_DEC_GetReferencesUpdateFrequency( hIvasDec, &vec_pos_len ) ) != IVAS_ERR_OK )
    {
        fprintf( stderr, "\nError getting render frame size in samples\n" );
@@ -2412,6 +2418,18 @@ static ivas_error decodeG192(
            }
        }

#ifdef FIX_FMSW_DEC_EXT
        /* Output writing update in case of format switching and EXTERNAL output */
        if ( restartNeeded && arg.outputConfig == IVAS_AUDIO_CONFIG_EXTERNAL )
        {
            if ( ( error = updateOnFormatSwitching( hIvasDec, &bsFormat, arg.outputWavFilename, &masaWriter, ismWriters, &nOutChannels, &numObj, arg.delayCompensationEnabled ) ) != IVAS_ERR_OK )
            {
                fprintf( stderr, "Error in updateOnFormatSwitching(): %s\n", IVAS_DEC_GetErrorMessage( error ) );
                goto cleanup;
            }
        }
#endif

        /* Write current frame */
        if ( decodedGoodFrame )
        {
@@ -2805,7 +2823,11 @@ static ivas_error decodeVoIP(
    int16_t i;
    IVAS_DEC_HANDLE hIvasDec = *phIvasDec;

#ifdef FIX_FMSW_DEC_EXT
    bool restartNeeded = false;
#else
    bool restartNeeded;
#endif
    IVAS_RTP ivasRtp = { 0 };
    IVAS_RTP srRtp = { 0 };
    IVAS_RTP_SR_INFO srInfo = { true, false, 0, 20, IVAS_SR_TRANSPORT_LCLD };
@@ -3292,6 +3314,18 @@ static ivas_error decodeVoIP(
            }
        }

#ifdef FIX_FMSW_DEC_EXT
        /* Output writing update in case of format switching and EXTERNAL output */
        if ( restartNeeded && arg.outputConfig == IVAS_AUDIO_CONFIG_EXTERNAL )
        {
            if ( ( error = updateOnFormatSwitching( hIvasDec, &bsFormat, arg.outputWavFilename, &masaWriter, ismWriters, &nOutChannels, &numObj, arg.delayCompensationEnabled ) ) != IVAS_ERR_OK )
            {
                fprintf( stderr, "Error in updateOnFormatSwitching(): %s\n", IVAS_DEC_GetErrorMessage( error ) );
                goto cleanup;
            }
        }
#endif

        /* Write current frame */
        if ( !srRtp.hPack && decodedGoodFrame )
        {
@@ -3900,4 +3934,80 @@ static ivas_error load_hrtf_from_file(
    return IVAS_ERR_OK;
}

#ifdef FIX_FMSW_DEC_EXT

/*---------------------------------------------------------------------*
 * updateOnFormatSwitching()
 *
 * In case of IVAS format switching and EXTERNAL output,
 * update decoder wrt. output writing
 *---------------------------------------------------------------------*/

static ivas_error updateOnFormatSwitching(
    IVAS_DEC_HANDLE hIvasDec,                        /* i/o: IVAS decoder handle                             */
    IVAS_DEC_BS_FORMAT *pBsFormat,                   /* o  : format of currently decoded bitstream           */
    const char *outputWavFilename,                   /* i  : name of the output audio file                   */
    MasaFileWriter **ppMasaWriter,                   /* o  : MasaFileWriter handle                           */
    IsmFileWriter *ismWriters[IVAS_MAX_NUM_OBJECTS], /* o  : 1-4 ismWriters handles                          */
    int16_t *pNumOutChannels,                        /* o  : number of output channels                       */
    uint16_t *pNumObj,                               /* o  : number of ISM objects                           */
    const bool delayCompensationEnabled              /* i  : is delay compensation enabled                   */
)
{
    ivas_error error;

    /* in case of EXT output, the number of output audio channels can change */
    if ( ( error = IVAS_DEC_GetNumOutputChannels( hIvasDec, pNumOutChannels ) ) != IVAS_ERR_OK )
    {
        fprintf( stderr, "\nError in IVAS_DEC_GetNumOutputChannels, code: %d\n", error );
        return error;
    }

    /* Get the format of currently decoded bitstream */
    if ( ( error = IVAS_DEC_GetFormat( hIvasDec, pBsFormat ) ) != IVAS_ERR_OK )
    {
        fprintf( stderr, "\nError in IVAS_DEC_GetFormat, code: %d\n", error );
        return error;
    }

    *pNumObj = 0;
    if ( *pBsFormat == IVAS_DEC_BS_OBJ || *pBsFormat == IVAS_DEC_BS_MASA_ISM || *pBsFormat == IVAS_DEC_BS_SBA_ISM )
    {
        if ( ( error = IVAS_DEC_GetNumObjects( hIvasDec, pNumObj ) ) != IVAS_ERR_OK )
        {
            fprintf( stderr, "\nError in IVAS_DEC_GetNumObjects: %s\n", IVAS_DEC_GetErrorMessage( error ) );
            return error;
        }

        /* If outputting ISM/OMASA/OSBA, ensure the output metadata files are opened */
        for ( int16_t i = 0; i < *pNumObj; ++i )
        {
            if ( ismWriters[i] == NULL )
            {
                if ( ( error = IsmFileWriter_open( outputWavFilename, i, &ismWriters[i] ) ) != IVAS_ERR_OK )
                {
                    fprintf( stderr, "\nError: Error opening ISM decoded metadata file %s\n", IsmFileWriter_getFilePath( ismWriters[i] ) );
                    return error;
                }
            }
        }
    }

    /* If outputting MASA, ensure the output file metadata is opened */
    if ( *pBsFormat == IVAS_DEC_BS_MASA || *pBsFormat == IVAS_DEC_BS_MASA_ISM )
    {
        if ( ppMasaWriter != NULL )
        {
            if ( ( error = MasaFileWriter_open( outputWavFilename, delayCompensationEnabled, ppMasaWriter ) ) != IVAS_ERR_OK )
            {
                fprintf( stderr, "\nError: Error opening MASA decoded metadata file %s\n", MasaFileWriter_getFilePath( *ppMasaWriter ) );
                return error;
            }
        }
    }

    return IVAS_ERR_OK;
}
#endif

#undef WMC_TOOL_SKIP
+2 −164
Original line number Diff line number Diff line
@@ -825,11 +825,7 @@ Word16 getTcxLpcShapedAri(
 * Initialization of TCX
 *-----------------------------------------------------------------------*/

#ifdef HARMONIZE_2567_init_functions
void init_tcx_cfg_fx(
#else
void init_tcx_cfg_ivas_fx(
#endif
    TCX_CONFIG_HANDLE hTcxCfg,
    const Word32 total_brate,     /*Q0*/
    const Word32 sr_core,         /*Q0*/
@@ -845,12 +841,8 @@ void init_tcx_cfg_ivas_fx(
    const Word16 infoIGFStopFreq, /*Q0*/
    const Word16 element_mode,    /*Q0*/
    const Word16 ini_frame,       /*Q0*/
#ifdef HARMONIZE_2567_init_functions
    const Word16 MCT_flag,        /*Q0*/
    const Word16 fscaleFB /*Q0*/ )
#else
    const Word16 MCT_flag /*Q0*/ )
#endif
{
    Word16 i;
    Word16 mdctWindowLength;
@@ -868,11 +860,7 @@ void init_tcx_cfg_ivas_fx(
    hTcxCfg->tcx_mdct_window_length_old = hTcxCfg->tcx_mdct_window_length; /*Q0*/
    move16();
    mdctWindowLength = getMdctWindowLength_fx( fscale );            /*Q0*/
#ifdef HARMONIZE_2567_init_functions
    mdctWindowLengthFB = getMdctWindowLength_fx( fscaleFB ); /*Q0*/ /* this replaces (int16_t) ( mdctWindowLength * input_Fs / sr_core ) as used in float */
#else
    mdctWindowLengthFB = (Word16) ( mdctWindowLength * input_Fs / sr_core );
#endif

    init_tcx_window_cfg_fx( hTcxCfg, sr_core, input_Fs, L_frame, L_frameTCX, mdctWindowLength, mdctWindowLengthFB, element_mode );
    /* SQ deadzone & memory quantization*/
@@ -1092,153 +1080,3 @@ void init_tcx_window_cfg_fx(

    return;
}

#ifndef HARMONIZE_2567_init_functions
void init_tcx_cfg_fx(
    TCX_CONFIG_HANDLE hTcxCfg,
    const Word32 total_brate,     /*Q0*/
    const Word32 sr_core,         /*Q0*/
    const Word32 input_Fs,        /*Q0*/
    const Word16 L_frame,         /*Q0*/
    const Word16 bwidth,          /*Q0*/
    const Word16 L_frameTCX,      /*Q0*/
    const Word16 fscale,          /*Q0*/
    const Word16 preemph_fac,     /*Q15*/
    const Word16 tcxonly,         /*Q0*/
    const Word16 rf_mode,         /*Q0*/
    const Word16 igf,             /*Q0*/
    const Word16 infoIGFStopFreq, /*Q0*/
    const Word16 element_mode,    /*Q0*/
    const Word16 ini_frame,       /*Q0*/
    const Word16 MCT_flag,        /*Q0*/
    const Word16 fscaleFB /*Q0*/ )
{
    Word16 i;
    Word16 mdctWindowLength;
    Word16 mdctWindowLengthFB;
    Word16 na_scale_bwidth;

    hTcxCfg->preemph_fac = preemph_fac;
    move16();

    hTcxCfg->tcx5Size = shr( L_frame, 2 );      /* Always 5 ms Q0*/
    hTcxCfg->tcx5SizeFB = shr( L_frameTCX, 2 ); /* Always 5 ms Q0*/
    move16();
    move16();

    hTcxCfg->tcx_mdct_window_length_old = hTcxCfg->tcx_mdct_window_length; /*Q0*/
    move16();
    mdctWindowLength = getMdctWindowLength_fx( fscale );     /*Q0*/
    mdctWindowLengthFB = getMdctWindowLength_fx( fscaleFB ); /*Q0*/
    init_tcx_window_cfg_fx( hTcxCfg, sr_core, input_Fs, L_frame, L_frameTCX, mdctWindowLength, mdctWindowLengthFB, element_mode );
    /* SQ deadzone & memory quantization*/
    hTcxCfg->sq_rounding = 12288 /*0.375f Q15*/; /*deadzone of 1.25->rounding=1-1.25/2 (No deadzone=0.5)*/
    move16();

    /* TCX rate loop */
    hTcxCfg->tcxRateLoopOpt = 0;
    move16();

    if ( tcxonly != 0 )
    {
        hTcxCfg->tcxRateLoopOpt = 2;
        move16();
    }
    if ( EQ_16( element_mode, IVAS_CPE_MDCT ) )
    {
        hTcxCfg->tcxRateLoopOpt = 3;
        move16();
    }
    hTcxCfg->bandwidth = getTcxBandwidth( bwidth ); /*Q15*/
    move16();

    /* set number of coded lines */
    hTcxCfg->tcx_coded_lines = getNumTcxCodedLines( bwidth ); /*Q0*/
    move16();

    /* TNS in TCX */
    hTcxCfg->pCurrentTnsConfig = NULL;
    hTcxCfg->fIsTNSAllowed = getTnsAllowed( total_brate, igf, element_mode ); /*Q0*/
    move16();

    IF( hTcxCfg->fIsTNSAllowed )
    {
        InitTnsConfigs_fx( bwidth, hTcxCfg->tcx_coded_lines, hTcxCfg->tnsConfig, infoIGFStopFreq, total_brate, element_mode, MCT_flag );

        SetAllowTnsOnWhite( hTcxCfg->tnsConfig, (Word8) EQ_16( element_mode, IVAS_CPE_MDCT ) );
    }

    IF( ini_frame == 0 )
    {
        hTcxCfg->tcx_curr_overlap_mode = hTcxCfg->tcx_last_overlap_mode = ALDO_WINDOW;
        hTcxCfg->last_aldo = 1;
        move16();
        move16();
        move16();
    }

    /* Context HM*/
    hTcxCfg->ctx_hm = getCtxHm( element_mode, total_brate, rf_mode ); /*Q0*/
    move16();

    /* Residual Coding*/
    hTcxCfg->resq = getResq( total_brate ); /*Q0*/
    move16();
    test();
    if ( hTcxCfg->resq && !tcxonly )
    {
        hTcxCfg->tcxRateLoopOpt = 1;
        move16();
    }

    /*Set bandwidth scale*/
    IF( EQ_16( bwidth, NB ) )
    {
        na_scale_bwidth = NB;
    }
    ELSE IF( LE_32( sr_core, INT_FS_16k ) )
    {
        na_scale_bwidth = WB;
    }
    ELSE
    {
        na_scale_bwidth = SWB;
    }
    move16();
    hTcxCfg->na_scale = 32767 /*1.0f Q15*/;
    move16();

    test();
    IF( LT_16( na_scale_bwidth, SWB ) && !tcxonly )
    {
        FOR( i = 0; i < SIZE_SCALE_TABLE_TCX; i++ )
        {
            test();
            test();
            IF( ( EQ_16( na_scale_bwidth, scaleTcxTable[i].bwmode ) ) &&
                ( GE_32( total_brate, scaleTcxTable[i].bitrateFrom ) ) &&
                ( LT_32( total_brate, scaleTcxTable[i].bitrateTo ) ) )
            {
                if ( rf_mode )
                {
                    i = sub( i, 1 );
                }
                hTcxCfg->na_scale = scaleTcxTable[i].scale; /*Q15*/
                move16();
                BREAK;
            }
        }
    }

    IF( tcxonly )
    {
        InitPsychLPC_fx( sr_core, L_frame, hTcxCfg );
    }
    ELSE
    {
        hTcxCfg->psychParamsCurrent = NULL;
    }

    return;
}
#endif
+4 −0
Original line number Diff line number Diff line
@@ -716,7 +716,11 @@ void tdm_SCh_LSF_intra_pred_fx(
        fixed_beta = 30801; // 0.94f in Q15
        move16();
    }
#ifndef FIX_ISSUE_2613_WRONG_COMP_MACRO
    ELSE IF( element_brate <= IVAS_24k4 )
#else
    ELSE IF( LE_32( element_brate, IVAS_24k4 ) )
#endif // !FIX_ISSUE_2613_WRONG_COMP_MACRO
    {
        fixed_beta = 29818; // 0.91f in Q15
        move16();
+9 −12
Original line number Diff line number Diff line
@@ -86,16 +86,11 @@
#define FIX_1990_SANITIZER_IN_REVERB_LOAD               /* Nokia: Fix issue part of issue 1990 by introducing missing free of structure - keep until #2059 is addressed */
#define TMP_1342_WORKAROUND_DEC_FLUSH_BROKEN_IN_SR      /* FhG: Temporary workaround for incorrect implementation of decoder flush with split rendering */
#define NONBE_1122_KEEP_EVS_MODE_UNCHANGED              /* FhG: Disables fix for issue 1122 in EVS mode to keep BE tests green. This switch should be removed once the 1122 fix is added to EVS via a CR.  */
#define HARMONIZE_2595_reconfig_decoder_LPD             /* FhG: Harmonize reconfig_decoder_LPD with its ivas derivate */
#define HARMONIZE_2596_SetModeIndex                     /* FhG: Harmonize SetModeIndex with its ivas derivate */
#define HARMONIZE_2597_ShapeSpectrum                    /* FhG: Harmonize ShapeSpectrum with its ivas derivate */
#define HARMONIZE_2567_init_functions                   /* FhG: harmonize derivates for evs/ivas regarding functions init_acelp*(),init_tcx_cfg*(), init_tcx*(), init_coder_ace_plus*(), init_core_sig_ana*() and init_modes*() */
#define HARMONIZE_2607_GetFilterParameters              /* FhG: Harmonize GetFilterParameters with its ivas derivate */
#define HAMRONIZE_2606_ENC_PRM                          /* FhG: Harmonize enc_prm_fx(), to match floating-point code */
#define HARMONIZE_2604_decoder_tcx_post                 /* FhG: Harmonize decoder_tcx_post with its ivas derivate */
#define HARMONIZE_2598_tcx_arith_decode_envelope        /* FhG: harmonize tcx_arith_decode_envelope between EVS and IVAS versions */
#define HARMONIZE_2598_tcx_arith_encode_envelope        /* FhG: harmonize tcx_arith_encode_envelope between EVS and IVAS versions */
#define FIX_ISSUE_2594_FALSE_COMMENT                    /* FhG: basop issue 2594: fixing false comments about Q value*/
#define FIX_ISSUE_2616_BOUNDARY_CONDITION               /* FhG: basop issue 2616: Inconsistent boundary conditions in function stereo_dft_dequantize_res_gains*/
#define FIX_ISSUE_2613_WRONG_COMP_MACRO                 /* FhG: basop issue 2613: Inconsistent comparison macros in function tdm_SCh_LSF_intra_pred_fx*/
#define FIX_ISSUE_2611_WRONG_COMMENT                    /* FhG: basop issue 2611: Wrong Q value comment in fucntion stereo_dft_sg_recovery_fx()*/
#define FIX_BASOP_2550_TCX_ENC_MEM_UPDATE               /* FhG: fix condition in tcx_encoder_memory_update_*_fx(), bring inline with float */
#define FIX_BASOP_2620_ICBWE_GSMAPPING_DEAD_CLAMP       /* FhG: remove dead (always-overwritten) gsMapping clamp in ic_bwe_enc_gsMapping_fx; float ref has no clamp */

/* #################### End BE switches ################################## */

@@ -103,9 +98,11 @@
/* any switch which is non-be wrt. TS 26.251 V3.0 */

#define FIX_1576_LCLD_CRASH_DIFFERENT_CODEC_ISAR_FRAME_SIZE  /* Dolby: float issue 1576: fix for crash in LCLD mode when codec frame size is less than isar frame size */
#define FIX_BASOP_2599_TCA_OVERFLOW                     /* VA: issue 2599, Fix TCA overflow */
#define FIX_2588_MISSING_CONDITIONS                     /* VA: Proposed fix to 2588, addition of a condition in lsf_dec */
#define FIX_BASOP_2442_MASA2TC_TO_MONO_AND_AMBI         /* Nokia: BASOP issue 2442: Increase accuracy of computations and add additional gain clamp for low energy decorrelated signal rendering. */
#define FIX_FMSW_DEC_EXT                                /* float issue 1566: fix EXT output in format switching */
#define FIX_BASOP_2612_RESET_DECIM_MEM                  /* FhG: BASOP #2612: reset (zero) the 16k resampler memory of the secondary channel on DFT->TD stereo switch (otherwise -> fx overshoot) */
#define FIX_BASOP_2621_STEREO_CNG_NOISY_SPEECH_QSHIFT   /* FhG: BASOP #2621: stereo_dft_generate_comfort_noise_fx flag_noisy_speech: compare (lp_speech-lp_noise) Q23 diff against 28.0 in Q23 (was vs integer 28 with q_lp_noise=0) */
#define FIX_ISSUE_2618_PLC_RES_ATT_SCALING              /* FhG: BASOP #2618: residual PLC burst attenuation, apply divide/Sqrt32 exponent so fac tracks exponent correctly */

#define NONBE_FIX2614_LP_CNG_ASSERT

+3 −124

File changed.

Preview size limit exceeded, changes collapsed.

Loading