• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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, 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, 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