/src/aac/libAACdec/src/channelinfo.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* ----------------------------------------------------------------------------- |
2 | | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | | |
4 | | © Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten |
5 | | Forschung e.V. All rights reserved. |
6 | | |
7 | | 1. INTRODUCTION |
8 | | The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software |
9 | | that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding |
10 | | scheme for digital audio. This FDK AAC Codec software is intended to be used on |
11 | | a wide variety of Android devices. |
12 | | |
13 | | AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient |
14 | | general perceptual audio codecs. AAC-ELD is considered the best-performing |
15 | | full-bandwidth communications codec by independent studies and is widely |
16 | | deployed. AAC has been standardized by ISO and IEC as part of the MPEG |
17 | | specifications. |
18 | | |
19 | | Patent licenses for necessary patent claims for the FDK AAC Codec (including |
20 | | those of Fraunhofer) may be obtained through Via Licensing |
21 | | (www.vialicensing.com) or through the respective patent owners individually for |
22 | | the purpose of encoding or decoding bit streams in products that are compliant |
23 | | with the ISO/IEC MPEG audio standards. Please note that most manufacturers of |
24 | | Android devices already license these patent claims through Via Licensing or |
25 | | directly from the patent owners, and therefore FDK AAC Codec software may |
26 | | already be covered under those patent licenses when it is used for those |
27 | | licensed purposes only. |
28 | | |
29 | | Commercially-licensed AAC software libraries, including floating-point versions |
30 | | with enhanced sound quality, are also available from Fraunhofer. Users are |
31 | | encouraged to check the Fraunhofer website for additional applications |
32 | | information and documentation. |
33 | | |
34 | | 2. COPYRIGHT LICENSE |
35 | | |
36 | | Redistribution and use in source and binary forms, with or without modification, |
37 | | are permitted without payment of copyright license fees provided that you |
38 | | satisfy the following conditions: |
39 | | |
40 | | You must retain the complete text of this software license in redistributions of |
41 | | the FDK AAC Codec or your modifications thereto in source code form. |
42 | | |
43 | | You must retain the complete text of this software license in the documentation |
44 | | and/or other materials provided with redistributions of the FDK AAC Codec or |
45 | | your modifications thereto in binary form. You must make available free of |
46 | | charge copies of the complete source code of the FDK AAC Codec and your |
47 | | modifications thereto to recipients of copies in binary form. |
48 | | |
49 | | The name of Fraunhofer may not be used to endorse or promote products derived |
50 | | from this library without prior written permission. |
51 | | |
52 | | You may not charge copyright license fees for anyone to use, copy or distribute |
53 | | the FDK AAC Codec software or your modifications thereto. |
54 | | |
55 | | Your modified versions of the FDK AAC Codec must carry prominent notices stating |
56 | | that you changed the software and the date of any change. For modified versions |
57 | | of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" |
58 | | must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK |
59 | | AAC Codec Library for Android." |
60 | | |
61 | | 3. NO PATENT LICENSE |
62 | | |
63 | | NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without |
64 | | limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. |
65 | | Fraunhofer provides no warranty of patent non-infringement with respect to this |
66 | | software. |
67 | | |
68 | | You may use this FDK AAC Codec software or modifications thereto only for |
69 | | purposes that are authorized by appropriate patent licenses. |
70 | | |
71 | | 4. DISCLAIMER |
72 | | |
73 | | This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright |
74 | | holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, |
75 | | including but not limited to the implied warranties of merchantability and |
76 | | fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR |
77 | | CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, |
78 | | or consequential damages, including but not limited to procurement of substitute |
79 | | goods or services; loss of use, data, or profits, or business interruption, |
80 | | however caused and on any theory of liability, whether in contract, strict |
81 | | liability, or tort (including negligence), arising in any way out of the use of |
82 | | this software, even if advised of the possibility of such damage. |
83 | | |
84 | | 5. CONTACT INFORMATION |
85 | | |
86 | | Fraunhofer Institute for Integrated Circuits IIS |
87 | | Attention: Audio and Multimedia Departments - FDK AAC LL |
88 | | Am Wolfsmantel 33 |
89 | | 91058 Erlangen, Germany |
90 | | |
91 | | www.iis.fraunhofer.de/amm |
92 | | amm-info@iis.fraunhofer.de |
93 | | ----------------------------------------------------------------------------- */ |
94 | | |
95 | | /**************************** AAC decoder library ****************************** |
96 | | |
97 | | Author(s): Josef Hoepfl |
98 | | |
99 | | Description: individual channel stream info |
100 | | |
101 | | *******************************************************************************/ |
102 | | |
103 | | #ifndef CHANNELINFO_H |
104 | | #define CHANNELINFO_H |
105 | | |
106 | | #include "common_fix.h" |
107 | | |
108 | | #include "aac_rom.h" |
109 | | #include "aacdecoder_lib.h" |
110 | | #include "FDK_bitstream.h" |
111 | | #include "overlapadd.h" |
112 | | |
113 | | #include "mdct.h" |
114 | | #include "stereo.h" |
115 | | #include "pulsedata.h" |
116 | | #include "aacdec_tns.h" |
117 | | |
118 | | #include "aacdec_pns.h" |
119 | | |
120 | | #include "aacdec_hcr_types.h" |
121 | | #include "rvlc_info.h" |
122 | | |
123 | | #include "usacdec_acelp.h" |
124 | | #include "usacdec_const.h" |
125 | | #include "usacdec_rom.h" |
126 | | |
127 | | #include "ac_arith_coder.h" |
128 | | |
129 | | #include "conceal_types.h" |
130 | | |
131 | | #include "aacdec_drc_types.h" |
132 | | |
133 | | #define WB_SECTION_SIZE (1024 * 2) |
134 | | |
135 | | #define DRM_BS_BUFFER_SIZE \ |
136 | 0 | (512) /* size of the dynamic buffer which is used to reverse the bits of \ |
137 | | the DRM SBR payload */ |
138 | | |
139 | | /* Output rendering mode */ |
140 | | typedef enum { |
141 | | AACDEC_RENDER_INVALID = 0, |
142 | | AACDEC_RENDER_IMDCT, |
143 | | AACDEC_RENDER_ELDFB, |
144 | | AACDEC_RENDER_LPD, |
145 | | AACDEC_RENDER_INTIMDCT |
146 | | } AACDEC_RENDER_MODE; |
147 | | |
148 | | enum { MAX_QUANTIZED_VALUE = 8191 }; |
149 | | |
150 | | typedef enum { FD_LONG, FD_SHORT, LPD } USAC_COREMODE; |
151 | | |
152 | | typedef struct { |
153 | | const SHORT *ScaleFactorBands_Long; |
154 | | const SHORT *ScaleFactorBands_Short; |
155 | | UCHAR NumberOfScaleFactorBands_Long; |
156 | | UCHAR NumberOfScaleFactorBands_Short; |
157 | | UINT samplingRateIndex; |
158 | | UINT samplingRate; |
159 | | } SamplingRateInfo; |
160 | | |
161 | | typedef struct { |
162 | | UCHAR CommonWindow; |
163 | | UCHAR GlobalGain; |
164 | | |
165 | | } CRawDataInfo; |
166 | | |
167 | | typedef struct { |
168 | | UCHAR WindowGroupLength[8]; |
169 | | UCHAR WindowGroups; |
170 | | UCHAR Valid; |
171 | | |
172 | | UCHAR WindowShape; /* 0: sine window, 1: KBD, 2: low overlap */ |
173 | | BLOCK_TYPE WindowSequence; /* mdct.h; 0: long, 1: start, 2: short, 3: stop */ |
174 | | UCHAR MaxSfBands; |
175 | | UCHAR max_sfb_ste; |
176 | | UCHAR ScaleFactorGrouping; |
177 | | |
178 | | UCHAR TotalSfBands; |
179 | | |
180 | | } CIcsInfo; |
181 | | |
182 | | enum { |
183 | | ZERO_HCB = 0, |
184 | | ESCBOOK = 11, |
185 | | NSPECBOOKS = ESCBOOK + 1, |
186 | | BOOKSCL = NSPECBOOKS, |
187 | | NOISE_HCB = 13, |
188 | | INTENSITY_HCB2 = 14, |
189 | | INTENSITY_HCB = 15, |
190 | | LAST_HCB |
191 | | }; |
192 | | |
193 | | /* This struct holds the persistent data shared by both channels of a CPE. |
194 | | It needs to be allocated for each CPE. */ |
195 | | typedef struct { |
196 | | CJointStereoPersistentData jointStereoPersistentData; |
197 | | } CpePersistentData; |
198 | | |
199 | | /* |
200 | | * This struct must be allocated one for every channel and must be persistent. |
201 | | */ |
202 | | typedef struct { |
203 | | FIXP_DBL *pOverlapBuffer; |
204 | | mdct_t IMdct; |
205 | | |
206 | | CArcoData *hArCo; |
207 | | |
208 | | INT pnsCurrentSeed; |
209 | | |
210 | | /* LPD memory */ |
211 | | FIXP_DBL old_synth[PIT_MAX_MAX - L_SUBFR]; |
212 | | INT old_T_pf[SYN_SFD]; |
213 | | FIXP_DBL old_gain_pf[SYN_SFD]; |
214 | | FIXP_DBL mem_bpf[L_FILT + L_SUBFR]; |
215 | | UCHAR |
216 | | old_bpf_control_info; /* (1: enable, 0: disable) bpf for past superframe |
217 | | */ |
218 | | |
219 | | USAC_COREMODE last_core_mode; /* core mode used by the decoder in previous |
220 | | frame. (not signalled by the bitstream, see |
221 | | CAacDecoderChannelInfo::core_mode_last !! ) |
222 | | */ |
223 | | UCHAR last_lpd_mode; /* LPD mode used by the decoder in last LPD subframe |
224 | | (not signalled by the bitstream, see |
225 | | CAacDecoderChannelInfo::lpd_mode_last !! ) */ |
226 | | UCHAR last_last_lpd_mode; /* LPD mode used in second last LPD subframe |
227 | | (not signalled by the bitstream) */ |
228 | | UCHAR last_lpc_lost; /* Flag indicating that the previous LPC is lost */ |
229 | | |
230 | | FIXP_LPC |
231 | | lpc4_lsf[M_LP_FILTER_ORDER]; /* Last LPC4 coefficients in LSF domain. */ |
232 | | FIXP_LPC lsf_adaptive_mean[M_LP_FILTER_ORDER]; /* Adaptive mean of LPC |
233 | | coefficients in LSF domain |
234 | | for concealment. */ |
235 | | FIXP_LPC lp_coeff_old[2][M_LP_FILTER_ORDER]; /* Last LPC coefficients in LP |
236 | | domain. lp_coeff_old[0] is lpc4 (coeffs for |
237 | | right folding point of last tcx frame), |
238 | | lp_coeff_old[1] are coeffs for left folding |
239 | | point of last tcx frame */ |
240 | | INT lp_coeff_old_exp[2]; |
241 | | |
242 | | FIXP_SGL |
243 | | oldStability; /* LPC coeff stability value from last frame (required for |
244 | | TCX concealment). */ |
245 | | UINT numLostLpdFrames; /* Number of consecutive lost subframes. */ |
246 | | |
247 | | /* TCX memory */ |
248 | | FIXP_DBL last_tcx_gain; |
249 | | INT last_tcx_gain_e; |
250 | | FIXP_DBL last_alfd_gains[32]; /* Scaled by one bit. */ |
251 | | SHORT last_tcx_pitch; |
252 | | UCHAR last_tcx_noise_factor; |
253 | | |
254 | | /* ACELP memory */ |
255 | | CAcelpStaticMem acelp; |
256 | | |
257 | | ULONG nfRandomSeed; /* seed value for USAC noise filling random generator */ |
258 | | |
259 | | CDrcChannelData drcData; |
260 | | CConcealmentInfo concealmentInfo; |
261 | | |
262 | | CpePersistentData *pCpeStaticData; |
263 | | |
264 | | } CAacDecoderStaticChannelInfo; |
265 | | |
266 | | /* |
267 | | * This union must be allocated for every element (up to 2 channels). |
268 | | */ |
269 | | typedef struct { |
270 | | /* Common bit stream data */ |
271 | | SHORT aScaleFactor[( |
272 | | 8 * 16)]; /* Spectral scale factors for each sfb in each window. */ |
273 | | SHORT aSfbScale[(8 * 16)]; /* could be free after ApplyTools() */ |
274 | | UCHAR |
275 | | aCodeBook[(8 * 16)]; /* section data: codebook for each window and sfb. */ |
276 | | UCHAR band_is_noise[(8 * 16)]; |
277 | | CTnsData TnsData; |
278 | | CRawDataInfo RawDataInfo; |
279 | | |
280 | | shouldBeUnion { |
281 | | struct { |
282 | | CPulseData PulseData; |
283 | | SHORT aNumLineInSec4Hcr[MAX_SFB_HCR]; /* needed once for all channels |
284 | | except for Drm syntax */ |
285 | | UCHAR |
286 | | aCodeBooks4Hcr[MAX_SFB_HCR]; /* needed once for all channels except for |
287 | | Drm syntax. Same as "aCodeBook" ? */ |
288 | | SHORT lenOfReorderedSpectralData; |
289 | | SCHAR lenOfLongestCodeword; |
290 | | SCHAR numberSection; |
291 | | SCHAR rvlcCurrentScaleFactorOK; |
292 | | SCHAR rvlcIntensityUsed; |
293 | | } aac; |
294 | | struct { |
295 | | UCHAR fd_noise_level_and_offset; |
296 | | UCHAR tns_active; |
297 | | UCHAR tns_on_lr; |
298 | | UCHAR tcx_noise_factor[4]; |
299 | | UCHAR tcx_global_gain[4]; |
300 | | } usac; |
301 | | } |
302 | | specificTo; |
303 | | |
304 | | } CAacDecoderDynamicData; |
305 | | |
306 | | typedef shouldBeUnion { |
307 | | UCHAR DrmBsBuffer[DRM_BS_BUFFER_SIZE]; |
308 | | |
309 | | /* Common signal data, can be used once the bit stream data from above is not |
310 | | * used anymore. */ |
311 | | FIXP_DBL mdctOutTemp[1024]; |
312 | | |
313 | | FIXP_DBL synth_buf[(PIT_MAX_MAX + SYN_DELAY + L_FRAME_PLUS)]; |
314 | | |
315 | | FIXP_DBL workBuffer[WB_SECTION_SIZE]; |
316 | | } |
317 | | CWorkBufferCore1; |
318 | | |
319 | | /* Common data referenced by all channels */ |
320 | | typedef struct { |
321 | | CAacDecoderDynamicData pAacDecoderDynamicData[2]; |
322 | | |
323 | | CPnsInterChannelData pnsInterChannelData; |
324 | | INT pnsRandomSeed[(8 * 16)]; |
325 | | |
326 | | CJointStereoData jointStereoData; /* One for one element */ |
327 | | |
328 | | shouldBeUnion { |
329 | | struct { |
330 | | CErHcrInfo erHcrInfo; |
331 | | CErRvlcInfo erRvlcInfo; |
332 | | SHORT aRvlcScfEsc[RVLC_MAX_SFB]; /* needed once for all channels */ |
333 | | SHORT aRvlcScfFwd[RVLC_MAX_SFB]; /* needed once for all channels */ |
334 | | SHORT aRvlcScfBwd[RVLC_MAX_SFB]; /* needed once for all channels */ |
335 | | } aac; |
336 | | } |
337 | | overlay; |
338 | | |
339 | | } CAacDecoderCommonData; |
340 | | |
341 | | typedef struct { |
342 | | CWorkBufferCore1 *pWorkBufferCore1; |
343 | | CCplxPredictionData *cplxPredictionData; |
344 | | } CAacDecoderCommonStaticData; |
345 | | |
346 | | /* |
347 | | * This struct must be allocated one for every channel of every element and must |
348 | | * be persistent. Among its members, the following memory areas can be |
349 | | * overwritten under the given conditions: |
350 | | * - pSpectralCoefficient The memory pointed to can be overwritten after time |
351 | | * signal rendering. |
352 | | * - data can be overwritten after time signal rendering. |
353 | | * - pDynData memory pointed to can be overwritten after each |
354 | | * CChannelElement_Decode() call. |
355 | | * - pComData->overlay memory pointed to can be overwritten after each |
356 | | * CChannelElement_Decode() call.. |
357 | | */ |
358 | | typedef struct { |
359 | | shouldBeUnion { |
360 | | struct { |
361 | | FIXP_DBL fac_data0[LFAC]; |
362 | | SCHAR fac_data_e[4]; |
363 | | FIXP_DBL |
364 | | *fac_data[4]; /* Pointers to unused parts of pSpectralCoefficient */ |
365 | | |
366 | | UCHAR core_mode; /* current core mode */ |
367 | | USAC_COREMODE |
368 | | core_mode_last; /* previous core mode, signalled in the bitstream |
369 | | (not done by the decoder, see |
370 | | CAacDecoderStaticChannelInfo::last_core_mode !!)*/ |
371 | | UCHAR lpd_mode_last; /* previous LPD mode, signalled in the bitstream |
372 | | (not done by the decoder, see |
373 | | CAacDecoderStaticChannelInfo::last_core_mode !!)*/ |
374 | | UCHAR mod[4]; |
375 | | UCHAR bpf_control_info; /* (1: enable, 0: disable) bpf for current |
376 | | superframe */ |
377 | | |
378 | | FIXP_LPC lsp_coeff[5][M_LP_FILTER_ORDER]; /* linear prediction |
379 | | coefficients in LSP domain */ |
380 | | FIXP_LPC |
381 | | lp_coeff[5][M_LP_FILTER_ORDER]; /* linear prediction coefficients in |
382 | | LP domain */ |
383 | | INT lp_coeff_exp[5]; |
384 | | FIXP_LPC lsf_adaptive_mean_cand |
385 | | [M_LP_FILTER_ORDER]; /* concealment: is copied to |
386 | | CAacDecoderStaticChannelInfo->lsf_adaptive_mean once frame is |
387 | | assumed to be correct*/ |
388 | | FIXP_SGL aStability[4]; /* LPC coeff stability values required for ACELP |
389 | | and TCX (concealment) */ |
390 | | |
391 | | CAcelpChannelData acelp[4]; |
392 | | |
393 | | FIXP_DBL tcx_gain[4]; |
394 | | SCHAR tcx_gain_e[4]; |
395 | | } usac; |
396 | | |
397 | | struct { |
398 | | CPnsData PnsData; /* Not required for USAC */ |
399 | | } aac; |
400 | | } |
401 | | data; |
402 | | |
403 | | SPECTRAL_PTR pSpectralCoefficient; /* Spectral coefficients of each window */ |
404 | | SHORT specScale[8]; /* Scale shift values of each spectrum window */ |
405 | | CIcsInfo icsInfo; |
406 | | INT granuleLength; /* Size of smallest spectrum piece */ |
407 | | UCHAR ElementInstanceTag; |
408 | | |
409 | | AACDEC_RENDER_MODE renderMode; /* Output signal rendering mode */ |
410 | | |
411 | | CAacDecoderDynamicData * |
412 | | pDynData; /* Data required for one element and discarded after decoding */ |
413 | | CAacDecoderCommonData |
414 | | *pComData; /* Data required for one channel at a time during decode */ |
415 | | CAacDecoderCommonStaticData *pComStaticData; /* Persistent data required for |
416 | | one channel at a time during |
417 | | decode */ |
418 | | |
419 | | int currAliasingSymmetry; /* required for RSVD60 MCT */ |
420 | | |
421 | | } CAacDecoderChannelInfo; |
422 | | |
423 | | /* channelinfo.cpp */ |
424 | | |
425 | | AAC_DECODER_ERROR getSamplingRateInfo(SamplingRateInfo *t, UINT samplesPerFrame, |
426 | | UINT samplingRateIndex, |
427 | | UINT samplingRate); |
428 | | |
429 | | /** |
430 | | * \brief Read max SFB from bit stream and assign TotalSfBands according |
431 | | * to the window sequence and sample rate. |
432 | | * \param hBs bit stream handle as data source |
433 | | * \param pIcsInfo IcsInfo structure to read the window sequence and store |
434 | | * MaxSfBands and TotalSfBands |
435 | | * \param pSamplingRateInfo read only |
436 | | */ |
437 | | AAC_DECODER_ERROR IcsReadMaxSfb(HANDLE_FDK_BITSTREAM hBs, CIcsInfo *pIcsInfo, |
438 | | const SamplingRateInfo *pSamplingRateInfo); |
439 | | |
440 | | AAC_DECODER_ERROR IcsRead(HANDLE_FDK_BITSTREAM bs, CIcsInfo *pIcsInfo, |
441 | | const SamplingRateInfo *SamplingRateInfoTable, |
442 | | const UINT flags); |
443 | | |
444 | | /* stereo.cpp, only called from this file */ |
445 | | |
446 | | /*! |
447 | | \brief Applies MS stereo. |
448 | | |
449 | | The function applies MS stereo. |
450 | | |
451 | | \param pAacDecoderChannelInfo aac channel info. |
452 | | \param pScaleFactorBandOffsets pointer to scalefactor band offsets. |
453 | | \param pWindowGroupLength pointer to window group length array. |
454 | | \param windowGroups number of window groups. |
455 | | \param scaleFactorBandsTransmittedL number of transmitted scalefactor bands in |
456 | | left channel. \param scaleFactorBandsTransmittedR number of transmitted |
457 | | scalefactor bands in right channel. May differ from |
458 | | scaleFactorBandsTransmittedL only for USAC. \return none |
459 | | */ |
460 | | void CJointStereo_ApplyMS( |
461 | | CAacDecoderChannelInfo *pAacDecoderChannelInfo[2], |
462 | | CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[2], |
463 | | FIXP_DBL *spectrumL, FIXP_DBL *spectrumR, SHORT *SFBleftScale, |
464 | | SHORT *SFBrightScale, SHORT *specScaleL, SHORT *specScaleR, |
465 | | const SHORT *pScaleFactorBandOffsets, const UCHAR *pWindowGroupLength, |
466 | | const int windowGroups, const int max_sfb_ste_outside, |
467 | | const int scaleFactorBandsTransmittedL, |
468 | | const int scaleFactorBandsTransmittedR, FIXP_DBL *store_dmx_re_prev, |
469 | | SHORT *store_dmx_re_prev_e, const int mainband_flag); |
470 | | |
471 | | /*! |
472 | | \brief Applies intensity stereo |
473 | | |
474 | | The function applies intensity stereo. |
475 | | |
476 | | \param pAacDecoderChannelInfo aac channel info. |
477 | | \param pScaleFactorBandOffsets pointer to scalefactor band offsets. |
478 | | \param pWindowGroupLength pointer to window group length array. |
479 | | \param windowGroups number of window groups. |
480 | | \param scaleFactorBandsTransmitted number of transmitted scalefactor bands. |
481 | | \return none |
482 | | */ |
483 | | void CJointStereo_ApplyIS(CAacDecoderChannelInfo *pAacDecoderChannelInfo[2], |
484 | | const short *pScaleFactorBandOffsets, |
485 | | const UCHAR *pWindowGroupLength, |
486 | | const int windowGroups, |
487 | | const int scaleFactorBandsTransmitted); |
488 | | |
489 | | /* aacdec_pns.cpp */ |
490 | | int CPns_IsPnsUsed(const CPnsData *pPnsData, const int group, const int band); |
491 | | |
492 | | void CPns_SetCorrelation(CPnsData *pPnsData, const int group, const int band, |
493 | | const int outofphase); |
494 | | |
495 | | /****************** inline functions ******************/ |
496 | | |
497 | 0 | inline UCHAR IsValid(const CIcsInfo *pIcsInfo) { return pIcsInfo->Valid; } |
498 | | |
499 | 0 | inline UCHAR IsLongBlock(const CIcsInfo *pIcsInfo) { |
500 | 0 | return (pIcsInfo->WindowSequence != BLOCK_SHORT); |
501 | 0 | } |
502 | | |
503 | 0 | inline UCHAR GetWindowShape(const CIcsInfo *pIcsInfo) { |
504 | 0 | return pIcsInfo->WindowShape; |
505 | 0 | } |
506 | | |
507 | 0 | inline BLOCK_TYPE GetWindowSequence(const CIcsInfo *pIcsInfo) { |
508 | 0 | return pIcsInfo->WindowSequence; |
509 | 0 | } |
510 | | |
511 | | inline const SHORT *GetScaleFactorBandOffsets( |
512 | 0 | const CIcsInfo *pIcsInfo, const SamplingRateInfo *samplingRateInfo) { |
513 | 0 | if (IsLongBlock(pIcsInfo)) { |
514 | 0 | return samplingRateInfo->ScaleFactorBands_Long; |
515 | 0 | } else { |
516 | 0 | return samplingRateInfo->ScaleFactorBands_Short; |
517 | 0 | } |
518 | 0 | } |
519 | | |
520 | | inline UCHAR GetNumberOfScaleFactorBands( |
521 | 0 | const CIcsInfo *pIcsInfo, const SamplingRateInfo *samplingRateInfo) { |
522 | 0 | if (IsLongBlock(pIcsInfo)) { |
523 | 0 | return samplingRateInfo->NumberOfScaleFactorBands_Long; |
524 | 0 | } else { |
525 | 0 | return samplingRateInfo->NumberOfScaleFactorBands_Short; |
526 | 0 | } |
527 | 0 | } |
528 | | |
529 | 0 | inline int GetWindowsPerFrame(const CIcsInfo *pIcsInfo) { |
530 | 0 | return (pIcsInfo->WindowSequence == BLOCK_SHORT) ? 8 : 1; |
531 | 0 | } |
532 | | |
533 | 0 | inline UCHAR GetWindowGroups(const CIcsInfo *pIcsInfo) { |
534 | 0 | return pIcsInfo->WindowGroups; |
535 | 0 | } |
536 | | |
537 | 0 | inline UCHAR GetWindowGroupLength(const CIcsInfo *pIcsInfo, const INT index) { |
538 | 0 | return pIcsInfo->WindowGroupLength[index]; |
539 | 0 | } |
540 | | |
541 | 0 | inline const UCHAR *GetWindowGroupLengthTable(const CIcsInfo *pIcsInfo) { |
542 | 0 | return pIcsInfo->WindowGroupLength; |
543 | 0 | } |
544 | | |
545 | 0 | inline UCHAR GetScaleFactorBandsTransmitted(const CIcsInfo *pIcsInfo) { |
546 | 0 | return pIcsInfo->MaxSfBands; |
547 | 0 | } |
548 | | |
549 | | inline UCHAR GetScaleMaxFactorBandsTransmitted(const CIcsInfo *pIcsInfo0, |
550 | 0 | const CIcsInfo *pIcsInfo1) { |
551 | 0 | return fMax(pIcsInfo0->MaxSfBands, pIcsInfo1->MaxSfBands); |
552 | 0 | } |
553 | | |
554 | 0 | inline UCHAR GetScaleFactorBandsTotal(const CIcsInfo *pIcsInfo) { |
555 | 0 | return pIcsInfo->TotalSfBands; |
556 | 0 | } |
557 | | |
558 | | /* Note: This function applies to AAC-LC only ! */ |
559 | | inline UCHAR GetMaximumTnsBands(const CIcsInfo *pIcsInfo, |
560 | 0 | const int samplingRateIndex) { |
561 | 0 | return tns_max_bands_tbl[samplingRateIndex][!IsLongBlock(pIcsInfo)]; |
562 | 0 | } |
563 | | |
564 | | #endif /* #ifndef CHANNELINFO_H */ |