Coverage Report

Created: 2025-11-09 07:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/aac/libAACdec/src/aacdec_drc.cpp
Line
Count
Source
1
/* -----------------------------------------------------------------------------
2
Software License for The Fraunhofer FDK AAC Codec Library for Android
3
4
© Copyright  1995 - 2023 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
/**************************** AAC decoder library ******************************
96
97
   Author(s):   Christian Griebel
98
99
   Description: Dynamic range control (DRC) decoder tool for AAC
100
101
*******************************************************************************/
102
103
#include "aacdec_drc.h"
104
105
#include "channelinfo.h"
106
#include "aac_rom.h"
107
108
#include "sbrdecoder.h"
109
110
/*
111
 * Dynamic Range Control
112
 */
113
114
/* For parameter conversion */
115
0
#define DRC_PARAMETER_BITS (7)
116
0
#define DRC_MAX_QUANT_STEPS (1 << DRC_PARAMETER_BITS)
117
0
#define DRC_MAX_QUANT_FACTOR (DRC_MAX_QUANT_STEPS - 1)
118
#define DRC_PARAM_QUANT_STEP \
119
2.41k
  (FL2FXCONST_DBL(1.0f / (float)DRC_MAX_QUANT_FACTOR))
120
220k
#define DRC_PARAM_SCALE (1)
121
#define DRC_SCALING_MAX \
122
2.41k
  ((FIXP_DBL)((INT)(DRC_PARAM_QUANT_STEP >> DRC_PARAM_SCALE) * (INT)127))
