Commit 87e10cb2 authored by Ripinder Singh's avatar Ripinder Singh
Browse files

Add decoder restart logic for codec/format/sub-format switching in rtpdump



* Introduce a reset decoder function for codec and format/sub-format
switching

Signed-off-by: default avatarRipinder Singh <ripinder.singh@dolby.com>
Signed-off-by: default avatarLauros Pajunen <lauros.pajunen@nokia.com>
parent c37b61de
Loading
Loading
Loading
Loading
+237 −6
Original line number Diff line number Diff line
@@ -179,12 +179,40 @@ typedef struct

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 *hHrtf, RotFileReader *headRotReader, RotFileReader *externalOrientationFileReader, RotFileReader *refRotReader, Vector3PairFileReader *referenceVectorReader, ObjectEditFileReader *objectEditFileReader, ISAR_SPLIT_REND_BITS_DATA *splitRendBits, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf );
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,
#ifdef DECODER_FORMAT_SWITCHING
    IVAS_DEC_HANDLE *phIvasDec,
#else
    IVAS_DEC_HANDLE hIvasDec,
#endif
    int16_t *pcmBuf );
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,
#ifdef FIX_1119_SPLIT_RENDERING_VOIP
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 );
    ISAR_SPLIT_REND_BITS_DATA *splitRendBits,
#endif
#ifdef DECODER_FORMAT_SWITCHING
    IVAS_DEC_HANDLE *phIvasDec,
#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, IVAS_DEC_HANDLE hIvasDec, int16_t *pcmBuf );
    IVAS_DEC_HANDLE hIvasDec,
#endif
    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 );
