Imported Upstream version 0.1.3
Alessio Treglia
9 years ago
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 | ||
0 | 4 | 0.1.2 |
1 | 5 | - Fix a few more crashes |
2 | 6 | - Include dependency libs (such as -lm) in the pkg-config file |
183 | 183 | $(PCMUTILS_SRC) $(FDK_SRC) $(SYS_SRC) |
184 | 184 | |
185 | 185 | EXTRA_DIST = \ |
186 | $(top_srcdir)/autogen.sh \ | |
186 | 187 | $(top_srcdir)/NOTICE \ |
187 | 188 | $(top_srcdir)/Android.mk \ |
188 | 189 | $(top_srcdir)/fdk-aac.sym \ |
0 | 0 | dnl -*- Autoconf -*- |
1 | 1 | dnl Process this file with autoconf to produce a configure script. |
2 | 2 | |
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/]) | |
4 | 4 | AC_CONFIG_AUX_DIR(.) |
5 | 5 | AC_CONFIG_MACRO_DIR([m4]) |
6 | 6 | AM_INIT_AUTOMAKE([tar-ustar foreign]) |
25 | 25 | dnl soname version to use |
26 | 26 | dnl goes by ‘current[:revision[:age]]’ with the soname ending up as |
27 | 27 | dnl current.age.revision |
28 | FDK_AAC_VERSION=0:3:0 | |
28 | FDK_AAC_VERSION=0:4:0 | |
29 | 29 | |
30 | 30 | AS_IF([test x$enable_shared = xyes], [LIBS_PRIVATE=$LIBS], [LIBS_PUBLIC=$LIBS]) |
31 | 31 | AC_SUBST(FDK_AAC_VERSION) |
Binary diff not shown
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
503 | 503 | INT aacSamplesPerFrame; /*!< Samples per frame for the AAC core (from ASC). \n |
504 | 504 | 1024 or 960 for AAC-LC \n |
505 | 505 | 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! */ | |
507 | 508 | AUDIO_OBJECT_TYPE extAot; /*!< Extension Audio Object Type (from ASC) */ |
508 | 509 | INT extSamplingRate; /*!< Extension sampling rate in Hz (from ASC) */ |
509 | 510 |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
134 | 134 | /* init params */ |
135 | 135 | pParams = &self->params; |
136 | 136 | 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); | |
139 | 141 | pParams->targetRefLevel = AACDEC_DRC_DEFAULT_REF_LEVEL; |
140 | 142 | pParams->expiryFrame = AACDEC_DRC_DFLT_EXPIRY_FRAMES; |
143 | pParams->applyHeavyCompression = 0; | |
141 | 144 | |
142 | 145 | /* initial program ref level = target ref level */ |
143 | 146 | self->progRefLevel = pParams->targetRefLevel; |
192 | 195 | if (self == NULL) { |
193 | 196 | return AAC_DEC_INVALID_HANDLE; |
194 | 197 | } |
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; | |
196 | 201 | break; |
197 | 202 | case DRC_BOOST_SCALE: |
198 | 203 | /* set boost factor */ |
203 | 208 | if (self == NULL) { |
204 | 209 | return AAC_DEC_INVALID_HANDLE; |
205 | 210 | } |
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; | |
207 | 214 | break; |
208 | 215 | case TARGET_REF_LEVEL: |
209 | 216 | if ( value > MAX_REFERENCE_LEVEL |
219 | 226 | else { |
220 | 227 | /* ref_level must be between 0 and MAX_REFERENCE_LEVEL, inclusive */ |
221 | 228 | 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 | } | |
225 | 234 | } |
226 | 235 | break; |
227 | 236 | case APPLY_HEAVY_COMPRESSION: |
231 | 240 | if (self == NULL) { |
232 | 241 | return AAC_DEC_INVALID_HANDLE; |
233 | 242 | } |
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 | } | |
235 | 256 | break; |
236 | 257 | case DRC_BS_DELAY: |
237 | 258 | if (value < 0 || value > 1) { |
472 | 493 | } |
473 | 494 | } |
474 | 495 | else { |
475 | pDrcBs->channelData.bandTop[0] = 255; | |
496 | pDrcBs->channelData.bandTop[0] = (1024 >> 2) - 1; /* ... comprising the whole spectrum. */; | |
476 | 497 | } |
477 | 498 | |
478 | 499 | pDrcBs->channelData.numBands = numBands; |
626 | 647 | { |
627 | 648 | CDrcPayload threadBs[MAX_DRC_THREADS]; |
628 | 649 | CDrcPayload *validThreadBs[MAX_DRC_THREADS]; |
650 | CDrcParams *pParams; | |
629 | 651 | UINT backupBsPosition; |
630 | 652 | int i, thread, validThreads = 0; |
631 | 653 | 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; | |
632 | 660 | |
633 | 661 | self->numThreads = 0; |
634 | 662 | backupBsPosition = FDKgetValidBits(hBs); |
751 | 779 | */ |
752 | 780 | if (pThreadBs->progRefLevel >= 0) { |
753 | 781 | self->progRefLevel = pThreadBs->progRefLevel; |
782 | self->prlExpiryCount = 0; /* Got a new value -> Reset counter */ | |
754 | 783 | } |
755 | 784 | |
756 | 785 | /* SCE, CPE and LFE */ |
766 | 795 | } |
767 | 796 | } |
768 | 797 | /* 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; | |
769 | 806 | } |
770 | 807 | |
771 | 808 | return 0; |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
142 | 142 | UCHAR channelMapping[], |
143 | 143 | int numChannels ); |
144 | 144 | |
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 | */ | |
145 | 155 | void aacDecoder_drcApply ( |
146 | 156 | HANDLE_AAC_DRC self, |
147 | 157 | void *pSbrDec, |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
131 | 131 | |
132 | 132 | typedef struct |
133 | 133 | { |
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. */ | |
136 | 138 | |
137 | 139 | UINT expiryFrame; |
138 | 140 | SCHAR targetRefLevel; |
153 | 155 | USHORT numThreads; /* The number of DRC data threads extracted from the found payload elements */ |
154 | 156 | SCHAR progRefLevel; /* Program reference level for all channels */ |
155 | 157 | |
158 | UINT prlExpiryCount; /* Counter that can be used to monitor the life time of the program reference level. */ | |
159 | ||
156 | 160 | UCHAR dvbAncDataAvailable; /* Flag that indicates whether DVB ancillary data is present or not */ |
157 | 161 | UINT dvbAncDataPosition; /* Used to store the DVB ancillary data payload position in the bitstream (only one per frame) */ |
158 | 162 | UINT drcPayloadPosition[MAX_DRC_THREADS]; /* Used to store the DRC payload positions in the bitstream */ |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
182 | 182 | if ( self->qmfModeCurr == NOT_DEFINED ) |
183 | 183 | { |
184 | 184 | if ( (IS_LOWDELAY(self->streamInfo.aot) && (self->flags & AC_MPS_PRESENT)) |
185 | || ( (self->ascChannels == 1) | |
185 | || ( (self->streamInfo.aacNumChannels == 1) | |
186 | 186 | && ( (CAN_DO_PS(self->streamInfo.aot) && !(self->flags & AC_MPS_PRESENT)) |
187 | 187 | || ( IS_USAC(self->streamInfo.aot) && (self->flags & AC_MPS_PRESENT)) ) ) ) |
188 | 188 | { |
195 | 195 | |
196 | 196 | /* Set SBR to current QMF mode. Error does not matter. */ |
197 | 197 | 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 ; | |
199 | 199 | FDK_ASSERT( ! ( (self->flags & AC_MPS_PRESENT) && self->psPossible ) ); |
200 | 200 | } |
201 | 201 | |
372 | 372 | |
373 | 373 | { |
374 | 374 | INT readBits, dataBits = count<<3; |
375 | ||
375 | ||
376 | 376 | /* Move to the beginning of the data junk */ |
377 | 377 | FDKpushBack(bs, dataStart-FDKgetValidBits(bs)); |
378 | 378 | |
393 | 393 | \brief Read Program Config Element |
394 | 394 | |
395 | 395 | \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). | |
399 | 402 | */ |
400 | static AAC_DECODER_ERROR CProgramConfigElement_Read ( | |
403 | static int CProgramConfigElement_Read ( | |
401 | 404 | HANDLE_FDK_BITSTREAM bs, |
402 | 405 | HANDLE_TRANSPORTDEC pTp, |
403 | 406 | CProgramConfig *pce, |
404 | UINT channelConfig, | |
405 | UINT alignAnchor ) | |
407 | const UINT channelConfig, | |
408 | const UINT alignAnchor ) | |
406 | 409 | { |
407 | AAC_DECODER_ERROR error = AAC_DEC_OK; | |
410 | int pceStatus = 0; | |
408 | 411 | int crcReg; |
409 | 412 | |
410 | 413 | /* read PCE to temporal buffer first */ |
411 | 414 | C_ALLOC_SCRATCH_START(tmpPce, CProgramConfig, 1); |
412 | ||
415 | ||
413 | 416 | CProgramConfig_Init(tmpPce); |
414 | 417 | CProgramConfig_Reset(tmpPce); |
415 | 418 | |
420 | 423 | transportDec_CrcEndReg(pTp, crcReg); |
421 | 424 | |
422 | 425 | 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) | |
429 | 426 | && (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 | } | |
432 | 456 | } |
433 | 457 | |
434 | 458 | C_ALLOC_SCRATCH_END(tmpPce, CProgramConfig, 1); |
435 | 459 | |
436 | return error; | |
460 | return pceStatus; | |
437 | 461 | } |
438 | #endif | |
462 | #endif /* TP_PCE_ENABLE */ | |
439 | 463 | |
440 | 464 | /*! |
441 | 465 | \brief Parse Extension Payload |
590 | 614 | { /* ... created to circumvent the missing length in ER-Syntax. */ |
591 | 615 | int bitCnt, len = FDKreadBits(hBs, 4); |
592 | 616 | *count -= 4; |
593 | ||
617 | ||
594 | 618 | if (len == 15) { |
595 | 619 | int add_len = FDKreadBits(hBs, 8); |
596 | 620 | *count -= 8; |
608 | 632 | /* Check NOTE 2: The extension_payload() included here must |
609 | 633 | not have extension_type == EXT_DATA_LENGTH. */ |
610 | 634 | error = AAC_DEC_PARSE_ERROR; |
611 | goto bail; | |
612 | } | |
613 | else { | |
635 | } else { | |
614 | 636 | /* rewind and call myself again. */ |
615 | 637 | FDKpushBack(hBs, 4); |
616 | 638 | |
621 | 643 | &bitCnt, |
622 | 644 | previous_element, |
623 | 645 | elIndex, |
624 | 1 ); /* Treat same as fill element */ | |
646 | 0 ); | |
625 | 647 | |
626 | 648 | *count -= len - bitCnt; |
627 | 649 | } |
753 | 775 | |
754 | 776 | for (ch=0; ch<(6); ch++) { |
755 | 777 | 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 | } | |
758 | 784 | } |
759 | 785 | if (self->pAacDecoderChannelInfo[ch] != NULL) { |
760 | 786 | FreeAacDecoderChannelInfo (&self->pAacDecoderChannelInfo[ch]); |
767 | 793 | FreeDrcInfo(&self->hDrcInfo); |
768 | 794 | } |
769 | 795 | |
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 | } | |
772 | 802 | |
773 | 803 | FreeAacDecoder ( &self); |
774 | 804 | } |
993 | 1023 | CPns_InitPns(&self->pAacDecoderChannelInfo[ch]->data.aac.PnsData, &self->aacCommonData.pnsInterChannelData, &self->aacCommonData.pnsCurrentSeed, self->aacCommonData.pnsRandomSeed); |
994 | 1024 | } |
995 | 1025 | |
1026 | if (ascChannels > self->aacChannels) | |
1027 | { | |
1028 | /* Make allocated channel count persistent in decoder context. */ | |
1029 | self->aacChannels = ascChannels; | |
1030 | } | |
996 | 1031 | |
997 | 1032 | HcrInitRom(&self->aacCommonData.overlay.aac.erHcrInfo); |
998 | 1033 | setHcrType(&self->aacCommonData.overlay.aac.erHcrInfo, ID_SCE); |
999 | ||
1000 | /* Make allocated channel count persistent in decoder context. */ | |
1001 | self->aacChannels = ascChannels; | |
1002 | 1034 | } |
1003 | 1035 | |
1004 | 1036 | /* Make amount of signalled channels persistent in decoder context. */ |
1008 | 1040 | /* Update structures */ |
1009 | 1041 | if (ascChanged) { |
1010 | 1042 | |
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++) { | |
1013 | 1047 | switch (self->streamInfo.aot) { |
1014 | 1048 | case AOT_ER_AAC_ELD: |
1015 | 1049 | case AOT_ER_AAC_LD: |
1240 | 1274 | else { |
1241 | 1275 | self->frameOK = 0; |
1242 | 1276 | } |
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) ) | |
1247 | 1281 | { |
1248 | 1282 | SBR_ERROR sbrError; |
1249 | 1283 | |
1253 | 1287 | self->streamInfo.extSamplingRate, |
1254 | 1288 | self->streamInfo.aacSamplesPerFrame, |
1255 | 1289 | self->streamInfo.aot, |
1256 | ID_LFE, | |
1290 | type, | |
1257 | 1291 | previous_element_index |
1258 | 1292 | ); |
1259 | 1293 | if (sbrError != SBRDEC_OK) { |
1393 | 1427 | |
1394 | 1428 | #ifdef TP_PCE_ENABLE |
1395 | 1429 | case ID_PCE: |
1396 | ||
1397 | if ( CProgramConfigElement_Read( bs, | |
1430 | { | |
1431 | int result = CProgramConfigElement_Read( | |
1432 | bs, | |
1398 | 1433 | self->hInput, |
1399 | 1434 | pce, |
1400 | 1435 | 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; | |
1412 | 1440 | self->frameOK = 0; |
1413 | 1441 | } |
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 | } | |
1416 | 1458 | break; |
1417 | 1459 | #endif /* TP_PCE_ENABLE */ |
1418 | 1460 | |
1572 | 1614 | } |
1573 | 1615 | |
1574 | 1616 | /* Update number of output channels */ |
1575 | self->streamInfo.numChannels = aacChannels; | |
1617 | self->streamInfo.aacNumChannels = aacChannels; | |
1576 | 1618 | |
1577 | 1619 | #ifdef TP_PCE_ENABLE |
1578 | 1620 | if (pceRead == 1 && CProgramConfig_IsValid(pce)) { |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
108 | 108 | |
109 | 109 | /* Decoder library info */ |
110 | 110 | #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 | |
113 | 113 | #define AACDECODER_LIB_TITLE "AAC Decoder Lib" |
114 | 114 | #define AACDECODER_LIB_BUILD_DATE __DATE__ |
115 | 115 | #define AACDECODER_LIB_BUILD_TIME __TIME__ |
260 | 260 | HANDLE_SBRDECODER hSbrDec = NULL; |
261 | 261 | HANDLE_AAC_DRC hDrcInfo = NULL; |
262 | 262 | HANDLE_PCM_DOWNMIX hPcmDmx = NULL; |
263 | CConcealmentMethod backupMethod; | |
263 | CConcealmentMethod backupMethod = ConcealMethodNone; | |
264 | 264 | int backupDelay = 0; |
265 | 265 | int bsDelay = 0; |
266 | 266 | |
395 | 395 | AAC_DECODER_ERROR errorStatus = AAC_DEC_OK; |
396 | 396 | CConcealParams *pConcealData = NULL; |
397 | 397 | HANDLE_AAC_DRC hDrcInfo = NULL; |
398 | HANDLE_PCM_DOWNMIX hPcmDmx = NULL; | |
398 | 399 | |
399 | 400 | /* check decoder handle */ |
400 | 401 | if (self != NULL) { |
401 | 402 | pConcealData = &self->concealCommonData; |
402 | 403 | hDrcInfo = self->hDrcInfo; |
404 | hPcmDmx = self->hPcmUtils; | |
405 | } else { | |
406 | errorStatus = AAC_DEC_INVALID_HANDLE; | |
403 | 407 | } |
404 | 408 | |
405 | 409 | /* configure the subsystems */ |
416 | 420 | break; |
417 | 421 | |
418 | 422 | case AAC_PCM_OUTPUT_CHANNELS: |
423 | if (value < -1 || value > (6)) { | |
424 | return AAC_DEC_SET_PARAM_FAIL; | |
425 | } | |
419 | 426 | { |
420 | 427 | PCMDMX_ERROR err; |
421 | 428 | |
422 | 429 | err = pcmDmx_SetParam ( |
423 | self->hPcmUtils, | |
430 | hPcmDmx, | |
424 | 431 | NUMBER_OF_OUTPUT_CHANNELS, |
425 | 432 | value ); |
426 | 433 | |
440 | 447 | PCMDMX_ERROR err; |
441 | 448 | |
442 | 449 | err = pcmDmx_SetParam ( |
443 | self->hPcmUtils, | |
450 | hPcmDmx, | |
444 | 451 | DUAL_CHANNEL_DOWNMIX_MODE, |
445 | 452 | value ); |
446 | 453 | |
458 | 465 | case AAC_PCM_OUTPUT_CHANNEL_MAPPING: |
459 | 466 | switch (value) { |
460 | 467 | case 0: |
461 | self->channelOutputMapping = channelMappingTablePassthrough; | |
468 | if (self != NULL) { | |
469 | self->channelOutputMapping = channelMappingTablePassthrough; | |
470 | } | |
462 | 471 | break; |
463 | 472 | case 1: |
464 | self->channelOutputMapping = channelMappingTableWAV; | |
473 | if (self != NULL) { | |
474 | self->channelOutputMapping = channelMappingTableWAV; | |
475 | } | |
465 | 476 | break; |
466 | 477 | default: |
467 | 478 | errorStatus = AAC_DEC_SET_PARAM_FAIL; |
471 | 482 | |
472 | 483 | |
473 | 484 | case AAC_QMF_LOWPOWER: |
485 | if (value < -1 || value > 1) { | |
486 | return AAC_DEC_SET_PARAM_FAIL; | |
487 | } | |
474 | 488 | if (self == NULL) { |
475 | 489 | return AAC_DEC_INVALID_HANDLE; |
476 | 490 | } |
793 | 807 | /* Export data into streaminfo structure */ |
794 | 808 | self->streamInfo.sampleRate = self->streamInfo.aacSampleRate; |
795 | 809 | self->streamInfo.frameSize = self->streamInfo.aacSamplesPerFrame; |
796 | self->streamInfo.numChannels = self->aacChannels; | |
797 | } | |
810 | } | |
811 | self->streamInfo.numChannels = self->streamInfo.aacNumChannels; | |
798 | 812 | |
799 | 813 | |
800 | 814 | |
831 | 845 | pTimeData, |
832 | 846 | &self->streamInfo.numChannels, |
833 | 847 | &self->streamInfo.sampleRate, |
834 | self->channelOutputMapping[self->aacChannels-1], | |
848 | self->channelOutputMapping[self->streamInfo.numChannels-1], | |
835 | 849 | interleaved, |
836 | 850 | self->frameOK, |
837 | 851 | &self->psPossible); |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
588 | 588 | { |
589 | 589 | H_HCR_INFO hHcr = &pAacDecoderChannelInfo->pComData->overlay.aac.erHcrInfo; |
590 | 590 | int hcrStatus = 0; |
591 | int hcrConcealWholeFrame = 0; | |
592 | 591 | |
593 | 592 | /* advanced Huffman decoding starts here (HCR decoding :) */ |
594 | 593 | if ( pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfReorderedSpectralData != 0 ) { |
597 | 596 | hcrStatus = HcrInit(hHcr, pAacDecoderChannelInfo, pSamplingRateInfo, bs); |
598 | 597 | |
599 | 598 | 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) { | |
600 | 606 | #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); | |
604 | 608 | #else |
605 | 609 | 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; | |
617 | 610 | #endif /* HCR_ERROR_CONCEALMENT */ |
611 | } | |
618 | 612 | |
619 | 613 | FDKpushFor (bs, pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfReorderedSpectralData); |
620 | 614 | } |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
440 | 440 | |
441 | 441 | /* set confort noise level which will be inserted while in state 'muting' */ |
442 | 442 | if (comfNoiseLevel != AACDEC_CONCEAL_PARAM_NOT_SPECIFIED) { |
443 | if ( (comfNoiseLevel < 0) | |
443 | if ( (comfNoiseLevel < -1) | |
444 | 444 | || (comfNoiseLevel > 127) ) { |
445 | 445 | return AAC_DEC_SET_PARAM_FAIL; |
446 | 446 | } |
1526 | 1526 | { |
1527 | 1527 | case ConcealState_Ok: |
1528 | 1528 | 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 | } | |
1531 | 1536 | pConcealmentInfo->cntFadeFrames = 0; |
1532 | 1537 | pConcealmentInfo->cntValidFrames = 0; |
1533 | 1538 | } |
1560 | 1565 | case ConcealState_FadeOut: |
1561 | 1566 | pConcealmentInfo->cntFadeFrames += 1; /* used to address the fade-out factors */ |
1562 | 1567 | 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 | } | |
1568 | 1578 | } else { |
1569 | 1579 | if (pConcealmentInfo->cntFadeFrames >= pConcealCommonData->numFadeOutFrames) { |
1570 | 1580 | /* change to state MUTE */ |
1575 | 1585 | |
1576 | 1586 | case ConcealState_Mute: |
1577 | 1587 | 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 | } | |
1581 | 1596 | } |
1582 | 1597 | break; |
1583 | 1598 | |
1589 | 1604 | pConcealmentInfo->concealState = ConcealState_Ok; |
1590 | 1605 | } |
1591 | 1606 | } 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 | } | |
1597 | 1617 | } |
1598 | 1618 | break; |
1599 | 1619 | |
1624 | 1644 | case ConcealState_Ok: |
1625 | 1645 | if (!(pConcealmentInfo->prevFrameOk[1] || |
1626 | 1646 | (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 | } | |
1629 | 1654 | pConcealmentInfo->cntFadeFrames = 0; |
1630 | 1655 | pConcealmentInfo->cntValidFrames = 0; |
1631 | 1656 | } |
1639 | 1664 | pConcealmentInfo->cntFadeFrames += 1; |
1640 | 1665 | |
1641 | 1666 | 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 | } | |
1647 | 1677 | } else { |
1648 | 1678 | if (pConcealmentInfo->cntFadeFrames >= pConcealCommonData->numFadeOutFrames) { |
1649 | 1679 | /* change to state MUTE */ |
1654 | 1684 | |
1655 | 1685 | case ConcealState_Mute: |
1656 | 1686 | 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 | } | |
1660 | 1695 | } |
1661 | 1696 | break; |
1662 | 1697 | |
1669 | 1704 | pConcealmentInfo->concealState = ConcealState_Ok; |
1670 | 1705 | } |
1671 | 1706 | } 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 | } | |
1677 | 1717 | } |
1678 | 1718 | break; |
1679 | 1719 | } /* End switch(pConcealmentInfo->concealState) */ |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
315 | 315 | channels and sampling rate and is determined as follows. |
316 | 316 | \code |
317 | 317 | 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) | |
319 | 320 | HE-AAC v2 (AOT_PS): 0.5 bits per sample |
320 | 321 | \endcode |
321 | 322 | |
340 | 341 | we recommended to activate this feature. |
341 | 342 | \code aacEncoder_SetParam(hAacEncoder, AACENC_AFTERBURNER, 1); \endcode |
342 | 343 | |
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 | ||
343 | 371 | |
344 | 372 | \section audiochCfg Audio Channel Configuration |
345 | 373 | The MPEG standard refers often to the so-called Channel Configuration. This Channel Configuration is used for a fixed Channel |
348 | 376 | Program Config Element. The present Encoder implementation does not allow the user to configure this Channel Configuration from |
349 | 377 | extern. The Encoder implementation supports fixed Channel Modes which are mapped to Channel Configuration as follow. |
350 | 378 | \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 | ------------------------------------------------------------------------------- | |
361 | 393 | - SCE: Single Channel Element. |
362 | 394 | - CPE: Channel Pair. |
363 | 395 | - SCE: Low Frequency Element. |
373 | 405 | of the audio data depends on the selected ::AACENC_CHANNELORDER which can be MPEG or WAV like order.\n |
374 | 406 | Following Table describes the complete channel mapping for both Channel Order configurations. |
375 | 407 | \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 | --------------------------------------------------------------------------------------- | |
386 | 422 | \endverbatim |
387 | 423 | |
388 | 424 | The denoted mapping is important for correct audio channel assignment when using MPEG or WAV ordering. The incoming audio |
415 | 451 | look-up table is used. |
416 | 452 | |
417 | 453 | 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 | |
420 | 457 | 48 kbit/s to 72 kbit/s achieves reasonable audio quality for AAC-LC. |
421 | 458 | |
422 | 459 | For HE-AAC and HE-AAC v2 the lowest possible audio input sampling frequency is 16 kHz because then the |
433 | 470 | The following table provides an overview of recommended encoder configuration parameters |
434 | 471 | which we determined by virtue of numerous listening tests. |
435 | 472 | |
436 | \subsection reommendedConfigLC AAC-LC, HE-AAC, HE-AACv2. | |
473 | \subsection reommendedConfigLC AAC-LC, HE-AAC, HE-AACv2 in Dualrate SBR mode. | |
437 | 474 | \verbatim |
438 | 475 | ----------------------------------------------------------------------------------- |
439 | 476 | Audio Object Type | Bit Rate Range | Supported | Preferred | No. of |
456 | 493 | -------------------+------------------+-----------------------+------------+------- |
457 | 494 | AAC LC + SBR | 64000 - 69999 | 32.00, 44.10, 48.00 | 32.00 | 5, 5.1 |
458 | 495 | 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 | |
461 | 498 | -------------------+------------------+-----------------------+------------+------- |
462 | 499 | AAC LC | 8000 - 15999 | 11.025, 12.00, 16.00 | 12.00 | 1 |
463 | 500 | AAC LC | 16000 - 23999 | 16.00 | 16.00 | 1 |
480 | 517 | ----------------------------------------------------------------------------------- |
481 | 518 | \endverbatim \n |
482 | 519 | |
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. | |
484 | 521 | \verbatim |
485 | 522 | ----------------------------------------------------------------------------------- |
486 | 523 | Audio Object Type | Bit Rate Range | Supported | Preferred | No. of |
488 | 525 | | | [kHz] | Rate | |
489 | 526 | | | | [kHz] | |
490 | 527 | -------------------+------------------+-----------------------+------------+------- |
491 | ELD + SBR | 16000 - 24999 | 32.00 - 44.10 | 32.00 | 1 | |
528 | ELD + SBR | 18000 - 24999 | 32.00 - 44.10 | 32.00 | 1 | |
492 | 529 | ELD + SBR | 25000 - 31999 | 32.00 - 48.00 | 32.00 | 1 |
493 | 530 | ELD + SBR | 32000 - 64000 | 32.00 - 48.00 | 48.00 | 1 |
494 | 531 | -------------------+------------------+-----------------------+------------+------- |
495 | 532 | ELD + SBR | 32000 - 51999 | 32.00 - 48.00 | 44.10 | 2 |
496 | 533 | ELD + SBR | 52000 - 128000 | 32.00 - 48.00 | 48.00 | 2 |
497 | 534 | -------------------+------------------+-----------------------+------------+------- |
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 | |
503 | 542 | -------------------+------------------+-----------------------+------------+------- |
504 | 543 | LD, ELD | 16000 - 19999 | 16.00 - 24.00 | 16.00 | 1 |
505 | 544 | LD, ELD | 20000 - 39999 | 16.00 - 32.00 | 24.00 | 1 |
530 | 569 | ----------------------------------------------------------------------------------- |
531 | 570 | \endverbatim \n |
532 | 571 | |
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 | ||
533 | 587 | \page ENCODERBEHAVIOUR Encoder Behaviour |
534 | 588 | |
535 | 589 | \section BEHAVIOUR_BANDWIDTH Bandwidth |
536 | 590 | |
537 | 591 | The FDK AAC encoder usually does not use the full frequency range of the input signal, but restricts the bandwidth |
538 | 592 | 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 | |
540 | 599 | |
541 | 600 | However it is not recommended to change these settings, because they are based on numerious listening |
542 | 601 | tests and careful tweaks to ensure the best overall encoding quality. |
637 | 696 | If SBR is activated, the encoder automatically deactivates PNS internally. If TNS is disabled but PNS is allowed, |
638 | 697 | the encoder deactivates PNS calculation internally. |
639 | 698 | |
640 | ||
641 | 699 | */ |
642 | 700 | |
643 | 701 | #ifndef _AAC_ENC_LIB_H_ |
646 | 704 | #include "machine_type.h" |
647 | 705 | #include "FDK_audio.h" |
648 | 706 | |
707 | #define AACENCODER_LIB_VL0 3 | |
708 | #define AACENCODER_LIB_VL1 4 | |
709 | #define AACENCODER_LIB_VL2 12 | |
649 | 710 | |
650 | 711 | /** |
651 | 712 | * AAC encoder error codes. |
857 | 918 | AACENC_SAMPLERATE = 0x0103, /*!< Audio input data sampling rate. Encoder supports following sampling rates: |
858 | 919 | 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000 */ |
859 | 920 | |
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). | |
862 | 924 | - 0: Disable Spectral Band Replication. |
863 | 925 | - 1: Enable Spectral Band Replication. */ |
864 | 926 | |
868 | 930 | - 480: Optional length in LD/ELD configuration. */ |
869 | 931 | |
870 | 932 | 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. */ | |
872 | 934 | |
873 | 935 | AACENC_CHANNELORDER = 0x0107, /*!< Input audio data channel ordering scheme: |
874 | 936 | - 0: MPEG channel ordering (e. g. 5.1: C, L, R, SL, SR, LFE). (default) |
875 | 937 | - 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). */ | |
876 | 947 | |
877 | 948 | AACENC_AFTERBURNER = 0x0200, /*!< This parameter controls the use of the afterburner feature. |
878 | 949 | The afterburner is a type of analysis by synthesis algorithm which increases the |
905 | 976 | - n: Frame count period. */ |
906 | 977 | |
907 | 978 | 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.*/ | |
916 | 1023 | |
917 | 1024 | AACENC_TPSUBFRAMES = 0x0303, /*!< Number of sub frames in a transport frame for LOAS/LATM or ADTS (default 1). |
918 | 1025 | - ADTS: Maximum number of sub frames restricted to 4. |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
88 | 88 | ******************************************************************************/ |
89 | 89 | /*! |
90 | 90 | \file |
91 | \brief Memory layout | |
91 | \brief Memory layout | |
92 | 92 | \author Markus Lohwasser |
93 | 93 | */ |
94 | 94 | |
118 | 118 | PsyInputBuffer. |
119 | 119 | */ |
120 | 120 | |
121 | C_ALLOC_MEM2 (Ram_aacEnc_PsyElement, PSY_ELEMENT, 1, (6)) | |
121 | C_ALLOC_MEM2 (Ram_aacEnc_PsyElement, PSY_ELEMENT, 1, (8)) | |
122 | 122 | |
123 | 123 | 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)) | |
125 | 125 | |
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)) | |
127 | 127 | |
128 | 128 | PSY_DYNAMIC *GetRam_aacEnc_PsyDynamic (int n, UCHAR* dynamic_RAM) { |
129 | 129 | FDK_ASSERT(dynamic_RAM!=0); |
138 | 138 | */ |
139 | 139 | C_ALLOC_MEM2 (Ram_aacEnc_PsyOut, PSY_OUT, 1, (1)) |
140 | 140 | |
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)) | |
143 | 143 | |
144 | 144 | |
145 | 145 | /* |
154 | 154 | C_ALLOC_MEM (Ram_aacEnc_QCstate, QC_STATE, 1) |
155 | 155 | C_ALLOC_MEM (Ram_aacEnc_AdjustThreshold, ADJ_THR_STATE, 1) |
156 | 156 | |
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)) | |
159 | 159 | C_ALLOC_MEM (Ram_aacEnc_BitCntrState, BITCNTR_STATE, 1) |
160 | 160 | |
161 | 161 | INT *GetRam_aacEnc_BitLookUp(int n, UCHAR* dynamic_RAM) { |
174 | 174 | */ |
175 | 175 | |
176 | 176 | 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)) | |
178 | 178 | QC_OUT_CHANNEL *GetRam_aacEnc_QCchannel (int n, UCHAR* dynamic_RAM) { |
179 | 179 | FDK_ASSERT(dynamic_RAM!=0); |
180 | 180 | return ((QC_OUT_CHANNEL*) (dynamic_RAM + P_BUF_0 + n*sizeof(QC_OUT_CHANNEL))); |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
117 | 117 | */ |
118 | 118 | |
119 | 119 | /* 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))*/ | |
121 | 121 | |
122 | 122 | struct AAC_ENC { |
123 | 123 | |
172 | 172 | ++++++++++++++++++++++++++++++++++++++++++++ |
173 | 173 | */ |
174 | 174 | |
175 | #define BUF_SIZE_0 ( ALIGN_SIZE(sizeof(QC_OUT_CHANNEL)*(6)) ) | |
175 | #define BUF_SIZE_0 ( ALIGN_SIZE(sizeof(QC_OUT_CHANNEL)*(8)) ) | |
176 | 176 | #define BUF_SIZE_1 ( ALIGN_SIZE(maxSize(sizeof(PSY_DYNAMIC), \ |
177 | 177 | (BIT_LOOK_UP_SIZE+MERGE_GAIN_LOOK_UP_SIZE))) ) |
178 | 178 |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
392 | 392 | /******************* sanity checks *******************/ |
393 | 393 | |
394 | 394 | /* check config structure */ |
395 | if (config->nChannels < 1 || config->nChannels > (6)) { | |
395 | if (config->nChannels < 1 || config->nChannels > (8)) { | |
396 | 396 | return AAC_ENC_UNSUPPORTED_CHANNELCONFIG; |
397 | 397 | } |
398 | 398 | |
557 | 557 | qcInit.channelMapping = &hAacEnc->channelMapping; |
558 | 558 | qcInit.sceCpe = 0; |
559 | 559 | |
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 | |
560 | 567 | { |
561 | 568 | int maxBitres; |
562 | 569 | qcInit.averageBits = (averageBitsPerFrame+7)&~7; |
570 | 577 | qcInit.minBits = (config->minBitsPerFrame!=-1) ? fixMax(qcInit.minBits, config->minBitsPerFrame) : qcInit.minBits; |
571 | 578 | } |
572 | 579 | |
580 | qcInit.sampleRate = config->sampleRate; | |
581 | qcInit.advancedBitsToPe = isLowDelay(config->audioObjectType) ? 1 : 0 ; | |
573 | 582 | qcInit.nSubFrames = config->nSubFrames; |
574 | 583 | qcInit.padding.paddingRest = config->sampleRate; |
575 | 584 |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
112 | 112 | /* initialization errors */ |
113 | 113 | aac_enc_init_error_start = 0x2000, |
114 | 114 | 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. */ | |
116 | 116 | AAC_ENC_INVALID_N_CHANNELS = 0x20e0, /*!< Invalid amount of audio input channels. */ |
117 | 117 | AAC_ENC_INVALID_SFB_TABLE = 0x2140, /*!< Internal encoder error. */ |
118 | 118 | |
153 | 153 | |
154 | 154 | #define ANC_DATA_BUFFERSIZE 1024 /* ancBuffer size */ |
155 | 155 | |
156 | #define MAX_TOTAL_EXT_PAYLOADS (((6) * (1)) + (2+2)) | |
156 | #define MAX_TOTAL_EXT_PAYLOADS (((8) * (1)) + (2+2)) | |
157 | 157 | |
158 | 158 | |
159 | 159 | typedef enum { |
203 | 203 | INT minBitsPerFrame; /* minimum number of bits in AU */ |
204 | 204 | INT maxBitsPerFrame; /* maximum number of bits in AU */ |
205 | 205 | INT bitreservoir; /* size of bitreservoir */ |
206 | ||
207 | UINT sbrRatio; /* sbr sampling rate ratio: dual- or single-rate */ | |
206 | 208 | |
207 | 209 | UCHAR useTns; /* flag: use temporal noise shaping */ |
208 | 210 | UCHAR usePns; /* flag: use perceptual noise substitution */ |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
96 | 96 | |
97 | 97 | /* Encoder library info */ |
98 | 98 | #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 | |
101 | 101 | #define AACENCODER_LIB_TITLE "AAC Encoder" |
102 | 102 | #define AACENCODER_LIB_BUILD_DATE __DATE__ |
103 | 103 | #define AACENCODER_LIB_BUILD_TIME __TIME__ |
117 | 117 | #define SBL(fl) (fl/8) /*!< Short block length (hardcoded to 8 short blocks per long block) */ |
118 | 118 | #define BSLA(fl) (4*SBL(fl)+SBL(fl)/2) /*!< AAC block switching look-ahead */ |
119 | 119 | #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) */ | |
121 | 121 | |
122 | 122 | #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. */ | |
123 | 125 | |
124 | 126 | //////////////////////////////////////////////////////////////////////////////////// |
125 | 127 | /** |
163 | 165 | |
164 | 166 | UCHAR userMetaDataMode; /*!< Meta data library configuration. */ |
165 | 167 | |
166 | UCHAR userSbrEnabled; | |
168 | UCHAR userSbrEnabled; /*!< Enable SBR for ELD. */ | |
169 | UINT userSbrRatio; /*!< SBR sampling rate ratio. Dual- or single-rate. */ | |
167 | 170 | |
168 | 171 | } USER_PARAM; |
169 | 172 | |
211 | 214 | |
212 | 215 | AACENC_EXT_PAYLOAD extPayload [MAX_TOTAL_EXT_PAYLOADS]; |
213 | 216 | /* 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 */ | |
216 | 219 | |
217 | 220 | ULONG InitFlags; /* internal status to treggier re-initialization */ |
218 | 221 | |
226 | 229 | |
227 | 230 | UINT encoder_modis; |
228 | 231 | |
229 | /* Capabity flags */ | |
232 | /* Capability flags */ | |
230 | 233 | UINT CAPF_tpEnc; |
231 | 234 | |
232 | 235 | } ; |
233 | 236 | |
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 | } | |
235 | 318 | |
236 | 319 | static inline INT isSbrActive(const HANDLE_AACENC_CONFIG hAacConfig) |
237 | 320 | { |
252 | 335 | return ( sbrUsed ); |
253 | 336 | } |
254 | 337 | |
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 | ||
255 | 402 | /**************************************************************************** |
256 | 403 | Allocate Encoder |
257 | 404 | ****************************************************************************/ |
265 | 412 | /* |
266 | 413 | * Map Encoder specific config structures to CODER_CONFIG. |
267 | 414 | */ |
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 | ) | |
270 | 421 | { |
271 | 422 | AUDIO_OBJECT_TYPE transport_AOT = AOT_NULL_OBJECT; |
272 | 423 | FDKmemclear(cc, sizeof(CODER_CONFIG)); |
303 | 454 | } |
304 | 455 | |
305 | 456 | /* Configure extension aot. */ |
306 | if (extCfg->userTpSignaling==0) { | |
457 | if (sbrSignaling==SIG_IMPLICIT) { | |
307 | 458 | cc->extAOT = AOT_NULL_OBJECT; /* implicit */ |
308 | 459 | } |
309 | 460 | 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) ) ) { | |
311 | 462 | cc->extAOT = AOT_SBR; /* explicit backward compatible */ |
312 | 463 | } |
313 | 464 | else { |
314 | 465 | cc->extAOT = transport_AOT; /* explicit hierarchical */ |
315 | 466 | } |
316 | 467 | } |
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 | ||
317 | 477 | cc->extSamplingRate = extCfg->userSamplerate; |
318 | 478 | cc->bitRate = hAacConfig->bitRate; |
319 | 479 | cc->noChannels = hAacConfig->nChannels; |
334 | 494 | case TT_MP4_ADTS: |
335 | 495 | case TT_MP4_LOAS: |
336 | 496 | case TT_MP4_LATM_MCP1: |
337 | cc->headerPeriod = 10; | |
497 | cc->headerPeriod = DEFAULT_HEADER_PERIOD_REPETITION_RATE; | |
338 | 498 | break; |
339 | 499 | default: |
340 | 500 | cc->headerPeriod = 0; |
350 | 510 | case AOT_MP2_SBR: |
351 | 511 | case AOT_MP2_PS: |
352 | 512 | cc->flags &= ~CC_MPEG_ID; /* Required for ADTS. */ |
353 | //config->userTpSignaling=0; | |
354 | 513 | cc->extAOT = AOT_NULL_OBJECT; |
355 | 514 | break; |
356 | 515 | default: |
410 | 569 | /* make reasonable default settings */ |
411 | 570 | FDKaacEnc_AacInitDefaultConfig (hAacConfig); |
412 | 571 | |
413 | /* clear confure structure and copy default settings */ | |
572 | /* clear configuration structure and copy default settings */ | |
414 | 573 | FDKmemclear(config, sizeof(USER_PARAM)); |
415 | 574 | |
416 | 575 | /* copy encoder configuration settings */ |
437 | 596 | /* initialize transport parameters */ |
438 | 597 | config->userTpType = TT_UNKNOWN; |
439 | 598 | config->userTpAmxv = 0; |
440 | config->userTpSignaling = 0; /* default, implicit signaling */ | |
599 | config->userTpSignaling = 0xFF; /* choose signaling automatically */ | |
441 | 600 | config->userTpNsubFrames = 1; |
442 | 601 | config->userTpProtection = 0; /* not crc protected*/ |
443 | 602 | config->userTpHeaderPeriod = 0xFF; /* header period in auto mode */ |
445 | 604 | config->userMetaDataMode = 0; /* do not embed any meta data info */ |
446 | 605 | |
447 | 606 | 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; | |
448 | 615 | |
449 | 616 | return AAC_ENC_OK; |
450 | 617 | } |
480 | 647 | INT bitRate, |
481 | 648 | const INT nSubFrames, |
482 | 649 | const INT sbrActive, |
650 | const INT sbrDownSampleRate, | |
483 | 651 | const AUDIO_OBJECT_TYPE aot |
484 | 652 | ) |
485 | 653 | { |
489 | 657 | FDKaacEnc_InitChannelMapping(channelMode, CH_ORDER_MPEG, &cm); |
490 | 658 | |
491 | 659 | if (sbrActive) { |
492 | /* Assume SBR rate ratio of 2:1 */ | |
493 | coreSamplingRate = samplingRate / 2; | |
660 | coreSamplingRate = samplingRate >> (sbrEncoder_IsSingleRatePossible(aot) ? (sbrDownSampleRate-1):1); | |
494 | 661 | } else { |
495 | 662 | coreSamplingRate = samplingRate; |
496 | 663 | } |
505 | 672 | bitRate = FDKmin(576000*nChannels, bitRate); |
506 | 673 | /*bitRate = FDKmax(0*nChannels, bitRate);*/ |
507 | 674 | } |
508 | ||
675 | ||
509 | 676 | |
510 | 677 | /* Limit bit rate in respect to the core coder */ |
511 | 678 | bitRate = FDKaacEnc_LimitBitrate( |
524 | 691 | /* Limit bit rate in respect to available SBR modes if active */ |
525 | 692 | if (sbrActive) |
526 | 693 | { |
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++) | |
563 | 710 | { |
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; | |
577 | 746 | } |
578 | 747 | |
579 | 748 | FDK_ASSERT(bitRate > 0); |
623 | 792 | case AOT_MP2_SBR: |
624 | 793 | case AOT_MP2_PS: |
625 | 794 | hAacConfig->usePns = 0; |
626 | if (config->userTpSignaling!=0) { | |
627 | return AACENC_INVALID_CONFIG; /* only implicit signaling allowed */ | |
628 | } | |
629 | 795 | case AOT_AAC_LC: |
630 | 796 | case AOT_SBR: |
631 | 797 | case AOT_PS: |
632 | 798 | config->userTpType = (config->userTpType!=TT_UNKNOWN) ? config->userTpType : TT_MP4_ADTS; |
633 | 799 | 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) { | |
646 | 801 | return AACENC_INVALID_CONFIG; |
647 | 802 | } |
648 | 803 | break; |
664 | 819 | hAacConfig->syntaxFlags |= ((config->userErTools & 0x1) ? AC_ER_VCB11 : 0); |
665 | 820 | hAacConfig->syntaxFlags |= ((config->userErTools & 0x2) ? AC_ER_HCR : 0); |
666 | 821 | 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); | |
668 | 823 | config->userTpType = (config->userTpType!=TT_UNKNOWN) ? config->userTpType : TT_MP4_LOAS; |
669 | 824 | hAacConfig->framelength = (config->userFramelength!=(UINT)-1) ? config->userFramelength : 512; |
670 | 825 | if (hAacConfig->framelength != 512 && hAacConfig->framelength != 480) { |
675 | 830 | break; |
676 | 831 | } |
677 | 832 | |
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 | ||
678 | 933 | /* We need the frame length to call aacEncoder_LimitBitrate() */ |
679 | 934 | hAacConfig->bitRate = aacEncoder_LimitBitrate( |
680 | 935 | NULL, |
682 | 937 | hAacConfig->framelength, |
683 | 938 | hAacConfig->nChannels, |
684 | 939 | hAacConfig->channelMode, |
685 | config->userBitrate, | |
940 | hAacConfig->bitRate, | |
686 | 941 | hAacConfig->nSubFrames, |
687 | 942 | isSbrActive(hAacConfig), |
943 | hAacConfig->sbrRatio, | |
688 | 944 | hAacConfig->audioObjectType |
689 | 945 | ); |
690 | 946 | |
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; | |
706 | 952 | } |
707 | 953 | |
708 | 954 | if (hAacConfig->epConfig >= 0) { |
724 | 970 | return AACENC_INVALID_CONFIG; /* not enough channels allocated */ |
725 | 971 | } |
726 | 972 | |
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 | ||
762 | 973 | /* Meta data restriction. */ |
763 | 974 | switch (hAacConfig->audioObjectType) |
764 | 975 | { |
765 | 976 | /* Allow metadata support */ |
766 | 977 | case AOT_AAC_LC: |
767 | 978 | case AOT_SBR: |
979 | case AOT_PS: | |
768 | 980 | hAacEncoder->metaDataAllowed = 1; |
769 | 981 | if (((INT)hAacConfig->channelMode < 1) || ((INT)hAacConfig->channelMode > 7)) { |
770 | 982 | config->userMetaDataMode = 0; |
848 | 1060 | ((InitFlags & AACENC_INIT_CONFIG) || (InitFlags & AACENC_INIT_STATES)) ) |
849 | 1061 | { |
850 | 1062 | INT sbrError; |
851 | SBR_ELEMENT_INFO sbrElInfo[(6)]; | |
1063 | SBR_ELEMENT_INFO sbrElInfo[(8)]; | |
852 | 1064 | CHANNEL_MAPPING channelMapping; |
853 | ||
854 | AUDIO_OBJECT_TYPE aot = hAacConfig->audioObjectType; | |
855 | 1065 | |
856 | 1066 | if ( FDKaacEnc_InitChannelMapping(hAacConfig->channelMode, |
857 | 1067 | hAacConfig->channelOrder, |
861 | 1071 | } |
862 | 1072 | |
863 | 1073 | /* Check return value and if the SBR encoder can handle enough elements */ |
864 | if (channelMapping.nElements > (6)) { | |
1074 | if (channelMapping.nElements > (8)) { | |
865 | 1075 | return AACENC_INIT_ERROR; |
866 | 1076 | } |
867 | 1077 | |
880 | 1090 | &aacBufferOffset, |
881 | 1091 | &hAacConfig->nChannels, |
882 | 1092 | &hAacConfig->sampleRate, |
1093 | &hAacConfig->sbrRatio, | |
883 | 1094 | &frameLength, |
884 | &hAacConfig->audioObjectType, | |
1095 | hAacConfig->audioObjectType, | |
885 | 1096 | &hAacEncoder->nDelay, |
886 | 1097 | (hAacConfig->audioObjectType == AOT_ER_AAC_ELD) ? 1 : TRANS_FAC, |
1098 | (config->userTpHeaderPeriod!=0xFF) ? config->userTpHeaderPeriod : DEFAULT_HEADER_PERIOD_REPETITION_RATE, | |
887 | 1099 | initFlag |
888 | 1100 | ); |
889 | 1101 | |
890 | 1102 | /* Suppress AOT reconfiguration and check error status. */ |
891 | if ( sbrError || (hAacConfig->audioObjectType!=aot) ) { | |
1103 | if (sbrError) { | |
892 | 1104 | return AACENC_INIT_SBR_ERROR; |
893 | 1105 | } |
894 | 1106 | |
914 | 1126 | { |
915 | 1127 | UINT flags = 0; |
916 | 1128 | |
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); | |
918 | 1134 | |
919 | 1135 | /* create flags for transport encoder */ |
920 | 1136 | if (config->userTpAmxv == 1) { |
957 | 1173 | INT inputDataDelay = DELAY_AAC(hAacConfig->framelength); |
958 | 1174 | |
959 | 1175 | if ( isSbrActive(hAacConfig) && hSbrEncoder!=NULL) { |
960 | inputDataDelay = 2*inputDataDelay + sbrEncoder_GetInputDataDelay(*hSbrEncoder); | |
1176 | inputDataDelay = hAacConfig->sbrRatio*inputDataDelay + sbrEncoder_GetInputDataDelay(*hSbrEncoder); | |
961 | 1177 | } |
962 | 1178 | |
963 | 1179 | if ( FDK_MetadataEnc_Init(hAacEncoder->hMetadataEnc, |
1032 | 1248 | |
1033 | 1249 | /* Determine max channel configuration. */ |
1034 | 1250 | if (maxChannels==0) { |
1035 | hAacEncoder->nMaxAacChannels = (6); | |
1036 | hAacEncoder->nMaxSbrChannels = (6); | |
1251 | hAacEncoder->nMaxAacChannels = (8); | |
1252 | hAacEncoder->nMaxSbrChannels = (8); | |
1037 | 1253 | } |
1038 | 1254 | else { |
1039 | 1255 | hAacEncoder->nMaxAacChannels = (maxChannels&0x00FF); |
1041 | 1257 | hAacEncoder->nMaxSbrChannels = (maxChannels&0xFF00) ? (maxChannels>>8) : hAacEncoder->nMaxAacChannels; |
1042 | 1258 | } |
1043 | 1259 | |
1044 | if ( (hAacEncoder->nMaxAacChannels>(6)) || (hAacEncoder->nMaxSbrChannels>(6)) ) { | |
1260 | if ( (hAacEncoder->nMaxAacChannels>(8)) || (hAacEncoder->nMaxSbrChannels>(8)) ) { | |
1045 | 1261 | err = AACENC_INVALID_CONFIG; |
1046 | 1262 | goto bail; |
1047 | 1263 | } |
1048 | 1264 | } /* maxChannels==0 */ |
1049 | 1265 | |
1050 | 1266 | /* 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); | |
1053 | 1269 | hAacEncoder->nMaxSubFrames = (1); |
1054 | 1270 | |
1055 | 1271 | |
1107 | 1323 | goto bail; |
1108 | 1324 | } |
1109 | 1325 | else { |
1110 | C_ALLOC_SCRATCH_START(pLibInfo, LIB_INFO, FDK_MODULE_LAST); | |
1326 | C_ALLOC_SCRATCH_START(pLibInfo, LIB_INFO, FDK_MODULE_LAST); | |
1111 | 1327 | |
1112 | 1328 | FDKinitLibInfo( pLibInfo); |
1113 | 1329 | transportEnc_GetLibInfo( pLibInfo ); |
1342 | 1558 | for (i=0; i<(INT)nMetaDataExtensions; i++) { /* Get meta data extension payload. */ |
1343 | 1559 | hAacEncoder->extPayload[nExtensions++] = pMetaDataExtPayload[i]; |
1344 | 1560 | } |
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 ); | |
1347 | 1567 | if (hAacEncoder->extParam.userPceAdditions != pceValue) { |
1348 | 1568 | hAacEncoder->extParam.userPceAdditions = pceValue; |
1349 | 1569 | hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT; |
1374 | 1594 | } |
1375 | 1595 | else { |
1376 | 1596 | /* Add SBR extension payload */ |
1377 | for (i = 0; i < (6); i++) { | |
1597 | for (i = 0; i < (8); i++) { | |
1378 | 1598 | if (hAacEncoder->extPayloadSize[nPayload][i] > 0) { |
1379 | 1599 | hAacEncoder->extPayload[nExtensions].pData = hAacEncoder->extPayloadData[nPayload][i]; |
1380 | 1600 | { |
1572 | 1792 | } |
1573 | 1793 | case AOT_AAC_LC: |
1574 | 1794 | case AOT_MP2_AAC_LC: |
1575 | case AOT_ER_AAC_LC: | |
1576 | 1795 | case AOT_ER_AAC_LD: |
1577 | 1796 | case AOT_ER_AAC_ELD: |
1578 | 1797 | if (!(hAacEncoder->encoder_modis & (ENC_MODE_FLAG_AAC))) { |
1635 | 1854 | } |
1636 | 1855 | if ( (pConfig->nElements > hAacEncoder->nMaxAacElements) |
1637 | 1856 | || (pConfig->nChannelsEff > hAacEncoder->nMaxAacChannels) |
1638 | || !((value>=1) && (value<=6)) | |
1857 | || !(((value>=1) && (value<=7))||((value>=33) && (value<=34))) | |
1639 | 1858 | ) |
1640 | 1859 | { |
1641 | 1860 | err = AACENC_INVALID_CONFIG; |
1690 | 1909 | } |
1691 | 1910 | } |
1692 | 1911 | 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; | |
1693 | 1922 | case AACENC_SBR_MODE: |
1694 | 1923 | if (settings->userSbrEnabled != value) { |
1695 | 1924 | settings->userSbrEnabled = value; |
1811 | 2040 | value = (UINT)hAacEncoder->aacConfig.bitrateMode; |
1812 | 2041 | break; |
1813 | 2042 | case AACENC_SAMPLERATE: |
1814 | value = (UINT)settings->userSamplerate; | |
2043 | value = (UINT)hAacEncoder->coderConfig.extSamplingRate; | |
1815 | 2044 | break; |
1816 | 2045 | case AACENC_CHANNELMODE: |
1817 | 2046 | value = (UINT)hAacEncoder->aacConfig.channelMode; |
1828 | 2057 | case AACENC_GRANULE_LENGTH: |
1829 | 2058 | value = (UINT)hAacEncoder->aacConfig.framelength; |
1830 | 2059 | break; |
2060 | case AACENC_SBR_RATIO: | |
2061 | value = isSbrActive(&hAacEncoder->aacConfig) ? hAacEncoder->aacConfig.sbrRatio : 0; | |
2062 | break; | |
1831 | 2063 | case AACENC_SBR_MODE: |
1832 | 2064 | value = (UINT) (hAacEncoder->aacConfig.syntaxFlags & AC_SBR_PRESENT) ? 1 : 0; |
1833 | 2065 | break; |
1835 | 2067 | value = (UINT)settings->userTpType; |
1836 | 2068 | break; |
1837 | 2069 | case AACENC_SIGNALING_MODE: |
1838 | value = (UINT)settings->userTpSignaling; | |
2070 | value = (UINT)getSbrSignalingMode(hAacEncoder->aacConfig.audioObjectType, settings->userTpType, settings->userTpSignaling, hAacEncoder->aacConfig.sbrRatio); | |
1839 | 2071 | break; |
1840 | 2072 | case AACENC_PROTECTION: |
1841 | 2073 | value = (UINT)settings->userTpProtection; |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
82 | 82 | |
83 | 83 | /******************************** MPEG Audio Encoder ************************** |
84 | 84 | |
85 | Initial author: Alex Groeschel | |
85 | Initial author: Alex Groeschel, Tobias Chalupka | |
86 | 86 | contents/description: Temporal noise shaping |
87 | 87 | |
88 | 88 | ******************************************************************************/ |
280 | 280 | int maxBandsTabSize = 0; |
281 | 281 | |
282 | 282 | switch (granuleLength) { |
283 | case 960: | |
284 | 283 | case 1024: |
285 | 284 | pMaxBandsTab = tnsMaxBandsTab1024; |
286 | 285 | maxBandsTabSize = sizeof(tnsMaxBandsTab1024)/sizeof(TNS_MAX_TAB_ENTRY); |
403 | 402 | tC->lpcStopLine = pC->sfbOffset[tC->lpcStopBand]; |
404 | 403 | |
405 | 404 | switch (granuleLength) { |
406 | case 960: | |
407 | 405 | case 1024: |
408 | 406 | /* TNS start line: skip lower MDCT lines to prevent artifacts due to filter mismatch */ |
409 | 407 | tC->lpcStartBand[LOFILT] = (blockType == SHORT_WINDOW) ? 0 : ((sampleRate < 18783) ? 4 : 8); |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
122 | 122 | static const FIXP_DBL SnrLdMin5 = (FIXP_DBL)0xfc000000; /*FL2FXCONST_DBL(FDKlog(0.25) /FDKlog(2.0)/LD_DATA_SCALING);*/ |
123 | 123 | |
124 | 124 | |
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 | ||
125 | 236 | /* values for avoid hole flag */ |
126 | 237 | enum _avoid_hole_state { |
127 | 238 | NO_AH =0, |
134 | 245 | #define Q_BITFAC (24) /* Q scaling used in FDKaacEnc_bitresCalcBitFac() calculation */ |
135 | 246 | #define Q_AVGBITS (17) /* scale bit values */ |
136 | 247 | |
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 | *****************************************************************************/ | |
137 | 341 | static INT FDKaacEnc_bits2pe2( |
138 | 342 | const INT bits, |
139 | 343 | const FIXP_DBL factor_m, |
449 | 653 | FIXP_DBL nrgSum14, nrgSum12, nrgSum34, nrgTotal; |
450 | 654 | FIXP_DBL nrgFacLd_14, nrgFacLd_12, nrgFacLd_34; |
451 | 655 | INT usePatch, exePatch; |
452 | int sfb, nLinesSum = 0; | |
656 | int sfb, sfbGrp, nLinesSum = 0; | |
453 | 657 | |
454 | 658 | nrgSum14 = nrgSum12 = nrgSum34 = nrgTotal = FL2FXCONST_DBL(0.f); |
455 | 659 | |
456 | 660 | /* 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) */ | |
461 | 665 | |
462 | 666 | /* 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 */ | |
465 | 669 | nrgSum12 += ( nrgFac12 >> 6 ); /* sum up nrg^(2/4) */ |
466 | 670 | nrgSum14 += ( nrgFac14 >> 6 ); /* sum up nrg^(1/4) */ |
467 | 671 | nrgSum34 += ( fMult(nrgFac14, nrgFac12) >> 6 ); /* sum up nrg^(3/4) */ |
672 | } | |
468 | 673 | } |
469 | 674 | |
470 | 675 | nrgTotal = CalcLdData(nrgTotal); /* get ld64 of total nrg */ |
478 | 683 | usePatch = (adjThrStateElement->chaosMeasureEnFac[ch] > FL2FXCONST_DBL(0.78125f)); |
479 | 684 | exePatch = ((usePatch) && (adjThrStateElement->lastEnFacPatch[ch])); |
480 | 685 | |
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 | ||
482 | 689 | INT sfbExePatch; |
483 | 690 | |
484 | 691 | /* 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])) { | |
486 | 693 | sfbExePatch = exePatchM; |
487 | 694 | } |
488 | 695 | else { |
489 | 696 | sfbExePatch = exePatch; |
490 | 697 | } |
491 | 698 | |
492 | if ( (sfbExePatch) && (psyOutChan->sfbEnergy[sfb]>FL2FXCONST_DBL(0.f)) ) | |
699 | if ( (sfbExePatch) && (psyOutChan->sfbEnergy[sfbGrp+sfb]>FL2FXCONST_DBL(0.f)) ) | |
493 | 700 | { |
494 | 701 | /* execute patch based on spectral flatness calculated above */ |
495 | 702 | 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) */ | |
497 | 704 | } |
498 | 705 | 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) */ | |
500 | 707 | } |
501 | 708 | 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) */ | |
503 | 710 | } |
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); | |
505 | 712 | |
506 | 713 | } |
714 | } | |
507 | 715 | } /* sfb loop */ |
508 | 716 | |
509 | 717 | adjThrStateElement->lastEnFacPatch[ch] = usePatch; |
733 | 941 | |
734 | 942 | return chaosMeasure; |
735 | 943 | } |
736 | ||
737 | 944 | |
738 | 945 | /* apply reduction formula for VBR-mode */ |
739 | 946 | static void FDKaacEnc_reduceThresholdsVBR(QC_OUT_CHANNEL* qcOutChannel[(2)], |
922 | 1129 | } |
923 | 1130 | } |
924 | 1131 | |
925 | ||
926 | 1132 | /***************************************************************************** |
927 | 1133 | functionname: FDKaacEnc_correctThresh |
928 | 1134 | description: if pe difference deltaPe between desired pe and real pe is small enough, |
930 | 1136 | New thresholds can be derived from this pe-difference |
931 | 1137 | *****************************************************************************/ |
932 | 1138 | 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)], | |
939 | 1145 | const INT deltaPe, |
940 | 1146 | const INT processElements, |
941 | 1147 | const INT elementOffset) |
946 | 1152 | PE_CHANNEL_DATA *peChanData; |
947 | 1153 | FIXP_DBL thrFactorLdData; |
948 | 1154 | 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]; | |
951 | 1157 | INT normFactorInt; |
952 | 1158 | FIXP_DBL normFactorLdData; |
953 | 1159 | |
978 | 1184 | for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) { |
979 | 1185 | |
980 | 1186 | 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); | |
982 | 1188 | } |
983 | 1189 | else { |
984 | 1190 | /* Both CalcLdInt and CalcLdData can be used! |
985 | 1191 | * No offset has to be subtracted, because sfbNActiveLinesLdData |
986 | 1192 | * 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]); | |
988 | 1194 | } |
989 | 1195 | if ( ((ahFlag[elementId][ch][sfbGrp+sfb] < AH_ACTIVE) || (deltaPe > 0)) && |
990 | 1196 | peChanData->sfbNActiveLines[sfbGrp+sfb] != 0 ) |
1001 | 1207 | - (FIXP_DBL)(minScale<<(DFRACT_BITS-1-LD_DATA_SHIFT)); |
1002 | 1208 | |
1003 | 1209 | 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; | |
1005 | 1211 | } |
1006 | 1212 | 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; | |
1009 | 1215 | } |
1010 | 1216 | else { |
1011 | sfbPeFactorsLdData[elementId][ch][sfbGrp+sfb] = sfbNActiveLinesLdData[ch][sfbGrp+sfb]; | |
1217 | sfbPeFactorsLdData[elementId][ch][sfbGrp+sfb] = sfbNActiveLinesLdData[elementId][ch][sfbGrp+sfb]; | |
1012 | 1218 | } |
1013 | 1219 | } |
1014 | 1220 | |
1049 | 1255 | } |
1050 | 1256 | else { |
1051 | 1257 | /* 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)); | |
1053 | 1259 | |
1054 | 1260 | /* limit thrFactor to 60dB */ |
1055 | 1261 | tmp = (deltaPe<0) ? tmp : (-tmp); |
1101 | 1307 | reducing minSnr |
1102 | 1308 | *****************************************************************************/ |
1103 | 1309 | 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], | |
1107 | 1313 | const INT desiredPe, |
1108 | 1314 | INT* redPeGlobal, |
1109 | 1315 | const INT processElements, |
1203 | 1409 | bands have to be quantized to zero |
1204 | 1410 | *****************************************************************************/ |
1205 | 1411 | 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], | |
1210 | 1416 | const INT desiredPe, |
1211 | 1417 | const INT currentPe, |
1212 | 1418 | const int processElements, |
1438 | 1644 | description: two guesses for the reduction value and one final correction of the thresholds |
1439 | 1645 | *****************************************************************************/ |
1440 | 1646 | 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)], | |
1444 | 1650 | const INT desiredPe, |
1445 | 1651 | const INT processElements, |
1446 | 1652 | const INT elementOffset) |
1447 | 1653 | { |
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]; | |
1452 | 1658 | int iter; |
1453 | 1659 | |
1454 | 1660 | INT constPartGlobal, noRedPeGlobal, nActiveLinesGlobal, redPeGlobal; |
1682 | 1888 | |
1683 | 1889 | } |
1684 | 1890 | |
1685 | ||
1686 | 1891 | /* similar to FDKaacEnc_adaptThresholdsToPe(), for VBR-mode */ |
1687 | 1892 | void FDKaacEnc_AdaptThresholdsVBR(QC_OUT_CHANNEL* qcOutChannel[(2)], |
1688 | 1893 | PSY_OUT_CHANNEL* psyOutChannel[(2)], |
1691 | 1896 | PE_DATA *peData, |
1692 | 1897 | const INT nChannels) |
1693 | 1898 | { |
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; | |
1696 | 1907 | |
1697 | 1908 | /* thresholds to the power of redExp */ |
1698 | 1909 | FDKaacEnc_calcThreshExp(pThrExp, qcOutChannel, psyOutChannel, nChannels); |
1710 | 1921 | AdjThrStateElement->vbrQualFactor, |
1711 | 1922 | &AdjThrStateElement->chaosMeasureOld); |
1712 | 1923 | |
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) | |
1713 | 1927 | } |
1714 | 1928 | |
1715 | 1929 | |
2001 | 2215 | functionname: FDKaacEnc_AdjThrInit |
2002 | 2216 | description: initialize ADJ_THR_STATE |
2003 | 2217 | *****************************************************************************/ |
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 | ||
2016 | 2261 | /* 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 | ||
2093 | 2324 | } |
2094 | 2325 | |
2095 | 2326 | |
2153 | 2384 | } |
2154 | 2385 | |
2155 | 2386 | |
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 | ||
2156 | 2448 | void FDKaacEnc_DistributeBits(ADJ_THR_STATE *adjThrState, |
2157 | 2449 | ATS_ELEMENT *AdjThrStateElement, |
2158 | 2450 | PSY_OUT_CHANNEL *psyOutChannel[(2)], |
2165 | 2457 | const INT bitresBits, |
2166 | 2458 | const INT maxBitresBits, |
2167 | 2459 | const FIXP_DBL maxBitFac, |
2168 | const INT bitDistributenMode) | |
2460 | const INT bitDistributionMode) | |
2169 | 2461 | { |
2170 | 2462 | FIXP_DBL bitFactor; |
2171 | 2463 | INT noRedPe = peData->pe; |
2183 | 2475 | } |
2184 | 2476 | |
2185 | 2477 | if (grantedDynBits >= 1) { |
2186 | if (bitDistributenMode!=0) { | |
2478 | if (bitDistributionMode!=0) { | |
2187 | 2479 | *grantedPe = FDKaacEnc_bits2pe2(grantedDynBits, AdjThrStateElement->bits2PeFactor_m, AdjThrStateElement->bits2PeFactor_e); |
2188 | 2480 | } |
2189 | 2481 | else |
2207 | 2499 | } |
2208 | 2500 | |
2209 | 2501 | /* 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 | |
2219 | 2514 | ); |
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; | |
2220 | 2528 | } |
2221 | 2529 | |
2222 | 2530 | *grantedPeCorr = (INT)(fMult((FIXP_DBL)(*grantedPe<<Q_AVGBITS), AdjThrStateElement->peCorrectionFactor_m) >> (Q_AVGBITS-AdjThrStateElement->peCorrectionFactor_e)); |
2231 | 2539 | functionname: FDKaacEnc_AdjustThresholds |
2232 | 2540 | description: adjust thresholds |
2233 | 2541 | *****************************************************************************/ |
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)], | |
2236 | 2544 | QC_OUT* qcOut, |
2237 | PSY_OUT_ELEMENT* psyOutElement[(6)], | |
2545 | PSY_OUT_ELEMENT* psyOutElement[(8)], | |
2238 | 2546 | INT CBRbitrateMode, |
2239 | 2547 | CHANNEL_MAPPING* cm) |
2240 | 2548 | { |
2290 | 2598 | } /* -end- element loop */ |
2291 | 2599 | |
2292 | 2600 | } |
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]; | |
2303 | 2610 | } |
2304 | 2611 | } |
2305 | 2612 | } |
2306 | ||
2613 | } | |
2307 | 2614 | } |
2308 | 2615 | |
2309 | 2616 | void FDKaacEnc_AdjThrClose(ADJ_THR_STATE** phAdjThr) |
2312 | 2619 | ADJ_THR_STATE* hAdjThr = *phAdjThr; |
2313 | 2620 | |
2314 | 2621 | if (hAdjThr!=NULL) { |
2315 | for (i=0; i<(6); i++) { | |
2622 | for (i=0; i<(8); i++) { | |
2316 | 2623 | if (hAdjThr->adjThrStateElem[i]!=NULL) { |
2317 | 2624 | FreeRam_aacEnc_AdjThrStateElement(&hAdjThr->adjThrStateElem[i]); |
2318 | 2625 | } |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
97 | 97 | #include "interface.h" |
98 | 98 | |
99 | 99 | |
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 | ); | |
107 | 108 | |
108 | 109 | INT FDKaacEnc_AdjThrNew(ADJ_THR_STATE** phAdjThr, |
109 | 110 | INT nElements); |
110 | 111 | |
111 | 112 | void FDKaacEnc_AdjThrInit(ADJ_THR_STATE *hAdjThr, |
112 | 113 | const INT peMean, |
113 | ELEMENT_BITS* elBits[(6)], | |
114 | ELEMENT_BITS* elBits[(8)], | |
115 | INT invQuant, | |
114 | 116 | INT nElements, |
117 | INT nChannelsEff, | |
118 | INT sampleRate, | |
119 | INT advancedBitsToPe, | |
115 | 120 | FIXP_DBL vbrQualFactor); |
116 | ||
121 | ||
117 | 122 | |
118 | 123 | void FDKaacEnc_DistributeBits(ADJ_THR_STATE *adjThrState, |
119 | 124 | ATS_ELEMENT *AdjThrStateElement, |
127 | 132 | const INT bitresBits, |
128 | 133 | const INT maxBitresBits, |
129 | 134 | const FIXP_DBL maxBitFac, |
130 | const INT bitDistributenMode); | |
135 | const INT bitDistributionMode); | |
131 | 136 | |
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)], | |
134 | 139 | QC_OUT* qcOut, |
135 | PSY_OUT_ELEMENT* psyOutElement[(6)], | |
140 | PSY_OUT_ELEMENT* psyOutElement[(8)], | |
136 | 141 | INT CBRbitrateMode, |
137 | 142 | CHANNEL_MAPPING* cm); |
138 | 143 |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
143 | 143 | |
144 | 144 | typedef struct { |
145 | 145 | BRES_PARAM bresParamLong, bresParamShort; |
146 | ATS_ELEMENT* adjThrStateElem[(6)]; | |
146 | ATS_ELEMENT* adjThrStateElem[(8)]; | |
147 | 147 | } ADJ_THR_STATE; |
148 | 148 | |
149 | 149 | #endif |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
203 | 203 | INT bwTabSize = 0; |
204 | 204 | |
205 | 205 | switch (frameLength) { |
206 | case 960: | |
207 | 206 | case 1024: |
208 | 207 | pBwTab = bandWidthTable; |
209 | 208 | bwTabSize = sizeof(bandWidthTable)/sizeof(BANDWIDTH_TAB); |
252 | 251 | chanBitRate < pBwTab[i+1].chanBitRate) |
253 | 252 | { |
254 | 253 | switch (frameLength) { |
255 | case 960: | |
256 | 254 | case 1024: |
257 | 255 | bandwidth = (entryNo==0) |
258 | 256 | ? pBwTab[i].bandWidthMono |
317 | 315 | case MODE_1_2_2: |
318 | 316 | case MODE_1_2_2_1: |
319 | 317 | case MODE_1_2_2_2_1: |
318 | case MODE_7_1_REAR_SURROUND: | |
319 | case MODE_7_1_FRONT_CENTER: | |
320 | 320 | *bandWidth = bandWidthTableVBR[bitrateMode].bandWidth2AndMoreChan; |
321 | 321 | break; |
322 | 322 | default: |
347 | 347 | case MODE_1_2_2: /* sce + cpe + cpe */ |
348 | 348 | case MODE_1_2_2_1: /* (5.1) sce + cpe + cpe + lfe */ |
349 | 349 | 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: | |
350 | 352 | entryNo = 1; /* use stereo bandwith settings */ |
351 | 353 | break; |
352 | 354 |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1359 | 1359 | |
1360 | 1360 | if ( (syntaxFlags & AC_ER) && !(syntaxFlags & AC_DRM) ) |
1361 | 1361 | { |
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 */ | |
1363 | 1363 | |
1364 | 1364 | FDKmemclear(channelElementExtensionWritten, sizeof(channelElementExtensionWritten)); |
1365 | 1365 |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
82 | 82 | |
83 | 83 | /***************************** MPEG-4 AAC Encoder ************************** |
84 | 84 | |
85 | Author(s): M. Werner | |
85 | Author(s): M. Werner, Tobias Chalupka | |
86 | 86 | Description: Block switching |
87 | 87 | |
88 | 88 | ******************************************************************************/ |
99 | 99 | |
100 | 100 | static FIXP_DBL FDKaacEnc_GetWindowEnergy(const FIXP_DBL in[], const INT blSwWndIdx); |
101 | 101 | |
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 | ); | |
105 | 107 | |
106 | 108 | /****************** Constants *****************************/ |
107 | 109 | /* LONG START SHORT STOP LOWOV */ |
144 | 146 | |
145 | 147 | /**************** internal function prototypes ***********/ |
146 | 148 | |
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 | ||
156 | 149 | /****************** Routines ****************************/ |
157 | 150 | void FDKaacEnc_InitBlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl, INT isLowDelay) |
158 | 151 | { |
159 | /* note: the pointer to timeSignal can be zeroed here, because it is initialized for every call | |
160 | to FDKaacEnc_BlockSwitching anew */ | |
161 | 152 | FDKmemclear (blockSwitchingControl, sizeof(BLOCK_SWITCHING_CONTROL)); |
162 | 153 | |
163 | 154 | if (isLowDelay) |
213 | 204 | /*attack */ {START_WINDOW, SHORT_WINDOW, SHORT_WINDOW, START_WINDOW, WRONG_WINDOW, WRONG_WINDOW} } /* attack */ |
214 | 205 | }; |
215 | 206 | |
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) | |
217 | 208 | { |
218 | 209 | UINT i; |
219 | 210 | FIXP_DBL enM1, enMax; |
262 | 253 | |
263 | 254 | |
264 | 255 | /* 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); | |
266 | 257 | |
267 | 258 | /* now calculate if there is an attack */ |
268 | 259 | |
334 | 325 | |
335 | 326 | } |
336 | 327 | |
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) | |
339 | 329 | { |
340 | 330 | INT i; |
341 | 331 | UINT w; |
342 | 332 | |
343 | 333 | FIXP_SGL hiPassCoeff0 = hiPassCoeff[0]; |
344 | 334 | FIXP_SGL hiPassCoeff1 = hiPassCoeff[1]; |
345 | ||
346 | INT_PCM *timeSignal = blockSwitchingControl->timeSignal; | |
347 | 335 | |
348 | 336 | /* sum up scalarproduct of timesignal as windowed Energies */ |
349 | 337 | for (w=0; w < blockSwitchingControl->nBlockSwitchWindows; w++) { |
360 | 348 | FIXP_DBL tempUnfiltered, tempFiltred, t1, t2; |
361 | 349 | /* tempUnfiltered is scaled with 1 to prevent overflows during calculation of tempFiltred */ |
362 | 350 | #if SAMPLE_BITS == DFRACT_BITS |
363 | tempUnfiltered = (FIXP_DBL) *timeSignal++ >> 1; | |
351 | tempUnfiltered = (FIXP_DBL) *pTimeSignal++ >> 1; | |
364 | 352 | #else |
365 | tempUnfiltered = (FIXP_DBL) *timeSignal++ << (DFRACT_BITS-SAMPLE_BITS-1); | |
353 | tempUnfiltered = (FIXP_DBL) *pTimeSignal++ << (DFRACT_BITS-SAMPLE_BITS-1); | |
366 | 354 | #endif |
367 | 355 | t1 = fMultDiv2(hiPassCoeff1, tempUnfiltered-temp_iirState0); |
368 | 356 | t2 = fMultDiv2(hiPassCoeff0, temp_iirState1); |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
106 | 106 | |
107 | 107 | /****************** Structures ***************************/ |
108 | 108 | typedef struct{ |
109 | INT_PCM *timeSignal; | |
110 | 109 | INT lastWindowSequence; |
111 | 110 | INT windowShape; |
112 | 111 | INT lastWindowShape; |
135 | 134 | |
136 | 135 | void FDKaacEnc_InitBlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl, INT isLowDelay); |
137 | 136 | |
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); | |
139 | 138 | |
140 | 139 | int FDKaacEnc_SyncBlockSwitching( |
141 | 140 | BLOCK_SWITCHING_CONTROL *blockSwitchingControlLeft, |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
123 | 123 | typedef struct { |
124 | 124 | |
125 | 125 | CHANNEL_MODE encoderMode; |
126 | INT channel_assignment[/*(6)*/12]; | |
126 | INT channel_assignment[/*(8)*/12]; | |
127 | 127 | |
128 | 128 | } CHANNEL_ASSIGNMENT_INFO_TAB; |
129 | 129 | |
138 | 138 | { MODE_1_2_2, { 0, 1, 2, 3, 4,-1,-1,-1,-1,-1,-1,-1} }, /* 5ch */ |
139 | 139 | { MODE_1_2_2_1, { 0, 1, 2, 3, 4, 5,-1,-1,-1,-1,-1,-1} }, /* 5.1ch */ |
140 | 140 | { 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 */ | |
141 | 143 | }; |
142 | 144 | |
143 | 145 | static const CHANNEL_ASSIGNMENT_INFO_TAB assignmentInfoTabWav[] = |
149 | 151 | { MODE_1_2_1, { 2, 0, 1, 3,-1,-1,-1,-1,-1,-1,-1,-1} }, /* 4ch */ |
150 | 152 | { MODE_1_2_2, { 2, 0, 1, 3, 4,-1,-1,-1,-1,-1,-1,-1} }, /* 5ch */ |
151 | 153 | { 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 */ | |
153 | 157 | }; |
154 | 158 | |
155 | 159 | static const CHANNEL_ASSIGNMENT_INFO_TAB assignmentInfoTabWg4[] = |
176 | 180 | { MODE_1_2_2, 5, 5, 3 }, /* SCE,CPE,CPE */ |
177 | 181 | { MODE_1_2_2_1, 6, 5, 4 }, /* SCE,CPE,CPE,LFE */ |
178 | 182 | { 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 }, | |
179 | 185 | }; |
180 | 186 | |
181 | 187 | #define MAX_MODES (sizeof(assignmentInfoTabWav)/sizeof(CHANNEL_ASSIGNMENT_INFO_TAB)) |
328 | 334 | break; |
329 | 335 | |
330 | 336 | case MODE_1_2_2_2_1: |
337 | case MODE_7_1_REAR_SURROUND: | |
338 | case MODE_7_1_FRONT_CENTER: | |
331 | 339 | /* (7.1) sce + cpe + cpe + cpe + lfe */ |
332 | 340 | FDKaacEnc_initElement(&cm->elInfo[0], ID_SCE, &count, mode, co, it_cnt, FL2FXCONST_DBL(0.18f)); |
333 | 341 | FDKaacEnc_initElement(&cm->elInfo[1], ID_CPE, &count, mode, co, it_cnt, FL2FXCONST_DBL(0.26f)); |
335 | 343 | FDKaacEnc_initElement(&cm->elInfo[3], ID_CPE, &count, mode, co, it_cnt, FL2FXCONST_DBL(0.26f)); |
336 | 344 | FDKaacEnc_initElement(&cm->elInfo[4], ID_LFE, &count, mode, co, it_cnt, FL2FXCONST_DBL(0.04f)); |
337 | 345 | break; |
338 | ||
339 | 346 | default: |
340 | 347 | //*chMap=0; |
341 | 348 | return AAC_ENC_UNSUPPORTED_CHANNELCONFIG; |
342 | 349 | }; |
343 | 350 | |
344 | 351 | |
345 | FDK_ASSERT(cm->nElements<=(6)); | |
352 | FDK_ASSERT(cm->nElements<=(8)); | |
346 | 353 | |
347 | 354 | |
348 | 355 | return AAC_ENC_OK; |
455 | 462 | |
456 | 463 | break; |
457 | 464 | } |
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; | |
471 | 477 | |
472 | 478 | int maxBitsTot = maxChannelBits * 7; /* LFE does not add to bit reservoir */ |
473 | 479 | int sc = CountLeadingBits(fixMax(maxChannelBits,averageBitsTot)); |
479 | 485 | hQC->elementBits[0]->chBitrateEl = fMult(sceRate, (FIXP_DBL)(bitrateTot<<sc_brTot))>>sc_brTot; |
480 | 486 | hQC->elementBits[1]->chBitrateEl = fMult(cpe1Rate, (FIXP_DBL)(bitrateTot<<sc_brTot))>>(sc_brTot+1); |
481 | 487 | 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; | |
484 | 490 | |
485 | 491 | hQC->elementBits[0]->maxBitsEl = maxChannelBits; |
486 | 492 | hQC->elementBits[1]->maxBitsEl = 2*maxChannelBits; |
487 | 493 | 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 | } | |
493 | 498 | default: |
494 | 499 | return AAC_ENC_UNSUPPORTED_CHANNELCONFIG; |
495 | 500 | } |
531 | 536 | case MODE_1_2_2: |
532 | 537 | case MODE_1_2_2_1: |
533 | 538 | case MODE_1_2_2_2_1: |
539 | case MODE_7_1_REAR_SURROUND: | |
540 | case MODE_7_1_FRONT_CENTER: | |
534 | 541 | monoStereoSetting = EL_MODE_STEREO; |
535 | 542 | break; |
536 | 543 | default: /* error */ |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
449 | 449 | const INT maxSfbPerGroup) |
450 | 450 | { |
451 | 451 | INT sfb,sfboffs, j; |
452 | INT startIsSfb = 0; | |
453 | INT inIsBlock; | |
454 | INT currentIsSfbCount; | |
455 | FIXP_DBL overallHrrError; | |
456 | 452 | FIXP_DBL isScaleLast = FL2FXCONST_DBL(0.0f); |
457 | FIXP_DBL isRegionLoudness; | |
453 | INT isStartValueFound = 0; | |
458 | 454 | |
459 | 455 | 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 | ||
464 | 462 | for (sfb = 0; sfb < maxSfbPerGroup; sfb++) { |
465 | 463 | if (isMask[sfboffs + sfb] == 1) { |
466 | 464 | if (currentIsSfbCount == 0) { |
467 | 465 | startIsSfb = sfboffs + sfb; |
466 | } | |
467 | if (isStartValueFound==0) { | |
468 | 468 | isScaleLast = realIsScale[sfboffs + sfb]; |
469 | isStartValueFound = 1; | |
469 | 470 | } |
470 | 471 | inIsBlock = 1; |
471 | 472 | currentIsSfbCount++; |
508 | 509 | if (currentIsSfbCount < isParams->min_is_sfbs || (isRegionLoudness < isParams->is_region_min_loudness>>MAX_SFB_PER_GROUP_SF)) { |
509 | 510 | for(j = startIsSfb; j <= sfboffs + sfb; j++) { |
510 | 511 | 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 | } | |
511 | 520 | } |
512 | 521 | } |
513 | 522 | currentIsSfbCount = 0; |
583 | 592 | FIXP_DBL realIsScale[MAX_GROUPED_SFB]; |
584 | 593 | INTENSITY_PARAMETERS isParams; |
585 | 594 | INT isMask[MAX_GROUPED_SFB]; |
586 | INT lastValIs = 0, delta; | |
587 | 595 | |
588 | 596 | FDKmemclear((void*)isBook,sfbCnt*sizeof(INT)); |
589 | 597 | FDKmemclear((void*)isMask,sfbCnt*sizeof(INT)); |
739 | 747 | 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)); |
740 | 748 | } |
741 | 749 | |
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 | ||
750 | 750 | sfbEnergyRight[sfb+sfboffs] = FL2FXCONST_DBL(0.0f); |
751 | 751 | sfbEnergyLdDataRight[sfb+sfboffs] = FL2FXCONST_DBL(-1.0f); |
752 | 752 | sfbThresholdRight[sfb+sfboffs] = FL2FXCONST_DBL(0.0f); |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
91 | 91 | #define _INTERFACE_H |
92 | 92 | |
93 | 93 | #include "common_fix.h" |
94 | #include "FDK_audio.h" | |
94 | 95 | |
95 | 96 | #include "psy_data.h" |
96 | 97 | #include "aacenc_tns.h" |
154 | 155 | |
155 | 156 | typedef struct { |
156 | 157 | |
157 | PSY_OUT_ELEMENT* psyOutElement[(6)]; | |
158 | PSY_OUT_CHANNEL* pPsyOutChannels[(6)]; | |
158 | PSY_OUT_ELEMENT* psyOutElement[(8)]; | |
159 | PSY_OUT_CHANNEL* pPsyOutChannels[(8)]; | |
159 | 160 | |
160 | 161 | }PSY_OUT; |
161 | 162 | |
163 | inline int isLowDelay( AUDIO_OBJECT_TYPE aot ) | |
164 | { | |
165 | return (aot==AOT_ER_AAC_LD || aot==AOT_ER_AAC_ELD); | |
166 | } | |
167 | ||
162 | 168 | #endif /* _INTERFACE_H */ |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
420 | 420 | result = f2Pow(-exponent, DFRACT_BITS-1-METADATA_FRACT_BITS, &e_res); |
421 | 421 | |
422 | 422 | /* 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); | |
424 | 424 | |
425 | 425 | return result; |
426 | 426 | } |
538 | 538 | drcComp->channelIdx[RS] = channelMapping.elInfo[2].ChannelIndex[1]; |
539 | 539 | break; |
540 | 540 | 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 */ | |
549 | 560 | break; |
550 | 561 | case MODE_1_1: |
551 | 562 | case MODE_1_1_1_1: |
831 | 842 | FIXP_DBL accu; |
832 | 843 | |
833 | 844 | /* 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]); | |
835 | 846 | accu += fMult(alpha,level); |
836 | 847 | drcComp->smoothLevel[i] = accu; |
837 | 848 | |
838 | 849 | /* 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]); | |
840 | 851 | accu += fMult(alpha,gain); |
841 | 852 | drcComp->smoothGain[i] = accu; |
842 | 853 | } |
940 | 951 | if ((drcComp->channelIdx[LS] >= 0) && (drcComp->channelIdx[LS2] >= 0)) tmp = fMult(FL2FXCONST_DBL(0.707f), tmp); /* 7.1ch */ |
941 | 952 | /*if ((drcComp->channelIdx[RS] >= 0) && (drcComp->channelIdx[RS2] >= 0)) tmp *=0.707f;*/ /* 7.1ch */ |
942 | 953 | 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) */ | |
944 | 955 | tmp += (FX_PCM2FX_DBL((FIXP_PCM)pSamples[drcComp->channelIdx[L]])>>DOWNMIX_SHIFT); /* L */ |
945 | 956 | tmp += (FX_PCM2FX_DBL((FIXP_PCM)pSamples[drcComp->channelIdx[R]])>>DOWNMIX_SHIFT); /* R */ |
946 | 957 | |
972 | 983 | * + 0.2f*2^(-METADATA_FRACT_BITS) + drcComp->smoothGain[i] |
973 | 984 | */ |
974 | 985 | 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 */ | |
976 | 987 | peak[i] += drcComp->smoothGain[i]; |
977 | 988 | } |
978 | 989 |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
97 | 97 | |
98 | 98 | #define FRAME_MAXLEN_SHORT ((1024)/TRANS_FAC) |
99 | 99 | #define FRAME_LEN_SHORT_128 ((1024)/TRANS_FAC) |
100 | #define FRAME_LEN_SHORT_120 (FRAME_LEN_LONG_960/TRANS_FAC) | |
101 | 100 | |
102 | 101 | /* Filterbank type*/ |
103 | 102 | enum FB_TYPE { |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
114 | 114 | |
115 | 115 | /* forward definitions */ |
116 | 116 | |
117 | ||
118 | static inline int isLowDelay( AUDIO_OBJECT_TYPE aot ) | |
119 | { | |
120 | return (aot==AOT_ER_AAC_LD || aot==AOT_ER_AAC_ELD); | |
121 | } | |
122 | 117 | |
123 | 118 | /***************************************************************************** |
124 | 119 | |
512 | 507 | |
513 | 508 | for(ch = 0; ch < channels; ch++) |
514 | 509 | { |
515 | C_ALLOC_SCRATCH_START(timeSignal, INT_PCM, (1024)); | |
516 | psyStatic[ch]->blockSwitchingControl.timeSignal = timeSignal; | |
510 | C_ALLOC_SCRATCH_START(pTimeSignal, INT_PCM, (1024)) | |
517 | 511 | |
518 | 512 | /* deinterleave input data and use for block switching */ |
519 | FDKaacEnc_deinterleaveInputBuffer( psyStatic[ch]->blockSwitchingControl.timeSignal, | |
513 | FDKaacEnc_deinterleaveInputBuffer( pTimeSignal, | |
520 | 514 | &pInput[chIdx[ch]], |
521 | 515 | psyConf->granuleLength, |
522 | 516 | totalChannels); |
523 | 517 | |
524 | 518 | |
525 | 519 | FDKaacEnc_BlockSwitching (&psyStatic[ch]->blockSwitchingControl, |
526 | psyConf->granuleLength | |
527 | ,psyStatic[ch]->isLFE | |
520 | psyConf->granuleLength, | |
521 | psyStatic[ch]->isLFE, | |
522 | pTimeSignal | |
528 | 523 | ); |
529 | 524 | |
530 | 525 | |
531 | 526 | /* fill up internal input buffer, to 2xframelength samples */ |
532 | 527 | FDKmemcpy(psyStatic[ch]->psyInputBuffer+blockSwitchingOffset, |
533 | psyStatic[ch]->blockSwitchingControl.timeSignal, | |
528 | pTimeSignal, | |
534 | 529 | (2*psyConf->granuleLength-blockSwitchingOffset)*sizeof(INT_PCM)); |
535 | 530 | |
536 | C_ALLOC_SCRATCH_END(timeSignal, INT_PCM, (1024)); | |
531 | C_ALLOC_SCRATCH_END(pTimeSignal, INT_PCM, (1024)) | |
537 | 532 | } |
538 | 533 | |
539 | 534 | /* synch left and right block type */ |
1344 | 1339 | |
1345 | 1340 | if (hPsyInternal) |
1346 | 1341 | { |
1347 | for (i=0; i<(6); i++) { | |
1342 | for (i=0; i<(8); i++) { | |
1348 | 1343 | if (hPsyInternal->pStaticChannels[i]) { |
1349 | 1344 | if (hPsyInternal->pStaticChannels[i]->psyInputBuffer) |
1350 | 1345 | FreeRam_aacEnc_PsyInputBuffer(&hPsyInternal->pStaticChannels[i]->psyInputBuffer); /* AUDIO INPUT BUFFER */ |
1353 | 1348 | } |
1354 | 1349 | } |
1355 | 1350 | |
1356 | for (i=0; i<(6); i++) { | |
1351 | for (i=0; i<(8); i++) { | |
1357 | 1352 | if (hPsyInternal->psyElement[i]) |
1358 | 1353 | FreeRam_aacEnc_PsyElement(&hPsyInternal->psyElement[i]); /* PSY_ELEMENT */ |
1359 | 1354 | } |
1367 | 1362 | for (n=0; n<(1); n++) { |
1368 | 1363 | if (phPsyOut[n]) |
1369 | 1364 | { |
1370 | for (i=0; i<(6); i++) { | |
1365 | for (i=0; i<(8); i++) { | |
1371 | 1366 | if (phPsyOut[n]->pPsyOutChannels[i]) |
1372 | 1367 | FreeRam_aacEnc_PsyOutChannel(&phPsyOut[n]->pPsyOutChannels[i]); /* PSY_OUT_CHANNEL */ |
1373 | 1368 | } |
1374 | 1369 | |
1375 | for (i=0; i<(6); i++) { | |
1370 | for (i=0; i<(8); i++) { | |
1376 | 1371 | if (phPsyOut[n]->psyOutElement[i]) |
1377 | 1372 | FreeRam_aacEnc_PsyOutElements(&phPsyOut[n]->psyOutElement[i]); /* PSY_OUT_ELEMENTS */ |
1378 | 1373 | } |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
116 | 116 | typedef struct { |
117 | 117 | |
118 | 118 | 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)]; | |
121 | 121 | PSY_DYNAMIC* psyDynamic; |
122 | 122 | INT granuleLength; |
123 | 123 |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
126 | 126 | INT nChannels; |
127 | 127 | INT nChannelsEff; |
128 | 128 | INT nElements; |
129 | ELEMENT_INFO elInfo[(6)]; | |
129 | ELEMENT_INFO elInfo[(8)]; | |
130 | 130 | } CHANNEL_MAPPING; |
131 | 131 | |
132 | 132 | typedef struct { |
142 | 142 | INT maxBits; /* maximum number of bits in reservoir */ |
143 | 143 | INT averageBits; /* average number of bits we should use */ |
144 | 144 | INT bitRes; |
145 | INT sampleRate; /* output sample rate */ | |
146 | INT advancedBitsToPe; /* if set, calc bits2PE factor depending on samplerate */ | |
145 | 147 | INT staticBits; /* Bits per frame consumed by transport layers. */ |
146 | 148 | QCDATA_BR_MODE bitrateMode; |
147 | 149 | INT meanPe; |
214 | 216 | |
215 | 217 | typedef struct |
216 | 218 | { |
217 | QC_OUT_ELEMENT *qcElement[(6)]; | |
218 | QC_OUT_CHANNEL *pQcOutChannels[(6)]; | |
219 | QC_OUT_ELEMENT *qcElement[(8)]; | |
220 | QC_OUT_CHANNEL *pQcOutChannels[(8)]; | |
219 | 221 | QC_OUT_EXTENSION extension[(2+2)]; /* global extension payload */ |
220 | 222 | INT nExtensions; /* number of extension payloads for this AU */ |
221 | 223 | INT maxDynBits; /* maximal allowed dynamic bits in frame */ |
251 | 253 | INT minBitsPerFrame; /* minimal allowd bits per fram, superframing - DRM */ |
252 | 254 | INT nElements; |
253 | 255 | 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 */ | |
255 | 257 | INT bitResTot; |
256 | 258 | INT bitResTotMax; |
257 | 259 | INT maxIterations; /* Maximum number of allowed iterations before FDKaacEnc_crashRecovery() is applied. */ |
262 | 264 | |
263 | 265 | PADDING padding; |
264 | 266 | |
265 | ELEMENT_BITS *elementBits[(6)]; | |
267 | ELEMENT_BITS *elementBits[(8)]; | |
266 | 268 | BITCNTR_STATE *hBitCounter; |
267 | 269 | ADJ_THR_STATE *hAdjThr; |
268 | 270 |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
381 | 381 | if ( isConstantBitrateMode(hQC->bitrateMode) ) { |
382 | 382 | INT bitresPerChannel = (hQC->bitResTotMax / init->channelMapping->nChannelsEff); |
383 | 383 | /* 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; | |
385 | 385 | } |
386 | 386 | else { |
387 | hQC->bitDistributenMode = 0; /* full bitreservoir */ | |
387 | hQC->bitDistributionMode = 0; /* full bitreservoir */ | |
388 | 388 | } |
389 | 389 | |
390 | 390 | |
419 | 419 | break; |
420 | 420 | } |
421 | 421 | |
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 | ); | |
427 | 433 | |
428 | 434 | return AAC_ENC_OK; |
429 | 435 | } |
504 | 510 | } |
505 | 511 | |
506 | 512 | static AAC_ENCODER_ERROR FDKaacEnc_distributeElementDynBits(QC_STATE* hQC, |
507 | QC_OUT_ELEMENT* qcElement[(6)], | |
513 | QC_OUT_ELEMENT* qcElement[(8)], | |
508 | 514 | CHANNEL_MAPPING* cm, |
509 | 515 | INT codeBits) |
510 | 516 | { |
603 | 609 | PSY_OUT** psyOut, |
604 | 610 | QC_OUT** qcOut, |
605 | 611 | CHANNEL_MAPPING* cm, |
606 | QC_OUT_ELEMENT* qcElement[(1)][(6)], | |
612 | QC_OUT_ELEMENT* qcElement[(1)][(8)], | |
607 | 613 | INT avgTotalBits, |
608 | 614 | INT *totalAvailableBits, |
609 | 615 | INT *avgTotalDynBits) |
654 | 660 | hQC->elementBits[i]->bitResLevelEl, |
655 | 661 | hQC->elementBits[i]->maxBitResBitsEl, |
656 | 662 | hQC->maxBitFac, |
657 | hQC->bitDistributenMode); | |
663 | hQC->bitDistributionMode); | |
658 | 664 | |
659 | 665 | *totalAvailableBits += hQC->elementBits[i]->bitResLevelEl; |
660 | 666 | /* get total corrected granted PE */ |
670 | 676 | |
671 | 677 | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
672 | 678 | static AAC_ENCODER_ERROR FDKaacEnc_updateUsedDynBits(INT* sumDynBitsConsumed, |
673 | QC_OUT_ELEMENT* qcElement[(6)], | |
679 | QC_OUT_ELEMENT* qcElement[(8)], | |
674 | 680 | CHANNEL_MAPPING* cm) |
675 | 681 | { |
676 | 682 | INT i; |
713 | 719 | } |
714 | 720 | |
715 | 721 | static INT FDKaacEnc_getTotalConsumedBits(QC_OUT** qcOut, |
716 | QC_OUT_ELEMENT* qcElement[(1)][(6)], | |
722 | QC_OUT_ELEMENT* qcElement[(1)][(8)], | |
717 | 723 | CHANNEL_MAPPING* cm, |
718 | 724 | INT globHdrBits, |
719 | 725 | INT nSubFrames) |
813 | 819 | |
814 | 820 | /*-------------------------------------------- */ |
815 | 821 | /* helper pointer */ |
816 | QC_OUT_ELEMENT* qcElement[(1)][(6)]; | |
822 | QC_OUT_ELEMENT* qcElement[(1)][(8)]; | |
817 | 823 | |
818 | 824 | /* work on a copy of qcChannel and qcElement */ |
819 | 825 | for (i=0; i<cm->nElements; i++) |
890 | 896 | } /* -end- sub frame counter */ |
891 | 897 | |
892 | 898 | /*-------------------------------------------- */ |
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)]; | |
897 | 903 | /*-------------------------------------------- */ |
898 | 904 | |
899 | 905 | |
1240 | 1246 | |
1241 | 1247 | AAC_ENCODER_ERROR FDKaacEnc_updateFillBits(CHANNEL_MAPPING* cm, |
1242 | 1248 | QC_STATE* qcKernel, |
1243 | ELEMENT_BITS* RESTRICT elBits[(6)], | |
1249 | ELEMENT_BITS* RESTRICT elBits[(8)], | |
1244 | 1250 | QC_OUT** qcOut) |
1245 | 1251 | { |
1246 | 1252 | switch (qcKernel->bitrateMode) { |
1596 | 1602 | for (n=0;n<(1);n++) { |
1597 | 1603 | if (phQC[n] != NULL) { |
1598 | 1604 | QC_OUT *hQC = phQC[n]; |
1599 | for (i=0; i<(6); i++) { | |
1605 | for (i=0; i<(8); i++) { | |
1600 | 1606 | } |
1601 | 1607 | |
1602 | for (i=0; i<(6); i++) { | |
1608 | for (i=0; i<(8); i++) { | |
1603 | 1609 | if (hQC->qcElement[i]) |
1604 | 1610 | FreeRam_aacEnc_QCelement(&hQC->qcElement[i]); |
1605 | 1611 | } |
1619 | 1625 | if (hQCstate->hBitCounter != NULL) |
1620 | 1626 | FDKaacEnc_BCClose(&hQCstate->hBitCounter); |
1621 | 1627 | |
1622 | for (i=0; i<(6); i++) { | |
1628 | for (i=0; i<(8); i++) { | |
1623 | 1629 | if (hQCstate->elementBits[i]!=NULL) { |
1624 | 1630 | FreeRam_aacEnc_ElementBits(&hQCstate->elementBits[i]); |
1625 | 1631 | } |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
139 | 139 | |
140 | 140 | AAC_ENCODER_ERROR FDKaacEnc_updateFillBits(CHANNEL_MAPPING* cm, |
141 | 141 | QC_STATE* qcKernel, |
142 | ELEMENT_BITS* RESTRICT elBits[(6)], | |
142 | ELEMENT_BITS* RESTRICT elBits[(8)], | |
143 | 143 | QC_OUT** qcOut); |
144 | 144 | |
145 | 145 |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
126 | 126 | accu = fMultDiv2(FDKaacEnc_mTab_3_4[tabIndex],FDKaacEnc_quantTableE[totalShift&3]); |
127 | 127 | totalShift = (16-4)-(3*(totalShift>>2)); |
128 | 128 | 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); | |
133 | 130 | quaSpectrum[line] = (SHORT)(-((LONG)(k + accu) >> (DFRACT_BITS-1-16))); |
134 | 131 | } |
135 | 132 | else if(accu > FL2FXCONST_DBL(0.0f)) |
142 | 139 | accu = fMultDiv2(FDKaacEnc_mTab_3_4[tabIndex],FDKaacEnc_quantTableE[totalShift&3]); |
143 | 140 | totalShift = (16-4)-(3*(totalShift>>2)); |
144 | 141 | 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); | |
149 | 143 | quaSpectrum[line] = (SHORT)((LONG)(k + accu) >> (DFRACT_BITS-1-16)); |
150 | 144 | } |
151 | 145 | else |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
104 | 104 | * LONG_WINDOW, START_WINDOW, SHORT_WINDOW or STOP_WINDOW. |
105 | 105 | * \param windowShape index indicating the window slope type to be used. |
106 | 106 | * 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. | |
108 | 108 | * \param mdctData_e pointer to an INT where the exponent of the frequency |
109 | 109 | * domain output data is stored into. |
110 | 110 | * \return 0 in case of success, non-zero in case of error (inconsistent parameters). |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
170 | 170 | |
171 | 171 | extern const FIXP_QTW qmf_phaseshift_cos32[32]; |
172 | 172 | 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]; | |
173 | 176 | extern const FIXP_QTW qmf_phaseshift_cos64[64]; |
174 | 177 | extern const FIXP_QTW qmf_phaseshift_sin64[64]; |
175 | 178 |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
136 | 136 | #define QMF_FLAG_MPSLDFB 16 |
137 | 137 | /* Complex Low Delay Filter Bank used in MPEG Surround Encoder allows a optimized calculation of the modulation in qmfForwardModulationHQ() */ |
138 | 138 | #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 | |
139 | 141 | |
140 | 142 | |
141 | 143 | typedef struct |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
91 | 91 | |
92 | 92 | /* FDK tools library info */ |
93 | 93 | #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 | |
96 | 96 | #define FDK_TOOLS_LIB_TITLE "FDK Tools" |
97 | 97 | #define FDK_TOOLS_LIB_BUILD_DATE __DATE__ |
98 | 98 | #define FDK_TOOLS_LIB_BUILD_TIME __TIME__ |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1461 | 1461 | QFC(0xfe4d1be3), QFC(0xd1c58ace), QFC(0x2e3a7532), QFC(0x01b2e41d), QFC(0x00000000), |
1462 | 1462 | }; |
1463 | 1463 | |
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 | ||
1464 | 1484 | #else /* QMF_NO_POLY == 5 */ |
1465 | 1485 | #endif /* QMF_NO_POLY==5 */ |
1466 | 1486 |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
241 | 241 | |
242 | 242 | *****************************************************************************/ |
243 | 243 | 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; | |
268 | 310 | } |
269 | 311 | |
270 | 312 |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1016 | 1016 | break; |
1017 | 1017 | case 32: |
1018 | 1018 | 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 { | |
1019 | 1024 | h_Qmf->t_cos = qmf_phaseshift_cos32; |
1020 | 1025 | h_Qmf->t_sin = qmf_phaseshift_sin32; |
1026 | } | |
1021 | 1027 | h_Qmf->p_stride = 2; |
1022 | 1028 | h_Qmf->FilterSize = 640; |
1023 | 1029 | h_Qmf->filterScale = 0; |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
185 | 185 | void CProgramConfig_Read ( CProgramConfig *pPce, |
186 | 186 | HANDLE_FDK_BITSTREAM bs, |
187 | 187 | 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 ); | |
188 | 209 | #endif /* TP_PCE_ENABLE */ |
189 | 210 | |
190 | 211 | /** |
205 | 226 | */ |
206 | 227 | int CProgramConfig_LookupElement( |
207 | 228 | CProgramConfig *pPce, |
208 | const UINT channelConfig, | |
229 | UINT channelConfig, | |
209 | 230 | const UINT tag, |
210 | 231 | const UINT channelIdx, |
211 | 232 | UCHAR chMapping[], |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
373 | 373 | length = -1; /* raw data block length is unknown */ |
374 | 374 | } else { |
375 | 375 | if (blockNum < 0 || blockNum > 3) { |
376 | return TRANSPORTDEC_INVALID_PARAMETER; | |
376 | length = -1; | |
377 | 377 | } |
378 | 378 | length = (pAdts->rawDataBlockDist[blockNum] << 3) - 16; |
379 | 379 | } |
380 | 380 | } |
381 | if (blockNum == 0) { | |
381 | if (blockNum == 0 && length > 0) { | |
382 | 382 | length -= pAdts->bs.num_pce_bits; |
383 | 383 | } |
384 | 384 | return length; |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
203 | 203 | } |
204 | 204 | |
205 | 205 | 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 | } | |
206 | 345 | } |
207 | 346 | #endif /* TP_PCE_ENABLE */ |
208 | 347 | |
266 | 405 | |
267 | 406 | int CProgramConfig_LookupElement( |
268 | 407 | CProgramConfig *pPce, |
269 | const UINT channelConfig, | |
408 | UINT channelConfig, | |
270 | 409 | const UINT tag, |
271 | 410 | const UINT channelIdx, |
272 | 411 | UCHAR chMapping[], |
288 | 427 | *elMapping = pPce->elCounter; |
289 | 428 | if (elList[pPce->elCounter] != elType) { |
290 | 429 | /* 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 | } | |
292 | 437 | } |
293 | 438 | /* Assume all front channels */ |
294 | 439 | getImplicitAudioChannelTypeAndIndex(&chType[channelIdx], &chIndex[channelIdx], channelConfig, channelIdx); |
582 | 727 | } |
583 | 728 | |
584 | 729 | 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: | |
585 | 733 | case 5: |
586 | 734 | error |= cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, asc->m_extensionSamplingFrequency, asc->m_samplesPerFrame, AOT_ER_AAC_ELD, ID_CPE, i++); |
587 | 735 | case 3: |
588 | 736 | error |= cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, asc->m_extensionSamplingFrequency, asc->m_samplesPerFrame, AOT_ER_AAC_ELD, ID_CPE, i++); |
589 | 737 | break; |
590 | 738 | |
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++); | |
595 | 739 | case 4: |
596 | 740 | 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++); | |
597 | 742 | break; |
598 | 743 | } |
599 | 744 | |
688 | 833 | #endif /* TP_ELD_ENABLE */ |
689 | 834 | |
690 | 835 | |
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 | } | |
691 | 892 | |
692 | 893 | /* |
693 | 894 | * API Functions |
838 | 1039 | break; |
839 | 1040 | } |
840 | 1041 | |
1042 | if (fExplicitBackwardCompatible) { | |
1043 | ErrorStatus = AudioSpecificConfig_ExtensionParse(self, bs, cb); | |
1044 | } | |
841 | 1045 | |
842 | 1046 | return (ErrorStatus); |
843 | 1047 | } |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
119 | 119 | CLatmDemux *pLatmDemux, |
120 | 120 | int m_muxConfigPresent, |
121 | 121 | CSTpCallBacks *pTpDecCallbacks, |
122 | CSAudioSpecificConfig *pAsc | |
122 | CSAudioSpecificConfig *pAsc, | |
123 | int *pfConfigFound | |
123 | 124 | ) |
124 | 125 | { |
125 | 126 | TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK; |
128 | 129 | pLatmDemux->m_useSameStreamMux = FDKreadBits(bs,1); |
129 | 130 | |
130 | 131 | if (!pLatmDemux->m_useSameStreamMux) { |
131 | if ((ErrorStatus = CLatmDemux_ReadStreamMuxConfig(bs, pLatmDemux, pTpDecCallbacks, pAsc))) { | |
132 | if ((ErrorStatus = CLatmDemux_ReadStreamMuxConfig(bs, pLatmDemux, pTpDecCallbacks, pAsc, pfConfigFound))) { | |
132 | 133 | return (ErrorStatus); |
133 | 134 | } |
134 | 135 | } |
136 | } | |
137 | ||
138 | /* If there was no configuration read, its not possible to parse PayloadLengthInfo below. */ | |
139 | if (! *pfConfigFound) { | |
140 | return TRANSPORTDEC_SYNC_ERROR; | |
135 | 141 | } |
136 | 142 | |
137 | 143 | if (pLatmDemux->m_AudioMuxVersionA == 0) { |
153 | 159 | TRANSPORT_TYPE tt, |
154 | 160 | CSTpCallBacks *pTpDecCallbacks, |
155 | 161 | CSAudioSpecificConfig *pAsc, |
162 | int *pfConfigFound, | |
156 | 163 | const INT ignoreBufferFullness |
157 | 164 | ) |
158 | 165 | { |
167 | 174 | return TRANSPORTDEC_NOT_ENOUGH_BITS; |
168 | 175 | } |
169 | 176 | |
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))) | |
171 | 178 | return (ErrorStatus); |
172 | 179 | |
173 | 180 | if (!ignoreBufferFullness) |
204 | 211 | HANDLE_FDK_BITSTREAM bs, |
205 | 212 | CLatmDemux *pLatmDemux, |
206 | 213 | CSTpCallBacks *pTpDecCallbacks, |
207 | CSAudioSpecificConfig *pAsc | |
214 | CSAudioSpecificConfig *pAsc, | |
215 | int * pfConfigFound | |
208 | 216 | ) |
209 | 217 | { |
210 | 218 | LATM_LAYER_INFO *p_linfo = NULL; |
271 | 279 | if ((ErrorStatus = AudioSpecificConfig_Parse(&pAsc[TPDEC_TRACKINDEX(prog,lay)], &tmpBs, 1, pTpDecCallbacks))) { |
272 | 280 | return (ErrorStatus); |
273 | 281 | } |
282 | *pfConfigFound = 1; | |
274 | 283 | |
275 | 284 | /* The field p_linfo->m_ascLen could be wrong, so check if */ |
276 | 285 | if ( 0 > (INT)FDKgetValidBits(&tmpBs)) { |
291 | 300 | if (cbError != 0) { |
292 | 301 | return TRANSPORTDEC_UNKOWN_ERROR; |
293 | 302 | } |
303 | *pfConfigFound = 1; | |
294 | 304 | } |
295 | 305 | } |
296 | 306 | |
376 | 386 | else { |
377 | 387 | ErrorStatus = TRANSPORTDEC_PARSE_ERROR; //AAC_DEC_LATM_TIMEFRAMING; |
378 | 388 | } |
379 | if (pLatmDemux->m_audioMuxLengthBytes > 0 && totalPayloadBits > pLatmDemux->m_audioMuxLengthBytes*8) { | |
389 | if (pLatmDemux->m_audioMuxLengthBytes > (UINT)0 && totalPayloadBits > (int)pLatmDemux->m_audioMuxLengthBytes*8) { | |
380 | 390 | return TRANSPORTDEC_PARSE_ERROR; |
381 | 391 | } |
382 | 392 | return (ErrorStatus); |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
143 | 143 | TRANSPORT_TYPE tt, |
144 | 144 | CSTpCallBacks *pTpDecCallbacks, |
145 | 145 | CSAudioSpecificConfig *pAsc, |
146 | int *pfConfigFound, | |
146 | 147 | const INT ignoreBufferFullness |
147 | 148 | ); |
148 | 149 | |
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 | */ | |
149 | 159 | TRANSPORTDEC_ERROR CLatmDemux_ReadStreamMuxConfig( |
150 | 160 | HANDLE_FDK_BITSTREAM bs, |
151 | 161 | CLatmDemux *pLatmDemux, |
152 | 162 | CSTpCallBacks *pTpDecCallbacks, |
153 | CSAudioSpecificConfig *pAsc | |
163 | CSAudioSpecificConfig *pAsc, | |
164 | int * pfConfigFound | |
154 | 165 | ); |
155 | 166 | |
156 | 167 | TRANSPORTDEC_ERROR CLatmDemux_ReadPayloadLengthInfo(HANDLE_FDK_BITSTREAM bs, CLatmDemux *pLatmDemux); |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
196 | 196 | |
197 | 197 | if (hInput != NULL) { |
198 | 198 | /* Create bitstream */ |
199 | if ( (transportFmt == TT_MP4_RAW) | |
200 | || (transportFmt == TT_DRM) ){ | |
199 | if ( TT_IS_PACKET(transportFmt) ) { | |
201 | 200 | hInput->bsBuffer = NULL; |
202 | 201 | } else { |
203 | 202 | hInput->bsBuffer = GetRam_TransportDecoderBuffer(0); |
221 | 220 | FDK_BITSTREAM bs; |
222 | 221 | HANDLE_FDK_BITSTREAM hBs = &bs; |
223 | 222 | |
224 | FDKinitBitStream(hBs, conf, 0x80000000, length<<3, BS_READER); | |
223 | FDKinitBitStream(hBs, conf, 0x10000000, length<<3, BS_READER); | |
224 | ||
225 | int fConfigFound = 0; | |
225 | 226 | |
226 | 227 | /* config transport decoder */ |
227 | 228 | switch (hTp->transportFmt) { |
233 | 234 | return TRANSPORTDEC_INVALID_PARAMETER; |
234 | 235 | } |
235 | 236 | 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); | |
237 | 238 | if (err != TRANSPORTDEC_OK) { |
238 | 239 | return err; |
239 | 240 | } |
240 | 241 | } |
241 | 242 | break; |
242 | 243 | default: |
243 | case TT_MP4_RAW: | |
244 | fConfigFound = 1; | |
244 | 245 | 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) { | |
257 | 258 | hTp->flags |= TPDEC_CONFIG_FOUND; |
258 | 259 | } |
259 | 260 | |
312 | 313 | /* set bitbuffer shortcut */ |
313 | 314 | hBs = &hTp->bitStream[layer]; |
314 | 315 | |
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) { | |
318 | 318 | /* For packet based transport, pass input buffer to bitbuffer without copying the data. |
319 | 319 | Unfortunately we do not know the actual buffer size. And the FDK bit buffer implementation |
320 | 320 | needs a number 2^x. So we assume the maximum of 48 channels with 6144 bits per channel |
321 | 321 | and round it up to the next power of 2 => 65536 bytes */ |
322 | 322 | FDKinitBitStream(hBs, pBuffer, 0x10000, (*pBytesValid)<<3, BS_READER); |
323 | 323 | *pBytesValid = 0; |
324 | break; | |
325 | ||
326 | default: | |
324 | } | |
325 | } else { | |
327 | 326 | /* ... else feed bitbuffer with new stream data (append). */ |
328 | 327 | if (hTp->numberOfRawDataBlocks <= 0) { |
329 | 328 | FDKfeedBuffer (hBs, pBuffer, bufferSize, pBytesValid) ; |
366 | 365 | |
367 | 366 | return bufferFullness; |
368 | 367 | } |
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 | ||
369 | 444 | |
370 | 445 | /** |
371 | 446 | * \brief Determine additional buffer fullness contraint due to burst data reception. |
431 | 506 | } |
432 | 507 | } |
433 | 508 | |
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 | { | |
443 | 521 | 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); | |
444 | 529 | |
445 | 530 | 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; | |
446 | 579 | 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: | |
447 | 587 | case TT_MP4_LATM_MCP0: |
448 | case TT_MP4_LATM_MCP1: | |
449 | if ( hTp->numberOfRawDataBlocks == 0 ) | |
588 | if (hTp->numberOfRawDataBlocks <= 0) | |
450 | 589 | { |
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; | |
464 | 604 | } |
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; | |
469 | 622 | } |
470 | 623 | break; |
471 | 624 | 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; | |
473 | 650 | } |
474 | 651 | |
475 | 652 | return err; |
476 | 653 | } |
477 | ||
478 | 654 | |
479 | 655 | /* How many bits to advance for synchronization search. */ |
480 | 656 | #define TPDEC_SYNCSKIP 8 |
492 | 668 | INT rawDataBlockLength = 0, rawDataBlockLengthPrevious; |
493 | 669 | INT totalBits; |
494 | 670 | 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; | |
496 | 672 | 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); | |
498 | 674 | |
499 | 675 | /* Synch parameters */ |
500 | 676 | INT syncLength; /* Length of sync word in bits */ |
505 | 681 | totalBits = (INT)FDKgetValidBits(hBs); |
506 | 682 | |
507 | 683 | 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; | |
512 | 685 | goto bail; |
513 | 686 | } |
514 | 687 | |
578 | 751 | numRawDataBlocksPrevious = hTp->numberOfRawDataBlocks; |
579 | 752 | |
580 | 753 | /* Parse transport header (raw data block granularity) */ |
581 | startPos = FDKgetValidBits(hBs); | |
582 | 754 | |
583 | 755 | if (err == TRANSPORTDEC_OK ) |
584 | 756 | { |
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 | ); | |
672 | 768 | } |
673 | 769 | |
674 | headerBits += startPos - (INT)FDKgetValidBits(hBs); | |
675 | 770 | bitsAvail -= headerBits; |
676 | 771 | |
677 | 772 | checkLengthBits = syncLayerFrameBits; |
701 | 796 | /* Enforce re-sync of transport headers. */ |
702 | 797 | hTp->numberOfRawDataBlocks = 0; |
703 | 798 | |
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 */ | |
705 | 800 | bits = (bitsAvail + headerBits) % TPDEC_SYNCSKIP; |
706 | 801 | /* Rewind - TPDEC_SYNCSKIP, in order to look for a synch one bit ahead next time. */ |
707 | 802 | FDKpushBiDirectional(hBs, -(headerBits - TPDEC_SYNCSKIP) + bits); |
708 | 803 | bitsAvail += headerBits - TPDEC_SYNCSKIP - bits; |
709 | headerBits = 0; | |
804 | headerBits = 0; | |
710 | 805 | } |
711 | 806 | |
712 | 807 | /* Frame traversal */ |
730 | 825 | } |
731 | 826 | |
732 | 827 | /* 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 | } | |
734 | 837 | break; |
735 | 838 | } |
736 | 839 | } |
758 | 861 | } |
759 | 862 | |
760 | 863 | /* 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) { | |
762 | 865 | err = additionalHoldOffNeeded(hTp, transportDec_GetBufferFullness(hTp), FDKgetValidBits(hBs) - syncLayerFrameBits); |
763 | 866 | if (err == TRANSPORTDEC_NOT_ENOUGH_BITS) { |
764 | 867 | hTp->holdOffFrames++; |
788 | 891 | bail: |
789 | 892 | hTp->auLength[0] = rawDataBlockLength; |
790 | 893 | |
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 | ||
791 | 902 | if (err == TRANSPORTDEC_OK) { |
792 | 903 | hTp->flags |= TPDEC_SYNCOK; |
904 | } | |
905 | ||
906 | if (fConfigFound) { | |
907 | hTp->flags |= TPDEC_CONFIG_FOUND; | |
793 | 908 | } |
794 | 909 | |
795 | 910 | if (pHeaderBits != NULL) { |
924 | 1039 | |
925 | 1040 | hBs = &hTp->bitStream[layer]; |
926 | 1041 | |
1042 | if ((INT)FDKgetValidBits(hBs) <= 0) { | |
1043 | err = TRANSPORTDEC_NOT_ENOUGH_BITS; | |
1044 | } | |
1045 | ||
927 | 1046 | switch (hTp->transportFmt) { |
928 | 1047 | |
929 | 1048 | case TT_MP4_ADIF: |
963 | 1082 | break; |
964 | 1083 | |
965 | 1084 | case TT_MP4_RAW: |
966 | if ((INT)FDKgetValidBits(hBs) <= 0 && layer == 0) { | |
967 | err = TRANSPORTDEC_NOT_ENOUGH_BITS; | |
968 | } | |
969 | 1085 | /* One Access Unit was filled into buffer. |
970 | 1086 | So get the length out of the buffer. */ |
971 | 1087 | hTp->auLength[layer] = FDKgetValidBits(hBs); |
972 | 1088 | hTp->flags |= TPDEC_SYNCOK; |
973 | 1089 | break; |
974 | 1090 | |
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 | ||
975 | 1102 | case TT_RSVD50: |
976 | 1103 | case TT_MP4_ADTS: |
977 | 1104 | case TT_MP4_LOAS: |
978 | case TT_MP4_LATM_MCP0: | |
979 | case TT_MP4_LATM_MCP1: | |
980 | 1105 | err = transportDec_readStream(hTp, layer); |
981 | 1106 | break; |
982 | 1107 | |
1025 | 1150 | { |
1026 | 1151 | TRANSPORTDEC_ERROR err = TRANSPORTDEC_OK; |
1027 | 1152 | |
1153 | ||
1028 | 1154 | err = transportDec_AdjustEndOfAccessUnit(hTp); |
1029 | 1155 | |
1030 | 1156 | switch (hTp->transportFmt) { |
1031 | case TT_MP4_LOAS: | |
1032 | case TT_MP4_LATM_MCP0: | |
1033 | case TT_MP4_LATM_MCP1: | |
1034 | break; | |
1035 | 1157 | default: |
1036 | 1158 | break; |
1037 | 1159 | } |
1081 | 1203 | FDKresetBitbuffer(&hTp->bitStream[i]); |
1082 | 1204 | hTp->auLength[i] = 0; |
1083 | 1205 | hTp->accessUnitAnchor[i] = 0; |
1084 | } | |
1206 | } | |
1085 | 1207 | hTp->flags &= ~(TPDEC_SYNCOK|TPDEC_LOST_FRAMES_PENDING); |
1208 | if (hTp->transportFmt != TT_MP4_ADIF) { | |
1209 | hTp->flags &= ~TPDEC_CONFIG_FOUND; | |
1210 | } | |
1086 | 1211 | hTp->remainder = 0; |
1087 | 1212 | hTp->avgBitRate = 0; |
1088 | 1213 | hTp->missingAccessUnits = 0; |
1116 | 1241 | if (phTp != NULL) |
1117 | 1242 | { |
1118 | 1243 | if (*phTp != NULL) { |
1119 | if ((*phTp)->transportFmt != TT_MP4_RAW && (*phTp)->transportFmt != TT_DRM) { | |
1244 | if ( ! TT_IS_PACKET((*phTp)->transportFmt) ) { | |
1120 | 1245 | FreeRam_TransportDecoderBuffer(&(*phTp)->bsBuffer); |
1121 | 1246 | } |
1122 | 1247 | if (*phTp != NULL) { |
1187 | 1312 | if ( (pTp->parser.adts.bs.num_raw_blocks > 0) && (pTp->parser.adts.bs.protection_absent == 0) ) |
1188 | 1313 | { |
1189 | 1314 | HANDLE_FDK_BITSTREAM hBs = &pTp->bitStream[0]; |
1190 | int bitDiff; | |
1191 | 1315 | |
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); | |
1197 | 1317 | } |
1198 | 1318 | return adtsRead_CrcCheck(&pTp->parser.adts); |
1199 | 1319 | default: |
0 | 0 | |
1 | 1 | /* library info */ |
2 | 2 | #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 | |
5 | 5 | #define TP_LIB_TITLE "MPEG Transport" |
6 | 6 | #define TP_LIB_BUILD_DATE __DATE__ |
7 | 7 | #define TP_LIB_BUILD_TIME __TIME__ |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
126 | 126 | * |
127 | 127 | * The number of channel element parameter describes the kind of consecutively elements. |
128 | 128 | * 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. | |
131 | 130 | * - Next element (CPE) is a back channel element. |
132 | 131 | * - Last element (LFE) is a lfe channel element. |
133 | 132 | */ |
139 | 138 | { MODE_1_2_1, { 2, 0, 1, 0, { ID_SCE, ID_CPE, ID_SCE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE } } }, |
140 | 139 | { MODE_1_2_2, { 2, 0, 1, 0, { ID_SCE, ID_CPE, ID_CPE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE } } }, |
141 | 140 | { 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 | ||
143 | 143 | |
144 | 144 | { MODE_1_1, { 2, 0, 0, 0, { ID_SCE, ID_SCE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE } } }, |
145 | 145 | { 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 } } }, |
150 | 150 | { MODE_2_2_2, { 1, 1, 1, 0, { ID_CPE, ID_CPE, ID_CPE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE } } }, |
151 | 151 | { 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 } } }, |
152 | 152 | |
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 | ||
154 | 158 | }; |
155 | 159 | |
156 | 160 | |
254 | 258 | if ( matrixMixdownA!=0 && ((channelMode==MODE_1_2_2)||(channelMode==MODE_1_2_2_1)) ) { |
255 | 259 | FDKwriteBits(hBs, 1, 1); /* Matrix mixdown present */ |
256 | 260 | 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 */ | |
258 | 262 | } |
259 | 263 | else { |
260 | 264 | FDKwriteBits(hBs, 0, 1); /* Matrix mixdown not present */ |
378 | 382 | |
379 | 383 | /* Write PCE if channel config is not 1-7 */ |
380 | 384 | 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); | |
382 | 386 | } |
383 | 387 | if (extFlg) { |
384 | 388 | if (aot == AOT_ER_BSAC) { |
473 | 477 | break; |
474 | 478 | } |
475 | 479 | |
476 | if (config->extAOT == AOT_SBR || config->extAOT == AOT_PS) | |
480 | if (config->sbrSignaling==SIG_EXPLICIT_HIERARCHICAL && config->sbrPresent) | |
477 | 481 | writeAot(asc, config->extAOT); |
478 | 482 | else |
479 | 483 | writeAot(asc, config->aot); |
491 | 495 | |
492 | 496 | FDKwriteBits( asc, getChannelConfig(config->channelMode), 4 ); |
493 | 497 | |
494 | if (config->extAOT == AOT_SBR || config->extAOT == AOT_PS) { | |
498 | if (config->sbrSignaling==SIG_EXPLICIT_HIERARCHICAL && config->sbrPresent) { | |
495 | 499 | writeSampleRate(asc, config->extSamplingRate); |
496 | 500 | writeAot(asc, config->aot); |
497 | 501 | } |
544 | 548 | break; |
545 | 549 | } |
546 | 550 | |
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 | ||
547 | 571 | /* Make sure all bits are sync'ed */ |
548 | 572 | FDKsyncCache( asc ); |
549 | 573 |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
149 | 149 | |
150 | 150 | TRANSPORTENC_ERROR transportEnc_Open( HANDLE_TRANSPORTENC *phTpEnc ) |
151 | 151 | { |
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); | |
153 | 159 | |
154 | 160 | if ( hTpEnc == NULL ) { |
155 | return TRANSPORTENC_INVALID_PARAMETER; | |
161 | return TRANSPORTENC_NO_MEM; | |
156 | 162 | } |
157 | 163 | |
158 | 164 | *phTpEnc = hTpEnc; |
416 | 422 | } |
417 | 423 | |
418 | 424 | /* 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); | |
420 | 426 | |
421 | 427 | if ( (hTp->transportFmt==TT_MP4_ADTS) && !hTp->writer.adts.protection_absent) { |
422 | 428 | adtsWrite_CrcEndReg(&hTp->writer.adts, &hTp->bitStream, crcIndex); |
0 | 0 | |
1 | 1 | /* library info */ |
2 | 2 | #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 | |
5 | 5 | #define TP_LIB_TITLE "MPEG Transport" |
6 | 6 | #define TP_LIB_BUILD_DATE __DATE__ |
7 | 7 | #define TP_LIB_BUILD_TIME __TIME__ |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
95 | 95 | |
96 | 96 | /* Decoder library info */ |
97 | 97 | #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 | |
100 | 100 | #define PCMDMX_LIB_TITLE "PCM Downmix Lib" |
101 | 101 | #define PCMDMX_LIB_BUILD_DATE __DATE__ |
102 | 102 | #define PCMDMX_LIB_BUILD_TIME __TIME__ |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
623 | 623 | |
624 | 624 | deltaExp = FDK_getNumOctavesDiv8(newLen, refLen); |
625 | 625 | |
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); | |
628 | 628 | deltaExp = deltaExp >> shift; |
629 | 629 | pFrameInfo->borders[0] = estimatedStartPos; |
630 | 630 | pFrameInfo->bordersNoise[0] = estimatedStartPos; |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
874 | 874 | /* |
875 | 875 | * Initialize the patching parameter |
876 | 876 | */ |
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; | |
893 | 879 | |
894 | 880 | desiredBorder = findClosestEntry(desiredBorder, v_k_master, numMaster, 1); /* Adapt region to master-table */ |
895 | 881 |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
759 | 759 | */ |
760 | 760 | { |
761 | 761 | int qmfErr; |
762 | /* Adapted QMF analysis post-twiddles for down-sampled HQ SBR */ | |
763 | const UINT downSampledFlag = (downsampleFac==2) ? QMF_FLAG_DOWNSAMPLED : 0; | |
762 | 764 | |
763 | 765 | qmfErr = qmfInitAnalysisFilterBank ( |
764 | 766 | &hs->AnalysiscQMF, |
767 | 769 | hHeaderData->freqBandData.lowSubband, |
768 | 770 | hHeaderData->freqBandData.highSubband, |
769 | 771 | hHeaderData->numberOfAnalysisBands, |
770 | qmfFlags & (~QMF_FLAG_KEEP_STATES) | |
772 | (qmfFlags & (~QMF_FLAG_KEEP_STATES)) | downSampledFlag | |
771 | 773 | ); |
772 | 774 | if (qmfErr != 0) { |
773 | 775 | return SBRDEC_UNSUPPORTED_CONFIG; |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
109 | 109 | 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}; |
110 | 110 | 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}; |
111 | 111 | 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}; | |
112 | 114 | //@} |
113 | 115 | |
114 | 116 |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
105 | 105 | extern const UCHAR FDK_sbrDecoder_sbr_start_freq_40[16]; |
106 | 106 | extern const UCHAR FDK_sbrDecoder_sbr_start_freq_44[16]; |
107 | 107 | 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]; | |
108 | 110 | |
109 | 111 | /* |
110 | 112 | Low-Power-Profile Transposer |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
126 | 126 | hDrcData->currFact_exp = 1; |
127 | 127 | hDrcData->nextFact_exp = 1; |
128 | 128 | |
129 | hDrcData->numBandsCurr = 0; | |
130 | hDrcData->numBandsNext = 0; | |
129 | hDrcData->numBandsCurr = 1; | |
130 | hDrcData->numBandsNext = 1; | |
131 | 131 | |
132 | 132 | hDrcData->winSequenceCurr = 0; |
133 | 133 | hDrcData->winSequenceNext = 0; |
489 | 489 | if (hDrcData == NULL) { |
490 | 490 | return; |
491 | 491 | } |
492 | if ( (hDrcData->enable == 0) | |
493 | || ((hDrcData->numBandsCurr == 0) && (hDrcData->numBandsNext == 0)) | |
494 | ) { | |
492 | if (hDrcData->enable == 0) { | |
495 | 493 | return; /* Avoid changing the scaleFactor even though the processing is disabled. */ |
496 | 494 | } |
497 | 495 |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
123 | 123 | fsMapped = fs; |
124 | 124 | |
125 | 125 | 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; | |
126 | 133 | case 48000: |
127 | 134 | band = FDK_sbrDecoder_sbr_start_freq_48[startFreq]; |
128 | 135 | break; |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
82 | 82 | |
83 | 83 | /*! |
84 | 84 | \file |
85 | \brief SBR decoder frontend | |
85 | \brief SBR decoder frontend | |
86 | 86 | This module provides a frontend to the SBR decoder. The function openSBR() is called for |
87 | 87 | initialization. The function sbrDecoder_Apply() is called for each frame. sbr_Apply() will call the |
88 | 88 | required functions to decode the raw SBR data (provided by env_extr.cpp), to decode the envelope data and noise floor levels [decodeSbrData()], |
135 | 135 | |
136 | 136 | /* Decoder library info */ |
137 | 137 | #define SBRDECODER_LIB_VL0 2 |
138 | #define SBRDECODER_LIB_VL1 1 | |
138 | #define SBRDECODER_LIB_VL1 2 | |
139 | 139 | #define SBRDECODER_LIB_VL2 3 |
140 | 140 | #define SBRDECODER_LIB_TITLE "SBR Decoder" |
141 | 141 | #define SBRDECODER_LIB_BUILD_DATE __DATE__ |
216 | 216 | |
217 | 217 | /* Check in/out samplerates */ |
218 | 218 | if ( sampleRateIn < 6400 |
219 | || sampleRateIn > 24000 | |
219 | || sampleRateIn > 48000 | |
220 | 220 | ) |
221 | 221 | { |
222 | 222 | sbrError = SBRDEC_UNSUPPORTED_CONFIG; |
223 | 223 | goto bail; |
224 | 224 | } |
225 | 225 | |
226 | if ( sampleRateOut > 48000 ) | |
226 | if ( sampleRateOut > 96000 ) | |
227 | 227 | { |
228 | 228 | sbrError = SBRDEC_UNSUPPORTED_CONFIG; |
229 | 229 | goto bail; |
551 | 551 | sbrDecoder_DestroyElement( self, elementIndex ); |
552 | 552 | } else if (self->pSbrElement[elementIndex] != NULL) { |
553 | 553 | /* 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; | |
555 | 555 | } |
556 | 556 | } |
557 | 557 | |
730 | 730 | case SBR_BS_INTERRUPTION: |
731 | 731 | { |
732 | 732 | int elementIndex; |
733 | ||
734 | if (self == NULL) { | |
735 | errorStatus = SBRDEC_NOT_INITIALIZED; | |
736 | break; | |
737 | } | |
738 | ||
733 | 739 | /* Loop over SBR elements */ |
734 | 740 | for (elementIndex = 0; elementIndex < self->numSbrElements; elementIndex++) |
735 | 741 | { |
877 | 883 | pSbrDrcChannelData = sbrDecoder_drcGetChannel( self, ch ); |
878 | 884 | |
879 | 885 | if ( pSbrDrcChannelData != NULL ) { |
880 | pSbrDrcChannelData->enable = 0; | |
886 | sbrDecoder_drcInitChannel( pSbrDrcChannelData ); | |
881 | 887 | } |
882 | 888 | } |
883 | 889 |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
100 | 100 | #define MAX_CODEC_FRAME_RATIO 2 |
101 | 101 | #define MAX_PAYLOAD_SIZE 256 |
102 | 102 | |
103 | typedef enum codecType | |
104 | { | |
105 | CODEC_AAC=0, | |
106 | CODEC_AACLD=1, | |
107 | CODEC_UNSPECIFIED=99 | |
108 | } CODEC_TYPE; | |
109 | ||
110 | ||
103 | 111 | typedef struct |
104 | 112 | { |
105 | 113 | INT bitRate; |
128 | 136 | |
129 | 137 | typedef struct |
130 | 138 | { |
139 | CODEC_TYPE coreCoder; /*!< LC or ELD */ | |
131 | 140 | UINT bitrateFrom; /*!< inclusive */ |
132 | 141 | UINT bitrateTo; /*!< exclusive */ |
133 | 142 | |
134 | USHORT sampleRate; /*!< */ | |
143 | UINT sampleRate; /*!< */ | |
135 | 144 | UCHAR numChannels; /*!< */ |
136 | 145 | |
137 | 146 | UCHAR startFreq; /*!< bs_start_freq */ |
157 | 166 | INT crcSbr; /*!< Flag: usage of SBR-CRC. */ |
158 | 167 | INT dynBwSupported; /*!< Flag: support for dynamic bandwidth in this combination. */ |
159 | 168 | INT parametricCoding; /*!< Flag: usage of parametric coding tool. */ |
169 | INT downSampleFactor; /*!< Sampling rate relation between the SBR and the core encoder. */ | |
160 | 170 | int freq_res_fixfix[3]; /*!< Frequency resolution of envelopes in frame class FIXFIX |
161 | 171 | 0=1 Env; 1=2 Env; 2=4 Env; */ |
162 | 172 | /* |
193 | 203 | INT useSaPan; /*!< Flag: usage of SAPAN stereo. */ |
194 | 204 | INT dynBwEnabled; /*!< Flag: usage of dynamic bandwidth. */ |
195 | 205 | INT bParametricStereo; /*!< Flag: usage of parametric stereo coding tool. */ |
196 | INT bDownSampledSbr; /*!< Signal downsampled SBR is used. */ | |
197 | 206 | |
198 | 207 | /* |
199 | 208 | header_extra1 configuration |
213 | 222 | UCHAR init_amp_res_FF; |
214 | 223 | } sbrConfiguration, *sbrConfigurationPtr ; |
215 | 224 | |
216 | typedef struct | |
225 | typedef struct SBR_CONFIG_DATA | |
217 | 226 | { |
218 | 227 | UINT sbrSyntaxFlags; /**< SBR syntax flags derived from AOT. */ |
219 | 228 | INT nChannels; /**< Number of channels. */ |
239 | 248 | INT xposCtrlSwitch; /**< Flag indicates whether to switch xpos ctrl on the fly. */ |
240 | 249 | INT switchTransposers; /**< Flag indicates whether to switch xpos on the fly . */ |
241 | 250 | UCHAR initAmpResFF; |
242 | } SBR_CONFIG_DATA; | |
243 | ||
244 | typedef SBR_CONFIG_DATA *HANDLE_SBR_CONFIG_DATA; | |
251 | } SBR_CONFIG_DATA, *HANDLE_SBR_CONFIG_DATA; | |
245 | 252 | |
246 | 253 | typedef struct { |
247 | 254 | MP4_ELEMENT_ID elType; |
274 | 281 | ); |
275 | 282 | |
276 | 283 | /** |
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 | |
283 | 291 | */ |
284 | 292 | 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); | |
285 | 303 | |
286 | 304 | /** |
287 | 305 | * \brief Initialize SBR Encoder instance. |
293 | 311 | * \param bufferOffset Returns the offset for the audio input data in order to do delay balancing. |
294 | 312 | * \param numChannels Input: Encoder input channels. output: core encoder channels. |
295 | 313 | * \param sampleRate Input: Encoder samplerate. output core encoder samplerate. |
314 | * \param downSampleFactor Input: Relation between SBR and core coder sampling rate; | |
296 | 315 | * \param frameLength Input: Encoder frameLength. output core encoder frameLength. |
297 | 316 | * \param aot Input: Desired AOT. output AOT to be used after parameter checking. |
298 | 317 | * \param delay Input: core encoder delay. Output: total delay because of SBR. |
299 | 318 | * \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. | |
300 | 322 | * \return 0 on success, and non-zero if failed. |
301 | 323 | */ |
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 | ); | |
316 | 341 | |
317 | 342 | /** |
318 | 343 | * \brief Do delay line buffers housekeeping. To be called after each encoded audio frame. |
343 | 368 | INT sbrEncoder_EncodeFrame(HANDLE_SBR_ENCODER hEnvEncoder, |
344 | 369 | INT_PCM *samples, |
345 | 370 | UINT timeInStride, |
346 | UINT sbrDataBits[(6)], | |
347 | UCHAR sbrData[(6)][MAX_PAYLOAD_SIZE] | |
371 | UINT sbrDataBits[(8)], | |
372 | UCHAR sbrData[(8)][MAX_PAYLOAD_SIZE] | |
348 | 373 | ); |
349 | 374 | |
350 | 375 | /** |
355 | 380 | * \param fSendHeaders Flag indicating that the SBR encoder should send more headers in the SBR payload or not. |
356 | 381 | * \return void |
357 | 382 | */ |
358 | void sbrEncoder_GetHeader(SBR_ENCODER *sbrEncoder, | |
383 | void sbrEncoder_GetHeader(HANDLE_SBR_ENCODER sbrEncoder, | |
359 | 384 | HANDLE_FDK_BITSTREAM hBs, |
360 | 385 | INT element_index, |
361 | 386 | int fSendHeaders); |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
124 | 124 | INT freqScale; |
125 | 125 | |
126 | 126 | /* |
127 | element of sbrdata | |
128 | */ | |
129 | SR_MODE sampleRateMode; | |
130 | ||
131 | /* | |
132 | 127 | element of channelpairelement |
133 | 128 | */ |
134 | 129 | INT coupling; |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
127 | 127 | |
128 | 128 | /* Get Scratch buffer */ |
129 | 129 | 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); | |
133 | 130 | |
134 | 131 | /* Get max possible scaling of QMF data */ |
135 | 132 | scale = DFRACT_BITS; |
816 | 813 | } |
817 | 814 | |
818 | 815 | /* 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)); | |
820 | 817 | nrgLeft = (FIXP_DBL)(LONG)nrgLeft >> (DFRACT_BITS-1-LD_DATA_SHIFT-1-oneBitLess-1); |
821 | 818 | sfb_nrgLeft[m] = ((INT)nrgLeft+1)>>1; /* rounding */ |
822 | 819 | |
823 | 820 | if (stereoMode == SBR_COUPLING) { |
824 | 821 | 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; | |
835 | 832 | |
836 | 833 | /* ld64 to integer conversion */ |
837 | 834 | nrgRight = (FIXP_DBL)(LONG)(nrgRight) >> (DFRACT_BITS-1-LD_DATA_SHIFT-1-oneBitLess); |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1243 | 1243 | |
1244 | 1244 | FDK_ASSERT(totNoEst <= MAX_NO_OF_ESTIMATES); |
1245 | 1245 | |
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 | } | |
1265 | 1278 | } |
1266 | 1279 | |
1267 | 1280 | if (sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) { |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
101 | 101 | #define max(a,b) ( a > b ? a:b) |
102 | 102 | #endif |
103 | 103 | |
104 | #define NOISE_FLOOR_OFFSET_SCALING (3) | |
104 | #define NOISE_FLOOR_OFFSET_SCALING (4) | |
105 | 105 | |
106 | 106 | |
107 | 107 | |
483 | 483 | tmp = ((FIXP_DBL)MAXVAL_DBL)>>NOISE_FLOOR_OFFSET_SCALING; |
484 | 484 | } |
485 | 485 | 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 */ | |
491 | 493 | exp = fDivNorm((FIXP_DBL)noiseFloorOffset, 3, &qexp); |
492 | 494 | tmp = fPow(2, DFRACT_BITS-1, exp, qexp, &qtmp); |
493 | 495 | tmp = scaleValue(tmp, qtmp-NOISE_FLOOR_OFFSET_SCALING); |
526 | 528 | h_sbrNoiseFloorEstimate->noNoiseBands = 1; |
527 | 529 | } |
528 | 530 | 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 | |
531 | 533 | ********************************************************/ |
532 | 534 | FIXP_DBL tmp, ratio, lg2; |
533 | INT ratio_e, qlg2; | |
535 | INT ratio_e, qlg2, nNoiseBands; | |
534 | 536 | |
535 | 537 | ratio = fDivNorm(k2, kx, &ratio_e); |
536 | 538 | lg2 = fLog2(ratio, ratio_e, &qlg2); |
537 | 539 | tmp = fMult((FIXP_DBL)(h_sbrNoiseFloorEstimate->noiseBands<<24), lg2); |
538 | 540 | tmp = scaleValue(tmp, qlg2-23); |
539 | 541 | |
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 | ||
547 | 555 | } |
548 | 556 | |
549 | 557 |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
266 | 266 | PS_BANDS_MID |
267 | 267 | }; |
268 | 268 | |
269 | static INT getNoBands(PS_RESOLUTION mode) | |
269 | static INT getNoBands(UINT mode) | |
270 | 270 | { |
271 | 271 | if(mode>=6) |
272 | 272 | return 0; |
273 | 273 | |
274 | 274 | if(mode>=3) |
275 | mode = (PS_RESOLUTION)(mode-3); | |
275 | mode = mode-3; | |
276 | 276 | |
277 | 277 | return psBands[mode]; |
278 | 278 | } |
523 | 523 | bitCnt += FDKsbrEnc_EncodeIpd( hBitBuf, |
524 | 524 | psOut->ipd[env], |
525 | 525 | ipdLast, |
526 | getNoBands((PS_RESOLUTION)psOut->iidMode), | |
526 | getNoBands((UINT)psOut->iidMode), | |
527 | 527 | psOut->deltaIPD[env], |
528 | 528 | &error); |
529 | 529 | |
531 | 531 | bitCnt += FDKsbrEnc_EncodeOpd( hBitBuf, |
532 | 532 | psOut->opd[env], |
533 | 533 | opdLast, |
534 | getNoBands((PS_RESOLUTION)psOut->iidMode), | |
534 | getNoBands((UINT)psOut->iidMode), | |
535 | 535 | psOut->deltaOPD[env], |
536 | 536 | &error ); |
537 | 537 | } |
660 | 660 | bitCnt += FDKsbrEnc_EncodeIid( hBitBuf, |
661 | 661 | psOut->iid[env], |
662 | 662 | iidLast, |
663 | getNoBands((PS_RESOLUTION)psOut->iidMode), | |
663 | getNoBands((UINT)psOut->iidMode), | |
664 | 664 | (PS_IID_RESOLUTION)getIIDRes(psOut->iidMode), |
665 | 665 | psOut->deltaIID[env], |
666 | 666 | &error ); |
676 | 676 | bitCnt += FDKsbrEnc_EncodeIcc( hBitBuf, |
677 | 677 | psOut->icc[env], |
678 | 678 | iccLast, |
679 | getNoBands((PS_RESOLUTION)psOut->iccMode), | |
679 | getNoBands((UINT)psOut->iccMode), | |
680 | 680 | psOut->deltaICC[env], |
681 | 681 | &error); |
682 | 682 |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
226 | 226 | /* clear bs buffer */ |
227 | 227 | FDKmemclear(hParametricStereo->psOut, sizeof(hParametricStereo->psOut)); |
228 | 228 | |
229 | hParametricStereo->psOut[0].enablePSHeader = 1; /* write ps header in first frame */ | |
230 | ||
229 | 231 | /* clear scaling buffer */ |
230 | 232 | FDKmemclear(hParametricStereo->dynBandScale, sizeof(UCHAR)*PS_MAX_BANDS); |
231 | 233 | FDKmemclear(hParametricStereo->maxBandValue, sizeof(FIXP_QMF)*PS_MAX_BANDS); |
312 | 314 | } |
313 | 315 | else { |
314 | 316 | 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) | |
316 | 318 | |
317 | 319 | /* define scalings */ |
318 | 320 | int dynQmfScale = fixMax(0, hParametricStereo->dmxScale-1); /* scale one bit more for addition of left and right */ |
397 | 399 | |
398 | 400 | *qmfScale = -downmixScale + 7; |
399 | 401 | |
400 | C_ALLOC_SCRATCH_END(pWorkBuffer, FIXP_QMF, QMF_CHANNELS*2); | |
401 | ||
402 | C_AALLOC_SCRATCH_END(pWorkBuffer, FIXP_QMF, 2*QMF_CHANNELS) | |
402 | 403 | |
403 | 404 | { |
404 | 405 | const INT noQmfSlots2 = hParametricStereo->noQmfSlots>>1; |
472 | 473 | ) |
473 | 474 | { |
474 | 475 | FDK_PSENC_ERROR error = PSENC_OK; |
475 | INT noQmfBands = hParametricStereo->noQmfBands; | |
476 | 476 | INT psQmfScale[MAX_PS_CHANNELS] = {0}; |
477 | 477 | 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) | |
479 | 479 | |
480 | 480 | for (psCh = 0; psCh<MAX_PS_CHANNELS; psCh ++) { |
481 | 481 | |
504 | 504 | |
505 | 505 | } /* for psCh */ |
506 | 506 | |
507 | C_ALLOC_SCRATCH_END(pWorkBuffer, FIXP_DBL, QMF_CHANNELS*4); | |
507 | C_AALLOC_SCRATCH_END(pWorkBuffer, FIXP_QMF, 4*QMF_CHANNELS) | |
508 | 508 | |
509 | 509 | /* find best scaling in new QMF and Hybrid data */ |
510 | 510 | psFindBestScaling( hParametricStereo, |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
104 | 104 | /* SBR bitstream delay */ |
105 | 105 | #define DELAY_FRAMES 2 |
106 | 106 | |
107 | typedef struct { | |
107 | ||
108 | typedef struct SBR_CHANNEL { | |
108 | 109 | struct ENV_CHANNEL hEnvChannel; |
109 | 110 | //INT_PCM *pDSOutBuffer; /**< Pointer to downsampled audio output of SBR encoder */ |
110 | 111 | DOWNSAMPLER downSampler; |
112 | 113 | } SBR_CHANNEL; |
113 | 114 | typedef SBR_CHANNEL* HANDLE_SBR_CHANNEL; |
114 | 115 | |
115 | typedef struct { | |
116 | typedef struct SBR_ELEMENT { | |
116 | 117 | HANDLE_SBR_CHANNEL sbrChannel[2]; |
117 | 118 | QMF_FILTER_BANK *hQmfAnalysis[2]; |
118 | 119 | SBR_CONFIG_DATA sbrConfigData; |
125 | 126 | UCHAR payloadDelayLine[1+DELAY_FRAMES][MAX_PAYLOAD_SIZE]; |
126 | 127 | UINT payloadDelayLineSize[1+DELAY_FRAMES]; /* Sizes in bits */ |
127 | 128 | |
128 | } SBR_ELEMENT; | |
129 | typedef SBR_ELEMENT* HANDLE_SBR_ELEMENT; | |
129 | } SBR_ELEMENT, *HANDLE_SBR_ELEMENT; | |
130 | 130 | |
131 | struct SBR_ENCODER | |
131 | typedef struct SBR_ENCODER | |
132 | 132 | { |
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)]; | |
136 | 136 | DOWNSAMPLER lfeDownSampler; |
137 | 137 | int lfeChIdx; /* -1 default for no lfe, else assign channel index */ |
138 | 138 | int noElements; /* Number of elements */ |
141 | 141 | int bufferOffset; /* Offset for SBR parameter extraction in time domain input buffer. */ |
142 | 142 | int downsampledOffset; /* Offset of downsampled/mixed output for core encoder. */ |
143 | 143 | 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. */ | |
144 | 145 | int fTimeDomainDownsampling; /* Flag signalling time domain downsampling instead of QMF downsampling. */ |
145 | 146 | int nBitstrDelay; /* Amount of SBR frames to be delayed in bitstream domain. */ |
146 | 147 | INT estimateBitrate; /* estimate bitrate of SBR encoder */ |
157 | 158 | INT maxChannels; |
158 | 159 | INT supportPS; |
159 | 160 | |
160 | } ; | |
161 | ||
162 | } SBR_ENCODER; | |
161 | 163 | |
162 | 164 | |
163 | 165 | #endif /* __SBR_H */ |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
269 | 269 | |
270 | 270 | typedef enum |
271 | 271 | { |
272 | SINGLE_RATE, | |
273 | DUAL_RATE | |
274 | } | |
275 | SR_MODE; | |
276 | ||
277 | typedef enum | |
278 | { | |
279 | 272 | FREQ_RES_LOW = 0, |
280 | 273 | FREQ_RES_HIGH |
281 | 274 | } |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
82 | 82 | |
83 | 83 | /*************************** Fraunhofer IIS FDK Tools *********************** |
84 | 84 | |
85 | Author(s): Andreas Ehret | |
85 | Author(s): Andreas Ehret, Tobias Chalupka | |
86 | 86 | Description: SBR encoder top level processing. |
87 | 87 | |
88 | 88 | ******************************************************************************/ |
101 | 101 | #include "ps_main.h" |
102 | 102 | |
103 | 103 | #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 | |
106 | 106 | |
107 | 107 | |
108 | 108 | |
118 | 118 | (core2sbr delay ) ds (read, core and ds area) |
119 | 119 | */ |
120 | 120 | |
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 */ | |
134 | 131 | |
135 | 132 | /* 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) ) | |
139 | 136 | |
140 | 137 | /* 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 */ | |
149 | 145 | |
150 | 146 | /***************************************************************************/ |
151 | 147 | |
171 | 167 | UINT *pBitRateClosest |
172 | 168 | ) |
173 | 169 | { |
174 | int i, paramSetTop, bitRateClosestLowerIndex=-1, bitRateClosestUpperIndex=-1, found = 0; | |
170 | int i, bitRateClosestLowerIndex=-1, bitRateClosestUpperIndex=-1, found = 0; | |
175 | 171 | 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 */ | |
190 | 180 | { |
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 | } | |
203 | 203 | } |
204 | 204 | } |
205 | if ( sbrTuningTable [i].bitrateTo <= bitrate ) { | |
206 | if (sbrTuningTable [i].bitrateTo > bitRateClosestUpper) { | |
207 | bitRateClosestUpper = sbrTuningTable [i].bitrateTo-1; | |
208 | bitRateClosestUpperIndex = i; | |
209 | } | |
210 | } | |
211 | 205 | } |
212 | 206 | } |
213 | 207 | } |
214 | 208 | |
215 | 209 | if (pBitRateClosest != NULL) |
216 | 210 | { |
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 */ | |
218 | 212 | if (found) |
219 | 213 | { |
220 | 214 | int distanceUpper=DISTANCE_CEIL_VALUE, distanceLower=DISTANCE_CEIL_VALUE; |
294 | 288 | return INVALID_TABLE_IDX; |
295 | 289 | } |
296 | 290 | |
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 | ||
297 | 337 | |
298 | 338 | /***************************************************************************/ |
299 | 339 | /*! |
306 | 346 | |
307 | 347 | ****************************************************************************/ |
308 | 348 | 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 | ) | |
315 | 357 | { |
316 | 358 | INT idx = INVALID_TABLE_IDX; |
317 | UINT sampleRateCore; | |
318 | 359 | |
319 | 360 | if (sampleRateInput < 16000) |
320 | 361 | return 0; |
334 | 375 | bitrate *= numOutputChannels; |
335 | 376 | } |
336 | 377 | |
337 | /* try DOWN_SMPL_FAC of the input sampling rate */ | |
338 | sampleRateCore = sampleRateInput/DOWN_SMPL_FAC; | |
339 | 378 | idx = getSbrTuningTableIndex(bitrate, numOutputChannels, sampleRateCore, core, NULL); |
340 | 379 | |
341 | 380 | return (idx == INVALID_TABLE_IDX ? 0 : 1); |
355 | 394 | FDKsbrEnc_AdjustSbrSettings (const sbrConfigurationPtr config, /*! output, modified */ |
356 | 395 | UINT bitRate, /*! the total bitrate in bits/sec */ |
357 | 396 | 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 */ | |
359 | 399 | UINT transFac, /*! the short block to long block ratio */ |
360 | 400 | UINT standardBitrate, /*! the standard bitrate per channel in bits/sec */ |
361 | 401 | UINT vbrMode, /*! the vbr paramter, 0 poor quality .. 100 high quality*/ |
365 | 405 | AUDIO_OBJECT_TYPE core) /* Core audio codec object type */ |
366 | 406 | { |
367 | 407 | INT idx = INVALID_TABLE_IDX; |
368 | UINT sampleRate; | |
369 | ||
370 | /* set the codec settings */ | |
408 | /* set the core codec settings */ | |
371 | 409 | config->codecSettings.bitRate = bitRate; |
372 | 410 | config->codecSettings.nChannels = numChannels; |
373 | config->codecSettings.sampleFreq = fsCore; | |
411 | config->codecSettings.sampleFreq = sampleRateCore; | |
374 | 412 | config->codecSettings.transFac = transFac; |
375 | 413 | config->codecSettings.standardBitrate = standardBitrate; |
376 | sampleRate = fsCore * DOWN_SMPL_FAC; | |
377 | 414 | |
378 | 415 | if (bitRate==0) { |
379 | 416 | /* map vbr quality to bitrate */ |
390 | 427 | bitRate *= numChannels; |
391 | 428 | /* fix to enable mono vbrMode<40 @ 44.1 of 48kHz */ |
392 | 429 | if (numChannels==1) { |
393 | if (sampleRate==44100 || sampleRate==48000) { | |
430 | if (sampleRateSbr==44100 || sampleRateSbr==48000) { | |
394 | 431 | if (vbrMode<40) bitRate = 32000; |
395 | 432 | } |
396 | 433 | } |
397 | 434 | } |
398 | 435 | |
399 | idx = getSbrTuningTableIndex(bitRate,numChannels,fsCore, core, NULL); | |
436 | idx = getSbrTuningTableIndex(bitRate,numChannels,sampleRateCore, core, NULL); | |
400 | 437 | |
401 | 438 | if (idx != INVALID_TABLE_IDX) { |
402 | 439 | config->startFreq = sbrTuningTable[idx].startFreq ; |
406 | 443 | config->stopFreq = sbrTuningTable[idx].stopFreqSpeech; |
407 | 444 | } |
408 | 445 | |
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 | ||
409 | 461 | config->sbr_noise_bands = sbrTuningTable[idx].numNoiseBands ; |
410 | 462 | if (core == AOT_ER_AAC_ELD) |
411 | 463 | config->init_amp_res_FF = SBR_AMP_RES_1_5; |
454 | 506 | description: initializes the SBR confifuration |
455 | 507 | returns: error status |
456 | 508 | input: - core codec type, |
457 | - fac of SBR to core frame length, | |
509 | - factor of SBR to core frame length, | |
458 | 510 | - core frame length |
459 | 511 | output: initialized SBR configuration |
460 | 512 | |
461 | 513 | *****************************************************************************/ |
462 | 514 | static UINT |
463 | 515 | 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 */ | |
470 | 523 | |
471 | 524 | config->SendHeaderDataTime = 1000; |
472 | 525 | config->useWaveCoding = 0; |
475 | 528 | config->tran_thr = 13000; |
476 | 529 | config->parametricCoding = 1; |
477 | 530 | |
478 | config->sbrFrameSize = codecGranuleLen * coreSbrFrameLenFac; | |
479 | ||
531 | config->sbrFrameSize = codecGranuleLen * downSampleFactor; | |
532 | config->downSampleFactor = downSampleFactor; | |
480 | 533 | |
481 | 534 | /* sbr default parameters */ |
482 | 535 | config->sbr_data_extra = 0; |
496 | 549 | config->sbr_xpos_level = 0; |
497 | 550 | config->useSaPan = 0; |
498 | 551 | config->dynBwEnabled = 0; |
499 | config->bDownSampledSbr = 0; | |
500 | 552 | |
501 | 553 | |
502 | 554 | /* the following parameters are overwritten by the FDKsbrEnc_AdjustSbrSettings() function since |
600 | 652 | { |
601 | 653 | int el, ch; |
602 | 654 | |
603 | for (el=0; el<(6); el++) | |
655 | for (el=0; el<(8); el++) | |
604 | 656 | { |
605 | 657 | if (hSbrEncoder->sbrElement[el]!=NULL) { |
606 | 658 | sbrEncoder_ElementClose(&hSbrEncoder->sbrElement[el]); |
608 | 660 | } |
609 | 661 | |
610 | 662 | /* Close sbr Channels */ |
611 | for (ch=0; ch<(6); ch++) | |
663 | for (ch=0; ch<(8); ch++) | |
612 | 664 | { |
613 | 665 | if (hSbrEncoder->pSbrChannel[ch]) { |
614 | 666 | sbrEncoder_ChannelClose(hSbrEncoder->pSbrChannel[ch]); |
644 | 696 | output: error info |
645 | 697 | |
646 | 698 | *****************************************************************************/ |
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 | ) | |
650 | 704 | { |
651 | 705 | INT k0, k2; |
652 | 706 | |
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 | ) | |
659 | 717 | return(1); |
660 | 718 | |
661 | 719 | |
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 | ) | |
665 | 729 | return(1); |
666 | 730 | |
667 | 731 | |
668 | 732 | sbrHeaderData->sbr_xover_band=0; |
669 | 733 | |
670 | 734 | |
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 | ) | |
678 | 743 | return(1); |
679 | 744 | |
680 | 745 | |
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; | |
687 | 755 | |
688 | 756 | return (0); |
689 | 757 | } |
865 | 933 | */ |
866 | 934 | if(updateFreqBandTable(&hSbrElement->sbrConfigData, |
867 | 935 | &hSbrElement->sbrHeaderData, |
868 | hSbrElement->sbrConfigData.noQmfBands)) | |
936 | hEnvEncoder->downSampleFactor | |
937 | )) | |
869 | 938 | return(1); |
870 | 939 | |
871 | 940 | |
889 | 958 | MAX_PAYLOAD_SIZE*sizeof(UCHAR), |
890 | 959 | &crcInfo, |
891 | 960 | hSbrElement->sbrConfigData.sbrSyntaxFlags); |
892 | ||
893 | INT error = noError; | |
894 | 961 | |
895 | 962 | /* Temporal Envelope Data */ |
896 | 963 | SBR_FRAME_TEMP_DATA _fData; |
922 | 989 | |
923 | 990 | if(hSbrElement->elInfo.fParametricStereo == 0) |
924 | 991 | { |
925 | C_ALLOC_SCRATCH_START(qmfWorkBuffer, FIXP_DBL, QMF_CHANNELS*2); | |
926 | 992 | QMF_SCALE_FACTOR tmpScale; |
927 | 993 | FIXP_DBL **pQmfReal, **pQmfImag; |
994 | C_AALLOC_SCRATCH_START(qmfWorkBuffer, FIXP_DBL, QMF_CHANNELS*2) | |
928 | 995 | |
929 | 996 | |
930 | 997 | /* Obtain pointers to QMF buffers. */ |
939 | 1006 | timeInStride, |
940 | 1007 | qmfWorkBuffer ); |
941 | 1008 | |
942 | C_ALLOC_SCRATCH_END(qmfWorkBuffer, FIXP_DBL, QMF_CHANNELS*2); | |
943 | ||
944 | 1009 | h_envChan->qmfScale = tmpScale.lb_scale + 7; |
1010 | ||
1011 | ||
1012 | C_AALLOC_SCRATCH_END(qmfWorkBuffer, FIXP_DBL, QMF_CHANNELS*2) | |
945 | 1013 | |
946 | 1014 | } /* fParametricStereo == 0 */ |
947 | 1015 | |
951 | 1019 | */ |
952 | 1020 | if (hSbrElement->elInfo.fParametricStereo) |
953 | 1021 | { |
1022 | INT error = noError; | |
1023 | ||
954 | 1024 | |
955 | 1025 | /* Limit Parametric Stereo to one instance */ |
956 | 1026 | FDK_ASSERT(ch == 0); |
1176 | 1246 | break; |
1177 | 1247 | case 2048: |
1178 | 1248 | case 1024: |
1249 | case 512: | |
1179 | 1250 | timeSlots = 16; |
1180 | 1251 | break; |
1181 | 1252 | case 1920: |
1182 | 1253 | case 960: |
1254 | case 480: | |
1183 | 1255 | timeSlots = 15; |
1184 | 1256 | break; |
1185 | 1257 | case 1152: |
1220 | 1292 | |
1221 | 1293 | tran_fc = params->tran_fc; |
1222 | 1294 | |
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 | } | |
1226 | 1298 | |
1227 | 1299 | tran_fc = (tran_fc*4*sbrConfigData->noQmfBands/sbrConfigData->sampleFreq + 1)>>1; |
1228 | 1300 | |
1232 | 1304 | } else |
1233 | 1305 | { |
1234 | 1306 | frameShift = 0; |
1235 | switch (params->sbrFrameSize) { | |
1307 | switch (timeSlots) { | |
1236 | 1308 | /* 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; | |
1240 | 1312 | } |
1241 | 1313 | } |
1242 | 1314 | if ( FDKsbrEnc_InitExtractSbrEnvelope (&hEnv->sbrExtractEnvelope, |
1329 | 1401 | hSbrEncoder->pSBRdynamic_RAM = (UCHAR*)GetRam_SbrDynamic_RAM(); |
1330 | 1402 | hSbrEncoder->dynamicRam = hSbrEncoder->pSBRdynamic_RAM; |
1331 | 1403 | |
1332 | ||
1333 | 1404 | for (i=0; i<nElements; i++) { |
1334 | 1405 | hSbrEncoder->sbrElement[i] = GetRam_SbrElement(i); |
1335 | 1406 | if (hSbrEncoder->sbrElement[i]==NULL) { |
1396 | 1467 | static |
1397 | 1468 | INT FDKsbrEnc_Reallocate( |
1398 | 1469 | HANDLE_SBR_ENCODER hSbrEncoder, |
1399 | SBR_ELEMENT_INFO elInfo[(6)], | |
1470 | SBR_ELEMENT_INFO elInfo[(8)], | |
1400 | 1471 | const INT noElements) |
1401 | 1472 | { |
1402 | 1473 | INT totalCh = 0; |
1461 | 1532 | AUDIO_OBJECT_TYPE aot, |
1462 | 1533 | int nBitstrDelay, |
1463 | 1534 | int nElement, |
1464 | ULONG statesInitFlag | |
1535 | const int headerPeriod, | |
1536 | ULONG statesInitFlag, | |
1537 | int fTimeDomainDownsampling | |
1465 | 1538 | ,UCHAR *dynamic_RAM |
1466 | 1539 | ) |
1467 | 1540 | { |
1495 | 1568 | hSbrElement->sbrConfigData.sbrSyntaxFlags |= SBR_SYNTAX_CRC; |
1496 | 1569 | } |
1497 | 1570 | |
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 | } | |
1500 | 1581 | |
1501 | 1582 | FDKinitBitStream(&hSbrElement->CmonData.sbrBitbuf, bitstreamBuffer, MAX_PAYLOAD_SIZE*sizeof(UCHAR), 0, BS_WRITER); |
1502 | 1583 | |
1512 | 1593 | |
1513 | 1594 | hSbrElement->sbrConfigData.frameSize = params->sbrFrameSize; |
1514 | 1595 | |
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; | |
1519 | 1597 | |
1520 | 1598 | hSbrElement->sbrBitstreamData.CountSendHeaderData = 0; |
1521 | 1599 | if (params->SendHeaderDataTime > 0 ) { |
1522 | 1600 | |
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 | |
1524 | 1604 | / (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 | } | |
1526 | 1611 | } |
1527 | 1612 | else { |
1528 | 1613 | hSbrElement->sbrBitstreamData.NrSendHeaderData = 0; |
1583 | 1668 | /* init freq band table */ |
1584 | 1669 | if(updateFreqBandTable(&hSbrElement->sbrConfigData, |
1585 | 1670 | &hSbrElement->sbrHeaderData, |
1586 | hSbrElement->sbrConfigData.noQmfBands)) | |
1671 | params->downSampleFactor | |
1672 | )) | |
1587 | 1673 | { |
1588 | 1674 | return(1); |
1589 | 1675 | } |
1623 | 1709 | hSbrElement->sbrConfigData.noQmfBands, |
1624 | 1710 | hSbrElement->sbrConfigData.noQmfBands, |
1625 | 1711 | qmfFlags ); |
1712 | if (0!=err) { | |
1713 | return err; | |
1714 | } | |
1626 | 1715 | } |
1627 | 1716 | |
1628 | 1717 | /* */ |
1644 | 1733 | { |
1645 | 1734 | INT temp; |
1646 | 1735 | |
1647 | temp = (1024*DOWN_SMPL_FAC); | |
1736 | temp = (2048); | |
1648 | 1737 | temp += 1024 + MAX_SAMPLE_DELAY; |
1649 | 1738 | temp *= noChannels; |
1650 | 1739 | temp *= sizeof(INT_PCM); |
1676 | 1765 | 1 |
1677 | 1766 | )) |
1678 | 1767 | return -1; |
1679 | sbrEncoder_UpdateBuffers(hEnvEnc, timeBuffer); | |
1680 | } | |
1768 | } | |
1769 | sbrEncoder_UpdateBuffers(hEnvEnc, timeBuffer); | |
1681 | 1770 | } |
1682 | 1771 | return 0; |
1683 | 1772 | } |
1708 | 1797 | return newBitRate; |
1709 | 1798 | } |
1710 | 1799 | |
1800 | UINT sbrEncoder_IsSingleRatePossible(AUDIO_OBJECT_TYPE aot) | |
1801 | { | |
1802 | UINT isPossible=(AOT_PS==aot)?0:1; | |
1803 | return isPossible; | |
1804 | } | |
1711 | 1805 | |
1712 | 1806 | 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 | ) | |
1727 | 1823 | { |
1728 | 1824 | HANDLE_ERROR_INFO errorInfo = noError; |
1729 | sbrConfiguration sbrConfig[(6)]; | |
1825 | sbrConfiguration sbrConfig[(8)]; | |
1730 | 1826 | INT error = 0; |
1731 | 1827 | INT lowestBandwidth; |
1732 | 1828 | /* Save input parameters */ |
1733 | INT inputSampleRate = *sampleRate; | |
1829 | INT inputSampleRate = *coreSampleRate; | |
1734 | 1830 | int coreFrameLength = *frameLength; |
1735 | 1831 | int inputBandWidth = *coreBandwidth; |
1736 | 1832 | int inputChannels = *numChannels; |
1738 | 1834 | int downsampledOffset = 0; |
1739 | 1835 | int sbrOffset = 0; |
1740 | 1836 | int downsamplerDelay = 0; |
1741 | int downsample = 0; | |
1837 | int timeDomainDownsample = 0; | |
1742 | 1838 | int nBitstrDelay = 0; |
1743 | int lowestSbrStartFreq, lowestSbrStopFreq; | |
1839 | int highestSbrStartFreq, highestSbrStopFreq; | |
1744 | 1840 | int lowDelay = 0; |
1745 | 1841 | int usePs = 0; |
1746 | 1842 | |
1747 | 1843 | /* 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) ) { | |
1749 | 1851 | usePs = 1; |
1750 | 1852 | } |
1751 | if ( (*aot==AOT_ER_AAC_ELD) ) { | |
1853 | if ( (aot==AOT_ER_AAC_ELD) ) { | |
1752 | 1854 | lowDelay = 1; |
1753 | 1855 | } |
1754 | else if ( (*aot==AOT_ER_AAC_LD) ) { | |
1856 | else if ( (aot==AOT_ER_AAC_LD) ) { | |
1755 | 1857 | error = 1; |
1756 | 1858 | goto bail; |
1757 | 1859 | } |
1766 | 1868 | /* core encoder gets downmixed mono signal */ |
1767 | 1869 | *numChannels = 1; |
1768 | 1870 | } 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; | |
1784 | 1873 | } |
1785 | 1874 | } /* usePs */ |
1786 | 1875 | |
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) */ | |
1788 | 1890 | { |
1789 | 1891 | int delayDiff = 0; |
1790 | 1892 | int el, coreEl; |
1797 | 1899 | continue; |
1798 | 1900 | } |
1799 | 1901 | /* 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) ) | |
1801 | 1903 | { |
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 | } | |
1823 | 1904 | error = 1; |
1824 | 1905 | goto bail; |
1825 | 1906 | } |
1826 | 1907 | } |
1827 | 1908 | |
1828 | *sampleRate /= DOWN_SMPL_FAC; | |
1829 | ||
1830 | 1909 | /* Determine Delay balancing and new encoder delay */ |
1831 | 1910 | 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 | } | |
1835 | 1915 | } |
1836 | 1916 | 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); | |
1839 | 1919 | } |
1840 | 1920 | 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 | ||
1845 | 1930 | |
1846 | 1931 | /* Take care about downsampled data bound to the SBR path */ |
1847 | if (!downsample && delayDiff > 0) { | |
1932 | if (!timeDomainDownsample && delayDiff > 0) { | |
1848 | 1933 | /* |
1849 | 1934 | * We must tweak the balancing into a situation where the downsampled path |
1850 | 1935 | * is the one to be delayed, because delaying the QMF domain input, also delays |
1853 | 1938 | while ( delayDiff > 0 ) |
1854 | 1939 | { |
1855 | 1940 | /* 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 | } | |
1859 | 1946 | nBitstrDelay += 1; |
1860 | 1947 | } |
1861 | } else { | |
1948 | } else | |
1949 | { | |
1862 | 1950 | *delay += fixp_abs(delayDiff); |
1863 | 1951 | } |
1864 | 1952 | |
1866 | 1954 | /* Delay AAC data */ |
1867 | 1955 | delayDiff = -delayDiff; |
1868 | 1956 | /* 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); | |
1870 | 1959 | sbrOffset = 0; |
1871 | 1960 | } else { |
1872 | 1961 | /* Delay SBR input */ |
1873 | if ( delayDiff > (int)coreFrameLength*DOWN_SMPL_FAC ) | |
1962 | if ( delayDiff > (int)coreFrameLength * (int)*downSampleFactor ) | |
1874 | 1963 | { |
1875 | 1964 | /* 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; | |
1877 | 1966 | nBitstrDelay = 1; |
1878 | 1967 | } |
1879 | 1968 | /* Multiply input offset by input channels */ |
1880 | 1969 | sbrOffset = delayDiff*(*numChannels); |
1881 | 1970 | downsampledOffset = 0; |
1882 | 1971 | } |
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; | |
1890 | 1979 | |
1891 | 1980 | |
1892 | 1981 | /* Open SBR elements */ |
1893 | 1982 | el = -1; |
1894 | lowestSbrStartFreq = lowestSbrStopFreq = 9999; | |
1983 | highestSbrStartFreq = highestSbrStopFreq = 0; | |
1895 | 1984 | lowestBandwidth = 99999; |
1896 | 1985 | |
1897 | 1986 | /* Loop through each core encoder element and get a matching SBR element config */ |
1914 | 2003 | /* |
1915 | 2004 | * Init sbrConfig structure |
1916 | 2005 | */ |
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 | ||
1920 | 2015 | /* |
1921 | 2016 | * Modify sbrConfig structure according to Element parameters |
1922 | 2017 | */ |
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 | } | |
1934 | 2034 | |
1935 | 2035 | /* 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); | |
1939 | 2038 | |
1940 | 2039 | } /* first element loop */ |
1941 | 2040 | |
1951 | 2050 | int bandwidth = *coreBandwidth; |
1952 | 2051 | |
1953 | 2052 | /* Use lowest common bandwidth */ |
1954 | sbrConfig[el].startFreq = lowestSbrStartFreq; | |
1955 | sbrConfig[el].stopFreq = lowestSbrStopFreq; | |
2053 | sbrConfig[el].startFreq = highestSbrStartFreq; | |
2054 | sbrConfig[el].stopFreq = highestSbrStopFreq; | |
1956 | 2055 | |
1957 | 2056 | /* initialize SBR element, and get core bandwidth */ |
1958 | 2057 | error = FDKsbrEnc_EnvInit(hSbrEncoder->sbrElement[el], |
1959 | 2058 | &sbrConfig[el], |
1960 | 2059 | &bandwidth, |
1961 | *aot, | |
2060 | aot, | |
1962 | 2061 | nBitstrDelay, |
1963 | 2062 | el, |
1964 | statesInitFlag | |
2063 | headerPeriod, | |
2064 | statesInitFlag, | |
2065 | hSbrEncoder->fTimeDomainDownsampling | |
1965 | 2066 | ,hSbrEncoder->dynamicRam |
1966 | 2067 | ); |
1967 | 2068 | |
1968 | 2069 | if (error != 0) { |
2070 | error = 2; | |
1969 | 2071 | goto bail; |
1970 | 2072 | } |
1971 | 2073 | |
1987 | 2089 | |
1988 | 2090 | for (ch=0; ch<hSbrEl->elInfo.nChannelsInEl; ch++) |
1989 | 2091 | { |
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); | |
1991 | 2094 | } |
1992 | 2095 | |
1993 | FDK_ASSERT (hSbrEl->sbrChannel[0]->downSampler.delay <=MAX_DS_FILTER_DELAY && hSbrEl->sbrChannel[0]->downSampler.delay <=MAX_DS_FILTER_DELAY); | |
1994 | 2096 | downsamplerDelay = hSbrEl->sbrChannel[0]->downSampler.delay; |
1995 | 2097 | } /* third element loop */ |
1996 | 2098 | |
1997 | 2099 | /* lfe */ |
1998 | FDKaacEnc_InitDownsampler (&hSbrEncoder->lfeDownSampler, 0, DOWN_SMPL_FAC); | |
2100 | FDKaacEnc_InitDownsampler (&hSbrEncoder->lfeDownSampler, 0, *downSampleFactor); | |
1999 | 2101 | |
2000 | 2102 | /* 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))) { | |
2002 | 2104 | sbrOffset += (downsamplerDelay - downsampledOffset) * (*numChannels) ; |
2003 | 2105 | *delay += downsamplerDelay - downsampledOffset; |
2004 | 2106 | downsampledOffset = 0; |
2005 | 2107 | } else { |
2006 | downsampledOffset -= (downsamplerDelay * (*numChannels))/DOWN_SMPL_FAC; | |
2108 | downsampledOffset -= (downsamplerDelay * (*numChannels))>>(*downSampleFactor-1); | |
2007 | 2109 | sbrOffset = 0; |
2008 | 2110 | } |
2009 | 2111 | |
2010 | 2112 | hSbrEncoder->inputDataDelay = downsamplerDelay; |
2011 | 2113 | } |
2012 | ||
2013 | 2114 | |
2014 | 2115 | /* Assign core encoder Bandwidth */ |
2015 | 2116 | *coreBandwidth = lowestBandwidth; |
2024 | 2125 | FDK_ASSERT(hSbrEncoder->noElements == 1); |
2025 | 2126 | INT psTuningTableIdx = getPsTuningTableIndex(elInfo[0].bitRate, NULL); |
2026 | 2127 | |
2027 | psEncConfig.frameSize = *frameLength; //sbrConfig.sbrFrameSize; | |
2128 | psEncConfig.frameSize = coreFrameLength; //sbrConfig.sbrFrameSize; | |
2028 | 2129 | psEncConfig.qmfFilterMode = 0; |
2029 | 2130 | psEncConfig.sbrPsDelay = 0; |
2030 | 2131 | |
2036 | 2137 | |
2037 | 2138 | /* calculation is not quite linear, increased number of envelopes causes more bits */ |
2038 | 2139 | /* 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)); | |
2040 | 2141 | |
2041 | 2142 | } else { |
2042 | 2143 | error = ERROR(CDI, "Invalid ps tuning table index."); |
2065 | 2166 | errorInfo = handBack(errorInfo); |
2066 | 2167 | } |
2067 | 2168 | } |
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); | |
2068 | 2172 | } |
2069 | 2173 | |
2070 | 2174 | hSbrEncoder->downsampledOffset = downsampledOffset; |
2071 | hSbrEncoder->downmixSize = coreFrameLength*(*numChannels); | |
2175 | { | |
2176 | hSbrEncoder->downmixSize = coreFrameLength*(*numChannels); | |
2177 | } | |
2178 | ||
2072 | 2179 | hSbrEncoder->bufferOffset = sbrOffset; |
2073 | 2180 | /* Delay Compensation: fill bitstream delay buffer with zero input signal */ |
2074 | 2181 | if ( hSbrEncoder->nBitstrDelay > 0 ) |
2079 | 2186 | } |
2080 | 2187 | |
2081 | 2188 | /* Set Output frame length */ |
2082 | *frameLength = coreFrameLength*DOWN_SMPL_FAC; | |
2189 | *frameLength = coreFrameLength * *downSampleFactor; | |
2083 | 2190 | /* Input buffer offset */ |
2084 | 2191 | *inputBufferOffset = fixMax(sbrOffset, downsampledOffset); |
2085 | 2192 | |
2090 | 2197 | |
2091 | 2198 | bail: |
2092 | 2199 | /* Restore input settings */ |
2093 | *sampleRate = inputSampleRate; | |
2200 | *coreSampleRate = inputSampleRate; | |
2094 | 2201 | *frameLength = coreFrameLength; |
2095 | 2202 | *numChannels = inputChannels; |
2096 | 2203 | *coreBandwidth = inputBandWidth; |
2103 | 2210 | sbrEncoder_EncodeFrame( HANDLE_SBR_ENCODER hSbrEncoder, |
2104 | 2211 | INT_PCM *samples, |
2105 | 2212 | UINT timeInStride, |
2106 | UINT sbrDataBits[(6)], | |
2107 | UCHAR sbrData[(6)][MAX_PAYLOAD_SIZE] | |
2213 | UINT sbrDataBits[(8)], | |
2214 | UCHAR sbrData[(8)][MAX_PAYLOAD_SIZE] | |
2108 | 2215 | ) |
2109 | 2216 | { |
2110 | 2217 | INT error; |
2128 | 2235 | } |
2129 | 2236 | } |
2130 | 2237 | |
2131 | if ( (hSbrEncoder->lfeChIdx!=-1) && (hSbrEncoder->fTimeDomainDownsampling) ) | |
2132 | { | |
2238 | if ( ( hSbrEncoder->lfeChIdx!=-1) && (hSbrEncoder->downSampleFactor > 1) ) | |
2239 | { /* lfe downsampler */ | |
2133 | 2240 | INT nOutSamples; |
2134 | 2241 | |
2135 | 2242 | FDKaacEnc_Downsample(&hSbrEncoder->lfeDownSampler, |
2139 | 2246 | samples + hSbrEncoder->downsampledOffset + hSbrEncoder->lfeChIdx, |
2140 | 2247 | &nOutSamples, |
2141 | 2248 | hSbrEncoder->nChannels); |
2142 | } /* lfe downsampler */ | |
2249 | ||
2250 | ||
2251 | } | |
2143 | 2252 | |
2144 | 2253 | return 0; |
2145 | 2254 | } |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
106 | 106 | in module sbr_ram and sbr rom |
107 | 107 | */ |
108 | 108 | 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)) | |
111 | 111 | |
112 | 112 | /*! Filter states for QMF-analysis. <br> |
113 | 113 | Dimension: #MAXNRSBRCHANNELS * #SBR_QMF_FILTER_LENGTH |
114 | 114 | */ |
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) | |
116 | 116 | |
117 | 117 | |
118 | 118 | /*! Matrix holding the quota values for all estimates, all channels |
119 | 119 | Dimension #MAXNRSBRCHANNELS * +#SBR_QMF_CHANNELS* #MAX_NO_OF_ESTIMATES |
120 | 120 | */ |
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) | |
122 | 122 | |
123 | 123 | /*! Matrix holding the sign values for all estimates, all channels |
124 | 124 | Dimension #MAXNRSBRCHANNELS * +#SBR_QMF_CHANNELS* #MAX_NO_OF_ESTIMATES |
125 | 125 | */ |
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)) | |
127 | 127 | |
128 | 128 | /*! Frequency band table (low res) <br> |
129 | 129 | Dimension #MAX_FREQ_COEFFS/2+1 |
130 | 130 | */ |
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)) | |
132 | 132 | |
133 | 133 | /*! Frequency band table (high res) <br> |
134 | 134 | Dimension #MAX_FREQ_COEFFS +1 |
135 | 135 | */ |
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)) | |
137 | 137 | |
138 | 138 | /*! vk matser table <br> |
139 | 139 | Dimension #MAX_FREQ_COEFFS +1 |
140 | 140 | */ |
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)) | |
142 | 142 | |
143 | 143 | |
144 | 144 | /* |
148 | 148 | /*! sbr_detectionVectors <br> |
149 | 149 | Dimension #MAX_NUM_CHANNELS*#MAX_NO_OF_ESTIMATES*#MAX_FREQ_COEFFS] |
150 | 150 | */ |
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)) | |
152 | 152 | |
153 | 153 | /*! sbr_prevCompVec[ <br> |
154 | 154 | Dimension #MAX_NUM_CHANNELS*#MAX_FREQ_COEFFS] |
155 | 155 | */ |
156 | C_ALLOC_MEM2 (Ram_Sbr_prevEnvelopeCompensation, UCHAR, MAX_FREQ_COEFFS, (6)) | |
156 | C_ALLOC_MEM2 (Ram_Sbr_prevEnvelopeCompensation, UCHAR, MAX_FREQ_COEFFS, (8)) | |
157 | 157 | /*! sbr_guideScfb[ <br> |
158 | 158 | Dimension #MAX_NUM_CHANNELS*#MAX_FREQ_COEFFS] |
159 | 159 | */ |
160 | C_ALLOC_MEM2 (Ram_Sbr_guideScfb, UCHAR, MAX_FREQ_COEFFS, (6)) | |
160 | C_ALLOC_MEM2 (Ram_Sbr_guideScfb, UCHAR, MAX_FREQ_COEFFS, (8)) | |
161 | 161 | |
162 | 162 | /*! sbr_guideVectorDetected <br> |
163 | 163 | Dimension #MAX_NUM_CHANNELS*#MAX_NO_OF_ESTIMATES*#MAX_FREQ_COEFFS] |
164 | 164 | */ |
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)) | |
168 | 168 | |
169 | 169 | /* |
170 | 170 | Static Parametric Stereo memory |
190 | 190 | /*! Energy buffer for envelope extraction <br> |
191 | 191 | Dimension #MAXNRSBRCHANNELS * +#SBR_QMF_SLOTS * #SBR_QMF_CHANNELS |
192 | 192 | */ |
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)) | |
194 | 194 | |
195 | 195 | FIXP_DBL* GetRam_Sbr_envYBuffer (int n, UCHAR* dynamic_RAM) { |
196 | 196 | FDK_ASSERT(dynamic_RAM!=0); |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
505 | 505 | /* |
506 | 506 | tuningTable |
507 | 507 | */ |
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 ***/ | |
512 | 516 | /* sf,sfsp,sf,sfsp,nnb,nfo,saml,SM,FS*/ |
513 | 517 | |
514 | 518 | /*** mono ***/ |
515 | 519 | |
516 | 520 | /* 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 */ | |
523 | 527 | |
524 | 528 | /* 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 */ | |
533 | 537 | |
534 | 538 | /* 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 */ | |
543 | 547 | |
544 | 548 | /* 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 */ | |
554 | 558 | |
555 | 559 | /* 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 */ | |
564 | 568 | |
565 | 569 | /* 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 */ | |
574 | 578 | |
575 | 579 | /* 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 */ | |
581 | 585 | |
582 | 586 | /* 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 */ | |
588 | 592 | |
589 | 593 | /* 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 */ | |
595 | 599 | |
596 | 600 | /*** stereo ***/ |
597 | 601 | /* 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 */ | |
606 | 610 | |
607 | 611 | /* 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 */ | |
616 | 620 | |
617 | 621 | /* 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 */ | |
626 | 630 | |
627 | 631 | /* 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 */ | |
636 | 640 | |
637 | 641 | /* 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 */ | |
647 | 651 | |
648 | 652 | /* 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 */ | |
657 | 661 | |
658 | 662 | /* 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 */ | |
664 | 668 | |
665 | 669 | /* 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 */ | |
671 | 675 | |
672 | 676 | /* 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 | ||
678 | 683 | |
679 | 684 | /** AAC LOW DELAY SECTION **/ |
680 | 685 | |
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 | ||
681 | 695 | /* 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 */ | |
688 | 702 | |
689 | 703 | /* 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 */ | |
696 | 737 | |
697 | 738 | /* 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 */ | |
705 | 746 | |
706 | 747 | /* 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]); | |
717 | 778 | |
718 | 779 | const psTuningTable_t psTuningTable[4] = |
719 | 780 | { |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
117 | 117 | extern const INT bookSbrNoiseBalanceC11T[25]; |
118 | 118 | extern const UCHAR bookSbrNoiseBalanceL11T[25]; |
119 | 119 | |
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; | |
127 | 122 | |
128 | 123 | extern const psTuningTable_t psTuningTable[4]; |
129 | 124 |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
83 | 83 | /*! |
84 | 84 | \file |
85 | 85 | \brief frequency scale |
86 | \author Tobias Chalupka | |
86 | 87 | */ |
87 | 88 | |
88 | 89 | #include "sbrenc_freq_sca.h" |
91 | 92 | #include "genericStds.h" |
92 | 93 | |
93 | 94 | /* StartFreq */ |
94 | static INT getStartFreq(INT fs, const INT start_freq); | |
95 | static INT getStartFreq(INT fsCore, const INT start_freq); | |
95 | 96 | |
96 | 97 | /* StopFreq */ |
97 | static INT getStopFreq(INT fs, const INT stop_freq, const INT noChannels); | |
98 | static INT getStopFreq(INT fsCore, const INT stop_freq); | |
98 | 99 | |
99 | 100 | static INT numberOfBands(INT b_p_o, INT start, INT stop, FIXP_DBL warp_factor); |
100 | 101 | static void CalcBands(INT * diff, INT start , INT stop , INT num_bands); |
114 | 115 | *******************************************************************************/ |
115 | 116 | |
116 | 117 | INT |
117 | FDKsbrEnc_getSbrStartFreqRAW (INT startFreq, INT QMFbands, INT fs) | |
118 | FDKsbrEnc_getSbrStartFreqRAW (INT startFreq, INT fsCore) | |
118 | 119 | { |
119 | 120 | INT result; |
120 | 121 | |
122 | 123 | return -1; |
123 | 124 | } |
124 | 125 | /* 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; */ | |
128 | 129 | |
129 | 130 | return (result); |
130 | 131 | |
140 | 141 | |
141 | 142 | Return: |
142 | 143 | *******************************************************************************/ |
143 | INT FDKsbrEnc_getSbrStopFreqRAW (INT stopFreq, INT QMFbands, INT fs) | |
144 | INT FDKsbrEnc_getSbrStopFreqRAW (INT stopFreq, INT fsCore) | |
144 | 145 | { |
145 | 146 | INT result; |
146 | 147 | |
147 | 148 | if ( stopFreq < 0 || stopFreq > 13) |
148 | 149 | return -1; |
149 | 150 | |
150 | ||
151 | 151 | /* 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; */ | |
154 | 154 | |
155 | 155 | return (result); |
156 | 156 | } /* End getSbrStopFreq */ |
161 | 161 | ******************************************************************************* |
162 | 162 | Description: |
163 | 163 | |
164 | Arguments: | |
164 | Arguments: fsCore - core sampling rate | |
165 | ||
165 | 166 | |
166 | 167 | Return: |
167 | 168 | *******************************************************************************/ |
168 | 169 | static INT |
169 | getStartFreq(INT fs, const INT start_freq) | |
170 | getStartFreq(INT fsCore, const INT start_freq) | |
170 | 171 | { |
171 | 172 | INT k0_min; |
172 | 173 | |
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 */ | |
191 | 194 | break; |
192 | 195 | default: |
193 | 196 | k0_min=11; /* illegal fs */ |
194 | 197 | } |
195 | 198 | |
196 | 199 | |
197 | switch (fs) { | |
198 | ||
199 | case 16000: | |
200 | switch (fsCore) { | |
201 | ||
202 | case 8000: | |
200 | 203 | { |
201 | 204 | INT v_offset[]= {-8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7}; |
202 | 205 | return (k0_min + v_offset[start_freq]); |
203 | 206 | } |
204 | case 22050: | |
207 | case 11025: | |
205 | 208 | { |
206 | 209 | INT v_offset[]= {-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13}; |
207 | 210 | return (k0_min + v_offset[start_freq]); |
208 | 211 | } |
209 | case 24000: | |
212 | case 12000: | |
210 | 213 | { |
211 | 214 | INT v_offset[]= {-5, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16}; |
212 | 215 | return (k0_min + v_offset[start_freq]); |
213 | 216 | } |
214 | case 32000: | |
217 | case 16000: | |
215 | 218 | { |
216 | 219 | INT v_offset[]= {-6, -4, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16}; |
217 | 220 | return (k0_min + v_offset[start_freq]); |
218 | 221 | } |
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 | } | |
219 | 229 | case 44100: |
220 | 230 | 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: | |
227 | 231 | case 96000: |
228 | 232 | { |
229 | 233 | INT v_offset[]= {-2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16, 20, 24}; |
248 | 252 | Return: |
249 | 253 | *******************************************************************************/ |
250 | 254 | static INT |
251 | getStopFreq(INT fs, const INT stop_freq, const INT noChannels) | |
255 | getStopFreq(INT fsCore, const INT stop_freq) | |
252 | 256 | { |
253 | 257 | INT result,i; |
254 | 258 | INT k1_min; |
255 | 259 | INT v_dstop[13]; |
256 | ||
257 | 260 | |
258 | 261 | INT *v_stop_freq = NULL; |
259 | 262 | INT v_stop_freq_16[14] = {48,49,50,51,52,54,55,56,57,59,60,61,63,64}; |
265 | 268 | INT v_stop_freq_64[14] = {20,22,24,26,29,31,34,37,41,45,49,54,59,64}; |
266 | 269 | INT v_stop_freq_88[14] = {15,17,19,21,23,26,29,33,37,41,46,51,57,64}; |
267 | 270 | 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; | |
271 | 275 | v_stop_freq =v_stop_freq_16; |
272 | 276 | break; |
273 | case 22050: k1_min = 35; | |
277 | case 11025: k1_min = 35; | |
274 | 278 | v_stop_freq =v_stop_freq_22; |
275 | 279 | break; |
276 | case 24000: k1_min = 32; | |
280 | case 12000: k1_min = 32; | |
277 | 281 | v_stop_freq =v_stop_freq_24; |
278 | 282 | break; |
279 | case 32000: k1_min = 32; | |
283 | case 16000: k1_min = 32; | |
280 | 284 | v_stop_freq =v_stop_freq_32; |
281 | 285 | break; |
282 | case 44100: k1_min = 23; | |
286 | case 22050: k1_min = 23; | |
283 | 287 | v_stop_freq =v_stop_freq_44; |
284 | 288 | break; |
285 | case 48000: k1_min = 21; | |
289 | case 24000: k1_min = 21; | |
286 | 290 | v_stop_freq =v_stop_freq_48; |
287 | 291 | break; |
288 | case 64000: k1_min = 20; | |
292 | case 32000: k1_min = 20; | |
289 | 293 | v_stop_freq =v_stop_freq_64; |
290 | 294 | break; |
291 | case 88200: k1_min = 15; | |
295 | case 44100: k1_min = 15; | |
292 | 296 | v_stop_freq =v_stop_freq_88; |
293 | 297 | break; |
294 | case 96000: k1_min = 13; | |
298 | case 48000: k1_min = 13; | |
295 | 299 | v_stop_freq =v_stop_freq_96; |
300 | break; | |
301 | case 96000: k1_min = 7; | |
302 | v_stop_freq =v_stop_freq_192; | |
296 | 303 | break; |
297 | 304 | default: |
298 | 305 | k1_min = 21; /* illegal fs */ |
299 | 306 | } |
300 | 307 | |
301 | ||
308 | /* if no valid core samplingrate is used this loop produces | |
309 | a segfault, because v_stop_freq is not initialized */ | |
302 | 310 | /* Ensure increasing bandwidth */ |
303 | 311 | for(i = 0; i <= 12; i++) { |
304 | 312 | v_dstop[i] = v_stop_freq[i+1] - v_stop_freq[i]; |
321 | 329 | ******************************************************************************* |
322 | 330 | Description: |
323 | 331 | |
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) | |
327 | 342 | *******************************************************************************/ |
328 | 343 | 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 | ) | |
336 | 353 | { |
337 | 354 | |
338 | 355 | /* Update startFreq struct */ |
339 | *k0 = getStartFreq(samplingFreq, startFreq); | |
356 | *k0 = getStartFreq(srCore, startFreq); | |
340 | 357 | |
341 | 358 | /* 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 ) { | |
345 | 360 | return (1); /* raise the cross-over frequency and/or lower the number |
346 | 361 | of target bands per octave (or lower the sampling frequency) */ |
347 | 362 | } |
348 | 363 | |
349 | 364 | /*Update stopFreq struct */ |
350 | 365 | if ( stopFreq < 14 ) { |
351 | *k2 = getStopFreq(samplingFreq, stopFreq, noChannels); | |
366 | *k2 = getStopFreq(srCore, stopFreq); | |
352 | 367 | } else if( stopFreq == 14 ) { |
353 | 368 | *k2 = 2 * *k0; |
354 | 369 | } else { |
363 | 378 | |
364 | 379 | |
365 | 380 | /* 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 ) ) | |
367 | 382 | return (1); /* Number of bands exceeds valid range of MAX_FREQ_COEFFS for fs=44.1kHz */ |
368 | 383 | |
369 | if ( (samplingFreq >= 48000) && ( (*k2 - *k0) > MAX_FREQ_COEFFS_FS48000 ) ) | |
384 | if ( (srCore >= 24000) && ( (*k2 - *k0) > MAX_FREQ_COEFFS_FS48000 ) ) | |
370 | 385 | return (1); /* Number of bands exceeds valid range of MAX_FREQ_COEFFS for fs>=48kHz */ |
371 | 386 | |
372 | 387 | if ((*k2 - *k0) > MAX_FREQ_COEFFS) |
389 | 404 | Return: |
390 | 405 | *******************************************************************************/ |
391 | 406 | 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 | ) | |
396 | 415 | |
397 | 416 | { |
398 | 417 | |
399 | 418 | INT b_p_o = 0; /* bands_per_octave */ |
400 | FIXP_DBL warp = FL2FXCONST_DBL(0.0f); | |
419 | FIXP_DBL warp = FL2FXCONST_DBL(0.0f); | |
401 | 420 | INT dk = 0; |
402 | 421 | |
403 | 422 | /* Internal variables */ |
425 | 444 | warp = FL2FXCONST_DBL(1.0f/2.6f); /* 1.0/(1.3*2.0); */ |
426 | 445 | |
427 | 446 | |
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)*/ | |
429 | 448 | { |
430 | 449 | k1=2*k0; |
431 | 450 | |
591 | 610 | ******************************************************************************* |
592 | 611 | Description: |
593 | 612 | |
613 | ||
594 | 614 | Arguments: |
595 | 615 | |
596 | 616 | Return: |
597 | 617 | *******************************************************************************/ |
598 | 618 | 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 | ) | |
602 | 626 | { |
603 | 627 | INT i; |
604 | INT divider; | |
605 | 628 | INT max1,max2; |
606 | 629 | |
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 */ | |
611 | 631 | ( *xover_band > num_master ) ) { |
612 | 632 | /* xover_band error, too big for this startFreq. Will be clipped */ |
613 | 633 | |
614 | 634 | /* Calculate maximum value for xover_band */ |
615 | 635 | max1=0; |
616 | 636 | max2=num_master; |
617 | while( (v_k_master[max1+1] < (noQMFChannels/divider)) && | |
637 | while( (v_k_master[max1+1] < 32 ) && /* noQMFChannels(dualRate)/divider */ | |
618 | 638 | ( (max1+1) < max2) ) |
619 | 639 | { |
620 | 640 | max1++; |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
95 | 95 | |
96 | 96 | |
97 | 97 | 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 | ); | |
102 | 106 | |
103 | 107 | 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 | ); | |
111 | 115 | |
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 | ); | |
116 | 122 | |
117 | 123 | 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 | ); | |
125 | 133 | |
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); | |
128 | 136 | #endif |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
301 | 301 | timeIndex++; |
302 | 302 | } |
303 | 303 | } |
304 | ||
305 | FDK_ASSERT(noEstPerFrame == 2); | |
306 | 304 | |
307 | 305 | |
308 | 306 | C_ALLOC_SCRATCH_END(realBuf, FIXP_DBL, 2*BAND_V_SIZE*NUM_V_COMBINE); |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
142 | 142 | TT_RSVD50 = 50 /**< */ |
143 | 143 | |
144 | 144 | } 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) ) | |
145 | 151 | |
146 | 152 | /** |
147 | 153 | * Audio Object Type definitions. |
227 | 233 | |
228 | 234 | /** Channel Mode ( 1-7 equals MPEG channel configurations, others are arbitrary). */ |
229 | 235 | 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 */ | |
252 | 262 | |
253 | 263 | } CHANNEL_MODE; |
254 | 264 | |
264 | 274 | ACT_BACK_TOP, |
265 | 275 | ACT_TOP /* Ts */ |
266 | 276 | } 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; | |
267 | 286 | |
268 | 287 | /** |
269 | 288 | * Audio Codec flags. |
327 | 346 | |
328 | 347 | UCHAR stereoConfigIndex; /**< USAC MPS stereo mode */ |
329 | 348 | 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; | |
330 | 353 | } CODER_CONFIG; |
331 | 354 | |
332 | 355 | /** MP4 Element IDs. */ |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
110 | 110 | extern "C" { |
111 | 111 | #endif |
112 | 112 | |
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 | ||
113 | 133 | /*! |
114 | 134 | * RIFF WAVE file struct. |
115 | 135 | * For details see WAVE file format documentation (for example at http://www.wotsit.org). |
116 | 136 | */ |
117 | 137 | typedef struct WAV_HEADER |
118 | 138 | { |
119 | char riffType[4]; | |
139 | char riffType[4]; | |
120 | 140 | UINT riffSize; |
121 | char waveType[4]; | |
122 | char formatType[4]; | |
141 | char waveType[4]; | |
142 | char formatType[4]; | |
123 | 143 | UINT formatSize; |
124 | 144 | USHORT compressionCode; |
125 | 145 | USHORT numChannels; |
127 | 147 | UINT bytesPerSecond; |
128 | 148 | USHORT blockAlign; |
129 | 149 | USHORT bitsPerSample; |
130 | char dataType[4]; | |
150 | char dataType[4]; | |
131 | 151 | UINT dataSize; |
132 | 152 | } WAV_HEADER; |
133 | 153 | |
135 | 155 | { |
136 | 156 | WAV_HEADER header; |
137 | 157 | FDKFILE *fp; |
158 | UINT channelMask; | |
138 | 159 | }; |
139 | 160 | |
140 | 161 | typedef struct WAV *HANDLE_WAV; |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
464 | 464 | |
465 | 465 | for ( i = 0; i < _tcslen(arg); ++i ) |
466 | 466 | { |
467 | if ( (type == 'd') && !_istdigit(arg[i]) && arg[i] != 'x' ) | |
467 | if ( (type == 'd') && !_istdigit(arg[i]) && arg[i] != 'x' && arg[i] != '-') | |
468 | 468 | { |
469 | 469 | #ifdef _UNICODE |
470 | 470 | _ftprintf(stderr, _TEXT("\n\nError: Argument '%ls' for switch '%ls' is not a valid number.\n" ), arg, cur_str); |
548 | 548 | /* Skip consecutive blanks. */ |
549 | 549 | while (*line_ptr == ' ' && line_ptr < line+CMDL_MAX_STRLEN) |
550 | 550 | line_ptr++; |
551 | /* Assign argument. TODO: maybe handle quotes */ | |
551 | /* Assign argument. */ | |
552 | 552 | argv_ptr[argc] = line_ptr; |
553 | 553 | /* Get pointer to next blank. */ |
554 | 554 | line_ptr = (char*)FDKstrchr(line_ptr, ' '); |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
97 | 97 | |
98 | 98 | /* library info */ |
99 | 99 | #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 | |
102 | 102 | #define SYS_LIB_TITLE "System Integration Library" |
103 | 103 | #define SYS_LIB_BUILD_DATE __DATE__ |
104 | 104 | #define SYS_LIB_BUILD_TIME __TIME__ |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
1 | 1 | /* ----------------------------------------------------------------------------------------------------------- |
2 | 2 | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | 3 | |
4 | © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
4 | © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. | |
5 | 5 | All rights reserved. |
6 | 6 | |
7 | 7 | 1. INTRODUCTION |
173 | 173 | 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 |
174 | 174 | }; |
175 | 175 | USHORT extraFormatBytes, validBitsPerSample; |
176 | UINT channelMask; | |
177 | 176 | UCHAR guid[16]; |
178 | 177 | INT i; |
179 | 178 | |
183 | 182 | |
184 | 183 | if (extraFormatBytes >= 22) { |
185 | 184 | FDKfread_EL(&(validBitsPerSample), 2, 1, wav->fp); |
186 | FDKfread_EL(&(channelMask), 4, 1, wav->fp); | |
185 | FDKfread_EL(&(wav->channelMask), 4, 1, wav->fp); | |
187 | 186 | FDKfread_EL(&(guid), 16, 1, wav->fp); |
188 | 187 | |
189 | 188 | /* check for PCM GUID */ |
227 | 226 | |
228 | 227 | /* Error path */ |
229 | 228 | error: |
230 | if (wav->fp) { | |
231 | FDKfclose(wav->fp); | |
232 | wav->fp = NULL; | |
233 | } | |
234 | 229 | |
235 | 230 | if (wav) { |
231 | if (wav->fp) { | |
232 | FDKfclose(wav->fp); | |
233 | wav->fp = NULL; | |
234 | } | |
236 | 235 | FDKfree(wav); |
237 | 236 | } |
238 | 237 | |
387 | 386 | HANDLE_WAV wav = (HANDLE_WAV)FDKcalloc(1, sizeof(struct WAV)); |
388 | 387 | UINT size = 0; |
389 | 388 | |
389 | if (wav == NULL) { | |
390 | FDKprintfErr("WAV_OutputOpen(): Unable to allocate WAV struct.\n"); | |
391 | goto bail; | |
392 | } | |
393 | ||
390 | 394 | if (bitsPerSample != 16 && bitsPerSample != 24 && bitsPerSample != 32) |
391 | 395 | { |
392 | 396 | FDKprintfErr("WAV_OutputOpen(): Invalid argument (bitsPerSample).\n"); |
432 | 436 | return 0; |
433 | 437 | |
434 | 438 | bail: |
435 | if (wav->fp) | |
436 | FDKfclose(wav->fp); | |
437 | if (wav) | |
439 | if (wav) { | |
440 | if (wav->fp) { | |
441 | FDKfclose(wav->fp); | |
442 | } | |
438 | 443 | FDKfree(wav); |
444 | } | |
439 | 445 | |
440 | 446 | pWav = NULL; |
441 | 447 |