123
124
646k
#define DRC_BLOCK_LEN (1024)
125
646k
#define DRC_BAND_MULT (4)
126
646k
#define DRC_BLOCK_LEN_DIV_BAND_MULT (DRC_BLOCK_LEN / DRC_BAND_MULT)
127
128
37.8k
#define MAX_REFERENCE_LEVEL (127)
129
130
0
#define DRC_HEAVY_THRESHOLD_DB (10)
131
132
15.0k
#define DVB_ANC_DATA_SYNC_BYTE (0xBC) /* DVB ancillary data sync byte. */
133
134
113k
#define OFF 0
135
1.49M
#define ON 1
136
137
0
static INT convert_drcParam(FIXP_DBL param_dbl) {
138
  /* converts an internal DRC boost/cut scaling factor in FIXP_DBL
139
     (which is downscaled by DRC_PARAM_SCALE)
140
     back to an integer value between 0 and 127. */
141
0
  LONG param_long;
142
143
0
  param_long = (LONG)param_dbl >> 7;
144
0
  param_long = param_long * (INT)DRC_MAX_QUANT_FACTOR;
145
0
  param_long >>= 31 - 7 - DRC_PARAM_SCALE - 1;
146
0
  param_long += 1; /* for rounding */
147
0
  param_long >>= 1;
148
149
0
  return (INT)param_long;
150
0
}
151
152
/*!
153
\brief  Disable DRC
154
155
\self Handle of DRC info
156
157
\return none
158
*/
159
654k
void aacDecoder_drcDisable(HANDLE_AAC_DRC self) {
160
654k
  self->enable = 0;
161
654k
  self->applyExtGain = 0;
162
654k
  self->progRefLevelPresent = 0;
163
654k
}
164
165
/*!
166
\brief Reset DRC information
167
168
\self Handle of DRC info
169
170
\return none
171
*/
172
37.8k
void aacDecoder_drcReset(HANDLE_AAC_DRC self) {
173
37.8k
  self->applyExtGain = 0;
174
37.8k
  self->additionalGainPrev = AACDEC_DRC_GAIN_INIT_VALUE;
175
37.8k
  self->additionalGainFilterState = AACDEC_DRC_GAIN_INIT_VALUE;
176
37.8k
  self->additionalGainFilterState1 = AACDEC_DRC_GAIN_INIT_VALUE;
177
37.8k
}
178
179
/*!
180
  \brief Initialize DRC information
181
182
  \self Handle of DRC info
183
184
  \return none
185
*/
186
37.8k
void aacDecoder_drcInit(HANDLE_AAC_DRC self) {
187
37.8k
  CDrcParams *pParams;
188
189
37.8k
  if (self == NULL) {
190
0
    return;
191
0
  }
192
193
  /* init control fields */
194
37.8k
  self->enable = OFF;
195
37.8k
  self->numThreads = 0;
196
197
  /* init params */
198
37.8k
  pParams = &self->params;
199
37.8k
  pParams->bsDelayEnable = 0;
200
37.8k
  pParams->cut = FL2FXCONST_DBL(0.0f);
201
37.8k
  pParams->usrCut = FL2FXCONST_DBL(0.0f);
202
37.8k
  pParams->boost = FL2FXCONST_DBL(0.0f);
203
37.8k
  pParams->usrBoost = FL2FXCONST_DBL(0.0f);
204
37.8k
  pParams->targetRefLevel = 96;
205
37.8k
  pParams->expiryFrame = AACDEC_DRC_DFLT_EXPIRY_FRAMES;
206
37.8k
  pParams->applyHeavyCompression = OFF;
207
37.8k
  pParams->usrApplyHeavyCompression = OFF;
208
209
37.8k
  pParams->defaultPresentationMode = DISABLED_PARAMETER_HANDLING;
210
37.8k
  pParams->encoderTargetLevel = MAX_REFERENCE_LEVEL; /* worst case assumption */
211
212
37.8k
  self->update = 1;
213
37.8k
  self->numOutChannels = 0;
214
37.8k
  self->prevAacNumChannels = 0;
215
216
  /* initial program ref level = target ref level */
217
37.8k
  self->progRefLevel = pParams->targetRefLevel;
218
37.8k
  self->progRefLevelPresent = 0;
219
37.8k
  self->presMode = -1;
220
221
37.8k
  aacDecoder_drcReset(self);
222
37.8k
}
223
224
/*!
225
  \brief Initialize DRC control data for one channel
226
227
  \self Handle of DRC info
228
229
  \return none
230
*/
231
596k
void aacDecoder_drcInitChannelData(CDrcChannelData *pDrcChData) {
232
596k
  if (pDrcChData != NULL) {
233
596k
    pDrcChData->expiryCount = 0;
234
596k
    pDrcChData->numBands = 1;
235
596k
    pDrcChData->bandTop[0] = DRC_BLOCK_LEN_DIV_BAND_MULT - 1;
236
596k
    pDrcChData->drcValue[0] = 0;
237
596k
    pDrcChData->drcInterpolationScheme = 0;
238
596k
    pDrcChData->drcDataType = UNKNOWN_PAYLOAD;
239
596k
  }
240
596k
}
241
242
/*!
243
  \brief  Set one single DRC parameter
244
245
  \self   Handle of DRC info.
246
  \param  Parameter to be set.
247
  \value  Value to be set.
248
249
  \return an error code.
250
*/
251
AAC_DECODER_ERROR aacDecoder_drcSetParam(HANDLE_AAC_DRC self,
252
578k
                                         AACDEC_DRC_PARAM param, INT value) {
253
578k
  AAC_DECODER_ERROR ErrorStatus = AAC_DEC_OK;
254
255
578k
  switch (param) {
256
0
    case DRC_CUT_SCALE:
257
      /* set attenuation scale factor */
258
0
      if ((value < 0) || (value > DRC_MAX_QUANT_FACTOR)) {
259
0
        return AAC_DEC_SET_PARAM_FAIL;
260
0
      }
261
0
      if (self == NULL) {
262
0
        return AAC_DEC_INVALID_HANDLE;
263
0
      }
264
0
      self->params.usrCut = (FIXP_DBL)(
265
0
          (INT)(DRC_PARAM_QUANT_STEP >> DRC_PARAM_SCALE) * (INT)value);
266
0
      self->update = 1;
267
0
      break;
268
0
    case DRC_BOOST_SCALE:
269
      /* set boost factor */
270
0
      if ((value < 0) || (value > DRC_MAX_QUANT_FACTOR)) {
271
0
        return AAC_DEC_SET_PARAM_FAIL;
272
0
      }
273
0
      if (self == NULL) {
274
0
        return AAC_DEC_INVALID_HANDLE;
275
0
      }
276
0
      self->params.usrBoost = (FIXP_DBL)(
277
0
          (INT)(DRC_PARAM_QUANT_STEP >> DRC_PARAM_SCALE) * (INT)value);
278
0
      self->update = 1;
279
0
      break;
280
0
    case TARGET_REF_LEVEL:
281
0
      if (value > MAX_REFERENCE_LEVEL || value < -MAX_REFERENCE_LEVEL) {
282
0
        return AAC_DEC_SET_PARAM_FAIL;
283
0
      }
284
0
      if (self == NULL) {
285
0
        return AAC_DEC_INVALID_HANDLE;
286
0
      }
287
0
      if (value < 0) {
288
0
        self->params.targetRefLevel = -1;
289
0
      } else {
290
0
        if (self->params.targetRefLevel != (SCHAR)value) {
291
0
          self->params.targetRefLevel = (SCHAR)value;
292
0
          self->progRefLevel = (SCHAR)value; /* Always set the program reference
293
                                                level equal to the target level
294
                                                according to 4.5.2.7.3 of
295
                                                ISO/IEC 14496-3. */
296
0
        }
297
0
        self->update = 1;
298
0
      }
299
0
      break;
300
0
    case APPLY_HEAVY_COMPRESSION:
301
0
      if ((value != OFF) && (value != ON)) {
302
0
        return AAC_DEC_SET_PARAM_FAIL;
303
0
      }
304
0
      if (self == NULL) {
305
0
        return AAC_DEC_INVALID_HANDLE;
306
0
      }
307
      /* Store new parameter value */
308
0
      self->params.usrApplyHeavyCompression = (UCHAR)value;
309
0
      self->update = 1;
310
0
      break;
311
0
    case DEFAULT_PRESENTATION_MODE:
312
0
      if (value < AAC_DRC_PARAMETER_HANDLING_DISABLED ||
313
0
          value > AAC_DRC_PRESENTATION_MODE_2_DEFAULT) {
314
0
        return AAC_DEC_SET_PARAM_FAIL;
315
0
      }
316
0
      if (self == NULL) {
317
0
        return AAC_DEC_INVALID_HANDLE;
318
0
      }
319
0
      self->params.defaultPresentationMode =
320
0
          (AACDEC_DRC_PARAMETER_HANDLING)value;
321
0
      self->update = 1;
322
0
      break;
323
0
    case ENCODER_TARGET_LEVEL:
324
0
      if (value > MAX_REFERENCE_LEVEL || value < 0) {
325
0
        return AAC_DEC_SET_PARAM_FAIL;
326
0
      }
327
0
      if (self == NULL) {
328
0
        return AAC_DEC_INVALID_HANDLE;
329
0
      }
330
0
      self->params.encoderTargetLevel = (UCHAR)value;
331
0
      self->update = 1;
332
0
      break;
333
98.9k
    case DRC_BS_DELAY:
334
98.9k
      if (value < 0 || value > 1) {
335
0
        return AAC_DEC_SET_PARAM_FAIL;
336
0
      }
337
98.9k
      if (self == NULL) {
338
0
        return AAC_DEC_INVALID_HANDLE;
339
0
      }
340
98.9k
      self->params.bsDelayEnable = value;
341
98.9k
      break;
342
479k
    case DRC_DATA_EXPIRY_FRAME:
343
479k
      if (self == NULL) {
344
0
        return AAC_DEC_INVALID_HANDLE;
345
0
      }
346
479k
      self->params.expiryFrame = (value > 0) ? (UINT)value : 0;
347
479k
      break;
348
0
    case MAX_OUTPUT_CHANNELS:
349
0
      if (self == NULL) {
350
0
        return AAC_DEC_INVALID_HANDLE;
351
0
      }
352
0
      self->numOutChannels = (INT)value;
353
0
      self->update = 1;
354
0
      break;
355
0
    default:
356
0
      return AAC_DEC_SET_PARAM_FAIL;
357
578k
  } /* switch(param) */
358
359
578k
  return ErrorStatus;
360
578k
}
361
362
static int parseExcludedChannels(UINT *excludedChnsMask,
363
31.8k
                                 HANDLE_FDK_BITSTREAM bs) {
364
31.8k
  UINT excludeMask = 0;
365
31.8k
  UINT i, j;
366
31.8k
  int bitCnt = 9;
367
368
254k
  for (i = 0, j = 1; i < 7; i++, j <<= 1) {
369
222k
    if (FDKreadBits(bs, 1)) {
370
185k
      excludeMask |= j;
371
185k
    }
372
222k
  }
373
374
  /* additional_excluded_chns */
375
65.2k
  while (FDKreadBits(bs, 1)) {
376
267k
    for (i = 0; i < 7; i++, j <<= 1) {
377
234k
      if (FDKreadBits(bs, 1)) {
378
163k
        excludeMask |= j;
379
163k
      }
380
234k
    }
381
33.4k
    bitCnt += 9;
382
33.4k
    FDK_ASSERT(j < (UINT)-1);
383
33.4k
  }
384
385
31.8k
  *excludedChnsMask = excludeMask;
386
387
31.8k
  return (bitCnt);
388
31.8k
}
389
390
/*!
391
  \brief Save DRC payload bitstream position
392
393
  \self Handle of DRC info
394
  \bs Handle of FDK bitstream
395
396
  \return The number of DRC payload bits
397
*/
398
int aacDecoder_drcMarkPayload(HANDLE_AAC_DRC self, HANDLE_FDK_BITSTREAM bs,
399
178k
                              AACDEC_DRC_PAYLOAD_TYPE type) {
400
178k
  UINT bsStartPos;
401
178k
  int i, numBands = 1, bitCnt = 0;
402
403
178k
  if (self == NULL) {
404
0
    return 0;
405
0
  }
406
407
178k
  bsStartPos = FDKgetValidBits(bs);
408
409
178k
  switch (type) {
410
166k
    case MPEG_DRC_EXT_DATA: {
411
166k
      bitCnt = 4;
412
413
166k
      if (FDKreadBits(bs, 1)) { /* pce_tag_present */
414
41.5k
        FDKreadBits(bs, 8);     /* pce_instance_tag + drc_tag_reserved_bits */
415
41.5k
        bitCnt += 8;
416
41.5k
      }
417
418
166k
      if (FDKreadBits(bs, 1)) { /* excluded_chns_present */
419
156k
        FDKreadBits(bs, 7);     /* exclude mask [0..7] */
420
156k
        bitCnt += 8;
421
289k
        while (FDKreadBits(bs, 1)) { /* additional_excluded_chns */
422
132k
          FDKreadBits(bs, 7);        /* exclude mask [x..y] */
423
132k
          bitCnt += 8;
424
132k
        }
425
156k
      }
426
427
166k
      if (FDKreadBits(bs, 1)) {         /* drc_bands_present */
428
156k
        numBands += FDKreadBits(bs, 4); /* drc_band_incr */
429
156k
        FDKreadBits(bs, 4);             /* reserved */
430
156k
        bitCnt += 8;
431
1.25M
        for (i = 0; i < numBands; i++) {
432
1.10M
          FDKreadBits(bs, 8); /* drc_band_top[i] */
433
1.10M
          bitCnt += 8;
434
1.10M
        }
435
156k
      }
436
437
166k
      if (FDKreadBits(bs, 1)) { /* prog_ref_level_present */
438
155k
        FDKreadBits(bs, 8); /* prog_ref_level + prog_ref_level_reserved_bits */
439
155k
        bitCnt += 8;
440
155k
      }
441
442
1.27M
      for (i = 0; i < numBands; i++) {
443
1.11M
        FDKreadBits(bs, 8); /* dyn_rng_sgn[i] + dyn_rng_ctl[i] */
444
1.11M
        bitCnt += 8;
445
1.11M
      }
446
447
166k
      if ((self->numPayloads < MAX_DRC_THREADS) &&
448
39.3k
          ((INT)FDKgetValidBits(bs) >= 0)) {
449
39.1k
        self->drcPayloadPosition[self->numPayloads++] = bsStartPos;
450
39.1k
      }
451
166k
    } break;
452
453
12.7k
    case DVB_DRC_ANC_DATA:
454
12.7k
      bitCnt += 8;
455
      /* check sync word */
456
12.7k
      if (FDKreadBits(bs, 8) == DVB_ANC_DATA_SYNC_BYTE) {
457
5.85k
        int dmxLevelsPresent, compressionPresent;
458
5.85k
        int coarseGrainTcPresent, fineGrainTcPresent;
459
460
        /* bs_info field */
461
5.85k
        FDKreadBits(
462
5.85k
            bs,
463
5.85k
            8); /* mpeg_audio_type, dolby_surround_mode, presentation_mode */
464
5.85k
        bitCnt += 8;
465
466
        /* Evaluate ancillary_data_status */
467
5.85k
        FDKreadBits(bs, 3); /* reserved, set to 0 */
468
5.85k
        dmxLevelsPresent =
469
5.85k
            FDKreadBits(bs, 1); /* downmixing_levels_MPEG4_status */
470
5.85k
        FDKreadBits(bs, 1);     /* reserved, set to 0 */
471
5.85k
        compressionPresent =
472
5.85k
            FDKreadBits(bs, 1); /* audio_coding_mode_and_compression status */
473
5.85k
        coarseGrainTcPresent =
474
5.85k
            FDKreadBits(bs, 1); /* coarse_grain_timecode_status */
475
5.85k
        fineGrainTcPresent =
476
5.85k
            FDKreadBits(bs, 1); /* fine_grain_timecode_status */
477
5.85k
        bitCnt += 8;
478
479
        /* MPEG4 downmixing levels */
480
5.85k
        if (dmxLevelsPresent) {
481
3.54k
          FDKreadBits(bs, 8); /* downmixing_levels_MPEG4 */
482
3.54k
          bitCnt += 8;
483
3.54k
        }
484
        /* audio coding mode and compression status */
485
5.85k
        if (compressionPresent) {
486
2.64k
          FDKreadBits(bs, 16); /* audio_coding_mode, Compression_value */
487
2.64k
          bitCnt += 16;
488
2.64k
        }
489
        /* coarse grain timecode */
490
5.85k
        if (coarseGrainTcPresent) {
491
3.43k
          FDKreadBits(bs, 16); /* coarse_grain_timecode */
492
3.43k
          bitCnt += 16;
493
3.43k
        }
494
        /* fine grain timecode */
495
5.85k
        if (fineGrainTcPresent) {
496
4.20k
          FDKreadBits(bs, 16); /* fine_grain_timecode */
497
4.20k
          bitCnt += 16;
498
4.20k
        }
499
5.85k
        if (!self->dvbAncDataAvailable && ((INT)FDKgetValidBits(bs) >= 0)) {
500
2.44k
          self->dvbAncDataPosition = bsStartPos;
501
2.44k
          self->dvbAncDataAvailable = 1;
502
2.44k
        }
503
5.85k
      }
504
12.7k
      break;
505
506
0
    default:
507
0
      break;
508
178k
  }
509
510
178k
  return (bitCnt);
511
178k
}
512
513
/*!
514
  \brief Parse DRC parameters from bitstream
515
516
  \bs Handle of FDK bitstream (in)
517
  \pDrcBs Pointer to DRC payload data container (out)
518
  \payloadPosition Bitstream position of MPEG DRC data chunk (in)
519
520
  \return Flag telling whether new DRC data has been found or not.
521
*/
522
static int aacDecoder_drcParse(HANDLE_FDK_BITSTREAM bs, CDrcPayload *pDrcBs,
523
38.9k
                               UINT payloadPosition) {
524
38.9k
  int i, numBands;
525
526
  /* Move to the beginning of the DRC payload field */
527
38.9k
  FDKpushBiDirectional(bs, (INT)FDKgetValidBits(bs) - (INT)payloadPosition);
528
529
  /* pce_tag_present */
530
38.9k
  if (FDKreadBits(bs, 1)) {
531
12.4k
    pDrcBs->pceInstanceTag = FDKreadBits(bs, 4); /* pce_instance_tag */
532
    /* only one program supported */
533
12.4k
    FDKreadBits(bs, 4); /* drc_tag_reserved_bits */
534
26.5k
  } else {
535
26.5k
    pDrcBs->pceInstanceTag = -1; /* not present */
536
26.5k
  }
537
538
38.9k
  if (FDKreadBits(bs, 1)) { /* excluded_chns_present */
539
    /* get excluded_chn_mask */
540
31.8k
    parseExcludedChannels(&pDrcBs->excludedChnsMask, bs);
541
31.8k
  } else {
542
7.11k
    pDrcBs->excludedChnsMask = 0;
543
7.11k
  }
544
545
38.9k
  numBands = 1;
546
38.9k
  if (FDKreadBits(bs, 1)) /* drc_bands_present */
547
31.2k
  {
548
    /* get band_incr */
549
31.2k
    numBands += FDKreadBits(bs, 4); /* drc_band_incr */
550
31.2k
    pDrcBs->channelData.drcInterpolationScheme =
551
31.2k
        FDKreadBits(bs, 4); /* drc_interpolation_scheme */
552
    /* band_top */
553
252k
    for (i = 0; i < numBands; i++) {
554
221k
      pDrcBs->channelData.bandTop[i] = FDKreadBits(bs, 8); /* drc_band_top[i] */
555
221k
    }
556
31.2k
  } else {
557
7.69k
    pDrcBs->channelData.bandTop[0] = DRC_BLOCK_LEN_DIV_BAND_MULT -
558
7.69k
                                     1; /* ... comprising the whole spectrum. */
559
7.69k
    ;
560
7.69k
  }
561
562
38.9k
  pDrcBs->channelData.numBands = numBands;
563
564
38.9k
  if (FDKreadBits(bs, 1)) /* prog_ref_level_present */
565
30.9k
  {
566
30.9k
    pDrcBs->progRefLevel = FDKreadBits(bs, 7); /* prog_ref_level */
567
30.9k
    FDKreadBits(bs, 1); /* prog_ref_level_reserved_bits */
568
30.9k
  } else {
569
8.03k
    pDrcBs->progRefLevel = -1;
570
8.03k
  }
571
572
268k
  for (i = 0; i < numBands; i++) {
573
229k
    pDrcBs->channelData.drcValue[i] = FDKreadBits(bs, 1)
574
229k
                                      << 7; /* dyn_rng_sgn[i] */
575
229k
    pDrcBs->channelData.drcValue[i] |=
576
229k
        FDKreadBits(bs, 7) & 0x7F; /* dyn_rng_ctl[i] */
577
229k
  }
578
579
  /* Set DRC payload type */
580
38.9k
  pDrcBs->channelData.drcDataType = MPEG_DRC_EXT_DATA;
581
582
38.9k
  return (1);
583
38.9k
}
584
585
/*!
586
  \brief Parse heavy compression value transported in DSEs of DVB streams with
587
  MPEG-4 content.
588
589
  \bs Handle of FDK bitstream (in)
590
  \pDrcBs Pointer to DRC payload data container (out)
591
  \payloadPosition Bitstream position of DVB ancillary data chunk
592
593
  \return Flag telling whether new DRC data has been found or not.
594
*/
595
4.69k
#define DVB_COMPRESSION_SCALE (8) /* 48,164 dB */
596
597
static int aacDecoder_drcReadCompression(HANDLE_FDK_BITSTREAM bs,
598
                                         CDrcPayload *pDrcBs,
599
2.37k
                                         UINT payloadPosition) {
600
2.37k
  int foundDrcData = 0;
601
2.37k
  int dmxLevelsPresent, compressionPresent;
602
603
  /* Move to the beginning of the DRC payload field */
604
2.37k
  FDKpushBiDirectional(bs, (INT)FDKgetValidBits(bs) - (INT)payloadPosition);
605
606
  /* Sanity checks */
607
2.37k
  if (FDKgetValidBits(bs) < 24) {
608
0
    return 0;
609
0
  }
610
611
  /* Check sync word */
612
2.37k
  if (FDKreadBits(bs, 8) != DVB_ANC_DATA_SYNC_BYTE) {
613
0
    return 0;
614
0
  }
615
616
  /* Evaluate bs_info field */
617
2.37k
  if (FDKreadBits(bs, 2) != 3) { /* mpeg_audio_type */
618
    /* No MPEG-4 audio data */
619
10
    return 0;
620
10
  }
621
2.36k
  FDKreadBits(bs, 2);                    /* dolby_surround_mode */
622
2.36k
  pDrcBs->presMode = FDKreadBits(bs, 2); /* presentation_mode */
623
2.36k
  FDKreadBits(bs, 1);                    /* stereo_downmix_mode */
624
2.36k
  if (FDKreadBits(bs, 1) != 0) {         /* reserved, set to 0 */
625
326
    return 0;
626
326
  }
627
628
  /* Evaluate ancillary_data_status */
629
2.03k
  if (FDKreadBits(bs, 3) != 0) { /* reserved, set to 0 */
630
34
    return 0;
631
34
  }
632
2.00k
  dmxLevelsPresent = FDKreadBits(bs, 1); /* downmixing_levels_MPEG4_status */
633
2.00k
  /*extensionPresent =*/FDKreadBits(bs,
634
2.00k
                                    1); /* ancillary_data_extension_status; */
635
2.00k
  compressionPresent =
636
2.00k
      FDKreadBits(bs, 1); /* audio_coding_mode_and_compression status */
637
2.00k
  /*coarseGrainTcPresent =*/FDKreadBits(bs,
638
2.00k
                                        1); /* coarse_grain_timecode_status */
639
2.00k
  /*fineGrainTcPresent   =*/FDKreadBits(bs, 1); /* fine_grain_timecode_status */
640
641
2.00k
  if (dmxLevelsPresent) {
642
300
    FDKreadBits(bs, 8); /* downmixing_levels_MPEG4 */
643
300
  }
644
645
  /* audio_coding_mode_and_compression_status */
646
2.00k
  if (compressionPresent) {
647
1.92k
    UCHAR compressionOn, compressionValue;
648
649
    /* audio_coding_mode */
650
1.92k
    if (FDKreadBits(bs, 7) != 0) { /* The reserved bits shall be set to "0". */
651
480
      return 0;
652
480
    }
653
1.44k
    compressionOn = (UCHAR)FDKreadBits(bs, 1);    /* compression_on */
654
1.44k
    compressionValue = (UCHAR)FDKreadBits(bs, 8); /* Compression_value */
655
656
1.44k
    if (compressionOn) {
657
      /* A compression value is available so store the data just like MPEG DRC
658
       * data */
659
1.17k
      pDrcBs->channelData.numBands = 1; /* One band ... */
660
1.17k
      pDrcBs->channelData.drcValue[0] =
661
1.17k
          compressionValue; /* ... with one value ... */
662
1.17k
      pDrcBs->channelData.bandTop[0] =
663
1.17k
          DRC_BLOCK_LEN_DIV_BAND_MULT -
664
1.17k
          1; /* ... comprising the whole spectrum. */
665
1.17k
      ;
666
1.17k
      pDrcBs->pceInstanceTag = -1; /* Not present */
667
1.17k
      pDrcBs->progRefLevel = -1;   /* Not present */
668
1.17k
      pDrcBs->channelData.drcDataType =
669
1.17k
          DVB_DRC_ANC_DATA; /* Set DRC payload type to DVB. */
670
1.17k
      foundDrcData = 1;
671
1.17k
    }
672
1.44k
  }
673
674
1.52k
  return (foundDrcData);
675
2.00k
}
676
677
/*
678
 * Extract DRC payload from bitstream and map it to channels.
679
 *   Valid return values are:
680
 *     -1 : An unexpected error occured.
681
 *      0 : No error and no valid DRC data available.
682
 *      1 : No error and valid DRC data has been mapped.
683
 */
