xref: /aosp_15_r20/external/libxaac/encoder/ixheaace_qc_data.h (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
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