1 /******************************************************************************
2 * *
3 * Copyright (C) 2023 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
21 #include <stddef.h>
22 #include <string.h>
23 #include "ixheaac_type_def.h"
24 #include "ixheaac_constants.h"
25 #include "impd_drc_common_enc.h"
26 #include "impd_drc_uni_drc.h"
27 #include "impd_drc_tables.h"
28 #include "impd_drc_api.h"
29 #include "ixheaace_api.h"
30 #include "ixheaac_error_standards.h"
31 #include "ixheaace_error_codes.h"
32 #include "ixheaace_aac_constants.h"
33 #include "ixheaace_adjust_threshold_data.h"
34 #include "ixheaace_psy_const.h"
35 #include "ixheaace_tns.h"
36 #include "ixheaace_tns_params.h"
37 #include "ixheaace_rom.h"
38 #include "ixheaace_common_rom.h"
39 #include "ixheaace_bitbuffer.h"
40
41 #include "ixheaace_dynamic_bits.h"
42 #include "ixheaace_qc_data.h"
43 #include "ixheaace_channel_map.h"
44 #include "ixheaace_block_switch.h"
45 #include "ixheaace_psy_data.h"
46 #include "ixheaace_interface.h"
47 #include "ixheaace_write_bitstream.h"
48
ia_enhaacplus_enc_init_element(ixheaace_element_info * pstr_element_info,ixheaace_element_type el_type,WORD32 element_instance_tag)49 static IA_ERRORCODE ia_enhaacplus_enc_init_element(ixheaace_element_info *pstr_element_info,
50 ixheaace_element_type el_type,
51 WORD32 element_instance_tag) {
52 IA_ERRORCODE error = IA_NO_ERROR;
53
54 pstr_element_info->el_type = el_type;
55
56 switch (pstr_element_info->el_type) {
57 case ID_SCE:
58 case ID_CCE:
59 pstr_element_info->n_channels_in_el = NUM_CHANS_MONO;
60
61 pstr_element_info->channel_index[0] = 0;
62
63 pstr_element_info->instance_tag = element_instance_tag;
64 break;
65
66 case ID_LFE:
67 pstr_element_info->n_channels_in_el = NUM_CHANS_MONO;
68
69 pstr_element_info->channel_index[0] = 0;
70
71 pstr_element_info->instance_tag = element_instance_tag;
72 break;
73
74 case ID_CPE:
75
76 pstr_element_info->n_channels_in_el = NUM_CHANS_STEREO;
77
78 pstr_element_info->channel_index[0] = 0;
79 pstr_element_info->channel_index[1] = 1;
80
81 pstr_element_info->instance_tag = element_instance_tag;
82 break;
83
84 default:
85 return IA_EXHEAACE_INIT_FATAL_INVALID_ELEMENT_TYPE;
86 }
87
88 return error;
89 }
90
ia_enhaacplus_enc_init_element_info(WORD32 num_channels,ixheaace_element_info * pstr_element_info,WORD32 ele_type,WORD32 element_instance_tag)91 IA_ERRORCODE ia_enhaacplus_enc_init_element_info(WORD32 num_channels,
92 ixheaace_element_info *pstr_element_info,
93 WORD32 ele_type, WORD32 element_instance_tag) {
94 IA_ERRORCODE error = IA_NO_ERROR;
95
96 if (ele_type != ID_LFE) {
97 switch (num_channels) {
98 case NUM_CHANS_MONO:
99 if (ele_type == -1) {
100 error = ia_enhaacplus_enc_init_element(pstr_element_info, ID_SCE, element_instance_tag);
101 } else {
102 error =
103 ia_enhaacplus_enc_init_element(pstr_element_info, ele_type, element_instance_tag);
104 }
105 break;
106
107 case NUM_CHANS_STEREO:
108 error = ia_enhaacplus_enc_init_element(pstr_element_info, ID_CPE, element_instance_tag);
109 break;
110
111 default:
112 return IA_EXHEAACE_INIT_FATAL_NUM_CHANNELS_NOT_SUPPORTED;
113 }
114 } else {
115 error = ia_enhaacplus_enc_init_element(pstr_element_info, ID_LFE, element_instance_tag);
116 }
117
118 return error;
119 }
120
ia_enhaacplus_enc_init_element_bits(ixheaace_element_bits * element_bits,ixheaace_element_info pstr_element_info,WORD32 bitrate_tot,WORD32 average_bits_tot,WORD32 aot,WORD32 static_bits_tot,WORD32 bit_res,FLAG flag_framelength_small)121 IA_ERRORCODE ia_enhaacplus_enc_init_element_bits(ixheaace_element_bits *element_bits,
122 ixheaace_element_info pstr_element_info,
123 WORD32 bitrate_tot, WORD32 average_bits_tot,
124 WORD32 aot, WORD32 static_bits_tot,
125 WORD32 bit_res, FLAG flag_framelength_small) {
126 IA_ERRORCODE error = IA_NO_ERROR;
127
128 switch (pstr_element_info.n_channels_in_el) {
129 case NUM_CHANS_MONO:
130 element_bits->ch_bitrate = bitrate_tot;
131
132 element_bits->average_bits = (average_bits_tot - static_bits_tot);
133 switch (aot) {
134 case AOT_AAC_LC:
135 case AOT_SBR:
136 case AOT_PS:
137 if (flag_framelength_small) {
138 element_bits->max_bits = MAXIMUM_CHANNEL_BITS_960;
139
140 element_bits->max_bit_res_bits = MAXIMUM_CHANNEL_BITS_960 - average_bits_tot;
141 } else {
142 element_bits->max_bits = MAXIMUM_CHANNEL_BITS_1024;
143
144 element_bits->max_bit_res_bits = MAXIMUM_CHANNEL_BITS_1024 - average_bits_tot;
145 }
146 break;
147
148 case AOT_AAC_LD:
149 case AOT_AAC_ELD:
150 if (bit_res) {
151 element_bits->max_bits = bit_res;
152 element_bits->max_bit_res_bits = bit_res - average_bits_tot;
153 } else {
154 element_bits->max_bits = average_bits_tot;
155 element_bits->max_bit_res_bits = 0;
156 }
157 break;
158 }
159
160 element_bits->max_bit_res_bits -= (element_bits[0].max_bit_res_bits % 8);
161 element_bits->bit_res_level = element_bits[0].max_bit_res_bits;
162 element_bits->relative_bits = 1;
163 break;
164
165 case NUM_CHANS_STEREO:
166 element_bits->ch_bitrate = bitrate_tot >> 1;
167
168 element_bits->average_bits = (average_bits_tot - static_bits_tot);
169 switch (aot) {
170 case AOT_AAC_LC:
171 case AOT_SBR:
172 case AOT_PS:
173 if (flag_framelength_small) {
174 element_bits->max_bits = NUM_CHANS_STEREO * MAXIMUM_CHANNEL_BITS_960;
175
176 element_bits->max_bit_res_bits =
177 NUM_CHANS_STEREO * MAXIMUM_CHANNEL_BITS_960 - average_bits_tot;
178 } else {
179 element_bits->max_bits = NUM_CHANS_STEREO * MAXIMUM_CHANNEL_BITS_1024;
180
181 element_bits->max_bit_res_bits =
182 NUM_CHANS_STEREO * MAXIMUM_CHANNEL_BITS_1024 - average_bits_tot;
183 }
184 break;
185
186 case AOT_AAC_LD:
187 case AOT_AAC_ELD:
188 if (bit_res) {
189 element_bits->max_bits = bit_res;
190 element_bits->max_bit_res_bits = bit_res - average_bits_tot;
191 } else {
192 element_bits->max_bits = average_bits_tot;
193 element_bits->max_bit_res_bits = 0;
194 }
195 break;
196 }
197
198 element_bits->max_bit_res_bits -= (element_bits[0].max_bit_res_bits % 8);
199
200 element_bits->bit_res_level = element_bits[0].max_bit_res_bits;
201 element_bits->relative_bits = 1;
202 break;
203
204 default:
205 return IA_EXHEAACE_INIT_FATAL_INVALID_NUM_CHANNELS_IN_ELE;
206 }
207 /* Bits carried over from previous frame */
208 element_bits->carry_bits = 0;
209
210 return error;
211 }
212