684
static int aacDecoder_drcExtractAndMap(
685
    HANDLE_AAC_DRC self, HANDLE_FDK_BITSTREAM hBs,
686
    CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[],
687
    UCHAR pceInstanceTag,
688
    UCHAR channelMapping[], /* Channel mapping translating drcChannel index to
689
                               canonical channel index */
690
456k
    int validChannels) {
691
456k
  CDrcPayload threadBs[MAX_DRC_THREADS];
692
456k
  CDrcPayload *validThreadBs[MAX_DRC_THREADS];
693
456k
  CDrcParams *pParams;
694
456k
  UINT backupBsPosition;
695
456k
  int result = 0;
696
456k
  int i, thread, validThreads = 0;
697
698
456k
  FDK_ASSERT(self != NULL);
699
456k
  FDK_ASSERT(hBs != NULL);
700
456k
  FDK_ASSERT(pAacDecoderStaticChannelInfo != NULL);
701
702
456k
  pParams = &self->params;
703
704
456k
  self->numThreads = 0;
705
456k
  backupBsPosition = FDKgetValidBits(hBs);
706
707
495k
  for (i = 0; i < self->numPayloads && self->numThreads < MAX_DRC_THREADS;
708
456k
       i++) {
709
    /* Init payload data chunk. The memclear is very important because it
710
       initializes the most values. Without it the module wouldn't work properly
711
       or crash. */
712
38.9k
    FDKmemclear(&threadBs[self->numThreads], sizeof(CDrcPayload));
713
38.9k
    threadBs[self->numThreads].channelData.bandTop[0] =
714
38.9k
        DRC_BLOCK_LEN_DIV_BAND_MULT - 1;
715
716
    /* Extract payload */
717
38.9k
    self->numThreads += aacDecoder_drcParse(hBs, &threadBs[self->numThreads],
718
38.9k
                                            self->drcPayloadPosition[i]);
719
38.9k
  }
720
456k
  self->numPayloads = 0;
721
722
456k
  if (self->dvbAncDataAvailable &&
723
2.37k
      self->numThreads < MAX_DRC_THREADS) { /* Append a DVB heavy compression
724
                                               payload thread if available. */
725
726
    /* Init payload data chunk. The memclear is very important because it
727
       initializes the most values. Without it the module wouldn't work properly
728
       or crash. */
729
2.37k
    FDKmemclear(&threadBs[self->numThreads], sizeof(CDrcPayload));
730
2.37k
    threadBs[self->numThreads].channelData.bandTop[0] =
731
2.37k
        DRC_BLOCK_LEN_DIV_BAND_MULT - 1;
732
733
    /* Extract payload */
734
2.37k
    self->numThreads += aacDecoder_drcReadCompression(
735
2.37k
        hBs, &threadBs[self->numThreads], self->dvbAncDataPosition);
736
2.37k
  }
737
456k
  self->dvbAncDataAvailable = 0;
738
739
  /* Reset the bitbufffer */
740
456k
  FDKpushBiDirectional(hBs, (INT)FDKgetValidBits(hBs) - (INT)backupBsPosition);
741
742
  /* calculate number of valid bits in excl_chn_mask */
743
744
  /* coupling channels not supported */
745
746
  /* check for valid threads */
747
496k
  for (thread = 0; thread < self->numThreads; thread++) {
748
40.1k
    CDrcPayload *pThreadBs = &threadBs[thread];
749
40.1k
    int numExclChns = 0;
750
751
40.1k
    switch ((AACDEC_DRC_PAYLOAD_TYPE)pThreadBs->channelData.drcDataType) {
752
0
      default:
753
0
        continue;
754
38.9k
      case MPEG_DRC_EXT_DATA:
755
40.1k
      case DVB_DRC_ANC_DATA:
756
40.1k
        break;
757
40.1k
    }
758
759
40.1k
    if (pThreadBs->pceInstanceTag >= 0) { /* if PCE tag present */
760
12.4k
      if (pThreadBs->pceInstanceTag != pceInstanceTag) {
761
4.93k
        continue; /* don't accept */
762
4.93k
      }
763
12.4k
    }
764
765
    /* calculate number of excluded channels */
766
35.1k
    if (pThreadBs->excludedChnsMask > 0) {
767
27.9k
      INT exclMask = pThreadBs->excludedChnsMask;
768
27.9k
      int ch;
769
63.1k
      for (ch = 0; ch < validChannels; ch++) {
770
35.1k
        numExclChns += exclMask & 0x1;
771
35.1k
        exclMask >>= 1;
772
35.1k
      }
773
27.9k
    }
774
35.1k
    if (numExclChns < validChannels) {
775
12.4k
      validThreadBs[validThreads] = pThreadBs;
776
12.4k
      validThreads++;
777
12.4k
    }
778
35.1k
  }
779
780
  /* map DRC bitstream information onto DRC channel information */
781
469k
  for (thread = 0; thread < validThreads; thread++) {
782
12.4k
    CDrcPayload *pThreadBs = validThreadBs[thread];
783
12.4k
    INT exclMask = pThreadBs->excludedChnsMask;
784
12.4k
    AACDEC_DRC_PAYLOAD_TYPE drcPayloadType =
785
12.4k
        (AACDEC_DRC_PAYLOAD_TYPE)pThreadBs->channelData.drcDataType;
786
12.4k
    int ch;
787
788
    /* last progRefLevel transmitted is the one that is used
789
     * (but it should really only be transmitted once per block!)
790
     */
791
12.4k
    if (pThreadBs->progRefLevel >= 0) {
792
4.68k
      self->progRefLevel = pThreadBs->progRefLevel;
793
4.68k
      self->progRefLevelPresent = 1;
794
4.68k
      self->prlExpiryCount = 0; /* Got a new value -> Reset counter */
795
4.68k
    }
796
797
12.4k
    if (drcPayloadType == DVB_DRC_ANC_DATA) {
798
      /* Announce the presentation mode of this valid thread. */
799
1.17k
      self->presMode = pThreadBs->presMode;
800
1.17k
    }
801
802
    /* SCE, CPE and LFE */
803
48.4k
    for (ch = 0; ch < validChannels; ch++) {
804
35.9k
      AACDEC_DRC_PAYLOAD_TYPE prvPayloadType = UNKNOWN_PAYLOAD;
805
35.9k
      int mapedChannel = channelMapping[ch];
806
807
35.9k
      if ((mapedChannel >= validChannels) ||
808
35.9k
          ((exclMask & (1 << mapedChannel)) != 0))
809
2.87k
        continue;
810
811
33.0k
      if ((pParams->expiryFrame <= 0) ||
812
0
          (pAacDecoderStaticChannelInfo[ch]->drcData.expiryCount <
813
33.0k
           pParams->expiryFrame)) {
814
33.0k
        prvPayloadType =
815
33.0k
            (AACDEC_DRC_PAYLOAD_TYPE)pAacDecoderStaticChannelInfo[ch]
816
33.0k
                ->drcData.drcDataType;
817
33.0k
      }
818
33.0k
      if (((drcPayloadType == MPEG_DRC_EXT_DATA) &&
819
29.2k
           (prvPayloadType != DVB_DRC_ANC_DATA)) ||
820
4.32k
          ((drcPayloadType == DVB_DRC_ANC_DATA) &&
821
3.85k
           (pParams->applyHeavyCompression ==
822
31.9k
            ON))) { /* copy thread to channel */
823
31.9k
        pAacDecoderStaticChannelInfo[ch]->drcData = pThreadBs->channelData;
824
31.9k
        result = 1;
825
31.9k
      }
826
33.0k
    }
827
    /* CCEs not supported by now */
828
12.4k
  }
829
830
  /* Increment and check expiry counter for the program reference level: */
831
456k
  if ((pParams->expiryFrame > 0) &&
832
0
      (self->prlExpiryCount++ >
833
0
       pParams->expiryFrame)) { /* The program reference level is too old, so
834
                                   set it back to the target level. */
835
0
    self->progRefLevelPresent = 0;
836
0
    self->progRefLevel = pParams->targetRefLevel;
837
0
    self->prlExpiryCount = 0;
838
0
  }
839
840
456k
  return result;
841
456k
}
842
843
void aacDecoder_drcApply(HANDLE_AAC_DRC self, void *pSbrDec,
844
                         CAacDecoderChannelInfo *pAacDecoderChannelInfo,
845
                         CDrcChannelData *pDrcChData, FIXP_DBL *extGain,
846
                         int ch, /* needed only for SBR */
847
798k
                         int aacFrameSize, int bSbrPresent) {
848
798k
  int band, bin, numBands;
849
798k
  int bottom = 0;
850
798k
  int modifyBins = 0;
851
852
798k
  FIXP_DBL max_mantissa;
853
798k
  INT max_exponent;
854
855
798k
  FIXP_DBL norm_mantissa = FL2FXCONST_DBL(0.5f);
856
798k
  INT norm_exponent = 1;
857
858
798k
  FIXP_DBL fact_mantissa[MAX_DRC_BANDS];
859
798k
  INT fact_exponent[MAX_DRC_BANDS];
860
861
798k
  CDrcParams *pParams = &self->params;
862
863
798k
  FIXP_DBL *pSpectralCoefficient =
864
798k
      SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient);
