diff --git a/lib_com/options.h b/lib_com/options.h index 512142df1dbf0b070211c5c35454839f45060a34..266562ab177ceb9a9eed9792cfc8eb2491dfa830 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -80,6 +80,7 @@ #ifdef DEBUG_MODE_MDCT #define DEBUG_PLOT_BITS +#define DEBUG_OSBA_MD_BITS #endif #define ENABLE_BITRATE_VERIFICATION /* Enable bitrate verification - use when playing with bit budget */ @@ -198,6 +199,7 @@ #define FIX_1111_TDM_LSP_BUFFER /* VA: issue 1111: remove unused buffer `tdm_lspQ_PCh[]' */ #define NONBE_1325_TD_STEREO_QUANT_LSF_SEC /* Nokia: issue 1325: fix for usage of active_cnt variable in TD stereo LSFQ */ #define NONBE_FIX_1130_DIV_ZERO_LEV_DUR /* VA: issue 1130: avoid div by zero in L-D by thresholding R[0] to a min value of 100.0 */ +#define NONBE_1329_FIX_OSBA_CRASH /* FhG: issue 1329: prevent assert when bit budget is low*/ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_enc/enc_prm.c b/lib_enc/enc_prm.c index fb1a338ee6b9e86dc0cd728e9f0e59f42624e6b1..951ae35b70ddaf5b2c5937ed790f0ee92ca14330 100644 --- a/lib_enc/enc_prm.c +++ b/lib_enc/enc_prm.c @@ -565,6 +565,12 @@ void writeTCXparam( nbits_tcx, NPRM_RESQ * st->hTcxCfg->resq, flag_ctx_hm ? &hm_cfg[k] : NULL ); } } +#ifdef DEBUG_PLOT_BITS + if ( core == TCX_10_CORE ) + { + dbgwrite( &nbits_tcx, sizeof( int16_t ), 1, 1, "./res/bits_RC" ); + } +#endif } } #ifdef DEBUG_PLOT_BITS @@ -576,6 +582,15 @@ void writeTCXparam( dbgwrite( &tmp, sizeof( int16_t ), 1, 1, "./res/bits_TNS" ); } } + else + { + if ( nSubframes == 1 ) + { + tmp = 0; + dbgwrite( &nbits_tcx, sizeof( int16_t ), 1, 1, "./res/bits_RC" ); + dbgwrite( &tmp, sizeof( int16_t ), 1, 1, "./res/bits_RC" ); + } + } #endif return; diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c index db2e60fada703ae07198684798ebe0859e058598..8f6eb68b96a4efa2f43c9f3e87361b48b2a11ff0 100644 --- a/lib_enc/ivas_enc.c +++ b/lib_enc/ivas_enc.c @@ -412,6 +412,11 @@ ivas_error ivas_enc( /* get SBA TCs */ ivas_sba_getTCs( &data_f[n], st_ivas, input_frame ); } +#ifdef DEBUG_OSBA_MD_BITS + { + dbgwrite( &nb_bits_metadata[0], sizeof( int16_t ), hEncoderConfig->nchan_ism + 1, 1, "./res/osba_md_bits" ); + } +#endif /* core-coding of transport channels */ if ( st_ivas->nSCE == 1 ) diff --git a/lib_enc/ivas_mct_core_enc.c b/lib_enc/ivas_mct_core_enc.c index e091c53c1e0c6d71f58695aaad3b449c7e2787d1..c378d66dca0710f9b7b86f9a91bf0ba62df3e915 100644 --- a/lib_enc/ivas_mct_core_enc.c +++ b/lib_enc/ivas_mct_core_enc.c @@ -452,6 +452,10 @@ void ivas_mct_core_enc( /*write IGF data to bitstream*/ for ( ch = 0; ch < nChannels; ch++ ) { +#ifdef DEBUG_PLOT_BITS + int16_t tmp = hBstr->nb_bits_tot; +#endif + st = sts[ch]; if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) @@ -459,6 +463,10 @@ void ivas_mct_core_enc( continue; } enc_prm_igf_mdct( st, hBstr ); +#ifdef DEBUG_PLOT_BITS + tmp = hBstr->nb_bits_tot - tmp; + dbgwrite( &tmp, sizeof( int16_t ), 1, 1, "./res/bits_IGF" ); +#endif } } diff --git a/lib_enc/ivas_mdct_core_enc.c b/lib_enc/ivas_mdct_core_enc.c index 8085fea23142b6919af287743b44bb40d653b2aa..0c669b581a4010aa9552aa087aee536e14ea5723 100644 --- a/lib_enc/ivas_mdct_core_enc.c +++ b/lib_enc/ivas_mdct_core_enc.c @@ -1146,6 +1146,9 @@ void ivas_mdct_core_whitening_enc( skipped_first_channel = 0; for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { +#ifdef DEBUG_PLOT_BITS + int16_t tmp = hBstr->nb_bits_tot; +#endif st = sts[ch]; if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) @@ -1170,6 +1173,11 @@ void ivas_mdct_core_whitening_enc( } encode_lpc_avq( hBstr, num_sns, param_lpc[ch], st->core, st->element_mode ); +#ifdef DEBUG_PLOT_BITS + tmp = hBstr->nb_bits_tot - tmp; + dbgwrite( &tmp, sizeof( int16_t ), 1, 1, "./res/bits_SNS" ); +#endif + st->side_bits_frame_channel += hBstr->nb_bits_tot - nbits_start_sns; } } diff --git a/lib_enc/ivas_stereo_mdct_stereo_enc.c b/lib_enc/ivas_stereo_mdct_stereo_enc.c index 9dce03e6edc973004fc1852c5d92f3220f350aba..4fa7dc15b2b1c23d8901ef7adcb36715eefba9cb 100644 --- a/lib_enc/ivas_stereo_mdct_stereo_enc.c +++ b/lib_enc/ivas_stereo_mdct_stereo_enc.c @@ -411,17 +411,30 @@ void stereo_coder_tcx( nAvailBitsMS[k] = ( ( mct_on ? 2 * sts[0]->bits_frame_channel : sts[0]->bits_frame_nominal ) - sts[0]->side_bits_frame_channel - sts[1]->side_bits_frame_channel - ( nSubframes == 2 ? OFFSET_BITS_TCX10 : OFFSET_BITS_TCX20 ) ) / nSubframes; - MsStereoDecision( sfbConf, sts[0]->hTcxEnc->spectrum[k], sts[1]->hTcxEnc->spectrum[k], inv_spectrum[0][k], inv_spectrum[1][k], &hStereoMdct->mdct_stereo_mode[k], &ms_mask[k][0], nAvailBitsMS[k] ); - - if ( sts[0]->igf ) +#ifdef NONBE_1329_FIX_OSBA_CRASH + if ( mct_on && nAvailBitsMS[k] <= 0 ) /*Force M/S when bit-budget is low for MCT*/ { - IGFEncStereoEncoder( sfbConf, sts[0]->hIGFEnc, sts[0]->hTcxEnc->spectrum[k], sts[1]->hTcxEnc->spectrum[k], &ms_mask[k][0], - &hStereoMdct->IGFStereoMode[k], hStereoMdct->mdct_stereo_mode[k], sts[0]->core == TCX_20_CORE, sts[0]->last_core == ACELP_CORE ); + hStereoMdct->mdct_stereo_mode[k] = 1; + hStereoMdct->IGFStereoMode[k] = 1; + set_s( ms_mask[k], 1, sfbConf->sfbCnt ); } else { - hStereoMdct->IGFStereoMode[k] = hStereoMdct->mdct_stereo_mode[k]; +#endif + MsStereoDecision( sfbConf, sts[0]->hTcxEnc->spectrum[k], sts[1]->hTcxEnc->spectrum[k], inv_spectrum[0][k], inv_spectrum[1][k], &hStereoMdct->mdct_stereo_mode[k], &ms_mask[k][0], nAvailBitsMS[k] ); + + if ( sts[0]->igf ) + { + IGFEncStereoEncoder( sfbConf, sts[0]->hIGFEnc, sts[0]->hTcxEnc->spectrum[k], sts[1]->hTcxEnc->spectrum[k], &ms_mask[k][0], + &hStereoMdct->IGFStereoMode[k], hStereoMdct->mdct_stereo_mode[k], sts[0]->core == TCX_20_CORE, sts[0]->last_core == ACELP_CORE ); + } + else + { + hStereoMdct->IGFStereoMode[k] = hStereoMdct->mdct_stereo_mode[k]; + } +#ifdef NONBE_1329_FIX_OSBA_CRASH } +#endif if ( hStereoMdct->mdct_stereo_mode[k] != SMDCT_DUAL_MONO || hStereoMdct->IGFStereoMode[k] != SMDCT_DUAL_MONO ) {