diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index adfdcdbaf63ae990b0dbd2e1ebe9420ee34e6c5e..2ede92976988567667f82c9037c1dcd3094f12bb 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3148,6 +3148,10 @@ int16_t ivas_qmetadata_dec_sid_decode( const int16_t nchan_transport, /* i : number of transport channels */ int16_t *element_mode, /* o : element mode */ const int16_t ivas_format /* i : IVAS format */ +#ifdef SBA_MODE_CLEANUP_2 + , + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +#endif ); void ivas_qmetadata_to_dirac( diff --git a/lib_com/options.h b/lib_com/options.h index aafa43e9af5b6de1ea997816ba41fae928c6feec..518446989b5c7eb4bce9d585df50bc6a01f088fa 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -186,6 +186,8 @@ #define FIX_528_ISM_MD_FILE_TOO_SHORT /* VA: issue 528: ISM Metadata file too short */ +#define SBA_MODE_CLEANUP_2 /*Dlb : Clean up of Unused signaling bit in SBA SID*/ + /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/ivas_dirac_dec.c b/lib_dec/ivas_dirac_dec.c index 0524ceef704fe3d5899aad912ed1294418f84706..fdaa7945b2b2456de75a601deb011c58fa6aaaf8 100644 --- a/lib_dec/ivas_dirac_dec.c +++ b/lib_dec/ivas_dirac_dec.c @@ -1729,7 +1729,12 @@ void ivas_dirac_dec_read_BS( } } - *nb_bits += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), 0, NULL, SBA_FORMAT ); + *nb_bits += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), 0, NULL, SBA_FORMAT +#ifdef SBA_MODE_CLEANUP_2 + , + ivas_total_brate +#endif + ); 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]; @@ -1777,9 +1782,11 @@ 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 ); +#ifndef SBA_MODE_CLEANUP_2 /* 1 bit flag for SPAR/DirAC, already read in read format function */ b = st->bit_stream[( st->next_bit_pos )--]; ( *nb_bits )++; +#endif hQMetaData->sba_inactive_mode = 1; orig_dirac_bands = hQMetaData->q_direction[0].cfg.nbands; @@ -1796,7 +1803,12 @@ void ivas_dirac_dec_read_BS( } } - *nb_bits += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), 0, NULL, SBA_FORMAT ); + *nb_bits += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), 0, NULL, SBA_FORMAT +#ifdef SBA_MODE_CLEANUP_2 + , + ivas_total_brate +#endif + ); 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]; diff --git a/lib_dec/ivas_init_dec.c b/lib_dec/ivas_init_dec.c index 351158d3d065fa6b478d8d583de24ca272d0441b..48748e064f551f684bb777d7fa01ff1501a60f7d 100644 --- a/lib_dec/ivas_init_dec.c +++ b/lib_dec/ivas_init_dec.c @@ -452,9 +452,11 @@ static ivas_error ivas_read_format( if ( st_ivas->ivas_format == SBA_FORMAT ) { +#ifndef SBA_MODE_CLEANUP_2 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]; +#endif if ( st_ivas->sba_analysis_order == 0 ) { st_ivas->sba_analysis_order = SBA_FOA_ORDER; diff --git a/lib_dec/ivas_masa_dec.c b/lib_dec/ivas_masa_dec.c index 45f56875ff24dfe627a6bc679cabe59cac766aaf..eeb001fbe90a976a4fb967d05cb37180148fa6a7 100644 --- a/lib_dec/ivas_masa_dec.c +++ b/lib_dec/ivas_masa_dec.c @@ -270,7 +270,12 @@ ivas_error ivas_masa_decode( } tmp_elem_mode = -1; - *nb_bits_read += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), st_ivas->nchan_transport, &tmp_elem_mode, ivas_format ); + *nb_bits_read += ivas_qmetadata_dec_sid_decode( hQMetaData, st->bit_stream, &( st->next_bit_pos ), st_ivas->nchan_transport, &tmp_elem_mode, ivas_format +#ifdef SBA_MODE_CLEANUP_2 + , + ivas_total_brate +#endif + ); if ( st_ivas->nchan_transport == 2 ) { assert( st_ivas->nCPE > 0 ); diff --git a/lib_dec/ivas_qmetadata_dec.c b/lib_dec/ivas_qmetadata_dec.c index a9fc4693f0d7bdbadb730427b0d37b9bfdafef3e..4b2ab4068aef1ae1dbb467fc4ea2496976e0ba11 100644 --- a/lib_dec/ivas_qmetadata_dec.c +++ b/lib_dec/ivas_qmetadata_dec.c @@ -1157,6 +1157,10 @@ int16_t ivas_qmetadata_dec_sid_decode( const int16_t nchan_transport, /* i : number of transport channels */ int16_t *element_mode, /* o : element mode */ const int16_t ivas_format /* i : IVAS format */ +#ifdef SBA_MODE_CLEANUP_2 + , + const int32_t ivas_total_brate /* i : IVAS total bitrate */ +#endif ) { int16_t b, m, i; @@ -1187,8 +1191,19 @@ int16_t ivas_qmetadata_dec_sid_decode( if ( ivas_format == SBA_FORMAT ) { +#ifdef SBA_MODE_CLEANUP_2 + if ( ivas_total_brate == IVAS_SID_5k2 ) + { + metadata_sid_bits = (int16_t) ( 5000 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * 18 ); + } + else + { + 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 /* 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*/ +#endif } else { diff --git a/lib_enc/ivas_dirac_enc.c b/lib_enc/ivas_dirac_enc.c index 1a25541d313e2caf29de099c1b5e3c83fb594dee..2a65cf0f4465dc3e927fd724031bdfa41a1c96fc 100644 --- a/lib_enc/ivas_dirac_enc.c +++ b/lib_enc/ivas_dirac_enc.c @@ -343,9 +343,10 @@ void ivas_dirac_enc( hQMetaData->q_direction[0].band_data[1].elevation[i] = hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].elevation[i]; hQMetaData->q_direction[0].band_data[1].energy_ratio[i] = hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].energy_ratio[i]; } - +#ifndef SBA_MODE_CLEANUP_2 /* 1 bit to indicate mode MD coding : temp solution*/ push_next_indice( hMetaData, 1, 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 ad34d810c1095289938c5836b8d6f03cbc54696a..129ff0c449c6a253314d1bb8d0c3a13d5e8f356f 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -985,8 +985,12 @@ void ivas_qmetadata_enc_sid_encode( if ( ivas_format == SBA_FORMAT ) { +#ifdef SBA_MODE_CLEANUP_2 + metadata_sid_bits = (int16_t) ( 5000 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - ( SPAR_DTX_BANDS * SPAR_SID_BITS_TAR_PER_BAND ); +#else /* 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*/ +#endif } else { @@ -1215,7 +1219,11 @@ void reset_metadata_spatial( if ( ivas_format == SBA_FORMAT ) { #ifdef DEBUGGING +#ifdef SBA_MODE_CLEANUP_2 + assert( hMetaData->ind_list[0].nb_bits >= 1 ); +#else assert( hMetaData->ind_list[0].nb_bits == 1 ); +#endif #endif hMetaData->ind_list[0].value = 1; metadata_sid_bits = (int16_t) ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS;