From d5538f18a8abbacea8857f46a088f10e59520a73 Mon Sep 17 00:00:00 2001 From: rtyag Date: Mon, 24 Mar 2025 22:22:22 -0700 Subject: [PATCH 1/3] BAOSP porting: fix for issue 1438 encoder --- lib_com/ivas_dirac_com_fx.c | 43 +++++++++++++++++++++++++++-------- lib_com/ivas_prot_fx.h | 12 ++++++++++ lib_com/options.h | 1 + lib_dec/ivas_dirac_dec_fx.c | 9 +++++++- lib_dec/ivas_init_dec.c | 10 ++++++++ lib_dec/ivas_sba_dec_fx.c | 5 ++++ lib_enc/ivas_spar_md_enc_fx.c | 30 ++++++++++++++++++++++++ 7 files changed, 100 insertions(+), 10 deletions(-) diff --git a/lib_com/ivas_dirac_com_fx.c b/lib_com/ivas_dirac_com_fx.c index 146587791..c814c3169 100644 --- a/lib_com/ivas_dirac_com_fx.c +++ b/lib_com/ivas_dirac_com_fx.c @@ -223,11 +223,19 @@ ivas_error ivas_dirac_config_fx( IF( EQ_32( ivas_format, SBA_FORMAT ) || EQ_32( ivas_format, SBA_ISM_FORMAT ) ) { // 100861_dirac_dec +#ifdef NONBE_FIX_907_VLBR_DIRAC_BAND_MAPPING + ivas_dirac_config_bands_fx( band_grouping, IVAS_MAX_NUM_BANDS, (Word16) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), dirac_to_spar_md_bands, hQMetaData->useLowerBandRes, hConfig->enc_param_start_band, hFbMdft, 1 ); +#else ivas_dirac_config_bands_fx( band_grouping, IVAS_MAX_NUM_BANDS, (Word16) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), dirac_to_spar_md_bands, hQMetaData->useLowerBandRes, hConfig->enc_param_start_band, hFbMdft ); +#endif } ELSE { +#ifdef NONBE_FIX_907_VLBR_DIRAC_BAND_MAPPING + ivas_dirac_config_bands_fx( band_grouping, hConfig->nbands, (Word16) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), NULL, 0, 0, hFbMdft, 1 ); +#else ivas_dirac_config_bands_fx( band_grouping, hConfig->nbands, (Word16) ( Fs * INV_CLDFB_BANDWIDTH + 0.5f ), NULL, 0, 0, hFbMdft ); +#endif } return error; @@ -235,11 +243,22 @@ ivas_error ivas_dirac_config_fx( /*------------------------------------------------------------------------- - * ivas_dirac_sba_config_bands() + * ivas_dirac_config_bands_fx() * * DirAC Configuration freq. band function; used also in MASA decoder *------------------------------------------------------------------------*/ +#ifdef NONBE_FIX_907_VLBR_DIRAC_BAND_MAPPING +void ivas_dirac_config_bands_fx( + Word16 *band_grouping, /* o : band grouping */ + const Word16 nbands, /* i : number of bands */ + const Word16 max_band, /* i : maximal band index +1 */ + Word16 *dirac_to_spar_md_bands, /* o : mapping of DirAC parameter band index to SPAR FB band index */ + const Word8 useLowerBandRes, /* i : flag indicating lower band resolution for DirAC */ + const Word16 enc_param_start_band, /* i : band index of first DirAC parameter band */ + IVAS_FB_MIXER_HANDLE hFbMdft, + const Word8 BandGroupLowRes ) +#else void ivas_dirac_config_bands_fx( Word16 *band_grouping, /* o : band grouping */ const Word16 nbands, /* i : number of bands */ @@ -248,6 +267,7 @@ void ivas_dirac_config_bands_fx( const Word8 useLowerBandRes, const Word16 enc_param_start_band, IVAS_FB_MIXER_HANDLE hFbMdft ) +#endif { Word16 i; { @@ -307,15 +327,20 @@ void ivas_dirac_config_bands_fx( Word16 step = DIRAC_LOW_BANDRES_STEP; move16(); Word16 reduced_band; - FOR( ( band = enc_param_start_band + 2, reduced_band = enc_param_start_band + 1 ); band <= DIRAC_MAX_NBANDS; ( band += step, reduced_band++ ) ) - { - band_grouping[reduced_band] = band_grouping[band]; - move16(); - } - FOR( ; reduced_band <= DIRAC_MAX_NBANDS; reduced_band++ ) +#ifdef NONBE_FIX_907_VLBR_DIRAC_BAND_MAPPING + IF( BandGroupLowRes ) +#endif { - band_grouping[reduced_band] = max_band; - move16(); + FOR( ( band = enc_param_start_band + 2, reduced_band = enc_param_start_band + 1 ); band <= DIRAC_MAX_NBANDS; ( band += step, reduced_band++ ) ) + { + band_grouping[reduced_band] = band_grouping[band]; + move16(); + } + FOR( ; reduced_band <= DIRAC_MAX_NBANDS; reduced_band++ ) + { + band_grouping[reduced_band] = max_band; + move16(); + } } FOR( ( band = enc_param_start_band + ( DIRAC_MAX_NBANDS - enc_param_start_band ) / 2 - 1, reduced_band = DIRAC_MAX_NBANDS - 1 ); band >= enc_param_start_band; ( band--, reduced_band -= step ) ) { diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index 102918e0d..cf488d043 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -4985,6 +4985,17 @@ void ivas_sba2mc_cldfb_fixed( const Word32 *hoa_dec_mtx /* i : HOA decoding mtx */ ); +#ifdef NONBE_FIX_907_VLBR_DIRAC_BAND_MAPPING +void ivas_dirac_config_bands_fx( + Word16 *band_grouping, /* o : band grouping */ + const Word16 nbands, /* i : number of bands */ + const Word16 max_band, /* i : maximal band index +1 */ + Word16 *dirac_to_spar_md_bands, /* o : mapping of DirAC parameter band index to SPAR FB band index */ + const Word8 useLowerBandRes, /* i : flag indicating lower band resolution for DirAC */ + const Word16 enc_param_start_band, /* i : band index of first DirAC parameter band */ + IVAS_FB_MIXER_HANDLE hFbMdft, + const Word8 BandGroupLowRes ); +#else void ivas_dirac_config_bands_fx( Word16 *band_grouping, /* o : band grouping */ const Word16 nbands, /* i : number of bands */ @@ -4993,6 +5004,7 @@ void ivas_dirac_config_bands_fx( const Word8 useLowerBandRes, /* i : flag indicating lower band resolution for DirAC */ const Word16 enc_param_start_band, /* i : band index of first DirAC parameter band */ IVAS_FB_MIXER_HANDLE hFbMdft ); +#endif void ivas_dirac_dec_close_fx( DIRAC_DEC_HANDLE *hDirAC_out ); diff --git a/lib_com/options.h b/lib_com/options.h index 3b3adbf01..2c34bb649 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -189,6 +189,7 @@ #define FIX_929_RENDERER_CMDL /* Nokia: issue #929: renderer command line option */ #define NONBE_FIX_BINAURAL_ROOM_IR_REVERBERATOR /* FhG: re-enable acidentially disabled reverberator for BINAURAL_ROOM_IR */ #define NONBE_FIX_1058_DECODER_ERROR_WITH_REVERB_ROOM /* FhG: issue 1058: do not initialize EFAP when IntSetup is HOA3 */ +#define NONBE_FIX_907_VLBR_DIRAC_BAND_MAPPING /* Dlb: issue 907: fix for band mapping at VLBR */ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_dec/ivas_dirac_dec_fx.c b/lib_dec/ivas_dirac_dec_fx.c index effff230f..e11318157 100644 --- a/lib_dec/ivas_dirac_dec_fx.c +++ b/lib_dec/ivas_dirac_dec_fx.c @@ -1624,7 +1624,11 @@ void ivas_qmetadata_to_dirac_fx( move16(); hDirAC->hConfig->nbands = 5; move16(); +#ifdef NONBE_FIX_907_VLBR_DIRAC_BAND_MAPPING + ivas_dirac_config_bands_fx( hDirAC->band_grouping, hDirAC->hConfig->nbands, nbands, NULL, 0, 0, NULL, 1 ); +#else ivas_dirac_config_bands_fx( hDirAC->band_grouping, hDirAC->hConfig->nbands, nbands, NULL, 0, 0, NULL ); +#endif nbands = 5; move16(); } @@ -1643,8 +1647,11 @@ void ivas_qmetadata_to_dirac_fx( move16(); } +#ifdef NONBE_FIX_907_VLBR_DIRAC_BAND_MAPPING + ivas_dirac_config_bands_fx( hDirAC->band_grouping, hDirAC->hConfig->nbands, nbands, dirac_to_spar_md_bands, hQMetaData->useLowerBandRes, hDirAC->hConfig->enc_param_start_band, hDirAC->hFbMdft, 0 ); +#else ivas_dirac_config_bands_fx( hDirAC->band_grouping, hDirAC->hConfig->nbands, nbands, dirac_to_spar_md_bands, hQMetaData->useLowerBandRes, hDirAC->hConfig->enc_param_start_band, hDirAC->hFbMdft ); - +#endif nbands = hDirAC->hConfig->nbands; move16(); if ( hQMetaData->q_direction[0].cfg.nblocks == 0 ) diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index cef1e45e9..964b00ddc 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -1569,8 +1569,13 @@ ivas_error ivas_init_decoder_fx( move16(); } +#ifdef NONBE_FIX_907_VLBR_DIRAC_BAND_MAPPING + ivas_dirac_config_bands_fx( band_grouping, IVAS_MAX_NUM_BANDS, extract_l( Mpy_32_32_r( st_ivas->hDecoderConfig->output_Fs, INV_CLDFB_BANDWIDTH_Q31 ) ), + st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0, 1 ); +#else ivas_dirac_config_bands_fx( band_grouping, IVAS_MAX_NUM_BANDS, extract_l( Mpy_32_32_r( st_ivas->hDecoderConfig->output_Fs, INV_CLDFB_BANDWIDTH_Q31 ) ), st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); +#endif } st_ivas->sba_dirac_stereo_flag = ivas_get_sba_dirac_stereo_flag( st_ivas ); move16(); @@ -1759,8 +1764,13 @@ ivas_error ivas_init_decoder_fx( move16(); } +#ifdef NONBE_FIX_907_VLBR_DIRAC_BAND_MAPPING + ivas_dirac_config_bands_fx( band_grouping, IVAS_MAX_NUM_BANDS, extract_l( Mpy_32_32_r( st_ivas->hDecoderConfig->output_Fs, INV_CLDFB_BANDWIDTH_Q31 ) ), + st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0, 1 ); +#else ivas_dirac_config_bands_fx( band_grouping, IVAS_MAX_NUM_BANDS, extract_l( Mpy_32_32_r( st_ivas->hDecoderConfig->output_Fs, INV_CLDFB_BANDWIDTH_Q31 ) ), st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); +#endif } FOR( sce_id = 0; sce_id < st_ivas->nSCE; sce_id++ ) diff --git a/lib_dec/ivas_sba_dec_fx.c b/lib_dec/ivas_sba_dec_fx.c index d48192bce..e9b72d4a4 100644 --- a/lib_dec/ivas_sba_dec_fx.c +++ b/lib_dec/ivas_sba_dec_fx.c @@ -488,8 +488,13 @@ ivas_error ivas_sba_dec_reconfigure_fx( move16(); } +#ifdef NONBE_FIX_907_VLBR_DIRAC_BAND_MAPPING + ivas_dirac_config_bands_fx( band_grouping, IVAS_MAX_NUM_BANDS, (Word16) ( L_add( st_ivas->hDecoderConfig->output_Fs, 400 ) / CLDFB_BANDWIDTH ), + st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0, 1 ); +#else ivas_dirac_config_bands_fx( band_grouping, IVAS_MAX_NUM_BANDS, (Word16) ( L_add( st_ivas->hDecoderConfig->output_Fs, 400 ) / CLDFB_BANDWIDTH ), st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); +#endif if ( st_ivas->hDirAC ) { diff --git a/lib_enc/ivas_spar_md_enc_fx.c b/lib_enc/ivas_spar_md_enc_fx.c index 9c4fcc937..6b3921afb 100644 --- a/lib_enc/ivas_spar_md_enc_fx.c +++ b/lib_enc/ivas_spar_md_enc_fx.c @@ -486,6 +486,9 @@ ivas_error ivas_spar_md_enc_process_fx( Word16 max_num_indices_tmp; Word32 Wscale_fx[IVAS_MAX_NUM_BANDS]; Word16 q_Wscale[IVAS_MAX_NUM_BANDS]; +#ifdef NONBE_FIX_907_VLBR_DIRAC_BAND_MAPPING + Word32 P_quant_re_prior[SPAR_DIRAC_SPLIT_START_BAND][FOA_CHANNELS - 1]; +#endif /*extra 16 bits for arithmetic coder as overshoot check is after a symbol is written*/ md_indices_allocated = add( hMdEnc->spar_md_cfg.max_bits_per_blk, IVAS_SPAR_ARITH_OVERSHOOT_BITS ); @@ -612,6 +615,17 @@ ivas_error ivas_spar_md_enc_process_fx( } } } + +#ifdef NONBE_FIX_907_VLBR_DIRAC_BAND_MAPPING + if ( hEncoderConfig->ivas_total_brate < IVAS_24k4 ) + { + for ( b = 0; b < num_bands * bands_bw; b++ ) + { + Copy32( hMdEnc->spar_md.band_coeffs[b].P_quant_re_fx, P_quant_re_prior[b], FOA_CHANNELS - 1 ); + } + } +#endif + ivas_compute_spar_params_enc_fx( cov_real_fx, cov_real_q, dm_fv_re_fx, &q_dm_fv_re, 0, hMdEnc->mixer_mat_fx, &hMdEnc->q_mixer_mat_fx, 0, nB, dtx_vad, num_ch, bands_bw, active_w, active_w_vlbr, &hMdEnc->spar_md_cfg, &hMdEnc->spar_md, Wscale_fx, q_Wscale, 0, dyn_active_w_flag ); IF( dirac_mono_flag ) @@ -946,6 +960,18 @@ ivas_error ivas_spar_md_enc_process_fx( move16(); } /* Reuse mixer matrix values for unsent bands */ +#ifdef NONBE_FIX_907_VLBR_DIRAC_BAND_MAPPING + IF( hEncoderConfig->ivas_total_brate < IVAS_24k4 ) + { + FOR( k = num_bands - 1; k >= 0; k-- ) + { + FOR( b = bands_bw - 1; b >= 0; b-- ) + { + Copy32( hMdEnc->spar_md.band_coeffs[k].P_quant_re_fx, hMdEnc->spar_md.band_coeffs[bands_bw * k + b].P_quant_re_fx, FOA_CHANNELS - 1 ); + } + } + } +#endif test(); IF( ( LT_32( hEncoderConfig->ivas_total_brate, IVAS_24k4 ) ) && GT_16( code_strat, 3 ) ) { @@ -966,6 +992,10 @@ ivas_error ivas_spar_md_enc_process_fx( move32(); } } +#ifdef NONBE_FIX_907_VLBR_DIRAC_BAND_MAPPING + Copy32( P_quant_re_prior[b], hMdEnc->spar_md.band_coeffs[b].P_quant_re_fx, FOA_CHANNELS - 1 ); + Copy32( P_quant_re_prior[b + 1], hMdEnc->spar_md.band_coeffs[b + 1].P_quant_re_fx, FOA_CHANNELS - 1 ); +#endif } } -- GitLab From e7bab8bf1368d089484bdf5315ec631511fa962c Mon Sep 17 00:00:00 2001 From: rtyag Date: Mon, 31 Mar 2025 14:49:08 +1100 Subject: [PATCH 2/3] copy prior frame q factor for P coeffs --- lib_enc/ivas_spar_md_enc_fx.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/lib_enc/ivas_spar_md_enc_fx.c b/lib_enc/ivas_spar_md_enc_fx.c index 6b3921afb..83cb25990 100644 --- a/lib_enc/ivas_spar_md_enc_fx.c +++ b/lib_enc/ivas_spar_md_enc_fx.c @@ -488,6 +488,7 @@ ivas_error ivas_spar_md_enc_process_fx( Word16 q_Wscale[IVAS_MAX_NUM_BANDS]; #ifdef NONBE_FIX_907_VLBR_DIRAC_BAND_MAPPING Word32 P_quant_re_prior[SPAR_DIRAC_SPLIT_START_BAND][FOA_CHANNELS - 1]; + Word16 Q_P_quant_re_prior[SPAR_DIRAC_SPLIT_START_BAND]; #endif /*extra 16 bits for arithmetic coder as overshoot check is after a symbol is written*/ @@ -617,11 +618,12 @@ ivas_error ivas_spar_md_enc_process_fx( } #ifdef NONBE_FIX_907_VLBR_DIRAC_BAND_MAPPING - if ( hEncoderConfig->ivas_total_brate < IVAS_24k4 ) + IF( LT_32( hEncoderConfig->ivas_total_brate, IVAS_24k4 ) ) { - for ( b = 0; b < num_bands * bands_bw; b++ ) + FOR( b = 0; b < i_mult( num_bands, bands_bw ); b++ ) { - Copy32( hMdEnc->spar_md.band_coeffs[b].P_quant_re_fx, P_quant_re_prior[b], FOA_CHANNELS - 1 ); + Copy32( hMdEnc->spar_md.band_coeffs[b].P_quant_re_fx, P_quant_re_prior[b], sub( FOA_CHANNELS, 1 ) ); + Q_P_quant_re_prior[b] = hMdEnc->spar_md.band_coeffs[b].q_P_re_fx; } } #endif @@ -961,13 +963,15 @@ ivas_error ivas_spar_md_enc_process_fx( } /* Reuse mixer matrix values for unsent bands */ #ifdef NONBE_FIX_907_VLBR_DIRAC_BAND_MAPPING - IF( hEncoderConfig->ivas_total_brate < IVAS_24k4 ) + IF( LT_32( hEncoderConfig->ivas_total_brate, IVAS_24k4 ) ) { FOR( k = num_bands - 1; k >= 0; k-- ) { FOR( b = bands_bw - 1; b >= 0; b-- ) { - Copy32( hMdEnc->spar_md.band_coeffs[k].P_quant_re_fx, hMdEnc->spar_md.band_coeffs[bands_bw * k + b].P_quant_re_fx, FOA_CHANNELS - 1 ); + Copy32( hMdEnc->spar_md.band_coeffs[k].P_quant_re_fx, hMdEnc->spar_md.band_coeffs[add( i_mult( bands_bw, k ), b )].P_quant_re_fx, sub( FOA_CHANNELS, 1 ) ); + hMdEnc->spar_md.band_coeffs[add( i_mult( bands_bw, k ), b )].q_P_re_fx = hMdEnc->spar_md.band_coeffs[k].q_P_re_fx; + move16(); } } } @@ -993,8 +997,12 @@ ivas_error ivas_spar_md_enc_process_fx( } } #ifdef NONBE_FIX_907_VLBR_DIRAC_BAND_MAPPING - Copy32( P_quant_re_prior[b], hMdEnc->spar_md.band_coeffs[b].P_quant_re_fx, FOA_CHANNELS - 1 ); - Copy32( P_quant_re_prior[b + 1], hMdEnc->spar_md.band_coeffs[b + 1].P_quant_re_fx, FOA_CHANNELS - 1 ); + Copy32( P_quant_re_prior[b], hMdEnc->spar_md.band_coeffs[b].P_quant_re_fx, sub( FOA_CHANNELS, 1 ) ); + Copy32( P_quant_re_prior[b + 1], hMdEnc->spar_md.band_coeffs[b + 1].P_quant_re_fx, sub( FOA_CHANNELS, 1 ) ); + hMdEnc->spar_md.band_coeffs[b].q_P_re_fx = Q_P_quant_re_prior[b]; + hMdEnc->spar_md.band_coeffs[b + 1].q_P_re_fx = Q_P_quant_re_prior[b + 1]; + move16(); + move16(); #endif } } -- GitLab From 2f7f54002e705adf171c60d347fea4a7ad43a2c0 Mon Sep 17 00:00:00 2001 From: rtyag Date: Mon, 31 Mar 2025 16:29:55 +1100 Subject: [PATCH 3/3] update cmake version --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index adc86288c..e9a9afe76 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,7 +29,7 @@ # cmake --build . --config Release -cmake_minimum_required(VERSION 3.1) +cmake_minimum_required(VERSION 3.10) set(CMAKE_C_STANDARD 99) @@ -121,7 +121,7 @@ if(WMOPS) add_definitions("-DWMOPS=1") endif() -project(stereo-evs) +project(stereo-evs LANGUAGES C) set_property(GLOBAL PROPERTY USE_FOLDERS ON) # make Visual Studio projects look nicer include(CTest) -- GitLab