diff --git a/lib_com/options.h b/lib_com/options.h index d824e1f7929788ce7b20e4bb8ccc0579e3a8e2fc..e5633fd9e55c8828ff3ead537ef9d72d6cc0dfae 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -110,6 +110,7 @@ #define FIX_1741_REVERB_TIMES_Q_FORMAT /* Philips: reverberation times in Q26 format instead of Q31 */ #define FIX_1831_REVERB_REGRESSION /* Philips: fixes reverb regression issues */ #define FIX_1835_REVERB_ACTIVATION /* FhG: Modified reverberation activation logic and corrected factEQ calculation */ +#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) */ #define NONBE_FIX_SBA_SIGNALING_BITS_B /* FhG: issue 1061: option B: signal sba order additionally in OSBA */ #define NONBE_FIX_ISM_XOVER_BR /* FhG: issue 1072: select OSBA coding method depending on number of object and bitrate */ #define NONBE_FIX_1028_1DB_TCX_LEVEL_DROP /* VA: Harmonize the logic setting LP weighting factor between TCX encoder and TCX decoder */ diff --git a/lib_isar/isar_prot.h b/lib_isar/isar_prot.h index 112ee1155fc9eddb2ae34719993fea4759495d3b..2472af19bcb8c9eefa1dba9cb46140686d3bc264 100644 --- a/lib_isar/isar_prot.h +++ b/lib_isar/isar_prot.h @@ -318,7 +318,14 @@ void isar_set_split_rend_ht_setup_fx( IVAS_QUATERNION Quaternions[MAX_PARAM_SPATIAL_SUBFRAMES], Word32 Rmat_fx[MAX_PARAM_SPATIAL_SUBFRAMES][3][3] ); +#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 b30f25ca7cd4d36a8b2972e9740ce5fbdaf1fbac..77c4d6ac97ab6bcf2300a56b2479c80863e91647 100644 --- a/lib_isar/isar_splitRendererPre.c +++ b/lib_isar/isar_splitRendererPre.c @@ -2700,7 +2700,11 @@ ivas_error split_renderer_open_lc3plus( config.channels = BINAURAL_CHANNELS; if ( ( error = ISAR_LC3PLUS_ENC_Open( config, +#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 &hSplitRendWrapper->hLc3plusEnc ) ) != IVAS_ERR_OK ) { return error; @@ -2993,7 +2997,19 @@ ivas_error isar_renderMultiTDBinToSplitBinaural( } ELSE { +#ifdef LC3PLUS_LEA_COMPAT_BITRATES_48_6 + 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 ); + available_bits = Mpy_32_32( available_bits, ONE_BY_FRAMES_PER_SEC_Q31 ); + } + ELSE + { + 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; +#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 62f3870d3d3d3a46a3e9979009668414e64c12f6..aabedbc5879521b4b551b6ea880227004f410b9b 100644 --- a/lib_isar/isar_splitRenderer_utils.c +++ b/lib_isar/isar_splitRenderer_utils.c @@ -737,6 +737,35 @@ 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 */ + 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; +} + +#endif /*------------------------------------------------------------------------- * Function isar_split_rend_validate_config() diff --git a/lib_isar/lib_isar_pre_rend.c b/lib_isar/lib_isar_pre_rend.c index d4809fc30a79de1b4a59ca6c59d58abc6a0e8048..60f5debc6019359708dd3bc66a2dd6b1f0766f06 100644 --- a/lib_isar/lib_isar_pre_rend.c +++ b/lib_isar/lib_isar_pre_rend.c @@ -482,7 +482,20 @@ ivas_error ISAR_PRE_REND_MultiBinToSplitBinaural( } assert( Q_out[0] == Q_out[1] ); + +#ifdef LC3PLUS_LEA_COMPAT_BITRATES_48_6 + 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 ); + available_bits = Mpy_32_32( available_bits, ONE_BY_FRAMES_PER_SEC_Q31 ); + } + ELSE + { + 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; +#endif IF( ( error = splitRendLc3plusEncodeAndWrite( hSplitBin, pBits, available_bits, pOutput_fx, Q_out[0] ) ) != IVAS_ERR_OK ) { return error;