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):
98 
99    Description:
100 
101 *******************************************************************************/
102 
103 /*!
104   \file
105   \brief  rvlc concealment
106   \author Josef Hoepfl
107 */
108 
109 #include "rvlcconceal.h"
110 
111 #include "block.h"
112 #include "rvlc.h"
113 
114 /*---------------------------------------------------------------------------------------------
115   function:      calcRefValFwd
116 
117   description:   The function determines the scalefactor which is closed to the
118 scalefactorband conceal_min. The same is done for intensity data and noise
119 energies.
120 -----------------------------------------------------------------------------------------------
121   output:        - reference value scf
122                  - reference value internsity data
123                  - reference value noise energy
124 -----------------------------------------------------------------------------------------------
125   return:        -
126 --------------------------------------------------------------------------------------------
127 */
128 
129 static void calcRefValFwd(CErRvlcInfo *pRvlc,
130                           CAacDecoderChannelInfo *pAacDecoderChannelInfo,
131                           int *refIsFwd, int *refNrgFwd, int *refScfFwd) {
132   int band, bnds, group, startBand;
133   int idIs, idNrg, idScf;
134   int conceal_min, conceal_group_min;
135   int MaximumScaleFactorBands;
136 
137   if (GetWindowSequence(&pAacDecoderChannelInfo->icsInfo) == BLOCK_SHORT)
138     MaximumScaleFactorBands = 16;
139   else
140     MaximumScaleFactorBands = 64;
141 
142   conceal_min = pRvlc->conceal_min % MaximumScaleFactorBands;
143   conceal_group_min = pRvlc->conceal_min / MaximumScaleFactorBands;
144 
145   /* calculate first reference value for approach in forward direction */
146   idIs = idNrg = idScf = 1;
147 
148   /* set reference values */
149   *refIsFwd = -SF_OFFSET;
150   *refNrgFwd = pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain -
151                SF_OFFSET - 90 - 256;
152   *refScfFwd =
153       pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain - SF_OFFSET;
154 
155   startBand = conceal_min - 1;
156   for (group = conceal_group_min; group >= 0; group--) {
157     for (band = startBand; band >= 0; band--) {
158       bnds = 16 * group + band;
159       switch (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]) {
160         case ZERO_HCB:
161           break;
162         case INTENSITY_HCB:
163         case INTENSITY_HCB2:
164           if (idIs) {
165             *refIsFwd =
166                 pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds];
167             idIs = 0; /* reference value has been set */
168           }
169           break;
170         case NOISE_HCB:
171           if (idNrg) {
172             *refNrgFwd =
173                 pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds];
174             idNrg = 0; /* reference value has been set */
175           }
176           break;
177         default:
178           if (idScf) {
179             *refScfFwd =
180                 pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds];
181             idScf = 0; /* reference value has been set */
182           }
183           break;
184       }
185     }
186     startBand = pRvlc->maxSfbTransmitted - 1;
187   }
188 }
189 
190 /*---------------------------------------------------------------------------------------------
191   function:      calcRefValBwd
192 
193   description:   The function determines the scalefactor which is closed to the
194 scalefactorband conceal_max. The same is done for intensity data and noise
195 energies.
196 -----------------------------------------------------------------------------------------------
197   output:        - reference value scf
198                  - reference value internsity data
199                  - reference value noise energy
200 -----------------------------------------------------------------------------------------------
201   return:        -
202 --------------------------------------------------------------------------------------------
203 */
204 
205 static void calcRefValBwd(CErRvlcInfo *pRvlc,
206                           CAacDecoderChannelInfo *pAacDecoderChannelInfo,
207                           int *refIsBwd, int *refNrgBwd, int *refScfBwd) {
208   int band, bnds, group, startBand;
209   int idIs, idNrg, idScf;
210   int conceal_max, conceal_group_max;
211   int MaximumScaleFactorBands;
212 
213   if (GetWindowSequence(&pAacDecoderChannelInfo->icsInfo) == BLOCK_SHORT)
214     MaximumScaleFactorBands = 16;
215   else
216     MaximumScaleFactorBands = 64;
217 
218   conceal_max = pRvlc->conceal_max % MaximumScaleFactorBands;
219   conceal_group_max = pRvlc->conceal_max / MaximumScaleFactorBands;
220 
221   /* calculate first reference value for approach in backward direction */
222   idIs = idNrg = idScf = 1;
223 
224   /* set reference values */
225   *refIsBwd = pRvlc->dpcm_is_last_position - SF_OFFSET;
226   *refNrgBwd = pRvlc->rev_global_gain + pRvlc->dpcm_noise_last_position -
227                SF_OFFSET - 90 - 256 + pRvlc->dpcm_noise_nrg;
228   *refScfBwd = pRvlc->rev_global_gain - SF_OFFSET;
229 
230   startBand = conceal_max + 1;
231 
232   /* if needed, re-set reference values */
233   for (group = conceal_group_max; group < pRvlc->numWindowGroups; group++) {
234     for (band = startBand; band < pRvlc->maxSfbTransmitted; band++) {
235       bnds = 16 * group + band;
236       switch (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]) {
237         case ZERO_HCB:
238           break;
239         case INTENSITY_HCB:
240         case INTENSITY_HCB2:
241           if (idIs) {
242             *refIsBwd =
243                 pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds];
244             idIs = 0; /* reference value has been set */
245           }
246           break;
247         case NOISE_HCB:
248           if (idNrg) {
249             *refNrgBwd =
250                 pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds];
251             idNrg = 0; /* reference value has been set */
252           }
253           break;
254         default:
255           if (idScf) {
256             *refScfBwd =
257                 pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds];
258             idScf = 0; /* reference value has been set */
259           }
260           break;
261       }
262     }
263     startBand = 0;
264   }
265 }
266 
267 /*---------------------------------------------------------------------------------------------
268   function:      BidirectionalEstimation_UseLowerScfOfCurrentFrame
269 
270   description:   This approach by means of bidirectional estimation is generally
271 performed when a single bit error has been detected, the bit error can be
272 isolated between 'conceal_min' and 'conceal_max' and the 'sf_concealment' flag
273 is not set. The sets of scalefactors decoded in forward and backward direction
274 are compared with each other. The smaller scalefactor will be considered as the
275 correct one respectively. The reconstruction of the scalefactors with this
276 approach archieve good results in audio quality. The strategy must be applied to
277 scalefactors, intensity data and noise energy seperately.
278 -----------------------------------------------------------------------------------------------
279   output:        Concealed scalefactor, noise energy and intensity data between
280 conceal_min and conceal_max
281 -----------------------------------------------------------------------------------------------
282   return:        -
283 --------------------------------------------------------------------------------------------
284 */
285 
286 void BidirectionalEstimation_UseLowerScfOfCurrentFrame(
287     CAacDecoderChannelInfo *pAacDecoderChannelInfo) {
288   CErRvlcInfo *pRvlc =
289       &pAacDecoderChannelInfo->pComData->overlay.aac.erRvlcInfo;
290   int band, bnds, startBand, endBand, group;
291   int conceal_min, conceal_max;
292   int conceal_group_min, conceal_group_max;
293   int MaximumScaleFactorBands;
294 
295   if (GetWindowSequence(&pAacDecoderChannelInfo->icsInfo) == BLOCK_SHORT) {
296     MaximumScaleFactorBands = 16;
297   } else {
298     MaximumScaleFactorBands = 64;
299   }
300 
301   /* If an error was detected just in forward or backward direction, set the
302      corresponding border for concealment to a appropriate scalefactor band. The
303      border is set to first or last sfb respectively, because the error will
304      possibly not follow directly after the corrupt bit but just after decoding
305      some more (wrong) scalefactors. */
306   if (pRvlc->conceal_min == CONCEAL_MIN_INIT) pRvlc->conceal_min = 0;
307 
308   if (pRvlc->conceal_max == CONCEAL_MAX_INIT)
309     pRvlc->conceal_max =
310         (pRvlc->numWindowGroups - 1) * 16 + pRvlc->maxSfbTransmitted - 1;
311 
312   conceal_min = pRvlc->conceal_min % MaximumScaleFactorBands;
313   conceal_group_min = pRvlc->conceal_min / MaximumScaleFactorBands;
314   conceal_max = pRvlc->conceal_max % MaximumScaleFactorBands;
315   conceal_group_max = pRvlc->conceal_max / MaximumScaleFactorBands;
316 
317   if (pRvlc->conceal_min == pRvlc->conceal_max) {
318     int refIsFwd, refNrgFwd, refScfFwd;
319     int refIsBwd, refNrgBwd, refScfBwd;
320 
321     bnds = pRvlc->conceal_min;
322     calcRefValFwd(pRvlc, pAacDecoderChannelInfo, &refIsFwd, &refNrgFwd,
323                   &refScfFwd);
324     calcRefValBwd(pRvlc, pAacDecoderChannelInfo, &refIsBwd, &refNrgBwd,
325                   &refScfBwd);
326 
327     switch (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]) {
328       case ZERO_HCB:
329         break;
330       case INTENSITY_HCB:
331       case INTENSITY_HCB2:
332         if (refIsFwd < refIsBwd)
333           pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = refIsFwd;
334         else
335           pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = refIsBwd;
336         break;
337       case NOISE_HCB:
338         if (refNrgFwd < refNrgBwd)
339           pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = refNrgFwd;
340         else
341           pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = refNrgBwd;
342         break;
343       default:
344         if (refScfFwd < refScfBwd)
345           pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = refScfFwd;
346         else
347           pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = refScfBwd;
348         break;
349     }
350   } else {
351     pAacDecoderChannelInfo->pComData->overlay.aac
352         .aRvlcScfFwd[pRvlc->conceal_max] =
353         pAacDecoderChannelInfo->pComData->overlay.aac
354             .aRvlcScfBwd[pRvlc->conceal_max];
355     pAacDecoderChannelInfo->pComData->overlay.aac
356         .aRvlcScfBwd[pRvlc->conceal_min] =
357         pAacDecoderChannelInfo->pComData->overlay.aac
358             .aRvlcScfFwd[pRvlc->conceal_min];
359 
360     /* consider the smaller of the forward and backward decoded value as the
361      * correct one */
362     startBand = conceal_min;
363     if (conceal_group_min == conceal_group_max)
364       endBand = conceal_max;
365     else
366       endBand = pRvlc->maxSfbTransmitted - 1;
367 
368     for (group = conceal_group_min; group <= conceal_group_max; group++) {
369       for (band = startBand; band <= endBand; band++) {
370         bnds = 16 * group + band;
371         if (pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds] <
372             pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds])
373           pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] =
374               pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds];
375         else
376           pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] =
377               pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds];
378       }
379       startBand = 0;
380       if ((group + 1) == conceal_group_max) endBand = conceal_max;
381     }
382   }
383 
384   /* now copy all data to the output buffer which needs not to be concealed */
385   if (conceal_group_min == 0)
386     endBand = conceal_min;
387   else
388     endBand = pRvlc->maxSfbTransmitted;
389   for (group = 0; group <= conceal_group_min; group++) {
390     for (band = 0; band < endBand; band++) {
391       bnds = 16 * group + band;
392       pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] =
393           pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds];
394     }
395     if ((group + 1) == conceal_group_min) endBand = conceal_min;
396   }
397 
398   startBand = conceal_max + 1;
399   for (group = conceal_group_max; group < pRvlc->numWindowGroups; group++) {
400     for (band = startBand; band < pRvlc->maxSfbTransmitted; band++) {
401       bnds = 16 * group + band;
402       pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] =
403           pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds];
404     }
405     startBand = 0;
406   }
407 }
408 
409 /*---------------------------------------------------------------------------------------------
410   function:      BidirectionalEstimation_UseScfOfPrevFrameAsReference
411 
412   description:   This approach by means of bidirectional estimation is generally
413 performed when a single bit error has been detected, the bit error can be
414 isolated between 'conceal_min' and 'conceal_max', the 'sf_concealment' flag is
415 set and the previous frame has the same block type as the current frame. The
416 scalefactor decoded in forward and backward direction and the scalefactor of the
417 previous frame are compared with each other. The smaller scalefactor will be
418 considered as the correct one. At this the codebook of the previous and current
419 frame must be of the same set (scf, nrg, is) in each scalefactorband. Otherwise
420 the scalefactor of the previous frame is not considered in the minimum
421 calculation. The reconstruction of the scalefactors with this approach archieve
422 good results in audio quality. The strategy must be applied to scalefactors,
423 intensity data and noise energy seperately.
424 -----------------------------------------------------------------------------------------------
425   output:        Concealed scalefactor, noise energy and intensity data between
426 conceal_min and conceal_max
427 -----------------------------------------------------------------------------------------------
428   return:        -
429 --------------------------------------------------------------------------------------------
430 */
431 
432 void BidirectionalEstimation_UseScfOfPrevFrameAsReference(
433     CAacDecoderChannelInfo *pAacDecoderChannelInfo,
434     CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo) {
435   CErRvlcInfo *pRvlc =
436       &pAacDecoderChannelInfo->pComData->overlay.aac.erRvlcInfo;
437   int band, bnds, startBand, endBand, group;
438   int conceal_min, conceal_max;
439   int conceal_group_min, conceal_group_max;
440   int MaximumScaleFactorBands;
441   SHORT commonMin;
442 
443   if (GetWindowSequence(&pAacDecoderChannelInfo->icsInfo) == BLOCK_SHORT) {
444     MaximumScaleFactorBands = 16;
445   } else {
446     MaximumScaleFactorBands = 64;
447   }
448 
449   /* If an error was detected just in forward or backward direction, set the
450      corresponding border for concealment to a appropriate scalefactor band. The
451      border is set to first or last sfb respectively, because the error will
452      possibly not follow directly after the corrupt bit but just after decoding
453      some more (wrong) scalefactors. */
454   if (pRvlc->conceal_min == CONCEAL_MIN_INIT) pRvlc->conceal_min = 0;
455 
456   if (pRvlc->conceal_max == CONCEAL_MAX_INIT)
457     pRvlc->conceal_max =
458         (pRvlc->numWindowGroups - 1) * 16 + pRvlc->maxSfbTransmitted - 1;
459 
460   conceal_min = pRvlc->conceal_min % MaximumScaleFactorBands;
461   conceal_group_min = pRvlc->conceal_min / MaximumScaleFactorBands;
462   conceal_max = pRvlc->conceal_max % MaximumScaleFactorBands;
463   conceal_group_max = pRvlc->conceal_max / MaximumScaleFactorBands;
464 
465   pAacDecoderChannelInfo->pComData->overlay.aac
466       .aRvlcScfFwd[pRvlc->conceal_max] =
467       pAacDecoderChannelInfo->pComData->overlay.aac
468           .aRvlcScfBwd[pRvlc->conceal_max];
469   pAacDecoderChannelInfo->pComData->overlay.aac
470       .aRvlcScfBwd[pRvlc->conceal_min] =
471       pAacDecoderChannelInfo->pComData->overlay.aac
472           .aRvlcScfFwd[pRvlc->conceal_min];
473 
474   /* consider the smaller of the forward and backward decoded value as the
475    * correct one */
476   startBand = conceal_min;
477   if (conceal_group_min == conceal_group_max)
478     endBand = conceal_max;
479   else
480     endBand = pRvlc->maxSfbTransmitted - 1;
481 
482   for (group = conceal_group_min; group <= conceal_group_max; group++) {
483     for (band = startBand; band <= endBand; band++) {
484       bnds = 16 * group + band;
485       switch (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]) {
486         case ZERO_HCB:
487           pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = 0;
488           break;
489 
490         case INTENSITY_HCB:
491         case INTENSITY_HCB2:
492           if ((pAacDecoderStaticChannelInfo->concealmentInfo
493                    .aRvlcPreviousCodebook[bnds] == INTENSITY_HCB) ||
494               (pAacDecoderStaticChannelInfo->concealmentInfo
495                    .aRvlcPreviousCodebook[bnds] == INTENSITY_HCB2)) {
496             commonMin = fMin(
497                 pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds],
498                 pAacDecoderChannelInfo->pComData->overlay.aac
499                     .aRvlcScfBwd[bnds]);
500             pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] =
501                 fMin(commonMin, pAacDecoderStaticChannelInfo->concealmentInfo
502                                     .aRvlcPreviousScaleFactor[bnds]);
503           } else {
504             pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = fMin(
505                 pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds],
506                 pAacDecoderChannelInfo->pComData->overlay.aac
507                     .aRvlcScfBwd[bnds]);
508           }
509           break;
510 
511         case NOISE_HCB:
512           if (pAacDecoderStaticChannelInfo->concealmentInfo
513                   .aRvlcPreviousCodebook[bnds] == NOISE_HCB) {
514             commonMin = fMin(
515                 pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds],
516                 pAacDecoderChannelInfo->pComData->overlay.aac
517                     .aRvlcScfBwd[bnds]);
518             pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] =
519                 fMin(commonMin, pAacDecoderStaticChannelInfo->concealmentInfo
520                                     .aRvlcPreviousScaleFactor[bnds]);
521           } else {
522             pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = fMin(
523                 pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds],
524                 pAacDecoderChannelInfo->pComData->overlay.aac
525                     .aRvlcScfBwd[bnds]);
526           }
527           break;
528 
529         default:
530           if ((pAacDecoderStaticChannelInfo->concealmentInfo
531                    .aRvlcPreviousCodebook[bnds] != ZERO_HCB) &&
532               (pAacDecoderStaticChannelInfo->concealmentInfo
533                    .aRvlcPreviousCodebook[bnds] != NOISE_HCB) &&
534               (pAacDecoderStaticChannelInfo->concealmentInfo
535                    .aRvlcPreviousCodebook[bnds] != INTENSITY_HCB) &&
536               (pAacDecoderStaticChannelInfo->concealmentInfo
537                    .aRvlcPreviousCodebook[bnds] != INTENSITY_HCB2)) {
538             commonMin = fMin(
539                 pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds],
540                 pAacDecoderChannelInfo->pComData->overlay.aac
541                     .aRvlcScfBwd[bnds]);
542             pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] =
543                 fMin(commonMin, pAacDecoderStaticChannelInfo->concealmentInfo
544                                     .aRvlcPreviousScaleFactor[bnds]);
545           } else {
546             pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = fMin(
547                 pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds],
548                 pAacDecoderChannelInfo->pComData->overlay.aac
549                     .aRvlcScfBwd[bnds]);
550           }
551           break;
552       }
553     }
554     startBand = 0;
555     if ((group + 1) == conceal_group_max) endBand = conceal_max;
556   }
557 
558   /* now copy all data to the output buffer which needs not to be concealed */
559   if (conceal_group_min == 0)
560     endBand = conceal_min;
561   else
562     endBand = pRvlc->maxSfbTransmitted;
563   for (group = 0; group <= conceal_group_min; group++) {
564     for (band = 0; band < endBand; band++) {
565       bnds = 16 * group + band;
566       pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] =
567           pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds];
568     }
569     if ((group + 1) == conceal_group_min) endBand = conceal_min;
570   }
571 
572   startBand = conceal_max + 1;
573   for (group = conceal_group_max; group < pRvlc->numWindowGroups; group++) {
574     for (band = startBand; band < pRvlc->maxSfbTransmitted; band++) {
575       bnds = 16 * group + band;
576       pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] =
577           pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds];
578     }
579     startBand = 0;
580   }
581 }
582 
583 /*---------------------------------------------------------------------------------------------
584   function:      StatisticalEstimation
585 
586   description:   This approach by means of statistical estimation is generally
587 performed when both the start value and the end value are different and no
588 further errors have been detected. Considering the forward and backward decoded
589 scalefactors, the set with the lower scalefactors in sum will be considered as
590 the correct one. The scalefactors are differentially encoded. Normally it would
591 reach to compare one pair of the forward and backward decoded scalefactors to
592 specify the lower set. But having detected no further errors does not
593 necessarily mean the absence of errors. Therefore all scalefactors decoded in
594 forward and backward direction are summed up seperately. The set with the lower
595 sum will be used. The strategy must be applied to scalefactors, intensity data
596 and noise energy seperately.
597 -----------------------------------------------------------------------------------------------
598   output:        Concealed scalefactor, noise energy and intensity data
599 -----------------------------------------------------------------------------------------------
600   return:        -
601 --------------------------------------------------------------------------------------------
602 */
603 
604 void StatisticalEstimation(CAacDecoderChannelInfo *pAacDecoderChannelInfo) {
605   CErRvlcInfo *pRvlc =
606       &pAacDecoderChannelInfo->pComData->overlay.aac.erRvlcInfo;
607   int band, bnds, group;
608   int sumIsFwd, sumIsBwd;   /* sum of intensity data forward/backward */
609   int sumNrgFwd, sumNrgBwd; /* sum of noise energy data forward/backward */
610   int sumScfFwd, sumScfBwd; /* sum of scalefactor data forward/backward */
611   int useIsFwd, useNrgFwd, useScfFwd; /* the flags signals the elements which
612                                          are used for the final result */
613 
614   sumIsFwd = sumIsBwd = sumNrgFwd = sumNrgBwd = sumScfFwd = sumScfBwd = 0;
615   useIsFwd = useNrgFwd = useScfFwd = 0;
616 
617   /* calculate sum of each group (scf,nrg,is) of forward and backward direction
618    */
619   for (group = 0; group < pRvlc->numWindowGroups; group++) {
620     for (band = 0; band < pRvlc->maxSfbTransmitted; band++) {
621       bnds = 16 * group + band;
622       switch (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]) {
623         case ZERO_HCB:
624           break;
625 
626         case INTENSITY_HCB:
627         case INTENSITY_HCB2:
628           sumIsFwd +=
629               pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds];
630           sumIsBwd +=
631               pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds];
632           break;
633 
634         case NOISE_HCB:
635           sumNrgFwd +=
636               pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds];
637           sumNrgBwd +=
638               pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds];
639           break;
640 
641         default:
642           sumScfFwd +=
643               pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds];
644           sumScfBwd +=
645               pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds];
646           break;
647       }
648     }
649   }
650 
651   /* find for each group (scf,nrg,is) the correct direction */
652   if (sumIsFwd < sumIsBwd) useIsFwd = 1;
653 
654   if (sumNrgFwd < sumNrgBwd) useNrgFwd = 1;
655 
656   if (sumScfFwd < sumScfBwd) useScfFwd = 1;
657 
658   /* conceal each group (scf,nrg,is) */
659   for (group = 0; group < pRvlc->numWindowGroups; group++) {
660     for (band = 0; band < pRvlc->maxSfbTransmitted; band++) {
661       bnds = 16 * group + band;
662       switch (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]) {
663         case ZERO_HCB:
664           break;
665 
666         case INTENSITY_HCB:
667         case INTENSITY_HCB2:
668           if (useIsFwd)
669             pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] =
670                 pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds];
671           else
672             pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] =
673                 pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds];
674           break;
675 
676         case NOISE_HCB:
677           if (useNrgFwd)
678             pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] =
679                 pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds];
680           else
681             pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] =
682                 pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds];
683           break;
684 
685         default:
686           if (useScfFwd)
687             pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] =
688                 pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds];
689           else
690             pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] =
691                 pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds];
692           break;
693       }
694     }
695   }
696 }
697 
698 /*---------------------------------------------------------------------------------------------
699   description:   Approach by means of predictive interpolation
700                  This approach by means of predictive estimation is generally
701 performed when the error cannot be isolated between 'conceal_min' and
702 'conceal_max', the 'sf_concealment' flag is set and the previous frame has the
703 same block type as the current frame. Check for each scalefactorband if the same
704 type of data (scalefactor, internsity data, noise energies) is transmitted. If
705 so use the scalefactor (intensity data, noise energy) in the current frame.
706 Otherwise set the scalefactor (intensity data, noise energy) for this
707 scalefactorband to zero.
708 -----------------------------------------------------------------------------------------------
709   output:        Concealed scalefactor, noise energy and intensity data
710 -----------------------------------------------------------------------------------------------
711   return:        -
712 --------------------------------------------------------------------------------------------
713 */
714 
715 void PredictiveInterpolation(
716     CAacDecoderChannelInfo *pAacDecoderChannelInfo,
717     CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo) {
718   CErRvlcInfo *pRvlc =
719       &pAacDecoderChannelInfo->pComData->overlay.aac.erRvlcInfo;
720   int band, bnds, group;
721   SHORT commonMin;
722 
723   for (group = 0; group < pRvlc->numWindowGroups; group++) {
724     for (band = 0; band < pRvlc->maxSfbTransmitted; band++) {
725       bnds = 16 * group + band;
726       switch (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]) {
727         case ZERO_HCB:
728           pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = 0;
729           break;
730 
731         case INTENSITY_HCB:
732         case INTENSITY_HCB2:
733           if ((pAacDecoderStaticChannelInfo->concealmentInfo
734                    .aRvlcPreviousCodebook[bnds] == INTENSITY_HCB) ||
735               (pAacDecoderStaticChannelInfo->concealmentInfo
736                    .aRvlcPreviousCodebook[bnds] == INTENSITY_HCB2)) {
737             commonMin = fMin(
738                 pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds],
739                 pAacDecoderChannelInfo->pComData->overlay.aac
740                     .aRvlcScfBwd[bnds]);
741             pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] =
742                 fMin(commonMin, pAacDecoderStaticChannelInfo->concealmentInfo
743                                     .aRvlcPreviousScaleFactor[bnds]);
744           } else {
745             pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = -110;
746           }
747           break;
748 
749         case NOISE_HCB:
750           if (pAacDecoderStaticChannelInfo->concealmentInfo
751                   .aRvlcPreviousCodebook[bnds] == NOISE_HCB) {
752             commonMin = fMin(
753                 pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds],
754                 pAacDecoderChannelInfo->pComData->overlay.aac
755                     .aRvlcScfBwd[bnds]);
756             pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] =
757                 fMin(commonMin, pAacDecoderStaticChannelInfo->concealmentInfo
758                                     .aRvlcPreviousScaleFactor[bnds]);
759           } else {
760             pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = -110;
761           }
762           break;
763 
764         default:
765           if ((pAacDecoderStaticChannelInfo->concealmentInfo
766                    .aRvlcPreviousCodebook[bnds] != ZERO_HCB) &&
767               (pAacDecoderStaticChannelInfo->concealmentInfo
768                    .aRvlcPreviousCodebook[bnds] != NOISE_HCB) &&
769               (pAacDecoderStaticChannelInfo->concealmentInfo
770                    .aRvlcPreviousCodebook[bnds] != INTENSITY_HCB) &&
771               (pAacDecoderStaticChannelInfo->concealmentInfo
772                    .aRvlcPreviousCodebook[bnds] != INTENSITY_HCB2)) {
773             commonMin = fMin(
774                 pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds],
775                 pAacDecoderChannelInfo->pComData->overlay.aac
776                     .aRvlcScfBwd[bnds]);
777             pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] =
778                 fMin(commonMin, pAacDecoderStaticChannelInfo->concealmentInfo
779                                     .aRvlcPreviousScaleFactor[bnds]);
780           } else {
781             pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = 0;
782           }
783           break;
784       }
785     }
786   }
787 }
788