1
2/* -----------------------------------------------------------------------------------------------------------
3Software 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
9The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements
10the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio.
11This FDK AAC Codec software is intended to be used on a wide variety of Android devices.
12
13AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual
14audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by
15independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part
16of the MPEG specifications.
17
18Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer)
19may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners
20individually for the purpose of encoding or decoding bit streams in products that are compliant with
21the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license
22these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec
23software may already be covered under those patent licenses when it is used for those licensed purposes only.
24
25Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality,
26are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional
27applications information and documentation.
28
292.    COPYRIGHT LICENSE
30
31Redistribution and use in source and binary forms, with or without modification, are permitted without
32payment of copyright license fees provided that you satisfy the following conditions:
33
34You must retain the complete text of this software license in redistributions of the FDK AAC Codec or
35your modifications thereto in source code form.
36
37You must retain the complete text of this software license in the documentation and/or other materials
38provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form.
39You must make available free of charge copies of the complete source code of the FDK AAC Codec and your
40modifications thereto to recipients of copies in binary form.
41
42The name of Fraunhofer may not be used to endorse or promote products derived from this library without
43prior written permission.
44
45You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec
46software or your modifications thereto.
47
48Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software
49and 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
533.    NO PATENT LICENSE
54
55NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer,
56ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with
57respect to this software.
58
59You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized
60by appropriate patent licenses.
61
624.    DISCLAIMER
63
64This 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
66of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
67CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages,
68including but not limited to procurement of substitute goods or services; loss of use, data, or profits,
69or business interruption, however caused and on any theory of liability, whether in contract, strict
70liability, or tort (including negligence), arising in any way out of the use of this software, even if
71advised of the possibility of such damage.
72
735.    CONTACT INFORMATION
74
75Fraunhofer Institute for Integrated Circuits IIS
76Attention: Audio and Multimedia Departments - FDK AAC LL
77Am Wolfsmantel 33
7891058 Erlangen, Germany
79
80www.iis.fraunhofer.de/amm
81amm-info@iis.fraunhofer.de
82----------------------------------------------------------------------------------------------------------- */
83
84/*****************************  MPEG-4 AAC Decoder  **************************
85
86   Author(s):   Josef Hoepfl
87   Description:
88
89******************************************************************************/
90
91
92/*!
93  \page default General Overview of the AAC Decoder Implementation
94
95  The main entry point to decode a AAC frame is CAacDecoder_DecodeFrame(). It handles the different
96  transport multiplexes and bitstream formats supported by this implementation. It extracts the
97  AAC_raw_data_blocks from these bitstreams to further process then in the actual decoding stages.
98
99  Note: Click on a function of file in the above image to see details about the function. Also note, that
100  this is just an overview of the most important functions and not a complete call graph.
101
102  <h2>1 Bitstream deformatter</h2>
103  The basic bit stream parser function CChannelElement_Read() is called. It uses other subcalls in order
104  to parse and unpack the bitstreams. Note, that this includes huffmann decoding of the coded spectral data.
105  This operation can be computational significant specifically at higher bitrates. Optimization is likely in
106  CBlock_ReadSpectralData().
107
108  The bitstream deformatter also includes many bitfield operations. Profiling on the target will determine
109  required optimizations.
110
111  <h2>2 Actual decoding to retain the time domain output</h2>
112  The basic bitstream deformatter function CChannelElement_Decode() for CPE elements and SCE elements are called.
113  Except for the stereo processing (2.1) which is only used for CPE elements, the function calls for CPE or SCE
114  are similar, except that CPE always processes to independent channels while SCE only processes one channel.
115
116  Often there is the distinction between long blocks and short blocks. However, computational expensive functions
117  that ususally require optimization are being shared by these two groups,
118
119  <h3>2.1 Stereo processing for CPE elements</h3>
120  CChannelPairElement_Decode() first calles the joint stereo  tools in stereo.cpp when required.
121
122  <h3>2.2 Scaling of spectral data</h3>
123  CBlock_ScaleSpectralData().
124
125  <h3>2.3 Apply additional coding tools</h3>
126  ApplyTools() calles the PNS tools in case of MPEG-4 bitstreams, and TNS filtering CTns_Apply() for MPEG-2 and MPEG-4 bitstreams.
127  The function TnsFilterIIR() which is called by CTns_Apply() (2.3.1) might require some optimization.
128
129  <h2>3 Frequency-To-Time conversion</h3>
130  The filterbank is called using CBlock_FrequencyToTime() using the MDCT module from the FDK Tools
131
132*/
133
134
135
136#include "aacdecoder.h"
137
138#include "aac_rom.h"
139#include "aac_ram.h"
140#include "channel.h"
141#include "FDK_audio.h"
142
143#include "FDK_tools_rom.h"
144
145  #include "aacdec_pns.h"
146
147  #include "sbrdecoder.h"
148
149
150
151
152  #include "aacdec_hcr.h"
153  #include "rvlc.h"
154
155
156#include "tpdec_lib.h"
157
158#include "conceal.h"
159
160
161
162#define CAN_DO_PS(aot) \
163  ((aot) == AOT_AAC_LC \
164|| (aot) == AOT_SBR \
165|| (aot) == AOT_PS \
166|| (aot) == AOT_ER_BSAC \
167|| (aot) == AOT_DRM_AAC)
168
169#define IS_USAC(aot) \
170  ((aot) == AOT_USAC \
171|| (aot) == AOT_RSVD50)
172
173#define IS_LOWDELAY(aot) \
174  ((aot) == AOT_ER_AAC_LD \
175|| (aot) == AOT_ER_AAC_ELD)
176
177void CAacDecoder_SyncQmfMode(HANDLE_AACDECODER self)
178{
179
180  /* Assign user requested mode */
181  self->qmfModeCurr = self->qmfModeUser;
182
183  if ( self->qmfModeCurr == NOT_DEFINED )
184  {
185    if ( (IS_LOWDELAY(self->streamInfo.aot) && (self->flags & AC_MPS_PRESENT))
186      || ( (self->ascChannels == 1)
187        && ( (CAN_DO_PS(self->streamInfo.aot) && !(self->flags & AC_MPS_PRESENT))
188          || (  IS_USAC(self->streamInfo.aot) &&  (self->flags & AC_MPS_PRESENT)) ) ) )
189    {
190      self->qmfModeCurr = MODE_HQ;
191    } else {
192      self->qmfModeCurr = MODE_LP;
193    }
194  }
195
196
197  /* Set SBR to current QMF mode. Error does not matter. */
198  sbrDecoder_SetParam(self->hSbrDecoder, SBR_QMF_MODE, (self->qmfModeCurr == MODE_LP));
199  self->psPossible = ((CAN_DO_PS(self->streamInfo.aot) && self->aacChannels == 1 && ! (self->flags & AC_MPS_PRESENT))) && self->qmfModeCurr == MODE_HQ ;
200  FDK_ASSERT( ! ( (self->flags & AC_MPS_PRESENT) && self->psPossible ) );
201}
202
203void CAacDecoder_SignalInterruption(HANDLE_AACDECODER self)
204{
205}
206
207/*!
208  \brief Reset ancillary data struct. Call before parsing a new frame.
209
210  \ancData Pointer to ancillary data structure
211
212  \return  Error code
213*/
214static AAC_DECODER_ERROR CAacDecoder_AncDataReset(CAncData *ancData)
215{
216  int i;
217  for (i=0; i<8; i++)
218  {
219    ancData->offset[i] = 0;
220  }
221  ancData->nrElements = 0;
222
223  return AAC_DEC_OK;
224}
225
226/*!
227  \brief Initialize ancillary buffer
228
229  \ancData Pointer to ancillary data structure
230  \buffer Pointer to (external) anc data buffer
231  \size Size of the buffer pointed on by buffer in bytes
232
233  \return  Error code
234*/
235AAC_DECODER_ERROR CAacDecoder_AncDataInit(CAncData *ancData, unsigned char *buffer, int size)
236{
237  if (size >= 0) {
238    ancData->buffer = buffer;
239    ancData->bufferSize = size;
240
241    CAacDecoder_AncDataReset(ancData);
242
243    return AAC_DEC_OK;
244  }
245
246  return AAC_DEC_ANC_DATA_ERROR;
247}
248
249/*!
250  \brief Get one ancillary data element
251
252  \ancData Pointer to ancillary data structure
253  \index Index of the anc data element to get
254  \ptr Pointer to a buffer receiving a pointer to the requested anc data element
255  \size Pointer to a buffer receiving the length of the requested anc data element in bytes
256
257  \return  Error code
258*/
259AAC_DECODER_ERROR CAacDecoder_AncDataGet(CAncData *ancData, int index, unsigned char **ptr, int *size)
260{
261  AAC_DECODER_ERROR error = AAC_DEC_OK;
262
263  *ptr  = NULL;
264  *size = 0;
265
266  if (index >= 0 && index < 8 && index < ancData->nrElements)
267  {
268    *ptr  = &ancData->buffer[ancData->offset[index]];
269    *size = ancData->offset[index+1] - ancData->offset[index];
270  }
271
272  return error;
273}
274
275
276/*!
277  \brief Parse ancillary data
278
279  \ancData Pointer to ancillary data structure
280  \hBs Handle to FDK bitstream
281  \ancBytes Length of ancillary data to read from the bitstream
282
283  \return  Error code
284*/
285static
286AAC_DECODER_ERROR CAacDecoder_AncDataParse (
287                                             CAncData *ancData,
288                                             HANDLE_FDK_BITSTREAM hBs,
289                                             const int ancBytes )
290{
291  AAC_DECODER_ERROR error = AAC_DEC_OK;
292  int readBytes = 0;
293
294  if (ancData->buffer != NULL)
295  {
296    if (ancBytes > 0) {
297      /* write ancillary data to external buffer */
298      int offset = ancData->offset[ancData->nrElements];
299
300      if ((offset + ancBytes) > ancData->bufferSize)
301      {
302        error = AAC_DEC_TOO_SMALL_ANC_BUFFER;
303      }
304      else if (ancData->nrElements >= 8-1)
305      {
306        error = AAC_DEC_TOO_MANY_ANC_ELEMENTS;
307      }
308      else
309      {
310        int i;
311
312        for (i = 0; i < ancBytes; i++) {
313          ancData->buffer[i+offset] = FDKreadBits(hBs, 8);
314          readBytes++;
315        }
316
317        ancData->nrElements++;
318        ancData->offset[ancData->nrElements] = ancBytes + ancData->offset[ancData->nrElements-1];
319      }
320    }
321  }
322
323  readBytes = ancBytes - readBytes;
324
325  if (readBytes > 0) {
326    /* skip data */
327    FDKpushFor(hBs, readBytes<<3);
328  }
329
330  return error;
331}
332
333/*!
334  \brief Read Stream Data Element
335
336  \bs Bitstream Handle
337
338  \return  Error code
339*/
340static AAC_DECODER_ERROR CDataStreamElement_Read (
341                                                  HANDLE_FDK_BITSTREAM bs,
342                                                  CAncData *ancData,
343                                                  HANDLE_AAC_DRC hDrcInfo,
344                                                  HANDLE_TRANSPORTDEC pTp,
345                                                  UCHAR    *elementInstanceTag,
346                                                  UINT      alignmentAnchor )
347{
348  AAC_DECODER_ERROR error = AAC_DEC_OK;
349  UINT dataStart;
350  int dataByteAlignFlag, count;
351
352  int crcReg = transportDec_CrcStartReg(pTp, 0);
353
354  /* Element Instance Tag */
355  *elementInstanceTag = FDKreadBits(bs,4);
356  /* Data Byte Align Flag */
357  dataByteAlignFlag = FDKreadBits(bs,1);
358
359  count = FDKreadBits(bs,8);
360
361  if (count == 255) {
362    count += FDKreadBits(bs,8); /* EscCount */
363  }
364
365  if (dataByteAlignFlag) {
366    FDKbyteAlign(bs, alignmentAnchor);
367  }
368
369  dataStart = FDKgetValidBits(bs);
370
371  error = CAacDecoder_AncDataParse(ancData, bs, count);
372  transportDec_CrcEndReg(pTp, crcReg);
373
374  {
375    INT readBits, dataBits = count<<3;
376
377    /* Move to the beginning of the data junk */
378    FDKpushBack(bs, dataStart-FDKgetValidBits(bs));
379
380    /* Read Anc data if available */
381    readBits = aacDecoder_drcMarkPayload( hDrcInfo, bs, DVB_DRC_ANC_DATA );
382
383    if (readBits != dataBits) {
384      /* Move to the end again. */
385      FDKpushBiDirectional(bs, FDKgetValidBits(bs)-dataStart+dataBits);
386    }
387  }
388
389  return error;
390}
391
392#ifdef TP_PCE_ENABLE
393/*!
394  \brief Read Program Config Element
395
396  \bs Bitstream Handle
397  \count Pointer to program config element.
398
399  \return  Error code
400*/
401static AAC_DECODER_ERROR CProgramConfigElement_Read (
402    HANDLE_FDK_BITSTREAM bs,
403    HANDLE_TRANSPORTDEC  pTp,
404    CProgramConfig      *pce,
405    UINT                 channelConfig,
406    UINT                 alignAnchor )
407{
408  AAC_DECODER_ERROR error = AAC_DEC_OK;
409  int crcReg;
410
411  /* read PCE to temporal buffer first */
412  C_ALLOC_SCRATCH_START(tmpPce, CProgramConfig, 1);
413
414  CProgramConfig_Init(tmpPce);
415  CProgramConfig_Reset(tmpPce);
416
417  crcReg = transportDec_CrcStartReg(pTp, 0);
418
419  CProgramConfig_Read(tmpPce, bs, alignAnchor);
420
421  transportDec_CrcEndReg(pTp, crcReg);
422
423  if (  CProgramConfig_IsValid(tmpPce)
424    && ( (channelConfig == 6 && (tmpPce->NumChannels == 6))
425      || (channelConfig == 5 && (tmpPce->NumChannels == 5))
426      || (channelConfig == 0 && (tmpPce->NumChannels == pce->NumChannels)) )
427    && (tmpPce->NumFrontChannelElements == 2)
428    && (tmpPce->NumSideChannelElements  == 0)
429    && (tmpPce->NumBackChannelElements  == 1)
430    && (tmpPce->Profile == 1) )
431  { /* Copy the complete PCE including metadata. */
432    FDKmemcpy(pce, tmpPce, sizeof(CProgramConfig));
433  }
434
435  C_ALLOC_SCRATCH_END(tmpPce, CProgramConfig, 1);
436
437  return error;
438}
439#endif
440
441/*!
442  \brief Parse Extension Payload
443
444  \self Handle of AAC decoder
445  \count Pointer to bit counter.
446  \previous_element ID of previous element (required by some extension payloads)
447
448  \return  Error code
449*/
450static
451AAC_DECODER_ERROR CAacDecoder_ExtPayloadParse (HANDLE_AACDECODER self,
452                                               HANDLE_FDK_BITSTREAM hBs,
453                                               int *count,
454                                               MP4_ELEMENT_ID previous_element,
455                                               int elIndex,
456                                               int fIsFillElement)
457{
458  AAC_DECODER_ERROR error = AAC_DEC_OK;
459  EXT_PAYLOAD_TYPE extension_type;
460  int bytes = (*count) >> 3;
461  int crcFlag = 0;
462
463  if (*count < 4) {
464    return AAC_DEC_PARSE_ERROR;
465  } else if ((INT)FDKgetValidBits(hBs) < *count) {
466    return AAC_DEC_DECODE_FRAME_ERROR;
467  }
468
469  extension_type = (EXT_PAYLOAD_TYPE) FDKreadBits(hBs, 4);    /* bs_extension_type */
470  *count -= 4;
471
472  switch (extension_type)
473  {
474  case EXT_DYNAMIC_RANGE:
475    {
476      INT readBits = aacDecoder_drcMarkPayload( self->hDrcInfo, hBs, MPEG_DRC_EXT_DATA );
477
478      if (readBits > *count)
479      { /* Read too much. Something went wrong! */
480        error = AAC_DEC_PARSE_ERROR;
481      }
482      *count -= readBits;
483    }
484    break;
485
486
487  case EXT_SBR_DATA_CRC:
488    crcFlag = 1;
489  case EXT_SBR_DATA:
490    if (IS_CHANNEL_ELEMENT(previous_element)) {
491      SBR_ERROR sbrError;
492
493      CAacDecoder_SyncQmfMode(self);
494
495      sbrError = sbrDecoder_InitElement(
496              self->hSbrDecoder,
497              self->streamInfo.aacSampleRate,
498              self->streamInfo.extSamplingRate,
499              self->streamInfo.aacSamplesPerFrame,
500              self->streamInfo.aot,
501              previous_element,
502              elIndex
503              );
504
505      if (sbrError == SBRDEC_OK) {
506        sbrError = sbrDecoder_Parse (
507                self->hSbrDecoder,
508                hBs,
509                count,
510               *count,
511                crcFlag,
512                previous_element,
513                elIndex,
514                self->flags & AC_INDEP );
515        /* Enable SBR for implicit SBR signalling. */
516        if (sbrError == SBRDEC_OK) {
517          self->sbrEnabled = 1;
518        }
519      } else {
520        /* Do not try to apply SBR because initializing the element failed. */
521        self->sbrEnabled = 0;
522      }
523      /* Citation from ISO/IEC 14496-3 chapter 4.5.2.1.5.2
524      Fill elements containing an extension_payload() with an extension_type of EXT_SBR_DATA
525      or EXT_SBR_DATA_CRC shall not contain any other extension_payload of any other extension_type.
526      */
527      if (fIsFillElement) {
528        FDKpushBiDirectional(hBs, *count);
529        *count = 0;
530      } else {
531        /* If this is not a fill element with a known length, we are screwed an no further parsing makes sense. */
532        if (sbrError != SBRDEC_OK) {
533          self->frameOK = 0;
534        }
535      }
536    } else {
537      error = AAC_DEC_PARSE_ERROR;
538    }
539    break;
540
541  case EXT_FILL_DATA:
542    {
543      int temp;
544
545      temp = FDKreadBits(hBs,4);
546      bytes--;
547      if (temp != 0) {
548        error = AAC_DEC_PARSE_ERROR;
549        break;
550      }
551      while (bytes > 0) {
552        temp = FDKreadBits(hBs,8);
553        bytes--;
554        if (temp != 0xa5) {
555          error = AAC_DEC_PARSE_ERROR;
556          break;
557        }
558      }
559      *count = bytes<<3;
560    }
561    break;
562
563  case EXT_DATA_ELEMENT:
564    {
565      int dataElementVersion;
566
567      dataElementVersion = FDKreadBits(hBs,4);
568      *count -= 4;
569      if (dataElementVersion == 0) /* ANC_DATA */
570      {
571        int temp, dataElementLength = 0;
572        do {
573          temp = FDKreadBits(hBs,8);
574          *count -= 8;
575          dataElementLength += temp;
576        } while (temp == 255 );
577
578        CAacDecoder_AncDataParse(&self->ancData, hBs, dataElementLength);
579        *count -= (dataElementLength<<3);
580      } else {
581        /* align = 0 */
582        error = AAC_DEC_PARSE_ERROR;
583        goto bail;
584      }
585    }
586    break;
587
588  case EXT_DATA_LENGTH:
589    if ( !fIsFillElement          /* Makes no sens to have an additional length in a fill ...   */
590      && (self->flags & AC_ER) )  /* ... element because this extension payload type was ...    */
591    {                             /* ... created to circumvent the missing length in ER-Syntax. */
592      int bitCnt, len = FDKreadBits(hBs, 4);
593      *count -= 4;
594
595      if (len == 15) {
596        int add_len = FDKreadBits(hBs, 8);
597        *count -= 8;
598        len += add_len;
599
600        if (add_len == 255) {
601          len += FDKreadBits(hBs, 16);
602          *count -= 16;
603        }
604      }
605      len <<= 3;
606      bitCnt = len;
607
608      if ( (EXT_PAYLOAD_TYPE)FDKreadBits(hBs, 4) == EXT_DATA_LENGTH ) {
609        /* Check NOTE 2: The extension_payload() included here must
610                         not have extension_type == EXT_DATA_LENGTH. */
611        error = AAC_DEC_PARSE_ERROR;
612        goto bail;
613      }
614      else {
615        /* rewind and call myself again. */
616        FDKpushBack(hBs, 4);
617
618        error =
619          CAacDecoder_ExtPayloadParse (
620                  self,
621                  hBs,
622                 &bitCnt,
623                  previous_element,
624                  elIndex,
625                  1 );      /* Treat same as fill element */
626
627        *count -= len - bitCnt;
628      }
629      /* Note: the fall through in case the if statement above is not taken is intentional. */
630      break;
631    }
632
633  case EXT_FIL:
634
635  default:
636    /* align = 4 */
637    FDKpushFor(hBs, *count);
638    *count = 0;
639    break;
640  }
641
642bail:
643  if ( (error != AAC_DEC_OK)
644    && fIsFillElement )
645  { /* Skip the remaining extension bytes */
646    FDKpushBiDirectional(hBs, *count);
647    *count = 0;
648    /* Patch error code because decoding can go on. */
649    error = AAC_DEC_OK;
650    /* Be sure that parsing errors have been stored. */
651  }
652  return error;
653}
654
655/*  Stream Configuration and Information.
656
657    This class holds configuration and information data for a stream to be decoded. It
658    provides the calling application as well as the decoder with substantial information,
659    e.g. profile, sampling rate, number of channels found in the bitstream etc.
660*/
661static
662void CStreamInfoInit(CStreamInfo *pStreamInfo)
663{
664  pStreamInfo->aacSampleRate = 0;
665  pStreamInfo->profile = -1;
666  pStreamInfo->aot = AOT_NONE;
667
668  pStreamInfo->channelConfig = -1;
669  pStreamInfo->bitRate = 0;
670  pStreamInfo->aacSamplesPerFrame = 0;
671
672  pStreamInfo->extAot  = AOT_NONE;
673  pStreamInfo->extSamplingRate = 0;
674
675  pStreamInfo->flags = 0;
676
677  pStreamInfo->epConfig = -1;   /* default is no ER */
678
679  pStreamInfo->numChannels = 0;
680  pStreamInfo->sampleRate = 0;
681  pStreamInfo->frameSize = 0;
682}
683
684/*!
685  \brief Initialization of AacDecoderChannelInfo
686
687  The function initializes the pointers to AacDecoderChannelInfo for each channel,
688  set the start values for window shape and window sequence of overlap&add to zero,
689  set the overlap buffer to zero and initializes the pointers to the window coefficients.
690  \param bsFormat is the format of the AAC bitstream
691
692  \return  AACDECODER instance
693*/
694LINKSPEC_CPP HANDLE_AACDECODER CAacDecoder_Open(TRANSPORT_TYPE bsFormat)    /*!< bitstream format (adif,adts,loas,...). */
695{
696  HANDLE_AACDECODER self;
697
698  self = GetAacDecoder();
699  if (self == NULL) {
700    goto bail;
701  }
702
703  /* Assign channel mapping info arrays (doing so removes dependency of settings header in API header). */
704  self->streamInfo.pChannelIndices = self->channelIndices;
705  self->streamInfo.pChannelType = self->channelType;
706
707  /* set default output mode */
708  self->outputInterleaved = 1;  /* interleaved */
709
710  /* initialize anc data */
711  CAacDecoder_AncDataInit(&self->ancData, NULL, 0);
712
713  /* initialize stream info */
714  CStreamInfoInit(&self->streamInfo);
715
716  /* initialize error concealment common data */
717  CConcealment_InitCommonData(&self->concealCommonData);
718
719  self->hDrcInfo = GetDrcInfo();
720  if (self->hDrcInfo == NULL) {
721    goto bail;
722  }
723  /* Init common DRC structure */
724  aacDecoder_drcInit( self->hDrcInfo );
725  /* Set default frame delay */
726  aacDecoder_drcSetParam (
727          self->hDrcInfo,
728          DRC_BS_DELAY,
729          CConcealment_GetDelay(&self->concealCommonData)
730        );
731
732
733  self->aacCommonData.workBufferCore1 = GetWorkBufferCore1();
734  self->aacCommonData.workBufferCore2 = GetWorkBufferCore2();
735  if (self->aacCommonData.workBufferCore1 == NULL
736    ||self->aacCommonData.workBufferCore2 == NULL )
737    goto bail;
738
739  return self;
740
741bail:
742  CAacDecoder_Close( self );
743
744  return NULL;
745}
746
747/* Destroy aac decoder */
748LINKSPEC_CPP void CAacDecoder_Close(HANDLE_AACDECODER self)
749{
750  int ch;
751
752  if (self == NULL)
753    return;
754
755  for (ch=0; ch<(6); ch++) {
756    if (self->pAacDecoderStaticChannelInfo[ch] != NULL) {
757      FreeOverlapBuffer (&self->pAacDecoderStaticChannelInfo[ch]->pOverlapBuffer);
758      FreeAacDecoderStaticChannelInfo (&self->pAacDecoderStaticChannelInfo[ch]);
759    }
760    if (self->pAacDecoderChannelInfo[ch] != NULL) {
761      FreeAacDecoderChannelInfo (&self->pAacDecoderChannelInfo[ch]);
762    }
763  }
764
765  self->aacChannels = 0;
766
767  if (self->hDrcInfo) {
768    FreeDrcInfo(&self->hDrcInfo);
769  }
770
771  FreeWorkBufferCore1 (&self->aacCommonData.workBufferCore1);
772  FreeWorkBufferCore2 (&self->aacCommonData.workBufferCore2);
773
774  FreeAacDecoder ( &self);
775}
776
777
778/*!
779  \brief Initialization of decoder instance
780
781  The function initializes the decoder.
782
783  \return  error status: 0 for success, <>0 for unsupported configurations
784*/
785LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_Init(HANDLE_AACDECODER self, const CSAudioSpecificConfig *asc)
786{
787  AAC_DECODER_ERROR err = AAC_DEC_OK;
788  INT ascChannels, ch, ascChanged = 0;
789
790  if (!self)
791    return AAC_DEC_INVALID_HANDLE;
792
793  // set profile and check for supported aot
794  // leave profile on default (=-1) for all other supported MPEG-4 aot's except aot=2 (=AAC-LC)
795  switch (asc->m_aot) {
796  case AOT_AAC_LC:
797    self->streamInfo.profile = 1;
798    break;
799
800  case AOT_SBR:
801  case AOT_PS:
802  case AOT_ER_AAC_LD:
803  case AOT_ER_AAC_ELD:
804    break;
805
806  default:
807    return AAC_DEC_UNSUPPORTED_AOT;
808  }
809
810  CProgramConfig_Init(&self->pce);
811
812  /* set channels */
813  switch (asc->m_channelConfiguration) {
814  case 0:
815#ifdef TP_PCE_ENABLE
816    /* get channels from program config (ASC) */
817    if (CProgramConfig_IsValid(&asc->m_progrConfigElement)) {
818      ascChannels = asc->m_progrConfigElement.NumChannels;
819      if (ascChannels > 0) {
820        int el;
821        /* valid number of channels -> copy program config element (PCE) from ASC */
822        FDKmemcpy(&self->pce, &asc->m_progrConfigElement, sizeof(CProgramConfig));
823        /* Built element table */
824        el = CProgramConfig_GetElementTable(&asc->m_progrConfigElement, self->elements, 7);
825        for (; el<7; el++) {
826          self->elements[el] = ID_NONE;
827        }
828      } else {
829        return AAC_DEC_UNSUPPORTED_CHANNELCONFIG;
830      }
831    } else {
832      if (transportDec_GetFormat(self->hInput) == TT_MP4_ADTS) {
833        /* set default max_channels for memory allocation because in implicit channel mapping mode
834           we don't know the actual number of channels until we processed at least one raw_data_block(). */
835        ascChannels = (6);
836      } else {
837        return AAC_DEC_UNSUPPORTED_CHANNELCONFIG;
838      }
839    }
840#else /* TP_PCE_ENABLE */
841    return AAC_DEC_UNSUPPORTED_CHANNELCONFIG;
842#endif /* TP_PCE_ENABLE */
843    break;
844  case 1: case 2: case 3: case 4: case 5: case 6:
845    ascChannels = asc->m_channelConfiguration;
846    break;
847  case 7:
848    ascChannels = 8;
849    break;
850  default:
851    return AAC_DEC_UNSUPPORTED_CHANNELCONFIG;
852  }
853
854  /* Initialize constant mappings for channel config 1-7 */
855  if (asc->m_channelConfiguration > 0) {
856    int el;
857    FDKmemcpy(self->elements, elementsTab[asc->m_channelConfiguration-1], sizeof(MP4_ELEMENT_ID)*FDKmin(7,7));
858    for (el=7; el<7; el++) {
859      self->elements[el] = ID_NONE;
860    }
861    for (ch=0; ch<ascChannels; ch++) {
862      self->chMapping[ch] = ch;
863    }
864    for (; ch<(6); ch++) {
865      self->chMapping[ch] = 255;
866    }
867  }
868 #ifdef TP_PCE_ENABLE
869  else {
870    if (CProgramConfig_IsValid(&asc->m_progrConfigElement)) {
871      /* Set matrix mixdown infos if available from PCE. */
872      pcmDmx_SetMatrixMixdownFromPce ( self->hPcmUtils,
873                                       asc->m_progrConfigElement.MatrixMixdownIndexPresent,
874                                       asc->m_progrConfigElement.MatrixMixdownIndex,
875                                       asc->m_progrConfigElement.PseudoSurroundEnable );
876    }
877  }
878 #endif
879
880  self->streamInfo.channelConfig = asc->m_channelConfiguration;
881
882  if (ascChannels > (6)) {
883    return AAC_DEC_UNSUPPORTED_CHANNELCONFIG;
884  }
885  if (self->streamInfo.aot != asc->m_aot) {
886    self->streamInfo.aot = asc->m_aot;
887    ascChanged = 1;
888  }
889
890  if (self->streamInfo.aacSamplesPerFrame != (INT)asc->m_samplesPerFrame) {
891    self->streamInfo.aacSamplesPerFrame = asc->m_samplesPerFrame;
892    ascChanged = 1;
893  }
894
895  self->streamInfo.bitRate            = 0;
896
897  /* Set syntax flags */
898  self->flags = 0;
899
900  self->streamInfo.extAot               = asc->m_extensionAudioObjectType;
901  self->streamInfo.extSamplingRate      = asc->m_extensionSamplingFrequency;
902  self->flags |= (asc->m_sbrPresentFlag) ? AC_SBR_PRESENT : 0;
903  self->flags |= (asc->m_psPresentFlag) ? AC_PS_PRESENT : 0;
904  self->sbrEnabled = 0;
905
906  /* --------- vcb11 ------------ */
907  self->flags |= (asc->m_vcb11Flag) ? AC_ER_VCB11 : 0;
908
909  /* ---------- rvlc ------------ */
910  self->flags |= (asc->m_rvlcFlag) ? AC_ER_RVLC : 0;
911
912  /* ----------- hcr ------------ */
913  self->flags |= (asc->m_hcrFlag) ? AC_ER_HCR : 0;
914
915  if (asc->m_aot == AOT_ER_AAC_ELD) {
916    self->flags |=  AC_ELD;
917    self->flags |= (asc->m_sc.m_eldSpecificConfig.m_sbrCrcFlag) ? AC_SBRCRC : 0;
918    self->flags |= (asc->m_sc.m_eldSpecificConfig.m_useLdQmfTimeAlign) ? AC_LD_MPS : 0;
919  }
920  self->flags |= (asc->m_aot == AOT_ER_AAC_LD) ? AC_LD : 0;
921  self->flags |= (asc->m_epConfig >= 0) ? AC_ER : 0;
922
923
924  if (asc->m_sbrPresentFlag) {
925    self->sbrEnabled = 1;
926    self->sbrEnabledPrev = 1;
927  }
928  if (asc->m_psPresentFlag) {
929    self->flags |= AC_PS_PRESENT;
930  }
931
932  if ( (asc->m_epConfig >= 0)
933    && (asc->m_channelConfiguration <= 0) ) {
934    /* we have to know the number of channels otherwise no decoding is possible */
935    return AAC_DEC_UNSUPPORTED_ER_FORMAT;
936  }
937
938  self->streamInfo.epConfig = asc->m_epConfig;
939  /* self->hInput->asc.m_epConfig = asc->m_epConfig; */
940
941  if (asc->m_epConfig > 1)
942    return AAC_DEC_UNSUPPORTED_ER_FORMAT;
943
944  /* Check if samplerate changed. */
945  if (self->streamInfo.aacSampleRate != (INT)asc->m_samplingFrequency) {
946    AAC_DECODER_ERROR error;
947
948    ascChanged = 1;
949
950    /* Update samplerate info. */
951    error = getSamplingRateInfo(&self->samplingRateInfo, asc->m_samplesPerFrame, asc->m_samplingFrequencyIndex, asc->m_samplingFrequency);
952    if (error != AAC_DEC_OK) {
953      return error;
954    }
955    self->streamInfo.aacSampleRate = self->samplingRateInfo.samplingRate;
956  }
957
958  /* Check if amount of channels has changed. */
959  if (self->ascChannels != ascChannels)
960  {
961     ascChanged = 1;
962
963     /* Allocate all memory structures for each channel */
964     {
965       for (ch = 0; ch < ascChannels; ch++) {
966         CAacDecoderDynamicData *aacDecoderDynamicData = &self->aacCommonData.workBufferCore1->pAacDecoderDynamicData[ch%2];
967
968         /* initialize pointer to CAacDecoderChannelInfo */
969         if (self->pAacDecoderChannelInfo[ch] == NULL) {
970           self->pAacDecoderChannelInfo[ch] = GetAacDecoderChannelInfo(ch);
971           /* This is temporary until the DynamicData is split into two or more regions!
972              The memory could be reused after completed core decoding. */
973           if (self->pAacDecoderChannelInfo[ch] == NULL) {
974             goto bail;
975           }
976           /* Hook shared work memory into channel data structure */
977           self->pAacDecoderChannelInfo[ch]->pDynData =  aacDecoderDynamicData;
978           self->pAacDecoderChannelInfo[ch]->pComData = &self->aacCommonData;
979         }
980
981         /* Allocate persistent channel memory */
982         if (self->pAacDecoderStaticChannelInfo[ch] == NULL) {
983           self->pAacDecoderStaticChannelInfo[ch] = GetAacDecoderStaticChannelInfo(ch);
984           if (self->pAacDecoderStaticChannelInfo[ch] == NULL) {
985             goto bail;
986           }
987           self->pAacDecoderStaticChannelInfo[ch]->pOverlapBuffer = GetOverlapBuffer(ch); /* This area size depends on the AOT */
988           if (self->pAacDecoderStaticChannelInfo[ch]->pOverlapBuffer == NULL) {
989             goto bail;
990           }
991           self->pAacDecoderChannelInfo[ch]->pSpectralCoefficient = (SPECTRAL_PTR) &self->aacCommonData.workBufferCore2[ch*1024];
992
993         }
994         CPns_InitPns(&self->pAacDecoderChannelInfo[ch]->data.aac.PnsData, &self->aacCommonData.pnsInterChannelData, &self->aacCommonData.pnsCurrentSeed, self->aacCommonData.pnsRandomSeed);
995       }
996
997
998       HcrInitRom(&self->aacCommonData.overlay.aac.erHcrInfo);
999       setHcrType(&self->aacCommonData.overlay.aac.erHcrInfo, ID_SCE);
1000
1001       /* Make allocated channel count persistent in decoder context. */
1002       self->aacChannels = ascChannels;
1003    }
1004
1005    /* Make amount of signalled channels persistent in decoder context. */
1006    self->ascChannels = ascChannels;
1007  }
1008
1009  /* Update structures */
1010  if (ascChanged) {
1011
1012     /* Things to be done for each channel, which do not involved allocating memory. */
1013     for (ch = 0; ch < ascChannels; ch++) {
1014       switch (self->streamInfo.aot) {
1015         case AOT_ER_AAC_ELD:
1016         case AOT_ER_AAC_LD:
1017           self->pAacDecoderChannelInfo[ch]->granuleLength = self->streamInfo.aacSamplesPerFrame;
1018           break;
1019         default:
1020           self->pAacDecoderChannelInfo[ch]->granuleLength = self->streamInfo.aacSamplesPerFrame / 8;
1021           break;
1022       }
1023       mdct_init( &self->pAacDecoderStaticChannelInfo[ch]->IMdct,
1024                   self->pAacDecoderStaticChannelInfo[ch]->pOverlapBuffer,
1025                   OverlapBufferSize );
1026
1027
1028        /* Reset DRC control data for this channel */
1029        aacDecoder_drcInitChannelData ( &self->pAacDecoderStaticChannelInfo[ch]->drcData );
1030
1031       /* Reset concealment only if ASC changed. Otherwise it will be done with any config callback.
1032          E.g. every time the LATM SMC is present. */
1033       CConcealment_InitChannelData(&self->pAacDecoderStaticChannelInfo[ch]->concealmentInfo,
1034                                    &self->concealCommonData,
1035                                     self->streamInfo.aacSamplesPerFrame );
1036     }
1037  }
1038
1039  /* Update externally visible copy of flags */
1040  self->streamInfo.flags = self->flags;
1041
1042  return err;
1043
1044bail:
1045  aacDecoder_Close( self );
1046  return AAC_DEC_OUT_OF_MEMORY;
1047}
1048
1049
1050LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_DecodeFrame(
1051        HANDLE_AACDECODER self,
1052        const UINT flags,
1053        INT_PCM *pTimeData,
1054        const INT  timeDataSize,
1055        const INT interleaved
1056        )
1057{
1058  AAC_DECODER_ERROR ErrorStatus = AAC_DEC_OK;
1059
1060  CProgramConfig *pce;
1061  HANDLE_FDK_BITSTREAM bs = transportDec_GetBitstream(self->hInput, 0);
1062
1063  MP4_ELEMENT_ID type = ID_NONE;            /* Current element type */
1064  INT aacChannels=0;                        /* Channel counter for channels found in the bitstream */
1065
1066  INT auStartAnchor = (INT)FDKgetValidBits(bs);  /* AU start bit buffer position for AU byte alignment */
1067
1068  self->frameOK = 1;
1069
1070  /* Any supported base layer valid AU will require more than 16 bits. */
1071  if ( (transportDec_GetAuBitsRemaining(self->hInput, 0) < 15) && (flags & (AACDEC_CONCEAL|AACDEC_FLUSH)) == 0) {
1072    self->frameOK = 0;
1073    ErrorStatus = AAC_DEC_DECODE_FRAME_ERROR;
1074  }
1075
1076
1077  /* Reset Program Config structure */
1078  pce = &self->pce;
1079  CProgramConfig_Reset(pce);
1080
1081  CAacDecoder_AncDataReset(&self->ancData);
1082
1083  {
1084    int ch;
1085
1086    if (self->streamInfo.channelConfig == 0) {
1087      /* Init Channel/Element mapping table */
1088      for (ch=0; ch<(6); ch++) {
1089        self->chMapping[ch] = 255;
1090      }
1091      if (!CProgramConfig_IsValid(pce)) {
1092        int el;
1093        for (el=0; el<7; el++) {
1094          self->elements[el] = ID_NONE;
1095        }
1096      }
1097    }
1098  }
1099
1100  /* Check sampling frequency  */
1101  switch ( self->streamInfo.aacSampleRate ) {
1102    case 16000:
1103    case 12000:
1104   case 11025:
1105   case  8000:
1106    case  7350:
1107    case 48000:
1108    case 44100:
1109    case 32000:
1110    case 24000:
1111    case 22050:
1112      break;
1113    default:
1114      if ( ! (self->flags & (AC_USAC|AC_RSVD50)) ) {
1115        return AAC_DEC_UNSUPPORTED_SAMPLINGRATE;
1116      }
1117      break;
1118  }
1119
1120
1121  if ( flags & AACDEC_CLRHIST )
1122  {
1123    int ch;
1124    /* Clear history */
1125    for (ch = 0; ch < self->aacChannels; ch++) {
1126      /* Reset concealment */
1127      CConcealment_InitChannelData(&self->pAacDecoderStaticChannelInfo[ch]->concealmentInfo,
1128                                   &self->concealCommonData,
1129                                    self->streamInfo.aacSamplesPerFrame );
1130      /* Clear concealment buffers to get rid of the complete history */
1131      FDKmemclear(self->pAacDecoderStaticChannelInfo[ch]->concealmentInfo.spectralCoefficient, 1024 * sizeof(FIXP_CNCL));
1132      FDKmemclear(self->pAacDecoderStaticChannelInfo[ch]->concealmentInfo.specScale, 8 * sizeof(SHORT));
1133      /* Clear overlap-add buffers to avoid clicks. */
1134      FDKmemclear(self->pAacDecoderStaticChannelInfo[ch]->IMdct.overlap.freq, OverlapBufferSize*sizeof(FIXP_DBL));
1135     }
1136  }
1137
1138
1139
1140#ifdef TP_PCE_ENABLE
1141  int pceRead = 0;                          /* Flag indicating a PCE in the current raw_data_block() */
1142#endif
1143
1144
1145  INT hdaacDecoded = 0;
1146  MP4_ELEMENT_ID previous_element = ID_END; /* Last element ID (required for extension payload mapping */
1147  UCHAR previous_element_index = 0;         /* Canonical index of last element */
1148  int element_count = 0;                    /* Element counter for elements found in the bitstream */
1149  int el_cnt[ID_LAST] = { 0 };              /* element counter ( robustness ) */
1150
1151  while ( (type != ID_END) && (! (flags & (AACDEC_CONCEAL | AACDEC_FLUSH))) && self->frameOK )
1152  {
1153    int el_channels;
1154
1155    if (! (self->flags & (AC_USAC|AC_RSVD50|AC_ELD|AC_SCALABLE|AC_ER)))
1156      type = (MP4_ELEMENT_ID) FDKreadBits(bs,3);
1157    else
1158      type = self->elements[element_count];
1159
1160    setHcrType(&self->aacCommonData.overlay.aac.erHcrInfo, type);
1161
1162
1163    if ((INT)FDKgetValidBits(bs) < 0)
1164      self->frameOK = 0;
1165
1166    switch (type)
1167    {
1168      case ID_SCE:
1169      case ID_CPE:
1170      case ID_LFE:
1171        /*
1172          Consistency check
1173        */
1174
1175        if (type == ID_CPE) {
1176          el_channels = 2;
1177        } else {
1178          el_channels = 1;
1179        }
1180
1181        if ( (el_cnt[type] >= (self->ascChannels>>(el_channels-1))) || (aacChannels > (self->ascChannels-el_channels)) ) {
1182          ErrorStatus = AAC_DEC_DECODE_FRAME_ERROR;
1183          self->frameOK = 0;
1184          break;
1185        }
1186
1187        if ( !(self->flags & (AC_USAC|AC_RSVD50)) ) {
1188          int ch;
1189          for (ch=0; ch < el_channels; ch+=1) {
1190            CPns_ResetData(&self->pAacDecoderChannelInfo[aacChannels+ch]->data.aac.PnsData,
1191                           &self->pAacDecoderChannelInfo[aacChannels+ch]->pComData->pnsInterChannelData);
1192          }
1193        }
1194
1195        if(self->frameOK) {
1196          ErrorStatus = CChannelElement_Read( bs,
1197                                             &self->pAacDecoderChannelInfo[aacChannels],
1198                                             &self->pAacDecoderStaticChannelInfo[aacChannels],
1199                                              self->streamInfo.aot,
1200                                             &self->samplingRateInfo,
1201                                              self->flags,
1202                                              self->streamInfo.aacSamplesPerFrame,
1203                                              el_channels,
1204                                              self->streamInfo.epConfig,
1205                                              self->hInput
1206                                              );
1207          if (ErrorStatus) {
1208            self->frameOK = 0;
1209          }
1210        }
1211
1212
1213        if ( self->frameOK) {
1214          /* Lookup the element and decode it only if it belongs to the current program */
1215          if ( CProgramConfig_LookupElement(
1216                  pce,
1217                  self->streamInfo.channelConfig,
1218                  self->pAacDecoderChannelInfo[aacChannels]->ElementInstanceTag,
1219                  aacChannels,
1220                  self->chMapping,
1221                  self->channelType,
1222                  self->channelIndices,
1223                 &previous_element_index,
1224                  self->elements,
1225                  type) )
1226          {
1227            if ( !hdaacDecoded ) {
1228              CChannelElement_Decode(
1229                     &self->pAacDecoderChannelInfo[aacChannels],
1230                     &self->pAacDecoderStaticChannelInfo[aacChannels],
1231                     &self->samplingRateInfo,
1232                      self->flags,
1233                      el_channels
1234                      );
1235            }
1236            aacChannels += 1;
1237            if (type == ID_CPE) {
1238              aacChannels += 1;
1239            }
1240          }
1241          else {
1242            self->frameOK = 0;
1243          }
1244          /* Create SBR element for SBR for upsampling. */
1245          if ( (type == ID_LFE)
1246            && ( (self->flags & AC_SBR_PRESENT)
1247              || (self->sbrEnabled == 1) ) )
1248          {
1249            SBR_ERROR sbrError;
1250
1251            sbrError = sbrDecoder_InitElement(
1252                    self->hSbrDecoder,
1253                    self->streamInfo.aacSampleRate,
1254                    self->streamInfo.extSamplingRate,
1255                    self->streamInfo.aacSamplesPerFrame,
1256                    self->streamInfo.aot,
1257                    ID_LFE,
1258                    previous_element_index
1259                    );
1260            if (sbrError != SBRDEC_OK) {
1261              /* Do not try to apply SBR because initializing the element failed. */
1262              self->sbrEnabled = 0;
1263            }
1264          }
1265        }
1266
1267        el_cnt[type]++;
1268        break;
1269
1270      case ID_CCE:
1271        /*
1272          Consistency check
1273        */
1274        if ( el_cnt[type] > self->ascChannels ) {
1275          ErrorStatus = AAC_DEC_DECODE_FRAME_ERROR;
1276          self->frameOK = 0;
1277          break;
1278        }
1279
1280        if (self->frameOK)
1281        {
1282          /* memory for spectral lines temporal on scratch */
1283          C_ALLOC_SCRATCH_START(mdctSpec, FIXP_DBL, 1024);
1284
1285          /* create dummy channel for CCE parsing on stack */
1286          CAacDecoderChannelInfo  tmpAacDecoderChannelInfo, *pTmpAacDecoderChannelInfo;
1287
1288          FDKmemclear(mdctSpec, 1024*sizeof(FIXP_DBL));
1289
1290          tmpAacDecoderChannelInfo.pDynData =   self->aacCommonData.workBufferCore1->pAacDecoderDynamicData;
1291          tmpAacDecoderChannelInfo.pComData =  &self->aacCommonData;
1292          tmpAacDecoderChannelInfo.pSpectralCoefficient  = (SPECTRAL_PTR)mdctSpec;
1293          /* Assume AAC-LC */
1294          tmpAacDecoderChannelInfo.granuleLength = self->streamInfo.aacSamplesPerFrame / 8;
1295
1296          /* Reset PNS data. */
1297          CPns_ResetData(&tmpAacDecoderChannelInfo.data.aac.PnsData, &tmpAacDecoderChannelInfo.pComData->pnsInterChannelData);
1298
1299          pTmpAacDecoderChannelInfo = &tmpAacDecoderChannelInfo;
1300          /* do CCE parsing */
1301          ErrorStatus = CChannelElement_Read( bs,
1302                                             &pTmpAacDecoderChannelInfo,
1303                                              NULL,
1304                                              self->streamInfo.aot,
1305                                             &self->samplingRateInfo,
1306                                              self->flags,
1307                                              self->streamInfo.aacSamplesPerFrame,
1308                                              1,
1309                                              self->streamInfo.epConfig,
1310                                              self->hInput
1311                                             );
1312
1313          C_ALLOC_SCRATCH_END(mdctSpec, FIXP_DBL, 1024);
1314
1315          if (ErrorStatus) {
1316            self->frameOK = 0;
1317          }
1318
1319          if (self->frameOK) {
1320            /* Lookup the element and decode it only if it belongs to the current program */
1321            if (CProgramConfig_LookupElement(
1322                    pce,
1323                    self->streamInfo.channelConfig,
1324                    pTmpAacDecoderChannelInfo->ElementInstanceTag,
1325                    0,
1326                    self->chMapping,
1327                    self->channelType,
1328                    self->channelIndices,
1329                   &previous_element_index,
1330                    self->elements,
1331                    type) )
1332            {
1333              /* decoding of CCE not supported */
1334            }
1335            else {
1336              self->frameOK = 0;
1337            }
1338          }
1339        }
1340        el_cnt[type]++;
1341        break;
1342
1343      case ID_DSE:
1344        {
1345          UCHAR element_instance_tag;
1346
1347          CDataStreamElement_Read( bs,
1348                                  &self->ancData,
1349                                   self->hDrcInfo,
1350                                   self->hInput,
1351                                  &element_instance_tag,
1352                                   auStartAnchor );
1353
1354          if (!CProgramConfig_LookupElement(
1355                   pce,
1356                   self->streamInfo.channelConfig,
1357                   element_instance_tag,
1358                   0,
1359                   self->chMapping,
1360                   self->channelType,
1361                   self->channelIndices,
1362                  &previous_element_index,
1363                   self->elements,
1364                   type) )
1365          {
1366            /* most likely an error in bitstream occured */
1367            //self->frameOK = 0;
1368          }
1369        }
1370
1371        {
1372          UCHAR *pDvbAncData = NULL;
1373          AAC_DECODER_ERROR ancErr;
1374          int ancIndex;
1375          int dvbAncDataSize = 0;
1376
1377          /* Ask how many anc data elements are in buffer */
1378          ancIndex = self->ancData.nrElements - 1;
1379          /* Get the last one (if available) */
1380          ancErr   = CAacDecoder_AncDataGet( &self->ancData,
1381                                              ancIndex,
1382                                             &pDvbAncData,
1383                                             &dvbAncDataSize );
1384
1385          if (ancErr == AAC_DEC_OK) {
1386            pcmDmx_ReadDvbAncData (
1387                  self->hPcmUtils,
1388                  pDvbAncData,
1389                  dvbAncDataSize,
1390                  0 /* not mpeg2 */ );
1391          }
1392        }
1393        break;
1394
1395#ifdef TP_PCE_ENABLE
1396      case ID_PCE:
1397
1398        if ( CProgramConfigElement_Read( bs,
1399                                    self->hInput,
1400                                    pce,
1401                                    self->streamInfo.channelConfig,
1402                                    auStartAnchor ) )
1403        { /* Built element table */
1404          int elIdx = CProgramConfig_GetElementTable(pce, self->elements, 7);
1405          /* Reset the remaining tabs */
1406          for ( ; elIdx<7; elIdx++) {
1407            self->elements[elIdx] = ID_NONE;
1408          }
1409          /* Make new number of channel persistant */
1410          self->ascChannels = pce->NumChannels;
1411          /* If PCE is not first element conceal this frame to avoid inconsistencies */
1412          if ( element_count != 0 ) {
1413            self->frameOK = 0;
1414          }
1415        }
1416        pceRead = 1;
1417        break;
1418#endif /* TP_PCE_ENABLE */
1419
1420      case ID_FIL:
1421        {
1422          int bitCnt = FDKreadBits(bs,4);           /* bs_count */
1423
1424          if (bitCnt == 15)
1425          {
1426            int esc_count = FDKreadBits(bs,8);     /* bs_esc_count */
1427            bitCnt =  esc_count + 14;
1428          }
1429
1430          /* Convert to bits */
1431          bitCnt <<= 3;
1432
1433          while (bitCnt > 0) {
1434            ErrorStatus = CAacDecoder_ExtPayloadParse(self, bs, &bitCnt, previous_element, previous_element_index, 1);
1435            if (ErrorStatus != AAC_DEC_OK) {
1436              self->frameOK = 0;
1437              break;
1438            }
1439          }
1440        }
1441        break;
1442
1443      case ID_EXT:
1444        {
1445          INT bitCnt = 0;
1446
1447          /* get the remaining bits of this frame */
1448          bitCnt = transportDec_GetAuBitsRemaining(self->hInput, 0);
1449
1450          if ( (bitCnt > 0) && (self->flags & AC_SBR_PRESENT) && (self->flags & (AC_USAC|AC_RSVD50|AC_ELD)) )
1451          {
1452            SBR_ERROR err = SBRDEC_OK;
1453            int  elIdx, numChElements = el_cnt[ID_SCE] + el_cnt[ID_CPE];
1454
1455            for (elIdx = 0; elIdx < numChElements; elIdx += 1)
1456            {
1457              err = sbrDecoder_Parse (
1458                    self->hSbrDecoder,
1459                    bs,
1460                   &bitCnt,
1461                    -1,
1462                    self->flags & AC_SBRCRC,
1463                    self->elements[elIdx],
1464                    elIdx,
1465                    self->flags & AC_INDEP );
1466
1467              if (err != SBRDEC_OK) {
1468                break;
1469              }
1470            }
1471            if (err == SBRDEC_OK) {
1472              self->sbrEnabled = 1;
1473            } else {
1474              self->frameOK = 0;
1475            }
1476          }
1477
1478
1479          if ( ! (self->flags & (AC_USAC|AC_RSVD50|AC_DRM)) )
1480          {
1481            while ( bitCnt > 7 ) {
1482              ErrorStatus = CAacDecoder_ExtPayloadParse(self, bs, &bitCnt, previous_element, previous_element_index, 0);
1483              if (ErrorStatus != AAC_DEC_OK) {
1484                self->frameOK = 0;
1485                ErrorStatus = AAC_DEC_PARSE_ERROR;
1486                break;
1487              }
1488            }
1489          }
1490        }
1491        break;
1492
1493      case ID_END:
1494        break;
1495
1496      default:
1497        ErrorStatus = AAC_DEC_DECODE_FRAME_ERROR;
1498        self->frameOK = 0;
1499        break;
1500    }
1501
1502    previous_element = type;
1503    element_count++;
1504
1505  }   /* while ( (type != ID_END) ... ) */
1506
1507  if ( !(flags & (AACDEC_CONCEAL|AACDEC_FLUSH)) )
1508  {
1509    /* Byte alignment with respect to the first bit of the raw_data_block(). */
1510    {
1511      FDKbyteAlign(bs, auStartAnchor);
1512    }
1513
1514    /* Check if all bits of the raw_data_block() have been read. */
1515    if ( transportDec_GetAuBitsTotal(self->hInput, 0) > 0 ) {
1516      INT unreadBits = transportDec_GetAuBitsRemaining(self->hInput, 0);
1517      if ( unreadBits != 0 ) {
1518
1519        self->frameOK = 0;
1520        /* Do not overwrite current error */
1521        if (ErrorStatus == AAC_DEC_OK && self->frameOK == 0) {
1522          ErrorStatus = AAC_DEC_PARSE_ERROR;
1523        }
1524        /* Always put the bitbuffer at the right position after the current Access Unit. */
1525        FDKpushBiDirectional(bs, unreadBits);
1526      }
1527    }
1528
1529    /* Check the last element. The terminator (ID_END) has to be the last one (even if ER syntax is used). */
1530    if ( self->frameOK && type != ID_END ) {
1531      /* Do not overwrite current error */
1532      if (ErrorStatus == AAC_DEC_OK) {
1533        ErrorStatus = AAC_DEC_PARSE_ERROR;
1534      }
1535      self->frameOK = 0;
1536    }
1537  }
1538
1539  /* More AAC channels than specified by the ASC not allowed. */
1540  if ( (aacChannels == 0 || aacChannels > self->aacChannels) && !(flags & (AACDEC_CONCEAL|AACDEC_FLUSH)) ) {
1541    {
1542      /* Do not overwrite current error */
1543      if (ErrorStatus == AAC_DEC_OK) {
1544        ErrorStatus = AAC_DEC_DECODE_FRAME_ERROR;
1545      }
1546      self->frameOK = 0;
1547    }
1548    aacChannels = 0;
1549  }
1550  else if ( aacChannels > self->ascChannels ) {
1551    /* Do not overwrite current error */
1552    if (ErrorStatus == AAC_DEC_OK) {
1553      ErrorStatus = AAC_DEC_UNSUPPORTED_FORMAT;
1554    }
1555    self->frameOK = 0;
1556    aacChannels = 0;
1557  }
1558
1559  if ( TRANSPORTDEC_OK != transportDec_CrcCheck(self->hInput) )
1560  {
1561    self->frameOK=0;
1562  }
1563
1564  /* store or restore the number of channels */
1565  if ( self->frameOK && !(flags &(AACDEC_CONCEAL|AACDEC_FLUSH)) ) {
1566    self->concealChannels = aacChannels;  /* store */
1567    self->sbrEnabledPrev = self->sbrEnabled;
1568  } else {
1569    if (self->aacChannels > 0) {
1570      aacChannels = self->concealChannels;  /* restore */
1571      self->sbrEnabled = self->sbrEnabledPrev;
1572     }
1573  }
1574
1575  /* Update number of output channels */
1576  self->streamInfo.numChannels = aacChannels;
1577
1578 #ifdef TP_PCE_ENABLE
1579  if (pceRead == 1 && CProgramConfig_IsValid(pce)) {
1580    /* Set matrix mixdown infos if available from PCE. */
1581    pcmDmx_SetMatrixMixdownFromPce ( self->hPcmUtils,
1582                                     pce->MatrixMixdownIndexPresent,
1583                                     pce->MatrixMixdownIndex,
1584                                     pce->PseudoSurroundEnable );
1585  }
1586 #endif
1587
1588  /* If there is no valid data to transfrom into time domain, return. */
1589  if ( ! IS_OUTPUT_VALID(ErrorStatus) ) {
1590    return ErrorStatus;
1591  }
1592
1593  /*
1594    Inverse transform
1595  */
1596  {
1597    int stride, offset, c;
1598
1599    /* Extract DRC control data and map it to channels (without bitstream delay) */
1600    aacDecoder_drcProlog (
1601            self->hDrcInfo,
1602            bs,
1603            self->pAacDecoderStaticChannelInfo,
1604            self->pce.ElementInstanceTag,
1605            self->chMapping,
1606            aacChannels
1607          );
1608
1609    /* "c" iterates in canonical MPEG channel order */
1610    for (c=0; c < aacChannels; c++)
1611    {
1612      CAacDecoderChannelInfo *pAacDecoderChannelInfo;
1613
1614      /* Select correct pAacDecoderChannelInfo for current channel */
1615      if (self->chMapping[c] >= aacChannels) {
1616        pAacDecoderChannelInfo = self->pAacDecoderChannelInfo[c];
1617      } else {
1618        pAacDecoderChannelInfo = self->pAacDecoderChannelInfo[self->chMapping[c]];
1619      }
1620
1621      /* Setup offset and stride for time buffer traversal. */
1622      if (interleaved) {
1623        stride = aacChannels;
1624        offset = self->channelOutputMapping[aacChannels-1][c];
1625      } else {
1626        stride = 1;
1627        offset = self->channelOutputMapping[aacChannels-1][c] * self->streamInfo.aacSamplesPerFrame;
1628      }
1629
1630
1631      /*
1632        Conceal defective spectral data
1633      */
1634      CConcealment_Apply(&self->pAacDecoderStaticChannelInfo[c]->concealmentInfo,
1635                          pAacDecoderChannelInfo,
1636                          self->pAacDecoderStaticChannelInfo[c],
1637                         &self->samplingRateInfo,
1638                          self->streamInfo.aacSamplesPerFrame,
1639                          0,
1640                          (self->frameOK && !(flags&AACDEC_CONCEAL)),
1641                          self->flags
1642                        );
1643
1644
1645      if (flags & (AACDEC_INTR|AACDEC_CLRHIST)) {
1646        /* Reset DRC control data for this channel */
1647        aacDecoder_drcInitChannelData ( &self->pAacDecoderStaticChannelInfo[c]->drcData );
1648      }
1649      /* DRC processing */
1650      aacDecoder_drcApply (
1651              self->hDrcInfo,
1652              self->hSbrDecoder,
1653              pAacDecoderChannelInfo,
1654             &self->pAacDecoderStaticChannelInfo[c]->drcData,
1655              c,
1656              self->streamInfo.aacSamplesPerFrame,
1657              self->sbrEnabled
1658            );
1659
1660      switch (pAacDecoderChannelInfo->renderMode)
1661      {
1662        case AACDEC_RENDER_IMDCT:
1663          CBlock_FrequencyToTime(
1664                  self->pAacDecoderStaticChannelInfo[c],
1665                  pAacDecoderChannelInfo,
1666                  pTimeData + offset,
1667                  self->streamInfo.aacSamplesPerFrame,
1668                  stride,
1669                  (self->frameOK && !(flags&AACDEC_CONCEAL)),
1670                  self->aacCommonData.workBufferCore1->mdctOutTemp
1671                  );
1672          break;
1673        case AACDEC_RENDER_ELDFB:
1674          CBlock_FrequencyToTimeLowDelay(
1675                  self->pAacDecoderStaticChannelInfo[c],
1676                  pAacDecoderChannelInfo,
1677                  pTimeData + offset,
1678                  self->streamInfo.aacSamplesPerFrame,
1679                  stride
1680                  );
1681          break;
1682        default:
1683          ErrorStatus = AAC_DEC_UNKNOWN;
1684          break;
1685      }
1686      if ( flags&AACDEC_FLUSH ) {
1687          FDKmemclear(pAacDecoderChannelInfo->pSpectralCoefficient, sizeof(FIXP_DBL)*self->streamInfo.aacSamplesPerFrame);
1688        FDKmemclear(self->pAacDecoderStaticChannelInfo[c]->pOverlapBuffer, OverlapBufferSize*sizeof(FIXP_DBL));
1689      }
1690    }
1691
1692
1693    /* Extract DRC control data and map it to channels (with bitstream delay) */
1694    aacDecoder_drcEpilog (
1695            self->hDrcInfo,
1696            bs,
1697            self->pAacDecoderStaticChannelInfo,
1698            self->pce.ElementInstanceTag,
1699            self->chMapping,
1700            aacChannels
1701          );
1702  }
1703
1704
1705  /* Reorder channel type information tables.  */
1706  {
1707    AUDIO_CHANNEL_TYPE types[(6)];
1708    UCHAR idx[(6)];
1709    int c;
1710
1711    FDK_ASSERT(sizeof(self->channelType) == sizeof(types));
1712    FDK_ASSERT(sizeof(self->channelIndices) == sizeof(idx));
1713
1714    FDKmemcpy(types, self->channelType, sizeof(types));
1715    FDKmemcpy(idx, self->channelIndices, sizeof(idx));
1716
1717    for (c=0; c<aacChannels; c++) {
1718      self->channelType[self->channelOutputMapping[aacChannels-1][c]] = types[c];
1719      self->channelIndices[self->channelOutputMapping[aacChannels-1][c]] = idx[c];
1720    }
1721  }
1722
1723  self->blockNumber++;
1724
1725  return ErrorStatus;
1726}
1727
1728/*!
1729  \brief returns the streaminfo pointer
1730
1731  The function hands back a pointer to the streaminfo structure
1732
1733  \return pointer to the struct
1734*/
1735LINKSPEC_CPP CStreamInfo* CAacDecoder_GetStreamInfo ( HANDLE_AACDECODER self )
1736{
1737  if (!self) {
1738    return NULL;
1739  }
1740  return &self->streamInfo;
1741}
1742
1743
1744
1745
1746