• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* -----------------------------------------------------------------------------
2 Software License for The Fraunhofer FDK AAC Codec Library for Android
3 
4 © Copyright  1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten
5 Forschung e.V. All rights reserved.
6 
7  1.    INTRODUCTION
8 The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
9 that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
10 scheme for digital audio. This FDK AAC Codec software is intended to be used on
11 a wide variety of Android devices.
12 
13 AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
14 general perceptual audio codecs. AAC-ELD is considered the best-performing
15 full-bandwidth communications codec by independent studies and is widely
16 deployed. AAC has been standardized by ISO and IEC as part of the MPEG
17 specifications.
18 
19 Patent licenses for necessary patent claims for the FDK AAC Codec (including
20 those of Fraunhofer) may be obtained through Via Licensing
21 (www.vialicensing.com) or through the respective patent owners individually for
22 the purpose of encoding or decoding bit streams in products that are compliant
23 with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
24 Android devices already license these patent claims through Via Licensing or
25 directly from the patent owners, and therefore FDK AAC Codec software may
26 already be covered under those patent licenses when it is used for those
27 licensed purposes only.
28 
29 Commercially-licensed AAC software libraries, including floating-point versions
30 with enhanced sound quality, are also available from Fraunhofer. Users are
31 encouraged to check the Fraunhofer website for additional applications
32 information and documentation.
33 
34 2.    COPYRIGHT LICENSE
35 
36 Redistribution and use in source and binary forms, with or without modification,
37 are permitted without payment of copyright license fees provided that you
38 satisfy the following conditions:
39 
40 You must retain the complete text of this software license in redistributions of
41 the FDK AAC Codec or your modifications thereto in source code form.
42 
43 You must retain the complete text of this software license in the documentation
44 and/or other materials provided with redistributions of the FDK AAC Codec or
45 your modifications thereto in binary form. You must make available free of
46 charge copies of the complete source code of the FDK AAC Codec and your
47 modifications thereto to recipients of copies in binary form.
48 
49 The name of Fraunhofer may not be used to endorse or promote products derived
50 from this library without prior written permission.
51 
52 You may not charge copyright license fees for anyone to use, copy or distribute
53 the FDK AAC Codec software or your modifications thereto.
54 
55 Your modified versions of the FDK AAC Codec must carry prominent notices stating
56 that you changed the software and the date of any change. For modified versions
57 of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
58 must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
59 AAC Codec Library for Android."
60 
61 3.    NO PATENT LICENSE
62 
63 NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
64 limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
65 Fraunhofer provides no warranty of patent non-infringement with respect to this
66 software.
67 
68 You may use this FDK AAC Codec software or modifications thereto only for
69 purposes that are authorized by appropriate patent licenses.
70 
71 4.    DISCLAIMER
72 
73 This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
74 holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
75 including but not limited to the implied warranties of merchantability and
76 fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
77 CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
78 or consequential damages, including but not limited to procurement of substitute
79 goods or services; loss of use, data, or profits, or business interruption,
80 however caused and on any theory of liability, whether in contract, strict
81 liability, or tort (including negligence), arising in any way out of the use of
82 this software, even if advised of the possibility of such damage.
83 
84 5.    CONTACT INFORMATION
85 
86 Fraunhofer Institute for Integrated Circuits IIS
87 Attention: Audio and Multimedia Departments - FDK AAC LL
88 Am Wolfsmantel 33
89 91058 Erlangen, Germany
90 
91 www.iis.fraunhofer.de/amm
92 amm-info@iis.fraunhofer.de
93 ----------------------------------------------------------------------------- */
94 
95 /*********************** MPEG surround decoder library *************************
96 
97    Author(s):   Christian Ertel, Christian Griebel
98 
99    Description: SAC Dec error concealment
100 
101 *******************************************************************************/
102 
103 #include "sac_dec_conceal.h"
104 
SpatialDecConcealment_Init(SpatialDecConcealmentInfo * info,const UINT resetFlags)105 void SpatialDecConcealment_Init(SpatialDecConcealmentInfo *info,
106                                 const UINT resetFlags) {
107   FDK_ASSERT(info != NULL);
108 
109   if (resetFlags & MPEGS_CONCEAL_RESET_STATE) {
110     info->concealState = SpatialDecConcealState_Init;
111     /* Frame counters will be initialized implicitely in function
112      * SpatialDecConcealment_UpdateState(). */
113   }
114 
115   if (resetFlags & MPEGS_CONCEAL_RESET_PARAMETER) {
116     /* Set default params */
117     info->concealParams.method = MPEGS_CONCEAL_DEFAULT_METHOD;
118     info->concealParams.numKeepFrames = MPEGS_CONCEAL_DEFAULT_NUM_KEEP_FRAMES;
119     info->concealParams.numFadeOutFrames =
120         MPEGS_CONCEAL_DEFAULT_FADE_OUT_SLOPE_LENGTH;
121     info->concealParams.numFadeInFrames =
122         MPEGS_CONCEAL_DEFAULT_FADE_IN_SLOPE_LENGTH;
123     info->concealParams.numReleaseFrames =
124         MPEGS_CONCEAL_DEFAULT_NUM_RELEASE_FRAMES;
125   }
126 
127   return;
128 }
129 
SpatialDecConcealment_Apply(SpatialDecConcealmentInfo * info,const SCHAR (* cmpIdxData)[MAX_PARAMETER_BANDS],SCHAR ** diffIdxData,SCHAR * idxPrev,SCHAR * bsXXXDataMode,const int startBand,const int stopBand,const SCHAR defaultValue,const int paramType,const int numParamSets)130 int SpatialDecConcealment_Apply(
131     SpatialDecConcealmentInfo *info,
132     const SCHAR (*cmpIdxData)[MAX_PARAMETER_BANDS], SCHAR **diffIdxData,
133     SCHAR *
134         idxPrev, /* char
135                     idxPrev[SPATIALDEC_MAX_NUM_OTT][SPATIALDEC_MAX_PARAMETER_BANDS],
136                   */
137     SCHAR *bsXXXDataMode, const int startBand, const int stopBand,
138     const SCHAR defaultValue, const int paramType, const int numParamSets) {
139   int appliedProcessing = 0;
140   int band, dataMode = -1;
141 
142   FDK_ASSERT(info != NULL);
143   FDK_ASSERT(cmpIdxData != NULL);
144   FDK_ASSERT(idxPrev != NULL);
145   FDK_ASSERT(bsXXXDataMode != NULL);
146 
147   /* Processing depends only on the internal state */
148   switch (info->concealState) {
149     case SpatialDecConcealState_Init:
150       dataMode = 0; /* default */
151       break;
152 
153     case SpatialDecConcealState_Ok:
154       /* Nothing to do */
155       break;
156 
157     case SpatialDecConcealState_Keep:
158       dataMode = 1; /* keep */
159       break;
160 
161     case SpatialDecConcealState_FadeToDefault: {
162       /* Start simple fade out */
163       FIXP_DBL fac = fDivNorm(info->cntStateFrames + 1,
164                               info->concealParams.numFadeOutFrames + 1);
165 
166       for (band = startBand; band < stopBand; band += 1) {
167         /*            idxPrev = fac * defaultValue + (1-fac) * idxPrev; */
168         idxPrev[band] =
169             fMultI(fac, defaultValue - idxPrev[band]) + idxPrev[band];
170       }
171       dataMode = 1; /* keep */
172       appliedProcessing = 1;
173     } break;
174 
175     case SpatialDecConcealState_Default:
176       for (band = startBand; band < stopBand; band += 1) {
177         idxPrev[band] = defaultValue;
178       }
179       dataMode = 1; /* keep */
180       appliedProcessing = 1;
181       break;
182 
183     case SpatialDecConcealState_FadeFromDefault: {
184       FIXP_DBL fac = fDivNorm(info->cntValidFrames + 1,
185                               info->concealParams.numFadeInFrames + 1);
186 
187       for (band = startBand; band < stopBand; band += 1) {
188         /*            idxPrev = fac * cmpIdxData + (1-fac) * defaultValue; */
189         idxPrev[band] =
190             fMultI(fac, cmpIdxData[numParamSets - 1][band] - defaultValue) +
191             defaultValue;
192       }
193       dataMode = 1; /* keep */
194       appliedProcessing = 1;
195     } break;
196 
197     default:
198       FDK_ASSERT(0); /* All valid states shall be handled above. */
199       break;
200   }
201 
202   if (dataMode >= 0) {
203     int i;
204     for (i = 0; i < numParamSets; i += 1) {
205       bsXXXDataMode[i] = dataMode;
206       if (diffIdxData != NULL) {
207         for (band = startBand; band < stopBand; band += 1) {
208           diffIdxData[i][band] = 0;
209         }
210       }
211     }
212   }
213 
214   return appliedProcessing;
215 }
216 
SpatialDecConcealment_UpdateState(SpatialDecConcealmentInfo * info,const int frameOk)217 void SpatialDecConcealment_UpdateState(SpatialDecConcealmentInfo *info,
218                                        const int frameOk) {
219   FDK_ASSERT(info != NULL);
220 
221   if (frameOk) {
222     info->cntValidFrames += 1;
223   } else {
224     info->cntValidFrames = 0;
225   }
226 
227   switch (info->concealState) {
228     case SpatialDecConcealState_Init:
229       if (frameOk) {
230         /* NEXT STATE: Ok */
231         info->concealState = SpatialDecConcealState_Ok;
232         info->cntStateFrames = 0;
233       }
234       break;
235 
236     case SpatialDecConcealState_Ok:
237       if (!frameOk) {
238         /* NEXT STATE: Keep */
239         info->concealState = SpatialDecConcealState_Keep;
240         info->cntStateFrames = 0;
241       }
242       break;
243 
244     case SpatialDecConcealState_Keep:
245       info->cntStateFrames += 1;
246       if (frameOk) {
247         /* NEXT STATE: Ok */
248         info->concealState = SpatialDecConcealState_Ok;
249       } else {
250         if (info->cntStateFrames >= info->concealParams.numKeepFrames) {
251           if (info->concealParams.numFadeOutFrames == 0) {
252             /* NEXT STATE: Default */
253             info->concealState = SpatialDecConcealState_Default;
254           } else {
255             /* NEXT STATE: Fade to default */
256             info->concealState = SpatialDecConcealState_FadeToDefault;
257             info->cntStateFrames = 0;
258           }
259         }
260       }
261       break;
262 
263     case SpatialDecConcealState_FadeToDefault:
264       info->cntStateFrames += 1;
265       if (info->cntValidFrames > 0) {
266         /* NEXT STATE: Fade in from default */
267         info->concealState = SpatialDecConcealState_FadeFromDefault;
268         info->cntStateFrames = 0;
269       } else {
270         if (info->cntStateFrames >= info->concealParams.numFadeOutFrames) {
271           /* NEXT STATE: Default */
272           info->concealState = SpatialDecConcealState_Default;
273         }
274       }
275       break;
276 
277     case SpatialDecConcealState_Default:
278       if (info->cntValidFrames > 0) {
279         if (info->concealParams.numFadeInFrames == 0) {
280           /* NEXT STATE: Ok */
281           info->concealState = SpatialDecConcealState_Ok;
282         } else {
283           /* NEXT STATE: Fade in from default */
284           info->concealState = SpatialDecConcealState_FadeFromDefault;
285           info->cntValidFrames = 0;
286         }
287       }
288       break;
289 
290     case SpatialDecConcealState_FadeFromDefault:
291       info->cntValidFrames += 1;
292       if (frameOk) {
293         if (info->cntValidFrames >= info->concealParams.numFadeInFrames) {
294           /* NEXT STATE: Ok */
295           info->concealState = SpatialDecConcealState_Ok;
296         }
297       } else {
298         /* NEXT STATE: Fade to default */
299         info->concealState = SpatialDecConcealState_FadeToDefault;
300         info->cntStateFrames = 0;
301       }
302       break;
303 
304     default:
305       FDK_ASSERT(0); /* All valid states should be handled above! */
306       break;
307   }
308 }
309 
SpatialDecConcealment_SetParam(SpatialDecConcealmentInfo * self,const SAC_DEC_CONCEAL_PARAM param,const INT value)310 SACDEC_ERROR SpatialDecConcealment_SetParam(SpatialDecConcealmentInfo *self,
311                                             const SAC_DEC_CONCEAL_PARAM param,
312                                             const INT value) {
313   SACDEC_ERROR err = MPS_OK;
314 
315   switch (param) {
316     case SAC_DEC_CONCEAL_METHOD:
317       switch ((SpatialDecConcealmentMethod)value) {
318         case SAC_DEC_CONCEAL_WITH_ZERO_VALUED_OUTPUT:
319         case SAC_DEC_CONCEAL_BY_FADING_PARAMETERS:
320           break;
321         default:
322           err = MPS_INVALID_PARAMETER;
323           goto bail;
324       }
325       if (self != NULL) {
326         /* store parameter value */
327         self->concealParams.method = (SpatialDecConcealmentMethod)value;
328       } else {
329         err = MPS_INVALID_HANDLE;
330         goto bail;
331       }
332       break;
333     case SAC_DEC_CONCEAL_NUM_KEEP_FRAMES:
334       if (value < 0) {
335         err = MPS_INVALID_PARAMETER;
336         goto bail;
337       }
338       if (self != NULL) {
339         /* store parameter value */
340         self->concealParams.numKeepFrames = (UINT)value;
341       } else {
342         err = MPS_INVALID_HANDLE;
343         goto bail;
344       }
345       break;
346     case SAC_DEC_CONCEAL_FADE_OUT_SLOPE_LENGTH:
347       if (value < 0) {
348         err = MPS_INVALID_PARAMETER;
349         goto bail;
350       }
351       if (self != NULL) {
352         /* store parameter value */
353         self->concealParams.numFadeOutFrames = (UINT)value;
354       } else {
355         err = MPS_INVALID_HANDLE;
356         goto bail;
357       }
358       break;
359     case SAC_DEC_CONCEAL_FADE_IN_SLOPE_LENGTH:
360       if (value < 0) {
361         err = MPS_INVALID_PARAMETER;
362         goto bail;
363       }
364       if (self != NULL) {
365         /* store parameter value */
366         self->concealParams.numFadeInFrames = (UINT)value;
367       } else {
368         err = MPS_INVALID_HANDLE;
369         goto bail;
370       }
371       break;
372     case SAC_DEC_CONCEAL_NUM_RELEASE_FRAMES:
373       if (value < 0) {
374         err = MPS_INVALID_PARAMETER;
375         goto bail;
376       }
377       if (self != NULL) {
378         /* store parameter value */
379         self->concealParams.numReleaseFrames = (UINT)value;
380       } else {
381         err = MPS_INVALID_HANDLE;
382         goto bail;
383       }
384       break;
385     default:
386       err = MPS_INVALID_PARAMETER;
387       goto bail;
388   }
389 
390 bail:
391   return err;
392 }
393