Codebase list fdk-aac / 4e123ca
Imported Upstream version 0.1.3 Alessio Treglia 9 years ago
311 changed file(s) with 3497 addition(s) and 1932 deletion(s). Raw diff Collapse all Expand all
22 *.la
33 .deps
44 .libs
5 .dirstamp
56 Makefile
67 Makefile.in
78 aclocal.m4
0 0.1.3
1 - Updated upstream sources, with a number of crash fixes and new features
2 (including support for encoding 7.1)
3
04 0.1.2
15 - Fix a few more crashes
26 - Include dependency libs (such as -lm) in the pkg-config file
183183 $(PCMUTILS_SRC) $(FDK_SRC) $(SYS_SRC)
184184
185185 EXTRA_DIST = \
186 $(top_srcdir)/autogen.sh \
186187 $(top_srcdir)/NOTICE \
187188 $(top_srcdir)/Android.mk \
188189 $(top_srcdir)/fdk-aac.sym \
0 #!/bin/sh
1 autoreconf -fiv
00 dnl -*- Autoconf -*-
11 dnl Process this file with autoconf to produce a configure script.
22
3 AC_INIT([fdk-aac], [0.1.2], [http://sourceforge.net/projects/opencore-amr/])
3 AC_INIT([fdk-aac], [0.1.3], [http://sourceforge.net/projects/opencore-amr/])
44 AC_CONFIG_AUX_DIR(.)
55 AC_CONFIG_MACRO_DIR([m4])
66 AM_INIT_AUTOMAKE([tar-ustar foreign])
2525 dnl soname version to use
2626 dnl goes by ‘current[:revision[:age]]’ with the soname ending up as
2727 dnl current.age.revision
28 FDK_AAC_VERSION=0:3:0
28 FDK_AAC_VERSION=0:4:0
2929
3030 AS_IF([test x$enable_shared = xyes], [LIBS_PRIVATE=$LIBS], [LIBS_PUBLIC=$LIBS])
3131 AC_SUBST(FDK_AAC_VERSION)
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
503503 INT aacSamplesPerFrame; /*!< Samples per frame for the AAC core (from ASC). \n
504504 1024 or 960 for AAC-LC \n
505505 512 or 480 for AAC-LD and AAC-ELD */
506
506 INT aacNumChannels; /*!< The number of audio channels after AAC core processing (before PS or MPS processing).
507 CAUTION: This are not the final number of output channels! */
507508 AUDIO_OBJECT_TYPE extAot; /*!< Extension Audio Object Type (from ASC) */
508509 INT extSamplingRate; /*!< Extension sampling rate in Hz (from ASC) */
509510
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
134134 /* init params */
135135 pParams = &self->params;
136136 pParams->bsDelayEnable = 0;
137 pParams->cut = FL2FXCONST_DBL(0.0f);
138 pParams->boost = FL2FXCONST_DBL(0.0f);
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);
139141 pParams->targetRefLevel = AACDEC_DRC_DEFAULT_REF_LEVEL;
140142 pParams->expiryFrame = AACDEC_DRC_DFLT_EXPIRY_FRAMES;
143 pParams->applyHeavyCompression = 0;
141144
142145 /* initial program ref level = target ref level */
143146 self->progRefLevel = pParams->targetRefLevel;
192195 if (self == NULL) {
193196 return AAC_DEC_INVALID_HANDLE;
194197 }
195 self->params.cut = (FIXP_DBL)((INT)(DRC_PARAM_QUANT_STEP>>DRC_PARAM_SCALE) * (INT)value);
198 self->params.usrCut = (FIXP_DBL)((INT)(DRC_PARAM_QUANT_STEP>>DRC_PARAM_SCALE) * (INT)value);
199 if (self->params.applyHeavyCompression == 0)
200 self->params.cut = self->params.usrCut;
196201 break;
197202 case DRC_BOOST_SCALE:
198203 /* set boost factor */
203208 if (self == NULL) {
204209 return AAC_DEC_INVALID_HANDLE;
205210 }
206 self->params.boost = (FIXP_DBL)((INT)(DRC_PARAM_QUANT_STEP>>DRC_PARAM_SCALE) * (INT)value);
211 self->params.usrBoost = (FIXP_DBL)((INT)(DRC_PARAM_QUANT_STEP>>DRC_PARAM_SCALE) * (INT)value);
212 if (self->params.applyHeavyCompression == 0)
213 self->params.boost = self->params.usrBoost;
207214 break;
208215 case TARGET_REF_LEVEL:
209216 if ( value > MAX_REFERENCE_LEVEL
219226 else {
220227 /* ref_level must be between 0 and MAX_REFERENCE_LEVEL, inclusive */
221228 self->digitalNorm = 1;
222 self->params.targetRefLevel = value;
223 self->progRefLevel = (SCHAR)value; /* Set the program reference level equal to the target
224 level according to 4.5.2.7.3 of ISO/IEC 14496-3. */
229 if (self->params.targetRefLevel != (SCHAR)value) {
230 self->params.targetRefLevel = (SCHAR)value;
231 self->progRefLevel = (SCHAR)value; /* Always set the program reference level equal to the
232 target level according to 4.5.2.7.3 of ISO/IEC 14496-3. */
233 }
225234 }
226235 break;
227236 case APPLY_HEAVY_COMPRESSION:
231240 if (self == NULL) {
232241 return AAC_DEC_INVALID_HANDLE;
233242 }
234 self->params.applyHeavyCompression = (UCHAR)value;
243 if (self->params.applyHeavyCompression != (UCHAR)value) {
244 if (value == 1) {
245 /* Disable scaling of DRC values by setting the max values */
246 self->params.boost = FL2FXCONST_DBL(1.0f/(float)(1<<DRC_PARAM_SCALE));
247 self->params.cut = FL2FXCONST_DBL(1.0f/(float)(1<<DRC_PARAM_SCALE));
248 } else {
249 /* Restore the user params */
250 self->params.boost = self->params.usrBoost;
251 self->params.cut = self->params.usrCut;
252 }
253 /* Store new parameter value */
254 self->params.applyHeavyCompression = (UCHAR)value;
255 }
235256 break;
236257 case DRC_BS_DELAY:
237258 if (value < 0 || value > 1) {
472493 }
473494 }
474495 else {
475 pDrcBs->channelData.bandTop[0] = 255;
496 pDrcBs->channelData.bandTop[0] = (1024 >> 2) - 1; /* ... comprising the whole spectrum. */;
476497 }
477498
478499 pDrcBs->channelData.numBands = numBands;
626647 {
627648 CDrcPayload threadBs[MAX_DRC_THREADS];
628649 CDrcPayload *validThreadBs[MAX_DRC_THREADS];
650 CDrcParams *pParams;
629651 UINT backupBsPosition;
630652 int i, thread, validThreads = 0;
631653 int numExcludedChns[MAX_DRC_THREADS];
654
655 FDK_ASSERT(self != NULL);
656 FDK_ASSERT(hBs != NULL);
657 FDK_ASSERT(pAacDecoderStaticChannelInfo != NULL);
658
659 pParams = &self->params;
632660
633661 self->numThreads = 0;
634662 backupBsPosition = FDKgetValidBits(hBs);
751779 */
752780 if (pThreadBs->progRefLevel >= 0) {
753781 self->progRefLevel = pThreadBs->progRefLevel;
782 self->prlExpiryCount = 0; /* Got a new value -> Reset counter */
754783 }
755784
756785 /* SCE, CPE and LFE */
766795 }
767796 }
768797 /* CCEs not supported by now */
798 }
799
800 /* Increment and check expiry counter for the program reference level: */
801 if ( (pParams->expiryFrame > 0)
802 && (self->prlExpiryCount++ > pParams->expiryFrame) )
803 { /* The program reference level is too old, so set it back to the target level. */
804 self->progRefLevel = pParams->targetRefLevel;
805 self->prlExpiryCount = 0;
769806 }
770807
771808 return 0;
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
142142 UCHAR channelMapping[],
143143 int numChannels );
144144
145 /**
146 * \brief Apply DRC. If SBR is present, DRC data is handed over to the SBR decoder.
147 * \param self AAC decoder instance
148 * \param pSbrDec pointer to SBR decoder instance
149 * \param pAacDecoderChannelInfo AAC decoder channel instance to be processed
150 * \param pDrcDat DRC channel data
151 * \param ch channel index
152 * \param aacFrameSize AAC frame size
153 * \param bSbrPresent flag indicating that SBR is present, in which case DRC is handed over to the SBR instance pSbrDec
154 */
145155 void aacDecoder_drcApply (
146156 HANDLE_AAC_DRC self,
147157 void *pSbrDec,
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
131131
132132 typedef struct
133133 {
134 FIXP_DBL cut;
135 FIXP_DBL boost;
134 FIXP_DBL cut; /* The attenuation scale factor currently used. */
135 FIXP_DBL usrCut; /* The latest attenuation scale factor set by user. */
136 FIXP_DBL boost; /* The boost scale factor currently used. */
137 FIXP_DBL usrBoost; /* The latest boost scale factor set by user. */
136138
137139 UINT expiryFrame;
138140 SCHAR targetRefLevel;
153155 USHORT numThreads; /* The number of DRC data threads extracted from the found payload elements */
154156 SCHAR progRefLevel; /* Program reference level for all channels */
155157
158 UINT prlExpiryCount; /* Counter that can be used to monitor the life time of the program reference level. */
159
156160 UCHAR dvbAncDataAvailable; /* Flag that indicates whether DVB ancillary data is present or not */
157161 UINT dvbAncDataPosition; /* Used to store the DVB ancillary data payload position in the bitstream (only one per frame) */
158162 UINT drcPayloadPosition[MAX_DRC_THREADS]; /* Used to store the DRC payload positions in the bitstream */
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
182182 if ( self->qmfModeCurr == NOT_DEFINED )
183183 {
184184 if ( (IS_LOWDELAY(self->streamInfo.aot) && (self->flags & AC_MPS_PRESENT))
185 || ( (self->ascChannels == 1)
185 || ( (self->streamInfo.aacNumChannels == 1)
186186 && ( (CAN_DO_PS(self->streamInfo.aot) && !(self->flags & AC_MPS_PRESENT))
187187 || ( IS_USAC(self->streamInfo.aot) && (self->flags & AC_MPS_PRESENT)) ) ) )
188188 {
195195
196196 /* Set SBR to current QMF mode. Error does not matter. */
197197 sbrDecoder_SetParam(self->hSbrDecoder, SBR_QMF_MODE, (self->qmfModeCurr == MODE_LP));
198 self->psPossible = ((CAN_DO_PS(self->streamInfo.aot) && self->aacChannels == 1 && ! (self->flags & AC_MPS_PRESENT))) && self->qmfModeCurr == MODE_HQ ;
198 self->psPossible = ((CAN_DO_PS(self->streamInfo.aot) && self->streamInfo.aacNumChannels == 1 && ! (self->flags & AC_MPS_PRESENT))) && self->qmfModeCurr == MODE_HQ ;
199199 FDK_ASSERT( ! ( (self->flags & AC_MPS_PRESENT) && self->psPossible ) );
200200 }
201201
372372
373373 {
374374 INT readBits, dataBits = count<<3;
375
375
376376 /* Move to the beginning of the data junk */
377377 FDKpushBack(bs, dataStart-FDKgetValidBits(bs));
378378
393393 \brief Read Program Config Element
394394
395395 \bs Bitstream Handle
396 \count Pointer to program config element.
397
398 \return Error code
396 \pTp Transport decoder handle for CRC handling
397 \pce Pointer to PCE buffer
398 \channelConfig Current channel configuration
399 \alignAnchor Anchor for byte alignment
400
401 \return PCE status (-1: fail, 0: no new PCE, 1: PCE updated, 2: PCE updated need re-config).
399402 */
400 static AAC_DECODER_ERROR CProgramConfigElement_Read (
403 static int CProgramConfigElement_Read (
401404 HANDLE_FDK_BITSTREAM bs,
402405 HANDLE_TRANSPORTDEC pTp,
403406 CProgramConfig *pce,
404 UINT channelConfig,
405 UINT alignAnchor )
407 const UINT channelConfig,
408 const UINT alignAnchor )
406409 {
407 AAC_DECODER_ERROR error = AAC_DEC_OK;
410 int pceStatus = 0;
408411 int crcReg;
409412
410413 /* read PCE to temporal buffer first */
411414 C_ALLOC_SCRATCH_START(tmpPce, CProgramConfig, 1);
412
415
413416 CProgramConfig_Init(tmpPce);
414417 CProgramConfig_Reset(tmpPce);
415418
420423 transportDec_CrcEndReg(pTp, crcReg);
421424
422425 if ( CProgramConfig_IsValid(tmpPce)
423 && ( (channelConfig == 6 && (tmpPce->NumChannels == 6))
424 || (channelConfig == 5 && (tmpPce->NumChannels == 5))
425 || (channelConfig == 0 && (tmpPce->NumChannels == pce->NumChannels)) )
426 && (tmpPce->NumFrontChannelElements == 2)
427 && (tmpPce->NumSideChannelElements == 0)
428 && (tmpPce->NumBackChannelElements == 1)
429426 && (tmpPce->Profile == 1) )
430 { /* Copy the complete PCE including metadata. */
431 FDKmemcpy(pce, tmpPce, sizeof(CProgramConfig));
427 {
428 if ( !pce->isValid && (channelConfig > 0) ) {
429 /* Create a standard channel config PCE to compare with */
430 CProgramConfig_GetDefault( pce, channelConfig );
431 }
432
433 if (pce->isValid) {
434 /* Compare the new and the old PCE (tags ignored) */
435 switch ( CProgramConfig_Compare( pce, tmpPce ) )
436 {
437 case 1: /* Channel configuration not changed. Just new metadata. */
438 FDKmemcpy(pce, tmpPce, sizeof(CProgramConfig)); /* Store the complete PCE */
439 pceStatus = 1; /* New PCE but no change of config */
440 break;
441 case 2: /* The number of channels are identical but not the config */
442 if (channelConfig == 0) {
443 FDKmemcpy(pce, tmpPce, sizeof(CProgramConfig)); /* Store the complete PCE */
444 pceStatus = 2; /* Decoder needs re-configuration */
445 }
446 break;
447 case -1: /* The channel configuration is completely different */
448 pceStatus = -1; /* Not supported! */
449 break;
450 case 0: /* Nothing to do because PCE matches the old one exactly. */
451 default:
452 /* pceStatus = 0; */
453 break;
454 }
455 }
432456 }
433457
434458 C_ALLOC_SCRATCH_END(tmpPce, CProgramConfig, 1);
435459
436 return error;
460 return pceStatus;
437461 }
438 #endif
462 #endif /* TP_PCE_ENABLE */
439463
440464 /*!
441465 \brief Parse Extension Payload
590614 { /* ... created to circumvent the missing length in ER-Syntax. */
591615 int bitCnt, len = FDKreadBits(hBs, 4);
592616 *count -= 4;
593
617
594618 if (len == 15) {
595619 int add_len = FDKreadBits(hBs, 8);
596620 *count -= 8;
608632 /* Check NOTE 2: The extension_payload() included here must
609633 not have extension_type == EXT_DATA_LENGTH. */
610634 error = AAC_DEC_PARSE_ERROR;
611 goto bail;
612 }
613 else {
635 } else {
614636 /* rewind and call myself again. */
615637 FDKpushBack(hBs, 4);
616638
621643 &bitCnt,
622644 previous_element,
623645 elIndex,
624 1 ); /* Treat same as fill element */
646 0 );
625647
626648 *count -= len - bitCnt;
627649 }
753775
754776 for (ch=0; ch<(6); ch++) {
755777 if (self->pAacDecoderStaticChannelInfo[ch] != NULL) {
756 FreeOverlapBuffer (&self->pAacDecoderStaticChannelInfo[ch]->pOverlapBuffer);
757 FreeAacDecoderStaticChannelInfo (&self->pAacDecoderStaticChannelInfo[ch]);
778 if (self->pAacDecoderStaticChannelInfo[ch]->pOverlapBuffer != NULL) {
779 FreeOverlapBuffer (&self->pAacDecoderStaticChannelInfo[ch]->pOverlapBuffer);
780 }
781 if (self->pAacDecoderStaticChannelInfo[ch] != NULL) {
782 FreeAacDecoderStaticChannelInfo (&self->pAacDecoderStaticChannelInfo[ch]);
783 }
758784 }
759785 if (self->pAacDecoderChannelInfo[ch] != NULL) {
760786 FreeAacDecoderChannelInfo (&self->pAacDecoderChannelInfo[ch]);
767793 FreeDrcInfo(&self->hDrcInfo);
768794 }
769795
770 FreeWorkBufferCore1 (&self->aacCommonData.workBufferCore1);
771 FreeWorkBufferCore2 (&self->aacCommonData.workBufferCore2);
796 if (self->aacCommonData.workBufferCore1 != NULL) {
797 FreeWorkBufferCore1 (&self->aacCommonData.workBufferCore1);
798 }
799 if (self->aacCommonData.workBufferCore2 != NULL) {
800 FreeWorkBufferCore2 (&self->aacCommonData.workBufferCore2);
801 }
772802
773803 FreeAacDecoder ( &self);
774804 }
9931023 CPns_InitPns(&self->pAacDecoderChannelInfo[ch]->data.aac.PnsData, &self->aacCommonData.pnsInterChannelData, &self->aacCommonData.pnsCurrentSeed, self->aacCommonData.pnsRandomSeed);
9941024 }
9951025
1026 if (ascChannels > self->aacChannels)
1027 {
1028 /* Make allocated channel count persistent in decoder context. */
1029 self->aacChannels = ascChannels;
1030 }
9961031
9971032 HcrInitRom(&self->aacCommonData.overlay.aac.erHcrInfo);
9981033 setHcrType(&self->aacCommonData.overlay.aac.erHcrInfo, ID_SCE);
999
1000 /* Make allocated channel count persistent in decoder context. */
1001 self->aacChannels = ascChannels;
10021034 }
10031035
10041036 /* Make amount of signalled channels persistent in decoder context. */
10081040 /* Update structures */
10091041 if (ascChanged) {
10101042
1011 /* Things to be done for each channel, which do not involved allocating memory. */
1012 for (ch = 0; ch < ascChannels; ch++) {
1043 /* Things to be done for each channel, which do not involve allocating memory.
1044 Doing these things only on the channels needed for the current configuration
1045 (ascChannels) could lead to memory access violation later (error concealment). */
1046 for (ch = 0; ch < self->aacChannels; ch++) {
10131047 switch (self->streamInfo.aot) {
10141048 case AOT_ER_AAC_ELD:
10151049 case AOT_ER_AAC_LD:
12401274 else {
12411275 self->frameOK = 0;
12421276 }
1243 /* Create SBR element for SBR for upsampling. */
1244 if ( (type == ID_LFE)
1245 && ( (self->flags & AC_SBR_PRESENT)
1246 || (self->sbrEnabled == 1) ) )
1277 /* Create SBR element for SBR for upsampling for LFE elements,
1278 and if SBR was explicitly signaled, because the first frame(s)
1279 may not contain SBR payload (broken encoder, bit errors). */
1280 if ( (self->flags & AC_SBR_PRESENT) || (self->sbrEnabled == 1) )
12471281 {
12481282 SBR_ERROR sbrError;
12491283
12531287 self->streamInfo.extSamplingRate,
12541288 self->streamInfo.aacSamplesPerFrame,
12551289 self->streamInfo.aot,
1256 ID_LFE,
1290 type,
12571291 previous_element_index
12581292 );
12591293 if (sbrError != SBRDEC_OK) {
13931427
13941428 #ifdef TP_PCE_ENABLE
13951429 case ID_PCE:
1396
1397 if ( CProgramConfigElement_Read( bs,
1430 {
1431 int result = CProgramConfigElement_Read(
1432 bs,
13981433 self->hInput,
13991434 pce,
14001435 self->streamInfo.channelConfig,
1401 auStartAnchor ) )
1402 { /* Built element table */
1403 int elIdx = CProgramConfig_GetElementTable(pce, self->elements, 7);
1404 /* Reset the remaining tabs */
1405 for ( ; elIdx<7; elIdx++) {
1406 self->elements[elIdx] = ID_NONE;
1407 }
1408 /* Make new number of channel persistant */
1409 self->ascChannels = pce->NumChannels;
1410 /* If PCE is not first element conceal this frame to avoid inconsistencies */
1411 if ( element_count != 0 ) {
1436 auStartAnchor );
1437 if ( result < 0 ) {
1438 /* Something went wrong */
1439 ErrorStatus = AAC_DEC_PARSE_ERROR;
14121440 self->frameOK = 0;
14131441 }
1414 }
1415 pceRead = 1;
1442 else if ( result > 1 ) {
1443 /* Built element table */
1444 int elIdx = CProgramConfig_GetElementTable(pce, self->elements, 7);
1445 /* Reset the remaining tabs */
1446 for ( ; elIdx<7; elIdx++) {
1447 self->elements[elIdx] = ID_NONE;
1448 }
1449 /* Make new number of channel persistant */
1450 self->ascChannels = pce->NumChannels;
1451 /* If PCE is not first element conceal this frame to avoid inconsistencies */
1452 if ( element_count != 0 ) {
1453 self->frameOK = 0;
1454 }
1455 }
1456 pceRead = (result>=0) ? 1 : 0;
1457 }
14161458 break;
14171459 #endif /* TP_PCE_ENABLE */
14181460
15721614 }
15731615
15741616 /* Update number of output channels */
1575 self->streamInfo.numChannels = aacChannels;
1617 self->streamInfo.aacNumChannels = aacChannels;
15761618
15771619 #ifdef TP_PCE_ENABLE
15781620 if (pceRead == 1 && CProgramConfig_IsValid(pce)) {
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
108108
109109 /* Decoder library info */
110110 #define AACDECODER_LIB_VL0 2
111 #define AACDECODER_LIB_VL1 4
112 #define AACDECODER_LIB_VL2 7
111 #define AACDECODER_LIB_VL1 5
112 #define AACDECODER_LIB_VL2 5
113113 #define AACDECODER_LIB_TITLE "AAC Decoder Lib"
114114 #define AACDECODER_LIB_BUILD_DATE __DATE__
115115 #define AACDECODER_LIB_BUILD_TIME __TIME__
260260 HANDLE_SBRDECODER hSbrDec = NULL;
261261 HANDLE_AAC_DRC hDrcInfo = NULL;
262262 HANDLE_PCM_DOWNMIX hPcmDmx = NULL;
263 CConcealmentMethod backupMethod;
263 CConcealmentMethod backupMethod = ConcealMethodNone;
264264 int backupDelay = 0;
265265 int bsDelay = 0;
266266
395395 AAC_DECODER_ERROR errorStatus = AAC_DEC_OK;
396396 CConcealParams *pConcealData = NULL;
397397 HANDLE_AAC_DRC hDrcInfo = NULL;
398 HANDLE_PCM_DOWNMIX hPcmDmx = NULL;
398399
399400 /* check decoder handle */
400401 if (self != NULL) {
401402 pConcealData = &self->concealCommonData;
402403 hDrcInfo = self->hDrcInfo;
404 hPcmDmx = self->hPcmUtils;
405 } else {
406 errorStatus = AAC_DEC_INVALID_HANDLE;
403407 }
404408
405409 /* configure the subsystems */
416420 break;
417421
418422 case AAC_PCM_OUTPUT_CHANNELS:
423 if (value < -1 || value > (6)) {
424 return AAC_DEC_SET_PARAM_FAIL;
425 }
419426 {
420427 PCMDMX_ERROR err;
421428
422429 err = pcmDmx_SetParam (
423 self->hPcmUtils,
430 hPcmDmx,
424431 NUMBER_OF_OUTPUT_CHANNELS,
425432 value );
426433
440447 PCMDMX_ERROR err;
441448
442449 err = pcmDmx_SetParam (
443 self->hPcmUtils,
450 hPcmDmx,
444451 DUAL_CHANNEL_DOWNMIX_MODE,
445452 value );
446453
458465 case AAC_PCM_OUTPUT_CHANNEL_MAPPING:
459466 switch (value) {
460467 case 0:
461 self->channelOutputMapping = channelMappingTablePassthrough;
468 if (self != NULL) {
469 self->channelOutputMapping = channelMappingTablePassthrough;
470 }
462471 break;
463472 case 1:
464 self->channelOutputMapping = channelMappingTableWAV;
473 if (self != NULL) {
474 self->channelOutputMapping = channelMappingTableWAV;
475 }
465476 break;
466477 default:
467478 errorStatus = AAC_DEC_SET_PARAM_FAIL;
471482
472483
473484 case AAC_QMF_LOWPOWER:
485 if (value < -1 || value > 1) {
486 return AAC_DEC_SET_PARAM_FAIL;
487 }
474488 if (self == NULL) {
475489 return AAC_DEC_INVALID_HANDLE;
476490 }
793807 /* Export data into streaminfo structure */
794808 self->streamInfo.sampleRate = self->streamInfo.aacSampleRate;
795809 self->streamInfo.frameSize = self->streamInfo.aacSamplesPerFrame;
796 self->streamInfo.numChannels = self->aacChannels;
797 }
810 }
811 self->streamInfo.numChannels = self->streamInfo.aacNumChannels;
798812
799813
800814
831845 pTimeData,
832846 &self->streamInfo.numChannels,
833847 &self->streamInfo.sampleRate,
834 self->channelOutputMapping[self->aacChannels-1],
848 self->channelOutputMapping[self->streamInfo.numChannels-1],
835849 interleaved,
836850 self->frameOK,
837851 &self->psPossible);
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
588588 {
589589 H_HCR_INFO hHcr = &pAacDecoderChannelInfo->pComData->overlay.aac.erHcrInfo;
590590 int hcrStatus = 0;
591 int hcrConcealWholeFrame = 0;
592591
593592 /* advanced Huffman decoding starts here (HCR decoding :) */
594593 if ( pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfReorderedSpectralData != 0 ) {
597596 hcrStatus = HcrInit(hHcr, pAacDecoderChannelInfo, pSamplingRateInfo, bs);
598597
599598 if (hcrStatus != 0) {
599 return AAC_DEC_DECODE_FRAME_ERROR;
600 }
601
602 /* HCR decoding short */
603 hcrStatus = HcrDecoder(hHcr, pAacDecoderChannelInfo, pSamplingRateInfo, bs);
604
605 if (hcrStatus != 0) {
600606 #if HCR_ERROR_CONCEALMENT
601 hcrConcealWholeFrame = 1;
602 return AAC_DEC_DECODE_FRAME_ERROR; /* concealment is muting in the first step, therefore return now */
603 // hcr decoding is not skipped because of returning above
607 HcrMuteErroneousLines(hHcr);
604608 #else
605609 return AAC_DEC_DECODE_FRAME_ERROR;
606 #endif
607 }
608
609 /* HCR decoding short */
610 hcrStatus = HcrDecoder(hHcr, pAacDecoderChannelInfo, pSamplingRateInfo, bs);
611
612
613 #if HCR_ERROR_CONCEALMENT
614 HcrMuteErroneousLines(hHcr);
615 #else
616 return AAC_DEC_DECODE_FRAME_ERROR;
617610 #endif /* HCR_ERROR_CONCEALMENT */
611 }
618612
619613 FDKpushFor (bs, pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfReorderedSpectralData);
620614 }
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
440440
441441 /* set confort noise level which will be inserted while in state 'muting' */
442442 if (comfNoiseLevel != AACDEC_CONCEAL_PARAM_NOT_SPECIFIED) {
443 if ( (comfNoiseLevel < 0)
443 if ( (comfNoiseLevel < -1)
444444 || (comfNoiseLevel > 127) ) {
445445 return AAC_DEC_SET_PARAM_FAIL;
446446 }
15261526 {
15271527 case ConcealState_Ok:
15281528 if (!frameOk) {
1529 /* change to state SINGLE-FRAME-LOSS */
1530 pConcealmentInfo->concealState = ConcealState_Single;
1529 if (pConcealCommonData->numFadeOutFrames > 0) {
1530 /* change to state SINGLE-FRAME-LOSS */
1531 pConcealmentInfo->concealState = ConcealState_Single;
1532 } else {
1533 /* change to state MUTE */
1534 pConcealmentInfo->concealState = ConcealState_Mute;
1535 }
15311536 pConcealmentInfo->cntFadeFrames = 0;
15321537 pConcealmentInfo->cntValidFrames = 0;
15331538 }
15601565 case ConcealState_FadeOut:
15611566 pConcealmentInfo->cntFadeFrames += 1; /* used to address the fade-out factors */
15621567 if (pConcealmentInfo->cntValidFrames > pConcealCommonData->numMuteReleaseFrames) {
1563 /* change to state FADE-IN */
1564 pConcealmentInfo->concealState = ConcealState_FadeIn;
1565 pConcealmentInfo->cntFadeFrames = findEquiFadeFrame( pConcealCommonData,
1566 pConcealmentInfo->cntFadeFrames-1,
1567 0 /* FadeOut -> FadeIn */);
1568 if (pConcealCommonData->numFadeInFrames > 0) {
1569 /* change to state FADE-IN */
1570 pConcealmentInfo->concealState = ConcealState_FadeIn;
1571 pConcealmentInfo->cntFadeFrames = findEquiFadeFrame( pConcealCommonData,
1572 pConcealmentInfo->cntFadeFrames-1,
1573 0 /* FadeOut -> FadeIn */);
1574 } else {
1575 /* change to state OK */
1576 pConcealmentInfo->concealState = ConcealState_Ok;
1577 }
15681578 } else {
15691579 if (pConcealmentInfo->cntFadeFrames >= pConcealCommonData->numFadeOutFrames) {
15701580 /* change to state MUTE */
15751585
15761586 case ConcealState_Mute:
15771587 if (pConcealmentInfo->cntValidFrames > pConcealCommonData->numMuteReleaseFrames) {
1578 /* change to state FADE-IN */
1579 pConcealmentInfo->concealState = ConcealState_FadeIn;
1580 pConcealmentInfo->cntFadeFrames = pConcealCommonData->numFadeInFrames - 1;
1588 if (pConcealCommonData->numFadeInFrames > 0) {
1589 /* change to state FADE-IN */
1590 pConcealmentInfo->concealState = ConcealState_FadeIn;
1591 pConcealmentInfo->cntFadeFrames = pConcealCommonData->numFadeInFrames - 1;
1592 } else {
1593 /* change to state OK */
1594 pConcealmentInfo->concealState = ConcealState_Ok;
1595 }
15811596 }
15821597 break;
15831598
15891604 pConcealmentInfo->concealState = ConcealState_Ok;
15901605 }
15911606 } else {
1592 /* change to state FADE-OUT */
1593 pConcealmentInfo->concealState = ConcealState_FadeOut;
1594 pConcealmentInfo->cntFadeFrames = findEquiFadeFrame( pConcealCommonData,
1595 pConcealmentInfo->cntFadeFrames+1,
1596 1 /* FadeIn -> FadeOut */);
1607 if (pConcealCommonData->numFadeOutFrames > 0) {
1608 /* change to state FADE-OUT */
1609 pConcealmentInfo->concealState = ConcealState_FadeOut;
1610 pConcealmentInfo->cntFadeFrames = findEquiFadeFrame( pConcealCommonData,
1611 pConcealmentInfo->cntFadeFrames+1,
1612 1 /* FadeIn -> FadeOut */);
1613 } else {
1614 /* change to state MUTE */
1615 pConcealmentInfo->concealState = ConcealState_Mute;
1616 }
15971617 }
15981618 break;
15991619
16241644 case ConcealState_Ok:
16251645 if (!(pConcealmentInfo->prevFrameOk[1] ||
16261646 (pConcealmentInfo->prevFrameOk[0] && !pConcealmentInfo->prevFrameOk[1] && frameOk))) {
1627 /* Fade out only if the energy interpolation algorithm can not be applied! */
1628 pConcealmentInfo->concealState = ConcealState_FadeOut;
1647 if (pConcealCommonData->numFadeOutFrames > 0) {
1648 /* Fade out only if the energy interpolation algorithm can not be applied! */
1649 pConcealmentInfo->concealState = ConcealState_FadeOut;
1650 } else {
1651 /* change to state MUTE */
1652 pConcealmentInfo->concealState = ConcealState_Mute;
1653 }
16291654 pConcealmentInfo->cntFadeFrames = 0;
16301655 pConcealmentInfo->cntValidFrames = 0;
16311656 }
16391664 pConcealmentInfo->cntFadeFrames += 1;
16401665
16411666 if (pConcealmentInfo->cntValidFrames > pConcealCommonData->numMuteReleaseFrames) {
1642 /* change to state FADE-IN */
1643 pConcealmentInfo->concealState = ConcealState_FadeIn;
1644 pConcealmentInfo->cntFadeFrames = findEquiFadeFrame( pConcealCommonData,
1645 pConcealmentInfo->cntFadeFrames-1,
1646 0 /* FadeOut -> FadeIn */);
1667 if (pConcealCommonData->numFadeInFrames > 0) {
1668 /* change to state FADE-IN */
1669 pConcealmentInfo->concealState = ConcealState_FadeIn;
1670 pConcealmentInfo->cntFadeFrames = findEquiFadeFrame( pConcealCommonData,
1671 pConcealmentInfo->cntFadeFrames-1,
1672 0 /* FadeOut -> FadeIn */);
1673 } else {
1674 /* change to state OK */
1675 pConcealmentInfo->concealState = ConcealState_Ok;
1676 }
16471677 } else {
16481678 if (pConcealmentInfo->cntFadeFrames >= pConcealCommonData->numFadeOutFrames) {
16491679 /* change to state MUTE */
16541684
16551685 case ConcealState_Mute:
16561686 if (pConcealmentInfo->cntValidFrames > pConcealCommonData->numMuteReleaseFrames) {
1657 /* change to state FADE-IN */
1658 pConcealmentInfo->concealState = ConcealState_FadeIn;
1659 pConcealmentInfo->cntFadeFrames = pConcealCommonData->numFadeInFrames - 1;
1687 if (pConcealCommonData->numFadeInFrames > 0) {
1688 /* change to state FADE-IN */
1689 pConcealmentInfo->concealState = ConcealState_FadeIn;
1690 pConcealmentInfo->cntFadeFrames = pConcealCommonData->numFadeInFrames - 1;
1691 } else {
1692 /* change to state OK */
1693 pConcealmentInfo->concealState = ConcealState_Ok;
1694 }
16601695 }
16611696 break;
16621697
16691704 pConcealmentInfo->concealState = ConcealState_Ok;
16701705 }
16711706 } else {
1672 /* change to state FADE-OUT */
1673 pConcealmentInfo->concealState = ConcealState_FadeOut;
1674 pConcealmentInfo->cntFadeFrames = findEquiFadeFrame( pConcealCommonData,
1675 pConcealmentInfo->cntFadeFrames+1,
1676 1 /* FadeIn -> FadeOut */);
1707 if (pConcealCommonData->numFadeOutFrames > 0) {
1708 /* change to state FADE-OUT */
1709 pConcealmentInfo->concealState = ConcealState_FadeOut;
1710 pConcealmentInfo->cntFadeFrames = findEquiFadeFrame( pConcealCommonData,
1711 pConcealmentInfo->cntFadeFrames+1,
1712 1 /* FadeIn -> FadeOut */);
1713 } else {
1714 /* change to state MUTE */
1715 pConcealmentInfo->concealState = ConcealState_Mute;
1716 }
16771717 }
16781718 break;
16791719 } /* End switch(pConcealmentInfo->concealState) */
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
315315 channels and sampling rate and is determined as follows.
316316 \code
317317 AAC-LC (AOT_AAC_LC): 1.5 bits per sample
318 HE-AAC (AOT_SBR): 0.625 bits per sample
318 HE-AAC (AOT_SBR): 0.625 bits per sample (dualrate sbr)
319 HE-AAC (AOT_SBR): 1.125 bits per sample (downsampled sbr)
319320 HE-AAC v2 (AOT_PS): 0.5 bits per sample
320321 \endcode
321322
340341 we recommended to activate this feature.
341342 \code aacEncoder_SetParam(hAacEncoder, AACENC_AFTERBURNER, 1); \endcode
342343
344 \subsection encELD ELD Auto Configuration Mode
345 For ELD configuration a so called auto configurator is available which configures SBR and the SBR ratio by itself.
346 The configurator is used when the encoder parameter ::AACENC_SBR_MODE and ::AACENC_SBR_RATIO are not set explicitely.
347
348 Based on sampling rate and chosen bitrate per channel a reasonable SBR configuration will be used.
349 \verbatim
350 ------------------------------------------------------------
351 Sampling Rate | Channel Bitrate | SBR | SBR Ratio
352 -----------------+-----------------+------+-----------------
353 ]min, 16] kHz | min - 27999 | on | downsampled SBR
354 | 28000 - max | off | ---
355 -----------------+-----------------+------+-----------------
356 ]16 - 24] kHz | min - 39999 | on | downsampled SBR
357 | 40000 - max | off | ---
358 -----------------+-----------------+------+-----------------
359 ]24 - 32] kHz | min - 27999 | on | dualrate SBR
360 | 28000 - 55999 | on | downsampled SBR
361 | 56000 - max | off | ---
362 -----------------+-----------------+------+-----------------
363 ]32 - 44.1] kHz | min - 63999 | on | dualrate SBR
364 | 64000 - max | off | ---
365 -----------------+-----------------+------+-----------------
366 ]44.1 - 48] kHz | min - 63999 | on | dualrate SBR
367 | 64000 - max | off | ---
368 ------------------------------------------------------------
369 \endverbatim
370
343371
344372 \section audiochCfg Audio Channel Configuration
345373 The MPEG standard refers often to the so-called Channel Configuration. This Channel Configuration is used for a fixed Channel
348376 Program Config Element. The present Encoder implementation does not allow the user to configure this Channel Configuration from
349377 extern. The Encoder implementation supports fixed Channel Modes which are mapped to Channel Configuration as follow.
350378 \verbatim
351 --------------------------------------------------------------------
352 ChannelMode | ChCfg | front_El | side_El | back_El | lfe_El
353 -----------------+--------+----------+----------+----------+--------
354 MODE_1 | 1 | SCE | | |
355 MODE_2 | 2 | CPE | | |
356 MODE_1_2 | 3 | SCE, CPE | | |
357 MODE_1_2_1 | 4 | SCE, CPE | | SCE |
358 MODE_1_2_2 | 5 | SCE, CPE | | CPE |
359 MODE_1_2_2_1 | 6 | SCE, CPE | | CPE | LFE
360 --------------------------------------------------------------------
379 -------------------------------------------------------------------------------
380 ChannelMode | ChCfg | front_El | side_El | back_El | lfe_El
381 -----------------------+--------+---------------+----------+----------+--------
382 MODE_1 | 1 | SCE | | |
383 MODE_2 | 2 | CPE | | |
384 MODE_1_2 | 3 | SCE, CPE | | |
385 MODE_1_2_1 | 4 | SCE, CPE | | SCE |
386 MODE_1_2_2 | 5 | SCE, CPE | | CPE |
387 MODE_1_2_2_1 | 6 | SCE, CPE | | CPE | LFE
388 MODE_1_2_2_2_1 | 7 | SCE, CPE, CPE | | CPE | LFE
389 -----------------------+--------+---------------+----------+----------+--------
390 MODE_7_1_REAR_SURROUND | 0 | SCE, CPE | | CPE, CPE | LFE
391 MODE_7_1_FRONT_CENTER | 0 | SCE, CPE, CPE | | CPE | LFE
392 -------------------------------------------------------------------------------
361393 - SCE: Single Channel Element.
362394 - CPE: Channel Pair.
363395 - SCE: Low Frequency Element.
373405 of the audio data depends on the selected ::AACENC_CHANNELORDER which can be MPEG or WAV like order.\n
374406 Following Table describes the complete channel mapping for both Channel Order configurations.
375407 \verbatim
376 ---------------------------------------------------------------------------------
377 ChannelMode | MPEG-Channelorder | WAV-Channelorder
378 -----------------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---
379 MODE_1 | 0 | | | | | | | | 0 | | | | | | |
380 MODE_2 | 0 | 1 | | | | | | | 0 | 1 | | | | | |
381 MODE_1_2 | 0 | 1 | 2 | | | | | | 2 | 0 | 1 | | | | |
382 MODE_1_2_1 | 0 | 1 | 2 | 3 | | | | | 2 | 0 | 1 | 3 | | | |
383 MODE_1_2_2 | 0 | 1 | 2 | 3 | 4 | | | | 2 | 0 | 1 | 3 | 4 | | |
384 MODE_1_2_2_1 | 0 | 1 | 2 | 3 | 4 | 5 | | | 2 | 0 | 1 | 4 | 5 | 3 | |
385 ---------------------------------------------------------------------------------
408 ---------------------------------------------------------------------------------------
409 ChannelMode | MPEG-Channelorder | WAV-Channelorder
410 -----------------------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---
411 MODE_1 | 0 | | | | | | | | 0 | | | | | | |
412 MODE_2 | 0 | 1 | | | | | | | 0 | 1 | | | | | |
413 MODE_1_2 | 0 | 1 | 2 | | | | | | 2 | 0 | 1 | | | | |
414 MODE_1_2_1 | 0 | 1 | 2 | 3 | | | | | 2 | 0 | 1 | 3 | | | |
415 MODE_1_2_2 | 0 | 1 | 2 | 3 | 4 | | | | 2 | 0 | 1 | 3 | 4 | | |
416 MODE_1_2_2_1 | 0 | 1 | 2 | 3 | 4 | 5 | | | 2 | 0 | 1 | 4 | 5 | 3 | |
417 MODE_1_2_2_2_1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 2 | 6 | 7 | 0 | 1 | 4 | 5 | 3
418 -----------------------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---
419 MODE_7_1_REAR_SURROUND | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 2 | 0 | 1 | 6 | 7 | 4 | 5 | 3
420 MODE_7_1_FRONT_CENTER | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 2 | 6 | 7 | 0 | 1 | 4 | 5 | 3
421 ---------------------------------------------------------------------------------------
386422 \endverbatim
387423
388424 The denoted mapping is important for correct audio channel assignment when using MPEG or WAV ordering. The incoming audio
415451 look-up table is used.
416452
417453 A good working point in terms of audio quality, sampling rate and bitrate, is at 1 to 1.5
418 bits/audio sample for AAC-LC, 0.625 bits/audio sample for HE-AAC and 0.5 bits/audio sample
419 for HE-AAC v2. For example for one channel with a sampling frequency of 48 kHz, the range from
454 bits/audio sample for AAC-LC, 0.625 bits/audio sample for dualrate HE-AAC, 1.125 bits/audio sample
455 for downsampled HE-AAC and 0.5 bits/audio sample for HE-AAC v2.
456 For example for one channel with a sampling frequency of 48 kHz, the range from
420457 48 kbit/s to 72 kbit/s achieves reasonable audio quality for AAC-LC.
421458
422459 For HE-AAC and HE-AAC v2 the lowest possible audio input sampling frequency is 16 kHz because then the
433470 The following table provides an overview of recommended encoder configuration parameters
434471 which we determined by virtue of numerous listening tests.
435472
436 \subsection reommendedConfigLC AAC-LC, HE-AAC, HE-AACv2.
473 \subsection reommendedConfigLC AAC-LC, HE-AAC, HE-AACv2 in Dualrate SBR mode.
437474 \verbatim
438475 -----------------------------------------------------------------------------------
439476 Audio Object Type | Bit Rate Range | Supported | Preferred | No. of
456493 -------------------+------------------+-----------------------+------------+-------
457494 AAC LC + SBR | 64000 - 69999 | 32.00, 44.10, 48.00 | 32.00 | 5, 5.1
458495 AAC LC + SBR | 70000 - 159999 | 32.00, 44.10, 48.00 | 44.10 | 5, 5.1
459 AAC LC + SBR | 160000 - 319999 | 32.00, 44.10, 48.00 | 48.00 | 5, 5.1
460 AAC LC + SBR | 320000 - 640000 | 64.00, 88.20, 96.00 | 96.00 | 5, 5.1
496 AAC LC + SBR | 160000 - 245999 | 32.00, 44.10, 48.00 | 48.00 | 5
497 AAC LC + SBR | 160000 - 265999 | 32.00, 44.10, 48.00 | 48.00 | 5.1
461498 -------------------+------------------+-----------------------+------------+-------
462499 AAC LC | 8000 - 15999 | 11.025, 12.00, 16.00 | 12.00 | 1
463500 AAC LC | 16000 - 23999 | 16.00 | 16.00 | 1
480517 -----------------------------------------------------------------------------------
481518 \endverbatim \n
482519
483 \subsection reommendedConfigLD AAC-LD, AAC-ELD, AAC-ELD with SBR.
520 \subsection reommendedConfigLD AAC-LD, AAC-ELD, AAC-ELD with SBR in Dualrate SBR mode.
484521 \verbatim
485522 -----------------------------------------------------------------------------------
486523 Audio Object Type | Bit Rate Range | Supported | Preferred | No. of
488525 | | [kHz] | Rate |
489526 | | | [kHz] |
490527 -------------------+------------------+-----------------------+------------+-------
491 ELD + SBR | 16000 - 24999 | 32.00 - 44.10 | 32.00 | 1
528 ELD + SBR | 18000 - 24999 | 32.00 - 44.10 | 32.00 | 1
492529 ELD + SBR | 25000 - 31999 | 32.00 - 48.00 | 32.00 | 1
493530 ELD + SBR | 32000 - 64000 | 32.00 - 48.00 | 48.00 | 1
494531 -------------------+------------------+-----------------------+------------+-------
495532 ELD + SBR | 32000 - 51999 | 32.00 - 48.00 | 44.10 | 2
496533 ELD + SBR | 52000 - 128000 | 32.00 - 48.00 | 48.00 | 2
497534 -------------------+------------------+-----------------------+------------+-------
498 ELD + SBR | 72000 - 192000 | 44.10 - 48.00 | 48.00 | 3
499 -------------------+------------------+-----------------------+------------+-------
500 ELD + SBR | 96000 - 256000 | 44.10 - 48.00 | 48.00 | 4
501 -------------------+------------------+-----------------------+------------+-------
502 ELD + SBR | 120000 - 320000 | 44.10 - 48.00 | 48.00 | 5
535 ELD + SBR | 72000 - 160000 | 44.10 - 48.00 | 48.00 | 3
536 -------------------+------------------+-----------------------+------------+-------
537 ELD + SBR | 96000 - 212000 | 44.10 - 48.00 | 48.00 | 4
538 -------------------+------------------+-----------------------+------------+-------
539 ELD + SBR | 120000 - 246000 | 44.10 - 48.00 | 48.00 | 5
540 -------------------+------------------+-----------------------+------------+-------
541 ELD + SBR | 120000 - 266000 | 44.10 - 48.00 | 48.00 | 5.1
503542 -------------------+------------------+-----------------------+------------+-------
504543 LD, ELD | 16000 - 19999 | 16.00 - 24.00 | 16.00 | 1
505544 LD, ELD | 20000 - 39999 | 16.00 - 32.00 | 24.00 | 1
530569 -----------------------------------------------------------------------------------
531570 \endverbatim \n
532571
572 \subsection reommendedConfigELD AAC-ELD with SBR in Downsampled SBR mode.
573 \verbatim
574 -----------------------------------------------------------------------------------
575 Audio Object Type | Bit Rate Range | Supported | Preferred | No. of
576 | [bit/s] | Sampling Rates | Sampl. | Chan.
577 | | [kHz] | Rate |
578 | | | [kHz] |
579 -------------------+------------------+-----------------------+------------+-------
580 ELD + SBR | 18000 - 24999 | 16.00 - 22.05 | 22.05 | 1
581 (downsampled SBR) | 25000 - 35999 | 22.05 - 32.00 | 24.00 | 1
582 | 36000 - 64000 | 32.00 - 48.00 | 32.00 | 1
583 -----------------------------------------------------------------------------------
584 \endverbatim \n
585
586
533587 \page ENCODERBEHAVIOUR Encoder Behaviour
534588
535589 \section BEHAVIOUR_BANDWIDTH Bandwidth
536590
537591 The FDK AAC encoder usually does not use the full frequency range of the input signal, but restricts the bandwidth
538592 according to certain library-internal settings. They can be changed in the table "bandWidthTable" in the
539 file bandwidth.cpp (if available), or via command-line argument "-w" (see chapter \ref CommandLineUsage).
593 file bandwidth.cpp (if available).
594
595 The encoder API provides the ::AACENC_BANDWIDTH parameter to adjust the bandwidth explicitly.
596 \code
597 aacEncoder_SetParam(hAacEncoder, AACENC_BANDWIDTH, value);
598 \endcode
540599
541600 However it is not recommended to change these settings, because they are based on numerious listening
542601 tests and careful tweaks to ensure the best overall encoding quality.
637696 If SBR is activated, the encoder automatically deactivates PNS internally. If TNS is disabled but PNS is allowed,
638697 the encoder deactivates PNS calculation internally.
639698
640
641699 */
642700
643701 #ifndef _AAC_ENC_LIB_H_
646704 #include "machine_type.h"
647705 #include "FDK_audio.h"
648706
707 #define AACENCODER_LIB_VL0 3
708 #define AACENCODER_LIB_VL1 4
709 #define AACENCODER_LIB_VL2 12
649710
650711 /**
651712 * AAC encoder error codes.
857918 AACENC_SAMPLERATE = 0x0103, /*!< Audio input data sampling rate. Encoder supports following sampling rates:
858919 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000 */
859920
860 AACENC_SBR_MODE = 0x0104, /*!< Configure SBR independently of the chosen Audio Object Type ::AUDIO_OBJECT_TYPE:.
861 This parameter is only available for ELD.
921 AACENC_SBR_MODE = 0x0104, /*!< Configure SBR independently of the chosen Audio Object Type ::AUDIO_OBJECT_TYPE.
922 This parameter is for ELD audio object type only.
923 - -1: Use ELD SBR auto configurator (default).
862924 - 0: Disable Spectral Band Replication.
863925 - 1: Enable Spectral Band Replication. */
864926
868930 - 480: Optional length in LD/ELD configuration. */
869931
870932 AACENC_CHANNELMODE = 0x0106, /*!< Set explicit channel mode. Channel mode must match with number of input channels.
871 - 1-6: MPEG channel modes supported, see ::CHANNEL_MODE in FDK_audio.h. */
933 - 1-7 and 33,34: MPEG channel modes supported, see ::CHANNEL_MODE in FDK_audio.h. */
872934
873935 AACENC_CHANNELORDER = 0x0107, /*!< Input audio data channel ordering scheme:
874936 - 0: MPEG channel ordering (e. g. 5.1: C, L, R, SL, SR, LFE). (default)
875937 - 1: WAVE file format channel ordering (e. g. 5.1: L, R, C, LFE, SL, SR). */
938
939 AACENC_SBR_RATIO = 0x0108, /*!< Controls activation of downsampled SBR. With downsampled SBR, the delay will be
940 shorter. On the other hand, for achieving the same quality level, downsampled SBR
941 needs more bits than dual-rate SBR.
942 With downsampled SBR, the AAC encoder will work at the same sampling rate as the
943 SBR encoder (single rate).
944 Downsampled SBR is supported for AAC-ELD and HE-AACv1.
945 - 1: Downsampled SBR (default for ELD).
946 - 2: Dual-rate SBR (default for HE-AAC). */
876947
877948 AACENC_AFTERBURNER = 0x0200, /*!< This parameter controls the use of the afterburner feature.
878949 The afterburner is a type of analysis by synthesis algorithm which increases the
905976 - n: Frame count period. */
906977
907978 AACENC_SIGNALING_MODE = 0x0302, /*!< Signaling mode of the extension AOT:
908 - 0: Implicit backward compatible signaling. (default)
909 - 1: Explicit SBR and implicit PS signaling.
910 - 2: Explicit hierarchical signaling.
911
912 The use of backward-compatible implicit signaling is recommended if the user specically
913 aims at preserving compatibility with decoders only capable of decoding AAC-LC. Otherwise
914 use non-backward-compatible explicit signaling.
915 Bitstream formats ADTS and ADIF can only do implicit signaling. */
979 - 0: Implicit backward compatible signaling (default for non-MPEG-4 based
980 AOT's and for the transport formats ADIF and ADTS)
981 - A stream that uses implicit signaling can be decoded by every AAC decoder, even AAC-LC-only decoders
982 - An AAC-LC-only decoder will only decode the low-frequency part of the stream, resulting in a band-limited output
983 - This method works with all transport formats
984 - This method does not work with downsampled SBR
985 - 1: Explicit backward compatible signaling
986 - A stream that uses explicit backward compatible signaling can be decoded by every AAC decoder, even AAC-LC-only decoders
987 - An AAC-LC-only decoder will only decode the low-frequency part of the stream, resulting in a band-limited output
988 - A decoder not capable of decoding PS will only decode the AAC-LC+SBR part.
989 If the stream contained PS, the result will be a a decoded mono downmix
990 - This method does not work with ADIF or ADTS. For LOAS/LATM, it only works with AudioMuxVersion==1
991 - This method does work with downsampled SBR
992 - 2: Explicit hierarchical signaling (default for MPEG-4 based AOT's and for all transport formats excluding ADIF and ADTS)
993 - A stream that uses explicit hierarchical signaling can be decoded only by HE-AAC decoders
994 - An AAC-LC-only decoder will not decode a stream that uses explicit hierarchical signaling
995 - A decoder not capable of decoding PS will not decode the stream at all if it contained PS
996 - This method does not work with ADIF or ADTS. It works with LOAS/LATM and the MPEG-4 File format
997 - This method does work with downsampled SBR
998
999 For making sure that the listener always experiences the best audio quality,
1000 explicit hierarchical signaling should be used.
1001 This makes sure that only a full HE-AAC-capable decoder will decode those streams.
1002 The audio is played at full bandwidth.
1003 For best backwards compatibility, it is recommended to encode with implicit SBR signaling.
1004 A decoder capable of AAC-LC only will then only decode the AAC part, which means the decoded
1005 audio will sound band-limited.
1006
1007 For MPEG-2 transport types (ADTS,ADIF), only implicit signaling is possible.
1008
1009 For LOAS and LATM, explicit backwards compatible signaling only works together with AudioMuxVersion==1.
1010 The reason is that, for explicit backwards compatible signaling, additional information will be appended to the ASC.
1011 A decoder that is only capable of decoding AAC-LC will skip this part.
1012 Nevertheless, for jumping to the end of the ASC, it needs to know the ASC length.
1013 Transmitting the length of the ASC is a feature of AudioMuxVersion==1, it is not possible to transmit the
1014 length of the ASC with AudioMuxVersion==0, therefore an AAC-LC-only decoder will not be able to parse a
1015 LOAS/LATM stream that was being encoded with AudioMuxVersion==0.
1016
1017 For downsampled SBR, explicit signaling is mandatory. The reason for this is that the
1018 extension sampling frequency (which is in case of SBR the sampling frequqncy of the SBR part)
1019 can only be signaled in explicit mode.
1020
1021 For AAC-ELD, the SBR information is transmitted in the ELDSpecific Config, which is part of the
1022 AudioSpecificConfig. Therefore, the settings here will have no effect on AAC-ELD.*/
9161023
9171024 AACENC_TPSUBFRAMES = 0x0303, /*!< Number of sub frames in a transport frame for LOAS/LATM or ADTS (default 1).
9181025 - ADTS: Maximum number of sub frames restricted to 4.
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
8888 ******************************************************************************/
8989 /*!
9090 \file
91 \brief Memory layout
91 \brief Memory layout
9292 \author Markus Lohwasser
9393 */
9494
118118 PsyInputBuffer.
119119 */
120120
121 C_ALLOC_MEM2 (Ram_aacEnc_PsyElement, PSY_ELEMENT, 1, (6))
121 C_ALLOC_MEM2 (Ram_aacEnc_PsyElement, PSY_ELEMENT, 1, (8))
122122
123123 C_ALLOC_MEM (Ram_aacEnc_PsyInternal, PSY_INTERNAL, 1)
124 C_ALLOC_MEM2 (Ram_aacEnc_PsyStatic, PSY_STATIC, 1, (6))
124 C_ALLOC_MEM2 (Ram_aacEnc_PsyStatic, PSY_STATIC, 1, (8))
125125
126 C_ALLOC_MEM2 (Ram_aacEnc_PsyInputBuffer, INT_PCM, MAX_INPUT_BUFFER_SIZE, (6))
126 C_ALLOC_MEM2 (Ram_aacEnc_PsyInputBuffer, INT_PCM, MAX_INPUT_BUFFER_SIZE, (8))
127127
128128 PSY_DYNAMIC *GetRam_aacEnc_PsyDynamic (int n, UCHAR* dynamic_RAM) {
129129 FDK_ASSERT(dynamic_RAM!=0);
138138 */
139139 C_ALLOC_MEM2 (Ram_aacEnc_PsyOut, PSY_OUT, 1, (1))
140140
141 C_ALLOC_MEM2 (Ram_aacEnc_PsyOutElements, PSY_OUT_ELEMENT, 1, (1)*(6))
142 C_ALLOC_MEM2 (Ram_aacEnc_PsyOutChannel, PSY_OUT_CHANNEL, 1, (1)*(6))
141 C_ALLOC_MEM2 (Ram_aacEnc_PsyOutElements, PSY_OUT_ELEMENT, 1, (1)*(8))
142 C_ALLOC_MEM2 (Ram_aacEnc_PsyOutChannel, PSY_OUT_CHANNEL, 1, (1)*(8))
143143
144144
145145 /*
154154 C_ALLOC_MEM (Ram_aacEnc_QCstate, QC_STATE, 1)
155155 C_ALLOC_MEM (Ram_aacEnc_AdjustThreshold, ADJ_THR_STATE, 1)
156156
157 C_ALLOC_MEM2 (Ram_aacEnc_AdjThrStateElement, ATS_ELEMENT, 1, (6))
158 C_ALLOC_MEM2 (Ram_aacEnc_ElementBits, ELEMENT_BITS, 1, (6))
157 C_ALLOC_MEM2 (Ram_aacEnc_AdjThrStateElement, ATS_ELEMENT, 1, (8))
158 C_ALLOC_MEM2 (Ram_aacEnc_ElementBits, ELEMENT_BITS, 1, (8))
159159 C_ALLOC_MEM (Ram_aacEnc_BitCntrState, BITCNTR_STATE, 1)
160160
161161 INT *GetRam_aacEnc_BitLookUp(int n, UCHAR* dynamic_RAM) {
174174 */
175175
176176 C_ALLOC_MEM2 (Ram_aacEnc_QCout, QC_OUT, 1, (1))
177 C_ALLOC_MEM2 (Ram_aacEnc_QCelement, QC_OUT_ELEMENT, 1, (1)*(6))
177 C_ALLOC_MEM2 (Ram_aacEnc_QCelement, QC_OUT_ELEMENT, (1), (8))
178178 QC_OUT_CHANNEL *GetRam_aacEnc_QCchannel (int n, UCHAR* dynamic_RAM) {
179179 FDK_ASSERT(dynamic_RAM!=0);
180180 return ((QC_OUT_CHANNEL*) (dynamic_RAM + P_BUF_0 + n*sizeof(QC_OUT_CHANNEL)));
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
117117 */
118118
119119 /* define hBitstream size: max AAC framelength is 6144 bits/channel */
120 /*#define BUFFER_BITSTR_SIZE ((6400*(6)/bbWordSize) +((bbWordSize - 1) / bbWordSize))*/
120 /*#define BUFFER_BITSTR_SIZE ((6400*(8)/bbWordSize) +((bbWordSize - 1) / bbWordSize))*/
121121
122122 struct AAC_ENC {
123123
172172 ++++++++++++++++++++++++++++++++++++++++++++
173173 */
174174
175 #define BUF_SIZE_0 ( ALIGN_SIZE(sizeof(QC_OUT_CHANNEL)*(6)) )
175 #define BUF_SIZE_0 ( ALIGN_SIZE(sizeof(QC_OUT_CHANNEL)*(8)) )
176176 #define BUF_SIZE_1 ( ALIGN_SIZE(maxSize(sizeof(PSY_DYNAMIC), \
177177 (BIT_LOOK_UP_SIZE+MERGE_GAIN_LOOK_UP_SIZE))) )
178178
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
392392 /******************* sanity checks *******************/
393393
394394 /* check config structure */
395 if (config->nChannels < 1 || config->nChannels > (6)) {
395 if (config->nChannels < 1 || config->nChannels > (8)) {
396396 return AAC_ENC_UNSUPPORTED_CHANNELCONFIG;
397397 }
398398
557557 qcInit.channelMapping = &hAacEnc->channelMapping;
558558 qcInit.sceCpe = 0;
559559
560 if ((config->bitrateMode>=1) && (config->bitrateMode<=5)) {
561 qcInit.averageBits = (averageBitsPerFrame+7)&~7;
562 qcInit.bitRes = MIN_BUFSIZE_PER_EFF_CHAN*cm->nChannelsEff;
563 qcInit.maxBits = MIN_BUFSIZE_PER_EFF_CHAN*cm->nChannelsEff;
564 qcInit.minBits = 0;
565 }
566 else
560567 {
561568 int maxBitres;
562569 qcInit.averageBits = (averageBitsPerFrame+7)&~7;
570577 qcInit.minBits = (config->minBitsPerFrame!=-1) ? fixMax(qcInit.minBits, config->minBitsPerFrame) : qcInit.minBits;
571578 }
572579
580 qcInit.sampleRate = config->sampleRate;
581 qcInit.advancedBitsToPe = isLowDelay(config->audioObjectType) ? 1 : 0 ;
573582 qcInit.nSubFrames = config->nSubFrames;
574583 qcInit.padding.paddingRest = config->sampleRate;
575584
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
112112 /* initialization errors */
113113 aac_enc_init_error_start = 0x2000,
114114 AAC_ENC_INVALID_HANDLE = 0x2020, /*!< The handle passed to the function call was invalid (probably NULL). */
115 AAC_ENC_INVALID_FRAME_LENGTH = 0x2080, /*!< Invalid frame length (must be 1024 or 960). */
115 AAC_ENC_INVALID_FRAME_LENGTH = 0x2080, /*!< Invalid frame length. */
116116 AAC_ENC_INVALID_N_CHANNELS = 0x20e0, /*!< Invalid amount of audio input channels. */
117117 AAC_ENC_INVALID_SFB_TABLE = 0x2140, /*!< Internal encoder error. */
118118
153153
154154 #define ANC_DATA_BUFFERSIZE 1024 /* ancBuffer size */
155155
156 #define MAX_TOTAL_EXT_PAYLOADS (((6) * (1)) + (2+2))
156 #define MAX_TOTAL_EXT_PAYLOADS (((8) * (1)) + (2+2))
157157
158158
159159 typedef enum {
203203 INT minBitsPerFrame; /* minimum number of bits in AU */
204204 INT maxBitsPerFrame; /* maximum number of bits in AU */
205205 INT bitreservoir; /* size of bitreservoir */
206
207 UINT sbrRatio; /* sbr sampling rate ratio: dual- or single-rate */
206208
207209 UCHAR useTns; /* flag: use temporal noise shaping */
208210 UCHAR usePns; /* flag: use perceptual noise substitution */
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
9696
9797 /* Encoder library info */
9898 #define AACENCODER_LIB_VL0 3
99 #define AACENCODER_LIB_VL1 3
100 #define AACENCODER_LIB_VL2 3
99 #define AACENCODER_LIB_VL1 4
100 #define AACENCODER_LIB_VL2 12
101101 #define AACENCODER_LIB_TITLE "AAC Encoder"
102102 #define AACENCODER_LIB_BUILD_DATE __DATE__
103103 #define AACENCODER_LIB_BUILD_TIME __TIME__
117117 #define SBL(fl) (fl/8) /*!< Short block length (hardcoded to 8 short blocks per long block) */
118118 #define BSLA(fl) (4*SBL(fl)+SBL(fl)/2) /*!< AAC block switching look-ahead */
119119 #define DELAY_AAC(fl) (fl+BSLA(fl)) /*!< MDCT + blockswitching */
120 #define DELAY_AACELD(fl) ( (fl) + ((fl)/2) ) /*!< ELD FB delay */
120 #define DELAY_AACELD(fl) ((fl)/2) /*!< ELD FB delay (no framing delay included) */
121121
122122 #define INPUTBUFFER_SIZE (1537+100+2048)
123
124 #define DEFAULT_HEADER_PERIOD_REPETITION_RATE 10 /*!< Default header repetition rate used in transport library and for SBR header. */
123125
124126 ////////////////////////////////////////////////////////////////////////////////////
125127 /**
163165
164166 UCHAR userMetaDataMode; /*!< Meta data library configuration. */
165167
166 UCHAR userSbrEnabled;
168 UCHAR userSbrEnabled; /*!< Enable SBR for ELD. */
169 UINT userSbrRatio; /*!< SBR sampling rate ratio. Dual- or single-rate. */
167170
168171 } USER_PARAM;
169172
211214
212215 AACENC_EXT_PAYLOAD extPayload [MAX_TOTAL_EXT_PAYLOADS];
213216 /* Extension payload */
214 UCHAR extPayloadData [(1)][(6)][MAX_PAYLOAD_SIZE];
215 UINT extPayloadSize [(1)][(6)]; /* payload sizes in bits */
217 UCHAR extPayloadData [(1)][(8)][MAX_PAYLOAD_SIZE];
218 UINT extPayloadSize [(1)][(8)]; /* payload sizes in bits */
216219
217220 ULONG InitFlags; /* internal status to treggier re-initialization */
218221
226229
227230 UINT encoder_modis;
228231
229 /* Capabity flags */
232 /* Capability flags */
230233 UINT CAPF_tpEnc;
231234
232235 } ;
233236
234 ////////////////////////////////////////////////////////////////////////////////////
237 typedef struct
238 {
239 ULONG samplingRate; /*!< Encoder output sampling rate. */
240 ULONG bitrateRange; /*!< Lower bitrate range for config entry. */
241
242 UCHAR lowDelaySbr; /*!< 0: ELD sbr off,
243 1: ELD sbr on */
244
245 UCHAR downsampledSbr; /*!< 0: ELD with dualrate sbr,
246 1: ELD with downsampled sbr */
247
248 } ELD_SBR_CONFIGURATOR;
249
250 /**
251 * \brief This table defines ELD/SBR default configurations.
252 */
253 static const ELD_SBR_CONFIGURATOR eldSbrAutoConfigTab[] =
254 {
255 { 48000, 0, 1, 0 },
256 { 48000, 64001, 0, 0 },
257
258 { 44100, 0, 1, 0 },
259 { 44100, 64001, 0, 0 },
260
261 { 32000, 0, 1, 0 },
262 { 32000, 28000, 1, 1 },
263 { 32000, 56000, 0, 0 },
264
265 { 24000, 0, 1, 1 },
266 { 24000, 40000, 0, 0 },
267
268 { 16000, 0, 1, 1 },
269 { 16000, 28000, 0, 0 }
270
271 };
272
273 /*
274 * \brief Configure SBR for ELD configuration.
275 *
276 * This function finds default SBR configuration for ELD based on sampling rate and channel bitrate.
277 * Outputparameters are SBR on/off, and SBR ratio.
278 *
279 * \param samplingRate Audio signal sampling rate.
280 * \param channelMode Channel configuration to be used.
281 * \param totalBitrate Overall bitrate.
282 * \param eldSbr Pointer to eldSbr parameter, filled on return.
283 * \param eldSbrRatio Pointer to eldSbrRatio parameter, filled on return.
284 *
285 * \return - AACENC_OK, all fine.
286 * - AACENC_INVALID_CONFIG, on failure.
287 */
288 static AACENC_ERROR eldSbrConfigurator(
289 const ULONG samplingRate,
290 const CHANNEL_MODE channelMode,
291 const ULONG totalBitrate,
292 UINT * const eldSbr,
293 UINT * const eldSbrRatio
294 )
295 {
296 AACENC_ERROR err = AACENC_OK;
297 int i, cfgIdx = -1;
298 const ULONG channelBitrate = totalBitrate / FDKaacEnc_GetChannelModeConfiguration(channelMode)->nChannelsEff;
299
300 for (i=0; i<(sizeof(eldSbrAutoConfigTab)/sizeof(ELD_SBR_CONFIGURATOR)); i++) {
301 if ( (samplingRate <= eldSbrAutoConfigTab[i].samplingRate)
302 && (channelBitrate >= eldSbrAutoConfigTab[i].bitrateRange) )
303 {
304 cfgIdx = i;
305 }
306 }
307
308 if (cfgIdx != -1) {
309 *eldSbr = (eldSbrAutoConfigTab[cfgIdx].lowDelaySbr==0) ? 0 : 1;
310 *eldSbrRatio = (eldSbrAutoConfigTab[cfgIdx].downsampledSbr==0) ? 2 : 1;
311 }
312 else {
313 err = AACENC_INVALID_CONFIG; /* no default configuration for eld-sbr available. */
314 }
315
316 return err;
317 }
235318
236319 static inline INT isSbrActive(const HANDLE_AACENC_CONFIG hAacConfig)
237320 {
252335 return ( sbrUsed );
253336 }
254337
338 static inline INT isPsActive(const AUDIO_OBJECT_TYPE audioObjectType)
339 {
340 INT psUsed = 0;
341
342 if ( (audioObjectType==AOT_PS)
343 || (audioObjectType==AOT_MP2_PS)
344 || (audioObjectType==AOT_DABPLUS_PS)
345 || (audioObjectType==AOT_DRM_MPEG_PS) )
346 {
347 psUsed = 1;
348 }
349
350 return ( psUsed );
351 }
352
353 static SBR_PS_SIGNALING getSbrSignalingMode(
354 const AUDIO_OBJECT_TYPE audioObjectType,
355 const TRANSPORT_TYPE transportType,
356 const UCHAR transportSignaling,
357 const UINT sbrRatio
358 )
359
360 {
361 SBR_PS_SIGNALING sbrSignaling;
362
363 if (transportType==TT_UNKNOWN || sbrRatio==0) {
364 sbrSignaling = SIG_UNKNOWN; /* Needed parameters have not been set */
365 return sbrSignaling;
366 } else {
367 sbrSignaling = SIG_IMPLICIT; /* default: implicit signaling */
368 }
369
370 if ((audioObjectType==AOT_AAC_LC) || (audioObjectType==AOT_SBR) || (audioObjectType==AOT_PS) ||
371 (audioObjectType==AOT_MP2_AAC_LC) || (audioObjectType==AOT_MP2_SBR) || (audioObjectType==AOT_MP2_PS) ) {
372 switch (transportType) {
373 case TT_MP4_ADIF:
374 case TT_MP4_ADTS:
375 sbrSignaling = SIG_IMPLICIT; /* For MPEG-2 transport types, only implicit signaling is possible */
376 break;
377
378 case TT_MP4_RAW:
379 case TT_MP4_LATM_MCP1:
380 case TT_MP4_LATM_MCP0:
381 case TT_MP4_LOAS:
382 default:
383 if ( transportSignaling==0xFF ) {
384 /* Defaults */
385 if ( sbrRatio==1 ) {
386 sbrSignaling = SIG_EXPLICIT_HIERARCHICAL; /* For downsampled SBR, explicit signaling is mandatory */
387 } else {
388 sbrSignaling = SIG_IMPLICIT; /* For dual-rate SBR, implicit signaling is default */
389 }
390 } else {
391 /* User set parameters */
392 /* Attention: Backward compatible explicit signaling does only work with AMV1 for LATM/LOAS */
393 sbrSignaling = (SBR_PS_SIGNALING)transportSignaling;
394 }
395 break;
396 }
397 }
398
399 return sbrSignaling;
400 }
401
255402 /****************************************************************************
256403 Allocate Encoder
257404 ****************************************************************************/
265412 /*
266413 * Map Encoder specific config structures to CODER_CONFIG.
267414 */
268 static
269 void FDKaacEnc_MapConfig(CODER_CONFIG *cc, USER_PARAM *extCfg, HANDLE_AACENC_CONFIG hAacConfig)
415 static void FDKaacEnc_MapConfig(
416 CODER_CONFIG *const cc,
417 const USER_PARAM *const extCfg,
418 const SBR_PS_SIGNALING sbrSignaling,
419 const HANDLE_AACENC_CONFIG hAacConfig
420 )
270421 {
271422 AUDIO_OBJECT_TYPE transport_AOT = AOT_NULL_OBJECT;
272423 FDKmemclear(cc, sizeof(CODER_CONFIG));
303454 }
304455
305456 /* Configure extension aot. */
306 if (extCfg->userTpSignaling==0) {
457 if (sbrSignaling==SIG_IMPLICIT) {
307458 cc->extAOT = AOT_NULL_OBJECT; /* implicit */
308459 }
309460 else {
310 if ( (extCfg->userTpSignaling==1) && ( (transport_AOT==AOT_SBR) || (transport_AOT==AOT_PS) ) ) {
461 if ( (sbrSignaling==SIG_EXPLICIT_BW_COMPATIBLE) && ( (transport_AOT==AOT_SBR) || (transport_AOT==AOT_PS) ) ) {
311462 cc->extAOT = AOT_SBR; /* explicit backward compatible */
312463 }
313464 else {
314465 cc->extAOT = transport_AOT; /* explicit hierarchical */
315466 }
316467 }
468
469 if ( (transport_AOT==AOT_SBR) || (transport_AOT==AOT_PS) ) {
470 cc->sbrPresent=1;
471 if (transport_AOT==AOT_PS) {
472 cc->psPresent=1;
473 }
474 }
475 cc->sbrSignaling = sbrSignaling;
476
317477 cc->extSamplingRate = extCfg->userSamplerate;
318478 cc->bitRate = hAacConfig->bitRate;
319479 cc->noChannels = hAacConfig->nChannels;
334494 case TT_MP4_ADTS:
335495 case TT_MP4_LOAS:
336496 case TT_MP4_LATM_MCP1:
337 cc->headerPeriod = 10;
497 cc->headerPeriod = DEFAULT_HEADER_PERIOD_REPETITION_RATE;
338498 break;
339499 default:
340500 cc->headerPeriod = 0;
350510 case AOT_MP2_SBR:
351511 case AOT_MP2_PS:
352512 cc->flags &= ~CC_MPEG_ID; /* Required for ADTS. */
353 //config->userTpSignaling=0;
354513 cc->extAOT = AOT_NULL_OBJECT;
355514 break;
356515 default:
410569 /* make reasonable default settings */
411570 FDKaacEnc_AacInitDefaultConfig (hAacConfig);
412571
413 /* clear confure structure and copy default settings */
572 /* clear configuration structure and copy default settings */
414573 FDKmemclear(config, sizeof(USER_PARAM));
415574
416575 /* copy encoder configuration settings */
437596 /* initialize transport parameters */
438597 config->userTpType = TT_UNKNOWN;
439598 config->userTpAmxv = 0;
440 config->userTpSignaling = 0; /* default, implicit signaling */
599 config->userTpSignaling = 0xFF; /* choose signaling automatically */
441600 config->userTpNsubFrames = 1;
442601 config->userTpProtection = 0; /* not crc protected*/
443602 config->userTpHeaderPeriod = 0xFF; /* header period in auto mode */
445604 config->userMetaDataMode = 0; /* do not embed any meta data info */
446605
447606 config->userAncDataRate = 0;
607
608 /* SBR rate is set to 0 here, which means it should be set automatically
609 in FDKaacEnc_AdjustEncSettings() if the user did not set a rate
610 expilicitely. */
611 config->userSbrRatio = 0;
612
613 /* SBR enable set to -1 means to inquire ELD audio configurator for reasonable configuration. */
614 config->userSbrEnabled = -1;
448615
449616 return AAC_ENC_OK;
450617 }
480647 INT bitRate,
481648 const INT nSubFrames,
482649 const INT sbrActive,
650 const INT sbrDownSampleRate,
483651 const AUDIO_OBJECT_TYPE aot
484652 )
485653 {
489657 FDKaacEnc_InitChannelMapping(channelMode, CH_ORDER_MPEG, &cm);
490658
491659 if (sbrActive) {
492 /* Assume SBR rate ratio of 2:1 */
493 coreSamplingRate = samplingRate / 2;
660 coreSamplingRate = samplingRate >> (sbrEncoder_IsSingleRatePossible(aot) ? (sbrDownSampleRate-1):1);
494661 } else {
495662 coreSamplingRate = samplingRate;
496663 }
505672 bitRate = FDKmin(576000*nChannels, bitRate);
506673 /*bitRate = FDKmax(0*nChannels, bitRate);*/
507674 }
508
675
509676
510677 /* Limit bit rate in respect to the core coder */
511678 bitRate = FDKaacEnc_LimitBitrate(
524691 /* Limit bit rate in respect to available SBR modes if active */
525692 if (sbrActive)
526693 {
527 SBR_ELEMENT_INFO sbrElInfo[6];
528 INT sbrBitRate = 0;
529 int e, tooBig=-1;
530
531 FDK_ASSERT(cm.nElements <= (6));
532
533 /* Get bit rate for each SBR element */
534 aacEncDistributeSbrBits(&cm, sbrElInfo, bitRate);
535
536 for (e=0; e<cm.nElements; e++)
537 {
538 INT sbrElementBitRateIn, sbrBitRateOut;
539
540 if (cm.elInfo[e].elType != ID_SCE && cm.elInfo[e].elType != ID_CPE) {
541 continue;
542 }
543 sbrElementBitRateIn = sbrElInfo[e].bitRate;
544 sbrBitRateOut = sbrEncoder_LimitBitRate(sbrElementBitRateIn , cm.elInfo[e].nChannelsInEl, coreSamplingRate, aot);
545 if (sbrBitRateOut == 0) {
546 return 0;
547 }
548 if (sbrElementBitRateIn < sbrBitRateOut) {
549 FDK_ASSERT(tooBig != 1);
550 tooBig = 0;
551 if (e == 0) {
552 sbrBitRate = 0;
553 }
554 }
555 if (sbrElementBitRateIn > sbrBitRateOut) {
556 FDK_ASSERT(tooBig != 0);
557 tooBig = 1;
558 if (e == 0) {
559 sbrBitRate = 5000000;
560 }
561 }
562 if (tooBig != -1)
694 int numIterations = 0;
695 INT initialBitrate, adjustedBitrate;
696 initialBitrate = adjustedBitrate = bitRate;
697
698 /* Find total bitrate which provides valid configuration for each SBR element. */
699 do {
700 int e;
701 SBR_ELEMENT_INFO sbrElInfo[(8)];
702 FDK_ASSERT(cm.nElements <= (8));
703
704 initialBitrate = adjustedBitrate;
705
706 /* Get bit rate for each SBR element */
707 aacEncDistributeSbrBits(&cm, sbrElInfo, initialBitrate);
708
709 for (e=0; e<cm.nElements; e++)
563710 {
564 INT sbrBitRateLimit = (INT)fDivNorm((FIXP_DBL)sbrBitRateOut, cm.elInfo[e].relativeBits);
565 if (tooBig) {
566 sbrBitRate = fMin(sbrBitRate, sbrBitRateLimit-16);
567 FDK_ASSERT( (INT)fMultNorm(cm.elInfo[e].relativeBits, (FIXP_DBL)sbrBitRate) < sbrBitRateOut);
568 } else {
569 sbrBitRate = fMax(sbrBitRate, sbrBitRateLimit+16);
570 FDK_ASSERT( (INT)fMultNorm(cm.elInfo[e].relativeBits, (FIXP_DBL)sbrBitRate) >= sbrBitRateOut);
571 }
572 }
573 }
574 if (tooBig != -1) {
575 bitRate = sbrBitRate;
576 }
711 INT sbrElementBitRateIn, sbrBitRateOut;
712
713 if (cm.elInfo[e].elType != ID_SCE && cm.elInfo[e].elType != ID_CPE) {
714 continue;
715 }
716 sbrElementBitRateIn = sbrElInfo[e].bitRate;
717 sbrBitRateOut = sbrEncoder_LimitBitRate(sbrElementBitRateIn , cm.elInfo[e].nChannelsInEl, coreSamplingRate, aot);
718 if (sbrBitRateOut == 0) {
719 return 0;
720 }
721
722 /* If bitrates don't match, distribution and limiting needs to be determined again.
723 Abort element loop and restart with adapted bitrate. */
724 if (sbrElementBitRateIn != sbrBitRateOut) {
725
726 if (sbrElementBitRateIn < sbrBitRateOut) {
727 adjustedBitrate = fMax(initialBitrate, (INT)fDivNorm((FIXP_DBL)(sbrBitRateOut+8), cm.elInfo[e].relativeBits));
728 break;
729 }
730
731 if (sbrElementBitRateIn > sbrBitRateOut) {
732 adjustedBitrate = fMin(initialBitrate, (INT)fDivNorm((FIXP_DBL)(sbrBitRateOut-8), cm.elInfo[e].relativeBits));
733 break;
734 }
735
736 } /* sbrElementBitRateIn != sbrBitRateOut */
737
738 } /* elements */
739
740 numIterations++; /* restrict iteration to worst case of num elements */
741
742 } while ( (initialBitrate!=adjustedBitrate) && (numIterations<=cm.nElements) );
743
744 /* Unequal bitrates mean that no reasonable bitrate configuration found. */
745 bitRate = (initialBitrate==adjustedBitrate) ? adjustedBitrate : 0;
577746 }
578747
579748 FDK_ASSERT(bitRate > 0);
623792 case AOT_MP2_SBR:
624793 case AOT_MP2_PS:
625794 hAacConfig->usePns = 0;
626 if (config->userTpSignaling!=0) {
627 return AACENC_INVALID_CONFIG; /* only implicit signaling allowed */
628 }
629795 case AOT_AAC_LC:
630796 case AOT_SBR:
631797 case AOT_PS:
632798 config->userTpType = (config->userTpType!=TT_UNKNOWN) ? config->userTpType : TT_MP4_ADTS;
633799 hAacConfig->framelength = (config->userFramelength!=(UINT)-1) ? config->userFramelength : 1024;
634 if (hAacConfig->framelength != 1024 && hAacConfig->framelength != 960) {
635 return AACENC_INVALID_CONFIG;
636 }
637 break;
638 case AOT_ER_AAC_LC:
639 hAacConfig->epConfig = 0;
640 hAacConfig->syntaxFlags |= AC_ER;
641 hAacConfig->syntaxFlags |= ((config->userErTools & 0x1) ? AC_ER_VCB11 : 0);
642 hAacConfig->syntaxFlags |= ((config->userErTools & 0x2) ? AC_ER_HCR : 0);
643 config->userTpType = (config->userTpType!=TT_UNKNOWN) ? config->userTpType : TT_MP4_LOAS;
644 hAacConfig->framelength = (config->userFramelength!=(UINT)-1) ? config->userFramelength : 1024;
645 if (hAacConfig->framelength != 1024 && hAacConfig->framelength != 960) {
800 if (hAacConfig->framelength != 1024) {
646801 return AACENC_INVALID_CONFIG;
647802 }
648803 break;
664819 hAacConfig->syntaxFlags |= ((config->userErTools & 0x1) ? AC_ER_VCB11 : 0);
665820 hAacConfig->syntaxFlags |= ((config->userErTools & 0x2) ? AC_ER_HCR : 0);
666821 hAacConfig->syntaxFlags |= ((config->userErTools & 0x4) ? AC_ER_RVLC : 0);
667 hAacConfig->syntaxFlags |= ((config->userSbrEnabled) ? AC_SBR_PRESENT : 0);
822 hAacConfig->syntaxFlags |= ((config->userSbrEnabled==1) ? AC_SBR_PRESENT : 0);
668823 config->userTpType = (config->userTpType!=TT_UNKNOWN) ? config->userTpType : TT_MP4_LOAS;
669824 hAacConfig->framelength = (config->userFramelength!=(UINT)-1) ? config->userFramelength : 512;
670825 if (hAacConfig->framelength != 512 && hAacConfig->framelength != 480) {
675830 break;
676831 }
677832
833 switch ( hAacConfig->audioObjectType ) {
834 case AOT_ER_AAC_LD:
835 case AOT_ER_AAC_ELD:
836 if (config->userBitrateMode==8) {
837 hAacConfig->bitrateMode = 0;
838 }
839 if (config->userBitrateMode==0) {
840 hAacConfig->bitreservoir = 100*config->nChannels; /* default, reduced bitreservoir */
841 }
842 if (hAacConfig->bitrateMode!=0) {
843 return AACENC_INVALID_CONFIG;
844 }
845 break;
846 default:
847 break;
848 }
849
850 hAacConfig->bitRate = config->userBitrate;
851
852 /* get bitrate in VBR configuration */
853 if ( (hAacConfig->bitrateMode>=1) && (hAacConfig->bitrateMode<=5) ) {
854 /* In VBR mode; SBR-modul depends on bitrate, core encoder on bitrateMode. */
855 hAacConfig->bitRate = FDKaacEnc_GetVBRBitrate(hAacConfig->bitrateMode, hAacConfig->channelMode);
856 }
857
858
859
860 /* Set default bitrate if no external bitrate declared. */
861 if ( (hAacConfig->bitrateMode==0) && (config->userBitrate==(UINT)-1) ) {
862 INT bitrate = FDKaacEnc_GetChannelModeConfiguration(hAacConfig->channelMode)->nChannelsEff * hAacConfig->sampleRate;
863
864 if ( isPsActive(hAacConfig->audioObjectType) ) {
865 hAacConfig->bitRate = (bitrate>>1); /* 0.5 bit per sample */
866 }
867 else if ( isSbrActive(hAacConfig) )
868 {
869 if ( (config->userSbrRatio==2) || ((config->userSbrRatio==0)&&(hAacConfig->audioObjectType!=AOT_ER_AAC_ELD)) ) {
870 hAacConfig->bitRate = (bitrate + (bitrate>>2))>>1; /* 0.625 bits per sample */
871 }
872 if ( (config->userSbrRatio==1) || ((config->userSbrRatio==0)&&(hAacConfig->audioObjectType==AOT_ER_AAC_ELD)) ) {
873 hAacConfig->bitRate = (bitrate + (bitrate>>3)); /* 1.125 bits per sample */
874 }
875 } else
876 {
877 hAacConfig->bitRate = bitrate + (bitrate>>1); /* 1.5 bits per sample */
878 }
879 }
880
881 /* Initialize SBR parameters */
882 if ( (hAacConfig->audioObjectType==AOT_ER_AAC_ELD)
883 && (config->userSbrEnabled == (UCHAR)-1) && (config->userSbrRatio==0) )
884 {
885 UINT eldSbr = 0;
886 UINT eldSbrRatio = 0;
887
888 if ( AACENC_OK!=(err=eldSbrConfigurator(
889 hAacConfig->sampleRate,
890 hAacConfig->channelMode,
891 hAacConfig->bitRate,
892 &eldSbr,
893 &eldSbrRatio)) )
894 {
895 return err;
896 }
897
898 hAacConfig->syntaxFlags |= ((eldSbr) ? AC_SBR_PRESENT : 0);
899 hAacConfig->sbrRatio = eldSbrRatio;
900 }
901 else
902 if ( (config->userSbrRatio==0) && (isSbrActive(hAacConfig)) ) {
903 /* Automatic SBR ratio configuration
904 * - downsampled SBR for ELD
905 * - otherwise always dualrate SBR
906 */
907 hAacConfig->sbrRatio = (hAacConfig->audioObjectType==AOT_ER_AAC_ELD) ? 1 : 2;
908 }
909 else {
910 /* SBR ratio has been set by the user, so use it. */
911 hAacConfig->sbrRatio = config->userSbrRatio;
912 }
913
914 {
915 UCHAR tpSignaling=getSbrSignalingMode(hAacConfig->audioObjectType, config->userTpType, config->userTpSignaling, hAacConfig->sbrRatio);
916
917 if ( (hAacConfig->audioObjectType==AOT_AAC_LC || hAacConfig->audioObjectType==AOT_SBR || hAacConfig->audioObjectType==AOT_PS) &&
918 (config->userTpType==TT_MP4_LATM_MCP1 || config->userTpType==TT_MP4_LATM_MCP0 || config->userTpType==TT_MP4_LOAS) &&
919 (tpSignaling==1) && (config->userTpAmxv==0) ) {
920 /* For backward compatible explicit signaling, AMV1 has to be active */
921 return AACENC_INVALID_CONFIG;
922 }
923
924 if ( (hAacConfig->audioObjectType==AOT_AAC_LC || hAacConfig->audioObjectType==AOT_SBR || hAacConfig->audioObjectType==AOT_PS) &&
925 (tpSignaling==0) && (hAacConfig->sbrRatio==1)) {
926 /* Downsampled SBR has to be signaled explicitely (for transmission of SBR sampling fequency) */
927 return AACENC_INVALID_CONFIG;
928 }
929 }
930
931
932
678933 /* We need the frame length to call aacEncoder_LimitBitrate() */
679934 hAacConfig->bitRate = aacEncoder_LimitBitrate(
680935 NULL,
682937 hAacConfig->framelength,
683938 hAacConfig->nChannels,
684939 hAacConfig->channelMode,
685 config->userBitrate,
940 hAacConfig->bitRate,
686941 hAacConfig->nSubFrames,
687942 isSbrActive(hAacConfig),
943 hAacConfig->sbrRatio,
688944 hAacConfig->audioObjectType
689945 );
690946
691 switch ( hAacConfig->audioObjectType ) {
692 case AOT_ER_AAC_LD:
693 case AOT_ER_AAC_ELD:
694 if (config->userBitrateMode==8) {
695 hAacConfig->bitrateMode = 0;
696 }
697 if (config->userBitrateMode==0) {
698 hAacConfig->bitreservoir = 50*config->nChannels; /* default, reduced bitreservoir */
699 }
700 if (hAacConfig->bitrateMode!=0) {
701 return AACENC_INVALID_CONFIG;
702 }
703 break;
704 default:
705 break;
947 /* Configure PNS */
948 if ( ((hAacConfig->bitrateMode>=1) && (hAacConfig->bitrateMode<=5)) /* VBR without PNS. */
949 || (hAacConfig->useTns == 0) ) /* TNS required. */
950 {
951 hAacConfig->usePns = 0;
706952 }
707953
708954 if (hAacConfig->epConfig >= 0) {
724970 return AACENC_INVALID_CONFIG; /* not enough channels allocated */
725971 }
726972
727 /* get bitrate in VBR configuration */
728 if ( (hAacConfig->bitrateMode>=1) && (hAacConfig->bitrateMode<=5) ) {
729 /* In VBR mode; SBR-modul depends on bitrate, core encoder on bitrateMode. */
730 hAacConfig->bitRate = FDKaacEnc_GetVBRBitrate(hAacConfig->bitrateMode, hAacConfig->channelMode);
731 }
732
733
734
735 /* Set default bitrate if no external bitrate declared. */
736 if (hAacConfig->bitRate==-1) {
737 INT bitrate = FDKaacEnc_GetChannelModeConfiguration(hAacConfig->channelMode)->nChannelsEff * hAacConfig->sampleRate;
738 switch (hAacConfig->audioObjectType)
739 {
740 case AOT_AAC_LC:
741 hAacConfig->bitRate = bitrate + (bitrate>>1); /* 1.5 bits per sample */
742 break;
743 case AOT_SBR:
744 hAacConfig->bitRate = (bitrate + (bitrate>>2))>>1; /* 0.625 bits per sample */
745 break;
746 case AOT_PS:
747 hAacConfig->bitRate = (bitrate>>1); /* 0.5 bit per sample */
748 break;
749 default:
750 hAacConfig->bitRate = bitrate;
751 break;
752 }
753 }
754
755 /* Configure PNS */
756 if ( ((hAacConfig->bitrateMode>=1) && (hAacConfig->bitrateMode<=5)) /* VBR without PNS. */
757 || (hAacConfig->useTns == 0) ) /* TNS required. */
758 {
759 hAacConfig->usePns = 0;
760 }
761
762973 /* Meta data restriction. */
763974 switch (hAacConfig->audioObjectType)
764975 {
765976 /* Allow metadata support */
766977 case AOT_AAC_LC:
767978 case AOT_SBR:
979 case AOT_PS:
768980 hAacEncoder->metaDataAllowed = 1;
769981 if (((INT)hAacConfig->channelMode < 1) || ((INT)hAacConfig->channelMode > 7)) {
770982 config->userMetaDataMode = 0;
8481060 ((InitFlags & AACENC_INIT_CONFIG) || (InitFlags & AACENC_INIT_STATES)) )
8491061 {
8501062 INT sbrError;
851 SBR_ELEMENT_INFO sbrElInfo[(6)];
1063 SBR_ELEMENT_INFO sbrElInfo[(8)];
8521064 CHANNEL_MAPPING channelMapping;
853
854 AUDIO_OBJECT_TYPE aot = hAacConfig->audioObjectType;
8551065
8561066 if ( FDKaacEnc_InitChannelMapping(hAacConfig->channelMode,
8571067 hAacConfig->channelOrder,
8611071 }
8621072
8631073 /* Check return value and if the SBR encoder can handle enough elements */
864 if (channelMapping.nElements > (6)) {
1074 if (channelMapping.nElements > (8)) {
8651075 return AACENC_INIT_ERROR;
8661076 }
8671077
8801090 &aacBufferOffset,
8811091 &hAacConfig->nChannels,
8821092 &hAacConfig->sampleRate,
1093 &hAacConfig->sbrRatio,
8831094 &frameLength,
884 &hAacConfig->audioObjectType,
1095 hAacConfig->audioObjectType,
8851096 &hAacEncoder->nDelay,
8861097 (hAacConfig->audioObjectType == AOT_ER_AAC_ELD) ? 1 : TRANS_FAC,
1098 (config->userTpHeaderPeriod!=0xFF) ? config->userTpHeaderPeriod : DEFAULT_HEADER_PERIOD_REPETITION_RATE,
8871099 initFlag
8881100 );
8891101
8901102 /* Suppress AOT reconfiguration and check error status. */
891 if ( sbrError || (hAacConfig->audioObjectType!=aot) ) {
1103 if (sbrError) {
8921104 return AACENC_INIT_SBR_ERROR;
8931105 }
8941106
9141126 {
9151127 UINT flags = 0;
9161128
917 FDKaacEnc_MapConfig(&hAacEncoder->coderConfig, config, hAacConfig);
1129 FDKaacEnc_MapConfig(
1130 &hAacEncoder->coderConfig,
1131 config,
1132 getSbrSignalingMode(hAacConfig->audioObjectType, config->userTpType, config->userTpSignaling, hAacConfig->sbrRatio),
1133 hAacConfig);
9181134
9191135 /* create flags for transport encoder */
9201136 if (config->userTpAmxv == 1) {
9571173 INT inputDataDelay = DELAY_AAC(hAacConfig->framelength);
9581174
9591175 if ( isSbrActive(hAacConfig) && hSbrEncoder!=NULL) {
960 inputDataDelay = 2*inputDataDelay + sbrEncoder_GetInputDataDelay(*hSbrEncoder);
1176 inputDataDelay = hAacConfig->sbrRatio*inputDataDelay + sbrEncoder_GetInputDataDelay(*hSbrEncoder);
9611177 }
9621178
9631179 if ( FDK_MetadataEnc_Init(hAacEncoder->hMetadataEnc,
10321248
10331249 /* Determine max channel configuration. */
10341250 if (maxChannels==0) {
1035 hAacEncoder->nMaxAacChannels = (6);
1036 hAacEncoder->nMaxSbrChannels = (6);
1251 hAacEncoder->nMaxAacChannels = (8);
1252 hAacEncoder->nMaxSbrChannels = (8);
10371253 }
10381254 else {
10391255 hAacEncoder->nMaxAacChannels = (maxChannels&0x00FF);
10411257 hAacEncoder->nMaxSbrChannels = (maxChannels&0xFF00) ? (maxChannels>>8) : hAacEncoder->nMaxAacChannels;
10421258 }
10431259
1044 if ( (hAacEncoder->nMaxAacChannels>(6)) || (hAacEncoder->nMaxSbrChannels>(6)) ) {
1260 if ( (hAacEncoder->nMaxAacChannels>(8)) || (hAacEncoder->nMaxSbrChannels>(8)) ) {
10451261 err = AACENC_INVALID_CONFIG;
10461262 goto bail;
10471263 }
10481264 } /* maxChannels==0 */
10491265
10501266 /* Max number of elements could be tuned any more. */
1051 hAacEncoder->nMaxAacElements = fixMin((6), hAacEncoder->nMaxAacChannels);
1052 hAacEncoder->nMaxSbrElements = fixMin((6), hAacEncoder->nMaxSbrChannels);
1267 hAacEncoder->nMaxAacElements = fixMin((8), hAacEncoder->nMaxAacChannels);
1268 hAacEncoder->nMaxSbrElements = fixMin((8), hAacEncoder->nMaxSbrChannels);
10531269 hAacEncoder->nMaxSubFrames = (1);
10541270
10551271
11071323 goto bail;
11081324 }
11091325 else {
1110 C_ALLOC_SCRATCH_START(pLibInfo, LIB_INFO, FDK_MODULE_LAST);
1326 C_ALLOC_SCRATCH_START(pLibInfo, LIB_INFO, FDK_MODULE_LAST);
11111327
11121328 FDKinitLibInfo( pLibInfo);
11131329 transportEnc_GetLibInfo( pLibInfo );
13421558 for (i=0; i<(INT)nMetaDataExtensions; i++) { /* Get meta data extension payload. */
13431559 hAacEncoder->extPayload[nExtensions++] = pMetaDataExtPayload[i];
13441560 }
1345 if (matrix_mixdown_idx!=-1) { /* Set matrix mixdown coefficient. */
1346 UINT pceValue = (UINT)( (1<<3) | ((matrix_mixdown_idx&0x2)<<1) | 1 );
1561
1562 if ( (matrix_mixdown_idx!=-1)
1563 && ((hAacEncoder->extParam.userChannelMode==MODE_1_2_2)||(hAacEncoder->extParam.userChannelMode==MODE_1_2_2_1)) )
1564 {
1565 /* Set matrix mixdown coefficient. */
1566 UINT pceValue = (UINT)( (1<<3) | ((matrix_mixdown_idx&0x3)<<1) | 1 );
13471567 if (hAacEncoder->extParam.userPceAdditions != pceValue) {
13481568 hAacEncoder->extParam.userPceAdditions = pceValue;
13491569 hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT;
13741594 }
13751595 else {
13761596 /* Add SBR extension payload */
1377 for (i = 0; i < (6); i++) {
1597 for (i = 0; i < (8); i++) {
13781598 if (hAacEncoder->extPayloadSize[nPayload][i] > 0) {
13791599 hAacEncoder->extPayload[nExtensions].pData = hAacEncoder->extPayloadData[nPayload][i];
13801600 {
15721792 }
15731793 case AOT_AAC_LC:
15741794 case AOT_MP2_AAC_LC:
1575 case AOT_ER_AAC_LC:
15761795 case AOT_ER_AAC_LD:
15771796 case AOT_ER_AAC_ELD:
15781797 if (!(hAacEncoder->encoder_modis & (ENC_MODE_FLAG_AAC))) {
16351854 }
16361855 if ( (pConfig->nElements > hAacEncoder->nMaxAacElements)
16371856 || (pConfig->nChannelsEff > hAacEncoder->nMaxAacChannels)
1638 || !((value>=1) && (value<=6))
1857 || !(((value>=1) && (value<=7))||((value>=33) && (value<=34)))
16391858 )
16401859 {
16411860 err = AACENC_INVALID_CONFIG;
16901909 }
16911910 }
16921911 break;
1912 case AACENC_SBR_RATIO:
1913 if (settings->userSbrRatio != value) {
1914 if (! ((value==0) || (value==1) || (value==2)) ) {
1915 err = AACENC_INVALID_CONFIG;
1916 break;
1917 }
1918 settings->userSbrRatio = value;
1919 hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_STATES | AACENC_INIT_TRANSPORT;
1920 }
1921 break;
16931922 case AACENC_SBR_MODE:
16941923 if (settings->userSbrEnabled != value) {
16951924 settings->userSbrEnabled = value;
18112040 value = (UINT)hAacEncoder->aacConfig.bitrateMode;
18122041 break;
18132042 case AACENC_SAMPLERATE:
1814 value = (UINT)settings->userSamplerate;
2043 value = (UINT)hAacEncoder->coderConfig.extSamplingRate;
18152044 break;
18162045 case AACENC_CHANNELMODE:
18172046 value = (UINT)hAacEncoder->aacConfig.channelMode;
18282057 case AACENC_GRANULE_LENGTH:
18292058 value = (UINT)hAacEncoder->aacConfig.framelength;
18302059 break;
2060 case AACENC_SBR_RATIO:
2061 value = isSbrActive(&hAacEncoder->aacConfig) ? hAacEncoder->aacConfig.sbrRatio : 0;
2062 break;
18312063 case AACENC_SBR_MODE:
18322064 value = (UINT) (hAacEncoder->aacConfig.syntaxFlags & AC_SBR_PRESENT) ? 1 : 0;
18332065 break;
18352067 value = (UINT)settings->userTpType;
18362068 break;
18372069 case AACENC_SIGNALING_MODE:
1838 value = (UINT)settings->userTpSignaling;
2070 value = (UINT)getSbrSignalingMode(hAacEncoder->aacConfig.audioObjectType, settings->userTpType, settings->userTpSignaling, hAacEncoder->aacConfig.sbrRatio);
18392071 break;
18402072 case AACENC_PROTECTION:
18412073 value = (UINT)settings->userTpProtection;
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
8282
8383 /******************************** MPEG Audio Encoder **************************
8484
85 Initial author: Alex Groeschel
85 Initial author: Alex Groeschel, Tobias Chalupka
8686 contents/description: Temporal noise shaping
8787
8888 ******************************************************************************/
280280 int maxBandsTabSize = 0;
281281
282282 switch (granuleLength) {
283 case 960:
284283 case 1024:
285284 pMaxBandsTab = tnsMaxBandsTab1024;
286285 maxBandsTabSize = sizeof(tnsMaxBandsTab1024)/sizeof(TNS_MAX_TAB_ENTRY);
403402 tC->lpcStopLine = pC->sfbOffset[tC->lpcStopBand];
404403
405404 switch (granuleLength) {
406 case 960:
407405 case 1024:
408406 /* TNS start line: skip lower MDCT lines to prevent artifacts due to filter mismatch */
409407 tC->lpcStartBand[LOFILT] = (blockType == SHORT_WINDOW) ? 0 : ((sampleRate < 18783) ? 4 : 8);
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
122122 static const FIXP_DBL SnrLdMin5 = (FIXP_DBL)0xfc000000; /*FL2FXCONST_DBL(FDKlog(0.25) /FDKlog(2.0)/LD_DATA_SCALING);*/
123123
124124
125 /*
126 The bits2Pe factors are choosen for the case that some times
127 the crash recovery strategy will be activated once.
128 */
129
130 typedef struct {
131 INT bitrate;
132 LONG bits2PeFactor_mono;
133 LONG bits2PeFactor_mono_slope;
134 LONG bits2PeFactor_stereo;
135 LONG bits2PeFactor_stereo_slope;
136 LONG bits2PeFactor_mono_scfOpt;
137 LONG bits2PeFactor_mono_scfOpt_slope;
138 LONG bits2PeFactor_stereo_scfOpt;
139 LONG bits2PeFactor_stereo_scfOpt_slope;
140
141 } BIT_PE_SFAC;
142
143 typedef struct {
144 const INT sampleRate;
145 const BIT_PE_SFAC * pPeTab;
146 const INT nEntries;
147
148 } BITS2PE_CFG_TAB;
149
150 static const BIT_PE_SFAC S_Bits2PeTab16000[] = {
151 { 10000, 0x228F5C29, 0x02FEF55D, 0x1D70A3D7, 0x09BC9D6D, 0x228F5C29, 0x02FEF55D, 0x1C28F5C3, 0x0CBB92CA},
152 { 24000, 0x23D70A3D, 0x029F16B1, 0x2199999A, 0x07DD4413, 0x23D70A3D, 0x029F16B1, 0x2199999A, 0x07DD4413},
153 { 32000, 0x247AE148, 0x11B1D92B, 0x23851EB8, 0x01F75105, 0x247AE148, 0x110A137F, 0x23851EB8, 0x01F75105},
154 { 48000, 0x2D1EB852, 0x6833C600, 0x247AE148, 0x014F8B59, 0x2CCCCCCD, 0x68DB8BAC, 0x247AE148, 0x01F75105},
155 { 64000, 0x60000000, 0x00000000, 0x251EB852, 0x154C985F, 0x60000000, 0x00000000, 0x2570A3D7, 0x154C985F},
156 { 96000, 0x60000000, 0x00000000, 0x39EB851F, 0x088509C0, 0x60000000, 0x00000000, 0x3A3D70A4, 0x088509C0},
157 {128000, 0x60000000, 0x00000000, 0x423D70A4, 0x18A43BB4, 0x60000000, 0x00000000, 0x428F5C29, 0x181E03F7},
158 {148000, 0x60000000, 0x00000000, 0x5147AE14, 0x00000000, 0x60000000, 0x00000000, 0x5147AE14, 0x00000000}
159 };
160
161 static const BIT_PE_SFAC S_Bits2PeTab22050[] = {
162 { 16000, 0x1a8f5c29, 0x1797cc3a, 0x128f5c29, 0x18e75793, 0x175c28f6, 0x221426fe, 0x00000000, 0x5a708ede},
163 { 24000, 0x2051eb85, 0x092ccf6c, 0x18a3d70a, 0x13a92a30, 0x1fae147b, 0xbcbe61d, 0x16147ae1, 0x18e75793},
164 { 32000, 0x228f5c29, 0x029f16b1, 0x1d70a3d7, 0x088509c0, 0x228f5c29, 0x29f16b1, 0x1c28f5c3, 0x0b242071},
165 { 48000, 0x23d70a3d, 0x014f8b59, 0x2199999a, 0x03eea20a, 0x23d70a3d, 0x14f8b59, 0x2199999a, 0x03eea20a},
166 { 64000, 0x247ae148, 0x08d8ec96, 0x23851eb8, 0x00fba882, 0x247ae148, 0x88509c0, 0x23851eb8, 0x00fba882},
167 { 96000, 0x2d1eb852, 0x3419e300, 0x247ae148, 0x00a7c5ac, 0x2ccccccd, 0x346dc5d6, 0x247ae148, 0x00fba882},
168 {128000, 0x60000000, 0x00000000, 0x251eb852, 0x029f16b1, 0x60000000, 0x00000000, 0x2570a3d7, 0x009f16b1},
169 {148000, 0x60000000, 0x00000000, 0x26b851ec, 0x00000000, 0x60000000, 0x00000000, 0x270a3d71, 0x00000000}
170 };
171
172 static const BIT_PE_SFAC S_Bits2PeTab24000[] = {
173 { 16000, 0x19eb851f, 0x13a92a30, 0x1147ae14, 0x164840e1, 0x1999999a, 0x12599ed8, 0x00000000, 0x46c764ae},
174 { 24000, 0x1eb851ec, 0x0d1b7176, 0x16b851ec, 0x18e75793, 0x1e147ae1, 0x0fba8827, 0x1147ae14, 0x2c9081c3},
175 { 32000, 0x21eb851f, 0x049667b6, 0x1ccccccd, 0x07357e67, 0x21eb851f, 0x03eea20a, 0x1c28f5c3, 0x07357e67},
176 { 48000, 0x2428f5c3, 0x014f8b59, 0x2051eb85, 0x053e2d62, 0x23d70a3d, 0x01f75105, 0x1fae147b, 0x07357e67},
177 { 64000, 0x24cccccd, 0x05e5f30e, 0x22e147ae, 0x01a36e2f, 0x24cccccd, 0x05e5f30e, 0x23333333, 0x014f8b59},
178 { 96000, 0x2a8f5c29, 0x24b33db0, 0x247ae148, 0x00fba882, 0x2a8f5c29, 0x26fe718b, 0x247ae148, 0x00fba882},
179 {128000, 0x4e666666, 0x1cd5f99c, 0x2570a3d7, 0x010c6f7a, 0x50a3d70a, 0x192a7371, 0x2570a3d7, 0x010c6f7a},
180 {148000, 0x60000000, 0x00000000, 0x26147ae1, 0x00000000, 0x60000000, 0x00000000, 0x26147ae1, 0x00000000}
181 };
182
183 static const BIT_PE_SFAC S_Bits2PeTab32000[] = {
184 { 16000, 0x1199999a, 0x20c49ba6, 0x00000000, 0x4577d955, 0x00000000, 0x60fe4799, 0x00000000, 0x00000000},
185 { 24000, 0x1999999a, 0x0fba8827, 0x10f5c28f, 0x1b866e44, 0x17ae147b, 0x0fba8827, 0x00000000, 0x4d551d69},
186 { 32000, 0x1d70a3d7, 0x07357e67, 0x17ae147b, 0x09d49518, 0x1b851eb8, 0x0a7c5ac4, 0x12e147ae, 0x110a137f},
187 { 48000, 0x20f5c28f, 0x049667b6, 0x1c7ae148, 0x053e2d62, 0x20a3d70a, 0x053e2d62, 0x1b333333, 0x05e5f30e},
188 { 64000, 0x23333333, 0x029f16b1, 0x1f0a3d71, 0x02f2f987, 0x23333333, 0x029f16b1, 0x1e147ae1, 0x03eea20a},
189 { 96000, 0x25c28f5c, 0x2c3c9eed, 0x21eb851f, 0x01f75105, 0x25c28f5c, 0x0a7c5ac4, 0x21eb851f, 0x01a36e2f},
190 {128000, 0x50f5c28f, 0x18a43bb4, 0x23d70a3d, 0x010c6f7a, 0x30000000, 0x168b5cc0, 0x23851eb8, 0x0192a737},
191 {148000, 0x60000000, 0x00000000, 0x247ae148, 0x00dfb23b, 0x3dc28f5c, 0x300f4aaf, 0x247ae148, 0x01bf6476},
192 {160000, 0x60000000, 0xb15b5740, 0x24cccccd, 0x053e2d62, 0x4f5c28f6, 0xbefd0072, 0x251eb852, 0x04fb1184},
193 {200000, 0x00000000, 0x00000000, 0x2b333333, 0x0836be91, 0x00000000, 0x00000000, 0x2b333333, 0x0890390f},
194 {320000, 0x00000000, 0x00000000, 0x4947ae14, 0x00000000, 0x00000000, 0x00000000, 0x4a8f5c29, 0x00000000}
195 };
196
197 static const BIT_PE_SFAC S_Bits2PeTab44100[] = {
198 { 16000, 0x10a3d70a, 0x1797cc3a, 0x00000000, 0x00000000, 0x00000000, 0x59210386, 0x00000000, 0x00000000},
199 { 24000, 0x16666666, 0x1797cc3a, 0x00000000, 0x639d5e4a, 0x15c28f5c, 0x12599ed8, 0x00000000, 0x5bc01a37},
200 { 32000, 0x1c28f5c3, 0x049667b6, 0x1851eb85, 0x049667b6, 0x1a3d70a4, 0x088509c0, 0x16666666, 0x053e2d62},
201 { 48000, 0x1e666666, 0x05e5f30e, 0x1a8f5c29, 0x049667b6, 0x1e666666, 0x05e5f30e, 0x18f5c28f, 0x05e5f30e},
202 { 64000, 0x2147ae14, 0x0346dc5d, 0x1ccccccd, 0x02f2f987, 0x2147ae14, 0x02f2f987, 0x1bd70a3d, 0x039abf34},
203 { 96000, 0x247ae148, 0x068db8bb, 0x1fae147b, 0x029f16b1, 0x2428f5c3, 0x0639d5e5, 0x1f5c28f6, 0x029f16b1},
204 {128000, 0x2ae147ae, 0x1b435265, 0x223d70a4, 0x0192a737, 0x2a3d70a4, 0x1040bfe4, 0x21eb851f, 0x0192a737},
205 {148000, 0x3b851eb8, 0x2832069c, 0x23333333, 0x00dfb23b, 0x3428f5c3, 0x2054c288, 0x22e147ae, 0x00dfb23b},
206 {160000, 0x4a3d70a4, 0xc32ebe5a, 0x23851eb8, 0x01d5c316, 0x40000000, 0xcb923a2b, 0x23333333, 0x01d5c316},
207 {200000, 0x00000000, 0x00000000, 0x25c28f5c, 0x0713f078, 0x00000000, 0x00000000, 0x2570a3d7, 0x072a4f17},
208 {320000, 0x00000000, 0x00000000, 0x3fae147b, 0x00000000, 0x00000000, 0x00000000, 0x3fae147b, 0x00000000}
209 };
210
211 static const BIT_PE_SFAC S_Bits2PeTab48000[] = {
212 { 16000, 0x0f5c28f6, 0x31ceaf25, 0x00000000, 0x00000000, 0x00000000, 0x74a771c9, 0x00000000, 0x00000000},
213 { 24000, 0x1b851eb8, 0x029f16b1, 0x00000000, 0x663c74fb, 0x1c7ae148, 0xe47991bd, 0x00000000, 0x49667b5f},
214 { 32000, 0x1c28f5c3, 0x029f16b1, 0x18f5c28f, 0x07357e67, 0x15c28f5c, 0x0f12c27a, 0x11eb851f, 0x13016484},
215 { 48000, 0x1d70a3d7, 0x053e2d62, 0x1c7ae148, 0xfe08aefc, 0x1d1eb852, 0x068db8bb, 0x1b333333, 0xfeb074a8},
216 { 64000, 0x20000000, 0x03eea20a, 0x1b851eb8, 0x0346dc5d, 0x2051eb85, 0x0346dc5d, 0x1a8f5c29, 0x039abf34},
217 { 96000, 0x23d70a3d, 0x053e2d62, 0x1eb851ec, 0x029f16b1, 0x23851eb8, 0x04ea4a8c, 0x1e147ae1, 0x02f2f987},
218 {128000, 0x28f5c28f, 0x14727dcc, 0x2147ae14, 0x0218def4, 0x2851eb85, 0x0e27e0f0, 0x20f5c28f, 0x0218def4},
219 {148000, 0x3570a3d7, 0x1cd5f99c, 0x228f5c29, 0x01bf6476, 0x30f5c28f, 0x18777e75, 0x223d70a4, 0x01bf6476},
220 {160000, 0x40000000, 0xcb923a2b, 0x23333333, 0x0192a737, 0x39eb851f, 0xd08d4bae, 0x22e147ae, 0x0192a737},
221 {200000, 0x00000000, 0x00000000, 0x251eb852, 0x06775a1b, 0x00000000, 0x00000000, 0x24cccccd, 0x06a4175a},
222 {320000, 0x00000000, 0x00000000, 0x3ccccccd, 0x00000000, 0x00000000, 0x00000000, 0x3d1eb852, 0x00000000}
223 };
224
225 static const BITS2PE_CFG_TAB bits2PeConfigTab[] = {
226 { 16000, S_Bits2PeTab16000, sizeof(S_Bits2PeTab16000)/sizeof(BIT_PE_SFAC) },
227 { 22050, S_Bits2PeTab22050, sizeof(S_Bits2PeTab22050)/sizeof(BIT_PE_SFAC) },
228 { 24000, S_Bits2PeTab24000, sizeof(S_Bits2PeTab24000)/sizeof(BIT_PE_SFAC) },
229 { 32000, S_Bits2PeTab32000, sizeof(S_Bits2PeTab32000)/sizeof(BIT_PE_SFAC) },
230 { 44100, S_Bits2PeTab44100, sizeof(S_Bits2PeTab44100)/sizeof(BIT_PE_SFAC) },
231 { 48000, S_Bits2PeTab48000, sizeof(S_Bits2PeTab48000)/sizeof(BIT_PE_SFAC) }
232 };
233
234
235
125236 /* values for avoid hole flag */
126237 enum _avoid_hole_state {
127238 NO_AH =0,
134245 #define Q_BITFAC (24) /* Q scaling used in FDKaacEnc_bitresCalcBitFac() calculation */
135246 #define Q_AVGBITS (17) /* scale bit values */
136247
248
249 /*****************************************************************************
250 functionname: FDKaacEnc_InitBits2PeFactor
251 description: retrieve bits2PeFactor from table
252 *****************************************************************************/
253 static void FDKaacEnc_InitBits2PeFactor(
254 FIXP_DBL *bits2PeFactor_m,
255 INT *bits2PeFactor_e,
256 const INT bitRate,
257 const INT nChannels,
258 const INT sampleRate,
259 const INT advancedBitsToPe,
260 const INT invQuant
261 )
262 {
263 /* default bits2pe factor */
264 FIXP_DBL bit2PE_m = FL2FXCONST_DBL(1.18f/(1<<(1)));
265 INT bit2PE_e = 1;
266
267 /* make use of advanced bits to pe factor table */
268 if (advancedBitsToPe) {
269
270 int i;
271 const BIT_PE_SFAC *peTab = NULL;
272 INT size = 0;
273
274
275 /* Get correct table entry */
276 for (i=0; i<(INT)(sizeof(bits2PeConfigTab)/sizeof(BITS2PE_CFG_TAB)); i++) {
277 if (sampleRate >= bits2PeConfigTab[i].sampleRate) {
278 peTab = bits2PeConfigTab[i].pPeTab;
279 size = bits2PeConfigTab[i].nEntries;
280 }
281 }
282
283 if ( (peTab!=NULL) && (size!=0) ) {
284
285 INT startB = -1;
286 LONG startPF = 0;
287 LONG peSlope = 0;
288
289 /* stereo or mono mode and invQuant used or not */
290 for (i=0; i<size-1; i++)
291 {
292 if ((peTab[i].bitrate<=bitRate) && ((peTab[i+1].bitrate>bitRate) || ((i==size-2)) ))
293 {
294 if (nChannels==1)
295 {
296 startPF = (!invQuant) ? peTab[i].bits2PeFactor_mono : peTab[i].bits2PeFactor_mono_scfOpt;
297 peSlope = (!invQuant) ? peTab[i].bits2PeFactor_mono_slope : peTab[i].bits2PeFactor_mono_scfOpt_slope;
298 /*endPF = (!invQuant) ? peTab[i+1].bits2PeFactor_mono : peTab[i+1].bits2PeFactor_mono_scfOpt;
299 endB=peTab[i+1].bitrate;*/
300 startB=peTab[i].bitrate;
301 break;
302 }
303 else
304 {
305 startPF = (!invQuant) ? peTab[i].bits2PeFactor_stereo : peTab[i].bits2PeFactor_stereo_scfOpt;
306 peSlope = (!invQuant) ? peTab[i].bits2PeFactor_stereo_slope : peTab[i].bits2PeFactor_stereo_scfOpt_slope;
307 /*endPF = (!invQuant) ? peTab[i+1].bits2PeFactor_stereo : peTab[i+1].bits2PeFactor_stereo_scfOpt;
308 endB=peTab[i+1].bitrate;*/
309 startB=peTab[i].bitrate;
310 break;
311 }
312 }
313 } /* for i */
314
315 /* if a configuration is available */
316 if (startB!=-1) {
317 /* linear interpolate to actual PEfactor */
318 FIXP_DBL peFac = fMult((FIXP_DBL)(bitRate-startB)<<14, (FIXP_DBL)peSlope) << 2;
319 FIXP_DBL bit2PE = peFac + (FIXP_DBL)startPF; /* startPF_float = startPF << 2 */
320
321 /* sanity check if bits2pe value is high enough */
322 if ( bit2PE >= (FL2FXCONST_DBL(0.35f) >> 2) ) {
323 bit2PE_m = bit2PE;
324 bit2PE_e = 2; /* table is fixed scaled */
325 }
326 } /* br */
327 } /* sr */
328 } /* advancedBitsToPe */
329
330
331 /* return bits2pe factor */
332 *bits2PeFactor_m = bit2PE_m;
333 *bits2PeFactor_e = bit2PE_e;
334 }
335
336
337 /*****************************************************************************
338 functionname: FDKaacEnc_bits2pe2
339 description: convert from bits to pe
340 *****************************************************************************/
137341 static INT FDKaacEnc_bits2pe2(
138342 const INT bits,
139343 const FIXP_DBL factor_m,
449653 FIXP_DBL nrgSum14, nrgSum12, nrgSum34, nrgTotal;
450654 FIXP_DBL nrgFacLd_14, nrgFacLd_12, nrgFacLd_34;
451655 INT usePatch, exePatch;
452 int sfb, nLinesSum = 0;
656 int sfb, sfbGrp, nLinesSum = 0;
453657
454658 nrgSum14 = nrgSum12 = nrgSum34 = nrgTotal = FL2FXCONST_DBL(0.f);
455659
456660 /* calculate flatness of audible spectrum, i.e. spectrum above masking threshold. */
457 for (sfb = 0; sfb < psyOutChan->sfbCnt; sfb++) {
458
459 FIXP_DBL nrgFac12 = CalcInvLdData(psyOutChan->sfbEnergyLdData[sfb]>>1); /* nrg^(1/2) */
460 FIXP_DBL nrgFac14 = CalcInvLdData(psyOutChan->sfbEnergyLdData[sfb]>>2); /* nrg^(1/4) */
661 for (sfbGrp = 0;sfbGrp < psyOutChannel[ch]->sfbCnt; sfbGrp+=psyOutChannel[ch]->sfbPerGroup) {
662 for (sfb=0; sfb<psyOutChannel[ch]->maxSfbPerGroup; sfb++) {
663 FIXP_DBL nrgFac12 = CalcInvLdData(psyOutChan->sfbEnergyLdData[sfbGrp+sfb]>>1); /* nrg^(1/2) */
664 FIXP_DBL nrgFac14 = CalcInvLdData(psyOutChan->sfbEnergyLdData[sfbGrp+sfb]>>2); /* nrg^(1/4) */
461665
462666 /* maximal number of bands is 64, results scaling factor 6 */
463 nLinesSum += peData->peChannelData[ch].sfbNLines[sfb]; /* relevant lines */
464 nrgTotal += ( psyOutChan->sfbEnergy[sfb] >> 6 ); /* sum up nrg */
667 nLinesSum += peData->peChannelData[ch].sfbNLines[sfbGrp+sfb]; /* relevant lines */
668 nrgTotal += ( psyOutChan->sfbEnergy[sfbGrp+sfb] >> 6 ); /* sum up nrg */
465669 nrgSum12 += ( nrgFac12 >> 6 ); /* sum up nrg^(2/4) */
466670 nrgSum14 += ( nrgFac14 >> 6 ); /* sum up nrg^(1/4) */
467671 nrgSum34 += ( fMult(nrgFac14, nrgFac12) >> 6 ); /* sum up nrg^(3/4) */
672 }
468673 }
469674
470675 nrgTotal = CalcLdData(nrgTotal); /* get ld64 of total nrg */
478683 usePatch = (adjThrStateElement->chaosMeasureEnFac[ch] > FL2FXCONST_DBL(0.78125f));
479684 exePatch = ((usePatch) && (adjThrStateElement->lastEnFacPatch[ch]));
480685
481 for (sfb = 0; sfb < psyOutChan->sfbCnt; sfb++) {
686 for (sfbGrp = 0;sfbGrp < psyOutChannel[ch]->sfbCnt; sfbGrp+=psyOutChannel[ch]->sfbPerGroup) {
687 for (sfb=0; sfb<psyOutChannel[ch]->maxSfbPerGroup; sfb++) {
688
482689 INT sfbExePatch;
483690
484691 /* for MS coupled SFBs, also execute patch in side channel if done in mid channel */
485 if ((ch == 1) && (toolsInfo->msMask[sfb])) {
692 if ((ch == 1) && (toolsInfo->msMask[sfbGrp+sfb])) {
486693 sfbExePatch = exePatchM;
487694 }
488695 else {
489696 sfbExePatch = exePatch;
490697 }
491698
492 if ( (sfbExePatch) && (psyOutChan->sfbEnergy[sfb]>FL2FXCONST_DBL(0.f)) )
699 if ( (sfbExePatch) && (psyOutChan->sfbEnergy[sfbGrp+sfb]>FL2FXCONST_DBL(0.f)) )
493700 {
494701 /* execute patch based on spectral flatness calculated above */
495702 if (adjThrStateElement->chaosMeasureEnFac[ch] > FL2FXCONST_DBL(0.8125f)) {
496 qcOutChannel[ch]->sfbEnFacLd[sfb] = ( (nrgFacLd_14 + (psyOutChan->sfbEnergyLdData[sfb]+(psyOutChan->sfbEnergyLdData[sfb]>>1)))>>1 ); /* sfbEnergy^(3/4) */
703 qcOutChannel[ch]->sfbEnFacLd[sfbGrp+sfb] = ( (nrgFacLd_14 + (psyOutChan->sfbEnergyLdData[sfbGrp+sfb]+(psyOutChan->sfbEnergyLdData[sfbGrp+sfb]>>1)))>>1 ); /* sfbEnergy^(3/4) */
497704 }
498705 else if (adjThrStateElement->chaosMeasureEnFac[ch] > FL2FXCONST_DBL(0.796875f)) {
499 qcOutChannel[ch]->sfbEnFacLd[sfb] = ( (nrgFacLd_12 + psyOutChan->sfbEnergyLdData[sfb])>>1 ); /* sfbEnergy^(2/4) */
706 qcOutChannel[ch]->sfbEnFacLd[sfbGrp+sfb] = ( (nrgFacLd_12 + psyOutChan->sfbEnergyLdData[sfbGrp+sfb])>>1 ); /* sfbEnergy^(2/4) */
500707 }
501708 else {
502 qcOutChannel[ch]->sfbEnFacLd[sfb] = ( (nrgFacLd_34 + (psyOutChan->sfbEnergyLdData[sfb]>>1))>>1 ); /* sfbEnergy^(1/4) */
709 qcOutChannel[ch]->sfbEnFacLd[sfbGrp+sfb] = ( (nrgFacLd_34 + (psyOutChan->sfbEnergyLdData[sfbGrp+sfb]>>1))>>1 ); /* sfbEnergy^(1/4) */
503710 }
504 qcOutChannel[ch]->sfbEnFacLd[sfb] = fixMin(qcOutChannel[ch]->sfbEnFacLd[sfb],(FIXP_DBL)0);
711 qcOutChannel[ch]->sfbEnFacLd[sfbGrp+sfb] = fixMin(qcOutChannel[ch]->sfbEnFacLd[sfbGrp+sfb],(FIXP_DBL)0);
505712
506713 }
714 }
507715 } /* sfb loop */
508716
509717 adjThrStateElement->lastEnFacPatch[ch] = usePatch;
733941
734942 return chaosMeasure;
735943 }
736
737944
738945 /* apply reduction formula for VBR-mode */
739946 static void FDKaacEnc_reduceThresholdsVBR(QC_OUT_CHANNEL* qcOutChannel[(2)],
9221129 }
9231130 }
9241131
925
9261132 /*****************************************************************************
9271133 functionname: FDKaacEnc_correctThresh
9281134 description: if pe difference deltaPe between desired pe and real pe is small enough,
9301136 New thresholds can be derived from this pe-difference
9311137 *****************************************************************************/
9321138 static void FDKaacEnc_correctThresh(CHANNEL_MAPPING* cm,
933 QC_OUT_ELEMENT* qcElement[(6)],
934 PSY_OUT_ELEMENT* psyOutElement[(6)],
935 UCHAR ahFlag[(6)][(2)][MAX_GROUPED_SFB],
936 FIXP_DBL thrExp[(6)][(2)][MAX_GROUPED_SFB],
937 const FIXP_DBL redVal[(6)],
938 const SCHAR redValScaling[(6)],
1139 QC_OUT_ELEMENT* qcElement[(8)],
1140 PSY_OUT_ELEMENT* psyOutElement[(8)],
1141 UCHAR ahFlag[(8)][(2)][MAX_GROUPED_SFB],
1142 FIXP_DBL thrExp[(8)][(2)][MAX_GROUPED_SFB],
1143 const FIXP_DBL redVal[(8)],
1144 const SCHAR redValScaling[(8)],
9391145 const INT deltaPe,
9401146 const INT processElements,
9411147 const INT elementOffset)
9461152 PE_CHANNEL_DATA *peChanData;
9471153 FIXP_DBL thrFactorLdData;
9481154 FIXP_DBL sfbEnLdData, sfbThrLdData, sfbThrReducedLdData;
949 FIXP_DBL *sfbPeFactorsLdData[(6)][(2)];
950 FIXP_DBL sfbNActiveLinesLdData[(2)][MAX_GROUPED_SFB];
1155 FIXP_DBL *sfbPeFactorsLdData[(8)][(2)];
1156 FIXP_DBL sfbNActiveLinesLdData[(8)][(2)][MAX_GROUPED_SFB];
9511157 INT normFactorInt;
9521158 FIXP_DBL normFactorLdData;
9531159
9781184 for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
9791185
9801186 if ( peChanData->sfbNActiveLines[sfbGrp+sfb] == 0 ) {
981 sfbNActiveLinesLdData[ch][sfbGrp+sfb] = FL2FXCONST_DBL(-1.0f);
1187 sfbNActiveLinesLdData[elementId][ch][sfbGrp+sfb] = FL2FXCONST_DBL(-1.0f);
9821188 }
9831189 else {
9841190 /* Both CalcLdInt and CalcLdData can be used!
9851191 * No offset has to be subtracted, because sfbNActiveLinesLdData
9861192 * is shorted while thrFactor calculation */
987 sfbNActiveLinesLdData[ch][sfbGrp+sfb] = CalcLdInt(peChanData->sfbNActiveLines[sfbGrp+sfb]);
1193 sfbNActiveLinesLdData[elementId][ch][sfbGrp+sfb] = CalcLdInt(peChanData->sfbNActiveLines[sfbGrp+sfb]);
9881194 }
9891195 if ( ((ahFlag[elementId][ch][sfbGrp+sfb] < AH_ACTIVE) || (deltaPe > 0)) &&
9901196 peChanData->sfbNActiveLines[sfbGrp+sfb] != 0 )
10011207 - (FIXP_DBL)(minScale<<(DFRACT_BITS-1-LD_DATA_SHIFT));
10021208
10031209 if (sumLd < FL2FXCONST_DBL(0.f)) {
1004 sfbPeFactorsLdData[elementId][ch][sfbGrp+sfb] = sfbNActiveLinesLdData[ch][sfbGrp+sfb] - sumLd;
1210 sfbPeFactorsLdData[elementId][ch][sfbGrp+sfb] = sfbNActiveLinesLdData[elementId][ch][sfbGrp+sfb] - sumLd;
10051211 }
10061212 else {
1007 if ( sfbNActiveLinesLdData[ch][sfbGrp+sfb] > (FL2FXCONST_DBL(-1.f) + sumLd) ) {
1008 sfbPeFactorsLdData[elementId][ch][sfbGrp+sfb] = sfbNActiveLinesLdData[ch][sfbGrp+sfb] - sumLd;
1213 if ( sfbNActiveLinesLdData[elementId][ch][sfbGrp+sfb] > (FL2FXCONST_DBL(-1.f) + sumLd) ) {
1214 sfbPeFactorsLdData[elementId][ch][sfbGrp+sfb] = sfbNActiveLinesLdData[elementId][ch][sfbGrp+sfb] - sumLd;
10091215 }
10101216 else {
1011 sfbPeFactorsLdData[elementId][ch][sfbGrp+sfb] = sfbNActiveLinesLdData[ch][sfbGrp+sfb];
1217 sfbPeFactorsLdData[elementId][ch][sfbGrp+sfb] = sfbNActiveLinesLdData[elementId][ch][sfbGrp+sfb];
10121218 }
10131219 }
10141220
10491255 }
10501256 else {
10511257 /* new threshold */
1052 FIXP_DBL tmp = CalcInvLdData(sfbPeFactorsLdData[elementId][ch][sfbGrp+sfb] + normFactorLdData - sfbNActiveLinesLdData[ch][sfbGrp+sfb] - FL2FXCONST_DBL((float)LD_DATA_SHIFT/LD_DATA_SCALING));
1258 FIXP_DBL tmp = CalcInvLdData(sfbPeFactorsLdData[elementId][ch][sfbGrp+sfb] + normFactorLdData - sfbNActiveLinesLdData[elementId][ch][sfbGrp+sfb] - FL2FXCONST_DBL((float)LD_DATA_SHIFT/LD_DATA_SCALING));
10531259
10541260 /* limit thrFactor to 60dB */
10551261 tmp = (deltaPe<0) ? tmp : (-tmp);
11011307 reducing minSnr
11021308 *****************************************************************************/
11031309 void FDKaacEnc_reduceMinSnr(CHANNEL_MAPPING* cm,
1104 QC_OUT_ELEMENT* qcElement[(6)],
1105 PSY_OUT_ELEMENT* psyOutElement[(6)],
1106 UCHAR ahFlag[(6)][(2)][MAX_GROUPED_SFB],
1310 QC_OUT_ELEMENT* qcElement[(8)],
1311 PSY_OUT_ELEMENT* psyOutElement[(8)],
1312 UCHAR ahFlag[(8)][(2)][MAX_GROUPED_SFB],
11071313 const INT desiredPe,
11081314 INT* redPeGlobal,
11091315 const INT processElements,
12031409 bands have to be quantized to zero
12041410 *****************************************************************************/
12051411 static void FDKaacEnc_allowMoreHoles(CHANNEL_MAPPING* cm,
1206 QC_OUT_ELEMENT* qcElement[(6)],
1207 PSY_OUT_ELEMENT* psyOutElement[(6)],
1208 ATS_ELEMENT* AdjThrStateElement[(6)],
1209 UCHAR ahFlag[(6)][(2)][MAX_GROUPED_SFB],
1412 QC_OUT_ELEMENT* qcElement[(8)],
1413 PSY_OUT_ELEMENT* psyOutElement[(8)],
1414 ATS_ELEMENT* AdjThrStateElement[(8)],
1415 UCHAR ahFlag[(8)][(2)][MAX_GROUPED_SFB],
12101416 const INT desiredPe,
12111417 const INT currentPe,
12121418 const int processElements,
14381644 description: two guesses for the reduction value and one final correction of the thresholds
14391645 *****************************************************************************/
14401646 static void FDKaacEnc_adaptThresholdsToPe(CHANNEL_MAPPING* cm,
1441 ATS_ELEMENT* AdjThrStateElement[(6)],
1442 QC_OUT_ELEMENT* qcElement[(6)],
1443 PSY_OUT_ELEMENT* psyOutElement[(6)],
1647 ATS_ELEMENT* AdjThrStateElement[(8)],
1648 QC_OUT_ELEMENT* qcElement[(8)],
1649 PSY_OUT_ELEMENT* psyOutElement[(8)],
14441650 const INT desiredPe,
14451651 const INT processElements,
14461652 const INT elementOffset)
14471653 {
1448 FIXP_DBL redValue[(6)];
1449 SCHAR redValScaling[(6)];
1450 UCHAR pAhFlag[(6)][(2)][MAX_GROUPED_SFB];
1451 FIXP_DBL pThrExp[(6)][(2)][MAX_GROUPED_SFB];
1654 FIXP_DBL redValue[(8)];
1655 SCHAR redValScaling[(8)];
1656 UCHAR pAhFlag[(8)][(2)][MAX_GROUPED_SFB];
1657 FIXP_DBL pThrExp[(8)][(2)][MAX_GROUPED_SFB];
14521658 int iter;
14531659
14541660 INT constPartGlobal, noRedPeGlobal, nActiveLinesGlobal, redPeGlobal;
16821888
16831889 }
16841890
1685
16861891 /* similar to FDKaacEnc_adaptThresholdsToPe(), for VBR-mode */
16871892 void FDKaacEnc_AdaptThresholdsVBR(QC_OUT_CHANNEL* qcOutChannel[(2)],
16881893 PSY_OUT_CHANNEL* psyOutChannel[(2)],
16911896 PE_DATA *peData,
16921897 const INT nChannels)
16931898 {
1694 UCHAR pAhFlag[(2)][MAX_GROUPED_SFB];
1695 FIXP_DBL pThrExp[(2)][MAX_GROUPED_SFB];
1899 UCHAR (*pAhFlag)[MAX_GROUPED_SFB];
1900 FIXP_DBL (*pThrExp)[MAX_GROUPED_SFB];
1901
1902 /* allocate scratch memory */
1903 C_ALLOC_SCRATCH_START(_pAhFlag, UCHAR, (2)*MAX_GROUPED_SFB)
1904 C_ALLOC_SCRATCH_START(_pThrExp, FIXP_DBL, (2)*MAX_GROUPED_SFB)
1905 pAhFlag = (UCHAR(*)[MAX_GROUPED_SFB])_pAhFlag;
1906 pThrExp = (FIXP_DBL(*)[MAX_GROUPED_SFB])_pThrExp;
16961907
16971908 /* thresholds to the power of redExp */
16981909 FDKaacEnc_calcThreshExp(pThrExp, qcOutChannel, psyOutChannel, nChannels);
17101921 AdjThrStateElement->vbrQualFactor,
17111922 &AdjThrStateElement->chaosMeasureOld);
17121923
1924 /* free scratch memory */
1925 C_ALLOC_SCRATCH_END(_pThrExp, FIXP_DBL, (2)*MAX_GROUPED_SFB)
1926 C_ALLOC_SCRATCH_END(_pAhFlag, UCHAR, (2)*MAX_GROUPED_SFB)
17131927 }
17141928
17151929
20012215 functionname: FDKaacEnc_AdjThrInit
20022216 description: initialize ADJ_THR_STATE
20032217 *****************************************************************************/
2004 void FDKaacEnc_AdjThrInit(ADJ_THR_STATE *hAdjThr,
2005 const INT meanPe,
2006 ELEMENT_BITS *elBits[(6)],
2007 INT nElements,
2008 FIXP_DBL vbrQualFactor)
2009 {
2010 INT i;
2011
2012 FIXP_DBL POINT8 = FL2FXCONST_DBL(0.8f);
2013 FIXP_DBL POINT6 = FL2FXCONST_DBL(0.6f);
2014
2015 /* common for all elements: */
2218 void FDKaacEnc_AdjThrInit(
2219 ADJ_THR_STATE *hAdjThr,
2220 const INT meanPe,
2221 ELEMENT_BITS *elBits[(8)],
2222 INT invQuant,
2223 INT nElements,
2224 INT nChannelsEff,
2225 INT sampleRate,
2226 INT advancedBitsToPe,
2227 FIXP_DBL vbrQualFactor
2228 )
2229 {
2230 INT i;
2231
2232 FIXP_DBL POINT8 = FL2FXCONST_DBL(0.8f);
2233 FIXP_DBL POINT6 = FL2FXCONST_DBL(0.6f);
2234
2235 /* common for all elements: */
2236 /* parameters for bitres control */
2237 hAdjThr->bresParamLong.clipSaveLow = (FIXP_DBL)0x1999999a; /* FL2FXCONST_DBL(0.2f); */
2238 hAdjThr->bresParamLong.clipSaveHigh = (FIXP_DBL)0x7999999a; /* FL2FXCONST_DBL(0.95f); */
2239 hAdjThr->bresParamLong.minBitSave = (FIXP_DBL)0xf999999a; /* FL2FXCONST_DBL(-0.05f); */
2240 hAdjThr->bresParamLong.maxBitSave = (FIXP_DBL)0x26666666; /* FL2FXCONST_DBL(0.3f); */
2241 hAdjThr->bresParamLong.clipSpendLow = (FIXP_DBL)0x1999999a; /* FL2FXCONST_DBL(0.2f); */
2242 hAdjThr->bresParamLong.clipSpendHigh = (FIXP_DBL)0x7999999a; /* FL2FXCONST_DBL(0.95f); */
2243 hAdjThr->bresParamLong.minBitSpend = (FIXP_DBL)0xf3333333; /* FL2FXCONST_DBL(-0.10f); */
2244 hAdjThr->bresParamLong.maxBitSpend = (FIXP_DBL)0x33333333; /* FL2FXCONST_DBL(0.4f); */
2245
2246 hAdjThr->bresParamShort.clipSaveLow = (FIXP_DBL)0x199999a0; /* FL2FXCONST_DBL(0.2f); */
2247 hAdjThr->bresParamShort.clipSaveHigh = (FIXP_DBL)0x5fffffff; /* FL2FXCONST_DBL(0.75f); */
2248 hAdjThr->bresParamShort.minBitSave = (FIXP_DBL)0x00000000; /* FL2FXCONST_DBL(0.0f); */
2249 hAdjThr->bresParamShort.maxBitSave = (FIXP_DBL)0x199999a0; /* FL2FXCONST_DBL(0.2f); */
2250 hAdjThr->bresParamShort.clipSpendLow = (FIXP_DBL)0x199999a0; /* FL2FXCONST_DBL(0.2f); */
2251 hAdjThr->bresParamShort.clipSpendHigh = (FIXP_DBL)0x5fffffff; /* FL2FXCONST_DBL(0.75f); */
2252 hAdjThr->bresParamShort.minBitSpend = (FIXP_DBL)0xf9999998; /* FL2FXCONST_DBL(-0.05f); */
2253 hAdjThr->bresParamShort.maxBitSpend = (FIXP_DBL)0x40000000; /* FL2FXCONST_DBL(0.5f); */
2254
2255 /* specific for each element: */
2256 for (i=0; i<nElements; i++) {
2257 ATS_ELEMENT* atsElem = hAdjThr->adjThrStateElem[i];
2258 MINSNR_ADAPT_PARAM *msaParam = &atsElem->minSnrAdaptParam;
2259 INT chBitrate = elBits[i]->chBitrateEl;
2260
20162261 /* parameters for bitres control */
2017 hAdjThr->bresParamLong.clipSaveLow = (FIXP_DBL)0x1999999a; /* FL2FXCONST_DBL(0.2f); */
2018 hAdjThr->bresParamLong.clipSaveHigh = (FIXP_DBL)0x7999999a; /* FL2FXCONST_DBL(0.95f); */
2019 hAdjThr->bresParamLong.minBitSave = (FIXP_DBL)0xf999999a; /* FL2FXCONST_DBL(-0.05f); */
2020 hAdjThr->bresParamLong.maxBitSave = (FIXP_DBL)0x26666666; /* FL2FXCONST_DBL(0.3f); */
2021 hAdjThr->bresParamLong.clipSpendLow = (FIXP_DBL)0x1999999a; /* FL2FXCONST_DBL(0.2f); */
2022 hAdjThr->bresParamLong.clipSpendHigh = (FIXP_DBL)0x7999999a; /* FL2FXCONST_DBL(0.95f); */
2023 hAdjThr->bresParamLong.minBitSpend = (FIXP_DBL)0xf3333333; /* FL2FXCONST_DBL(-0.10f); */
2024 hAdjThr->bresParamLong.maxBitSpend = (FIXP_DBL)0x33333333; /* FL2FXCONST_DBL(0.4f); */
2025
2026 hAdjThr->bresParamShort.clipSaveLow = (FIXP_DBL)0x199999a0; /* FL2FXCONST_DBL(0.2f); */
2027 hAdjThr->bresParamShort.clipSaveHigh = (FIXP_DBL)0x5fffffff; /* FL2FXCONST_DBL(0.75f); */
2028 hAdjThr->bresParamShort.minBitSave = (FIXP_DBL)0x00000000; /* FL2FXCONST_DBL(0.0f); */
2029 hAdjThr->bresParamShort.maxBitSave = (FIXP_DBL)0x199999a0; /* FL2FXCONST_DBL(0.2f); */
2030 hAdjThr->bresParamShort.clipSpendLow = (FIXP_DBL)0x199999a0; /* FL2FXCONST_DBL(0.2f); */
2031 hAdjThr->bresParamShort.clipSpendHigh = (FIXP_DBL)0x5fffffff; /* FL2FXCONST_DBL(0.75f); */
2032 hAdjThr->bresParamShort.minBitSpend = (FIXP_DBL)0xf9999998; /* FL2FXCONST_DBL(-0.05f); */
2033 hAdjThr->bresParamShort.maxBitSpend = (FIXP_DBL)0x40000000; /* FL2FXCONST_DBL(0.5f); */
2034
2035 /* specific for each element: */
2036 for (i=0; i<nElements; i++) {
2037 ATS_ELEMENT* atsElem = hAdjThr->adjThrStateElem[i];
2038 MINSNR_ADAPT_PARAM *msaParam = &atsElem->minSnrAdaptParam;
2039 INT chBitrate = elBits[i]->chBitrateEl;
2040
2041 /* parameters for bitres control */
2042 atsElem->peMin = fMultI(POINT8, meanPe) >> 1;
2043 atsElem->peMax = fMultI(POINT6, meanPe);
2044
2045 /* for use in FDKaacEnc_reduceThresholdsVBR */
2046 atsElem->chaosMeasureOld = FL2FXCONST_DBL(0.3f);
2047
2048 /* additional pe offset to correct pe2bits for low bitrates */
2049 atsElem->peOffset = 0;
2050
2051 /* vbr initialisation */
2052 atsElem->vbrQualFactor = vbrQualFactor;
2053 if (chBitrate < 32000)
2054 {
2055 atsElem->peOffset = fixMax(50, 100-fMultI((FIXP_DBL)0x666667, chBitrate));
2056 }
2057
2058 /* avoid hole parameters */
2059 if (chBitrate > 20000) {
2060 atsElem->ahParam.modifyMinSnr = TRUE;
2061 atsElem->ahParam.startSfbL = 15;
2062 atsElem->ahParam.startSfbS = 3;
2063 }
2064 else {
2065 atsElem->ahParam.modifyMinSnr = FALSE;
2066 atsElem->ahParam.startSfbL = 0;
2067 atsElem->ahParam.startSfbS = 0;
2068 }
2069
2070 /* minSnr adaptation */
2071 msaParam->maxRed = FL2FXCONST_DBL(0.00390625f); /* 0.25f/64.0f */
2072 /* start adaptation of minSnr for avgEn/sfbEn > startRatio */
2073 msaParam->startRatio = FL2FXCONST_DBL(0.05190512648f); /* ld64(10.0f) */
2074 /* maximum minSnr reduction to minSnr^maxRed is reached for
2075 avgEn/sfbEn >= maxRatio */
2076 /* msaParam->maxRatio = 1000.0f; */
2077 /*msaParam->redRatioFac = ((float)1.0f - msaParam->maxRed) / ((float)10.0f*log10(msaParam->startRatio/msaParam->maxRatio)/log10(2.0f)*(float)0.3010299956f);*/
2078 msaParam->redRatioFac = FL2FXCONST_DBL(-0.375f); /* -0.0375f * 10.0f */
2079 /*msaParam->redOffs = (float)1.0f - msaParam->redRatioFac * (float)10.0f * log10(msaParam->startRatio)/log10(2.0f) * (float)0.3010299956f;*/
2080 msaParam->redOffs = FL2FXCONST_DBL(0.021484375); /* 1.375f/64.0f */
2081
2082 /* init pe correction */
2083 atsElem->peCorrectionFactor_m = FL2FXCONST_DBL(0.5f); /* 1.0 */
2084 atsElem->peCorrectionFactor_e = 1;
2085
2086 atsElem->dynBitsLast = -1;
2087 atsElem->peLast = 0;
2088
2089 /* init bits to pe factor */
2090 atsElem->bits2PeFactor_m = FL2FXCONST_DBL(1.18f/(1<<(1)));
2091 atsElem->bits2PeFactor_e = 1;
2092 }
2262 atsElem->peMin = fMultI(POINT8, meanPe) >> 1;
2263 atsElem->peMax = fMultI(POINT6, meanPe);
2264
2265 /* for use in FDKaacEnc_reduceThresholdsVBR */
2266 atsElem->chaosMeasureOld = FL2FXCONST_DBL(0.3f);
2267
2268 /* additional pe offset to correct pe2bits for low bitrates */
2269 atsElem->peOffset = 0;
2270
2271 /* vbr initialisation */
2272 atsElem->vbrQualFactor = vbrQualFactor;
2273 if (chBitrate < 32000)
2274 {
2275 atsElem->peOffset = fixMax(50, 100-fMultI((FIXP_DBL)0x666667, chBitrate));
2276 }
2277
2278 /* avoid hole parameters */
2279 if (chBitrate > 20000) {
2280 atsElem->ahParam.modifyMinSnr = TRUE;
2281 atsElem->ahParam.startSfbL = 15;
2282 atsElem->ahParam.startSfbS = 3;
2283 }
2284 else {
2285 atsElem->ahParam.modifyMinSnr = FALSE;
2286 atsElem->ahParam.startSfbL = 0;
2287 atsElem->ahParam.startSfbS = 0;
2288 }
2289
2290 /* minSnr adaptation */
2291 msaParam->maxRed = FL2FXCONST_DBL(0.00390625f); /* 0.25f/64.0f */
2292 /* start adaptation of minSnr for avgEn/sfbEn > startRatio */
2293 msaParam->startRatio = FL2FXCONST_DBL(0.05190512648f); /* ld64(10.0f) */
2294 /* maximum minSnr reduction to minSnr^maxRed is reached for
2295 avgEn/sfbEn >= maxRatio */
2296 /* msaParam->maxRatio = 1000.0f; */
2297 /*msaParam->redRatioFac = ((float)1.0f - msaParam->maxRed) / ((float)10.0f*log10(msaParam->startRatio/msaParam->maxRatio)/log10(2.0f)*(float)0.3010299956f);*/
2298 msaParam->redRatioFac = FL2FXCONST_DBL(-0.375f); /* -0.0375f * 10.0f */
2299 /*msaParam->redOffs = (float)1.0f - msaParam->redRatioFac * (float)10.0f * log10(msaParam->startRatio)/log10(2.0f) * (float)0.3010299956f;*/
2300 msaParam->redOffs = FL2FXCONST_DBL(0.021484375); /* 1.375f/64.0f */
2301
2302 /* init pe correction */
2303 atsElem->peCorrectionFactor_m = FL2FXCONST_DBL(0.5f); /* 1.0 */
2304 atsElem->peCorrectionFactor_e = 1;
2305
2306 atsElem->dynBitsLast = -1;
2307 atsElem->peLast = 0;
2308
2309 /* init bits to pe factor */
2310
2311 /* init bits2PeFactor */
2312 FDKaacEnc_InitBits2PeFactor(
2313 &atsElem->bits2PeFactor_m,
2314 &atsElem->bits2PeFactor_e,
2315 chBitrate, /* bitrate/channel*/
2316 nChannelsEff, /* number of channels */
2317 sampleRate,
2318 advancedBitsToPe,
2319 invQuant
2320 );
2321
2322 } /* for nElements */
2323
20932324 }
20942325
20952326
21532384 }
21542385
21552386
2387 static void FDKaacEnc_calcPeCorrectionLowBitRes(
2388 FIXP_DBL *const correctionFac_m,
2389 INT *const correctionFac_e,
2390 const INT peLast,
2391 const INT bitsLast,
2392 const INT bitresLevel,
2393 const INT nChannels,
2394 const FIXP_DBL bits2PeFactor_m,
2395 const INT bits2PeFactor_e
2396 )
2397 {
2398 /* tuning params */
2399 const FIXP_DBL amp = FL2FXCONST_DBL(0.005);
2400 const FIXP_DBL maxDiff = FL2FXCONST_DBL(0.25f);
2401
2402 if (bitsLast > 0) {
2403
2404 /* Estimate deviation of granted and used dynamic bits in previous frame, in PE units */
2405 const int bitsBalLast = peLast - FDKaacEnc_bits2pe2(
2406 bitsLast,
2407 bits2PeFactor_m,
2408 bits2PeFactor_e);
2409
2410 /* reserve n bits per channel */
2411 int headroom = (bitresLevel>=50*nChannels) ? 0 : (100*nChannels);
2412
2413 /* in PE units */
2414 headroom = FDKaacEnc_bits2pe2(
2415 headroom,
2416 bits2PeFactor_m,
2417 bits2PeFactor_e);
2418
2419 /*
2420 * diff = amp * ((bitsBalLast - headroom) / (bitresLevel + headroom)
2421 * diff = max ( min ( diff, maxDiff, -maxDiff)) / 2
2422 */
2423 FIXP_DBL denominator = (FIXP_DBL)FDKaacEnc_bits2pe2(bitresLevel, bits2PeFactor_m, bits2PeFactor_e) + (FIXP_DBL)headroom;
2424
2425 int scaling = 0;
2426 FIXP_DBL diff = (bitsBalLast>=headroom)
2427 ? fMult(amp, fDivNorm( (FIXP_DBL)(bitsBalLast - headroom), denominator, &scaling))
2428 : -fMult(amp, fDivNorm(-(FIXP_DBL)(bitsBalLast - headroom), denominator, &scaling)) ;
2429
2430 scaling -= 1; /* divide by 2 */
2431
2432 diff = (scaling<=0) ? FDKmax( FDKmin (diff>>(-scaling), maxDiff>>1), -maxDiff>>1)
2433 : FDKmax( FDKmin (diff, maxDiff>>(1+scaling)), -maxDiff>>(1+scaling)) << scaling;
2434
2435 /*
2436 * corrFac += diff
2437 * corrFac = max ( min ( corrFac/2.f, 1.f/2.f, 0.75f/2.f ) )
2438 */
2439 *correctionFac_m = FDKmax(FDKmin((*correctionFac_m)+diff, FL2FXCONST_DBL(1.0f/2.f)), FL2FXCONST_DBL(0.75f/2.f)) ;
2440 *correctionFac_e = 1;
2441 }
2442 else {
2443 *correctionFac_m = FL2FXCONST_DBL(0.75/2.f);
2444 *correctionFac_e = 1;
2445 }
2446 }
2447
21562448 void FDKaacEnc_DistributeBits(ADJ_THR_STATE *adjThrState,
21572449 ATS_ELEMENT *AdjThrStateElement,
21582450 PSY_OUT_CHANNEL *psyOutChannel[(2)],
21652457 const INT bitresBits,
21662458 const INT maxBitresBits,
21672459 const FIXP_DBL maxBitFac,
2168 const INT bitDistributenMode)
2460 const INT bitDistributionMode)
21692461 {
21702462 FIXP_DBL bitFactor;
21712463 INT noRedPe = peData->pe;
21832475 }
21842476
21852477 if (grantedDynBits >= 1) {
2186 if (bitDistributenMode!=0) {
2478 if (bitDistributionMode!=0) {
21872479 *grantedPe = FDKaacEnc_bits2pe2(grantedDynBits, AdjThrStateElement->bits2PeFactor_m, AdjThrStateElement->bits2PeFactor_e);
21882480 }
21892481 else
22072499 }
22082500
22092501 /* correction of pe value */
2210 {
2211 FDKaacEnc_FDKaacEnc_calcPeCorrection(
2212 &AdjThrStateElement->peCorrectionFactor_m,
2213 &AdjThrStateElement->peCorrectionFactor_e,
2214 fixMin(*grantedPe, noRedPe),
2215 AdjThrStateElement->peLast,
2216 AdjThrStateElement->dynBitsLast,
2217 AdjThrStateElement->bits2PeFactor_m,
2218 AdjThrStateElement->bits2PeFactor_e
2502 switch (bitDistributionMode) {
2503 case 2:
2504 case 1:
2505 FDKaacEnc_calcPeCorrectionLowBitRes(
2506 &AdjThrStateElement->peCorrectionFactor_m,
2507 &AdjThrStateElement->peCorrectionFactor_e,
2508 AdjThrStateElement->peLast,
2509 AdjThrStateElement->dynBitsLast,
2510 bitresBits,
2511 nChannels,
2512 AdjThrStateElement->bits2PeFactor_m,
2513 AdjThrStateElement->bits2PeFactor_e
22192514 );
2515 break;
2516 case 0:
2517 default:
2518 FDKaacEnc_FDKaacEnc_calcPeCorrection(
2519 &AdjThrStateElement->peCorrectionFactor_m,
2520 &AdjThrStateElement->peCorrectionFactor_e,
2521 fixMin(*grantedPe, noRedPe),
2522 AdjThrStateElement->peLast,
2523 AdjThrStateElement->dynBitsLast,
2524 AdjThrStateElement->bits2PeFactor_m,
2525 AdjThrStateElement->bits2PeFactor_e
2526 );
2527 break;
22202528 }
22212529
22222530 *grantedPeCorr = (INT)(fMult((FIXP_DBL)(*grantedPe<<Q_AVGBITS), AdjThrStateElement->peCorrectionFactor_m) >> (Q_AVGBITS-AdjThrStateElement->peCorrectionFactor_e));
22312539 functionname: FDKaacEnc_AdjustThresholds
22322540 description: adjust thresholds
22332541 *****************************************************************************/
2234 void FDKaacEnc_AdjustThresholds(ATS_ELEMENT* AdjThrStateElement[(6)],
2235 QC_OUT_ELEMENT* qcElement[(6)],
2542 void FDKaacEnc_AdjustThresholds(ATS_ELEMENT* AdjThrStateElement[(8)],
2543 QC_OUT_ELEMENT* qcElement[(8)],
22362544 QC_OUT* qcOut,
2237 PSY_OUT_ELEMENT* psyOutElement[(6)],
2545 PSY_OUT_ELEMENT* psyOutElement[(8)],
22382546 INT CBRbitrateMode,
22392547 CHANNEL_MAPPING* cm)
22402548 {
22902598 } /* -end- element loop */
22912599
22922600 }
2293 for (i=0; i<cm->nElements; i++) {
2294 int ch,sfb,sfbGrp;
2295 /* no weighting of threholds and energies for mlout */
2296 /* weight energies and thresholds */
2297 for (ch=0; ch<cm->elInfo[i].nChannelsInEl; ch++) {
2298 QC_OUT_CHANNEL* pQcOutCh = qcElement[i]->qcOutChannel[ch];
2299 for (sfbGrp = 0;sfbGrp < psyOutElement[i]->psyOutChannel[ch]->sfbCnt; sfbGrp+=psyOutElement[i]->psyOutChannel[ch]->sfbPerGroup) {
2300 for (sfb=0; sfb<psyOutElement[i]->psyOutChannel[ch]->maxSfbPerGroup; sfb++) {
2301 pQcOutCh->sfbThresholdLdData[sfb+sfbGrp] += pQcOutCh->sfbEnFacLd[sfb+sfbGrp];
2302 }
2601 for (i=0; i<cm->nElements; i++) {
2602 int ch,sfb,sfbGrp;
2603 /* no weighting of threholds and energies for mlout */
2604 /* weight energies and thresholds */
2605 for (ch=0; ch<cm->elInfo[i].nChannelsInEl; ch++) {
2606 QC_OUT_CHANNEL* pQcOutCh = qcElement[i]->qcOutChannel[ch];
2607 for (sfbGrp = 0;sfbGrp < psyOutElement[i]->psyOutChannel[ch]->sfbCnt; sfbGrp+=psyOutElement[i]->psyOutChannel[ch]->sfbPerGroup) {
2608 for (sfb=0; sfb<psyOutElement[i]->psyOutChannel[ch]->maxSfbPerGroup; sfb++) {
2609 pQcOutCh->sfbThresholdLdData[sfb+sfbGrp] += pQcOutCh->sfbEnFacLd[sfb+sfbGrp];
23032610 }
23042611 }
23052612 }
2306
2613 }
23072614 }
23082615
23092616 void FDKaacEnc_AdjThrClose(ADJ_THR_STATE** phAdjThr)
23122619 ADJ_THR_STATE* hAdjThr = *phAdjThr;
23132620
23142621 if (hAdjThr!=NULL) {
2315 for (i=0; i<(6); i++) {
2622 for (i=0; i<(8); i++) {
23162623 if (hAdjThr->adjThrStateElem[i]!=NULL) {
23172624 FreeRam_aacEnc_AdjThrStateElement(&hAdjThr->adjThrStateElem[i]);
23182625 }
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
9797 #include "interface.h"
9898
9999
100
101 void FDKaacEnc_peCalculation(PE_DATA *peData,
102 PSY_OUT_CHANNEL* psyOutChannel[(2)],
103 QC_OUT_CHANNEL* qcOutChannel[(2)],
104 struct TOOLSINFO *toolsInfo,
105 ATS_ELEMENT* adjThrStateElement,
106 const INT nChannels);
100 void FDKaacEnc_peCalculation(
101 PE_DATA *peData,
102 PSY_OUT_CHANNEL* psyOutChannel[(2)],
103 QC_OUT_CHANNEL* qcOutChannel[(2)],
104 struct TOOLSINFO *toolsInfo,
105 ATS_ELEMENT* adjThrStateElement,
106 const INT nChannels
107 );
107108
108109 INT FDKaacEnc_AdjThrNew(ADJ_THR_STATE** phAdjThr,
109110 INT nElements);
110111
111112 void FDKaacEnc_AdjThrInit(ADJ_THR_STATE *hAdjThr,
112113 const INT peMean,
113 ELEMENT_BITS* elBits[(6)],
114 ELEMENT_BITS* elBits[(8)],
115 INT invQuant,
114116 INT nElements,
117 INT nChannelsEff,
118 INT sampleRate,
119 INT advancedBitsToPe,
115120 FIXP_DBL vbrQualFactor);
116
121
117122
118123 void FDKaacEnc_DistributeBits(ADJ_THR_STATE *adjThrState,
119124 ATS_ELEMENT *AdjThrStateElement,
127132 const INT bitresBits,
128133 const INT maxBitresBits,
129134 const FIXP_DBL maxBitFac,
130 const INT bitDistributenMode);
135 const INT bitDistributionMode);
131136
132 void FDKaacEnc_AdjustThresholds(ATS_ELEMENT* AdjThrStateElement[(6)],
133 QC_OUT_ELEMENT* qcElement[(6)],
137 void FDKaacEnc_AdjustThresholds(ATS_ELEMENT* AdjThrStateElement[(8)],
138 QC_OUT_ELEMENT* qcElement[(8)],
134139 QC_OUT* qcOut,
135 PSY_OUT_ELEMENT* psyOutElement[(6)],
140 PSY_OUT_ELEMENT* psyOutElement[(8)],
136141 INT CBRbitrateMode,
137142 CHANNEL_MAPPING* cm);
138143
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
143143
144144 typedef struct {
145145 BRES_PARAM bresParamLong, bresParamShort;
146 ATS_ELEMENT* adjThrStateElem[(6)];
146 ATS_ELEMENT* adjThrStateElem[(8)];
147147 } ADJ_THR_STATE;
148148
149149 #endif
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
203203 INT bwTabSize = 0;
204204
205205 switch (frameLength) {
206 case 960:
207206 case 1024:
208207 pBwTab = bandWidthTable;
209208 bwTabSize = sizeof(bandWidthTable)/sizeof(BANDWIDTH_TAB);
252251 chanBitRate < pBwTab[i+1].chanBitRate)
253252 {
254253 switch (frameLength) {
255 case 960:
256254 case 1024:
257255 bandwidth = (entryNo==0)
258256 ? pBwTab[i].bandWidthMono
317315 case MODE_1_2_2:
318316 case MODE_1_2_2_1:
319317 case MODE_1_2_2_2_1:
318 case MODE_7_1_REAR_SURROUND:
319 case MODE_7_1_FRONT_CENTER:
320320 *bandWidth = bandWidthTableVBR[bitrateMode].bandWidth2AndMoreChan;
321321 break;
322322 default:
347347 case MODE_1_2_2: /* sce + cpe + cpe */
348348 case MODE_1_2_2_1: /* (5.1) sce + cpe + cpe + lfe */
349349 case MODE_1_2_2_2_1: /* (7.1) sce + cpe + cpe + cpe + lfe */
350 case MODE_7_1_REAR_SURROUND:
351 case MODE_7_1_FRONT_CENTER:
350352 entryNo = 1; /* use stereo bandwith settings */
351353 break;
352354
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
13591359
13601360 if ( (syntaxFlags & AC_ER) && !(syntaxFlags & AC_DRM) )
13611361 {
1362 UCHAR channelElementExtensionWritten[(6)][(1)]; /* 0: extension not touched, 1: extension already written */
1362 UCHAR channelElementExtensionWritten[(8)][(1)]; /* 0: extension not touched, 1: extension already written */
13631363
13641364 FDKmemclear(channelElementExtensionWritten, sizeof(channelElementExtensionWritten));
13651365
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
8282
8383 /***************************** MPEG-4 AAC Encoder **************************
8484
85 Author(s): M. Werner
85 Author(s): M. Werner, Tobias Chalupka
8686 Description: Block switching
8787
8888 ******************************************************************************/
9999
100100 static FIXP_DBL FDKaacEnc_GetWindowEnergy(const FIXP_DBL in[], const INT blSwWndIdx);
101101
102 static void FDKaacEnc_CalcWindowEnergy( BLOCK_SWITCHING_CONTROL *RESTRICT blockSwitchingControl,
103 INT windowLen);
104
102 static void FDKaacEnc_CalcWindowEnergy(
103 BLOCK_SWITCHING_CONTROL *RESTRICT blockSwitchingControl,
104 INT windowLen,
105 const INT_PCM *pTimeSignal
106 );
105107
106108 /****************** Constants *****************************/
107109 /* LONG START SHORT STOP LOWOV */
144146
145147 /**************** internal function prototypes ***********/
146148
147 static INT FDKaacEnc_GetWindowIndex(INT blockSwWindowIndex);
148
149 static FIXP_DBL FDKaacEnc_GetWindowEnergy(const FIXP_DBL in[], const INT shortWndIdx);
150
151 static void FDKaacEnc_CalcWindowEnergy( BLOCK_SWITCHING_CONTROL *RESTRICT blockSwitchingControl,
152 INT windowLen);
153
154
155
156149 /****************** Routines ****************************/
157150 void FDKaacEnc_InitBlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl, INT isLowDelay)
158151 {
159 /* note: the pointer to timeSignal can be zeroed here, because it is initialized for every call
160 to FDKaacEnc_BlockSwitching anew */
161152 FDKmemclear (blockSwitchingControl, sizeof(BLOCK_SWITCHING_CONTROL));
162153
163154 if (isLowDelay)
213204 /*attack */ {START_WINDOW, SHORT_WINDOW, SHORT_WINDOW, START_WINDOW, WRONG_WINDOW, WRONG_WINDOW} } /* attack */
214205 };
215206
216 int FDKaacEnc_BlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl, const INT granuleLength, const int isLFE)
207 int FDKaacEnc_BlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl, const INT granuleLength, const int isLFE, const INT_PCM *pTimeSignal)
217208 {
218209 UINT i;
219210 FIXP_DBL enM1, enMax;
262253
263254
264255 /* Calculate unfiltered and filtered energies in subwindows and combine to segments */
265 FDKaacEnc_CalcWindowEnergy(blockSwitchingControl, granuleLength>>(nBlockSwitchWindows==4? 2:3 ));
256 FDKaacEnc_CalcWindowEnergy(blockSwitchingControl, granuleLength>>(nBlockSwitchWindows==4? 2:3 ), pTimeSignal);
266257
267258 /* now calculate if there is an attack */
268259
334325
335326 }
336327
337
338 static void FDKaacEnc_CalcWindowEnergy(BLOCK_SWITCHING_CONTROL *RESTRICT blockSwitchingControl, INT windowLen)
328 static void FDKaacEnc_CalcWindowEnergy(BLOCK_SWITCHING_CONTROL *RESTRICT blockSwitchingControl, INT windowLen, const INT_PCM *pTimeSignal)
339329 {
340330 INT i;
341331 UINT w;
342332
343333 FIXP_SGL hiPassCoeff0 = hiPassCoeff[0];
344334 FIXP_SGL hiPassCoeff1 = hiPassCoeff[1];
345
346 INT_PCM *timeSignal = blockSwitchingControl->timeSignal;
347335
348336 /* sum up scalarproduct of timesignal as windowed Energies */
349337 for (w=0; w < blockSwitchingControl->nBlockSwitchWindows; w++) {
360348 FIXP_DBL tempUnfiltered, tempFiltred, t1, t2;
361349 /* tempUnfiltered is scaled with 1 to prevent overflows during calculation of tempFiltred */
362350 #if SAMPLE_BITS == DFRACT_BITS
363 tempUnfiltered = (FIXP_DBL) *timeSignal++ >> 1;
351 tempUnfiltered = (FIXP_DBL) *pTimeSignal++ >> 1;
364352 #else
365 tempUnfiltered = (FIXP_DBL) *timeSignal++ << (DFRACT_BITS-SAMPLE_BITS-1);
353 tempUnfiltered = (FIXP_DBL) *pTimeSignal++ << (DFRACT_BITS-SAMPLE_BITS-1);
366354 #endif
367355 t1 = fMultDiv2(hiPassCoeff1, tempUnfiltered-temp_iirState0);
368356 t2 = fMultDiv2(hiPassCoeff0, temp_iirState1);
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
106106
107107 /****************** Structures ***************************/
108108 typedef struct{
109 INT_PCM *timeSignal;
110109 INT lastWindowSequence;
111110 INT windowShape;
112111 INT lastWindowShape;
135134
136135 void FDKaacEnc_InitBlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl, INT isLowDelay);
137136
138 int FDKaacEnc_BlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl, const INT granuleLength, const int isLFE);
137 int FDKaacEnc_BlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl, const INT granuleLength, const int isLFE, const INT_PCM *pTimeSignal);
139138
140139 int FDKaacEnc_SyncBlockSwitching(
141140 BLOCK_SWITCHING_CONTROL *blockSwitchingControlLeft,
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
123123 typedef struct {
124124
125125 CHANNEL_MODE encoderMode;
126 INT channel_assignment[/*(6)*/12];
126 INT channel_assignment[/*(8)*/12];
127127
128128 } CHANNEL_ASSIGNMENT_INFO_TAB;
129129
138138 { MODE_1_2_2, { 0, 1, 2, 3, 4,-1,-1,-1,-1,-1,-1,-1} }, /* 5ch */
139139 { MODE_1_2_2_1, { 0, 1, 2, 3, 4, 5,-1,-1,-1,-1,-1,-1} }, /* 5.1ch */
140140 { MODE_1_2_2_2_1, { 0, 1, 2, 3, 4, 5, 6, 7,-1,-1,-1,-1} }, /* 7.1ch */
141 { MODE_7_1_REAR_SURROUND, { 0, 1, 2, 3, 4, 5, 6, 7,-1,-1,-1,-1} }, /* 7.1ch */
142 { MODE_7_1_FRONT_CENTER, { 0, 1, 2, 3, 4, 5, 6, 7,-1,-1,-1,-1} } /* 7.1ch */
141143 };
142144
143145 static const CHANNEL_ASSIGNMENT_INFO_TAB assignmentInfoTabWav[] =
149151 { MODE_1_2_1, { 2, 0, 1, 3,-1,-1,-1,-1,-1,-1,-1,-1} }, /* 4ch */
150152 { MODE_1_2_2, { 2, 0, 1, 3, 4,-1,-1,-1,-1,-1,-1,-1} }, /* 5ch */
151153 { MODE_1_2_2_1, { 2, 0, 1, 4, 5, 3,-1,-1,-1,-1,-1,-1} }, /* 5.1ch */
152 { MODE_1_2_2_2_1, { 2, 0, 1, 6, 7, 4, 5, 3,-1,-1,-1,-1} }, /* 7.1ch */
154 { MODE_1_2_2_2_1, { 2, 6, 7, 0, 1, 4, 5, 3,-1,-1,-1,-1} }, /* 7.1ch */
155 { MODE_7_1_REAR_SURROUND, { 2, 0, 1, 6, 7, 4, 5, 3,-1,-1,-1,-1} }, /* 7.1ch */
156 { MODE_7_1_FRONT_CENTER, { 2, 6, 7, 0, 1, 4, 5, 3,-1,-1,-1,-1} }, /* 7.1ch */
153157 };
154158
155159 static const CHANNEL_ASSIGNMENT_INFO_TAB assignmentInfoTabWg4[] =
176180 { MODE_1_2_2, 5, 5, 3 }, /* SCE,CPE,CPE */
177181 { MODE_1_2_2_1, 6, 5, 4 }, /* SCE,CPE,CPE,LFE */
178182 { MODE_1_2_2_2_1, 8, 7, 5 }, /* SCE,CPE,CPE,CPE,LFE */
183 { MODE_7_1_REAR_SURROUND, 8, 7, 5 },
184 { MODE_7_1_FRONT_CENTER, 8, 7, 5 },
179185 };
180186
181187 #define MAX_MODES (sizeof(assignmentInfoTabWav)/sizeof(CHANNEL_ASSIGNMENT_INFO_TAB))
328334 break;
329335
330336 case MODE_1_2_2_2_1:
337 case MODE_7_1_REAR_SURROUND:
338 case MODE_7_1_FRONT_CENTER:
331339 /* (7.1) sce + cpe + cpe + cpe + lfe */
332340 FDKaacEnc_initElement(&cm->elInfo[0], ID_SCE, &count, mode, co, it_cnt, FL2FXCONST_DBL(0.18f));
333341 FDKaacEnc_initElement(&cm->elInfo[1], ID_CPE, &count, mode, co, it_cnt, FL2FXCONST_DBL(0.26f));
335343 FDKaacEnc_initElement(&cm->elInfo[3], ID_CPE, &count, mode, co, it_cnt, FL2FXCONST_DBL(0.26f));
336344 FDKaacEnc_initElement(&cm->elInfo[4], ID_LFE, &count, mode, co, it_cnt, FL2FXCONST_DBL(0.04f));
337345 break;
338
339346 default:
340347 //*chMap=0;
341348 return AAC_ENC_UNSUPPORTED_CHANNELCONFIG;
342349 };
343350
344351
345 FDK_ASSERT(cm->nElements<=(6));
352 FDK_ASSERT(cm->nElements<=(8));
346353
347354
348355 return AAC_ENC_OK;
455462
456463 break;
457464 }
458
459 case MODE_1_2_2_2_1:{
460 /* (7.1) sce + cpe + cpe + cpe + lfe */
461 hQC->elementBits[0]->relativeBitsEl = cm->elInfo[0].relativeBits;
462 hQC->elementBits[1]->relativeBitsEl = cm->elInfo[1].relativeBits;
463 hQC->elementBits[2]->relativeBitsEl = cm->elInfo[2].relativeBits;
464 hQC->elementBits[3]->relativeBitsEl = cm->elInfo[3].relativeBits;
465 hQC->elementBits[4]->relativeBitsEl = cm->elInfo[4].relativeBits;
466 FIXP_DBL sceRate = cm->elInfo[0].relativeBits;
467 FIXP_DBL cpe1Rate = cm->elInfo[1].relativeBits;
468 FIXP_DBL cpe2Rate = cm->elInfo[2].relativeBits;
469 FIXP_DBL cpe3Rate = cm->elInfo[3].relativeBits;
470 FIXP_DBL lfeRate = cm->elInfo[4].relativeBits;
465 case MODE_7_1_REAR_SURROUND:
466 case MODE_7_1_FRONT_CENTER:
467 case MODE_1_2_2_2_1: {
468 int cpe3Idx = 3;
469 int lfeIdx = 4;
470
471 /* (7.1) sce + cpe + cpe + cpe + lfe */
472 FIXP_DBL sceRate = hQC->elementBits[0]->relativeBitsEl = cm->elInfo[0].relativeBits;
473 FIXP_DBL cpe1Rate = hQC->elementBits[1]->relativeBitsEl = cm->elInfo[1].relativeBits;
474 FIXP_DBL cpe2Rate = hQC->elementBits[2]->relativeBitsEl = cm->elInfo[2].relativeBits;
475 FIXP_DBL cpe3Rate = hQC->elementBits[cpe3Idx]->relativeBitsEl = cm->elInfo[cpe3Idx].relativeBits;
476 FIXP_DBL lfeRate = hQC->elementBits[lfeIdx]->relativeBitsEl = cm->elInfo[lfeIdx].relativeBits;
471477
472478 int maxBitsTot = maxChannelBits * 7; /* LFE does not add to bit reservoir */
473479 int sc = CountLeadingBits(fixMax(maxChannelBits,averageBitsTot));
479485 hQC->elementBits[0]->chBitrateEl = fMult(sceRate, (FIXP_DBL)(bitrateTot<<sc_brTot))>>sc_brTot;
480486 hQC->elementBits[1]->chBitrateEl = fMult(cpe1Rate, (FIXP_DBL)(bitrateTot<<sc_brTot))>>(sc_brTot+1);
481487 hQC->elementBits[2]->chBitrateEl = fMult(cpe2Rate, (FIXP_DBL)(bitrateTot<<sc_brTot))>>(sc_brTot+1);
482 hQC->elementBits[3]->chBitrateEl = fMult(cpe3Rate, (FIXP_DBL)(bitrateTot<<sc_brTot))>>(sc_brTot+1);
483 hQC->elementBits[4]->chBitrateEl = fMult(lfeRate, (FIXP_DBL)(bitrateTot<<sc_brTot))>>sc_brTot;
488 hQC->elementBits[cpe3Idx]->chBitrateEl = fMult(cpe3Rate, (FIXP_DBL)(bitrateTot<<sc_brTot))>>(sc_brTot+1);
489 hQC->elementBits[lfeIdx]->chBitrateEl = fMult(lfeRate, (FIXP_DBL)(bitrateTot<<sc_brTot))>>sc_brTot;
484490
485491 hQC->elementBits[0]->maxBitsEl = maxChannelBits;
486492 hQC->elementBits[1]->maxBitsEl = 2*maxChannelBits;
487493 hQC->elementBits[2]->maxBitsEl = 2*maxChannelBits;
488 hQC->elementBits[3]->maxBitsEl = 2*maxChannelBits;
489 hQC->elementBits[4]->maxBitsEl = maxLfeBits;
490 break;
491 }
492
494 hQC->elementBits[cpe3Idx]->maxBitsEl = 2*maxChannelBits;
495 hQC->elementBits[lfeIdx]->maxBitsEl = maxLfeBits;
496 break;
497 }
493498 default:
494499 return AAC_ENC_UNSUPPORTED_CHANNELCONFIG;
495500 }
531536 case MODE_1_2_2:
532537 case MODE_1_2_2_1:
533538 case MODE_1_2_2_2_1:
539 case MODE_7_1_REAR_SURROUND:
540 case MODE_7_1_FRONT_CENTER:
534541 monoStereoSetting = EL_MODE_STEREO;
535542 break;
536543 default: /* error */
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
449449 const INT maxSfbPerGroup)
450450 {
451451 INT sfb,sfboffs, j;
452 INT startIsSfb = 0;
453 INT inIsBlock;
454 INT currentIsSfbCount;
455 FIXP_DBL overallHrrError;
456452 FIXP_DBL isScaleLast = FL2FXCONST_DBL(0.0f);
457 FIXP_DBL isRegionLoudness;
453 INT isStartValueFound = 0;
458454
459455 for (sfboffs = 0; sfboffs < sfbCnt; sfboffs += sfbPerGroup) {
460 inIsBlock = 0;
461 currentIsSfbCount = 0;
462 overallHrrError = FL2FXCONST_DBL(0.0f);
463 isRegionLoudness = FL2FXCONST_DBL(0.0f);
456 INT startIsSfb = 0;
457 INT inIsBlock = 0;
458 INT currentIsSfbCount = 0;
459 FIXP_DBL overallHrrError = FL2FXCONST_DBL(0.0f);
460 FIXP_DBL isRegionLoudness = FL2FXCONST_DBL(0.0f);
461
464462 for (sfb = 0; sfb < maxSfbPerGroup; sfb++) {
465463 if (isMask[sfboffs + sfb] == 1) {
466464 if (currentIsSfbCount == 0) {
467465 startIsSfb = sfboffs + sfb;
466 }
467 if (isStartValueFound==0) {
468468 isScaleLast = realIsScale[sfboffs + sfb];
469 isStartValueFound = 1;
469470 }
470471 inIsBlock = 1;
471472 currentIsSfbCount++;
508509 if (currentIsSfbCount < isParams->min_is_sfbs || (isRegionLoudness < isParams->is_region_min_loudness>>MAX_SFB_PER_GROUP_SF)) {
509510 for(j = startIsSfb; j <= sfboffs + sfb; j++) {
510511 isMask[j] = 0;
512 }
513 isScaleLast = FL2FXCONST_DBL(0.0f);
514 isStartValueFound = 0;
515 for (j=0; j < startIsSfb; j++) {
516 if (isMask[j]!=0) {
517 isScaleLast = realIsScale[j];
518 isStartValueFound = 1;
519 }
511520 }
512521 }
513522 currentIsSfbCount = 0;
583592 FIXP_DBL realIsScale[MAX_GROUPED_SFB];
584593 INTENSITY_PARAMETERS isParams;
585594 INT isMask[MAX_GROUPED_SFB];
586 INT lastValIs = 0, delta;
587595
588596 FDKmemclear((void*)isBook,sfbCnt*sizeof(INT));
589597 FDKmemclear((void*)isMask,sfbCnt*sizeof(INT));
739747 isScale[sfb+sfboffs] = (INT)(((realIsScale[sfb+sfboffs]>>1)+FL2FXCONST_DBL(0.5f/(1<<(REAL_SCALE_SF+LD_DATA_SHIFT+1))))>>(DFRACT_BITS-1-REAL_SCALE_SF-LD_DATA_SHIFT-1));
740748 }
741749
742 delta = isScale[sfb+sfboffs] - lastValIs;
743 if (delta < -CODE_BOOK_SCF_LAV) {
744 isScale[sfb+sfboffs] = lastValIs - CODE_BOOK_SCF_LAV;
745 } else if (delta + CODE_BOOK_SCF_LAV >= (INT)(sizeof(FDKaacEnc_huff_ltabscf)/sizeof(FDKaacEnc_huff_ltabscf[0]))) {
746 isScale[sfb+sfboffs] = lastValIs + sizeof(FDKaacEnc_huff_ltabscf)/sizeof(FDKaacEnc_huff_ltabscf[0]) - CODE_BOOK_SCF_LAV - 1;
747 }
748 lastValIs = isScale[sfb+sfboffs];
749
750750 sfbEnergyRight[sfb+sfboffs] = FL2FXCONST_DBL(0.0f);
751751 sfbEnergyLdDataRight[sfb+sfboffs] = FL2FXCONST_DBL(-1.0f);
752752 sfbThresholdRight[sfb+sfboffs] = FL2FXCONST_DBL(0.0f);
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
9191 #define _INTERFACE_H
9292
9393 #include "common_fix.h"
94 #include "FDK_audio.h"
9495
9596 #include "psy_data.h"
9697 #include "aacenc_tns.h"
154155
155156 typedef struct {
156157
157 PSY_OUT_ELEMENT* psyOutElement[(6)];
158 PSY_OUT_CHANNEL* pPsyOutChannels[(6)];
158 PSY_OUT_ELEMENT* psyOutElement[(8)];
159 PSY_OUT_CHANNEL* pPsyOutChannels[(8)];
159160
160161 }PSY_OUT;
161162
163 inline int isLowDelay( AUDIO_OBJECT_TYPE aot )
164 {
165 return (aot==AOT_ER_AAC_LD || aot==AOT_ER_AAC_ELD);
166 }
167
162168 #endif /* _INTERFACE_H */
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
420420 result = f2Pow(-exponent, DFRACT_BITS-1-METADATA_FRACT_BITS, &e_res);
421421
422422 /* result = 1.0 - exp(-1.0/((t) * (f))) */
423 result = FL2FXCONST_DBL(1.0f) - scaleValue(result, e_res);
423 result = (FIXP_DBL)MAXVAL_DBL - scaleValue(result, e_res);
424424
425425 return result;
426426 }
538538 drcComp->channelIdx[RS] = channelMapping.elInfo[2].ChannelIndex[1];
539539 break;
540540 case MODE_1_2_2_2_1: /* 7.1 ch */
541 drcComp->channelIdx[L] = channelMapping.elInfo[1].ChannelIndex[0];
542 drcComp->channelIdx[R] = channelMapping.elInfo[1].ChannelIndex[1];
543 drcComp->channelIdx[C] = channelMapping.elInfo[0].ChannelIndex[0];
544 drcComp->channelIdx[LFE] = channelMapping.elInfo[4].ChannelIndex[0];
545 drcComp->channelIdx[LS] = channelMapping.elInfo[2].ChannelIndex[0];
546 drcComp->channelIdx[RS] = channelMapping.elInfo[2].ChannelIndex[1];
547 drcComp->channelIdx[LS2] = channelMapping.elInfo[3].ChannelIndex[0];
548 drcComp->channelIdx[RS2] = channelMapping.elInfo[3].ChannelIndex[1];
541 case MODE_7_1_FRONT_CENTER:
542 drcComp->channelIdx[L] = channelMapping.elInfo[2].ChannelIndex[0]; /* l */
543 drcComp->channelIdx[R] = channelMapping.elInfo[2].ChannelIndex[1]; /* r */
544 drcComp->channelIdx[C] = channelMapping.elInfo[0].ChannelIndex[0]; /* c */
545 drcComp->channelIdx[LFE] = channelMapping.elInfo[4].ChannelIndex[0]; /* lfe */
546 drcComp->channelIdx[LS] = channelMapping.elInfo[3].ChannelIndex[0]; /* ls */
547 drcComp->channelIdx[RS] = channelMapping.elInfo[3].ChannelIndex[1]; /* rs */
548 drcComp->channelIdx[LS2] = channelMapping.elInfo[1].ChannelIndex[0]; /* lc */
549 drcComp->channelIdx[RS2] = channelMapping.elInfo[1].ChannelIndex[1]; /* rc */
550 break;
551 case MODE_7_1_REAR_SURROUND:
552 drcComp->channelIdx[L] = channelMapping.elInfo[1].ChannelIndex[0]; /* l */
553 drcComp->channelIdx[R] = channelMapping.elInfo[1].ChannelIndex[1]; /* r */
554 drcComp->channelIdx[C] = channelMapping.elInfo[0].ChannelIndex[0]; /* c */
555 drcComp->channelIdx[LFE] = channelMapping.elInfo[4].ChannelIndex[0]; /* lfe */
556 drcComp->channelIdx[LS] = channelMapping.elInfo[3].ChannelIndex[0]; /* lrear */
557 drcComp->channelIdx[RS] = channelMapping.elInfo[3].ChannelIndex[1]; /* rrear */
558 drcComp->channelIdx[LS2] = channelMapping.elInfo[2].ChannelIndex[0]; /* ls */
559 drcComp->channelIdx[RS2] = channelMapping.elInfo[2].ChannelIndex[1]; /* rs */
549560 break;
550561 case MODE_1_1:
551562 case MODE_1_1_1_1:
831842 FIXP_DBL accu;
832843
833844 /* drcComp->smoothLevel[i] = (1-alpha) * drcComp->smoothLevel[i] + alpha * level; */
834 accu = fMult((FL2FXCONST_DBL(1.f)-alpha), drcComp->smoothLevel[i]);
845 accu = fMult(((FIXP_DBL)MAXVAL_DBL-alpha), drcComp->smoothLevel[i]);
835846 accu += fMult(alpha,level);
836847 drcComp->smoothLevel[i] = accu;
837848
838849 /* drcComp->smoothGain[i] = (1-alpha) * drcComp->smoothGain[i] + alpha * gain; */
839 accu = fMult((FL2FXCONST_DBL(1.f)-alpha), drcComp->smoothGain[i]);
850 accu = fMult(((FIXP_DBL)MAXVAL_DBL-alpha), drcComp->smoothGain[i]);
840851 accu += fMult(alpha,gain);
841852 drcComp->smoothGain[i] = accu;
842853 }
940951 if ((drcComp->channelIdx[LS] >= 0) && (drcComp->channelIdx[LS2] >= 0)) tmp = fMult(FL2FXCONST_DBL(0.707f), tmp); /* 7.1ch */
941952 /*if ((drcComp->channelIdx[RS] >= 0) && (drcComp->channelIdx[RS2] >= 0)) tmp *=0.707f;*/ /* 7.1ch */
942953 if (drcComp->channelIdx[S] >= 0) tmp += fMultDiv2(slev, fMult(FL2FXCONST_DBL(0.7f), (FIXP_PCM)pSamples[drcComp->channelIdx[S]]))>>(DOWNMIX_SHIFT-1); /* S */
943 if (drcComp->channelIdx[C] >= 0) tmp += fMultDiv2(clev, (FIXP_PCM)pSamples[drcComp->channelIdx[C]])>>(DOWNMIX_SHIFT-1); /* C */
954 if (drcComp->channelIdx[C] >= 0) tmp += fMult(clev, (FIXP_PCM)pSamples[drcComp->channelIdx[C]])>>(DOWNMIX_SHIFT-1); /* C (2*clev) */
944955 tmp += (FX_PCM2FX_DBL((FIXP_PCM)pSamples[drcComp->channelIdx[L]])>>DOWNMIX_SHIFT); /* L */
945956 tmp += (FX_PCM2FX_DBL((FIXP_PCM)pSamples[drcComp->channelIdx[R]])>>DOWNMIX_SHIFT); /* R */
946957
972983 * + 0.2f*2^(-METADATA_FRACT_BITS) + drcComp->smoothGain[i]
973984 */
974985 peak[i] = fMult((FIXP_DBL)(10<<(METADATA_FRACT_BITS+LD_DATA_SHIFT)), fMult( FL2FX_DBL(2*0.30102999566398119521373889472449f), ld_peak));
975 peak[i] += (FL2FX_DBL(0.2f)>>METADATA_INT_BITS); /* add a little bit headroom */
986 peak[i] += (FL2FX_DBL(0.5f)>>METADATA_INT_BITS); /* add a little bit headroom */
976987 peak[i] += drcComp->smoothGain[i];
977988 }
978989
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
9797
9898 #define FRAME_MAXLEN_SHORT ((1024)/TRANS_FAC)
9999 #define FRAME_LEN_SHORT_128 ((1024)/TRANS_FAC)
100 #define FRAME_LEN_SHORT_120 (FRAME_LEN_LONG_960/TRANS_FAC)
101100
102101 /* Filterbank type*/
103102 enum FB_TYPE {
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
114114
115115 /* forward definitions */
116116
117
118 static inline int isLowDelay( AUDIO_OBJECT_TYPE aot )
119 {
120 return (aot==AOT_ER_AAC_LD || aot==AOT_ER_AAC_ELD);
121 }
122117
123118 /*****************************************************************************
124119
512507
513508 for(ch = 0; ch < channels; ch++)
514509 {
515 C_ALLOC_SCRATCH_START(timeSignal, INT_PCM, (1024));
516 psyStatic[ch]->blockSwitchingControl.timeSignal = timeSignal;
510 C_ALLOC_SCRATCH_START(pTimeSignal, INT_PCM, (1024))
517511
518512 /* deinterleave input data and use for block switching */
519 FDKaacEnc_deinterleaveInputBuffer( psyStatic[ch]->blockSwitchingControl.timeSignal,
513 FDKaacEnc_deinterleaveInputBuffer( pTimeSignal,
520514 &pInput[chIdx[ch]],
521515 psyConf->granuleLength,
522516 totalChannels);
523517
524518
525519 FDKaacEnc_BlockSwitching (&psyStatic[ch]->blockSwitchingControl,
526 psyConf->granuleLength
527 ,psyStatic[ch]->isLFE
520 psyConf->granuleLength,
521 psyStatic[ch]->isLFE,
522 pTimeSignal
528523 );
529524
530525
531526 /* fill up internal input buffer, to 2xframelength samples */
532527 FDKmemcpy(psyStatic[ch]->psyInputBuffer+blockSwitchingOffset,
533 psyStatic[ch]->blockSwitchingControl.timeSignal,
528 pTimeSignal,
534529 (2*psyConf->granuleLength-blockSwitchingOffset)*sizeof(INT_PCM));
535530
536 C_ALLOC_SCRATCH_END(timeSignal, INT_PCM, (1024));
531 C_ALLOC_SCRATCH_END(pTimeSignal, INT_PCM, (1024))
537532 }
538533
539534 /* synch left and right block type */
13441339
13451340 if (hPsyInternal)
13461341 {
1347 for (i=0; i<(6); i++) {
1342 for (i=0; i<(8); i++) {
13481343 if (hPsyInternal->pStaticChannels[i]) {
13491344 if (hPsyInternal->pStaticChannels[i]->psyInputBuffer)
13501345 FreeRam_aacEnc_PsyInputBuffer(&hPsyInternal->pStaticChannels[i]->psyInputBuffer); /* AUDIO INPUT BUFFER */
13531348 }
13541349 }
13551350
1356 for (i=0; i<(6); i++) {
1351 for (i=0; i<(8); i++) {
13571352 if (hPsyInternal->psyElement[i])
13581353 FreeRam_aacEnc_PsyElement(&hPsyInternal->psyElement[i]); /* PSY_ELEMENT */
13591354 }
13671362 for (n=0; n<(1); n++) {
13681363 if (phPsyOut[n])
13691364 {
1370 for (i=0; i<(6); i++) {
1365 for (i=0; i<(8); i++) {
13711366 if (phPsyOut[n]->pPsyOutChannels[i])
13721367 FreeRam_aacEnc_PsyOutChannel(&phPsyOut[n]->pPsyOutChannels[i]); /* PSY_OUT_CHANNEL */
13731368 }
13741369
1375 for (i=0; i<(6); i++) {
1370 for (i=0; i<(8); i++) {
13761371 if (phPsyOut[n]->psyOutElement[i])
13771372 FreeRam_aacEnc_PsyOutElements(&phPsyOut[n]->psyOutElement[i]); /* PSY_OUT_ELEMENTS */
13781373 }
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
116116 typedef struct {
117117
118118 PSY_CONFIGURATION psyConf[2]; /* LONG / SHORT */
119 PSY_ELEMENT* psyElement[(6)];
120 PSY_STATIC* pStaticChannels[(6)];
119 PSY_ELEMENT* psyElement[(8)];
120 PSY_STATIC* pStaticChannels[(8)];
121121 PSY_DYNAMIC* psyDynamic;
122122 INT granuleLength;
123123
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
126126 INT nChannels;
127127 INT nChannelsEff;
128128 INT nElements;
129 ELEMENT_INFO elInfo[(6)];
129 ELEMENT_INFO elInfo[(8)];
130130 } CHANNEL_MAPPING;
131131
132132 typedef struct {
142142 INT maxBits; /* maximum number of bits in reservoir */
143143 INT averageBits; /* average number of bits we should use */
144144 INT bitRes;
145 INT sampleRate; /* output sample rate */
146 INT advancedBitsToPe; /* if set, calc bits2PE factor depending on samplerate */
145147 INT staticBits; /* Bits per frame consumed by transport layers. */
146148 QCDATA_BR_MODE bitrateMode;
147149 INT meanPe;
214216
215217 typedef struct
216218 {
217 QC_OUT_ELEMENT *qcElement[(6)];
218 QC_OUT_CHANNEL *pQcOutChannels[(6)];
219 QC_OUT_ELEMENT *qcElement[(8)];
220 QC_OUT_CHANNEL *pQcOutChannels[(8)];
219221 QC_OUT_EXTENSION extension[(2+2)]; /* global extension payload */
220222 INT nExtensions; /* number of extension payloads for this AU */
221223 INT maxDynBits; /* maximal allowed dynamic bits in frame */
251253 INT minBitsPerFrame; /* minimal allowd bits per fram, superframing - DRM */
252254 INT nElements;
253255 QCDATA_BR_MODE bitrateMode;
254 INT bitDistributenMode; /* 0: full bitreservoir, 1: reduced bitreservoir, 2: disabled bitreservoir */
256 INT bitDistributionMode; /* 0: full bitreservoir, 1: reduced bitreservoir, 2: disabled bitreservoir */
255257 INT bitResTot;
256258 INT bitResTotMax;
257259 INT maxIterations; /* Maximum number of allowed iterations before FDKaacEnc_crashRecovery() is applied. */
262264
263265 PADDING padding;
264266
265 ELEMENT_BITS *elementBits[(6)];
267 ELEMENT_BITS *elementBits[(8)];
266268 BITCNTR_STATE *hBitCounter;
267269 ADJ_THR_STATE *hAdjThr;
268270
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
381381 if ( isConstantBitrateMode(hQC->bitrateMode) ) {
382382 INT bitresPerChannel = (hQC->bitResTotMax / init->channelMapping->nChannelsEff);
383383 /* 0: full bitreservoir, 1: reduced bitreservoir, 2: disabled bitreservoir */
384 hQC->bitDistributenMode = (bitresPerChannel>50) ? 0 : (bitresPerChannel>0) ? 1 : 2;
384 hQC->bitDistributionMode = (bitresPerChannel>100) ? 0 : (bitresPerChannel>0) ? 1 : 2;
385385 }
386386 else {
387 hQC->bitDistributenMode = 0; /* full bitreservoir */
387 hQC->bitDistributionMode = 0; /* full bitreservoir */
388388 }
389389
390390
419419 break;
420420 }
421421
422 FDKaacEnc_AdjThrInit(hQC->hAdjThr,
423 init->meanPe,
424 hQC->elementBits, /* or channelBitrates, was: channelBitrate */
425 init->channelMapping->nElements,
426 hQC->vbrQualFactor);
422 FDKaacEnc_AdjThrInit(
423 hQC->hAdjThr,
424 init->meanPe,
425 hQC->elementBits, /* or channelBitrates, was: channelBitrate */
426 hQC->invQuant,
427 init->channelMapping->nElements,
428 init->channelMapping->nChannelsEff,
429 init->sampleRate, /* output sample rate */
430 init->advancedBitsToPe, /* if set, calc bits2PE factor depending on samplerate */
431 hQC->vbrQualFactor
432 );
427433
428434 return AAC_ENC_OK;
429435 }
504510 }
505511
506512 static AAC_ENCODER_ERROR FDKaacEnc_distributeElementDynBits(QC_STATE* hQC,
507 QC_OUT_ELEMENT* qcElement[(6)],
513 QC_OUT_ELEMENT* qcElement[(8)],
508514 CHANNEL_MAPPING* cm,
509515 INT codeBits)
510516 {
603609 PSY_OUT** psyOut,
604610 QC_OUT** qcOut,
605611 CHANNEL_MAPPING* cm,
606 QC_OUT_ELEMENT* qcElement[(1)][(6)],
612 QC_OUT_ELEMENT* qcElement[(1)][(8)],
607613 INT avgTotalBits,
608614 INT *totalAvailableBits,
609615 INT *avgTotalDynBits)
654660 hQC->elementBits[i]->bitResLevelEl,
655661 hQC->elementBits[i]->maxBitResBitsEl,
656662 hQC->maxBitFac,
657 hQC->bitDistributenMode);
663 hQC->bitDistributionMode);
658664
659665 *totalAvailableBits += hQC->elementBits[i]->bitResLevelEl;
660666 /* get total corrected granted PE */
670676
671677 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
672678 static AAC_ENCODER_ERROR FDKaacEnc_updateUsedDynBits(INT* sumDynBitsConsumed,
673 QC_OUT_ELEMENT* qcElement[(6)],
679 QC_OUT_ELEMENT* qcElement[(8)],
674680 CHANNEL_MAPPING* cm)
675681 {
676682 INT i;
713719 }
714720
715721 static INT FDKaacEnc_getTotalConsumedBits(QC_OUT** qcOut,
716 QC_OUT_ELEMENT* qcElement[(1)][(6)],
722 QC_OUT_ELEMENT* qcElement[(1)][(8)],
717723 CHANNEL_MAPPING* cm,
718724 INT globHdrBits,
719725 INT nSubFrames)
813819
814820 /*-------------------------------------------- */
815821 /* helper pointer */
816 QC_OUT_ELEMENT* qcElement[(1)][(6)];
822 QC_OUT_ELEMENT* qcElement[(1)][(8)];
817823
818824 /* work on a copy of qcChannel and qcElement */
819825 for (i=0; i<cm->nElements; i++)
890896 } /* -end- sub frame counter */
891897
892898 /*-------------------------------------------- */
893 INT iterations[(1)][(6)];
894 INT chConstraintsFulfilled[(1)][(6)][(2)];
895 INT calculateQuant[(1)][(6)][(2)];
896 INT constraintsFulfilled[(1)][(6)];
899 INT iterations[(1)][(8)];
900 INT chConstraintsFulfilled[(1)][(8)][(2)];
901 INT calculateQuant[(1)][(8)][(2)];
902 INT constraintsFulfilled[(1)][(8)];
897903 /*-------------------------------------------- */
898904
899905
12401246
12411247 AAC_ENCODER_ERROR FDKaacEnc_updateFillBits(CHANNEL_MAPPING* cm,
12421248 QC_STATE* qcKernel,
1243 ELEMENT_BITS* RESTRICT elBits[(6)],
1249 ELEMENT_BITS* RESTRICT elBits[(8)],
12441250 QC_OUT** qcOut)
12451251 {
12461252 switch (qcKernel->bitrateMode) {
15961602 for (n=0;n<(1);n++) {
15971603 if (phQC[n] != NULL) {
15981604 QC_OUT *hQC = phQC[n];
1599 for (i=0; i<(6); i++) {
1605 for (i=0; i<(8); i++) {
16001606 }
16011607
1602 for (i=0; i<(6); i++) {
1608 for (i=0; i<(8); i++) {
16031609 if (hQC->qcElement[i])
16041610 FreeRam_aacEnc_QCelement(&hQC->qcElement[i]);
16051611 }
16191625 if (hQCstate->hBitCounter != NULL)
16201626 FDKaacEnc_BCClose(&hQCstate->hBitCounter);
16211627
1622 for (i=0; i<(6); i++) {
1628 for (i=0; i<(8); i++) {
16231629 if (hQCstate->elementBits[i]!=NULL) {
16241630 FreeRam_aacEnc_ElementBits(&hQCstate->elementBits[i]);
16251631 }
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
139139
140140 AAC_ENCODER_ERROR FDKaacEnc_updateFillBits(CHANNEL_MAPPING* cm,
141141 QC_STATE* qcKernel,
142 ELEMENT_BITS* RESTRICT elBits[(6)],
142 ELEMENT_BITS* RESTRICT elBits[(8)],
143143 QC_OUT** qcOut);
144144
145145
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
126126 accu = fMultDiv2(FDKaacEnc_mTab_3_4[tabIndex],FDKaacEnc_quantTableE[totalShift&3]);
127127 totalShift = (16-4)-(3*(totalShift>>2));
128128 FDK_ASSERT(totalShift >=0); /* MAX_QUANT_VIOLATION */
129 if (totalShift < 32)
130 accu>>=totalShift;
131 else
132 accu = 0;
129 accu >>= fixMin(totalShift,DFRACT_BITS-1);
133130 quaSpectrum[line] = (SHORT)(-((LONG)(k + accu) >> (DFRACT_BITS-1-16)));
134131 }
135132 else if(accu > FL2FXCONST_DBL(0.0f))
142139 accu = fMultDiv2(FDKaacEnc_mTab_3_4[tabIndex],FDKaacEnc_quantTableE[totalShift&3]);
143140 totalShift = (16-4)-(3*(totalShift>>2));
144141 FDK_ASSERT(totalShift >=0); /* MAX_QUANT_VIOLATION */
145 if (totalShift < 32)
146 accu>>=totalShift;
147 else
148 accu = 0;
142 accu >>= fixMin(totalShift,DFRACT_BITS-1);
149143 quaSpectrum[line] = (SHORT)((LONG)(k + accu) >> (DFRACT_BITS-1-16));
150144 }
151145 else
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
104104 * LONG_WINDOW, START_WINDOW, SHORT_WINDOW or STOP_WINDOW.
105105 * \param windowShape index indicating the window slope type to be used.
106106 * Values allowed are either SINE_WINDOW or KBD_WINDOW.
107 * \param frameLength length of the block. Either 1024 or 960.
107 * \param frameLength length of the block.
108108 * \param mdctData_e pointer to an INT where the exponent of the frequency
109109 * domain output data is stored into.
110110 * \return 0 in case of success, non-zero in case of error (inconsistent parameters).
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
170170
171171 extern const FIXP_QTW qmf_phaseshift_cos32[32];
172172 extern const FIXP_QTW qmf_phaseshift_sin32[32];
173 /* Adapted analysis post-twiddles for down-sampled HQ SBR */
174 extern const FIXP_QTW qmf_phaseshift_cos_downsamp32[32];
175 extern const FIXP_QTW qmf_phaseshift_sin_downsamp32[32];
173176 extern const FIXP_QTW qmf_phaseshift_cos64[64];
174177 extern const FIXP_QTW qmf_phaseshift_sin64[64];
175178
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
136136 #define QMF_FLAG_MPSLDFB 16
137137 /* Complex Low Delay Filter Bank used in MPEG Surround Encoder allows a optimized calculation of the modulation in qmfForwardModulationHQ() */
138138 #define QMF_FLAG_MPSLDFB_OPTIMIZE_MODULATION 32
139 /* Flag to indicate HE-AAC down-sampled SBR mode (decoder) -> adapt analysis post twiddling */
140 #define QMF_FLAG_DOWNSAMPLED 64
139141
140142
141143 typedef struct
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
9191
9292 /* FDK tools library info */
9393 #define FDK_TOOLS_LIB_VL0 2
94 #define FDK_TOOLS_LIB_VL1 2
95 #define FDK_TOOLS_LIB_VL2 8
94 #define FDK_TOOLS_LIB_VL1 3
95 #define FDK_TOOLS_LIB_VL2 2
9696 #define FDK_TOOLS_LIB_TITLE "FDK Tools"
9797 #define FDK_TOOLS_LIB_BUILD_DATE __DATE__
9898 #define FDK_TOOLS_LIB_BUILD_TIME __TIME__
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
14611461 QFC(0xfe4d1be3), QFC(0xd1c58ace), QFC(0x2e3a7532), QFC(0x01b2e41d), QFC(0x00000000),
14621462 };
14631463
1464 RAM_ALIGN
1465 LNK_SECTION_CONSTDATA
1466 const FIXP_QTW qmf_phaseshift_cos_downsamp32[] =
1467 {
1468 QTC(0x7fd8878e), QTC(0x7e9d55fc), QTC(0x7c29fbee), QTC(0x78848414), QTC(0x73b5ebd1), QTC(0x6dca0d14), QTC(0x66cf8120), QTC(0x5ed77c8a),
1469 QTC(0x55f5a4d2), QTC(0x4c3fdff4), QTC(0x41ce1e65), QTC(0x36ba2014), QTC(0x2b1f34eb), QTC(0x1f19f97b), QTC(0x12c8106f), QTC(0x0647d97c),
1470 QTC(0xf9b82684), QTC(0xed37ef91), QTC(0xe0e60685), QTC(0xd4e0cb15), QTC(0xc945dfec), QTC(0xbe31e19b), QTC(0xb3c0200c), QTC(0xaa0a5b2e),
1471 QTC(0xa1288376), QTC(0x99307ee0), QTC(0x9235f2ec), QTC(0x8c4a142f), QTC(0x877b7bec), QTC(0x83d60412), QTC(0x8162aa04), QTC(0x80277872),
1472 };
1473
1474 RAM_ALIGN
1475 LNK_SECTION_CONSTDATA
1476 const FIXP_QTW qmf_phaseshift_sin_downsamp32[] =
1477 {
1478 QTC(0x0647d97c), QTC(0x12c8106f), QTC(0x1f19f97b), QTC(0x2b1f34eb), QTC(0x36ba2014), QTC(0x41ce1e65), QTC(0x4c3fdff4), QTC(0x55f5a4d2),
1479 QTC(0x5ed77c8a), QTC(0x66cf8120), QTC(0x6dca0d14), QTC(0x73b5ebd1), QTC(0x78848414), QTC(0x7c29fbee), QTC(0x7e9d55fc), QTC(0x7fd8878e),
1480 QTC(0x7fd8878e), QTC(0x7e9d55fc), QTC(0x7c29fbee), QTC(0x78848414), QTC(0x73b5ebd1), QTC(0x6dca0d14), QTC(0x66cf8120), QTC(0x5ed77c8a),
1481 QTC(0x55f5a4d2), QTC(0x4c3fdff4), QTC(0x41ce1e65), QTC(0x36ba2014), QTC(0x2b1f34eb), QTC(0x1f19f97b), QTC(0x12c8106f), QTC(0x0647d97c),
1482 };
1483
14641484 #else /* QMF_NO_POLY == 5 */
14651485 #endif /* QMF_NO_POLY==5 */
14661486
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
241241
242242 *****************************************************************************/
243243 LNK_SECTION_CODE_L1
244 FIXP_DBL CalcInvLdData(FIXP_DBL op)
245 {
246 FIXP_DBL result_m;
247
248 if ( op == FL2FXCONST_DBL(0.0f) ) {
249 result_m = (FIXP_DBL)MAXVAL_DBL;
250 }
251 else if ( op < FL2FXCONST_DBL(0.0f) ) {
252 result_m = f2Pow(op, LD_DATA_SHIFT);
253 }
254 else {
255 int result_e;
256
257 result_m = f2Pow(op, LD_DATA_SHIFT, &result_e);
258 result_e = fixMin(fixMax(result_e+1-(DFRACT_BITS-1), -(DFRACT_BITS-1)), (DFRACT_BITS-1)); /* rounding and saturation */
259
260 if ( (result_e>0) && ( result_m > (((FIXP_DBL)MAXVAL_DBL)>>result_e) ) ) {
261 result_m = (FIXP_DBL)MAXVAL_DBL; /* saturate to max representable value */
262 }
263 else {
264 result_m = (scaleValue(result_m, result_e)+(FIXP_DBL)1)>>1; /* descale result + rounding */
265 }
266 }
267 return result_m;
244 /* This table is used for lookup 2^x with */
245 /* x in range [0...1.0[ in steps of 1/32 */
246 LNK_SECTION_DATA_L1 static const UINT exp2_tab_long[32]={
247 0x40000000,0x4166C34C,0x42D561B4,0x444C0740,
248 0x45CAE0F2,0x47521CC6,0x48E1E9BA,0x4A7A77D4,
249 0x4C1BF829,0x4DC69CDD,0x4F7A9930,0x51382182,
250 0x52FF6B55,0x54D0AD5A,0x56AC1F75,0x5891FAC1,
251 0x5A82799A,0x5C7DD7A4,0x5E8451D0,0x60962665,
252 0x62B39509,0x64DCDEC3,0x6712460B,0x69540EC9,
253 0x6BA27E65,0x6DFDDBCC,0x70666F76,0x72DC8374,
254 0x75606374,0x77F25CCE,0x7A92BE8B,0x7D41D96E
255 // 0x80000000
256 };
257
258 /* This table is used for lookup 2^x with */
259 /* x in range [0...1/32[ in steps of 1/1024 */
260 LNK_SECTION_DATA_L1 static const UINT exp2w_tab_long[32]={
261 0x40000000,0x400B1818,0x4016321B,0x40214E0C,
262 0x402C6BE9,0x40378BB4,0x4042AD6D,0x404DD113,
263 0x4058F6A8,0x40641E2B,0x406F479E,0x407A7300,
264 0x4085A051,0x4090CF92,0x409C00C4,0x40A733E6,
265 0x40B268FA,0x40BD9FFF,0x40C8D8F5,0x40D413DD,
266 0x40DF50B8,0x40EA8F86,0x40F5D046,0x410112FA,
267 0x410C57A2,0x41179E3D,0x4122E6CD,0x412E3152,
268 0x41397DCC,0x4144CC3B,0x41501CA0,0x415B6EFB,
269 // 0x4166C34C,
270 };
271 /* This table is used for lookup 2^x with */
272 /* x in range [0...1/1024[ in steps of 1/32768 */
273 LNK_SECTION_DATA_L1 static const UINT exp2x_tab_long[32]={
274 0x40000000,0x400058B9,0x4000B173,0x40010A2D,
275 0x400162E8,0x4001BBA3,0x4002145F,0x40026D1B,
276 0x4002C5D8,0x40031E95,0x40037752,0x4003D011,
277 0x400428CF,0x4004818E,0x4004DA4E,0x4005330E,
278 0x40058BCE,0x4005E48F,0x40063D51,0x40069613,
279 0x4006EED5,0x40074798,0x4007A05B,0x4007F91F,
280 0x400851E4,0x4008AAA8,0x4009036E,0x40095C33,
281 0x4009B4FA,0x400A0DC0,0x400A6688,0x400ABF4F,
282 //0x400B1818
283 };
284
285 LNK_SECTION_CODE_L1 FIXP_DBL CalcInvLdData(FIXP_DBL x)
286 {
287 int set_zero = (x < FL2FXCONST_DBL(-31.0/64.0))? 0 : 1;
288 int set_max = (x >= FL2FXCONST_DBL( 31.0/64.0)) | (x == FL2FXCONST_DBL(0.0));
289
290 FIXP_SGL frac = (FIXP_SGL)(LONG)(x & 0x3FF);
291 UINT index3 = (UINT)(LONG)(x >> 10) & 0x1F;
292 UINT index2 = (UINT)(LONG)(x >> 15) & 0x1F;
293 UINT index1 = (UINT)(LONG)(x >> 20) & 0x1F;
294 int exp = (x > FL2FXCONST_DBL(0.0f)) ? (31 - (int)(x>>25)) : (int)(-(x>>25));
295
296 UINT lookup1 = exp2_tab_long[index1]*set_zero;
297 UINT lookup2 = exp2w_tab_long[index2];
298 UINT lookup3 = exp2x_tab_long[index3];
299 UINT lookup3f = lookup3 + (UINT)(LONG)fMultDiv2((FIXP_DBL)(0x0016302F),(FIXP_SGL)frac);
300
301 UINT lookup12 = (UINT)(LONG)fMult((FIXP_DBL)lookup1, (FIXP_DBL) lookup2);
302 UINT lookup = (UINT)(LONG)fMult((FIXP_DBL)lookup12, (FIXP_DBL) lookup3f);
303
304 FIXP_DBL retVal = (lookup<<3) >> exp;
305
306 if (set_max)
307 retVal=FL2FXCONST_DBL(1.0f);
308
309 return retVal;
268310 }
269311
270312
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
10161016 break;
10171017 case 32:
10181018 h_Qmf->p_filter = qmf_64;
1019 if (flags & QMF_FLAG_DOWNSAMPLED) {
1020 h_Qmf->t_cos = qmf_phaseshift_cos_downsamp32;
1021 h_Qmf->t_sin = qmf_phaseshift_sin_downsamp32;
1022 }
1023 else {
10191024 h_Qmf->t_cos = qmf_phaseshift_cos32;
10201025 h_Qmf->t_sin = qmf_phaseshift_sin32;
1026 }
10211027 h_Qmf->p_stride = 2;
10221028 h_Qmf->FilterSize = 640;
10231029 h_Qmf->filterScale = 0;
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
185185 void CProgramConfig_Read ( CProgramConfig *pPce,
186186 HANDLE_FDK_BITSTREAM bs,
187187 UINT alignAnchor );
188
189 /*!
190 \brief Compare two Program Config Elements.
191 \param pPce1 Pointer to first Program Config Element structure.
192 \param pPce2 Pointer to second Program Config Element structure.
193 \return -1 if PCEs are completely different,
194 0 if PCEs are completely equal,
195 1 if PCEs are different but have the same channel config,
196 2 if PCEs have different channel config but same number of channels.
197 */
198 int CProgramConfig_Compare ( const CProgramConfig * const pPce1,
199 const CProgramConfig * const pPce2 );
200
201 /*!
202 \brief Get a Program Config Element that matches the predefined MPEG-4 channel configurations 1-14.
203 \param pPce Program Config Element structure.
204 \param channelConfig MPEG-4 channel configuration.
205 \return void
206 */
207 void CProgramConfig_GetDefault ( CProgramConfig *pPce,
208 const UINT channelConfig );
188209 #endif /* TP_PCE_ENABLE */
189210
190211 /**
205226 */
206227 int CProgramConfig_LookupElement(
207228 CProgramConfig *pPce,
208 const UINT channelConfig,
229 UINT channelConfig,
209230 const UINT tag,
210231 const UINT channelIdx,
211232 UCHAR chMapping[],
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
373373 length = -1; /* raw data block length is unknown */
374374 } else {
375375 if (blockNum < 0 || blockNum > 3) {
376 return TRANSPORTDEC_INVALID_PARAMETER;
376 length = -1;
377377 }
378378 length = (pAdts->rawDataBlockDist[blockNum] << 3) - 16;
379379 }
380380 }
381 if (blockNum == 0) {
381 if (blockNum == 0 && length > 0) {
382382 length -= pAdts->bs.num_pce_bits;
383383 }
384384 return length;
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
203203 }
204204
205205 pPce->isValid = 1;
206 }
207
208 /*
209 * Compare two program configurations.
210 * Returns the result of the comparison:
211 * -1 - completely different
212 * 0 - completely equal
213 * 1 - different but same channel configuration
214 * 2 - different channel configuration but same number of channels
215 */
216 int CProgramConfig_Compare ( const CProgramConfig * const pPce1,
217 const CProgramConfig * const pPce2 )
218 {
219 int result = 0; /* Innocent until proven false. */
220
221 if (FDKmemcmp(pPce1, pPce2, sizeof(CProgramConfig)) != 0)
222 { /* Configurations are not completely different.
223 So look into details and analyse the channel configurations: */
224 result = -1;
225
226 if (pPce1->NumChannels == pPce2->NumChannels)
227 { /* Now the logic changes. We first assume to have the same channel configuration
228 and then prove if this assumption is true. */
229 result = 1;
230
231 /* Front channels */
232 if (pPce1->NumFrontChannelElements != pPce2->NumFrontChannelElements) {
233 result = 2; /* different number of front channel elements */
234 } else {
235 int el, numCh1 = 0, numCh2 = 0;
236 for (el = 0; el < pPce1->NumFrontChannelElements; el += 1) {
237 numCh1 += pPce1->FrontElementIsCpe[el] ? 2 : 1;
238 numCh2 += pPce2->FrontElementIsCpe[el] ? 2 : 1;
239 }
240 if (numCh1 != numCh2) {
241 result = 2; /* different number of front channels */
242 }
243 }
244 /* Side channels */
245 if (pPce1->NumSideChannelElements != pPce2->NumSideChannelElements) {
246 result = 2; /* different number of side channel elements */
247 } else {
248 int el, numCh1 = 0, numCh2 = 0;
249 for (el = 0; el < pPce1->NumSideChannelElements; el += 1) {
250 numCh1 += pPce1->SideElementIsCpe[el] ? 2 : 1;
251 numCh2 += pPce2->SideElementIsCpe[el] ? 2 : 1;
252 }
253 if (numCh1 != numCh2) {
254 result = 2; /* different number of side channels */
255 }
256 }
257 /* Back channels */
258 if (pPce1->NumBackChannelElements != pPce2->NumBackChannelElements) {
259 result = 2; /* different number of back channel elements */
260 } else {
261 int el, numCh1 = 0, numCh2 = 0;
262 for (el = 0; el < pPce1->NumBackChannelElements; el += 1) {
263 numCh1 += pPce1->BackElementIsCpe[el] ? 2 : 1;
264 numCh2 += pPce2->BackElementIsCpe[el] ? 2 : 1;
265 }
266 if (numCh1 != numCh2) {
267 result = 2; /* different number of back channels */
268 }
269 }
270 /* LFE channels */
271 if (pPce1->NumLfeChannelElements != pPce2->NumLfeChannelElements) {
272 result = 2; /* different number of lfe channels */
273 }
274 /* LFEs are always SCEs so we don't need to count the channels. */
275 }
276 }
277
278 return result;
279 }
280
281 void CProgramConfig_GetDefault( CProgramConfig *pPce,
282 const UINT channelConfig )
283 {
284 FDK_ASSERT(pPce != NULL);
285
286 /* Init PCE */
287 CProgramConfig_Init(pPce);
288 pPce->Profile = 1; /* Set AAC LC because it is the only supported object type. */
289
290 switch (channelConfig) {
291 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
292 case 6: /* 3/0/2.1ch */
293 pPce->NumLfeChannelElements += 1;
294 pPce->NumChannels += 1;
295 case 5: /* 3/0/2.0ch */
296 case 4: /* 3/0/1.0ch */
297 pPce->NumBackChannelElements += 1;
298 pPce->BackElementIsCpe[0] = (channelConfig>4) ? 1 : 0;
299 pPce->NumChannels += (channelConfig>4) ? 2 : 1;
300 pPce->NumEffectiveChannels += (channelConfig>4) ? 2 : 1;
301 case 3: /* 3/0/0.0ch */
302 pPce->NumFrontChannelElements += 1;
303 pPce->FrontElementIsCpe[1] = 1;
304 pPce->NumChannels += 2;
305 pPce->NumEffectiveChannels += 2;
306 case 1: /* 1/0/0.0ch */
307 pPce->NumFrontChannelElements += 1;
308 pPce->FrontElementIsCpe[0] = 0;
309 pPce->NumChannels += 1;
310 pPce->NumEffectiveChannels += 1;
311 pPce->isValid = 1;
312 break;
313 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
314 case 2: /* 2/0/0.ch */
315 pPce->NumFrontChannelElements = 1;
316 pPce->FrontElementIsCpe[0] = 1;
317 pPce->NumChannels += 2;
318 pPce->NumEffectiveChannels += 2;
319 pPce->isValid = 1;
320 break;
321 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
322 default:
323 pPce->isValid = 0; /* To be explicit! */
324 break;
325 }
326
327 if (pPce->isValid) {
328 /* Create valid element instance tags */
329 int el, elTagSce = 0, elTagCpe = 0;
330
331 for (el = 0; el < pPce->NumFrontChannelElements; el += 1) {
332 pPce->FrontElementTagSelect[el] = (pPce->FrontElementIsCpe) ? elTagCpe++ : elTagSce++;
333 }
334 for (el = 0; el < pPce->NumSideChannelElements; el += 1) {
335 pPce->SideElementTagSelect[el] = (pPce->SideElementIsCpe) ? elTagCpe++ : elTagSce++;
336 }
337 for (el = 0; el < pPce->NumBackChannelElements; el += 1) {
338 pPce->BackElementTagSelect[el] = (pPce->BackElementIsCpe) ? elTagCpe++ : elTagSce++;
339 }
340 elTagSce = 0;
341 for (el = 0; el < pPce->NumLfeChannelElements; el += 1) {
342 pPce->LfeElementTagSelect[el] = elTagSce++;
343 }
344 }
206345 }
207346 #endif /* TP_PCE_ENABLE */
208347
266405
267406 int CProgramConfig_LookupElement(
268407 CProgramConfig *pPce,
269 const UINT channelConfig,
408 UINT channelConfig,
270409 const UINT tag,
271410 const UINT channelIdx,
272411 UCHAR chMapping[],
288427 *elMapping = pPce->elCounter;
289428 if (elList[pPce->elCounter] != elType) {
290429 /* Not in the list */
291 return 0;
430 if ( (channelConfig == 2) && (elType == ID_SCE) )
431 { /* This scenario occurs with HE-AAC v2 streams of buggy encoders.
432 Due to other decoder implementations decoding of these kind of streams is desired. */
433 channelConfig = 1;
434 } else {
435 return 0;
436 }
292437 }
293438 /* Assume all front channels */
294439 getImplicitAudioChannelTypeAndIndex(&chType[channelIdx], &chIndex[channelIdx], channelConfig, channelIdx);
582727 }
583728
584729 switch ( channelConfiguration ) {
730 case 7:
731 error |= cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, asc->m_extensionSamplingFrequency, asc->m_samplesPerFrame, AOT_ER_AAC_ELD, ID_CPE, i++);
732 case 6:
585733 case 5:
586734 error |= cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, asc->m_extensionSamplingFrequency, asc->m_samplesPerFrame, AOT_ER_AAC_ELD, ID_CPE, i++);
587735 case 3:
588736 error |= cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, asc->m_extensionSamplingFrequency, asc->m_samplesPerFrame, AOT_ER_AAC_ELD, ID_CPE, i++);
589737 break;
590738
591 case 7:
592 error |= cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, asc->m_extensionSamplingFrequency, asc->m_samplesPerFrame, AOT_ER_AAC_ELD, ID_SCE, i++);
593 case 6:
594 error |= cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, asc->m_extensionSamplingFrequency, asc->m_samplesPerFrame, AOT_ER_AAC_ELD, ID_CPE, i++);
595739 case 4:
596740 error |= cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, asc->m_extensionSamplingFrequency, asc->m_samplesPerFrame, AOT_ER_AAC_ELD, ID_CPE, i++);
741 error |= cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, asc->m_extensionSamplingFrequency, asc->m_samplesPerFrame, AOT_ER_AAC_ELD, ID_SCE, i++);
597742 break;
598743 }
599744
688833 #endif /* TP_ELD_ENABLE */
689834
690835
836 static
837 TRANSPORTDEC_ERROR AudioSpecificConfig_ExtensionParse(CSAudioSpecificConfig *self, HANDLE_FDK_BITSTREAM bs, CSTpCallBacks *cb)
838 {
839 TP_ASC_EXTENSION_ID lastAscExt, ascExtId = ASCEXT_UNKOWN;
840 INT bitsAvailable = (INT)FDKgetValidBits(bs);
841
842 while (bitsAvailable >= 11)
843 {
844 lastAscExt = ascExtId;
845 ascExtId = (TP_ASC_EXTENSION_ID)FDKreadBits(bs, 11);
846 bitsAvailable -= 11;
847
848 switch (ascExtId) {
849 case ASCEXT_SBR: /* 0x2b7 */
850 if ( (self->m_extensionAudioObjectType != AOT_SBR) && (bitsAvailable >= 5) ) {
851 self->m_extensionAudioObjectType = getAOT(bs);
852
853 if ( (self->m_extensionAudioObjectType == AOT_SBR)
854 || (self->m_extensionAudioObjectType == AOT_ER_BSAC) )
855 { /* Get SBR extension configuration */
856 self->m_sbrPresentFlag = FDKreadBits(bs, 1);
857 bitsAvailable -= 1;
858
859 if ( self->m_sbrPresentFlag == 1 ) {
860 self->m_extensionSamplingFrequency = getSampleRate(bs, &self->m_extensionSamplingFrequencyIndex, 4);
861
862 if ((INT)self->m_extensionSamplingFrequency <= 0) {
863 return TRANSPORTDEC_PARSE_ERROR;
864 }
865 }
866 if ( self->m_extensionAudioObjectType == AOT_ER_BSAC ) {
867 self->m_extensionChannelConfiguration = FDKreadBits(bs, 4);
868 bitsAvailable -= 4;
869 }
870 }
871 /* Update counter because of variable length fields (AOT and sampling rate) */
872 bitsAvailable = (INT)FDKgetValidBits(bs);
873 }
874 break;
875 case ASCEXT_PS: /* 0x548 */
876 if ( (lastAscExt == ASCEXT_SBR)
877 && (self->m_extensionAudioObjectType == AOT_SBR)
878 && (bitsAvailable > 0) )
879 { /* Get PS extension configuration */
880 self->m_psPresentFlag = FDKreadBits(bs, 1);
881 bitsAvailable -= 1;
882 }
883 break;
884 default:
885 /* Just ignore anything. */
886 return TRANSPORTDEC_OK;
887 }
888 }
889
890 return TRANSPORTDEC_OK;
891 }
691892
692893 /*
693894 * API Functions
8381039 break;
8391040 }
8401041
1042 if (fExplicitBackwardCompatible) {
1043 ErrorStatus = AudioSpecificConfig_ExtensionParse(self, bs, cb);
1044 }
8411045
8421046 return (ErrorStatus);
8431047 }
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
119119 CLatmDemux *pLatmDemux,
120120 int m_muxConfigPresent,
121121 CSTpCallBacks *pTpDecCallbacks,
122 CSAudioSpecificConfig *pAsc
122 CSAudioSpecificConfig *pAsc,
123 int *pfConfigFound
123124 )
124125 {
125126 TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK;
128129 pLatmDemux->m_useSameStreamMux = FDKreadBits(bs,1);
129130
130131 if (!pLatmDemux->m_useSameStreamMux) {
131 if ((ErrorStatus = CLatmDemux_ReadStreamMuxConfig(bs, pLatmDemux, pTpDecCallbacks, pAsc))) {
132 if ((ErrorStatus = CLatmDemux_ReadStreamMuxConfig(bs, pLatmDemux, pTpDecCallbacks, pAsc, pfConfigFound))) {
132133 return (ErrorStatus);
133134 }
134135 }
136 }
137
138 /* If there was no configuration read, its not possible to parse PayloadLengthInfo below. */
139 if (! *pfConfigFound) {
140 return TRANSPORTDEC_SYNC_ERROR;
135141 }
136142
137143 if (pLatmDemux->m_AudioMuxVersionA == 0) {
153159 TRANSPORT_TYPE tt,
154160 CSTpCallBacks *pTpDecCallbacks,
155161 CSAudioSpecificConfig *pAsc,
162 int *pfConfigFound,
156163 const INT ignoreBufferFullness
157164 )
158165 {
167174 return TRANSPORTDEC_NOT_ENOUGH_BITS;
168175 }
169176
170 if ((ErrorStatus = CLatmDemux_ReadAudioMuxElement(bs, pLatmDemux, (tt != TT_MP4_LATM_MCP0), pTpDecCallbacks, pAsc)))
177 if ((ErrorStatus = CLatmDemux_ReadAudioMuxElement(bs, pLatmDemux, (tt != TT_MP4_LATM_MCP0), pTpDecCallbacks, pAsc, pfConfigFound)))
171178 return (ErrorStatus);
172179
173180 if (!ignoreBufferFullness)
204211 HANDLE_FDK_BITSTREAM bs,
205212 CLatmDemux *pLatmDemux,
206213 CSTpCallBacks *pTpDecCallbacks,
207 CSAudioSpecificConfig *pAsc
214 CSAudioSpecificConfig *pAsc,
215 int * pfConfigFound
208216 )
209217 {
210218 LATM_LAYER_INFO *p_linfo = NULL;
271279 if ((ErrorStatus = AudioSpecificConfig_Parse(&pAsc[TPDEC_TRACKINDEX(prog,lay)], &tmpBs, 1, pTpDecCallbacks))) {
272280 return (ErrorStatus);
273281 }
282 *pfConfigFound = 1;
274283
275284 /* The field p_linfo->m_ascLen could be wrong, so check if */
276285 if ( 0 > (INT)FDKgetValidBits(&tmpBs)) {
291300 if (cbError != 0) {
292301 return TRANSPORTDEC_UNKOWN_ERROR;
293302 }
303 *pfConfigFound = 1;
294304 }
295305 }
296306
376386 else {
377387 ErrorStatus = TRANSPORTDEC_PARSE_ERROR; //AAC_DEC_LATM_TIMEFRAMING;
378388 }
379 if (pLatmDemux->m_audioMuxLengthBytes > 0 && totalPayloadBits > pLatmDemux->m_audioMuxLengthBytes*8) {
389 if (pLatmDemux->m_audioMuxLengthBytes > (UINT)0 && totalPayloadBits > (int)pLatmDemux->m_audioMuxLengthBytes*8) {
380390 return TRANSPORTDEC_PARSE_ERROR;
381391 }
382392 return (ErrorStatus);
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
143143 TRANSPORT_TYPE tt,
144144 CSTpCallBacks *pTpDecCallbacks,
145145 CSAudioSpecificConfig *pAsc,
146 int *pfConfigFound,
146147 const INT ignoreBufferFullness
147148 );
148149
150 /**
151 * \brief Read StreamMuxConfig
152 * \param bs bit stream handle as data source
153 * \param pLatmDemux pointer to CLatmDemux struct of current LATM context
154 * \param pTpDecCallbacks Call back structure for configuration callbacks
155 * \param pAsc pointer to a ASC for configuration storage
156 * \param pfConfigFound pointer to a flag which is set to 1 if a configuration was found and processed successfully
157 * \return error code
158 */
149159 TRANSPORTDEC_ERROR CLatmDemux_ReadStreamMuxConfig(
150160 HANDLE_FDK_BITSTREAM bs,
151161 CLatmDemux *pLatmDemux,
152162 CSTpCallBacks *pTpDecCallbacks,
153 CSAudioSpecificConfig *pAsc
163 CSAudioSpecificConfig *pAsc,
164 int * pfConfigFound
154165 );
155166
156167 TRANSPORTDEC_ERROR CLatmDemux_ReadPayloadLengthInfo(HANDLE_FDK_BITSTREAM bs, CLatmDemux *pLatmDemux);
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
196196
197197 if (hInput != NULL) {
198198 /* Create bitstream */
199 if ( (transportFmt == TT_MP4_RAW)
200 || (transportFmt == TT_DRM) ){
199 if ( TT_IS_PACKET(transportFmt) ) {
201200 hInput->bsBuffer = NULL;
202201 } else {
203202 hInput->bsBuffer = GetRam_TransportDecoderBuffer(0);
221220 FDK_BITSTREAM bs;
222221 HANDLE_FDK_BITSTREAM hBs = &bs;
223222
224 FDKinitBitStream(hBs, conf, 0x80000000, length<<3, BS_READER);
223 FDKinitBitStream(hBs, conf, 0x10000000, length<<3, BS_READER);
224
225 int fConfigFound = 0;
225226
226227 /* config transport decoder */
227228 switch (hTp->transportFmt) {
233234 return TRANSPORTDEC_INVALID_PARAMETER;
234235 }
235236 CLatmDemux *pLatmDemux = &hTp->parser.latm;
236 err = CLatmDemux_ReadStreamMuxConfig(hBs, pLatmDemux, &hTp->callbacks, hTp->asc);
237 err = CLatmDemux_ReadStreamMuxConfig(hBs, pLatmDemux, &hTp->callbacks, hTp->asc, &fConfigFound);
237238 if (err != TRANSPORTDEC_OK) {
238239 return err;
239240 }
240241 }
241242 break;
242243 default:
243 case TT_MP4_RAW:
244 fConfigFound = 1;
244245 err = AudioSpecificConfig_Parse(&hTp->asc[layer], hBs, 1, &hTp->callbacks);
245 break;
246 }
247 if (err == TRANSPORTDEC_OK) {
248 int errC;
249
250 errC = hTp->callbacks.cbUpdateConfig(hTp->callbacks.cbUpdateConfigData, &hTp->asc[layer]);
251 if (errC != 0) {
252 err = TRANSPORTDEC_PARSE_ERROR;
253 }
254 }
255
256 if (err == TRANSPORTDEC_OK) {
246 if (err == TRANSPORTDEC_OK) {
247 int errC;
248
249 errC = hTp->callbacks.cbUpdateConfig(hTp->callbacks.cbUpdateConfigData, &hTp->asc[layer]);
250 if (errC != 0) {
251 err = TRANSPORTDEC_PARSE_ERROR;
252 }
253 }
254 break;
255 }
256
257 if (err == TRANSPORTDEC_OK && fConfigFound) {
257258 hTp->flags |= TPDEC_CONFIG_FOUND;
258259 }
259260
312313 /* set bitbuffer shortcut */
313314 hBs = &hTp->bitStream[layer];
314315
315 switch (hTp->transportFmt) {
316 case TT_MP4_RAW:
317 case TT_DRM:
316 if ( TT_IS_PACKET(hTp->transportFmt) ) {
317 if (hTp->numberOfRawDataBlocks == 0) {
318318 /* For packet based transport, pass input buffer to bitbuffer without copying the data.
319319 Unfortunately we do not know the actual buffer size. And the FDK bit buffer implementation
320320 needs a number 2^x. So we assume the maximum of 48 channels with 6144 bits per channel
321321 and round it up to the next power of 2 => 65536 bytes */
322322 FDKinitBitStream(hBs, pBuffer, 0x10000, (*pBytesValid)<<3, BS_READER);
323323 *pBytesValid = 0;
324 break;
325
326 default:
324 }
325 } else {
327326 /* ... else feed bitbuffer with new stream data (append). */
328327 if (hTp->numberOfRawDataBlocks <= 0) {
329328 FDKfeedBuffer (hBs, pBuffer, bufferSize, pBytesValid) ;
366365
367366 return bufferFullness;
368367 }
368
369 /**
370 * \brief adjust bit stream position and the end of an access unit.
371 * \param hTp transport decoder handle.
372 * \return error code.
373 */
374 static
375 TRANSPORTDEC_ERROR transportDec_AdjustEndOfAccessUnit(HANDLE_TRANSPORTDEC hTp)
376 {
377 HANDLE_FDK_BITSTREAM hBs = &hTp->bitStream[0];
378 TRANSPORTDEC_ERROR err = TRANSPORTDEC_OK;
379
380 switch (hTp->transportFmt) {
381 case TT_MP4_LOAS:
382 case TT_MP4_LATM_MCP0:
383 case TT_MP4_LATM_MCP1:
384 if ( hTp->numberOfRawDataBlocks == 0 )
385 {
386 /* Do byte align at the end of AudioMuxElement. */
387 FDKbyteAlign(hBs, hTp->globalFramePos);
388
389 /* Check global frame length */
390 if (hTp->transportFmt == TT_MP4_LOAS && hTp->parser.latm.m_audioMuxLengthBytes > 0)
391 {
392 int loasOffset;
393
394 loasOffset = (hTp->parser.latm.m_audioMuxLengthBytes*8 + FDKgetValidBits(hBs)) - hTp->globalFramePos;
395 if (loasOffset != 0) {
396 FDKpushBiDirectional(hBs, loasOffset);
397 /* For ELD and other payloads there is an unknown amount of padding, so ignore unread bits, but
398 throw an error only if too many bits where read. */
399 if (loasOffset < 0) {
400 err = TRANSPORTDEC_PARSE_ERROR;
401 }
402 }
403 }
404 }
405 break;
406
407 case TT_MP4_ADTS:
408 if (hTp->parser.adts.bs.protection_absent == 0)
409 {
410 int offset;
411
412 /* Calculate offset to end of AU */
413 offset = hTp->parser.adts.rawDataBlockDist[hTp->parser.adts.bs.num_raw_blocks-hTp->numberOfRawDataBlocks]<<3;
414 /* CAUTION: The PCE (if available) is declared to be a part of the header! */
415 offset -= hTp->accessUnitAnchor[0] - FDKgetValidBits(hBs) + 16 + hTp->parser.adts.bs.num_pce_bits;
416 FDKpushBiDirectional(hBs, offset);
417 }
418 if (hTp->parser.adts.bs.num_raw_blocks > 0 && hTp->parser.adts.bs.protection_absent == 0) {
419 /* Note this CRC read currently happens twice because of transportDec_CrcCheck() */
420 hTp->parser.adts.crcReadValue = FDKreadBits(hBs, 16);
421 }
422 if ( hTp->numberOfRawDataBlocks == 0 )
423 {
424 /* Check global frame length */
425 if (hTp->parser.adts.bs.protection_absent == 0)
426 {
427 int offset;
428
429 offset = (hTp->parser.adts.bs.frame_length*8 - ADTS_SYNCLENGTH + FDKgetValidBits(hBs)) - hTp->globalFramePos;
430 if (offset != 0) {
431 FDKpushBiDirectional(hBs, offset);
432 }
433 }
434 }
435 break;
436
437 default:
438 break;
439 }
440
441 return err;
442 }
443
369444
370445 /**
371446 * \brief Determine additional buffer fullness contraint due to burst data reception.
431506 }
432507 }
433508
434 /**
435 * \brief adjust bit stream position and the end of an access unit.
436 * \param hTp transport decoder handle.
437 * \return error code.
438 */
439 static
440 TRANSPORTDEC_ERROR transportDec_AdjustEndOfAccessUnit(HANDLE_TRANSPORTDEC hTp)
441 {
442 HANDLE_FDK_BITSTREAM hBs = &hTp->bitStream[0];
509 static TRANSPORTDEC_ERROR transportDec_readHeader(
510 HANDLE_TRANSPORTDEC hTp,
511 HANDLE_FDK_BITSTREAM hBs,
512 int syncLength,
513 int ignoreBufferFullness,
514 int *pRawDataBlockLength,
515 int *pfTraverseMoreFrames,
516 int *pSyncLayerFrameBits,
517 int *pfConfigFound,
518 int *pHeaderBits
519 )
520 {
443521 TRANSPORTDEC_ERROR err = TRANSPORTDEC_OK;
522 int rawDataBlockLength = *pRawDataBlockLength;
523 int fTraverseMoreFrames = (pfTraverseMoreFrames != NULL) ? *pfTraverseMoreFrames : 0;
524 int syncLayerFrameBits = (pSyncLayerFrameBits != NULL) ? *pSyncLayerFrameBits : 0;
525 int fConfigFound = (pfConfigFound != NULL) ? *pfConfigFound : 0;
526 int startPos;
527
528 startPos = FDKgetValidBits(hBs);
444529
445530 switch (hTp->transportFmt) {
531 case TT_MP4_ADTS:
532 if (hTp->numberOfRawDataBlocks <= 0)
533 {
534 int errC;
535
536 hTp->globalFramePos = FDKgetValidBits(hBs);
537
538 /* Parse ADTS header */
539 err = adtsRead_DecodeHeader( &hTp->parser.adts, &hTp->asc[0], hBs, ignoreBufferFullness );
540 if (err != TRANSPORTDEC_OK) {
541 if (err != TRANSPORTDEC_NOT_ENOUGH_BITS) {
542 err = TRANSPORTDEC_SYNC_ERROR;
543 }
544 } else {
545 errC = hTp->callbacks.cbUpdateConfig(hTp->callbacks.cbUpdateConfigData, &hTp->asc[0]);
546 if (errC != 0) {
547 if (errC == TRANSPORTDEC_NEED_TO_RESTART) {
548 err = TRANSPORTDEC_NEED_TO_RESTART;
549 goto bail;
550 } else {
551 err = TRANSPORTDEC_SYNC_ERROR;
552 }
553 } else {
554 fConfigFound = 1;
555 hTp->numberOfRawDataBlocks = hTp->parser.adts.bs.num_raw_blocks+1;
556 }
557 }
558 }
559 else {
560 /* Reset CRC because the next bits are the beginning of a raw_data_block() */
561 FDKcrcReset(&hTp->parser.adts.crcInfo);
562 hTp->parser.adts.bs.num_pce_bits = 0;
563 }
564 if (err == TRANSPORTDEC_OK) {
565 hTp->numberOfRawDataBlocks--;
566 rawDataBlockLength = adtsRead_GetRawDataBlockLength(&hTp->parser.adts, (hTp->parser.adts.bs.num_raw_blocks-hTp->numberOfRawDataBlocks));
567 if (rawDataBlockLength <= 0) {
568 /* No further frame traversal possible. */
569 fTraverseMoreFrames = 0;
570 }
571 syncLayerFrameBits = (hTp->parser.adts.bs.frame_length<<3) - (startPos - FDKgetValidBits(hBs)) - syncLength;
572 if (syncLayerFrameBits <= 0) {
573 err = TRANSPORTDEC_SYNC_ERROR;
574 }
575 } else {
576 hTp->numberOfRawDataBlocks = 0;
577 }
578 break;
446579 case TT_MP4_LOAS:
580 if (hTp->numberOfRawDataBlocks <= 0)
581 {
582 syncLayerFrameBits = FDKreadBits(hBs, 13);
583 hTp->parser.latm.m_audioMuxLengthBytes = syncLayerFrameBits;
584 syncLayerFrameBits <<= 3;
585 }
586 case TT_MP4_LATM_MCP1:
447587 case TT_MP4_LATM_MCP0:
448 case TT_MP4_LATM_MCP1:
449 if ( hTp->numberOfRawDataBlocks == 0 )
588 if (hTp->numberOfRawDataBlocks <= 0)
450589 {
451 /* Check global frame length */
452 if (hTp->transportFmt == TT_MP4_LOAS && hTp->parser.latm.m_audioMuxLengthBytes > 0)
453 {
454 int loasOffset;
455
456 loasOffset = (hTp->parser.latm.m_audioMuxLengthBytes*8 + FDKgetValidBits(hBs)) - hTp->globalFramePos;
457 if (loasOffset != 0) {
458 FDKpushBiDirectional(hBs, loasOffset);
459 /* For ELD and other payloads there is an unknown amount of padding, so ignore unread bits, but
460 throw an error only if too many bits where read. */
461 if (loasOffset < 0) {
462 err = TRANSPORTDEC_PARSE_ERROR;
463 }
590 hTp->globalFramePos = FDKgetValidBits(hBs);
591
592 err = CLatmDemux_Read(
593 hBs,
594 &hTp->parser.latm,
595 hTp->transportFmt,
596 &hTp->callbacks,
597 hTp->asc,
598 &fConfigFound,
599 ignoreBufferFullness);
600
601 if (err != TRANSPORTDEC_OK) {
602 if (err != TRANSPORTDEC_NOT_ENOUGH_BITS) {
603 err = TRANSPORTDEC_SYNC_ERROR;
464604 }
465 }
466
467 /* Do global LOAS/LATM audioMuxElement byte alignment */
468 FDKbyteAlign(hBs, hTp->globalFramePos);
605 } else {
606 hTp->numberOfRawDataBlocks = CLatmDemux_GetNrOfSubFrames(&hTp->parser.latm);
607 if (hTp->transportFmt == TT_MP4_LOAS) {
608 syncLayerFrameBits -= startPos - FDKgetValidBits(hBs) - (13);
609 }
610 }
611 } else {
612 err = CLatmDemux_ReadPayloadLengthInfo(hBs, &hTp->parser.latm);
613 if (err != TRANSPORTDEC_OK) {
614 err = TRANSPORTDEC_SYNC_ERROR;
615 }
616 }
617 if (err == TRANSPORTDEC_OK) {
618 rawDataBlockLength = CLatmDemux_GetFrameLengthInBits(&hTp->parser.latm);
619 hTp->numberOfRawDataBlocks--;
620 } else {
621 hTp->numberOfRawDataBlocks = 0;
469622 }
470623 break;
471624 default:
472 break;
625 {
626 syncLayerFrameBits = 0;
627 }
628 break;
629 }
630
631 bail:
632
633 *pRawDataBlockLength = rawDataBlockLength;
634
635 if (pHeaderBits != NULL) {
636 *pHeaderBits += startPos - (INT)FDKgetValidBits(hBs);
637 }
638 if (pfConfigFound != NULL) {
639 *pfConfigFound = fConfigFound;
640 }
641
642 if (pfTraverseMoreFrames != NULL) {
643 *pfTraverseMoreFrames = fTraverseMoreFrames;
644 }
645 if (pSyncLayerFrameBits != NULL) {
646 *pSyncLayerFrameBits = syncLayerFrameBits;
647 }
648 if (pfConfigFound != NULL) {
649 *pfConfigFound = fConfigFound;
473650 }
474651
475652 return err;
476653 }
477
478654
479655 /* How many bits to advance for synchronization search. */
480656 #define TPDEC_SYNCSKIP 8
492668 INT rawDataBlockLength = 0, rawDataBlockLengthPrevious;
493669 INT totalBits;
494670 INT headerBits = 0, headerBitsFirstFrame = 0, headerBitsPrevious;
495 INT numFramesTraversed = 0, fTraverseMoreFrames, fConfigFound = 0, startPos, startPosFirstFrame = -1;
671 INT numFramesTraversed = 0, fTraverseMoreFrames, fConfigFound = (hTp->flags & TPDEC_CONFIG_FOUND), startPosFirstFrame = -1;
496672 INT numRawDataBlocksFirstFrame = 0, numRawDataBlocksPrevious, globalFramePosFirstFrame = 0, rawDataBlockLengthFirstFrame = 0;
497 INT ignoreBufferFullness = hTp->flags & (TPDEC_IGNORE_BUFFERFULLNESS|TPDEC_SYNCOK);
673 INT ignoreBufferFullness = hTp->flags & (TPDEC_LOST_FRAMES_PENDING|TPDEC_IGNORE_BUFFERFULLNESS|TPDEC_SYNCOK);
498674
499675 /* Synch parameters */
500676 INT syncLength; /* Length of sync word in bits */
505681 totalBits = (INT)FDKgetValidBits(hBs);
506682
507683 if (totalBits <= 0) {
508 /* Return sync error, because this happens only in case of severly damaged bit streams.
509 Returning TRANSPORTDEC_NOT_ENOUGH_BITS here is very dangerous. */
510 /* numberOfRawDataBlocks must be always reset in case of sync errors. */
511 hTp->numberOfRawDataBlocks = 0;
684 err = TRANSPORTDEC_NOT_ENOUGH_BITS;
512685 goto bail;
513686 }
514687
578751 numRawDataBlocksPrevious = hTp->numberOfRawDataBlocks;
579752
580753 /* Parse transport header (raw data block granularity) */
581 startPos = FDKgetValidBits(hBs);
582754
583755 if (err == TRANSPORTDEC_OK )
584756 {
585 switch (hTp->transportFmt) {
586 case TT_MP4_ADTS:
587 if (hTp->numberOfRawDataBlocks <= 0)
588 {
589 int errC;
590
591 /* Parse ADTS header */
592 err = adtsRead_DecodeHeader( &hTp->parser.adts, &hTp->asc[0], hBs, ignoreBufferFullness );
593 if (err != TRANSPORTDEC_OK) {
594 if (err != TRANSPORTDEC_NOT_ENOUGH_BITS) {
595 err = TRANSPORTDEC_SYNC_ERROR;
596 }
597 } else {
598 errC = hTp->callbacks.cbUpdateConfig(hTp->callbacks.cbUpdateConfigData, &hTp->asc[0]);
599 if (errC != 0) {
600 err = TRANSPORTDEC_SYNC_ERROR;
601 } else {
602 hTp->numberOfRawDataBlocks = hTp->parser.adts.bs.num_raw_blocks+1;
603 /* CAUTION: The PCE (if available) is declared to be a part of the header! */
604 hTp->globalFramePos = FDKgetValidBits(hBs) + hTp->parser.adts.bs.num_pce_bits;
605 }
606 }
607 }
608 else {
609 /* Reset CRC because the next bits are the beginning of a raw_data_block() */
610 FDKcrcReset(&hTp->parser.adts.crcInfo);
611 hTp->globalFramePos = FDKgetValidBits(hBs);
612 }
613 if (err == TRANSPORTDEC_OK) {
614 hTp->numberOfRawDataBlocks--;
615 rawDataBlockLength = adtsRead_GetRawDataBlockLength(&hTp->parser.adts, (hTp->parser.adts.bs.num_raw_blocks-hTp->numberOfRawDataBlocks));
616 syncLayerFrameBits = (hTp->parser.adts.bs.frame_length<<3) - (startPos - FDKgetValidBits(hBs)) - syncLength;
617 if (syncLayerFrameBits <= 0) {
618 err = TRANSPORTDEC_SYNC_ERROR;
619 }
620 } else {
621 hTp->numberOfRawDataBlocks = 0;
622 }
623 break;
624 case TT_MP4_LOAS:
625 if (hTp->numberOfRawDataBlocks <= 0)
626 {
627 syncLayerFrameBits = FDKreadBits(hBs, 13);
628 hTp->parser.latm.m_audioMuxLengthBytes = syncLayerFrameBits;
629 syncLayerFrameBits <<= 3;
630 }
631 case TT_MP4_LATM_MCP1:
632 case TT_MP4_LATM_MCP0:
633 if (hTp->numberOfRawDataBlocks <= 0)
634 {
635 hTp->globalFramePos = FDKgetValidBits(hBs);
636
637 err = CLatmDemux_Read(
638 hBs,
639 &hTp->parser.latm,
640 hTp->transportFmt,
641 &hTp->callbacks,
642 hTp->asc,
643 ignoreBufferFullness);
644
645 if (err != TRANSPORTDEC_OK) {
646 if (err != TRANSPORTDEC_NOT_ENOUGH_BITS) {
647 err = TRANSPORTDEC_SYNC_ERROR;
648 }
649 } else {
650 hTp->numberOfRawDataBlocks = CLatmDemux_GetNrOfSubFrames(&hTp->parser.latm);
651 syncLayerFrameBits -= startPos - FDKgetValidBits(hBs) - (13);
652 }
653 } else {
654 err = CLatmDemux_ReadPayloadLengthInfo(hBs, &hTp->parser.latm);
655 if (err != TRANSPORTDEC_OK) {
656 err = TRANSPORTDEC_SYNC_ERROR;
657 }
658 }
659 if (err == TRANSPORTDEC_OK) {
660 rawDataBlockLength = CLatmDemux_GetFrameLengthInBits(&hTp->parser.latm);
661 hTp->numberOfRawDataBlocks--;
662 } else {
663 hTp->numberOfRawDataBlocks = 0;
664 }
665 break;
666 default:
667 {
668 syncLayerFrameBits = 0;
669 }
670 break;
671 }
757 err = transportDec_readHeader(
758 hTp,
759 hBs,
760 syncLength,
761 ignoreBufferFullness,
762 &rawDataBlockLength,
763 &fTraverseMoreFrames,
764 &syncLayerFrameBits,
765 &fConfigFound,
766 &headerBits
767 );
672768 }
673769
674 headerBits += startPos - (INT)FDKgetValidBits(hBs);
675770 bitsAvail -= headerBits;
676771
677772 checkLengthBits = syncLayerFrameBits;
701796 /* Enforce re-sync of transport headers. */
702797 hTp->numberOfRawDataBlocks = 0;
703798
704 /* Ensure that the bit amount lands and a multiple of TPDEC_SYNCSKIP */
799 /* Ensure that the bit amount lands at a multiple of TPDEC_SYNCSKIP */
705800 bits = (bitsAvail + headerBits) % TPDEC_SYNCSKIP;
706801 /* Rewind - TPDEC_SYNCSKIP, in order to look for a synch one bit ahead next time. */
707802 FDKpushBiDirectional(hBs, -(headerBits - TPDEC_SYNCSKIP) + bits);
708803 bitsAvail += headerBits - TPDEC_SYNCSKIP - bits;
709 headerBits = 0;
804 headerBits = 0;
710805 }
711806
712807 /* Frame traversal */
730825 }
731826
732827 /* Break when config was found or it is not possible anymore to find a config */
733 if (startPosFirstFrame != -1 && (fConfigFound || err != TRANSPORTDEC_OK)) {
828 if (startPosFirstFrame != -1 && (fConfigFound || err != TRANSPORTDEC_OK))
829 {
830 /* In case of ECD and sync error, do not rewind anywhere. */
831 if (err == TRANSPORTDEC_SYNC_ERROR)
832 {
833 startPosFirstFrame = -1;
834 fConfigFound = 0;
835 numFramesTraversed = 0;
836 }
734837 break;
735838 }
736839 }
758861 }
759862
760863 /* Additional burst data mode buffer fullness check. */
761 if ( !(hTp->flags & (TPDEC_IGNORE_BUFFERFULLNESS|TPDEC_SYNCOK)) && err == TRANSPORTDEC_OK) {
864 if ( !(hTp->flags & (TPDEC_LOST_FRAMES_PENDING|TPDEC_IGNORE_BUFFERFULLNESS|TPDEC_SYNCOK)) && err == TRANSPORTDEC_OK) {
762865 err = additionalHoldOffNeeded(hTp, transportDec_GetBufferFullness(hTp), FDKgetValidBits(hBs) - syncLayerFrameBits);
763866 if (err == TRANSPORTDEC_NOT_ENOUGH_BITS) {
764867 hTp->holdOffFrames++;
788891 bail:
789892 hTp->auLength[0] = rawDataBlockLength;
790893
894 /* Detect pointless TRANSPORTDEC_NOT_ENOUGH_BITS error case, were the bit buffer is already full,
895 or no new burst packet fits. Recover by advancing the bit buffer. */
896 if ( (TRANSPORTDEC_NOT_ENOUGH_BITS == err) && (FDKgetValidBits(hBs) >= ((TRANSPORTDEC_INBUF_SIZE*8 - ((hTp->avgBitRate*hTp->burstPeriod)/1000)) - 7)) )
897 {
898 FDKpushFor(hBs, TPDEC_SYNCSKIP);
899 err = TRANSPORTDEC_SYNC_ERROR;
900 }
901
791902 if (err == TRANSPORTDEC_OK) {
792903 hTp->flags |= TPDEC_SYNCOK;
904 }
905
906 if (fConfigFound) {
907 hTp->flags |= TPDEC_CONFIG_FOUND;
793908 }
794909
795910 if (pHeaderBits != NULL) {
9241039
9251040 hBs = &hTp->bitStream[layer];
9261041
1042 if ((INT)FDKgetValidBits(hBs) <= 0) {
1043 err = TRANSPORTDEC_NOT_ENOUGH_BITS;
1044 }
1045
9271046 switch (hTp->transportFmt) {
9281047
9291048 case TT_MP4_ADIF:
9631082 break;
9641083
9651084 case TT_MP4_RAW:
966 if ((INT)FDKgetValidBits(hBs) <= 0 && layer == 0) {
967 err = TRANSPORTDEC_NOT_ENOUGH_BITS;
968 }
9691085 /* One Access Unit was filled into buffer.
9701086 So get the length out of the buffer. */
9711087 hTp->auLength[layer] = FDKgetValidBits(hBs);
9721088 hTp->flags |= TPDEC_SYNCOK;
9731089 break;
9741090
1091 case TT_MP4_LATM_MCP0:
1092 case TT_MP4_LATM_MCP1:
1093 {
1094 int fConfigFound = hTp->flags & TPDEC_CONFIG_FOUND;
1095 err = transportDec_readHeader(hTp, hBs, 0, 1, &hTp->auLength[layer], NULL, NULL, &fConfigFound, NULL);
1096 if (fConfigFound) {
1097 hTp->flags |= TPDEC_CONFIG_FOUND;
1098 }
1099 }
1100 break;
1101
9751102 case TT_RSVD50:
9761103 case TT_MP4_ADTS:
9771104 case TT_MP4_LOAS:
978 case TT_MP4_LATM_MCP0:
979 case TT_MP4_LATM_MCP1:
9801105 err = transportDec_readStream(hTp, layer);
9811106 break;
9821107
10251150 {
10261151 TRANSPORTDEC_ERROR err = TRANSPORTDEC_OK;
10271152
1153
10281154 err = transportDec_AdjustEndOfAccessUnit(hTp);
10291155
10301156 switch (hTp->transportFmt) {
1031 case TT_MP4_LOAS:
1032 case TT_MP4_LATM_MCP0:
1033 case TT_MP4_LATM_MCP1:
1034 break;
10351157 default:
10361158 break;
10371159 }
10811203 FDKresetBitbuffer(&hTp->bitStream[i]);
10821204 hTp->auLength[i] = 0;
10831205 hTp->accessUnitAnchor[i] = 0;
1084 }
1206 }
10851207 hTp->flags &= ~(TPDEC_SYNCOK|TPDEC_LOST_FRAMES_PENDING);
1208 if (hTp->transportFmt != TT_MP4_ADIF) {
1209 hTp->flags &= ~TPDEC_CONFIG_FOUND;
1210 }
10861211 hTp->remainder = 0;
10871212 hTp->avgBitRate = 0;
10881213 hTp->missingAccessUnits = 0;
11161241 if (phTp != NULL)
11171242 {
11181243 if (*phTp != NULL) {
1119 if ((*phTp)->transportFmt != TT_MP4_RAW && (*phTp)->transportFmt != TT_DRM) {
1244 if ( ! TT_IS_PACKET((*phTp)->transportFmt) ) {
11201245 FreeRam_TransportDecoderBuffer(&(*phTp)->bsBuffer);
11211246 }
11221247 if (*phTp != NULL) {
11871312 if ( (pTp->parser.adts.bs.num_raw_blocks > 0) && (pTp->parser.adts.bs.protection_absent == 0) )
11881313 {
11891314 HANDLE_FDK_BITSTREAM hBs = &pTp->bitStream[0];
1190 int bitDiff;
11911315
1192 /* Calculate possible offset to CRC value. */
1193 bitDiff = pTp->parser.adts.rawDataBlockDist[pTp->parser.adts.bs.num_raw_blocks-pTp->numberOfRawDataBlocks]<<3;
1194 bitDiff -= pTp->globalFramePos - FDKgetValidBits(hBs) + 16;
1195 FDKpushBiDirectional(hBs, bitDiff);
1196 pTp->parser.adts.crcReadValue = FDKreadBits(hBs, 16);
1316 transportDec_AdjustEndOfAccessUnit(pTp);
11971317 }
11981318 return adtsRead_CrcCheck(&pTp->parser.adts);
11991319 default:
00
11 /* library info */
22 #define TP_LIB_VL0 2
3 #define TP_LIB_VL1 2
4 #define TP_LIB_VL2 1
3 #define TP_LIB_VL1 3
4 #define TP_LIB_VL2 3
55 #define TP_LIB_TITLE "MPEG Transport"
66 #define TP_LIB_BUILD_DATE __DATE__
77 #define TP_LIB_BUILD_TIME __TIME__
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
126126 *
127127 * The number of channel element parameter describes the kind of consecutively elements.
128128 * E.g. MODE_1_2_2_2_1 means:
129 * - First 2 elements (SCE,CPE) are front channel elements.
130 * - Following element (CPE) is a side channel element.
129 * - First 3 elements (SCE,CPE,CPE) are front channel elements.
131130 * - Next element (CPE) is a back channel element.
132131 * - Last element (LFE) is a lfe channel element.
133132 */
139138 { MODE_1_2_1, { 2, 0, 1, 0, { ID_SCE, ID_CPE, ID_SCE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE } } },
140139 { MODE_1_2_2, { 2, 0, 1, 0, { ID_SCE, ID_CPE, ID_CPE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE } } },
141140 { MODE_1_2_2_1, { 2, 0, 1, 1, { ID_SCE, ID_CPE, ID_CPE, ID_LFE, ID_NONE, ID_NONE, ID_NONE, ID_NONE } } },
142 { MODE_1_2_2_2_1, { 2, 1, 1, 1, { ID_SCE, ID_CPE, ID_CPE, ID_CPE, ID_LFE, ID_NONE, ID_NONE, ID_NONE } } },
141 { MODE_1_2_2_2_1, { 3, 0, 1, 1, { ID_SCE, ID_CPE, ID_CPE, ID_CPE, ID_LFE, ID_NONE, ID_NONE, ID_NONE } } },
142
143143
144144 { MODE_1_1, { 2, 0, 0, 0, { ID_SCE, ID_SCE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE } } },
145145 { MODE_1_1_1_1, { 2, 2, 0, 0, { ID_SCE, ID_SCE, ID_SCE, ID_SCE, ID_NONE, ID_NONE, ID_NONE, ID_NONE } } },
150150 { MODE_2_2_2, { 1, 1, 1, 0, { ID_CPE, ID_CPE, ID_CPE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE } } },
151151 { MODE_2_2_2_2, { 4, 0, 0, 0, { ID_CPE, ID_CPE, ID_CPE, ID_CPE, ID_NONE, ID_NONE, ID_NONE, ID_NONE } } },
152152
153 { MODE_2_1, { 1, 0, 1, 0, { ID_CPE, ID_SCE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE } } }
153 { MODE_2_1, { 1, 0, 1, 0, { ID_CPE, ID_SCE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE } } },
154
155 { MODE_7_1_REAR_SURROUND, { 2, 0, 2, 1, { ID_SCE, ID_CPE, ID_CPE, ID_CPE, ID_LFE, ID_NONE, ID_NONE, ID_NONE } } },
156 { MODE_7_1_FRONT_CENTER, { 3, 0, 1, 1, { ID_SCE, ID_CPE, ID_CPE, ID_CPE, ID_LFE, ID_NONE, ID_NONE, ID_NONE } } },
157
154158 };
155159
156160
254258 if ( matrixMixdownA!=0 && ((channelMode==MODE_1_2_2)||(channelMode==MODE_1_2_2_1)) ) {
255259 FDKwriteBits(hBs, 1, 1); /* Matrix mixdown present */
256260 FDKwriteBits(hBs, (matrixMixdownA-1)&0x3, 2); /* matrix_mixdown_idx */
257 FDKwriteBits(hBs, pseudoSurroundEnable&0x1, 1); /* pseudo_surround_enable */
261 FDKwriteBits(hBs, (pseudoSurroundEnable)?1:0, 1); /* pseudo_surround_enable */
258262 }
259263 else {
260264 FDKwriteBits(hBs, 0, 1); /* Matrix mixdown not present */
378382
379383 /* Write PCE if channel config is not 1-7 */
380384 if (getChannelConfig(config->channelMode) == 0) {
381 transportEnc_writePCE(asc, config->channelMode, config->samplingRate, 0, 1, 0, 0, alignAnchor);
385 transportEnc_writePCE(asc, config->channelMode, config->samplingRate, 0, 1, config->matrixMixdownA, (config->flags&CC_PSEUDO_SURROUND)?1:0, alignAnchor);
382386 }
383387 if (extFlg) {
384388 if (aot == AOT_ER_BSAC) {
473477 break;
474478 }
475479
476 if (config->extAOT == AOT_SBR || config->extAOT == AOT_PS)
480 if (config->sbrSignaling==SIG_EXPLICIT_HIERARCHICAL && config->sbrPresent)
477481 writeAot(asc, config->extAOT);
478482 else
479483 writeAot(asc, config->aot);
491495
492496 FDKwriteBits( asc, getChannelConfig(config->channelMode), 4 );
493497
494 if (config->extAOT == AOT_SBR || config->extAOT == AOT_PS) {
498 if (config->sbrSignaling==SIG_EXPLICIT_HIERARCHICAL && config->sbrPresent) {
495499 writeSampleRate(asc, config->extSamplingRate);
496500 writeAot(asc, config->aot);
497501 }
544548 break;
545549 }
546550
551 /* backward compatible explicit signaling of extension AOT */
552 if (config->sbrSignaling==SIG_EXPLICIT_BW_COMPATIBLE)
553 {
554 TP_ASC_EXTENSION_ID ascExtId = ASCEXT_UNKOWN;
555
556 if (config->sbrPresent) {
557 ascExtId=ASCEXT_SBR;
558 FDKwriteBits( asc, ascExtId, 11 );
559 writeAot(asc, config->extAOT);
560 FDKwriteBits( asc, 1, 1 ); /* sbrPresentFlag=1 */
561 writeSampleRate(asc, config->extSamplingRate);
562 if (config->psPresent) {
563 ascExtId=ASCEXT_PS;
564 FDKwriteBits( asc, ascExtId, 11 );
565 FDKwriteBits( asc, 1, 1 ); /* psPresentFlag=1 */
566 }
567 }
568
569 }
570
547571 /* Make sure all bits are sync'ed */
548572 FDKsyncCache( asc );
549573
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
149149
150150 TRANSPORTENC_ERROR transportEnc_Open( HANDLE_TRANSPORTENC *phTpEnc )
151151 {
152 HANDLE_TRANSPORTENC hTpEnc = GetRam_TransportEncoder(0);
152 HANDLE_TRANSPORTENC hTpEnc;
153
154 if ( phTpEnc == NULL ){
155 return TRANSPORTENC_INVALID_PARAMETER;
156 }
157
158 hTpEnc = GetRam_TransportEncoder(0);
153159
154160 if ( hTpEnc == NULL ) {
155 return TRANSPORTENC_INVALID_PARAMETER;
161 return TRANSPORTENC_NO_MEM;
156162 }
157163
158164 *phTpEnc = hTpEnc;
416422 }
417423
418424 /* Write PCE as first raw_data_block element */
419 transportEnc_writePCE(&hTp->bitStream, hTp->config.channelMode, hTp->config.samplingRate, 0, 1, hTp->config.matrixMixdownA, hTp->config.flags & CC_PSEUDO_SURROUND, alignAnchor);
425 transportEnc_writePCE(&hTp->bitStream, hTp->config.channelMode, hTp->config.samplingRate, 0, 1, hTp->config.matrixMixdownA, (hTp->config.flags&CC_PSEUDO_SURROUND)?1:0, alignAnchor);
420426
421427 if ( (hTp->transportFmt==TT_MP4_ADTS) && !hTp->writer.adts.protection_absent) {
422428 adtsWrite_CrcEndReg(&hTp->writer.adts, &hTp->bitStream, crcIndex);
00
11 /* library info */
22 #define TP_LIB_VL0 2
3 #define TP_LIB_VL1 2
4 #define TP_LIB_VL2 1
3 #define TP_LIB_VL1 3
4 #define TP_LIB_VL2 3
55 #define TP_LIB_TITLE "MPEG Transport"
66 #define TP_LIB_BUILD_DATE __DATE__
77 #define TP_LIB_BUILD_TIME __TIME__
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
9595
9696 /* Decoder library info */
9797 #define PCMDMX_LIB_VL0 2
98 #define PCMDMX_LIB_VL1 3
99 #define PCMDMX_LIB_VL2 1
98 #define PCMDMX_LIB_VL1 4
99 #define PCMDMX_LIB_VL2 0
100100 #define PCMDMX_LIB_TITLE "PCM Downmix Lib"
101101 #define PCMDMX_LIB_BUILD_DATE __DATE__
102102 #define PCMDMX_LIB_BUILD_TIME __TIME__
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
623623
624624 deltaExp = FDK_getNumOctavesDiv8(newLen, refLen);
625625
626 /* Shift by -3 to rescale ld-table, 1-ampRes to enable coarser steps */
627 shift = (FRACT_BITS - 1 - ENV_EXP_FRACT + 1 - h_sbr_data->ampResolutionCurrentFrame - 3);
626 /* Shift by -3 to rescale ld-table, ampRes-1 to enable coarser steps */
627 shift = (FRACT_BITS - 1 - ENV_EXP_FRACT - 1 + h_sbr_data->ampResolutionCurrentFrame - 3);
628628 deltaExp = deltaExp >> shift;
629629 pFrameInfo->borders[0] = estimatedStartPos;
630630 pFrameInfo->bordersNoise[0] = estimatedStartPos;
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
874874 /*
875875 * Initialize the patching parameter
876876 */
877 desiredBorder = 21;
878 if (fs < 92017) {
879 desiredBorder = 23;
880 }
881 if (fs < 75132) {
882 desiredBorder = 32;
883 }
884 if (fs < 55426) {
885 desiredBorder = 43;
886 }
887 if (fs < 46009) {
888 desiredBorder = 46;
889 }
890 if (fs < 35777) {
891 desiredBorder = 64;
892 }
877 /* ISO/IEC 14496-3 (Figure 4.48): goalSb = round( 2.048e6 / fs ) */
878 desiredBorder = (((2048000*2) / fs) + 1) >> 1;
893879
894880 desiredBorder = findClosestEntry(desiredBorder, v_k_master, numMaster, 1); /* Adapt region to master-table */
895881
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
759759 */
760760 {
761761 int qmfErr;
762 /* Adapted QMF analysis post-twiddles for down-sampled HQ SBR */
763 const UINT downSampledFlag = (downsampleFac==2) ? QMF_FLAG_DOWNSAMPLED : 0;
762764
763765 qmfErr = qmfInitAnalysisFilterBank (
764766 &hs->AnalysiscQMF,
767769 hHeaderData->freqBandData.lowSubband,
768770 hHeaderData->freqBandData.highSubband,
769771 hHeaderData->numberOfAnalysisBands,
770 qmfFlags & (~QMF_FLAG_KEEP_STATES)
772 (qmfFlags & (~QMF_FLAG_KEEP_STATES)) | downSampledFlag
771773 );
772774 if (qmfErr != 0) {
773775 return SBRDEC_UNSUPPORTED_CONFIG;
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
109109 const UCHAR FDK_sbrDecoder_sbr_start_freq_40[16] = {12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 24, 26, 28, 30, 32};
110110 const UCHAR FDK_sbrDecoder_sbr_start_freq_44[16] = { 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 23, 25, 28, 32};
111111 const UCHAR FDK_sbrDecoder_sbr_start_freq_48[16] = { 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 24, 27, 31};
112 const UCHAR FDK_sbrDecoder_sbr_start_freq_64[16] = { 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 21, 23, 26, 30};
113 const UCHAR FDK_sbrDecoder_sbr_start_freq_88[16] = { 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 18, 20, 23, 27, 31};
112114 //@}
113115
114116
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
105105 extern const UCHAR FDK_sbrDecoder_sbr_start_freq_40[16];
106106 extern const UCHAR FDK_sbrDecoder_sbr_start_freq_44[16];
107107 extern const UCHAR FDK_sbrDecoder_sbr_start_freq_48[16];
108 extern const UCHAR FDK_sbrDecoder_sbr_start_freq_64[16];
109 extern const UCHAR FDK_sbrDecoder_sbr_start_freq_88[16];
108110
109111 /*
110112 Low-Power-Profile Transposer
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
126126 hDrcData->currFact_exp = 1;
127127 hDrcData->nextFact_exp = 1;
128128
129 hDrcData->numBandsCurr = 0;
130 hDrcData->numBandsNext = 0;
129 hDrcData->numBandsCurr = 1;
130 hDrcData->numBandsNext = 1;
131131
132132 hDrcData->winSequenceCurr = 0;
133133 hDrcData->winSequenceNext = 0;
489489 if (hDrcData == NULL) {
490490 return;
491491 }
492 if ( (hDrcData->enable == 0)
493 || ((hDrcData->numBandsCurr == 0) && (hDrcData->numBandsNext == 0))
494 ) {
492 if (hDrcData->enable == 0) {
495493 return; /* Avoid changing the scaleFactor even though the processing is disabled. */
496494 }
497495
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
123123 fsMapped = fs;
124124
125125 switch (fsMapped) {
126 case 96000:
127 case 88200:
128 band = FDK_sbrDecoder_sbr_start_freq_88[startFreq];
129 break;
130 case 64000:
131 band = FDK_sbrDecoder_sbr_start_freq_64[startFreq];
132 break;
126133 case 48000:
127134 band = FDK_sbrDecoder_sbr_start_freq_48[startFreq];
128135 break;
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
8282
8383 /*!
8484 \file
85 \brief SBR decoder frontend
85 \brief SBR decoder frontend
8686 This module provides a frontend to the SBR decoder. The function openSBR() is called for
8787 initialization. The function sbrDecoder_Apply() is called for each frame. sbr_Apply() will call the
8888 required functions to decode the raw SBR data (provided by env_extr.cpp), to decode the envelope data and noise floor levels [decodeSbrData()],
135135
136136 /* Decoder library info */
137137 #define SBRDECODER_LIB_VL0 2
138 #define SBRDECODER_LIB_VL1 1
138 #define SBRDECODER_LIB_VL1 2
139139 #define SBRDECODER_LIB_VL2 3
140140 #define SBRDECODER_LIB_TITLE "SBR Decoder"
141141 #define SBRDECODER_LIB_BUILD_DATE __DATE__
216216
217217 /* Check in/out samplerates */
218218 if ( sampleRateIn < 6400
219 || sampleRateIn > 24000
219 || sampleRateIn > 48000
220220 )
221221 {
222222 sbrError = SBRDEC_UNSUPPORTED_CONFIG;
223223 goto bail;
224224 }
225225
226 if ( sampleRateOut > 48000 )
226 if ( sampleRateOut > 96000 )
227227 {
228228 sbrError = SBRDEC_UNSUPPORTED_CONFIG;
229229 goto bail;
551551 sbrDecoder_DestroyElement( self, elementIndex );
552552 } else if (self->pSbrElement[elementIndex] != NULL) {
553553 /* Set error flag to trigger concealment */
554 self->pSbrElement[elementIndex]->frameErrorFlag[self->pSbrElement[elementIndex]->useFrameSlot] = 1;;
554 self->pSbrElement[elementIndex]->frameErrorFlag[self->pSbrElement[elementIndex]->useFrameSlot] = 1;
555555 }
556556 }
557557
730730 case SBR_BS_INTERRUPTION:
731731 {
732732 int elementIndex;
733
734 if (self == NULL) {
735 errorStatus = SBRDEC_NOT_INITIALIZED;
736 break;
737 }
738
733739 /* Loop over SBR elements */
734740 for (elementIndex = 0; elementIndex < self->numSbrElements; elementIndex++)
735741 {
877883 pSbrDrcChannelData = sbrDecoder_drcGetChannel( self, ch );
878884
879885 if ( pSbrDrcChannelData != NULL ) {
880 pSbrDrcChannelData->enable = 0;
886 sbrDecoder_drcInitChannel( pSbrDrcChannelData );
881887 }
882888 }
883889
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
100100 #define MAX_CODEC_FRAME_RATIO 2
101101 #define MAX_PAYLOAD_SIZE 256
102102
103 typedef enum codecType
104 {
105 CODEC_AAC=0,
106 CODEC_AACLD=1,
107 CODEC_UNSPECIFIED=99
108 } CODEC_TYPE;
109
110
103111 typedef struct
104112 {
105113 INT bitRate;
128136
129137 typedef struct
130138 {
139 CODEC_TYPE coreCoder; /*!< LC or ELD */
131140 UINT bitrateFrom; /*!< inclusive */
132141 UINT bitrateTo; /*!< exclusive */
133142
134 USHORT sampleRate; /*!< */
143 UINT sampleRate; /*!< */
135144 UCHAR numChannels; /*!< */
136145
137146 UCHAR startFreq; /*!< bs_start_freq */
157166 INT crcSbr; /*!< Flag: usage of SBR-CRC. */
158167 INT dynBwSupported; /*!< Flag: support for dynamic bandwidth in this combination. */
159168 INT parametricCoding; /*!< Flag: usage of parametric coding tool. */
169 INT downSampleFactor; /*!< Sampling rate relation between the SBR and the core encoder. */
160170 int freq_res_fixfix[3]; /*!< Frequency resolution of envelopes in frame class FIXFIX
161171 0=1 Env; 1=2 Env; 2=4 Env; */
162172 /*
193203 INT useSaPan; /*!< Flag: usage of SAPAN stereo. */
194204 INT dynBwEnabled; /*!< Flag: usage of dynamic bandwidth. */
195205 INT bParametricStereo; /*!< Flag: usage of parametric stereo coding tool. */
196 INT bDownSampledSbr; /*!< Signal downsampled SBR is used. */
197206
198207 /*
199208 header_extra1 configuration
213222 UCHAR init_amp_res_FF;
214223 } sbrConfiguration, *sbrConfigurationPtr ;
215224
216 typedef struct
225 typedef struct SBR_CONFIG_DATA
217226 {
218227 UINT sbrSyntaxFlags; /**< SBR syntax flags derived from AOT. */
219228 INT nChannels; /**< Number of channels. */
239248 INT xposCtrlSwitch; /**< Flag indicates whether to switch xpos ctrl on the fly. */
240249 INT switchTransposers; /**< Flag indicates whether to switch xpos on the fly . */
241250 UCHAR initAmpResFF;
242 } SBR_CONFIG_DATA;
243
244 typedef SBR_CONFIG_DATA *HANDLE_SBR_CONFIG_DATA;
251 } SBR_CONFIG_DATA, *HANDLE_SBR_CONFIG_DATA;
245252
246253 typedef struct {
247254 MP4_ELEMENT_ID elType;
274281 );
275282
276283 /**
277 * \brief get closest working bit rate to specified desired bit rate for a single SBR element
278 * \param bitRate the desired target bit rate
279 * \param numChannels the amount of audio channels
280 * \param coreSampleRate the sample rate of the core coder
281 * \param the current Audio Object Type
282 * \return closest working bit rate to bitRate value
284 * \brief Get closest working bitrate to specified desired
285 * bitrate for a single SBR element.
286 * \param bitRate The desired target bit rate
287 * \param numChannels The amount of audio channels
288 * \param coreSampleRate The sample rate of the core coder
289 * \param aot The current Audio Object Type
290 * \return Closest working bit rate to bitRate value
283291 */
284292 UINT sbrEncoder_LimitBitRate(UINT bitRate, UINT numChannels, UINT coreSampleRate, AUDIO_OBJECT_TYPE aot);
293
294
295 /**
296 * \brief Check whether downsampled SBR single rate is possible
297 * with given audio object type.
298 * \param aot The Audio object type.
299 * \return 0 when downsampled SBR is not possible,
300 * 1 when downsampled SBR is possible.
301 */
302 UINT sbrEncoder_IsSingleRatePossible(AUDIO_OBJECT_TYPE aot);
285303
286304 /**
287305 * \brief Initialize SBR Encoder instance.
293311 * \param bufferOffset Returns the offset for the audio input data in order to do delay balancing.
294312 * \param numChannels Input: Encoder input channels. output: core encoder channels.
295313 * \param sampleRate Input: Encoder samplerate. output core encoder samplerate.
314 * \param downSampleFactor Input: Relation between SBR and core coder sampling rate;
296315 * \param frameLength Input: Encoder frameLength. output core encoder frameLength.
297316 * \param aot Input: Desired AOT. output AOT to be used after parameter checking.
298317 * \param delay Input: core encoder delay. Output: total delay because of SBR.
299318 * \param transformFactor The core encoder transform factor (blockswitching).
319 * \param headerPeriod Repetition rate of the SBR header:
320 * - (-1) means intern configuration.
321 * - (1-10) corresponds to header repetition rate in frames.
300322 * \return 0 on success, and non-zero if failed.
301323 */
302 INT sbrEncoder_Init( HANDLE_SBR_ENCODER hSbrEncoder,
303 SBR_ELEMENT_INFO elInfo[(6)],
304 int noElements,
305 INT_PCM *inputBuffer,
306 INT *bandwidth,
307 INT *bufferOffset,
308 INT *numChannels,
309 INT *sampleRate,
310 INT *frameLength,
311 AUDIO_OBJECT_TYPE *aot,
312 int *delay,
313 int transformFactor,
314 ULONG statesInitFlag
315 );
324 INT sbrEncoder_Init(
325 HANDLE_SBR_ENCODER hSbrEncoder,
326 SBR_ELEMENT_INFO elInfo[(8)],
327 int noElements,
328 INT_PCM *inputBuffer,
329 INT *coreBandwidth,
330 INT *inputBufferOffset,
331 INT *numChannels,
332 INT *sampleRate,
333 UINT *downSampleFactor,
334 INT *frameLength,
335 AUDIO_OBJECT_TYPE aot,
336 int *delay,
337 int transformFactor,
338 const int headerPeriod,
339 ULONG statesInitFlag
340 );
316341
317342 /**
318343 * \brief Do delay line buffers housekeeping. To be called after each encoded audio frame.
343368 INT sbrEncoder_EncodeFrame(HANDLE_SBR_ENCODER hEnvEncoder,
344369 INT_PCM *samples,
345370 UINT timeInStride,
346 UINT sbrDataBits[(6)],
347 UCHAR sbrData[(6)][MAX_PAYLOAD_SIZE]
371 UINT sbrDataBits[(8)],
372 UCHAR sbrData[(8)][MAX_PAYLOAD_SIZE]
348373 );
349374
350375 /**
355380 * \param fSendHeaders Flag indicating that the SBR encoder should send more headers in the SBR payload or not.
356381 * \return void
357382 */
358 void sbrEncoder_GetHeader(SBR_ENCODER *sbrEncoder,
383 void sbrEncoder_GetHeader(HANDLE_SBR_ENCODER sbrEncoder,
359384 HANDLE_FDK_BITSTREAM hBs,
360385 INT element_index,
361386 int fSendHeaders);
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
124124 INT freqScale;
125125
126126 /*
127 element of sbrdata
128 */
129 SR_MODE sampleRateMode;
130
131 /*
132127 element of channelpairelement
133128 */
134129 INT coupling;
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
127127
128128 /* Get Scratch buffer */
129129 C_ALLOC_SCRATCH_START(tmpNrg, FIXP_DBL, QMF_CHANNELS*QMF_MAX_TIME_SLOTS/2);
130
131 FDK_ASSERT(numberBands <= QMF_CHANNELS);
132 FDK_ASSERT(numberCols <= QMF_MAX_TIME_SLOTS);
133130
134131 /* Get max possible scaling of QMF data */
135132 scale = DFRACT_BITS;
816813 }
817814
818815 /* ld64 to integer conversion */
819 nrgLeft = fixMin(fixMax(nrgLeft,FL2FXCONST_DBL(0.0f)),FL2FXCONST_DBL(0.5f));
816 nrgLeft = fixMin(fixMax(nrgLeft,FL2FXCONST_DBL(0.0f)),(FL2FXCONST_DBL(0.5f)>>oneBitLess));
820817 nrgLeft = (FIXP_DBL)(LONG)nrgLeft >> (DFRACT_BITS-1-LD_DATA_SHIFT-1-oneBitLess-1);
821818 sfb_nrgLeft[m] = ((INT)nrgLeft+1)>>1; /* rounding */
822819
823820 if (stereoMode == SBR_COUPLING) {
824821 FIXP_DBL scaleFract;
825
826 if (nrgRight != FL2FXCONST_DBL(0.0f)) {
827 int sc0 = CountLeadingBits(nrgLeft2);
828 int sc1 = CountLeadingBits(nrgRight);
829
830 scaleFract = ((FIXP_DBL)(sc0-sc1)) << (DFRACT_BITS-1-LD_DATA_SHIFT); /* scale value in ld64 representation */
831 nrgRight = CalcLdData(nrgLeft2<<sc0) - CalcLdData(nrgRight<<sc1) - scaleFract;
832 }
833 else
834 nrgRight = FL2FXCONST_DBL(0.5f); /* ld64(4294967296.0f) */
822 int sc0, sc1;
823
824 nrgLeft2 = fixMax((FIXP_DBL)0x1, nrgLeft2);
825 nrgRight = fixMax((FIXP_DBL)0x1, nrgRight);
826
827 sc0 = CountLeadingBits(nrgLeft2);
828 sc1 = CountLeadingBits(nrgRight);
829
830 scaleFract = ((FIXP_DBL)(sc0-sc1)) << (DFRACT_BITS-1-LD_DATA_SHIFT); /* scale value in ld64 representation */
831 nrgRight = CalcLdData(nrgLeft2<<sc0) - CalcLdData(nrgRight<<sc1) - scaleFract;
835832
836833 /* ld64 to integer conversion */
837834 nrgRight = (FIXP_DBL)(LONG)(nrgRight) >> (DFRACT_BITS-1-LD_DATA_SHIFT-1-oneBitLess);
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
12431243
12441244 FDK_ASSERT(totNoEst <= MAX_NO_OF_ESTIMATES);
12451245
1246 switch(frameSize){
1247 case 2048:
1248 hs->transientPosOffset = FRAME_MIDDLE_SLOT_2048;
1249 hs->timeSlots = NUMBER_TIME_SLOTS_2048;
1250 break;
1251 case 1920:
1252 hs->transientPosOffset = FRAME_MIDDLE_SLOT_1920;
1253 hs->timeSlots = NUMBER_TIME_SLOTS_1920;
1254 break;
1255 case 1024:
1256 hs->transientPosOffset = FRAME_MIDDLE_SLOT_512LD;
1257 hs->timeSlots = 16;
1258 break;
1259 case 960:
1260 hs->transientPosOffset = FRAME_MIDDLE_SLOT_512LD;
1261 hs->timeSlots = 15;
1262 break;
1263 default:
1264 return -1;
1246 if (sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY)
1247 {
1248 switch(frameSize){
1249 case 1024:
1250 case 512:
1251 hs->transientPosOffset = FRAME_MIDDLE_SLOT_512LD;
1252 hs->timeSlots = 16;
1253 break;
1254 case 960:
1255 case 480:
1256 hs->transientPosOffset = FRAME_MIDDLE_SLOT_512LD;
1257 hs->timeSlots = 15;
1258 break;
1259 default:
1260 return -1;
1261 }
1262 } else
1263 {
1264 switch(frameSize){
1265 case 2048:
1266 case 1024:
1267 hs->transientPosOffset = FRAME_MIDDLE_SLOT_2048;
1268 hs->timeSlots = NUMBER_TIME_SLOTS_2048;
1269 break;
1270 case 1920:
1271 case 960:
1272 hs->transientPosOffset = FRAME_MIDDLE_SLOT_1920;
1273 hs->timeSlots = NUMBER_TIME_SLOTS_1920;
1274 break;
1275 default:
1276 return -1;
1277 }
12651278 }
12661279
12671280 if (sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) {
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
101101 #define max(a,b) ( a > b ? a:b)
102102 #endif
103103
104 #define NOISE_FLOOR_OFFSET_SCALING (3)
104 #define NOISE_FLOOR_OFFSET_SCALING (4)
105105
106106
107107
483483 tmp = ((FIXP_DBL)MAXVAL_DBL)>>NOISE_FLOOR_OFFSET_SCALING;
484484 }
485485 else {
486 FDK_ASSERT(noiseFloorOffset<=8); /* because of NOISE_FLOOR_OFFSET_SCALING */
487
488 /* Assumes the noise floor offset in tuning table are in q31 */
489 /* Currently the table contains only 0 for noise floor offset */
490 /* Change the qformat here when non-zero values would be filled */
486 /* noiseFloorOffset has to be smaller than 12, because
487 the result of the calculation below must be smaller than 1:
488 (2^(noiseFloorOffset/3))*2^4<1 */
489 FDK_ASSERT(noiseFloorOffset<12);
490
491 /* Assumes the noise floor offset in tuning table are in q31 */
492 /* Change the qformat here when non-zero values would be filled */
491493 exp = fDivNorm((FIXP_DBL)noiseFloorOffset, 3, &qexp);
492494 tmp = fPow(2, DFRACT_BITS-1, exp, qexp, &qtmp);
493495 tmp = scaleValue(tmp, qtmp-NOISE_FLOOR_OFFSET_SCALING);
526528 h_sbrNoiseFloorEstimate->noNoiseBands = 1;
527529 }
528530 else{
529 /*
530 * Calculate number of noise bands 1,2 or 3 bands/octave
531 /*
532 * Calculate number of noise bands 1,2 or 3 bands/octave
531533 ********************************************************/
532534 FIXP_DBL tmp, ratio, lg2;
533 INT ratio_e, qlg2;
535 INT ratio_e, qlg2, nNoiseBands;
534536
535537 ratio = fDivNorm(k2, kx, &ratio_e);
536538 lg2 = fLog2(ratio, ratio_e, &qlg2);
537539 tmp = fMult((FIXP_DBL)(h_sbrNoiseFloorEstimate->noiseBands<<24), lg2);
538540 tmp = scaleValue(tmp, qlg2-23);
539541
540 h_sbrNoiseFloorEstimate->noNoiseBands = (INT)((tmp + (FIXP_DBL)1) >> 1);
541
542 if (h_sbrNoiseFloorEstimate->noNoiseBands > MAX_NUM_NOISE_COEFFS)
543 h_sbrNoiseFloorEstimate->noNoiseBands = MAX_NUM_NOISE_COEFFS;
544
545 if( h_sbrNoiseFloorEstimate->noNoiseBands==0)
546 h_sbrNoiseFloorEstimate->noNoiseBands=1;
542 nNoiseBands = (INT)((tmp + (FIXP_DBL)1) >> 1);
543
544
545 if (nNoiseBands > MAX_NUM_NOISE_COEFFS ) {
546 nNoiseBands = MAX_NUM_NOISE_COEFFS;
547 }
548
549 if( nNoiseBands == 0 ) {
550 nNoiseBands = 1;
551 }
552
553 h_sbrNoiseFloorEstimate->noNoiseBands = nNoiseBands;
554
547555 }
548556
549557
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
266266 PS_BANDS_MID
267267 };
268268
269 static INT getNoBands(PS_RESOLUTION mode)
269 static INT getNoBands(UINT mode)
270270 {
271271 if(mode>=6)
272272 return 0;
273273
274274 if(mode>=3)
275 mode = (PS_RESOLUTION)(mode-3);
275 mode = mode-3;
276276
277277 return psBands[mode];
278278 }
523523 bitCnt += FDKsbrEnc_EncodeIpd( hBitBuf,
524524 psOut->ipd[env],
525525 ipdLast,
526 getNoBands((PS_RESOLUTION)psOut->iidMode),
526 getNoBands((UINT)psOut->iidMode),
527527 psOut->deltaIPD[env],
528528 &error);
529529
531531 bitCnt += FDKsbrEnc_EncodeOpd( hBitBuf,
532532 psOut->opd[env],
533533 opdLast,
534 getNoBands((PS_RESOLUTION)psOut->iidMode),
534 getNoBands((UINT)psOut->iidMode),
535535 psOut->deltaOPD[env],
536536 &error );
537537 }
660660 bitCnt += FDKsbrEnc_EncodeIid( hBitBuf,
661661 psOut->iid[env],
662662 iidLast,
663 getNoBands((PS_RESOLUTION)psOut->iidMode),
663 getNoBands((UINT)psOut->iidMode),
664664 (PS_IID_RESOLUTION)getIIDRes(psOut->iidMode),
665665 psOut->deltaIID[env],
666666 &error );
676676 bitCnt += FDKsbrEnc_EncodeIcc( hBitBuf,
677677 psOut->icc[env],
678678 iccLast,
679 getNoBands((PS_RESOLUTION)psOut->iccMode),
679 getNoBands((UINT)psOut->iccMode),
680680 psOut->deltaICC[env],
681681 &error);
682682
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
226226 /* clear bs buffer */
227227 FDKmemclear(hParametricStereo->psOut, sizeof(hParametricStereo->psOut));
228228
229 hParametricStereo->psOut[0].enablePSHeader = 1; /* write ps header in first frame */
230
229231 /* clear scaling buffer */
230232 FDKmemclear(hParametricStereo->dynBandScale, sizeof(UCHAR)*PS_MAX_BANDS);
231233 FDKmemclear(hParametricStereo->maxBandValue, sizeof(FIXP_QMF)*PS_MAX_BANDS);
312314 }
313315 else {
314316 int n, k;
315 C_ALLOC_SCRATCH_START(pWorkBuffer, FIXP_QMF, QMF_CHANNELS*2);
317 C_AALLOC_SCRATCH_START(pWorkBuffer, FIXP_QMF, 2*QMF_CHANNELS)
316318
317319 /* define scalings */
318320 int dynQmfScale = fixMax(0, hParametricStereo->dmxScale-1); /* scale one bit more for addition of left and right */
397399
398400 *qmfScale = -downmixScale + 7;
399401
400 C_ALLOC_SCRATCH_END(pWorkBuffer, FIXP_QMF, QMF_CHANNELS*2);
401
402 C_AALLOC_SCRATCH_END(pWorkBuffer, FIXP_QMF, 2*QMF_CHANNELS)
402403
403404 {
404405 const INT noQmfSlots2 = hParametricStereo->noQmfSlots>>1;
472473 )
473474 {
474475 FDK_PSENC_ERROR error = PSENC_OK;
475 INT noQmfBands = hParametricStereo->noQmfBands;
476476 INT psQmfScale[MAX_PS_CHANNELS] = {0};
477477 int psCh, i;
478 C_ALLOC_SCRATCH_START(pWorkBuffer, FIXP_DBL, QMF_CHANNELS*4);
478 C_AALLOC_SCRATCH_START(pWorkBuffer, FIXP_QMF, 4*QMF_CHANNELS)
479479
480480 for (psCh = 0; psCh<MAX_PS_CHANNELS; psCh ++) {
481481
504504
505505 } /* for psCh */
506506
507 C_ALLOC_SCRATCH_END(pWorkBuffer, FIXP_DBL, QMF_CHANNELS*4);
507 C_AALLOC_SCRATCH_END(pWorkBuffer, FIXP_QMF, 4*QMF_CHANNELS)
508508
509509 /* find best scaling in new QMF and Hybrid data */
510510 psFindBestScaling( hParametricStereo,
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
104104 /* SBR bitstream delay */
105105 #define DELAY_FRAMES 2
106106
107 typedef struct {
107
108 typedef struct SBR_CHANNEL {
108109 struct ENV_CHANNEL hEnvChannel;
109110 //INT_PCM *pDSOutBuffer; /**< Pointer to downsampled audio output of SBR encoder */
110111 DOWNSAMPLER downSampler;
112113 } SBR_CHANNEL;
113114 typedef SBR_CHANNEL* HANDLE_SBR_CHANNEL;
114115
115 typedef struct {
116 typedef struct SBR_ELEMENT {
116117 HANDLE_SBR_CHANNEL sbrChannel[2];
117118 QMF_FILTER_BANK *hQmfAnalysis[2];
118119 SBR_CONFIG_DATA sbrConfigData;
125126 UCHAR payloadDelayLine[1+DELAY_FRAMES][MAX_PAYLOAD_SIZE];
126127 UINT payloadDelayLineSize[1+DELAY_FRAMES]; /* Sizes in bits */
127128
128 } SBR_ELEMENT;
129 typedef SBR_ELEMENT* HANDLE_SBR_ELEMENT;
129 } SBR_ELEMENT, *HANDLE_SBR_ELEMENT;
130130
131 struct SBR_ENCODER
131 typedef struct SBR_ENCODER
132132 {
133 HANDLE_SBR_ELEMENT sbrElement[(6)];
134 HANDLE_SBR_CHANNEL pSbrChannel[(6)];
135 QMF_FILTER_BANK QmfAnalysis[(6)];
133 HANDLE_SBR_ELEMENT sbrElement[(8)];
134 HANDLE_SBR_CHANNEL pSbrChannel[(8)];
135 QMF_FILTER_BANK QmfAnalysis[(8)];
136136 DOWNSAMPLER lfeDownSampler;
137137 int lfeChIdx; /* -1 default for no lfe, else assign channel index */
138138 int noElements; /* Number of elements */
141141 int bufferOffset; /* Offset for SBR parameter extraction in time domain input buffer. */
142142 int downsampledOffset; /* Offset of downsampled/mixed output for core encoder. */
143143 int downmixSize; /* Size in samples of downsampled/mixed output for core encoder. */
144 INT downSampleFactor; /* Sampling rate relation between the SBR and the core encoder. */
144145 int fTimeDomainDownsampling; /* Flag signalling time domain downsampling instead of QMF downsampling. */
145146 int nBitstrDelay; /* Amount of SBR frames to be delayed in bitstream domain. */
146147 INT estimateBitrate; /* estimate bitrate of SBR encoder */
157158 INT maxChannels;
158159 INT supportPS;
159160
160 } ;
161
162 } SBR_ENCODER;
161163
162164
163165 #endif /* __SBR_H */
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
269269
270270 typedef enum
271271 {
272 SINGLE_RATE,
273 DUAL_RATE
274 }
275 SR_MODE;
276
277 typedef enum
278 {
279272 FREQ_RES_LOW = 0,
280273 FREQ_RES_HIGH
281274 }
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
8282
8383 /*************************** Fraunhofer IIS FDK Tools ***********************
8484
85 Author(s): Andreas Ehret
85 Author(s): Andreas Ehret, Tobias Chalupka
8686 Description: SBR encoder top level processing.
8787
8888 ******************************************************************************/
101101 #include "ps_main.h"
102102
103103 #define SBRENCODER_LIB_VL0 3
104 #define SBRENCODER_LIB_VL1 2
105 #define SBRENCODER_LIB_VL2 2
104 #define SBRENCODER_LIB_VL1 3
105 #define SBRENCODER_LIB_VL2 4
106106
107107
108108
118118 (core2sbr delay ) ds (read, core and ds area)
119119 */
120120
121 #define DOWN_SMPL_FAC (2)
122
123 #define SFL(fl) (fl*DOWN_SMPL_FAC) /* SBR frame length (hardcoded to downsample factor of 2) */
124 #define STS(fl) (SFL(fl)/64) /* SBR Time Slots */
125
126 #define DELAY_QMF_ANA (640 - 64) /* Full bandwidth */
127 #define DELAY_QMF_ANAELD (32)
128 #define DELAY_HYB_ANA (10*64) /* + 0.5 */
129 #define DELAY_HYB_SYN (6*64 - 32)
130 #define DELAY_QMF_SYNELD (32)
131 #define DELAY_DEC_QMF (6*64) /* Decoder QMF overlap */
132 #define DELAY_QMF_SYN (2) /* NO_POLY/2 */
133 #define DELAY_QMF_DS (32) /* QMF synthesis for downsampled time signal */
121 #define SFB(dwnsmp) (32 << (dwnsmp-1)) /* SBR Frequency bands: 64 for dual-rate, 32 for single-rate */
122 #define STS(fl) (((fl)==1024)?32:30) /* SBR Time Slots: 32 for core frame length 1024, 30 for core frame length 960 */
123
124 #define DELAY_QMF_ANA(dwnsmp) ((320<<((dwnsmp)-1)) - (32<<((dwnsmp)-1))) /* Full bandwidth */
125 #define DELAY_HYB_ANA (10*64) /* + 0.5 */ /* */
126 #define DELAY_HYB_SYN (6*64 - 32) /* */
127 #define DELAY_QMF_POSTPROC(dwnsmp) (32*(dwnsmp)) /* QMF postprocessing delay */
128 #define DELAY_DEC_QMF(dwnsmp) (6 * SFB(dwnsmp) ) /* Decoder QMF overlap */
129 #define DELAY_QMF_SYN (2) /* NO_POLY/2=2.5, rounded down to 2 */
130 #define DELAY_QMF_DS (32) /* QMF synthesis for downsampled time signal */
134131
135132 /* Delay in QMF paths */
136 #define DELAY_SBR(fl) (DELAY_QMF_ANA + (64*STS(fl)-1) + DELAY_QMF_SYN)
137 #define DELAY_PS(fl) (DELAY_QMF_ANA + DELAY_HYB_ANA + DELAY_DEC_QMF + (64*STS(fl)-1) + DELAY_HYB_SYN + DELAY_QMF_SYN)
138 #define DELAY_ELDSBR(fl) (DELAY_QMF_ANAELD + (((fl)+((fl)/2))*2 - 1) + DELAY_QMF_SYNELD)
133 #define DELAY_SBR(fl,dwnsmp) (DELAY_QMF_ANA(dwnsmp) + (SFB(dwnsmp)*STS(fl) - 1) + DELAY_QMF_SYN)
134 #define DELAY_PS(fl,dwnsmp) (DELAY_QMF_ANA(dwnsmp) + DELAY_HYB_ANA + DELAY_DEC_QMF(dwnsmp) + (SFB(dwnsmp)*STS(fl)-1) + DELAY_HYB_SYN + DELAY_QMF_SYN)
135 #define DELAY_ELDSBR(fl,dwnsmp) ( ( ((fl)/2)*(dwnsmp) ) - 1 + DELAY_QMF_POSTPROC(dwnsmp) )
139136
140137 /* Delay differences for SBR and SBR+PS */
141 #define MAX_DS_FILTER_DELAY (34) /* the additional max downsampler filter delay (source fs) */
142 #define DELAY_AAC2SBR(fl) ((/*RESAMPLER +*/ /*(DELAY_AAC(fl)*2) + */ DELAY_QMF_ANA + DELAY_DEC_QMF + DELAY_QMF_SYN) - DELAY_SBR(fl)) /* 1537 */
143 #define DELAY_ELD2SBR(fl) ((/*RESAMPLER +*/ /*(DELAY_ELD(fl)*2) + */ DELAY_QMF_ANAELD + DELAY_QMF_SYNELD) - DELAY_ELDSBR(fl))
144
145 #define DELAY_AAC2PS(fl) ((DELAY_QMF_ANA + DELAY_QMF_DS + /*(DELAY_AAC(fl)*2)*/ + DELAY_QMF_ANA + DELAY_DEC_QMF + DELAY_HYB_SYN + DELAY_QMF_SYN) - DELAY_PS(fl)) /* 2048 - 463*2 */
146
147 /* Assumption: that the sample delay resulting of of DELAY_AAC2PS is always smaller than the sample delay implied by DELAY_AAC2SBR */
148 #define MAX_SAMPLE_DELAY (DELAY_AAC2SBR(1024) + MAX_DS_FILTER_DELAY)
138 #define MAX_DS_FILTER_DELAY (5) /* the additional max downsampler filter delay (source fs) */
139 #define DELAY_AAC2SBR(fl,dwnsmp) ((DELAY_QMF_ANA(dwnsmp) + DELAY_DEC_QMF(dwnsmp) + DELAY_QMF_SYN) - DELAY_SBR((fl),(dwnsmp)))
140 #define DELAY_ELD2SBR(fl,dwnsmp) ((DELAY_QMF_POSTPROC(dwnsmp)) - DELAY_ELDSBR(fl,dwnsmp))
141 #define DELAY_AAC2PS(fl,dwnsmp) ((DELAY_QMF_ANA(dwnsmp) + DELAY_QMF_DS + /*(DELAY_AAC(fl)*2) + */ DELAY_QMF_ANA(dwnsmp) + DELAY_DEC_QMF(dwnsmp) + DELAY_HYB_SYN + DELAY_QMF_SYN) - DELAY_PS(fl,dwnsmp)) /* 2048 - 463*2 */
142
143 /* Assumption: The sample delay resulting of of DELAY_AAC2PS is always smaller than the sample delay implied by DELAY_AAC2SBR */
144 #define MAX_SAMPLE_DELAY (DELAY_AAC2SBR(1024,2) + MAX_DS_FILTER_DELAY) /* maximum delay: frame length of 1024 and dual-rate sbr */
149145
150146 /***************************************************************************/
151147
171167 UINT *pBitRateClosest
172168 )
173169 {
174 int i, paramSetTop, bitRateClosestLowerIndex=-1, bitRateClosestUpperIndex=-1, found = 0;
170 int i, bitRateClosestLowerIndex=-1, bitRateClosestUpperIndex=-1, found = 0;
175171 UINT bitRateClosestUpper = 0, bitRateClosestLower=DISTANCE_CEIL_VALUE;
176
177 FDK_ASSERT(SBRENC_TUNING_SIZE == sizeof(sbrTuningTable)/sizeof(sbrTuningTable[0]));
178
179 if (core == AOT_ER_AAC_ELD) {
180 paramSetTop = SBRENC_TUNING_SIZE;
181 i = SBRENC_AACLC_TUNING_SIZE;
182 } else {
183 paramSetTop = SBRENC_AACLC_TUNING_SIZE;
184 i = 0;
185 }
186
187 for (; i < paramSetTop ; i++) {
188 if ( numChannels == sbrTuningTable [i].numChannels
189 && sampleRate == sbrTuningTable [i].sampleRate )
172 int isforThisCodec=0;
173
174 #define isForThisCore(i) \
175 ( ( sbrTuningTable[i].coreCoder == CODEC_AACLD && core == AOT_ER_AAC_ELD ) || \
176 ( sbrTuningTable[i].coreCoder == CODEC_AAC && core != AOT_ER_AAC_ELD ) )
177
178 for (i=0; i < sbrTuningTableSize ; i++) {
179 if ( isForThisCore(i) ) /* tuning table is for this core codec */
190180 {
191 found = 1;
192 if ((bitrate >= sbrTuningTable [i].bitrateFrom) &&
193 (bitrate < sbrTuningTable [i].bitrateTo)) {
194 bitRateClosestLower = bitrate;
195 bitRateClosestUpper = bitrate;
196 //FDKprintf("entry %d\n", i);
197 return i ;
198 } else {
199 if ( sbrTuningTable [i].bitrateFrom > bitrate ) {
200 if (sbrTuningTable [i].bitrateFrom < bitRateClosestLower) {
201 bitRateClosestLower = sbrTuningTable [i].bitrateFrom;
202 bitRateClosestLowerIndex = i;
181 if ( numChannels == sbrTuningTable [i].numChannels
182 && sampleRate == sbrTuningTable [i].sampleRate )
183 {
184 found = 1;
185 if ((bitrate >= sbrTuningTable [i].bitrateFrom) &&
186 (bitrate < sbrTuningTable [i].bitrateTo)) {
187 bitRateClosestLower = bitrate;
188 bitRateClosestUpper = bitrate;
189 //FDKprintf("entry %d\n", i);
190 return i ;
191 } else {
192 if ( sbrTuningTable [i].bitrateFrom > bitrate ) {
193 if (sbrTuningTable [i].bitrateFrom < bitRateClosestLower) {
194 bitRateClosestLower = sbrTuningTable [i].bitrateFrom;
195 bitRateClosestLowerIndex = i;
196 }
197 }
198 if ( sbrTuningTable [i].bitrateTo <= bitrate ) {
199 if (sbrTuningTable [i].bitrateTo > bitRateClosestUpper) {
200 bitRateClosestUpper = sbrTuningTable [i].bitrateTo-1;
201 bitRateClosestUpperIndex = i;
202 }
203203 }
204204 }
205 if ( sbrTuningTable [i].bitrateTo <= bitrate ) {
206 if (sbrTuningTable [i].bitrateTo > bitRateClosestUpper) {
207 bitRateClosestUpper = sbrTuningTable [i].bitrateTo-1;
208 bitRateClosestUpperIndex = i;
209 }
210 }
211205 }
212206 }
213207 }
214208
215209 if (pBitRateClosest != NULL)
216210 {
217 /* Is there was at least one matching tuning entry found then pick the least distance bit rate */
211 /* If there was at least one matching tuning entry found then pick the least distance bit rate */
218212 if (found)
219213 {
220214 int distanceUpper=DISTANCE_CEIL_VALUE, distanceLower=DISTANCE_CEIL_VALUE;
294288 return INVALID_TABLE_IDX;
295289 }
296290
291 /***************************************************************************/
292 /*!
293
294 \brief In case of downsampled SBR we may need to lower the stop freq
295 of a tuning setting to fit into the lower half of the
296 spectrum ( which is sampleRate/4 )
297
298 \return the adapted stop frequency index (-1 -> error)
299
300 \ingroup SbrEncCfg
301
302 ****************************************************************************/
303 static INT
304 FDKsbrEnc_GetDownsampledStopFreq (
305 const INT sampleRateCore,
306 const INT startFreq,
307 INT stopFreq,
308 const INT downSampleFactor
309 )
310 {
311 INT maxStopFreqRaw = sampleRateCore / 2;
312 INT startBand, stopBand;
313 HANDLE_ERROR_INFO err;
314
315 while (stopFreq > 0 && FDKsbrEnc_getSbrStopFreqRAW(stopFreq, sampleRateCore) > maxStopFreqRaw) {
316 stopFreq--;
317 }
318
319 if (FDKsbrEnc_getSbrStopFreqRAW( stopFreq, sampleRateCore) > maxStopFreqRaw)
320 return -1;
321
322 err = FDKsbrEnc_FindStartAndStopBand (
323 sampleRateCore<<(downSampleFactor-1),
324 sampleRateCore,
325 32<<(downSampleFactor-1),
326 startFreq,
327 stopFreq,
328 &startBand,
329 &stopBand
330 );
331 if (err)
332 return -1;
333
334 return stopFreq;
335 }
336
297337
298338 /***************************************************************************/
299339 /*!
306346
307347 ****************************************************************************/
308348 static UINT
309 FDKsbrEnc_IsSbrSettingAvail (UINT bitrate, /*! the total bitrate in bits/sec */
310 UINT vbrMode, /*! the vbr paramter, 0 means constant bitrate */
311 UINT numOutputChannels,/*! the number of channels for the core coder */
312 UINT sampleRateInput, /*! the input sample rate [in Hz] */
313 AUDIO_OBJECT_TYPE core
314 )
349 FDKsbrEnc_IsSbrSettingAvail (
350 UINT bitrate, /*! the total bitrate in bits/sec */
351 UINT vbrMode, /*! the vbr paramter, 0 means constant bitrate */
352 UINT numOutputChannels, /*! the number of channels for the core coder */
353 UINT sampleRateInput, /*! the input sample rate [in Hz] */
354 UINT sampleRateCore, /*! the core's sampling rate */
355 AUDIO_OBJECT_TYPE core
356 )
315357 {
316358 INT idx = INVALID_TABLE_IDX;
317 UINT sampleRateCore;
318359
319360 if (sampleRateInput < 16000)
320361 return 0;
334375 bitrate *= numOutputChannels;
335376 }
336377
337 /* try DOWN_SMPL_FAC of the input sampling rate */
338 sampleRateCore = sampleRateInput/DOWN_SMPL_FAC;
339378 idx = getSbrTuningTableIndex(bitrate, numOutputChannels, sampleRateCore, core, NULL);
340379
341380 return (idx == INVALID_TABLE_IDX ? 0 : 1);
355394 FDKsbrEnc_AdjustSbrSettings (const sbrConfigurationPtr config, /*! output, modified */
356395 UINT bitRate, /*! the total bitrate in bits/sec */
357396 UINT numChannels, /*! the core coder number of channels */
358 UINT fsCore, /*! the core coder sampling rate in Hz */
397 UINT sampleRateCore, /*! the core coder sampling rate in Hz */
398 UINT sampleRateSbr, /*! the sbr coder sampling rate in Hz */
359399 UINT transFac, /*! the short block to long block ratio */
360400 UINT standardBitrate, /*! the standard bitrate per channel in bits/sec */
361401 UINT vbrMode, /*! the vbr paramter, 0 poor quality .. 100 high quality*/
365405 AUDIO_OBJECT_TYPE core) /* Core audio codec object type */
366406 {
367407 INT idx = INVALID_TABLE_IDX;
368 UINT sampleRate;
369
370 /* set the codec settings */
408 /* set the core codec settings */
371409 config->codecSettings.bitRate = bitRate;
372410 config->codecSettings.nChannels = numChannels;
373 config->codecSettings.sampleFreq = fsCore;
411 config->codecSettings.sampleFreq = sampleRateCore;
374412 config->codecSettings.transFac = transFac;
375413 config->codecSettings.standardBitrate = standardBitrate;
376 sampleRate = fsCore * DOWN_SMPL_FAC;
377414
378415 if (bitRate==0) {
379416 /* map vbr quality to bitrate */
390427 bitRate *= numChannels;
391428 /* fix to enable mono vbrMode<40 @ 44.1 of 48kHz */
392429 if (numChannels==1) {
393 if (sampleRate==44100 || sampleRate==48000) {
430 if (sampleRateSbr==44100 || sampleRateSbr==48000) {
394431 if (vbrMode<40) bitRate = 32000;
395432 }
396433 }
397434 }
398435
399 idx = getSbrTuningTableIndex(bitRate,numChannels,fsCore, core, NULL);
436 idx = getSbrTuningTableIndex(bitRate,numChannels,sampleRateCore, core, NULL);
400437
401438 if (idx != INVALID_TABLE_IDX) {
402439 config->startFreq = sbrTuningTable[idx].startFreq ;
406443 config->stopFreq = sbrTuningTable[idx].stopFreqSpeech;
407444 }
408445
446 /* Adapt stop frequency in case of downsampled SBR - only 32 bands then */
447 if (1 == config->downSampleFactor) {
448 INT dsStopFreq = FDKsbrEnc_GetDownsampledStopFreq(
449 sampleRateCore,
450 config->startFreq,
451 config->stopFreq,
452 config->downSampleFactor
453 );
454 if (dsStopFreq < 0) {
455 return 0;
456 }
457
458 config->stopFreq = dsStopFreq;
459 }
460
409461 config->sbr_noise_bands = sbrTuningTable[idx].numNoiseBands ;
410462 if (core == AOT_ER_AAC_ELD)
411463 config->init_amp_res_FF = SBR_AMP_RES_1_5;
454506 description: initializes the SBR confifuration
455507 returns: error status
456508 input: - core codec type,
457 - fac of SBR to core frame length,
509 - factor of SBR to core frame length,
458510 - core frame length
459511 output: initialized SBR configuration
460512
461513 *****************************************************************************/
462514 static UINT
463515 FDKsbrEnc_InitializeSbrDefaults (sbrConfigurationPtr config,
464 INT coreSbrFrameLenFac,
465 UINT codecGranuleLen)
466 {
467 if ( (coreSbrFrameLenFac != 2) ||
468 (codecGranuleLen*coreSbrFrameLenFac > QMF_CHANNELS*QMF_MAX_TIME_SLOTS) )
469 return(1);
516 INT downSampleFactor,
517 UINT codecGranuleLen
518 )
519 {
520 if ( (downSampleFactor < 1 || downSampleFactor > 2) ||
521 (codecGranuleLen*downSampleFactor > QMF_CHANNELS*QMF_MAX_TIME_SLOTS) )
522 return(0); /* error */
470523
471524 config->SendHeaderDataTime = 1000;
472525 config->useWaveCoding = 0;
475528 config->tran_thr = 13000;
476529 config->parametricCoding = 1;
477530
478 config->sbrFrameSize = codecGranuleLen * coreSbrFrameLenFac;
479
531 config->sbrFrameSize = codecGranuleLen * downSampleFactor;
532 config->downSampleFactor = downSampleFactor;
480533
481534 /* sbr default parameters */
482535 config->sbr_data_extra = 0;
496549 config->sbr_xpos_level = 0;
497550 config->useSaPan = 0;
498551 config->dynBwEnabled = 0;
499 config->bDownSampledSbr = 0;
500552
501553
502554 /* the following parameters are overwritten by the FDKsbrEnc_AdjustSbrSettings() function since
600652 {
601653 int el, ch;
602654
603 for (el=0; el<(6); el++)
655 for (el=0; el<(8); el++)
604656 {
605657 if (hSbrEncoder->sbrElement[el]!=NULL) {
606658 sbrEncoder_ElementClose(&hSbrEncoder->sbrElement[el]);
608660 }
609661
610662 /* Close sbr Channels */
611 for (ch=0; ch<(6); ch++)
663 for (ch=0; ch<(8); ch++)
612664 {
613665 if (hSbrEncoder->pSbrChannel[ch]) {
614666 sbrEncoder_ChannelClose(hSbrEncoder->pSbrChannel[ch]);
644696 output: error info
645697
646698 *****************************************************************************/
647 static INT updateFreqBandTable(HANDLE_SBR_CONFIG_DATA sbrConfigData,
648 HANDLE_SBR_HEADER_DATA sbrHeaderData,
649 INT noQmfChannels)
699 static INT updateFreqBandTable(
700 HANDLE_SBR_CONFIG_DATA sbrConfigData,
701 HANDLE_SBR_HEADER_DATA sbrHeaderData,
702 const INT downSampleFactor
703 )
650704 {
651705 INT k0, k2;
652706
653 if(FDKsbrEnc_FindStartAndStopBand(sbrConfigData->sampleFreq,
654 noQmfChannels,
655 sbrHeaderData->sbr_start_frequency,
656 sbrHeaderData->sbr_stop_frequency,
657 sbrHeaderData->sampleRateMode,
658 &k0, &k2))
707 if( FDKsbrEnc_FindStartAndStopBand (
708 sbrConfigData->sampleFreq,
709 sbrConfigData->sampleFreq >> (downSampleFactor-1),
710 sbrConfigData->noQmfBands,
711 sbrHeaderData->sbr_start_frequency,
712 sbrHeaderData->sbr_stop_frequency,
713 &k0,
714 &k2
715 )
716 )
659717 return(1);
660718
661719
662 if(FDKsbrEnc_UpdateFreqScale(sbrConfigData->v_k_master, &sbrConfigData->num_Master,
663 k0, k2, sbrHeaderData->freqScale,
664 sbrHeaderData->alterScale))
720 if( FDKsbrEnc_UpdateFreqScale(
721 sbrConfigData->v_k_master,
722 &sbrConfigData->num_Master,
723 k0,
724 k2,
725 sbrHeaderData->freqScale,
726 sbrHeaderData->alterScale
727 )
728 )
665729 return(1);
666730
667731
668732 sbrHeaderData->sbr_xover_band=0;
669733
670734
671 if(FDKsbrEnc_UpdateHiRes(sbrConfigData->freqBandTable[HI],
672 &sbrConfigData->nSfb[HI],
673 sbrConfigData->v_k_master,
674 sbrConfigData->num_Master ,
675 &sbrHeaderData->sbr_xover_band,
676 sbrHeaderData->sampleRateMode,
677 noQmfChannels))
735 if( FDKsbrEnc_UpdateHiRes(
736 sbrConfigData->freqBandTable[HI],
737 &sbrConfigData->nSfb[HI],
738 sbrConfigData->v_k_master,
739 sbrConfigData->num_Master,
740 &sbrHeaderData->sbr_xover_band
741 )
742 )
678743 return(1);
679744
680745
681 FDKsbrEnc_UpdateLoRes(sbrConfigData->freqBandTable[LO],
682 &sbrConfigData->nSfb[LO],
683 sbrConfigData->freqBandTable[HI],
684 sbrConfigData->nSfb[HI]);
685
686 sbrConfigData->xOverFreq = (sbrConfigData->freqBandTable[LOW_RES][0] * sbrConfigData->sampleFreq / noQmfChannels+1)>>1;
746 FDKsbrEnc_UpdateLoRes(
747 sbrConfigData->freqBandTable[LO],
748 &sbrConfigData->nSfb[LO],
749 sbrConfigData->freqBandTable[HI],
750 sbrConfigData->nSfb[HI]
751 );
752
753
754 sbrConfigData->xOverFreq = (sbrConfigData->freqBandTable[LOW_RES][0] * sbrConfigData->sampleFreq / sbrConfigData->noQmfBands+1)>>1;
687755
688756 return (0);
689757 }
865933 */
866934 if(updateFreqBandTable(&hSbrElement->sbrConfigData,
867935 &hSbrElement->sbrHeaderData,
868 hSbrElement->sbrConfigData.noQmfBands))
936 hEnvEncoder->downSampleFactor
937 ))
869938 return(1);
870939
871940
889958 MAX_PAYLOAD_SIZE*sizeof(UCHAR),
890959 &crcInfo,
891960 hSbrElement->sbrConfigData.sbrSyntaxFlags);
892
893 INT error = noError;
894961
895962 /* Temporal Envelope Data */
896963 SBR_FRAME_TEMP_DATA _fData;
922989
923990 if(hSbrElement->elInfo.fParametricStereo == 0)
924991 {
925 C_ALLOC_SCRATCH_START(qmfWorkBuffer, FIXP_DBL, QMF_CHANNELS*2);
926992 QMF_SCALE_FACTOR tmpScale;
927993 FIXP_DBL **pQmfReal, **pQmfImag;
994 C_AALLOC_SCRATCH_START(qmfWorkBuffer, FIXP_DBL, QMF_CHANNELS*2)
928995
929996
930997 /* Obtain pointers to QMF buffers. */
9391006 timeInStride,
9401007 qmfWorkBuffer );
9411008
942 C_ALLOC_SCRATCH_END(qmfWorkBuffer, FIXP_DBL, QMF_CHANNELS*2);
943
9441009 h_envChan->qmfScale = tmpScale.lb_scale + 7;
1010
1011
1012 C_AALLOC_SCRATCH_END(qmfWorkBuffer, FIXP_DBL, QMF_CHANNELS*2)
9451013
9461014 } /* fParametricStereo == 0 */
9471015
9511019 */
9521020 if (hSbrElement->elInfo.fParametricStereo)
9531021 {
1022 INT error = noError;
1023
9541024
9551025 /* Limit Parametric Stereo to one instance */
9561026 FDK_ASSERT(ch == 0);
11761246 break;
11771247 case 2048:
11781248 case 1024:
1249 case 512:
11791250 timeSlots = 16;
11801251 break;
11811252 case 1920:
11821253 case 960:
1254 case 480:
11831255 timeSlots = 15;
11841256 break;
11851257 case 1152:
12201292
12211293 tran_fc = params->tran_fc;
12221294
1223 if (tran_fc == 0)
1224 tran_fc = fixMin (5000, FDKsbrEnc_getSbrStartFreqRAW (sbrHeaderData->sbr_start_frequency,64,sbrConfigData->sampleFreq));
1225
1295 if (tran_fc == 0) {
1296 tran_fc = fixMin (5000, FDKsbrEnc_getSbrStartFreqRAW (sbrHeaderData->sbr_start_frequency,params->codecSettings.sampleFreq));
1297 }
12261298
12271299 tran_fc = (tran_fc*4*sbrConfigData->noQmfBands/sbrConfigData->sampleFreq + 1)>>1;
12281300
12321304 } else
12331305 {
12341306 frameShift = 0;
1235 switch (params->sbrFrameSize) {
1307 switch (timeSlots) {
12361308 /* The factor of 2 is by definition. */
1237 case 2048: tran_off = 8 + FRAME_MIDDLE_SLOT_2048 * timeStep; break;
1238 case 1920: tran_off = 7 + FRAME_MIDDLE_SLOT_1920 * timeStep; break;
1239 default: return 1; break;
1309 case NUMBER_TIME_SLOTS_2048: tran_off = 8 + FRAME_MIDDLE_SLOT_2048 * timeStep; break;
1310 case NUMBER_TIME_SLOTS_1920: tran_off = 7 + FRAME_MIDDLE_SLOT_1920 * timeStep; break;
1311 default: return 1;
12401312 }
12411313 }
12421314 if ( FDKsbrEnc_InitExtractSbrEnvelope (&hEnv->sbrExtractEnvelope,
13291401 hSbrEncoder->pSBRdynamic_RAM = (UCHAR*)GetRam_SbrDynamic_RAM();
13301402 hSbrEncoder->dynamicRam = hSbrEncoder->pSBRdynamic_RAM;
13311403
1332
13331404 for (i=0; i<nElements; i++) {
13341405 hSbrEncoder->sbrElement[i] = GetRam_SbrElement(i);
13351406 if (hSbrEncoder->sbrElement[i]==NULL) {
13961467 static
13971468 INT FDKsbrEnc_Reallocate(
13981469 HANDLE_SBR_ENCODER hSbrEncoder,
1399 SBR_ELEMENT_INFO elInfo[(6)],
1470 SBR_ELEMENT_INFO elInfo[(8)],
14001471 const INT noElements)
14011472 {
14021473 INT totalCh = 0;
14611532 AUDIO_OBJECT_TYPE aot,
14621533 int nBitstrDelay,
14631534 int nElement,
1464 ULONG statesInitFlag
1535 const int headerPeriod,
1536 ULONG statesInitFlag,
1537 int fTimeDomainDownsampling
14651538 ,UCHAR *dynamic_RAM
14661539 )
14671540 {
14951568 hSbrElement->sbrConfigData.sbrSyntaxFlags |= SBR_SYNTAX_CRC;
14961569 }
14971570
1498 hSbrElement->sbrConfigData.noQmfBands = QMF_CHANNELS;
1499 hSbrElement->sbrConfigData.noQmfSlots = params->sbrFrameSize/hSbrElement->sbrConfigData.noQmfBands;
1571 hSbrElement->sbrConfigData.noQmfBands = QMF_CHANNELS>>(2-params->downSampleFactor);
1572 switch (hSbrElement->sbrConfigData.noQmfBands)
1573 {
1574 case 64: hSbrElement->sbrConfigData.noQmfSlots = params->sbrFrameSize>>6;
1575 break;
1576 case 32: hSbrElement->sbrConfigData.noQmfSlots = params->sbrFrameSize>>5;
1577 break;
1578 default: hSbrElement->sbrConfigData.noQmfSlots = params->sbrFrameSize>>6;
1579 return(2);
1580 }
15001581
15011582 FDKinitBitStream(&hSbrElement->CmonData.sbrBitbuf, bitstreamBuffer, MAX_PAYLOAD_SIZE*sizeof(UCHAR), 0, BS_WRITER);
15021583
15121593
15131594 hSbrElement->sbrConfigData.frameSize = params->sbrFrameSize;
15141595
1515 /* implicit rule for sampleRateMode */
1516 /* run in "multirate" mode where sbr fs is 2 * codec fs */
1517 hSbrElement->sbrHeaderData.sampleRateMode = DUAL_RATE;
1518 hSbrElement->sbrConfigData.sampleFreq = 2 * params->codecSettings.sampleFreq;
1596 hSbrElement->sbrConfigData.sampleFreq = params->downSampleFactor * params->codecSettings.sampleFreq;
15191597
15201598 hSbrElement->sbrBitstreamData.CountSendHeaderData = 0;
15211599 if (params->SendHeaderDataTime > 0 ) {
15221600
1523 hSbrElement->sbrBitstreamData.NrSendHeaderData = (INT)(params->SendHeaderDataTime * hSbrElement->sbrConfigData.sampleFreq
1601 if (headerPeriod==-1) {
1602
1603 hSbrElement->sbrBitstreamData.NrSendHeaderData = (INT)(params->SendHeaderDataTime * hSbrElement->sbrConfigData.sampleFreq
15241604 / (1000 * hSbrElement->sbrConfigData.frameSize));
1525 hSbrElement->sbrBitstreamData.NrSendHeaderData = fixMax(hSbrElement->sbrBitstreamData.NrSendHeaderData,1);
1605 hSbrElement->sbrBitstreamData.NrSendHeaderData = fixMax(hSbrElement->sbrBitstreamData.NrSendHeaderData,1);
1606 }
1607 else {
1608 /* assure header period at least once per second */
1609 hSbrElement->sbrBitstreamData.NrSendHeaderData = fixMin(fixMax(headerPeriod,1),(hSbrElement->sbrConfigData.sampleFreq/hSbrElement->sbrConfigData.frameSize));
1610 }
15261611 }
15271612 else {
15281613 hSbrElement->sbrBitstreamData.NrSendHeaderData = 0;
15831668 /* init freq band table */
15841669 if(updateFreqBandTable(&hSbrElement->sbrConfigData,
15851670 &hSbrElement->sbrHeaderData,
1586 hSbrElement->sbrConfigData.noQmfBands))
1671 params->downSampleFactor
1672 ))
15871673 {
15881674 return(1);
15891675 }
16231709 hSbrElement->sbrConfigData.noQmfBands,
16241710 hSbrElement->sbrConfigData.noQmfBands,
16251711 qmfFlags );
1712 if (0!=err) {
1713 return err;
1714 }
16261715 }
16271716
16281717 /* */
16441733 {
16451734 INT temp;
16461735
1647 temp = (1024*DOWN_SMPL_FAC);
1736 temp = (2048);
16481737 temp += 1024 + MAX_SAMPLE_DELAY;
16491738 temp *= noChannels;
16501739 temp *= sizeof(INT_PCM);
16761765 1
16771766 ))
16781767 return -1;
1679 sbrEncoder_UpdateBuffers(hEnvEnc, timeBuffer);
1680 }
1768 }
1769 sbrEncoder_UpdateBuffers(hEnvEnc, timeBuffer);
16811770 }
16821771 return 0;
16831772 }
17081797 return newBitRate;
17091798 }
17101799
1800 UINT sbrEncoder_IsSingleRatePossible(AUDIO_OBJECT_TYPE aot)
1801 {
1802 UINT isPossible=(AOT_PS==aot)?0:1;
1803 return isPossible;
1804 }
17111805
17121806 INT sbrEncoder_Init(
1713 HANDLE_SBR_ENCODER hSbrEncoder,
1714 SBR_ELEMENT_INFO elInfo[(6)],
1715 int noElements,
1716 INT_PCM *inputBuffer,
1717 INT *coreBandwidth,
1718 INT *inputBufferOffset,
1719 INT *numChannels,
1720 INT *sampleRate,
1721 INT *frameLength,
1722 AUDIO_OBJECT_TYPE *aot,
1723 int *delay,
1724 int transformFactor,
1725 ULONG statesInitFlag
1726 )
1807 HANDLE_SBR_ENCODER hSbrEncoder,
1808 SBR_ELEMENT_INFO elInfo[(8)],
1809 int noElements,
1810 INT_PCM *inputBuffer,
1811 INT *coreBandwidth,
1812 INT *inputBufferOffset,
1813 INT *numChannels,
1814 INT *coreSampleRate,
1815 UINT *downSampleFactor,
1816 INT *frameLength,
1817 AUDIO_OBJECT_TYPE aot,
1818 int *delay,
1819 int transformFactor,
1820 const int headerPeriod,
1821 ULONG statesInitFlag
1822 )
17271823 {
17281824 HANDLE_ERROR_INFO errorInfo = noError;
1729 sbrConfiguration sbrConfig[(6)];
1825 sbrConfiguration sbrConfig[(8)];
17301826 INT error = 0;
17311827 INT lowestBandwidth;
17321828 /* Save input parameters */
1733 INT inputSampleRate = *sampleRate;
1829 INT inputSampleRate = *coreSampleRate;
17341830 int coreFrameLength = *frameLength;
17351831 int inputBandWidth = *coreBandwidth;
17361832 int inputChannels = *numChannels;
17381834 int downsampledOffset = 0;
17391835 int sbrOffset = 0;
17401836 int downsamplerDelay = 0;
1741 int downsample = 0;
1837 int timeDomainDownsample = 0;
17421838 int nBitstrDelay = 0;
1743 int lowestSbrStartFreq, lowestSbrStopFreq;
1839 int highestSbrStartFreq, highestSbrStopFreq;
17441840 int lowDelay = 0;
17451841 int usePs = 0;
17461842
17471843 /* check whether SBR setting is available for the current encoder configuration (bitrate, samplerate) */
1748 if ( (*aot==AOT_PS) || (*aot==AOT_MP2_PS) || (*aot==AOT_DABPLUS_PS) || (*aot==AOT_DRM_MPEG_PS) ) {
1844 if (!sbrEncoder_IsSingleRatePossible(aot)) {
1845 *downSampleFactor = 2;
1846 }
1847
1848
1849
1850 if ( (aot==AOT_PS) || (aot==AOT_MP2_PS) || (aot==AOT_DABPLUS_PS) || (aot==AOT_DRM_MPEG_PS) ) {
17491851 usePs = 1;
17501852 }
1751 if ( (*aot==AOT_ER_AAC_ELD) ) {
1853 if ( (aot==AOT_ER_AAC_ELD) ) {
17521854 lowDelay = 1;
17531855 }
1754 else if ( (*aot==AOT_ER_AAC_LD) ) {
1856 else if ( (aot==AOT_ER_AAC_LD) ) {
17551857 error = 1;
17561858 goto bail;
17571859 }
17661868 /* core encoder gets downmixed mono signal */
17671869 *numChannels = 1;
17681870 } else {
1769 switch (*aot) {
1770 case AOT_MP2_PS:
1771 *aot = AOT_MP2_SBR;
1772 break;
1773 case AOT_DABPLUS_PS:
1774 *aot = AOT_DABPLUS_SBR;
1775 break;
1776 case AOT_DRM_MPEG_PS:
1777 *aot = AOT_DRM_SBR;
1778 break;
1779 case AOT_PS:
1780 default:
1781 *aot = AOT_SBR;
1782 }
1783 usePs = 0;
1871 error = 1;
1872 goto bail;
17841873 }
17851874 } /* usePs */
17861875
1787 /* check whether SBR setting is available for the current encoder configuration (bitrate, samplerate) */
1876 /* set the core's sample rate */
1877 switch (*downSampleFactor) {
1878 case 1:
1879 *coreSampleRate = inputSampleRate;
1880 break;
1881 case 2:
1882 *coreSampleRate = inputSampleRate>>1;
1883 break;
1884 default:
1885 *coreSampleRate = inputSampleRate>>1;
1886 return 0; /* return error */
1887 }
1888
1889 /* check whether SBR setting is available for the current encoder configuration (bitrate, coreSampleRate) */
17881890 {
17891891 int delayDiff = 0;
17901892 int el, coreEl;
17971899 continue;
17981900 }
17991901 /* check if desired configuration is available */
1800 if ( !FDKsbrEnc_IsSbrSettingAvail (elInfo[coreEl].bitRate, 0, elInfo[coreEl].nChannelsInEl, inputSampleRate, *aot) )
1902 if ( !FDKsbrEnc_IsSbrSettingAvail (elInfo[coreEl].bitRate, 0, elInfo[coreEl].nChannelsInEl, inputSampleRate, *coreSampleRate, aot) )
18011903 {
1802 /* otherwise - change to AAC-LC */
1803 switch (*aot) {
1804 case AOT_MP2_SBR:
1805 case AOT_MP2_PS:
1806 *aot = AOT_MP2_AAC_LC;
1807 break;
1808 case AOT_DABPLUS_SBR:
1809 case AOT_DABPLUS_PS:
1810 *aot = AOT_DABPLUS_AAC_LC;
1811 break;
1812 case AOT_DRM_SBR:
1813 case AOT_DRM_MPEG_PS:
1814 *aot = AOT_DRM_AAC;
1815 break;
1816 case AOT_ER_AAC_ELD:
1817 break;
1818 case AOT_SBR:
1819 case AOT_PS:
1820 default:
1821 *aot = AOT_AAC_LC;
1822 }
18231904 error = 1;
18241905 goto bail;
18251906 }
18261907 }
18271908
1828 *sampleRate /= DOWN_SMPL_FAC;
1829
18301909 /* Determine Delay balancing and new encoder delay */
18311910 if (lowDelay) {
1832 downsample = 1; /* activate downsampler */
1833 delayDiff = (*delay*DOWN_SMPL_FAC) + DELAY_ELD2SBR(coreFrameLength);
1834 *delay = DELAY_ELDSBR(coreFrameLength);
1911 {
1912 delayDiff = (*delay * *downSampleFactor) + DELAY_ELD2SBR(coreFrameLength,*downSampleFactor);
1913 *delay = DELAY_ELDSBR(coreFrameLength,*downSampleFactor);
1914 }
18351915 }
18361916 else if (usePs) {
1837 delayDiff = (*delay*DOWN_SMPL_FAC) + DELAY_AAC2PS(coreFrameLength);
1838 *delay = DELAY_PS(coreFrameLength);
1917 delayDiff = (*delay * *downSampleFactor) + DELAY_AAC2PS(coreFrameLength,*downSampleFactor);
1918 *delay = DELAY_PS(coreFrameLength,*downSampleFactor);
18391919 }
18401920 else {
1841 downsample = 1; /* activate downsampler */
1842 delayDiff = (*delay*DOWN_SMPL_FAC) + DELAY_AAC2SBR(coreFrameLength);
1843 *delay = DELAY_SBR(coreFrameLength);
1844 }
1921 delayDiff = DELAY_AAC2SBR(coreFrameLength,*downSampleFactor);
1922 delayDiff += (*delay * *downSampleFactor);
1923 *delay = DELAY_SBR(coreFrameLength,*downSampleFactor);
1924 }
1925
1926 if (!usePs) {
1927 timeDomainDownsample = *downSampleFactor-1; /* activate time domain downsampler when downSampleFactor is != 1 */
1928 }
1929
18451930
18461931 /* Take care about downsampled data bound to the SBR path */
1847 if (!downsample && delayDiff > 0) {
1932 if (!timeDomainDownsample && delayDiff > 0) {
18481933 /*
18491934 * We must tweak the balancing into a situation where the downsampled path
18501935 * is the one to be delayed, because delaying the QMF domain input, also delays
18531938 while ( delayDiff > 0 )
18541939 {
18551940 /* Encoder delay increases */
1856 *delay += coreFrameLength*DOWN_SMPL_FAC;
1857 /* Add one frame delay to SBR path */
1858 delayDiff -= coreFrameLength*DOWN_SMPL_FAC;
1941 {
1942 *delay += coreFrameLength * *downSampleFactor;
1943 /* Add one frame delay to SBR path */
1944 delayDiff -= coreFrameLength * *downSampleFactor;
1945 }
18591946 nBitstrDelay += 1;
18601947 }
1861 } else {
1948 } else
1949 {
18621950 *delay += fixp_abs(delayDiff);
18631951 }
18641952
18661954 /* Delay AAC data */
18671955 delayDiff = -delayDiff;
18681956 /* Multiply downsampled offset by AAC core channels. Divide by 2 because of half samplerate of downsampled data. */
1869 downsampledOffset = (delayDiff*(*numChannels))/DOWN_SMPL_FAC;
1957 FDK_ASSERT(*downSampleFactor>0 && *downSampleFactor<=2);
1958 downsampledOffset = (delayDiff*(*numChannels))>>(*downSampleFactor-1);
18701959 sbrOffset = 0;
18711960 } else {
18721961 /* Delay SBR input */
1873 if ( delayDiff > (int)coreFrameLength*DOWN_SMPL_FAC )
1962 if ( delayDiff > (int)coreFrameLength * (int)*downSampleFactor )
18741963 {
18751964 /* Do bitstream frame-wise delay balancing if we have more than SBR framelength samples delay difference */
1876 delayDiff -= coreFrameLength*DOWN_SMPL_FAC;
1965 delayDiff -= coreFrameLength * *downSampleFactor;
18771966 nBitstrDelay = 1;
18781967 }
18791968 /* Multiply input offset by input channels */
18801969 sbrOffset = delayDiff*(*numChannels);
18811970 downsampledOffset = 0;
18821971 }
1883
1884 hSbrEncoder->nBitstrDelay = nBitstrDelay;
1885 hSbrEncoder->nChannels = *numChannels;
1886 hSbrEncoder->frameSize = *frameLength*DOWN_SMPL_FAC;
1887 hSbrEncoder->fTimeDomainDownsampling = downsample;
1888 hSbrEncoder->estimateBitrate = 0;
1889 hSbrEncoder->inputDataDelay = 0;
1972 hSbrEncoder->nBitstrDelay = nBitstrDelay;
1973 hSbrEncoder->nChannels = *numChannels;
1974 hSbrEncoder->frameSize = coreFrameLength * *downSampleFactor;
1975 hSbrEncoder->fTimeDomainDownsampling = timeDomainDownsample;
1976 hSbrEncoder->downSampleFactor = *downSampleFactor;
1977 hSbrEncoder->estimateBitrate = 0;
1978 hSbrEncoder->inputDataDelay = 0;
18901979
18911980
18921981 /* Open SBR elements */
18931982 el = -1;
1894 lowestSbrStartFreq = lowestSbrStopFreq = 9999;
1983 highestSbrStartFreq = highestSbrStopFreq = 0;
18951984 lowestBandwidth = 99999;
18961985
18971986 /* Loop through each core encoder element and get a matching SBR element config */
19142003 /*
19152004 * Init sbrConfig structure
19162005 */
1917 FDKsbrEnc_InitializeSbrDefaults ( &sbrConfig[el],
1918 DOWN_SMPL_FAC,
1919 coreFrameLength);
2006 if ( ! FDKsbrEnc_InitializeSbrDefaults ( &sbrConfig[el],
2007 *downSampleFactor,
2008 coreFrameLength
2009 ) )
2010 {
2011 error = 1;
2012 goto bail;
2013 }
2014
19202015 /*
19212016 * Modify sbrConfig structure according to Element parameters
19222017 */
1923 FDKsbrEnc_AdjustSbrSettings ( &sbrConfig[el],
1924 elInfo[coreEl].bitRate,
1925 elInfo[coreEl].nChannelsInEl,
1926 *sampleRate,
1927 transformFactor,
1928 24000,
1929 0,
1930 0, /* useSpeechConfig */
1931 0, /* lcsMode */
1932 usePs, /* bParametricStereo */
1933 *aot);
2018 if ( ! FDKsbrEnc_AdjustSbrSettings (&sbrConfig[el],
2019 elInfo[coreEl].bitRate,
2020 elInfo[coreEl].nChannelsInEl,
2021 *coreSampleRate,
2022 inputSampleRate,
2023 transformFactor,
2024 24000,
2025 0,
2026 0, /* useSpeechConfig */
2027 0, /* lcsMode */
2028 usePs, /* bParametricStereo */
2029 aot) )
2030 {
2031 error = 1;
2032 goto bail;
2033 }
19342034
19352035 /* Find common frequency border for all SBR elements */
1936 lowestSbrStartFreq = fixMin(lowestSbrStartFreq, sbrConfig[el].startFreq);
1937 lowestSbrStopFreq = fixMin(lowestSbrStopFreq, sbrConfig[el].stopFreq);
1938
2036 highestSbrStartFreq = fixMax(highestSbrStartFreq, sbrConfig[el].startFreq);
2037 highestSbrStopFreq = fixMax(highestSbrStopFreq, sbrConfig[el].stopFreq);
19392038
19402039 } /* first element loop */
19412040
19512050 int bandwidth = *coreBandwidth;
19522051
19532052 /* Use lowest common bandwidth */
1954 sbrConfig[el].startFreq = lowestSbrStartFreq;
1955 sbrConfig[el].stopFreq = lowestSbrStopFreq;
2053 sbrConfig[el].startFreq = highestSbrStartFreq;
2054 sbrConfig[el].stopFreq = highestSbrStopFreq;
19562055
19572056 /* initialize SBR element, and get core bandwidth */
19582057 error = FDKsbrEnc_EnvInit(hSbrEncoder->sbrElement[el],
19592058 &sbrConfig[el],
19602059 &bandwidth,
1961 *aot,
2060 aot,
19622061 nBitstrDelay,
19632062 el,
1964 statesInitFlag
2063 headerPeriod,
2064 statesInitFlag,
2065 hSbrEncoder->fTimeDomainDownsampling
19652066 ,hSbrEncoder->dynamicRam
19662067 );
19672068
19682069 if (error != 0) {
2070 error = 2;
19692071 goto bail;
19702072 }
19712073
19872089
19882090 for (ch=0; ch<hSbrEl->elInfo.nChannelsInEl; ch++)
19892091 {
1990 FDKaacEnc_InitDownsampler (&hSbrEl->sbrChannel[ch]->downSampler, Wc, DOWN_SMPL_FAC);
2092 FDKaacEnc_InitDownsampler (&hSbrEl->sbrChannel[ch]->downSampler, Wc, *downSampleFactor);
2093 FDK_ASSERT (hSbrEl->sbrChannel[ch]->downSampler.delay <=MAX_DS_FILTER_DELAY);
19912094 }
19922095
1993 FDK_ASSERT (hSbrEl->sbrChannel[0]->downSampler.delay <=MAX_DS_FILTER_DELAY && hSbrEl->sbrChannel[0]->downSampler.delay <=MAX_DS_FILTER_DELAY);
19942096 downsamplerDelay = hSbrEl->sbrChannel[0]->downSampler.delay;
19952097 } /* third element loop */
19962098
19972099 /* lfe */
1998 FDKaacEnc_InitDownsampler (&hSbrEncoder->lfeDownSampler, 0, DOWN_SMPL_FAC);
2100 FDKaacEnc_InitDownsampler (&hSbrEncoder->lfeDownSampler, 0, *downSampleFactor);
19992101
20002102 /* Add the resampler additional delay to get the final delay and buffer offset values. */
2001 if (sbrOffset > 0 || downsampledOffset <= ((downsamplerDelay * (*numChannels))/DOWN_SMPL_FAC)) {
2103 if (sbrOffset > 0 || downsampledOffset <= ((downsamplerDelay * (*numChannels))>>(*downSampleFactor-1))) {
20022104 sbrOffset += (downsamplerDelay - downsampledOffset) * (*numChannels) ;
20032105 *delay += downsamplerDelay - downsampledOffset;
20042106 downsampledOffset = 0;
20052107 } else {
2006 downsampledOffset -= (downsamplerDelay * (*numChannels))/DOWN_SMPL_FAC;
2108 downsampledOffset -= (downsamplerDelay * (*numChannels))>>(*downSampleFactor-1);
20072109 sbrOffset = 0;
20082110 }
20092111
20102112 hSbrEncoder->inputDataDelay = downsamplerDelay;
20112113 }
2012
20132114
20142115 /* Assign core encoder Bandwidth */
20152116 *coreBandwidth = lowestBandwidth;
20242125 FDK_ASSERT(hSbrEncoder->noElements == 1);
20252126 INT psTuningTableIdx = getPsTuningTableIndex(elInfo[0].bitRate, NULL);
20262127
2027 psEncConfig.frameSize = *frameLength; //sbrConfig.sbrFrameSize;
2128 psEncConfig.frameSize = coreFrameLength; //sbrConfig.sbrFrameSize;
20282129 psEncConfig.qmfFilterMode = 0;
20292130 psEncConfig.sbrPsDelay = 0;
20302131
20362137
20372138 /* calculation is not quite linear, increased number of envelopes causes more bits */
20382139 /* assume avg. 50 bits per frame for 10 stereo bands / 1 envelope configuration */
2039 hSbrEncoder->estimateBitrate += ( (((*sampleRate) * 5 * psEncConfig.nStereoBands * psEncConfig.maxEnvelopes) / hSbrEncoder->frameSize));
2140 hSbrEncoder->estimateBitrate += ( (((*coreSampleRate) * 5 * psEncConfig.nStereoBands * psEncConfig.maxEnvelopes) / hSbrEncoder->frameSize));
20402141
20412142 } else {
20422143 error = ERROR(CDI, "Invalid ps tuning table index.");
20652166 errorInfo = handBack(errorInfo);
20662167 }
20672168 }
2169
2170 /* QMF analysis + Hybrid analysis + Hybrid synthesis + QMF synthesis + downsampled input buffer delay */
2171 hSbrEncoder->inputDataDelay = (64*10/2) + (6*64) + (0) + (64*10/2-64+1) + ((*downSampleFactor)*downsampledOffset);
20682172 }
20692173
20702174 hSbrEncoder->downsampledOffset = downsampledOffset;
2071 hSbrEncoder->downmixSize = coreFrameLength*(*numChannels);
2175 {
2176 hSbrEncoder->downmixSize = coreFrameLength*(*numChannels);
2177 }
2178
20722179 hSbrEncoder->bufferOffset = sbrOffset;
20732180 /* Delay Compensation: fill bitstream delay buffer with zero input signal */
20742181 if ( hSbrEncoder->nBitstrDelay > 0 )
20792186 }
20802187
20812188 /* Set Output frame length */
2082 *frameLength = coreFrameLength*DOWN_SMPL_FAC;
2189 *frameLength = coreFrameLength * *downSampleFactor;
20832190 /* Input buffer offset */
20842191 *inputBufferOffset = fixMax(sbrOffset, downsampledOffset);
20852192
20902197
20912198 bail:
20922199 /* Restore input settings */
2093 *sampleRate = inputSampleRate;
2200 *coreSampleRate = inputSampleRate;
20942201 *frameLength = coreFrameLength;
20952202 *numChannels = inputChannels;
20962203 *coreBandwidth = inputBandWidth;
21032210 sbrEncoder_EncodeFrame( HANDLE_SBR_ENCODER hSbrEncoder,
21042211 INT_PCM *samples,
21052212 UINT timeInStride,
2106 UINT sbrDataBits[(6)],
2107 UCHAR sbrData[(6)][MAX_PAYLOAD_SIZE]
2213 UINT sbrDataBits[(8)],
2214 UCHAR sbrData[(8)][MAX_PAYLOAD_SIZE]
21082215 )
21092216 {
21102217 INT error;
21282235 }
21292236 }
21302237
2131 if ( (hSbrEncoder->lfeChIdx!=-1) && (hSbrEncoder->fTimeDomainDownsampling) )
2132 {
2238 if ( ( hSbrEncoder->lfeChIdx!=-1) && (hSbrEncoder->downSampleFactor > 1) )
2239 { /* lfe downsampler */
21332240 INT nOutSamples;
21342241
21352242 FDKaacEnc_Downsample(&hSbrEncoder->lfeDownSampler,
21392246 samples + hSbrEncoder->downsampledOffset + hSbrEncoder->lfeChIdx,
21402247 &nOutSamples,
21412248 hSbrEncoder->nChannels);
2142 } /* lfe downsampler */
2249
2250
2251 }
21432252
21442253 return 0;
21452254 }
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
106106 in module sbr_ram and sbr rom
107107 */
108108 C_ALLOC_MEM (Ram_SbrEncoder, SBR_ENCODER, 1)
109 C_ALLOC_MEM2(Ram_SbrChannel, SBR_CHANNEL, 1, (6))
110 C_ALLOC_MEM2(Ram_SbrElement, SBR_ELEMENT, 1, (6))
109 C_ALLOC_MEM2(Ram_SbrChannel, SBR_CHANNEL, 1, (8))
110 C_ALLOC_MEM2(Ram_SbrElement, SBR_ELEMENT, 1, (8))
111111
112112 /*! Filter states for QMF-analysis. <br>
113113 Dimension: #MAXNRSBRCHANNELS * #SBR_QMF_FILTER_LENGTH
114114 */
115 C_AALLOC_MEM2_L (Ram_Sbr_QmfStatesAnalysis, FIXP_QAS, QMF_FILTER_LENGTH, (6), SECT_DATA_L1)
115 C_AALLOC_MEM2_L (Ram_Sbr_QmfStatesAnalysis, FIXP_QAS, QMF_FILTER_LENGTH, (8), SECT_DATA_L1)
116116
117117
118118 /*! Matrix holding the quota values for all estimates, all channels
119119 Dimension #MAXNRSBRCHANNELS * +#SBR_QMF_CHANNELS* #MAX_NO_OF_ESTIMATES
120120 */
121 C_ALLOC_MEM2_L (Ram_Sbr_quotaMatrix, FIXP_DBL, (MAX_NO_OF_ESTIMATES*QMF_CHANNELS), (6), SECT_DATA_L1)
121 C_ALLOC_MEM2_L (Ram_Sbr_quotaMatrix, FIXP_DBL, (MAX_NO_OF_ESTIMATES*QMF_CHANNELS), (8), SECT_DATA_L1)
122122
123123 /*! Matrix holding the sign values for all estimates, all channels
124124 Dimension #MAXNRSBRCHANNELS * +#SBR_QMF_CHANNELS* #MAX_NO_OF_ESTIMATES
125125 */
126 C_ALLOC_MEM2 (Ram_Sbr_signMatrix, INT, (MAX_NO_OF_ESTIMATES*QMF_CHANNELS), (6))
126 C_ALLOC_MEM2 (Ram_Sbr_signMatrix, INT, (MAX_NO_OF_ESTIMATES*QMF_CHANNELS), (8))
127127
128128 /*! Frequency band table (low res) <br>
129129 Dimension #MAX_FREQ_COEFFS/2+1
130130 */
131 C_ALLOC_MEM2 (Ram_Sbr_freqBandTableLO, UCHAR, (MAX_FREQ_COEFFS/2+1), (6))
131 C_ALLOC_MEM2 (Ram_Sbr_freqBandTableLO, UCHAR, (MAX_FREQ_COEFFS/2+1), (8))
132132
133133 /*! Frequency band table (high res) <br>
134134 Dimension #MAX_FREQ_COEFFS +1
135135 */
136 C_ALLOC_MEM2 (Ram_Sbr_freqBandTableHI, UCHAR, (MAX_FREQ_COEFFS+1), (6))
136 C_ALLOC_MEM2 (Ram_Sbr_freqBandTableHI, UCHAR, (MAX_FREQ_COEFFS+1), (8))
137137
138138 /*! vk matser table <br>
139139 Dimension #MAX_FREQ_COEFFS +1
140140 */
141 C_ALLOC_MEM2 (Ram_Sbr_v_k_master, UCHAR, (MAX_FREQ_COEFFS+1), (6))
141 C_ALLOC_MEM2 (Ram_Sbr_v_k_master, UCHAR, (MAX_FREQ_COEFFS+1), (8))
142142
143143
144144 /*
148148 /*! sbr_detectionVectors <br>
149149 Dimension #MAX_NUM_CHANNELS*#MAX_NO_OF_ESTIMATES*#MAX_FREQ_COEFFS]
150150 */
151 C_ALLOC_MEM2 (Ram_Sbr_detectionVectors, UCHAR, (MAX_NO_OF_ESTIMATES*MAX_FREQ_COEFFS), (6))
151 C_ALLOC_MEM2 (Ram_Sbr_detectionVectors, UCHAR, (MAX_NO_OF_ESTIMATES*MAX_FREQ_COEFFS), (8))
152152
153153 /*! sbr_prevCompVec[ <br>
154154 Dimension #MAX_NUM_CHANNELS*#MAX_FREQ_COEFFS]
155155 */
156 C_ALLOC_MEM2 (Ram_Sbr_prevEnvelopeCompensation, UCHAR, MAX_FREQ_COEFFS, (6))
156 C_ALLOC_MEM2 (Ram_Sbr_prevEnvelopeCompensation, UCHAR, MAX_FREQ_COEFFS, (8))
157157 /*! sbr_guideScfb[ <br>
158158 Dimension #MAX_NUM_CHANNELS*#MAX_FREQ_COEFFS]
159159 */
160 C_ALLOC_MEM2 (Ram_Sbr_guideScfb, UCHAR, MAX_FREQ_COEFFS, (6))
160 C_ALLOC_MEM2 (Ram_Sbr_guideScfb, UCHAR, MAX_FREQ_COEFFS, (8))
161161
162162 /*! sbr_guideVectorDetected <br>
163163 Dimension #MAX_NUM_CHANNELS*#MAX_NO_OF_ESTIMATES*#MAX_FREQ_COEFFS]
164164 */
165 C_ALLOC_MEM2 (Ram_Sbr_guideVectorDetected, UCHAR, (MAX_NO_OF_ESTIMATES*MAX_FREQ_COEFFS), (6))
166 C_ALLOC_MEM2 (Ram_Sbr_guideVectorDiff, FIXP_DBL, (MAX_NO_OF_ESTIMATES*MAX_FREQ_COEFFS), (6))
167 C_ALLOC_MEM2 (Ram_Sbr_guideVectorOrig, FIXP_DBL, (MAX_NO_OF_ESTIMATES*MAX_FREQ_COEFFS), (6))
165 C_ALLOC_MEM2 (Ram_Sbr_guideVectorDetected, UCHAR, (MAX_NO_OF_ESTIMATES*MAX_FREQ_COEFFS), (8))
166 C_ALLOC_MEM2 (Ram_Sbr_guideVectorDiff, FIXP_DBL, (MAX_NO_OF_ESTIMATES*MAX_FREQ_COEFFS), (8))
167 C_ALLOC_MEM2 (Ram_Sbr_guideVectorOrig, FIXP_DBL, (MAX_NO_OF_ESTIMATES*MAX_FREQ_COEFFS), (8))
168168
169169 /*
170170 Static Parametric Stereo memory
190190 /*! Energy buffer for envelope extraction <br>
191191 Dimension #MAXNRSBRCHANNELS * +#SBR_QMF_SLOTS * #SBR_QMF_CHANNELS
192192 */
193 C_ALLOC_MEM2 (Ram_Sbr_envYBuffer, FIXP_DBL, (QMF_MAX_TIME_SLOTS/2 * QMF_CHANNELS), (6))
193 C_ALLOC_MEM2 (Ram_Sbr_envYBuffer, FIXP_DBL, (QMF_MAX_TIME_SLOTS/2 * QMF_CHANNELS), (8))
194194
195195 FIXP_DBL* GetRam_Sbr_envYBuffer (int n, UCHAR* dynamic_RAM) {
196196 FDK_ASSERT(dynamic_RAM!=0);
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
505505 /*
506506 tuningTable
507507 */
508 const sbrTuningTable_t sbrTuningTable[SBRENC_TUNING_SIZE] =
509 {
510
511 /*** AAC ***/
508 const sbrTuningTable_t sbrTuningTable[] =
509 {
510 /* Some of the low bitrates are commented out here, this is because the
511 encoder could lose frames at those bitrates and throw an error because
512 it has insufficient bits to encode for some test items.
513 */
514
515 /*** HE-AAC section ***/
512516 /* sf,sfsp,sf,sfsp,nnb,nfo,saml,SM,FS*/
513517
514518 /*** mono ***/
515519
516520 /* 8/16 kHz dual rate */
517 { 8000, 10000, 8000, 1, 7, 6, 11,10, 1, 0, 6, SBR_MONO, 3 },
518 { 10000, 12000, 8000, 1, 11, 7, 13,12, 1, 0, 6, SBR_MONO, 3 },
519 { 12000, 16001, 8000, 1, 14,10, 13,13, 1, 0, 6, SBR_MONO, 3 },
520 { 16000, 24000, 8000, 1, 14,10, 14,14, 2, 0, 3, SBR_MONO, 2 }, /* placebo */
521 { 24000, 32000, 8000, 1, 14,10, 14,14, 2, 0, 3, SBR_MONO, 2 }, /* placebo */
522 { 32000, 48001, 8000, 1, 14,11, 15,15, 2, 0, 3, SBR_MONO, 2 }, /* placebo */ /* bitrates higher than 48000 not supported by AAC core */
521 { CODEC_AAC, 8000, 10000, 8000, 1, 7, 6, 11,10, 1, 0, 6, SBR_MONO, 3 },
522 { CODEC_AAC, 10000, 12000, 8000, 1, 11, 7, 13,12, 1, 0, 6, SBR_MONO, 3 },
523 { CODEC_AAC, 12000, 16001, 8000, 1, 14,10, 13,13, 1, 0, 6, SBR_MONO, 3 },
524 { CODEC_AAC, 16000, 24000, 8000, 1, 14,10, 14,14, 2, 0, 3, SBR_MONO, 2 }, /* placebo */
525 { CODEC_AAC, 24000, 32000, 8000, 1, 14,10, 14,14, 2, 0, 3, SBR_MONO, 2 }, /* placebo */
526 { CODEC_AAC, 32000, 48001, 8000, 1, 14,11, 15,15, 2, 0, 3, SBR_MONO, 2 }, /* placebo */ /* bitrates higher than 48000 not supported by AAC core */
523527
524528 /* 11/22 kHz dual rate */
525 { 8000, 10000, 11025, 1, 5, 4, 6, 6, 1, 0, 6, SBR_MONO, 3 },
526 { 10000, 12000, 11025, 1, 8, 5, 12, 9, 1, 0, 6, SBR_MONO, 3 },
527 { 12000, 16000, 11025, 1, 12, 8, 13, 8, 1, 0, 6, SBR_MONO, 3 },
528 { 16000, 20000, 11025, 1, 12, 8, 13, 8, 1, 0, 6, SBR_MONO, 3 }, /* at such "high" bitrates it's better to upsample the input */
529 { 20000, 24001, 11025, 1, 13, 9, 13, 8, 1, 0, 6, SBR_MONO, 3 }, /* signal by a factor of 2 before sending it into the encoder */
530 { 24000, 32000, 11025, 1, 14,10, 14, 9, 2, 0, 3, SBR_MONO, 2 }, /* placebo */
531 { 32000, 48000, 11025, 1, 15,11, 15,10, 2, 0, 3, SBR_MONO, 2 }, /* placebo */
532 { 48000, 64001, 11025, 1, 15,11, 15,10, 2, 0, 3, SBR_MONO, 1 }, /* placebo */
529 { CODEC_AAC, 8000, 10000, 11025, 1, 5, 4, 6, 6, 1, 0, 6, SBR_MONO, 3 },
530 { CODEC_AAC, 10000, 12000, 11025, 1, 8, 5, 12, 9, 1, 0, 6, SBR_MONO, 3 },
531 { CODEC_AAC, 12000, 16000, 11025, 1, 12, 8, 13, 8, 1, 0, 6, SBR_MONO, 3 },
532 { CODEC_AAC, 16000, 20000, 11025, 1, 12, 8, 13, 8, 1, 0, 6, SBR_MONO, 3 }, /* at such "high" bitrates it's better to upsample the input */
533 { CODEC_AAC, 20000, 24001, 11025, 1, 13, 9, 13, 8, 1, 0, 6, SBR_MONO, 3 }, /* signal by a factor of 2 before sending it into the encoder */
534 { CODEC_AAC, 24000, 32000, 11025, 1, 14,10, 14, 9, 2, 0, 3, SBR_MONO, 2 }, /* placebo */
535 { CODEC_AAC, 32000, 48000, 11025, 1, 15,11, 15,10, 2, 0, 3, SBR_MONO, 2 }, /* placebo */
536 { CODEC_AAC, 48000, 64001, 11025, 1, 15,11, 15,10, 2, 0, 3, SBR_MONO, 1 }, /* placebo */
533537
534538 /* 12/24 kHz dual rate */
535 { 8000, 10000, 12000, 1, 4, 3, 6, 6, 1, 0, 6, SBR_MONO, 3 }, /* nominal: 8 kbit/s */
536 { 10000, 12000, 12000, 1, 7, 4, 11, 8, 1, 0, 6, SBR_MONO, 3 }, /* nominal: 10 kbit/s */
537 { 12000, 16000, 12000, 1, 11, 7, 12, 8, 1, 0, 6, SBR_MONO, 3 }, /* nominal: 12 kbit/s */
538 { 16000, 20000, 12000, 1, 11, 7, 12, 8, 1, 0, 6, SBR_MONO, 3 }, /* nominal: 16 kbit/s */ /* at such "high" bitrates it's better to upsample the input */
539 { 20000, 24001, 12000, 1, 12, 8, 12, 8, 1, 0, 6, SBR_MONO, 3 }, /* nominal: 20 kbit/s */ /* signal by a factor of 2 before sending it into the encoder */
540 { 24000, 32000, 12000, 1, 13, 9, 13, 9, 2, 0, 3, SBR_MONO, 2 }, /* placebo */
541 { 32000, 48000, 12000, 1, 14,10, 14,10, 2, 0, 3, SBR_MONO, 2 }, /* placebo */
542 { 48000, 64001, 12000, 1, 15,11, 15,11, 2, 0, 3, SBR_MONO, 1 }, /* placebo */
539 { CODEC_AAC, 8000, 10000, 12000, 1, 4, 3, 6, 6, 1, 0, 6, SBR_MONO, 3 }, /* nominal: 8 kbit/s */
540 { CODEC_AAC, 10000, 12000, 12000, 1, 7, 4, 11, 8, 1, 0, 6, SBR_MONO, 3 }, /* nominal: 10 kbit/s */
541 { CODEC_AAC, 12000, 16000, 12000, 1, 11, 7, 12, 8, 1, 0, 6, SBR_MONO, 3 }, /* nominal: 12 kbit/s */
542 { CODEC_AAC, 16000, 20000, 12000, 1, 11, 7, 12, 8, 1, 0, 6, SBR_MONO, 3 }, /* nominal: 16 kbit/s */ /* at such "high" bitrates it's better to upsample the input */
543 { CODEC_AAC, 20000, 24001, 12000, 1, 12, 8, 12, 8, 1, 0, 6, SBR_MONO, 3 }, /* nominal: 20 kbit/s */ /* signal by a factor of 2 before sending it into the encoder */
544 { CODEC_AAC, 24000, 32000, 12000, 1, 13, 9, 13, 9, 2, 0, 3, SBR_MONO, 2 }, /* placebo */
545 { CODEC_AAC, 32000, 48000, 12000, 1, 14,10, 14,10, 2, 0, 3, SBR_MONO, 2 }, /* placebo */
546 { CODEC_AAC, 48000, 64001, 12000, 1, 14,11, 15,11, 2, 0, 3, SBR_MONO, 1 }, /* placebo */
543547
544548 /* 16/32 kHz dual rate */
545 { 8000, 10000, 16000, 1, 1, 1, 0, 0, 1, 0, 6, SBR_MONO, 3 }, /* nominal: 8 kbit/s */
546 { 10000, 12000, 16000, 1, 2, 1, 6, 0, 1, 0, 6, SBR_MONO, 3 }, /* nominal: 10 kbit/s */
547 { 12000, 16000, 16000, 1, 4, 2, 6, 0, 1, 0, 6, SBR_MONO, 3 }, /* nominal: 12 kbit/s */
548 { 16000, 18000, 16000, 1, 4, 2, 8, 3, 1, 0, 6, SBR_MONO, 3 }, /* nominal: 16 kbit/s */
549 { 18000, 22000, 16000, 1, 6, 5,11, 7, 2, 0, 6, SBR_MONO, 2 }, /* nominal: 20 kbit/s */
550 { 22000, 28000, 16000, 1, 10, 9,12, 8, 2, 0, 6, SBR_MONO, 2 }, /* nominal: 24 kbit/s */
551 { 28000, 36000, 16000, 1, 12,12,13,13, 2, 0, 3, SBR_MONO, 2 }, /* nominal: 32 kbit/s */
552 { 36000, 44000, 16000, 1, 14,14,13,13, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 40 kbit/s */
553 { 44000, 64001, 16000, 1, 15,15,13,13, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 48 kbit/s */
549 { CODEC_AAC, 8000, 10000, 16000, 1, 1, 1, 0, 0, 1, 0, 6, SBR_MONO, 3 }, /* nominal: 8 kbit/s */
550 { CODEC_AAC, 10000, 12000, 16000, 1, 2, 1, 6, 0, 1, 0, 6, SBR_MONO, 3 }, /* nominal: 10 kbit/s */
551 { CODEC_AAC, 12000, 16000, 16000, 1, 4, 2, 6, 0, 1, 0, 6, SBR_MONO, 3 }, /* nominal: 12 kbit/s */
552 { CODEC_AAC, 16000, 18000, 16000, 1, 4, 2, 8, 3, 1, 0, 6, SBR_MONO, 3 }, /* nominal: 16 kbit/s */
553 { CODEC_AAC, 18000, 22000, 16000, 1, 6, 5,11, 7, 2, 0, 6, SBR_MONO, 2 }, /* nominal: 20 kbit/s */
554 { CODEC_AAC, 22000, 28000, 16000, 1, 10, 9,12, 8, 2, 0, 6, SBR_MONO, 2 }, /* nominal: 24 kbit/s */
555 { CODEC_AAC, 28000, 36000, 16000, 1, 12,12,13,13, 2, 0, 3, SBR_MONO, 2 }, /* nominal: 32 kbit/s */
556 { CODEC_AAC, 36000, 44000, 16000, 1, 14,14,13,13, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 40 kbit/s */
557 { CODEC_AAC, 44000, 64001, 16000, 1, 14,14,13,13, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 48 kbit/s */
554558
555559 /* 22.05/44.1 kHz dual rate */
556 /* { 8000, 11369, 22050, 1, 1, 1, 1, 1, 1, 0, 6, SBR_MONO, 3 }, */ /* nominal: 8 kbit/s */ /* encoder can not work stable at this extremely low bitrate */
557 { 11369, 16000, 22050, 1, 3, 1, 4, 4, 1, 0, 6, SBR_MONO, 3 }, /* nominal: 12 kbit/s */
558 { 16000, 18000, 22050, 1, 3, 1, 5, 4, 1, 0, 6, SBR_MONO, 3 }, /* nominal: 16 kbit/s */
559 { 18000, 22000, 22050, 1, 4, 4, 8, 5, 2, 0, 6, SBR_MONO, 2 }, /* nominal: 20 kbit/s */
560 { 22000, 28000, 22050, 1, 7, 6, 8, 6, 2, 0, 6, SBR_MONO, 2 }, /* nominal: 24 kbit/s */
561 { 28000, 36000, 22050, 1, 10,10, 9, 9, 2, 0, 3, SBR_MONO, 2 }, /* nominal: 32 kbit/s */
562 { 36000, 44000, 22050, 1, 11,11,10,10, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 40 kbit/s */
563 { 44000, 64001, 22050, 1, 13,13,12,12, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 48 kbit/s */
560 /* { CODEC_AAC, 8000, 11369, 22050, 1, 1, 1, 1, 1, 1, 0, 6, SBR_MONO, 3 }, */ /* nominal: 8 kbit/s */ /* encoder can not work stable at this extremely low bitrate */
561 { CODEC_AAC, 11369, 16000, 22050, 1, 3, 1, 4, 4, 1, 0, 6, SBR_MONO, 3 }, /* nominal: 12 kbit/s */
562 { CODEC_AAC, 16000, 18000, 22050, 1, 3, 1, 5, 4, 1, 0, 6, SBR_MONO, 3 }, /* nominal: 16 kbit/s */
563 { CODEC_AAC, 18000, 22000, 22050, 1, 4, 4, 8, 5, 2, 0, 6, SBR_MONO, 2 }, /* nominal: 20 kbit/s */
564 { CODEC_AAC, 22000, 28000, 22050, 1, 7, 6, 8, 6, 2, 0, 6, SBR_MONO, 2 }, /* nominal: 24 kbit/s */
565 { CODEC_AAC, 28000, 36000, 22050, 1, 10,10, 9, 9, 2, 0, 3, SBR_MONO, 2 }, /* nominal: 32 kbit/s */
566 { CODEC_AAC, 36000, 44000, 22050, 1, 11,11,10,10, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 40 kbit/s */
567 { CODEC_AAC, 44000, 64001, 22050, 1, 13,13,12,12, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 48 kbit/s */
564568
565569 /* 24/48 kHz dual rate */
566 /* { 8000, 12000, 24000, 1, 1, 1, 1, 1, 1, 0, 6, SBR_MONO, 3 }, */ /* nominal: 8 kbit/s */ /* encoder can not work stable at this extremely low bitrate */
567 { 12000, 16000, 24000, 1, 3, 1, 4, 4, 1, 0, 6, SBR_MONO, 3 }, /* nominal: 12 kbit/s */
568 { 16000, 18000, 24000, 1, 3, 1, 5, 4, 1, 0, 6, SBR_MONO, 3 }, /* nominal: 16 kbit/s */
569 { 18000, 22000, 24000, 1, 4, 3, 8, 5, 2, 0, 6, SBR_MONO, 2 }, /* nominal: 20 kbit/s */
570 { 22000, 28000, 24000, 1, 7, 6, 8, 6, 2, 0, 6, SBR_MONO, 2 }, /* nominal: 24 kbit/s */
571 { 28000, 36000, 24000, 1, 10,10, 9, 9, 2, 0, 3, SBR_MONO, 2 }, /* nominal: 32 kbit/s */
572 { 36000, 44000, 24000, 1, 11,11,10,10, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 40 kbit/s */
573 { 44000, 64001, 24000, 1, 13,13,11,11, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 48 kbit/s */
570 /* { CODEC_AAC, 8000, 12000, 24000, 1, 1, 1, 1, 1, 1, 0, 6, SBR_MONO, 3 }, */ /* nominal: 8 kbit/s */ /* encoder can not work stable at this extremely low bitrate */
571 { CODEC_AAC, 12000, 16000, 24000, 1, 3, 1, 4, 4, 1, 0, 6, SBR_MONO, 3 }, /* nominal: 12 kbit/s */
572 { CODEC_AAC, 16000, 18000, 24000, 1, 3, 1, 5, 4, 1, 0, 6, SBR_MONO, 3 }, /* nominal: 16 kbit/s */
573 { CODEC_AAC, 18000, 22000, 24000, 1, 4, 3, 8, 5, 2, 0, 6, SBR_MONO, 2 }, /* nominal: 20 kbit/s */
574 { CODEC_AAC, 22000, 28000, 24000, 1, 7, 6, 8, 6, 2, 0, 6, SBR_MONO, 2 }, /* nominal: 24 kbit/s */
575 { CODEC_AAC, 28000, 36000, 24000, 1, 10,10, 9, 9, 2, 0, 3, SBR_MONO, 2 }, /* nominal: 32 kbit/s */
576 { CODEC_AAC, 36000, 44000, 24000, 1, 11,11,10,10, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 40 kbit/s */
577 { CODEC_AAC, 44000, 64001, 24000, 1, 13,13,11,11, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 48 kbit/s */
574578
575579 /* 32/64 kHz dual rate */ /* placebo settings */
576 { 24000, 36000, 32000, 1, 4, 4, 4, 4, 2, 0, 3, SBR_MONO, 3 }, /* lowest range */
577 { 36000, 60000, 32000, 1, 7, 7, 6, 6, 2, 0, 3, SBR_MONO, 2 }, /* lowest range */
578 { 60000, 72000, 32000, 1, 9, 9, 8, 8, 2, 0, 3, SBR_MONO, 1 }, /* low range */
579 { 72000,100000, 32000, 1, 11,11,10,10, 2, 0, 3, SBR_MONO, 1 }, /* SBR sweet spot */
580 { 100000,160001, 32000, 1, 13,13,11,11, 2, 0, 3, SBR_MONO, 1 }, /* backwards compatible */
580 { CODEC_AAC, 24000, 36000, 32000, 1, 4, 4, 4, 4, 2, 0, 3, SBR_MONO, 3 }, /* lowest range */
581 { CODEC_AAC, 36000, 60000, 32000, 1, 7, 7, 6, 6, 2, 0, 3, SBR_MONO, 2 }, /* lowest range */
582 { CODEC_AAC, 60000, 72000, 32000, 1, 9, 9, 8, 8, 2, 0, 3, SBR_MONO, 1 }, /* low range */
583 { CODEC_AAC, 72000,100000, 32000, 1, 11,11,10,10, 2, 0, 3, SBR_MONO, 1 }, /* SBR sweet spot */
584 { CODEC_AAC, 100000,160001, 32000, 1, 13,13,11,11, 2, 0, 3, SBR_MONO, 1 }, /* backwards compatible */
581585
582586 /* 44.1/88.2 kHz dual rate */ /* placebo settings */
583 { 24000, 36000, 44100, 1, 4, 4, 4, 4, 2, 0, 3, SBR_MONO, 3 }, /* lowest range (multichannel rear) */
584 { 36000, 60000, 44100, 1, 7, 7, 6, 6, 2, 0, 3, SBR_MONO, 2 }, /* lowest range (multichannel rear) */
585 { 60000, 72000, 44100, 1, 9, 9, 8, 8, 2, 0, 3, SBR_MONO, 1 }, /* low range */
586 { 72000,100000, 44100, 1, 11,11,10,10, 2, 0, 3, SBR_MONO, 1 }, /* SBR sweet spot */
587 { 100000,160001, 44100, 1, 13,13,11,11, 2, 0, 3, SBR_MONO, 1 }, /* backwards compatible */
587 { CODEC_AAC, 24000, 36000, 44100, 1, 4, 4, 4, 4, 2, 0, 3, SBR_MONO, 3 }, /* lowest range (multichannel rear) */
588 { CODEC_AAC, 36000, 60000, 44100, 1, 7, 7, 6, 6, 2, 0, 3, SBR_MONO, 2 }, /* lowest range (multichannel rear) */
589 { CODEC_AAC, 60000, 72000, 44100, 1, 9, 9, 8, 8, 2, 0, 3, SBR_MONO, 1 }, /* low range */
590 { CODEC_AAC, 72000,100000, 44100, 1, 11,11,10,10, 2, 0, 3, SBR_MONO, 1 }, /* SBR sweet spot */
591 { CODEC_AAC, 100000,160001, 44100, 1, 13,13,11,11, 2, 0, 3, SBR_MONO, 1 }, /* backwards compatible */
588592
589593 /* 48/96 kHz dual rate */ /* not yet finally tuned */
590 { 32000, 36000, 48000, 1, 4, 4, 9, 9, 2, 0, 3, SBR_MONO, 3 }, /* lowest range (multichannel rear) */
591 { 36000, 60000, 48000, 1, 7, 7,10,10, 2, 0, 3, SBR_MONO, 2 }, /* nominal: 40 */
592 { 60000, 72000, 48000, 1, 9, 9,10,10, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 64 */
593 { 72000,100000, 48000, 1, 11,11,11,11, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 80 */
594 { 100000,160001, 48000, 1, 13,13,11,11, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 128 */
594 { CODEC_AAC, 32000, 36000, 48000, 1, 4, 4, 9, 9, 2, 0, 3, SBR_MONO, 3 }, /* lowest range (multichannel rear) */
595 { CODEC_AAC, 36000, 60000, 48000, 1, 7, 7,10,10, 2, 0, 3, SBR_MONO, 2 }, /* nominal: 40 */
596 { CODEC_AAC, 60000, 72000, 48000, 1, 9, 9,10,10, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 64 */
597 { CODEC_AAC, 72000,100000, 48000, 1, 11,11,11,11, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 80 */
598 { CODEC_AAC, 100000,160001, 48000, 1, 13,13,11,11, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 128 */
595599
596600 /*** stereo ***/
597601 /* 08/16 kHz dual rate */
598 { 16000, 24000, 8000, 2, 6, 6, 9, 7, 1, 0,-3, SBR_SWITCH_LRC, 3 }, /* nominal: 20 kbit/s */ /* placebo */
599 { 24000, 28000, 8000, 2, 9, 9, 11, 9, 1, 0,-3, SBR_SWITCH_LRC, 3 }, /* nominal: 24 kbit/s */
600 { 28000, 36000, 8000, 2, 11, 9, 11, 9, 2, 0,-3, SBR_SWITCH_LRC, 2 }, /* nominal: 32 kbit/s */
601 { 36000, 44000, 8000, 2, 13,11, 13,11, 2, 0,-3, SBR_SWITCH_LRC, 2 }, /* nominal: 40 kbit/s */
602 { 44000, 52000, 8000, 2, 14,12, 13,12, 2, 0,-3, SBR_SWITCH_LRC, 2 }, /* nominal: 48 kbit/s */
603 { 52000, 60000, 8000, 2, 15,15, 13,13, 3, 0,-3, SBR_SWITCH_LRC, 1 }, /* nominal: 56 kbit/s */
604 { 60000, 76000, 8000, 2, 15,15, 13,13, 3, 0,-3, SBR_LEFT_RIGHT, 1 }, /* nominal: 64 kbit/s */
605 { 76000,128001, 8000, 2, 15,15, 13,13, 3, 0,-3, SBR_LEFT_RIGHT, 1 }, /* nominal: 80 kbit/s */
602 { CODEC_AAC, 16000, 24000, 8000, 2, 6, 6, 9, 7, 1, 0,-3, SBR_SWITCH_LRC, 3 }, /* nominal: 20 kbit/s */ /* placebo */
603 { CODEC_AAC, 24000, 28000, 8000, 2, 9, 9, 11, 9, 1, 0,-3, SBR_SWITCH_LRC, 3 }, /* nominal: 24 kbit/s */
604 { CODEC_AAC, 28000, 36000, 8000, 2, 11, 9, 11, 9, 2, 0,-3, SBR_SWITCH_LRC, 2 }, /* nominal: 32 kbit/s */
605 { CODEC_AAC, 36000, 44000, 8000, 2, 13,11, 13,11, 2, 0,-3, SBR_SWITCH_LRC, 2 }, /* nominal: 40 kbit/s */
606 { CODEC_AAC, 44000, 52000, 8000, 2, 14,12, 13,12, 2, 0,-3, SBR_SWITCH_LRC, 2 }, /* nominal: 48 kbit/s */
607 { CODEC_AAC, 52000, 60000, 8000, 2, 14,14, 13,13, 3, 0,-3, SBR_SWITCH_LRC, 1 }, /* nominal: 56 kbit/s */
608 { CODEC_AAC, 60000, 76000, 8000, 2, 14,14, 13,13, 3, 0,-3, SBR_LEFT_RIGHT, 1 }, /* nominal: 64 kbit/s */
609 { CODEC_AAC, 76000,128001, 8000, 2, 14,14, 13,13, 3, 0,-3, SBR_LEFT_RIGHT, 1 }, /* nominal: 80 kbit/s */
606610
607611 /* 11/22 kHz dual rate */
608 { 16000, 24000, 11025, 2, 7, 5, 9, 7, 1, 0, -3, SBR_SWITCH_LRC, 3 }, /* nominal: 20 kbit/s */ /* placebo */
609 { 24000, 28000, 11025, 2, 10, 8,10, 8, 1, 0, -3, SBR_SWITCH_LRC, 3 }, /* nominal: 24 kbit/s */
610 { 28000, 36000, 11025, 2, 12, 8,12, 8, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 32 kbit/s */
611 { 36000, 44000, 11025, 2, 13, 9,13, 9, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 40 kbit/s */
612 { 44000, 52000, 11025, 2, 14,11,13,11, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 48 kbit/s */
613 { 52000, 60000, 11025, 2, 15,15,13,13, 3, 0, -3, SBR_SWITCH_LRC, 1 }, /* nominal: 56 kbit/s */
614 { 60000, 76000, 11025, 2, 15,15,13,13, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 64 kbit/s */
615 { 76000,128001, 11025, 2, 15,15,13,13, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 80 kbit/s */
612 { CODEC_AAC, 16000, 24000, 11025, 2, 7, 5, 9, 7, 1, 0, -3, SBR_SWITCH_LRC, 3 }, /* nominal: 20 kbit/s */ /* placebo */
613 { CODEC_AAC, 24000, 28000, 11025, 2, 10, 8,10, 8, 1, 0, -3, SBR_SWITCH_LRC, 3 }, /* nominal: 24 kbit/s */
614 { CODEC_AAC, 28000, 36000, 11025, 2, 12, 8,12, 8, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 32 kbit/s */
615 { CODEC_AAC, 36000, 44000, 11025, 2, 13, 9,13, 9, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 40 kbit/s */
616 { CODEC_AAC, 44000, 52000, 11025, 2, 14,11,13,11, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 48 kbit/s */
617 { CODEC_AAC, 52000, 60000, 11025, 2, 15,15,13,13, 3, 0, -3, SBR_SWITCH_LRC, 1 }, /* nominal: 56 kbit/s */
618 { CODEC_AAC, 60000, 76000, 11025, 2, 15,15,13,13, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 64 kbit/s */
619 { CODEC_AAC, 76000,128001, 11025, 2, 15,15,13,13, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 80 kbit/s */
616620
617621 /* 12/24 kHz dual rate */
618 { 16000, 24000, 12000, 2, 6, 4, 9, 7, 1, 0, -3, SBR_SWITCH_LRC, 3 }, /* nominal: 20 kbit/s */ /* placebo */
619 { 24000, 28000, 12000, 2, 9, 7,10, 8, 1, 0, -3, SBR_SWITCH_LRC, 3 }, /* nominal: 24 kbit/s */
620 { 28000, 36000, 12000, 2, 11, 7,12, 8, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 32 kbit/s */
621 { 36000, 44000, 12000, 2, 12, 9,12, 9, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 40 kbit/s */
622 { 44000, 52000, 12000, 2, 13,12,13,12, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 48 kbit/s */
623 { 52000, 60000, 12000, 2, 14,14,13,13, 3, 0, -3, SBR_SWITCH_LRC, 1 }, /* nominal: 56 kbit/s */
624 { 60000, 76000, 12000, 2, 15,15,13,13, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 64 kbit/s */
625 { 76000,128001, 12000, 2, 15,15,13,13, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 80 kbit/s */
622 { CODEC_AAC, 16000, 24000, 12000, 2, 6, 4, 9, 7, 1, 0, -3, SBR_SWITCH_LRC, 3 }, /* nominal: 20 kbit/s */ /* placebo */
623 { CODEC_AAC, 24000, 28000, 12000, 2, 9, 7,10, 8, 1, 0, -3, SBR_SWITCH_LRC, 3 }, /* nominal: 24 kbit/s */
624 { CODEC_AAC, 28000, 36000, 12000, 2, 11, 7,12, 8, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 32 kbit/s */
625 { CODEC_AAC, 36000, 44000, 12000, 2, 12, 9,12, 9, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 40 kbit/s */
626 { CODEC_AAC, 44000, 52000, 12000, 2, 13,12,13,12, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 48 kbit/s */
627 { CODEC_AAC, 52000, 60000, 12000, 2, 14,14,13,13, 3, 0, -3, SBR_SWITCH_LRC, 1 }, /* nominal: 56 kbit/s */
628 { CODEC_AAC, 60000, 76000, 12000, 2, 14,14,13,13, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 64 kbit/s */
629 { CODEC_AAC, 76000,128001, 12000, 2, 14,14,13,13, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 80 kbit/s */
626630
627631 /* 16/32 kHz dual rate */
628 { 16000, 24000, 16000, 2, 4, 2, 1, 0, 1, 0, -3, SBR_SWITCH_LRC, 3 }, /* nominal: 20 kbit/s */
629 { 24000, 28000, 16000, 2, 8, 7,10, 8, 1, 0, -3, SBR_SWITCH_LRC, 3 }, /* nominal: 24 kbit/s */
630 { 28000, 36000, 16000, 2, 10, 9,12,11, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 32 kbit/s */
631 { 36000, 44000, 16000, 2, 13,13,13,13, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 40 kbit/s */
632 { 44000, 52000, 16000, 2, 15,15,13,13, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 48 kbit/s */
633 { 52000, 60000, 16000, 2, 15,15,13,13, 3, 0, -3, SBR_SWITCH_LRC, 1 }, /* nominal: 56 kbit/s */
634 { 60000, 76000, 16000, 2, 15,15,13,13, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 64 kbit/s */
635 { 76000,128001, 16000, 2, 15,15,13,13, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 80 kbit/s */
632 { CODEC_AAC, 16000, 24000, 16000, 2, 4, 2, 1, 0, 1, 0, -3, SBR_SWITCH_LRC, 3 }, /* nominal: 20 kbit/s */
633 { CODEC_AAC, 24000, 28000, 16000, 2, 8, 7,10, 8, 1, 0, -3, SBR_SWITCH_LRC, 3 }, /* nominal: 24 kbit/s */
634 { CODEC_AAC, 28000, 36000, 16000, 2, 10, 9,12,11, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 32 kbit/s */
635 { CODEC_AAC, 36000, 44000, 16000, 2, 13,13,13,13, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 40 kbit/s */
636 { CODEC_AAC, 44000, 52000, 16000, 2, 14,14,13,13, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 48 kbit/s */
637 { CODEC_AAC, 52000, 60000, 16000, 2, 14,14,13,13, 3, 0, -3, SBR_SWITCH_LRC, 1 }, /* nominal: 56 kbit/s */
638 { CODEC_AAC, 60000, 76000, 16000, 2, 14,14,13,13, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 64 kbit/s */
639 { CODEC_AAC, 76000,128001, 16000, 2, 14,14,13,13, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 80 kbit/s */
636640
637641 /* 22.05/44.1 kHz dual rate */
638 { 16000, 24000, 22050, 2, 2, 1, 1, 0, 1, 0, -3, SBR_SWITCH_LRC, 3 }, /* nominal: 20 kbit/s */
639 { 24000, 28000, 22050, 2, 5, 4, 6, 5, 1, 0, -3, SBR_SWITCH_LRC, 3 }, /* nominal: 24 kbit/s */
640 { 28000, 32000, 22050, 2, 5, 4, 8, 7, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 28 kbit/s */
641 { 32000, 36000, 22050, 2, 7, 6, 8, 7, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 32 kbit/s */
642 { 36000, 44000, 22050, 2, 10,10, 9, 9, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 40 kbit/s */
643 { 44000, 52000, 22050, 2, 12,12, 9, 9, 3, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 48 kbit/s */
644 { 52000, 60000, 22050, 2, 13,13,10,10, 3, 0, -3, SBR_SWITCH_LRC, 1 }, /* nominal: 56 kbit/s */
645 { 60000, 76000, 22050, 2, 14,14,12,12, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 64 kbit/s */
646 { 76000,128001, 22050, 2, 14,14,12,12, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 80 kbit/s */
642 { CODEC_AAC, 16000, 24000, 22050, 2, 2, 1, 1, 0, 1, 0, -3, SBR_SWITCH_LRC, 3 }, /* nominal: 20 kbit/s */
643 { CODEC_AAC, 24000, 28000, 22050, 2, 5, 4, 6, 5, 1, 0, -3, SBR_SWITCH_LRC, 3 }, /* nominal: 24 kbit/s */
644 { CODEC_AAC, 28000, 32000, 22050, 2, 5, 4, 8, 7, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 28 kbit/s */
645 { CODEC_AAC, 32000, 36000, 22050, 2, 7, 6, 8, 7, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 32 kbit/s */
646 { CODEC_AAC, 36000, 44000, 22050, 2, 10,10, 9, 9, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 40 kbit/s */
647 { CODEC_AAC, 44000, 52000, 22050, 2, 12,12, 9, 9, 3, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 48 kbit/s */
648 { CODEC_AAC, 52000, 60000, 22050, 2, 13,13,10,10, 3, 0, -3, SBR_SWITCH_LRC, 1 }, /* nominal: 56 kbit/s */
649 { CODEC_AAC, 60000, 76000, 22050, 2, 14,14,12,12, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 64 kbit/s */
650 { CODEC_AAC, 76000,128001, 22050, 2, 14,14,12,12, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 80 kbit/s */
647651
648652 /* 24/48 kHz dual rate */
649 { 16000, 24000, 24000, 2, 2, 1, 1, 0, 1, 0, -3, SBR_SWITCH_LRC, 3 }, /* nominal: 20 kbit/s */
650 { 24000, 28000, 24000, 2, 5, 5, 6, 6, 1, 0, -3, SBR_SWITCH_LRC, 3 }, /* nominal: 24 kbit/s */
651 { 28000, 36000, 24000, 2, 7, 6, 8, 7, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 32 kbit/s */
652 { 36000, 44000, 24000, 2, 10,10, 9, 9, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 40 kbit/s */
653 { 44000, 52000, 24000, 2, 12,12, 9, 9, 3, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 48 kbit/s */
654 { 52000, 60000, 24000, 2, 13,13,10,10, 3, 0, -3, SBR_SWITCH_LRC, 1 }, /* nominal: 56 kbit/s */
655 { 60000, 76000, 24000, 2, 14,14,12,12, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 64 kbit/s */
656 { 76000,128001, 24000, 2, 15,15,12,12, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 80 kbit/s */
653 { CODEC_AAC, 16000, 24000, 24000, 2, 2, 1, 1, 0, 1, 0, -3, SBR_SWITCH_LRC, 3 }, /* nominal: 20 kbit/s */
654 { CODEC_AAC, 24000, 28000, 24000, 2, 5, 5, 6, 6, 1, 0, -3, SBR_SWITCH_LRC, 3 }, /* nominal: 24 kbit/s */
655 { CODEC_AAC, 28000, 36000, 24000, 2, 7, 6, 8, 7, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 32 kbit/s */
656 { CODEC_AAC, 36000, 44000, 24000, 2, 10,10, 9, 9, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 40 kbit/s */
657 { CODEC_AAC, 44000, 52000, 24000, 2, 12,12, 9, 9, 3, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 48 kbit/s */
658 { CODEC_AAC, 52000, 60000, 24000, 2, 13,13,10,10, 3, 0, -3, SBR_SWITCH_LRC, 1 }, /* nominal: 56 kbit/s */
659 { CODEC_AAC, 60000, 76000, 24000, 2, 14,14,12,12, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 64 kbit/s */
660 { CODEC_AAC, 76000,128001, 24000, 2, 14,14,12,12, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 80 kbit/s */
657661
658662 /* 32/64 kHz dual rate */ /* placebo settings */
659 { 32000, 60000, 32000, 2, 4, 4, 4, 4, 2, 0, -3, SBR_SWITCH_LRC, 3 }, /* lowest range (multichannel rear) */
660 { 60000, 80000, 32000, 2, 7, 7, 6, 6, 3, 0, -3, SBR_SWITCH_LRC, 2 }, /* lowest range (multichannel rear) */
661 { 80000,112000, 32000, 2, 9, 9, 8, 8, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* low range */
662 { 112000,144000, 32000, 2, 11,11,10,10, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* SBR sweet spot */
663 { 144000,256001, 32000, 2, 13,13,11,11, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* backwards compatible */
663 { CODEC_AAC, 32000, 60000, 32000, 2, 4, 4, 4, 4, 2, 0, -3, SBR_SWITCH_LRC, 3 }, /* lowest range (multichannel rear) */
664 { CODEC_AAC, 60000, 80000, 32000, 2, 7, 7, 6, 6, 3, 0, -3, SBR_SWITCH_LRC, 2 }, /* lowest range (multichannel rear) */
665 { CODEC_AAC, 80000,112000, 32000, 2, 9, 9, 8, 8, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* low range */
666 { CODEC_AAC, 112000,144000, 32000, 2, 11,11,10,10, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* SBR sweet spot */
667 { CODEC_AAC, 144000,256001, 32000, 2, 13,13,11,11, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* backwards compatible */
664668
665669 /* 44.1/88.2 kHz dual rate */ /* placebo settings */
666 { 32000, 60000, 44100, 2, 4, 4, 4, 4, 2, 0, -3, SBR_SWITCH_LRC, 3 }, /* lowest range (multichannel rear) */
667 { 60000, 80000, 44100, 2, 7, 7, 6, 6, 3, 0, -3, SBR_SWITCH_LRC, 2 }, /* lowest range (multichannel rear) */
668 { 80000,112000, 44100, 2, 9, 9, 8, 8, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* low range */
669 { 112000,144000, 44100, 2, 11,11,10,10, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* SBR sweet spot */
670 { 144000,256001, 44100, 2, 13,13,11,11, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* backwards compatible */
670 { CODEC_AAC, 32000, 60000, 44100, 2, 4, 4, 4, 4, 2, 0, -3, SBR_SWITCH_LRC, 3 }, /* lowest range (multichannel rear) */
671 { CODEC_AAC, 60000, 80000, 44100, 2, 7, 7, 6, 6, 3, 0, -3, SBR_SWITCH_LRC, 2 }, /* lowest range (multichannel rear) */
672 { CODEC_AAC, 80000,112000, 44100, 2, 9, 9, 8, 8, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* low range */
673 { CODEC_AAC, 112000,144000, 44100, 2, 11,11,10,10, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* SBR sweet spot */
674 { CODEC_AAC, 144000,256001, 44100, 2, 13,13,11,11, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* backwards compatible */
671675
672676 /* 48/96 kHz dual rate */ /* not yet finally tuned */
673 { 36000, 60000, 48000, 2, 4, 4, 9, 9, 2, 0, -3, SBR_SWITCH_LRC, 3 }, /* lowest range (multichannel rear) */
674 { 60000, 80000, 48000, 2, 7, 7, 9, 9, 3, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 64 */
675 { 80000,112000, 48000, 2, 9, 9,10,10, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 96 */
676 { 112000,144000, 48000, 2, 11,11,11,11, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 128 */
677 { 144000,256001, 48000, 2, 13,13,11,11, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 192 */
677 { CODEC_AAC, 36000, 60000, 48000, 2, 4, 4, 9, 9, 2, 0, -3, SBR_SWITCH_LRC, 3 }, /* lowest range (multichannel rear) */
678 { CODEC_AAC, 60000, 80000, 48000, 2, 7, 7, 9, 9, 3, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 64 */
679 { CODEC_AAC, 80000,112000, 48000, 2, 9, 9,10,10, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 96 */
680 { CODEC_AAC, 112000,144000, 48000, 2, 11,11,11,11, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 128 */
681 { CODEC_AAC, 144000,256001, 48000, 2, 13,13,11,11, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 192 */
682
678683
679684 /** AAC LOW DELAY SECTION **/
680685
686 /*** mono ***/
687 /* 16/32 kHz dual rate not yet tuned ->alb copied from non LD tables*/
688 { CODEC_AACLD, 16000, 18000, 16000, 1, 4, 5, 9, 7, 1, 0, 6, SBR_MONO, 3 }, /* nominal: 16 kbit/s wrr: tuned */
689 { CODEC_AACLD, 18000, 22000, 16000, 1, 7, 7,12,12, 1, 6, 9, SBR_MONO, 3 }, /* nominal: 20 kbit/s wrr: tuned */
690 { CODEC_AACLD, 22000, 28000, 16000, 1, 6, 6, 9, 9, 2, 3, 6, SBR_MONO, 3 }, /* nominal: 24 kbit/s wrr: tuned */
691 { CODEC_AACLD, 28000, 36000, 16000, 1, 8, 8,12, 7, 2, 9,12, SBR_MONO, 3 }, /* jgr: special */ /* wrr: tuned */
692 { CODEC_AACLD, 36000, 44000, 16000, 1, 10,14,12,13, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 40 kbit/s */
693 { CODEC_AACLD, 44000, 64001, 16000, 1, 11,14,13,13, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 48 kbit/s */
694
681695 /* 22.05/44.1 kHz dual rate */
682 { 18000, 22000, 22050, 1, 4, 4, 5, 5, 2, 0, 6, SBR_MONO, 2 }, /* nominal: 20 kbit/s */
683 { 22000, 28000, 22050, 1, 4, 4, 6, 5, 2, 0, 6, SBR_MONO, 2 }, /* nominal: 24 kbit/s */
684 { 28000, 36000, 22050, 1, 7, 8, 8, 8, 2, 0, 3, SBR_MONO, 2 }, /* nominal: 32 kbit/s */
685 { 36000, 44000, 22050, 1, 9, 9, 9, 9, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 40 kbit/s */
686 { 44000, 52000, 22050, 1, 11,11,11,11, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 48 kbit/s */
687 { 52000, 64001, 22050, 1, 12,11,11,11, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 56 kbit/s */
696 { CODEC_AACLD, 18000, 22000, 22050, 1, 4, 4, 5, 5, 2, 0, 6, SBR_MONO, 3 }, /* nominal: 20 kbit/s */
697 { CODEC_AACLD, 22000, 28000, 22050, 1, 5, 5, 6, 6, 2, 0, 6, SBR_MONO, 2 }, /* nominal: 24 kbit/s */
698 { CODEC_AACLD, 28000, 36000, 22050, 1, 7, 8, 8, 8, 2, 0, 3, SBR_MONO, 2 }, /* nominal: 32 kbit/s */
699 { CODEC_AACLD, 36000, 44000, 22050, 1, 9, 9, 9, 9, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 40 kbit/s */
700 { CODEC_AACLD, 44000, 52000, 22050, 1, 12,11,11,11, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 48 kbit/s */
701 { CODEC_AACLD, 52000, 64001, 22050, 1, 13,11,11,10, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 56 kbit/s */
688702
689703 /* 24/48 kHz dual rate */
690 { 20000, 22000, 24000, 1, 4, 4, 5, 5, 2, 0, 6, SBR_MONO, 2 }, /* nominal: 20 kbit/s */
691 { 22000, 28000, 24000, 1, 4, 4, 6, 5, 2, 0, 6, SBR_MONO, 2 }, /* nominal: 24 kbit/s */
692 { 28000, 36000, 24000, 1, 6, 8, 8, 8, 2, 0, 3, SBR_MONO, 2 }, /* nominal: 32 kbit/s */
693 { 36000, 44000, 24000, 1, 8, 9, 9, 9, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 40 kbit/s */
694 { 44000, 52000, 24000, 1, 12,11,11,10, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 48 kbit/s */
695 { 52000, 64001, 24000, 1, 13,11,11,10, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 48 kbit/s */
704 { CODEC_AACLD, 20000, 22000, 24000, 1, 4, 1, 8, 4, 2, 3, 6, SBR_MONO, 2 }, /* nominal: 20 kbit/s */
705 { CODEC_AACLD, 22000, 28000, 24000, 1, 3, 8, 8, 7, 2, 0, 3, SBR_MONO, 2 }, /* nominal: 24 kbit/s */
706 { CODEC_AACLD, 28000, 36000, 24000, 1, 4, 8, 8, 7, 2, 0, 3, SBR_MONO, 2 }, /* nominal: 32 kbit/s */
707 { CODEC_AACLD, 36000, 56000, 24000, 1, 8, 9, 9, 9, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 40 kbit/s */
708 { CODEC_AACLD, 56000, 64001, 24000, 1, 13,11,11,10, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 64 kbit/s */
709
710 /* 32/64 kHz dual rate */ /* placebo settings */ /*jgr: new, copy from CODEC_AAC */
711 { CODEC_AACLD, 24000, 36000, 32000, 1, 4, 4, 4, 4, 2, 0, 3, SBR_MONO, 3 }, /* lowest range */
712 { CODEC_AACLD, 36000, 60000, 32000, 1, 7, 7, 6, 6, 2, 0, 3, SBR_MONO, 2 }, /* lowest range */
713 { CODEC_AACLD, 60000, 72000, 32000, 1, 9, 9, 8, 8, 2, 0, 3, SBR_MONO, 1 }, /* low range */
714 { CODEC_AACLD, 72000,100000, 32000, 1, 11,11,10,10, 2, 0, 3, SBR_MONO, 1 }, /* SBR sweet spot */
715 { CODEC_AACLD, 100000,160001, 32000, 1, 13,13,11,11, 2, 0, 3, SBR_MONO, 1 }, /* backwards compatible */
716
717 /* 44/88 kHz dual rate */ /* not yet finally tuned */
718 { CODEC_AACLD, 36000, 60000, 44100, 1, 8, 7, 6, 9, 2, 0, 3, SBR_MONO, 2 }, /* nominal: 40 */
719 { CODEC_AACLD, 60000, 72000, 44100, 1, 9, 9,10,10, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 64 */
720 { CODEC_AACLD, 72000,100000, 44100, 1, 11,11,11,11, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 80 */
721 { CODEC_AACLD, 100000,160001, 44100, 1, 13,13,11,11, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 128 */
722
723 /* 48/96 kHz dual rate */ /* 32 and 40kbps line tuned for dual-rate SBR */
724 { CODEC_AACLD, 36000, 60000, 48000, 1, 8, 7, 6, 9, 2, 0, 3, SBR_MONO, 2 }, /* nominal: 40 */
725 { CODEC_AACLD, 60000, 72000, 48000, 1, 9, 9,10,10, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 64 */
726 { CODEC_AACLD, 72000,100000, 48000, 1, 11,11,11,11, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 80 */
727 { CODEC_AACLD, 100000,160001, 48000, 1, 13,13,11,11, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 128 */
728
729 /*** stereo ***/
730 /* 16/32 kHz dual rate not yet tuned ->alb copied from non LD tables*/
731 { CODEC_AACLD, 32000, 36000, 16000, 2, 10, 9,12,11, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 32 kbit/s */
732 { CODEC_AACLD, 36000, 44000, 16000, 2, 13,13,13,13, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 40 kbit/s */
733 { CODEC_AACLD, 44000, 52000, 16000, 2, 10, 9,11, 9, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* tune12 nominal: 48 kbit/s */
734 { CODEC_AACLD, 52000, 60000, 16000, 2, 14,14,13,13, 3, 0, -3, SBR_SWITCH_LRC, 1 }, /* nominal: 56 kbit/s */
735 { CODEC_AACLD, 60000, 76000, 16000, 2, 14,14,13,13, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 64 kbit/s */
736 { CODEC_AACLD, 76000,128001, 16000, 2, 14,14,13,13, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 80 kbit/s */
696737
697738 /* 22.05/44.1 kHz dual rate */
698 { 32000, 36000, 22050, 2, 5, 4, 7, 6, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 32 kbit/s */
699 { 36000, 44000, 22050, 2, 5, 8, 8, 8, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 40 kbit/s */
700 { 44000, 52000, 22050, 2, 7,10, 8, 8, 3, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 48 kbit/s */
701 { 52000, 60000, 22050, 2, 9,11, 9, 9, 3, 0, -3, SBR_SWITCH_LRC, 1 }, /* nominal: 56 kbit/s */
702 { 60000, 76000, 22050, 2, 10,12,10,11, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 64 kbit/s */
703 { 76000, 82000, 22050, 2, 12,12,11,11, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 80 kbit/s */
704 { 82000,128001, 22050, 2, 13,12,11,11, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 80 kbit/s */
739 { CODEC_AACLD, 32000, 36000, 22050, 2, 5, 4, 7, 6, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 32 kbit/s */
740 { CODEC_AACLD, 36000, 44000, 22050, 2, 5, 8, 8, 8, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 40 kbit/s */
741 { CODEC_AACLD, 44000, 52000, 22050, 2, 7,10, 8, 8, 3, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 48 kbit/s */
742 { CODEC_AACLD, 52000, 60000, 22050, 2, 9,11, 9, 9, 3, 0, -3, SBR_SWITCH_LRC, 1 }, /* nominal: 56 kbit/s */
743 { CODEC_AACLD, 60000, 76000, 22050, 2, 10,12,10,11, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 64 kbit/s */
744 { CODEC_AACLD, 76000, 82000, 22050, 2, 12,12,11,11, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 80 kbit/s */
745 { CODEC_AACLD, 82000,128001, 22050, 2, 13,12,11,11, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 80 kbit/s */
705746
706747 /* 24/48 kHz dual rate */
707 { 32000, 36000, 24000, 2, 5, 4, 7, 6, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 32 kbit/s */
708 { 36000, 44000, 24000, 2, 4, 8, 8, 8, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 40 kbit/s */
709 { 44000, 52000, 24000, 2, 6,10, 8, 8, 3, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 48 kbit/s */
710 { 52000, 60000, 24000, 2, 9,11, 9, 9, 3, 0, -3, SBR_SWITCH_LRC, 1 }, /* nominal: 56 kbit/s */
711 { 60000, 76000, 24000, 2, 11,12,10,11, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 64 kbit/s */
712 { 76000, 88000, 24000, 2, 12,13,11,11, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 80 kbit/s */
713 { 88000,128001, 24000, 2, 13,13,11,11, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 92 kbit/s */
714
715
716 };
748 { CODEC_AACLD, 32000, 36000, 24000, 2, 5, 4, 7, 6, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 32 kbit/s */
749 { CODEC_AACLD, 36000, 44000, 24000, 2, 4, 8, 8, 8, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 40 kbit/s */
750 { CODEC_AACLD, 44000, 52000, 24000, 2, 6,10, 8, 8, 3, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 48 kbit/s */
751 { CODEC_AACLD, 52000, 60000, 24000, 2, 9,11, 9, 9, 3, 0, -3, SBR_SWITCH_LRC, 1 }, /* nominal: 56 kbit/s */
752 { CODEC_AACLD, 60000, 76000, 24000, 2, 11,12,10,11, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 64 kbit/s */
753 { CODEC_AACLD, 76000, 88000, 24000, 2, 12,13,11,11, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 80 kbit/s */
754 { CODEC_AACLD, 88000,128001, 24000, 2, 13,13,11,11, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 92 kbit/s */
755
756 /* 32/64 kHz dual rate */ /* placebo settings */ /*jgr: new, copy from CODEC_AAC */
757 { CODEC_AACLD, 60000, 80000, 32000, 2, 7, 7, 6, 6, 3, 0, -3, SBR_SWITCH_LRC, 2 }, /* lowest range (multichannel rear) */
758 { CODEC_AACLD, 80000,112000, 32000, 2, 9, 9, 8, 8, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* low range */
759 { CODEC_AACLD, 112000,144000, 32000, 2, 11,11,10,10, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* SBR sweet spot */
760 { CODEC_AACLD, 144000,256001, 32000, 2, 13,13,11,11, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* backwards compatible */
761
762 /* 44.1/88.2 kHz dual rate */ /* placebo settings */ /*wrr: new, copy from CODEC_AAC */
763 { CODEC_AACLD, 60000, 80000, 44100, 2, 7, 7, 6, 6, 3, 0, -3, SBR_SWITCH_LRC, 2 }, /* lowest range (multichannel rear) */
764 { CODEC_AACLD, 80000,112000, 44100, 2, 10,10, 8, 8, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* hlm 11-08-29 */
765 { CODEC_AACLD, 112000,144000, 44100, 2, 12,12,10,10, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* hlm 11-08-29 */
766 { CODEC_AACLD, 144000,256001, 44100, 2, 13,13,11,11, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* backwards compatible */
767
768 /* 48/96 kHz dual rate */ /* not yet finally tuned */ /*wrr: new, copy from CODEC_AAC */
769 { CODEC_AACLD, 60000, 80000, 48000, 2, 7, 7,10,10, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 64 */
770 { CODEC_AACLD, 80000,112000, 48000, 2, 9, 9,10,10, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 96 */
771 { CODEC_AACLD, 112000,144000, 48000, 2, 11,11,11,11, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 128 */
772 { CODEC_AACLD, 144000,176000, 48000, 2, 12,12,11,11, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* hlm 09-10-19 */
773 { CODEC_AACLD, 176000,256001, 48000, 2, 13,13,11,11, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* hlm 09-10-19 */
774
775 };
776
777 const int sbrTuningTableSize = sizeof(sbrTuningTable)/sizeof(sbrTuningTable[0]);
717778
718779 const psTuningTable_t psTuningTable[4] =
719780 {
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
117117 extern const INT bookSbrNoiseBalanceC11T[25];
118118 extern const UCHAR bookSbrNoiseBalanceL11T[25];
119119
120 #define SBRENC_AACLC_TUNING_SIZE 124
121 #define SBRENC_AACELD_TUNING_SIZE (26)
122 #define SBRENC_AACELD2_TUNING_SIZE (26)
123
124 #define SBRENC_TUNING_SIZE (SBRENC_AACLC_TUNING_SIZE + SBRENC_AACELD_TUNING_SIZE)
125
126 extern const sbrTuningTable_t sbrTuningTable[SBRENC_TUNING_SIZE];
120 extern const sbrTuningTable_t sbrTuningTable[];
121 extern const int sbrTuningTableSize;
127122
128123 extern const psTuningTable_t psTuningTable[4];
129124
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
8383 /*!
8484 \file
8585 \brief frequency scale
86 \author Tobias Chalupka
8687 */
8788
8889 #include "sbrenc_freq_sca.h"
9192 #include "genericStds.h"
9293
9394 /* StartFreq */
94 static INT getStartFreq(INT fs, const INT start_freq);
95 static INT getStartFreq(INT fsCore, const INT start_freq);
9596
9697 /* StopFreq */
97 static INT getStopFreq(INT fs, const INT stop_freq, const INT noChannels);
98 static INT getStopFreq(INT fsCore, const INT stop_freq);
9899
99100 static INT numberOfBands(INT b_p_o, INT start, INT stop, FIXP_DBL warp_factor);
100101 static void CalcBands(INT * diff, INT start , INT stop , INT num_bands);
114115 *******************************************************************************/
115116
116117 INT
117 FDKsbrEnc_getSbrStartFreqRAW (INT startFreq, INT QMFbands, INT fs)
118 FDKsbrEnc_getSbrStartFreqRAW (INT startFreq, INT fsCore)
118119 {
119120 INT result;
120121
122123 return -1;
123124 }
124125 /* Update startFreq struct */
125 result = getStartFreq(fs, startFreq);
126
127 result = (result*fs/QMFbands+1)>>1;
126 result = getStartFreq(fsCore, startFreq);
127
128 result = (result*(fsCore>>5)+1)>>1; /* (result*fsSBR/QMFbands+1)>>1; */
128129
129130 return (result);
130131
140141
141142 Return:
142143 *******************************************************************************/
143 INT FDKsbrEnc_getSbrStopFreqRAW (INT stopFreq, INT QMFbands, INT fs)
144 INT FDKsbrEnc_getSbrStopFreqRAW (INT stopFreq, INT fsCore)
144145 {
145146 INT result;
146147
147148 if ( stopFreq < 0 || stopFreq > 13)
148149 return -1;
149150
150
151151 /* Uppdate stopFreq struct */
152 result = getStopFreq( fs, stopFreq, QMFbands);
153 result = (result*fs/QMFbands+1)>>1;
152 result = getStopFreq(fsCore, stopFreq);
153 result = (result*(fsCore>>5)+1)>>1; /* (result*fsSBR/QMFbands+1)>>1; */
154154
155155 return (result);
156156 } /* End getSbrStopFreq */
161161 *******************************************************************************
162162 Description:
163163
164 Arguments:
164 Arguments: fsCore - core sampling rate
165
165166
166167 Return:
167168 *******************************************************************************/
168169 static INT
169 getStartFreq(INT fs, const INT start_freq)
170 getStartFreq(INT fsCore, const INT start_freq)
170171 {
171172 INT k0_min;
172173
173 switch(fs){
174 case 16000: k0_min = 24;
175 break;
176 case 22050: k0_min = 17;
177 break;
178 case 24000: k0_min = 16;
179 break;
180 case 32000: k0_min = 16;
181 break;
182 case 44100: k0_min = 12;
183 break;
184 case 48000: k0_min = 11;
185 break;
186 case 64000: k0_min = 10;
187 break;
188 case 88200: k0_min = 7;
189 break;
190 case 96000: k0_min = 7;
174 switch(fsCore){
175 case 8000: k0_min = 24; /* (3000 * nQmfChannels / fsSBR ) + 0.5 */
176 break;
177 case 11025: k0_min = 17; /* (3000 * nQmfChannels / fsSBR ) + 0.5 */
178 break;
179 case 12000: k0_min = 16; /* (3000 * nQmfChannels / fsSBR ) + 0.5 */
180 break;
181 case 16000: k0_min = 16; /* (4000 * nQmfChannels / fsSBR ) + 0.5 */
182 break;
183 case 22050: k0_min = 12; /* (4000 * nQmfChannels / fsSBR ) + 0.5 */
184 break;
185 case 24000: k0_min = 11; /* (4000 * nQmfChannels / fsSBR ) + 0.5 */
186 break;
187 case 32000: k0_min = 10; /* (5000 * nQmfChannels / fsSBR ) + 0.5 */
188 break;
189 case 44100: k0_min = 7; /* (5000 * nQmfChannels / fsSBR ) + 0.5 */
190 break;
191 case 48000: k0_min = 7; /* (5000 * nQmfChannels / fsSBR ) + 0.5 */
192 break;
193 case 96000: k0_min = 3; /* (5000 * nQmfChannels / fsSBR ) + 0.5 */
191194 break;
192195 default:
193196 k0_min=11; /* illegal fs */
194197 }
195198
196199
197 switch (fs) {
198
199 case 16000:
200 switch (fsCore) {
201
202 case 8000:
200203 {
201204 INT v_offset[]= {-8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7};
202205 return (k0_min + v_offset[start_freq]);
203206 }
204 case 22050:
207 case 11025:
205208 {
206209 INT v_offset[]= {-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13};
207210 return (k0_min + v_offset[start_freq]);
208211 }
209 case 24000:
212 case 12000:
210213 {
211214 INT v_offset[]= {-5, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16};
212215 return (k0_min + v_offset[start_freq]);
213216 }
214 case 32000:
217 case 16000:
215218 {
216219 INT v_offset[]= {-6, -4, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16};
217220 return (k0_min + v_offset[start_freq]);
218221 }
222 case 22050:
223 case 24000:
224 case 32000:
225 {
226 INT v_offset[]= {-4, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16, 20};
227 return (k0_min + v_offset[start_freq]);
228 }
219229 case 44100:
220230 case 48000:
221 case 64000:
222 {
223 INT v_offset[]= {-4, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16, 20};
224 return (k0_min + v_offset[start_freq]);
225 }
226 case 88200:
227231 case 96000:
228232 {
229233 INT v_offset[]= {-2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16, 20, 24};
248252 Return:
249253 *******************************************************************************/
250254 static INT
251 getStopFreq(INT fs, const INT stop_freq, const INT noChannels)
255 getStopFreq(INT fsCore, const INT stop_freq)
252256 {
253257 INT result,i;
254258 INT k1_min;
255259 INT v_dstop[13];
256
257260
258261 INT *v_stop_freq = NULL;
259262 INT v_stop_freq_16[14] = {48,49,50,51,52,54,55,56,57,59,60,61,63,64};
265268 INT v_stop_freq_64[14] = {20,22,24,26,29,31,34,37,41,45,49,54,59,64};
266269 INT v_stop_freq_88[14] = {15,17,19,21,23,26,29,33,37,41,46,51,57,64};
267270 INT v_stop_freq_96[14] = {13,15,17,19,21,24,27,31,35,39,44,50,57,64};
268
269 switch(fs){
270 case 16000: k1_min = 48;
271 INT v_stop_freq_192[14] = {7, 8,10,12,14,16,19,23,27,32,38,46,54,64};
272
273 switch(fsCore){
274 case 8000: k1_min = 48;
271275 v_stop_freq =v_stop_freq_16;
272276 break;
273 case 22050: k1_min = 35;
277 case 11025: k1_min = 35;
274278 v_stop_freq =v_stop_freq_22;
275279 break;
276 case 24000: k1_min = 32;
280 case 12000: k1_min = 32;
277281 v_stop_freq =v_stop_freq_24;
278282 break;
279 case 32000: k1_min = 32;
283 case 16000: k1_min = 32;
280284 v_stop_freq =v_stop_freq_32;
281285 break;
282 case 44100: k1_min = 23;
286 case 22050: k1_min = 23;
283287 v_stop_freq =v_stop_freq_44;
284288 break;
285 case 48000: k1_min = 21;
289 case 24000: k1_min = 21;
286290 v_stop_freq =v_stop_freq_48;
287291 break;
288 case 64000: k1_min = 20;
292 case 32000: k1_min = 20;
289293 v_stop_freq =v_stop_freq_64;
290294 break;
291 case 88200: k1_min = 15;
295 case 44100: k1_min = 15;
292296 v_stop_freq =v_stop_freq_88;
293297 break;
294 case 96000: k1_min = 13;
298 case 48000: k1_min = 13;
295299 v_stop_freq =v_stop_freq_96;
300 break;
301 case 96000: k1_min = 7;
302 v_stop_freq =v_stop_freq_192;
296303 break;
297304 default:
298305 k1_min = 21; /* illegal fs */
299306 }
300307
301
308 /* if no valid core samplingrate is used this loop produces
309 a segfault, because v_stop_freq is not initialized */
302310 /* Ensure increasing bandwidth */
303311 for(i = 0; i <= 12; i++) {
304312 v_dstop[i] = v_stop_freq[i+1] - v_stop_freq[i];
321329 *******************************************************************************
322330 Description:
323331
324 Arguments:
325
326 Return:
332 Arguments: srSbr SBR sampling freqency
333 srCore AAC core sampling freqency
334 noChannels Number of QMF channels
335 startFreq SBR start frequency in QMF bands
336 stopFreq SBR start frequency in QMF bands
337
338 *k0 Output parameter
339 *k2 Output parameter
340
341 Return: Error code (0 is OK)
327342 *******************************************************************************/
328343 INT
329 FDKsbrEnc_FindStartAndStopBand(const INT samplingFreq,
330 const INT noChannels,
331 const INT startFreq,
332 const INT stopFreq,
333 const SR_MODE sampleRateMode,
334 INT *k0,
335 INT *k2)
344 FDKsbrEnc_FindStartAndStopBand(
345 const INT srSbr,
346 const INT srCore,
347 const INT noChannels,
348 const INT startFreq,
349 const INT stopFreq,
350 INT *k0,
351 INT *k2
352 )
336353 {
337354
338355 /* Update startFreq struct */
339 *k0 = getStartFreq(samplingFreq, startFreq);
356 *k0 = getStartFreq(srCore, startFreq);
340357
341358 /* Test if start freq is outside corecoder range */
342 if( ( sampleRateMode == 1 ) &&
343 ( samplingFreq*noChannels <
344 2**k0 * samplingFreq) ) {
359 if( srSbr*noChannels < *k0 * srCore ) {
345360 return (1); /* raise the cross-over frequency and/or lower the number
346361 of target bands per octave (or lower the sampling frequency) */
347362 }
348363
349364 /*Update stopFreq struct */
350365 if ( stopFreq < 14 ) {
351 *k2 = getStopFreq(samplingFreq, stopFreq, noChannels);
366 *k2 = getStopFreq(srCore, stopFreq);
352367 } else if( stopFreq == 14 ) {
353368 *k2 = 2 * *k0;
354369 } else {
363378
364379
365380 /* Test for invalid k0 k2 combinations */
366 if ( (samplingFreq == 44100) && ( (*k2 - *k0) > MAX_FREQ_COEFFS_FS44100 ) )
381 if ( (srCore == 22050) && ( (*k2 - *k0) > MAX_FREQ_COEFFS_FS44100 ) )
367382 return (1); /* Number of bands exceeds valid range of MAX_FREQ_COEFFS for fs=44.1kHz */
368383
369 if ( (samplingFreq >= 48000) && ( (*k2 - *k0) > MAX_FREQ_COEFFS_FS48000 ) )
384 if ( (srCore >= 24000) && ( (*k2 - *k0) > MAX_FREQ_COEFFS_FS48000 ) )
370385 return (1); /* Number of bands exceeds valid range of MAX_FREQ_COEFFS for fs>=48kHz */
371386
372387 if ((*k2 - *k0) > MAX_FREQ_COEFFS)
389404 Return:
390405 *******************************************************************************/
391406 INT
392 FDKsbrEnc_UpdateFreqScale(UCHAR *v_k_master, INT *h_num_bands,
393 const INT k0, const INT k2,
394 const INT freqScale,
395 const INT alterScale)
407 FDKsbrEnc_UpdateFreqScale(
408 UCHAR *v_k_master,
409 INT *h_num_bands,
410 const INT k0,
411 const INT k2,
412 const INT freqScale,
413 const INT alterScale
414 )
396415
397416 {
398417
399418 INT b_p_o = 0; /* bands_per_octave */
400 FIXP_DBL warp = FL2FXCONST_DBL(0.0f);
419 FIXP_DBL warp = FL2FXCONST_DBL(0.0f);
401420 INT dk = 0;
402421
403422 /* Internal variables */
425444 warp = FL2FXCONST_DBL(1.0f/2.6f); /* 1.0/(1.3*2.0); */
426445
427446
428 if(4*k2 >= 9*k0) /*two or more regions*/
447 if(4*k2 >= 9*k0) /*two or more regions (how many times the basis band is copied)*/
429448 {
430449 k1=2*k0;
431450
591610 *******************************************************************************
592611 Description:
593612
613
594614 Arguments:
595615
596616 Return:
597617 *******************************************************************************/
598618 INT
599 FDKsbrEnc_UpdateHiRes(UCHAR *h_hires, INT *num_hires,UCHAR * v_k_master,
600 INT num_master , INT *xover_band, SR_MODE drOrSr,
601 INT noQMFChannels)
619 FDKsbrEnc_UpdateHiRes(
620 UCHAR *h_hires,
621 INT *num_hires,
622 UCHAR *v_k_master,
623 INT num_master,
624 INT *xover_band
625 )
602626 {
603627 INT i;
604 INT divider;
605628 INT max1,max2;
606629
607 /* Check if we use a Dual rate => diver=2 else 1 */
608 divider = (drOrSr == DUAL_RATE) ? 2 : 1;
609
610 if( (v_k_master[*xover_band] > (noQMFChannels/divider) ) ||
630 if( (v_k_master[*xover_band] > 32 ) || /* v_k_master[*xover_band] > noQMFChannels(dualRate)/divider */
611631 ( *xover_band > num_master ) ) {
612632 /* xover_band error, too big for this startFreq. Will be clipped */
613633
614634 /* Calculate maximum value for xover_band */
615635 max1=0;
616636 max2=num_master;
617 while( (v_k_master[max1+1] < (noQMFChannels/divider)) &&
637 while( (v_k_master[max1+1] < 32 ) && /* noQMFChannels(dualRate)/divider */
618638 ( (max1+1) < max2) )
619639 {
620640 max1++;
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
9595
9696
9797 INT
98 FDKsbrEnc_UpdateFreqScale(UCHAR *v_k_master, INT *h_num_bands,
99 const INT k0, const INT k2,
100 const INT freq_scale,
101 const INT alter_scale);
98 FDKsbrEnc_UpdateFreqScale(
99 UCHAR *v_k_master,
100 INT *h_num_bands,
101 const INT k0,
102 const INT k2,
103 const INT freq_scale,
104 const INT alter_scale
105 );
102106
103107 INT
104 FDKsbrEnc_UpdateHiRes(UCHAR *h_hires,
105 INT *num_hires,
106 UCHAR *v_k_master,
107 INT num_master ,
108 INT *xover_band,
109 SR_MODE drOrSr,
110 INT noQMFChannels);
108 FDKsbrEnc_UpdateHiRes(
109 UCHAR *h_hires,
110 INT *num_hires,
111 UCHAR *v_k_master,
112 INT num_master,
113 INT *xover_band
114 );
111115
112 void FDKsbrEnc_UpdateLoRes(UCHAR * v_lores,
113 INT *num_lores,
114 UCHAR * v_hires,
115 INT num_hires);
116 void FDKsbrEnc_UpdateLoRes(
117 UCHAR *v_lores,
118 INT *num_lores,
119 UCHAR *v_hires,
120 INT num_hires
121 );
116122
117123 INT
118 FDKsbrEnc_FindStartAndStopBand(const INT samplingFreq,
119 const INT noChannels,
120 const INT startFreq,
121 const INT stop_freq,
122 const SR_MODE sampleRateMode,
123 INT *k0,
124 INT *k2);
124 FDKsbrEnc_FindStartAndStopBand(
125 const INT srSbr,
126 const INT srCore,
127 const INT noChannels,
128 const INT startFreq,
129 const INT stop_freq,
130 INT *k0,
131 INT *k2
132 );
125133
126 INT FDKsbrEnc_getSbrStartFreqRAW (INT startFreq, INT QMFbands, INT fs );
127 INT FDKsbrEnc_getSbrStopFreqRAW (INT stopFreq, INT QMFbands, INT fs);
134 INT FDKsbrEnc_getSbrStartFreqRAW (INT startFreq, INT fsCore);
135 INT FDKsbrEnc_getSbrStopFreqRAW (INT stopFreq, INT fsCore);
128136 #endif
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
301301 timeIndex++;
302302 }
303303 }
304
305 FDK_ASSERT(noEstPerFrame == 2);
306304
307305
308306 C_ALLOC_SCRATCH_END(realBuf, FIXP_DBL, 2*BAND_V_SIZE*NUM_V_COMBINE);
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
142142 TT_RSVD50 = 50 /**< */
143143
144144 } TRANSPORT_TYPE;
145
146 #define TT_IS_PACKET(x) \
147 ( ((x) == TT_MP4_RAW) \
148 || ((x) == TT_DRM) \
149 || ((x) == TT_MP4_LATM_MCP0) \
150 || ((x) == TT_MP4_LATM_MCP1) )
145151
146152 /**
147153 * Audio Object Type definitions.
227233
228234 /** Channel Mode ( 1-7 equals MPEG channel configurations, others are arbitrary). */
229235 typedef enum {
230 MODE_INVALID = -1,
231 MODE_UNKNOWN = 0,
232 MODE_1 = 1, /**< SCE */
233 MODE_2 = 2, /**< CPE */
234 MODE_1_2 = 3, /**< SCE,CPE */
235 MODE_1_2_1 = 4, /**< SCE,CPE,SCE */
236 MODE_1_2_2 = 5, /**< SCE,CPE,CPE */
237 MODE_1_2_2_1 = 6, /**< SCE,CPE,CPE,LFE */
238 MODE_1_2_2_2_1 = 7, /**< SCE,CPE,CPE,CPE,LFE */
239
240 MODE_1_1 = 16, /**< 2 SCEs (dual mono) */
241 MODE_1_1_1_1 = 17, /**< 4 SCEs */
242 MODE_1_1_1_1_1_1 = 18, /**< 6 SCEs */
243 MODE_1_1_1_1_1_1_1_1 = 19, /**< 8 SCEs */
244 MODE_1_1_1_1_1_1_1_1_1_1_1_1 = 20, /**< 12 SCEs */
245
246 MODE_2_2 = 21, /**< 2 CPEs */
247 MODE_2_2_2 = 22, /**< 3 CPEs */
248 MODE_2_2_2_2 = 23, /**< 4 CPEs */
249 MODE_2_2_2_2_2_2 = 24, /**< 6 CPEs */
250
251 MODE_2_1 = 30 /**< CPE,SCE (ARIB standard) */
236 MODE_INVALID = -1,
237 MODE_UNKNOWN = 0,
238 MODE_1 = 1, /**< C */
239 MODE_2 = 2, /**< L+R */
240 MODE_1_2 = 3, /**< C, L+R */
241 MODE_1_2_1 = 4, /**< C, L+R, Rear */
242 MODE_1_2_2 = 5, /**< C, L+R, LS+RS */
243 MODE_1_2_2_1 = 6, /**< C, L+R, LS+RS, LFE */
244 MODE_1_2_2_2_1 = 7, /**< C, LC+RC, L+R, LS+RS, LFE */
245
246
247 MODE_1_1 = 16, /**< 2 SCEs (dual mono) */
248 MODE_1_1_1_1 = 17, /**< 4 SCEs */
249 MODE_1_1_1_1_1_1 = 18, /**< 6 SCEs */
250 MODE_1_1_1_1_1_1_1_1 = 19, /**< 8 SCEs */
251 MODE_1_1_1_1_1_1_1_1_1_1_1_1 = 20, /**< 12 SCEs */
252
253 MODE_2_2 = 21, /**< 2 CPEs */
254 MODE_2_2_2 = 22, /**< 3 CPEs */
255 MODE_2_2_2_2 = 23, /**< 4 CPEs */
256 MODE_2_2_2_2_2_2 = 24, /**< 6 CPEs */
257
258 MODE_2_1 = 30, /**< CPE,SCE (ARIB standard B32) */
259
260 MODE_7_1_REAR_SURROUND = 33, /**< C, L+R, LS+RS, Lrear+Rrear, LFE */
261 MODE_7_1_FRONT_CENTER = 34 /**< C, LC+RC, L+R, LS+RS, LFE */
252262
253263 } CHANNEL_MODE;
254264
264274 ACT_BACK_TOP,
265275 ACT_TOP /* Ts */
266276 } AUDIO_CHANNEL_TYPE;
277
278 typedef enum
279 {
280 SIG_UNKNOWN = -1,
281 SIG_IMPLICIT = 0,
282 SIG_EXPLICIT_BW_COMPATIBLE = 1,
283 SIG_EXPLICIT_HIERARCHICAL = 2
284
285 } SBR_PS_SIGNALING;
267286
268287 /**
269288 * Audio Codec flags.
327346
328347 UCHAR stereoConfigIndex; /**< USAC MPS stereo mode */
329348 UCHAR sbrMode; /**< USAC SBR mode */
349 SBR_PS_SIGNALING sbrSignaling;/**< 0: implicit signaling, 1: backwards compatible explicit signaling, 2: hierarcical explicit signaling */
350
351 UCHAR sbrPresent;
352 UCHAR psPresent;
330353 } CODER_CONFIG;
331354
332355 /** MP4 Element IDs. */
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
110110 extern "C" {
111111 #endif
112112
113 #define SPEAKER_FRONT_LEFT 0x1
114 #define SPEAKER_FRONT_RIGHT 0x2
115 #define SPEAKER_FRONT_CENTER 0x4
116 #define SPEAKER_LOW_FREQUENCY 0x8
117 #define SPEAKER_BACK_LEFT 0x10
118 #define SPEAKER_BACK_RIGHT 0x20
119 #define SPEAKER_FRONT_LEFT_OF_CENTER 0x40
120 #define SPEAKER_FRONT_RIGHT_OF_CENTER 0x80
121 #define SPEAKER_BACK_CENTER 0x100
122 #define SPEAKER_SIDE_LEFT 0x200
123 #define SPEAKER_SIDE_RIGHT 0x400
124 #define SPEAKER_TOP_CENTER 0x800
125 #define SPEAKER_TOP_FRONT_LEFT 0x1000
126 #define SPEAKER_TOP_FRONT_CENTER 0x2000
127 #define SPEAKER_TOP_FRONT_RIGHT 0x4000
128 #define SPEAKER_TOP_BACK_LEFT 0x8000
129 #define SPEAKER_TOP_BACK_CENTER 0x10000
130 #define SPEAKER_TOP_BACK_RIGHT 0x20000
131 #define SPEAKER_RESERVED 0x80000000
132
113133 /*!
114134 * RIFF WAVE file struct.
115135 * For details see WAVE file format documentation (for example at http://www.wotsit.org).
116136 */
117137 typedef struct WAV_HEADER
118138 {
119 char riffType[4];
139 char riffType[4];
120140 UINT riffSize;
121 char waveType[4];
122 char formatType[4];
141 char waveType[4];
142 char formatType[4];
123143 UINT formatSize;
124144 USHORT compressionCode;
125145 USHORT numChannels;
127147 UINT bytesPerSecond;
128148 USHORT blockAlign;
129149 USHORT bitsPerSample;
130 char dataType[4];
150 char dataType[4];
131151 UINT dataSize;
132152 } WAV_HEADER;
133153
135155 {
136156 WAV_HEADER header;
137157 FDKFILE *fp;
158 UINT channelMask;
138159 };
139160
140161 typedef struct WAV *HANDLE_WAV;
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
464464
465465 for ( i = 0; i < _tcslen(arg); ++i )
466466 {
467 if ( (type == 'd') && !_istdigit(arg[i]) && arg[i] != 'x' )
467 if ( (type == 'd') && !_istdigit(arg[i]) && arg[i] != 'x' && arg[i] != '-')
468468 {
469469 #ifdef _UNICODE
470470 _ftprintf(stderr, _TEXT("\n\nError: Argument '%ls' for switch '%ls' is not a valid number.\n" ), arg, cur_str);
548548 /* Skip consecutive blanks. */
549549 while (*line_ptr == ' ' && line_ptr < line+CMDL_MAX_STRLEN)
550550 line_ptr++;
551 /* Assign argument. TODO: maybe handle quotes */
551 /* Assign argument. */
552552 argv_ptr[argc] = line_ptr;
553553 /* Get pointer to next blank. */
554554 line_ptr = (char*)FDKstrchr(line_ptr, ' ');
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
9797
9898 /* library info */
9999 #define SYS_LIB_VL0 1
100 #define SYS_LIB_VL1 2
101 #define SYS_LIB_VL2 2
100 #define SYS_LIB_VL1 3
101 #define SYS_LIB_VL2 4
102102 #define SYS_LIB_TITLE "System Integration Library"
103103 #define SYS_LIB_BUILD_DATE __DATE__
104104 #define SYS_LIB_BUILD_TIME __TIME__
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
11 /* -----------------------------------------------------------------------------------------------------------
22 Software License for The Fraunhofer FDK AAC Codec Library for Android
33
4 © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
4 © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V.
55 All rights reserved.
66
77 1. INTRODUCTION
173173 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71
174174 };
175175 USHORT extraFormatBytes, validBitsPerSample;
176 UINT channelMask;
177176 UCHAR guid[16];
178177 INT i;
179178
183182
184183 if (extraFormatBytes >= 22) {
185184 FDKfread_EL(&(validBitsPerSample), 2, 1, wav->fp);
186 FDKfread_EL(&(channelMask), 4, 1, wav->fp);
185 FDKfread_EL(&(wav->channelMask), 4, 1, wav->fp);
187186 FDKfread_EL(&(guid), 16, 1, wav->fp);
188187
189188 /* check for PCM GUID */
227226
228227 /* Error path */
229228 error:
230 if (wav->fp) {
231 FDKfclose(wav->fp);
232 wav->fp = NULL;
233 }
234229
235230 if (wav) {
231 if (wav->fp) {
232 FDKfclose(wav->fp);
233 wav->fp = NULL;
234 }
236235 FDKfree(wav);
237236 }
238237
387386 HANDLE_WAV wav = (HANDLE_WAV)FDKcalloc(1, sizeof(struct WAV));
388387 UINT size = 0;
389388
389 if (wav == NULL) {
390 FDKprintfErr("WAV_OutputOpen(): Unable to allocate WAV struct.\n");
391 goto bail;
392 }
393
390394 if (bitsPerSample != 16 && bitsPerSample != 24 && bitsPerSample != 32)
391395 {
392396 FDKprintfErr("WAV_OutputOpen(): Invalid argument (bitsPerSample).\n");
432436 return 0;
433437
434438 bail:
435 if (wav->fp)
436 FDKfclose(wav->fp);
437 if (wav)
439 if (wav) {
440 if (wav->fp) {
441 FDKfclose(wav->fp);
442 }
438443 FDKfree(wav);
444 }
439445
440446 pWav = NULL;
441447