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