From 4bc35e93e3ae7f3a813ad8186e811594f60bad71 Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 17 Mar 2025 14:34:01 +0100 Subject: [PATCH 1/6] issue 1293: fix G.192 decoder crash when first frame is lost; under NONBE_1293_CRASH_FIRST_FRAME_LOST --- lib_com/options.h | 3 ++- lib_dec/lib_dec.c | 35 ++++++++++++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 6dea2ea9d7..e64caebb85 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -175,8 +175,9 @@ #define NONBE_1244_FIX_SWB_BWE_MEMORY /* VA: issue 1244: fix to SWB BWE memory in case of switching from FB coding - pending a review by Huawei */ #define NONBE_FIX_1180_HQMDCT_PHECU_LT_MUTING /* Ericsson: issue 1180, corrected long term mute loop attnuation after 200ms in PhECU-PLC */ #define NONBE_FIX_1277_EVS_DTX_HIGH_RATE_THRESHOLD /* VA/Eri: issue 1277: Fix Mismatch in DTX high-rate threshold between EVS float and BASOP */ - #define NONBE_1231_BASOP_819_THRESHOLD_MASA2TOTAL /* Nokia: add fix for precision limitation in comparison with masa2total energy ratio threshold to be aligned with BASOP*/ +#define NONBE_1293_CRASH_FIRST_FRAME_LOST /* VA: issue 1293: fix G.192 decoder crash when first frame is lost */ + /* ##################### End NON-BE switches ########################### */ /* ################## End DEVELOPMENT switches ######################### */ diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 7640228d3b..5aaf6245bb 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1081,6 +1081,13 @@ ivas_error IVAS_DEC_GetSamplesDecoder( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } +#ifdef NONBE_1293_CRASH_FIRST_FRAME_LOST + if ( !hIvasDec->hasBeenFedFirstGoodFrame ) + { + return IVAS_ERR_OK; + } +#endif + /* If TSM is generally enabled, we have to wait for the first good frame. Otherwise, we directly decode the first frame in any case. */ if ( !hIvasDec->isInitialized || hIvasDec->hasBeenFedFrame ) @@ -1221,6 +1228,13 @@ ivas_error IVAS_DEC_GetEditableParameters( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } +#ifdef NONBE_1293_CRASH_FIRST_FRAME_LOST + if ( !hIvasDec->hasBeenFedFirstGoodFrame ) + { + return IVAS_ERR_OK; + } +#endif + st_ivas = hIvasDec->st_ivas; ism_mode = st_ivas->ism_mode; @@ -1360,6 +1374,13 @@ ivas_error IVAS_DEC_SetEditableParameters( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } +#ifdef NONBE_1293_CRASH_FIRST_FRAME_LOST + if ( !hIvasDec->hasBeenFedFirstGoodFrame ) + { + return IVAS_ERR_OK; + } +#endif + st_ivas = hIvasDec->st_ivas; ism_mode = st_ivas->ism_mode; @@ -1593,7 +1614,12 @@ ivas_error IVAS_DEC_PrepareRenderer( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } - ivas_dec_prepare_renderer( hIvasDec->st_ivas ); +#ifdef NONBE_1293_CRASH_FIRST_FRAME_LOST + if ( hIvasDec->hasBeenFedFirstGoodFrame ) +#endif + { + ivas_dec_prepare_renderer( hIvasDec->st_ivas ); + } hIvasDec->hasBeenPreparedRendering = true; @@ -1777,6 +1803,13 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } +#ifdef NONBE_1293_CRASH_FIRST_FRAME_LOST + if ( !hIvasDec->hasBeenFedFirstGoodFrame ) + { + return IVAS_ERR_OK; + } +#endif + error = IVAS_ERR_OK; st_ivas = hIvasDec->st_ivas; output_config = st_ivas->hDecoderConfig->output_config; -- GitLab From 1943032ee0e3c91f9d2cc608e498a0222acb0cc4 Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 17 Mar 2025 15:50:38 +0100 Subject: [PATCH 2/6] fix EVS decoder --- lib_dec/lib_dec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 5aaf6245bb..7b9daa3096 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1082,7 +1082,7 @@ ivas_error IVAS_DEC_GetSamplesDecoder( } #ifdef NONBE_1293_CRASH_FIRST_FRAME_LOST - if ( !hIvasDec->hasBeenFedFirstGoodFrame ) + if ( !hIvasDec->hasBeenFedFirstGoodFrame && !hIvasDec->isInitialized ) { return IVAS_ERR_OK; } -- GitLab From f556cacd168b1cadad995cc7286cf63d3d672b6d Mon Sep 17 00:00:00 2001 From: vaclav Date: Mon, 17 Mar 2025 19:45:31 +0100 Subject: [PATCH 3/6] fix EVS decoder when two first frames are lost --- lib_dec/lib_dec.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 7b9daa3096..305ec140ed 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1082,7 +1082,7 @@ ivas_error IVAS_DEC_GetSamplesDecoder( } #ifdef NONBE_1293_CRASH_FIRST_FRAME_LOST - if ( !hIvasDec->hasBeenFedFirstGoodFrame && !hIvasDec->isInitialized ) + if ( !hIvasDec->hasBeenFedFirstGoodFrame && !hIvasDec->isInitialized ) /* note: 'isInitialized' is related to EVS decoder */ { return IVAS_ERR_OK; } @@ -1615,7 +1615,7 @@ ivas_error IVAS_DEC_PrepareRenderer( } #ifdef NONBE_1293_CRASH_FIRST_FRAME_LOST - if ( hIvasDec->hasBeenFedFirstGoodFrame ) + if ( hIvasDec->hasBeenFedFirstGoodFrame || hIvasDec->isInitialized ) /* note: 'isInitialized' is related to EVS decoder */ #endif { ivas_dec_prepare_renderer( hIvasDec->st_ivas ); -- GitLab From 36f80fc538aed2972c74e02c7a455788cba16ffb Mon Sep 17 00:00:00 2001 From: vaclav Date: Tue, 18 Mar 2025 09:06:09 +0100 Subject: [PATCH 4/6] remove wrongly merged compilation flag --- lib_com/options.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index 4ccf556f1c..76dd1586c4 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -171,7 +171,6 @@ #define NONBE_1244_FIX_SWB_BWE_MEMORY /* VA: issue 1244: fix to SWB BWE memory in case of switching from FB coding - pending a review by Huawei */ #define NONBE_FIX_1180_HQMDCT_PHECU_LT_MUTING /* Ericsson: issue 1180, corrected long term mute loop attnuation after 200ms in PhECU-PLC */ -#define NONBE_1231_BASOP_819_THRESHOLD_MASA2TOTAL /* Nokia: add fix for precision limitation in comparison with masa2total energy ratio threshold to be aligned with BASOP*/ #define NONBE_1293_CRASH_FIRST_FRAME_LOST /* VA: issue 1293: fix G.192 decoder crash when first frame is lost */ /* ##################### End NON-BE switches ########################### */ -- GitLab From 9a9ce37e13d7fa6e8f9b0d99318c57cc4640d1e3 Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 20 Mar 2025 10:15:19 +0100 Subject: [PATCH 5/6] fix uninitialized parameter reading --- lib_dec/lib_dec.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 305ec140ed..50e00cc381 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1231,6 +1231,8 @@ ivas_error IVAS_DEC_GetEditableParameters( #ifdef NONBE_1293_CRASH_FIRST_FRAME_LOST if ( !hIvasDec->hasBeenFedFirstGoodFrame ) { + hIvasEditableParameters->num_obj = 0; + return IVAS_ERR_OK; } #endif -- GitLab From 0ace592b45aa66bbece12250ee6b33df4dbc70d4 Mon Sep 17 00:00:00 2001 From: rtyag Date: Tue, 1 Apr 2025 17:21:29 +1100 Subject: [PATCH 6/6] fix for split rendering and non-split rendering cases, output zeros for initial bad frames --- apps/isar_post_rend.c | 21 +++++++++++++++++++++ lib_dec/lib_dec.c | 19 ++++++++++++------- lib_isar/lib_isar_post_rend.c | 11 +++++++++++ lib_util/split_render_file_read_write.c | 16 ++++++++++++++++ lib_util/split_render_file_read_write.h | 9 +++++++++ 5 files changed, 69 insertions(+), 7 deletions(-) diff --git a/apps/isar_post_rend.c b/apps/isar_post_rend.c index bcadc691fb..2aff9b6a3d 100644 --- a/apps/isar_post_rend.c +++ b/apps/isar_post_rend.c @@ -985,6 +985,9 @@ int main( while ( 1 ) { +#ifdef NONBE_1293_CRASH_FIRST_FRAME_LOST + int16_t bfi = 0; +#endif int16_t num_in_channels; num_in_channels = inBuffer.config.numChannels; @@ -993,7 +996,11 @@ int main( { ivas_error error_tmp; numSamplesRead = (int16_t) inBufferSize; +#ifdef NONBE_1293_CRASH_FIRST_FRAME_LOST + error_tmp = split_rend_read_bits_from_file( hSplitRendFileReadWrite, bitsBuffer.bits, &bitsBuffer.config.bitsRead, &bitsBuffer.config.bitsWritten, &bfi ); +#else error_tmp = split_rend_read_bits_from_file( hSplitRendFileReadWrite, bitsBuffer.bits, &bitsBuffer.config.bitsRead, &bitsBuffer.config.bitsWritten ); +#endif if ( error_tmp != IVAS_ERR_OK ) { if ( error_tmp == IVAS_ERR_END_OF_FILE ) @@ -1060,19 +1067,33 @@ int main( /* Read from split renderer bfi file if specified */ if ( splitRendBFIReader != NULL && splitBinNeedsNewFrame ) { +#ifndef NONBE_1293_CRASH_FIRST_FRAME_LOST int16_t bfi; +#endif if ( ( error = SplitRendBFIFileReading( splitRendBFIReader, &bfi ) ) != IVAS_ERR_OK ) { fprintf( stderr, "Error in SplitRendBFIFileReading(): %s\n", ivas_error_to_string( error ) ); exit( -1 ); } +#ifndef NONBE_1293_CRASH_FIRST_FRAME_LOST if ( ( error = ISAR_POST_REND_SetSplitRendBFI( hIsarPostRend, bfi ) ) != IVAS_ERR_OK ) { fprintf( stderr, "Error in ISAR_POST_REND_SetSplitRendBFI(): %s\n", ivas_error_to_string( error ) ); exit( -1 ); } +#endif } +#ifdef NONBE_1293_CRASH_FIRST_FRAME_LOST + if ( splitBinNeedsNewFrame ) + { + if ( ( error = ISAR_POST_REND_SetSplitRendBFI( hIsarPostRend, bfi ) ) != IVAS_ERR_OK ) + { + fprintf( stderr, "Error in ISAR_POST_REND_SetSplitRendBFI(): %s\n", ivas_error_to_string( error ) ); + exit( -1 ); + } + } +#endif for ( i = 0; i < args.inConfig.numBinBuses; ++i ) { diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 50e00cc381..bfd7920c3d 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1758,9 +1758,14 @@ ivas_error IVAS_DEC_GetSamplesRenderer( { *needNewFrame = false; } +#ifdef NONBE_1293_CRASH_FIRST_FRAME_LOST + *nOutSamples = nSamplesRendered; +#endif } +#ifndef NONBE_1293_CRASH_FIRST_FRAME_LOST *nOutSamples = nSamplesRendered; +#endif return IVAS_ERR_OK; } @@ -1805,13 +1810,6 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( return IVAS_ERR_UNEXPECTED_NULL_POINTER; } -#ifdef NONBE_1293_CRASH_FIRST_FRAME_LOST - if ( !hIvasDec->hasBeenFedFirstGoodFrame ) - { - return IVAS_ERR_OK; - } -#endif - error = IVAS_ERR_OK; st_ivas = hIvasDec->st_ivas; output_config = st_ivas->hDecoderConfig->output_config; @@ -1871,6 +1869,13 @@ ivas_error IVAS_DEC_GetSplitBinauralBitstream( return error; } +#ifdef NONBE_1293_CRASH_FIRST_FRAME_LOST + if ( !hIvasDec->hasBeenFedFirstGoodFrame ) + { + return IVAS_ERR_OK; + } +#endif + /* change buffer layout */ for ( i = 0; i < numSamplesPerChannelToDecode; ++i ) { diff --git a/lib_isar/lib_isar_post_rend.c b/lib_isar/lib_isar_post_rend.c index 8709ce9b83..7e050abc06 100644 --- a/lib_isar/lib_isar_post_rend.c +++ b/lib_isar/lib_isar_post_rend.c @@ -1539,6 +1539,17 @@ static ivas_error renderSplitBinauralWithPostRot( } else { +#ifdef NONBE_1293_CRASH_FIRST_FRAME_LOST + if ( splitBinInput->numCachedSamples == 0 ) + { + numSamplesPerChannelCacheSize = (int16_t) ( *splitBinInput->base.ctx.pOutSampleRate * bits.isar_frame_size_ms / 1000 ) - outAudio.config.numSamplesPerChannel; + splitBinInput->numCachedSamples = numSamplesPerChannelCacheSize; + } + else + { + splitBinInput->numCachedSamples -= outAudio.config.numSamplesPerChannel; + } +#endif if ( splitBinInput->base.inConfig == IVAS_AUDIO_CONFIG_BINAURAL_SPLIT_CODED ) { for ( ch_idx = 0; ch_idx < BINAURAL_CHANNELS; ch_idx++ ) diff --git a/lib_util/split_render_file_read_write.c b/lib_util/split_render_file_read_write.c index e0c7df92d6..9cc6e4bf7e 100644 --- a/lib_util/split_render_file_read_write.c +++ b/lib_util/split_render_file_read_write.c @@ -331,11 +331,20 @@ ivas_error split_rend_write_bitstream_to_file( * *-----------------------------------------------------------------------------------------*/ +#ifdef NONBE_1293_CRASH_FIRST_FRAME_LOST +ivas_error split_rend_read_bits_from_file( + SplitFileReadWrite *hSplitRendFileReadWrite, + uint8_t *bits, + int32_t *bits_read, + int32_t *bits_written, + int16_t *bfi ) +#else ivas_error split_rend_read_bits_from_file( SplitFileReadWrite *hSplitRendFileReadWrite, uint8_t *bits, int32_t *bits_read, int32_t *bits_written ) +#endif { char header[SPLIT_RENDERER_FRAME_HEADER_LEN] = "SPLIT_FRAME"; char header_read[SPLIT_RENDERER_FRAME_HEADER_LEN]; @@ -398,6 +407,13 @@ ivas_error split_rend_read_bits_from_file( *bits_read = 0; *bits_written = bit_len; +#ifdef NONBE_1293_CRASH_FIRST_FRAME_LOST + *bfi = 0; + if ( bit_len == 0 ) + { + *bfi = 1; + } +#endif return IVAS_ERR_OK; } diff --git a/lib_util/split_render_file_read_write.h b/lib_util/split_render_file_read_write.h index 1362ce1226..4450eeded4 100644 --- a/lib_util/split_render_file_read_write.h +++ b/lib_util/split_render_file_read_write.h @@ -73,11 +73,20 @@ ivas_error split_rend_write_bitstream_to_file( int32_t *bits_written ); /* read split rend coded bits from file */ +#ifdef NONBE_1293_CRASH_FIRST_FRAME_LOST +ivas_error split_rend_read_bits_from_file( + SplitFileReadWrite *hSplitRendFileReadWrite, + uint8_t *bits, + int32_t *bits_read, + int32_t *bits_written, + int16_t *bfi ); +#else ivas_error split_rend_read_bits_from_file( SplitFileReadWrite *hSplitRendFileReadWrite, uint8_t *bits, int32_t *bits_read, int32_t *bits_written ); +#endif /* read split pre rend delay */ ivas_error split_rend_read_pre_rend_delay_ns( -- GitLab