• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 /* -----------------------------------------------------------------------------------------------------------
3 Software License for The Fraunhofer FDK AAC Codec Library for Android
4 
5 � Copyright  1995 - 2013 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 
134   /* init params */
135   pParams = &self->params;
136   pParams->bsDelayEnable = 0;
137   pParams->cut      = FL2FXCONST_DBL(0.0f);
138   pParams->usrCut   = FL2FXCONST_DBL(0.0f);
139   pParams->boost    = FL2FXCONST_DBL(0.0f);
140   pParams->usrBoost = FL2FXCONST_DBL(0.0f);
141   pParams->targetRefLevel = -1;
142   pParams->expiryFrame = AACDEC_DRC_DFLT_EXPIRY_FRAMES;
143   pParams->applyDigitalNorm = 0;
144   pParams->applyHeavyCompression = 0;
145 
146   /* initial program ref level = target ref level */
147   self->progRefLevel = pParams->targetRefLevel;
148   self->progRefLevelPresent = 0;
149   self->presMode = -1;
150 }
151 
152 
153 /*!
154   \brief Initialize DRC control data for one channel
155 
156   \self Handle of DRC info
157 
158   \return none
159 */
aacDecoder_drcInitChannelData(CDrcChannelData * pDrcChData)160 void aacDecoder_drcInitChannelData (
161     CDrcChannelData *pDrcChData )
162 {
163   if (pDrcChData != NULL) {
164     pDrcChData->expiryCount = 0;
165     pDrcChData->numBands    = 1;
166     pDrcChData->bandTop[0]  = (1024 >> 2) - 1;
167     pDrcChData->drcValue[0] = 0;
168     pDrcChData->drcInterpolationScheme = 0;
169     pDrcChData->drcDataType = UNKNOWN_PAYLOAD;
170   }
171 }
172 
173 
174 /*!
175   \brief  Set one single DRC parameter
176 
177   \self   Handle of DRC info.
178   \param  Parameter to be set.
179   \value  Value to be set.
180 
181   \return an error code.
182 */
aacDecoder_drcSetParam(HANDLE_AAC_DRC self,AACDEC_DRC_PARAM param,INT value)183 AAC_DECODER_ERROR aacDecoder_drcSetParam (
184     HANDLE_AAC_DRC    self,
185     AACDEC_DRC_PARAM  param,
186     INT               value )
187 {
188   AAC_DECODER_ERROR ErrorStatus = AAC_DEC_OK;
189 
190   switch (param)
191   {
192   case DRC_CUT_SCALE:
193     /* set attenuation scale factor */
194     if ( (value < 0)
195       || (value > DRC_MAX_QUANT_FACTOR) ) {
196       return AAC_DEC_SET_PARAM_FAIL;
197     }
198     if (self == NULL) {
199       return AAC_DEC_INVALID_HANDLE;
200     }
201     self->params.usrCut = (FIXP_DBL)((INT)(DRC_PARAM_QUANT_STEP>>DRC_PARAM_SCALE) * (INT)value);
202     if (self->params.applyHeavyCompression == 0)
203       self->params.cut = self->params.usrCut;
204     break;
205   case DRC_BOOST_SCALE:
206     /* set boost factor */
207     if ( (value < 0)
208       || (value > DRC_MAX_QUANT_FACTOR) ) {
209       return AAC_DEC_SET_PARAM_FAIL;
210     }
211     if (self == NULL) {
212       return AAC_DEC_INVALID_HANDLE;
213     }
214     self->params.usrBoost = (FIXP_DBL)((INT)(DRC_PARAM_QUANT_STEP>>DRC_PARAM_SCALE) * (INT)value);
215     if (self->params.applyHeavyCompression == 0)
216       self->params.boost = self->params.usrBoost;
217     break;
218   case TARGET_REF_LEVEL:
219     if ( value >  MAX_REFERENCE_LEVEL
220       || value < -MAX_REFERENCE_LEVEL ) {
221       return AAC_DEC_SET_PARAM_FAIL;
222     }
223     if (self == NULL) {
224       return AAC_DEC_INVALID_HANDLE;
225     }
226     if (value < 0) {
227       self->params.applyDigitalNorm = 0;
228       self->params.targetRefLevel = -1;
229     }
230     else {
231       /* ref_level must be between 0 and MAX_REFERENCE_LEVEL, inclusive */
232       self->params.applyDigitalNorm = 1;
233       if (self->params.targetRefLevel != (SCHAR)value) {
234         self->params.targetRefLevel = (SCHAR)value;
235         self->progRefLevel = (SCHAR)value;  /* Always set the program reference level equal to the
236                                                target level according to 4.5.2.7.3 of ISO/IEC 14496-3. */
237       }
238     }
239     break;
240   case APPLY_NORMALIZATION:
241     if (value < 0 || value > 1) {
242       return AAC_DEC_SET_PARAM_FAIL;
243     }
244     if (self == NULL) {
245       return AAC_DEC_INVALID_HANDLE;
246     }
247     /* Store new parameter value */
248     self->params.applyDigitalNorm = (UCHAR)value;
249     break;
250   case APPLY_HEAVY_COMPRESSION:
251     if (value < 0 || value > 1) {
252       return AAC_DEC_SET_PARAM_FAIL;
253     }
254     if (self == NULL) {
255       return AAC_DEC_INVALID_HANDLE;
256     }
257     if (self->params.applyHeavyCompression != (UCHAR)value) {
258       if (value == 1) {
259         /* Disable scaling of DRC values by setting the max values */
260         self->params.boost = FL2FXCONST_DBL(1.0f/(float)(1<<DRC_PARAM_SCALE));
261         self->params.cut   = FL2FXCONST_DBL(1.0f/(float)(1<<DRC_PARAM_SCALE));
262       } else {
263         /* Restore the user params */
264         self->params.boost = self->params.usrBoost;
265         self->params.cut   = self->params.usrCut;
266       }
267       /* Store new parameter value */
268       self->params.applyHeavyCompression = (UCHAR)value;
269     }
270     break;
271   case DRC_BS_DELAY:
272     if (value < 0 || value > 1) {
273       return AAC_DEC_SET_PARAM_FAIL;
274     }
275     if (self == NULL) {
276       return AAC_DEC_INVALID_HANDLE;
277     }
278     self->params.bsDelayEnable = value;
279     break;
280   case DRC_DATA_EXPIRY_FRAME:
281     if (self == NULL) {
282       return AAC_DEC_INVALID_HANDLE;
283     }
284     self->params.expiryFrame = (UINT)value;
285     break;
286   default:
287     return AAC_DEC_SET_PARAM_FAIL;
288   }  /* switch(param) */
289 
290   /* switch on/off processing */
291   self->enable = ( (self->params.boost > (FIXP_DBL)0)
292                 || (self->params.cut   > (FIXP_DBL)0)
293                 || (self->params.applyHeavyCompression != 0)
294                 || (self->params.targetRefLevel >= 0) );
295 
296 
297   return ErrorStatus;
298 }
299 
300 
parseExcludedChannels(UINT * excludedChnsMask,HANDLE_FDK_BITSTREAM bs)301 static int parseExcludedChannels( UINT *excludedChnsMask,
302                                   HANDLE_FDK_BITSTREAM bs )
303 {
304   UINT excludeMask = 0;
305   UINT i, j;
306   int  bitCnt = 9;
307 
308   for (i = 0, j = 1; i < 7; i++, j<<=1) {
309     if (FDKreadBits(bs,1)) {
310       excludeMask |= j;
311     }
312   }
313 
314   /* additional_excluded_chns */
315   while (FDKreadBits(bs,1)) {
316     for (i = 0; i < 7; i++, j<<=1) {
317       if (FDKreadBits(bs,1)) {
318         excludeMask |= j;
319       }
320     }
321     bitCnt += 9;
322     FDK_ASSERT(j < (UINT)-1);
323   }
324 
325   *excludedChnsMask = excludeMask;
326 
327   return (bitCnt);
328 }
329 
330 
331 /*!
332   \brief Save DRC payload bitstream position
333 
334   \self Handle of DRC info
335   \bs Handle of FDK bitstream
336 
337   \return The number of DRC payload bits
338 */
aacDecoder_drcMarkPayload(HANDLE_AAC_DRC self,HANDLE_FDK_BITSTREAM bs,AACDEC_DRC_PAYLOAD_TYPE type)339 int aacDecoder_drcMarkPayload (
340     HANDLE_AAC_DRC self,
341     HANDLE_FDK_BITSTREAM bs,
342     AACDEC_DRC_PAYLOAD_TYPE type )
343 {
344   UINT bsStartPos;
345   int  i, numBands = 1, bitCnt = 0;
346 
347   if (self == NULL) {
348     return 0;
349   }
350 
351   bsStartPos = FDKgetValidBits(bs);
352 
353   switch (type) {
354     case MPEG_DRC_EXT_DATA:
355     {
356       bitCnt = 4;
357 
358       if (FDKreadBits(bs,1)) {          /* pce_tag_present */
359         FDKreadBits(bs,8);              /* pce_instance_tag + drc_tag_reserved_bits */
360         bitCnt+=8;
361       }
362 
363       if (FDKreadBits(bs,1)) {          /* excluded_chns_present */
364         FDKreadBits(bs,7);              /* exclude mask [0..7] */
365         bitCnt+=8;
366         while (FDKreadBits(bs,1)) {     /* additional_excluded_chns */
367           FDKreadBits(bs,7);            /* exclude mask [x..y] */
368           bitCnt+=8;
369         }
370       }
371 
372       if (FDKreadBits(bs,1)) {          /* drc_bands_present */
373         numBands += FDKreadBits(bs, 4); /* drc_band_incr */
374         FDKreadBits(bs,4);              /* reserved */
375         bitCnt+=8;
376         for (i = 0; i < numBands; i++) {
377           FDKreadBits(bs,8);            /* drc_band_top[i] */
378           bitCnt+=8;
379         }
380       }
381 
382       if (FDKreadBits(bs,1)) {          /* prog_ref_level_present */
383         FDKreadBits(bs,8);              /* prog_ref_level + prog_ref_level_reserved_bits */
384         bitCnt+=8;
385       }
386 
387       for (i = 0; i < numBands; i++) {
388         FDKreadBits(bs,8);              /* dyn_rng_sgn[i] + dyn_rng_ctl[i] */
389         bitCnt+=8;
390       }
391 
392       if ( (self->numPayloads < MAX_DRC_THREADS)
393         && ((INT)FDKgetValidBits(bs) >= 0) )
394       {
395         self->drcPayloadPosition[self->numPayloads++] = bsStartPos;
396       }
397     }
398     break;
399 
400     case DVB_DRC_ANC_DATA:
401       bitCnt += 8;
402       /* check sync word */
403       if (FDKreadBits(bs, 8) == DVB_ANC_DATA_SYNC_BYTE)
404       {
405         int dmxLevelsPresent, compressionPresent;
406         int coarseGrainTcPresent, fineGrainTcPresent;
407 
408         /* bs_info field */
409         FDKreadBits(bs, 8);                          /* mpeg_audio_type, dolby_surround_mode, presentation_mode */
410         bitCnt+=8;
411 
412         /* Evaluate ancillary_data_status */
413         FDKreadBits(bs, 3);                          /* reserved, set to 0 */
414         dmxLevelsPresent = FDKreadBits(bs, 1);       /* downmixing_levels_MPEG4_status */
415         FDKreadBits(bs, 1);                          /* reserved, set to 0 */
416         compressionPresent   = FDKreadBits(bs, 1);   /* audio_coding_mode_and_compression status */
417         coarseGrainTcPresent = FDKreadBits(bs, 1);   /* coarse_grain_timecode_status */
418         fineGrainTcPresent   = FDKreadBits(bs, 1);   /* fine_grain_timecode_status */
419         bitCnt+=8;
420 
421         /* MPEG4 downmixing levels */
422         if (dmxLevelsPresent) {
423           FDKreadBits(bs, 8);                        /* downmixing_levels_MPEG4 */
424           bitCnt+=8;
425         }
426         /* audio coding mode and compression status */
427         if (compressionPresent) {
428           FDKreadBits(bs, 16);                        /* audio_coding_mode, Compression_value */
429           bitCnt+=16;
430         }
431         /* coarse grain timecode */
432         if (coarseGrainTcPresent) {
433           FDKreadBits(bs, 16);                       /* coarse_grain_timecode */
434           bitCnt+=16;
435         }
436         /* fine grain timecode */
437         if (fineGrainTcPresent) {
438           FDKreadBits(bs, 16);                       /* fine_grain_timecode */
439           bitCnt+=16;
440         }
441         if ( !self->dvbAncDataAvailable
442           && ((INT)FDKgetValidBits(bs) >= 0) )
443         {
444           self->dvbAncDataPosition  = bsStartPos;
445           self->dvbAncDataAvailable = 1;
446         }
447       }
448       break;
449 
450     default:
451       break;
452   }
453 
454   return (bitCnt);
455 }
456 
457 
458 /*!
459   \brief Parse DRC parameters from bitstream
460 
461   \bs Handle of FDK bitstream (in)
462   \pDrcBs Pointer to DRC payload data container (out)
463   \payloadPosition Bitstream position of MPEG DRC data junk (in)
464 
465   \return Number of bits read (0 in case of a parse error)
466 */
aacDecoder_drcParse(HANDLE_FDK_BITSTREAM bs,CDrcPayload * pDrcBs,UINT payloadPosition)467 static int aacDecoder_drcParse (
468     HANDLE_FDK_BITSTREAM  bs,
469     CDrcPayload          *pDrcBs,
470     UINT                  payloadPosition )
471 {
472   int i, numBands, bitCnt = 4;
473 
474   /* Move to the beginning of the DRC payload field */
475   FDKpushBiDirectional(bs, FDKgetValidBits(bs)-payloadPosition);
476 
477   /* pce_tag_present */
478   if (FDKreadBits(bs,1))
479   {
480     pDrcBs->pceInstanceTag = FDKreadBits(bs, 4);  /* pce_instance_tag */
481     /* only one program supported */
482     FDKreadBits(bs, 4);  /* drc_tag_reserved_bits */
483     bitCnt += 8;
484   } else {
485     pDrcBs->pceInstanceTag = -1;  /* not present */
486   }
487 
488   if (FDKreadBits(bs,1)) {        /* excluded_chns_present */
489     /* get excluded_chn_mask */
490     bitCnt += parseExcludedChannels(&pDrcBs->excludedChnsMask, bs);
491   } else {
492     pDrcBs->excludedChnsMask = 0;
493   }
494 
495   numBands = 1;
496   if (FDKreadBits(bs,1))  /* drc_bands_present */
497   {
498     /* get band_incr */
499     numBands += FDKreadBits(bs, 4);  /* drc_band_incr */
500     pDrcBs->channelData.drcInterpolationScheme = FDKreadBits(bs, 4);  /* drc_interpolation_scheme */
501     bitCnt += 8;
502     /* band_top */
503     for (i = 0; i < numBands; i++)
504     {
505       pDrcBs->channelData.bandTop[i] = FDKreadBits(bs, 8);  /* drc_band_top[i] */
506       bitCnt += 8;
507     }
508   }
509   else {
510     pDrcBs->channelData.bandTop[0] = (1024 >> 2) - 1;  /* ... comprising the whole spectrum. */;
511   }
512 
513   pDrcBs->channelData.numBands = numBands;
514 
515   if (FDKreadBits(bs,1))                        /* prog_ref_level_present */
516   {
517     pDrcBs->progRefLevel = FDKreadBits(bs, 7);  /* prog_ref_level */
518     FDKreadBits(bs, 1);                         /* prog_ref_level_reserved_bits */
519     bitCnt += 8;
520   } else {
521     pDrcBs->progRefLevel = -1;
522   }
523 
524   for (i = 0; i < numBands; i++)
525   {
526     pDrcBs->channelData.drcValue[i]  = FDKreadBits(bs, 1) << 7;   /* dyn_rng_sgn[i] */
527     pDrcBs->channelData.drcValue[i] |= FDKreadBits(bs, 7) & 0x7F; /* dyn_rng_ctl[i] */
528     bitCnt += 8;
529   }
530 
531   /* Set DRC payload type */
532   pDrcBs->channelData.drcDataType = MPEG_DRC_EXT_DATA;
533 
534   return (bitCnt);
535 }
536 
537 
538 /*!
539   \brief Parse heavy compression value transported in DSEs of DVB streams with MPEG-4 content.
540 
541   \bs Handle of FDK bitstream (in)
542   \pDrcBs Pointer to DRC payload data container (out)
543   \payloadPosition Bitstream position of DVB ancillary data junk
544 
545   \return Number of bits read (0 in case of a parse error)
546 */
547 #define DVB_COMPRESSION_SCALE   ( 8 )       /* 48,164 dB */
548 
aacDecoder_drcReadCompression(HANDLE_FDK_BITSTREAM bs,CDrcPayload * pDrcBs,UINT payloadPosition)549 static int aacDecoder_drcReadCompression (
550     HANDLE_FDK_BITSTREAM  bs,
551     CDrcPayload          *pDrcBs,
552     UINT                  payloadPosition )
553 {
554   int  bitCnt = 0;
555   int  dmxLevelsPresent, extensionPresent, compressionPresent;
556   int  coarseGrainTcPresent, fineGrainTcPresent;
557 
558   /* Move to the beginning of the DRC payload field */
559   FDKpushBiDirectional(bs, FDKgetValidBits(bs)-payloadPosition);
560 
561   /* Sanity checks */
562   if ( FDKgetValidBits(bs) < 24 ) {
563     return 0;
564   }
565 
566   /* Check sync word */
567   if (FDKreadBits(bs, 8) != DVB_ANC_DATA_SYNC_BYTE) {
568     return 0;
569   }
570 
571   /* Evaluate bs_info field */
572   if (FDKreadBits(bs, 2) != 3) {               /* mpeg_audio_type */
573     /* No MPEG-4 audio data */
574     return 0;
575   }
576   FDKreadBits(bs, 2);                          /* dolby_surround_mode */
577   pDrcBs->presMode = FDKreadBits(bs, 2);       /* presentation_mode */
578   FDKreadBits(bs, 1);                          /* stereo_downmix_mode */
579   if (FDKreadBits(bs, 1) != 0) {               /* reserved, set to 0 */
580     return 0;
581   }
582 
583   /* Evaluate ancillary_data_status */
584   if (FDKreadBits(bs, 3) != 0) {               /* reserved, set to 0 */
585     return 0;
586   }
587   dmxLevelsPresent = FDKreadBits(bs, 1);       /* downmixing_levels_MPEG4_status */
588   extensionPresent = FDKreadBits(bs, 1);       /* ancillary_data_extension_status; */
589   compressionPresent   = FDKreadBits(bs, 1);   /* audio_coding_mode_and_compression status */
590   coarseGrainTcPresent = FDKreadBits(bs, 1);   /* coarse_grain_timecode_status */
591   fineGrainTcPresent   = FDKreadBits(bs, 1);   /* fine_grain_timecode_status */
592   bitCnt += 24;
593 
594   if (dmxLevelsPresent) {
595     FDKreadBits(bs, 8);                        /* downmixing_levels_MPEG4 */
596     bitCnt += 8;
597   }
598 
599   /* audio_coding_mode_and_compression_status */
600   if (compressionPresent)
601   {
602     UCHAR compressionOn, compressionValue;
603 
604     /* audio_coding_mode */
605     if ( FDKreadBits(bs, 7) != 0 ) {  /* The reserved bits shall be set to "0". */
606       return 0;
607     }
608     compressionOn    = (UCHAR)FDKreadBits(bs, 1);  /* compression_on */
609     compressionValue = (UCHAR)FDKreadBits(bs, 8);  /* Compression_value */
610     bitCnt += 16;
611 
612     if ( compressionOn ) {
613       /* A compression value is available so store the data just like MPEG DRC data */
614       pDrcBs->channelData.numBands    =  1;                            /* One band ... */
615       pDrcBs->channelData.drcValue[0] =  compressionValue;             /* ... with one value ... */
616       pDrcBs->channelData.bandTop[0]  = (1024 >> 2) - 1;  /* ... comprising the whole spectrum. */
617       pDrcBs->pceInstanceTag          = -1;                            /* Not present */
618       pDrcBs->progRefLevel            = -1;                            /* Not present */
619       pDrcBs->channelData.drcDataType =  DVB_DRC_ANC_DATA;             /* Set DRC payload type to DVB. */
620     } else {
621       /* No compression value available */
622       /* CAUTION: It is not clearly defined by standard how to react in this situation. */
623       /* Turn down the compression value to aprox. 0dB */
624       pDrcBs->channelData.numBands    =  1;                            /* One band ... */
625       pDrcBs->channelData.drcValue[0] =  0x80;                         /* ... with aprox. 0dB ... */
626       pDrcBs->channelData.bandTop[0]  = (1024 >> 2) - 1;  /* ... comprising the whole spectrum. */
627       pDrcBs->channelData.drcDataType =  DVB_DRC_ANC_DATA;             /* Set DRC payload type to DVB. */
628 
629       /* If compression_on field is set to "0" the compression_value field shall be "0000 0000". */
630       if (compressionValue != 0) {
631         return 0;
632       }
633     }
634   }
635 
636   /* Read timecodes if available just to get the right amount of bits. */
637   if (coarseGrainTcPresent) {
638     FDKreadBits(bs, 16);      /* coarse_grain_timecode */
639     bitCnt += 16;
640   }
641   if (fineGrainTcPresent) {
642     FDKreadBits(bs, 16);      /* fine_grain_timecode */
643     bitCnt += 16;
644   }
645 
646   /* Read extension just to get the right amount of bits. */
647   if (extensionPresent) {
648     int  extBits = 8;
649 
650     FDKreadBits(bs, 1);                     /* reserved, set to 0 */
651     if (FDKreadBits(bs, 1)) extBits += 8;   /* ext_downmixing_levels_status */
652     if (FDKreadBits(bs, 1)) extBits += 16;  /* ext_downmixing_global_gains_status */
653     if (FDKreadBits(bs, 1)) extBits += 8;   /* ext_downmixing_lfe_level_status */
654 
655     FDKpushFor(bs, extBits - 4);            /* skip the extension payload remainder. */
656     bitCnt += extBits;
657   }
658 
659   return (bitCnt);
660 }
661 
662 
663 /*
664  * Prepare DRC processing
665  */
aacDecoder_drcExtractAndMap(HANDLE_AAC_DRC self,HANDLE_FDK_BITSTREAM hBs,CAacDecoderStaticChannelInfo * pAacDecoderStaticChannelInfo[],UCHAR pceInstanceTag,UCHAR channelMapping[],int validChannels)666 static int aacDecoder_drcExtractAndMap (
667         HANDLE_AAC_DRC  self,
668         HANDLE_FDK_BITSTREAM hBs,
669         CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[],
670         UCHAR  pceInstanceTag,
671         UCHAR  channelMapping[], /* Channel mapping translating drcChannel index to canonical channel index */
672         int    validChannels )
673 {
674   CDrcPayload  threadBs[MAX_DRC_THREADS];
675   CDrcPayload *validThreadBs[MAX_DRC_THREADS];
676   CDrcParams  *pParams;
677   UINT backupBsPosition;
678   int  i, thread, validThreads = 0;
679   int  numExcludedChns[MAX_DRC_THREADS];
680 
681   FDK_ASSERT(self != NULL);
682   FDK_ASSERT(hBs != NULL);
683   FDK_ASSERT(pAacDecoderStaticChannelInfo != NULL);
684 
685   pParams = &self->params;
686 
687   self->numThreads = 0;
688   backupBsPosition = FDKgetValidBits(hBs);
689 
690   for (i = 0; i < self->numPayloads && self->numThreads < MAX_DRC_THREADS; i++) {
691     int bitsParsed;
692 
693     /* Init payload data chunk. The memclear is very important because it initializes
694        the most values. Without it the module wouldn't work properly or crash. */
695     FDKmemclear(&threadBs[self->numThreads], sizeof(CDrcPayload));
696     threadBs[self->numThreads].channelData.bandTop[0]  = (1024 >> 2) - 1;
697 
698     /* Extract payload */
699     bitsParsed = aacDecoder_drcParse( hBs,
700                                      &threadBs[self->numThreads],
701                                       self->drcPayloadPosition[i] );
702     if (bitsParsed > 0) {
703       self->numThreads++;
704     }
705   }
706   self->numPayloads = 0;
707 
708   if (self->dvbAncDataAvailable)
709   { /* Append a DVB heavy compression payload thread if available. */
710     int bitsParsed;
711 
712     /* Init payload data chunk. The memclear is very important because it initializes
713        the most values. Without it the module wouldn't work properly or crash. */
714     FDKmemclear(&threadBs[self->numThreads], sizeof(CDrcPayload));
715     threadBs[self->numThreads].channelData.bandTop[0]  = (1024 >> 2) - 1;
716 
717     /* Extract payload */
718     bitsParsed = aacDecoder_drcReadCompression( hBs,
719                                                &threadBs[self->numThreads],
720                                                 self->dvbAncDataPosition );
721     if (bitsParsed > 0) {
722       self->numThreads++;
723     }
724   }
725   self->dvbAncDataAvailable = 0;
726 
727   /* Reset the bitbufffer */
728   FDKpushBiDirectional(hBs, FDKgetValidBits(hBs) - backupBsPosition);
729 
730   /* calculate number of valid bits in excl_chn_mask */
731 
732   /* coupling channels not supported */
733 
734   /* check for valid threads */
735   for (thread = 0; thread < self->numThreads; thread++) {
736     CDrcPayload *pThreadBs = &threadBs[thread];
737     int numExclChns = 0;
738 
739     switch ((AACDEC_DRC_PAYLOAD_TYPE)pThreadBs->channelData.drcDataType) {
740       default:
741         continue;
742       case MPEG_DRC_EXT_DATA:
743       case DVB_DRC_ANC_DATA:
744         break;
745     }
746 
747     if (pThreadBs->pceInstanceTag >= 0) {  /* if PCE tag present */
748       if (pThreadBs->pceInstanceTag != pceInstanceTag) {
749         continue;  /* don't accept */
750       }
751     }
752 
753     /* calculate number of excluded channels */
754     if (pThreadBs->excludedChnsMask > 0) {
755       INT exclMask = pThreadBs->excludedChnsMask;
756       int ch;
757       for (ch = 0; ch < validChannels; ch++) {
758         numExclChns += exclMask & 0x1;
759         exclMask >>= 1;
760       }
761     }
762     if (numExclChns < validChannels) {
763       validThreadBs[validThreads]   = pThreadBs;
764       numExcludedChns[validThreads] = numExclChns;
765       validThreads++;
766     }
767   }
768 
769   if (validThreads > 1) {
770     int ch;
771 
772     /* check consistency of excl_chn_mask amongst valid DRC threads */
773     for (ch = 0; ch < validChannels; ch++) {
774       int present = 0;
775 
776       for (thread = 0; thread < validThreads; thread++) {
777         CDrcPayload *pThreadBs = validThreadBs[thread];
778 
779 
780         /* thread applies to this channel */
781         if ( (pThreadBs->channelData.drcDataType == MPEG_DRC_EXT_DATA)
782           && ( (numExcludedChns[thread] == 0)
783             || (!(pThreadBs->excludedChnsMask & (1<<ch))) ) ) {
784           present++;
785         }
786       }
787 
788 
789       if (present > 1) {
790         return -1;
791       }
792     }
793   }
794 
795   /* map DRC bitstream information onto DRC channel information */
796   for (thread = 0; thread < validThreads; thread++)
797   {
798     CDrcPayload *pThreadBs = validThreadBs[thread];
799     INT exclMask = pThreadBs->excludedChnsMask;
800     AACDEC_DRC_PAYLOAD_TYPE drcPayloadType = (AACDEC_DRC_PAYLOAD_TYPE)pThreadBs->channelData.drcDataType;
801     int ch;
802 
803     /* last progRefLevel transmitted is the one that is used
804      * (but it should really only be transmitted once per block!)
805      */
806     if (pThreadBs->progRefLevel >= 0) {
807       self->progRefLevel = pThreadBs->progRefLevel;
808       self->progRefLevelPresent = 1;
809       self->prlExpiryCount = 0;  /* Got a new value -> Reset counter */
810     }
811 
812     if (drcPayloadType == DVB_DRC_ANC_DATA) {
813       /* Announce the presentation mode of this valid thread. */
814       self->presMode = pThreadBs->presMode;
815     }
816 
817     /* SCE, CPE and LFE */
818     for (ch = 0; ch < validChannels; ch++) {
819       int mapedChannel = channelMapping[ch];
820 
821       if ( ((exclMask & (1<<mapedChannel)) == 0)
822         && ( (drcPayloadType == MPEG_DRC_EXT_DATA)
823           || ((drcPayloadType == DVB_DRC_ANC_DATA) && self->params.applyHeavyCompression)
824          ) ) {
825         /* copy thread to channel */
826         pAacDecoderStaticChannelInfo[ch]->drcData = pThreadBs->channelData;
827       }
828     }
829     /* CCEs not supported by now */
830   }
831 
832   /* Increment and check expiry counter for the program reference level: */
833   if ( (pParams->expiryFrame > 0)
834     && (self->prlExpiryCount++ > pParams->expiryFrame) )
835   { /* The program reference level is too old, so set it back to the target level. */
836     self->progRefLevelPresent = 0;
837     self->progRefLevel = pParams->targetRefLevel;
838     self->prlExpiryCount = 0;
839   }
840 
841   return 0;
842 }
843 
844 
aacDecoder_drcApply(HANDLE_AAC_DRC self,void * pSbrDec,CAacDecoderChannelInfo * pAacDecoderChannelInfo,CDrcChannelData * pDrcChData,FIXP_DBL * extGain,int ch,int aacFrameSize,int bSbrPresent)845 void aacDecoder_drcApply (
846         HANDLE_AAC_DRC          self,
847         void                   *pSbrDec,
848         CAacDecoderChannelInfo *pAacDecoderChannelInfo,
849         CDrcChannelData        *pDrcChData,
850         FIXP_DBL               *extGain,
851         int  ch,   /* needed only for SBR */
852         int  aacFrameSize,
853         int  bSbrPresent )
854 {
855   int band, top, bin, numBands;
856   int bottom = 0;
857   int modifyBins = 0;
858 
859   FIXP_DBL max_mantissa;
860   INT max_exponent;
861 
862   FIXP_DBL norm_mantissa = FL2FXCONST_DBL(0.5f);
863   INT  norm_exponent = 1;
864 
865   FIXP_DBL fact_mantissa[MAX_DRC_BANDS];
866   INT  fact_exponent[MAX_DRC_BANDS];
867 
868   CDrcParams  *pParams = &self->params;
869 
870   FIXP_DBL    *pSpectralCoefficient  =  SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient);
871   CIcsInfo    *pIcsInfo              = &pAacDecoderChannelInfo->icsInfo;
872   SHORT       *pSpecScale            =  pAacDecoderChannelInfo->specScale;
873 
874   int winSeq = pIcsInfo->WindowSequence;
875 
876   /* Increment and check expiry counter */
877   if ( (pParams->expiryFrame > 0)
878     && (++pDrcChData->expiryCount > pParams->expiryFrame) )
879   { /* The DRC data is too old, so delete it. */
880     aacDecoder_drcInitChannelData( pDrcChData );
881   }
882 
883   if (!self->enable) {
884     sbrDecoder_drcDisable( (HANDLE_SBRDECODER)pSbrDec, ch );
885     if (extGain != NULL) {
886       INT gainScale = (INT)*extGain;
887       /* The gain scaling must be passed to the function in the buffer pointed on by extGain. */
888       if (gainScale >= 0 && gainScale <= DFRACT_BITS) {
889         *extGain = scaleValue(norm_mantissa, norm_exponent-gainScale);
890       } else {
891         FDK_ASSERT(0);
892       }
893     }
894     return;
895   }
896 
897   numBands = pDrcChData->numBands;
898   top = FDKmax(0, numBands-1);
899 
900   pDrcChData->bandTop[0] = fixMin(pDrcChData->bandTop[0], (aacFrameSize >> 2) - 1);
901 
902   /* If program reference normalization is done in the digital domain,
903   modify factor to perform normalization.  prog_ref_level can
904   alternatively be passed to the system for modification of the level in
905   the analog domain.  Analog level modification avoids problems with
906   reduced DAC SNR (if signal is attenuated) or clipping (if signal is
907   boosted) */
908 
909   if (pParams->targetRefLevel >= 0)
910   {
911     /* 0.5^((targetRefLevel - progRefLevel)/24) */
912     norm_mantissa = fLdPow(
913             FL2FXCONST_DBL(-1.0), /* log2(0.5) */
914             0,
915             (FIXP_DBL)((INT)(FL2FXCONST_DBL(1.0f/24.0)>>3) * (INT)(pParams->targetRefLevel-self->progRefLevel)),
916             3,
917            &norm_exponent );
918   }
919   /* Always export the normalization gain (if possible). */
920   if (extGain != NULL) {
921     INT gainScale = (INT)*extGain;
922     /* The gain scaling must be passed to the function in the buffer pointed on by extGain. */
923     if (gainScale >= 0 && gainScale <= DFRACT_BITS) {
924       *extGain = scaleValue(norm_mantissa, norm_exponent-gainScale);
925     } else {
926       FDK_ASSERT(0);
927     }
928   }
929   if (self->params.applyDigitalNorm == 0) {
930     /* Reset normalization gain since this module must not apply it */
931     norm_mantissa = FL2FXCONST_DBL(0.5f);
932     norm_exponent = 1;
933   }
934 
935 
936   /* calc scale factors */
937   for (band = 0; band < numBands; band++)
938   {
939     UCHAR drcVal = pDrcChData->drcValue[band];
940     top = fixMin((int)( (pDrcChData->bandTop[band]+1)<<2 ), aacFrameSize);
941 
942     fact_mantissa[band] = FL2FXCONST_DBL(0.5f);
943     fact_exponent[band] = 1;
944 
945     if (  pParams->applyHeavyCompression
946       && ((AACDEC_DRC_PAYLOAD_TYPE)pDrcChData->drcDataType == DVB_DRC_ANC_DATA) )
947     {
948       INT compressionFactorVal_e;
949       int valX, valY;
950 
951       valX = drcVal >> 4;
952       valY = drcVal & 0x0F;
953 
954       /* calculate the unscaled heavy compression factor.
955          compressionFactor = 48.164 - 6.0206*valX - 0.4014*valY dB
956          range: -48.166 dB to 48.164 dB */
957       if ( drcVal != 0x7F ) {
958         fact_mantissa[band] =
959           fPowInt( FL2FXCONST_DBL(0.95483867181), /* -0.4014dB = 0.95483867181 */
960                    0,
961                    valY,
962                   &compressionFactorVal_e );
963 
964         /* -0.0008dB (48.164 - 6.0206*8 = -0.0008) */
965         fact_mantissa[band] = fMult(FL2FXCONST_DBL(0.99990790084), fact_mantissa[band]);
966 
967         fact_exponent[band] = DVB_COMPRESSION_SCALE - valX + compressionFactorVal_e;
968       }
969     } else
970     if ((AACDEC_DRC_PAYLOAD_TYPE)pDrcChData->drcDataType == MPEG_DRC_EXT_DATA)
971     {
972     /* apply the scaled dynamic range control words to factor.
973      * if scaling drc_cut (or drc_boost), or control word drc_mantissa is 0
974      * then there is no dynamic range compression
975      *
976      * if pDrcChData->drcSgn[band] is
977      *  1 then gain is < 1 :  factor = 2^(-self->cut   * pDrcChData->drcMag[band] / 24)
978      *  0 then gain is > 1 :  factor = 2^( self->boost * pDrcChData->drcMag[band] / 24)
979      */
980 
981     if ((drcVal&0x7F) > 0) {
982       FIXP_DBL tParamVal = (drcVal & 0x80) ? -pParams->cut : pParams->boost;
983 
984       fact_mantissa[band] =
985         f2Pow( (FIXP_DBL)((INT)fMult(FL2FXCONST_DBL(1.0f/192.0f), tParamVal) * (drcVal&0x7F)),
986                  3+DRC_PARAM_SCALE,
987                 &fact_exponent[band] );
988     }
989     }
990 
991     fact_mantissa[band]  = fMult(fact_mantissa[band], norm_mantissa);
992     fact_exponent[band] += norm_exponent;
993 
994 
995     bottom = top;
996 
997   }  /* end loop over bands */
998 
999 
1000   /* normalizations */
1001   {
1002     int res;
1003 
1004     max_mantissa = FL2FXCONST_DBL(0.0f);
1005     max_exponent = 0;
1006     for (band = 0; band < numBands; band++) {
1007       max_mantissa = fixMax(max_mantissa, fact_mantissa[band]);
1008       max_exponent = fixMax(max_exponent, fact_exponent[band]);
1009     }
1010 
1011     /* left shift factors to gain accurancy */
1012     res = CntLeadingZeros(max_mantissa) - 1;
1013 
1014     /* above topmost DRC band gain factor is 1 */
1015     if (((pDrcChData->bandTop[numBands-1]+1)<<2) < aacFrameSize) res = 0;
1016 
1017     if (res > 0) {
1018       res = fixMin(res, max_exponent);
1019       max_exponent -= res;
1020 
1021       for (band = 0; band < numBands; band++) {
1022         fact_mantissa[band] <<= res;
1023         fact_exponent[band]  -= res;
1024       }
1025     }
1026 
1027     /* normalize magnitudes to one scale factor */
1028     for (band = 0; band < numBands; band++) {
1029       if (fact_exponent[band] < max_exponent) {
1030         fact_mantissa[band] >>= max_exponent - fact_exponent[band];
1031       }
1032       if (fact_mantissa[band] != FL2FXCONST_DBL(0.5f)) {
1033         modifyBins = 1;
1034       }
1035     }
1036     if (max_exponent != 1) {
1037       modifyBins = 1;
1038     }
1039   }
1040 
1041   /*  apply factor to spectral lines
1042    *  short blocks must take care that bands fall on
1043    *  block boundaries!
1044    */
1045   if (!bSbrPresent)
1046   {
1047     bottom = 0;
1048 
1049     if (!modifyBins) {
1050       /* We don't have to modify the spectral bins because the fractional part of all factors is 0.5.
1051          In order to keep accurancy we don't apply the factor but decrease the exponent instead. */
1052       max_exponent -= 1;
1053     } else
1054     {
1055       for (band = 0; band < numBands; band++)
1056       {
1057         top = fixMin((int)( (pDrcChData->bandTop[band]+1)<<2 ), aacFrameSize);   /* ... * DRC_BAND_MULT; */
1058 
1059         for (bin = bottom; bin < top; bin++) {
1060           pSpectralCoefficient[bin] = fMult(pSpectralCoefficient[bin], fact_mantissa[band]);
1061         }
1062 
1063         bottom = top;
1064       }
1065     }
1066 
1067     /* above topmost DRC band gain factor is 1 */
1068     if (max_exponent > 0) {
1069       for (bin = bottom; bin < aacFrameSize; bin+=1) {
1070         pSpectralCoefficient[bin] >>= max_exponent;
1071       }
1072     }
1073 
1074     /* adjust scaling */
1075     pSpecScale[0] += max_exponent;
1076 
1077     if (winSeq == EightShortSequence) {
1078       int win;
1079       for (win = 1; win < 8; win++) {
1080         pSpecScale[win] += max_exponent;
1081       }
1082     }
1083   }
1084   else {
1085     HANDLE_SBRDECODER hSbrDecoder = (HANDLE_SBRDECODER)pSbrDec;
1086     UINT numBands = pDrcChData->numBands;
1087 
1088     /* feed factors into SBR decoder for application in QMF domain. */
1089     sbrDecoder_drcFeedChannel (
1090             hSbrDecoder,
1091             ch,
1092             numBands,
1093             fact_mantissa,
1094             max_exponent,
1095             pDrcChData->drcInterpolationScheme,
1096             winSeq,
1097             pDrcChData->bandTop
1098           );
1099   }
1100 
1101   return;
1102 }
1103 
1104 
1105 /*
1106  * Prepare DRC processing
1107  */
aacDecoder_drcProlog(HANDLE_AAC_DRC self,HANDLE_FDK_BITSTREAM hBs,CAacDecoderStaticChannelInfo * pAacDecoderStaticChannelInfo[],UCHAR pceInstanceTag,UCHAR channelMapping[],int validChannels)1108 int aacDecoder_drcProlog (
1109         HANDLE_AAC_DRC  self,
1110         HANDLE_FDK_BITSTREAM hBs,
1111         CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[],
1112         UCHAR  pceInstanceTag,
1113         UCHAR  channelMapping[], /* Channel mapping translating drcChannel index to canonical channel index */
1114         int    validChannels )
1115 {
1116   int err = 0;
1117 
1118   if (self == NULL) {
1119     return -1;
1120   }
1121 
1122   if (!self->params.bsDelayEnable)
1123   {
1124     err = aacDecoder_drcExtractAndMap (
1125             self,
1126             hBs,
1127             pAacDecoderStaticChannelInfo,
1128             pceInstanceTag,
1129             channelMapping,
1130             validChannels );
1131   }
1132 
1133   return err;
1134 }
1135 
1136 
1137 /*
1138  * Finalize DRC processing
1139  */
aacDecoder_drcEpilog(HANDLE_AAC_DRC self,HANDLE_FDK_BITSTREAM hBs,CAacDecoderStaticChannelInfo * pAacDecoderStaticChannelInfo[],UCHAR pceInstanceTag,UCHAR channelMapping[],int validChannels)1140 int aacDecoder_drcEpilog (
1141         HANDLE_AAC_DRC  self,
1142         HANDLE_FDK_BITSTREAM hBs,
1143         CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[],
1144         UCHAR  pceInstanceTag,
1145         UCHAR  channelMapping[], /* Channel mapping translating drcChannel index to canonical channel index */
1146         int    validChannels )
1147 {
1148   int err = 0;
1149 
1150   if (self == NULL) {
1151     return -1;
1152   }
1153 
1154   if (self->params.bsDelayEnable)
1155   {
1156     err = aacDecoder_drcExtractAndMap (
1157             self,
1158             hBs,
1159             pAacDecoderStaticChannelInfo,
1160             pceInstanceTag,
1161             channelMapping,
1162             validChannels );
1163   }
1164 
1165   return err;
1166 }
1167 
1168 /*
1169  * Export relevant metadata info from bitstream payload.
1170  */
aacDecoder_drcGetInfo(HANDLE_AAC_DRC self,SCHAR * pPresMode,SCHAR * pProgRefLevel)1171 void aacDecoder_drcGetInfo (
1172         HANDLE_AAC_DRC  self,
1173         SCHAR          *pPresMode,
1174         SCHAR          *pProgRefLevel )
1175 {
1176   if (self != NULL) {
1177     if (pPresMode != NULL) {
1178       *pPresMode = self->presMode;
1179     }
1180     if (pProgRefLevel != NULL) {
1181       if (self->progRefLevelPresent) {
1182         *pProgRefLevel = self->progRefLevel;
1183       } else {
1184         *pProgRefLevel = -1;
1185       }
1186     }
1187   }
1188 }
1189