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