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