From ef3359a7d09a28d765cde15d1b5b7b98444f78d8 Mon Sep 17 00:00:00 2001 From: rtyag Date: Thu, 7 Aug 2025 14:48:04 +1000 Subject: [PATCH] basop changes for mr1539 --- lib_com/ivas_prot_fx.h | 23 +++++++++---- lib_com/ivas_sba_config_fx.c | 24 ++++++++++++++ lib_com/options.h | 1 + lib_dec/ivas_dirac_dec_fx.c | 21 ++++++++++-- lib_dec/ivas_init_dec_fx.c | 58 +++++++++++++++++++++++++++++++++ lib_dec/ivas_qmetadata_dec_fx.c | 9 +++++ lib_dec/ivas_spar_decoder_fx.c | 14 +++++++- lib_dec/ivas_spar_md_dec_fx.c | 8 +++++ lib_enc/ivas_cpe_enc_fx.c | 10 ++++++ lib_enc/ivas_dirac_enc_fx.c | 9 ++++- lib_enc/ivas_masa_enc_fx.c | 4 +++ lib_enc/ivas_qmetadata_enc_fx.c | 19 ++++++++++- lib_enc/ivas_sce_enc_fx.c | 10 ++++++ lib_enc/ivas_spar_encoder_fx.c | 7 ++++ lib_enc/ivas_spar_md_enc_fx.c | 8 +++++ 15 files changed, 214 insertions(+), 11 deletions(-) diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index 56727731b..5b57c3501 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -2336,7 +2336,10 @@ void ivas_dirac_dec_read_BS_fx( Word16 *nb_bits, /* o : number of bits read */ const Word16 last_bit_pos, /* i : last read bitstream position */ const Word16 hodirac_flag, /* i : flag to indicate HO-DirAC mode */ - Word16 *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ +#ifdef NONBE_FIX_1052_SBA_EXT + const Word16 nchan_transport, /* i : number of transport channels */ +#endif + Word16 *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ); ivas_error ivas_dirac_dec_config_fx( @@ -2496,6 +2499,13 @@ Word16 ivas_sba_get_nchan_metadata_fx( const Word32 ivas_total_brate /* i : IVAS total bitrate */ ); +#ifdef NONBE_FIX_1052_SBA_EXT +/*! r: number of bits in SPAR SID frame */ +Word16 ivas_sba_spar_sid_bitlen_fx( + const Word16 nchan_transport /* i : number of transport channels */ +); +#endif + void ivas_sba_get_spar_hoa_ch_ind_fx( const Word16 num_md_chs, /* i : number of MD channels */ const Word32 ivas_total_brate, /* i : IVAS total bitrate */ @@ -3500,6 +3510,9 @@ void ivas_qmetadata_enc_sid_encode_fx( BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ IVAS_QMETADATA *q_metadata, /* i/o: metadata handle */ const Word16 masa_sid_descriptor, /* i : description of MASA SID coding structure*/ +#ifdef NONBE_FIX_1052_SBA_EXT + const Word16 nchan_transport, /* i : number of transport channels */ +#endif const Word16 ivas_format /* i : ivas format */ ); void ivas_param_mc_enc_fx( @@ -4974,11 +4987,6 @@ Word16 ivas_sba_get_nchan_metadata( const Word32 ivas_total_brate /* i : IVAS total bitrate */ ); -void ivas_sba_get_spar_hoa_ch_ind( - const Word16 num_md_chs, /* i : number of MD channels */ - const Word32 ivas_total_brate, /* i : IVAS total bitrate */ - Word16 HOA_md_ind[IVAS_SPAR_MAX_CH] ); - /*! r: flag indicating to code SPAR HOA MD for all bands */ void ivas_sba_get_spar_hoa_md_flag( const Word16 sba_order, /* i : Ambisonic (SBA) order */ @@ -5838,6 +5846,9 @@ ivas_error ivas_dirac_enc_fx( const Word16 input_frame, /* i : input frame length */ const Word16 dtx_vad, /* i : DTX vad flag */ const IVAS_FORMAT ivas_format, /* i : ivas format */ +#ifdef NONBE_FIX_1052_SBA_EXT + const Word16 nchan_transport, /* i : number of transport channels */ +#endif const Word16 hodirac_flag, /* i : hodirac flag */ const Word16 shift ); diff --git a/lib_com/ivas_sba_config_fx.c b/lib_com/ivas_sba_config_fx.c index ab4d931ad..999caf3cc 100644 --- a/lib_com/ivas_sba_config_fx.c +++ b/lib_com/ivas_sba_config_fx.c @@ -167,6 +167,30 @@ Word16 ivas_sba_get_nchan_fx( } +#ifdef NONBE_FIX_1052_SBA_EXT +/*-------------------------------------------------------------------* + * ivas_sba_spar_sid_bitlen_fx() + * + * Get number of bits in SPAR SID frame + *-------------------------------------------------------------------*/ + +/*! r: number of bits in SPAR SID frame */ +Word16 ivas_sba_spar_sid_bitlen_fx( + const Word16 nchan_transport /* i : number of transport channels */ +) +{ + Word16 num_bits; + + num_bits = i_mult( SPAR_DTX_BANDS, SPAR_SID_BITS_TAR_PER_BAND ); + IF( GT_16( nchan_transport, 1 ) ) + { + num_bits = sub( num_bits, 2 ); + } + + return num_bits; +} +#endif + /*-------------------------------------------------------------------* * ivas_sba_get_nchan_metadata() * diff --git a/lib_com/options.h b/lib_com/options.h index 14fd30ac5..998d423e7 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -118,6 +118,7 @@ #define FIX_1068_ASAN_IN_MC_2_BINAURAL_ROOM_IR /* issue 1068 : Memory leak in MC to BINAURAL_ROOM decoding with bitrate switching*/ /*#define NONBE_FIX_MC_LFE_LPF */ /* Dlb: Adding the LFE LPF filter back for MC content. */ +#define NONBE_FIX_1052_SBA_EXT /* Dlb: SBA external output support */ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_dec/ivas_dirac_dec_fx.c b/lib_dec/ivas_dirac_dec_fx.c index 9de2904b8..be043d5b8 100644 --- a/lib_dec/ivas_dirac_dec_fx.c +++ b/lib_dec/ivas_dirac_dec_fx.c @@ -1246,7 +1246,10 @@ void ivas_dirac_dec_read_BS_fx( Word16 *nb_bits, /* o : number of bits read */ const Word16 last_bit_pos, /* i : last read bitstream position */ const Word16 hodirac_flag, /* i : flag to indicate HO-DirAC mode */ - Word16 *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ +#ifdef NONBE_FIX_1052_SBA_EXT + const Word16 nchan_transport, /* i : number of transport channels */ +#endif + Word16 *dirac_to_spar_md_bands /* o : DirAC->SPAR MD bands */ ) { Word16 i, j, b, dir, orig_dirac_bands; @@ -1289,9 +1292,13 @@ void ivas_dirac_dec_read_BS_fx( set32_fx( hQMetaData->q_direction[0].band_data[b].elevation_fx, 0, MAX_PARAM_SPATIAL_SUBFRAMES ); } } +#ifdef NONBE_FIX_1052_SBA_EXT + *nb_bits = add( *nb_bits, ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), nchan_transport, NULL, SBA_FORMAT ) ); + move16(); +#else *nb_bits = add( *nb_bits, ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), 0, NULL, SBA_FORMAT ) ); move16(); - +#endif FOR( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) { hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].azimuth_fx[i] = hQMetaData->q_direction[0].band_data[1].azimuth_fx[0]; @@ -1351,7 +1358,12 @@ void ivas_dirac_dec_read_BS_fx( /* subtract mode signaling bits, since bitstream was moved after mode reading */ iDiv_and_mod_32( ivas_total_brate, FRAMES_PER_SEC, &quo, &rem, 0 ); +#ifdef NONBE_FIX_1052_SBA_EXT + st->next_bit_pos = extract_l( L_sub( L_sub( quo, 1 ), SID_FORMAT_NBITS + SBA_PLANAR_BITS + SBA_ORDER_BITS ) ); +#else st->next_bit_pos = extract_l( L_sub( L_sub( quo, 1 ), SID_FORMAT_NBITS ) ); +#endif + move16(); /* 1 bit flag for signaling metadata to read */ b = st->bit_stream[( st->next_bit_pos )--]; @@ -1374,8 +1386,13 @@ void ivas_dirac_dec_read_BS_fx( } } } +#ifdef NONBE_FIX_1052_SBA_EXT + *nb_bits = add( *nb_bits, ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), nchan_transport, NULL, SBA_FORMAT ) ); + move16(); +#else *nb_bits = add( *nb_bits, ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), 0, NULL, SBA_FORMAT ) ); move16(); +#endif FOR( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ ) { hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].azimuth_fx[i] = hQMetaData->q_direction[0].band_data[1].azimuth_fx[0]; diff --git a/lib_dec/ivas_init_dec_fx.c b/lib_dec/ivas_init_dec_fx.c index bab1a909f..674e08ee8 100644 --- a/lib_dec/ivas_init_dec_fx.c +++ b/lib_dec/ivas_init_dec_fx.c @@ -55,6 +55,10 @@ static ivas_error ivas_read_format( Decoder_Struct *st_ivas, Word16 *num_bits_re static ivas_error doSanityChecks_IVAS( Decoder_Struct *st_ivas ); +#ifdef NONBE_FIX_1052_SBA_EXT +static AUDIO_CONFIG ivas_set_output_config_from_sba_order( const Word16 sba_order ); +#endif + static ivas_error ivas_dec_reconfig_split_rend( Decoder_Struct *st_ivas ); @@ -257,6 +261,29 @@ static ivas_error ivas_dec_init_split_rend( return error; } +#ifdef NONBE_FIX_1052_SBA_EXT +static AUDIO_CONFIG ivas_set_output_config_from_sba_order( const Word16 sba_order ) +{ + AUDIO_CONFIG output_config; + output_config = IVAS_AUDIO_CONFIG_HOA3; + switch ( sba_order ) + { + case SBA_FOA_ORDER: + output_config = IVAS_AUDIO_CONFIG_FOA; + break; + case SBA_HOA2_ORDER: + output_config = IVAS_AUDIO_CONFIG_HOA2; + break; + case SBA_HOA3_ORDER: + output_config = IVAS_AUDIO_CONFIG_HOA3; + break; + default: + assert( 0 ); + } + return output_config; +} +#endif + /*-------------------------------------------------------------------* * ivas_dec_setup() * @@ -351,6 +378,14 @@ ivas_error ivas_dec_setup( move16(); st_ivas->sba_order = add( st_ivas->sba_order, shl( st_ivas->bit_stream[num_bits_read], 1 ) ); move16(); +#ifdef NONBE_FIX_1052_SBA_EXT + IF( EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) + { + st_ivas->hDecoderConfig->output_config = ivas_set_output_config_from_sba_order( st_ivas->sba_order ); + st_ivas->hDecoderConfig->nchan_out = audioCfg2channels( st_ivas->hDecoderConfig->output_config ); + } +#endif + num_bits_read = add( num_bits_read, SBA_ORDER_BITS ); test(); test(); @@ -660,6 +695,14 @@ ivas_error ivas_dec_setup( BREAK; } +#ifdef NONBE_FIX_1052_SBA_EXT + IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) && EQ_32( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_EXTERNAL ) ) + { + st_ivas->hDecoderConfig->output_config = ivas_set_output_config_from_sba_order( st_ivas->sba_order ); + st_ivas->hDecoderConfig->nchan_out = audioCfg2channels( st_ivas->hDecoderConfig->output_config ); + } +#endif + test(); IF( st_ivas->ini_frame > 0 && EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) { @@ -998,6 +1041,21 @@ static ivas_error ivas_read_format( IF( EQ_32( st_ivas->ivas_format, SBA_FORMAT ) ) { +#ifdef NONBE_FIX_1052_SBA_EXT + /* read Ambisonic (SBA) planar flag */ + st_ivas->sba_planar = st_ivas->bit_stream[*num_bits_read]; + move16(); + *num_bits_read = add( *num_bits_read, SBA_PLANAR_BITS ); + move16(); + + /* read Ambisonic (SBA) order */ + st_ivas->sba_order = st_ivas->bit_stream[*num_bits_read + 1]; + move16(); + st_ivas->sba_order = add( st_ivas->sba_order, shl( st_ivas->bit_stream[*num_bits_read], 1 ) ); + move16(); + *num_bits_read = add( *num_bits_read, SBA_ORDER_BITS ); + move16(); +#endif if ( st_ivas->sba_analysis_order == 0 ) { st_ivas->sba_analysis_order = SBA_FOA_ORDER; diff --git a/lib_dec/ivas_qmetadata_dec_fx.c b/lib_dec/ivas_qmetadata_dec_fx.c index 182ed54ab..bf0cbbd8e 100644 --- a/lib_dec/ivas_qmetadata_dec_fx.c +++ b/lib_dec/ivas_qmetadata_dec_fx.c @@ -1185,11 +1185,20 @@ Word16 ivas_qmetadata_dec_sid_decode( Word32 direction_vector_fx[3]; Word16 metadata_sid_bits; /* bits allocated to SID for metadata */ Word16 bits_delta, bits_dir; +#ifdef NONBE_FIX_1052_SBA_EXT + Word16 sba_spar_bitlen; +#endif IF( EQ_16( ivas_format, SBA_FORMAT ) ) { +#ifdef NONBE_FIX_1052_SBA_EXT + sba_spar_bitlen = ivas_sba_spar_sid_bitlen_fx( nchan_transport ); + metadata_sid_bits = (int16_t) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS - SBA_ORDER_BITS - SBA_PLANAR_BITS - 1; /* -1 for inactive mode header bit*/ + metadata_sid_bits = sub( metadata_sid_bits, sba_spar_bitlen ); +#else metadata_sid_bits = (Word16) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * SPAR_SID_BITS_TAR_PER_BAND ) - 2 - SID_FORMAT_NBITS; /* -1 for inactive mode header bit*/ move16(); +#endif } ELSE { diff --git a/lib_dec/ivas_spar_decoder_fx.c b/lib_dec/ivas_spar_decoder_fx.c index 29defd7f2..f96608d24 100644 --- a/lib_dec/ivas_spar_decoder_fx.c +++ b/lib_dec/ivas_spar_decoder_fx.c @@ -416,7 +416,11 @@ ivas_error ivas_spar_dec_fx( /* read DirAC bitstream */ IF( st_ivas->hQMetaData != NULL ) { +#ifdef NONBE_FIX_1052_SBA_EXT + ivas_dirac_dec_read_BS_fx( hDecoderConfig->ivas_total_brate, st0, st_ivas->hDirAC, st_ivas->hSpatParamRendCom, st_ivas->hQMetaData, nb_bits_read, last_bit_pos, ivas_get_hodirac_flag_fx( hDecoderConfig->ivas_total_brate, st_ivas->sba_analysis_order ), st_ivas->nchan_transport, st_ivas->hSpar->dirac_to_spar_md_bands ); +#else ivas_dirac_dec_read_BS_fx( hDecoderConfig->ivas_total_brate, st0, st_ivas->hDirAC, st_ivas->hSpatParamRendCom, st_ivas->hQMetaData, nb_bits_read, last_bit_pos, ivas_get_hodirac_flag_fx( hDecoderConfig->ivas_total_brate, st_ivas->sba_analysis_order ), st_ivas->hSpar->dirac_to_spar_md_bands ); +#endif } IF( EQ_32( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) @@ -433,7 +437,11 @@ ivas_error ivas_spar_dec_fx( test(); if ( !st0->bfi && EQ_32( hDecoderConfig->ivas_total_brate, IVAS_SID_5k2 ) ) { - last_bit_pos = sub( last_bit_pos, SID_FORMAT_NBITS ); /*Q0*/ +#ifdef NONBE_FIX_1052_SBA_EXT + last_bit_pos = sub( last_bit_pos, ( SID_FORMAT_NBITS + SBA_PLANAR_BITS + SBA_ORDER_BITS ) ); /*Q0*/ +#else + last_bit_pos = sub( last_bit_pos, SID_FORMAT_NBITS ); /*Q0*/ +#endif } nb_bits_read_orig = *nb_bits_read; /*Q0*/ move16(); @@ -476,7 +484,11 @@ ivas_error ivas_spar_dec_fx( IF( !st0->bfi && EQ_32( hDecoderConfig->ivas_total_brate, IVAS_SID_5k2 ) ) { Word16 zero_pad_bits; +#ifdef NONBE_FIX_1052_SBA_EXT + *nb_bits_read = add( *nb_bits_read, SID_FORMAT_NBITS + SBA_PLANAR_BITS + SBA_ORDER_BITS ); /*Q0*/ +#else *nb_bits_read = add( *nb_bits_read, SID_FORMAT_NBITS ); /*Q0*/ +#endif move16(); zero_pad_bits = sub( ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC, *nb_bits_read ); /*Q0*/ assert( zero_pad_bits <= 1 ); diff --git a/lib_dec/ivas_spar_md_dec_fx.c b/lib_dec/ivas_spar_md_dec_fx.c index a75c47e85..204840cc4 100644 --- a/lib_dec/ivas_spar_md_dec_fx.c +++ b/lib_dec/ivas_spar_md_dec_fx.c @@ -2646,6 +2646,9 @@ static void ivas_parse_parameter_bitstream_dtx( Word32 pr_min_max_fx[2]; Word16 pr_q_lvls, pr, pd, pd_q_lvls, pr_pd_bits; Word16 zero_pad_bits, sid_bits_len; +#ifdef NONBE_FIX_1052_SBA_EXT + Word16 sba_spar_bitlen; +#endif sid_bits_len = st0->next_bit_pos; /*Q0*/ move16(); @@ -2731,7 +2734,12 @@ static void ivas_parse_parameter_bitstream_dtx( } sid_bits_len = sub( st0->next_bit_pos, sid_bits_len ); +#ifdef NONBE_FIX_1052_SBA_EXT + sba_spar_bitlen = ivas_sba_spar_sid_bitlen_fx( num_dmx_per_band[0] ); + zero_pad_bits = sub( sba_spar_bitlen, sid_bits_len ); +#else zero_pad_bits = sub( ( SPAR_DTX_BANDS * SPAR_SID_BITS_TAR_PER_BAND ), sid_bits_len ); +#endif assert( zero_pad_bits >= 0 ); if ( EQ_16( num_dmx_per_band[0], 2 ) ) { diff --git a/lib_enc/ivas_cpe_enc_fx.c b/lib_enc/ivas_cpe_enc_fx.c index 515659124..edc45174e 100644 --- a/lib_enc/ivas_cpe_enc_fx.c +++ b/lib_enc/ivas_cpe_enc_fx.c @@ -1084,6 +1084,16 @@ ivas_error ivas_cpe_enc_fx( IF( EQ_32( sts[0]->core_brate, SID_2k40 ) ) { ivas_write_format_sid_fx( ivas_format, hCPE->element_mode, sts[0]->hBstr ); +#ifdef NONBE_FIX_1052_SBA_EXT + IF( EQ_32( ivas_format, SBA_FORMAT ) ) + { + /* Write SBA planar flag */ + push_indice( sts[0]->hBstr, IND_SMODE, st_ivas->hEncoderConfig->sba_planar, SBA_PLANAR_BITS ); + + /* Write SBA order */ + push_indice( sts[0]->hBstr, IND_SMODE, st_ivas->hEncoderConfig->sba_order, SBA_ORDER_BITS ); + } +#endif } /*----------------------------------------------------------------* diff --git a/lib_enc/ivas_dirac_enc_fx.c b/lib_enc/ivas_dirac_enc_fx.c index db4551d27..b6b41b847 100644 --- a/lib_enc/ivas_dirac_enc_fx.c +++ b/lib_enc/ivas_dirac_enc_fx.c @@ -321,7 +321,10 @@ ivas_error ivas_dirac_enc_fx( const Word16 input_frame, /* i : input frame length Q0*/ const Word16 dtx_vad, /* i : DTX vad flag Q0*/ const IVAS_FORMAT ivas_format, /* i : ivas format */ - const Word16 hodirac_flag, /* i : hodirac flag Q0*/ +#ifdef NONBE_FIX_1052_SBA_EXT + const Word16 nchan_transport, /* i : number of transport channels */ +#endif + const Word16 hodirac_flag, /* i : hodirac flag Q0*/ const Word16 shift ) { Word16 orig_dirac_bands; @@ -461,7 +464,11 @@ ivas_error ivas_dirac_enc_fx( push_next_indice( hMetaData, 1, 1 ); /* encode SID parameters */ +#ifdef NONBE_FIX_1052_SBA_EXT + ivas_qmetadata_enc_sid_encode_fx( hMetaData, hQMetaData, -1, nchan_transport, SBA_FORMAT ); +#else ivas_qmetadata_enc_sid_encode_fx( hMetaData, hQMetaData, -1, SBA_FORMAT ); +#endif } Word16 len = 0; diff --git a/lib_enc/ivas_masa_enc_fx.c b/lib_enc/ivas_masa_enc_fx.c index 72cc9d78d..a9b635283 100644 --- a/lib_enc/ivas_masa_enc_fx.c +++ b/lib_enc/ivas_masa_enc_fx.c @@ -776,7 +776,11 @@ ivas_error ivas_masa_encode_fx( free( h_orig_metadata ); +#ifdef NONBE_FIX_1052_SBA_EXT + ivas_qmetadata_enc_sid_encode_fx( hMetaData, hQMetaData, masa_sid_descriptor, 0, ivas_format ); +#else ivas_qmetadata_enc_sid_encode_fx( hMetaData, hQMetaData, masa_sid_descriptor, ivas_format ); +#endif /* restore old values */ hMasa->config.numCodingBands = numCodingBands; diff --git a/lib_enc/ivas_qmetadata_enc_fx.c b/lib_enc/ivas_qmetadata_enc_fx.c index c9a8428eb..facbde22f 100644 --- a/lib_enc/ivas_qmetadata_enc_fx.c +++ b/lib_enc/ivas_qmetadata_enc_fx.c @@ -867,7 +867,10 @@ void ivas_qmetadata_enc_sid_encode_fx( BSTR_ENC_HANDLE hMetaData, /* i/o: metadata bitstream handle */ IVAS_QMETADATA *q_metadata, /* i/o: metadata handle */ const Word16 masa_sid_descriptor, /* i : description of MASA SID coding structure */ - const Word16 ivas_format /* i : IVAS format */ +#ifdef NONBE_FIX_1052_SBA_EXT + const Word16 nchan_transport, /* i : number of transport channels */ +#endif + const Word16 ivas_format /* i : IVAS format */ ) { Word16 b, m; @@ -880,11 +883,21 @@ void ivas_qmetadata_enc_sid_encode_fx( Word32 avg_azimuth_fx[MASA_MAXIMUM_CODING_SUBBANDS]; Word16 bits_dir, bits_diff, bits_delta; Word16 metadata_sid_bits; /* bits allocated to SID for metadata */ +#ifdef NONBE_FIX_1052_SBA_EXT + Word16 sba_spar_bitlen; +#endif IF( EQ_16( ivas_format, SBA_FORMAT ) ) { + +#ifdef NONBE_FIX_1052_SBA_EXT + sba_spar_bitlen = ivas_sba_spar_sid_bitlen_fx( nchan_transport ); + metadata_sid_bits = (int16_t) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS - SBA_ORDER_BITS - SBA_PLANAR_BITS - 1; /* -1 for inactive mode header bit*/ + metadata_sid_bits = sub( metadata_sid_bits, sba_spar_bitlen ); +#else metadata_sid_bits = (Word16) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * SPAR_SID_BITS_TAR_PER_BAND ) - 2 - SID_FORMAT_NBITS; /* -1 for inactive mode header bit*/ move16(); +#endif } ELSE { @@ -1162,8 +1175,12 @@ void reset_metadata_spatial_fx( { hMetaData->ind_list[0].value = 1; move16(); +#ifdef NONBE_FIX_1052_SBA_EXT + metadata_sid_bits = (int16_t) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS - SBA_PLANAR_BITS - SBA_ORDER_BITS; +#else metadata_sid_bits = (Word16) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; move16(); +#endif WHILE( ( hMetaData->nb_bits_tot < metadata_sid_bits ) ) { diff --git a/lib_enc/ivas_sce_enc_fx.c b/lib_enc/ivas_sce_enc_fx.c index 65420a56d..5ff9878b2 100644 --- a/lib_enc/ivas_sce_enc_fx.c +++ b/lib_enc/ivas_sce_enc_fx.c @@ -310,6 +310,16 @@ ivas_error ivas_sce_enc_fx( IF( EQ_32( st->core_brate, SID_2k40 ) ) { ivas_write_format_sid_fx( ivas_format, IVAS_SCE, st->hBstr ); +#ifdef NONBE_FIX_1052_SBA_EXT + IF( EQ_32( ivas_format, SBA_FORMAT ) ) + { + /* Write SBA planar flag */ + push_indice( st->hBstr, IND_SMODE, st_ivas->hEncoderConfig->sba_planar, SBA_PLANAR_BITS ); + + /* Write SBA order */ + push_indice( st->hBstr, IND_SMODE, st_ivas->hEncoderConfig->sba_order, SBA_ORDER_BITS ); + } +#endif } /*----------------------------------------------------------------* diff --git a/lib_enc/ivas_spar_encoder_fx.c b/lib_enc/ivas_spar_encoder_fx.c index d7f34022b..cd82b3a9a 100644 --- a/lib_enc/ivas_spar_encoder_fx.c +++ b/lib_enc/ivas_spar_encoder_fx.c @@ -868,10 +868,17 @@ static ivas_error ivas_spar_enc_process_fx( } pp_fr_q = add( FR_q, pp_fr_q ); +#ifdef NONBE_FIX_1052_SBA_EXT + IF( NE_32( ( error = ivas_dirac_enc_fx( st_ivas->hDirAC, hQMetaData, hMetaData, data_fx, ppIn_FR_real_fx, ppIn_FR_imag_fx, pp_fr_q, input_frame, dtx_vad, hEncoderConfig->ivas_format, nchan_transport, hodirac_flag, shift ) ), IVAS_ERR_OK ) ) + { + return error; + } +#else IF( NE_32( ( error = ivas_dirac_enc_fx( st_ivas->hDirAC, hQMetaData, hMetaData, data_fx, ppIn_FR_real_fx, ppIn_FR_imag_fx, pp_fr_q, input_frame, dtx_vad, hEncoderConfig->ivas_format, hodirac_flag, shift ) ), IVAS_ERR_OK ) ) { return error; } +#endif /* Set Energy Ratio to 0.0 if the mono flag has been set */ IF( hQMetaData->dirac_mono_flag ) diff --git a/lib_enc/ivas_spar_md_enc_fx.c b/lib_enc/ivas_spar_md_enc_fx.c index 8769c748b..954ca5149 100644 --- a/lib_enc/ivas_spar_md_enc_fx.c +++ b/lib_enc/ivas_spar_md_enc_fx.c @@ -1712,6 +1712,9 @@ static void ivas_write_parameter_bitstream_dtx_fx( Word16 idx; Word32 pr_min_max[2]; Word16 zero_pad_bits, sid_bits_len; +#ifdef NONBE_FIX_1052_SBA_EXT + Word16 sba_spar_bitlen; +#endif sid_bits_len = hMetaData->nb_bits_tot; move16(); pr_min_max[0] = pSpar_md->min_max_fx[0]; @@ -1787,7 +1790,12 @@ static void ivas_write_parameter_bitstream_dtx_fx( } sid_bits_len = sub( hMetaData->nb_bits_tot, sid_bits_len ); +#ifdef NONBE_FIX_1052_SBA_EXT + sba_spar_bitlen = ivas_sba_spar_sid_bitlen_fx( num_dmx[0] ); + zero_pad_bits = sub( sba_spar_bitlen, sid_bits_len ); +#else zero_pad_bits = sub( i_mult( SPAR_DTX_BANDS, SPAR_SID_BITS_TAR_PER_BAND ), sid_bits_len ); +#endif assert( zero_pad_bits >= 0 ); IF( EQ_16( num_dmx[0], 2 ) ) { -- GitLab