diff --git a/lib_com/options.h b/lib_com/options.h index 247a24014b05f6612d01864bd5484849a94b2e72..6c4363df1775edf2e1fcac6b2c6b395dd8ed9ad1 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -157,6 +157,9 @@ #define SPLIT_REND_WITH_HEAD_ROT /* Dlb,FhG: Split Rendering contributions 21 and 35 */ #ifdef SPLIT_REND_WITH_HEAD_ROT #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 SPLIT_REND_POSE_CORRECTION_UNUSED_BITS #define FIX_1081_BINAURAL_SPLIT_PCM_SANITY_CHECK /* VA: issue 1081: correct error print-out when BINAURAL_SPLIT_PCM is requested */ #endif diff --git a/lib_isar/isar_prot.h b/lib_isar/isar_prot.h index ffc42b2283fbfb342e21a89da0524b475d1a7c87..7431b7bc950cdca71949191dd86f81f00a177c01 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 ef1072f5c9e3a736c8f70eb973fce9396b47e63b..3db6abf319e2badeb5bc749dbd26f1b156776177 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 f6933796dfcfb1d0a657ec819dbe0193912dff35..81961fd94910400892e7e4e3500a0ddf8f3dccbe 100644 --- a/lib_isar/isar_splitRenderer_utils.c +++ b/lib_isar/isar_splitRenderer_utils.c @@ -563,6 +563,30 @@ 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 c7d66e12632509132c286ceae070080fae2bdb40..15e08660e5a0e517388f4d7e1dd323a6109e7955 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 ) diff --git a/scripts/patch_code_headers.sh b/scripts/patch_code_headers.sh index 4127c80acab4d2dbcbbdaf20473adab2a6766793..44bbc9751374cc123604597af2de48ee343e8879 100755 --- a/scripts/patch_code_headers.sh +++ b/scripts/patch_code_headers.sh @@ -181,7 +181,16 @@ sed -i.bak -e "/copyright_str\ =\ string[(]join[(]/a \ \ \ \ \'/*=============== # truncate -s 0 $WORKDIR/scripts/binauralRenderer_interface/ivas_license_header.template -echo echo "$c_header_new" >> $WORKDIR/scripts/binauralRenderer_interface/ivas_license_header.template +echo "$c_header_new" >> $WORKDIR/scripts/binauralRenderer_interface/ivas_license_header.template + +sed -i.bak -e "1,/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\//d" $WORKDIR/scripts/binauralRenderer_interface/ivas_rom_binaural_crend_head.template +# add new header +tmpfile=`mktemp` +rm -f $tmpfile +touch $tmpfile +echo "$c_header_new" >> $tmpfile +sed -i.bak -e "1 e cat $tmpfile" $WORKDIR/scripts/binauralRenderer_interface/ivas_rom_binaural_crend_head.template +rm -f $tmpfile # diff --git a/scripts/split_rendering/lc3plus/ivas_lc3plus_unit_test.c b/scripts/split_rendering/lc3plus/ivas_lc3plus_unit_test.c index 53c7c45165aab75e1f11bf81e7b8c2f16e19cf1d..e57db546badc366bb2d976c8d3fddbf2221bcc24 100644 --- a/scripts/split_rendering/lc3plus/ivas_lc3plus_unit_test.c +++ b/scripts/split_rendering/lc3plus/ivas_lc3plus_unit_test.c @@ -684,7 +684,11 @@ static int encodeAndDecodeOneStereoFrameIvas10msLc3_10ms_48kHz_96kbpsPerChannel( return encodeAndDecodeOneStereoFrame( config, config.channels * 98*1000 ); } +#ifdef LC3PLUS_LEA_COMPAT_BITRATES_48_6 +static int encodeAndDecodeOneStereoFrameIvas10msLc3_10ms_48kHz_126kbpsPerChannel( void ) +#else static int encodeAndDecodeOneStereoFrameIvas10msLc3_10ms_48kHz_124kbpsPerChannel( void ) +#endif { #ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS LC3PLUS_CONFIG config = { .lc3plus_frame_duration_us = 10 * 1000, .isar_frame_duration_us = 10 * 1000, .channels = 2, .samplerate = 48000, .high_res_mode_enabled = 0 }; @@ -823,7 +827,11 @@ int main( ret = encodeAndDecodeOneStereoFrameIvas10msLc3_10ms_48kHz_96kbpsPerChannel(); if ( ret != 0 ) return 1; +#ifdef LC3PLUS_LEA_COMPAT_BITRATES_48_6 + ret = encodeAndDecodeOneStereoFrameIvas10msLc3_10ms_48kHz_126kbpsPerChannel(); +#else ret = encodeAndDecodeOneStereoFrameIvas10msLc3_10ms_48kHz_124kbpsPerChannel(); +#endif if ( ret != 0 ) return 1; #ifdef ISAR_BITSTREAM_UPDATE_LC3PLUS