Commit 29b93e0e authored by Lauros Pajunen's avatar Lauros Pajunen
Browse files

Merge branch 'rtp-add-decoder-restart' into 'main'

Port decoder restart from float MR2279

See merge request !2541
parents 11685f52 19515130
Loading
Loading
Loading
Loading
Loading
+186 −0
Original line number Diff line number Diff line
@@ -179,13 +179,24 @@ static bool parseCmdlIVAS_dec( int16_t argc, char **argv, DecArguments *arg );
static void usage_dec( void );
static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HRTF_BINARY_WRAPPER *hHrtfBinary, RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, RotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, ObjectEditFileReader *objectEditFileReader, ISAR_SPLIT_REND_BITS_DATA *splitRendBits, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf );
#ifdef FIX_1119_SPLIT_RENDERING_VOIP
#ifdef DECODER_FORMAT_SWITCHING
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 );
#else
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 hIvasDec, int16_t *pcmBuf );
#endif
#else
#ifdef DDECODER_FORMAT_SWITCHING
static ivas_error decodeVoIP( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HRTF_BINARY_WRAPPER *hHrtfBinary, RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, RotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, ObjectEditFileReader *objectEditFileReader, IVAS_DEC_HANDLE *phIvasDec, int16_t *pcmBuf );
#else
static ivas_error decodeVoIP( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HRTF_BINARY_WRAPPER *hHrtfBinary, RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, RotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, ObjectEditFileReader *objectEditFileReader, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf );
#endif
#endif
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 DECODER_FORMAT_SWITCHING
static ivas_error restartDecoder( IVAS_DEC_HANDLE *phIvasDec, IVAS_DEC_MODE codec, DecArguments *arg, IVAS_RENDER_CONFIG_DATA *renderConfig, IVAS_CUSTOM_LS_DATA *hLsCustomData );
#endif

/*------------------------------------------------------------------------------------------*
 * main()
@@ -720,9 +731,17 @@ int main(
    if ( arg.voipMode )
    {
#ifdef FIX_1119_SPLIT_RENDERING_VOIP
#ifdef DECODER_FORMAT_SWITCHING
        error = decodeVoIP( arg, hBsReader, &hHrtfBinary, headRotReader, externalOrientationFileReader, refRotReader, referenceVectorReader, objectEditFileReader, &splitRendBits, &hIvasDec, pcmBuf );
#else
        error = decodeVoIP( arg, hBsReader, &hHrtfBinary, headRotReader, externalOrientationFileReader, refRotReader, referenceVectorReader, objectEditFileReader, &splitRendBits, hIvasDec, pcmBuf );
#endif
#else
#ifdef DDECODER_FORMAT_SWITCHING
        error = decodeVoIP( arg, hBsReader, &hHrtfBinary, headRotReader, externalOrientationFileReader, refRotReader, referenceVectorReader, objectEditFileReader, &hIvasDec, pcmBuf );
#else
        error = decodeVoIP( arg, hBsReader, &hHrtfBinary, headRotReader, externalOrientationFileReader, refRotReader, referenceVectorReader, objectEditFileReader, hIvasDec, pcmBuf );
#endif
#endif
    }
    else
@@ -2990,7 +3009,11 @@ static ivas_error decodeVoIP(
#ifdef FIX_1119_SPLIT_RENDERING_VOIP
    ISAR_SPLIT_REND_BITS_DATA *splitRendBits,
#endif
#ifdef DECODER_FORMAT_SWITCHING
    IVAS_DEC_HANDLE *phIvasDec,
#else
    IVAS_DEC_HANDLE hIvasDec,
#endif
    int16_t *pcmBuf )
{
    bool decodingFailed = true; /* Assume failure until cleanup is reached without errors */