865
798k
  CIcsInfo *pIcsInfo = &pAacDecoderChannelInfo->icsInfo;
866
798k
  SHORT *pSpecScale = pAacDecoderChannelInfo->specScale;
867
868
798k
  int winSeq = pIcsInfo->WindowSequence;
869
870
  /* Increment and check expiry counter */
871
798k
  if ((pParams->expiryFrame > 0) &&
872
0
      (++pDrcChData->expiryCount >
873
0
       pParams->expiryFrame)) { /* The DRC data is too old, so delete it. */
874
0
    aacDecoder_drcInitChannelData(pDrcChData);
875
0
  }
876
877
798k
  if (self->enable != ON) {
878
414k
    sbrDecoder_drcDisable((HANDLE_SBRDECODER)pSbrDec, ch);
879
414k
    if (extGain != NULL) {
880
414k
      INT gainScale = (INT)*extGain;
881
      /* The gain scaling must be passed to the function in the buffer pointed
882
       * on by extGain. */
883
414k
      if (gainScale >= 0 && gainScale <= DFRACT_BITS) {
884
414k
        *extGain = scaleValue(norm_mantissa, norm_exponent - gainScale);
885
414k
      } else {
886
0
        FDK_ASSERT(0);
887
0
      }
888
414k
    }
889
414k
    return;
890
414k
  }
