Commit ab71e8df authored by Tapani Pihlajakuja's avatar Tapani Pihlajakuja
Browse files

Fix todo in issue 137 for MASA by adjusting SID qmetadata coding for MASA.

parent 7c560c29
Loading
Loading
Loading
Loading
Loading

lib_com/options.h

100755 → 100644
+2 −1
Original line number Diff line number Diff line
@@ -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 */
+89 −8
Original line number Diff line number Diff line
@@ -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;
    }

#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++ )
        {
            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++ )
        {
#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;
+90 −18
Original line number Diff line number Diff line
@@ -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,12 +1051,77 @@ void ivas_qmetadata_enc_sid_encode(
    /*Encode the quantized diffuseness in raw coding*/
    bits_dir = 0;
    bits_diff = 0;
#ifdef FIX_QMETA_SID_5k2
    if ( ivas_format != SBA_FORMAT )
    {
        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( 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 )
        {
            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 )
                        {
                            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] ) );
@@ -1080,6 +1149,9 @@ void ivas_qmetadata_enc_sid_encode(
                }
            }
        }
#ifdef FIX_QMETA_SID_5k2
    }
#endif
    assert( ( bits_delta >= 0 ) && "Bit budget in Qmetadata SID is violated!!!" );

    /*Code diffuseness*/