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 /******************* MPEG transport format encoder library *********************
96
97 Author(s):
98
99 Description:
100
101 *******************************************************************************/
102
103 #include "tp_data.h"
104
105 #include "tpenc_lib.h"
106 #include "tpenc_asc.h"
107 #include "FDK_bitstream.h"
108 #include "genericStds.h"
109
110 #include "FDK_crc.h"
111
112 #define PCE_HEIGHT_EXT_SYNC (0xAC)
113 #define HEIGHT_NORMAL 0
114 #define HEIGHT_TOP 1
115 #define HEIGHT_BOTTOM 2
116 #define MAX_FRONT_ELEMENTS 8
117 #define MAX_SIDE_ELEMENTS 3
118 #define MAX_BACK_ELEMENTS 4
119
120 /**
121 * Describe additional PCE height information for front, side and back channel
122 * elements.
123 */
124 typedef struct {
125 UCHAR
126 num_front_height_channel_elements[2]; /*!< Number of front channel
127 elements in top [0] and bottom
128 [1] plane. */
129 UCHAR num_side_height_channel_elements[2]; /*!< Number of side channel
130 elements in top [0] and bottom
131 [1] plane. */
132 UCHAR num_back_height_channel_elements[2]; /*!< Number of back channel
133 elements in top [0] and bottom
134 [1] plane. */
135 } PCE_HEIGHT_NUM;
136
137 /**
138 * Describe a PCE based on placed channel elements and element type sequence.
139 */
140 typedef struct {
141 UCHAR num_front_channel_elements; /*!< Number of front channel elements. */
142 UCHAR num_side_channel_elements; /*!< Number of side channel elements. */
143 UCHAR num_back_channel_elements; /*!< Number of back channel elements. */
144 UCHAR num_lfe_channel_elements; /*!< Number of lfe channel elements. */
145 const MP4_ELEMENT_ID
146 *pEl_type; /*!< List contains sequence describing the elements
147 in present channel mode. (MPEG order) */
148 const PCE_HEIGHT_NUM *pHeight_num;
149 } PCE_CONFIGURATION;
150
151 /**
152 * Map an incoming channel mode to a existing PCE configuration entry.
153 */
154 typedef struct {
155 CHANNEL_MODE channel_mode; /*!< Present channel mode. */
156 PCE_CONFIGURATION
157 pce_configuration; /*!< Program config element description. */
158
159 } CHANNEL_CONFIGURATION;
160
161 /**
162 * The following arrays provide the IDs of the consecutive elements for each
163 * mode.
164 */
165 static const MP4_ELEMENT_ID elType_1[] = {ID_SCE};
166 static const MP4_ELEMENT_ID elType_2[] = {ID_CPE};
167 static const MP4_ELEMENT_ID elType_1_2[] = {ID_SCE, ID_CPE};
168 static const MP4_ELEMENT_ID elType_1_2_1[] = {ID_SCE, ID_CPE, ID_SCE};
169 static const MP4_ELEMENT_ID elType_1_2_2[] = {ID_SCE, ID_CPE, ID_CPE};
170 static const MP4_ELEMENT_ID elType_1_2_2_1[] = {ID_SCE, ID_CPE, ID_CPE, ID_LFE};
171 static const MP4_ELEMENT_ID elType_1_2_2_2_1[] = {ID_SCE, ID_CPE, ID_CPE,
172 ID_CPE, ID_LFE};
173 static const MP4_ELEMENT_ID elType_6_1[] = {ID_SCE, ID_CPE, ID_CPE, ID_SCE,
174 ID_LFE};
175 static const MP4_ELEMENT_ID elType_7_1_back[] = {ID_SCE, ID_CPE, ID_CPE, ID_CPE,
176 ID_LFE};
177 static const MP4_ELEMENT_ID elType_7_1_top_front[] = {ID_SCE, ID_CPE, ID_CPE,
178 ID_LFE, ID_CPE};
179 static const MP4_ELEMENT_ID elType_7_1_rear_surround[] = {
180 ID_SCE, ID_CPE, ID_CPE, ID_CPE, ID_LFE};
181 static const MP4_ELEMENT_ID elType_7_1_front_center[] = {ID_SCE, ID_CPE, ID_CPE,
182 ID_CPE, ID_LFE};
183
184 /**
185 * The following arrays provide information on how many front, side and back
186 * elements are assigned to the top or bottom plane for each mode that comprises
187 * height information.
188 */
189 static const PCE_HEIGHT_NUM heightNum_7_1_top_front = {{1, 0}, {0, 0}, {0, 0}};
190
191 /**
192 * \brief Table contains all supported channel modes and according PCE
193 configuration description.
194 *
195 * The mode identifier is followed by the number of front, side, back, and LFE
196 elements.
197 * These are followed by a pointer to the IDs of the consecutive elements
198 (ID_SCE, ID_CPE, ID_LFE).
199 *
200 * For some modes (MODE_7_1_TOP_FRONT and MODE_22_2) additional height
201 information is transmitted.
202 * In this case the additional pointer provides information on how many front,
203 side and back elements
204 * are assigned to the top or bottom plane.The elements are arranged in the
205 following order: normal height (front, side, back, LFE), top height (front,
206 side, back), bottom height (front, side, back).
207 *
208 *
209 * E.g. MODE_7_1_TOP_FRONT means:
210 * - 3 elements are front channel elements.
211 * - 0 elements are side channel elements.
212 * - 1 element is back channel element.
213 * - 1 element is an LFE channel element.
214 * - the element order is ID_SCE, ID_CPE, ID_CPE,
215 ID_LFE, ID_CPE.
216 * - 1 of the front elements is in the top plane.
217 *
218 * This leads to the following mapping for the cconsecutive elements in the
219 MODE_7_1_TOP_FRONT bitstream:
220 * - ID_SCE -> normal height front,
221 - ID_CPE -> normal height front,
222 - ID_CPE -> normal height back,
223 - ID_LFE -> normal height LFE,
224 - ID_CPE -> top height front.
225 */
226 static const CHANNEL_CONFIGURATION pceConfigTab[] = {
227 {MODE_1,
228 {1, 0, 0, 0, elType_1,
229 NULL}}, /* don't transmit height information in this mode */
230 {MODE_2,
231 {1, 0, 0, 0, elType_2,
232 NULL}}, /* don't transmit height information in this mode */
233 {MODE_1_2,
234 {2, 0, 0, 0, elType_1_2,
235 NULL}}, /* don't transmit height information in this mode */
236 {MODE_1_2_1,
237 {2, 0, 1, 0, elType_1_2_1,
238 NULL}}, /* don't transmit height information in this mode */
239 {MODE_1_2_2,
240 {2, 0, 1, 0, elType_1_2_2,
241 NULL}}, /* don't transmit height information in this mode */
242 {MODE_1_2_2_1,
243 {2, 0, 1, 1, elType_1_2_2_1,
244 NULL}}, /* don't transmit height information in this mode */
245 {MODE_1_2_2_2_1,
246 {3, 0, 1, 1, elType_1_2_2_2_1,
247 NULL}}, /* don't transmit height information in this mode */
248
249 {MODE_6_1,
250 {2, 0, 2, 1, elType_6_1,
251 NULL}}, /* don't transmit height information in this mode */
252 {MODE_7_1_BACK,
253 {2, 0, 2, 1, elType_7_1_back,
254 NULL}}, /* don't transmit height information in this mode */
255 {MODE_7_1_TOP_FRONT,
256 {3, 0, 1, 1, elType_7_1_top_front, &heightNum_7_1_top_front}},
257
258 {MODE_7_1_REAR_SURROUND,
259 {2, 0, 2, 1, elType_7_1_rear_surround,
260 NULL}}, /* don't transmit height information in this mode */
261 {MODE_7_1_FRONT_CENTER,
262 {3, 0, 1, 1, elType_7_1_front_center,
263 NULL}} /* don't transmit height information in this mode */
264 };
265
266 /**
267 * \brief Get program config element description for existing channel mode.
268 *
269 * \param channel_mode Current channel mode.
270 *
271 * \return
272 * - Pointer to PCE_CONFIGURATION entry, on success.
273 * - NULL, on failure.
274 */
getPceEntry(const CHANNEL_MODE channel_mode)275 static const PCE_CONFIGURATION *getPceEntry(const CHANNEL_MODE channel_mode) {
276 UINT i;
277 const PCE_CONFIGURATION *pce_config = NULL;
278
279 for (i = 0; i < (sizeof(pceConfigTab) / sizeof(CHANNEL_CONFIGURATION)); i++) {
280 if (pceConfigTab[i].channel_mode == channel_mode) {
281 pce_config = &pceConfigTab[i].pce_configuration;
282 break;
283 }
284 }
285
286 return pce_config;
287 }
288
getChannelConfig(const CHANNEL_MODE channel_mode,const UCHAR channel_config_zero)289 int getChannelConfig(const CHANNEL_MODE channel_mode,
290 const UCHAR channel_config_zero) {
291 INT chan_config = 0;
292
293 if (channel_config_zero != 0) {
294 chan_config = 0;
295 } else {
296 switch (channel_mode) {
297 case MODE_1:
298 chan_config = 1;
299 break;
300 case MODE_2:
301 chan_config = 2;
302 break;
303 case MODE_1_2:
304 chan_config = 3;
305 break;
306 case MODE_1_2_1:
307 chan_config = 4;
308 break;
309 case MODE_1_2_2:
310 chan_config = 5;
311 break;
312 case MODE_1_2_2_1:
313 chan_config = 6;
314 break;
315 case MODE_1_2_2_2_1:
316 chan_config = 7;
317 break;
318 case MODE_6_1:
319 chan_config = 11;
320 break;
321 case MODE_7_1_BACK:
322 chan_config = 12;
323 break;
324 case MODE_7_1_TOP_FRONT:
325 chan_config = 14;
326 break;
327 default:
328 chan_config = 0;
329 }
330 }
331
332 return chan_config;
333 }
334
transportEnc_GetChannelMode(int noChannels)335 CHANNEL_MODE transportEnc_GetChannelMode(int noChannels) {
336 CHANNEL_MODE chMode;
337
338 if (noChannels <= 8 && noChannels > 0)
339 chMode = (CHANNEL_MODE)(
340 (noChannels == 8) ? 7
341 : noChannels); /* see : iso/mpeg4 v1 audio subpart1*/
342 else
343 chMode = MODE_UNKNOWN;
344
345 return chMode;
346 }
347
transportEnc_writePCE(HANDLE_FDK_BITSTREAM hBs,CHANNEL_MODE channelMode,INT sampleRate,int instanceTagPCE,int profile,int matrixMixdownA,int pseudoSurroundEnable,UINT alignAnchor)348 int transportEnc_writePCE(HANDLE_FDK_BITSTREAM hBs, CHANNEL_MODE channelMode,
349 INT sampleRate, int instanceTagPCE, int profile,
350 int matrixMixdownA, int pseudoSurroundEnable,
351 UINT alignAnchor) {
352 int sampleRateIndex, i;
353 const PCE_CONFIGURATION *config = NULL;
354 const MP4_ELEMENT_ID *pEl_list = NULL;
355 UCHAR cpeCnt = 0, sceCnt = 0, lfeCnt = 0, frntCnt = 0, sdCnt = 0, bckCnt = 0,
356 isCpe = 0, tag = 0, normalFrontEnd = 0, normalSideEnd = 0,
357 normalBackEnd = 0, topFrontEnd = 0, topSideEnd = 0, topBackEnd = 0,
358 bottomFrontEnd = 0, bottomSideEnd = 0;
359 #ifdef FDK_ASSERT_ENABLE
360 UCHAR bottomBackEnd = 0;
361 #endif
362 enum elementDepth { FRONT, SIDE, BACK } elDepth;
363
364 sampleRateIndex = getSamplingRateIndex(sampleRate, 4);
365 if (sampleRateIndex == 15) {
366 return -1;
367 }
368
369 if ((config = getPceEntry(channelMode)) == NULL) {
370 return -1;
371 }
372
373 FDK_ASSERT(config->num_front_channel_elements <= MAX_FRONT_ELEMENTS);
374 FDK_ASSERT(config->num_side_channel_elements <= MAX_SIDE_ELEMENTS);
375 FDK_ASSERT(config->num_back_channel_elements <= MAX_BACK_ELEMENTS);
376
377 UCHAR frontIsCpe[MAX_FRONT_ELEMENTS] = {0},
378 frontTag[MAX_FRONT_ELEMENTS] = {0}, sideIsCpe[MAX_SIDE_ELEMENTS] = {0},
379 sideTag[MAX_SIDE_ELEMENTS] = {0}, backIsCpe[MAX_BACK_ELEMENTS] = {0},
380 backTag[MAX_BACK_ELEMENTS] = {0};
381
382 /* Write general information */
383
384 FDKwriteBits(hBs, instanceTagPCE, 4); /* Element instance tag */
385 FDKwriteBits(hBs, profile, 2); /* Object type */
386 FDKwriteBits(hBs, sampleRateIndex, 4); /* Sample rate index*/
387
388 FDKwriteBits(hBs, config->num_front_channel_elements,
389 4); /* Front channel Elements */
390 FDKwriteBits(hBs, config->num_side_channel_elements,
391 4); /* No Side Channel Elements */
392 FDKwriteBits(hBs, config->num_back_channel_elements,
393 4); /* No Back channel Elements */
394 FDKwriteBits(hBs, config->num_lfe_channel_elements,
395 2); /* No Lfe channel elements */
396
397 FDKwriteBits(hBs, 0, 3); /* No assoc data elements */
398 FDKwriteBits(hBs, 0, 4); /* No valid cc elements */
399 FDKwriteBits(hBs, 0, 1); /* Mono mixdown present */
400 FDKwriteBits(hBs, 0, 1); /* Stereo mixdown present */
401
402 if (matrixMixdownA != 0 &&
403 ((channelMode == MODE_1_2_2) || (channelMode == MODE_1_2_2_1))) {
404 FDKwriteBits(hBs, 1, 1); /* Matrix mixdown present */
405 FDKwriteBits(hBs, (matrixMixdownA - 1) & 0x3, 2); /* matrix_mixdown_idx */
406 FDKwriteBits(hBs, (pseudoSurroundEnable) ? 1 : 0,
407 1); /* pseudo_surround_enable */
408 } else {
409 FDKwriteBits(hBs, 0, 1); /* Matrix mixdown not present */
410 }
411
412 if (config->pHeight_num != NULL) {
413 /* we have up to three different height levels, and in each height level we
414 * may have front, side and back channels. We need to know where each
415 * section ends to correctly count the tags */
416 normalFrontEnd = config->num_front_channel_elements -
417 config->pHeight_num->num_front_height_channel_elements[0] -
418 config->pHeight_num->num_front_height_channel_elements[1];
419 normalSideEnd = normalFrontEnd + config->num_side_channel_elements -
420 config->pHeight_num->num_side_height_channel_elements[0] -
421 config->pHeight_num->num_side_height_channel_elements[1];
422 normalBackEnd = normalSideEnd + config->num_back_channel_elements -
423 config->pHeight_num->num_back_height_channel_elements[0] -
424 config->pHeight_num->num_back_height_channel_elements[1];
425
426 topFrontEnd =
427 normalBackEnd + config->num_lfe_channel_elements +
428 config->pHeight_num->num_front_height_channel_elements[0]; /* only
429 normal
430 height
431 LFEs
432 assumed */
433 topSideEnd =
434 topFrontEnd + config->pHeight_num->num_side_height_channel_elements[0];
435 topBackEnd =
436 topSideEnd + config->pHeight_num->num_back_height_channel_elements[0];
437
438 bottomFrontEnd =
439 topBackEnd + config->pHeight_num->num_front_height_channel_elements[1];
440 bottomSideEnd = bottomFrontEnd +
441 config->pHeight_num->num_side_height_channel_elements[1];
442 #ifdef FDK_ASSERT_ENABLE
443 bottomBackEnd = bottomSideEnd +
444 config->pHeight_num->num_back_height_channel_elements[1];
445 #endif
446
447 } else {
448 /* we have only one height level, so we don't care about top or bottom */
449 normalFrontEnd = config->num_front_channel_elements;
450 normalSideEnd = normalFrontEnd + config->num_side_channel_elements;
451 normalBackEnd = normalSideEnd + config->num_back_channel_elements;
452 }
453
454 /* assign cpe and tag information to either front, side or back channels */
455
456 pEl_list = config->pEl_type;
457
458 for (i = 0; i < config->num_front_channel_elements +
459 config->num_side_channel_elements +
460 config->num_back_channel_elements +
461 config->num_lfe_channel_elements;
462 i++) {
463 if (*pEl_list == ID_LFE) {
464 pEl_list++;
465 continue;
466 }
467 isCpe = (*pEl_list++ == ID_CPE) ? 1 : 0;
468 tag = (isCpe) ? cpeCnt++ : sceCnt++;
469
470 if (i < normalFrontEnd)
471 elDepth = FRONT;
472 else if (i < normalSideEnd)
473 elDepth = SIDE;
474 else if (i < normalBackEnd)
475 elDepth = BACK;
476 else if (i < topFrontEnd)
477 elDepth = FRONT;
478 else if (i < topSideEnd)
479 elDepth = SIDE;
480 else if (i < topBackEnd)
481 elDepth = BACK;
482 else if (i < bottomFrontEnd)
483 elDepth = FRONT;
484 else if (i < bottomSideEnd)
485 elDepth = SIDE;
486 else {
487 elDepth = BACK;
488 FDK_ASSERT(i < bottomBackEnd); /* won't fail if implementation of pce
489 configuration table is correct */
490 }
491
492 switch (elDepth) {
493 case FRONT:
494 FDK_ASSERT(frntCnt < config->num_front_channel_elements);
495 frontIsCpe[frntCnt] = isCpe;
496 frontTag[frntCnt++] = tag;
497 break;
498 case SIDE:
499 FDK_ASSERT(sdCnt < config->num_side_channel_elements);
500 sideIsCpe[sdCnt] = isCpe;
501 sideTag[sdCnt++] = tag;
502 break;
503 case BACK:
504 FDK_ASSERT(bckCnt < config->num_back_channel_elements);
505 backIsCpe[bckCnt] = isCpe;
506 backTag[bckCnt++] = tag;
507 break;
508 }
509 }
510
511 /* Write front channel isCpe and tags */
512 for (i = 0; i < config->num_front_channel_elements; i++) {
513 FDKwriteBits(hBs, frontIsCpe[i], 1);
514 FDKwriteBits(hBs, frontTag[i], 4);
515 }
516 /* Write side channel isCpe and tags */
517 for (i = 0; i < config->num_side_channel_elements; i++) {
518 FDKwriteBits(hBs, sideIsCpe[i], 1);
519 FDKwriteBits(hBs, sideTag[i], 4);
520 }
521 /* Write back channel isCpe and tags */
522 for (i = 0; i < config->num_back_channel_elements; i++) {
523 FDKwriteBits(hBs, backIsCpe[i], 1);
524 FDKwriteBits(hBs, backTag[i], 4);
525 }
526 /* Write LFE information */
527 for (i = 0; i < config->num_lfe_channel_elements; i++) {
528 FDKwriteBits(hBs, lfeCnt++, 4); /* LFE channel Instance Tag. */
529 }
530
531 /* - num_valid_cc_elements always 0.
532 - num_assoc_data_elements always 0. */
533
534 /* Byte alignment: relative to alignAnchor
535 ADTS: align with respect to the first bit of the raw_data_block()
536 ADIF: align with respect to the first bit of the header
537 LATM: align with respect to the first bit of the ASC */
538 FDKbyteAlign(hBs, alignAnchor); /* Alignment */
539
540 /* Write comment information */
541
542 if (config->pHeight_num != NULL) {
543 /* embed height information in comment field */
544
545 INT commentBytes =
546 1 /* PCE_HEIGHT_EXT_SYNC */
547 + ((((config->num_front_channel_elements +
548 config->num_side_channel_elements +
549 config->num_back_channel_elements)
550 << 1) +
551 7) >>
552 3) /* 2 bit height info per element, round up to full bytes */
553 + 1; /* CRC */
554
555 FDKwriteBits(hBs, commentBytes, 8); /* comment size. */
556
557 FDK_CRCINFO crcInfo; /* CRC state info */
558 INT crcReg;
559
560 FDKcrcInit(&crcInfo, 0x07, 0xFF, 8);
561 crcReg = FDKcrcStartReg(&crcInfo, hBs, 0);
562
563 FDKwriteBits(hBs, PCE_HEIGHT_EXT_SYNC, 8); /* indicate height extension */
564
565 /* front channel height information */
566 for (i = 0;
567 i < config->num_front_channel_elements -
568 config->pHeight_num->num_front_height_channel_elements[0] -
569 config->pHeight_num->num_front_height_channel_elements[1];
570 i++)
571 FDKwriteBits(hBs, HEIGHT_NORMAL, 2);
572 for (i = 0; i < config->pHeight_num->num_front_height_channel_elements[0];
573 i++)
574 FDKwriteBits(hBs, HEIGHT_TOP, 2);
575 for (i = 0; i < config->pHeight_num->num_front_height_channel_elements[1];
576 i++)
577 FDKwriteBits(hBs, HEIGHT_BOTTOM, 2);
578
579 /* side channel height information */
580 for (i = 0;
581 i < config->num_side_channel_elements -
582 config->pHeight_num->num_side_height_channel_elements[0] -
583 config->pHeight_num->num_side_height_channel_elements[1];
584 i++)
585 FDKwriteBits(hBs, HEIGHT_NORMAL, 2);
586 for (i = 0; i < config->pHeight_num->num_side_height_channel_elements[0];
587 i++)
588 FDKwriteBits(hBs, HEIGHT_TOP, 2);
589 for (i = 0; i < config->pHeight_num->num_side_height_channel_elements[1];
590 i++)
591 FDKwriteBits(hBs, HEIGHT_BOTTOM, 2);
592
593 /* back channel height information */
594 for (i = 0;
595 i < config->num_back_channel_elements -
596 config->pHeight_num->num_back_height_channel_elements[0] -
597 config->pHeight_num->num_back_height_channel_elements[1];
598 i++)
599 FDKwriteBits(hBs, HEIGHT_NORMAL, 2);
600 for (i = 0; i < config->pHeight_num->num_back_height_channel_elements[0];
601 i++)
602 FDKwriteBits(hBs, HEIGHT_TOP, 2);
603 for (i = 0; i < config->pHeight_num->num_back_height_channel_elements[1];
604 i++)
605 FDKwriteBits(hBs, HEIGHT_BOTTOM, 2);
606
607 FDKbyteAlign(hBs, alignAnchor); /* Alignment */
608
609 FDKcrcEndReg(&crcInfo, hBs, crcReg);
610 FDKwriteBits(hBs, FDKcrcGetCRC(&crcInfo), 8);
611
612 } else {
613 FDKwriteBits(hBs, 0,
614 8); /* Do no write any comment or height information. */
615 }
616
617 return 0;
618 }
619
transportEnc_GetPCEBits(CHANNEL_MODE channelMode,int matrixMixdownA,int bits)620 int transportEnc_GetPCEBits(CHANNEL_MODE channelMode, int matrixMixdownA,
621 int bits) {
622 const PCE_CONFIGURATION *config = NULL;
623
624 if ((config = getPceEntry(channelMode)) == NULL) {
625 return -1; /* unsupported channelmapping */
626 }
627
628 bits +=
629 4 + 2 + 4; /* Element instance tag + Object type + Sample rate index */
630 bits += 4 + 4 + 4 + 2; /* No (front + side + back + lfe channel) elements */
631 bits += 3 + 4; /* No (assoc data + valid cc) elements */
632 bits += 1 + 1 + 1; /* Mono + Stereo + Matrix mixdown present */
633
634 if (matrixMixdownA != 0 &&
635 ((channelMode == MODE_1_2_2) || (channelMode == MODE_1_2_2_1))) {
636 bits += 3; /* matrix_mixdown_idx + pseudo_surround_enable */
637 }
638
639 bits += (1 + 4) * (INT)config->num_front_channel_elements;
640 bits += (1 + 4) * (INT)config->num_side_channel_elements;
641 bits += (1 + 4) * (INT)config->num_back_channel_elements;
642 bits += (4) * (INT)config->num_lfe_channel_elements;
643
644 /* - num_valid_cc_elements always 0.
645 - num_assoc_data_elements always 0. */
646
647 if ((bits % 8) != 0) {
648 bits += (8 - (bits % 8)); /* Alignment */
649 }
650
651 bits += 8; /* Comment field bytes */
652
653 if (config->pHeight_num != NULL) {
654 /* Comment field (height extension) */
655
656 bits +=
657 8 /* PCE_HEIGHT_EXT_SYNC */
658 +
659 ((config->num_front_channel_elements +
660 config->num_side_channel_elements + config->num_back_channel_elements)
661 << 1) /* 2 bit height info per element */
662 + 8; /* CRC */
663
664 if ((bits % 8) != 0) {
665 bits += (8 - (bits % 8)); /* Alignment */
666 }
667 }
668
669 return bits;
670 }
671
writeAot(HANDLE_FDK_BITSTREAM hBitstreamBuffer,AUDIO_OBJECT_TYPE aot)672 static void writeAot(HANDLE_FDK_BITSTREAM hBitstreamBuffer,
673 AUDIO_OBJECT_TYPE aot) {
674 int tmp = (int)aot;
675
676 if (tmp > 31) {
677 FDKwriteBits(hBitstreamBuffer, AOT_ESCAPE, 5);
678 FDKwriteBits(hBitstreamBuffer, tmp - 32, 6); /* AudioObjectType */
679 } else {
680 FDKwriteBits(hBitstreamBuffer, tmp, 5);
681 }
682 }
683
writeSampleRate(HANDLE_FDK_BITSTREAM hBs,int sampleRate,int nBits)684 static void writeSampleRate(HANDLE_FDK_BITSTREAM hBs, int sampleRate,
685 int nBits) {
686 int srIdx = getSamplingRateIndex(sampleRate, nBits);
687
688 FDKwriteBits(hBs, srIdx, nBits);
689 if (srIdx == (1 << nBits) - 1) {
690 FDKwriteBits(hBs, sampleRate, 24);
691 }
692 }
693
transportEnc_writeGASpecificConfig(HANDLE_FDK_BITSTREAM asc,CODER_CONFIG * config,int extFlg,UINT alignAnchor)694 static int transportEnc_writeGASpecificConfig(HANDLE_FDK_BITSTREAM asc,
695 CODER_CONFIG *config, int extFlg,
696 UINT alignAnchor) {
697 int aot = config->aot;
698 int samplesPerFrame = config->samplesPerFrame;
699
700 /* start of GASpecificConfig according to ISO/IEC 14496-3 Subpart 4, 4.4.1 */
701 FDKwriteBits(asc,
702 ((samplesPerFrame == 960 || samplesPerFrame == 480) ? 1 : 0),
703 1); /* frameLengthFlag: 1 for a 960/480 (I)MDCT, 0 for a 1024/512
704 (I)MDCT*/
705 FDKwriteBits(asc, 0,
706 1); /* dependsOnCoreCoder: Sampling Rate Coder Specific, see in
707 ISO/IEC 14496-3 Subpart 4, 4.4.1 */
708 FDKwriteBits(asc, extFlg,
709 1); /* Extension Flag: Shall be 1 for aot = 17,19,20,21,22,23 */
710
711 /* Write PCE if channel config is not 1-7 */
712 if (getChannelConfig(config->channelMode, config->channelConfigZero) == 0) {
713 transportEnc_writePCE(asc, config->channelMode, config->samplingRate, 0, 1,
714 config->matrixMixdownA,
715 (config->flags & CC_PSEUDO_SURROUND) ? 1 : 0,
716 alignAnchor);
717 }
718 if ((aot == AOT_AAC_SCAL) || (aot == AOT_ER_AAC_SCAL)) {
719 FDKwriteBits(asc, 0, 3); /* layerNr */
720 }
721 if (extFlg) {
722 if (aot == AOT_ER_BSAC) {
723 FDKwriteBits(asc, config->BSACnumOfSubFrame, 5); /* numOfSubFrame */
724 FDKwriteBits(asc, config->BSAClayerLength, 11); /* layer_length */
725 }
726 if ((aot == AOT_ER_AAC_LC) || (aot == AOT_ER_AAC_LTP) ||
727 (aot == AOT_ER_AAC_SCAL) || (aot == AOT_ER_AAC_LD)) {
728 FDKwriteBits(asc, (config->flags & CC_VCB11) ? 1 : 0,
729 1); /* aacSectionDataResillienceFlag */
730 FDKwriteBits(asc, (config->flags & CC_RVLC) ? 1 : 0,
731 1); /* aacScaleFactorDataResillienceFlag */
732 FDKwriteBits(asc, (config->flags & CC_HCR) ? 1 : 0,
733 1); /* aacSpectralDataResillienceFlag */
734 }
735 FDKwriteBits(asc, 0, 1); /* extensionFlag3: reserved. Shall be '0' */
736 }
737 return 0;
738 }
739
transportEnc_writeELDSpecificConfig(HANDLE_FDK_BITSTREAM hBs,CODER_CONFIG * config,int epConfig,CSTpCallBacks * cb)740 static int transportEnc_writeELDSpecificConfig(HANDLE_FDK_BITSTREAM hBs,
741 CODER_CONFIG *config,
742 int epConfig,
743 CSTpCallBacks *cb) {
744 UINT frameLengthFlag = 0;
745 switch (config->samplesPerFrame) {
746 case 512:
747 case 256:
748 case 128:
749 case 64:
750 frameLengthFlag = 0;
751 break;
752 case 480:
753 case 240:
754 case 160:
755 case 120:
756 case 60:
757 frameLengthFlag = 1;
758 break;
759 }
760
761 FDKwriteBits(hBs, frameLengthFlag, 1);
762
763 FDKwriteBits(hBs, (config->flags & CC_VCB11) ? 1 : 0, 1);
764 FDKwriteBits(hBs, (config->flags & CC_RVLC) ? 1 : 0, 1);
765 FDKwriteBits(hBs, (config->flags & CC_HCR) ? 1 : 0, 1);
766
767 FDKwriteBits(hBs, (config->flags & CC_SBR) ? 1 : 0, 1); /* SBR header flag */
768 if ((config->flags & CC_SBR)) {
769 FDKwriteBits(hBs, (config->samplingRate == config->extSamplingRate) ? 0 : 1,
770 1); /* Samplerate Flag */
771 FDKwriteBits(hBs, (config->flags & CC_SBRCRC) ? 1 : 0, 1); /* SBR CRC flag*/
772
773 if (cb->cbSbr != NULL) {
774 const PCE_CONFIGURATION *pPce;
775 int e, sbrElementIndex = 0;
776
777 pPce = getPceEntry(config->channelMode);
778
779 for (e = 0; e < pPce->num_front_channel_elements +
780 pPce->num_side_channel_elements +
781 pPce->num_back_channel_elements +
782 pPce->num_lfe_channel_elements;
783 e++) {
784 if ((pPce->pEl_type[e] == ID_SCE) || (pPce->pEl_type[e] == ID_CPE)) {
785 cb->cbSbr(cb->cbSbrData, hBs, 0, 0, 0, config->aot, pPce->pEl_type[e],
786 sbrElementIndex, 0, 0, 0, NULL, 1);
787 sbrElementIndex++;
788 }
789 }
790 }
791 }
792
793 if ((config->flags & CC_SAC) && (cb->cbSsc != NULL)) {
794 FDKwriteBits(hBs, ELDEXT_LDSAC, 4);
795
796 const INT eldExtLen =
797 (cb->cbSsc(cb->cbSscData, NULL, config->aot, config->extSamplingRate, 0,
798 0, 0, 0, NULL) +
799 7) >>
800 3;
801 INT cnt = eldExtLen;
802
803 if (cnt < 0xF) {
804 FDKwriteBits(hBs, cnt, 4);
805 } else {
806 FDKwriteBits(hBs, 0xF, 4);
807 cnt -= 0xF;
808
809 if (cnt < 0xFF) {
810 FDKwriteBits(hBs, cnt, 8);
811 } else {
812 FDKwriteBits(hBs, 0xFF, 8);
813 cnt -= 0xFF;
814
815 FDK_ASSERT(cnt <= 0xFFFF);
816 FDKwriteBits(hBs, cnt, 16);
817 }
818 }
819
820 cb->cbSsc(cb->cbSscData, hBs, config->aot, config->extSamplingRate, 0, 0, 0,
821 0, NULL);
822 }
823
824 if (config->downscaleSamplingRate != 0 &&
825 config->downscaleSamplingRate != config->extSamplingRate) {
826 /* downscale active */
827
828 /* eldExtLenDsc: Number of bytes for the ELD downscale extension (srIdx
829 needs 1 byte
830 + downscaleSamplingRate needs additional 3 bytes) */
831 int eldExtLenDsc = 1;
832 int downscaleSamplingRate = config->downscaleSamplingRate;
833 FDKwriteBits(hBs, ELDEXT_DOWNSCALEINFO, 4); /* ELDEXT_DOWNSCALEINFO */
834
835 if ((downscaleSamplingRate != 96000) && (downscaleSamplingRate != 88200) &&
836 (downscaleSamplingRate != 64000) && (downscaleSamplingRate != 48000) &&
837 (downscaleSamplingRate != 44100) && (downscaleSamplingRate != 32000) &&
838 (downscaleSamplingRate != 24000) && (downscaleSamplingRate != 22050) &&
839 (downscaleSamplingRate != 16000) && (downscaleSamplingRate != 12000) &&
840 (downscaleSamplingRate != 11025) && (downscaleSamplingRate != 8000) &&
841 (downscaleSamplingRate != 7350)) {
842 eldExtLenDsc = 4; /* length extends to 4 if downscaleSamplingRate's value
843 is not one of the listed values */
844 }
845
846 FDKwriteBits(hBs, eldExtLenDsc, 4);
847 writeSampleRate(hBs, downscaleSamplingRate, 4);
848 FDKwriteBits(hBs, 0x0, 4); /* fill_nibble */
849 }
850
851 FDKwriteBits(hBs, ELDEXT_TERM, 4); /* ELDEXT_TERM */
852
853 return 0;
854 }
855
transportEnc_writeUsacSpecificConfig(HANDLE_FDK_BITSTREAM hBs,int extFlag,CODER_CONFIG * cc,CSTpCallBacks * cb)856 static int transportEnc_writeUsacSpecificConfig(HANDLE_FDK_BITSTREAM hBs,
857 int extFlag, CODER_CONFIG *cc,
858 CSTpCallBacks *cb) {
859 FDK_BITSTREAM usacConf;
860 int usacConfigBits = cc->rawConfigBits;
861
862 if ((usacConfigBits <= 0) ||
863 ((usacConfigBits + 7) / 8 > (int)sizeof(cc->rawConfig))) {
864 return TRANSPORTENC_UNSUPPORTED_FORMAT;
865 }
866 FDKinitBitStream(&usacConf, cc->rawConfig, BUFSIZE_DUMMY_VALUE,
867 usacConfigBits, BS_READER);
868
869 for (; usacConfigBits > 0; usacConfigBits--) {
870 UINT tmp = FDKreadBit(&usacConf);
871 FDKwriteBits(hBs, tmp, 1);
872 }
873 FDKsyncCache(hBs);
874
875 return TRANSPORTENC_OK;
876 }
877
transportEnc_writeASC(HANDLE_FDK_BITSTREAM asc,CODER_CONFIG * config,CSTpCallBacks * cb)878 int transportEnc_writeASC(HANDLE_FDK_BITSTREAM asc, CODER_CONFIG *config,
879 CSTpCallBacks *cb) {
880 UINT extFlag = 0;
881 int err;
882 int epConfig = 0;
883
884 /* Required for the PCE. */
885 UINT alignAnchor = FDKgetValidBits(asc);
886
887 /* Extension Flag: Shall be 1 for aot = 17,19,20,21,22,23,39 */
888 switch (config->aot) {
889 case AOT_ER_AAC_LC:
890 case AOT_ER_AAC_LTP:
891 case AOT_ER_AAC_SCAL:
892 case AOT_ER_TWIN_VQ:
893 case AOT_ER_BSAC:
894 case AOT_ER_AAC_LD:
895 case AOT_ER_AAC_ELD:
896 case AOT_USAC:
897 extFlag = 1;
898 break;
899 default:
900 break;
901 }
902
903 if (config->sbrSignaling == SIG_EXPLICIT_HIERARCHICAL && config->sbrPresent)
904 writeAot(asc, config->extAOT);
905 else
906 writeAot(asc, config->aot);
907
908 /* In case of USAC it is the output not the core sampling rate */
909 writeSampleRate(asc, config->samplingRate, 4);
910
911 /* Try to guess a reasonable channel mode if not given */
912 if (config->channelMode == MODE_INVALID) {
913 config->channelMode = transportEnc_GetChannelMode(config->noChannels);
914 if (config->channelMode == MODE_INVALID) return -1;
915 }
916
917 FDKwriteBits(
918 asc, getChannelConfig(config->channelMode, config->channelConfigZero), 4);
919
920 if (config->sbrSignaling == SIG_EXPLICIT_HIERARCHICAL && config->sbrPresent) {
921 writeSampleRate(asc, config->extSamplingRate, 4);
922 writeAot(asc, config->aot);
923 }
924
925 switch (config->aot) {
926 case AOT_AAC_MAIN:
927 case AOT_AAC_LC:
928 case AOT_AAC_SSR:
929 case AOT_AAC_LTP:
930 case AOT_AAC_SCAL:
931 case AOT_TWIN_VQ:
932 case AOT_ER_AAC_LC:
933 case AOT_ER_AAC_LTP:
934 case AOT_ER_AAC_SCAL:
935 case AOT_ER_TWIN_VQ:
936 case AOT_ER_BSAC:
937 case AOT_ER_AAC_LD:
938 err =
939 transportEnc_writeGASpecificConfig(asc, config, extFlag, alignAnchor);
940 if (err) return err;
941 break;
942 case AOT_ER_AAC_ELD:
943 err = transportEnc_writeELDSpecificConfig(asc, config, epConfig, cb);
944 if (err) return err;
945 break;
946 case AOT_USAC:
947 err = transportEnc_writeUsacSpecificConfig(asc, extFlag, config, cb);
948 if (err) {
949 return err;
950 }
951 break;
952 default:
953 return -1;
954 }
955
956 switch (config->aot) {
957 case AOT_ER_AAC_LC:
958 case AOT_ER_AAC_LTP:
959 case AOT_ER_AAC_SCAL:
960 case AOT_ER_TWIN_VQ:
961 case AOT_ER_BSAC:
962 case AOT_ER_AAC_LD:
963 case AOT_ER_CELP:
964 case AOT_ER_HVXC:
965 case AOT_ER_HILN:
966 case AOT_ER_PARA:
967 case AOT_ER_AAC_ELD:
968 FDKwriteBits(asc, 0, 2); /* epconfig 0 */
969 break;
970 default:
971 break;
972 }
973
974 /* backward compatible explicit signaling of extension AOT */
975 if (config->sbrSignaling == SIG_EXPLICIT_BW_COMPATIBLE) {
976 TP_ASC_EXTENSION_ID ascExtId = ASCEXT_UNKOWN;
977
978 if (config->sbrPresent) {
979 ascExtId = ASCEXT_SBR;
980 FDKwriteBits(asc, ascExtId, 11);
981 writeAot(asc, config->extAOT);
982 FDKwriteBits(asc, 1, 1); /* sbrPresentFlag=1 */
983 writeSampleRate(asc, config->extSamplingRate, 4);
984 if (config->psPresent) {
985 ascExtId = ASCEXT_PS;
986 FDKwriteBits(asc, ascExtId, 11);
987 FDKwriteBits(asc, 1, 1); /* psPresentFlag=1 */
988 }
989 }
990 }
991
992 /* Make sure all bits are sync'ed */
993 FDKsyncCache(asc);
994
995 return 0;
996 }
997