891
892
384k
  numBands = pDrcChData->numBands;
893
894
  /* If program reference normalization is done in the digital domain,
895
  modify factor to perform normalization.  prog_ref_level can
896
  alternatively be passed to the system for modification of the level in
897
  the analog domain.  Analog level modification avoids problems with
898
  reduced DAC SNR (if signal is attenuated) or clipping (if signal is
899
  boosted) */
900
901
384k
  if (pParams->targetRefLevel >= 0) {
902
    /* 0.5^((targetRefLevel - progRefLevel)/24) */
903
384k
    norm_mantissa =
904
384k
        fLdPow(FL2FXCONST_DBL(-1.0), /* log2(0.5) */
905
384k
               0,
906
384k
               (FIXP_DBL)((INT)(FL2FXCONST_DBL(1.0f / 24.0) >> 3) *
907
384k
                          (INT)(pParams->targetRefLevel - self->progRefLevel)),
908
384k
               3, &norm_exponent);
909
384k
  }
910
  /* Always export the normalization gain (if possible). */
911
384k
  if (extGain != NULL) {
912
384k
    INT gainScale = (INT)*extGain;
913
    /* The gain scaling must be passed to the function in the buffer pointed on
914
     * by extGain. */
915
384k
    if (gainScale >= 0 && gainScale <= DFRACT_BITS) {
916
384k
      *extGain = scaleValue(norm_mantissa, norm_exponent - gainScale);
917
384k
    } else {
918
0
      FDK_ASSERT(0);
919
0
    }
920
384k
  }
921
  /* Reset normalization gain since this module must not apply it */
922
384k
  norm_mantissa = FL2FXCONST_DBL(0.5f);
923
384k
  norm_exponent = 1;
924
925
  /* calc scale factors */
926
1.02M
  for (band = 0; band < numBands; band++) {
927
642k
    UCHAR drcVal = pDrcChData->drcValue[band];
928
929
642k
    fact_mantissa[band] = FL2FXCONST_DBL(0.5f);
930
642k
    fact_exponent[band] = 1;
931
932
642k
    if ((pParams->applyHeavyCompression == ON) &&
933
6.34k
        ((AACDEC_DRC_PAYLOAD_TYPE)pDrcChData->drcDataType ==
934
6.34k
         DVB_DRC_ANC_DATA)) {
935
4.81k
      INT compressionFactorVal_e;
936
4.81k
      int valX, valY;
937
938
4.81k
      valX = drcVal >> 4;
939
4.81k
      valY = drcVal & 0x0F;
940
941
      /* calculate the unscaled heavy compression factor.
942
         compressionFactor = 48.164 - 6.0206*valX - 0.4014*valY dB
943
         range: -48.166 dB to 48.164 dB */
944
4.81k
      if (drcVal != 0x7F) {
945
4.69k
        fact_mantissa[band] = fPowInt(
946
4.69k
            FL2FXCONST_DBL(0.95483867181), /* -0.4014dB = 0.95483867181 */
947
4.69k
            0, valY, &compressionFactorVal_e);
948
949
        /* -0.0008dB (48.164 - 6.0206*8 = -0.0008) */
950
4.69k
        fact_mantissa[band] =
951
4.69k
            fMult(FL2FXCONST_DBL(0.99990790084), fact_mantissa[band]);
952
953
4.69k
        fact_exponent[band] =
954
4.69k
            DVB_COMPRESSION_SCALE - valX + compressionFactorVal_e;
955
4.69k
      }
956
637k
    } else if ((AACDEC_DRC_PAYLOAD_TYPE)pDrcChData->drcDataType ==
957
637k
               MPEG_DRC_EXT_DATA) {
958
      /* apply the scaled dynamic range control words to factor.
959
       * if scaling drc_cut (or drc_boost), or control word drc_mantissa is 0
960
       * then there is no dynamic range compression
961
       *
962
       * if pDrcChData->drcSgn[band] is
963
       *  1 then gain is < 1 :  factor = 2^(-self->cut   *
964
       * pDrcChData->drcMag[band] / 24) 0 then gain is > 1 :  factor = 2^(
965
       * self->boost * pDrcChData->drcMag[band] / 24)
966
       */
967
968
325k
      if ((drcVal & 0x7F) > 0) {
969
218k
        FIXP_DBL tParamVal = (drcVal & 0x80) ? -pParams->cut : pParams->boost;
970
971
218k
        fact_mantissa[band] = f2Pow(
972
218k
            (FIXP_DBL)((INT)fMult(FL2FXCONST_DBL(1.0f / 192.0f), tParamVal) *
973
218k
                       (drcVal & 0x7F)),
974
218k
            3 + DRC_PARAM_SCALE, &fact_exponent[band]);
975
218k
      }
976
325k
    }
977
978
642k
    fact_mantissa[band] = fMult(fact_mantissa[band], norm_mantissa);
979
642k
    fact_exponent[band] += norm_exponent;
980
981
642k
  } /* end loop over bands */
