Home | History | Annotate | Download | only in decoder
      1 /******************************************************************************
      2  *                                                                            *
      3  * Copyright (C) 2018 The Android Open Source Project
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at:
      8  *
      9  * http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  *
     17  *****************************************************************************
     18  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
     19 */
     20 #ifndef IXHEAACD_SBR_DEC_H
     21 #define IXHEAACD_SBR_DEC_H
     22 
     23 typedef struct {
     24   WORD32 x_over_qmf[MAX_NUM_PATCHES];
     25   WORD32 max_stretch;
     26   WORD32 core_frame_length;
     27   WORD32 hbe_qmf_in_len;
     28   WORD32 hbe_qmf_out_len;
     29   WORD32 no_bins;
     30   WORD32 start_band;
     31   WORD32 end_band;
     32   WORD32 upsamp_4_flag;
     33   WORD32 synth_buf_offset;
     34 
     35   FLOAT32 *ptr_input_buf;
     36 
     37   FLOAT32 **qmf_in_buf;
     38   FLOAT32 **qmf_out_buf;
     39 
     40   WORD32 k_start;
     41   WORD32 synth_size;
     42   FLOAT32 synth_buf[1280];
     43   FLOAT32 analy_buf[640];
     44   FLOAT32 *synth_wind_coeff;
     45   FLOAT32 *analy_wind_coeff;
     46 
     47   FLOAT32 *synth_cos_tab;
     48   FLOAT32 *analy_cos_sin_tab;
     49 
     50   FLOAT32 norm_qmf_in_buf[46][128];
     51 
     52 } ia_esbr_hbe_txposer_struct;
     53 
     54 typedef struct {
     55   WORD32 *ptr_sbr_overlap_buf;
     56   WORD32 **drc_factors_sbr;
     57   ia_sbr_qmf_filter_bank_struct str_codec_qmf_bank;
     58   ia_sbr_qmf_filter_bank_struct str_synthesis_qmf_bank;
     59   ia_sbr_calc_env_struct str_sbr_calc_env;
     60   ia_sbr_hf_generator_struct str_hf_generator;
     61 
     62   ia_sbr_scale_fact_struct str_sbr_scale_fact;
     63 
     64   WORD32 max_samp_val;
     65   ia_esbr_hbe_txposer_struct *p_hbe_txposer;
     66 
     67   FLOAT32 core_sample_buf[2624];
     68   FLOAT32 ph_vocod_qmf_real[TIMESLOT_BUFFER_SIZE][NO_QMF_SYNTH_CHANNELS];
     69   FLOAT32 ph_vocod_qmf_imag[TIMESLOT_BUFFER_SIZE][NO_QMF_SYNTH_CHANNELS];
     70   FLOAT32 sbr_qmf_out_real[TIMESLOT_BUFFER_SIZE][NO_QMF_SYNTH_CHANNELS];
     71   FLOAT32 sbr_qmf_out_imag[TIMESLOT_BUFFER_SIZE][NO_QMF_SYNTH_CHANNELS];
     72   FLOAT32 qmf_buf_real[TIMESLOT_BUFFER_SIZE + 2 * 32][NO_QMF_SYNTH_CHANNELS];
     73   FLOAT32 qmf_buf_imag[TIMESLOT_BUFFER_SIZE + 2 * 32][NO_QMF_SYNTH_CHANNELS];
     74 
     75   FLOAT32 mps_qmf_buf_real[TIMESLOT_BUFFER_SIZE][NO_QMF_SYNTH_CHANNELS];
     76   FLOAT32 mps_qmf_buf_imag[TIMESLOT_BUFFER_SIZE][NO_QMF_SYNTH_CHANNELS];
     77   FLOAT32 mps_sbr_qmf_buf_real[TIMESLOT_BUFFER_SIZE][NO_QMF_SYNTH_CHANNELS];
     78   FLOAT32 mps_sbr_qmf_buf_imag[TIMESLOT_BUFFER_SIZE][NO_QMF_SYNTH_CHANNELS];
     79 
     80   WORD32 sbr_scratch_local[256];
     81   FLOAT32 scratch_buff[320];
     82 
     83   FLOAT32 qmf_energy_buf[64][32];
     84   FLOAT32 pvc_qmf_enrg_arr[16 * 32];
     85 
     86   FLOAT32 **pp_qmf_buf_real;
     87   FLOAT32 **pp_qmf_buf_imag;
     88 
     89   FLOAT32 *time_sample_buf;
     90 } ia_sbr_dec_struct;
     91 
     92 typedef struct {
     93   ia_sbr_prev_frame_data_struct *pstr_prev_frame_data;
     94   ia_sbr_dec_struct str_sbr_dec;
     95   WORD32 output_frame_size;
     96   WORD32 sync_state;
     97 } ia_sbr_channel_struct;
     98 
     99 struct ia_sbr_dec_inst_struct {
    100   ia_ps_dec_struct *pstr_ps_stereo_dec;
    101   FLAG ps_present;
    102   ia_sbr_channel_struct *pstr_sbr_channel[MAXNRSBRCHANNELS];
    103   ia_sbr_header_data_struct *pstr_sbr_header[MAXNRSBRCHANNELS];
    104   ia_freq_band_data_struct *pstr_freq_band_data[MAXNRSBRCHANNELS];
    105   ia_sbr_tables_struct *pstr_sbr_tables;
    106   ixheaacd_misc_tables *pstr_common_tables;
    107   ia_pvc_data_struct *ptr_pvc_data_str;
    108   VOID *hbe_txposer_buffers;
    109   FLOAT32 *time_sample_buf[MAXNRSBRCHANNELS];
    110   VOID *scratch_mem_v;
    111   VOID *frame_buffer[2];
    112   ia_sbr_header_data_struct str_sbr_dflt_header;
    113   FLAG stereo_config_idx;
    114   FLAG usac_independency_flag;
    115   FLAG pvc_flag;
    116   FLAG hbe_flag;
    117   FLAG sbr_mode;
    118   FLAG prev_sbr_mode;
    119   FLAG inter_tes_flag;
    120   FLAG aot_usac_flag;
    121 };
    122 
    123 typedef struct ia_sbr_pers_struct {
    124   WORD16 *sbr_qmf_analy_states;
    125 
    126   WORD32 *sbr_qmf_analy_states_32;
    127 
    128   WORD16 *sbr_qmf_synth_states;
    129 
    130   WORD32 *sbr_qmf_synth_states_32;
    131 
    132   WORD32 **sbr_lpc_filter_states_real[MAXNRSBRCHANNELS];
    133 
    134   WORD32 **sbr_lpc_filter_states_imag[MAXNRSBRCHANNELS];
    135 
    136   WORD32 *ptr_sbr_overlap_buf[MAXNRSBRCHANNELS];
    137 
    138   struct ia_sbr_dec_inst_struct str_sbr_dec_inst;
    139 
    140   ia_transposer_settings_struct str_sbr_tran_settings;
    141 
    142   WORD16 *sbr_smooth_gain_buf[MAXNRSBRCHANNELS];
    143 
    144   WORD16 *sbr_smooth_noise_buf[MAXNRSBRCHANNELS];
    145 
    146   ia_sbr_prev_frame_data_struct *pstr_prev_frame_data[MAXNRSBRCHANNELS];
    147 
    148 } ia_sbr_pers_struct;
    149 
    150 WORD32 ixheaacd_sbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data,
    151                         ia_sbr_header_data_struct *ptr_header_data,
    152                         ia_sbr_frame_info_data_struct *ptr_frame_data,
    153                         ia_sbr_prev_frame_data_struct *ptr_frame_data_prev,
    154                         ia_ps_dec_struct *ptr_ps_dec,
    155                         ia_sbr_qmf_filter_bank_struct *ptr_qmf_synth_bank_r,
    156                         ia_sbr_scale_fact_struct *ptr_sbr_sf_r,
    157                         FLAG apply_processing, FLAG low_pow_flag,
    158                         WORD32 *ptr_work_buf_core,
    159                         ia_sbr_tables_struct *sbr_tables_ptr,
    160                         ixheaacd_misc_tables *pstr_common_tables, WORD ch_fac,
    161                         ia_pvc_data_struct *ptr_pvc_data_str, FLAG drc_on,
    162                         WORD32 drc_sbr_factors[][64], WORD32 audio_object_type);
    163 
    164 WORD16 ixheaacd_create_sbrdec(ixheaacd_misc_tables *pstr_common_table,
    165                               ia_sbr_channel_struct *ptr_sbr_channel,
    166                               ia_sbr_header_data_struct *ptr_header_data,
    167                               WORD16 chan, FLAG down_sample_flag,
    168                               VOID *sbr_persistent_mem_v, WORD ps_enable,
    169                               WORD audio_object_type);
    170 
    171 #define MAX_NUM_QMF_BANDS_ESBR 128
    172 
    173 WORD32 ixheaacd_sbr_dec_from_mps(FLOAT32 *p_mps_qmf_output, VOID *p_sbr_dec,
    174                                  VOID *p_sbr_frame, VOID *p_sbr_header);
    175 
    176 WORD32 ixheaacd_qmf_hbe_apply(ia_esbr_hbe_txposer_struct *h_hbe_txposer,
    177                               FLOAT32 qmf_buf_real[][64],
    178                               FLOAT32 qmf_buf_imag[][64], WORD32 num_columns,
    179                               FLOAT32 pv_qmf_buf_real[][64],
    180                               FLOAT32 pv_qmf_buf_imag[][64],
    181                               WORD32 pitch_in_bins);
    182 
    183 VOID ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data,
    184                            FLOAT32 input_real[][64], FLOAT32 input_imag[][64],
    185                            FLOAT32 input_real1[][64], FLOAT32 input_imag1[][64],
    186                            WORD32 x_over_qmf[MAX_NUM_PATCHES],
    187                            FLOAT32 *scratch_buff, FLOAT32 *env_out);
    188 
    189 WORD32 ixheaacd_generate_hf(FLOAT32 ptr_src_buf_real[][64],
    190                             FLOAT32 ptr_src_buf_imag[][64],
    191                             FLOAT32 ptr_ph_vocod_buf_real[][64],
    192                             FLOAT32 ptr_ph_vocod_buf_imag[][64],
    193                             FLOAT32 ptr_dst_buf_real[][64],
    194                             FLOAT32 ptr_dst_buf_imag[][64],
    195                             ia_sbr_frame_info_data_struct *ptr_frame_data,
    196                             ia_sbr_header_data_struct *ptr_header_data);
    197 
    198 VOID ixheaacd_clr_subsamples(WORD32 *ptr_qmf_buf, WORD32 num, WORD32 size);
    199 
    200 VOID ixheaacd_rescale_x_overlap(
    201     ia_sbr_dec_struct *ptr_sbr_dec, ia_sbr_header_data_struct *ptr_header_data,
    202     ia_sbr_frame_info_data_struct *ptr_frame_data,
    203     ia_sbr_prev_frame_data_struct *ptr_frame_data_prev,
    204     WORD32 **pp_overlap_buffer_real, FLAG low_pow_flag);
    205 
    206 WORD32 ixheaacd_qmf_hbe_data_reinit(
    207     ia_esbr_hbe_txposer_struct *ptr_hbe_transposer_str,
    208     WORD16 *ptr_freq_band_tbl[MAX_FREQ_COEFFS + 1], WORD16 *ptr_num_sf_bands,
    209     WORD32 upsamp_4_flag);
    210 
    211 WORD32 ixheaacd_sbr_read_pvc_sce(ia_sbr_frame_info_data_struct *ptr_frame_data,
    212                                  ia_bit_buf_struct *it_bit_buff,
    213                                  WORD32 hbe_flag,
    214                                  ia_pvc_data_struct *ptr_pvc_data,
    215                                  ia_sbr_tables_struct *sbr_tables_ptr,
    216                                  ia_sbr_header_data_struct *ptr_header_data);
    217 
    218 WORD32 ixheaacd_qmf_hbe_apply(ia_esbr_hbe_txposer_struct *h_hbe_txposer,
    219                               FLOAT32 qmf_buf_real[][64],
    220                               FLOAT32 qmf_buf_imag[][64], WORD32 num_columns,
    221                               FLOAT32 pv_qmf_buf_real[][64],
    222                               FLOAT32 pv_qmf_buf_imag[][64],
    223                               WORD32 pitch_in_bins);
    224 
    225 WORD32 ixheaacd_esbr_dec(ia_sbr_dec_struct *ptr_sbr_dec,
    226                          ia_sbr_header_data_struct *ptr_header_data,
    227                          ia_sbr_frame_info_data_struct *ptr_frame_data,
    228                          FLAG apply_processing, FLAG low_pow_flag,
    229                          ia_sbr_tables_struct *sbr_tables_ptr, WORD32 ch_fac);
    230 
    231 VOID ixheaacd_hbe_repl_spec(WORD32 x_over_qmf[MAX_NUM_PATCHES],
    232                             FLOAT32 qmf_buf_real[][64],
    233                             FLOAT32 qmf_buf_imag[][64], WORD32 no_bins,
    234                             WORD32 max_stretch);
    235 
    236 #endif
    237