• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 /* -----------------------------------------------------------------------------------------------------------
3 Software License for The Fraunhofer FDK AAC Codec Library for Android
4 
5 � Copyright  1995 - 2012 Fraunhofer-Gesellschaft zur F�rderung der angewandten Forschung e.V.
6   All rights reserved.
7 
8  1.    INTRODUCTION
9 The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements
10 the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio.
11 This FDK AAC Codec software is intended to be used on a wide variety of Android devices.
12 
13 AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual
14 audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by
15 independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part
16 of the MPEG specifications.
17 
18 Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer)
19 may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners
20 individually for the purpose of encoding or decoding bit streams in products that are compliant with
21 the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license
22 these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec
23 software may already be covered under those patent licenses when it is used for those licensed purposes only.
24 
25 Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality,
26 are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional
27 applications information and documentation.
28 
29 2.    COPYRIGHT LICENSE
30 
31 Redistribution and use in source and binary forms, with or without modification, are permitted without
32 payment of copyright license fees provided that you satisfy the following conditions:
33 
34 You must retain the complete text of this software license in redistributions of the FDK AAC Codec or
35 your modifications thereto in source code form.
36 
37 You must retain the complete text of this software license in the documentation and/or other materials
38 provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form.
39 You must make available free of charge copies of the complete source code of the FDK AAC Codec and your
40 modifications thereto to recipients of copies in binary form.
41 
42 The name of Fraunhofer may not be used to endorse or promote products derived from this library without
43 prior written permission.
44 
45 You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec
46 software or your modifications thereto.
47 
48 Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software
49 and the date of any change. For modified versions of the FDK AAC Codec, the term
50 "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term
51 "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android."
52 
53 3.    NO PATENT LICENSE
54 
55 NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer,
56 ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with
57 respect to this software.
58 
59 You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized
60 by appropriate patent licenses.
61 
62 4.    DISCLAIMER
63 
64 This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors
65 "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties
66 of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
67 CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages,
68 including but not limited to procurement of substitute goods or services; loss of use, data, or profits,
69 or business interruption, however caused and on any theory of liability, whether in contract, strict
70 liability, or tort (including negligence), arising in any way out of the use of this software, even if
71 advised of the possibility of such damage.
72 
73 5.    CONTACT INFORMATION
74 
75 Fraunhofer Institute for Integrated Circuits IIS
76 Attention: Audio and Multimedia Departments - FDK AAC LL
77 Am Wolfsmantel 33
78 91058 Erlangen, Germany
79 
80 www.iis.fraunhofer.de/amm
81 amm-info@iis.fraunhofer.de
82 ----------------------------------------------------------------------------------------------------------- */
83 
84 /*****************************  MPEG-4 AAC Decoder  **************************
85 
86    Author(s):   Christian Griebel
87    Description: Dynamic range control (DRC) decoder tool for AAC
88 
89 ******************************************************************************/
90 
91 #include "aacdec_drc.h"
92 
93 
94 #include "channelinfo.h"
95 #include "aac_rom.h"
96 
97  #include "sbrdecoder.h"
98 
99 /*
100  * Dynamic Range Control
101  */
102 
103 /* For parameter conversion */
104 #define DRC_PARAMETER_BITS        ( 7 )
105 #define DRC_MAX_QUANT_STEPS       ( 1<<DRC_PARAMETER_BITS )
106 #define DRC_MAX_QUANT_FACTOR      ( DRC_MAX_QUANT_STEPS-1 )
107 #define DRC_PARAM_QUANT_STEP      ( FL2FXCONST_DBL(1.0f/(float)DRC_MAX_QUANT_FACTOR) )
108 #define DRC_PARAM_SCALE           ( 1 )
109 
110 #define MAX_REFERENCE_LEVEL       ( 127 )
111 
112  #define DVB_ANC_DATA_SYNC_BYTE   ( 0xBC )    /* DVB ancillary data sync byte. */
113 
114 /*!
115   \brief Initialize DRC information
116 
117   \self Handle of DRC info
118 
119   \return none
120 */
aacDecoder_drcInit(HANDLE_AAC_DRC self)121 void aacDecoder_drcInit (
122     HANDLE_AAC_DRC self )
123 {
124   CDrcParams *pParams;
125 
126   if (self == NULL) {
127     return;
128   }
129 
130   /* init control fields */
131   self->enable = 0;
132   self->numThreads = 0;
133   self->digitalNorm = 0;
134 
135   /* init params */
136   pParams = &self->params;
137   pParams->bsDelayEnable = 0;
138   pParams->cut   = FL2FXCONST_DBL(0.0f);
139   pParams->boost = FL2FXCONST_DBL(0.0f);
140   pParams->targetRefLevel = AACDEC_DRC_DEFAULT_REF_LEVEL;
141   pParams->expiryFrame = AACDEC_DRC_DFLT_EXPIRY_FRAMES;
142 
143   /* initial program ref level = target ref level */
144   self->progRefLevel = pParams->targetRefLevel;
145 }
146 
147 
148 /*!
149   \brief Initialize DRC control data for one channel
150 
151   \self Handle of DRC info
152 
153   \return none
154 */
aacDecoder_drcInitChannelData(CDrcChannelData * pDrcChData)155 void aacDecoder_drcInitChannelData (
156     CDrcChannelData *pDrcChData )
157 {
158   if (pDrcChData != NULL) {
159     pDrcChData->expiryCount = 0;
160     pDrcChData->numBands    = 1;
161     pDrcChData->bandTop[0]  = (1024 >> 2) - 1;
162     pDrcChData->drcValue[0] = 0;
163     pDrcChData->drcInterpolationScheme = 0;
164     pDrcChData->drcDataType = UNKNOWN_PAYLOAD;
165   }
166 }
167 
168 
169 /*!
170   \brief  Set one single DRC parameter
171 
172   \self   Handle of DRC info.
173   \param  Parameter to be set.
174   \value  Value to be set.
175 
176   \return an error code.
177 */
aacDecoder_drcSetParam(HANDLE_AAC_DRC self,AACDEC_DRC_PARAM param,INT value)178 AAC_DECODER_ERROR aacDecoder_drcSetParam (
179     HANDLE_AAC_DRC    self,
180     AACDEC_DRC_PARAM  param,
181     INT               value )
182 {
183   AAC_DECODER_ERROR ErrorStatus = AAC_DEC_OK;
184 
185   switch (param)
186   {
187   case DRC_CUT_SCALE:
188     /* set attenuation scale factor */
189     if ( (value < 0)
190       || (value > DRC_MAX_QUANT_FACTOR) ) {
191       return AAC_DEC_SET_PARAM_FAIL;
192     }
193     if (self == NULL) {
194       return AAC_DEC_INVALID_HANDLE;
195     }
196     self->params.cut = (FIXP_DBL)((INT)(DRC_PARAM_QUANT_STEP>>DRC_PARAM_SCALE) * (INT)value);
197     break;
198   case DRC_BOOST_SCALE:
199     /* set boost factor */
200     if ( (value < 0)
201       || (value > DRC_MAX_QUANT_FACTOR) ) {
202       return AAC_DEC_SET_PARAM_FAIL;
203     }
204     if (self == NULL) {
205       return AAC_DEC_INVALID_HANDLE;
206     }
207     self->params.boost = (FIXP_DBL)((INT)(DRC_PARAM_QUANT_STEP>>DRC_PARAM_SCALE) * (INT)value);
208     break;
209   case TARGET_REF_LEVEL:
210     if ( value >  MAX_REFERENCE_LEVEL
211       || value < -MAX_REFERENCE_LEVEL ) {
212       return AAC_DEC_SET_PARAM_FAIL;
213     }
214     if (self == NULL) {
215       return AAC_DEC_INVALID_HANDLE;
216     }
217     if (value < 0) {
218       self->digitalNorm = 0;
219     }
220     else {
221       /* ref_level must be between 0 and MAX_REFERENCE_LEVEL, inclusive */
222       self->digitalNorm    = 1;
223       self->progRefLevel   = AACDEC_DRC_DEFAULT_REF_LEVEL;
224       self->params.targetRefLevel = value;
225     }
226     break;
227   case APPLY_HEAVY_COMPRESSION:
228     if (value < 0 || value > 1) {
229       return AAC_DEC_SET_PARAM_FAIL;
230     }
231     if (self == NULL) {
232       return AAC_DEC_INVALID_HANDLE;
233     }
234     self->params.applyHeavyCompression = (UCHAR)value;
235     break;
236   case DRC_BS_DELAY:
237     if (value < 0 || value > 1) {
238       return AAC_DEC_SET_PARAM_FAIL;
239     }
240     if (self == NULL) {
241       return AAC_DEC_INVALID_HANDLE;
242     }
243     self->params.bsDelayEnable = value;
244     break;
245   case DRC_DATA_EXPIRY_FRAME:
246     if (self == NULL) {
247       return AAC_DEC_INVALID_HANDLE;
248     }
249     self->params.expiryFrame = (UINT)value;
250     break;
251   default:
252     return AAC_DEC_SET_PARAM_FAIL;
253   }  /* switch(param) */
254 
255   /* switch on/off processing */
256   self->enable = ( (self->params.boost > (FIXP_DBL)0)
257                 || (self->params.cut   > (FIXP_DBL)0)
258                 || (self->params.applyHeavyCompression != 0)
259                 || (self->digitalNorm == 1) );
260 
261 
262   return ErrorStatus;
263 }
264 
265 
parseExcludedChannels(UINT * excludedChnsMask,HANDLE_FDK_BITSTREAM bs)266 static int parseExcludedChannels( UINT *excludedChnsMask,
267                                   HANDLE_FDK_BITSTREAM bs )
268 {
269   UINT excludeMask = 0;
270   UINT i, j;
271   int  bitCnt = 9;
272 
273   for (i = 0, j = 1; i < 7; i++, j<<=1) {
274     if (FDKreadBits(bs,1)) {
275       excludeMask |= j;
276     }
277   }
278 
279   /* additional_excluded_chns */
280   while (FDKreadBits(bs,1)) {
281     for (i = 0; i < 7; i++, j<<=1) {
282       if (FDKreadBits(bs,1)) {
283         excludeMask |= j;
284       }
285     }
286     bitCnt += 9;
287     FDK_ASSERT(j < (UINT)-1);
288   }
289 
290   *excludedChnsMask = excludeMask;
291 
292   return (bitCnt);
293 }
294 
295 
296 /*!
297   \brief Save DRC payload bitstream position
298 
299   \self Handle of DRC info
300   \bs Handle of FDK bitstream
301 
302   \return The number of DRC payload bits
303 */
aacDecoder_drcMarkPayload(HANDLE_AAC_DRC self,HANDLE_FDK_BITSTREAM bs,AACDEC_DRC_PAYLOAD_TYPE type)304 int aacDecoder_drcMarkPayload (
305     HANDLE_AAC_DRC self,
306     HANDLE_FDK_BITSTREAM bs,
307     AACDEC_DRC_PAYLOAD_TYPE type )
308 {
309   UINT bsStartPos;
310   int  i, numBands = 1, bitCnt = 0;
311 
312   if (self == NULL) {
313     return 0;
314   }
315 
316   bsStartPos = FDKgetValidBits(bs);
317 
318   switch (type) {
319     case MPEG_DRC_EXT_DATA:
320     {
321       bitCnt = 4;
322 
323       if (FDKreadBits(bs,1)) {          /* pce_tag_present */
324         FDKreadBits(bs,8);              /* pce_instance_tag + drc_tag_reserved_bits */
325         bitCnt+=8;
326       }
327 
328       if (FDKreadBits(bs,1)) {          /* excluded_chns_present */
329         FDKreadBits(bs,7);              /* exclude mask [0..7] */
330         bitCnt+=8;
331         while (FDKreadBits(bs,1)) {     /* additional_excluded_chns */
332           FDKreadBits(bs,7);            /* exclude mask [x..y] */
333           bitCnt+=8;
334         }
335       }
336 
337       if (FDKreadBits(bs,1)) {          /* drc_bands_present */
338         numBands += FDKreadBits(bs, 4); /* drc_band_incr */
339         FDKreadBits(bs,4);              /* reserved */
340         bitCnt+=8;
341         for (i = 0; i < numBands; i++) {
342           FDKreadBits(bs,8);            /* drc_band_top[i] */
343           bitCnt+=8;
344         }
345       }
346 
347       if (FDKreadBits(bs,1)) {          /* prog_ref_level_present */
348         FDKreadBits(bs,8);              /* prog_ref_level + prog_ref_level_reserved_bits */
349         bitCnt+=8;
350       }
351 
352       for (i = 0; i < numBands; i++) {
353         FDKreadBits(bs,8);              /* dyn_rng_sgn[i] + dyn_rng_ctl[i] */
354         bitCnt+=8;
355       }
356 
357       if ( (self->numPayloads < MAX_DRC_THREADS)
358         && ((INT)FDKgetValidBits(bs) >= 0) )
359       {
360         self->drcPayloadPosition[self->numPayloads++] = bsStartPos;
361       }
362     }
363     break;
364 
365     case DVB_DRC_ANC_DATA:
366       bitCnt += 8;
367       /* check sync word */
368       if (FDKreadBits(bs, 8) == DVB_ANC_DATA_SYNC_BYTE)
369       {
370         int dmxLevelsPresent, compressionPresent;
371         int coarseGrainTcPresent, fineGrainTcPresent;
372 
373         /* bs_info field */
374         FDKreadBits(bs, 8);                          /* mpeg_audio_type, dolby_surround_mode, presentation_mode */
375         bitCnt+=8;
376 
377         /* Evaluate ancillary_data_status */
378         FDKreadBits(bs, 3);                          /* reserved, set to 0 */
379         dmxLevelsPresent = FDKreadBits(bs, 1);       /* downmixing_levels_MPEG4_status */
380         FDKreadBits(bs, 1);                          /* reserved, set to 0 */
381         compressionPresent   = FDKreadBits(bs, 1);   /* audio_coding_mode_and_compression status */
382         coarseGrainTcPresent = FDKreadBits(bs, 1);   /* coarse_grain_timecode_status */
383         fineGrainTcPresent   = FDKreadBits(bs, 1);   /* fine_grain_timecode_status */
384         bitCnt+=8;
385 
386         /* MPEG4 downmixing levels */
387         if (dmxLevelsPresent) {
388           FDKreadBits(bs, 8);                        /* downmixing_levels_MPEG4 */
389           bitCnt+=8;
390         }
391         /* audio coding mode and compression status */
392         if (compressionPresent) {
393           FDKreadBits(bs, 16);                        /* audio_coding_mode, Compression_value */
394           bitCnt+=16;
395         }
396         /* coarse grain timecode */
397         if (coarseGrainTcPresent) {
398           FDKreadBits(bs, 16);                       /* coarse_grain_timecode */
399           bitCnt+=16;
400         }
401         /* fine grain timecode */
402         if (fineGrainTcPresent) {
403           FDKreadBits(bs, 16);                       /* fine_grain_timecode */
404           bitCnt+=16;
405         }
406         if ( !self->dvbAncDataAvailable
407           && ((INT)FDKgetValidBits(bs) >= 0) )
408         {
409           self->dvbAncDataPosition  = bsStartPos;
410           self->dvbAncDataAvailable = 1;
411         }
412       }
413       break;
414 
415     default:
416       break;
417   }
418 
419   return (bitCnt);
420 }
421 
422 
423 /*!
424   \brief Parse DRC parameters from bitstream
425 
426   \bs Handle of FDK bitstream (in)
427   \pDrcBs Pointer to DRC payload data container (out)
428   \payloadPosition Bitstream position of MPEG DRC data junk (in)
429 
430   \return Number of bits read (0 in case of a parse error)
431 */
aacDecoder_drcParse(HANDLE_FDK_BITSTREAM bs,CDrcPayload * pDrcBs,UINT payloadPosition)432 static int aacDecoder_drcParse (
433     HANDLE_FDK_BITSTREAM  bs,
434     CDrcPayload          *pDrcBs,
435     UINT                  payloadPosition )
436 {
437   int i, numBands, bitCnt = 4;
438 
439   /* Move to the beginning of the DRC payload field */
440   FDKpushBiDirectional(bs, FDKgetValidBits(bs)-payloadPosition);
441 
442   /* pce_tag_present */
443   if (FDKreadBits(bs,1))
444   {
445     pDrcBs->pceInstanceTag = FDKreadBits(bs, 4);  /* pce_instance_tag */
446     /* only one program supported */
447     FDKreadBits(bs, 4);  /* drc_tag_reserved_bits */
448     bitCnt += 8;
449   } else {
450     pDrcBs->pceInstanceTag = -1;  /* not present */
451   }
452 
453   if (FDKreadBits(bs,1)) {        /* excluded_chns_present */
454     /* get excluded_chn_mask */
455     bitCnt += parseExcludedChannels(&pDrcBs->excludedChnsMask, bs);
456   } else {
457     pDrcBs->excludedChnsMask = 0;
458   }
459 
460   numBands = 1;
461   if (FDKreadBits(bs,1))  /* drc_bands_present */
462   {
463     /* get band_incr */
464     numBands += FDKreadBits(bs, 4);  /* drc_band_incr */
465     pDrcBs->channelData.drcInterpolationScheme = FDKreadBits(bs, 4);  /* drc_interpolation_scheme */
466     bitCnt += 8;
467     /* band_top */
468     for (i = 0; i < numBands; i++)
469     {
470       pDrcBs->channelData.bandTop[i] = FDKreadBits(bs, 8);  /* drc_band_top[i] */
471       bitCnt += 8;
472     }
473   }
474   else {
475     pDrcBs->channelData.bandTop[0] = 255;
476   }
477 
478   pDrcBs->channelData.numBands = numBands;
479 
480   if (FDKreadBits(bs,1))                        /* prog_ref_level_present */
481   {
482     pDrcBs->progRefLevel = FDKreadBits(bs, 7);  /* prog_ref_level */
483     FDKreadBits(bs, 1);                         /* prog_ref_level_reserved_bits */
484     bitCnt += 8;
485   } else {
486     pDrcBs->progRefLevel = -1;
487   }
488 
489   for (i = 0; i < numBands; i++)
490   {
491     pDrcBs->channelData.drcValue[i]  = FDKreadBits(bs, 1) << 7;   /* dyn_rng_sgn[i] */
492     pDrcBs->channelData.drcValue[i] |= FDKreadBits(bs, 7) & 0x7F; /* dyn_rng_ctl[i] */
493     bitCnt += 8;
494   }
495 
496   /* Set DRC payload type */
497   pDrcBs->channelData.drcDataType = MPEG_DRC_EXT_DATA;
498 
499   return (bitCnt);
500 }
501 
502 
503 /*!
504   \brief Parse heavy compression value transported in DSEs of DVB streams with MPEG-4 content.
505 
506   \bs Handle of FDK bitstream (in)
507   \pDrcBs Pointer to DRC payload data container (out)
508   \payloadPosition Bitstream position of DVB ancillary data junk
509 
510   \return Number of bits read (0 in case of a parse error)
511 */
512 #define DVB_COMPRESSION_SCALE   ( 8 )       /* 48,164 dB */
513 
aacDecoder_drcReadCompression(HANDLE_FDK_BITSTREAM bs,CDrcPayload * pDrcBs,UINT payloadPosition)514 static int aacDecoder_drcReadCompression (
515     HANDLE_FDK_BITSTREAM  bs,
516     CDrcPayload          *pDrcBs,
517     UINT                  payloadPosition )
518 {
519   int  bitCnt = 0;
520   int  dmxLevelsPresent, compressionPresent;
521   int  coarseGrainTcPresent, fineGrainTcPresent;
522 
523   /* Move to the beginning of the DRC payload field */
524   FDKpushBiDirectional(bs, FDKgetValidBits(bs)-payloadPosition);
525 
526   /* Sanity checks */
527   if ( FDKgetValidBits(bs) < 24 ) {
528     return 0;
529   }
530 
531   /* Check sync word */
532   if (FDKreadBits(bs, 8) != DVB_ANC_DATA_SYNC_BYTE) {
533     return 0;
534   }
535 
536   /* Evaluate bs_info field */
537   if (FDKreadBits(bs, 2) != 3) {               /* mpeg_audio_type */
538     /* No MPEG-4 audio data */
539     return 0;
540   }
541   FDKreadBits(bs, 2);                          /* dolby_surround_mode */
542   FDKreadBits(bs, 2);                          /* presentation_mode */
543   if (FDKreadBits(bs, 2) != 0) {               /* reserved, set to 0 */
544     return 0;
545   }
546 
547   /* Evaluate ancillary_data_status */
548   if (FDKreadBits(bs, 3) != 0) {               /* reserved, set to 0 */
549     return 0;
550   }
551   dmxLevelsPresent = FDKreadBits(bs, 1);       /* downmixing_levels_MPEG4_status */
552   if (FDKreadBits(bs, 1) != 0) {               /* reserved, set to 0 */
553     return 0;
554   }
555   compressionPresent   = FDKreadBits(bs, 1);   /* audio_coding_mode_and_compression status */
556   coarseGrainTcPresent = FDKreadBits(bs, 1);   /* coarse_grain_timecode_status */
557   fineGrainTcPresent   = FDKreadBits(bs, 1);   /* fine_grain_timecode_status */
558   bitCnt += 24;
559 
560   if (dmxLevelsPresent) {
561     FDKreadBits(bs, 8);                        /* downmixing_levels_MPEG4 */
562     bitCnt += 8;
563   }
564 
565   /* audio_coding_mode_and_compression_status */
566   if (compressionPresent)
567   {
568     UCHAR compressionOn, compressionValue;
569 
570     /* audio_coding_mode */
571     if ( FDKreadBits(bs, 7) != 0 ) {  /* The reserved bits shall be set to "0". */
572       return 0;
573     }
574     compressionOn    = (UCHAR)FDKreadBits(bs, 1);  /* compression_on */
575     compressionValue = (UCHAR)FDKreadBits(bs, 8);  /* Compression_value */
576     bitCnt += 16;
577 
578     if ( compressionOn ) {
579       /* A compression value is available so store the data just like MPEG DRC data */
580       pDrcBs->channelData.numBands    =  1;                            /* One band ... */
581       pDrcBs->channelData.drcValue[0] =  compressionValue;             /* ... with one value ... */
582       pDrcBs->channelData.bandTop[0]  = (1024 >> 2) - 1;  /* ... comprising the whole spectrum. */
583       pDrcBs->pceInstanceTag          = -1;                            /* Not present */
584       pDrcBs->progRefLevel            = -1;                            /* Not present */
585       pDrcBs->channelData.drcDataType =  DVB_DRC_ANC_DATA;             /* Set DRC payload type to DVB. */
586     } else {
587       /* No compression value available */
588       /* CAUTION: It is not clearly defined by standard how to react in this situation. */
589       /* Turn down the compression value to aprox. 0dB */
590       pDrcBs->channelData.numBands    =  1;                            /* One band ... */
591       pDrcBs->channelData.drcValue[0] =  0x80;                         /* ... with aprox. 0dB ... */
592       pDrcBs->channelData.bandTop[0]  = (1024 >> 2) - 1;  /* ... comprising the whole spectrum. */
593       pDrcBs->channelData.drcDataType =  DVB_DRC_ANC_DATA;             /* Set DRC payload type to DVB. */
594 
595       /* If compression_on field is set to "0" the compression_value field shall be "0000 0000". */
596       if (compressionValue != 0) {
597         return 0;
598       }
599     }
600   }
601 
602   /* Read timecodes if available just to get the right amount of bits. */
603   if (coarseGrainTcPresent) {
604     FDKreadBits(bs, 16);      /* coarse_grain_timecode */
605     bitCnt += 16;
606   }
607   if (fineGrainTcPresent) {
608     FDKreadBits(bs, 16);      /* fine_grain_timecode */
609     bitCnt += 16;
610   }
611 
612   return (bitCnt);
613 }
614 
615 
616 /*
617  * Prepare DRC processing
618  */
aacDecoder_drcExtractAndMap(HANDLE_AAC_DRC self,HANDLE_FDK_BITSTREAM hBs,CAacDecoderStaticChannelInfo * pAacDecoderStaticChannelInfo[],UCHAR pceInstanceTag,UCHAR channelMapping[],int validChannels)619 static int aacDecoder_drcExtractAndMap (
620         HANDLE_AAC_DRC  self,
621         HANDLE_FDK_BITSTREAM hBs,
622         CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[],
623         UCHAR  pceInstanceTag,
624         UCHAR  channelMapping[], /* Channel mapping translating drcChannel index to canonical channel index */
625         int    validChannels )
626 {
627   CDrcPayload  threadBs[MAX_DRC_THREADS];
628   CDrcPayload *validThreadBs[MAX_DRC_THREADS];
629   UINT backupBsPosition;
630   int  i, thread, validThreads = 0;
631   int  numExcludedChns[MAX_DRC_THREADS];
632 
633   self->numThreads = 0;
634   backupBsPosition = FDKgetValidBits(hBs);
635 
636   for (i = 0; i < self->numPayloads && self->numThreads < MAX_DRC_THREADS; i++) {
637     int bitsParsed;
638 
639     /* Init payload data chunk. The memclear is very important because it initializes
640        the most values. Without it the module wouldn't work properly or crash. */
641     FDKmemclear(&threadBs[self->numThreads], sizeof(CDrcPayload));
642     threadBs[self->numThreads].channelData.bandTop[0]  = (1024 >> 2) - 1;
643 
644     /* Extract payload */
645     bitsParsed = aacDecoder_drcParse( hBs,
646                                      &threadBs[self->numThreads],
647                                       self->drcPayloadPosition[i] );
648     if (bitsParsed > 0) {
649       self->numThreads++;
650     }
651   }
652   self->numPayloads = 0;
653 
654   if (self->dvbAncDataAvailable)
655   { /* Append a DVB heavy compression payload thread if available. */
656     int bitsParsed;
657 
658     /* Init payload data chunk. The memclear is very important because it initializes
659        the most values. Without it the module wouldn't work properly or crash. */
660     FDKmemclear(&threadBs[self->numThreads], sizeof(CDrcPayload));
661     threadBs[self->numThreads].channelData.bandTop[0]  = (1024 >> 2) - 1;
662 
663     /* Extract payload */
664     bitsParsed = aacDecoder_drcReadCompression( hBs,
665                                                &threadBs[self->numThreads],
666                                                 self->dvbAncDataPosition );
667     if (bitsParsed > 0) {
668       self->numThreads++;
669     }
670   }
671   self->dvbAncDataAvailable = 0;
672 
673   /* Reset the bitbufffer */
674   FDKpushBiDirectional(hBs, FDKgetValidBits(hBs) - backupBsPosition);
675 
676   /* calculate number of valid bits in excl_chn_mask */
677 
678   /* coupling channels not supported */
679 
680   /* check for valid threads */
681   for (thread = 0; thread < self->numThreads; thread++) {
682     CDrcPayload *pThreadBs = &threadBs[thread];
683     int numExclChns = 0;
684 
685     switch ((AACDEC_DRC_PAYLOAD_TYPE)pThreadBs->channelData.drcDataType) {
686       default:
687         continue;
688       case MPEG_DRC_EXT_DATA:
689       case DVB_DRC_ANC_DATA:
690         break;
691     }
692 
693     if (pThreadBs->pceInstanceTag >= 0) {  /* if PCE tag present */
694       if (pThreadBs->pceInstanceTag != pceInstanceTag) {
695         continue;  /* don't accept */
696       }
697     }
698 
699     /* calculate number of excluded channels */
700     if (pThreadBs->excludedChnsMask > 0) {
701       INT exclMask = pThreadBs->excludedChnsMask;
702       int ch;
703       for (ch = 0; ch < validChannels; ch++) {
704         numExclChns += exclMask & 0x1;
705         exclMask >>= 1;
706       }
707     }
708     if (numExclChns < validChannels) {
709       validThreadBs[validThreads]   = pThreadBs;
710       numExcludedChns[validThreads] = numExclChns;
711       validThreads++;
712     }
713   }
714 
715   if (validThreads > 1) {
716     int ch;
717 
718     /* check consistency of excl_chn_mask amongst valid DRC threads */
719     for (ch = 0; ch < validChannels; ch++) {
720       int present = 0;
721 
722       for (thread = 0; thread < validThreads; thread++) {
723         CDrcPayload *pThreadBs = validThreadBs[thread];
724 
725 
726         /* thread applies to this channel */
727         if ( (pThreadBs->channelData.drcDataType == MPEG_DRC_EXT_DATA)
728           && ( (numExcludedChns[thread] == 0)
729             || (!(pThreadBs->excludedChnsMask & (1<<ch))) ) ) {
730           present++;
731         }
732       }
733 
734 
735       if (present > 1) {
736         return -1;
737       }
738     }
739   }
740 
741   /* map DRC bitstream information onto DRC channel information */
742   for (thread = 0; thread < validThreads; thread++)
743   {
744     CDrcPayload *pThreadBs = validThreadBs[thread];
745     INT exclMask = pThreadBs->excludedChnsMask;
746     AACDEC_DRC_PAYLOAD_TYPE drcPayloadType = (AACDEC_DRC_PAYLOAD_TYPE)pThreadBs->channelData.drcDataType;
747     int ch;
748 
749     /* last progRefLevel transmitted is the one that is used
750      * (but it should really only be transmitted once per block!)
751      */
752     if (pThreadBs->progRefLevel >= 0) {
753       self->progRefLevel = pThreadBs->progRefLevel;
754     }
755 
756     /* SCE, CPE and LFE */
757     for (ch = 0; ch < validChannels; ch++) {
758       int mapedChannel = channelMapping[ch];
759 
760       if ( ((exclMask & (1<<mapedChannel)) == 0)
761         && ( (drcPayloadType == MPEG_DRC_EXT_DATA)
762           || ((drcPayloadType == DVB_DRC_ANC_DATA) && self->params.applyHeavyCompression)
763          ) ) {
764         /* copy thread to channel */
765         pAacDecoderStaticChannelInfo[ch]->drcData = pThreadBs->channelData;
766       }
767     }
768     /* CCEs not supported by now */
769   }
770 
771   return 0;
772 }
773 
774 
aacDecoder_drcApply(HANDLE_AAC_DRC self,void * pSbrDec,CAacDecoderChannelInfo * pAacDecoderChannelInfo,CDrcChannelData * pDrcChData,int ch,int aacFrameSize,int bSbrPresent)775 void aacDecoder_drcApply (
776         HANDLE_AAC_DRC          self,
777         void                   *pSbrDec,
778         CAacDecoderChannelInfo *pAacDecoderChannelInfo,
779         CDrcChannelData        *pDrcChData,
780         int  ch,   /* needed only for SBR */
781         int  aacFrameSize,
782         int  bSbrPresent )
783 {
784   int band, top, bin, numBands;
785   int bottom = 0;
786 
787   FIXP_DBL max_mantissa;
788   INT max_exponent;
789 
790   FIXP_DBL norm_mantissa = FL2FXCONST_DBL(0.0f);
791   INT  norm_exponent = 0;
792 
793   FIXP_DBL fact_mantissa[MAX_DRC_BANDS];
794   INT  fact_exponent[MAX_DRC_BANDS];
795 
796   CDrcParams  *pParams = &self->params;
797 
798   FIXP_DBL    *pSpectralCoefficient  =  SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient);
799   CIcsInfo    *pIcsInfo              = &pAacDecoderChannelInfo->icsInfo;
800   SHORT       *pSpecScale            =  pAacDecoderChannelInfo->specScale;
801 
802   int winSeq = pIcsInfo->WindowSequence;
803 
804   /* Increment and check expiry counter */
805   if ( (pParams->expiryFrame > 0)
806     && (++pDrcChData->expiryCount > pParams->expiryFrame) )
807   { /* The DRC data is too old, so delete it. */
808     aacDecoder_drcInitChannelData( pDrcChData );
809   }
810 
811   if (!self->enable) {
812     sbrDecoder_drcDisable( (HANDLE_SBRDECODER)pSbrDec, ch );
813     return;
814   }
815 
816   numBands = pDrcChData->numBands;
817   top = FDKmax(0, numBands-1);
818 
819   pDrcChData->bandTop[0] = fixMin(pDrcChData->bandTop[0], (aacFrameSize >> 2) - 1);
820 
821   /* If program reference normalization is done in the digital domain,
822   modify factor to perform normalization.  prog_ref_level can
823   alternatively be passed to the system for modification of the level in
824   the analog domain.  Analog level modification avoids problems with
825   reduced DAC SNR (if signal is attenuated) or clipping (if signal is
826   boosted) */
827 
828   if (self->digitalNorm == 1)
829   {
830     /* 0.5^((targetRefLevel - progRefLevel)/24) */
831     norm_mantissa = fLdPow(
832             FL2FXCONST_DBL(-1.0), /* log2(0.5) */
833             0,
834             (FIXP_DBL)((INT)(FL2FXCONST_DBL(1.0f/24.0)>>3) * (INT)(pParams->targetRefLevel-self->progRefLevel)),
835             3,
836            &norm_exponent );
837   }
838   else {
839     norm_mantissa = FL2FXCONST_DBL(0.5f);
840     norm_exponent = 1;
841   }
842 
843 
844   /* calc scale factors */
845   for (band = 0; band < numBands; band++)
846   {
847     UCHAR drcVal = pDrcChData->drcValue[band];
848     top = fixMin((int)( (pDrcChData->bandTop[band]+1)<<2 ), aacFrameSize);
849 
850     fact_mantissa[band] = FL2FXCONST_DBL(0.5f);
851     fact_exponent[band] = 1;
852 
853     if (  pParams->applyHeavyCompression
854       && ((AACDEC_DRC_PAYLOAD_TYPE)pDrcChData->drcDataType == DVB_DRC_ANC_DATA) )
855     {
856       INT compressionFactorVal_e;
857       int valX, valY;
858 
859       valX = drcVal >> 4;
860       valY = drcVal & 0x0F;
861 
862       /* calculate the unscaled heavy compression factor.
863          compressionFactor = 48.164 - 6.0206*valX - 0.4014*valY dB
864          range: -48.166 dB to 48.164 dB */
865       if ( drcVal != 0x7F ) {
866         fact_mantissa[band] =
867           fPowInt( FL2FXCONST_DBL(0.95483867181), /* -0.4014dB = 0.95483867181 */
868                    0,
869                    valY,
870                   &compressionFactorVal_e );
871 
872         /* -0.0008dB (48.164 - 6.0206*8 = -0.0008) */
873         fact_mantissa[band] = fMult(FL2FXCONST_DBL(0.99990790084), fact_mantissa[band]);
874 
875         fact_exponent[band] = DVB_COMPRESSION_SCALE - valX + compressionFactorVal_e;
876       }
877     } else
878     if ((AACDEC_DRC_PAYLOAD_TYPE)pDrcChData->drcDataType == MPEG_DRC_EXT_DATA)
879     {
880     /* apply the scaled dynamic range control words to factor.
881      * if scaling drc_cut (or drc_boost), or control word drc_mantissa is 0
882      * then there is no dynamic range compression
883      *
884      * if pDrcChData->drcSgn[band] is
885      *  1 then gain is < 1 :  factor = 2^(-self->cut   * pDrcChData->drcMag[band] / 24)
886      *  0 then gain is > 1 :  factor = 2^( self->boost * pDrcChData->drcMag[band] / 24)
887      */
888 
889     if ((drcVal&0x7F) > 0) {
890       FIXP_DBL tParamVal = (drcVal & 0x80) ? -pParams->cut : pParams->boost;
891 
892       fact_mantissa[band] =
893         f2Pow( (FIXP_DBL)((INT)fMult(FL2FXCONST_DBL(1.0f/192.0f), tParamVal) * (drcVal&0x7F)),
894                  3+DRC_PARAM_SCALE,
895                 &fact_exponent[band] );
896     }
897     }
898 
899     fact_mantissa[band]  = fMult(fact_mantissa[band], norm_mantissa);
900     fact_exponent[band] += norm_exponent;
901 
902 
903     bottom = top;
904 
905   }  /* end loop over bands */
906 
907 
908   /* normalizations */
909   {
910     int res;
911 
912     max_mantissa = FL2FXCONST_DBL(0.0f);
913     max_exponent = 0;
914     for (band = 0; band < numBands; band++) {
915       max_mantissa = fixMax(max_mantissa, fact_mantissa[band]);
916       max_exponent = fixMax(max_exponent, fact_exponent[band]);
917     }
918 
919     /* left shift factors to gain accurancy */
920     res = CntLeadingZeros(max_mantissa) - 1;
921 
922     /* above topmost DRC band gain factor is 1 */
923     if (((pDrcChData->bandTop[numBands-1]+1)<<2) < aacFrameSize) res = 0;
924 
925     if (res > 0) {
926       res = fixMin(res, max_exponent);
927       max_exponent -= res;
928 
929       for (band = 0; band < numBands; band++) {
930         fact_mantissa[band] <<= res;
931         fact_exponent[band]  -= res;
932       }
933     }
934 
935     /* normalize magnitudes to one scale factor */
936     for (band = 0; band < numBands; band++) {
937       if (fact_exponent[band] < max_exponent) {
938         fact_mantissa[band] >>= max_exponent - fact_exponent[band];
939       }
940     }
941   }
942 
943   /*  apply factor to spectral lines
944    *  short blocks must take care that bands fall on
945    *  block boundaries!
946    */
947   if (!bSbrPresent)
948   {
949     bottom = 0;
950 
951     for (band = 0; band < numBands; band++)
952     {
953       top = fixMin((int)( (pDrcChData->bandTop[band]+1)<<2 ), aacFrameSize);   /* ... * DRC_BAND_MULT; */
954 
955       for (bin = bottom; bin < top; bin++) {
956         pSpectralCoefficient[bin] = fMult(pSpectralCoefficient[bin], fact_mantissa[band]);
957       }
958 
959       bottom = top;
960     }
961 
962     /* above topmost DRC band gain factor is 1 */
963     if (max_exponent > 0) {
964       FIXP_DBL fact = FL2FXCONST_DBL(0.5f) >> (max_exponent - 1);
965 
966       for (bin = top; bin < aacFrameSize; bin++) {
967         pSpectralCoefficient[bin] = fMult(pSpectralCoefficient[bin], fact);
968       }
969     }
970 
971     /* adjust scaling */
972     pSpecScale[0] += max_exponent;
973 
974     if (winSeq == EightShortSequence) {
975       int win;
976       for (win = 1; win < 8; win++) {
977         pSpecScale[win] += max_exponent;
978       }
979     }
980   }
981   else {
982     HANDLE_SBRDECODER hSbrDecoder = (HANDLE_SBRDECODER)pSbrDec;
983 
984     /* feed factors into SBR decoder for application in QMF domain. */
985     sbrDecoder_drcFeedChannel (
986             hSbrDecoder,
987             ch,
988             pDrcChData->numBands,
989             fact_mantissa,
990             max_exponent,
991             pDrcChData->drcInterpolationScheme,
992             winSeq,
993             pDrcChData->bandTop
994           );
995   }
996 
997   return;
998 }
999 
1000 
1001 /*
1002  * Prepare DRC processing
1003  */
aacDecoder_drcProlog(HANDLE_AAC_DRC self,HANDLE_FDK_BITSTREAM hBs,CAacDecoderStaticChannelInfo * pAacDecoderStaticChannelInfo[],UCHAR pceInstanceTag,UCHAR channelMapping[],int validChannels)1004 int aacDecoder_drcProlog (
1005         HANDLE_AAC_DRC  self,
1006         HANDLE_FDK_BITSTREAM hBs,
1007         CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[],
1008         UCHAR  pceInstanceTag,
1009         UCHAR  channelMapping[], /* Channel mapping translating drcChannel index to canonical channel index */
1010         int    validChannels )
1011 {
1012   int err = 0;
1013 
1014   if (self == NULL) {
1015     return -1;
1016   }
1017 
1018   if (!self->params.bsDelayEnable)
1019   {
1020     err = aacDecoder_drcExtractAndMap (
1021             self,
1022             hBs,
1023             pAacDecoderStaticChannelInfo,
1024             pceInstanceTag,
1025             channelMapping,
1026             validChannels );
1027   }
1028 
1029   return err;
1030 }
1031 
1032 
1033 /*
1034  * Finalize DRC processing
1035  */
aacDecoder_drcEpilog(HANDLE_AAC_DRC self,HANDLE_FDK_BITSTREAM hBs,CAacDecoderStaticChannelInfo * pAacDecoderStaticChannelInfo[],UCHAR pceInstanceTag,UCHAR channelMapping[],int validChannels)1036 int aacDecoder_drcEpilog (
1037         HANDLE_AAC_DRC  self,
1038         HANDLE_FDK_BITSTREAM hBs,
1039         CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[],
1040         UCHAR  pceInstanceTag,
1041         UCHAR  channelMapping[], /* Channel mapping translating drcChannel index to canonical channel index */
1042         int    validChannels )
1043 {
1044   int err = 0;
1045 
1046   if (self == NULL) {
1047     return -1;
1048   }
1049 
1050   if (self->params.bsDelayEnable)
1051   {
1052     err = aacDecoder_drcExtractAndMap (
1053             self,
1054             hBs,
1055             pAacDecoderStaticChannelInfo,
1056             pceInstanceTag,
1057             channelMapping,
1058             validChannels );
1059   }
1060 
1061   return err;
1062 }
1063 
1064