982
983
  /* normalizations */
984
384k
  {
985
384k
    int res;
986
987
384k
    max_mantissa = FL2FXCONST_DBL(0.0f);
988
384k
    max_exponent = 0;
989
1.02M
    for (band = 0; band < numBands; band++) {
990
642k
      max_mantissa = fixMax(max_mantissa, fact_mantissa[band]);
991
642k
      max_exponent = fixMax(max_exponent, fact_exponent[band]);
992
642k
    }
993
994
    /* left shift factors to gain accurancy */
995
384k
    res = CntLeadingZeros(max_mantissa) - 1;
996
997
    /* above topmost DRC band gain factor is 1 */
998
384k
    if (((pDrcChData->bandTop[fMax(0, numBands - 1)] + 1) << 2) < aacFrameSize)
999
30.3k
      res = 0;
1000
1001
384k
    if (res > 0) {
1002
354k
      res = fixMin(res, max_exponent);
1003
354k
      max_exponent -= res;
1004
1005
712k
      for (band = 0; band < numBands; band++) {
1006
358k
        fact_mantissa[band] <<= res;
1007
358k
        fact_exponent[band] -= res;
1008
358k
      }
1009
354k
    }
1010
1011
    /* normalize magnitudes to one scale factor */
1012
1.02M
    for (band = 0; band < numBands; band++) {
1013
642k
      if (fact_exponent[band] < max_exponent) {
1014
825
        fact_mantissa[band] >>= max_exponent - fact_exponent[band];
1015
825
      }
1016
642k
      if (fact_mantissa[band] != FL2FXCONST_DBL(0.5f)) {
1017
289k
        modifyBins = 1;
1018
289k
      }
1019
642k
    }
1020
384k
    if (max_exponent != 1) {
1021
35.0k
      modifyBins = 1;
1022
35.0k
    }
1023
384k
  }
1024
1025
  /*  apply factor to spectral lines
1026
   *  short blocks must take care that bands fall on
1027
   *  block boundaries!
1028
   */
1029
384k
  if (!bSbrPresent) {
1030
176k
    bottom = 0;
1031
1032
176k
    if (!modifyBins) {
1033
      /* We don't have to modify the spectral bins because the fractional part
1034
         of all factors is 0.5. In order to keep accurancy we don't apply the
1035
         factor but decrease the exponent instead. */
1036
155k
      max_exponent -= 1;
1037
155k
    } else {
1038
248k
      for (band = 0; band < numBands; band++) {
1039
227k
        int top = fixMin((int)((pDrcChData->bandTop[band] + 1) << 2),
1040
227k
                         aacFrameSize); /* ... * DRC_BAND_MULT; */
1041
1042
13.5M
        for (bin = bottom; bin < top; bin++) {
1043
13.3M
          pSpectralCoefficient[bin] =
1044
13.3M
              fMult(pSpectralCoefficient[bin], fact_mantissa[band]);
1045
13.3M
        }
1046
1047
227k
        bottom = top;
1048
227k
      }
1049
21.3k
    }
1050
1051
    /* above topmost DRC band gain factor is 1 */
1052
176k
    if (max_exponent > 0) {
1053
10.2M
      for (bin = bottom; bin < aacFrameSize; bin += 1) {
1054
10.2M
        pSpectralCoefficient[bin] >>= max_exponent;
1055
10.2M
      }
1056
21.3k
    }
1057
1058
    /* adjust scaling */
1059
176k
    pSpecScale[0] += max_exponent;
1060
1061
176k
    if (winSeq == BLOCK_SHORT) {
1062
37.7k
      int win;
1063
302k
      for (win = 1; win < 8; win++) {
1064
264k
        pSpecScale[win] += max_exponent;
1065
264k
      }
1066
37.7k
    }
1067
207k
  } else {
1068
207k
    HANDLE_SBRDECODER hSbrDecoder = (HANDLE_SBRDECODER)pSbrDec;
1069
207k
    numBands = pDrcChData->numBands;
1070
1071
    /* feed factors into SBR decoder for application in QMF domain. */
1072
207k
    sbrDecoder_drcFeedChannel(hSbrDecoder, ch, numBands, fact_mantissa,
1073
207k
                              max_exponent, pDrcChData->drcInterpolationScheme,
1074
207k
                              winSeq, pDrcChData->bandTop);
1075
207k
  }
1076
1077
384k
  return;
1078
384k
}
1079
1080
/*
1081
 * DRC parameter and presentation mode handling
1082
 */
