diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index 56727731b5ea89c535e91e44354c9360cd1b062d..5b57c35017e5e55a012584211605807fb3881f71 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 ab4d931ad2cfe6a180c22060f41619324763f018..999caf3cc11e27012bd7624b6afa75236c2cc897 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 e5633fd9e55c8828ff3ead537ef9d72d6cc0dfae..daa581012a72260db13ea4548d7ab24cddfde67e 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -118,6 +118,7 @@ #define CONF_DISTATT /* Eri: Make distance attenuation configurable */ #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_1052_SBA_EXT /* Dlb: SBA external output support */ #define NONBE_FIX_MC_LFE_LPF /* Dlb: Adding the LFE LPF filter back for MC content. */ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_dec/ivas_dirac_dec_fx.c b/lib_dec/ivas_dirac_dec_fx.c index 9de2904b8f65f8c3ac020444860a8de1577b7cfa..be043d5b82224296288bdf4e1a46ea0ac69f0f41 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 bab1a909fcb9d860cdf72d11c8421094f307137d..674e08ee8f2d01a641f33993c114f41e38867b67 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 182ed54abd6a38d87d513abcadd8f33ef049097b..bf0cbbd8e5bf391ca94de5b84806fac3dd9190bf 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 29defd7f2882d5e22ab69a6dfe88ac197ffbeebe..f96608d24f51caad7a89d7841abd5cd3c2115f29 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 a75c47e85a92c959e7847769a2d69067c72d0fbe..204840cc44dbab99b7840796d6b761260728c57f 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 515659124b386a445531893de9db8d1862a2fb22..edc45174ecfeb49864c8951cc7d5c6bb73a2e87a 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 db4551d27731d455c2d7e8e862a992fab194c8a9..b6b41b8478214cae2b3017abf60bbbfaa54bc91a 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 72cc9d78da5296ed31afb0a82f73d9da500f0a04..a9b635283d87f89f6cb6d0d63fa6037ad743e802 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 c9a8428eb5566cc65ed35a53ab00430f7f264dd9..facbde22f370bd837c0144ad58b5517a34ef3c6d 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 65420a56dd8a7e65f471677181b5ef668b40627b..5ff9878b2d99f2f8e13df7bb32ef17cc53fed36f 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 d7f34022bb0d80d1927c2fc88e3d86b0c842de85..cd82b3a9a583c9ae894d6cf4014e3417b454c3aa 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 8769c748b91b395ff954568e5b766a8278625a1f..954ca5149c6485f78290defcd524144549a30374 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 ) ) {