@@ -3022,6 +3045,9 @@ static ivas_error decodeVoIP(
    int16_t delayNumSamples = -1;
    int32_t delayTimeScale = -1;
    int16_t i;
#ifdef DECODER_FORMAT_SWITCHING
    IVAS_DEC_HANDLE hIvasDec = *phIvasDec;
#endif
#ifdef IVAS_RTPDUMP
    IVAS_RTP ivasRtp = { 0 };
    IVAS_RTP srRtp = { 0 };
@@ -3216,6 +3242,27 @@ static ivas_error decodeVoIP(
    {
        nSamplesRendered = 0;

#ifdef DECODER_FORMAT_SWITCHING
        if ( ivasRtp.restartNeeded )
        {
            IVAS_DEC_MODE newCodecInPacket = ( ivasRtp.codecId == IVAS_RTP_EVS ) ? IVAS_DEC_MODE_EVS : IVAS_DEC_MODE_IVAS;
            error = restartDecoder(
                &hIvasDec,
                newCodecInPacket,
                &arg,
                NULL, /* ToDo : Provide rendererConfig */
                NULL  /* ToDo : Provide LS Custom Data */
            );
            if ( error != IVAS_ERR_OK )
            {
                fprintf( stderr, "\nFailed to restart decoder from %d to %d\n", arg.decMode, newCodecInPacket );
                goto cleanup;
            }
            *phIvasDec = hIvasDec; /* Update for main()' s free */
            ivasRtp.restartNeeded = false;
        }
#endif

        /* reference vector */
        if ( arg.enableReferenceVectorTracking && vec_pos_update == 0 )
        {
@@ -3471,6 +3518,31 @@ static ivas_error decodeVoIP(

                /* Placeholder for memory reallocation */
                /* ... */
#ifdef DECODER_FORMAT_SWITCHING
                if ( IVAS_DEC_isRestartNeeded( hIvasDec ) )
                {
                    IVAS_DEC_BS_FORMAT tempFormat;
                    if ( ( error = IVAS_DEC_GetFormat( hIvasDec, &tempFormat ) ) != IVAS_ERR_OK )
                    {
                        fprintf( stderr, "\nError in IVAS_DEC_GetFormat, code: %d\n", error );
                        goto cleanup;
                    }
                    IVAS_DEC_MODE codecMode = ( tempFormat == IVAS_DEC_BS_MONO ) ? IVAS_DEC_MODE_EVS : IVAS_DEC_MODE_IVAS;
                    error = restartDecoder(
                        &hIvasDec,
                        codecMode,
                        &arg,
                        NULL, /* ToDo : Provide rendererConfig */
                        NULL  /* ToDo : Provide LS Custom Data */
                    );
                    if ( error != IVAS_ERR_OK )
                    {
                        fprintf( stderr, "\nFailed to restart decoder\n" );
                        goto cleanup;
                    }
                    *phIvasDec = hIvasDec; /* Update for main()' s free */
                }
#endif

                /* Load HRTF binary file data */
                if ( arg.hrtfReaderEnabled )
@@ -4248,4 +4320,118 @@ static ivas_error load_hrtf_from_file(
    return IVAS_ERR_OK;
}

#ifdef DECODER_FORMAT_SWITCHING

ivas_error restartDecoder(
    IVAS_DEC_HANDLE *phIvasDec,
    IVAS_DEC_MODE codec,
    DecArguments *arg,
    IVAS_RENDER_CONFIG_DATA *renderConfig,
    IVAS_CUSTOM_LS_DATA *hLsCustomData )
{
    ivas_error error = IVAS_ERR_OK;
    IVAS_DEC_HANDLE hIvasDec;

    if ( phIvasDec == NULL )
    {
        return IVAS_ERR_UNEXPECTED_NULL_POINTER;
    }

    if ( NULL != *phIvasDec )
    {
        IVAS_DEC_Close( phIvasDec );
    }

    if ( ( error = IVAS_DEC_Open( phIvasDec, codec ) ) != IVAS_ERR_OK )
    {
        fprintf( stderr, "Open failed: %s\n", IVAS_DEC_GetErrorMessage( error ) );
        goto cleanup;
    }

    arg->decMode = codec;

    hIvasDec = *phIvasDec;

    uint16_t aeID = arg->aeSequence.count > 0 ? arg->aeSequence.pID[0] : 65535;

    IVAS_AUDIO_CONFIG outputConfig = ( codec == IVAS_DEC_MODE_IVAS ) ? arg->outputConfig : IVAS_AUDIO_CONFIG_MONO;
#ifdef FIX_1318_ROOM_SIZE_CMD_LINE
    if ( ( error = IVAS_DEC_Configure( hIvasDec, arg->output_Fs, outputConfig, arg->renderFramesize, arg->customLsOutputEnabled, arg->hrtfReaderEnabled,
                                       arg->enableHeadRotation, arg->enableExternalOrientation, arg->orientation_tracking, arg->renderConfigEnabled, arg->roomSize, arg->non_diegetic_pan_enabled,
                                       arg->non_diegetic_pan_gain_fx, arg->dpidEnabled, aeID, arg->objEditEnabled, arg->delayCompensationEnabled ) ) != IVAS_ERR_OK )
#else
    if ( ( error = IVAS_DEC_Configure( hIvasDec, arg->output_Fs, outputConfig, arg->renderFramesize, arg->customLsOutputEnabled, arg->hrtfReaderEnabled,
                                       arg->enableHeadRotation, arg->enableExternalOrientation, arg->orientation_tracking, arg->renderConfigEnabled, arg->non_diegetic_pan_enabled,
                                       arg->non_diegetic_pan_gain_fx, arg->dpidEnabled, aeID, arg->objEditEnabled, arg->delayCompensationEnabled ) ) != IVAS_ERR_OK )
#endif
    {
        fprintf( stderr, "\nConfigure failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) );
        goto cleanup;
    }

    if ( ( error = IVAS_DEC_GetRenderFramesize( hIvasDec, &arg->renderFramesize ) ) != IVAS_ERR_OK )
    {
        fprintf( stderr, "\nConfigure failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) );
        goto cleanup;
    }

    if ( arg->outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED || arg->outputConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM )
    {
        if ( ( error = IVAS_DEC_EnableSplitRendering( hIvasDec ) ) != IVAS_ERR_OK )
        {
            fprintf( stderr, "\nSplit rendering configure failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) );
            goto cleanup;
        }

        if ( ( error = IVAS_DEC_GetRenderFramesize( hIvasDec, &arg->renderFramesize ) ) != IVAS_ERR_OK )
        {
            fprintf( stderr, "\nConfigure failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) );
            goto cleanup;
        }

        arg->enableHeadRotation = true;
    }

    if ( arg->voipMode )
    {
        if ( ( error = IVAS_DEC_EnableVoIP( hIvasDec, 60, arg->inputFormat ) ) != IVAS_ERR_OK )
        {
            fprintf( stderr, "\nCould not enable VOIP: %s\n\n", IVAS_DEC_GetErrorMessage( error ) );
            goto cleanup;
        }
    }

    if ( ( error = IVAS_DEC_PrintConfig( hIvasDec, 1, arg->voipMode ) ) != IVAS_ERR_OK )
    {
        fprintf( stderr, "\nIVAS_DEC_PrintConfig failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) );
        goto cleanup;
    }

    if ( arg->renderConfigEnabled && renderConfig != NULL )
    {
        if ( ( error = IVAS_DEC_FeedRenderConfig( hIvasDec, *renderConfig ) ) != IVAS_ERR_OK )
        {
            fprintf( stderr, "\nIVAS_DEC_FeedRenderConfig failed: %s\n\n", IVAS_DEC_GetErrorMessage( error ) );
            goto cleanup;
        }
    }

    if ( arg->customLsOutputEnabled && hLsCustomData != NULL )
    {
        if ( ( error = IVAS_DEC_FeedCustomLsData( hIvasDec, *hLsCustomData ) ) != IVAS_ERR_OK )
        {
            fprintf( stderr, "\nIVAS_DEC_FeedCustomLsData failed: %s\n", IVAS_DEC_GetErrorMessage( error ) );
            goto cleanup;
        }
    }

    return IVAS_ERR_OK;

cleanup:
    IVAS_DEC_Close( phIvasDec );
    return error;
}

#endif

#undef WMC_TOOL_SKIP
+5 −0
Original line number Diff line number Diff line
@@ -4030,7 +4030,12 @@ ivas_error ivas_output_buff_dec_fx(
);

ivas_error ivas_dec_get_format_fx(
#ifdef DECODER_FORMAT_SWITCHING
    Decoder_Struct *st_ivas,                                    /* i/o: IVAS decoder structure                      */
    const bool isVoipMode                                       /* i  : voip mode indicator                         */
#else
    Decoder_Struct *st_ivas                                     /* i/o: IVAS decoder structure                      */
#endif
);

ivas_error ivas_dec_setup(
+1 −0
Original line number Diff line number Diff line
@@ -169,6 +169,7 @@
#define ISM_PI_DATA                                    /* Add reading and packing/unpacking of ISM PI data */
#define REVERSE_ISM_PI_DATA                            /* Add reading and packing/unpacking of reverse ISM PI data */
#define PI_LATENCY                                     /* Support for PI latency */
#define DECODER_FORMAT_SWITCHING                       /* Re-initialize the decoder when the format/subformat of the incoming stream is changed */

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

+194 −0
Original line number Diff line number Diff line
@@ -104,7 +104,12 @@ static AUDIO_CONFIG ivas_set_audio_config_from_sba_order(
 *---------------------------------------------------------------------*/

ivas_error ivas_dec_get_format_fx(
#ifdef DECODER_FORMAT_SWITCHING
    Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure    */
    const bool isVoipMode    /* i  : voip mode indicator       */
#else
    Decoder_Struct *st_ivas /* i/o: IVAS decoder structure     */
#endif
)
{
    Word16 k, idx, num_bits_read;
@@ -142,11 +147,27 @@ ivas_error ivas_dec_get_format_fx(
        !( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) && EQ_32( st_ivas->last_ivas_format, MASA_ISM_FORMAT ) ) &&
        !( EQ_32( st_ivas->ivas_format, MASA_ISM_FORMAT ) && EQ_32( st_ivas->last_ivas_format, MASA_FORMAT ) ) )
    {
#ifdef DECODER_FORMAT_SWITCHING
        IF( isVoipMode )
        {
            st_ivas->restartNeeded = 1;
            move16();
            return IVAS_ERR_OK;
        }
        ELSE
        {
#ifdef DEBUGGING
            fprintf( stderr, "\nError: Changing the number of ISMs is not supported!\n" );
#endif
            return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Wrong number of objects signalled!" );
        }
#else
#ifdef DEBUGGING
        fprintf( stderr, "\nError: Changing the number of ISMs is not supported!\n" );
#endif
        return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Wrong number of objects signalled!" );
#endif
    }

    /*-------------------------------------------------------------------*
     * Read other signaling (ISM/MC mode, number of channels, etc.)
@@ -183,10 +204,26 @@ ivas_error ivas_dec_get_format_fx(
            test();
            IF( st_ivas->ini_frame > 0 && NE_16( nchan_ism, st_ivas->nchan_ism ) )
            {
#ifdef DECODER_FORMAT_SWITCHING
                IF( isVoipMode )
                {
                    st_ivas->restartNeeded = 1;
                    move16();
                    return IVAS_ERR_OK;
                }
                ELSE
                {
#ifdef DEBUGGING
                    fprintf( stderr, "\nError: Changing the number of ISMs is not supported!\n" );
#endif
                    return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Wrong number of objects signalled!" );
                }
#else
#ifdef DEBUGGING
                fprintf( stderr, "\nError: Changing the number of ISMs is not supported!\n" );
#endif
                return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Wrong number of objects signalled!" );
#endif
            }

            st_ivas->nchan_ism = nchan_ism;
@@ -210,11 +247,27 @@ ivas_error ivas_dec_get_format_fx(
            test();
            IF( st_ivas->ini_frame > 0 && NE_16( sba_planar, st_ivas->sba_planar ) )
            {
#ifdef DECODER_FORMAT_SWITCHING
                IF( isVoipMode )
                {
                    st_ivas->restartNeeded = 1;
                    move16();
                    return IVAS_ERR_OK;
                }
                ELSE
                {
#ifdef DEBUGGING
                    fprintf( stderr, "\nError: Changing the SBA planar/3D layout is not supported!\n" );
#endif
                    return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Wrong SBA planar flag signalled!" );
                }
#else
#ifdef DEBUGGING
                fprintf( stderr, "\nError: Changing the SBA planar/3D layout is not supported!\n" );
#endif
                return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Wrong SBA planar flag signalled!" );
#endif
            }

            /* read Ambisonic (SBA) order */
            sba_order = st_ivas->bit_stream[num_bits_read + 1];
@@ -224,21 +277,50 @@ ivas_error ivas_dec_get_format_fx(
            test();
            IF( st_ivas->ini_frame > 0 && NE_16( sba_order, st_ivas->sba_order ) )
            {
#ifdef DECODER_FORMAT_SWITCHING
                IF( isVoipMode )
                {
                    st_ivas->restartNeeded = 1;
                    move16();
                    return IVAS_ERR_OK;
                }
                ELSE
                {
#ifdef DEBUGGING
                    fprintf( stderr, "\nError: Changing the SBA order is not supported!\n" );
#endif
                    return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Wrong SBA order signalled!" );
                }
#else
#ifdef DEBUGGING
                fprintf( stderr, "\nError: Changing the SBA order is not supported!\n" );
#endif
                return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Wrong SBA order signalled!" );
#endif
            }

            sba_analysis_order = ivas_sba_get_analysis_order_fx( ivas_total_brate, sba_order );
            st_ivas->nchan_transport = ivas_get_sba_num_TCs_fx( ivas_total_brate, sba_analysis_order );
        }
        ELSE IF( EQ_32( st_ivas->ivas_format, MASA_FORMAT ) )
        {
#ifdef DECODER_FORMAT_SWITCHING
            UWord8 masaRestartCandidate;
            masaRestartCandidate = 0;
            move16();
#endif
            /* read number of MASA transport channels */
            k = extract_l( Mpy_32_32_r( ivas_total_brate, ONE_BY_FRAMES_PER_SEC_Q31 ) );
            IF( st_ivas->bit_stream[k - 1] )
            {
#ifdef DECODER_FORMAT_SWITCHING
                test();
                IF( st_ivas->nchan_transport == 1 && isVoipMode )
                {
                    masaRestartCandidate = 1;
                    move16();
                }
#endif
                st_ivas->nchan_transport = 2;
                move16();
                element_mode_flag = 1;
@@ -246,6 +328,14 @@ ivas_error ivas_dec_get_format_fx(
            }
            ELSE
            {
#ifdef DECODER_FORMAT_SWITCHING
                test();
                IF( st_ivas->nchan_transport == 2 && isVoipMode )
                {
                    masaRestartCandidate = 1;
                    move16();
                }
#endif
                st_ivas->nchan_transport = 1;
                move16();
            }
@@ -279,14 +369,38 @@ ivas_error ivas_dec_get_format_fx(
                element_mode_flag = 1;
                move16();
            }
#ifdef DECODER_FORMAT_SWITCHING
            ELSE IF( masaRestartCandidate > 0 )
            {
                st_ivas->restartNeeded = 1;
                move16();
                return IVAS_ERR_OK;
            }
#endif

            test();
            IF( st_ivas->ini_frame > 0 && NE_16( nchan_ism, st_ivas->nchan_ism ) )
            {
#ifdef DECODER_FORMAT_SWITCHING
                IF( isVoipMode )
                {
                    st_ivas->restartNeeded = 1;
                    move16();
                    return IVAS_ERR_OK;
                }
                ELSE
                {
#ifdef DEBUGGING
                    fprintf( stderr, "\nError: Changing the number of ISMs is not supported!\n" );
#endif
                    return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Wrong number of objects signalled!" );
                }
#else
#ifdef DEBUGGING
                fprintf( stderr, "\nError: Changing the number of ISMs is not supported!\n" );
#endif
                return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Wrong number of objects signalled!" );
#endif
            }

            st_ivas->nchan_ism = nchan_ism;
@@ -305,10 +419,26 @@ ivas_error ivas_dec_get_format_fx(
            test();
            IF( st_ivas->ini_frame > 0 && NE_16( nchan_ism, st_ivas->nchan_ism ) )
            {
#ifdef DECODER_FORMAT_SWITCHING
                IF( isVoipMode )
                {
                    st_ivas->restartNeeded = 1;
                    move16();
                    return IVAS_ERR_OK;
                }
                ELSE
                {
#ifdef DEBUGGING
                    fprintf( stderr, "\nError: Changing the number of ISMs is not supported!\n" );
#endif
                    return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Wrong number of objects signalled!" );
                }
#else
#ifdef DEBUGGING
                fprintf( stderr, "\nError: Changing the number of ISMs is not supported!\n" );
#endif
                return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Wrong number of objects signalled!" );
#endif
            }

            st_ivas->nchan_ism = nchan_ism;
@@ -323,11 +453,27 @@ ivas_error ivas_dec_get_format_fx(
            test();
            IF( st_ivas->ini_frame > 0 && NE_16( nchan_ism, st_ivas->nchan_ism ) )
            {
#ifdef DECODER_FORMAT_SWITCHING
                IF( isVoipMode )
                {
                    st_ivas->restartNeeded = 1;
                    move16();
                    return IVAS_ERR_OK;
                }
                ELSE
                {
#ifdef DEBUGGING
                    fprintf( stderr, "\nError: Changing the number of ISMs is not supported!\n" );
#endif
                    return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Wrong number of objects signalled!" );
                }
#else
#ifdef DEBUGGING
                fprintf( stderr, "\nError: Changing the number of ISMs is not supported!\n" );
#endif
                return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Wrong number of objects signalled!" );
#endif
            }

            st_ivas->nchan_ism = nchan_ism;
            move16();
@@ -354,11 +500,27 @@ ivas_error ivas_dec_get_format_fx(
            test();
            IF( st_ivas->ini_frame > 0 && NE_16( sba_order, st_ivas->sba_order ) )
            {
#ifdef DECODER_FORMAT_SWITCHING
                IF( isVoipMode )
                {
                    st_ivas->restartNeeded = 1;
                    move16();
                    return IVAS_ERR_OK;
                }
                ELSE
                {
#ifdef DEBUGGING
                    fprintf( stderr, "\nError: Changing the SBA order is not supported!\n" );
#endif
                    return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Wrong SBA order signalled!" );
                }
#else
#ifdef DEBUGGING
                fprintf( stderr, "\nError: Changing the SBA order is not supported!\n" );
#endif
                return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Wrong SBA order signalled!" );
#endif
            }

            st_ivas->ism_mode = ivas_osba_ism_mode_select( ivas_total_brate, st_ivas->nchan_ism );

@@ -384,11 +546,27 @@ ivas_error ivas_dec_get_format_fx(
            test();
            IF( st_ivas->ini_frame > 0 && NE_32( st_ivas->transport_config, signaled_config ) )
            {
#ifdef DECODER_FORMAT_SWITCHING
                IF( isVoipMode )
                {
                    st_ivas->restartNeeded = 1;
                    move16();
                    return IVAS_ERR_OK;
                }
                ELSE
                {
#ifdef DEBUGGING
                    fprintf( stderr, "\nError: Switching of MC configurations is not supported!\n" );
#endif
                    return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "wrong MC configuration signalled!" );
                }
#else
#ifdef DEBUGGING
                fprintf( stderr, "\nError: Switching of MC configurations is not supported!\n" );
#endif
                return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "wrong MC configuration signalled!" );
#endif
            }

            st_ivas->mc_mode = ivas_mc_mode_select_fx( ivas_mc_map_output_config_to_mc_ls_setup_fx( signaled_config ), ivas_total_brate );
            st_ivas->transport_config = signaled_config;
@@ -486,11 +664,27 @@ ivas_error ivas_dec_get_format_fx(
            test();
            IF( st_ivas->ini_frame > 0 && NE_16( nchan_ism, st_ivas->nchan_ism ) )
            {
#ifdef DECODER_FORMAT_SWITCHING
                IF( isVoipMode )
                {
                    st_ivas->restartNeeded = 1;
                    move16();
                    return IVAS_ERR_OK;
                }
                ELSE
                {
#ifdef DEBUGGING
                    fprintf( stderr, "\nError: Changing the number of ISMs is not supported!\n" );
#endif
                    return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Wrong number of objects signalled!" );
                }
#else
#ifdef DEBUGGING
                fprintf( stderr, "\nError: Changing the number of ISMs is not supported!\n" );
#endif
                return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Wrong number of objects signalled!" );
#endif
            }

            st_ivas->nchan_ism = nchan_ism;
            move16();
+3 −0
Original line number Diff line number Diff line
@@ -1223,6 +1223,9 @@ typedef struct Decoder_Struct
#ifdef TMP_1342_WORKAROUND_DEC_FLUSH_BROKEN_IN_SR
    Word16 flushing;
#endif
#ifdef DECODER_FORMAT_SWITCHING
    UWord8 restartNeeded;                                      /* Flag to check if the decoder requires a restart */
#endif

} Decoder_Struct;

Loading