1083
static void aacDecoder_drcParameterHandling(HANDLE_AAC_DRC self,
1084
                                            INT aacNumChannels,
1085
                                            SCHAR prevDrcProgRefLevel,
1086
456k
                                            SCHAR prevDrcPresMode) {
1087
456k
  int isDownmix, isMonoDownmix, isStereoDownmix;
1088
456k
  int dDmx, dHr;
1089
456k
  AACDEC_DRC_PARAMETER_HANDLING drcParameterHandling;
1090
456k
  CDrcParams *p;
1091
1092
456k
  FDK_ASSERT(self != NULL);
1093
1094
456k
  p = &self->params;
1095
1096
456k
  if (self->progRefLevel != prevDrcProgRefLevel) self->update = 1;
1097
1098
456k
  if (self->presMode != prevDrcPresMode) self->update = 1;
1099
1100
456k
  if (self->prevAacNumChannels != aacNumChannels) self->update = 1;
1101
1102
  /* return if no relevant parameter has changed */
1103
456k
  if (!self->update) {
1104
432k
    return;
1105
432k
  }
1106
1107
  /* derive downmix property. aacNumChannels: number of channels in aac stream,
1108
   * numOutChannels: number of output channels */
1109
24.2k
  isDownmix = (aacNumChannels > self->numOutChannels);
1110
24.2k
  isDownmix = (isDownmix && (self->numOutChannels > 0));
1111
24.2k
  isMonoDownmix = (isDownmix && (self->numOutChannels == 1));
1112
24.2k
  isStereoDownmix = (isDownmix && (self->numOutChannels == 2));
1113
1114
24.2k
  if ((self->presMode == 1) || (self->presMode == 2)) {
1115
1.23k
    drcParameterHandling = (AACDEC_DRC_PARAMETER_HANDLING)self->presMode;
1116
22.9k
  } else { /* no presentation mode -> use parameter handling specified by
1117
              AAC_DRC_DEFAULT_PRESENTATION_MODE */
1118
22.9k
    drcParameterHandling = p->defaultPresentationMode;
1119
22.9k
  }
1120
1121
  /* by default, do as desired */
1122
24.2k
  p->cut = p->usrCut;
1123
24.2k
  p->boost = p->usrBoost;
1124
24.2k
  p->applyHeavyCompression = p->usrApplyHeavyCompression;
1125
1126
24.2k
  switch (drcParameterHandling) {
1127
22.9k
    case DISABLED_PARAMETER_HANDLING:
1128
22.9k
    default:
1129
      /* use drc parameters as requested */
1130
22.9k
      break;
1131
1132
22.9k
    case ENABLED_PARAMETER_HANDLING:
1133
      /* dDmx: estimated headroom reduction due to downmix, format: -1/4*dB
1134
         dDmx = floor(-4*20*log10(aacNumChannels/numOutChannels)) */
1135
0
      if (isDownmix) {
1136
0
        FIXP_DBL dmxTmp;
1137
0
        int e_log, e_mult;
1138
0
        dmxTmp = fDivNorm(self->numOutChannels,
1139
0
                          aacNumChannels); /* inverse division ->
1140
                                              negative sign after
1141
                                              logarithm */
1142
0
        dmxTmp = fLog2(dmxTmp, 0, &e_log);
1143
0
        dmxTmp = fMultNorm(
1144
0
            dmxTmp, FL2FXCONST_DBL(4.0f * 20.0f * 0.30103f / (float)(1 << 5)),
1145
0
            &e_mult); /* e = e_log + e_mult + 5 */
1146
0
        dDmx = (int)scaleValue(dmxTmp, e_log + e_mult + 5 - (DFRACT_BITS - 1));
1147
0
      } else {
1148
0
        dDmx = 0;
1149
0
      }
1150
1151
      /* dHr: Full estimated (decoder) headroom reduction due to loudness
1152
       * normalisation (DTL - PRL) and downmix. Format: -1/4*dB */
1153
0
      if (p->targetRefLevel >= 0) { /* if target level is provided */
1154
0
        dHr = p->targetRefLevel + dDmx - self->progRefLevel;
1155
0
      } else {
1156
0
        dHr = dDmx;
1157
0
      }
1158
1159
0
      if (dHr < 0) { /* if headroom is reduced */
1160
        /* Use compression, but as little as possible. */
1161
        /* eHr: Headroom provided by encoder, format: -1/4 dB */
1162
0
        int eHr = fixMin(p->encoderTargetLevel - self->progRefLevel, 0);
1163
0
        if (eHr <
1164
0
            dHr) { /* if encoder provides more headroom than decoder needs */
1165
          /* derive scaling of light DRC */
1166
0
          FIXP_DBL calcFactor_norm;
1167
0
          INT calcFactor; /* fraction of DRC gains that is minimally needed for
1168
                             clipping prevention */
1169
0
          calcFactor_norm =
1170
0
              fDivNorm(-dHr, -eHr); /* 0.0 < calcFactor_norm < 1.0 */
1171
0
          calcFactor_norm = calcFactor_norm >> DRC_PARAM_SCALE;
1172
          /* quantize to 128 steps */
1173
0
          calcFactor = convert_drcParam(
1174
0
              calcFactor_norm); /* convert to integer value between 0 and 127 */
1175
0
          calcFactor_norm = (FIXP_DBL)(
1176
0
              (INT)(DRC_PARAM_QUANT_STEP >> DRC_PARAM_SCALE) * calcFactor);
1177
0
          p->cut = (calcFactor_norm > p->cut)
1178
0
                       ? calcFactor_norm
1179
0
                       : p->cut; /* use calcFactor_norm as lower limit */
1180
0
        } else {
1181
          /* encoder provides equal or less headroom than decoder needs */
1182
          /* the time domain limiter must always be active in this case. It is
1183
           * assumed that the framework activates it by default */
1184
0
          p->cut = DRC_SCALING_MAX;
1185
0
          if ((dHr - eHr) <=
1186
0
              -4 * DRC_HEAVY_THRESHOLD_DB) { /* use heavy compression if
1187
                                                headroom deficit is equal or
1188
                                                higher than
1189
                                                DRC_HEAVY_THRESHOLD_DB */
1190
0
            p->applyHeavyCompression = ON;
1191
0
          }
1192
0
        }
1193
0
      } else { /* dHr >= 0 */
1194
        /* no restrictions required, as headroom is not reduced. */
1195
        /* p->cut = p->usrCut; */
1196
0
      }
1197
0
      break;
1198
1199
      /* presentation mode 1 and 2 according to ETSI TS 101 154:
1200
         Digital Video Broadcasting (DVB); Specification for the use of Video
1201
         and Audio Coding in Broadcasting Applications based on the MPEG-2
1202
         Transport Stream, section C.5.4., "Decoding", and Table C.33. Also
1203
         according to amendment 4 to ISO/IEC 14496-3, section 4.5.2.14.2.4, and
1204
         Table AMD4.11. ISO DRC            -> applyHeavyCompression = OFF (Use
1205
         light compression, MPEG-style) Compression_value  ->
1206
         applyHeavyCompression = ON  (Use heavy compression, DVB-style) scaling
1207
         restricted -> p->cut = DRC_SCALING_MAX */
1208
1209
1.17k
    case DRC_PRESENTATION_MODE_1: /* presentation mode 1, Light:-31/Heavy:-23 */
1210
1.17k
      if ((p->targetRefLevel >= 0) &&
1211
1.17k
          (p->targetRefLevel <
1212
1.17k
           124)) { /* if target level is provided and > -31 dB */
1213
        /* playback up to -23 dB */
1214
1.17k
        p->applyHeavyCompression = ON;
1215
1.17k
      } else { /* target level <= -31 dB or not provided */
1216
        /* playback -31 dB */
1217
0
        if (isMonoDownmix || isStereoDownmix) { /* stereo or mono downmixing */
1218
0
          p->cut = DRC_SCALING_MAX;
1219
0
        }
1220
0
      }
1221
1.17k
      break;
1222
1223
53
    case DRC_PRESENTATION_MODE_2: /* presentation mode 2, Light:-23/Heavy:-23 */
1224
53
      if ((p->targetRefLevel >= 0) &&
1225
53
          (p->targetRefLevel <
1226
53
           124)) { /* if target level is provided and > -31 dB */
1227
        /* playback up to -23 dB */
1228
53
        if (isMonoDownmix) { /* if mono downmix */
1229
0
          p->applyHeavyCompression = ON;
1230
53
        } else {
1231
53
          p->applyHeavyCompression = OFF;
1232
53
          p->cut = DRC_SCALING_MAX;
1233
53
        }
1234
53
      } else { /* target level <= -31 dB or not provided */
1235
        /* playback -31 dB */
1236
0
        p->applyHeavyCompression = OFF;
1237
0
        if (isMonoDownmix || isStereoDownmix) { /* stereo or mono downmixing */
1238
0
          p->cut = DRC_SCALING_MAX;
1239
0
        }
1240
0
      }
1241
53
      break;
1242
24.2k
  } /*  switch (drcParameterHandling) */
1243
1244
  /* With heavy compression, there is no scaling.
1245
     Scaling factors are set for notification only. */
1246
24.2k
  if (p->applyHeavyCompression == ON) {
1247
1.17k
    p->boost = DRC_SCALING_MAX;
1248
1.17k
    p->cut = DRC_SCALING_MAX;
1249
1.17k
  }
1250
1251
  /* switch on/off processing */
1252
24.2k
  self->enable = ((p->boost > (FIXP_DBL)0) || (p->cut > (FIXP_DBL)0) ||
1253
22.9k
                  (p->applyHeavyCompression == ON) || (p->targetRefLevel >= 0));
1254
1255
24.2k
  self->prevAacNumChannels = aacNumChannels;
1256
24.2k
  self->update = 0;
1257
24.2k
}
1258
1259
/*
1260
 * Prepare DRC processing
1261
 *   Valid return values are:
1262
 *     -1 : An unexpected error occured.
1263
 *      0 : No error and no valid DRC data available.
1264
 *      1 : No error and valid DRC data has been mapped.
1265
 */
1266
int aacDecoder_drcProlog(
1267
    HANDLE_AAC_DRC self, HANDLE_FDK_BITSTREAM hBs,
1268
    CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[],
1269
    UCHAR pceInstanceTag,
1270
    UCHAR channelMapping[], /* Channel mapping translating drcChannel index to
1271
                               canonical channel index */
1272
456k
    int validChannels) {
1273
456k
  int result = 0;
1274
1275
456k
  if (self == NULL) {
1276
0
    return -1;
1277
0
  }
1278
1279
456k
  if (!self->params.bsDelayEnable) {
1280
    /* keep previous progRefLevel and presMode for update flag in
1281
     * drcParameterHandling */
1282
415k
    INT prevPRL, prevPM = 0;
1283
415k
    prevPRL = self->progRefLevel;
1284
415k
    prevPM = self->presMode;
1285
1286
415k
    result = aacDecoder_drcExtractAndMap(
1287
415k
        self, hBs, pAacDecoderStaticChannelInfo, pceInstanceTag, channelMapping,
1288
415k
        validChannels);
1289
1290
415k
    if (result < 0) {
1291
0
      return result;
1292
0
    }
1293
1294
    /* Drc parameter handling */
1295
415k
    aacDecoder_drcParameterHandling(self, validChannels, prevPRL, prevPM);
1296
415k
  }
1297
1298
456k
  return result;
1299
456k
}
1300
1301
/*
1302
 * Finalize DRC processing
1303
 *   Valid return values are:
1304
 *     -1 : An unexpected error occured.
1305
 *      0 : No error and no valid DRC data available.
1306
 *      1 : No error and valid DRC data has been mapped.
1307
 */
1308
int aacDecoder_drcEpilog(
1309
    HANDLE_AAC_DRC self, HANDLE_FDK_BITSTREAM hBs,
1310
    CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[],
1311
    UCHAR pceInstanceTag,
1312
    UCHAR channelMapping[], /* Channel mapping translating drcChannel index to
1313
                               canonical channel index */
1314
456k
    int validChannels) {
1315
456k
  int result = 0;
1316
1317
456k
  if (self == NULL) {
1318
0
    return -1;
1319
0
  }
1320
1321
456k
  if (self->params.bsDelayEnable) {
1322
    /* keep previous progRefLevel and presMode for update flag in
1323
     * drcParameterHandling */
1324
41.6k
    INT prevPRL, prevPM = 0;
1325
41.6k
    prevPRL = self->progRefLevel;
1326
41.6k
    prevPM = self->presMode;
1327
1328
41.6k
    result = aacDecoder_drcExtractAndMap(
1329
41.6k
        self, hBs, pAacDecoderStaticChannelInfo, pceInstanceTag, channelMapping,
1330
41.6k
        validChannels);
1331
1332
41.6k
    if (result < 0) {
1333
0
      return result;
1334
0
    }
1335
1336
    /* Drc parameter handling */
1337
41.6k
    aacDecoder_drcParameterHandling(self, validChannels, prevPRL, prevPM);
1338
41.6k
  }
1339
1340
456k
  return result;
1341
456k
}
1342
1343
/*
1344
 * Export relevant metadata info from bitstream payload.
1345
 */
