/src/aac/libAACenc/src/channel_map.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | /* ----------------------------------------------------------------------------- |
2 | | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | | |
4 | | © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten |
5 | | Forschung e.V. All rights reserved. |
6 | | |
7 | | 1. INTRODUCTION |
8 | | The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software |
9 | | that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding |
10 | | scheme for digital audio. This FDK AAC Codec software is intended to be used on |
11 | | a wide variety of Android devices. |
12 | | |
13 | | AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient |
14 | | general perceptual audio codecs. AAC-ELD is considered the best-performing |
15 | | full-bandwidth communications codec by independent studies and is widely |
16 | | deployed. AAC has been standardized by ISO and IEC as part of the MPEG |
17 | | specifications. |
18 | | |
19 | | Patent licenses for necessary patent claims for the FDK AAC Codec (including |
20 | | those of Fraunhofer) may be obtained through Via Licensing |
21 | | (www.vialicensing.com) or through the respective patent owners individually for |
22 | | the purpose of encoding or decoding bit streams in products that are compliant |
23 | | with the ISO/IEC MPEG audio standards. Please note that most manufacturers of |
24 | | Android devices already license these patent claims through Via Licensing or |
25 | | directly from the patent owners, and therefore FDK AAC Codec software may |
26 | | already be covered under those patent licenses when it is used for those |
27 | | licensed purposes only. |
28 | | |
29 | | Commercially-licensed AAC software libraries, including floating-point versions |
30 | | with enhanced sound quality, are also available from Fraunhofer. Users are |
31 | | encouraged to check the Fraunhofer website for additional applications |
32 | | information and documentation. |
33 | | |
34 | | 2. COPYRIGHT LICENSE |
35 | | |
36 | | Redistribution and use in source and binary forms, with or without modification, |
37 | | are permitted without payment of copyright license fees provided that you |
38 | | satisfy the following conditions: |
39 | | |
40 | | You must retain the complete text of this software license in redistributions of |
41 | | the FDK AAC Codec or your modifications thereto in source code form. |
42 | | |
43 | | You must retain the complete text of this software license in the documentation |
44 | | and/or other materials provided with redistributions of the FDK AAC Codec or |
45 | | your modifications thereto in binary form. You must make available free of |
46 | | charge copies of the complete source code of the FDK AAC Codec and your |
47 | | modifications thereto to recipients of copies in binary form. |
48 | | |
49 | | The name of Fraunhofer may not be used to endorse or promote products derived |
50 | | from this library without prior written permission. |
51 | | |
52 | | You may not charge copyright license fees for anyone to use, copy or distribute |
53 | | the FDK AAC Codec software or your modifications thereto. |
54 | | |
55 | | Your modified versions of the FDK AAC Codec must carry prominent notices stating |
56 | | that you changed the software and the date of any change. For modified versions |
57 | | of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" |
58 | | must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK |
59 | | AAC Codec Library for Android." |
60 | | |
61 | | 3. NO PATENT LICENSE |
62 | | |
63 | | NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without |
64 | | limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. |
65 | | Fraunhofer provides no warranty of patent non-infringement with respect to this |
66 | | software. |
67 | | |
68 | | You may use this FDK AAC Codec software or modifications thereto only for |
69 | | purposes that are authorized by appropriate patent licenses. |
70 | | |
71 | | 4. DISCLAIMER |
72 | | |
73 | | This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright |
74 | | holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, |
75 | | including but not limited to the implied warranties of merchantability and |
76 | | fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR |
77 | | CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, |
78 | | or consequential damages, including but not limited to procurement of substitute |
79 | | goods or services; loss of use, data, or profits, or business interruption, |
80 | | however caused and on any theory of liability, whether in contract, strict |
81 | | liability, or tort (including negligence), arising in any way out of the use of |
82 | | this software, even if advised of the possibility of such damage. |
83 | | |
84 | | 5. CONTACT INFORMATION |
85 | | |
86 | | Fraunhofer Institute for Integrated Circuits IIS |
87 | | Attention: Audio and Multimedia Departments - FDK AAC LL |
88 | | Am Wolfsmantel 33 |
89 | | 91058 Erlangen, Germany |
90 | | |
91 | | www.iis.fraunhofer.de/amm |
92 | | amm-info@iis.fraunhofer.de |
93 | | ----------------------------------------------------------------------------- */ |
94 | | |
95 | | /**************************** AAC encoder library ****************************** |
96 | | |
97 | | Author(s): A. Groeschel |
98 | | |
99 | | Description: channel mapping functionality |
100 | | |
101 | | *******************************************************************************/ |
102 | | |
103 | | #include "channel_map.h" |
104 | | #include "bitenc.h" |
105 | | #include "psy_const.h" |
106 | | #include "qc_data.h" |
107 | | #include "aacEnc_ram.h" |
108 | | #include "FDK_tools_rom.h" |
109 | | |
110 | | /* channel_assignment treats the relationship of Input file channels |
111 | | to the encoder channels. |
112 | | This is necessary because the usual order in RIFF files (.wav) |
113 | | is different from the elements order in the coder given |
114 | | by Table 8.1 (implicit speaker mapping) of the AAC standard. |
115 | | |
116 | | In mono and stereo case, this is trivial. |
117 | | In mc case, it looks like this: |
118 | | |
119 | | Channel Input file coder chan |
120 | | 5ch: |
121 | | front center 2 0 (SCE channel) |
122 | | left center 0 1 (1st of 1st CPE) |
123 | | right center 1 2 (2nd of 1st CPE) |
124 | | left surround 3 3 (1st of 2nd CPE) |
125 | | right surround 4 4 (2nd of 2nd CPE) |
126 | | |
127 | | 5.1ch: |
128 | | front center 2 0 (SCE channel) |
129 | | left center 0 1 (1st of 1st CPE) |
130 | | right center 1 2 (2nd of 1st CPE) |
131 | | left surround 4 3 (1st of 2nd CPE) |
132 | | right surround 5 4 (2nd of 2nd CPE) |
133 | | LFE 3 5 (LFE) |
134 | | */ |
135 | | |
136 | | /* Channel mode configuration tab provides, |
137 | | corresponding number of channels and elements |
138 | | */ |
139 | | static const CHANNEL_MODE_CONFIG_TAB channelModeConfig[] = { |
140 | | {MODE_1, 1, 1, 1}, /* chCfg 1, SCE */ |
141 | | {MODE_2, 2, 2, 1}, /* chCfg 2, CPE */ |
142 | | {MODE_1_2, 3, 3, 2}, /* chCfg 3, SCE,CPE */ |
143 | | {MODE_1_2_1, 4, 4, 3}, /* chCfg 4, SCE,CPE,SCE */ |
144 | | {MODE_1_2_2, 5, 5, 3}, /* chCfg 5, SCE,CPE,CPE */ |
145 | | {MODE_1_2_2_1, 6, 5, 4}, /* chCfg 6, SCE,CPE,CPE,LFE */ |
146 | | {MODE_1_2_2_2_1, 8, 7, 5}, /* chCfg 7, SCE,CPE,CPE,CPE,LFE */ |
147 | | {MODE_6_1, 7, 6, 5}, /* chCfg 11, SCE,CPE,CPE,SCE,LFE */ |
148 | | {MODE_7_1_BACK, 8, 7, 5}, /* chCfg 12, SCE,CPE,CPE,CPE,LFE */ |
149 | | {MODE_7_1_TOP_FRONT, 8, 7, 5}, /* chCfg 14, SCE,CPE,CPE,LFE,CPE */ |
150 | | {MODE_7_1_REAR_SURROUND, 8, 7, |
151 | | 5}, /* same as MODE_7_1_BACK, SCE,CPE,CPE,CPE,LFE */ |
152 | | {MODE_7_1_FRONT_CENTER, 8, 7, |
153 | | 5}, /* same as MODE_1_2_2_2_1, SCE,CPE,CPE,CPE,LFE */ |
154 | | |
155 | | }; |
156 | | |
157 | | AAC_ENCODER_ERROR FDKaacEnc_DetermineEncoderMode(CHANNEL_MODE* mode, |
158 | 0 | INT nChannels) { |
159 | 0 | INT i; |
160 | 0 | CHANNEL_MODE encMode = MODE_INVALID; |
161 | |
|
162 | 0 | if (*mode == MODE_UNKNOWN) { |
163 | 0 | for (i = 0; i < (INT)sizeof(channelModeConfig) / |
164 | 0 | (INT)sizeof(CHANNEL_MODE_CONFIG_TAB); |
165 | 0 | i++) { |
166 | 0 | if (channelModeConfig[i].nChannels == nChannels) { |
167 | 0 | encMode = channelModeConfig[i].encMode; |
168 | 0 | break; |
169 | 0 | } |
170 | 0 | } |
171 | 0 | *mode = encMode; |
172 | 0 | } else { |
173 | | /* check if valid channel configuration */ |
174 | 0 | if (FDKaacEnc_GetChannelModeConfiguration(*mode)->nChannels == nChannels) { |
175 | 0 | encMode = *mode; |
176 | 0 | } |
177 | 0 | } |
178 | |
|
179 | 0 | if (encMode == MODE_INVALID) { |
180 | 0 | return AAC_ENC_UNSUPPORTED_CHANNELCONFIG; |
181 | 0 | } |
182 | | |
183 | 0 | return AAC_ENC_OK; |
184 | 0 | } |
185 | | |
186 | | static INT FDKaacEnc_initElement(ELEMENT_INFO* elInfo, MP4_ELEMENT_ID elType, |
187 | | INT* cnt, FDK_channelMapDescr* mapDescr, |
188 | | UINT mapIdx, INT* it_cnt, |
189 | 0 | const FIXP_DBL relBits) { |
190 | 0 | INT error = 0; |
191 | 0 | INT counter = *cnt; |
192 | |
|
193 | 0 | elInfo->elType = elType; |
194 | 0 | elInfo->relativeBits = relBits; |
195 | |
|
196 | 0 | switch (elInfo->elType) { |
197 | 0 | case ID_SCE: |
198 | 0 | case ID_LFE: |
199 | 0 | case ID_CCE: |
200 | 0 | elInfo->nChannelsInEl = 1; |
201 | 0 | elInfo->ChannelIndex[0] = |
202 | 0 | FDK_chMapDescr_getMapValue(mapDescr, counter++, mapIdx); |
203 | 0 | elInfo->instanceTag = it_cnt[elType]++; |
204 | 0 | break; |
205 | 0 | case ID_CPE: |
206 | 0 | elInfo->nChannelsInEl = 2; |
207 | 0 | elInfo->ChannelIndex[0] = |
208 | 0 | FDK_chMapDescr_getMapValue(mapDescr, counter++, mapIdx); |
209 | 0 | elInfo->ChannelIndex[1] = |
210 | 0 | FDK_chMapDescr_getMapValue(mapDescr, counter++, mapIdx); |
211 | 0 | elInfo->instanceTag = it_cnt[elType]++; |
212 | 0 | break; |
213 | 0 | case ID_DSE: |
214 | 0 | elInfo->nChannelsInEl = 0; |
215 | 0 | elInfo->ChannelIndex[0] = 0; |
216 | 0 | elInfo->ChannelIndex[1] = 0; |
217 | 0 | elInfo->instanceTag = it_cnt[elType]++; |
218 | 0 | break; |
219 | 0 | default: |
220 | 0 | error = 1; |
221 | 0 | }; |
222 | 0 | *cnt = counter; |
223 | 0 | return error; |
224 | 0 | } |
225 | | |
226 | | AAC_ENCODER_ERROR FDKaacEnc_InitChannelMapping(CHANNEL_MODE mode, |
227 | | CHANNEL_ORDER co, |
228 | 0 | CHANNEL_MAPPING* cm) { |
229 | 0 | INT count = 0; /* count through coder channels */ |
230 | 0 | INT it_cnt[ID_END + 1]; |
231 | 0 | INT i; |
232 | 0 | UINT mapIdx; |
233 | 0 | FDK_channelMapDescr mapDescr; |
234 | |
|
235 | 0 | for (i = 0; i < ID_END; i++) it_cnt[i] = 0; |
236 | |
|
237 | 0 | FDKmemclear(cm, sizeof(CHANNEL_MAPPING)); |
238 | | |
239 | | /* init channel mapping*/ |
240 | 0 | for (i = 0; i < (INT)sizeof(channelModeConfig) / |
241 | 0 | (INT)sizeof(CHANNEL_MODE_CONFIG_TAB); |
242 | 0 | i++) { |
243 | 0 | if (channelModeConfig[i].encMode == mode) { |
244 | 0 | cm->encMode = channelModeConfig[i].encMode; |
245 | 0 | cm->nChannels = channelModeConfig[i].nChannels; |
246 | 0 | cm->nChannelsEff = channelModeConfig[i].nChannelsEff; |
247 | 0 | cm->nElements = channelModeConfig[i].nElements; |
248 | |
|
249 | 0 | break; |
250 | 0 | } |
251 | 0 | } |
252 | | |
253 | | /* init map descriptor */ |
254 | 0 | FDK_chMapDescr_init(&mapDescr, NULL, 0, (co == CH_ORDER_MPEG) ? 1 : 0); |
255 | 0 | switch (mode) { |
256 | 0 | case MODE_7_1_REAR_SURROUND: /* MODE_7_1_REAR_SURROUND is equivalent to |
257 | | MODE_7_1_BACK */ |
258 | 0 | mapIdx = (INT)MODE_7_1_BACK; |
259 | 0 | break; |
260 | 0 | case MODE_7_1_FRONT_CENTER: /* MODE_7_1_FRONT_CENTER is equivalent to |
261 | | MODE_1_2_2_2_1 */ |
262 | 0 | mapIdx = (INT)MODE_1_2_2_2_1; |
263 | 0 | break; |
264 | 0 | default: |
265 | 0 | mapIdx = |
266 | 0 | (INT)mode > 14 |
267 | 0 | ? 0 |
268 | 0 | : (INT) |
269 | 0 | mode; /* if channel config > 14 MPEG mapping will be used */ |
270 | 0 | } |
271 | | |
272 | | /* init element info struct */ |
273 | 0 | switch (mode) { |
274 | 0 | case MODE_1: |
275 | | /* (mono) sce */ |
276 | 0 | FDKaacEnc_initElement(&cm->elInfo[0], ID_SCE, &count, &mapDescr, mapIdx, |
277 | 0 | it_cnt, (FIXP_DBL)MAXVAL_DBL); |
278 | 0 | break; |
279 | 0 | case MODE_2: |
280 | | /* (stereo) cpe */ |
281 | 0 | FDKaacEnc_initElement(&cm->elInfo[0], ID_CPE, &count, &mapDescr, mapIdx, |
282 | 0 | it_cnt, (FIXP_DBL)MAXVAL_DBL); |
283 | 0 | break; |
284 | | |
285 | 0 | case MODE_1_2: |
286 | | /* sce + cpe */ |
287 | 0 | FDKaacEnc_initElement(&cm->elInfo[0], ID_SCE, &count, &mapDescr, mapIdx, |
288 | 0 | it_cnt, FL2FXCONST_DBL(0.4f)); |
289 | 0 | FDKaacEnc_initElement(&cm->elInfo[1], ID_CPE, &count, &mapDescr, mapIdx, |
290 | 0 | it_cnt, FL2FXCONST_DBL(0.6f)); |
291 | 0 | break; |
292 | | |
293 | 0 | case MODE_1_2_1: |
294 | | /* sce + cpe + sce */ |
295 | 0 | FDKaacEnc_initElement(&cm->elInfo[0], ID_SCE, &count, &mapDescr, mapIdx, |
296 | 0 | it_cnt, FL2FXCONST_DBL(0.3f)); |
297 | 0 | FDKaacEnc_initElement(&cm->elInfo[1], ID_CPE, &count, &mapDescr, mapIdx, |
298 | 0 | it_cnt, FL2FXCONST_DBL(0.4f)); |
299 | 0 | FDKaacEnc_initElement(&cm->elInfo[2], ID_SCE, &count, &mapDescr, mapIdx, |
300 | 0 | it_cnt, FL2FXCONST_DBL(0.3f)); |
301 | 0 | break; |
302 | | |
303 | 0 | case MODE_1_2_2: |
304 | | /* sce + cpe + cpe */ |
305 | 0 | FDKaacEnc_initElement(&cm->elInfo[0], ID_SCE, &count, &mapDescr, mapIdx, |
306 | 0 | it_cnt, FL2FXCONST_DBL(0.26f)); |
307 | 0 | FDKaacEnc_initElement(&cm->elInfo[1], ID_CPE, &count, &mapDescr, mapIdx, |
308 | 0 | it_cnt, FL2FXCONST_DBL(0.37f)); |
309 | 0 | FDKaacEnc_initElement(&cm->elInfo[2], ID_CPE, &count, &mapDescr, mapIdx, |
310 | 0 | it_cnt, FL2FXCONST_DBL(0.37f)); |
311 | 0 | break; |
312 | | |
313 | 0 | case MODE_1_2_2_1: |
314 | | /* (5.1) sce + cpe + cpe + lfe */ |
315 | 0 | FDKaacEnc_initElement(&cm->elInfo[0], ID_SCE, &count, &mapDescr, mapIdx, |
316 | 0 | it_cnt, FL2FXCONST_DBL(0.24f)); |
317 | 0 | FDKaacEnc_initElement(&cm->elInfo[1], ID_CPE, &count, &mapDescr, mapIdx, |
318 | 0 | it_cnt, FL2FXCONST_DBL(0.35f)); |
319 | 0 | FDKaacEnc_initElement(&cm->elInfo[2], ID_CPE, &count, &mapDescr, mapIdx, |
320 | 0 | it_cnt, FL2FXCONST_DBL(0.35f)); |
321 | 0 | FDKaacEnc_initElement(&cm->elInfo[3], ID_LFE, &count, &mapDescr, mapIdx, |
322 | 0 | it_cnt, FL2FXCONST_DBL(0.06f)); |
323 | 0 | break; |
324 | | |
325 | 0 | case MODE_6_1: |
326 | | /* (6.1) sce + cpe + cpe + sce + lfe */ |
327 | 0 | FDKaacEnc_initElement(&cm->elInfo[0], ID_SCE, &count, &mapDescr, mapIdx, |
328 | 0 | it_cnt, FL2FXCONST_DBL(0.2f)); |
329 | 0 | FDKaacEnc_initElement(&cm->elInfo[1], ID_CPE, &count, &mapDescr, mapIdx, |
330 | 0 | it_cnt, FL2FXCONST_DBL(0.275f)); |
331 | 0 | FDKaacEnc_initElement(&cm->elInfo[2], ID_CPE, &count, &mapDescr, mapIdx, |
332 | 0 | it_cnt, FL2FXCONST_DBL(0.275f)); |
333 | 0 | FDKaacEnc_initElement(&cm->elInfo[3], ID_SCE, &count, &mapDescr, mapIdx, |
334 | 0 | it_cnt, FL2FXCONST_DBL(0.2f)); |
335 | 0 | FDKaacEnc_initElement(&cm->elInfo[4], ID_LFE, &count, &mapDescr, mapIdx, |
336 | 0 | it_cnt, FL2FXCONST_DBL(0.05f)); |
337 | 0 | break; |
338 | | |
339 | 0 | case MODE_1_2_2_2_1: |
340 | 0 | case MODE_7_1_BACK: |
341 | 0 | case MODE_7_1_TOP_FRONT: |
342 | 0 | case MODE_7_1_REAR_SURROUND: |
343 | 0 | case MODE_7_1_FRONT_CENTER: { |
344 | | /* (7.1) sce + cpe + cpe + cpe + lfe */ |
345 | | /* (7.1 top) sce + cpe + cpe + lfe + cpe */ |
346 | |
|
347 | 0 | FDKaacEnc_initElement(&cm->elInfo[0], ID_SCE, &count, &mapDescr, mapIdx, |
348 | 0 | it_cnt, FL2FXCONST_DBL(0.18f)); |
349 | 0 | FDKaacEnc_initElement(&cm->elInfo[1], ID_CPE, &count, &mapDescr, mapIdx, |
350 | 0 | it_cnt, FL2FXCONST_DBL(0.26f)); |
351 | 0 | FDKaacEnc_initElement(&cm->elInfo[2], ID_CPE, &count, &mapDescr, mapIdx, |
352 | 0 | it_cnt, FL2FXCONST_DBL(0.26f)); |
353 | 0 | if (mode != MODE_7_1_TOP_FRONT) { |
354 | 0 | FDKaacEnc_initElement(&cm->elInfo[3], ID_CPE, &count, &mapDescr, mapIdx, |
355 | 0 | it_cnt, FL2FXCONST_DBL(0.26f)); |
356 | 0 | FDKaacEnc_initElement(&cm->elInfo[4], ID_LFE, &count, &mapDescr, mapIdx, |
357 | 0 | it_cnt, FL2FXCONST_DBL(0.04f)); |
358 | 0 | } else { |
359 | 0 | FDKaacEnc_initElement(&cm->elInfo[3], ID_LFE, &count, &mapDescr, mapIdx, |
360 | 0 | it_cnt, FL2FXCONST_DBL(0.04f)); |
361 | 0 | FDKaacEnc_initElement(&cm->elInfo[4], ID_CPE, &count, &mapDescr, mapIdx, |
362 | 0 | it_cnt, FL2FXCONST_DBL(0.26f)); |
363 | 0 | } |
364 | 0 | break; |
365 | 0 | } |
366 | | |
367 | 0 | default: |
368 | | //*chMap=0; |
369 | 0 | return AAC_ENC_UNSUPPORTED_CHANNELCONFIG; |
370 | 0 | }; |
371 | |
|
372 | 0 | FDK_ASSERT(cm->nElements <= ((8))); |
373 | | |
374 | 0 | return AAC_ENC_OK; |
375 | 0 | } |
376 | | |
377 | | AAC_ENCODER_ERROR FDKaacEnc_InitElementBits(QC_STATE* hQC, CHANNEL_MAPPING* cm, |
378 | | INT bitrateTot, INT averageBitsTot, |
379 | 0 | INT maxChannelBits) { |
380 | 0 | int sc_brTot = CountLeadingBits(bitrateTot); |
381 | |
|
382 | 0 | switch (cm->encMode) { |
383 | 0 | case MODE_1: |
384 | 0 | hQC->elementBits[0]->chBitrateEl = bitrateTot; |
385 | |
|
386 | 0 | hQC->elementBits[0]->maxBitsEl = maxChannelBits; |
387 | |
|
388 | 0 | hQC->elementBits[0]->relativeBitsEl = cm->elInfo[0].relativeBits; |
389 | 0 | break; |
390 | | |
391 | 0 | case MODE_2: |
392 | 0 | hQC->elementBits[0]->chBitrateEl = bitrateTot >> 1; |
393 | |
|
394 | 0 | hQC->elementBits[0]->maxBitsEl = 2 * maxChannelBits; |
395 | |
|
396 | 0 | hQC->elementBits[0]->relativeBitsEl = cm->elInfo[0].relativeBits; |
397 | 0 | break; |
398 | 0 | case MODE_1_2: { |
399 | 0 | hQC->elementBits[0]->relativeBitsEl = cm->elInfo[0].relativeBits; |
400 | 0 | hQC->elementBits[1]->relativeBitsEl = cm->elInfo[1].relativeBits; |
401 | 0 | FIXP_DBL sceRate = cm->elInfo[0].relativeBits; |
402 | 0 | FIXP_DBL cpeRate = cm->elInfo[1].relativeBits; |
403 | |
|
404 | 0 | hQC->elementBits[0]->chBitrateEl = |
405 | 0 | fMult(sceRate, (FIXP_DBL)(bitrateTot << sc_brTot)) >> sc_brTot; |
406 | 0 | hQC->elementBits[1]->chBitrateEl = |
407 | 0 | fMult(cpeRate, (FIXP_DBL)(bitrateTot << sc_brTot)) >> (sc_brTot + 1); |
408 | |
|
409 | 0 | hQC->elementBits[0]->maxBitsEl = maxChannelBits; |
410 | 0 | hQC->elementBits[1]->maxBitsEl = 2 * maxChannelBits; |
411 | 0 | break; |
412 | 0 | } |
413 | 0 | case MODE_1_2_1: { |
414 | | /* sce + cpe + sce */ |
415 | 0 | hQC->elementBits[0]->relativeBitsEl = cm->elInfo[0].relativeBits; |
416 | 0 | hQC->elementBits[1]->relativeBitsEl = cm->elInfo[1].relativeBits; |
417 | 0 | hQC->elementBits[2]->relativeBitsEl = cm->elInfo[2].relativeBits; |
418 | 0 | FIXP_DBL sce1Rate = cm->elInfo[0].relativeBits; |
419 | 0 | FIXP_DBL cpeRate = cm->elInfo[1].relativeBits; |
420 | 0 | FIXP_DBL sce2Rate = cm->elInfo[2].relativeBits; |
421 | |
|
422 | 0 | hQC->elementBits[0]->chBitrateEl = |
423 | 0 | fMult(sce1Rate, (FIXP_DBL)(bitrateTot << sc_brTot)) >> sc_brTot; |
424 | 0 | hQC->elementBits[1]->chBitrateEl = |
425 | 0 | fMult(cpeRate, (FIXP_DBL)(bitrateTot << sc_brTot)) >> (sc_brTot + 1); |
426 | 0 | hQC->elementBits[2]->chBitrateEl = |
427 | 0 | fMult(sce2Rate, (FIXP_DBL)(bitrateTot << sc_brTot)) >> sc_brTot; |
428 | |
|
429 | 0 | hQC->elementBits[0]->maxBitsEl = maxChannelBits; |
430 | 0 | hQC->elementBits[1]->maxBitsEl = 2 * maxChannelBits; |
431 | 0 | hQC->elementBits[2]->maxBitsEl = maxChannelBits; |
432 | 0 | break; |
433 | 0 | } |
434 | 0 | case MODE_1_2_2: { |
435 | | /* sce + cpe + cpe */ |
436 | 0 | hQC->elementBits[0]->relativeBitsEl = cm->elInfo[0].relativeBits; |
437 | 0 | hQC->elementBits[1]->relativeBitsEl = cm->elInfo[1].relativeBits; |
438 | 0 | hQC->elementBits[2]->relativeBitsEl = cm->elInfo[2].relativeBits; |
439 | 0 | FIXP_DBL sceRate = cm->elInfo[0].relativeBits; |
440 | 0 | FIXP_DBL cpe1Rate = cm->elInfo[1].relativeBits; |
441 | 0 | FIXP_DBL cpe2Rate = cm->elInfo[2].relativeBits; |
442 | |
|
443 | 0 | hQC->elementBits[0]->chBitrateEl = |
444 | 0 | fMult(sceRate, (FIXP_DBL)(bitrateTot << sc_brTot)) >> sc_brTot; |
445 | 0 | hQC->elementBits[1]->chBitrateEl = |
446 | 0 | fMult(cpe1Rate, (FIXP_DBL)(bitrateTot << sc_brTot)) >> (sc_brTot + 1); |
447 | 0 | hQC->elementBits[2]->chBitrateEl = |
448 | 0 | fMult(cpe2Rate, (FIXP_DBL)(bitrateTot << sc_brTot)) >> (sc_brTot + 1); |
449 | |
|
450 | 0 | hQC->elementBits[0]->maxBitsEl = maxChannelBits; |
451 | 0 | hQC->elementBits[1]->maxBitsEl = 2 * maxChannelBits; |
452 | 0 | hQC->elementBits[2]->maxBitsEl = 2 * maxChannelBits; |
453 | 0 | break; |
454 | 0 | } |
455 | 0 | case MODE_1_2_2_1: { |
456 | | /* (5.1) sce + cpe + cpe + lfe */ |
457 | 0 | hQC->elementBits[0]->relativeBitsEl = cm->elInfo[0].relativeBits; |
458 | 0 | hQC->elementBits[1]->relativeBitsEl = cm->elInfo[1].relativeBits; |
459 | 0 | hQC->elementBits[2]->relativeBitsEl = cm->elInfo[2].relativeBits; |
460 | 0 | hQC->elementBits[3]->relativeBitsEl = cm->elInfo[3].relativeBits; |
461 | 0 | FIXP_DBL sceRate = cm->elInfo[0].relativeBits; |
462 | 0 | FIXP_DBL cpe1Rate = cm->elInfo[1].relativeBits; |
463 | 0 | FIXP_DBL cpe2Rate = cm->elInfo[2].relativeBits; |
464 | 0 | FIXP_DBL lfeRate = cm->elInfo[3].relativeBits; |
465 | |
|
466 | 0 | int maxBitsTot = |
467 | 0 | maxChannelBits * 5; /* LFE does not add to bit reservoir */ |
468 | 0 | int sc = CountLeadingBits(fixMax(maxChannelBits, averageBitsTot)); |
469 | 0 | int maxLfeBits = (int)fMax( |
470 | 0 | (INT)((fMult(lfeRate, (FIXP_DBL)(maxChannelBits << sc)) >> sc) << 1), |
471 | 0 | (INT)((fMult(FL2FXCONST_DBL(1.1f / 2.f), |
472 | 0 | fMult(lfeRate, (FIXP_DBL)(averageBitsTot << sc))) |
473 | 0 | << 1) >> |
474 | 0 | sc)); |
475 | |
|
476 | 0 | maxChannelBits = (maxBitsTot - maxLfeBits); |
477 | 0 | sc = CountLeadingBits(maxChannelBits); |
478 | |
|
479 | 0 | maxChannelBits = |
480 | 0 | fMult((FIXP_DBL)maxChannelBits << sc, GetInvInt(5)) >> sc; |
481 | |
|
482 | 0 | hQC->elementBits[0]->chBitrateEl = |
483 | 0 | fMult(sceRate, (FIXP_DBL)(bitrateTot << sc_brTot)) >> sc_brTot; |
484 | 0 | hQC->elementBits[1]->chBitrateEl = |
485 | 0 | fMult(cpe1Rate, (FIXP_DBL)(bitrateTot << sc_brTot)) >> (sc_brTot + 1); |
486 | 0 | hQC->elementBits[2]->chBitrateEl = |
487 | 0 | fMult(cpe2Rate, (FIXP_DBL)(bitrateTot << sc_brTot)) >> (sc_brTot + 1); |
488 | 0 | hQC->elementBits[3]->chBitrateEl = |
489 | 0 | fMult(lfeRate, (FIXP_DBL)(bitrateTot << sc_brTot)) >> sc_brTot; |
490 | |
|
491 | 0 | hQC->elementBits[0]->maxBitsEl = maxChannelBits; |
492 | 0 | hQC->elementBits[1]->maxBitsEl = 2 * maxChannelBits; |
493 | 0 | hQC->elementBits[2]->maxBitsEl = 2 * maxChannelBits; |
494 | 0 | hQC->elementBits[3]->maxBitsEl = maxLfeBits; |
495 | |
|
496 | 0 | break; |
497 | 0 | } |
498 | 0 | case MODE_6_1: { |
499 | | /* (6.1) sce + cpe + cpe + sce + lfe */ |
500 | 0 | FIXP_DBL sceRate = hQC->elementBits[0]->relativeBitsEl = |
501 | 0 | cm->elInfo[0].relativeBits; |
502 | 0 | FIXP_DBL cpe1Rate = hQC->elementBits[1]->relativeBitsEl = |
503 | 0 | cm->elInfo[1].relativeBits; |
504 | 0 | FIXP_DBL cpe2Rate = hQC->elementBits[2]->relativeBitsEl = |
505 | 0 | cm->elInfo[2].relativeBits; |
506 | 0 | FIXP_DBL sce2Rate = hQC->elementBits[3]->relativeBitsEl = |
507 | 0 | cm->elInfo[3].relativeBits; |
508 | 0 | FIXP_DBL lfeRate = hQC->elementBits[4]->relativeBitsEl = |
509 | 0 | cm->elInfo[4].relativeBits; |
510 | |
|
511 | 0 | int maxBitsTot = |
512 | 0 | maxChannelBits * 6; /* LFE does not add to bit reservoir */ |
513 | 0 | int sc = CountLeadingBits(fixMax(maxChannelBits, averageBitsTot)); |
514 | 0 | int maxLfeBits = (int)fMax( |
515 | 0 | (INT)((fMult(lfeRate, (FIXP_DBL)(maxChannelBits << sc)) >> sc) << 1), |
516 | 0 | (INT)((fMult(FL2FXCONST_DBL(1.1f / 2.f), |
517 | 0 | fMult(lfeRate, (FIXP_DBL)(averageBitsTot << sc))) |
518 | 0 | << 1) >> |
519 | 0 | sc)); |
520 | |
|
521 | 0 | maxChannelBits = (maxBitsTot - maxLfeBits) / 6; |
522 | |
|
523 | 0 | hQC->elementBits[0]->chBitrateEl = |
524 | 0 | fMult(sceRate, (FIXP_DBL)(bitrateTot << sc_brTot)) >> sc_brTot; |
525 | 0 | hQC->elementBits[1]->chBitrateEl = |
526 | 0 | fMult(cpe1Rate, (FIXP_DBL)(bitrateTot << sc_brTot)) >> (sc_brTot + 1); |
527 | 0 | hQC->elementBits[2]->chBitrateEl = |
528 | 0 | fMult(cpe2Rate, (FIXP_DBL)(bitrateTot << sc_brTot)) >> (sc_brTot + 1); |
529 | 0 | hQC->elementBits[3]->chBitrateEl = |
530 | 0 | fMult(sce2Rate, (FIXP_DBL)(bitrateTot << sc_brTot)) >> (sc_brTot + 1); |
531 | 0 | hQC->elementBits[4]->chBitrateEl = |
532 | 0 | fMult(lfeRate, (FIXP_DBL)(bitrateTot << sc_brTot)) >> sc_brTot; |
533 | |
|
534 | 0 | hQC->elementBits[0]->maxBitsEl = maxChannelBits; |
535 | 0 | hQC->elementBits[1]->maxBitsEl = 2 * maxChannelBits; |
536 | 0 | hQC->elementBits[2]->maxBitsEl = 2 * maxChannelBits; |
537 | 0 | hQC->elementBits[3]->maxBitsEl = maxChannelBits; |
538 | 0 | hQC->elementBits[4]->maxBitsEl = maxLfeBits; |
539 | 0 | break; |
540 | 0 | } |
541 | 0 | case MODE_7_1_TOP_FRONT: |
542 | 0 | case MODE_7_1_BACK: |
543 | 0 | case MODE_7_1_REAR_SURROUND: |
544 | 0 | case MODE_7_1_FRONT_CENTER: |
545 | 0 | case MODE_1_2_2_2_1: { |
546 | 0 | int cpe3Idx = (cm->encMode != MODE_7_1_TOP_FRONT) ? 3 : 4; |
547 | 0 | int lfeIdx = (cm->encMode != MODE_7_1_TOP_FRONT) ? 4 : 3; |
548 | | |
549 | | /* (7.1) sce + cpe + cpe + cpe + lfe */ |
550 | 0 | FIXP_DBL sceRate = hQC->elementBits[0]->relativeBitsEl = |
551 | 0 | cm->elInfo[0].relativeBits; |
552 | 0 | FIXP_DBL cpe1Rate = hQC->elementBits[1]->relativeBitsEl = |
553 | 0 | cm->elInfo[1].relativeBits; |
554 | 0 | FIXP_DBL cpe2Rate = hQC->elementBits[2]->relativeBitsEl = |
555 | 0 | cm->elInfo[2].relativeBits; |
556 | 0 | FIXP_DBL cpe3Rate = hQC->elementBits[cpe3Idx]->relativeBitsEl = |
557 | 0 | cm->elInfo[cpe3Idx].relativeBits; |
558 | 0 | FIXP_DBL lfeRate = hQC->elementBits[lfeIdx]->relativeBitsEl = |
559 | 0 | cm->elInfo[lfeIdx].relativeBits; |
560 | |
|
561 | 0 | int maxBitsTot = |
562 | 0 | maxChannelBits * 7; /* LFE does not add to bit reservoir */ |
563 | 0 | int sc = CountLeadingBits(fixMax(maxChannelBits, averageBitsTot)); |
564 | 0 | int maxLfeBits = (int)fMax( |
565 | 0 | (INT)((fMult(lfeRate, (FIXP_DBL)(maxChannelBits << sc)) >> sc) << 1), |
566 | 0 | (INT)((fMult(FL2FXCONST_DBL(1.1f / 2.f), |
567 | 0 | fMult(lfeRate, (FIXP_DBL)(averageBitsTot << sc))) |
568 | 0 | << 1) >> |
569 | 0 | sc)); |
570 | |
|
571 | 0 | maxChannelBits = (maxBitsTot - maxLfeBits) / 7; |
572 | |
|
573 | 0 | hQC->elementBits[0]->chBitrateEl = |
574 | 0 | fMult(sceRate, (FIXP_DBL)(bitrateTot << sc_brTot)) >> sc_brTot; |
575 | 0 | hQC->elementBits[1]->chBitrateEl = |
576 | 0 | fMult(cpe1Rate, (FIXP_DBL)(bitrateTot << sc_brTot)) >> (sc_brTot + 1); |
577 | 0 | hQC->elementBits[2]->chBitrateEl = |
578 | 0 | fMult(cpe2Rate, (FIXP_DBL)(bitrateTot << sc_brTot)) >> (sc_brTot + 1); |
579 | 0 | hQC->elementBits[cpe3Idx]->chBitrateEl = |
580 | 0 | fMult(cpe3Rate, (FIXP_DBL)(bitrateTot << sc_brTot)) >> (sc_brTot + 1); |
581 | 0 | hQC->elementBits[lfeIdx]->chBitrateEl = |
582 | 0 | fMult(lfeRate, (FIXP_DBL)(bitrateTot << sc_brTot)) >> sc_brTot; |
583 | |
|
584 | 0 | hQC->elementBits[0]->maxBitsEl = maxChannelBits; |
585 | 0 | hQC->elementBits[1]->maxBitsEl = 2 * maxChannelBits; |
586 | 0 | hQC->elementBits[2]->maxBitsEl = 2 * maxChannelBits; |
587 | 0 | hQC->elementBits[cpe3Idx]->maxBitsEl = 2 * maxChannelBits; |
588 | 0 | hQC->elementBits[lfeIdx]->maxBitsEl = maxLfeBits; |
589 | 0 | break; |
590 | 0 | } |
591 | | |
592 | 0 | default: |
593 | 0 | return AAC_ENC_UNSUPPORTED_CHANNELCONFIG; |
594 | 0 | } |
595 | | |
596 | 0 | return AAC_ENC_OK; |
597 | 0 | } |
598 | | |
599 | | /********************************************************************************/ |
600 | | /* */ |
601 | | /* function: GetMonoStereoMODE(const CHANNEL_MODE mode) */ |
602 | | /* */ |
603 | | /* description: Determines encoder setting from channel mode. */ |
604 | | /* Multichannel modes are mapped to mono or stereo modes */ |
605 | | /* returns MODE_MONO in case of mono, */ |
606 | | /* MODE_STEREO in case of stereo */ |
607 | | /* MODE_INVALID in case of error */ |
608 | | /* */ |
609 | | /* input: CHANNEL_MODE mode: Encoder mode (see qc_data.h). */ |
610 | | /* output: return: CM_STEREO_MODE monoStereoSetting */ |
611 | | /* (MODE_INVALID: error, */ |
612 | | /* MODE_MONO: mono */ |
613 | | /* MODE_STEREO: stereo). */ |
614 | | /* */ |
615 | | /* misc: No memory is allocated. */ |
616 | | /* */ |
617 | | /********************************************************************************/ |
618 | | |
619 | 0 | ELEMENT_MODE FDKaacEnc_GetMonoStereoMode(const CHANNEL_MODE mode) { |
620 | 0 | ELEMENT_MODE monoStereoSetting = EL_MODE_INVALID; |
621 | |
|
622 | 0 | switch (mode) { |
623 | 0 | case MODE_1: /* mono setups */ |
624 | 0 | monoStereoSetting = EL_MODE_MONO; |
625 | 0 | break; |
626 | | |
627 | 0 | case MODE_2: /* stereo setups */ |
628 | 0 | case MODE_1_2: |
629 | 0 | case MODE_1_2_1: |
630 | 0 | case MODE_1_2_2: |
631 | 0 | case MODE_1_2_2_1: |
632 | 0 | case MODE_6_1: |
633 | 0 | case MODE_1_2_2_2_1: |
634 | 0 | case MODE_7_1_REAR_SURROUND: |
635 | 0 | case MODE_7_1_FRONT_CENTER: |
636 | 0 | case MODE_7_1_BACK: |
637 | 0 | case MODE_7_1_TOP_FRONT: |
638 | 0 | monoStereoSetting = EL_MODE_STEREO; |
639 | 0 | break; |
640 | | |
641 | 0 | default: /* error */ |
642 | 0 | monoStereoSetting = EL_MODE_INVALID; |
643 | 0 | break; |
644 | 0 | } |
645 | | |
646 | 0 | return monoStereoSetting; |
647 | 0 | } |
648 | | |
649 | | const CHANNEL_MODE_CONFIG_TAB* FDKaacEnc_GetChannelModeConfiguration( |
650 | 0 | const CHANNEL_MODE mode) { |
651 | 0 | INT i; |
652 | 0 | const CHANNEL_MODE_CONFIG_TAB* cm_config = NULL; |
653 | | |
654 | | /* get channel mode config */ |
655 | 0 | for (i = 0; i < (INT)sizeof(channelModeConfig) / |
656 | 0 | (INT)sizeof(CHANNEL_MODE_CONFIG_TAB); |
657 | 0 | i++) { |
658 | 0 | if (channelModeConfig[i].encMode == mode) { |
659 | 0 | cm_config = &channelModeConfig[i]; |
660 | 0 | break; |
661 | 0 | } |
662 | 0 | } |
663 | 0 | return cm_config; |
664 | 0 | } |