From 5c260121d96eea6c9316eb85d3b9ec4426496d61 Mon Sep 17 00:00:00 2001 From: knj Date: Mon, 19 Sep 2022 15:16:49 +0200 Subject: [PATCH 1/8] mechanically unify SID frame rate BE for non-DTX modes, DTX modes still broken --- lib_com/bitstream.c | 10 +++++++ lib_com/ivas_cnst.h | 10 ++++++- lib_com/ivas_dirac_com.c | 12 ++++++++ lib_com/ivas_rom_com.c | 4 +++ lib_com/ivas_spar_com.c | 12 ++++++++ lib_com/ivas_stereo_dft_com.c | 4 +++ lib_com/ivas_tools.c | 4 +++ lib_com/options.h | 1 + lib_dec/acelp_core_dec.c | 4 +++ lib_dec/core_switching_dec.c | 4 +++ lib_dec/fd_cng_dec.c | 4 +++ lib_dec/ivas_cpe_dec.c | 40 +++++++++++++++++++++++++++ lib_dec/ivas_dec.c | 11 ++++++-- lib_dec/ivas_dirac_dec.c | 32 +++++++++++++++++++++ lib_dec/ivas_init_dec.c | 20 ++++++++++++++ lib_dec/ivas_ism_metadata_dec.c | 9 ++++++ lib_dec/ivas_ism_param_dec.c | 8 ++++++ lib_dec/ivas_masa_dec.c | 32 +++++++++++++++++++++ lib_dec/ivas_output_init.c | 4 +++ lib_dec/ivas_qmetadata_dec.c | 12 ++++++++ lib_dec/ivas_sba_dec.c | 11 ++++++-- lib_dec/ivas_sce_dec.c | 12 ++++++++ lib_dec/ivas_spar_decoder.c | 12 ++++++++ lib_dec/ivas_spar_md_dec.c | 4 +++ lib_dec/ivas_stereo_cng_dec.c | 16 +++++++++++ lib_dec/ivas_stereo_dft_dec.c | 40 +++++++++++++++++++++++++++ lib_dec/ivas_stereo_mdct_stereo_dec.c | 22 ++++++++++++++- lib_dec/ivas_stereo_switching_dec.c | 24 ++++++++++++++++ lib_dec/lib_dec.c | 4 +++ lib_enc/ivas_cpe_enc.c | 8 ++++++ lib_enc/ivas_ism_enc.c | 4 +++ lib_enc/ivas_qmetadata_enc.c | 16 +++++++++++ lib_enc/ivas_stereo_cng_enc.c | 4 +++ lib_enc/ivas_stereo_dft_enc.c | 8 ++++++ 34 files changed, 416 insertions(+), 6 deletions(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index 761ad816bd..d774c4eff7 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -1820,7 +1820,11 @@ ivas_error preview_indices( break; } } +#ifdef ALIGN_SID_SIZE + else if ( total_brate == IVAS_SID_5k2 ) +#else else if ( total_brate == IVAS_SID_4k4 ) +#endif { /* read SID format */ st_ivas->sid_format = 0; @@ -1884,6 +1888,7 @@ ivas_error preview_indices( return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Invalid value %c found in SID format field.", st_ivas->sid_format ); } } +#ifndef ALIGN_SID_SIZE else if ( total_brate == IVAS_SID_5k ) { /* SBA SID frame */ @@ -1892,6 +1897,7 @@ ivas_error preview_indices( st_ivas->sba_mode = SBA_MODE_SPAR; st_ivas->element_mode_init = IVAS_SCE; } +#endif /* only read element mode from active frames */ if ( is_DTXrate( total_brate ) == 0 ) @@ -2063,6 +2069,9 @@ ivas_error read_indices( } else if ( k == SIZE_IVAS_BRATE_TBL ) { +#ifdef ALIGN_SID_SIZE + return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error, illegal bitrate (%d) in the G.192 frame ! Exiting ! \n", total_brate ); +#else /*temp change for SPAR DTX*/ if ( total_brate == IVAS_SID_5k ) { @@ -2072,6 +2081,7 @@ ivas_error read_indices( { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Error, illegal bitrate (%d) in the G.192 frame ! Exiting ! \n", total_brate ); } +#endif } else { diff --git a/lib_com/ivas_cnst.h b/lib_com/ivas_cnst.h index 29416d2c50..df7a2d076d 100644 --- a/lib_com/ivas_cnst.h +++ b/lib_com/ivas_cnst.h @@ -195,9 +195,12 @@ typedef enum /*----------------------------------------------------------------------------------* * IVAS Bitrates *----------------------------------------------------------------------------------*/ - +#ifdef ALIGN_SID_SIZE +#define IVAS_SID_5k2 5200 /* SID frame bitrate */ +#else #define IVAS_SID_4k4 4400 /* SID frame bitrate */ #define IVAS_SID_5k 5000 /* SBA SID frame bitrate */ +#endif #define IVAS_13k2 13200 #define IVAS_16k4 16400 #define IVAS_24k4 24400 @@ -215,8 +218,13 @@ typedef enum #define IVAS_BRATE_MAX IVAS_512k +#ifdef ALIGN_SID_SIZE +#define SIZE_IVAS_BRATE_TBL 16 +#define IVAS_NUM_ACTIVE_BRATES (SIZE_IVAS_BRATE_TBL - 2) +#else #define SIZE_IVAS_BRATE_TBL 17 #define IVAS_NUM_ACTIVE_BRATES (SIZE_IVAS_BRATE_TBL - 3) +#endif /*----------------------------------------------------------------------------------* * IVAS modes : IVAS SCE, IVAS CPE modes (DFT, TD, MDCT stereo) diff --git a/lib_com/ivas_dirac_com.c b/lib_com/ivas_dirac_com.c index 872c9bbba4..80ca92e18c 100644 --- a/lib_com/ivas_dirac_com.c +++ b/lib_com/ivas_dirac_com.c @@ -323,7 +323,11 @@ ivas_error ivas_dirac_sba_config( if ( sba_mode == SBA_MODE_SPAR ) { /*map the bitrate for SID frame*/ +#ifdef ALIGN_SID_SIZE + if ( sba_total_brate == IVAS_SID_5k2 ) +#else if ( sba_total_brate == IVAS_SID_5k ) +#endif { if ( *element_mode == IVAS_SCE ) { @@ -420,11 +424,19 @@ ivas_error ivas_dirac_sba_config( return error; } +#ifdef ALIGN_SID_SIZE + if ( sba_total_brate > IVAS_SID_5k2 ) +#else if ( sba_total_brate > IVAS_SID_4k4 ) +#endif { *nchan_transport = ivas_dirac_getNumTransportChannels( sba_total_brate, sba_order, sba_planar ); } +#ifdef ALIGN_SID_SIZE + else if ( sba_total_brate == IVAS_SID_5k2 ) +#else else if ( sba_total_brate == IVAS_SID_4k4 ) +#endif { switch ( *element_mode ) { diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index 4ab1a1d927..4a82259296 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -49,7 +49,11 @@ const int32_t ivas_brate_tbl[SIZE_IVAS_BRATE_TBL] = { +#ifdef ALIGN_SID_SIZE + FRAME_NO_DATA, IVAS_SID_5k2, +#else FRAME_NO_DATA, IVAS_SID_4k4, IVAS_SID_5k, +#endif IVAS_13k2, IVAS_16k4, IVAS_24k4, IVAS_32k, IVAS_48k, IVAS_64k, IVAS_80k, IVAS_96k, IVAS_128k, IVAS_160k, IVAS_192k, IVAS_256k, IVAS_384k, IVAS_512k diff --git a/lib_com/ivas_spar_com.c b/lib_com/ivas_spar_com.c index 46f6b3dc41..4955f9f9e2 100644 --- a/lib_com/ivas_spar_com.c +++ b/lib_com/ivas_spar_com.c @@ -311,7 +311,11 @@ void ivas_spar_config( const int16_t sid_format /* i : IVAS format indicator from SID frame */ ) { +#ifdef ALIGN_SID_SIZE + if ( ivas_total_brate == IVAS_SID_5k2 ) +#else if ( ivas_total_brate == IVAS_SID_5k ) +#endif { if ( sid_format == SID_SBA_1TC ) { @@ -333,7 +337,11 @@ void ivas_spar_config( if ( *nchan_transport == 1 ) { /* map SPAR SID bitrate to SPAR active bitrate */ +#ifdef ALIGN_SID_SIZE + if ( ivas_total_brate == IVAS_SID_5k2 ) +#else if ( ivas_total_brate == IVAS_SID_5k ) +#endif { ivas_total_brate = IVAS_32k; } @@ -422,7 +430,11 @@ int16_t ivas_get_spar_num_TCs( { int16_t table_idx, nchan_transport; +#ifdef ALIGN_SID_SIZE + if ( ivas_total_brate == IVAS_SID_5k2 ) +#else if ( ivas_total_brate == IVAS_SID_5k ) +#endif { nchan_transport = 1; } diff --git a/lib_com/ivas_stereo_dft_com.c b/lib_com/ivas_stereo_dft_com.c index 918fd27b35..7de3144f63 100644 --- a/lib_com/ivas_stereo_dft_com.c +++ b/lib_com/ivas_stereo_dft_com.c @@ -82,7 +82,11 @@ void stereo_dft_config( hConfig->res_cod_mode = STEREO_DFT_RES_COD_OFF; } } +#ifdef ALIGN_SID_SIZE + else if ( brate == IVAS_SID_5k2 ) +#else else if ( brate == IVAS_SID_4k4 ) +#endif { *bits_frame_nominal = SID_2k40 / FRAMES_PER_SEC; if ( hConfig != NULL ) diff --git a/lib_com/ivas_tools.c b/lib_com/ivas_tools.c index 079af159bc..6b0c0eb297 100644 --- a/lib_com/ivas_tools.c +++ b/lib_com/ivas_tools.c @@ -1172,8 +1172,12 @@ int16_t is_SIDrate( if ( ( ivas_total_brate == SID_1k75 ) || ( ivas_total_brate == SID_2k40 ) || +#ifdef ALIGN_SID_SIZE + ( ivas_total_brate == IVAS_SID_5k2 ) ) +#else ( ivas_total_brate == IVAS_SID_4k4 ) || ( ivas_total_brate == IVAS_SID_5k ) ) +#endif { sid_rate_flag = 1; } diff --git a/lib_com/options.h b/lib_com/options.h index 54d2700014..9926a5438f 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -150,6 +150,7 @@ #define SBA_INTERN_CONFIG_FIX_HOA2 /* Issue 99 : Fix for incorrect internal_config when output format is HOA2 or FOA*/ #define FIX_I98_HANDLES_TO_NULL /* Issue 98: do the setting of all handles to NULL in one place */ +#define ALIGN_SID_SIZE /* Issue 111: make all DTX modes use one SID frame bitrate (5.2 kbps) */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/acelp_core_dec.c b/lib_dec/acelp_core_dec.c index 7951f10d54..5c601c5825 100644 --- a/lib_dec/acelp_core_dec.c +++ b/lib_dec/acelp_core_dec.c @@ -125,7 +125,11 @@ ivas_error acelp_core_dec( error = IVAS_ERR_OK; +#ifdef ALIGN_SID_SIZE + if ( st->element_mode == IVAS_CPE_MDCT && nchan_out == 1 && st->idchan == 1 && last_element_brate <= IVAS_SID_5k2 ) +#else if ( st->element_mode == IVAS_CPE_MDCT && nchan_out == 1 && st->idchan == 1 && last_element_brate <= IVAS_SID_4k4 ) +#endif { /* In MDCT-Stereo DTX with mono output, we can skip CNG for the second channel, except for the first inactive frame following an active period */ return error; diff --git a/lib_dec/core_switching_dec.c b/lib_dec/core_switching_dec.c index 61537f76e3..e8c74bc2ef 100644 --- a/lib_dec/core_switching_dec.c +++ b/lib_dec/core_switching_dec.c @@ -1048,7 +1048,11 @@ void bw_switching_pre_proc( if ( st->element_mode > EVS_MONO ) { +#ifdef ALIGN_SID_SIZE + if ( st->core == ACELP_CORE && !( st->bfi == 1 && st->con_tcx == 1 ) && st->hBWE_FD != NULL && !( st->core_brate <= SID_2k40 && st->element_mode == IVAS_CPE_DFT && nchan_out == 2 ) && !( st->element_mode == IVAS_CPE_MDCT && nchan_out == 1 && st->idchan == 1 && last_element_brate <= IVAS_SID_5k2 ) ) +#else if ( st->core == ACELP_CORE && !( st->bfi == 1 && st->con_tcx == 1 ) && st->hBWE_FD != NULL && !( st->core_brate <= SID_2k40 && st->element_mode == IVAS_CPE_DFT && nchan_out == 2 ) && !( st->element_mode == IVAS_CPE_MDCT && nchan_out == 1 && st->idchan == 1 && last_element_brate <= IVAS_SID_4k4 ) ) +#endif { /* Calculate tilt of the ACELP core synthesis - needed in SWB BWE decoding */ calc_tilt_bwe( old_syn_12k8_16k, &st->tilt_wb, st->L_frame ); diff --git a/lib_dec/fd_cng_dec.c b/lib_dec/fd_cng_dec.c index 4f0e8574f0..ead5efa10f 100644 --- a/lib_dec/fd_cng_dec.c +++ b/lib_dec/fd_cng_dec.c @@ -2122,7 +2122,11 @@ void FdCngDecodeMDCTStereoSID( lpc_from_spectrum( hFdCngCom, hFdCngCom->startBand, hFdCngCom->stopFFTbin, sts[ch]->preemph_fac ); } +#ifdef ALIGN_SID_SIZE + if ( hCPE->nchan_out == 1 && hCPE->last_element_brate <= IVAS_SID_5k2 ) +#else if ( hCPE->nchan_out == 1 && hCPE->last_element_brate <= IVAS_SID_4k4 ) +#endif { /* create proper M noise shape in channel zero after gains have been applied */ for ( p = 0; p < N; p++ ) diff --git a/lib_dec/ivas_cpe_dec.c b/lib_dec/ivas_cpe_dec.c index 680839e121..313e0d6172 100644 --- a/lib_dec/ivas_cpe_dec.c +++ b/lib_dec/ivas_cpe_dec.c @@ -160,14 +160,22 @@ ivas_error ivas_cpe_dec( if ( hCPE->element_mode != IVAS_CPE_MDCT && ( hCPE->element_brate != hCPE->last_element_brate || hCPE->last_element_mode != hCPE->element_mode || sts[0]->ini_frame == 0 || ( ivas_total_brate != st_ivas->hDecoderConfig->last_ivas_total_brate ) ) ) { +#ifdef ALIGN_SID_SIZE + if ( st_ivas->hQMetaData != NULL && ivas_total_brate > IVAS_SID_5k2 ) +#else if ( st_ivas->hQMetaData != NULL && ivas_total_brate > IVAS_SID_4k4 ) +#endif { stereo_dft_config( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, st_ivas->hQMetaData->bits_frame_nominal * FRAMES_PER_SEC, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); } else { /* Note: This only works for stereo operation. If DTX would be applied for multiple CPEs a different bitrate signaling is needed */ +#ifdef ALIGN_SID_SIZE + if ( ivas_total_brate <= IVAS_SID_5k2 ) +#else if ( ivas_total_brate <= IVAS_SID_4k4 ) +#endif { stereo_dft_config( hCPE->hStereoDft == NULL ? NULL : hCPE->hStereoDft->hConfig, ivas_total_brate, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); } @@ -203,7 +211,11 @@ ivas_error ivas_cpe_dec( /* Update DFT Stereo memories */ stereo_dft_dec_update( hCPE->hStereoDft, output_frame, 0 ); +#ifdef ALIGN_SID_SIZE + if ( st_ivas->ivas_format == MASA_FORMAT && ivas_total_brate <= IVAS_SID_5k2 ) +#else if ( st_ivas->ivas_format == MASA_FORMAT && ivas_total_brate <= IVAS_SID_4k4 ) +#endif { if ( ivas_total_brate == FRAME_NO_DATA ) { @@ -220,13 +232,21 @@ ivas_error ivas_cpe_dec( nb_bits = (int16_t) ( ( hCPE->element_brate ) / FRAMES_PER_SEC - 0.8f * sts[0]->bits_frame_nominal ); sts[1]->bit_stream = sts[0]->bit_stream + ivas_total_brate / FRAMES_PER_SEC - 1 - nb_bits_metadata; +#ifdef ALIGN_SID_SIZE + if ( ivas_total_brate == IVAS_SID_5k2 ) +#else if ( ivas_total_brate == IVAS_SID_4k4 ) +#endif { nb_bits -= SID_FORMAT_NBITS; sts[1]->bit_stream -= SID_FORMAT_NBITS; } +#ifdef ALIGN_SID_SIZE + if ( st_ivas->ivas_format == MASA_FORMAT && ivas_total_brate < MASA_STEREO_MIN_BITRATE && ivas_total_brate > IVAS_SID_5k2 ) +#else if ( st_ivas->ivas_format == MASA_FORMAT && ivas_total_brate < MASA_STEREO_MIN_BITRATE && ivas_total_brate > IVAS_SID_4k4 ) +#endif { sts[0]->total_brate = hCPE->element_brate; /* Only mono downmix was transmitted in this case */ } @@ -266,7 +286,11 @@ ivas_error ivas_cpe_dec( /* this is just for initialization, the true values of "total_brate" and "bits_frame_channel" are set later */ for ( n = 0; n < n_channels; n++ ) { +#ifdef ALIGN_SID_SIZE + if ( ivas_total_brate == IVAS_SID_5k2 ) +#else if ( ivas_total_brate == IVAS_SID_4k4 || ivas_total_brate == IVAS_SID_5k ) +#endif { sts[n]->total_brate = SID_2k40; @@ -283,7 +307,11 @@ ivas_error ivas_cpe_dec( if ( !st_ivas->hMCT ) { +#ifdef ALIGN_SID_SIZE + if ( st_ivas->ivas_format == SBA_FORMAT && ivas_total_brate == IVAS_SID_5k2 ) +#else if ( st_ivas->ivas_format == SBA_FORMAT && ivas_total_brate == IVAS_SID_5k ) +#endif { for ( n = 0; n < n_channels; n++ ) { @@ -587,7 +615,11 @@ ivas_error create_cpe_dec( hCPE->nchan_out = min( CPE_CHANNELS, st_ivas->hDecoderConfig->nchan_out ); } +#ifdef ALIGN_SID_SIZE + if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_SID_5k2 ) +#else if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_SID_4k4 ) +#endif { hCPE->nchan_out = 1; } @@ -923,7 +955,11 @@ static void read_stereo_mode_and_bwidth( * BFI or NO_DATA frame: Use stereo parameters from last (active) frame *-----------------------------------------------------------------*/ +#ifdef ALIGN_SID_SIZE + if ( st_ivas->bfi || st_ivas->hDecoderConfig->ivas_total_brate < IVAS_SID_5k2 ) +#else if ( st_ivas->bfi || st_ivas->hDecoderConfig->ivas_total_brate < IVAS_SID_4k4 ) +#endif { hCPE->element_mode = hCPE->last_element_mode; @@ -933,7 +969,11 @@ static void read_stereo_mode_and_bwidth( * SID frame: get element mode from SID side info *-----------------------------------------------------------------*/ +#ifdef ALIGN_SID_SIZE + else if ( st_ivas->hDecoderConfig->ivas_total_brate == IVAS_SID_5k2 ) +#else else if ( st_ivas->hDecoderConfig->ivas_total_brate == IVAS_SID_4k4 || st_ivas->hDecoderConfig->ivas_total_brate == IVAS_SID_5k ) +#endif { switch ( st_ivas->sid_format ) { diff --git a/lib_dec/ivas_dec.c b/lib_dec/ivas_dec.c index 22f841728e..ff6df585ef 100644 --- a/lib_dec/ivas_dec.c +++ b/lib_dec/ivas_dec.c @@ -290,8 +290,11 @@ ivas_error ivas_dec( nchan_remapped = CPE_CHANNELS; ivas_sba_dirac_stereo_dec( st_ivas, output, output_frame ); } - else if ( st_ivas->ivas_format == MASA_FORMAT && ivas_total_brate < MASA_STEREO_MIN_BITRATE && - ( ivas_total_brate > IVAS_SID_4k4 || ( ivas_total_brate <= IVAS_SID_4k4 && st_ivas->nCPE > 0 && st_ivas->hCPE[0]->nchan_out == 1 ) ) ) +#ifdef ALIGN_SID_SIZE + else if ( st_ivas->ivas_format == MASA_FORMAT && ivas_total_brate < MASA_STEREO_MIN_BITRATE && ( ivas_total_brate > IVAS_SID_5k2 || ( ivas_total_brate <= IVAS_SID_5k2 && st_ivas->nCPE > 0 && st_ivas->hCPE[0]->nchan_out == 1 ) ) ) +#else + else if ( st_ivas->ivas_format == MASA_FORMAT && ivas_total_brate < MASA_STEREO_MIN_BITRATE && ( ivas_total_brate > IVAS_SID_4k4 || ( ivas_total_brate <= IVAS_SID_4k4 && st_ivas->nCPE > 0 && st_ivas->hCPE[0]->nchan_out == 1 ) ) ) +#endif { nchan_remapped = 1; /* Only one channel transported */ } @@ -575,7 +578,11 @@ ivas_error ivas_dec( st_ivas->ini_frame++; } +#ifdef ALIGN_SID_SIZE + if ( st_ivas->ini_active_frame < MAX_FRAME_COUNTER && !( st_ivas->bfi && st_ivas->ini_frame == 0 ) && ivas_total_brate > IVAS_SID_5k2 ) /* needed in MASA decoder in case the first active frame is BFI, and there were SID-frames decoded before */ +#else if ( st_ivas->ini_active_frame < MAX_FRAME_COUNTER && !( st_ivas->bfi && st_ivas->ini_frame == 0 ) && ivas_total_brate > IVAS_SID_4k4 ) /* needed in MASA decoder in case the first active frame is BFI, and there were SID-frames decoded before */ +#endif { st_ivas->ini_active_frame++; } diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 8dd47fe774..f3992e8677 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -190,7 +190,11 @@ ivas_error ivas_dirac_dec_config( } nchan_transport = st_ivas->nchan_transport; +#ifdef ALIGN_SID_SIZE + if ( st_ivas->ivas_format == MASA_FORMAT && ivas_total_brate < MASA_STEREO_MIN_BITRATE && ivas_total_brate > IVAS_SID_5k2 ) +#else if ( st_ivas->ivas_format == MASA_FORMAT && ivas_total_brate < MASA_STEREO_MIN_BITRATE && ivas_total_brate > IVAS_SID_4k4 ) +#endif { nchan_transport = 1; } @@ -1280,7 +1284,11 @@ void ivas_dirac_dec_read_BS( int16_t next_bit_pos_orig; *nb_bits = 0; +#ifdef ALIGN_SID_SIZE + if ( !st->bfi && ivas_total_brate > IVAS_SID_5k2 ) +#else if ( !st->bfi && ivas_total_brate > IVAS_SID_4k4 ) +#endif { next_bit_pos_orig = st->next_bit_pos; st->next_bit_pos = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC - 1 ); @@ -1291,7 +1299,11 @@ void ivas_dirac_dec_read_BS( if ( sba_mode == SBA_MODE_SPAR ) { +#ifdef ALIGN_SID_SIZE + if ( ivas_total_brate == IVAS_SID_5k2 ) +#else if ( ivas_total_brate == IVAS_SID_5k ) +#endif { b = 1; } @@ -1384,7 +1396,11 @@ void ivas_dirac_dec_read_BS( st->next_bit_pos = next_bit_pos_orig; } +#ifdef ALIGN_SID_SIZE + else if ( !st->bfi && ivas_total_brate == IVAS_SID_5k2 ) +#else else if ( !st->bfi && ivas_total_brate == IVAS_SID_4k4 ) +#endif { next_bit_pos_orig = st->next_bit_pos; @@ -1451,7 +1467,11 @@ void ivas_qmetadata_to_dirac( q_direction = &( hQMetaData->q_direction[0] ); hDirAC->numSimultaneousDirections = hQMetaData->no_directions; +#ifdef ALIGN_SID_SIZE + if ( hMasa != NULL && ivas_total_brate > IVAS_SID_5k2 ) +#else if ( hMasa != NULL && ivas_total_brate > IVAS_SID_4k4 ) +#endif { band_mapping = hMasa->data.band_mapping; @@ -1527,7 +1547,11 @@ void ivas_qmetadata_to_dirac( nbands = hDirAC->band_grouping[hDirAC->hConfig->nbands]; band_grouping = hDirAC->band_grouping; +#ifdef ALIGN_SID_SIZE + if ( ivas_total_brate <= IVAS_SID_5k2 && sba_mode != SBA_MODE_SPAR ) +#else if ( ivas_total_brate <= IVAS_SID_4k4 && sba_mode != SBA_MODE_SPAR ) +#endif { /* SID/zero-frame: 1 direction, 5 bands, nblocks re-generated out of SID decoder*/ start_band = 0; @@ -1623,7 +1647,11 @@ void ivas_qmetadata_to_dirac( ele = min( 90, ele ); ele = max( -90, ele ); +#ifdef ALIGN_SID_SIZE + if ( ivas_total_brate > IVAS_SID_5k2 && q_direction->coherence_band_data != NULL ) +#else if ( ivas_total_brate > IVAS_SID_4k4 && q_direction->coherence_band_data != NULL ) +#endif { hDirAC->spreadCoherence[tmp_write_idx_band][b] = q_direction->coherence_band_data[qBand_idx].spread_coherence[block] / 255.0f; } @@ -1632,7 +1660,11 @@ void ivas_qmetadata_to_dirac( hDirAC->spreadCoherence[tmp_write_idx_band][b] = 0.0f; } +#ifdef ALIGN_SID_SIZE + if ( ivas_total_brate > IVAS_SID_5k2 && q_direction->coherence_band_data != NULL ) +#else if ( ivas_total_brate > IVAS_SID_4k4 && q_direction->coherence_band_data != NULL ) +#endif { hDirAC->surroundingCoherence[tmp_write_idx_band][b] = hQMetaData->surcoh_band_data[qBand_idx].surround_coherence[0] / 255.0f; } diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 87b48cd0d8..d32e362562 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -126,7 +126,11 @@ ivas_error ivas_dec_setup( st_ivas->sba_analysis_order = ivas_sba_get_analysis_order( ivas_total_brate, st_ivas->sba_order ); num_bits_read += SBA_ORDER_BITS; +#ifdef ALIGN_SID_SIZE + if ( st_ivas->ini_frame > 0 && ivas_total_brate != st_ivas->hDecoderConfig->last_ivas_total_brate && ivas_total_brate > IVAS_SID_5k2 ) +#else if ( st_ivas->ini_frame > 0 && ivas_total_brate != st_ivas->hDecoderConfig->last_ivas_total_brate && ivas_total_brate > IVAS_SID_4k4 ) +#endif { if ( ( error = ivas_sba_dec_reconfigure( st_ivas ) ) != IVAS_ERR_OK ) { @@ -154,7 +158,11 @@ ivas_error ivas_dec_setup( if ( st_ivas->ini_frame > 0 ) { /* reconfigure in case a change of operation mode is detected */ +#ifdef ALIGN_SID_SIZE + if ( ( ivas_total_brate > IVAS_SID_5k2 && ivas_total_brate != st_ivas->hDecoderConfig->last_ivas_total_brate ) || ( st_ivas->ini_active_frame == 0 ) ) +#else if ( ( ivas_total_brate > IVAS_SID_4k4 && ivas_total_brate != st_ivas->hDecoderConfig->last_ivas_total_brate ) || ( st_ivas->ini_active_frame == 0 ) ) +#endif { if ( st_ivas->ini_active_frame == 0 && ivas_total_brate != FRAME_NO_DATA && ivas_total_brate < MASA_STEREO_MIN_BITRATE && st_ivas->nCPE == 1 ) { @@ -213,7 +221,11 @@ ivas_error ivas_dec_setup( } } } +#ifdef ALIGN_SID_SIZE + else if ( ivas_total_brate == IVAS_SID_5k2 ) +#else else if ( ivas_total_brate == IVAS_SID_4k4 || ivas_total_brate == IVAS_SID_5k ) +#endif { switch ( st_ivas->sid_format ) { @@ -349,7 +361,11 @@ static ivas_error ivas_read_format( break; } } +#ifdef ALIGN_SID_SIZE + else if ( !st_ivas->bfi && ivas_total_brate == IVAS_SID_5k2 ) +#else else if ( !st_ivas->bfi && ivas_total_brate == IVAS_SID_4k4 ) +#endif { /* read IVAS format in SID frame */ idx = 0; @@ -406,7 +422,11 @@ static ivas_error ivas_read_format( st_ivas->bit_stream += ( *num_bits_read ); ( *num_bits_read ) = 0; } +#ifdef ALIGN_SID_SIZE + else if ( !st_ivas->bfi && ivas_total_brate == IVAS_SID_5k2 ) +#else else if ( !st_ivas->bfi && ivas_total_brate == IVAS_SID_5k ) +#endif { int16_t tc_mode_offset; tc_mode_offset = ( int16_t )( ivas_total_brate / FRAMES_PER_SEC - 1 ); diff --git a/lib_dec/ivas_ism_metadata_dec.c b/lib_dec/ivas_ism_metadata_dec.c index 9d940705f3..c8ce447875 100644 --- a/lib_dec/ivas_ism_metadata_dec.c +++ b/lib_dec/ivas_ism_metadata_dec.c @@ -78,7 +78,11 @@ ivas_error ivas_ism_metadata_dec( wmops_sub_start( "ism_meta_dec" ); +#ifdef ALIGN_SID_SIZE + if ( ism_total_brate == IVAS_SID_5k2 || ism_total_brate == FRAME_NO_DATA ) +#else if ( ism_total_brate == IVAS_SID_4k4 || ism_total_brate == FRAME_NO_DATA ) +#endif { /* no metadata decoding in CNG */ for ( ch = 0; ch < *nchan_transport; ch++ ) @@ -87,7 +91,12 @@ ivas_error ivas_ism_metadata_dec( } /* set padding bits as metadata bits to keep later bitrate checks valid */ +#ifdef ALIGN_SID_SIZE + /* TODO: include padding bits here? */ + nb_bits_metadata[0] = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC; +#else nb_bits_metadata[0] = ( IVAS_SID_4k4 - SID_2k40 ) / FRAMES_PER_SEC; +#endif #ifdef DEBUGGING /* sanity check */ diff --git a/lib_dec/ivas_ism_param_dec.c b/lib_dec/ivas_ism_param_dec.c index 108d406845..d394c3c729 100644 --- a/lib_dec/ivas_ism_param_dec.c +++ b/lib_dec/ivas_ism_param_dec.c @@ -1027,7 +1027,11 @@ ivas_error ivas_ism_dec_config( /* store last frame ISM mode */ last_ism_mode = st_ivas->ism_mode; +#ifdef ALIGN_SID_SIZE + if ( !st_ivas->bfi && ivas_total_brate != IVAS_SID_5k2 && ivas_total_brate != FRAME_NO_DATA ) +#else if ( !st_ivas->bfi && ivas_total_brate != IVAS_SID_4k4 && ivas_total_brate != FRAME_NO_DATA ) +#endif { /* select ISM format mode */ st_ivas->ism_mode = ivas_ism_mode_select( num_obj, ivas_total_brate ); @@ -1052,7 +1056,11 @@ ivas_error ivas_ism_dec_config( } } } +#ifdef ALIGN_SID_SIZE + else if ( !st_ivas->bfi && ivas_total_brate == IVAS_SID_5k2 ) +#else else if ( !st_ivas->bfi && ivas_total_brate == IVAS_SID_4k4 ) +#endif { st_ivas->nchan_transport = num_obj; } diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 91b79a614e..b4aa18f2a1 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -115,7 +115,11 @@ ivas_error ivas_masa_decode( *nb_bits_read = 0; next_bit_pos_orig = st->next_bit_pos; +#ifdef ALIGN_SID_SIZE + if ( masa_brate == IVAS_SID_5k2 ) +#else if ( masa_brate == IVAS_SID_4k4 ) +#endif { st->next_bit_pos = (int16_t) ( ( masa_brate / FRAMES_PER_SEC ) - 1 - SID_FORMAT_NBITS ); } @@ -124,7 +128,11 @@ ivas_error ivas_masa_decode( st->next_bit_pos = (int16_t) ( ( masa_brate / FRAMES_PER_SEC ) - 1 ); } +#ifdef ALIGN_SID_SIZE + if ( !st->bfi && ivas_total_brate > IVAS_SID_5k2 ) +#else if ( !st->bfi && ivas_total_brate > IVAS_SID_4k4 ) +#endif { if ( !( ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA ) ) { @@ -216,7 +224,11 @@ ivas_error ivas_masa_decode( replicate_subframes( hQMetaData ); } } +#ifdef ALIGN_SID_SIZE + else if ( !st->bfi && ivas_format == MASA_FORMAT && ivas_total_brate == IVAS_SID_5k2 ) +#else else if ( !st->bfi && ivas_format == MASA_FORMAT && ivas_total_brate == IVAS_SID_4k4 ) +#endif { if ( hQMetaData->q_direction == NULL ) { @@ -229,7 +241,11 @@ ivas_error ivas_masa_decode( ivas_masa_set_elements( ivas_total_brate, st_ivas->mc_mode, st_ivas->nchan_transport, hQMetaData, &st_ivas->element_mode_init, &st_ivas->nSCE, &st_ivas->nCPE ); +#ifdef ALIGN_SID_SIZE + hQMetaData->metadata_max_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC; +#else hQMetaData->metadata_max_bits = ( IVAS_SID_4k4 - SID_2k40 ) / FRAMES_PER_SEC; +#endif if ( ( error = ivas_qmetadata_allocate_memory( hQMetaData, 5, 1, 0 ) ) != IVAS_ERR_OK ) { @@ -285,7 +301,11 @@ ivas_error ivas_masa_decode( { st_ivas->hCPE[0]->hStereoDft->hConfig->force_mono_transmission = ivas_total_brate < MASA_STEREO_MIN_BITRATE ? 1 : 0; +#ifdef ALIGN_SID_SIZE + if ( ivas_total_brate <= IVAS_SID_5k2 ) +#else if ( ivas_total_brate <= IVAS_SID_4k4 ) +#endif { st_ivas->hCPE[0]->hStereoDft->hConfig->force_mono_transmission = 0; } @@ -295,11 +315,19 @@ ivas_error ivas_masa_decode( { st_ivas->hCPE[0]->hCoreCoder[0]->masa_sid_format = 0; +#ifdef ALIGN_SID_SIZE + if ( st_ivas->hDecoderConfig->last_ivas_total_brate <= IVAS_SID_5k2 ) +#else if ( st_ivas->hDecoderConfig->last_ivas_total_brate <= IVAS_SID_4k4 ) +#endif { st_ivas->hCPE[0]->hCoreCoder[0]->masa_sid_format = 1; +#ifdef ALIGN_SID_SIZE + if ( ivas_total_brate >= IVAS_SID_5k2 ) +#else if ( ivas_total_brate >= IVAS_SID_4k4 ) +#endif { st_ivas->hCPE[0]->element_brate = ivas_total_brate; } @@ -479,7 +507,11 @@ void ivas_masa_prerender( const int16_t output_frame /* i : output frame length per channel */ ) { +#ifdef ALIGN_SID_SIZE + if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->nchan_transport == 2 && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_SID_5k2 ) +#else if ( st_ivas->ivas_format == MASA_FORMAT && st_ivas->nchan_transport == 2 && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_SID_4k4 ) +#endif { if ( st_ivas->hDecoderConfig->output_config == AUDIO_CONFIG_EXTERNAL ) { diff --git a/lib_dec/ivas_output_init.c b/lib_dec/ivas_output_init.c index af74b7571c..e1d96ff57d 100644 --- a/lib_dec/ivas_output_init.c +++ b/lib_dec/ivas_output_init.c @@ -530,7 +530,11 @@ void ivas_renderer_select( { *renderer_type = RENDERER_DISABLE; } +#ifdef ALIGN_SID_SIZE + else if ( ( st_ivas->ivas_format == MASA_FORMAT && output_config == AUDIO_CONFIG_MONO && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_SID_5k2 ) ) +#else else if ( ( st_ivas->ivas_format == MASA_FORMAT && output_config == AUDIO_CONFIG_MONO && st_ivas->hDecoderConfig->ivas_total_brate < MASA_STEREO_MIN_BITRATE && st_ivas->hDecoderConfig->ivas_total_brate > IVAS_SID_4k4 ) ) +#endif { *renderer_type = RENDERER_DISABLE; } diff --git a/lib_dec/ivas_qmetadata_dec.c b/lib_dec/ivas_qmetadata_dec.c index 2270d32eba..f0646759ef 100644 --- a/lib_dec/ivas_qmetadata_dec.c +++ b/lib_dec/ivas_qmetadata_dec.c @@ -721,17 +721,29 @@ int16_t ivas_qmetadata_dec_sid_decode( { if ( sba_mode == SBA_MODE_SPAR ) { +#ifdef ALIGN_SID_SIZE + metadata_sid_bits = (int16_t) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * 18 ) - 1; /* -1 for inactive mode header bit*/ +#else metadata_sid_bits = (int16_t) ( IVAS_SID_5k - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * 18 ) - 1; /* -1 for inactive mode header bit*/ +#endif } else { /* keep 13.2 and 16.4 sid bitrate as 4.4 kbps for now*/ +#ifdef ALIGN_SID_SIZE + metadata_sid_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; +#else metadata_sid_bits = ( IVAS_SID_4k4 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; +#endif } } else { +#ifdef ALIGN_SID_SIZE + metadata_sid_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; +#else metadata_sid_bits = ( IVAS_SID_4k4 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; +#endif } start_index = *index; diff --git a/lib_dec/ivas_sba_dec.c b/lib_dec/ivas_sba_dec.c index 2eebf6967a..204b91b89d 100644 --- a/lib_dec/ivas_sba_dec.c +++ b/lib_dec/ivas_sba_dec.c @@ -523,8 +523,11 @@ ivas_error ivas_sba_dec_reconfigure( } } - if ( st_ivas->renderer_type != RENDERER_DISABLE && st_ivas->renderer_type != RENDERER_SBA_LINEAR_DEC && - ( last_ivas_total_brate > IVAS_SID_4k4 || nchan_transport != nchan_transport_old ) && ( st_ivas->sba_mode != SBA_MODE_SPAR ) ) +#ifdef ALIGN_SID_SIZE + if ( st_ivas->renderer_type != RENDERER_DISABLE && st_ivas->renderer_type != RENDERER_SBA_LINEAR_DEC && ( last_ivas_total_brate > IVAS_SID_5k2 || nchan_transport != nchan_transport_old ) && ( st_ivas->sba_mode != SBA_MODE_SPAR ) ) +#else + if ( st_ivas->renderer_type != RENDERER_DISABLE && st_ivas->renderer_type != RENDERER_SBA_LINEAR_DEC && ( last_ivas_total_brate > IVAS_SID_4k4 || nchan_transport != nchan_transport_old ) && ( st_ivas->sba_mode != SBA_MODE_SPAR ) ) +#endif { if ( st_ivas->hDirAC != NULL ) { @@ -896,7 +899,11 @@ ivas_error ivas_sba_dec_reconfigure( } /* special case, if the decoder goes from 1TC DTX to 2TC active frame (in case the bitstream started with an SBA SID frame), allocate DTX memories */ +#ifdef ALIGN_SID_SIZE + if ( last_ivas_total_brate <= IVAS_SID_5k2 && st_ivas->nCPE >= 1 ) +#else if ( last_ivas_total_brate <= IVAS_SID_4k4 && st_ivas->nCPE >= 1 ) +#endif { if ( ( error = initMdctStereoDtxData( st_ivas->hCPE[0] ) ) != IVAS_ERR_OK ) { diff --git a/lib_dec/ivas_sce_dec.c b/lib_dec/ivas_sce_dec.c index 5b83a41f81..b3a73706df 100644 --- a/lib_dec/ivas_sce_dec.c +++ b/lib_dec/ivas_sce_dec.c @@ -82,7 +82,11 @@ ivas_error ivas_sce_dec( *-----------------------------------------------------------------*/ /* set total_brate - needed in DTX */ +#ifdef ALIGN_SID_SIZE + if ( !st_ivas->bfi && ( ivas_total_brate == IVAS_SID_5k2 ) ) +#else if ( !st_ivas->bfi && ( ivas_total_brate == IVAS_SID_4k4 || ivas_total_brate == IVAS_SID_5k ) ) +#endif { st->total_brate = ivas_total_brate - nb_bits_metadata * FRAMES_PER_SEC; assert( st->total_brate == SID_2k40 && "SCE SID must be 2.4kbps!" ); @@ -91,7 +95,11 @@ ivas_error ivas_sce_dec( { st->total_brate = ivas_total_brate; } +#ifdef ALIGN_SID_SIZE + else if ( !st_ivas->bfi && ( last_ivas_total_brate <= SID_2k40 || last_ivas_total_brate == IVAS_SID_5k2 ) ) +#else else if ( !st_ivas->bfi && ( last_ivas_total_brate <= SID_2k40 || last_ivas_total_brate == IVAS_SID_4k4 ) ) +#endif { st->total_brate = hSCE->element_brate - nb_bits_metadata * FRAMES_PER_SEC; } @@ -161,7 +169,11 @@ ivas_error ivas_sce_dec( } /* set "total_brate" */ +#ifdef ALIGN_SID_SIZE + if ( !st_ivas->bfi && ( ivas_total_brate == IVAS_SID_5k2 ) ) +#else if ( !st_ivas->bfi && ( ivas_total_brate == IVAS_SID_4k4 || ivas_total_brate == IVAS_SID_5k ) ) +#endif { st->total_brate = ivas_total_brate - nb_bits_metadata * FRAMES_PER_SEC; } diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index 4f48e10a09..cae7c8f27b 100644 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -628,7 +628,11 @@ static void ivas_spar_dec_MD( if ( ivas_total_brate > FRAME_NO_DATA && !bfi ) { +#ifdef ALIGN_SID_SIZE + if ( ivas_total_brate > IVAS_SID_5k2 ) +#else if ( ivas_total_brate > IVAS_SID_5k ) +#endif { ivas_parse_spar_header( hDecoderConfig->ivas_total_brate, sba_order, st0, &table_idx ); @@ -662,7 +666,11 @@ static void ivas_spar_dec_MD( * Read AGC bits *---------------------------------------------------------------------*/ +#ifdef ALIGN_SID_SIZE + if ( ivas_total_brate > IVAS_SID_5k2 && !bfi && hSpar->hMdDec->dtx_vad ) +#else if ( ivas_total_brate > IVAS_SID_5k && !bfi && hSpar->hMdDec->dtx_vad ) +#endif { hSpar->AGC_flag = get_next_indice( st0, 1 ); @@ -673,7 +681,11 @@ static void ivas_spar_dec_MD( * MD smoothing *---------------------------------------------------------------------*/ +#ifdef ALIGN_SID_SIZE + if ( st0->m_old_frame_type == ZERO_FRAME && ivas_total_brate == IVAS_SID_5k2 && st0->prev_bfi == 0 && hSpar->hMdDec->spar_md_cfg.nchan_transport == 1 ) +#else if ( st0->m_old_frame_type == ZERO_FRAME && ivas_total_brate == IVAS_SID_5k && st0->prev_bfi == 0 && hSpar->hMdDec->spar_md_cfg.nchan_transport == 1 ) +#endif { ivas_spar_setup_md_smoothing( hSpar->hMdDec, num_bands_out ); } diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index cdc6ab57a6..1929cd6aa5 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -1446,7 +1446,11 @@ static void ivas_spar_dec_parse_md_bs( if ( hMdDec->spar_md_cfg.gen_bs == 1 ) { +#ifdef ALIGN_SID_SIZE + if ( ivas_total_brate > IVAS_SID_5k2 ) +#else if ( ivas_total_brate > IVAS_SID_5k ) +#endif { if ( hMdDec->spar_md_cfg.quant_strat_bits > 0 ) { diff --git a/lib_dec/ivas_stereo_cng_dec.c b/lib_dec/ivas_stereo_cng_dec.c index 05e9222ddb..fb32bcd90c 100644 --- a/lib_dec/ivas_stereo_cng_dec.c +++ b/lib_dec/ivas_stereo_cng_dec.c @@ -90,7 +90,11 @@ void stereo_dft_dec_sid_coh( int16_t bits_tmp; int16_t b; +#ifdef ALIGN_SID_SIZE + nr_of_sid_stereo_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; +#else nr_of_sid_stereo_bits = ( IVAS_SID_4k4 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; +#endif /* If the coherence is not encoded due to lack of bits set alpha to zero which leads to that the coherence */ /* from the previous frame is used. */ @@ -653,9 +657,17 @@ void stereo_dtf_cng( hCPE->hStereoCng->nr_dft_frames++; } +#ifdef ALIGN_SID_SIZE + if ( ivas_total_brate <= IVAS_SID_5k2 ) +#else if ( ivas_total_brate <= IVAS_SID_4k4 ) +#endif { +#ifdef ALIGN_SID_SIZE + if ( hCPE->hStereoCng->nr_sid_frames < SID_INIT && ivas_total_brate == IVAS_SID_5k2 ) +#else if ( hCPE->hStereoCng->nr_sid_frames < SID_INIT && ivas_total_brate == IVAS_SID_4k4 ) +#endif { hCPE->hStereoCng->nr_sid_frames++; } @@ -707,7 +719,11 @@ void stereo_cng_dec_update( if ( hCPE->element_mode == IVAS_CPE_DFT ) { +#ifdef ALIGN_SID_SIZE + if ( ivas_total_brate == IVAS_SID_5k2 || ivas_total_brate == FRAME_NO_DATA ) +#else if ( ivas_total_brate == IVAS_SID_4k4 || ivas_total_brate == FRAME_NO_DATA ) +#endif { hCPE->hStereoCng->prev_sid_nodata = 1; } diff --git a/lib_dec/ivas_stereo_dft_dec.c b/lib_dec/ivas_stereo_dft_dec.c index 074efaa1a2..b0db814511 100644 --- a/lib_dec/ivas_stereo_dft_dec.c +++ b/lib_dec/ivas_stereo_dft_dec.c @@ -1746,7 +1746,11 @@ void stereo_dft_dec_read_BS( * Initialization *-----------------------------------------------------------------*/ +#ifdef ALIGN_SID_SIZE + if ( ivas_total_brate == IVAS_SID_5k2 ) +#else if ( ivas_total_brate == IVAS_SID_4k4 ) +#endif { if ( ivas_format == MASA_FORMAT ) { @@ -1760,7 +1764,11 @@ void stereo_dft_dec_read_BS( hStereoDft->frame_nodata = 0; hStereoDft->frame_sid_nodata = 1; hStereoDft->frame_sid = 1; +#ifdef ALIGN_SID_SIZE + *nb_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; +#else *nb_bits = ( IVAS_SID_4k4 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; +#endif } } else if ( ivas_total_brate == FRAME_NO_DATA ) @@ -1803,7 +1811,11 @@ void stereo_dft_dec_read_BS( k_offset = STEREO_DFT_OFFSET; N_div = STEREO_DFT_NBDIV; +#ifdef ALIGN_SID_SIZE + if ( ivas_total_brate > IVAS_SID_5k2 ) +#else if ( ivas_total_brate > IVAS_SID_4k4 ) +#endif { mvr2r( hStereoDft->side_gain + 2 * STEREO_DFT_BAND_MAX, sg_tmp, STEREO_DFT_BAND_MAX ); mvr2r( hStereoDft->res_pred_gain + 2 * STEREO_DFT_BAND_MAX, res_pred_gain_tmp, STEREO_DFT_BAND_MAX ); @@ -1893,7 +1905,11 @@ void stereo_dft_dec_read_BS( fprintf( pF, "ITD: %d ", hStereoDft->hConfig->itd_mode ); #endif +#ifdef ALIGN_SID_SIZE + if ( !( ivas_format == MASA_FORMAT && ivas_total_brate <= IVAS_SID_5k2 ) ) +#else if ( !( ivas_format == MASA_FORMAT && ivas_total_brate <= IVAS_SID_4k4 ) ) +#endif { /*------------------------------------------------------------------* * read Side gains @@ -1974,7 +1990,11 @@ void stereo_dft_dec_read_BS( #endif } } +#ifdef ALIGN_SID_SIZE + else if ( *nb_bits <= ( ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - STEREO_DFT_ITD_MODE_NBITS - STEREO_DFT_SID_ITD_NBITS - 1 - SID_FORMAT_NBITS ) ) +#else else if ( *nb_bits <= ( ( IVAS_SID_4k4 - SID_2k40 ) / FRAMES_PER_SEC - STEREO_DFT_ITD_MODE_NBITS - STEREO_DFT_SID_ITD_NBITS - 1 - SID_FORMAT_NBITS ) ) +#endif { itd_mode = get_next_indice( st, STEREO_DFT_ITD_MODE_NBITS ); ( *nb_bits ) += STEREO_DFT_ITD_MODE_NBITS; /*ITD mode flag: 1bit*/ @@ -2016,7 +2036,11 @@ void stereo_dft_dec_read_BS( stereo_dft_dequantize_ipd( &ind1_ipd[0], hStereoDft->gipd + ( k + k_offset ), 1, STEREO_DFT_GIPD_NBITS ); } } +#ifdef ALIGN_SID_SIZE + else if ( *nb_bits <= ( ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - STEREO_DFT_FLAG_BITS - STEREO_DFT_SID_GIPD_NBITS - SID_FORMAT_NBITS ) ) +#else else if ( *nb_bits <= ( ( IVAS_SID_4k4 - SID_2k40 ) / FRAMES_PER_SEC - STEREO_DFT_FLAG_BITS - STEREO_DFT_SID_GIPD_NBITS - SID_FORMAT_NBITS ) ) +#endif { /* SID frame, only read IPD only if enough bits left in bitstream */ hStereoDft->no_ipd_flag = st->bit_stream[nb]; @@ -2177,7 +2201,11 @@ void stereo_dft_dec_read_BS( #endif } +#ifdef ALIGN_SID_SIZE + if ( !( ivas_format == MASA_FORMAT && ivas_total_brate <= IVAS_SID_5k2 ) ) +#else if ( !( ivas_format == MASA_FORMAT && ivas_total_brate <= IVAS_SID_4k4 ) ) +#endif { if ( hStereoDft->side_gain_flag_1 != 2 ) { @@ -2185,7 +2213,11 @@ void stereo_dft_dec_read_BS( } } +#ifdef ALIGN_SID_SIZE + if ( ivas_total_brate > IVAS_SID_5k2 ) +#else if ( ivas_total_brate > IVAS_SID_4k4 ) +#endif { hStereoDft->recovery_flg = stereo_dft_sg_recovery( hStereoDft ); @@ -2252,12 +2284,20 @@ void stereo_dft_dec_read_BS( #endif } +#ifdef ALIGN_SID_SIZE + if ( hStereoDft->frame_sid && !( ivas_format == MASA_FORMAT && ivas_total_brate <= IVAS_SID_5k2 ) ) +#else if ( hStereoDft->frame_sid && !( ivas_format == MASA_FORMAT && ivas_total_brate <= IVAS_SID_4k4 ) ) +#endif { stereo_dft_dec_sid_coh( st, hStereoDft->nbands, coh, nb_bits ); } +#ifdef ALIGN_SID_SIZE + if ( ivas_total_brate == IVAS_SID_5k2 && ivas_format != MASA_FORMAT ) +#else if ( ivas_total_brate == IVAS_SID_4k4 && ivas_format != MASA_FORMAT ) +#endif { *nb_bits = (int16_t) ( ( element_brate - SID_2k40 ) / FRAMES_PER_SEC ); /* => hCPE->hCoreCoder[0]->total_brate = SID_2k40; */ } diff --git a/lib_dec/ivas_stereo_mdct_stereo_dec.c b/lib_dec/ivas_stereo_mdct_stereo_dec.c index 064784e705..12d1fc8d66 100644 --- a/lib_dec/ivas_stereo_mdct_stereo_dec.c +++ b/lib_dec/ivas_stereo_mdct_stereo_dec.c @@ -559,13 +559,21 @@ void updateBuffersForDmxMdctStereo( sts[1] = hCPE->hCoreCoder[1]; /* synch buffers for inactive frames, but not for transition frames */ +#ifdef ALIGN_SID_SIZE + if ( hCPE->last_element_brate <= IVAS_SID_5k2 ) +#else if ( hCPE->last_element_brate <= IVAS_SID_4k4 ) +#endif { mvr2r( output[0], output[1], output_frame ); mvr2r( synth[0], synth[1], output_frame ); } +#ifdef ALIGN_SID_SIZE + if ( hCPE->element_brate == IVAS_SID_5k2 && hCPE->last_element_brate > IVAS_SID_5k2 ) +#else if ( hCPE->element_brate == IVAS_SID_4k4 && hCPE->last_element_brate > IVAS_SID_4k4 ) +#endif { /* in the first SID frame after an active frame, create mid noise shape here, in SID frames that follow inactive frames, it is done directly in the SID decoding since the mid shape is being used in CNG then */ for ( int16_t p = 0; p < sts[0]->hFdCngDec->hFdCngCom->npart; p++ ) @@ -575,7 +583,11 @@ void updateBuffersForDmxMdctStereo( } /* for transition of active->inactive frame, apply passive downmix on buffers */ +#ifdef ALIGN_SID_SIZE + if ( hCPE->last_element_brate <= IVAS_SID_5k2 ) +#else if ( hCPE->last_element_brate <= IVAS_SID_4k4 ) +#endif { delta = 1; if ( output_frame == L_FRAME16k ) @@ -641,13 +653,21 @@ void applyDmxMdctStereo( fade = 1.f; dmx_len = output_frame; +#ifdef ALIGN_SID_SIZE + if ( hCPE->last_element_brate <= IVAS_SID_5k2 ) +#else if ( hCPE->last_element_brate <= IVAS_SID_4k4 ) +#endif { crossfade_len = NS2SA( hCPE->hCoreCoder[0]->output_Fs, IVAS_DEC_DELAY_NS - DELAY_CLDFB_NS ); step /= crossfade_len; } /* for first inactive CNG frame after active decoding we have to do a fade-OUT FROM the passive DMX */ - else if ( hCPE->element_brate <= IVAS_SID_4k4 && hCPE->last_element_brate > IVAS_SID_4k4 ) +#ifdef ALIGN_SID_SIZE + else if ( hCPE->element_brate <= IVAS_SID_5k2 && hCPE->last_element_brate > IVAS_SID_5k2 ) +#else + if ( hCPE->last_element_brate <= IVAS_SID_4k4 ) +#endif { crossfade_len = output_frame / 4; step /= -crossfade_len; diff --git a/lib_dec/ivas_stereo_switching_dec.c b/lib_dec/ivas_stereo_switching_dec.c index b2b7889569..80736dd425 100644 --- a/lib_dec/ivas_stereo_switching_dec.c +++ b/lib_dec/ivas_stereo_switching_dec.c @@ -832,7 +832,11 @@ ivas_error stereo_memory_dec( if ( ivas_format == STEREO_FORMAT && hCPE->element_mode == IVAS_CPE_MDCT ) { +#ifdef ALIGN_SID_SIZE + if ( hCPE->element_brate <= MAX_MDCT_ITD_BRATE && ivas_total_brate > IVAS_SID_5k2 ) +#else if ( hCPE->element_brate <= MAX_MDCT_ITD_BRATE && ivas_total_brate > IVAS_SID_4k4 ) +#endif { if ( hCPE->hStereoMdct->use_itd == 0 ) { @@ -852,13 +856,21 @@ ivas_error stereo_memory_dec( else { /* de-allocate TCA data structure */ +#ifdef ALIGN_SID_SIZE + if ( hCPE->hStereoMdct->use_itd == 1 && ivas_total_brate > IVAS_SID_5k2 && hCPE->hStereoTCA != NULL ) +#else if ( hCPE->hStereoMdct->use_itd == 1 && ivas_total_brate > IVAS_SID_4k4 && hCPE->hStereoTCA != NULL ) +#endif { count_free( hCPE->hStereoTCA ); hCPE->hStereoTCA = NULL; hCPE->hStereoMdct->use_itd = 0; } +#ifdef ALIGN_SID_SIZE + else if ( hCPE->hStereoMdct->use_itd == 1 && ivas_total_brate <= IVAS_SID_5k2 ) +#else else if ( hCPE->hStereoMdct->use_itd == 1 && ivas_total_brate <= IVAS_SID_4k4 ) +#endif { hCPE->hStereoMdct->itd = 0.0f; } @@ -1011,7 +1023,11 @@ void synchro_synthesis( if ( use_cldfb_for_last_dft ) { +#ifdef ALIGN_SID_SIZE + if ( hCPE->element_mode == IVAS_CPE_DFT && hCPE->last_element_mode == IVAS_CPE_TD && ( ivas_total_brate > IVAS_SID_5k2 || hCPE->nchan_out == 2 ) ) +#else if ( hCPE->element_mode == IVAS_CPE_DFT && hCPE->last_element_mode == IVAS_CPE_TD && ( ivas_total_brate > IVAS_SID_4k4 || hCPE->nchan_out == 2 ) ) +#endif { stereo_tca_scale_R_channel( hCPE, output[0], output_frame ); } @@ -1349,7 +1365,11 @@ void stereo_switching_dec( mvr2r( hCPE->input_mem[n], hCPE->output_mem[n], dft32ms_ovl ); } +#ifdef ALIGN_SID_SIZE + if ( ivas_total_brate > IVAS_SID_5k2 || n == 0 || hCPE->last_element_mode != IVAS_CPE_TD || hCPE->nchan_out == 1 ) +#else if ( ivas_total_brate > IVAS_SID_4k4 || n == 0 || hCPE->last_element_mode != IVAS_CPE_TD || hCPE->nchan_out == 1 ) +#endif { for ( i = 0; i < dft32ms_ovl; i++ ) { @@ -1423,7 +1443,11 @@ void stereo_switching_dec( /* no secondary channel in the previous frame -> memory resets */ if ( hCPE->element_mode > IVAS_CPE_DFT && hCPE->last_element_mode == IVAS_CPE_DFT ) { +#ifdef ALIGN_SID_SIZE + if ( hCPE->last_element_brate <= IVAS_SID_5k2 && hCPE->nchan_out == 2 ) +#else if ( hCPE->last_element_brate <= IVAS_SID_4k4 && hCPE->nchan_out == 2 ) +#endif { /* reset CLDFB memories */ cldfb_reset_memory( sts[0]->cldfbAna ); diff --git a/lib_dec/lib_dec.c b/lib_dec/lib_dec.c index 2d41945563..2641e86541 100644 --- a/lib_dec/lib_dec.c +++ b/lib_dec/lib_dec.c @@ -1156,7 +1156,11 @@ static bool isSidFrame( { return true; /* EVS SID */ } +#ifdef ALIGN_SID_SIZE + else if ( size == IVAS_SID_5k2 / FRAMES_PER_SEC ) +#else else if ( size == IVAS_SID_4k4 / FRAMES_PER_SEC ) +#endif { return true; /* IVAS SID */ } diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index b543761491..af11ccb4c8 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -560,7 +560,11 @@ ivas_error ivas_cpe_enc( /* Reconfigure DFT Stereo for inactive frames */ if ( sts[0]->core_brate == SID_2k40 ) { +#ifdef ALIGN_SID_SIZE + stereo_dft_config( hCPE->hStereoDft->hConfig, IVAS_SID_5k2, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); +#else stereo_dft_config( hCPE->hStereoDft->hConfig, IVAS_SID_4k4, &sts[0]->bits_frame_nominal, &sts[1]->bits_frame_nominal ); +#endif } else { @@ -604,7 +608,11 @@ ivas_error ivas_cpe_enc( if ( sts[0]->core_brate == FRAME_NO_DATA || sts[0]->core_brate == SID_2k40 ) { +#ifdef ALIGN_SID_SIZE + assert( ( nb_bits <= ( ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS ) ) && "Stereo DFT CNG: bit budget is violated" ); +#else assert( ( nb_bits <= ( ( IVAS_SID_4k4 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS ) ) && "Stereo DFT CNG: bit budget is violated" ); +#endif } else { diff --git a/lib_enc/ivas_ism_enc.c b/lib_enc/ivas_ism_enc.c index 2653829d13..2433c01802 100644 --- a/lib_enc/ivas_ism_enc.c +++ b/lib_enc/ivas_ism_enc.c @@ -214,7 +214,11 @@ ivas_error ivas_ism_enc( ivas_write_format_sid( st_ivas->hEncoderConfig->ivas_format, IVAS_SCE, st->hBstr ); /* write unused bits */ +#ifdef ALIGN_SID_SIZE + nBits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; +#else nBits = ( IVAS_SID_4k4 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; +#endif while ( nBits > 0 ) { i = min( nBits, 16 ); diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index 613d59f1be..4f552ca365 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -684,17 +684,29 @@ void ivas_qmetadata_enc_sid_encode( { if ( sba_mode == SBA_MODE_SPAR ) { +#ifdef ALIGN_SID_SIZE + metadata_sid_bits = (int16_t) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * SPAR_SID_BITS_TAR_PER_BAND ) - 1; /* -1 for inactive mode header bit*/ +#else metadata_sid_bits = (int16_t) ( IVAS_SID_5k - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * SPAR_SID_BITS_TAR_PER_BAND ) - 1; /* -1 for inactive mode header bit*/ +#endif } else { /* keep 13.2 and 16.4 SID bitrate as 4.4 kbps for now*/ +#ifdef ALIGN_SID_SIZE + metadata_sid_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; +#else metadata_sid_bits = ( IVAS_SID_4k4 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; +#endif } } else { +#ifdef ALIGN_SID_SIZE + metadata_sid_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; +#else metadata_sid_bits = ( IVAS_SID_4k4 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; +#endif } #ifdef DEBUG_MODE_QMETADATA @@ -946,7 +958,11 @@ void reset_metadata_spatial( hMetaData->ind_list[i].nb_bits = -1; } hMetaData->last_ind = hMetaData->next_ind; +#ifdef ALIGN_SID_SIZE + assert( ( hMetaData->nb_bits_tot == ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS ) && "Problem of SID metadata in SCE" ); +#else assert( ( hMetaData->nb_bits_tot == ( IVAS_SID_4k4 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS ) && "Problem of SID metadata in SCE" ); +#endif } } else diff --git a/lib_enc/ivas_stereo_cng_enc.c b/lib_enc/ivas_stereo_cng_enc.c index 860cdbe88f..c16b54efeb 100644 --- a/lib_enc/ivas_stereo_cng_enc.c +++ b/lib_enc/ivas_stereo_cng_enc.c @@ -148,7 +148,11 @@ void stereo_dft_enc_sid_coh( int16_t alpha_level; int16_t n; +#ifdef ALIGN_SID_SIZE + nr_of_sid_stereo_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; +#else nr_of_sid_stereo_bits = ( IVAS_SID_4k4 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; +#endif zeropad = 0; /* Encode coherence vector. Find best fixed predictor by minimizing prediction error on input vector. diff --git a/lib_enc/ivas_stereo_dft_enc.c b/lib_enc/ivas_stereo_dft_enc.c index 2e81bd99bc..402003be6c 100644 --- a/lib_enc/ivas_stereo_dft_enc.c +++ b/lib_enc/ivas_stereo_dft_enc.c @@ -2317,7 +2317,11 @@ void stereo_dft_enc_write_BS( { stereo_dft_enc_sid_calc_coh( hStereoDft, hCPE->hStereoCng->coh_crossfade, &hCPE->hStereoCng->td_active, &hCPE->hStereoCng->first_SID, cohBand ); +#ifdef ALIGN_SID_SIZE + if ( *nb_bits <= ( ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS - STEREO_DFT_ITD_MODE_NBITS - STEREO_DFT_SID_ITD_NBITS - 1 ) ) +#else if ( *nb_bits <= ( ( IVAS_SID_4k4 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS - STEREO_DFT_ITD_MODE_NBITS - STEREO_DFT_SID_ITD_NBITS - 1 ) ) +#endif { if ( hStereoDft->hItd->itd[k_offset] != 0 ) { @@ -2393,7 +2397,11 @@ void stereo_dft_enc_write_BS( nb += STEREO_DFT_GIPD_NBITS; } } +#ifdef ALIGN_SID_SIZE + else if ( *nb_bits <= ( ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS - STEREO_DFT_FLAG_BITS - STEREO_DFT_SID_GIPD_NBITS ) ) +#else else if ( *nb_bits <= ( ( IVAS_SID_4k4 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS - STEREO_DFT_FLAG_BITS - STEREO_DFT_SID_GIPD_NBITS ) ) +#endif { push_indice( hBstr, IND_STEREO_DFT_NO_IPD_FLAG, hStereoDft->no_ipd_flag, STEREO_DFT_FLAG_BITS ); nb += STEREO_DFT_FLAG_BITS; /*IPD mode flag: 1bit*/ -- GitLab From f61c8965d62eaa0bce4f8330a5d82cce913461c5 Mon Sep 17 00:00:00 2001 From: knj Date: Mon, 19 Sep 2022 17:01:04 +0200 Subject: [PATCH 2/8] implement DTX @ 5.2kbps for MDCT-Stereo --- lib_com/bitstream.c | 12 ++++++++++++ lib_com/ivas_prot.h | 7 +++++++ lib_dec/fd_cng_dec.c | 4 ++++ lib_dec/ivas_stereo_mdct_stereo_dec.c | 2 +- lib_enc/fd_cng_enc.c | 5 +++++ 5 files changed, 29 insertions(+), 1 deletion(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index d774c4eff7..dd44d4f907 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -2975,4 +2975,16 @@ void evs_dec_previewFrame( } +#ifdef ALIGN_SID_SIZE +void dtx_read_padding_bits( + DEC_CORE_HANDLE st, + int16_t num_bits ) +{ + /* TODO: temporary hack, need to decide what to do with core-coder bitrate */ + st->total_brate = 3200; + get_next_indice(st, num_bits); + st->total_brate = 2400; +} +#endif + #undef WMC_TOOL_MAN diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index c4e93a9545..d453205933 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -5449,4 +5449,11 @@ float rand_triangular_signed( /* clang-format on */ +#ifdef ALIGN_SID_SIZE +void dtx_read_padding_bits( + DEC_CORE_HANDLE st, + int16_t num_bits +); +#endif + #endif /* IVAS_PROT_H */ diff --git a/lib_dec/fd_cng_dec.c b/lib_dec/fd_cng_dec.c index ead5efa10f..974d046368 100644 --- a/lib_dec/fd_cng_dec.c +++ b/lib_dec/fd_cng_dec.c @@ -2099,6 +2099,10 @@ void FdCngDecodeMDCTStereoSID( msvq_dec( cdk_37bits_ivas, NULL, NULL, stages, N, FD_CNG_maxN_37bits, indices, ms_ptr[ch], NULL ); } +#ifdef ALIGN_SID_SIZE + dtx_read_padding_bits( sts[1], ( IVAS_SID_5k2 - 4400 ) / FRAMES_PER_SEC ); +#endif + if ( sts[0]->hFdCngDec->hFdCngCom->no_side_flag ) { set_zero( ms_ptr[1], NPART ); diff --git a/lib_dec/ivas_stereo_mdct_stereo_dec.c b/lib_dec/ivas_stereo_mdct_stereo_dec.c index 12d1fc8d66..10b9688be2 100644 --- a/lib_dec/ivas_stereo_mdct_stereo_dec.c +++ b/lib_dec/ivas_stereo_mdct_stereo_dec.c @@ -666,7 +666,7 @@ void applyDmxMdctStereo( #ifdef ALIGN_SID_SIZE else if ( hCPE->element_brate <= IVAS_SID_5k2 && hCPE->last_element_brate > IVAS_SID_5k2 ) #else - if ( hCPE->last_element_brate <= IVAS_SID_4k4 ) + else if ( hCPE->element_brate <= IVAS_SID_4k4 && hCPE->last_element_brate > IVAS_SID_4k4 ) #endif { crossfade_len = output_frame / 4; diff --git a/lib_enc/fd_cng_enc.c b/lib_enc/fd_cng_enc.c index c2dfb1969f..670a202df2 100644 --- a/lib_enc/fd_cng_enc.c +++ b/lib_enc/fd_cng_enc.c @@ -1128,6 +1128,11 @@ void FdCngEncodeMDCTStereoSID( push_indice( sts[ch]->hBstr, IND_ENERGY, gain_idx[ch], 7 ); } +#ifdef ALIGN_SID_SIZE + /* pad with zeros to reach common SID frame size */ + push_indice( sts[1]->hBstr, IND_ENERGY, 0, ( IVAS_SID_5k2 - 4400 ) / FRAMES_PER_SEC ); +#endif + return; } -- GitLab From 8f013f70326c48c23bd0fa953bba546fda5627e4 Mon Sep 17 00:00:00 2001 From: knj Date: Mon, 19 Sep 2022 17:23:57 +0200 Subject: [PATCH 3/8] make DFT-Stereo DTX use 5.2kbps SIDs with padding only --- lib_com/bitstream.c | 6 ++++-- lib_dec/ivas_stereo_cng_dec.c | 6 +++++- lib_enc/ivas_stereo_cng_enc.c | 7 ++++++- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index dd44d4f907..d4304d3649 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -2981,9 +2981,11 @@ void dtx_read_padding_bits( int16_t num_bits ) { /* TODO: temporary hack, need to decide what to do with core-coder bitrate */ - st->total_brate = 3200; + int16_t tmp; + tmp = st->total_brate; + st->total_brate = st->total_brate + num_bits * FRAMES_PER_SEC; get_next_indice(st, num_bits); - st->total_brate = 2400; + st->total_brate = tmp; } #endif diff --git a/lib_dec/ivas_stereo_cng_dec.c b/lib_dec/ivas_stereo_cng_dec.c index fb32bcd90c..fea12053c3 100644 --- a/lib_dec/ivas_stereo_cng_dec.c +++ b/lib_dec/ivas_stereo_cng_dec.c @@ -91,7 +91,8 @@ void stereo_dft_dec_sid_coh( int16_t b; #ifdef ALIGN_SID_SIZE - nr_of_sid_stereo_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; + /* TODO: still use old number of bits to keep bitexactness in output */ + nr_of_sid_stereo_bits = ( 4400/*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; #else nr_of_sid_stereo_bits = ( IVAS_SID_4k4 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; #endif @@ -177,6 +178,9 @@ void stereo_dft_dec_sid_coh( ( *nb_bits )++; } +#ifdef ALIGN_SID_SIZE + dtx_read_padding_bits( st, ( IVAS_SID_5k2 - 4400 ) / FRAMES_PER_SEC ); +#endif return; } diff --git a/lib_enc/ivas_stereo_cng_enc.c b/lib_enc/ivas_stereo_cng_enc.c index c16b54efeb..5db60b5238 100644 --- a/lib_enc/ivas_stereo_cng_enc.c +++ b/lib_enc/ivas_stereo_cng_enc.c @@ -149,7 +149,8 @@ void stereo_dft_enc_sid_coh( int16_t n; #ifdef ALIGN_SID_SIZE - nr_of_sid_stereo_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; + /* TODO: still use old number of bits to keep bitexactness in output */ + nr_of_sid_stereo_bits = ( 4400/*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; #else nr_of_sid_stereo_bits = ( IVAS_SID_4k4 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; #endif @@ -307,6 +308,10 @@ void stereo_dft_enc_sid_coh( ( *nb_bits )++; } +#ifdef ALIGN_SID_SIZE + push_next_indice( hBstr, zeropad, ( IVAS_SID_5k2 - 4400 ) / FRAMES_PER_SEC ); +#endif + return; } -- GitLab From 2bbffc6853e34ecd5e2076e942294437e4f9defe Mon Sep 17 00:00:00 2001 From: knj Date: Mon, 19 Sep 2022 18:40:24 +0200 Subject: [PATCH 4/8] add 5.2kbps SID for remaining formats, SBA not BE, rest is --- lib_dec/ivas_ism_metadata_dec.c | 1 - lib_dec/ivas_qmetadata_dec.c | 27 ++++++++++++++++++++++++--- lib_enc/ivas_cpe_enc.c | 4 ++++ lib_enc/ivas_qmetadata_enc.c | 29 ++++++++++++++++++++++++++--- 4 files changed, 54 insertions(+), 7 deletions(-) diff --git a/lib_dec/ivas_ism_metadata_dec.c b/lib_dec/ivas_ism_metadata_dec.c index c8ce447875..dee9b6489f 100644 --- a/lib_dec/ivas_ism_metadata_dec.c +++ b/lib_dec/ivas_ism_metadata_dec.c @@ -92,7 +92,6 @@ ivas_error ivas_ism_metadata_dec( /* set padding bits as metadata bits to keep later bitrate checks valid */ #ifdef ALIGN_SID_SIZE - /* TODO: include padding bits here? */ nb_bits_metadata[0] = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC; #else nb_bits_metadata[0] = ( IVAS_SID_4k4 - SID_2k40 ) / FRAMES_PER_SEC; diff --git a/lib_dec/ivas_qmetadata_dec.c b/lib_dec/ivas_qmetadata_dec.c index f0646759ef..b81d5cfd97 100644 --- a/lib_dec/ivas_qmetadata_dec.c +++ b/lib_dec/ivas_qmetadata_dec.c @@ -722,7 +722,8 @@ int16_t ivas_qmetadata_dec_sid_decode( if ( sba_mode == SBA_MODE_SPAR ) { #ifdef ALIGN_SID_SIZE - metadata_sid_bits = (int16_t) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * 18 ) - 1; /* -1 for inactive mode header bit*/ + /* TODO: still use old sid frame size to keep bitexactness */ + metadata_sid_bits = (int16_t) ( 5000/*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * 18 ) - 1; /* -1 for inactive mode header bit*/ #else metadata_sid_bits = (int16_t) ( IVAS_SID_5k - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * 18 ) - 1; /* -1 for inactive mode header bit*/ #endif @@ -731,7 +732,8 @@ int16_t ivas_qmetadata_dec_sid_decode( { /* keep 13.2 and 16.4 sid bitrate as 4.4 kbps for now*/ #ifdef ALIGN_SID_SIZE - metadata_sid_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; + /* TODO: still use old sid frame size to keep bitexactness */ + metadata_sid_bits = ( 4400/*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; #else metadata_sid_bits = ( IVAS_SID_4k4 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; #endif @@ -740,7 +742,8 @@ int16_t ivas_qmetadata_dec_sid_decode( else { #ifdef ALIGN_SID_SIZE - metadata_sid_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; + /* TODO: still use old sid frame size to keep bitexactness */ + metadata_sid_bits = ( 4400/*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; #else metadata_sid_bits = ( IVAS_SID_4k4 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; #endif @@ -862,6 +865,24 @@ int16_t ivas_qmetadata_dec_sid_decode( } } } +#ifdef ALIGN_SID_SIZE + /* TODO: temporary hack to keep BE */ + if ( ivas_format == SBA_FORMAT ) + { + if ( sba_mode == SBA_MODE_SPAR ) + { + metadata_sid_bits = (int16_t) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * 18 ) - 1; /* -1 for inactive mode header bit*/ + } + else + { + metadata_sid_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; + } + } + else + { + metadata_sid_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; + } +#endif /*Read filling bits*/ while ( start_index - *index < metadata_sid_bits ) diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index af11ccb4c8..ca817c9640 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -541,7 +541,11 @@ ivas_error ivas_cpe_enc( * Write IVAS format signaling in SID frames *----------------------------------------------------------------*/ +#ifdef ALIGN_SID_SIZE + if ( sts[0]->core_brate == SID_2k40 ) +#else if ( sts[0]->core_brate == SID_2k40 && ( ivas_format != SBA_FORMAT || st_ivas->sba_mode != SBA_MODE_SPAR ) ) +#endif { ivas_write_format_sid( ivas_format, hCPE->element_mode, sts[0]->hBstr ); } diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index 4f552ca365..492114987f 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -685,7 +685,8 @@ void ivas_qmetadata_enc_sid_encode( if ( sba_mode == SBA_MODE_SPAR ) { #ifdef ALIGN_SID_SIZE - metadata_sid_bits = (int16_t) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * SPAR_SID_BITS_TAR_PER_BAND ) - 1; /* -1 for inactive mode header bit*/ + /* TODO: still use old sid frame size to keep bitexactness */ + metadata_sid_bits = (int16_t) ( 5000/*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * SPAR_SID_BITS_TAR_PER_BAND ) - 1; /* -1 for inactive mode header bit*/ #else metadata_sid_bits = (int16_t) ( IVAS_SID_5k - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * SPAR_SID_BITS_TAR_PER_BAND ) - 1; /* -1 for inactive mode header bit*/ #endif @@ -694,7 +695,8 @@ void ivas_qmetadata_enc_sid_encode( { /* keep 13.2 and 16.4 SID bitrate as 4.4 kbps for now*/ #ifdef ALIGN_SID_SIZE - metadata_sid_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; + /* TODO: still use old sid frame size to keep bitexactness */ + metadata_sid_bits = ( 4400/*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; #else metadata_sid_bits = ( IVAS_SID_4k4 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; #endif @@ -703,7 +705,8 @@ void ivas_qmetadata_enc_sid_encode( else { #ifdef ALIGN_SID_SIZE - metadata_sid_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; + /* TODO: still use old sid frame size to keep bitexactness */ + metadata_sid_bits = ( 4400/*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; #else metadata_sid_bits = ( IVAS_SID_4k4 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; #endif @@ -885,6 +888,26 @@ void ivas_qmetadata_enc_sid_encode( } #endif +#ifdef ALIGN_SID_SIZE + /* TODO: temporary to keep BE */ + if ( ivas_format == SBA_FORMAT ) + { + if ( sba_mode == SBA_MODE_SPAR ) + { + metadata_sid_bits = (int16_t) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * SPAR_SID_BITS_TAR_PER_BAND ) - 1; /* -1 for inactive mode header bit*/ + } + else + { + /* keep 13.2 and 16.4 SID bitrate as 4.4 kbps for now*/ + metadata_sid_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; + } + } + else + { + metadata_sid_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; + } +#endif + /* fill bits*/ assert( ( hMetaData->nb_bits_tot - bit_pos_start ) <= metadata_sid_bits && "Too many written bits!" ); while ( ( hMetaData->nb_bits_tot - bit_pos_start ) < metadata_sid_bits ) -- GitLab From 65edca7afc5601d31475fd4617779b9624b2342d Mon Sep 17 00:00:00 2001 From: rtyag Date: Wed, 21 Sep 2022 16:31:38 +0200 Subject: [PATCH 5/8] SBA fixes after DTX bitrate alignment --- lib_com/bitstream.c | 2 +- lib_dec/ivas_dirac_dec.c | 47 +++++++++++++++++++++++++++++++++--- lib_dec/ivas_init_dec.c | 34 ++++++++++++++++++++------ lib_dec/ivas_qmetadata_dec.c | 13 ++++++---- lib_dec/ivas_spar_decoder.c | 17 +++++++++++++ lib_enc/ivas_dirac_enc.c | 4 +++ lib_enc/ivas_qmetadata_enc.c | 25 +++++++++++++++---- lib_enc/ivas_sce_enc.c | 5 +++- 8 files changed, 124 insertions(+), 23 deletions(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index d4304d3649..1d8ed20b33 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -2984,7 +2984,7 @@ void dtx_read_padding_bits( int16_t tmp; tmp = st->total_brate; st->total_brate = st->total_brate + num_bits * FRAMES_PER_SEC; - get_next_indice(st, num_bits); + get_next_indice( st, num_bits ); st->total_brate = tmp; } #endif diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index f3992e8677..162002852b 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -1297,18 +1297,19 @@ void ivas_dirac_dec_read_BS( b = st->bit_stream[( st->next_bit_pos )--]; ( *nb_bits )++; +#ifndef ALIGN_SID_SIZE if ( sba_mode == SBA_MODE_SPAR ) { -#ifdef ALIGN_SID_SIZE - if ( ivas_total_brate == IVAS_SID_5k2 ) -#else + if ( ivas_total_brate == IVAS_SID_5k ) -#endif { b = 1; } } else +#else + if ( sba_mode != SBA_MODE_SPAR ) +#endif { assert( ( b == 0 ) || ( hQMetaData->q_direction[0].cfg.start_band > 0 ) ); } @@ -1406,6 +1407,13 @@ void ivas_dirac_dec_read_BS( /* subtract mode signaling bits, since bitstream was moved after mode reading */ st->next_bit_pos = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC - 1 - SID_FORMAT_NBITS ); +#ifdef ALIGN_SID_SIZE + /* 1 bit flag for SPAR/DirAC, already read in read format function */ + b = st->bit_stream[( st->next_bit_pos )--]; + ( *nb_bits )++; + hQMetaData->sba_inactive_mode = 1; + orig_dirac_bands = hQMetaData->q_direction[0].cfg.nbands; +#endif /* if we start with a SID frame, we need to init the azi/ele arrays.*/ if ( st->ini_frame == 0 ) @@ -1420,8 +1428,39 @@ void ivas_dirac_dec_read_BS( } } +#ifdef ALIGN_SID_SIZE + *nb_bits += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), 0, NULL, SBA_FORMAT, sba_mode ); + + if ( sba_mode == SBA_MODE_SPAR ) + { + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].azimuth[i] = hQMetaData->q_direction[0].band_data[1].azimuth[0]; + hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].elevation[i] = hQMetaData->q_direction[0].band_data[1].elevation[0]; + hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].energy_ratio[i] = hQMetaData->q_direction[0].band_data[1].energy_ratio[0]; + } + for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) + { + for ( j = orig_dirac_bands - 2; j >= 0; j-- ) + { + hQMetaData->q_direction[0].band_data[j].azimuth[i] = hQMetaData->q_direction[0].band_data[0].azimuth[0]; + hQMetaData->q_direction[0].band_data[j].elevation[i] = hQMetaData->q_direction[0].band_data[0].elevation[0]; + hQMetaData->q_direction[0].band_data[j].energy_ratio[i] = hQMetaData->q_direction[0].band_data[0].energy_ratio[0]; + } + } + + hQMetaData->q_direction->cfg.nbands = orig_dirac_bands; + } + else + { + *nb_bits += SID_FORMAT_NBITS; + } +#else *nb_bits += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), 0, NULL, SBA_FORMAT, SBA_MODE_DIRAC ); + *nb_bits += SID_FORMAT_NBITS; +#endif + st->next_bit_pos = next_bit_pos_orig; } diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index d32e362562..d0f4e7ceb1 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -103,7 +103,7 @@ ivas_error ivas_dec_setup( /* read the number of objects */ st_ivas->nchan_transport = 1; num_obj = 1; - k = ( int16_t )( ( ivas_total_brate / FRAMES_PER_SEC ) - 1 ); + k = (int16_t) ( ( ivas_total_brate / FRAMES_PER_SEC ) - 1 ); while ( st_ivas->bit_stream[k] && num_obj < MAX_NUM_OBJECTS ) { num_obj++; @@ -418,18 +418,37 @@ static ivas_error ivas_read_format( return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "Invalid value %c found in SID format field.", st_ivas->sid_format ); } +#ifdef ALIGN_SID_SIZE + if ( st_ivas->ivas_format == SBA_FORMAT ) + { + int16_t tc_mode_offset; + tc_mode_offset = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC - 1 ); + idx = st_ivas->bit_stream[tc_mode_offset]; + // TBD: needs more work for HOA + if ( st_ivas->sba_analysis_order == 0 ) + { + st_ivas->sba_analysis_order = 1; + } + if ( idx == 1 ) + { + st_ivas->sba_mode = SBA_MODE_SPAR; + } + else + { + st_ivas->sba_mode = SBA_MODE_DIRAC; + } + } +#endif + /* reset bitstream handle to avoid BER detection after reading the 2400 kbps for ch0 */ st_ivas->bit_stream += ( *num_bits_read ); ( *num_bits_read ) = 0; } -#ifdef ALIGN_SID_SIZE - else if ( !st_ivas->bfi && ivas_total_brate == IVAS_SID_5k2 ) -#else +#ifndef ALIGN_SID_SIZE else if ( !st_ivas->bfi && ivas_total_brate == IVAS_SID_5k ) -#endif { int16_t tc_mode_offset; - tc_mode_offset = ( int16_t )( ivas_total_brate / FRAMES_PER_SEC - 1 ); + tc_mode_offset = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC - 1 ); idx = st_ivas->bit_stream[tc_mode_offset]; // TBD: needs more work for HOA @@ -453,6 +472,7 @@ static ivas_error ivas_read_format( st_ivas->element_mode_init = IVAS_CPE_MDCT; } } +#endif else { /* In SID/NO_DATA frames, use the previous frame IVAS format */ @@ -890,7 +910,7 @@ ivas_error ivas_init_decoder( st_ivas->hSpar->enc_param_start_band = min( IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND ); - ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, ( int16_t )( st_ivas->hDecoderConfig->output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ), + ivas_dirac_config_bands( band_grouping, IVAS_MAX_NUM_BANDS, (int16_t) ( st_ivas->hDecoderConfig->output_Fs * INV_CLDFB_BANDWIDTH + 0.5f ), st_ivas->hSpar->dirac_to_spar_md_bands, st_ivas->hQMetaData->useLowerBandRes, st_ivas->hSpar->enc_param_start_band, 0 ); } } diff --git a/lib_dec/ivas_qmetadata_dec.c b/lib_dec/ivas_qmetadata_dec.c index b81d5cfd97..2a144cb852 100644 --- a/lib_dec/ivas_qmetadata_dec.c +++ b/lib_dec/ivas_qmetadata_dec.c @@ -723,7 +723,7 @@ int16_t ivas_qmetadata_dec_sid_decode( { #ifdef ALIGN_SID_SIZE /* TODO: still use old sid frame size to keep bitexactness */ - metadata_sid_bits = (int16_t) ( 5000/*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * 18 ) - 1; /* -1 for inactive mode header bit*/ + metadata_sid_bits = (int16_t) ( 5000 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * 18 ) - 1; /* -1 for inactive mode header bit*/ #else metadata_sid_bits = (int16_t) ( IVAS_SID_5k - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * 18 ) - 1; /* -1 for inactive mode header bit*/ #endif @@ -733,7 +733,7 @@ int16_t ivas_qmetadata_dec_sid_decode( /* keep 13.2 and 16.4 sid bitrate as 4.4 kbps for now*/ #ifdef ALIGN_SID_SIZE /* TODO: still use old sid frame size to keep bitexactness */ - metadata_sid_bits = ( 4400/*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; + metadata_sid_bits = ( 4400 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; #else metadata_sid_bits = ( IVAS_SID_4k4 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; #endif @@ -743,7 +743,7 @@ int16_t ivas_qmetadata_dec_sid_decode( { #ifdef ALIGN_SID_SIZE /* TODO: still use old sid frame size to keep bitexactness */ - metadata_sid_bits = ( 4400/*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; + metadata_sid_bits = ( 4400 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; #else metadata_sid_bits = ( IVAS_SID_4k4 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; #endif @@ -871,11 +871,14 @@ int16_t ivas_qmetadata_dec_sid_decode( { if ( sba_mode == SBA_MODE_SPAR ) { - metadata_sid_bits = (int16_t) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * 18 ) - 1; /* -1 for inactive mode header bit*/ +#if 0 + /*This would break BE for SPAR modes, hence disabling it for now*/ + metadata_sid_bits = (int16_t) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * 18 ) - 1 - SID_FORMAT_NBITS; /* -1 for inactive mode header bit*/ +#endif } else { - metadata_sid_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; + metadata_sid_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS - 1; /* -1 for spar/dirac indicator*/ } } else diff --git a/lib_dec/ivas_spar_decoder.c b/lib_dec/ivas_spar_decoder.c index cae7c8f27b..459a6f2193 100644 --- a/lib_dec/ivas_spar_decoder.c +++ b/lib_dec/ivas_spar_decoder.c @@ -241,6 +241,12 @@ ivas_error ivas_spar_dec( next_bit_pos_orig = st0->next_bit_pos; last_bit_pos = (int16_t) ( ( hDecoderConfig->ivas_total_brate / FRAMES_PER_SEC ) - 1 ); +#ifdef ALIGN_SID_SIZE + if ( !st0->bfi && hDecoderConfig->ivas_total_brate == IVAS_SID_5k2 ) + { + last_bit_pos -= SID_FORMAT_NBITS; + } +#endif nb_bits_read_orig = *nb_bits_read; last_bit_pos -= nb_bits_read_orig; @@ -260,6 +266,17 @@ ivas_error ivas_spar_dec( st0->bit_stream = bit_stream_orig; st0->next_bit_pos = next_bit_pos_orig; +#ifdef ALIGN_SID_SIZE + if ( !st0->bfi && hDecoderConfig->ivas_total_brate == IVAS_SID_5k2 ) + { + int16_t zero_pad_bits; + *nb_bits_read += SID_FORMAT_NBITS; + zero_pad_bits = (int16_t) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - *nb_bits_read; + assert( zero_pad_bits <= 1 ); + *nb_bits_read += zero_pad_bits; + } +#endif + wmops_sub_end(); return error; diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c index 557cb109ca..754aa6d57c 100644 --- a/lib_enc/ivas_dirac_enc.c +++ b/lib_enc/ivas_dirac_enc.c @@ -429,6 +429,10 @@ void ivas_dirac_enc( } else { +#ifdef ALIGN_SID_SIZE + /*indicate whether SPAR or DiRAC mode*/ + push_next_indice( hMetaData, 0, 1 ); +#endif /* encode SID parameters */ ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, -1, SBA_FORMAT, diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index 492114987f..c9af2b7cff 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -686,7 +686,7 @@ void ivas_qmetadata_enc_sid_encode( { #ifdef ALIGN_SID_SIZE /* TODO: still use old sid frame size to keep bitexactness */ - metadata_sid_bits = (int16_t) ( 5000/*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * SPAR_SID_BITS_TAR_PER_BAND ) - 1; /* -1 for inactive mode header bit*/ + metadata_sid_bits = (int16_t) ( 5000 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * SPAR_SID_BITS_TAR_PER_BAND ) - 1; /* -1 for inactive mode header bit*/ #else metadata_sid_bits = (int16_t) ( IVAS_SID_5k - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * SPAR_SID_BITS_TAR_PER_BAND ) - 1; /* -1 for inactive mode header bit*/ #endif @@ -696,7 +696,7 @@ void ivas_qmetadata_enc_sid_encode( /* keep 13.2 and 16.4 SID bitrate as 4.4 kbps for now*/ #ifdef ALIGN_SID_SIZE /* TODO: still use old sid frame size to keep bitexactness */ - metadata_sid_bits = ( 4400/*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; + metadata_sid_bits = ( 4400 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; #else metadata_sid_bits = ( IVAS_SID_4k4 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; #endif @@ -706,7 +706,7 @@ void ivas_qmetadata_enc_sid_encode( { #ifdef ALIGN_SID_SIZE /* TODO: still use old sid frame size to keep bitexactness */ - metadata_sid_bits = ( 4400/*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; + metadata_sid_bits = ( 4400 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; #else metadata_sid_bits = ( IVAS_SID_4k4 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; #endif @@ -894,12 +894,15 @@ void ivas_qmetadata_enc_sid_encode( { if ( sba_mode == SBA_MODE_SPAR ) { - metadata_sid_bits = (int16_t) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * SPAR_SID_BITS_TAR_PER_BAND ) - 1; /* -1 for inactive mode header bit*/ +#if 0 + /*This would break BE for SPAR modes, hence disabling it for now*/ + metadata_sid_bits = (int16_t) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * SPAR_SID_BITS_TAR_PER_BAND ) - 1 - SID_FORMAT_NBITS; /* -1 for inactive mode header bit*/ +#endif } else { /* keep 13.2 and 16.4 SID bitrate as 4.4 kbps for now*/ - metadata_sid_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; + metadata_sid_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS - 1; /* -1 for spar/dirac indicator*/ } } else @@ -936,6 +939,9 @@ void reset_metadata_spatial( ) { int16_t i, next_ind_sid, last_ind_sid; +#ifdef ALIGN_SID_SIZE + int16_t metadata_sid_bits; +#endif if ( core_brate == SID_2k40 || core_brate == FRAME_NO_DATA ) { @@ -944,6 +950,14 @@ void reset_metadata_spatial( if ( sba_mode == SBA_MODE_SPAR ) { assert( hMetaData->ind_list[0].nb_bits == 1 ); +#ifdef ALIGN_SID_SIZE + hMetaData->ind_list[0].value = 1; + metadata_sid_bits = (int16_t) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; + while ( hMetaData->nb_bits_tot < metadata_sid_bits ) + { + push_next_indice( hMetaData, 0, 1 ); /*fill bit*/ + } +#else if ( element_mode > IVAS_SCE ) { hMetaData->ind_list[0].value = 1; @@ -952,6 +966,7 @@ void reset_metadata_spatial( { hMetaData->ind_list[0].value = 0; } +#endif } else { diff --git a/lib_enc/ivas_sce_enc.c b/lib_enc/ivas_sce_enc.c index 942dd14c99..d3707945af 100644 --- a/lib_enc/ivas_sce_enc.c +++ b/lib_enc/ivas_sce_enc.c @@ -205,8 +205,11 @@ ivas_error ivas_sce_enc( /*----------------------------------------------------------------* * Write IVAS format signaling in SID frames *----------------------------------------------------------------*/ - +#ifdef ALIGN_SID_SIZE + if ( st->core_brate == SID_2k40 ) +#else if ( st->core_brate == SID_2k40 && ( ivas_format != SBA_FORMAT || st_ivas->sba_mode != SBA_MODE_SPAR ) ) +#endif { ivas_write_format_sid( ivas_format, IVAS_SCE, st->hBstr ); } -- GitLab From 9d26ba657ec3ba7366e230416af306e10151503b Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 22 Sep 2022 10:44:01 +0200 Subject: [PATCH 6/8] fix compiler warning --- lib_com/ivas_prot.h | 4 ++++ lib_enc/ivas_cpe_enc.c | 8 ++++++++ lib_enc/ivas_qmetadata_enc.c | 4 ++++ lib_enc/ivas_sce_enc.c | 7 +++++-- 4 files changed, 21 insertions(+), 2 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index d453205933..758a704151 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -2773,8 +2773,12 @@ void reset_metadata_spatial( int32_t *total_brate, /* o : total bitrate */ const int32_t core_brate, /* i : core bitrate */ const int16_t nb_bits_metadata, /* i : number of meatdata bits */ +#ifndef ALIGN_SID_SIZE const SBA_MODE sba_mode, /* i : SBA mode */ const int16_t element_mode /* i : element mode */ +#else + const SBA_MODE sba_mode /* i : SBA mode */ +#endif ); /*! r: number of bits written */ diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index ca817c9640..608fcca417 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -460,7 +460,11 @@ ivas_error ivas_cpe_enc( { if ( hCPE->element_mode == IVAS_CPE_DFT || hCPE->element_mode == IVAS_CPE_TD ) { +#ifdef ALIGN_SID_SIZE + reset_metadata_spatial( ivas_format, hCPE->hMetaData, hCPE->element_brate, &tmp, sts[0]->core_brate, nb_bits_metadata, st_ivas->sba_mode ); +#else reset_metadata_spatial( ivas_format, hCPE->hMetaData, hCPE->element_brate, &tmp, sts[0]->core_brate, nb_bits_metadata, st_ivas->sba_mode, hCPE->element_mode ); +#endif } } @@ -472,7 +476,11 @@ ivas_error ivas_cpe_enc( /* Reset metadata */ if ( sts[0]->cng_sba_flag || ( ivas_format == SBA_FORMAT && st_ivas->sba_mode == SBA_MODE_SPAR ) ) { +#ifdef ALIGN_SID_SIZE + reset_metadata_spatial( ivas_format, hCPE->hMetaData, hCPE->element_brate, &tmp, sts[0]->core_brate, nb_bits_metadata, st_ivas->sba_mode ); +#else reset_metadata_spatial( ivas_format, hCPE->hMetaData, hCPE->element_brate, &tmp, sts[0]->core_brate, nb_bits_metadata, st_ivas->sba_mode, hCPE->element_mode ); +#endif } } diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index c9af2b7cff..9470b2f0dc 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -934,8 +934,12 @@ void reset_metadata_spatial( int32_t *total_brate, /* o : total bitrate */ const int32_t core_brate, /* i : core bitrate */ const int16_t nb_bits_metadata, /* i : number of meatdata bits */ +#ifndef ALIGN_SID_SIZE const SBA_MODE sba_mode, /* i : SBA mode */ const int16_t element_mode /* i : element mode */ +#else + const SBA_MODE sba_mode /* i : SBA mode */ +#endif ) { int16_t i, next_ind_sid, last_ind_sid; diff --git a/lib_enc/ivas_sce_enc.c b/lib_enc/ivas_sce_enc.c index d3707945af..1657665f99 100644 --- a/lib_enc/ivas_sce_enc.c +++ b/lib_enc/ivas_sce_enc.c @@ -199,8 +199,11 @@ ivas_error ivas_sce_enc( * Reset metadata *----------------------------------------------------------------*/ - reset_metadata_spatial( ivas_format, hSCE->hMetaData, hSCE->element_brate, &st->total_brate, st->core_brate, nb_bits_metadata, st_ivas->sba_mode, - IVAS_SCE ); +#ifdef ALIGN_SID_SIZE + reset_metadata_spatial( ivas_format, hSCE->hMetaData, hSCE->element_brate, &st->total_brate, st->core_brate, nb_bits_metadata, st_ivas->sba_mode ); +#else + reset_metadata_spatial( ivas_format, hSCE->hMetaData, hSCE->element_brate, &st->total_brate, st->core_brate, nb_bits_metadata, st_ivas->sba_mode, IVAS_SCE ); +#endif /*----------------------------------------------------------------* * Write IVAS format signaling in SID frames -- GitLab From 9b1614d9f9e58b8ad59300936a0a3017665279ea Mon Sep 17 00:00:00 2001 From: rtyag Date: Thu, 22 Sep 2022 13:03:27 +0200 Subject: [PATCH 7/8] windows warning fix in encoder --- lib_com/bitstream.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_com/bitstream.c b/lib_com/bitstream.c index 1d8ed20b33..d221b9cf92 100644 --- a/lib_com/bitstream.c +++ b/lib_com/bitstream.c @@ -2981,7 +2981,7 @@ void dtx_read_padding_bits( int16_t num_bits ) { /* TODO: temporary hack, need to decide what to do with core-coder bitrate */ - int16_t tmp; + int32_t tmp; tmp = st->total_brate; st->total_brate = st->total_brate + num_bits * FRAMES_PER_SEC; get_next_indice( st, num_bits ); -- GitLab From bf02908225fd8f25e8741aa624fb2f96f5f1fb98 Mon Sep 17 00:00:00 2001 From: rtyag Date: Thu, 22 Sep 2022 13:29:09 +0200 Subject: [PATCH 8/8] sba_code == SBA_MODE_SPAR clean up --- lib_dec/ivas_qmetadata_dec.c | 9 +-------- lib_enc/ivas_qmetadata_enc.c | 15 ++++----------- 2 files changed, 5 insertions(+), 19 deletions(-) diff --git a/lib_dec/ivas_qmetadata_dec.c b/lib_dec/ivas_qmetadata_dec.c index 2a144cb852..15f33799d6 100644 --- a/lib_dec/ivas_qmetadata_dec.c +++ b/lib_dec/ivas_qmetadata_dec.c @@ -869,14 +869,7 @@ int16_t ivas_qmetadata_dec_sid_decode( /* TODO: temporary hack to keep BE */ if ( ivas_format == SBA_FORMAT ) { - if ( sba_mode == SBA_MODE_SPAR ) - { -#if 0 - /*This would break BE for SPAR modes, hence disabling it for now*/ - metadata_sid_bits = (int16_t) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * 18 ) - 1 - SID_FORMAT_NBITS; /* -1 for inactive mode header bit*/ -#endif - } - else + if ( sba_mode != SBA_MODE_SPAR ) { metadata_sid_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS - 1; /* -1 for spar/dirac indicator*/ } diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index 9470b2f0dc..6042c9e10a 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -892,14 +892,7 @@ void ivas_qmetadata_enc_sid_encode( /* TODO: temporary to keep BE */ if ( ivas_format == SBA_FORMAT ) { - if ( sba_mode == SBA_MODE_SPAR ) - { -#if 0 - /*This would break BE for SPAR modes, hence disabling it for now*/ - metadata_sid_bits = (int16_t) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * SPAR_SID_BITS_TAR_PER_BAND ) - 1 - SID_FORMAT_NBITS; /* -1 for inactive mode header bit*/ -#endif - } - else + if ( sba_mode != SBA_MODE_SPAR ) { /* keep 13.2 and 16.4 SID bitrate as 4.4 kbps for now*/ metadata_sid_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS - 1; /* -1 for spar/dirac indicator*/ @@ -935,10 +928,10 @@ void reset_metadata_spatial( const int32_t core_brate, /* i : core bitrate */ const int16_t nb_bits_metadata, /* i : number of meatdata bits */ #ifndef ALIGN_SID_SIZE - const SBA_MODE sba_mode, /* i : SBA mode */ - const int16_t element_mode /* i : element mode */ + const SBA_MODE sba_mode, /* i : SBA mode */ + const int16_t element_mode /* i : element mode */ #else - const SBA_MODE sba_mode /* i : SBA mode */ + const SBA_MODE sba_mode /* i : SBA mode */ #endif ) { -- GitLab