1346
void aacDecoder_drcGetInfo(HANDLE_AAC_DRC self, SCHAR *pPresMode,
1347
456k
                           SCHAR *pProgRefLevel) {
1348
456k
  if (self != NULL) {
1349
456k
    if (pPresMode != NULL) {
1350
456k
      *pPresMode = self->presMode;
1351
456k
    }
1352
456k
    if (pProgRefLevel != NULL) {
1353
456k
      if (self->progRefLevelPresent) {
1354
17.9k
        *pProgRefLevel = self->progRefLevel;
1355
438k
      } else {
1356
438k
        *pProgRefLevel = -1;
1357
438k
      }
1358
456k
    }
1359
456k
  }
1360
456k
}
1361
1362
/**
1363
 * \brief  Apply DRC Level Normalization.
1364
 *
1365
 *         This function prepares/applies the gain values for the DRC Level
1366
 * Normalization and returns the exponent of the time data. The following two
1367
 * cases are handled:
1368
 *
1369
 *         - Limiter enabled:
1370
 *           The input data must be interleaved.
1371
 *           One gain per sample is written to the buffer pGainPerSample.
1372
 *           If necessary the time data is rescaled.
1373
 *
1374
 *         - Limiter disabled:
1375
 *           The input data can be interleaved or deinterleaved.
1376
 *           The gain values are applied to the time data.
1377
 *           If necessary the time data is rescaled.
1378
 *
1379
 * \param hDrcInfo                     [i/o] handle to drc data structure.
1380
 * \param samplesIn                    [i/o] pointer to time data.
1381
 * \param pGain                        [i  ] pointer to gain to be applied to
1382
 * the time data.
1383
 * \param pGainPerSample               [o  ] pointer to the gain per sample to
1384
 * be applied to the time data in the limiter.
1385
 * \param gain_scale                   [i  ] exponent to be applied to the time
1386
 * data.
1387
 * \param gain_delay                   [i  ] delay[samples] with which the gains
1388
 * in pGain shall be applied (gain_delay <= nSamples).
1389
 * \param nSamples                     [i  ] number of samples per frame.
1390
 * \param channels                     [i  ] number of channels.
1391
 * \param stride                       [i  ] channel stride of time data.
1392
 * \param limiterEnabled               [i  ] 1 if limiter is enabled, otherwise
1393
 * 0.
1394
 *
1395
 * \return exponent of time data
1396
 */
1397
INT applyDrcLevelNormalization(HANDLE_AAC_DRC hDrcInfo, PCM_DEC *samplesIn,
1398
                               FIXP_DBL *pGain, FIXP_DBL *pGainPerSample,
1399
                               const INT gain_scale, const UINT gain_delay,
1400
                               const UINT nSamples, const UINT channels,
1401
17.9k
                               const UINT stride, const UINT limiterEnabled) {
1402
17.9k
  UINT i;
1403
17.9k
  INT additionalGain_scaling;
1404
17.9k
  FIXP_DBL additionalGain;
1405
1406
17.9k
  FDK_ASSERT(gain_delay <= nSamples);
1407
1408
17.9k
  FIXP_DBL additionalGainSmoothState = hDrcInfo->additionalGainFilterState;
1409
17.9k
  FIXP_DBL additionalGainSmoothState1 = hDrcInfo->additionalGainFilterState1;
1410
1411
17.9k
  if (!gain_delay) {
1412
0
    additionalGain = pGain[0];
1413
1414
    /* Apply the additional scaling gain_scale[0] that has no delay and no
1415
     * smoothing */
1416
0
    additionalGain_scaling =
1417
0
        fMin(gain_scale, CntLeadingZeros(additionalGain) - 1);
1418
0
    additionalGain = scaleValue(additionalGain, additionalGain_scaling);
1419
1420
    /* if it's not possible to fully apply gain_scale to additionalGain, apply
1421
     * it to the input signal */
1422
0
    additionalGain_scaling -= gain_scale;
1423
1424
0
    if (additionalGain_scaling) {
1425
0
      scaleValuesSaturate(samplesIn, channels * nSamples,
1426
0
                          -additionalGain_scaling);
1427
0
    }
1428
1429
0
    if (limiterEnabled) {
1430
0
      FDK_ASSERT(pGainPerSample != NULL);
1431
1432
0
      for (i = 0; i < nSamples; i++) {
1433
0
        pGainPerSample[i] = additionalGain;
1434
0
      }
1435
0
    } else {
1436
0
      for (i = 0; i < channels * nSamples; i++) {
1437
0
        samplesIn[i] = FIXP_DBL2PCM_DEC(fMult(samplesIn[i], additionalGain));
1438
0
      }
1439
0
    }
1440
17.9k
  } else {
1441
17.9k
    UINT inc;
1442
17.9k
    FIXP_DBL additionalGainUnfiltered;
1443
1444
17.9k
    inc = (stride == 1) ? channels : 1;
1445
1446
24.9M
    for (i = 0; i < nSamples; i++) {
1447
24.8M
      if (i < gain_delay) {
1448
15.0M
        additionalGainUnfiltered = hDrcInfo->additionalGainPrev;
1449
15.0M
      } else {
1450
9.84M
        additionalGainUnfiltered = pGain[0];
1451
9.84M
      }
1452
1453
      /* Smooth additionalGain */
1454
1455
      /* [b,a] = butter(1, 0.01) */
1456
24.8M
      static const FIXP_SGL b[] = {FL2FXCONST_SGL(0.015466 * 2.0),
1457
24.8M
                                   FL2FXCONST_SGL(0.015466 * 2.0)};
1458
24.8M
      static const FIXP_SGL a[] = {(FIXP_SGL)MAXVAL_SGL,
1459
24.8M
                                   FL2FXCONST_SGL(-0.96907)};
1460
1461
24.8M
      additionalGain = -fMult(additionalGainSmoothState, a[1]) +
1462
24.8M
                       fMultDiv2(additionalGainUnfiltered, b[0]) +
1463
24.8M
                       fMultDiv2(additionalGainSmoothState1, b[1]);
1464
24.8M
      additionalGainSmoothState1 = additionalGainUnfiltered;
1465
24.8M
      additionalGainSmoothState = additionalGain;
1466
1467
      /* Apply the additional scaling gain_scale[0] that has no delay and no
1468
       * smoothing */
1469
24.8M
      additionalGain_scaling =
1470
24.8M
          fMin(gain_scale, CntLeadingZeros(additionalGain) - 1);
1471
24.8M
      additionalGain = scaleValue(additionalGain, additionalGain_scaling);
1472
1473
      /* if it's not possible to fully apply gain_scale[0] to additionalGain,
1474
       * apply it to the input signal */
1475
24.8M
      additionalGain_scaling -= gain_scale;
1476
1477
24.8M
      if (limiterEnabled) {
1478
22.5M
        FDK_ASSERT(stride == 1);
1479
22.5M
        FDK_ASSERT(pGainPerSample != NULL);
1480
1481
22.5M
        if (additionalGain_scaling) {
1482
105k
          scaleValuesSaturate(samplesIn, channels, -additionalGain_scaling);
1483
105k
        }
1484
1485
22.5M
        pGainPerSample[i] = additionalGain;
1486
22.5M
      } else {
1487
2.37M
        if (additionalGain_scaling) {
1488
112k
          for (UINT k = 0; k < channels; k++) {
1489
96.5k
            scaleValuesSaturate(&samplesIn[k * stride], 1,
1490
96.5k
                                -additionalGain_scaling);
1491
96.5k
          }
1492
16.0k
        }
1493
1494
10.0M
        for (UINT k = 0; k < channels; k++) {
1495
7.67M
          samplesIn[k * stride] =
1496
7.67M
              FIXP_DBL2PCM_DEC(fMult(samplesIn[k * stride], additionalGain));
1497
7.67M
        }
1498
2.37M
      }
1499
1500
24.8M
      samplesIn += inc;
1501
24.8M
    }
1502
17.9k
  }
1503
1504
17.9k
  hDrcInfo->additionalGainPrev = pGain[0];
1505
17.9k
  hDrcInfo->additionalGainFilterState = additionalGainSmoothState;
1506
17.9k
  hDrcInfo->additionalGainFilterState1 = additionalGainSmoothState1;
1507
1508
17.9k
  return (AACDEC_DRC_GAIN_SCALING);
1509
17.9k
}