/src/aac/libDRCdec/src/drcDec_gainDecoder.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | /* ----------------------------------------------------------------------------- |
2 | | Software License for The Fraunhofer FDK AAC Codec Library for Android |
3 | | |
4 | | © Copyright 1995 - 2019 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-D DRC decoder library ************************** |
96 | | |
97 | | Author(s): |
98 | | |
99 | | Description: |
100 | | |
101 | | *******************************************************************************/ |
102 | | |
103 | | #include "drcDec_types.h" |
104 | | #include "drcDec_gainDecoder.h" |
105 | | #include "drcGainDec_preprocess.h" |
106 | | #include "drcGainDec_init.h" |
107 | | #include "drcGainDec_process.h" |
108 | | #include "drcDec_tools.h" |
109 | | |
110 | | /*******************************************/ |
111 | | /* static functions */ |
112 | | /*******************************************/ |
113 | | |
114 | | static int _fitsLocation(DRC_INSTRUCTIONS_UNI_DRC* pInst, |
115 | 24.3k | const GAIN_DEC_LOCATION drcLocation) { |
116 | 24.3k | int downmixId = pInst->drcApplyToDownmix ? pInst->downmixId[0] : 0; |
117 | 24.3k | switch (drcLocation) { |
118 | 12.2k | case GAIN_DEC_DRC1: |
119 | 12.2k | return (downmixId == 0); |
120 | 0 | case GAIN_DEC_DRC1_DRC2: |
121 | 0 | return ((downmixId == 0) || (downmixId == DOWNMIX_ID_ANY_DOWNMIX)); |
122 | 0 | case GAIN_DEC_DRC2: |
123 | 0 | return (downmixId == DOWNMIX_ID_ANY_DOWNMIX); |
124 | 0 | case GAIN_DEC_DRC3: |
125 | 0 | return ((downmixId != 0) && (downmixId != DOWNMIX_ID_ANY_DOWNMIX)); |
126 | 12.1k | case GAIN_DEC_DRC2_DRC3: |
127 | 12.1k | return (downmixId != 0); |
128 | 24.3k | } |
129 | 0 | return 0; |
130 | 24.3k | } |
131 | | |
132 | | static void _setChannelGains(HANDLE_DRC_GAIN_DECODER hGainDec, |
133 | | const int numChannelGains, |
134 | 10.0k | const FIXP_DBL* channelGainDb) { |
135 | 10.0k | int i, channelGain_e; |
136 | 10.0k | FIXP_DBL channelGain; |
137 | 10.0k | FDK_ASSERT(numChannelGains <= 8); |
138 | 22.2k | for (i = 0; i < numChannelGains; i++) { |
139 | 12.1k | if (channelGainDb[i] == (FIXP_DBL)MINVAL_DBL) { |
140 | 0 | hGainDec->channelGain[i] = (FIXP_DBL)0; |
141 | 12.1k | } else { |
142 | | /* add loudness normalisation gain (dB) to channel gain (dB) */ |
143 | 12.1k | FIXP_DBL tmp_channelGainDb = (channelGainDb[i] >> 1) + |
144 | 12.1k | (hGainDec->loudnessNormalisationGainDb >> 2); |
145 | 12.1k | tmp_channelGainDb = |
146 | 12.1k | SATURATE_LEFT_SHIFT(tmp_channelGainDb, 1, DFRACT_BITS); |
147 | 12.1k | channelGain = dB2lin(tmp_channelGainDb, 8, &channelGain_e); |
148 | 12.1k | hGainDec->channelGain[i] = scaleValue(channelGain, channelGain_e - 8); |
149 | 12.1k | } |
150 | 12.1k | } |
151 | 10.0k | } |
152 | | |
153 | | /*******************************************/ |
154 | | /* public functions */ |
155 | | /*******************************************/ |
156 | | |
157 | | DRC_ERROR |
158 | 30.2k | drcDec_GainDecoder_Open(HANDLE_DRC_GAIN_DECODER* phGainDec) { |
159 | 30.2k | DRC_GAIN_DECODER* hGainDec = NULL; |
160 | | |
161 | 30.2k | hGainDec = (DRC_GAIN_DECODER*)FDKcalloc(1, sizeof(DRC_GAIN_DECODER)); |
162 | 30.2k | if (hGainDec == NULL) return DE_MEMORY_ERROR; |
163 | | |
164 | 30.2k | hGainDec->multiBandActiveDrcIndex = -1; |
165 | 30.2k | hGainDec->channelGainActiveDrcIndex = -1; |
166 | | |
167 | 30.2k | *phGainDec = hGainDec; |
168 | | |
169 | 30.2k | return DE_OK; |
170 | 30.2k | } |
171 | | |
172 | | DRC_ERROR |
173 | 143k | drcDec_GainDecoder_Init(HANDLE_DRC_GAIN_DECODER hGainDec) { |
174 | 143k | DRC_ERROR err = DE_OK; |
175 | | |
176 | 143k | err = initGainDec(hGainDec); |
177 | 143k | if (err) return err; |
178 | | |
179 | 143k | initDrcGainBuffers(hGainDec->frameSize, &hGainDec->drcGainBuffers); |
180 | | |
181 | 143k | return err; |
182 | 143k | } |
183 | | |
184 | | DRC_ERROR |
185 | | drcDec_GainDecoder_SetParam(HANDLE_DRC_GAIN_DECODER hGainDec, |
186 | | const GAIN_DEC_PARAM paramType, |
187 | 306k | const int paramValue) { |
188 | 306k | switch (paramType) { |
189 | 153k | case GAIN_DEC_FRAME_SIZE: |
190 | 153k | if (paramValue < 0) return DE_PARAM_OUT_OF_RANGE; |
191 | 153k | hGainDec->frameSize = paramValue; |
192 | 153k | break; |
193 | 153k | case GAIN_DEC_SAMPLE_RATE: |
194 | 153k | if (paramValue < 0) return DE_PARAM_OUT_OF_RANGE; |
195 | 153k | hGainDec->deltaTminDefault = getDeltaTmin(paramValue); |
196 | 153k | break; |
197 | 0 | default: |
198 | 0 | return DE_PARAM_INVALID; |
199 | 306k | } |
200 | 306k | return DE_OK; |
201 | 306k | } |
202 | | |
203 | | DRC_ERROR |
204 | | drcDec_GainDecoder_SetCodecDependentParameters( |
205 | | HANDLE_DRC_GAIN_DECODER hGainDec, const DELAY_MODE delayMode, |
206 | | const int timeDomainSupported, |
207 | 17.5k | const SUBBAND_DOMAIN_MODE subbandDomainSupported) { |
208 | 17.5k | if ((delayMode != DM_REGULAR_DELAY) && (delayMode != DM_LOW_DELAY)) { |
209 | 0 | return DE_NOT_OK; |
210 | 0 | } |
211 | 17.5k | hGainDec->delayMode = delayMode; |
212 | 17.5k | hGainDec->timeDomainSupported = timeDomainSupported; |
213 | 17.5k | hGainDec->subbandDomainSupported = subbandDomainSupported; |
214 | | |
215 | 17.5k | return DE_OK; |
216 | 17.5k | } |
217 | | |
218 | | DRC_ERROR |
219 | | drcDec_GainDecoder_Config(HANDLE_DRC_GAIN_DECODER hGainDec, |
220 | | HANDLE_UNI_DRC_CONFIG hUniDrcConfig, |
221 | | const UCHAR numSelectedDrcSets, |
222 | | const SCHAR* selectedDrcSetIds, |
223 | 122k | const UCHAR* selectedDownmixIds) { |
224 | 122k | DRC_ERROR err = DE_OK; |
225 | 122k | int a; |
226 | | |
227 | 122k | hGainDec->nActiveDrcs = 0; |
228 | 122k | hGainDec->multiBandActiveDrcIndex = -1; |
229 | 122k | hGainDec->channelGainActiveDrcIndex = -1; |
230 | 250k | for (a = 0; a < numSelectedDrcSets; a++) { |
231 | 128k | err = initActiveDrc(hGainDec, hUniDrcConfig, selectedDrcSetIds[a], |
232 | 128k | selectedDownmixIds[a]); |
233 | 128k | if (err) return err; |
234 | 128k | } |
235 | | |
236 | 122k | err = initActiveDrcOffset(hGainDec); |
237 | 122k | if (err) return err; |
238 | | |
239 | 120k | return err; |
240 | 122k | } |
241 | | |
242 | | DRC_ERROR |
243 | 30.2k | drcDec_GainDecoder_Close(HANDLE_DRC_GAIN_DECODER* phGainDec) { |
244 | 30.2k | if (*phGainDec != NULL) { |
245 | 30.2k | FDKfree(*phGainDec); |
246 | 30.2k | *phGainDec = NULL; |
247 | 30.2k | } |
248 | | |
249 | 30.2k | return DE_OK; |
250 | 30.2k | } |
251 | | |
252 | | DRC_ERROR |
253 | | drcDec_GainDecoder_Preprocess(HANDLE_DRC_GAIN_DECODER hGainDec, |
254 | | HANDLE_UNI_DRC_GAIN hUniDrcGain, |
255 | | const FIXP_DBL loudnessNormalizationGainDb, |
256 | 10.0k | const FIXP_SGL boost, const FIXP_SGL compress) { |
257 | 10.0k | DRC_ERROR err = DE_OK; |
258 | 10.0k | int a, c; |
259 | | |
260 | | /* lnbPointer is the index on the most recent node buffer */ |
261 | 10.0k | hGainDec->drcGainBuffers.lnbPointer++; |
262 | 10.0k | if (hGainDec->drcGainBuffers.lnbPointer >= NUM_LNB_FRAMES) |
263 | 1.70k | hGainDec->drcGainBuffers.lnbPointer = 0; |
264 | | |
265 | 22.2k | for (a = 0; a < hGainDec->nActiveDrcs; a++) { |
266 | | /* prepare gain interpolation of sequences used by copying and modifying |
267 | | * nodes in node buffers */ |
268 | 12.8k | err = prepareDrcGain(hGainDec, hUniDrcGain, compress, boost, |
269 | 12.8k | loudnessNormalizationGainDb, a); |
270 | 12.8k | if (err) return err; |
271 | 12.8k | } |
272 | | |
273 | 37.7k | for (a = 0; a < MAX_ACTIVE_DRCS; a++) { |
274 | 254k | for (c = 0; c < 8; c++) { |
275 | 226k | hGainDec->activeDrc[a] |
276 | 226k | .lnbIndexForChannel[c][hGainDec->drcGainBuffers.lnbPointer] = |
277 | 226k | -1; /* "no DRC processing" */ |
278 | 226k | } |
279 | 28.3k | hGainDec->activeDrc[a].subbandGainsReady = 0; |
280 | 28.3k | } |
281 | | |
282 | 84.9k | for (c = 0; c < 8; c++) { |
283 | 75.5k | hGainDec->drcGainBuffers |
284 | 75.5k | .channelGain[c][hGainDec->drcGainBuffers.lnbPointer] = |
285 | 75.5k | FL2FXCONST_DBL(1.0f / (float)(1 << 8)); |
286 | 75.5k | } |
287 | | |
288 | 9.44k | return err; |
289 | 10.0k | } |
290 | | |
291 | | /* create gain sequence out of gain sequences of last frame for concealment and |
292 | | * flushing */ |
293 | | DRC_ERROR |
294 | | drcDec_GainDecoder_Conceal(HANDLE_DRC_GAIN_DECODER hGainDec, |
295 | | HANDLE_UNI_DRC_CONFIG hUniDrcConfig, |
296 | 7.32k | HANDLE_UNI_DRC_GAIN hUniDrcGain) { |
297 | 7.32k | int seq, gainSequenceCount; |
298 | 7.32k | DRC_COEFFICIENTS_UNI_DRC* pCoef = |
299 | 7.32k | selectDrcCoefficients(hUniDrcConfig, LOCATION_SELECTED); |
300 | 7.32k | if (pCoef && pCoef->gainSequenceCount) { |
301 | 3.54k | gainSequenceCount = fMin(pCoef->gainSequenceCount, (UCHAR)12); |
302 | 3.78k | } else { |
303 | 3.78k | gainSequenceCount = 1; |
304 | 3.78k | } |
305 | | |
306 | 34.7k | for (seq = 0; seq < gainSequenceCount; seq++) { |
307 | 27.4k | int lastNodeIndex = 0; |
308 | 27.4k | FIXP_SGL lastGainDb = (FIXP_SGL)0; |
309 | | |
310 | 27.4k | lastNodeIndex = hUniDrcGain->nNodes[seq] - 1; |
311 | 27.4k | if ((lastNodeIndex >= 0) && (lastNodeIndex < 16)) { |
312 | 24.5k | lastGainDb = hUniDrcGain->gainNode[seq][lastNodeIndex].gainDb; |
313 | 24.5k | } |
314 | | |
315 | 27.4k | hUniDrcGain->nNodes[seq] = 1; |
316 | 27.4k | if (lastGainDb > (FIXP_SGL)0) { |
317 | 5.30k | hUniDrcGain->gainNode[seq][0].gainDb = |
318 | 5.30k | FX_DBL2FX_SGL(fMult(FL2FXCONST_SGL(0.9f), lastGainDb)); |
319 | 22.1k | } else { |
320 | 22.1k | hUniDrcGain->gainNode[seq][0].gainDb = |
321 | 22.1k | FX_DBL2FX_SGL(fMult(FL2FXCONST_SGL(0.98f), lastGainDb)); |
322 | 22.1k | } |
323 | 27.4k | hUniDrcGain->gainNode[seq][0].time = hGainDec->frameSize - 1; |
324 | 27.4k | } |
325 | 7.32k | return DE_OK; |
326 | 7.32k | } |
327 | | |
328 | | void drcDec_GainDecoder_SetChannelGains(HANDLE_DRC_GAIN_DECODER hGainDec, |
329 | | const int numChannels, |
330 | | const int frameSize, |
331 | | const FIXP_DBL* channelGainDb, |
332 | | const int audioBufferChannelOffset, |
333 | 10.0k | FIXP_DBL* audioBuffer) { |
334 | 10.0k | int c, i; |
335 | | |
336 | 10.0k | if (hGainDec->channelGainActiveDrcIndex >= 0) { |
337 | | /* channel gains will be applied in drcDec_GainDecoder_ProcessTimeDomain or |
338 | | * drcDec_GainDecoder_ProcessSubbandDomain, respectively. */ |
339 | 7.55k | _setChannelGains(hGainDec, numChannels, channelGainDb); |
340 | | |
341 | 7.55k | if (!hGainDec->status) { /* overwrite previous channel gains at startup */ |
342 | 452 | DRC_GAIN_BUFFERS* pDrcGainBuffers = &hGainDec->drcGainBuffers; |
343 | 917 | for (c = 0; c < numChannels; c++) { |
344 | 2.79k | for (i = 0; i < NUM_LNB_FRAMES; i++) { |
345 | 2.32k | pDrcGainBuffers->channelGain[c][i] = hGainDec->channelGain[c]; |
346 | 2.32k | } |
347 | 465 | } |
348 | 452 | hGainDec->status = 1; |
349 | 452 | } |
350 | 7.55k | } else { |
351 | | /* smooth and apply channel gains */ |
352 | 2.47k | FIXP_DBL prevChannelGain[8]; |
353 | 6.57k | for (c = 0; c < numChannels; c++) { |
354 | 4.09k | prevChannelGain[c] = hGainDec->channelGain[c]; |
355 | 4.09k | } |
356 | | |
357 | 2.47k | _setChannelGains(hGainDec, numChannels, channelGainDb); |
358 | | |
359 | 2.47k | if (!hGainDec->status) { /* overwrite previous channel gains at startup */ |
360 | 734 | for (c = 0; c < numChannels; c++) |
361 | 440 | prevChannelGain[c] = hGainDec->channelGain[c]; |
362 | 294 | hGainDec->status = 1; |
363 | 294 | } |
364 | | |
365 | 6.57k | for (c = 0; c < numChannels; c++) { |
366 | 4.09k | INT n_min = fMin(fMin(CntLeadingZeros(prevChannelGain[c]), |
367 | 4.09k | CntLeadingZeros(hGainDec->channelGain[c])) - |
368 | 4.09k | 1, |
369 | 4.09k | 9); |
370 | 4.09k | FIXP_DBL gain = prevChannelGain[c] << n_min; |
371 | 4.09k | FIXP_DBL stepsize = ((hGainDec->channelGain[c] << n_min) - gain); |
372 | 4.09k | if (stepsize != (FIXP_DBL)0) { |
373 | 204 | if (frameSize == 1024) |
374 | 0 | stepsize = stepsize >> 10; |
375 | 204 | else |
376 | 204 | stepsize = (LONG)stepsize / frameSize; |
377 | 204 | } |
378 | 4.09k | n_min = 9 - n_min; |
379 | | #ifdef FUNCTION_drcDec_GainDecoder_SetChannelGains_func1 |
380 | | drcDec_GainDecoder_SetChannelGains_func1(audioBuffer, gain, stepsize, |
381 | | n_min, frameSize); |
382 | | #else |
383 | 7.36M | for (i = 0; i < frameSize; i++) { |
384 | 7.35M | audioBuffer[i] = fMultDiv2(audioBuffer[i], gain) << n_min; |
385 | 7.35M | gain += stepsize; |
386 | 7.35M | } |
387 | 4.09k | #endif |
388 | 4.09k | audioBuffer += audioBufferChannelOffset; |
389 | 4.09k | } |
390 | 2.47k | } |
391 | 10.0k | } |
392 | | |
393 | | DRC_ERROR |
394 | | drcDec_GainDecoder_ProcessTimeDomain( |
395 | | HANDLE_DRC_GAIN_DECODER hGainDec, const int delaySamples, |
396 | | const GAIN_DEC_LOCATION drcLocation, const int channelOffset, |
397 | | const int drcChannelOffset, const int numChannelsProcessed, |
398 | 18.8k | const int timeDataChannelOffset, FIXP_DBL* audioIOBuffer) { |
399 | 18.8k | DRC_ERROR err = DE_OK; |
400 | 18.8k | int a; |
401 | | |
402 | 18.8k | if (!hGainDec->timeDomainSupported) { |
403 | 0 | return DE_NOT_OK; |
404 | 0 | } |
405 | | |
406 | 43.1k | for (a = 0; a < hGainDec->nActiveDrcs; a++) { |
407 | 24.3k | if (!_fitsLocation(hGainDec->activeDrc[a].pInst, drcLocation)) continue; |
408 | | |
409 | | /* Apply DRC */ |
410 | 12.2k | err = processDrcTime(hGainDec, a, delaySamples, channelOffset, |
411 | 12.2k | drcChannelOffset, numChannelsProcessed, |
412 | 12.2k | timeDataChannelOffset, audioIOBuffer); |
413 | 12.2k | if (err) return err; |
414 | 12.2k | } |
415 | | |
416 | 18.7k | return err; |
417 | 18.8k | } |
418 | | |
419 | | DRC_ERROR |
420 | | drcDec_GainDecoder_ProcessSubbandDomain( |
421 | | HANDLE_DRC_GAIN_DECODER hGainDec, const int delaySamples, |
422 | | const GAIN_DEC_LOCATION drcLocation, const int channelOffset, |
423 | | const int drcChannelOffset, const int numChannelsProcessed, |
424 | | const int processSingleTimeslot, FIXP_DBL* audioIOBufferReal[], |
425 | 0 | FIXP_DBL* audioIOBufferImag[]) { |
426 | 0 | DRC_ERROR err = DE_OK; |
427 | 0 | int a; |
428 | |
|
429 | 0 | if (hGainDec->subbandDomainSupported == SDM_OFF) { |
430 | 0 | return DE_NOT_OK; |
431 | 0 | } |
432 | | |
433 | 0 | for (a = 0; a < hGainDec->nActiveDrcs; a++) { |
434 | 0 | if (!_fitsLocation(hGainDec->activeDrc[a].pInst, drcLocation)) continue; |
435 | | |
436 | | /* Apply DRC */ |
437 | 0 | err = processDrcSubband(hGainDec, a, delaySamples, channelOffset, |
438 | 0 | drcChannelOffset, numChannelsProcessed, |
439 | 0 | processSingleTimeslot, audioIOBufferReal, |
440 | 0 | audioIOBufferImag); |
441 | 0 | if (err) return err; |
442 | 0 | } |
443 | | |
444 | 0 | return err; |
445 | 0 | } |
446 | | |
447 | | DRC_ERROR |
448 | | drcDec_GainDecoder_SetLoudnessNormalizationGainDb( |
449 | 10.0k | HANDLE_DRC_GAIN_DECODER hGainDec, FIXP_DBL loudnessNormalizationGainDb) { |
450 | 10.0k | hGainDec->loudnessNormalisationGainDb = loudnessNormalizationGainDb; |
451 | | |
452 | 10.0k | return DE_OK; |
453 | 10.0k | } |
454 | | |
455 | 2.96k | int drcDec_GainDecoder_GetFrameSize(HANDLE_DRC_GAIN_DECODER hGainDec) { |
456 | 2.96k | if (hGainDec == NULL) return -1; |
457 | | |
458 | 2.96k | return hGainDec->frameSize; |
459 | 2.96k | } |
460 | | |
461 | 2.96k | int drcDec_GainDecoder_GetDeltaTminDefault(HANDLE_DRC_GAIN_DECODER hGainDec) { |
462 | 2.96k | if (hGainDec == NULL) return -1; |
463 | | |
464 | 2.96k | return hGainDec->deltaTminDefault; |
465 | 2.96k | } |