diff --git a/apps/decoder.c b/apps/decoder.c index 1414eeb6255dc44d37687134248310f6909b658d..f019fc339dd6cbc61b167e9ff014e059b0dbeda4 100644 --- a/apps/decoder.c +++ b/apps/decoder.c @@ -164,10 +164,16 @@ static ivas_error decodeG192( DecArguments arg, BS_READER_HANDLE hBsReader, IVAS #else 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 ); #endif +#ifdef FIX_FMSW_DEC +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_RENDER_CONFIG_DATA *renderConfig, IVAS_DEC_HANDLE *phIvasDec, int16_t *pcmBuf ); +#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 ); +#ifndef FIX_FMSW_DEC static ivas_error restartDecoder( IVAS_DEC_HANDLE *phIvasDec, const IVAS_DEC_MODE decMode, DecArguments *arg, IVAS_RENDER_CONFIG_DATA *renderConfig, IVAS_CUSTOM_LS_DATA *hLsCustomData ); +#endif /*------------------------------------------------------------------------------------------* @@ -668,7 +674,11 @@ int main( if ( arg.voipMode ) { +#ifdef FIX_FMSW_DEC + 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, &renderConfig, &hIvasDec, pcmBuf ); +#endif } else { @@ -2319,6 +2329,13 @@ static ivas_error decodeG192( if ( restartNeeded ) { +#ifdef FIX_FMSW_DEC + if ( ( error = IVAS_DEC_Restart( hIvasDec, IVAS_DEC_MODE_IVAS ) ) != IVAS_ERR_OK ) /* note: only switching within IVAS formats is supported in G.192 */ + { + fprintf( stderr, "\nIVAS_DEC_Restart restart failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } +#else IVAS_DEC_BS_FORMAT tempFormat; if ( ( error = IVAS_DEC_GetFormat( hIvasDec, &tempFormat ) ) != IVAS_ERR_OK ) { @@ -2339,6 +2356,7 @@ static ivas_error decodeG192( goto cleanup; } *phIvasDec = hIvasDec; /* Update for main()' s free */ +#endif } #endif @@ -2818,7 +2836,9 @@ static ivas_error decodeVoIP( Vector3PairFileReader *referenceVectorReader, ObjectEditFileReader *objectEditFileReader, ISAR_SPLIT_REND_BITS_DATA *splitRendBits, +#ifndef FIX_FMSW_DEC IVAS_RENDER_CONFIG_DATA *renderConfig, +#endif IVAS_DEC_HANDLE *phIvasDec, int16_t *pcmBuf ) { @@ -2974,6 +2994,15 @@ static ivas_error decodeVoIP( /* EVS RTP payload format has timescale 16000, JBM uses 1000 internally */ rtpTimeStamp = rtpTimeStamp / 16; + +#ifdef FIX_FMSW_DEC_2 + arg.decMode = ( ivasRtp.codecId == IVAS_RTP_EVS ) ? IVAS_DEC_MODE_EVS : IVAS_DEC_MODE_IVAS; + if ( ( error = IVAS_DEC_Restart( hIvasDec, arg.decMode ) ) != IVAS_ERR_OK ) /* note: when the RTP bitstream starts with EVS, do the restart */ + { + fprintf( stderr, "\nIVAS_DEC_Restart restart failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } +#endif } if ( error != IVAS_ERR_OK ) { @@ -3007,6 +3036,14 @@ static ivas_error decodeVoIP( /* restart decoder in case of format switching */ if ( ivasRtp.restartNeeded ) { +#ifdef FIX_FMSW_DEC + arg.decMode = ( ivasRtp.codecId == IVAS_RTP_EVS ) ? IVAS_DEC_MODE_EVS : IVAS_DEC_MODE_IVAS; + if ( ( error = IVAS_DEC_Restart( hIvasDec, arg.decMode ) ) != IVAS_ERR_OK ) /* note: switching between EVS and IVAS is supported in RTP */ + { + fprintf( stderr, "\nIVAS_DEC_Restart restart failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } +#else IVAS_DEC_MODE newDecModeInPacket = ( ivasRtp.codecId == IVAS_RTP_EVS ) ? IVAS_DEC_MODE_EVS : IVAS_DEC_MODE_IVAS; if ( ( error = restartDecoder( &hIvasDec, @@ -3021,6 +3058,7 @@ static ivas_error decodeVoIP( } *phIvasDec = hIvasDec; /* Update for main()' s free */ +#endif ivasRtp.restartNeeded = false; bitstreamReadDone = false; parametersAvailableForEditing = false; @@ -3252,6 +3290,13 @@ static ivas_error decodeVoIP( if ( restartNeeded ) { +#ifdef FIX_FMSW_DEC + if ( ( error = IVAS_DEC_Restart( hIvasDec, IVAS_DEC_MODE_IVAS ) ) != IVAS_ERR_OK ) /* note: only switching within IVAS formats is supported in non-RTP VoIP */ + { + fprintf( stderr, "\nIVAS_DEC_Restart restart failed: %s\n", IVAS_DEC_GetErrorMessage( error ) ); + goto cleanup; + } +#else IVAS_DEC_BS_FORMAT tempBsFormat; if ( ( error = IVAS_DEC_GetFormat( hIvasDec, &tempBsFormat ) ) != IVAS_ERR_OK ) { @@ -3273,6 +3318,7 @@ static ivas_error decodeVoIP( } *phIvasDec = hIvasDec; /* Update for main()' s free */ +#endif bitstreamReadDone = false; parametersAvailableForEditing = false; } @@ -3965,7 +4011,7 @@ static ivas_error load_hrtf_from_file( return IVAS_ERR_OK; } - +#ifndef FIX_FMSW_DEC /*---------------------------------------------------------------------* * restartDecoder() * @@ -4070,5 +4116,5 @@ cleanup: return error; } - +#endif #undef WMC_TOOL_SKIP diff --git a/apps/encoder.c b/apps/encoder.c index 6c09d308f34c898f1ca2105529f62c8f303aae87..f58a9dfb89b165d573db3b8a6ae58033bf1032ce 100644 --- a/apps/encoder.c +++ b/apps/encoder.c @@ -254,6 +254,7 @@ int main( fprintf( stderr, "Opening IVAS encoder failed: %s\n", IVAS_ENC_GetErrorMessage( error ) ); goto cleanup; } + /*------------------------------------------------------------------------------------------* * Open output bitstream file *------------------------------------------------------------------------------------------*/ @@ -364,6 +365,28 @@ int main( } } +#ifdef FIX_FMSW_DEC + /*------------------------------------------------------------------------------------------* + * Open remote requests file for rtp packing (E-bytes) + *------------------------------------------------------------------------------------------*/ + + if ( arg.requestsFileName != NULL ) + { + if ( !arg.rtpdumpOutput ) + { + fprintf( stderr, "\nError: RTP requests file can be used with rtpdump output only.\n\n" ); + usage_enc(); + goto cleanup; + } + + if ( ( error = RequestsFileReader_open( arg.requestsFileName, &requestsFileReader ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "\nError: Can't open requests file %s \n\n", arg.requestsFileName ); + goto cleanup; + } + } +#endif + /*------------------------------------------------------------------------------------------* * Handle Channel-aware mode *------------------------------------------------------------------------------------------*/ @@ -661,6 +684,7 @@ int main( } } +#ifndef FIX_FMSW_DEC /*------------------------------------------------------------------------------------------* * Open remote requests file for rtp packing (E-bytes) *------------------------------------------------------------------------------------------*/ @@ -672,7 +696,7 @@ int main( goto cleanup; } } - +#endif /*------------------------------------------------------------------------------------------* * Run the encoder *------------------------------------------------------------------------------------------*/ @@ -2133,9 +2157,9 @@ static void usage_enc( void ) fprintf( stdout, " bitstream frames into TS26.253 Annex A IVAS RTP Payload Format packets and \n" ); fprintf( stdout, " writes those to the output file. In EVS mono operating mode, TS26.445 Annex A.2.2 \n" ); fprintf( stdout, " EVS RTP Payload Format is used. Optional N represents number of frames per RTP packet\n" ); + fprintf( stdout, "-requests : Remote requests file, Only used with rtpdump output.\n" ); fprintf( stdout, "-scene_orientation : Scene orientation trajectory file. Only used with rtpdump output.\n" ); fprintf( stdout, "-device_orientation : Device orientation trajectory file. Only used with rtpdump output.\n" ); - fprintf( stdout, "-requests : Remote requests file, Only used with rtpdump output.\n" ); fprintf( stdout, "\n" ); diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index 36bdc823d4ad21ad4d670044cbf0517d347d782f..bd52ea307a7a0e2f9671c5b4aeb19008e367ec10 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -2075,7 +2075,11 @@ void destroy_core_dec_fx( ); void ivas_destroy_dec_fx( +#ifdef FIX_FMSW_DEC + Decoder_Struct **st_ivas /* i/o: IVAS decoder structure */ +#else Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ +#endif ); ivas_error ivas_ism_dec_config_fx( @@ -3730,10 +3734,11 @@ Word16 getNumChanSynthesis( Decoder_Struct *st_ivas /* i : IVAS decoder structure */ ); +#ifndef FIX_FMSW_DEC void ivas_destroy_dec_fx( Decoder_Struct *st_ivas /* i/o: IVAS decoder structure */ ); - +#endif ivas_error ivas_core_dec_fx( Decoder_Struct *st_ivas, /* i/o: IVAS decoder structure */ SCE_DEC_HANDLE hSCE, /* i/o: SCE decoder structure */ diff --git a/lib_com/options.h b/lib_com/options.h index 505294eadbbfe6e12307d328c7b106e069ea7d14..52de155d3597204da31db740d8045d4c13e03bbc 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -137,6 +137,8 @@ #define FIX_2547_ALIGN_CONDITIONS_IN_CORE_SW_DEC /* VA : Basop issue 2547: Align conditions in core sw dec */ #define FIX_2547_ALIGN_CONDITIONS_IN_CORE_SW_DEC_EVS /* VA : Basop issue 2547: Align conditions in core sw dec, condition that could affect EVS as well, but adapted to keep EVS BE */ #define FIX_BASOP_2548_ProcessIGF_fx_PREDICTIONGAIN /* FhG: fixes obvious bug for IVAS path. For EVS path, issue is still not resolved */ +#define FIX_FMSW_DEC /* float issue 1542: fix JBM issue in format switching */ +#define FIX_FMSW_DEC_2 /* float issue 1575: fix crash for format switching when bitsream starts with EVS */ /* ##################### End NON-BE switches ########################### */ diff --git a/lib_dec/ivas_init_dec_fx.c b/lib_dec/ivas_init_dec_fx.c index fc1133f7435894f311ac74c8b180c5edc7cc8550..355051ccbc492dc1cf434333faa69253367e23ac 100644 --- a/lib_dec/ivas_init_dec_fx.c +++ b/lib_dec/ivas_init_dec_fx.c @@ -1572,7 +1572,12 @@ ivas_error ivas_init_decoder_front( * Allocate and initialize Custom loudspeaker layout handle *--------------------------------------------------------------------*/ +#ifdef FIX_FMSW_DEC + test(); + IF( st_ivas->hDecoderConfig->Opt_LsCustom && st_ivas->hLsSetupCustom == NULL ) +#else IF( st_ivas->hDecoderConfig->Opt_LsCustom ) +#endif { IF( EQ_32( ( error = ivas_ls_custom_open_fx( &( st_ivas->hLsSetupCustom ) ) ), IVAS_ERR_OK ) ) { @@ -1589,7 +1594,12 @@ ivas_error ivas_init_decoder_front( * Allocate and initialize Head-Tracking handle *--------------------------------------------------------------------*/ +#ifdef FIX_FMSW_DEC + test(); + IF( st_ivas->hDecoderConfig->Opt_Headrotation && st_ivas->hHeadTrackData == NULL ) +#else IF( st_ivas->hDecoderConfig->Opt_Headrotation ) +#endif { IF( NE_32( ( error = ivas_headTrack_open_fx( &( st_ivas->hHeadTrackData ) ) ), IVAS_ERR_OK ) ) { @@ -1606,7 +1616,12 @@ ivas_error ivas_init_decoder_front( * Allocate and initialize external orientation handle *--------------------------------------------------------------------*/ +#ifdef FIX_FMSW_DEC + test(); + IF( st_ivas->hDecoderConfig->Opt_ExternalOrientation && st_ivas->hExtOrientationData == NULL ) +#else IF( st_ivas->hDecoderConfig->Opt_ExternalOrientation ) +#endif { IF( NE_32( ( error = ivas_external_orientation_open_fx( &( st_ivas->hExtOrientationData ), st_ivas->hDecoderConfig->render_num_subframes ) ), IVAS_ERR_OK ) ) { @@ -1619,7 +1634,12 @@ ivas_error ivas_init_decoder_front( *--------------------------------------------------------------------*/ test(); +#ifdef FIX_FMSW_DEC + test(); + IF( ( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) && st_ivas->hCombinedOrientationData == NULL ) +#else IF( st_ivas->hDecoderConfig->Opt_Headrotation || st_ivas->hDecoderConfig->Opt_ExternalOrientation ) +#endif { IF( NE_32( ( error = ivas_combined_orientation_open_fx( &( st_ivas->hCombinedOrientationData ), st_ivas->hDecoderConfig->output_Fs, st_ivas->hDecoderConfig->render_num_subframes ) ), IVAS_ERR_OK ) ) { @@ -1637,8 +1657,15 @@ ivas_error ivas_init_decoder_front( test(); test(); test(); +#ifdef FIX_FMSW_DEC + test(); + IF( ( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) || + ( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) && st_ivas->hDecoderConfig->Opt_non_diegetic_pan ) ) && + st_ivas->hRenderConfig == NULL ) +#else IF( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_REVERB ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_PCM ) || ( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) && st_ivas->hDecoderConfig->Opt_non_diegetic_pan ) ) +#endif { IF( NE_32( ( error = ivas_render_config_open_fx( &( st_ivas->hRenderConfig ) ) ), IVAS_ERR_OK ) ) { @@ -3348,7 +3375,14 @@ void ivas_initialize_handles_dec( st_ivas->hCPE[i] = NULL; } - st_ivas->bit_stream = NULL; +#ifdef FIX_FMSW_DEC + IF( !st_ivas->restartNeeded ) + { +#endif + st_ivas->bit_stream = NULL; +#ifdef FIX_FMSW_DEC + } +#endif st_ivas->mem_hp20_out_fx = NULL; st_ivas->hLimiter = NULL; @@ -3393,15 +3427,22 @@ void ivas_initialize_handles_dec( st_ivas->hMasaIsmData = NULL; st_ivas->hSbaIsmData = NULL; - st_ivas->hHeadTrackData = NULL; - st_ivas->hHrtfTD = NULL; - st_ivas->hLsSetupCustom = NULL; - st_ivas->hRenderConfig = NULL; - st_ivas->hExtOrientationData = NULL; - st_ivas->hCombinedOrientationData = NULL; - st_ivas->acousticEnvironmentsCount = 0; - move16(); - st_ivas->pAcousticEnvironments = NULL; +#ifdef FIX_FMSW_DEC + IF( !st_ivas->restartNeeded ) + { +#endif + st_ivas->hHeadTrackData = NULL; + st_ivas->hHrtfTD = NULL; + st_ivas->hLsSetupCustom = NULL; + st_ivas->hRenderConfig = NULL; + st_ivas->hExtOrientationData = NULL; + st_ivas->hCombinedOrientationData = NULL; + st_ivas->acousticEnvironmentsCount = 0; + move16(); + st_ivas->pAcousticEnvironments = NULL; +#ifdef FIX_FMSW_DEC + } +#endif st_ivas->hSplitBinRend = NULL; FOR( i = 0; i < MAX_HEAD_ROT_POSES - 1; ++i ) @@ -3429,10 +3470,17 @@ void ivas_initialize_handles_dec( *-------------------------------------------------------------------------*/ void ivas_destroy_dec_fx( +#ifdef FIX_FMSW_DEC + Decoder_Struct **st_ivas_out /* i/o: IVAS decoder handle */ +#else Decoder_Struct *st_ivas /* i/o: IVAS decoder handle */ +#endif ) { Word16 i; +#ifdef FIX_FMSW_DEC + Decoder_Struct *st_ivas = *st_ivas_out; +#endif /* CLDFB handles */ FOR( i = 0; i < MAX_INTERN_CHANNELS; i++ ) @@ -3564,11 +3612,18 @@ void ivas_destroy_dec_fx( ivas_ls_setup_conversion_close_fx( &st_ivas->hLsSetUpConversion ); /* Custom LS configuration handle */ - IF( st_ivas->hLsSetupCustom != NULL ) +#ifdef FIX_FMSW_DEC + IF( !st_ivas->restartNeeded ) { - free( st_ivas->hLsSetupCustom ); - st_ivas->hLsSetupCustom = NULL; +#endif + IF( st_ivas->hLsSetupCustom != NULL ) + { + free( st_ivas->hLsSetupCustom ); + st_ivas->hLsSetupCustom = NULL; + } +#ifdef FIX_FMSW_DEC } +#endif /* Mono downmix structure */ ivas_mono_dmx_renderer_close( &st_ivas->hMonoDmxRenderer ); @@ -3604,25 +3659,48 @@ void ivas_destroy_dec_fx( /* HRTF statistics */ ivas_HRTF_statistics_binary_close_fx( &st_ivas->hHrtfStatistics ); - /* Config. Renderer */ - ivas_render_config_close_fx( &( st_ivas->hRenderConfig ) ); +#ifdef FIX_FMSW_DEC + /* Limiter struct */ + ivas_limiter_close_fx( &( st_ivas->hLimiter ) ); - /* Acoustic environments */ - IF( st_ivas->pAcousticEnvironments != NULL ) + IF( !st_ivas->restartNeeded ) { - free( st_ivas->pAcousticEnvironments ); - st_ivas->pAcousticEnvironments = NULL; - } +#endif + /* Config. Renderer */ + ivas_render_config_close_fx( &( st_ivas->hRenderConfig ) ); - /* Limiter struct */ - ivas_limiter_close_fx( &( st_ivas->hLimiter ) ); + /* Acoustic environments */ + IF( st_ivas->pAcousticEnvironments != NULL ) + { + free( st_ivas->pAcousticEnvironments ); + st_ivas->pAcousticEnvironments = NULL; + } - /* Decoder configuration structure */ - IF( st_ivas->hDecoderConfig != NULL ) +#ifndef FIX_FMSW_DEC + /* Limiter struct */ + ivas_limiter_close_fx( &( st_ivas->hLimiter ) ); +#endif + /* Decoder configuration structure */ + IF( st_ivas->hDecoderConfig != NULL ) + { + free( st_ivas->hDecoderConfig ); + st_ivas->hDecoderConfig = NULL; + } +#ifdef FIX_FMSW_DEC + } + ELSE { - free( st_ivas->hDecoderConfig ); - st_ivas->hDecoderConfig = NULL; + /* resets in case of format switching */ + st_ivas->nchan_ism = 0; + st_ivas->ism_mode = ISM_MODE_NONE; + st_ivas->mc_mode = MC_MODE_NONE; + st_ivas->sba_dirac_stereo_flag = 0; + move16(); + move16(); + move16(); + move16(); } +#endif /* TC buffer structure */ ivas_dec_tc_buffer_close_fx( &st_ivas->hTcBuffer ); @@ -3640,7 +3718,15 @@ void ivas_destroy_dec_fx( } /* main IVAS handle */ +#ifdef FIX_FMSW_DEC + if ( !st_ivas->restartNeeded ) + { + free( *st_ivas_out ); + *st_ivas_out = NULL; + } +#else free( st_ivas ); +#endif return; } diff --git a/lib_dec/lib_dec.h b/lib_dec/lib_dec.h index c42dd0a093274c587f87fa3422d723fa356379b0..89d2e967cb588867807e5507d94144950f9cef59 100644 --- a/lib_dec/lib_dec.h +++ b/lib_dec/lib_dec.h @@ -128,6 +128,13 @@ ivas_error IVAS_DEC_Configure( const bool delayCompensationEnabled /* i : enable delay compensation */ ); +#ifdef FIX_FMSW_DEC +ivas_error IVAS_DEC_Restart( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const IVAS_DEC_MODE mode /* i : compatibility mode (EVS or IVAS) */ +); + +#endif void IVAS_DEC_Close( IVAS_DEC_HANDLE *phIvasDec /* i/o: pointer to IVAS decoder handle */ ); diff --git a/lib_dec/lib_dec_fx.c b/lib_dec/lib_dec_fx.c index 07a53676bdba954925946268c0c7d164afd1df1c..c5b9a765ed1ab6c23c2e814c0cb48a9f1caf9b50 100644 --- a/lib_dec/lib_dec_fx.c +++ b/lib_dec/lib_dec_fx.c @@ -129,6 +129,96 @@ static Word16 ivas_dec_split_rend_cldfb_in( const RENDERER_TYPE renderer_type ); static void update_voip_rendered20ms( IVAS_DEC_HANDLE hIvasDec, const Word16 nSamplesRendered ); +#ifdef FIX_FMSW_DEC + +/*---------------------------------------------------------------------* + * ivas_dec_handle_init() + * + * Set IVAS decoder handles to NULL + set high-level parameters + *---------------------------------------------------------------------*/ + +static ivas_error ivas_dec_handle_init( + Decoder_Struct *st_ivas, /* i/o: IVAS decoder handle */ + const IVAS_DEC_MODE mode, /* i : compatibility mode (EVS or IVAS) */ + bool *hasDecodedFirstGoodFrame /* o : flag indicating if the decoder has decoded a good frame since it was configured */ +) +{ + IF( st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + /* initialize pointers to handles to NULL */ + ivas_initialize_handles_dec( st_ivas ); + + st_ivas->restartNeeded = 0; + move16(); + + /* set high-level parameters */ + + st_ivas->codec_mode = 0; /* unknown before first frame */ + st_ivas->transport_config = IVAS_AUDIO_CONFIG_INVALID; + st_ivas->intern_config = IVAS_AUDIO_CONFIG_INVALID; + st_ivas->writeFECoffset = 0; + st_ivas->sba_analysis_order = 0; /* not really used in EVS mode, but initialize here to fix MSAN complaint */ + move16(); + move16(); + move16(); + move16(); + move16(); + +#ifdef FIX_FMSW_DEC_2 + st_ivas->last_ivas_format = UNDEFINED_FORMAT; + st_ivas->nSCE = 0; + st_ivas->nCPE = 0; + move16(); + move16(); + move16(); + +#endif + IF( EQ_16( mode, IVAS_DEC_MODE_EVS ) ) + { + st_ivas->element_mode_init = EVS_MONO; + st_ivas->ivas_format = MONO_FORMAT; + *hasDecodedFirstGoodFrame = true; /* Functionality to suppress output for initial lost frames is disabled in EVS operation */ + move16(); + move16(); + move16(); + + return IVAS_ERR_OK; + } + ELSE IF( EQ_16( mode, IVAS_DEC_MODE_IVAS ) ) + { + st_ivas->element_mode_init = -1; + st_ivas->ivas_format = UNDEFINED_FORMAT; + st_ivas->renderer_type = RENDERER_DISABLE; + st_ivas->ini_frame = 0; + st_ivas->ini_active_frame = 0; + + st_ivas->ism_mode = ISM_MODE_NONE; + st_ivas->mc_mode = MC_MODE_NONE; + + st_ivas->sba_order = 0; + st_ivas->sba_planar = 0; + + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + + return IVAS_ERR_OK; + } + + return IVAS_ERR_WRONG_PARAMS; +} + +#endif + /*---------------------------------------------------------------------* * IVAS_DEC_Open() * @@ -149,6 +239,13 @@ ivas_error IVAS_DEC_Open( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } +#ifdef FIX_FMSW_DEC + if ( *phIvasDec != NULL ) + { + return IVAS_ERR_WRONG_PARAMS; + } + +#endif /*-----------------------------------------------------------------* * Allocate and initialize IVAS application decoder handle *-----------------------------------------------------------------*/ @@ -229,9 +326,18 @@ ivas_error IVAS_DEC_Open( st_ivas = hIvasDec->st_ivas; +#ifdef FIX_FMSW_DEC + st_ivas->restartNeeded = 0; + move16(); +#endif + /* initialize Decoder Config. handle */ init_decoder_config( hIvasDec->st_ivas->hDecoderConfig ); +#ifdef FIX_FMSW_DEC + /* Set IVAS decoder handles to NULL + set high-level parameters */ + return ivas_dec_handle_init( st_ivas, mode, &( hIvasDec->hasDecodedFirstGoodFrame ) ); +#else /* initialize pointers to handles to NULL */ ivas_initialize_handles_dec( st_ivas ); @@ -289,8 +395,78 @@ ivas_error IVAS_DEC_Open( } return IVAS_ERR_WRONG_PARAMS; +#endif +} + +#ifdef FIX_FMSW_DEC + +/*---------------------------------------------------------------------* + * IVAS_DEC_Restart() + * + * Restart IVAS decoder - used in case of format switching + *---------------------------------------------------------------------*/ + +ivas_error IVAS_DEC_Restart( + IVAS_DEC_HANDLE hIvasDec, /* i/o: IVAS decoder handle */ + const IVAS_DEC_MODE mode /* i : compatibility mode (EVS or IVAS) */ +) +{ + test(); + IF( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) + { + return IVAS_ERR_UNEXPECTED_NULL_POINTER; + } + + IF( !hIvasDec->st_ivas->restartNeeded ) + { + IF( EQ_16( hIvasDec->mode, mode ) ) + { + return IVAS_ERR_OK; + } +#ifdef FIX_FMSW_DEC_2 + ELSE + { + /* switching between EVS and IVAS signaled in RTP */ + hIvasDec->st_ivas->restartNeeded = 1; + move16(); + } +#else + return IVAS_ERR_WRONG_PARAMS; +#endif + } + +#ifdef FIX_FMSW_DEC_2 + IF( NE_16( hIvasDec->mode, mode ) ) /* handle switching between EVS and IVAS */ + { + /* initialize JBM */ + IF( JB4_Init( hIvasDec->hVoIP->hJBM, 60 ) != 0 ) + { + return IVAS_ERR_FAILED_ALLOC; + } + + hIvasDec->hasBeenFedFirstGoodFrame = false; + hIvasDec->hasDecodedFirstGoodFrame = false; + hIvasDec->isInitialized = false; + move16(); + move16(); + move16(); + } + +#endif + hIvasDec->mode = mode; + move16(); + + /* destroy Split binaural renderer (ISAR) handle */ + ivas_destroy_handle_isar( &hIvasDec->st_ivas->hSplitBinRend ); + + /* destroy IVAS decoder handles */ + ivas_destroy_dec_fx( &hIvasDec->st_ivas ); + + /* Set IVAS decoder handles to NULL + set high-level parameters */ + return ivas_dec_handle_init( hIvasDec->st_ivas, mode, &( hIvasDec->hasDecodedFirstGoodFrame ) ); } +#endif /*-------------------------------------------------------------------------* * isar_set_split_rend_setup() @@ -412,8 +588,12 @@ void IVAS_DEC_Close( ivas_destroy_handle_isar( &( *phIvasDec )->st_ivas->hSplitBinRend ); /* destroy IVAS decoder handles */ +#ifdef FIX_FMSW_DEC + ivas_destroy_dec_fx( &( *phIvasDec )->st_ivas ); +#else ivas_destroy_dec_fx( ( *phIvasDec )->st_ivas ); ( *phIvasDec )->st_ivas = NULL; +#endif } apa_exit( &( *phIvasDec )->hTimeScaler ); @@ -4703,7 +4883,7 @@ static ivas_error ivas_dec_voip_get_samples_common IF( hIvasDec->hasBeenFedFirstGoodFrame ) { - /* check if the TC buffer already exists, otherweise nothing is buffered anyway */ + /* check if the TC buffer already exists, otherwise nothing is buffered anyway */ IF( st_ivas->hTcBuffer != NULL ) { nSamplesBuffered = sub( st_ivas->hTcBuffer->n_samples_buffered, st_ivas->hTcBuffer->n_samples_rendered ); @@ -5650,6 +5830,10 @@ static ivas_error evs_dec_main_fx( st_ivas->BER_detect = hCoreCoder[0]->BER_detect; move16(); +#ifdef FIX_FMSW_DEC + st_ivas->last_ivas_format = MONO_FORMAT; + move16(); +#endif /*if ( st_ivas->hDecoderConfig->Opt_tsm && st_ivas->hDecoderConfig->output_config == IVAS_AUDIO_CONFIG_MONO )*/ { diff --git a/lib_util/ivas_rtp_api.h b/lib_util/ivas_rtp_api.h index db889f5625f63c73a9bbe7cd6d68db5cc84c1db9..7a25e4123a7daccb5d2849d1bda6c20bf72ecf17 100644 --- a/lib_util/ivas_rtp_api.h +++ b/lib_util/ivas_rtp_api.h @@ -82,6 +82,9 @@ /* IVAS Codec Types */ typedef enum { +#ifdef FIX_FMSW_DEC + IVAS_RTP_UNDEF = -1, /* undefined = Codec Type not set yet */ +#endif IVAS_RTP_EVS, /* EVS */ IVAS_RTP_IVAS /* IVAS */ } IVAS_RTP_CODEC; diff --git a/lib_util/ivas_rtp_file.c b/lib_util/ivas_rtp_file.c index 4aba3a0c03cc8459b9cbbc7160e92980dc78945f..7e741826b72ddca444121229393c5b90f22edf99 100644 --- a/lib_util/ivas_rtp_file.c +++ b/lib_util/ivas_rtp_file.c @@ -1000,6 +1000,9 @@ ivas_error IVAS_RTP_READER_Init( rtp->unpackCfg.maxFramesPerPacket = IVAS_MAX_FRAMES_PER_RTP_PACKET; rtp->rtpPacket.buffer = rtp->packet; rtp->rtpPacket.capacity = sizeof( rtp->packet ); +#ifdef FIX_FMSW_DEC + rtp->codecId = IVAS_RTP_UNDEF; +#endif error = IVAS_RTP_UNPACK_Open( &rtp->hUnpack, &rtp->unpackCfg ); if ( error == IVAS_ERR_OK ) @@ -1187,6 +1190,17 @@ ivas_error IVAS_RTP_ReadNextFrame( } else { +#ifdef FIX_FMSW_DEC + if ( rtp->codecId != IVAS_RTP_UNDEF && rtp->codecId != codecId ) + { + rtp->restartNeeded = true; + + fprintf( stdout, "\nRTP packet codec changed %s -> %s\n", + ( rtp->codecId == IVAS_RTP_EVS ) ? "EVS" : "IVAS", + ( codecId == IVAS_RTP_EVS ) ? "EVS" : "IVAS" ); + } +#else + rtp->restartNeeded = ( rtp->codecId != codecId ) || ( codecId == IVAS_RTP_EVS && ( rtp->isAMRWB_IOmode != isAMRWB_IOmode ) ); @@ -1196,6 +1210,7 @@ ivas_error IVAS_RTP_ReadNextFrame( ( rtp->codecId == IVAS_RTP_EVS ) ? ( rtp->isAMRWB_IOmode ? "AMRWB_IO" : "EVS" ) : "IVAS", ( codecId == IVAS_RTP_EVS ) ? ( isAMRWB_IOmode ? "AMRWB_IO" : "EVS" ) : "IVAS" ); } +#endif rtp->codecId = codecId; rtp->isAMRWB_IOmode = isAMRWB_IOmode; diff --git a/readme.txt b/readme.txt index 1db279fc514619aba5a4329975b173c138b3b537..1b2d73fd6991e8981fec7a188303ad46890843fd 100644 --- a/readme.txt +++ b/readme.txt @@ -263,6 +263,7 @@ EVS mono is default, for IVAS choose one of the following: -stereo, -ism, -sba, bitstream frames into TS26.253 Annex A IVAS RTP Payload Format packets and writes those to the output file. In EVS mono operating mode, TS26.445 Annex A.2.2 EVS RTP Payload Format is used. Optional N represents number of frames per RTP packet +-requests : Remote requests file, Only used with rtpdump output. -scene_orientation : Scene orientation trajectory file. Only used with rtpdump output. -device_orientation : Device orientation trajectory file. Only used with rtpdump output.