#ifdef DEBUGGING
static ivas_error printBitstreamInfoVoip( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS_DEC_HANDLE hIvasDec );
@@ -192,6 +220,9 @@ static int16_t app_own_random( int16_t *seed );
#endif
static void do_object_editing( 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()
 *
@@ -745,16 +776,24 @@ int main(

    if ( arg.voipMode )
    {

        error = decodeVoIP( arg, hBsReader, &hHrtfBinary, headRotReader, externalOrientationFileReader, refRotReader, referenceVectorReader, objectEditFileReader,
#ifdef FIX_1119_SPLIT_RENDERING_VOIP
        error = decodeVoIP( arg, hBsReader, &hHrtfBinary, headRotReader, externalOrientationFileReader, refRotReader, referenceVectorReader, objectEditFileReader, &splitRendBits, hIvasDec, pcmBuf );
                            &splitRendBits,
#endif
#ifdef DECODER_FORMAT_SWITCHING
                            &hIvasDec,
#else
        error = decodeVoIP( arg, hBsReader, &hHrtfBinary, headRotReader, externalOrientationFileReader, refRotReader, referenceVectorReader, objectEditFileReader, hIvasDec, pcmBuf );
                            hIvasDec,
#endif
                            pcmBuf );
    }
    else
    {
#ifdef DECODER_FORMAT_SWITCHING
        error = decodeG192( arg, hBsReader, &hHrtfBinary, headRotReader, externalOrientationFileReader, refRotReader, referenceVectorReader, objectEditFileReader, &splitRendBits, &hIvasDec, pcmBuf );
#else
        error = decodeG192( arg, hBsReader, &hHrtfBinary, headRotReader, externalOrientationFileReader, refRotReader, referenceVectorReader, objectEditFileReader, &splitRendBits, hIvasDec, pcmBuf );
#endif
    }

    if ( error == IVAS_ERR_OK || error == IVAS_ERR_END_OF_FILE )
@@ -2079,7 +2118,11 @@ static ivas_error decodeG192(
    Vector3PairFileReader *referenceVectorReader,
    ObjectEditFileReader *objectEditFileReader,
    ISAR_SPLIT_REND_BITS_DATA *splitRendBits,
#ifdef DECODER_FORMAT_SWITCHING
    IVAS_DEC_HANDLE *phIvasDec,
#else
    IVAS_DEC_HANDLE hIvasDec,
#endif
    int16_t *pcmBuf )

{
@@ -2116,6 +2159,9 @@ static ivas_error decodeG192(
    int16_t vec_pos_update, vec_pos_len;
    SplitFileReadWrite *splitRendWriter = NULL;
    int16_t isSplitRend, isSplitCoded;
#ifdef DECODER_FORMAT_SWITCHING
    IVAS_DEC_HANDLE hIvasDec = *phIvasDec;
#endif

#ifdef VARIABLE_SPEED_DECODING
    if ( arg.tsmEnabled )
@@ -2465,6 +2511,31 @@ static ivas_error decodeG192(

                /* 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 )
@@ -3064,7 +3135,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 */
@@ -3096,6 +3171,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 };
    int32_t initialTsOffsetSystemAndRTP = 0;
@@ -3283,6 +3361,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 )
        {
@@ -3533,6 +3632,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 )
@@ -4184,4 +4308,111 @@ 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;
    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, arg->dpidEnabled, aeID, arg->objEditEnabled, arg->delayCompensationEnabled ) ) != IVAS_ERR_OK )
    {
        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
+1 −0
Original line number Diff line number Diff line
@@ -161,6 +161,7 @@

#define RTP_S4_251135_CR26253_0016_REV1                /* RTP Pack/Unpack API corresponding to CR 26253 */
#define IVAS_RTPDUMP                                   /* RTPDUMP writing and reading for IVAS payloads */
#define DECODER_FORMAT_SWITCHING                         /* Re-initialize the decoder when the format/subformat of the incoming stream is changed */

/* ################### Start BE switches ################################# */
/* only BE switches wrt selection floating point code */
+50 −0
Original line number Diff line number Diff line
@@ -129,10 +129,15 @@ ivas_error ivas_dec_get_format(
         !( st_ivas->ivas_format == MASA_FORMAT && st_ivas->last_ivas_format == MASA_ISM_FORMAT ) &&
         !( st_ivas->ivas_format == MASA_ISM_FORMAT && st_ivas->last_ivas_format == MASA_FORMAT ) )
    {
#ifdef DECODER_FORMAT_SWITCHING
        st_ivas->restartNeeded = 1;
        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!" );
#endif
    }

    /*-------------------------------------------------------------------*
@@ -166,10 +171,15 @@ ivas_error ivas_dec_get_format(

            if ( st_ivas->ini_frame > 0 && nchan_ism != st_ivas->nchan_ism )
            {
#ifdef DECODER_FORMAT_SWITCHING
                st_ivas->restartNeeded = 1;
                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!" );
#endif
            }

            st_ivas->nchan_ism = nchan_ism;
@@ -189,10 +199,15 @@ ivas_error ivas_dec_get_format(

            if ( st_ivas->ini_frame > 0 && sba_planar != st_ivas->sba_planar )
            {
#ifdef DECODER_FORMAT_SWITCHING
                st_ivas->restartNeeded = 1;
                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!" );
#endif
            }

            /* read Ambisonic (SBA) order */
@@ -201,10 +216,15 @@ ivas_error ivas_dec_get_format(

            if ( st_ivas->ini_frame > 0 && sba_order != st_ivas->sba_order )
            {
#ifdef DECODER_FORMAT_SWITCHING
                st_ivas->restartNeeded = 1;
                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!" );
#endif
            }

            sba_analysis_order = ivas_sba_get_analysis_order( ivas_total_brate, sba_order );
@@ -250,10 +270,15 @@ ivas_error ivas_dec_get_format(

            if ( st_ivas->ini_frame > 0 && nchan_ism != st_ivas->nchan_ism )
            {
#ifdef DECODER_FORMAT_SWITCHING
                st_ivas->restartNeeded = 1;
                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!" );
#endif
            }

            st_ivas->nchan_ism = nchan_ism;
@@ -268,10 +293,15 @@ ivas_error ivas_dec_get_format(

            if ( st_ivas->ini_frame > 0 && nchan_ism != st_ivas->nchan_ism )
            {
#ifdef DECODER_FORMAT_SWITCHING
                st_ivas->restartNeeded = 1;
                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!" );
#endif
            }

            st_ivas->nchan_ism = nchan_ism;
@@ -283,10 +313,15 @@ ivas_error ivas_dec_get_format(

            if ( st_ivas->ini_frame > 0 && nchan_ism != st_ivas->nchan_ism )
            {
#ifdef DECODER_FORMAT_SWITCHING
                st_ivas->restartNeeded = 1;
                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!" );
#endif
            }

            st_ivas->nchan_ism = nchan_ism;
@@ -310,10 +345,15 @@ ivas_error ivas_dec_get_format(

            if ( st_ivas->ini_frame > 0 && sba_order != st_ivas->sba_order )
            {
#ifdef DECODER_FORMAT_SWITCHING
                st_ivas->restartNeeded = 1;
                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!" );
#endif
            }

            st_ivas->ism_mode = ivas_osba_ism_mode_select( ivas_total_brate, st_ivas->nchan_ism );
@@ -338,10 +378,15 @@ ivas_error ivas_dec_get_format(

            if ( st_ivas->ini_frame > 0 && st_ivas->transport_config != signaled_config )
            {
#ifdef DECODER_FORMAT_SWITCHING
                st_ivas->restartNeeded = 1;
                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!" );
#endif
            }

            st_ivas->mc_mode = ivas_mc_mode_select( ivas_mc_map_output_config_to_mc_ls_setup( signaled_config ), st_ivas->hDecoderConfig->ivas_total_brate );
@@ -423,10 +468,15 @@ ivas_error ivas_dec_get_format(

            if ( st_ivas->ini_frame > 0 && nchan_ism != st_ivas->nchan_ism )
            {
#ifdef DECODER_FORMAT_SWITCHING
                st_ivas->restartNeeded = 1;
                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!" );
#endif
            }

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

} Decoder_Struct;

+37 −0
Original line number Diff line number Diff line
@@ -222,6 +222,10 @@ ivas_error IVAS_DEC_Open(
    /* initialize pointers to handles to NULL */
    ivas_initialize_handles_dec( st_ivas );

#ifdef DECODER_FORMAT_SWITCHING
    st_ivas->restartNeeded = 0;
#endif

    /* set high-level parameters */
    if ( mode == IVAS_DEC_MODE_EVS )
    {
@@ -1047,10 +1051,17 @@ ivas_error IVAS_DEC_ReadFormat(
            return error;
        }

#ifdef DECODER_FORMAT_SWITCHING
        if ( st_ivas->restartNeeded > 0 )
        {
            return IVAS_ERR_OK;
        }
#else
        if ( ivas_format_old != st_ivas->ivas_format && st_ivas->ini_frame > 0 && !( st_ivas->ivas_format == MASA_FORMAT || st_ivas->ivas_format == MASA_ISM_FORMAT ) )
        {
            return ( IVAS_ERROR( IVAS_ERR_INVALID_INPUT_FORMAT, "IVAS format switching is not allowed." ) );
        }
#endif

        /* Select binaural renderer */
        ivas_renderer_select( st_ivas );
@@ -2503,10 +2514,20 @@ ivas_error IVAS_DEC_GetFormat(
        *format = IVAS_DEC_BS_UNKOWN;
    }

#ifdef DECODER_FORMAT_SWITCHING
    if ( *format == IVAS_DEC_BS_MASA && hIvasDec->st_ivas->hMasa != NULL )
    {
        if ( hIvasDec->st_ivas->hMasa->config.input_ivas_format == MASA_ISM_FORMAT )
        {
            *format = IVAS_DEC_BS_MASA_ISM;
        }
    }
#else
    if ( *format == IVAS_DEC_BS_MASA && hIvasDec->st_ivas->hMasa->config.input_ivas_format == MASA_ISM_FORMAT )
    {
        *format = IVAS_DEC_BS_MASA_ISM;
    }
#endif

    return IVAS_ERR_OK;
}
@@ -4218,6 +4239,22 @@ ivas_error IVAS_DEC_Flush(
}


#ifdef DECODER_FORMAT_SWITCHING
/*---------------------------------------------------------------------*
 * IVAS_DEC_isRestartNeeded( )
 *
 *
 *---------------------------------------------------------------------*/

bool IVAS_DEC_isRestartNeeded(
    IVAS_DEC_HANDLE hIvasDec /* i/o: IVAS decoder handle                                                      */
)
{
    return hIvasDec->st_ivas->restartNeeded > 0;
}


#endif
/*---------------------------------------------------------------------*
 * IVAS_DEC_VoIP_IsEmpty( )
 *
Loading