From ab71e8df78070b81c6a0fb2a240bc515b28272f6 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Tue, 13 Jun 2023 14:45:17 +0300 Subject: [PATCH 1/3] Fix todo in issue 137 for MASA by adjusting SID qmetadata coding for MASA. --- lib_com/options.h | 3 +- lib_dec/ivas_qmetadata_dec.c | 97 ++++++++++++++++++++++++++++--- lib_enc/ivas_qmetadata_enc.c | 108 +++++++++++++++++++++++++++++------ 3 files changed, 181 insertions(+), 27 deletions(-) mode change 100755 => 100644 lib_com/options.h diff --git a/lib_com/options.h b/lib_com/options.h old mode 100755 new mode 100644 index aafa43e9af..0781fd970f --- a/lib_com/options.h +++ b/lib_com/options.h @@ -94,7 +94,7 @@ /*#define DEBUG_DISABLE_DIRAC_DELAY_COMP */ /* temporarily disable delay compensation on DirAC encoder */ /*#define DEBUG_BS_READ_WRITE*/ /*#define DEBUG_MODE_DIRAC_NOCORE*/ -/*#define DEBUG_MODE_QMETADATA*/ /* output q_metadata parameters */ +/*#define DEBUG_MODE_QMETADATA */ /* output q_metadata parameters */ /*MCT Debug switches*/ /*#define DEBUG_FORCE_MCT_CP*/ /* force MCT Stereo pairs for verification with SPAR */ @@ -185,6 +185,7 @@ #define FIX_528_ISM_MD_FILE_TOO_SHORT /* VA: issue 528: ISM Metadata file too short */ +#define FIX_QMETA_SID_5k2 /* Nokia: Issue 137: enable using full 5.2k bitrate in MASA SID */ /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/ivas_qmetadata_dec.c b/lib_dec/ivas_qmetadata_dec.c index a9fc4693f0..1e2f12f15d 100644 --- a/lib_dec/ivas_qmetadata_dec.c +++ b/lib_dec/ivas_qmetadata_dec.c @@ -1169,6 +1169,9 @@ int16_t ivas_qmetadata_dec_sid_decode( float avg_direction_vector[3]; float direction_vector[3]; int16_t metadata_sid_bits; /* bits allocated to SID for metadata */ +#ifdef FIX_QMETA_SID_5k2 + int16_t bits_delta, bits_diff, bits_dir; +#endif #ifdef DEBUG_MODE_QMETADATA static FILE *pF = NULL; static FILE *pF_azi = NULL; @@ -1192,8 +1195,12 @@ int16_t ivas_qmetadata_dec_sid_decode( } else { +#ifdef FIX_QMETA_SID_5k2 + metadata_sid_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; +#else /* 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; +#endif } start_index = *index; @@ -1235,16 +1242,83 @@ int16_t ivas_qmetadata_dec_sid_decode( { q_direction->not_in_2D = 1; } - - /* Decode diffuseness*/ - for ( b = start_band; b < nbands; b++ ) +#ifdef FIX_QMETA_SID_5k2 + bits_diff = 0; + bits_dir = 0; + if ( ivas_format != SBA_FORMAT ) { - diffuseness_index[b] = ivas_qmetadata_DecodeQuasiUniform( bitstream, index, DIRAC_DIFFUSE_LEVELS - 4 ) + 4; - q_direction->band_data[b].energy_ratio_index[0] = diffuseness_index[b]; - q_direction->band_data[b].bits_sph_idx[0] = bits_direction_masa[diffuseness_index[b]]; - q_direction->band_data[b].azimuth_m_alphabet[0] = no_phi_masa[q_direction->band_data[b].bits_sph_idx[0] - 1][0]; + bits_diff = *index; + /* Decode diffuseness*/ + for ( b = start_band; b < nbands; b++ ) + { + diffuseness_index[b] = ivas_qmetadata_DecodeQuasiUniform( bitstream, index, DIRAC_DIFFUSE_LEVELS - 4 ) + 4; + q_direction->band_data[b].energy_ratio_index[0] = diffuseness_index[b]; + q_direction->band_data[b].bits_sph_idx[0] = bits_direction_masa[diffuseness_index[b]]; + bits_dir += q_direction->band_data[b].bits_sph_idx[0]; + q_direction->band_data[b].azimuth_m_alphabet[0] = no_phi_masa[q_direction->band_data[b].bits_sph_idx[0] - 1][0]; + } + bits_diff -= *index; + + bits_delta = metadata_sid_bits - ( start_index - *index ) - bits_dir; /* bit_diff is already read */ + + if ( bits_delta > 0 ) + { + while ( bits_delta > 0 ) + { + for ( b = start_band; b < nbands && ( bits_delta > 0 ); b++ ) + { + if ( q_direction->band_data[b].bits_sph_idx[0] < 11 ) + { + bits_delta -= 1; + q_direction->band_data[b].bits_sph_idx[0]++; + } + } + } + if ( q_direction->not_in_2D == 0 ) + { + for ( b = start_band; b < nbands; b++ ) + { + q_direction->band_data[b].azimuth_m_alphabet[0] = 1 << ( min( 8, q_direction->band_data[b].bits_sph_idx[0] ) ); + } + } + } + else + { + while ( bits_delta < 0 ) + { + for ( b = nbands - 1; b >= start_band && ( bits_delta < 0 ); b-- ) + { + if ( q_direction->band_data[b].bits_sph_idx[0] >= 4 ) + { + bits_delta += 1; + q_direction->band_data[b].bits_sph_idx[0]--; + } + } + if ( q_direction->not_in_2D == 0 ) + { + for ( b = start_band; b < nbands; b++ ) + { + q_direction->band_data[b].azimuth_m_alphabet[0] = 1 << ( min( 8, q_direction->band_data[b].bits_sph_idx[0] ) ); + } + } + } + } } + else + { +#endif + /* Decode diffuseness*/ + for ( b = start_band; b < nbands; b++ ) + { + diffuseness_index[b] = ivas_qmetadata_DecodeQuasiUniform( bitstream, index, DIRAC_DIFFUSE_LEVELS - 4 ) + 4; + q_direction->band_data[b].energy_ratio_index[0] = diffuseness_index[b]; + q_direction->band_data[b].bits_sph_idx[0] = bits_direction_masa[diffuseness_index[b]]; + q_direction->band_data[b].azimuth_m_alphabet[0] = no_phi_masa[q_direction->band_data[b].bits_sph_idx[0] - 1][0]; + } +#ifdef FIX_QMETA_SID_5k2 + } +#endif for ( b = start_band; b < nbands; b++ ) { q_direction->band_data[b].energy_ratio[0] = 1.0f - diffuseness_reconstructions[diffuseness_index[b]]; @@ -1287,7 +1361,14 @@ int16_t ivas_qmetadata_dec_sid_decode( { for ( b = start_band; b < nbands; b++ ) { - q_direction->band_data[b].azimuth_m_alphabet[0] = 1 << ( min( 5, q_direction->band_data[b].bits_sph_idx[0] ) ); +#ifdef FIX_QMETA_SID_5k2 + if ( ivas_format == SBA_FORMAT ) + { +#endif + q_direction->band_data[b].azimuth_m_alphabet[0] = 1 << ( min( 5, q_direction->band_data[b].bits_sph_idx[0] ) ); +#ifdef FIX_QMETA_SID_5k2 + } +#endif q_direction->band_data[b].azimuth_index[0] = ivas_qmetadata_DecodeQuasiUniform( bitstream, index, q_direction->band_data[b].azimuth_m_alphabet[0] ); q_direction->band_data[b].azimuth_index[0] = ivas_qmetadata_dereorder_generic( q_direction->band_data[b].azimuth_index[0] ) + ( q_direction->band_data[b].azimuth_m_alphabet[0] >> 1 ); avg_azimuth = 360.0f / (float) ( q_direction->band_data[b].azimuth_m_alphabet[0] ) * q_direction->band_data[b].azimuth_index[0] - 180; diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index ad34d810c1..b0dbab734e 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -991,7 +991,11 @@ void ivas_qmetadata_enc_sid_encode( else { /* TODO: still use old sid frame size to keep bitexactness */ +#ifdef FIX_QMETA_SID_5k2 + metadata_sid_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; +#else metadata_sid_bits = ( 4400 /*IVAS_SID_5k2*/ - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; +#endif } #ifdef DEBUG_MODE_QMETADATA @@ -1047,39 +1051,107 @@ void ivas_qmetadata_enc_sid_encode( /*Encode the quantized diffuseness in raw coding*/ bits_dir = 0; bits_diff = 0; - for ( b = start_band; b < nbands; b++ ) +#ifdef FIX_QMETA_SID_5k2 + if ( ivas_format != SBA_FORMAT ) { - q_direction->band_data[b].energy_ratio_index[0] = max( q_direction->band_data[b].energy_ratio_index[0], 4 ); - bits_diff += ivas_qmetadata_encode_quasi_uniform_length( q_direction->band_data[b].energy_ratio_index[0] - 4, DIRAC_DIFFUSE_LEVELS - 4 ); + for ( b = start_band; b < nbands; b++ ) + { + q_direction->band_data[b].energy_ratio_index[0] = max( q_direction->band_data[b].energy_ratio_index[0], 4 ); + bits_diff += ivas_qmetadata_encode_quasi_uniform_length( q_direction->band_data[b].energy_ratio_index[0] - 4, DIRAC_DIFFUSE_LEVELS - 4 ); + q_direction->band_data[b].bits_sph_idx[0] = bits_direction_masa[q_direction->band_data[b].energy_ratio_index[0]]; - q_direction->band_data[b].bits_sph_idx[0] = bits_direction_masa[q_direction->band_data[b].energy_ratio_index[0]]; - if ( q_direction->not_in_2D == 0 ) + if ( q_direction->not_in_2D == 0 ) + { + q_direction->band_data[b].azimuth_m_alphabet[0] = 1 << ( min( 8, q_direction->band_data[b].bits_sph_idx[0] ) ); + bits_dir += ivas_qmetadata_encode_quasi_uniform_length( q_direction->band_data[b].azimuth_m_alphabet[0] - 1, q_direction->band_data[b].azimuth_m_alphabet[0] ); + } + else + { + bits_dir += q_direction->band_data[b].bits_sph_idx[0]; + } + } + + /* Reduce bit demand by increasing diffuseness*/ + bits_delta = metadata_sid_bits - ( hMetaData->nb_bits_tot - bit_pos_start ) - bits_diff - bits_dir; + if ( bits_delta > 0 ) { - q_direction->band_data[b].azimuth_m_alphabet[0] = 1 << ( min( 5, q_direction->band_data[b].bits_sph_idx[0] ) ); - bits_dir += ivas_qmetadata_encode_quasi_uniform_length( q_direction->band_data[b].azimuth_m_alphabet[0] - 1, q_direction->band_data[b].azimuth_m_alphabet[0] ); + while ( bits_delta > 0 ) + { + for ( b = start_band; b < nbands && ( bits_delta > 0 ); b++ ) + { + if ( q_direction->band_data[b].bits_sph_idx[0] < 11 ) + { + bits_delta -= 1; + q_direction->band_data[b].bits_sph_idx[0]++; + } + } + } + if ( q_direction->not_in_2D == 0 ) + { + for ( b = start_band; b < nbands; b++ ) + { + q_direction->band_data[b].azimuth_m_alphabet[0] = 1 << ( min( 8, q_direction->band_data[b].bits_sph_idx[0] ) ); + } + } } else { - bits_dir += q_direction->band_data[b].bits_sph_idx[0]; + while ( bits_delta < 0 ) + { + for ( b = nbands - 1; b >= start_band && ( bits_delta < 0 ); b-- ) + { + if ( q_direction->band_data[b].bits_sph_idx[0] >= 4 ) + { + bits_delta += 1; + q_direction->band_data[b].bits_sph_idx[0]--; + if ( q_direction->not_in_2D == 0 ) + { + q_direction->band_data[b].azimuth_m_alphabet[0] = 1 << ( min( 8, q_direction->band_data[b].bits_sph_idx[0] ) ); + } + } + } + } } } + else + { +#endif + for ( b = start_band; b < nbands; b++ ) + { + q_direction->band_data[b].energy_ratio_index[0] = max( q_direction->band_data[b].energy_ratio_index[0], 4 ); + bits_diff += ivas_qmetadata_encode_quasi_uniform_length( q_direction->band_data[b].energy_ratio_index[0] - 4, DIRAC_DIFFUSE_LEVELS - 4 ); + q_direction->band_data[b].bits_sph_idx[0] = bits_direction_masa[q_direction->band_data[b].energy_ratio_index[0]]; + + if ( q_direction->not_in_2D == 0 ) + { + q_direction->band_data[b].azimuth_m_alphabet[0] = 1 << ( min( 5, q_direction->band_data[b].bits_sph_idx[0] ) ); + bits_dir += ivas_qmetadata_encode_quasi_uniform_length( q_direction->band_data[b].azimuth_m_alphabet[0] - 1, q_direction->band_data[b].azimuth_m_alphabet[0] ); + } + else + { + bits_dir += q_direction->band_data[b].bits_sph_idx[0]; + } + } - /* Reduce bit demand by increasing diffuseness*/ - bits_delta = metadata_sid_bits - ( hMetaData->nb_bits_tot - bit_pos_start ) - bits_diff - bits_dir; + /* Reduce bit demand by increasing diffuseness*/ + bits_delta = metadata_sid_bits - ( hMetaData->nb_bits_tot - bit_pos_start ) - bits_diff - bits_dir; - while ( bits_delta < 0 && ( q_direction->not_in_2D > 0 ) ) - { - for ( b = nbands - 1; b >= start_band && ( bits_delta < 0 ); b-- ) + while ( bits_delta < 0 && ( q_direction->not_in_2D > 0 ) ) { - if ( q_direction->band_data[b].energy_ratio_index[0] < ( DIRAC_DIFFUSE_LEVELS - 1 ) ) + for ( b = nbands - 1; b >= start_band && ( bits_delta < 0 ); b-- ) { - bits_delta += q_direction->band_data[b].bits_sph_idx[0]; - q_direction->band_data[b].energy_ratio_index[0]++; - q_direction->band_data[b].bits_sph_idx[0] = bits_direction_masa[q_direction->band_data[b].energy_ratio_index[0]]; - bits_delta -= q_direction->band_data[b].bits_sph_idx[0]; + if ( q_direction->band_data[b].energy_ratio_index[0] < ( DIRAC_DIFFUSE_LEVELS - 1 ) ) + { + bits_delta += q_direction->band_data[b].bits_sph_idx[0]; + q_direction->band_data[b].energy_ratio_index[0]++; + q_direction->band_data[b].bits_sph_idx[0] = bits_direction_masa[q_direction->band_data[b].energy_ratio_index[0]]; + bits_delta -= q_direction->band_data[b].bits_sph_idx[0]; + } } } +#ifdef FIX_QMETA_SID_5k2 } +#endif assert( ( bits_delta >= 0 ) && "Bit budget in Qmetadata SID is violated!!!" ); /*Code diffuseness*/ -- GitLab From 940d4890f03d5985f840705f9af5bde4a47c365b Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Tue, 20 Jun 2023 11:17:49 +0300 Subject: [PATCH 2/3] Remove unused variable. --- lib_dec/ivas_qmetadata_dec.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lib_dec/ivas_qmetadata_dec.c b/lib_dec/ivas_qmetadata_dec.c index a685d54ecb..d3f9bb29e2 100644 --- a/lib_dec/ivas_qmetadata_dec.c +++ b/lib_dec/ivas_qmetadata_dec.c @@ -1182,7 +1182,7 @@ int16_t ivas_qmetadata_dec_sid_decode( float direction_vector[3]; int16_t metadata_sid_bits; /* bits allocated to SID for metadata */ #ifdef FIX_QMETA_SID_5k2 - int16_t bits_delta, bits_diff, bits_dir; + int16_t bits_delta, bits_dir; #endif #ifdef DEBUG_MODE_QMETADATA static FILE *pF = NULL; @@ -1255,11 +1255,9 @@ int16_t ivas_qmetadata_dec_sid_decode( q_direction->not_in_2D = 1; } #ifdef FIX_QMETA_SID_5k2 - bits_diff = 0; bits_dir = 0; if ( ivas_format != SBA_FORMAT ) { - bits_diff = *index; /* Decode diffuseness*/ for ( b = start_band; b < nbands; b++ ) { @@ -1269,7 +1267,6 @@ int16_t ivas_qmetadata_dec_sid_decode( bits_dir += q_direction->band_data[b].bits_sph_idx[0]; q_direction->band_data[b].azimuth_m_alphabet[0] = no_phi_masa[q_direction->band_data[b].bits_sph_idx[0] - 1][0]; } - bits_diff -= *index; bits_delta = metadata_sid_bits - ( start_index - *index ) - bits_dir; /* bit_diff is already read */ -- GitLab From 9c875ea14c2d6072798d761a46c922be9c3c7684 Mon Sep 17 00:00:00 2001 From: Tapani Pihlajakuja Date: Wed, 21 Jun 2023 18:51:32 +0300 Subject: [PATCH 3/3] Add fix to uninitialized value in 512 kbps MASA SID. --- lib_enc/ivas_qmetadata_enc.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib_enc/ivas_qmetadata_enc.c b/lib_enc/ivas_qmetadata_enc.c index fc6064c77f..c540c3c263 100644 --- a/lib_enc/ivas_qmetadata_enc.c +++ b/lib_enc/ivas_qmetadata_enc.c @@ -833,6 +833,10 @@ ivas_error ivas_qmetadata_enc_encode_hr_384_512( } #endif +#ifdef FIX_QMETA_SID_5k2 + q_direction->not_in_2D = 0; +#endif + /*Coherence */ if ( all_coherence_zero == 0 ) { -- GitLab