1*15dc779aSAndroid Build Coastguard Worker /****************************************************************************** 2*15dc779aSAndroid Build Coastguard Worker * * 3*15dc779aSAndroid Build Coastguard Worker * Copyright (C) 2023 The Android Open Source Project 4*15dc779aSAndroid Build Coastguard Worker * 5*15dc779aSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 6*15dc779aSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 7*15dc779aSAndroid Build Coastguard Worker * You may obtain a copy of the License at: 8*15dc779aSAndroid Build Coastguard Worker * 9*15dc779aSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 10*15dc779aSAndroid Build Coastguard Worker * 11*15dc779aSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 12*15dc779aSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 13*15dc779aSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*15dc779aSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 15*15dc779aSAndroid Build Coastguard Worker * limitations under the License. 16*15dc779aSAndroid Build Coastguard Worker * 17*15dc779aSAndroid Build Coastguard Worker ***************************************************************************** 18*15dc779aSAndroid Build Coastguard Worker * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore 19*15dc779aSAndroid Build Coastguard Worker */ 20*15dc779aSAndroid Build Coastguard Worker 21*15dc779aSAndroid Build Coastguard Worker #pragma once 22*15dc779aSAndroid Build Coastguard Worker typedef enum { 23*15dc779aSAndroid Build Coastguard Worker ID_SCE = 0, /*Single Channel Element*/ 24*15dc779aSAndroid Build Coastguard Worker ID_CPE, /*Channel Pair Element*/ 25*15dc779aSAndroid Build Coastguard Worker ID_CCE, /*Coupling channel Element*/ 26*15dc779aSAndroid Build Coastguard Worker ID_LFE, /*Low frequency Effect Channel*/ 27*15dc779aSAndroid Build Coastguard Worker ID_DSE, 28*15dc779aSAndroid Build Coastguard Worker ID_PCE, /*Program Config. Element*/ 29*15dc779aSAndroid Build Coastguard Worker ID_FIL, /*Fill element*/ 30*15dc779aSAndroid Build Coastguard Worker ID_END /*End of block*/ 31*15dc779aSAndroid Build Coastguard Worker } ixheaace_element_type; 32*15dc779aSAndroid Build Coastguard Worker 33*15dc779aSAndroid Build Coastguard Worker typedef enum { 34*15dc779aSAndroid Build Coastguard Worker FRONT_CENTER = 0, 35*15dc779aSAndroid Build Coastguard Worker FRONT_LEFT_RIGHT, 36*15dc779aSAndroid Build Coastguard Worker BACK_LEFT_RIGHT, 37*15dc779aSAndroid Build Coastguard Worker REAR_CENTER, 38*15dc779aSAndroid Build Coastguard Worker LFE_CHANNEL, 39*15dc779aSAndroid Build Coastguard Worker COUPLING_CH, 40*15dc779aSAndroid Build Coastguard Worker } ELEMENT_NAME; 41*15dc779aSAndroid Build Coastguard Worker 42*15dc779aSAndroid Build Coastguard Worker typedef enum { FRAME_LEN_BYTES_MODULO = 1, FRAME_LEN_BYTES_INT = 2 } FRAME_LEN_RESULT_MODE; 43*15dc779aSAndroid Build Coastguard Worker 44*15dc779aSAndroid Build Coastguard Worker typedef struct { 45*15dc779aSAndroid Build Coastguard Worker ixheaace_element_type el_type; 46*15dc779aSAndroid Build Coastguard Worker WORD32 instance_tag; 47*15dc779aSAndroid Build Coastguard Worker WORD32 n_channels_in_el; 48*15dc779aSAndroid Build Coastguard Worker WORD32 channel_index[IXHEAACE_MAX_CH_IN_BS_ELE]; 49*15dc779aSAndroid Build Coastguard Worker } ixheaace_element_info; 50*15dc779aSAndroid Build Coastguard Worker 51*15dc779aSAndroid Build Coastguard Worker typedef struct { 52*15dc779aSAndroid Build Coastguard Worker WORD32 padding_rest; 53*15dc779aSAndroid Build Coastguard Worker } ixheaace_padding; 54*15dc779aSAndroid Build Coastguard Worker 55*15dc779aSAndroid Build Coastguard Worker /* Quantizing & coding stage */ 56*15dc779aSAndroid Build Coastguard Worker 57*15dc779aSAndroid Build Coastguard Worker typedef struct { 58*15dc779aSAndroid Build Coastguard Worker ixheaace_element_info *pstr_element_info; 59*15dc779aSAndroid Build Coastguard Worker WORD32 max_bits; /* maximum number of bits in reservoir */ 60*15dc779aSAndroid Build Coastguard Worker WORD32 average_bits; /* average number of bits we should use */ 61*15dc779aSAndroid Build Coastguard Worker WORD32 bit_res; 62*15dc779aSAndroid Build Coastguard Worker FLOAT32 mean_pe; 63*15dc779aSAndroid Build Coastguard Worker WORD32 ch_bitrate; 64*15dc779aSAndroid Build Coastguard Worker WORD32 inv_quant; 65*15dc779aSAndroid Build Coastguard Worker FLOAT32 max_bit_fac; 66*15dc779aSAndroid Build Coastguard Worker WORD32 bitrate; 67*15dc779aSAndroid Build Coastguard Worker ixheaace_padding padding; 68*15dc779aSAndroid Build Coastguard Worker } ixheaace_qc_init; 69*15dc779aSAndroid Build Coastguard Worker 70*15dc779aSAndroid Build Coastguard Worker #define RED_EXP_VAL 0.25f 71*15dc779aSAndroid Build Coastguard Worker #define INV_RED_EXP_VAL (1.0f / RED_EXP_VAL) 72*15dc779aSAndroid Build Coastguard Worker #define MIN_SNR_LIMIT 0.8f 73*15dc779aSAndroid Build Coastguard Worker 74*15dc779aSAndroid Build Coastguard Worker #define MAX_SCF_DELTA 60 75*15dc779aSAndroid Build Coastguard Worker 76*15dc779aSAndroid Build Coastguard Worker #define LOG2_1 1.442695041f 77*15dc779aSAndroid Build Coastguard Worker #define C1_SF -69.33295f /* -16/3*log(MAX_QUANT+0.5-logCon)/log(2) */ 78*15dc779aSAndroid Build Coastguard Worker #define C2_SF 5.77078f /* 4/log(2) */ 79*15dc779aSAndroid Build Coastguard Worker 80*15dc779aSAndroid Build Coastguard Worker #define PE_C1 3.0f /* log(8.0)/log(2) */ 81*15dc779aSAndroid Build Coastguard Worker #define PE_C2 1.3219281f /* log(2.5)/log(2) */ 82*15dc779aSAndroid Build Coastguard Worker #define PE_C3 0.5593573f /* 1-C2/C1 */ 83*15dc779aSAndroid Build Coastguard Worker 84*15dc779aSAndroid Build Coastguard Worker #define TRANSPORT_BITS (208) 85*15dc779aSAndroid Build Coastguard Worker 86*15dc779aSAndroid Build Coastguard Worker #define MAX_GAIN_INDEX_AAC (128) 87*15dc779aSAndroid Build Coastguard Worker #define MIN_GAIN_INDEX_AAC (-128) 88*15dc779aSAndroid Build Coastguard Worker #define SCF_COUNT_LIMIT_AAC (1) 89*15dc779aSAndroid Build Coastguard Worker 90*15dc779aSAndroid Build Coastguard Worker typedef struct { 91*15dc779aSAndroid Build Coastguard Worker WORD16 *quant_spec; 92*15dc779aSAndroid Build Coastguard Worker UWORD16 *max_val_in_sfb; 93*15dc779aSAndroid Build Coastguard Worker WORD16 *scalefactor; 94*15dc779aSAndroid Build Coastguard Worker WORD32 global_gain; 95*15dc779aSAndroid Build Coastguard Worker WORD32 grouping_mask; 96*15dc779aSAndroid Build Coastguard Worker ixheaace_section_data section_data; 97*15dc779aSAndroid Build Coastguard Worker WORD32 win_shape; 98*15dc779aSAndroid Build Coastguard Worker } ixheaace_qc_out_channel; 99*15dc779aSAndroid Build Coastguard Worker 100*15dc779aSAndroid Build Coastguard Worker typedef struct { 101*15dc779aSAndroid Build Coastguard Worker WORD32 static_bits_used; /* for verification purposes */ 102*15dc779aSAndroid Build Coastguard Worker WORD32 dyn_bits_used; /* for verification purposes */ 103*15dc779aSAndroid Build Coastguard Worker FLOAT32 pe; 104*15dc779aSAndroid Build Coastguard Worker WORD32 anc_bits_used; 105*15dc779aSAndroid Build Coastguard Worker WORD32 fill_bits; 106*15dc779aSAndroid Build Coastguard Worker } ixheaace_qc_out_element; 107*15dc779aSAndroid Build Coastguard Worker 108*15dc779aSAndroid Build Coastguard Worker typedef struct { 109*15dc779aSAndroid Build Coastguard Worker ixheaace_qc_out_channel *qc_channel[IXHEAACE_MAX_CH_IN_BS_ELE]; 110*15dc779aSAndroid Build Coastguard Worker ixheaace_qc_out_element qc_element; 111*15dc779aSAndroid Build Coastguard Worker WORD32 tot_static_bits_used; /* for verification purposes */ 112*15dc779aSAndroid Build Coastguard Worker WORD32 tot_dyn_bits_used; /* for verification purposes */ 113*15dc779aSAndroid Build Coastguard Worker WORD32 tot_anc_bits_used; /* for verification purposes */ 114*15dc779aSAndroid Build Coastguard Worker WORD32 total_fill_bits; 115*15dc779aSAndroid Build Coastguard Worker WORD32 align_bits; 116*15dc779aSAndroid Build Coastguard Worker WORD32 bit_res_tot; 117*15dc779aSAndroid Build Coastguard Worker WORD32 average_bits_tot; 118*15dc779aSAndroid Build Coastguard Worker } ixheaace_qc_out; 119*15dc779aSAndroid Build Coastguard Worker 120*15dc779aSAndroid Build Coastguard Worker typedef struct { 121*15dc779aSAndroid Build Coastguard Worker WORD32 ch_bitrate; 122*15dc779aSAndroid Build Coastguard Worker WORD32 average_bits; /* brutto -> look pstr_ancillary.h */ 123*15dc779aSAndroid Build Coastguard Worker WORD32 max_bits; 124*15dc779aSAndroid Build Coastguard Worker WORD32 bit_res_level; 125*15dc779aSAndroid Build Coastguard Worker WORD32 max_bit_res_bits; 126*15dc779aSAndroid Build Coastguard Worker WORD32 relative_bits; /* Bits relative to total Bits*/ 127*15dc779aSAndroid Build Coastguard Worker WORD32 carry_bits; /* Bits carried over from prev. frame */ 128*15dc779aSAndroid Build Coastguard Worker } ixheaace_element_bits; 129*15dc779aSAndroid Build Coastguard Worker 130*15dc779aSAndroid Build Coastguard Worker typedef struct { 131*15dc779aSAndroid Build Coastguard Worker WORD32 *shared_buffer_2; 132*15dc779aSAndroid Build Coastguard Worker } ixheaace_qc_scratch; 133*15dc779aSAndroid Build Coastguard Worker 134*15dc779aSAndroid Build Coastguard Worker typedef struct { 135*15dc779aSAndroid Build Coastguard Worker /* this is basically struct ixheaace_qc_init */ 136*15dc779aSAndroid Build Coastguard Worker WORD32 average_bits_tot; 137*15dc779aSAndroid Build Coastguard Worker WORD32 max_bits_tot; 138*15dc779aSAndroid Build Coastguard Worker WORD32 glob_stat_bits; 139*15dc779aSAndroid Build Coastguard Worker WORD32 num_channels; 140*15dc779aSAndroid Build Coastguard Worker WORD32 bit_res_tot; 141*15dc779aSAndroid Build Coastguard Worker WORD32 quality_level; 142*15dc779aSAndroid Build Coastguard Worker ixheaace_padding padding; 143*15dc779aSAndroid Build Coastguard Worker ixheaace_element_bits element_bits; 144*15dc779aSAndroid Build Coastguard Worker FLOAT32 max_bit_fac; 145*15dc779aSAndroid Build Coastguard Worker ia_adj_thr_state_struct str_adj_thr; 146*15dc779aSAndroid Build Coastguard Worker WORD32 side_info_tab_long[MAXIMUM_SCALE_FACTOR_BAND_LONG + 1]; 147*15dc779aSAndroid Build Coastguard Worker WORD32 side_info_tab_short[MAXIMUM_SCALE_FACTOR_BAND_SHORT + 1]; 148*15dc779aSAndroid Build Coastguard Worker ixheaace_qc_scratch qc_scr; 149*15dc779aSAndroid Build Coastguard Worker } ixheaace_qc_state; 150*15dc779aSAndroid Build Coastguard Worker 151*15dc779aSAndroid Build Coastguard Worker typedef struct { 152*15dc779aSAndroid Build Coastguard Worker FLOAT32 exp_spec[FRAME_LEN_1024]; 153*15dc779aSAndroid Build Coastguard Worker FLOAT32 mdct_spec_float[FRAME_LEN_1024]; 154*15dc779aSAndroid Build Coastguard Worker FLOAT32 sfb_form_fac[IXHEAACE_MAX_CH_IN_BS_ELE][MAXIMUM_GROUPED_SCALE_FACTOR_BAND]; 155*15dc779aSAndroid Build Coastguard Worker FLOAT32 sfb_num_relevant_lines[IXHEAACE_MAX_CH_IN_BS_ELE][MAXIMUM_GROUPED_SCALE_FACTOR_BAND]; 156*15dc779aSAndroid Build Coastguard Worker FLOAT32 sfb_ld_energy[IXHEAACE_MAX_CH_IN_BS_ELE][MAXIMUM_GROUPED_SCALE_FACTOR_BAND]; 157*15dc779aSAndroid Build Coastguard Worker } ixheaace_qc_stack; 158