aboutsummaryrefslogtreecommitdiff
path: root/encoder/ixheaace_qc_data.h
blob: 4f099a3c9a385fd0c4add36e19f37142a4493612 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/******************************************************************************
 *                                                                            *
 * Copyright (C) 2023 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 *****************************************************************************
 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
 */

#pragma once
typedef enum {
  ID_SCE = 0, /*Single Channel Element*/
  ID_CPE,     /*Channel Pair Element*/
  ID_CCE,     /*Coupling channel Element*/
  ID_LFE,     /*Low frequency Effect Channel*/
  ID_DSE,
  ID_PCE, /*Program Config. Element*/
  ID_FIL, /*Fill element*/
  ID_END  /*End of block*/
} ixheaace_element_type;

typedef enum {
  FRONT_CENTER = 0,
  FRONT_LEFT_RIGHT,
  BACK_LEFT_RIGHT,
  REAR_CENTER,
  LFE_CHANNEL,
  COUPLING_CH,
} ELEMENT_NAME;

typedef enum { FRAME_LEN_BYTES_MODULO = 1, FRAME_LEN_BYTES_INT = 2 } FRAME_LEN_RESULT_MODE;

typedef struct {
  ixheaace_element_type el_type;
  WORD32 instance_tag;
  WORD32 n_channels_in_el;
  WORD32 channel_index[IXHEAACE_MAX_CH_IN_BS_ELE];
} ixheaace_element_info;

typedef struct {
  WORD32 padding_rest;
} ixheaace_padding;

/* Quantizing & coding stage */

typedef struct {
  ixheaace_element_info *pstr_element_info;
  WORD32 max_bits;     /* maximum number of bits in reservoir  */
  WORD32 average_bits; /* average number of bits we should use */
  WORD32 bit_res;
  FLOAT32 mean_pe;
  WORD32 ch_bitrate;
  WORD32 inv_quant;
  FLOAT32 max_bit_fac;
  WORD32 bitrate;
  ixheaace_padding padding;
} ixheaace_qc_init;

#define RED_EXP_VAL 0.25f
#define INV_RED_EXP_VAL (1.0f / RED_EXP_VAL)
#define MIN_SNR_LIMIT 0.8f

#define MAX_SCF_DELTA 60

#define LOG2_1 1.442695041f
#define C1_SF -69.33295f /* -16/3*log(MAX_QUANT+0.5-logCon)/log(2) */
#define C2_SF 5.77078f   /* 4/log(2) */

#define PE_C1 3.0f       /* log(8.0)/log(2) */
#define PE_C2 1.3219281f /* log(2.5)/log(2) */
#define PE_C3 0.5593573f /* 1-C2/C1 */

#define TRANSPORT_BITS (208)

#define MAX_GAIN_INDEX_AAC (128)
#define MIN_GAIN_INDEX_AAC (-128)
#define SCF_COUNT_LIMIT_AAC (1)

typedef struct {
  WORD16 *quant_spec;
  UWORD16 *max_val_in_sfb;
  WORD16 *scalefactor;
  WORD32 global_gain;
  WORD32 grouping_mask;
  ixheaace_section_data section_data;
  WORD32 win_shape;
} ixheaace_qc_out_channel;

typedef struct {
  WORD32 static_bits_used; /* for verification purposes */
  WORD32 dyn_bits_used;    /* for verification purposes */
  FLOAT32 pe;
  WORD32 anc_bits_used;
  WORD32 fill_bits;
} ixheaace_qc_out_element;

typedef struct {
  ixheaace_qc_out_channel *qc_channel[IXHEAACE_MAX_CH_IN_BS_ELE];
  ixheaace_qc_out_element qc_element;
  WORD32 tot_static_bits_used; /* for verification purposes */
  WORD32 tot_dyn_bits_used;    /* for verification purposes */
  WORD32 tot_anc_bits_used;    /* for verification purposes */
  WORD32 total_fill_bits;
  WORD32 align_bits;
  WORD32 bit_res_tot;
  WORD32 average_bits_tot;
} ixheaace_qc_out;

typedef struct {
  WORD32 ch_bitrate;
  WORD32 average_bits; /* brutto -> look pstr_ancillary.h */
  WORD32 max_bits;
  WORD32 bit_res_level;
  WORD32 max_bit_res_bits;
  WORD32 relative_bits; /* Bits relative to total Bits*/
  WORD32 carry_bits;    /* Bits carried over from prev. frame */
} ixheaace_element_bits;

typedef struct {
  WORD32 *shared_buffer_2;
} ixheaace_qc_scratch;

typedef struct {
  /* this is basically struct ixheaace_qc_init */
  WORD32 average_bits_tot;
  WORD32 max_bits_tot;
  WORD32 glob_stat_bits;
  WORD32 num_channels;
  WORD32 bit_res_tot;
  WORD32 quality_level;
  ixheaace_padding padding;
  ixheaace_element_bits element_bits;
  FLOAT32 max_bit_fac;
  ia_adj_thr_state_struct str_adj_thr;
  WORD32 side_info_tab_long[MAXIMUM_SCALE_FACTOR_BAND_LONG + 1];
  WORD32 side_info_tab_short[MAXIMUM_SCALE_FACTOR_BAND_SHORT + 1];
  ixheaace_qc_scratch qc_scr;
} ixheaace_qc_state;

typedef struct {
  FLOAT32 exp_spec[FRAME_LEN_1024];
  FLOAT32 mdct_spec_float[FRAME_LEN_1024];
  FLOAT32 sfb_form_fac[IXHEAACE_MAX_CH_IN_BS_ELE][MAXIMUM_GROUPED_SCALE_FACTOR_BAND];
  FLOAT32 sfb_num_relevant_lines[IXHEAACE_MAX_CH_IN_BS_ELE][MAXIMUM_GROUPED_SCALE_FACTOR_BAND];
  FLOAT32 sfb_ld_energy[IXHEAACE_MAX_CH_IN_BS_ELE][MAXIMUM_GROUPED_SCALE_FACTOR_BAND];
} ixheaace_qc_stack;