From 66facc38091a8bbbf2dd681f0e83ef01874a8047 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Wed, 4 Jun 2025 14:23:47 +0200 Subject: [PATCH] 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 | 26 ++++++++++++++++++++++++++ lib_isar/lib_isar_pre_rend.c | 11 +++++++++++ 5 files changed, 63 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 435bdaa5d..3778949ec 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -180,6 +180,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 #endif #define NONBE_FIX_1058_DECODER_ERROR_WITH_REVERB_ROOM /* FhG: issue 1058: do not initialize EFAP when IntSetup is HOA3 */ #ifdef NONBE_FIX_1058_DECODER_ERROR_WITH_REVERB_ROOM diff --git a/lib_isar/isar_prot.h b/lib_isar/isar_prot.h index 4f1f3e7b9..2e0fd76ae 100644 --- a/lib_isar/isar_prot.h +++ b/lib_isar/isar_prot.h @@ -317,6 +317,14 @@ int32_t isar_get_lc3plus_bitrate( const int16_t split_prerender_frame_size_ms ); #endif +#ifdef LC3PLUS_LEA_COMPAT_BITRATES_48_6 +int32_t isar_get_lc3plus_bitrate( + const int32_t SplitRendBitRate, + const ISAR_SPLIT_REND_POSE_CORRECTION_MODE poseCorrectionMode, + const int32_t nChannels, + const int32_t codecFrameDurationUs ); +#endif + ivas_error isar_split_rend_validate_config( const ISAR_SPLIT_REND_CONFIG_DATA *pSplitRendConfig, const int16_t pcm_out_flag ); diff --git a/lib_isar/isar_splitRendererPre.c b/lib_isar/isar_splitRendererPre.c index 5c2f787a8..74fa51631 100644 --- a/lib_isar/isar_splitRendererPre.c +++ b/lib_isar/isar_splitRendererPre.c @@ -1969,7 +1969,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 @@ -2229,7 +2233,18 @@ ivas_error isar_renderMultiTDBinToSplitBinaural( { #ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS #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 ) ) != IVAS_ERR_OK ) #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 a1910bf9f..a0b757068 100644 --- a/lib_isar/isar_splitRenderer_utils.c +++ b/lib_isar/isar_splitRenderer_utils.c @@ -563,6 +563,32 @@ int32_t isar_get_lcld_bitrate( return -1; } +#ifdef LC3PLUS_LEA_COMPAT_BITRATES_48_6 +/*------------------------------------------------------------------------- + * Function isar_get_lc3plus_bitrate() + * + * + *------------------------------------------------------------------------*/ + +int32_t isar_get_lc3plus_bitrate( + const int32_t SplitRendBitRate, + const ISAR_SPLIT_REND_POSE_CORRECTION_MODE poseCorrectionMode, + const int32_t nChannels, + const int32_t codecFrameDurationUs ) +{ + int32_t 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 /*------------------------------------------------------------------------- diff --git a/lib_isar/lib_isar_pre_rend.c b/lib_isar/lib_isar_pre_rend.c index 01baba8ba..d115f1245 100644 --- a/lib_isar/lib_isar_pre_rend.c +++ b/lib_isar/lib_isar_pre_rend.c @@ -434,7 +434,18 @@ ivas_error ISAR_PRE_REND_MultiBinToSplitBinaural( } #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, output ) ) != IVAS_ERR_OK ) #else if ( ( error = splitRendLc3plusEncodeAndWrite( hSplitBin, pBits, SplitRendBitRate, output ) ) != IVAS_ERR_OK ) -- GitLab