1
2/* -----------------------------------------------------------------------------------------------------------
3Software 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
9The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements
10the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio.
11This FDK AAC Codec software is intended to be used on a wide variety of Android devices.
12
13AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual
14audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by
15independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part
16of the MPEG specifications.
17
18Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer)
19may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners
20individually for the purpose of encoding or decoding bit streams in products that are compliant with
21the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license
22these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec
23software may already be covered under those patent licenses when it is used for those licensed purposes only.
24
25Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality,
26are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional
27applications information and documentation.
28
292.    COPYRIGHT LICENSE
30
31Redistribution and use in source and binary forms, with or without modification, are permitted without
32payment of copyright license fees provided that you satisfy the following conditions:
33
34You must retain the complete text of this software license in redistributions of the FDK AAC Codec or
35your modifications thereto in source code form.
36
37You must retain the complete text of this software license in the documentation and/or other materials
38provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form.
39You must make available free of charge copies of the complete source code of the FDK AAC Codec and your
40modifications thereto to recipients of copies in binary form.
41
42The name of Fraunhofer may not be used to endorse or promote products derived from this library without
43prior written permission.
44
45You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec
46software or your modifications thereto.
47
48Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software
49and 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
533.    NO PATENT LICENSE
54
55NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer,
56ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with
57respect to this software.
58
59You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized
60by appropriate patent licenses.
61
624.    DISCLAIMER
63
64This 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
66of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
67CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages,
68including but not limited to procurement of substitute goods or services; loss of use, data, or profits,
69or business interruption, however caused and on any theory of liability, whether in contract, strict
70liability, or tort (including negligence), arising in any way out of the use of this software, even if
71advised of the possibility of such damage.
72
735.    CONTACT INFORMATION
74
75Fraunhofer Institute for Integrated Circuits IIS
76Attention: Audio and Multimedia Departments - FDK AAC LL
77Am Wolfsmantel 33
7891058 Erlangen, Germany
79
80www.iis.fraunhofer.de/amm
81amm-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
109static
110void 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
184static
185void 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
266void 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
399void 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
532void 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
637void 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