Commit 10231f68 authored by emerit's avatar emerit
Browse files

fix non diegetic pan update during SID frame

parent 3b97e213
Loading
Loading
Loading
Loading
+13 −3
Original line number Diff line number Diff line
@@ -374,17 +374,27 @@ typedef enum
enum
{
    IND_ISM_NUM_OBJECTS,
    IND_ISM_EXTENDED_FLAG = IND_ISM_NUM_OBJECTS + MAX_NUM_OBJECTS,
#ifdef ISM_NON_DIEGETIC_PAN    
    IND_ISM_EXTENDED_NDP_FLAG, 
#endif    
    IND_ISM_METADATA_FLAG = IND_ISM_NUM_OBJECTS + MAX_NUM_OBJECTS,   
    IND_ISM_VAD_FLAG = IND_ISM_METADATA_FLAG + MAX_NUM_OBJECTS,
    IND_ISM_NOISY_SPEECH_FLAG,
#else
    IND_ISM_EXTENDED_FLAG = IND_ISM_NUM_OBJECTS + MAX_NUM_OBJECTS,
    IND_ISM_METADATA_FLAG,    
    IND_ISM_VAD_FLAG = IND_ISM_METADATA_FLAG + MAX_NUM_OBJECTS,
    IND_ISM_NOISY_SPEECH_FLAG = IND_ISM_VAD_FLAG + MAX_NUM_OBJECTS,
#endif    
    IND_ISM_SCE_ID_DTX,
    IND_ISM_DTX_COH_SCA,   
#ifdef ISM_NON_DIEGETIC_PAN    
    IND_ISM_EXTENDED_FLAG = IND_ISM_DTX_COH_SCA + MAX_NUM_OBJECTS,
    IND_ISM_EXTENDED_NDP_FLAG, 
    /* ------------- loop for objects -------------- */
    TAG_ISM_LOOP_START = IND_ISM_EXTENDED_NDP_FLAG + MAX_NUM_OBJECTS,
#else    
    /* ------------- loop for objects -------------- */
    TAG_ISM_LOOP_START = IND_ISM_DTX_COH_SCA + MAX_NUM_OBJECTS,
#endif
#ifdef ISM_NON_DIEGETIC_PAN    
    IND_ISM_NDP_FLAG = TAG_ISM_LOOP_START,
#endif    
+3 −0
Original line number Diff line number Diff line
@@ -961,6 +961,9 @@ void ivas_ism_metadata_sid_enc(
void ivas_ism_metadata_sid_dec(
    SCE_DEC_HANDLE hSCE[MAX_SCE],                               /* i/o: SCE encoder structure                       */
    const int32_t ism_total_brate,                              /* i  : ISms total bitrate                          */
#ifdef ISM_NON_DIEGETIC_PAN_SID    
    const int32_t last_active_total_brate,                              /* i  : last active total bitrate                          */
#endif
    const int16_t bfi,                                          /* i  : bfi flag                                    */
    const int16_t nchan_ism,                                    /* i  : number of objects                           */
    const int16_t nchan_transport,                              /* i  : number of transport channels                */
+5 −1
Original line number Diff line number Diff line
@@ -145,7 +145,11 @@ ivas_error ivas_ism_dtx_dec(
    }

    /* Metadata decoding and dequantization  */
    ivas_ism_metadata_sid_dec( st_ivas->hSCE, ivas_total_brate, st_ivas->bfi, nchan_ism, st_ivas->nchan_transport, st_ivas->ism_mode,
    ivas_ism_metadata_sid_dec( st_ivas->hSCE, ivas_total_brate,
#ifdef ISM_NON_DIEGETIC_PAN_SID
                               st_ivas->last_active_ivas_total_brate,
#endif
                               st_ivas->bfi, nchan_ism, st_ivas->nchan_transport, st_ivas->ism_mode,
                               &flag_noisy_speech, &sce_id_dtx, st_ivas->hIsmMetaData, nb_bits_metadata );

    if ( ivas_total_brate == IVAS_SID_5k2 && !st_ivas->bfi )
+90 −40
Original line number Diff line number Diff line
@@ -224,16 +224,38 @@ ivas_error ivas_ism_metadata_dec(
            return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "wrong number of objects signalled!" );
        }

        /* read extended metadata presence flag */
        if ( ism_total_brate >= ISM_EXTENDED_METADATA_BRATE )
        {
            ism_extmeta_bitstream = get_next_indice( st0, ISM_EXTENDED_METADATA_BITS );

#ifdef ISM_NON_DIEGETIC_PAN
            if ( ism_extmeta_bitstream )
        /* Read ISM present flags (one per object) */
        for ( ch = 0; ch < *nchan_transport; ch++ )
        {
                ism_extmeta_bitstream += get_next_indice( st0, ISM_METADATA_IS_NDP_BITS );
            ism_imp[ch] = get_next_indice( st0, ISM_METADATA_FLAG_BITS );

            if ( ism_imp[ch] > ISM_NO_META )
            {
                hIsmMeta[ch]->ism_metadata_flag = 1;
            }
            else
            {
                hIsmMeta[ch]->ism_metadata_flag = 0;
            }

            ism_metadata_flag_global |= hIsmMeta[ch]->ism_metadata_flag;
        }

        for ( ; ch < nchan_ism; ch++ )
        {
            hIsmMeta[ch]->ism_metadata_flag = 1;
            ism_metadata_flag_global |= hIsmMeta[ch]->ism_metadata_flag;
        }
#endif

#ifndef ISM_NON_DIEGETIC_PAN

        /* read extended metadata presence flag */
        if ( ism_total_brate >= ISM_EXTENDED_METADATA_BRATE )
        {
            ism_extmeta_bitstream = get_next_indice( st0, ISM_EXTENDED_METADATA_BITS );
        }
        /* Apply hysteresis in case rate switching causes fluctuation in presence of extended metadata */
        if ( *ism_extmeta_active == -1 || *ism_extmeta_active == ism_extmeta_bitstream ) /* If first frame or bitstream matches internal state */
@@ -250,7 +272,10 @@ ivas_error ivas_ism_metadata_dec(
                *ism_extmeta_cnt = 0;
            }
        }
#endif


#ifndef ISM_NON_DIEGETIC_PAN
        /* Read ISM present flags (one per object) */
        for ( ch = 0; ch < *nchan_transport; ch++ )
        {
@@ -273,7 +298,7 @@ ivas_error ivas_ism_metadata_dec(
            hIsmMeta[ch]->ism_metadata_flag = 1;
            ism_metadata_flag_global |= hIsmMeta[ch]->ism_metadata_flag;
        }

#endif
        /* read VAD flag */
        for ( ch = 0; ch < *nchan_transport; ch++ )
        {
@@ -287,6 +312,35 @@ ivas_error ivas_ism_metadata_dec(
            }
        }


#ifdef ISM_NON_DIEGETIC_PAN
        /* read extended metadata presence flag */
        if ( ism_total_brate >= ISM_EXTENDED_METADATA_BRATE )
        {
            ism_extmeta_bitstream = get_next_indice( st0, ISM_EXTENDED_METADATA_BITS );
            if ( ism_extmeta_bitstream )
            {
                ism_extmeta_bitstream += get_next_indice( st0, ISM_METADATA_IS_NDP_BITS );
            }
        }
        /* Apply hysteresis in case rate switching causes fluctuation in presence of extended metadata */
        if ( *ism_extmeta_active == -1 || *ism_extmeta_active == ism_extmeta_bitstream ) /* If first frame or bitstream matches internal state */
        {
            *ism_extmeta_active = ism_extmeta_bitstream;
            *ism_extmeta_cnt = 0;
        }
        else
        {
            ( *ism_extmeta_cnt )++;
            if ( *ism_extmeta_cnt == ISM_METADATA_RS_MAX_FRAMES ) /* ISM_METADATA_RS_MAX_FRAMES change frames observed - update state */
            {
                *ism_extmeta_active = ism_extmeta_bitstream;
                *ism_extmeta_cnt = 0;
            }
        }
#endif


        if ( ism_metadata_flag_global )
        {
            /*----------------------------------------------------------------*
@@ -873,6 +927,9 @@ static int16_t decode_radius(
void ivas_ism_metadata_sid_dec(
    SCE_DEC_HANDLE hSCE[MAX_SCE],  /* i/o: SCE encoder structure       */
    const int32_t ism_total_brate, /* i  : ISms total bitrate          */
#ifdef ISM_NON_DIEGETIC_PAN_SID
    const int32_t last_active_total_brate, /* i  : last active total bitrate                          */
#endif
    const int16_t bfi,              /* i  : bfi flag                    */
    const int16_t nchan_ism,        /* i  : number of objects           */
    const int16_t nchan_transport,  /* i  : number of transport channels*/
@@ -937,36 +994,6 @@ void ivas_ism_metadata_sid_dec(
            md_diff_flag[ch] = get_next_indice( st0, 1 );
        }

#ifdef ISM_NON_DIEGETIC_PAN_SID
        ism_extmeta_bitstream = 0;
        if ( ism_total_brate >= ISM_EXTENDED_METADATA_BRATE )
        {
            ism_metadata_flag_global = 0;
            /* read SID metadata flag( one per object ) */
            for ( ch = 0; ch < nchan_ism; ch++ )
            {
                if ( md_diff_flag[ch] )
                {
                    ism_metadata_flag_global |= hIsmMeta[ch]->ism_metadata_flag;
                }
            }
            if ( ism_metadata_flag_global )
            {
                ism_extmeta_bitstream = get_next_indice( st0, ISM_EXTENDED_METADATA_BITS );
                if ( ism_extmeta_bitstream )
                {
                    for ( ch = 0; ch < nchan_ism; ch++ )
                    {
                        if ( md_diff_flag[ch] )
                        {
                            hIsmMeta[ch]->ism_metadata_flag += get_next_indice( st0, ISM_METADATA_IS_NDP_BITS );
                        }
                    }
                }
            }
        }
#endif

        /*----------------------------------------------------------------*
         * Set quantization bits based on the number of coded objects
         *----------------------------------------------------------------*/
@@ -1025,17 +1052,40 @@ void ivas_ism_metadata_sid_dec(
            hSCE[*sce_id_dtx]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence = hSCE[!*sce_id_dtx]->hCoreCoder[0]->hFdCngDec->hFdCngCom->coherence;
        }


#ifdef ISM_NON_DIEGETIC_PAN_SID
        ism_extmeta_bitstream = 0;
        if ( last_active_total_brate >= ISM_EXTENDED_METADATA_BRATE )
        {
            ism_metadata_flag_global = 0;
            /* read SID metadata flag( one per object ) */
            for ( ch = 0; ch < nchan_ism; ch++ )
            {
                ism_metadata_flag_global |= md_diff_flag[ch];
            }
            if ( ism_metadata_flag_global )
            {
                ism_extmeta_bitstream = get_next_indice( st0, ISM_EXTENDED_METADATA_BITS );
            }
        }
#endif

        /*----------------------------------------------------------------*
         * Metadata decoding and dequantization, loop over all objects
         *----------------------------------------------------------------*/

        for ( ch = 0; ch < nchan_ism; ch++ )
        {
            hIsmMetaData = hIsmMeta[ch];

            if ( md_diff_flag[ch] == 1 )
            {
                hIsmMetaData = hIsmMeta[ch];
#ifdef ISM_NON_DIEGETIC_PAN_SID
                if ( ism_extmeta_bitstream )
                {
                    hIsmMetaData->ism_metadata_flag = get_next_indice( st0, ISM_METADATA_IS_NDP_BITS ) + 1;
                }
#endif
                /* Azimuth decoding */
                idx_azimuth = get_next_indice( st0, nBits_azimuth );
                hIsmMetaData->azimuth = ism_dequant_meta( idx_azimuth, ism_azimuth_borders, q_step, q_step_border, 1 << nBits_azimuth );
+55 −38
Original line number Diff line number Diff line
@@ -308,12 +308,19 @@ ivas_error ivas_ism_metadata_enc(


#ifdef ISM_NON_DIEGETIC_PAN
    /* write ISM metadata flag (one per object) */
    for ( ch = 0; ch < nchan_transport; ch++ )
    {
        push_indice( hBstr, IND_ISM_METADATA_FLAG, ism_imp[ch], ISM_METADATA_FLAG_BITS );
    }

    for ( ch = 0; ch < nchan_ism; ch++ )
    {
        ism_metadata_flag_global |= hIsmMeta[ch]->ism_metadata_flag;
    }
#endif

#ifndef ISM_NON_DIEGETIC_PAN
    /* write extended metadata presence flag */
    if ( ism_total_brate >= ISM_EXTENDED_METADATA_BRATE )
    {
@@ -332,14 +339,15 @@ ivas_error ivas_ism_metadata_enc(
        }
#endif
    }
#endif

#ifndef ISM_NON_DIEGETIC_PAN
    /* write ISM metadata flag (one per object) */
    for ( ch = 0; ch < nchan_transport; ch++ )
    {
        push_indice( hBstr, IND_ISM_METADATA_FLAG, ism_imp[ch], ISM_METADATA_FLAG_BITS );
    }

#ifndef ISM_NON_DIEGETIC_PAN
    for ( ch = 0; ch < nchan_ism; ch++ )
    {
        ism_metadata_flag_global |= hIsmMeta[ch]->ism_metadata_flag;
@@ -359,6 +367,25 @@ ivas_error ivas_ism_metadata_enc(
        }
    }

#ifdef ISM_NON_DIEGETIC_PAN
    /* write extended metadata presence flag */
    if ( ism_total_brate >= ISM_EXTENDED_METADATA_BRATE )
    {
        push_indice( hBstr, IND_ISM_EXTENDED_FLAG, ism_extended_metadata_flag, ISM_EXTENDED_METADATA_BITS );
        if ( ism_extended_metadata_flag )
        {
            if ( ism_metadata_flag_global & 0x2 )
            {
                push_indice( hBstr, IND_ISM_EXTENDED_NDP_FLAG, 1, ISM_METADATA_IS_NDP_BITS );
            }
            else
            {
                push_indice( hBstr, IND_ISM_EXTENDED_NDP_FLAG, 0, ISM_METADATA_IS_NDP_BITS );
            }
        }
    }
#endif

    if ( ism_metadata_flag_global )
    {
        /*----------------------------------------------------------------*
@@ -1159,43 +1186,6 @@ void ivas_ism_metadata_sid_enc(
            push_indice( hBstr, IND_ISM_METADATA_FLAG, md_diff_flag[ch], 1 );
        }

#ifdef ISM_NON_DIEGETIC_PAN_SID
        if ( ism_total_brate >= ISM_EXTENDED_METADATA_BRATE )
        {
            ism_metadata_flag_global = 0;
            for ( ch = 0; ch < nchan_ism; ch++ )
            {
                if ( md_diff_flag[ch] )
                {
                    ism_metadata_flag_global |= hIsmMeta[ch]->ism_metadata_flag;
                }
            }

            if ( ism_metadata_flag_global )
            {
                push_indice( hBstr, IND_ISM_EXTENDED_FLAG, ism_extended_metadata_flag, ISM_EXTENDED_METADATA_BITS );
            }
            if ( ism_extended_metadata_flag )
            {
                for ( ch = 0; ch < nchan_ism; ch++ )
                {
                    if ( md_diff_flag[ch] )
                    {
                        hIsmMetaData = hIsmMeta[ch];
                        if ( hIsmMetaData->ism_metadata_flag == 2 )
                        {
                            push_indice( hBstr, IND_ISM_NDP_FLAG, 1, ISM_METADATA_IS_NDP_BITS );
                        }
                        else
                        {
                            push_indice( hBstr, IND_ISM_NDP_FLAG, 0, ISM_METADATA_IS_NDP_BITS );
                        }
                    }
                }
            }
        }
#endif

        /*----------------------------------------------------------------*
         * Set quantization bits based on the number of coded objects
         *----------------------------------------------------------------*/
@@ -1245,6 +1235,24 @@ void ivas_ism_metadata_sid_enc(
            }
        }

#ifdef ISM_NON_DIEGETIC_PAN_SID
        ism_metadata_flag_global = 0;
        if ( ism_total_brate >= ISM_EXTENDED_METADATA_BRATE && ism_extended_metadata_flag )
        {
            for ( ch = 0; ch < nchan_ism; ch++ )
            {
                if ( md_diff_flag[ch] )
                {
                    ism_metadata_flag_global |= hIsmMeta[ch]->ism_metadata_flag;
                }
            }
            if ( ism_metadata_flag_global )
            {
                push_indice( hBstr, IND_ISM_EXTENDED_FLAG, ism_extended_metadata_flag, ISM_EXTENDED_METADATA_BITS );
            }
        }
#endif

        /*----------------------------------------------------------------*
         * Metadata quantization and coding, loop over all objects
         *----------------------------------------------------------------*/
@@ -1256,6 +1264,7 @@ void ivas_ism_metadata_sid_enc(
#ifdef ISM_NON_DIEGETIC_PAN_SID
                if ( hIsmMetaData->ism_metadata_flag == 2 && ism_extended_metadata_flag )
                {
                    push_indice( hBstr, IND_ISM_NDP_FLAG, 1, ISM_METADATA_IS_NDP_BITS );
                    idx_azimuth = ism_quant_meta( hIsmMetaData->azimuth, &valQ, ism_azimuth_borders, q_step, q_step_border, 1 << nBits_azimuth );

                    push_indice( hBstr, IND_ISM_AZIMUTH, idx_azimuth, nBits_azimuth );
@@ -1272,6 +1281,11 @@ void ivas_ism_metadata_sid_enc(
                }
                else
                {
                    hIsmMetaData = hIsmMeta[ch];
                    if ( hIsmMetaData->ism_metadata_flag == 1 )
                    {
                        push_indice( hBstr, IND_ISM_NDP_FLAG, 0, ISM_METADATA_IS_NDP_BITS );
                    }
#endif
                    idx_azimuth = ism_quant_meta( hIsmMetaData->azimuth, &valQ, ism_azimuth_borders, q_step, q_step_border, 1 << nBits_azimuth );
                    idx_elevation = ism_quant_meta( hIsmMetaData->elevation, &valQ, ism_elevation_borders, q_step, q_step_border, 1 << nBits_elevation );
@@ -1292,6 +1306,9 @@ void ivas_ism_metadata_sid_enc(
                    }
#ifdef ISM_NON_DIEGETIC_PAN_SID
                }
                hIsmMetaData->last_azimuth = hIsmMetaData->azimuth;
                hIsmMetaData->elevation = hIsmMetaData->elevation;
                hIsmMetaData->last_ism_metadata_flag = hIsmMetaData->ism_metadata_flag;
#endif

#ifdef FIX_387_ISM_MD_FEC