Commit 526ae840 authored by Sandesh Venkatesh's avatar Sandesh Venkatesh
Browse files

Merge branch 'ivas_dirac_dec_fxd' into 'main'

ivas_dec_dec_config, ivas_dec_rend_config and sub-funcs conv to fxd

See merge request !131
parents 3268785c f1096054
Loading
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -732,6 +732,7 @@ enum
#define CLDFB_OVRLP_MIN_SLOTS               3                      /* CLDFB resampling - minimize processing to minimum required for transition frame ACELP->TCX/HQ */
#define INV_CLDFB_BANDWIDTH                 ( 1.f / 800.f )
#define INV_CLDFB_BANDWIDTH_Q31             ( 2684355l )
#define CLDFB_BANDWIDTH                     800

#define L_FILT_2OVER3                       12
#define L_FILT_2OVER3_LP                    3
+313 −17
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@
#include "wmc_auto.h"
#include "prot_fx1.h"
#include "prot_fx2.h"
#include "ivas_prot_fx.h"

/*-----------------------------------------------------------------------*
 * Local function prototypes
@@ -97,6 +98,135 @@ Word16 ivas_get_hodirac_flag_fx(
 *
 * DirAC Configuration function; used also in MASA decoder
 *------------------------------------------------------------------------*/
#ifdef IVAS_FLOAT_FIXED
ivas_error ivas_dirac_config_fx(
    void *st_ivas,        /* i/o: IVAS encoder/decoder state structure  */
    const Word16 enc_dec /* i  : encoder or decoder flag               */
)
{
    IVAS_FORMAT ivas_format;
    Word16 sba_order;
    Word16 *element_mode;
    Word32 ivas_total_brate;
    DIRAC_CONFIG_DATA_HANDLE hConfig;
    IVAS_QMETADATA_HANDLE hQMetaData;
    Word32 Fs;
    Word16 *band_grouping;
    ivas_error error;
    Word16 spar_dirac_split_band;
    IVAS_FB_MIXER_HANDLE hFbMdft;
    Word16 *dirac_to_spar_md_bands;

    error = IVAS_ERR_OK;

    IF ( EQ_16(enc_dec , ENC))
    {
        ivas_format = ((Encoder_Struct *)st_ivas)->hEncoderConfig->ivas_format;
        element_mode = &((Encoder_Struct *)st_ivas)->hEncoderConfig->element_mode_init;
        sba_order = ((Encoder_Struct *)st_ivas)->sba_analysis_order;
        ivas_total_brate = ((Encoder_Struct *)st_ivas)->hEncoderConfig->ivas_total_brate;
        Fs = ((Encoder_Struct *)st_ivas)->hEncoderConfig->input_Fs;
        band_grouping = ((Encoder_Struct *)st_ivas)->hDirAC->band_grouping;
        hConfig = ((Encoder_Struct *)st_ivas)->hDirAC->hConfig;
        hQMetaData = ((Encoder_Struct *)st_ivas)->hQMetaData;
        IF (((Encoder_Struct *)st_ivas)->hSpar != NULL)
        {
            hFbMdft = ((Encoder_Struct *)st_ivas)->hSpar->hFbMixer;
            dirac_to_spar_md_bands = ((Encoder_Struct *)st_ivas)->hSpar->dirac_to_spar_md_bands;
        }
        ELSE
        {
            hFbMdft = NULL;
            dirac_to_spar_md_bands = NULL;
        }
    }
    ELSE
    {
        ivas_format = ((Decoder_Struct *)st_ivas)->ivas_format;
        element_mode = &((Decoder_Struct *)st_ivas)->element_mode_init;
        sba_order = ((Decoder_Struct *)st_ivas)->sba_analysis_order;
        ivas_total_brate = ((Decoder_Struct *)st_ivas)->hDecoderConfig->ivas_total_brate;
        Fs = ((Decoder_Struct *)st_ivas)->hDecoderConfig->output_Fs;
        band_grouping = ((Decoder_Struct *)st_ivas)->hDirAC->band_grouping;
        hConfig = ((Decoder_Struct *)st_ivas)->hDirAC->hConfig;
        hQMetaData = ((Decoder_Struct *)st_ivas)->hQMetaData;
        IF (((Decoder_Struct *)st_ivas)->hSpar != NULL)
        {
            hFbMdft = ((Decoder_Struct *)st_ivas)->hSpar->hFbMixer;
            dirac_to_spar_md_bands = ((Decoder_Struct *)st_ivas)->hSpar->dirac_to_spar_md_bands;
        }
        ELSE
        {
            hFbMdft = NULL;
            dirac_to_spar_md_bands = NULL;
        }
        ((Decoder_Struct *)st_ivas)->hDirAC->hFbMdft = hFbMdft;
    }

    IF (ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT)
    {
        hConfig->nbands = IVAS_MAX_NUM_BANDS;

        spar_dirac_split_band = s_min(IVAS_MAX_NUM_BANDS, SPAR_DIRAC_SPLIT_START_BAND);

        IF (ivas_get_hodirac_flag(ivas_total_brate, sba_order))//add call after merge of 100861_dirac_dec
        {
            spar_dirac_split_band = 0;
        }
    }
    ELSE
    {
        hConfig->nbands = 5;
        spar_dirac_split_band = 0;
    }
    hConfig->enc_param_start_band = 0;
    hConfig->dec_param_estim = FALSE;
    IF (ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT) /* skip for MASA decoder */
    {
        IF ((error = ivas_dirac_sba_config_fx(hQMetaData, element_mode, ivas_total_brate, sba_order, hConfig->nbands - spar_dirac_split_band,
            ivas_format)) != IVAS_ERR_OK)
        {
            return error;
        }

        IF (hQMetaData != NULL)
        {
            IF (enc_dec == ENC)
            {
                hConfig->nbands = hQMetaData->q_direction[0].cfg.nbands;
            }
            hConfig->enc_param_start_band = add(hQMetaData->q_direction[0].cfg.start_band , spar_dirac_split_band);
        }

        hConfig->dec_param_estim = TRUE;
        IF (hConfig->dec_param_estim == TRUE)
        {
            hConfig->enc_param_start_band = spar_dirac_split_band;
        }

        IF (ivas_get_hodirac_flag(ivas_total_brate, sba_order))
        {
            hConfig->dec_param_estim = FALSE;
            hConfig->enc_param_start_band = 0;

            set_c((int8_t *)hQMetaData->twoDirBands, (int8_t)1, hQMetaData->q_direction[0].cfg.nbands);
            hQMetaData->numTwoDirBands = (uint8_t)hQMetaData->q_direction[0].cfg.nbands;
        }
    }

    IF (ivas_format == SBA_FORMAT || ivas_format == SBA_ISM_FORMAT)
    {
        //100861_dirac_dec
        ivas_dirac_config_bands(band_grouping, IVAS_MAX_NUM_BANDS, (Word16)(Fs * INV_CLDFB_BANDWIDTH + 0.5f), dirac_to_spar_md_bands, hQMetaData->useLowerBandRes, hConfig->enc_param_start_band, hFbMdft);
    }
    ELSE
    {
        ivas_dirac_config_bands(band_grouping, hConfig->nbands, (Word16)(Fs * INV_CLDFB_BANDWIDTH + 0.5f), NULL, 0, 0, hFbMdft);
    }

    return error;
}
#endif

