From 5e87ffb702fb8cede62325ea112da02b43c84534 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Wed, 4 Jun 2025 14:23:56 +0200 Subject: [PATCH 1/2] port LC3PLUS_LEA_COMPAT_BITRATES_48_6 --- lib_com/options.h | 3 +++ lib_isar/isar_prot.h | 8 ++++++++ lib_isar/isar_splitRendererPre.c | 15 +++++++++++++++ lib_isar/isar_splitRenderer_utils.c | 27 +++++++++++++++++++++++++++ lib_isar/lib_isar_pre_rend.c | 11 +++++++++++ 5 files changed, 64 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 3315e495e..681166e56 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -107,6 +107,9 @@ #ifdef SPLIT_REND_WITH_HEAD_ROT #define SPLIT_REND_POSE_CORRECTION_UNUSED_BITS #define ISAR_BITSTREAM_UPDATE_LC3PLUS /* FhG: Multiple improvements to the ISAR bitstream when LC3plus is used. See MR 1456 for details. */ +#ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS +#define LC3PLUS_LEA_COMPAT_BITRATES_48_6 /* FhG: treat split-rendering 256kbps lc3plus 10ms 0dof bitrate as sentinel value for LEA compatible 48_6 bitrate (124 kbps per channel) */ +#endif #define FIX_1372_ISAR_POST_REND #endif #define NONBE_FIX_1058_DECODER_ERROR_WITH_REVERB_ROOM /* FhG: issue 1058: do not initialize EFAP when IntSetup is HOA3 */ diff --git a/lib_isar/isar_prot.h b/lib_isar/isar_prot.h index 618454f66..c83fe93be 100644 --- a/lib_isar/isar_prot.h +++ b/lib_isar/isar_prot.h @@ -336,6 +336,14 @@ Word32 isar_get_lc3plus_bitrate( const Word16 split_prerender_frame_size_ms ); #endif +#ifdef LC3PLUS_LEA_COMPAT_BITRATES_48_6 +Word32 isar_get_lc3plus_bitrate( + const Word32 SplitRendBitRate, + const ISAR_SPLIT_REND_POSE_CORRECTION_MODE poseCorrectionMode, + const Word32 nChannels, + const Word32 codecFrameDurationUs ); +#endif + ivas_error isar_split_rend_validate_config( const ISAR_SPLIT_REND_CONFIG_DATA *pSplitRendConfig, const Word16 is_pcm_out ); diff --git a/lib_isar/isar_splitRendererPre.c b/lib_isar/isar_splitRendererPre.c index 8bdc824f8..7d078327c 100644 --- a/lib_isar/isar_splitRendererPre.c +++ b/lib_isar/isar_splitRendererPre.c @@ -2966,7 +2966,11 @@ ivas_error split_renderer_open_lc3plus( if ( ( error = ISAR_LC3PLUS_ENC_Open( config, #ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS +#ifdef LC3PLUS_LEA_COMPAT_BITRATES_48_6 + isar_get_lc3plus_bitrate( pSplitRendConfig->splitRendBitRate, pSplitRendConfig->poseCorrectionMode, config.channels, config.lc3plus_frame_duration_us ), +#else isar_get_lcld_bitrate( pSplitRendConfig->splitRendBitRate, pSplitRendConfig->poseCorrectionMode ), +#endif #else isar_get_lc3plus_bitrate( pSplitRendConfig->splitRendBitRate, pSplitRendConfig->poseCorrectionMode, (int16_t) ( config.isar_frame_duration_us / 1000 ) ), #endif @@ -3300,7 +3304,18 @@ ivas_error isar_renderMultiTDBinToSplitBinaural( ELSE { #ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS +#ifdef LC3PLUS_LEA_COMPAT_BITRATES_48_6 + if ( pBits->pose_correction == ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE ) + { + available_bits = isar_get_lc3plus_bitrate( SplitRendBitRate, hSplitBin->multiBinPoseData.poseCorrectionMode, hSplitBin->hLc3plusEnc->config.channels, hSplitBin->hLc3plusEnc->config.lc3plus_frame_duration_us ) / FRAMES_PER_SEC; + } + else + { + available_bits = ( SplitRendBitRate / FRAMES_PER_SEC ) - pBits->bits_written; + } +#else available_bits = ( SplitRendBitRate / FRAMES_PER_SEC ) - pBits->bits_written; +#endif IF( ( error = splitRendLc3plusEncodeAndWrite( hSplitBin, pBits, available_bits, in_fx, Q_in ) ) != IVAS_ERR_OK ) { return error; diff --git a/lib_isar/isar_splitRenderer_utils.c b/lib_isar/isar_splitRenderer_utils.c index 7f21a40c7..2942bce86 100644 --- a/lib_isar/isar_splitRenderer_utils.c +++ b/lib_isar/isar_splitRenderer_utils.c @@ -738,6 +738,33 @@ Word32 isar_get_lcld_bitrate( return -1; } +#ifdef LC3PLUS_LEA_COMPAT_BITRATES_48_6 +/*------------------------------------------------------------------------- + * Function isar_get_lc3plus_bitrate() + * + * + *------------------------------------------------------------------------*/ + +Word32 isar_get_lc3plus_bitrate( + const Word32 SplitRendBitRate, + const ISAR_SPLIT_REND_POSE_CORRECTION_MODE poseCorrectionMode, + const Word32 nChannels, + const Word32 codecFrameDurationUs ) +{ + Word32 bitrate; + bitrate = isar_get_lcld_bitrate( SplitRendBitRate, poseCorrectionMode ); + /* Check for LC3plus LEA 48_6 LC3 compatibility mode signalling */ + if ( ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE == poseCorrectionMode && bitrate == 256000 && nChannels == 2 && codecFrameDurationUs == 10000 ) + { + + + bitrate = 2 * 126000; + } + return bitrate; +} +#endif + + #ifndef ISAR_BITSTREAM_UPDATE_LC3PLUS /*------------------------------------------------------------------------- * Function isar_get_lc3plus_bitrate() diff --git a/lib_isar/lib_isar_pre_rend.c b/lib_isar/lib_isar_pre_rend.c index fa3462fdc..b6f71cfbe 100644 --- a/lib_isar/lib_isar_pre_rend.c +++ b/lib_isar/lib_isar_pre_rend.c @@ -533,7 +533,18 @@ ivas_error ISAR_PRE_REND_MultiBinToSplitBinaural( assert( Q_out[0] == Q_out[1] ); #ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS +#ifdef LC3PLUS_LEA_COMPAT_BITRATES_48_6 + if ( pBits->pose_correction == ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE ) + { + available_bits = isar_get_lc3plus_bitrate( SplitRendBitRate, hSplitBin->multiBinPoseData.poseCorrectionMode, hSplitBin->hLc3plusEnc->config.channels, hSplitBin->hLc3plusEnc->config.lc3plus_frame_duration_us ) / FRAMES_PER_SEC; + } + else + { + available_bits = ( SplitRendBitRate / FRAMES_PER_SEC ) - pBits->bits_written; + } +#else available_bits = ( SplitRendBitRate / FRAMES_PER_SEC ) - pBits->bits_written; +#endif IF( ( error = splitRendLc3plusEncodeAndWrite( hSplitBin, pBits, available_bits, pOutput_fx, Q_out[0] ) ) != IVAS_ERR_OK ) #else IF( ( error = splitRendLc3plusEncodeAndWrite( hSplitBin, pBits, SplitRendBitRate, pOutput_fx ) ) != IVAS_ERR_OK ) -- GitLab From 79a7a94471e420515a104cdb61dc8d999cf823e3 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Thu, 7 Aug 2025 09:28:07 +0200 Subject: [PATCH 2/2] update BASOP code --- lib_isar/isar_splitRendererPre.c | 9 +++++---- lib_isar/isar_splitRenderer_utils.c | 9 ++++++--- lib_isar/lib_isar_pre_rend.c | 9 +++++---- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/lib_isar/isar_splitRendererPre.c b/lib_isar/isar_splitRendererPre.c index 78045f665..77c4d6ac9 100644 --- a/lib_isar/isar_splitRendererPre.c +++ b/lib_isar/isar_splitRendererPre.c @@ -2998,13 +2998,14 @@ ivas_error isar_renderMultiTDBinToSplitBinaural( ELSE { #ifdef LC3PLUS_LEA_COMPAT_BITRATES_48_6 - if ( pBits->pose_correction == ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE ) + IF( EQ_32( pBits->pose_correction, ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE ) ) { - available_bits = isar_get_lc3plus_bitrate( SplitRendBitRate, hSplitBin->multiBinPoseData.poseCorrectionMode, hSplitBin->hLc3plusEnc->config.channels, hSplitBin->hLc3plusEnc->config.lc3plus_frame_duration_us ) / FRAMES_PER_SEC; + available_bits = isar_get_lc3plus_bitrate( SplitRendBitRate, hSplitBin->multiBinPoseData.poseCorrectionMode, hSplitBin->hLc3plusEnc->config.channels, hSplitBin->hLc3plusEnc->config.lc3plus_frame_duration_us ); + available_bits = Mpy_32_32( available_bits, ONE_BY_FRAMES_PER_SEC_Q31 ); } - else + ELSE { - available_bits = ( SplitRendBitRate / FRAMES_PER_SEC ) - pBits->bits_written; + available_bits = L_sub( Mpy_32_32( SplitRendBitRate, ONE_BY_FRAMES_PER_SEC_Q31 ), pBits->bits_written ); } #else available_bits = ( SplitRendBitRate / FRAMES_PER_SEC ) - pBits->bits_written; diff --git a/lib_isar/isar_splitRenderer_utils.c b/lib_isar/isar_splitRenderer_utils.c index 5a49089cb..aabedbc58 100644 --- a/lib_isar/isar_splitRenderer_utils.c +++ b/lib_isar/isar_splitRenderer_utils.c @@ -753,12 +753,15 @@ Word32 isar_get_lc3plus_bitrate( Word32 bitrate; bitrate = isar_get_lcld_bitrate( SplitRendBitRate, poseCorrectionMode ); /* Check for LC3plus LEA 48_6 LC3 compatibility mode signalling */ - if ( ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE == poseCorrectionMode && bitrate == 256000 && nChannels == 2 && codecFrameDurationUs == 10000 ) + test(); + test(); + test(); + if ( EQ_32( ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE, poseCorrectionMode ) && EQ_32( bitrate, 256000 ) && EQ_32( nChannels, 2 ) && EQ_32( codecFrameDurationUs, 10000 ) ) { - - bitrate = 2 * 126000; + move32(); } + return bitrate; } diff --git a/lib_isar/lib_isar_pre_rend.c b/lib_isar/lib_isar_pre_rend.c index 727f483cb..60f5debc6 100644 --- a/lib_isar/lib_isar_pre_rend.c +++ b/lib_isar/lib_isar_pre_rend.c @@ -484,13 +484,14 @@ ivas_error ISAR_PRE_REND_MultiBinToSplitBinaural( #ifdef LC3PLUS_LEA_COMPAT_BITRATES_48_6 - if ( pBits->pose_correction == ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE ) + IF( EQ_32( pBits->pose_correction, ISAR_SPLIT_REND_POSE_CORRECTION_MODE_NONE ) ) { - available_bits = isar_get_lc3plus_bitrate( SplitRendBitRate, hSplitBin->multiBinPoseData.poseCorrectionMode, hSplitBin->hLc3plusEnc->config.channels, hSplitBin->hLc3plusEnc->config.lc3plus_frame_duration_us ) / FRAMES_PER_SEC; + available_bits = isar_get_lc3plus_bitrate( SplitRendBitRate, hSplitBin->multiBinPoseData.poseCorrectionMode, hSplitBin->hLc3plusEnc->config.channels, hSplitBin->hLc3plusEnc->config.lc3plus_frame_duration_us ); + available_bits = Mpy_32_32( available_bits, ONE_BY_FRAMES_PER_SEC_Q31 ); } - else + ELSE { - available_bits = ( SplitRendBitRate / FRAMES_PER_SEC ) - pBits->bits_written; + available_bits = L_sub( Mpy_32_32( SplitRendBitRate, ONE_BY_FRAMES_PER_SEC_Q31 ), pBits->bits_written ); } #else available_bits = ( SplitRendBitRate / FRAMES_PER_SEC ) - pBits->bits_written; -- GitLab