1
2 /* -----------------------------------------------------------------------------------------------------------
3 Software License for The Fraunhofer FDK AAC Codec Library for Android
4
5 � Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur F�rderung der angewandten Forschung e.V.
6 All rights reserved.
7
8 1. INTRODUCTION
9 The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements
10 the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio.
11 This FDK AAC Codec software is intended to be used on a wide variety of Android devices.
12
13 AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual
14 audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by
15 independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part
16 of the MPEG specifications.
17
18 Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer)
19 may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners
20 individually for the purpose of encoding or decoding bit streams in products that are compliant with
21 the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license
22 these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec
23 software may already be covered under those patent licenses when it is used for those licensed purposes only.
24
25 Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality,
26 are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional
27 applications information and documentation.
28
29 2. COPYRIGHT LICENSE
30
31 Redistribution and use in source and binary forms, with or without modification, are permitted without
32 payment of copyright license fees provided that you satisfy the following conditions:
33
34 You must retain the complete text of this software license in redistributions of the FDK AAC Codec or
35 your modifications thereto in source code form.
36
37 You must retain the complete text of this software license in the documentation and/or other materials
38 provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form.
39 You must make available free of charge copies of the complete source code of the FDK AAC Codec and your
40 modifications thereto to recipients of copies in binary form.
41
42 The name of Fraunhofer may not be used to endorse or promote products derived from this library without
43 prior written permission.
44
45 You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec
46 software or your modifications thereto.
47
48 Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software
49 and the date of any change. For modified versions of the FDK AAC Codec, the term
50 "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term
51 "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android."
52
53 3. NO PATENT LICENSE
54
55 NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer,
56 ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with
57 respect to this software.
58
59 You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized
60 by appropriate patent licenses.
61
62 4. DISCLAIMER
63
64 This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors
65 "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties
66 of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
67 CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages,
68 including but not limited to procurement of substitute goods or services; loss of use, data, or profits,
69 or business interruption, however caused and on any theory of liability, whether in contract, strict
70 liability, or tort (including negligence), arising in any way out of the use of this software, even if
71 advised of the possibility of such damage.
72
73 5. CONTACT INFORMATION
74
75 Fraunhofer Institute for Integrated Circuits IIS
76 Attention: Audio and Multimedia Departments - FDK AAC LL
77 Am Wolfsmantel 33
78 91058 Erlangen, Germany
79
80 www.iis.fraunhofer.de/amm
81 amm-info@iis.fraunhofer.de
82 ----------------------------------------------------------------------------------------------------------- */
83
84 /*!
85 \file
86 \brief RVLC Decoder
87 \author Robert Weidner
88 */
89
90 #include "rvlc.h"
91
92
93 #include "block.h"
94
95 #include "aac_rom.h"
96 #include "rvlcbit.h"
97 #include "rvlcconceal.h"
98 #include "aacdec_hcr.h"
99
100 /*---------------------------------------------------------------------------------------------
101 function: rvlcInit
102
103 description: init RVLC by data from channelinfo, which was decoded previously and
104 set up pointers
105 -----------------------------------------------------------------------------------------------
106 input: - pointer rvlc structure
107 - pointer channel info structure
108 - pointer bitstream structure
109 -----------------------------------------------------------------------------------------------
110 return: -
111 -------------------------------------------------------------------------------------------- */
112
113 static
rvlcInit(CErRvlcInfo * pRvlc,CAacDecoderChannelInfo * pAacDecoderChannelInfo,HANDLE_FDK_BITSTREAM bs)114 void rvlcInit (CErRvlcInfo *pRvlc,
115 CAacDecoderChannelInfo *pAacDecoderChannelInfo,
116 HANDLE_FDK_BITSTREAM bs)
117 {
118 /* RVLC common initialization part 2 of 2 */
119 SHORT *pScfEsc = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfEsc;
120 SHORT *pScfFwd = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd;
121 SHORT *pScfBwd = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd;
122 SHORT *pScaleFactor = pAacDecoderChannelInfo->pDynData->aScaleFactor;
123 int bnds;
124
125 pAacDecoderChannelInfo->pDynData->specificTo.aac.rvlcIntensityUsed = 0;
126
127 pRvlc->numDecodedEscapeWordsEsc = 0;
128 pRvlc->numDecodedEscapeWordsFwd = 0;
129 pRvlc->numDecodedEscapeWordsBwd = 0;
130
131 pRvlc->intensity_used = 0;
132 pRvlc->errorLogRvlc = 0;
133
134 pRvlc->conceal_max = CONCEAL_MAX_INIT;
135 pRvlc->conceal_min = CONCEAL_MIN_INIT;
136
137 pRvlc->conceal_max_esc = CONCEAL_MAX_INIT;
138 pRvlc->conceal_min_esc = CONCEAL_MIN_INIT;
139
140 pRvlc->pHuffTreeRvlcEscape = aHuffTreeRvlcEscape;
141 pRvlc->pHuffTreeRvlCodewds = aHuffTreeRvlCodewds;
142
143 /* init scf arrays (for savety (in case of there are only zero codebooks)) */
144 for (bnds = 0; bnds < RVLC_MAX_SFB; bnds++) {
145 pScfFwd[bnds] = 0;
146 pScfBwd[bnds] = 0;
147 pScfEsc[bnds] = 0;
148 pScaleFactor[bnds] = 0;
149 }
150
151 /* set base bitstream ptr to the RVL-coded part (start of RVLC data (ESC 2)) */
152 FDKsyncCache (bs);
153
154 pRvlc->bitstreamIndexRvlFwd = FDKgetBitCnt(bs); /* first bit within RVL coded block as start address for forward decoding */
155 pRvlc->bitstreamIndexRvlBwd = FDKgetBitCnt(bs) + pRvlc->length_of_rvlc_sf - 1; /* last bit within RVL coded block as start address for backward decoding */
156
157 /* skip RVLC-bitstream-part -- pointing now to escapes (if present) or to TNS data (if present) */
158 FDKpushFor (bs, pRvlc->length_of_rvlc_sf);
159
160 if ( pRvlc->sf_escapes_present != 0 ) {
161
162 /* locate internal bitstream ptr at escapes (which is the second part) */
163 FDKsyncCache (bs);
164 pRvlc->bitstreamIndexEsc = FDKgetBitCnt(bs);
165
166 /* skip escapeRVLC-bitstream-part -- pointing to TNS data (if present) to make decoder continue */
167 /* decoding of RVLC should work despite this second pushFor during initialization because */
168 /* bitstream initialization is valid for both ESC2 data parts (RVL-coded values and ESC-coded values) */
169 FDKpushFor (bs, pRvlc->length_of_rvlc_escapes);
170 }
171
172 #if VERBOSE_RVLC_INIT
173 DebugOutputInit(pRvlc,pAacDecoderChannelInfo);
174 #endif
175 }
176
177
178 /*---------------------------------------------------------------------------------------------
179 function: rvlcCheckIntensityCb
180
181 description: Check if a intensity codebook is used in the current channel.
182 -----------------------------------------------------------------------------------------------
183 input: - pointer rvlc structure
184 - pointer channel info structure
185 -----------------------------------------------------------------------------------------------
186 output: - intensity_used: 0 no intensity codebook is used
187 1 intensity codebook is used
188 -----------------------------------------------------------------------------------------------
189 return: -
190 -------------------------------------------------------------------------------------------- */
191
192 static
rvlcCheckIntensityCb(CErRvlcInfo * pRvlc,CAacDecoderChannelInfo * pAacDecoderChannelInfo)193 void rvlcCheckIntensityCb (CErRvlcInfo *pRvlc,
194 CAacDecoderChannelInfo *pAacDecoderChannelInfo)
195 {
196 int group, band, bnds;
197
198 pRvlc->intensity_used = 0;
199
200 for (group=0; group < pRvlc->numWindowGroups; group++) {
201 for (band=0; band < pRvlc->maxSfbTransmitted; band++) {
202 bnds = 16*group+band;
203 if ( (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds] == INTENSITY_HCB) || (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds] == INTENSITY_HCB2) ) {
204 pRvlc->intensity_used = 1;
205 break;
206 }
207 }
208 }
209 }
210
211
212 /*---------------------------------------------------------------------------------------------
213 function: rvlcDecodeEscapeWord
214
215 description: Decode a huffman coded RVLC Escape-word. This value is part of a DPCM coded
216 scalefactor.
217 -----------------------------------------------------------------------------------------------
218 input: - pointer rvlc structure
219 -----------------------------------------------------------------------------------------------
220 return: - a single RVLC-Escape value which had to be applied to a DPCM value (which
221 has a absolute value of 7)
222 -------------------------------------------------------------------------------------------- */
223
224 static
rvlcDecodeEscapeWord(CErRvlcInfo * pRvlc,HANDLE_FDK_BITSTREAM bs)225 SCHAR rvlcDecodeEscapeWord (CErRvlcInfo *pRvlc,
226 HANDLE_FDK_BITSTREAM bs)
227 {
228 int i;
229 SCHAR value;
230 UCHAR carryBit;
231 UINT treeNode;
232 UINT branchValue;
233 UINT branchNode;
234
235 USHORT* pBitstreamIndexEsc;
236 const UINT* pEscTree;
237
238 pEscTree = pRvlc->pHuffTreeRvlcEscape;
239 pBitstreamIndexEsc = &(pRvlc->bitstreamIndexEsc);
240 treeNode = *pEscTree; /* init at starting node */
241
242 for (i=MAX_LEN_RVLC_ESCAPE_WORD-1; i >= 0; i--) {
243 carryBit = rvlcReadBitFromBitstream(bs, /* get next bit */
244 pBitstreamIndexEsc,
245 FWD);
246
247 CarryBitToBranchValue(carryBit, /* huffman decoding, do a single step in huffman decoding tree */
248 treeNode,
249 &branchValue,
250 &branchNode);
251
252 if ((branchNode & TEST_BIT_10) == TEST_BIT_10) { /* test bit 10 ; if set --> a RVLC-escape-word is completely decoded */
253 value = (SCHAR) branchNode & CLR_BIT_10;
254 pRvlc->length_of_rvlc_escapes -= (MAX_LEN_RVLC_ESCAPE_WORD - i);
255
256 if (pRvlc->length_of_rvlc_escapes < 0) {
257 pRvlc->errorLogRvlc |= RVLC_ERROR_ALL_ESCAPE_WORDS_INVALID;
258 value = -1;
259 }
260
261 return value;
262 }
263 else {
264 treeNode = *(pEscTree + branchValue); /* update treeNode for further step in decoding tree */
265 }
266 }
267
268 pRvlc->errorLogRvlc |= RVLC_ERROR_ALL_ESCAPE_WORDS_INVALID;
269
270 return -1; /* should not be reached */
271 }
272
273
274 /*---------------------------------------------------------------------------------------------
275 function: rvlcDecodeEscapes
276
277 description: Decodes all huffman coded RVLC Escape Words.
278 Here a difference to the pseudo-code-implementation from standard can be
279 found. A while loop (and not two nested for loops) is used for two reasons:
280
281 1. The plain huffman encoded escapes are decoded before the RVL-coded
282 scalefactors. Therefore the escapes are present in the second step
283 when decoding the RVL-coded-scalefactor values in forward and
284 backward direction.
285
286 When the RVL-coded scalefactors are decoded and there a escape is
287 needed, then it is just taken out of the array in ascending order.
288
289 2. It's faster.
290 -----------------------------------------------------------------------------------------------
291 input: - pointer rvlc structure
292 - handle to FDK bitstream
293 -----------------------------------------------------------------------------------------------
294 return: - 0 ok the decoded escapes seem to be valid
295 - 1 error there was a error detected during decoding escapes
296 --> all escapes are invalid
297 -------------------------------------------------------------------------------------------- */
298
299 static
rvlcDecodeEscapes(CErRvlcInfo * pRvlc,SHORT * pEsc,HANDLE_FDK_BITSTREAM bs)300 void rvlcDecodeEscapes (CErRvlcInfo *pRvlc,
301 SHORT *pEsc,
302 HANDLE_FDK_BITSTREAM bs)
303 {
304 SCHAR escWord;
305 SCHAR escCnt=0;
306 SHORT* pEscBitCntSum;
307
308 pEscBitCntSum = &(pRvlc->length_of_rvlc_escapes);
309
310 /* Decode all RVLC-Escape words with a plain Huffman-Decoder */
311 while ( *pEscBitCntSum > 0 ) {
312 escWord = rvlcDecodeEscapeWord(pRvlc, bs);
313
314 if (escWord >= 0) {
315
316 pEsc[escCnt] = escWord;
317 escCnt++;
318 }
319 else {
320 pRvlc->errorLogRvlc |= RVLC_ERROR_ALL_ESCAPE_WORDS_INVALID;
321 pRvlc->numDecodedEscapeWordsEsc = escCnt;
322
323 return;
324 }
325 } /* all RVLC escapes decoded */
326
327 pRvlc->numDecodedEscapeWordsEsc = escCnt;
328 }
329
330
331 /*---------------------------------------------------------------------------------------------
332 function: decodeRVLCodeword
333
334 description: Decodes a RVL-coded dpcm-word (-part).
335 -----------------------------------------------------------------------------------------------
336 input: - FDK bitstream handle
337 - pointer rvlc structure
338 -----------------------------------------------------------------------------------------------
339 return: - a dpcm value which is within range [0,1,..,14] in case of no errors.
340 The offset of 7 must be subtracted to get a valid dpcm scalefactor value.
341 In case of errors a forbidden codeword is detected --> returning -1
342 -------------------------------------------------------------------------------------------- */
343
decodeRVLCodeword(HANDLE_FDK_BITSTREAM bs,CErRvlcInfo * pRvlc)344 SCHAR decodeRVLCodeword (HANDLE_FDK_BITSTREAM bs, CErRvlcInfo *pRvlc)
345 {
346 int i;
347 SCHAR value;
348 UCHAR carryBit;
349 UINT branchValue;
350 UINT branchNode;
351
352 const UINT *pRvlCodeTree = pRvlc->pHuffTreeRvlCodewds;
353 UCHAR direction = pRvlc->direction;
354 USHORT *pBitstrIndxRvl = pRvlc->pBitstrIndxRvl_RVL;
355 UINT treeNode = *pRvlCodeTree;
356
357 for (i=MAX_LEN_RVLC_CODE_WORD-1; i >= 0; i--) {
358 carryBit = rvlcReadBitFromBitstream(bs, /* get next bit */
359 pBitstrIndxRvl,
360 direction);
361
362 CarryBitToBranchValue(carryBit, /* huffman decoding, do a single step in huffman decoding tree */
363 treeNode,
364 &branchValue,
365 &branchNode);
366
367 if ((branchNode & TEST_BIT_10) == TEST_BIT_10) { /* test bit 10 ; if set --> a RVLC-codeword is completely decoded */
368 value = (SCHAR) (branchNode & CLR_BIT_10);
369 *pRvlc->pRvlBitCnt_RVL -= (MAX_LEN_RVLC_CODE_WORD - i);
370
371 /* check available bits for decoding */
372 if (*pRvlc->pRvlBitCnt_RVL < 0) {
373 if (direction == FWD) {
374 pRvlc->errorLogRvlc |= RVLC_ERROR_RVL_SUM_BIT_COUNTER_BELOW_ZERO_FWD; }
375 else {
376 pRvlc->errorLogRvlc |= RVLC_ERROR_RVL_SUM_BIT_COUNTER_BELOW_ZERO_BWD; }
377 value = -1; /* signalize an error in return value, because too many bits was decoded */
378 }
379
380 /* check max value of dpcm value */
381 if (value > MAX_ALLOWED_DPCM_INDEX) {
382 if (direction == FWD) {
383 pRvlc->errorLogRvlc |= RVLC_ERROR_FORBIDDEN_CW_DETECTED_FWD;
384 }
385 else {
386 pRvlc->errorLogRvlc |= RVLC_ERROR_FORBIDDEN_CW_DETECTED_BWD;
387 }
388 value = -1; /* signalize an error in return value, because a forbidden cw was detected*/
389 }
390
391 return value; /* return a dpcm value with offset +7 or an error status */
392 }
393 else {
394 treeNode = *(pRvlCodeTree + branchValue); /* update treeNode for further step in decoding tree */
395 }
396 }
397
398 return -1;
399 }
400
401
402 /*---------------------------------------------------------------------------------------------
403 function: rvlcDecodeForward
404
405 description: Decode RVL-coded codewords in forward direction.
406 -----------------------------------------------------------------------------------------------
407 input: - pointer rvlc structure
408 - pointer channel info structure
409 - handle to FDK bitstream
410 -----------------------------------------------------------------------------------------------
411 return: -
412 -------------------------------------------------------------------------------------------- */
413
414 static
rvlcDecodeForward(CErRvlcInfo * pRvlc,CAacDecoderChannelInfo * pAacDecoderChannelInfo,HANDLE_FDK_BITSTREAM bs)415 void rvlcDecodeForward (CErRvlcInfo *pRvlc,
416 CAacDecoderChannelInfo *pAacDecoderChannelInfo,
417 HANDLE_FDK_BITSTREAM bs)
418 {
419 int band = 0;
420 int group = 0;
421 int bnds = 0;
422
423 SHORT dpcm;
424
425 SHORT factor = pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain - SF_OFFSET;
426 SHORT position = - SF_OFFSET;
427 SHORT noisenrg = pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain - SF_OFFSET - 90 - 256;
428
429 SHORT* pScfFwd = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd;
430 SHORT* pScfEsc = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfEsc;
431 UCHAR* pEscFwdCnt = &(pRvlc->numDecodedEscapeWordsFwd);
432
433 pRvlc->pRvlBitCnt_RVL = &(pRvlc->length_of_rvlc_sf_fwd);
434 pRvlc->pBitstrIndxRvl_RVL = &(pRvlc->bitstreamIndexRvlFwd);
435
436 *pEscFwdCnt = 0;
437 pRvlc->direction = FWD;
438 pRvlc->noise_used = 0;
439 pRvlc->sf_used = 0;
440 pRvlc->lastScf = 0;
441 pRvlc->lastNrg = 0;
442 pRvlc->lastIs = 0;
443
444 rvlcCheckIntensityCb(pRvlc,pAacDecoderChannelInfo);
445
446 /* main loop fwd long */
447 for (group=0; group < pRvlc->numWindowGroups; group++) {
448 for (band=0; band < pRvlc->maxSfbTransmitted; band++) {
449 bnds = 16*group+band;
450
451 switch (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]) {
452
453 case ZERO_HCB :
454 pScfFwd[bnds] = 0;
455 break;
456
457 case INTENSITY_HCB2 :
458 case INTENSITY_HCB :
459 /* store dpcm_is_position */
460 dpcm = decodeRVLCodeword(bs, pRvlc);
461 if ( dpcm < 0 ) {
462 pRvlc->conceal_max = bnds;
463 return;
464 }
465 dpcm -= TABLE_OFFSET;
466 if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) {
467 if (pRvlc->length_of_rvlc_escapes) {
468 pRvlc->conceal_max = bnds;
469 return;
470 }
471 else {
472 if (dpcm == MIN_RVL) {
473 dpcm -= *pScfEsc++;
474 }
475 else {
476 dpcm += *pScfEsc++;
477 }
478 (*pEscFwdCnt)++;
479 if (pRvlc->conceal_max_esc == CONCEAL_MAX_INIT) {
480 pRvlc->conceal_max_esc = bnds;
481 }
482 }
483 }
484 position += dpcm;
485 pScfFwd[bnds] = position;
486 pRvlc->lastIs = position;
487 break;
488
489 case NOISE_HCB :
490 if (pRvlc->noise_used == 0) {
491 pRvlc->noise_used = 1;
492 pRvlc->first_noise_band = bnds;
493 noisenrg += pRvlc->dpcm_noise_nrg;
494 pScfFwd[bnds] = 100 + noisenrg;
495 pRvlc->lastNrg = noisenrg;
496 }
497 else {
498 dpcm = decodeRVLCodeword(bs, pRvlc);
499 if ( dpcm < 0 ) {
500 pRvlc->conceal_max = bnds;
501 return;
502 }
503 dpcm -= TABLE_OFFSET;
504 if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) {
505 if (pRvlc->length_of_rvlc_escapes) {
506 pRvlc->conceal_max = bnds;
507 return;
508 }
509 else {
510 if (dpcm == MIN_RVL) {
511 dpcm -= *pScfEsc++;
512 }
513 else {
514 dpcm += *pScfEsc++;
515 }
516 (*pEscFwdCnt)++;
517 if (pRvlc->conceal_max_esc == CONCEAL_MAX_INIT) {
518 pRvlc->conceal_max_esc = bnds;
519 }
520 }
521 }
522 noisenrg += dpcm;
523 pScfFwd[bnds] = 100 + noisenrg;
524 pRvlc->lastNrg = noisenrg;
525 }
526 pAacDecoderChannelInfo->data.aac.PnsData.pnsUsed[bnds] = 1;
527 break ;
528
529 default :
530 pRvlc->sf_used = 1;
531 dpcm = decodeRVLCodeword(bs, pRvlc);
532 if ( dpcm < 0 ) {
533 pRvlc->conceal_max = bnds;
534 return;
535 }
536 dpcm -= TABLE_OFFSET;
537 if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) {
538 if (pRvlc->length_of_rvlc_escapes) {
539 pRvlc->conceal_max = bnds;
540 return;
541 }
542 else {
543 if (dpcm == MIN_RVL) {
544 dpcm -= *pScfEsc++; }
545 else {
546 dpcm += *pScfEsc++;
547 }
548 (*pEscFwdCnt)++;
549 if (pRvlc->conceal_max_esc == CONCEAL_MAX_INIT) {
550 pRvlc->conceal_max_esc = bnds;
551 }
552 }
553 }
554 factor += dpcm;
555 pScfFwd[bnds] = factor;
556 pRvlc->lastScf = factor;
557 break;
558 }
559 }
560 }
561
562 /* postfetch fwd long */
563 if (pRvlc->intensity_used) {
564 dpcm = decodeRVLCodeword(bs, pRvlc); /* dpcm_is_last_position */
565 if ( dpcm < 0 ) {
566 pRvlc->conceal_max = bnds;
567 return;
568 }
569 dpcm -= TABLE_OFFSET;
570 if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) {
571 if (pRvlc->length_of_rvlc_escapes) {
572 pRvlc->conceal_max = bnds;
573 return;
574 }
575 else {
576 if (dpcm == MIN_RVL) {
577 dpcm -= *pScfEsc++;
578 }
579 else {
580 dpcm += *pScfEsc++;
581 }
582 (*pEscFwdCnt)++;
583 if (pRvlc->conceal_max_esc == CONCEAL_MAX_INIT) {
584 pRvlc->conceal_max_esc = bnds;
585 }
586 }
587 }
588 pRvlc->dpcm_is_last_position = dpcm;
589 }
590 }
591
592
593 /*---------------------------------------------------------------------------------------------
594 function: rvlcDecodeBackward
595
596 description: Decode RVL-coded codewords in backward direction.
597 -----------------------------------------------------------------------------------------------
598 input: - pointer rvlc structure
599 - pointer channel info structure
600 - handle FDK bitstream
601 -----------------------------------------------------------------------------------------------
602 return: -
603 -------------------------------------------------------------------------------------------- */
604
605 static
rvlcDecodeBackward(CErRvlcInfo * pRvlc,CAacDecoderChannelInfo * pAacDecoderChannelInfo,HANDLE_FDK_BITSTREAM bs)606 void rvlcDecodeBackward (CErRvlcInfo *pRvlc,
607 CAacDecoderChannelInfo *pAacDecoderChannelInfo,
608 HANDLE_FDK_BITSTREAM bs)
609 {
610 SHORT band, group, dpcm, offset;
611 SHORT bnds = pRvlc->maxSfbTransmitted-1;
612
613 SHORT factor = pRvlc->rev_global_gain - SF_OFFSET;
614 SHORT position = pRvlc->dpcm_is_last_position - SF_OFFSET;
615 SHORT noisenrg = pRvlc->rev_global_gain + pRvlc->dpcm_noise_last_position - SF_OFFSET - 90 - 256;
616
617 SHORT *pScfBwd = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd;
618 SHORT *pScfEsc = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfEsc;
619 UCHAR *pEscEscCnt = &(pRvlc->numDecodedEscapeWordsEsc);
620 UCHAR *pEscBwdCnt = &(pRvlc->numDecodedEscapeWordsBwd);
621
622 pRvlc->pRvlBitCnt_RVL = &(pRvlc->length_of_rvlc_sf_bwd);
623 pRvlc->pBitstrIndxRvl_RVL = &(pRvlc->bitstreamIndexRvlBwd);
624
625 *pEscBwdCnt = 0;
626 pRvlc->direction = BWD;
627 pScfEsc += *pEscEscCnt - 1; /* set pScfEsc to last entry */
628 pRvlc->firstScf = 0;
629 pRvlc->firstNrg = 0;
630 pRvlc->firstIs = 0;
631
632 /* prefetch long BWD */
633 if (pRvlc->intensity_used) {
634 dpcm = decodeRVLCodeword(bs, pRvlc); /* dpcm_is_last_position */
635 if ( dpcm < 0 ) {
636 pRvlc->dpcm_is_last_position = 0;
637 pRvlc->conceal_min = bnds;
638 return;
639 }
640 dpcm -= TABLE_OFFSET;
641 if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) {
642 if (pRvlc->length_of_rvlc_escapes) {
643 pRvlc->conceal_min = bnds;
644 return;
645 }
646 else {
647 if (dpcm == MIN_RVL) {
648 dpcm -= *pScfEsc--;
649 }
650 else {
651 dpcm += *pScfEsc--;
652 }
653 (*pEscBwdCnt)++;
654 if (pRvlc->conceal_min_esc == CONCEAL_MIN_INIT) {
655 pRvlc->conceal_min_esc = bnds;
656 }
657 }
658 }
659 pRvlc->dpcm_is_last_position = dpcm;
660 }
661
662 /* main loop long BWD */
663 for (group=pRvlc->numWindowGroups-1; group >= 0; group--) {
664 for (band=pRvlc->maxSfbTransmitted-1; band >= 0; band--) {
665 bnds = 16*group+band;
666 if ((band == 0) && (pRvlc->numWindowGroups != 1))
667 offset = 16 - pRvlc->maxSfbTransmitted + 1;
668 else
669 offset = 1;
670
671 switch (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]) {
672
673 case ZERO_HCB :
674 pScfBwd[bnds] = 0;
675 break;
676
677 case INTENSITY_HCB2 :
678 case INTENSITY_HCB :
679 /* store dpcm_is_position */
680 dpcm = decodeRVLCodeword(bs, pRvlc);
681 if ( dpcm < 0 ) {
682 pScfBwd[bnds] = position;
683 pRvlc->conceal_min = FDKmax(0,bnds-offset);
684 return;
685 }
686 dpcm -= TABLE_OFFSET;
687 if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) {
688 if (pRvlc->length_of_rvlc_escapes) {
689 pScfBwd[bnds] = position;
690 pRvlc->conceal_min = FDKmax(0,bnds-offset);
691 return;
692 }
693 else {
694 if (dpcm == MIN_RVL) {
695 dpcm -= *pScfEsc--;
696 }
697 else {
698 dpcm += *pScfEsc--;
699 }
700 (*pEscBwdCnt)++;
701 if (pRvlc->conceal_min_esc == CONCEAL_MIN_INIT) {
702 pRvlc->conceal_min_esc = FDKmax(0,bnds-offset);
703 }
704 }
705 }
706 pScfBwd[bnds] = position;
707 position -= dpcm;
708 pRvlc->firstIs = position;
709 break;
710
711 case NOISE_HCB :
712 if ( bnds == pRvlc->first_noise_band ) {
713 pScfBwd[bnds] = pRvlc->dpcm_noise_nrg + pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain - SF_OFFSET - 90 - 256;
714 pRvlc->firstNrg = pScfBwd[bnds];
715 }
716 else {
717 dpcm = decodeRVLCodeword(bs, pRvlc);
718 if ( dpcm < 0 ) {
719 pScfBwd[bnds] = noisenrg;
720 pRvlc->conceal_min = FDKmax(0,bnds-offset);
721 return;
722 }
723 dpcm -= TABLE_OFFSET;
724 if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) {
725 if (pRvlc->length_of_rvlc_escapes) {
726 pScfBwd[bnds] = noisenrg;
727 pRvlc->conceal_min = FDKmax(0,bnds-offset);
728 return;
729 }
730 else {
731 if (dpcm == MIN_RVL) {
732 dpcm -= *pScfEsc--;
733 }
734 else {
735 dpcm += *pScfEsc--;
736 }
737 (*pEscBwdCnt)++;
738 if (pRvlc->conceal_min_esc == CONCEAL_MIN_INIT) {
739 pRvlc->conceal_min_esc = FDKmax(0,bnds-offset);
740 }
741 }
742 }
743 pScfBwd[bnds] = noisenrg;
744 noisenrg -= dpcm;
745 pRvlc->firstNrg = noisenrg;
746 }
747 break ;
748
749 default :
750 dpcm = decodeRVLCodeword(bs, pRvlc);
751 if ( dpcm < 0 ) {
752 pScfBwd[bnds] = factor;
753 pRvlc->conceal_min = FDKmax(0,bnds-offset);
754 return;
755 }
756 dpcm -= TABLE_OFFSET;
757 if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) {
758 if (pRvlc->length_of_rvlc_escapes) {
759 pScfBwd[bnds] = factor;
760 pRvlc->conceal_min = FDKmax(0,bnds-offset);
761 return;
762 }
763 else {
764 if (dpcm == MIN_RVL) {
765 dpcm -= *pScfEsc--;
766 }
767 else {
768 dpcm += *pScfEsc--;
769 }
770 (*pEscBwdCnt)++;
771 if (pRvlc->conceal_min_esc == CONCEAL_MIN_INIT) {
772 pRvlc->conceal_min_esc = FDKmax(0,bnds-offset);
773 }
774 }
775 }
776 pScfBwd[bnds] = factor;
777 factor -= dpcm;
778 pRvlc->firstScf = factor;
779 break;
780 }
781 }
782 }
783 }
784
785
786 /*---------------------------------------------------------------------------------------------
787 function: rvlcFinalErrorDetection
788
789 description: Call RVLC concealment if error was detected in decoding process
790 -----------------------------------------------------------------------------------------------
791 input: - pointer rvlc structure
792 - pointer channel info structure
793 -----------------------------------------------------------------------------------------------
794 return: -
795 -------------------------------------------------------------------------------------------- */
796
797 static
rvlcFinalErrorDetection(CAacDecoderChannelInfo * pAacDecoderChannelInfo,CAacDecoderStaticChannelInfo * pAacDecoderStaticChannelInfo)798 void rvlcFinalErrorDetection (CAacDecoderChannelInfo *pAacDecoderChannelInfo,
799 CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo)
800 {
801 CErRvlcInfo *pRvlc = &pAacDecoderChannelInfo->pComData->overlay.aac.erRvlcInfo;
802 UCHAR ErrorStatusComplete = 0;
803 UCHAR ErrorStatusLengthFwd = 0;
804 UCHAR ErrorStatusLengthBwd = 0;
805 UCHAR ErrorStatusLengthEscapes = 0;
806 UCHAR ErrorStatusFirstScf = 0;
807 UCHAR ErrorStatusLastScf = 0;
808 UCHAR ErrorStatusFirstNrg = 0;
809 UCHAR ErrorStatusLastNrg = 0;
810 UCHAR ErrorStatusFirstIs = 0;
811 UCHAR ErrorStatusLastIs = 0;
812 UCHAR ErrorStatusForbiddenCwFwd = 0;
813 UCHAR ErrorStatusForbiddenCwBwd = 0;
814 UCHAR ErrorStatusNumEscapesFwd = 0;
815 UCHAR ErrorStatusNumEscapesBwd = 0;
816 UCHAR ConcealStatus = 1;
817 UCHAR currentBlockType; /* short: 0, not short: 1*/
818
819 #if VERBOSE_RVLC_OUTPUT
820 CHAR Strategy[60]="No";
821 SHORT conceal_max;
822 SHORT conceal_min;
823 #endif
824
825 pAacDecoderChannelInfo->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK = 1;
826
827 /* invalid escape words, bit counter unequal zero, forbidden codeword detected */
828 if (pRvlc->errorLogRvlc & RVLC_ERROR_FORBIDDEN_CW_DETECTED_FWD)
829 ErrorStatusForbiddenCwFwd = 1;
830
831 if (pRvlc->errorLogRvlc & RVLC_ERROR_FORBIDDEN_CW_DETECTED_BWD)
832 ErrorStatusForbiddenCwBwd = 1;
833
834 /* bit counter forward unequal zero */
835 if (pRvlc->length_of_rvlc_sf_fwd)
836 ErrorStatusLengthFwd = 1;
837
838 /* bit counter backward unequal zero */
839 if (pRvlc->length_of_rvlc_sf_bwd)
840 ErrorStatusLengthBwd = 1;
841
842 /* bit counter escape sequences unequal zero */
843 if (pRvlc->sf_escapes_present)
844 if (pRvlc->length_of_rvlc_escapes)
845 ErrorStatusLengthEscapes = 1;
846
847 if (pRvlc->sf_used) {
848 /* first decoded scf does not match to global gain in backward direction */
849 if (pRvlc->firstScf != (pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain - SF_OFFSET) )
850 ErrorStatusFirstScf = 1;
851
852 /* last decoded scf does not match to rev global gain in forward direction */
853 if (pRvlc->lastScf != (pRvlc->rev_global_gain - SF_OFFSET) )
854 ErrorStatusLastScf = 1;
855 }
856
857 if (pRvlc->noise_used) {
858 /* first decoded nrg does not match to dpcm_noise_nrg in backward direction */
859 if (pRvlc->firstNrg != (pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain + pRvlc->dpcm_noise_nrg - SF_OFFSET -90 - 256) )
860 ErrorStatusFirstNrg = 1;
861
862 /* last decoded nrg does not match to dpcm_noise_last_position in forward direction */
863 if (pRvlc->lastNrg != (pRvlc->rev_global_gain + pRvlc->dpcm_noise_last_position - SF_OFFSET - 90 - 256) )
864 ErrorStatusLastNrg = 1;
865 }
866
867 if (pRvlc->intensity_used) {
868 /* first decoded is position does not match in backward direction */
869 if (pRvlc->firstIs != (-SF_OFFSET) )
870 ErrorStatusFirstIs = 1;
871
872 /* last decoded is position does not match in forward direction */
873 if (pRvlc->lastIs != (pRvlc->dpcm_is_last_position - SF_OFFSET) )
874 ErrorStatusLastIs = 1;
875 }
876
877 /* decoded escapes and used escapes in forward direction do not fit */
878 if ((pRvlc->numDecodedEscapeWordsFwd != pRvlc->numDecodedEscapeWordsEsc) && (pRvlc->conceal_max == CONCEAL_MAX_INIT)) {
879 ErrorStatusNumEscapesFwd = 1;
880 }
881
882 /* decoded escapes and used escapes in backward direction do not fit */
883 if ((pRvlc->numDecodedEscapeWordsBwd != pRvlc->numDecodedEscapeWordsEsc) && (pRvlc->conceal_min == CONCEAL_MIN_INIT)) {
884 ErrorStatusNumEscapesBwd = 1;
885 }
886
887 #if VERBOSE_RVLC_OUTPUT
888 conceal_max = pRvlc->conceal_max;
889 conceal_min = pRvlc->conceal_min;
890 #endif
891
892 if ( ErrorStatusLengthEscapes
893 || (
894 ( (pRvlc->conceal_max == CONCEAL_MAX_INIT)
895 && (pRvlc->numDecodedEscapeWordsFwd != pRvlc->numDecodedEscapeWordsEsc)
896 && (ErrorStatusLastScf || ErrorStatusLastNrg || ErrorStatusLastIs) )
897
898 &&
899
900 ( (pRvlc->conceal_min == CONCEAL_MIN_INIT)
901 && (pRvlc->numDecodedEscapeWordsBwd != pRvlc->numDecodedEscapeWordsEsc)
902 && (ErrorStatusFirstScf || ErrorStatusFirstNrg || ErrorStatusFirstIs) )
903 )
904 || ( (pRvlc->conceal_max == CONCEAL_MAX_INIT)
905 && ((pRvlc->rev_global_gain - SF_OFFSET - pRvlc->lastScf) < -15)
906 )
907 || ( (pRvlc->conceal_min == CONCEAL_MIN_INIT)
908 && ((pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain - SF_OFFSET - pRvlc->firstScf) < -15)
909 )
910 ) {
911 if ((pRvlc->conceal_max == CONCEAL_MAX_INIT) || (pRvlc->conceal_min == CONCEAL_MIN_INIT)) {
912 pRvlc->conceal_max = 0;
913 pRvlc->conceal_min = FDKmax(0, (pRvlc->numWindowGroups-1)*16+pRvlc->maxSfbTransmitted-1);
914 }
915 else {
916 pRvlc->conceal_max = FDKmin(pRvlc->conceal_max,pRvlc->conceal_max_esc);
917 pRvlc->conceal_min = FDKmax(pRvlc->conceal_min,pRvlc->conceal_min_esc);
918 }
919 }
920
921 ErrorStatusComplete = ErrorStatusLastScf || ErrorStatusFirstScf || ErrorStatusLastNrg || ErrorStatusFirstNrg
922 || ErrorStatusLastIs || ErrorStatusFirstIs || ErrorStatusForbiddenCwFwd || ErrorStatusForbiddenCwBwd
923 || ErrorStatusLengthFwd || ErrorStatusLengthBwd || ErrorStatusLengthEscapes || ErrorStatusNumEscapesFwd
924 || ErrorStatusNumEscapesBwd;
925
926 currentBlockType = (GetWindowSequence(&pAacDecoderChannelInfo->icsInfo) == EightShortSequence) ? 0 : 1;
927
928
929 if (!ErrorStatusComplete) {
930 int band;
931 int group;
932 int bnds;
933 int lastSfbIndex;
934
935 lastSfbIndex = (pRvlc->numWindowGroups > 1) ? 16 : 64;
936
937 for (group=0; group < pRvlc->numWindowGroups; group++) {
938 for (band=0; band<pRvlc->maxSfbTransmitted; band++) {
939 bnds = 16*group+band;
940 pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousScaleFactor[bnds] = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds];
941 }
942 }
943
944 for (group=0; group < pRvlc->numWindowGroups; group++)
945 {
946 for (band=0; band<pRvlc->maxSfbTransmitted; band++) {
947 bnds = 16*group+band;
948 pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousCodebook[bnds] = pAacDecoderChannelInfo->pDynData->aCodeBook[bnds];
949 }
950 for (; band <lastSfbIndex; band++) {
951 bnds = 16*group+band;
952 FDK_ASSERT(bnds >= 0 && bnds < RVLC_MAX_SFB);
953 pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousCodebook[bnds] = ZERO_HCB;
954 }
955 }
956 }
957 else {
958 int band;
959 int group;
960
961 /* A single bit error was detected in decoding of dpcm values. It also could be an error with more bits in decoding
962 of escapes and dpcm values whereby an illegal codeword followed not directly after the corrupted bits but just
963 after decoding some more (wrong) scalefactors. Use the smaller scalefactor from forward decoding, backward decoding
964 and previous frame. */
965 if ( ((pRvlc->conceal_min != CONCEAL_MIN_INIT) || (pRvlc->conceal_max != CONCEAL_MAX_INIT)) && (pRvlc->conceal_min <= pRvlc->conceal_max)
966 && (pAacDecoderStaticChannelInfo->concealmentInfo.rvlcPreviousBlockType == currentBlockType) && pAacDecoderStaticChannelInfo->concealmentInfo.rvlcPreviousScaleFactorOK
967 && pRvlc->sf_concealment && ConcealStatus )
968 {
969 BidirectionalEstimation_UseScfOfPrevFrameAsReference (pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo);
970 ConcealStatus=0;
971 #if VERBOSE_RVLC_OUTPUT
972 FDKstrcpy(Strategy,"Yes (BidirectionalEstimation_UseScfOfPrevFrameAsReference)");
973 #endif
974 }
975
976 /* A single bit error was detected in decoding of dpcm values. It also could be an error with more bits in decoding
977 of escapes and dpcm values whereby an illegal codeword followed not directly after the corrupted bits but just
978 after decoding some more (wrong) scalefactors. Use the smaller scalefactor from forward and backward decoding. */
979 if ( (pRvlc->conceal_min <= pRvlc->conceal_max) && ((pRvlc->conceal_min != CONCEAL_MIN_INIT) || (pRvlc->conceal_max != CONCEAL_MAX_INIT))
980 && !(pAacDecoderStaticChannelInfo->concealmentInfo.rvlcPreviousScaleFactorOK && pRvlc->sf_concealment && (pAacDecoderStaticChannelInfo->concealmentInfo.rvlcPreviousBlockType == currentBlockType))
981 && ConcealStatus )
982 {
983 BidirectionalEstimation_UseLowerScfOfCurrentFrame (pAacDecoderChannelInfo);
984 ConcealStatus=0;
985 #if VERBOSE_RVLC_OUTPUT
986 FDKstrcpy(Strategy,"Yes (BidirectionalEstimation_UseLowerScfOfCurrentFrame)");
987 #endif
988 }
989
990 /* No errors were detected in decoding of escapes and dpcm values however the first and last value
991 of a group (is,nrg,sf) is incorrect */
992 if ( (pRvlc->conceal_min <= pRvlc->conceal_max) && ((ErrorStatusLastScf && ErrorStatusFirstScf)
993 || (ErrorStatusLastNrg && ErrorStatusFirstNrg) || (ErrorStatusLastIs && ErrorStatusFirstIs))
994 && !(ErrorStatusForbiddenCwFwd || ErrorStatusForbiddenCwBwd || ErrorStatusLengthEscapes ) && ConcealStatus)
995 {
996 StatisticalEstimation (pAacDecoderChannelInfo);
997 ConcealStatus=0;
998 #if VERBOSE_RVLC_OUTPUT
999 FDKstrcpy(Strategy,"Yes (StatisticalEstimation)");
1000 #endif
1001 }
1002
1003 /* A error with more bits in decoding of escapes and dpcm values was detected. Use the smaller scalefactor from forward
1004 decoding, backward decoding and previous frame. */
1005 if ( (pRvlc->conceal_min <= pRvlc->conceal_max) && pAacDecoderStaticChannelInfo->concealmentInfo.rvlcPreviousScaleFactorOK && pRvlc->sf_concealment
1006 && (pAacDecoderStaticChannelInfo->concealmentInfo.rvlcPreviousBlockType == currentBlockType) && ConcealStatus )
1007 {
1008 PredictiveInterpolation(pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo);
1009 ConcealStatus=0;
1010 #if VERBOSE_RVLC_OUTPUT
1011 FDKstrcpy(Strategy,"Yes (PredictiveInterpolation)");
1012 #endif
1013 }
1014
1015 /* Call frame concealment, because no better strategy was found. Setting the scalefactors to zero is done for debugging
1016 purposes */
1017 if (ConcealStatus) {
1018 for (group=0; group < pRvlc->numWindowGroups; group++) {
1019 for (band=0; band<pRvlc->maxSfbTransmitted; band++) {
1020 pAacDecoderChannelInfo->pDynData->aScaleFactor[16*group+band] = 0;
1021 }
1022 }
1023 pAacDecoderChannelInfo->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK = 0;
1024 #if VERBOSE_RVLC_OUTPUT
1025 FDKstrcpy(Strategy,"Yes (FrameConcealment)");
1026 #endif
1027 }
1028 }
1029
1030 #if VERBOSE_RVLC_OUTPUT
1031 DebugOutputDistortedBitstreams(pRvlc,pAacDecoderChannelInfo,ErrorStatusLengthFwd,ErrorStatusLengthBwd,
1032 ErrorStatusLengthEscapes,ErrorStatusFirstScf,ErrorStatusLastScf,
1033 ErrorStatusFirstNrg,ErrorStatusLastNrg,ErrorStatusFirstIs,ErrorStatusLastIs,
1034 ErrorStatusForbiddenCwFwd,ErrorStatusForbiddenCwBwd,ErrorStatusNumEscapesFwd,
1035 ErrorStatusNumEscapesBwd,conceal_max,conceal_min,Strategy);
1036 #endif
1037 }
1038
1039
1040 /*---------------------------------------------------------------------------------------------
1041 function: CRvlc_Read
1042
1043 description: Read RVLC ESC1 data (side info) from bitstream.
1044 -----------------------------------------------------------------------------------------------
1045 input: - pointer rvlc structure
1046 - pointer channel info structure
1047 - pointer bitstream structure
1048 -----------------------------------------------------------------------------------------------
1049 return: -
1050 -------------------------------------------------------------------------------------------- */
1051
CRvlc_Read(CAacDecoderChannelInfo * pAacDecoderChannelInfo,HANDLE_FDK_BITSTREAM bs)1052 void CRvlc_Read (
1053 CAacDecoderChannelInfo *pAacDecoderChannelInfo,
1054 HANDLE_FDK_BITSTREAM bs)
1055 {
1056 CErRvlcInfo *pRvlc = &pAacDecoderChannelInfo->pComData->overlay.aac.erRvlcInfo;
1057
1058 int group,band;
1059
1060 /* RVLC long specific initialization Init part 1 of 2 */
1061 pRvlc->numWindowGroups = GetWindowGroups(&pAacDecoderChannelInfo->icsInfo);
1062 pRvlc->maxSfbTransmitted = GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo);
1063 pRvlc->noise_used = 0; /* noise detection */
1064 pRvlc->dpcm_noise_nrg = 0; /* only for debugging */
1065 pRvlc->dpcm_noise_last_position = 0; /* only for debugging */
1066 pRvlc->length_of_rvlc_escapes = -1; /* default value is used for error detection and concealment */
1067
1068 /* read only error sensitivity class 1 data (ESC 1 - data) */
1069 pRvlc->sf_concealment = FDKreadBits(bs,1); /* #1 */
1070 pRvlc->rev_global_gain = FDKreadBits(bs,8); /* #2 */
1071
1072 if (GetWindowSequence(&pAacDecoderChannelInfo->icsInfo) == EightShortSequence) {
1073 pRvlc->length_of_rvlc_sf = FDKreadBits(bs,11); /* #3 */
1074 }
1075 else {
1076 pRvlc->length_of_rvlc_sf = FDKreadBits(bs,9); /* #3 */
1077 }
1078
1079 /* check if noise codebook is used */
1080 for (group = 0; group < pRvlc->numWindowGroups; group++) {
1081 for (band=0; band < pRvlc->maxSfbTransmitted; band++) {
1082 if (pAacDecoderChannelInfo->pDynData->aCodeBook[16*group+band] == NOISE_HCB) {
1083 pRvlc->noise_used = 1;
1084 break;
1085 }
1086 }
1087 }
1088
1089 if (pRvlc->noise_used)
1090 pRvlc->dpcm_noise_nrg = FDKreadBits(bs, 9); /* #4 PNS */
1091
1092 pRvlc->sf_escapes_present = FDKreadBits(bs, 1); /* #5 */
1093
1094 if ( pRvlc->sf_escapes_present) {
1095 pRvlc->length_of_rvlc_escapes = FDKreadBits(bs, 8); /* #6 */
1096 }
1097
1098 if (pRvlc->noise_used) {
1099 pRvlc->dpcm_noise_last_position = FDKreadBits(bs, 9); /* #7 PNS */
1100 pRvlc->length_of_rvlc_sf -= 9;
1101 }
1102
1103 pRvlc->length_of_rvlc_sf_fwd = pRvlc->length_of_rvlc_sf;
1104 pRvlc->length_of_rvlc_sf_bwd = pRvlc->length_of_rvlc_sf;
1105 }
1106
1107
1108 /*---------------------------------------------------------------------------------------------
1109 function: CRvlc_Decode
1110
1111 description: Decode rvlc data
1112 The function reads both the escape sequences and the scalefactors in forward
1113 and backward direction. If an error occured during decoding process which can
1114 not be concealed with the rvlc concealment frame concealment will be initiated.
1115 Then the element "rvlcCurrentScaleFactorOK" in the decoder channel info is set
1116 to 0 otherwise it is set to 1.
1117 -----------------------------------------------------------------------------------------------
1118 input: - pointer rvlc structure
1119 - pointer channel info structure
1120 - pointer to persistent channel info structure
1121 - pointer bitstream structure
1122 -----------------------------------------------------------------------------------------------
1123 return: ErrorStatus = AAC_DEC_OK
1124 -------------------------------------------------------------------------------------------- */
1125
CRvlc_Decode(CAacDecoderChannelInfo * pAacDecoderChannelInfo,CAacDecoderStaticChannelInfo * pAacDecoderStaticChannelInfo,HANDLE_FDK_BITSTREAM bs)1126 void CRvlc_Decode (
1127 CAacDecoderChannelInfo *pAacDecoderChannelInfo,
1128 CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo,
1129 HANDLE_FDK_BITSTREAM bs
1130 )
1131 {
1132 CErRvlcInfo *pRvlc = &pAacDecoderChannelInfo->pComData->overlay.aac.erRvlcInfo;
1133 INT bitCntOffst;
1134 UINT saveBitCnt;
1135
1136 rvlcInit(pRvlc,pAacDecoderChannelInfo,bs);
1137
1138 /* save bitstream position */
1139 saveBitCnt = FDKgetBitCnt(bs);
1140
1141 #if RVLC_ADVANCED_BITSTREAM_ERROR_GENERATOR_SF
1142 GenerateSingleBitError(pRvlc,
1143 &(pRvlc->bitstreamIndexRvlFwd),
1144 pRvlc->length_of_rvlc_sf,
1145 0);
1146 #endif
1147
1148 #if RVLC_ADVANCED_BITSTREAM_ERROR_GENERATOR_ESC
1149 if (pRvlc->sf_escapes_present)
1150 GenerateSingleBitError(pRvlc,
1151 &(pRvlc->bitstreamIndexEsc),
1152 pRvlc->length_of_rvlc_escapes,
1153 1);
1154 #endif
1155
1156 if ( pRvlc->sf_escapes_present)
1157 rvlcDecodeEscapes(pRvlc, pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfEsc, bs);
1158
1159 rvlcDecodeForward(pRvlc,pAacDecoderChannelInfo, bs);
1160 rvlcDecodeBackward(pRvlc,pAacDecoderChannelInfo, bs);
1161 rvlcFinalErrorDetection(pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo);
1162
1163 pAacDecoderChannelInfo->pDynData->specificTo.aac.rvlcIntensityUsed = pRvlc->intensity_used;
1164 pAacDecoderChannelInfo->data.aac.PnsData.PnsActive = pRvlc->noise_used;
1165
1166 /* restore bitstream position */
1167 bitCntOffst = saveBitCnt - FDKgetBitCnt(bs);
1168 if( bitCntOffst ) {
1169 FDKpushBiDirectional(bs, bitCntOffst);
1170 }
1171 }
1172
CRvlc_ElementCheck(CAacDecoderChannelInfo * pAacDecoderChannelInfo[],CAacDecoderStaticChannelInfo * pAacDecoderStaticChannelInfo[],const UINT flags,const INT elChannels)1173 void CRvlc_ElementCheck (
1174 CAacDecoderChannelInfo *pAacDecoderChannelInfo[],
1175 CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[],
1176 const UINT flags,
1177 const INT elChannels
1178 )
1179 {
1180 int ch;
1181
1182 /* Required for MPS residuals. */
1183 if (pAacDecoderStaticChannelInfo == NULL) {
1184 return;
1185 }
1186
1187 /* RVLC specific sanity checks */
1188 if ( (flags & AC_ER_RVLC) && (elChannels == 2)) { /* to be reviewed */
1189 if ( ( (pAacDecoderChannelInfo[0]->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK == 0) ||
1190 (pAacDecoderChannelInfo[1]->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK == 0) )
1191 && pAacDecoderChannelInfo[0]->pComData->jointStereoData.MsMaskPresent ) {
1192 pAacDecoderChannelInfo[0]->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK = 0;
1193 pAacDecoderChannelInfo[1]->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK = 0;
1194 }
1195
1196 if ( (pAacDecoderChannelInfo[0]->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK == 0)
1197 && (pAacDecoderChannelInfo[1]->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK == 1)
1198 && (pAacDecoderChannelInfo[1]->pDynData->specificTo.aac.rvlcIntensityUsed == 1) ){
1199 pAacDecoderChannelInfo[1]->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK = 0;
1200 }
1201 }
1202
1203 for (ch = 0; ch < elChannels; ch ++)
1204 {
1205 pAacDecoderStaticChannelInfo[ch]->concealmentInfo.rvlcPreviousBlockType = (GetWindowSequence(&pAacDecoderChannelInfo[ch]->icsInfo) == EightShortSequence) ? 0 : 1;
1206 if (flags & AC_ER_RVLC) {
1207 pAacDecoderStaticChannelInfo[ch]->concealmentInfo.rvlcPreviousScaleFactorOK = pAacDecoderChannelInfo[ch]->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK;
1208 }
1209 else {
1210 pAacDecoderStaticChannelInfo[ch]->concealmentInfo.rvlcPreviousScaleFactorOK = 0;
1211 }
1212 }
1213 }
1214
1215
1216