ivas_error ivas_dirac_config(
    void *st_ivas,        /* i/o: IVAS encoder/decoder state structure  */
@@ -388,7 +518,7 @@ void ivas_dirac_config_bands_fx(
            {
                Word16 step = DIRAC_LOW_BANDRES_STEP;
                Word16 reduced_band;
                for ( band = enc_param_start_band + 2, reduced_band = enc_param_start_band + 1; band <= DIRAC_MAX_NBANDS; band += step, reduced_band++ )
                for ( band = add(enc_param_start_band , 2), reduced_band = add(enc_param_start_band , 1); band <= DIRAC_MAX_NBANDS; band = add(band, step), reduced_band++ )
                {
                    band_grouping[reduced_band] = band_grouping[band];
                }
@@ -433,6 +563,90 @@ void ivas_dirac_config_bands_fx(
 * Return maximum SBA DirAC metadata bit-budget and nominal bit-budget
 *-------------------------------------------------------------------*/

#ifdef IVAS_FLOAT_FIXED
void ivas_get_dirac_sba_max_md_bits_fx(
    const Word32 sba_total_brate,
    Word16 *bits_frame_nominal,
    Word16 *metadata_max_bits,
    Word16 *qmetadata_max_bit_req,
    const Word16 nbands,
    IVAS_FORMAT ivas_format )
{
    IF ( sba_total_brate <= IVAS_13k2 )
    {
        *bits_frame_nominal = ACELP_9k60 / FRAMES_PER_SEC;
        *metadata_max_bits = 70;
    }
    ELSE IF ( sba_total_brate <= IVAS_16k4 )
    {
        *bits_frame_nominal = ACELP_13k20 / FRAMES_PER_SEC;
        *metadata_max_bits = 80;
    }
    ELSE IF ( sba_total_brate <= IVAS_24k4 )
    {
        *bits_frame_nominal = ACELP_16k40 / FRAMES_PER_SEC;
        *metadata_max_bits = 103;
        /* OSBA needs an additional 2-bits safety margin to avoid acelp crashes */
        IF ( ivas_format == SBA_ISM_FORMAT )
        {
            ( *metadata_max_bits ) = sub((*metadata_max_bits), 3);
        }
    }
    ELSE IF ( sba_total_brate <= IVAS_32k )
    {
        *bits_frame_nominal = ACELP_32k / FRAMES_PER_SEC;
        *metadata_max_bits = 214;
    }
    ELSE IF ( sba_total_brate <= IVAS_48k )
    {
        *bits_frame_nominal = IVAS_48k / FRAMES_PER_SEC;
        *metadata_max_bits = 240;
    }
    ELSE IF ( sba_total_brate <= IVAS_64k )
    {
        *bits_frame_nominal = IVAS_64k / FRAMES_PER_SEC;
        *metadata_max_bits = 200;
    }
    ELSE IF ( sba_total_brate <= IVAS_80k )
    {
        *bits_frame_nominal = IVAS_80k / FRAMES_PER_SEC;
        *metadata_max_bits = 200;
    }
    ELSE IF ( sba_total_brate <= IVAS_96k )
    {
        *bits_frame_nominal = IVAS_96k / FRAMES_PER_SEC;
        *metadata_max_bits = 200;
    }
    ELSE IF ( sba_total_brate <= IVAS_128k )
    {
        *bits_frame_nominal = IVAS_128k / FRAMES_PER_SEC;
        *metadata_max_bits = 250;
    }
    ELSE
    {
        //*bits_frame_nominal = (int16_t) ( sba_total_brate / FRAMES_PER_SEC );
        Word16 tmp_exp = 0, tmp;
        tmp = BASOP_Util_Divide3232_Scale(sba_total_brate, FRAMES_PER_SEC, &tmp_exp);
        *bits_frame_nominal = shr(tmp, 15 - tmp_exp);
        *metadata_max_bits = MAX16B; /* no limit */
    }
    Word32 var1 = L_mult0(*metadata_max_bits, nbands);
    Word16 exp = 0;
    Word16 var2 = BASOP_Util_Divide3232_Scale(var1, 5, &exp);
    Word32 var2_32 = L_deposit_h(var2);
    Word32 var4 = var2_32;
    
    Word16 exp_res = 0;
    IF (var1 % 5 != 0) {
        var4 = BASOP_Util_Add_Mant32Exp(var2_32, exp, ONE_IN_Q30, 1, &exp_res);
    }
    *metadata_max_bits = extract_l(L_min(MAX16B, L_shr(var4, 14)));
    *qmetadata_max_bit_req = QMETADATA_MAXBIT_REQ_SBA >> 1;

    return;
}
#endif

void ivas_get_dirac_sba_max_md_bits(
    const int32_t sba_total_brate,
    int16_t *bits_frame_nominal,
@@ -502,12 +716,95 @@ void ivas_get_dirac_sba_max_md_bits(
    return;
}


/*-------------------------------------------------------------------------
 * ivas_dirac_sba_config()
 *
 * DirAC Configuration function for SBA
 *------------------------------------------------------------------------*/
#ifdef IVAS_FLOAT_FIXED
ivas_error ivas_dirac_sba_config_fx(
    IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle                                    */
    Word16 *element_mode,            /* i/o: element mode of the core coder                       */
    Word32 sba_total_brate,          /* i  : SBA total bitrate                                    */
    const Word16 sba_order,          /* i  : Ambisonic (SBA) order                                */
    const Word16 nbands              /* i  : number of frequency bands                            */
    ,
    IVAS_FORMAT ivas_format)
{
    Word16 nbands_coded;
    Word16 hodirac_flag;
    ivas_error error;

    Word32 tmp1 = IVAS_192k;
    Word32 tmp2 = SPAR_DIRAC_SPLIT_START_BAND;
    Word16 exp = 0;
    Word16 tmp3 = BASOP_Util_Divide3232_Scale(tmp1, tmp2, &exp);
    Word32 res = L_shr(L_deposit_h(tmp3), 31 - exp);

    error = IVAS_ERR_OK;
    hQMetaData->is_masa_ivas_format = 0;
    hodirac_flag = ivas_get_hodirac_flag(sba_total_brate, sba_order);//implemented on 100861_dirac_dec

    /* map the bitrate for SID frame */
    IF (EQ_32(sba_total_brate , IVAS_SID_5k2))
    {
        IF (EQ_16(*element_mode , IVAS_SCE))
        {
            sba_total_brate = ACELP_24k40;
        }
        ELSE
        {
            sba_total_brate = ACELP_48k;
        }
    }

    ivas_set_qmetadata_maxbit_req(hQMetaData, SBA_FORMAT);

    IF (LE_32(sba_total_brate , IVAS_16k4))
    {
        hQMetaData->useLowerRes = 1;
    }
    ELSE
    {
        hQMetaData->useLowerRes = 0;
    }

    nbands_coded = nbands;
    
    IF (LE_32(sba_total_brate , res))
    {
        hQMetaData->useLowerBandRes = 1;
        Word16 tmp = nbands % 2;
        nbands_coded = add(shr(nbands, 1) , tmp);
    }
    ELSE
    {
        hQMetaData->useLowerBandRes = 0;
        IF (hodirac_flag == 0)
        {
            nbands_coded = nbands - 1; /* always combine the last two bands */
        }
    }

    {
        Word16 no_dirs = 1;
        IF (hodirac_flag)
        {
            no_dirs = 2;
        }

        IF ((error = ivas_qmetadata_allocate_memory(hQMetaData, nbands_coded, no_dirs, 0)) != IVAS_ERR_OK)//WIP 
        {
            return error;
        }
    }

    ivas_get_dirac_sba_max_md_bits_fx(sba_total_brate, &hQMetaData->bits_frame_nominal, &hQMetaData->metadata_max_bits, &hQMetaData->qmetadata_max_bit_req, hQMetaData->q_direction[0].cfg.nbands,
        ivas_format);

    return error;
}
#endif

ivas_error ivas_dirac_sba_config(
    IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle                                    */
@@ -584,7 +881,6 @@ ivas_error ivas_dirac_sba_config(
    return error;
}


/*-------------------------------------------------------------------------
 * computeDirectionVectors()
 *
+12 −0
Original line number Diff line number Diff line
@@ -3634,6 +3634,14 @@ int16_t ivas_sba_get_order(
    const int16_t sba_planar                                    /* i  : SBA planar flag                         */
);

#ifdef IVAS_FLOAT_FIXED
Word16 ivas_sba_get_order_fx(
    const Word16 nb_channels,                                  /* i  : Number of ambisonic channels            */
    const Word16 sba_planar                                    /* i  : SBA planar flag                         */
);

#endif

/*! r: Ambisonic (SBA) order used for analysis and coding */
int16_t ivas_sba_get_analysis_order(
    const int32_t ivas_total_brate,                             /* i  : IVAS total bitrate                      */
@@ -3849,6 +3857,10 @@ void generate_masking_noise_lb_dirac(
);

#ifdef IVAS_FLOAT_FIXED
void ivas_dirac_dec_close_fx(
    DIRAC_DEC_HANDLE *hDirAC_out
);

void ivas_dirac_dec_set_md_map(
    Decoder_Struct *st_ivas,                                    /* i/o: IVAS decoder structure                  */
    const Word16 nCldfbTs                                      /* i  : number of CLDFB time slots              */
+23 −0
Original line number Diff line number Diff line
@@ -1090,4 +1090,27 @@ void stereo_dft_dmx_out_reset_fx(
  STEREO_DFT_DMX_DATA_HANDLE hStereoDftDmx                    /* i/o: DFT stereo DMX decoder                  */
);

void ivas_get_dirac_sba_max_md_bits_fx(
    const Word32 sba_total_brate,
    Word16 *bits_frame_nominal,
    Word16 *metadata_max_bits,
    Word16 *qmetadata_max_bit_req,
    const Word16 nbands,
    IVAS_FORMAT ivas_format);

ivas_error ivas_dirac_sba_config_fx(
    IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle                                    */
    Word16 *element_mode,            /* i/o: element mode of the core coder                       */
    Word32 sba_total_brate,          /* i  : SBA total bitrate                                    */
    const Word16 sba_order,          /* i  : Ambisonic (SBA) order                                */
    const Word16 nbands              /* i  : number of frequency bands                            */
    ,
    IVAS_FORMAT ivas_format);

ivas_error ivas_dirac_config_fx(
    void *st_ivas,        /* i/o: IVAS encoder/decoder state structure  */
    const Word16 enc_dec /* i  : encoder or decoder flag               */
);
#endif

+4 −5
Original line number Diff line number Diff line
@@ -115,7 +115,6 @@ void ivas_sba_config(
}

#ifdef IVAS_FLOAT_FIXED
/*not tested*/
void ivas_sba_config_fx(
    const Word32 sba_total_brate, /* i  : SBA total bitrate                        */
    Word16 sba_order,             /* i  : Ambisonic (SBA) order                    */
@@ -133,11 +132,11 @@ void ivas_sba_config_fx(
    }
    ELSE IF( LT_16( sba_order, 0 ) )
    {
        sba_order = ivas_sba_get_order( nb_channels, sba_planar );
        sba_order = ivas_sba_get_order_fx( nb_channels, sba_planar );
    }
    ELSE IF( LT_16( nb_channels, 0 ) )
    {
        nb_channels = ivas_sba_get_nchan_fx( sba_order, sba_planar );
        nb_channels = (Word16)ivas_sba_get_nchan_fx( sba_order, sba_planar );
    }
    ELSE
    {
@@ -301,7 +300,7 @@ Word16 ivas_sba_get_nchan_fx(
    }
    ELSE
    {
        nb_channels = mult(add(sba_order , 1) , (sba_order + 1));
        nb_channels = mult0(add(sba_order , 1) , add(sba_order , 1));
    }

    return (nb_channels);
Loading