Coverage Report

Created: 2025-11-24 06:10

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/aac/libDRCdec/src/drcDec_reader.cpp
Line
Count
Source
1
/* -----------------------------------------------------------------------------
2
Software License for The Fraunhofer FDK AAC Codec Library for Android
3
4
© Copyright  1995 - 2020 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 "fixpoint_math.h"
104
#include "drcDec_reader.h"
105
#include "drcDec_tools.h"
106
#include "drcDec_rom.h"
107
#include "drcDecoder.h"
108
109
/* MPEG-D DRC AMD 1 */
110
111
1.32k
#define UNIDRCCONFEXT_PARAM_DRC 0x1
112
21.6k
#define UNIDRCCONFEXT_V1 0x2
113
574
#define UNIDRCLOUDEXT_EQ 0x1
114
115
0
#define UNIDRCGAINEXT_TERM 0x0
116
1.84k
#define UNIDRCLOUDEXT_TERM 0x0
117
38.4k
#define UNIDRCCONFEXT_TERM 0x0
118
119
0
static int _getZ(const int nNodesMax) {
120
  /* Z is the minimum codeword length that is needed to encode all possible
121
   * timeDelta values */
122
  /* Z = ceil(log2(2*nNodesMax)) */
123
0
  int Z = 1;
124
0
  while ((1 << Z) < (2 * nNodesMax)) {
125
0
    Z++;
126
0
  }
127
0
  return Z;
128
0
}
129
130
0
static int _getTimeDeltaMin(const GAIN_SET* pGset, const int deltaTminDefault) {
131
0
  if (pGset->timeDeltaMinPresent) {
132
0
    return pGset->timeDeltaMin;
133
0
  } else {
134
0
    return deltaTminDefault;
135
0
  }
136
0
}
137
138
/* compare and assign */
139
239k
static inline int _compAssign(UCHAR* dest, const UCHAR src) {
140
239k
  int diff = 0;
141
239k
  if (*dest != src) diff = 1;
142
239k
  *dest = src;
143
239k
  return diff;
144
239k
}
145
146
993
static inline int _compAssign(ULONG* dest, const ULONG src) {
147
993
  int diff = 0;
148
993
  if (*dest != src) diff = 1;
149
993
  *dest = src;
150
993
  return diff;
151
993
}
152
153
typedef const SCHAR (*Huffman)[2];
154
155
int _decodeHuffmanCW(Huffman h, /*!< pointer to huffman codebook table */
156
                     HANDLE_FDK_BITSTREAM hBs) /*!< Handle to bitbuffer */
157
0
{
158
0
  SCHAR index = 0;
159
0
  int value, bit;
160
161
0
  while (index >= 0) {
162
0
    bit = FDKreadBits(hBs, 1);
163
0
    index = h[index][bit];
164
0
  }
165
166
0
  value = index + 64; /* Add offset */
167
168
0
  return value;
169
0
}
170
171
/**********/
172
/* uniDrc */
173
/**********/
174
175
DRC_ERROR
176
drcDec_readUniDrc(HANDLE_FDK_BITSTREAM hBs, HANDLE_UNI_DRC_CONFIG hUniDrcConfig,
177
                  HANDLE_LOUDNESS_INFO_SET hLoudnessInfoSet,
178
                  const int frameSize, const int deltaTminDefault,
179
0
                  HANDLE_UNI_DRC_GAIN hUniDrcGain) {
180
0
  DRC_ERROR err = DE_OK;
181
0
  int loudnessInfoSetPresent, uniDrcConfigPresent;
182
183
0
  loudnessInfoSetPresent = FDKreadBits(hBs, 1);
184
0
  if (loudnessInfoSetPresent) {
185
0
    uniDrcConfigPresent = FDKreadBits(hBs, 1);
186
0
    if (uniDrcConfigPresent) {
187
0
      err = drcDec_readUniDrcConfig(hBs, hUniDrcConfig);
188
0
      if (err) {
189
        /* clear config, if parsing error occured */
190
0
        FDKmemclear(hUniDrcConfig, sizeof(UNI_DRC_CONFIG));
191
0
        hUniDrcConfig->diff = 1;
192
0
      }
193
0
    }
194
0
    err = drcDec_readLoudnessInfoSet(hBs, hLoudnessInfoSet);
195
0
    if (err) {
196
      /* clear config, if parsing error occured */
197
0
      FDKmemclear(hLoudnessInfoSet, sizeof(LOUDNESS_INFO_SET));
198
0
      hLoudnessInfoSet->diff = 1;
199
0
    }
200
0
  }
201
202
0
  err = drcDec_readUniDrcGain(hBs, hUniDrcConfig, frameSize, deltaTminDefault,
203
0
                              hUniDrcGain);
204
205
0
  return err;
206
0
}
207
208
/**************/
209
/* uniDrcGain */
210
/**************/
211
212
static FIXP_SGL _decodeGainInitial(
213
0
    HANDLE_FDK_BITSTREAM hBs, const GAIN_CODING_PROFILE gainCodingProfile) {
214
0
  int sign, magn;
215
0
  FIXP_SGL gainInitial = (FIXP_SGL)0;
216
0
  switch (gainCodingProfile) {
217
0
    case GCP_REGULAR:
218
0
      sign = FDKreadBits(hBs, 1);
219
0
      magn = FDKreadBits(hBs, 8);
220
221
0
      gainInitial =
222
0
          (FIXP_SGL)(magn << (FRACT_BITS - 1 - 3 - 7)); /* magn * 0.125; */
223
0
      if (sign) gainInitial = -gainInitial;
224
0
      break;
225
0
    case GCP_FADING:
226
0
      sign = FDKreadBits(hBs, 1);
227
0
      if (sign == 0)
228
0
        gainInitial = (FIXP_SGL)0;
229
0
      else {
230
0
        magn = FDKreadBits(hBs, 10);
231
0
        gainInitial = -(FIXP_SGL)(
232
0
            (magn + 1) << (FRACT_BITS - 1 - 3 - 7)); /* - (magn + 1) * 0.125; */
233
0
      }
234
0
      break;
235
0
    case GCP_CLIPPING_DUCKING:
236
0
      sign = FDKreadBits(hBs, 1);
237
0
      if (sign == 0)
238
0
        gainInitial = (FIXP_SGL)0;
239
0
      else {
240
0
        magn = FDKreadBits(hBs, 8);
241
0
        gainInitial = -(FIXP_SGL)(
242
0
            (magn + 1) << (FRACT_BITS - 1 - 3 - 7)); /* - (magn + 1) * 0.125; */
243
0
      }
244
0
      break;
245
0
    case GCP_CONSTANT:
246
0
      break;
247
0
  }
248
0
  return gainInitial;
249
0
}
250
251
0
static int _decodeNNodes(HANDLE_FDK_BITSTREAM hBs) {
252
0
  int nNodes = 0, endMarker = 0;
253
254
  /* decode number of nodes */
255
0
  while (endMarker != 1) {
256
0
    nNodes++;
257
0
    if (nNodes >= 128) break;
258
0
    endMarker = FDKreadBits(hBs, 1);
259
0
  }
260
0
  return nNodes;
261
0
}
262
263
static void _decodeGains(HANDLE_FDK_BITSTREAM hBs,
264
                         const GAIN_CODING_PROFILE gainCodingProfile,
265
0
                         const int nNodes, GAIN_NODE* pNodes) {
266
0
  int k, deltaGain;
267
0
  Huffman deltaGainCodebook;
268
269
0
  pNodes[0].gainDb = _decodeGainInitial(hBs, gainCodingProfile);
270
271
0
  if (gainCodingProfile == GCP_CLIPPING_DUCKING) {
272
0
    deltaGainCodebook = (Huffman)&deltaGain_codingProfile_2_huffman;
273
0
  } else {
274
0
    deltaGainCodebook = (Huffman)&deltaGain_codingProfile_0_1_huffman;
275
0
  }
276
277
0
  for (k = 1; k < nNodes; k++) {
278
0
    deltaGain = _decodeHuffmanCW(deltaGainCodebook, hBs);
279
0
    if (k >= 16) continue;
280
    /* gain_dB_e = 7 */
281
0
    pNodes[k].gainDb =
282
0
        pNodes[k - 1].gainDb +
283
0
        (FIXP_SGL)(deltaGain << (FRACT_BITS - 1 - 7 -
284
0
                                 3)); /* pNodes[k-1].gainDb + 0.125*deltaGain */
285
0
  }
286
0
}
287
288
static void _decodeSlopes(HANDLE_FDK_BITSTREAM hBs,
289
                          const GAIN_INTERPOLATION_TYPE gainInterpolationType,
290
0
                          const int nNodes, GAIN_NODE* pNodes) {
291
0
  int k = 0;
292
293
0
  if (gainInterpolationType == GIT_SPLINE) {
294
    /* decode slope steepness */
295
0
    for (k = 0; k < nNodes; k++) {
296
0
      _decodeHuffmanCW((Huffman)&slopeSteepness_huffman, hBs);
297
0
    }
298
0
  }
299
0
}
300
301
0
static int _decodeTimeDelta(HANDLE_FDK_BITSTREAM hBs, const int Z) {
302
0
  int prefix, mu;
303
304
0
  prefix = FDKreadBits(hBs, 2);
305
0
  switch (prefix) {
306
0
    case 0x0:
307
0
      return 1;
308
0
    case 0x1:
309
0
      mu = FDKreadBits(hBs, 2);
310
0
      return mu + 2;
311
0
    case 0x2:
312
0
      mu = FDKreadBits(hBs, 3);
313
0
      return mu + 6;
314
0
    case 0x3:
315
0
      mu = FDKreadBits(hBs, Z);
316
0
      return mu + 14;
317
0
    default:
318
0
      return 0;
319
0
  }
320
0
}
321
322
static void _decodeTimes(HANDLE_FDK_BITSTREAM hBs, const int deltaTmin,
323
                         const int frameSize, const int fullFrame,
324
                         const int timeOffset, const int Z, const int nNodes,
325
0
                         GAIN_NODE* pNodes) {
326
0
  int timeDelta, k;
327
0
  int timeOffs = timeOffset;
328
0
  int frameEndFlag, nodeTimeTmp, nodeResFlag;
329
330
0
  if (fullFrame == 0) {
331
0
    frameEndFlag = FDKreadBits(hBs, 1);
332
0
  } else {
333
0
    frameEndFlag = 1;
334
0
  }
335
336
0
  if (frameEndFlag ==
337
0
      1) { /* frameEndFlag == 1 signals that the last node is at the end of the
338
              DRC frame */
339
0
    nodeResFlag = 0;
340
0
    for (k = 0; k < nNodes - 1; k++) {
341
      /* decode a delta time value */
342
0
      timeDelta = _decodeTimeDelta(hBs, Z);
343
0
      if (k >= (16 - 1)) continue;
344
      /* frameEndFlag == 1 needs special handling for last node with node
345
       * reservoir */
346
0
      nodeTimeTmp = timeOffs + timeDelta * deltaTmin;
347
0
      if (nodeTimeTmp > frameSize + timeOffset) {
348
0
        if (nodeResFlag == 0) {
349
0
          pNodes[k].time = frameSize + timeOffset;
350
0
          nodeResFlag = 1;
351
0
        }
352
0
        pNodes[k + 1].time = nodeTimeTmp;
353
0
      } else {
354
0
        pNodes[k].time = nodeTimeTmp;
355
0
      }
356
0
      timeOffs = nodeTimeTmp;
357
0
    }
358
0
    if (nodeResFlag == 0) {
359
0
      k = fMin(k, 16 - 1);
360
0
      pNodes[k].time = frameSize + timeOffset;
361
0
    }
362
0
  } else {
363
0
    for (k = 0; k < nNodes; k++) {
364
      /* decode a delta time value */
365
0
      timeDelta = _decodeTimeDelta(hBs, Z);
366
0
      if (k >= 16) continue;
367
0
      pNodes[k].time = timeOffs + timeDelta * deltaTmin;
368
0
      timeOffs = pNodes[k].time;
369
0
    }
370
0
  }
371
0
}
372
373
static void _readNodes(HANDLE_FDK_BITSTREAM hBs, GAIN_SET* gainSet,
374
                       const int frameSize, const int timeDeltaMin,
375
0
                       UCHAR* pNNodes, GAIN_NODE* pNodes) {
376
0
  int timeOffset, drcGainCodingMode, nNodes;
377
0
  int Z = _getZ(frameSize / timeDeltaMin);
378
0
  if (gainSet->timeAlignment == 0) {
379
0
    timeOffset = -1;
380
0
  } else {
381
0
    timeOffset = -timeDeltaMin +
382
0
                 (timeDeltaMin - 1) /
383
0
                     2; /* timeOffset = - deltaTmin + floor((deltaTmin-1)/2); */
384
0
  }
385
386
0
  drcGainCodingMode = FDKreadBits(hBs, 1);
387
0
  if (drcGainCodingMode == 0) {
388
    /* "simple" mode: only one node at the end of the frame with slope = 0 */
389
0
    nNodes = 1;
390
0
    pNodes[0].gainDb = _decodeGainInitial(
391
0
        hBs, (GAIN_CODING_PROFILE)gainSet->gainCodingProfile);
392
0
    pNodes[0].time = frameSize + timeOffset;
393
0
  } else {
394
0
    nNodes = _decodeNNodes(hBs);
395
396
0
    _decodeSlopes(hBs, (GAIN_INTERPOLATION_TYPE)gainSet->gainInterpolationType,
397
0
                  nNodes, pNodes);
398
399
0
    _decodeTimes(hBs, timeDeltaMin, frameSize, gainSet->fullFrame, timeOffset,
400
0
                 Z, nNodes, pNodes);
401
402
0
    _decodeGains(hBs, (GAIN_CODING_PROFILE)gainSet->gainCodingProfile, nNodes,
403
0
                 pNodes);
404
0
  }
405
0
  *pNNodes = (UCHAR)nNodes;
406
0
}
407
408
static void _readDrcGainSequence(HANDLE_FDK_BITSTREAM hBs, GAIN_SET* gainSet,
409
                                 const int frameSize, const int timeDeltaMin,
410
0
                                 UCHAR* pNNodes, GAIN_NODE pNodes[16]) {
411
0
  SHORT timeBufPrevFrame[16], timeBufCurFrame[16];
412
0
  int nNodesNodeRes, nNodesCur, k, m;
413
414
0
  if (gainSet->gainCodingProfile == GCP_CONSTANT) {
415
0
    *pNNodes = 1;
416
0
    pNodes[0].time = frameSize - 1;
417
0
    pNodes[0].gainDb = (FIXP_SGL)0;
418
0
  } else {
419
0
    _readNodes(hBs, gainSet, frameSize, timeDeltaMin, pNNodes, pNodes);
420
421
    /* count number of nodes in node reservoir */
422
0
    nNodesNodeRes = 0;
423
0
    nNodesCur = 0;
424
    /* count and buffer nodes from node reservoir */
425
0
    for (k = 0; k < *pNNodes; k++) {
426
0
      if (k >= 16) continue;
427
0
      if (pNodes[k].time >= frameSize) {
428
        /* write node reservoir times into buffer */
429
0
        timeBufPrevFrame[nNodesNodeRes] = pNodes[k].time;
430
0
        nNodesNodeRes++;
431
0
      } else { /* times from current frame */
432
0
        timeBufCurFrame[nNodesCur] = pNodes[k].time;
433
0
        nNodesCur++;
434
0
      }
435
0
    }
436
    /* compose right time order (bit reservoir first) */
437
0
    for (k = 0; k < nNodesNodeRes; k++) {
438
      /* subtract two time frameSize: one to remove node reservoir offset and
439
       * one to get the negative index relative to the current frame
440
       */
441
0
      pNodes[k].time = timeBufPrevFrame[k] - 2 * frameSize;
442
0
    }
443
    /* ...and times from current frame */
444
0
    for (m = 0; m < nNodesCur; m++, k++) {
445
0
      pNodes[k].time = timeBufCurFrame[m];
446
0
    }
447
0
  }
448
0
}
449
450
static DRC_ERROR _readUniDrcGainExtension(HANDLE_FDK_BITSTREAM hBs,
451
0
                                          UNI_DRC_GAIN_EXTENSION* pExt) {
452
0
  DRC_ERROR err = DE_OK;
453
0
  int k, bitSizeLen, extSizeBits, bitSize;
454
455
0
  k = 0;
456
0
  pExt->uniDrcGainExtType[k] = FDKreadBits(hBs, 4);
457
0
  while (pExt->uniDrcGainExtType[k] != UNIDRCGAINEXT_TERM) {
458
0
    if (k >= (8 - 1)) return DE_MEMORY_ERROR;
459
0
    bitSizeLen = FDKreadBits(hBs, 3);
460
0
    extSizeBits = bitSizeLen + 4;
461
462
0
    bitSize = FDKreadBits(hBs, extSizeBits);
463
0
    pExt->extBitSize[k] = bitSize + 1;
464
465
0
    switch (pExt->uniDrcGainExtType[k]) {
466
      /* add future extensions here */
467
0
      default:
468
0
        FDKpushFor(hBs, pExt->extBitSize[k]);
469
0
        break;
470
0
    }
471
0
    k++;
472
0
    pExt->uniDrcGainExtType[k] = FDKreadBits(hBs, 4);
473
0
  }
474
475
0
  return err;
476
0
}
477
478
DRC_ERROR
479
drcDec_readUniDrcGain(HANDLE_FDK_BITSTREAM hBs,
480
                      HANDLE_UNI_DRC_CONFIG hUniDrcConfig, const int frameSize,
481
                      const int deltaTminDefault,
482
0
                      HANDLE_UNI_DRC_GAIN hUniDrcGain) {
483
0
  DRC_ERROR err = DE_OK;
484
0
  int seq, gainSequenceCount;
485
0
  DRC_COEFFICIENTS_UNI_DRC* pCoef =
486
0
      selectDrcCoefficients(hUniDrcConfig, LOCATION_SELECTED);
487
0
  if (hUniDrcGain == NULL) return DE_NOT_OK;
488
0
  hUniDrcGain->status = 0;
489
0
  if (pCoef) {
490
0
    gainSequenceCount = fMin(pCoef->gainSequenceCount, (UCHAR)12);
491
0
  } else {
492
0
    gainSequenceCount = 0;
493
0
  }
494
495
0
  for (seq = 0; seq < gainSequenceCount; seq++) {
496
0
    UCHAR index = pCoef->gainSetIndexForGainSequence[seq];
497
0
    GAIN_SET* gainSet;
498
0
    int timeDeltaMin;
499
0
    UCHAR tmpNNodes = 0;
500
0
    GAIN_NODE tmpNodes[16];
501
502
0
    if ((index >= pCoef->gainSetCount) || (index >= 12)) return DE_NOT_OK;
503
0
    gainSet = &(pCoef->gainSet[index]);
504
505
0
    timeDeltaMin = _getTimeDeltaMin(gainSet, deltaTminDefault);
506
507
0
    _readDrcGainSequence(hBs, gainSet, frameSize, timeDeltaMin, &tmpNNodes,
508
0
                         tmpNodes);
509
510
0
    hUniDrcGain->nNodes[seq] = tmpNNodes;
511
0
    FDKmemcpy(hUniDrcGain->gainNode[seq], tmpNodes,
512
0
              fMin(tmpNNodes, (UCHAR)16) * sizeof(GAIN_NODE));
513
0
  }
514
515
0
  if (pCoef && (gainSequenceCount ==
516
0
                pCoef->gainSequenceCount)) { /* all sequences have been read */
517
0
    hUniDrcGain->uniDrcGainExtPresent = FDKreadBits(hBs, 1);
518
0
    if (hUniDrcGain->uniDrcGainExtPresent == 1) {
519
0
      err = _readUniDrcGainExtension(hBs, &(hUniDrcGain->uniDrcGainExtension));
520
0
      if (err) return err;
521
0
    }
522
0
  }
523
524
0
  if (err == DE_OK && gainSequenceCount > 0) {
525
0
    hUniDrcGain->status = 1;
526
0
  }
527
0
  return err;
528
0
}
529
530
/****************/
531
/* uniDrcConfig */
532
/****************/
533
534
static void _decodeDuckingModification(HANDLE_FDK_BITSTREAM hBs,
535
13.1k
                                       DUCKING_MODIFICATION* pDMod, int isBox) {
536
13.1k
  int bsDuckingScaling, sigma, mu;
537
538
13.1k
  if (isBox) FDKpushFor(hBs, 7); /* reserved */
539
13.1k
  pDMod->duckingScalingPresent = FDKreadBits(hBs, 1);
540
541
13.1k
  if (pDMod->duckingScalingPresent) {
542
3.17k
    if (isBox) FDKpushFor(hBs, 4); /* reserved */
543
3.17k
    bsDuckingScaling = FDKreadBits(hBs, 4);
544
3.17k
    sigma = bsDuckingScaling >> 3;
545
3.17k
    mu = bsDuckingScaling & 0x7;
546
547
3.17k
    if (sigma) {
548
1.60k
      pDMod->duckingScaling = (FIXP_SGL)(
549
1.60k
          (7 - mu) << (FRACT_BITS - 1 - 3 - 2)); /* 1.0 - 0.125 * (1 + mu); */
550
1.60k
    } else {
551
1.57k
      pDMod->duckingScaling = (FIXP_SGL)(
552
1.57k
          (9 + mu) << (FRACT_BITS - 1 - 3 - 2)); /* 1.0 + 0.125 * (1 + mu); */
553
1.57k
    }
554
9.97k
  } else {
555
9.97k
    pDMod->duckingScaling = (FIXP_SGL)(1 << (FRACT_BITS - 1 - 2)); /* 1.0 */
556
9.97k
  }
557
13.1k
}
558
559
static void _decodeGainModification(HANDLE_FDK_BITSTREAM hBs, const int version,
560
                                    int bandCount, GAIN_MODIFICATION* pGMod,
561
32.6k
                                    int isBox) {
562
32.6k
  int sign, bsGainOffset, bsAttenuationScaling, bsAmplificationScaling;
563
564
32.6k
  if (version > 0) {
565
7.29k
    int b, shapeFilterPresent;
566
567
7.29k
    if (isBox) {
568
0
      FDKpushFor(hBs, 4); /* reserved */
569
0
      bandCount = FDKreadBits(hBs, 4);
570
0
    }
571
572
14.5k
    for (b = 0; b < bandCount; b++) {
573
7.28k
      if (isBox) {
574
0
        FDKpushFor(hBs, 4); /* reserved */
575
0
        pGMod[b].targetCharacteristicLeftPresent = FDKreadBits(hBs, 1);
576
0
        pGMod[b].targetCharacteristicRightPresent = FDKreadBits(hBs, 1);
577
0
        pGMod[b].gainScalingPresent = FDKreadBits(hBs, 1);
578
0
        pGMod[b].gainOffsetPresent = FDKreadBits(hBs, 1);
579
0
      }
580
581
7.28k
      if (!isBox)
582
7.28k
        pGMod[b].targetCharacteristicLeftPresent = FDKreadBits(hBs, 1);
583
7.28k
      if (pGMod[b].targetCharacteristicLeftPresent) {
584
2.55k
        if (isBox) FDKpushFor(hBs, 4); /* reserved */
585
2.55k
        pGMod[b].targetCharacteristicLeftIndex = FDKreadBits(hBs, 4);
586
2.55k
      }
587
7.28k
      if (!isBox)
588
7.28k
        pGMod[b].targetCharacteristicRightPresent = FDKreadBits(hBs, 1);
589
7.28k
      if (pGMod[b].targetCharacteristicRightPresent) {
590
2.44k
        if (isBox) FDKpushFor(hBs, 4); /* reserved */
591
2.44k
        pGMod[b].targetCharacteristicRightIndex = FDKreadBits(hBs, 4);
592
2.44k
      }
593
7.28k
      if (!isBox) pGMod[b].gainScalingPresent = FDKreadBits(hBs, 1);
594
7.28k
      if (pGMod[b].gainScalingPresent) {
595
2.02k
        bsAttenuationScaling = FDKreadBits(hBs, 4);
596
2.02k
        pGMod[b].attenuationScaling = (FIXP_SGL)(
597
2.02k
            bsAttenuationScaling
598
2.02k
            << (FRACT_BITS - 1 - 3 - 2)); /* bsAttenuationScaling * 0.125; */
599
2.02k
        bsAmplificationScaling = FDKreadBits(hBs, 4);
600
2.02k
        pGMod[b].amplificationScaling = (FIXP_SGL)(
601
2.02k
            bsAmplificationScaling
602
2.02k
            << (FRACT_BITS - 1 - 3 - 2)); /* bsAmplificationScaling * 0.125; */
603
2.02k
      }
604
7.28k
      if (!isBox) pGMod[b].gainOffsetPresent = FDKreadBits(hBs, 1);
605
7.28k
      if (pGMod[b].gainOffsetPresent) {
606
2.26k
        if (isBox) FDKpushFor(hBs, 2); /* reserved */
607
2.26k
        sign = FDKreadBits(hBs, 1);
608
2.26k
        bsGainOffset = FDKreadBits(hBs, 5);
609
2.26k
        pGMod[b].gainOffset = (FIXP_SGL)(
610
2.26k
            (1 + bsGainOffset)
611
2.26k
            << (FRACT_BITS - 1 - 2 - 4)); /* (1+bsGainOffset) * 0.25; */
612
2.26k
        if (sign) {
613
1.47k
          pGMod[b].gainOffset = -pGMod[b].gainOffset;
614
1.47k
        }
615
2.26k
      }
616
7.28k
    }
617
7.29k
    if (bandCount == 1) {
618
6.94k
      shapeFilterPresent = FDKreadBits(hBs, 1);
619
6.94k
      if (shapeFilterPresent) {
620
1.93k
        if (isBox) FDKpushFor(hBs, 3); /* reserved */
621
1.93k
        FDKpushFor(hBs, 4);            /* pGMod->shapeFilterIndex */
622
5.01k
      } else {
623
5.01k
        if (isBox) FDKpushFor(hBs, 7); /* reserved */
624
5.01k
      }
625
6.94k
    }
626
25.3k
  } else {
627
25.3k
    int b, gainScalingPresent, gainOffsetPresent;
628
25.3k
    FIXP_SGL attenuationScaling = FL2FXCONST_SGL(1.0f / (float)(1 << 2)),
629
25.3k
             amplificationScaling = FL2FXCONST_SGL(1.0f / (float)(1 << 2)),
630
25.3k
             gainOffset = (FIXP_SGL)0;
631
25.3k
    if (isBox) FDKpushFor(hBs, 7); /* reserved */
632
25.3k
    gainScalingPresent = FDKreadBits(hBs, 1);
633
25.3k
    if (gainScalingPresent) {
634
15.1k
      bsAttenuationScaling = FDKreadBits(hBs, 4);
635
15.1k
      attenuationScaling = (FIXP_SGL)(
636
15.1k
          bsAttenuationScaling
637
15.1k
          << (FRACT_BITS - 1 - 3 - 2)); /* bsAttenuationScaling * 0.125; */
638
15.1k
      bsAmplificationScaling = FDKreadBits(hBs, 4);
639
15.1k
      amplificationScaling = (FIXP_SGL)(
640
15.1k
          bsAmplificationScaling
641
15.1k
          << (FRACT_BITS - 1 - 3 - 2)); /* bsAmplificationScaling * 0.125; */
642
15.1k
    }
643
25.3k
    if (isBox) FDKpushFor(hBs, 7); /* reserved */
644
25.3k
    gainOffsetPresent = FDKreadBits(hBs, 1);
645
25.3k
    if (gainOffsetPresent) {
646
13.1k
      if (isBox) FDKpushFor(hBs, 2); /* reserved */
647
13.1k
      sign = FDKreadBits(hBs, 1);
648
13.1k
      bsGainOffset = FDKreadBits(hBs, 5);
649
13.1k
      gainOffset =
650
13.1k
          (FIXP_SGL)((1 + bsGainOffset) << (FRACT_BITS - 1 - 2 -
651
13.1k
                                            4)); /* (1+bsGainOffset) * 0.25; */
652
13.1k
      if (sign) {
653
7.63k
        gainOffset = -gainOffset;
654
7.63k
      }
655
13.1k
    }
656
126k
    for (b = 0; b < 4; b++) {
657
101k
      pGMod[b].targetCharacteristicLeftPresent = 0;
658
101k
      pGMod[b].targetCharacteristicRightPresent = 0;
659
101k
      pGMod[b].gainScalingPresent = gainScalingPresent;
660
101k
      pGMod[b].attenuationScaling = attenuationScaling;
661
101k
      pGMod[b].amplificationScaling = amplificationScaling;
662
101k
      pGMod[b].gainOffsetPresent = gainOffsetPresent;
663
101k
      pGMod[b].gainOffset = gainOffset;
664
101k
    }
665
25.3k
  }
666
32.6k
}
667
668
static void _readDrcCharacteristic(HANDLE_FDK_BITSTREAM hBs, const int version,
669
12.2k
                                   DRC_CHARACTERISTIC* pDChar, int isBox) {
670
12.2k
  if (version == 0) {
671
2.00k
    if (isBox) FDKpushFor(hBs, 1); /* reserved */
672
2.00k
    pDChar->cicpIndex = FDKreadBits(hBs, 7);
673
2.00k
    if (pDChar->cicpIndex > 0) {
674
1.01k
      pDChar->present = 1;
675
1.01k
      pDChar->isCICP = 1;
676
1.01k
    } else {
677
988
      pDChar->present = 0;
678
988
    }
679
10.2k
  } else {
680
10.2k
    pDChar->present = FDKreadBits(hBs, 1);
681
10.2k
    if (isBox) pDChar->isCICP = FDKreadBits(hBs, 1);
682
10.2k
    if (pDChar->present) {
683
2.93k
      if (!isBox) pDChar->isCICP = FDKreadBits(hBs, 1);
684
2.93k
      if (pDChar->isCICP) {
685
1.34k
        if (isBox) FDKpushFor(hBs, 1); /* reserved */
686
1.34k
        pDChar->cicpIndex = FDKreadBits(hBs, 7);
687
1.59k
      } else {
688
1.59k
        pDChar->custom.left = FDKreadBits(hBs, 4);
689
1.59k
        pDChar->custom.right = FDKreadBits(hBs, 4);
690
1.59k
      }
691
2.93k
    }
692
10.2k
  }
693
12.2k
}
694
695
static void _readBandBorder(HANDLE_FDK_BITSTREAM hBs, BAND_BORDER* pBBord,
696
7.39k
                            int drcBandType, int isBox) {
697
7.39k
  if (drcBandType) {
698
4.43k
    if (isBox) FDKpushFor(hBs, 4); /* reserved */
699
4.43k
    pBBord->crossoverFreqIndex = FDKreadBits(hBs, 4);
700
4.43k
  } else {
701
2.95k
    if (isBox) FDKpushFor(hBs, 6); /* reserved */
702
2.95k
    pBBord->startSubBandIndex = FDKreadBits(hBs, 10);
703
2.95k
  }
704
7.39k
}
705
706
static DRC_ERROR _readGainSet(HANDLE_FDK_BITSTREAM hBs, const int version,
707
                              int* gainSequenceIndex, GAIN_SET* pGSet,
708
96.5k
                              int isBox) {
709
96.5k
  if (isBox) FDKpushFor(hBs, 2); /* reserved */
710
96.5k
  pGSet->gainCodingProfile = FDKreadBits(hBs, 2);
711
96.5k
  pGSet->gainInterpolationType = FDKreadBits(hBs, 1);
712
96.5k
  pGSet->fullFrame = FDKreadBits(hBs, 1);
713
96.5k
  pGSet->timeAlignment = FDKreadBits(hBs, 1);
714
96.5k
  pGSet->timeDeltaMinPresent = FDKreadBits(hBs, 1);
715
716
96.5k
  if (pGSet->timeDeltaMinPresent) {
717
2.61k
    int bsTimeDeltaMin;
718
2.61k
    if (isBox) FDKpushFor(hBs, 5); /* reserved */
719
2.61k
    bsTimeDeltaMin = FDKreadBits(hBs, 11);
720
2.61k
    pGSet->timeDeltaMin = bsTimeDeltaMin + 1;
721
2.61k
  }
722
723
96.5k
  if (pGSet->gainCodingProfile != GCP_CONSTANT) {
724
91.2k
    int i;
725
91.2k
    if (isBox) FDKpushFor(hBs, 3); /* reserved */
726
91.2k
    pGSet->bandCount = FDKreadBits(hBs, 4);
727
91.2k
    if (pGSet->bandCount > 4) return DE_MEMORY_ERROR;
728
729
91.0k
    if ((pGSet->bandCount > 1) || isBox) {
730
3.49k
      pGSet->drcBandType = FDKreadBits(hBs, 1);
731
3.49k
    }
732
733
103k
    for (i = 0; i < pGSet->bandCount; i++) {
734
12.2k
      if (version == 0) {
735
2.00k
        *gainSequenceIndex = (*gainSequenceIndex) + 1;
736
10.2k
      } else {
737
10.2k
        int indexPresent;
738
10.2k
        indexPresent = (isBox) ? 1 : FDKreadBits(hBs, 1);
739
10.2k
        if (indexPresent) {
740
3.10k
          int bsIndex;
741
3.10k
          bsIndex = FDKreadBits(hBs, 6);
742
3.10k
          *gainSequenceIndex = bsIndex;
743
7.16k
        } else {
744
7.16k
          *gainSequenceIndex = (*gainSequenceIndex) + 1;
745
7.16k
        }
746
10.2k
      }
747
12.2k
      pGSet->gainSequenceIndex[i] = *gainSequenceIndex;
748
12.2k
      _readDrcCharacteristic(hBs, version, &(pGSet->drcCharacteristic[i]),
749
12.2k
                             isBox);
750
12.2k
    }
751
98.3k
    for (i = 1; i < pGSet->bandCount; i++) {
752
7.39k
      _readBandBorder(hBs, &(pGSet->bandBorder[i]), pGSet->drcBandType, isBox);
753
7.39k
    }
754
91.0k
  } else {
755
5.29k
    pGSet->bandCount = 1;
756
5.29k
    *gainSequenceIndex = (*gainSequenceIndex) + 1;
757
5.29k
    pGSet->gainSequenceIndex[0] = *gainSequenceIndex;
758
5.29k
  }
759
760
96.2k
  return DE_OK;
761
96.5k
}
762
763
static DRC_ERROR _readCustomDrcCharacteristic(HANDLE_FDK_BITSTREAM hBs,
764
                                              const CHARACTERISTIC_SIDE side,
765
                                              UCHAR* pCharacteristicFormat,
766
                                              CUSTOM_DRC_CHAR* pCChar,
767
12.0k
                                              int isBox) {
768
12.0k
  if (isBox) FDKpushFor(hBs, 7); /* reserved */
769
12.0k
  *pCharacteristicFormat = FDKreadBits(hBs, 1);
770
12.0k
  if (*pCharacteristicFormat == CF_SIGMOID) {
771
10.0k
    int bsGain, bsIoRatio, bsExp;
772
10.0k
    if (isBox) FDKpushFor(hBs, 1); /* reserved */
773
10.0k
    bsGain = FDKreadBits(hBs, 6);
774
10.0k
    if (side == CS_LEFT) {
775
5.35k
      pCChar->sigmoid.gain = (FIXP_SGL)(bsGain << (FRACT_BITS - 1 - 6));
776
5.35k
    } else {
777
4.72k
      pCChar->sigmoid.gain = (FIXP_SGL)(-bsGain << (FRACT_BITS - 1 - 6));
778
4.72k
    }
779
10.0k
    bsIoRatio = FDKreadBits(hBs, 4);
780
    /* pCChar->sigmoid.ioRatio = 0.05 + 0.15 * bsIoRatio; */
781
10.0k
    pCChar->sigmoid.ioRatio =
782
10.0k
        FL2FXCONST_SGL(0.05f / (float)(1 << 2)) +
783
10.0k
        (FIXP_SGL)((((3 * bsIoRatio) << (FRACT_BITS - 1)) / 5) >> 4);
784
10.0k
    bsExp = FDKreadBits(hBs, 4);
785
10.0k
    if (bsExp < 15) {
786
9.84k
      pCChar->sigmoid.exp = (FIXP_SGL)((1 + 2 * bsExp) << (FRACT_BITS - 1 - 5));
787
9.84k
    } else {
788
226
      pCChar->sigmoid.exp = (FIXP_SGL)MAXVAL_SGL; /* represents infinity */
789
226
    }
790
10.0k
    pCChar->sigmoid.flipSign = FDKreadBits(hBs, 1);
791
10.0k
  } else { /* CF_NODES */
792
1.98k
    int i, bsCharacteristicNodeCount, bsNodeLevelDelta, bsNodeGain;
793
1.98k
    if (isBox) FDKpushFor(hBs, 6); /* reserved */
794
1.98k
    bsCharacteristicNodeCount = FDKreadBits(hBs, 2);
795
1.98k
    pCChar->nodes.characteristicNodeCount = bsCharacteristicNodeCount + 1;
796
1.98k
    if (pCChar->nodes.characteristicNodeCount > 4) return DE_MEMORY_ERROR;
797
1.98k
    pCChar->nodes.nodeLevel[0] = DRC_INPUT_LOUDNESS_TARGET_SGL;
798
1.98k
    pCChar->nodes.nodeGain[0] = (FIXP_SGL)0;
799
6.16k
    for (i = 0; i < pCChar->nodes.characteristicNodeCount; i++) {
800
4.17k
      if (isBox) FDKpushFor(hBs, 3); /* reserved */
801
4.17k
      bsNodeLevelDelta = FDKreadBits(hBs, 5);
802
4.17k
      if (side == CS_LEFT) {
803
3.16k
        pCChar->nodes.nodeLevel[i + 1] =
804
3.16k
            pCChar->nodes.nodeLevel[i] -
805
3.16k
            (FIXP_SGL)((1 + bsNodeLevelDelta) << (FRACT_BITS - 1 - 7));
806
3.16k
      } else {
807
1.01k
        pCChar->nodes.nodeLevel[i + 1] =
808
1.01k
            pCChar->nodes.nodeLevel[i] +
809
1.01k
            (FIXP_SGL)((1 + bsNodeLevelDelta) << (FRACT_BITS - 1 - 7));
810
1.01k
      }
811
4.17k
      bsNodeGain = FDKreadBits(hBs, 8);
812
4.17k
      pCChar->nodes.nodeGain[i + 1] = (FIXP_SGL)(
813
4.17k
          (bsNodeGain - 128)
814
4.17k
          << (FRACT_BITS - 1 - 1 - 7)); /* 0.5f * bsNodeGain - 64.0f; */
815
4.17k
    }
816
1.98k
  }
817
12.0k
  return DE_OK;
818
12.0k
}
819
820
19.7k
static void _skipLoudEqInstructions(HANDLE_FDK_BITSTREAM hBs) {
821
19.7k
  int i;
822
19.7k
  int downmixIdPresent, additionalDownmixIdPresent,
823
19.7k
      additionalDownmixIdCount = 0;
824
19.7k
  int drcSetIdPresent, additionalDrcSetIdPresent, additionalDrcSetIdCount = 0;
825
19.7k
  int eqSetIdPresent, additionalEqSetIdPresent, additionalEqSetIdCount = 0;
826
19.7k
  int loudEqGainSequenceCount, drcCharacteristicFormatIsCICP;
827
828
19.7k
  FDKpushFor(hBs, 4); /* loudEqSetId */
829
19.7k
  FDKpushFor(hBs, 4); /* drcLocation */
830
19.7k
  downmixIdPresent = FDKreadBits(hBs, 1);
831
19.7k
  if (downmixIdPresent) {
832
2.09k
    FDKpushFor(hBs, 7); /* downmixId */
833
2.09k
    additionalDownmixIdPresent = FDKreadBits(hBs, 1);
834
2.09k
    if (additionalDownmixIdPresent) {
835
966
      additionalDownmixIdCount = FDKreadBits(hBs, 7);
836
17.8k
      for (i = 0; i < additionalDownmixIdCount; i++) {
837
16.8k
        FDKpushFor(hBs, 7); /* additionalDownmixId */
838
16.8k
      }
839
966
    }
840
2.09k
  }
841
842
19.7k
  drcSetIdPresent = FDKreadBits(hBs, 1);
843
19.7k
  if (drcSetIdPresent) {
844
2.31k
    FDKpushFor(hBs, 6); /* drcSetId */
845
2.31k
    additionalDrcSetIdPresent = FDKreadBits(hBs, 1);
846
2.31k
    if (additionalDrcSetIdPresent) {
847
838
      additionalDrcSetIdCount = FDKreadBits(hBs, 6);
848
5.65k
      for (i = 0; i < additionalDrcSetIdCount; i++) {
849
4.81k
        FDKpushFor(hBs, 6); /* additionalDrcSetId; */
850
4.81k
      }
851
838
    }
852
2.31k
  }
853
854
19.7k
  eqSetIdPresent = FDKreadBits(hBs, 1);
855
19.7k
  if (eqSetIdPresent) {
856
1.65k
    FDKpushFor(hBs, 6); /* eqSetId */
857
1.65k
    additionalEqSetIdPresent = FDKreadBits(hBs, 1);
858
1.65k
    if (additionalEqSetIdPresent) {
859
899
      additionalEqSetIdCount = FDKreadBits(hBs, 6);
860
4.80k
      for (i = 0; i < additionalEqSetIdCount; i++) {
861
3.90k
        FDKpushFor(hBs, 6); /* additionalEqSetId; */
862
3.90k
      }
863
899
    }
864
1.65k
  }
865
866
19.7k
  FDKpushFor(hBs, 1); /* loudnessAfterDrc */
867
19.7k
  FDKpushFor(hBs, 1); /* loudnessAfterEq */
868
19.7k
  loudEqGainSequenceCount = FDKreadBits(hBs, 6);
869
33.1k
  for (i = 0; i < loudEqGainSequenceCount; i++) {
870
13.4k
    FDKpushFor(hBs, 6); /* gainSequenceIndex */
871
13.4k
    drcCharacteristicFormatIsCICP = FDKreadBits(hBs, 1);
872
13.4k
    if (drcCharacteristicFormatIsCICP) {
873
797
      FDKpushFor(hBs, 7); /* drcCharacteristic */
874
12.6k
    } else {
875
12.6k
      FDKpushFor(hBs, 4); /* drcCharacteristicLeftIndex */
876
12.6k
      FDKpushFor(hBs, 4); /* drcCharacteristicRightIndex */
877
12.6k
    }
878
13.4k
    FDKpushFor(hBs, 6); /* frequencyRangeIndex */
879
13.4k
    FDKpushFor(hBs, 3); /* bsLoudEqScaling */
880
13.4k
    FDKpushFor(hBs, 5); /* bsLoudEqOffset */
881
13.4k
  }
882
19.7k
}
883
884
22.3k
static void _skipEqSubbandGainSpline(HANDLE_FDK_BITSTREAM hBs) {
885
22.3k
  int nEqNodes, k, bits;
886
22.3k
  nEqNodes = FDKreadBits(hBs, 5);
887
22.3k
  nEqNodes += 2;
888
72.6k
  for (k = 0; k < nEqNodes; k++) {
889
50.3k
    bits = FDKreadBits(hBs, 1);
890
50.3k
    if (!bits) {
891
45.8k
      FDKpushFor(hBs, 4);
892
45.8k
    }
893
50.3k
  }
894
22.3k
  FDKpushFor(hBs, 4 * (nEqNodes - 1));
895
22.3k
  bits = FDKreadBits(hBs, 2);
896
22.3k
  switch (bits) {
897
20.6k
    case 0:
898
20.6k
      FDKpushFor(hBs, 5);
899
20.6k
      break;
900
270
    case 1:
901
1.12k
    case 2:
902
1.12k
      FDKpushFor(hBs, 4);
903
1.12k
      break;
904
532
    case 3:
905
532
      FDKpushFor(hBs, 3);
906
532
      break;
907
22.3k
  }
908
22.3k
  FDKpushFor(hBs, 5 * (nEqNodes - 1));
909
22.3k
}
910
911
6.91k
static void _skipEqCoefficients(HANDLE_FDK_BITSTREAM hBs) {
912
6.91k
  int j, k;
913
6.91k
  int eqDelayMaxPresent;
914
6.91k
  int uniqueFilterBlockCount, filterElementCount, filterElementGainPresent;
915
6.91k
  int uniqueTdFilterElementCount, eqFilterFormat, bsRealZeroRadiusOneCount,
916
6.91k
      realZeroCount, genericZeroCount, realPoleCount, complexPoleCount,
917
6.91k
      firFilterOrder;
918
6.91k
  int uniqueEqSubbandGainsCount, eqSubbandGainRepresentation,
919
6.91k
      eqSubbandGainCount;
920
6.91k
  int eqSubbandGainFormat;
921
922
6.91k
  eqDelayMaxPresent = FDKreadBits(hBs, 1);
923
6.91k
  if (eqDelayMaxPresent) {
924
1.19k
    FDKpushFor(hBs, 8); /* bsEqDelayMax */
925
1.19k
  }
926
927
6.91k
  uniqueFilterBlockCount = FDKreadBits(hBs, 6);
928
25.0k
  for (j = 0; j < uniqueFilterBlockCount; j++) {
929
18.1k
    filterElementCount = FDKreadBits(hBs, 6);
930
31.4k
    for (k = 0; k < filterElementCount; k++) {
931
13.3k
      FDKpushFor(hBs, 6); /* filterElementIndex */
932
13.3k
      filterElementGainPresent = FDKreadBits(hBs, 1);
933
13.3k
      if (filterElementGainPresent) {
934
533
        FDKpushFor(hBs, 10); /* bsFilterElementGain */
935
533
      }
936
13.3k
    }
937
18.1k
  }
938
6.91k
  uniqueTdFilterElementCount = FDKreadBits(hBs, 6);
939
23.7k
  for (j = 0; j < uniqueTdFilterElementCount; j++) {
940
16.8k
    eqFilterFormat = FDKreadBits(hBs, 1);
941
16.8k
    if (eqFilterFormat == 0) { /* pole/zero */
942
15.7k
      bsRealZeroRadiusOneCount = FDKreadBits(hBs, 3);
943
15.7k
      realZeroCount = FDKreadBits(hBs, 6);
944
15.7k
      genericZeroCount = FDKreadBits(hBs, 6);
945
15.7k
      realPoleCount = FDKreadBits(hBs, 4);
946
15.7k
      complexPoleCount = FDKreadBits(hBs, 4);
947
15.7k
      FDKpushFor(hBs, 2 * bsRealZeroRadiusOneCount * 1);
948
15.7k
      FDKpushFor(hBs, realZeroCount * 8);
949
15.7k
      FDKpushFor(hBs, genericZeroCount * 14);
950
15.7k
      FDKpushFor(hBs, realPoleCount * 8);
951
15.7k
      FDKpushFor(hBs, complexPoleCount * 14);
952
15.7k
    } else { /* FIR coefficients */
953
1.10k
      firFilterOrder = FDKreadBits(hBs, 7);
954
1.10k
      FDKpushFor(hBs, 1);
955
1.10k
      FDKpushFor(hBs, (firFilterOrder / 2 + 1) * 11);
956
1.10k
    }
957
16.8k
  }
958
6.91k
  uniqueEqSubbandGainsCount = FDKreadBits(hBs, 6);
959
6.91k
  if (uniqueEqSubbandGainsCount > 0) {
960
4.38k
    eqSubbandGainRepresentation = FDKreadBits(hBs, 1);
961
4.38k
    eqSubbandGainFormat = FDKreadBits(hBs, 4);
962
4.38k
    switch (eqSubbandGainFormat) {
963
750
      case GF_QMF32:
964
750
        eqSubbandGainCount = 32;
965
750
        break;
966
126
      case GF_QMFHYBRID39:
967
126
        eqSubbandGainCount = 39;
968
126
        break;
969
307
      case GF_QMF64:
970
307
        eqSubbandGainCount = 64;
971
307
        break;
972
97
      case GF_QMFHYBRID71:
973
97
        eqSubbandGainCount = 71;
974
97
        break;
975
222
      case GF_QMF128:
976
222
        eqSubbandGainCount = 128;
977
222
        break;
978
64
      case GF_QMFHYBRID135:
979
64
        eqSubbandGainCount = 135;
980
64
        break;
981
382
      case GF_UNIFORM:
982
2.82k
      default:
983
2.82k
        eqSubbandGainCount = FDKreadBits(hBs, 8);
984
2.82k
        eqSubbandGainCount++;
985
2.82k
        break;
986
4.38k
    }
987
137k
    for (k = 0; k < uniqueEqSubbandGainsCount; k++) {
988
133k
      if (eqSubbandGainRepresentation == 1) {
989
22.3k
        _skipEqSubbandGainSpline(hBs);
990
110k
      } else {
991
110k
        FDKpushFor(hBs, eqSubbandGainCount * 9);
992
110k
      }
993
133k
    }
994
4.38k
  }
995
6.91k
}
996
997
static void _skipTdFilterCascade(HANDLE_FDK_BITSTREAM hBs,
998
4.05k
                                 const int eqChannelGroupCount) {
999
4.05k
  int i, eqCascadeGainPresent, filterBlockCount, eqPhaseAlignmentPresent;
1000
8.25k
  for (i = 0; i < eqChannelGroupCount; i++) {
1001
4.19k
    eqCascadeGainPresent = FDKreadBits(hBs, 1);
1002
4.19k
    if (eqCascadeGainPresent) {
1003
1.54k
      FDKpushFor(hBs, 10); /* bsEqCascadeGain */
1004
1.54k
    }
1005
4.19k
    filterBlockCount = FDKreadBits(hBs, 4);
1006
4.19k
    FDKpushFor(hBs, filterBlockCount * 7); /* filterBlockIndex */
1007
4.19k
  }
1008
4.05k
  eqPhaseAlignmentPresent = FDKreadBits(hBs, 1);
1009
4.05k
  {
1010
4.05k
    if (eqPhaseAlignmentPresent) {
1011
3.70k
      for (i = 0; i < eqChannelGroupCount; i++) {
1012
1.33k
        FDKpushFor(hBs, (eqChannelGroupCount - i - 1) * 1);
1013
1.33k
      }
1014
2.37k
    }
1015
4.05k
  }
1016
4.05k
}
1017
1018
static DRC_ERROR _skipEqInstructions(HANDLE_FDK_BITSTREAM hBs,
1019
34.3k
                                     HANDLE_UNI_DRC_CONFIG hUniDrcConfig) {
1020
34.3k
  DRC_ERROR err = DE_OK;
1021
34.3k
  int c, i, k, channelCount;
1022
34.3k
  int downmixIdPresent, downmixId, eqApplyToDownmix, additionalDownmixIdPresent,
1023
34.3k
      additionalDownmixIdCount = 0;
1024
34.3k
  int additionalDrcSetIdPresent, additionalDrcSetIdCount;
1025
34.3k
  int dependsOnEqSetPresent, eqChannelGroupCount, tdFilterCascadePresent,
1026
34.3k
      subbandGainsPresent, eqTransitionDurationPresent;
1027
34.3k
  UCHAR eqChannelGroupForChannel[8];
1028
1029
34.3k
  FDKpushFor(hBs, 6); /* eqSetId */
1030
34.3k
  FDKpushFor(hBs, 4); /* eqSetComplexityLevel */
1031
34.3k
  downmixIdPresent = FDKreadBits(hBs, 1);
1032
34.3k
  if (downmixIdPresent) {
1033
4.90k
    downmixId = FDKreadBits(hBs, 7);
1034
4.90k
    eqApplyToDownmix = FDKreadBits(hBs, 1);
1035
4.90k
    additionalDownmixIdPresent = FDKreadBits(hBs, 1);
1036
4.90k
    if (additionalDownmixIdPresent) {
1037
1.42k
      additionalDownmixIdCount = FDKreadBits(hBs, 7);
1038
1.42k
      FDKpushFor(hBs, additionalDownmixIdCount * 7); /* additionalDownmixId */
1039
1.42k
    }
1040
29.4k
  } else {
1041
29.4k
    downmixId = 0;
1042
29.4k
    eqApplyToDownmix = 0;
1043
29.4k
  }
1044
34.3k
  FDKpushFor(hBs, 6); /* drcSetId */
1045
34.3k
  additionalDrcSetIdPresent = FDKreadBits(hBs, 1);
1046
34.3k
  if (additionalDrcSetIdPresent) {
1047
2.54k
    additionalDrcSetIdCount = FDKreadBits(hBs, 6);
1048
15.1k
    for (i = 0; i < additionalDrcSetIdCount; i++) {
1049
12.6k
      FDKpushFor(hBs, 6); /* additionalDrcSetId */
1050
12.6k
    }
1051
2.54k
  }
1052
34.3k
  FDKpushFor(hBs, 16); /* eqSetPurpose */
1053
34.3k
  dependsOnEqSetPresent = FDKreadBits(hBs, 1);
1054
34.3k
  if (dependsOnEqSetPresent) {
1055
3.39k
    FDKpushFor(hBs, 6); /* dependsOnEqSet */
1056
30.9k
  } else {
1057
30.9k
    FDKpushFor(hBs, 1); /* noIndependentEqUse */
1058
30.9k
  }
1059
1060
34.3k
  channelCount = hUniDrcConfig->channelLayout.baseChannelCount;
1061
34.3k
  if ((downmixIdPresent == 1) && (eqApplyToDownmix == 1) && (downmixId != 0) &&
1062
2.08k
      (downmixId != DOWNMIX_ID_ANY_DOWNMIX) &&
1063
1.81k
      (additionalDownmixIdCount == 0)) {
1064
1.30k
    DOWNMIX_INSTRUCTIONS* pDown =
1065
1.30k
        selectDownmixInstructions(hUniDrcConfig, downmixId);
1066
1.30k
    if (pDown == NULL) return DE_NOT_OK;
1067
1068
346
    channelCount =
1069
346
        pDown->targetChannelCount; /* targetChannelCountFromDownmixId*/
1070
33.0k
  } else if ((downmixId == DOWNMIX_ID_ANY_DOWNMIX) ||
1071
32.6k
             (additionalDownmixIdCount > 1)) {
1072
1.00k
    channelCount = 1;
1073
1.00k
  }
1074
1075
33.4k
  eqChannelGroupCount = 0;
1076
106k
  for (c = 0; c < channelCount; c++) {
1077
73.4k
    int newGroup = 1;
1078
73.4k
    if (c >= 8) return DE_MEMORY_ERROR;
1079
73.1k
    eqChannelGroupForChannel[c] = FDKreadBits(hBs, 7);
1080
257k
    for (k = 0; k < c; k++) {
1081
184k
      if (eqChannelGroupForChannel[c] == eqChannelGroupForChannel[k]) {
1082
163k
        newGroup = 0;
1083
163k
      }
1084
184k
    }
1085
73.1k
    if (newGroup == 1) {
1086
25.6k
      eqChannelGroupCount += 1;
1087
25.6k
    }
1088
73.1k
  }
1089
33.1k
  tdFilterCascadePresent = FDKreadBits(hBs, 1);
1090
33.1k
  if (tdFilterCascadePresent) {
1091
4.05k
    _skipTdFilterCascade(hBs, eqChannelGroupCount);
1092
4.05k
  }
1093
33.1k
  subbandGainsPresent = FDKreadBits(hBs, 1);
1094
33.1k
  if (subbandGainsPresent) {
1095
2.97k
    FDKpushFor(hBs, eqChannelGroupCount * 6); /* subbandGainsIndex */
1096
2.97k
  }
1097
33.1k
  eqTransitionDurationPresent = FDKreadBits(hBs, 1);
1098
33.1k
  if (eqTransitionDurationPresent) {
1099
3.08k
    FDKpushFor(hBs, 5); /* bsEqTransitionDuration */
1100
3.08k
  }
1101
33.1k
  return err;
1102
33.4k
}
1103
1104
3.95k
static void _skipDrcCoefficientsBasic(HANDLE_FDK_BITSTREAM hBs) {
1105
3.95k
  FDKpushFor(hBs, 4); /* drcLocation */
1106
3.95k
  FDKpushFor(hBs, 7); /* drcCharacteristic */
1107
3.95k
}
1108
1109
static DRC_ERROR _readDrcCoefficientsUniDrc(HANDLE_FDK_BITSTREAM hBs,
1110
                                            const int version,
1111
76.5k
                                            DRC_COEFFICIENTS_UNI_DRC* pCoef) {
1112
76.5k
  DRC_ERROR err = DE_OK;
1113
76.5k
  int i, bsDrcFrameSize;
1114
76.5k
  int gainSequenceIndex = -1;
1115
1116
76.5k
  pCoef->drcLocation = FDKreadBits(hBs, 4);
1117
76.5k
  pCoef->drcFrameSizePresent = FDKreadBits(hBs, 1);
1118
1119
76.5k
  if (pCoef->drcFrameSizePresent == 1) {
1120
4.10k
    bsDrcFrameSize = FDKreadBits(hBs, 15);
1121
4.10k
    pCoef->drcFrameSize = bsDrcFrameSize + 1;
1122
4.10k
  }
1123
76.5k
  if (version == 0) {
1124
49.0k
    int gainSequenceCount = 0, gainSetCount;
1125
49.0k
    pCoef->characteristicLeftCount = 0;
1126
49.0k
    pCoef->characteristicRightCount = 0;
1127
49.0k
    gainSetCount = FDKreadBits(hBs, 6);
1128
49.0k
    pCoef->gainSetCount = fMin(gainSetCount, 12);
1129
76.6k
    for (i = 0; i < gainSetCount; i++) {
1130
27.7k
      GAIN_SET tmpGset;
1131
27.7k
      FDKmemclear(&tmpGset, sizeof(GAIN_SET));
1132
27.7k
      err = _readGainSet(hBs, version, &gainSequenceIndex, &tmpGset, 0);
1133
27.7k
      if (err) return err;
1134
27.6k
      gainSequenceCount += tmpGset.bandCount;
1135
1136
27.6k
      if (i >= 12) continue;
1137
11.2k
      pCoef->gainSet[i] = tmpGset;
1138
11.2k
    }
1139
48.9k
    pCoef->gainSequenceCount = gainSequenceCount;
1140
48.9k
  } else { /* (version == 1) */
1141
27.4k
    UCHAR drcCharacteristicLeftPresent, drcCharacteristicRightPresent;
1142
27.4k
    UCHAR shapeFiltersPresent, shapeFilterCount, tmpPresent;
1143
27.4k
    int gainSetCount;
1144
27.4k
    drcCharacteristicLeftPresent = FDKreadBits(hBs, 1);
1145
27.4k
    if (drcCharacteristicLeftPresent) {
1146
1.74k
      pCoef->characteristicLeftCount = FDKreadBits(hBs, 4);
1147
1.74k
      if ((pCoef->characteristicLeftCount + 1) > 16) return DE_MEMORY_ERROR;
1148
8.48k
      for (i = 0; i < pCoef->characteristicLeftCount; i++) {
1149
6.74k
        err = _readCustomDrcCharacteristic(
1150
6.74k
            hBs, CS_LEFT, &(pCoef->characteristicLeftFormat[i + 1]),
1151
6.74k
            &(pCoef->customCharacteristicLeft[i + 1]), 0);
1152
6.74k
        if (err) return err;
1153
6.74k
      }
1154
1.74k
    }
1155
27.4k
    drcCharacteristicRightPresent = FDKreadBits(hBs, 1);
1156
27.4k
    if (drcCharacteristicRightPresent) {
1157
1.78k
      pCoef->characteristicRightCount = FDKreadBits(hBs, 4);
1158
1.78k
      if ((pCoef->characteristicRightCount + 1) > 16) return DE_MEMORY_ERROR;
1159
7.10k
      for (i = 0; i < pCoef->characteristicRightCount; i++) {
1160
5.31k
        err = _readCustomDrcCharacteristic(
1161
5.31k
            hBs, CS_RIGHT, &(pCoef->characteristicRightFormat[i + 1]),
1162
5.31k
            &(pCoef->customCharacteristicRight[i + 1]), 0);
1163
5.31k
        if (err) return err;
1164
5.31k
      }
1165
1.78k
    }
1166
27.4k
    shapeFiltersPresent = FDKreadBits(hBs, 1);
1167
27.4k
    if (shapeFiltersPresent) {
1168
3.30k
      shapeFilterCount = FDKreadBits(hBs, 4);
1169
23.1k
      for (i = 0; i < shapeFilterCount; i++) {
1170
19.7k
        tmpPresent = FDKreadBits(hBs, 1);
1171
19.7k
        if (tmpPresent) /* lfCutParams */
1172
5.51k
          FDKpushFor(hBs, 5);
1173
1174
19.7k
        tmpPresent = FDKreadBits(hBs, 1);
1175
19.7k
        if (tmpPresent) /* lfBoostParams */
1176
5.40k
          FDKpushFor(hBs, 5);
1177
1178
19.7k
        tmpPresent = FDKreadBits(hBs, 1);
1179
19.7k
        if (tmpPresent) /* hfCutParams */
1180
4.81k
          FDKpushFor(hBs, 5);
1181
1182
19.7k
        tmpPresent = FDKreadBits(hBs, 1);
1183
19.7k
        if (tmpPresent) /* hfBoostParams */
1184
4.30k
          FDKpushFor(hBs, 5);
1185
19.7k
      }
1186
3.30k
    }
1187
27.4k
    pCoef->gainSequenceCount = FDKreadBits(hBs, 6);
1188
27.4k
    gainSetCount = FDKreadBits(hBs, 6);
1189
27.4k
    pCoef->gainSetCount = fMin(gainSetCount, 12);
1190
96.1k
    for (i = 0; i < gainSetCount; i++) {
1191
68.7k
      GAIN_SET tmpGset;
1192
68.7k
      FDKmemclear(&tmpGset, sizeof(GAIN_SET));
1193
68.7k
      err = _readGainSet(hBs, version, &gainSequenceIndex, &tmpGset, 0);
1194
68.7k
      if (err) return err;
1195
1196
68.6k
      if (i >= 12) continue;
1197
27.3k
      pCoef->gainSet[i] = tmpGset;
1198
27.3k
    }
1199
27.4k
  }
1200
991k
  for (i = 0; i < 12; i++) {
1201
915k
    pCoef->gainSetIndexForGainSequence[i] = 255;
1202
915k
  }
1203
114k
  for (i = 0; i < pCoef->gainSetCount; i++) {
1204
38.3k
    int b;
1205
55.3k
    for (b = 0; b < pCoef->gainSet[i].bandCount; b++) {
1206
16.9k
      if (pCoef->gainSet[i].gainSequenceIndex[b] >= 12) continue;
1207
12.4k
      pCoef->gainSetIndexForGainSequence[pCoef->gainSet[i]
1208
12.4k
                                             .gainSequenceIndex[b]] = i;
1209
12.4k
    }
1210
38.3k
  }
1211
1212
76.2k
  return err;
1213
76.5k
}
1214
1215
19.0k
static void _skipDrcInstructionsBasic(HANDLE_FDK_BITSTREAM hBs) {
1216
19.0k
  int drcSetEffect;
1217
19.0k
  int additionalDownmixIdPresent, additionalDownmixIdCount,
1218
19.0k
      limiterPeakTargetPresent;
1219
19.0k
  int drcSetTargetLoudnessPresent, drcSetTargetLoudnessValueLowerPresent;
1220
1221
19.0k
  FDKpushFor(hBs, 6); /* drcSetId */
1222
19.0k
  FDKpushFor(hBs, 4); /* drcLocation */
1223
19.0k
  FDKpushFor(hBs, 7); /* downmixId */
1224
19.0k
  additionalDownmixIdPresent = FDKreadBits(hBs, 1);
1225
19.0k
  if (additionalDownmixIdPresent) {
1226
2.41k
    additionalDownmixIdCount = FDKreadBits(hBs, 3);
1227
2.41k
    FDKpushFor(hBs, 7 * additionalDownmixIdCount); /* additionalDownmixId */
1228
2.41k
  }
1229
1230
19.0k
  drcSetEffect = FDKreadBits(hBs, 16);
1231
19.0k
  if (!(drcSetEffect & (EB_DUCK_OTHER | EB_DUCK_SELF))) {
1232
17.0k
    limiterPeakTargetPresent = FDKreadBits(hBs, 1);
1233
17.0k
    if (limiterPeakTargetPresent) {
1234
1.37k
      FDKpushFor(hBs, 8); /* bsLimiterPeakTarget */
1235
1.37k
    }
1236
17.0k
  }
1237
1238
19.0k
  drcSetTargetLoudnessPresent = FDKreadBits(hBs, 1);
1239
19.0k
  if (drcSetTargetLoudnessPresent) {
1240
1.99k
    FDKpushFor(hBs, 6); /* bsDrcSetTargetLoudnessValueUpper */
1241
1.99k
    drcSetTargetLoudnessValueLowerPresent = FDKreadBits(hBs, 1);
1242
1.99k
    if (drcSetTargetLoudnessValueLowerPresent) {
1243
906
      FDKpushFor(hBs, 6); /* bsDrcSetTargetLoudnessValueLower */
1244
906
    }
1245
1.99k
  }
1246
19.0k
}
1247
1248
static DRC_ERROR _readDrcInstructionsUniDrc(HANDLE_FDK_BITSTREAM hBs,
1249
                                            const int version,
1250
                                            HANDLE_UNI_DRC_CONFIG hUniDrcConfig,
1251
747k
                                            DRC_INSTRUCTIONS_UNI_DRC* pInst) {
1252
747k
  DRC_ERROR err = DE_OK;
1253
747k
  int i, g, c;
1254
747k
  int downmixIdPresent, additionalDownmixIdPresent, additionalDownmixIdCount;
1255
747k
  int bsLimiterPeakTarget, channelCount;
1256
747k
  DRC_COEFFICIENTS_UNI_DRC* pCoef = NULL;
1257
747k
  int repeatParameters, bsRepeatParametersCount;
1258
747k
  int repeatSequenceIndex, bsRepeatSequenceCount;
1259
747k
  SCHAR* gainSetIndex = pInst->gainSetIndex;
1260
747k
  SCHAR channelGroupForChannel[8];
1261
747k
  DUCKING_MODIFICATION duckingModificationForChannelGroup[8];
1262
1263
747k
  pInst->drcSetId = FDKreadBits(hBs, 6);
1264
747k
  if (version == 0) {
1265
    /* Assume all v0 DRC sets to be manageable in terms of complexity */
1266
678k
    pInst->drcSetComplexityLevel = 2;
1267
678k
  } else {
1268
69.4k
    pInst->drcSetComplexityLevel = FDKreadBits(hBs, 4);
1269
69.4k
  }
1270
747k
  pInst->drcLocation = FDKreadBits(hBs, 4);
1271
747k
  if (version == 0) {
1272
678k
    downmixIdPresent = 1;
1273
678k
  } else {
1274
69.4k
    downmixIdPresent = FDKreadBits(hBs, 1);
1275
69.4k
  }
1276
747k
  if (downmixIdPresent) {
1277
680k
    pInst->downmixId[0] = FDKreadBits(hBs, 7);
1278
680k
    if (version == 0) {
1279
678k
      if (pInst->downmixId[0] == 0)
1280
668k
        pInst->drcApplyToDownmix = 0;
1281
9.56k
      else
1282
9.56k
        pInst->drcApplyToDownmix = 1;
1283
678k
    } else {
1284
2.37k
      pInst->drcApplyToDownmix = FDKreadBits(hBs, 1);
1285
2.37k
    }
1286
1287
680k
    additionalDownmixIdPresent = FDKreadBits(hBs, 1);
1288
680k
    if (additionalDownmixIdPresent) {
1289
7.28k
      additionalDownmixIdCount = FDKreadBits(hBs, 3);
1290
7.28k
      if ((1 + additionalDownmixIdCount) > 8) return DE_MEMORY_ERROR;
1291
27.4k
      for (i = 0; i < additionalDownmixIdCount; i++) {
1292
20.2k
        pInst->downmixId[i + 1] = FDKreadBits(hBs, 7);
1293
20.2k
      }
1294
7.28k
      pInst->downmixIdCount = 1 + additionalDownmixIdCount;
1295
673k
    } else {
1296
673k
      pInst->downmixIdCount = 1;
1297
673k
    }
1298
680k
  } else {
1299
67.1k
    pInst->downmixId[0] = 0;
1300
67.1k
    pInst->downmixIdCount = 1;
1301
67.1k
  }
1302
1303
747k
  pInst->drcSetEffect = FDKreadBits(hBs, 16);
1304
1305
747k
  if ((pInst->drcSetEffect & (EB_DUCK_OTHER | EB_DUCK_SELF)) == 0) {
1306
741k
    pInst->limiterPeakTargetPresent = FDKreadBits(hBs, 1);
1307
741k
    if (pInst->limiterPeakTargetPresent) {
1308
1.95k
      bsLimiterPeakTarget = FDKreadBits(hBs, 8);
1309
1.95k
      pInst->limiterPeakTarget = -(FIXP_SGL)(
1310
1.95k
          bsLimiterPeakTarget
1311
1.95k
          << (FRACT_BITS - 1 - 3 - 5)); /* - bsLimiterPeakTarget * 0.125; */
1312
1.95k
    }
1313
741k
  }
1314
1315
747k
  pInst->drcSetTargetLoudnessPresent = FDKreadBits(hBs, 1);
1316
1317
  /* set default values */
1318
747k
  pInst->drcSetTargetLoudnessValueUpper = 0;
1319
747k
  pInst->drcSetTargetLoudnessValueLower = -63;
1320
1321
747k
  if (pInst->drcSetTargetLoudnessPresent == 1) {
1322
4.52k
    int bsDrcSetTargetLoudnessValueUpper, bsDrcSetTargetLoudnessValueLower;
1323
4.52k
    int drcSetTargetLoudnessValueLowerPresent;
1324
4.52k
    bsDrcSetTargetLoudnessValueUpper = FDKreadBits(hBs, 6);
1325
4.52k
    pInst->drcSetTargetLoudnessValueUpper =
1326
4.52k
        bsDrcSetTargetLoudnessValueUpper - 63;
1327
4.52k
    drcSetTargetLoudnessValueLowerPresent = FDKreadBits(hBs, 1);
1328
4.52k
    if (drcSetTargetLoudnessValueLowerPresent == 1) {
1329
1.73k
      bsDrcSetTargetLoudnessValueLower = FDKreadBits(hBs, 6);
1330
1.73k
      pInst->drcSetTargetLoudnessValueLower =
1331
1.73k
          bsDrcSetTargetLoudnessValueLower - 63;
1332
1.73k
    }
1333
4.52k
  }
1334
1335
747k
  pInst->dependsOnDrcSetPresent = FDKreadBits(hBs, 1);
1336
1337
747k
  pInst->noIndependentUse = 0;
1338
747k
  if (pInst->dependsOnDrcSetPresent) {
1339
4.09k
    pInst->dependsOnDrcSet = FDKreadBits(hBs, 6);
1340
743k
  } else {
1341
743k
    pInst->noIndependentUse = FDKreadBits(hBs, 1);
1342
743k
  }
1343
1344
747k
  if (version == 0) {
1345
678k
    pInst->requiresEq = 0;
1346
678k
  } else {
1347
69.4k
    pInst->requiresEq = FDKreadBits(hBs, 1);
1348
69.4k
  }
1349
1350
747k
  pCoef = selectDrcCoefficients(hUniDrcConfig, pInst->drcLocation);
1351
1352
747k
  pInst->drcChannelCount = channelCount =
1353
747k
      hUniDrcConfig->channelLayout.baseChannelCount;
1354
1355
747k
  if (pInst->drcSetEffect & (EB_DUCK_OTHER | EB_DUCK_SELF)) {
1356
6.56k
    DUCKING_MODIFICATION* pDModForChannel =
1357
6.56k
        pInst->duckingModificationForChannel;
1358
6.56k
    c = 0;
1359
19.4k
    while (c < channelCount) {
1360
13.1k
      int bsGainSetIndex;
1361
13.1k
      bsGainSetIndex = FDKreadBits(hBs, 6);
1362
13.1k
      if (c >= 8) return DE_MEMORY_ERROR;
1363
13.1k
      gainSetIndex[c] = bsGainSetIndex - 1;
1364
13.1k
      _decodeDuckingModification(hBs, &(pDModForChannel[c]), 0);
1365
1366
13.1k
      c++;
1367
13.1k
      repeatParameters = FDKreadBits(hBs, 1);
1368
13.1k
      if (repeatParameters == 1) {
1369
1.46k
        bsRepeatParametersCount = FDKreadBits(hBs, 5);
1370
1.46k
        bsRepeatParametersCount += 1;
1371
6.91k
        for (i = 0; i < bsRepeatParametersCount; i++) {
1372
5.72k
          if (c >= 8) return DE_MEMORY_ERROR;
1373
5.45k
          gainSetIndex[c] = gainSetIndex[c - 1];
1374
5.45k
          pDModForChannel[c] = pDModForChannel[c - 1];
1375
5.45k
          c++;
1376
5.45k
        }
1377
1.46k
      }
1378
13.1k
    }
1379
6.30k
    if (c > channelCount) {
1380
85
      return DE_NOT_OK;
1381
85
    }
1382
1383
6.21k
    err = deriveDrcChannelGroups(
1384
6.21k
        pInst->drcSetEffect, pInst->drcChannelCount, gainSetIndex,
1385
6.21k
        pDModForChannel, &pInst->nDrcChannelGroups,
1386
6.21k
        pInst->gainSetIndexForChannelGroup, channelGroupForChannel,
1387
6.21k
        duckingModificationForChannelGroup);
1388
6.21k
    if (err) return (err);
1389
741k
  } else {
1390
741k
    int deriveChannelCount = 0;
1391
741k
    if (((version == 0) || (pInst->drcApplyToDownmix != 0)) &&
1392
673k
        (pInst->downmixId[0] != DOWNMIX_ID_BASE_LAYOUT) &&
1393
6.62k
        (pInst->downmixId[0] != DOWNMIX_ID_ANY_DOWNMIX) &&
1394
6.05k
        (pInst->downmixIdCount == 1)) {
1395
2.43k
      if (hUniDrcConfig->downmixInstructionsCount != 0) {
1396
748
        DOWNMIX_INSTRUCTIONS* pDown =
1397
748
            selectDownmixInstructions(hUniDrcConfig, pInst->downmixId[0]);
1398
748
        if (pDown == NULL) return DE_NOT_OK;
1399
439
        pInst->drcChannelCount = channelCount =
1400
439
            pDown->targetChannelCount; /* targetChannelCountFromDownmixId*/
1401
1.68k
      } else {
1402
1.68k
        deriveChannelCount = 1;
1403
1.68k
        channelCount = 1;
1404
1.68k
      }
1405
738k
    } else if (((version == 0) || (pInst->drcApplyToDownmix != 0)) &&
1406
671k
               ((pInst->downmixId[0] == DOWNMIX_ID_ANY_DOWNMIX) ||
1407
670k
                (pInst->downmixIdCount > 1))) {
1408
      /* Set maximum channel count as upper border. The effective channel count
1409
       * is set at the process function. */
1410
4.22k
      pInst->drcChannelCount = 8;
1411
4.22k
      channelCount = 1;
1412
4.22k
    }
1413
1414
740k
    c = 0;
1415
5.95M
    while (c < channelCount) {
1416
5.21M
      int bsGainSetIndex;
1417
5.21M
      bsGainSetIndex = FDKreadBits(hBs, 6);
1418
5.21M
      if (c >= 8) return DE_MEMORY_ERROR;
1419
5.21M
      gainSetIndex[c] = bsGainSetIndex - 1;
1420
5.21M
      c++;
1421
5.21M
      repeatSequenceIndex = FDKreadBits(hBs, 1);
1422
1423
5.21M
      if (repeatSequenceIndex == 1) {
1424
5.07k
        bsRepeatSequenceCount = FDKreadBits(hBs, 5);
1425
5.07k
        bsRepeatSequenceCount += 1;
1426
5.07k
        if (deriveChannelCount) {
1427
627
          channelCount = 1 + bsRepeatSequenceCount;
1428
627
        }
1429
23.6k
        for (i = 0; i < bsRepeatSequenceCount; i++) {
1430
18.8k
          if (c >= 8) return DE_MEMORY_ERROR;
1431
18.5k
          gainSetIndex[c] = bsGainSetIndex - 1;
1432
18.5k
          c++;
1433
18.5k
        }
1434
5.07k
      }
1435
5.21M
    }
1436
740k
    if (c > channelCount) {
1437
86
      return DE_NOT_OK;
1438
86
    }
1439
740k
    if (deriveChannelCount) {
1440
1.56k
      pInst->drcChannelCount = channelCount;
1441
1.56k
    }
1442
1443
    /* DOWNMIX_ID_ANY_DOWNMIX: channelCount is 1. Distribute gainSetIndex to all
1444
     * channels. */
1445
740k
    if ((pInst->downmixId[0] == DOWNMIX_ID_ANY_DOWNMIX) ||
1446
739k
        (pInst->downmixIdCount > 1)) {
1447
33.9k
      for (c = 1; c < pInst->drcChannelCount; c++) {
1448
29.2k
        gainSetIndex[c] = gainSetIndex[0];
1449
29.2k
      }
1450
4.61k
    }
1451
1452
740k
    err = deriveDrcChannelGroups(pInst->drcSetEffect, pInst->drcChannelCount,
1453
740k
                                 gainSetIndex, NULL, &pInst->nDrcChannelGroups,
1454
740k
                                 pInst->gainSetIndexForChannelGroup,
1455
740k
                                 channelGroupForChannel, NULL);
1456
740k
    if (err) return (err);
1457
1458
772k
    for (g = 0; g < pInst->nDrcChannelGroups; g++) {
1459
32.6k
      int set, bandCount;
1460
32.6k
      set = pInst->gainSetIndexForChannelGroup[g];
1461
1462
      /* get bandCount */
1463
32.6k
      if (pCoef != NULL && set < pCoef->gainSetCount) {
1464
1.23k
        bandCount = pCoef->gainSet[set].bandCount;
1465
31.3k
      } else {
1466
31.3k
        bandCount = 1;
1467
31.3k
      }
1468
1469
32.6k
      _decodeGainModification(hBs, version, bandCount,
1470
32.6k
                              pInst->gainModificationForChannelGroup[g], 0);
1471
32.6k
    }
1472
740k
  }
1473
1474
745k
  return err;
1475
747k
}
1476
1477
static DRC_ERROR _readChannelLayout(HANDLE_FDK_BITSTREAM hBs,
1478
32.1k
                                    CHANNEL_LAYOUT* pChan) {
1479
32.1k
  DRC_ERROR err = DE_OK;
1480
1481
32.1k
  pChan->baseChannelCount = FDKreadBits(hBs, 7);
1482
1483
32.1k
  if (pChan->baseChannelCount > 8) return DE_NOT_OK;
1484
1485
31.9k
  pChan->layoutSignalingPresent = FDKreadBits(hBs, 1);
1486
1487
31.9k
  if (pChan->layoutSignalingPresent) {
1488
6.87k
    pChan->definedLayout = FDKreadBits(hBs, 8);
1489
1490
6.87k
    if (pChan->definedLayout == 0) {
1491
473
      int i;
1492
2.43k
      for (i = 0; i < pChan->baseChannelCount; i++) {
1493
1.96k
        if (i < 8) {
1494
1.96k
          pChan->speakerPosition[i] = FDKreadBits(hBs, 7);
1495
1.96k
        } else {
1496
0
          FDKpushFor(hBs, 7);
1497
0
        }
1498
1.96k
      }
1499
473
    }
1500
6.87k
  }
1501
31.9k
  return err;
1502
32.1k
}
1503
1504
static DRC_ERROR _readDownmixInstructions(HANDLE_FDK_BITSTREAM hBs,
1505
                                          const int version,
1506
                                          CHANNEL_LAYOUT* pChan,
1507
1.18M
                                          DOWNMIX_INSTRUCTIONS* pDown) {
1508
1.18M
  DRC_ERROR err = DE_OK;
1509
1510
1.18M
  pDown->downmixId = FDKreadBits(hBs, 7);
1511
1.18M
  pDown->targetChannelCount = FDKreadBits(hBs, 7);
1512
1.18M
  pDown->targetLayout = FDKreadBits(hBs, 8);
1513
1.18M
  pDown->downmixCoefficientsPresent = FDKreadBits(hBs, 1);
1514
1515
1.18M
  if (pDown->downmixCoefficientsPresent) {
1516
4.24k
    int nDownmixCoeffs = pDown->targetChannelCount * pChan->baseChannelCount;
1517
4.24k
    int i;
1518
4.24k
    if (nDownmixCoeffs > 8 * 8) return DE_NOT_OK;
1519
4.03k
    if (version == 0) {
1520
2.44k
      pDown->bsDownmixOffset = 0;
1521
20.3k
      for (i = 0; i < nDownmixCoeffs; i++) {
1522
        /* LFE downmix coefficients are not supported. */
1523
17.9k
        pDown->downmixCoefficient[i] = downmixCoeff[FDKreadBits(hBs, 4)];
1524
17.9k
      }
1525
2.44k
    } else {
1526
1.59k
      pDown->bsDownmixOffset = FDKreadBits(hBs, 4);
1527
5.89k
      for (i = 0; i < nDownmixCoeffs; i++) {
1528
4.29k
        pDown->downmixCoefficient[i] = downmixCoeffV1[FDKreadBits(hBs, 5)];
1529
4.29k
      }
1530
1.59k
    }
1531
4.03k
  }
1532
1.18M
  return err;
1533
1.18M
}
1534
1535
static DRC_ERROR _readDrcExtensionV1(HANDLE_FDK_BITSTREAM hBs,
1536
21.6k
                                     HANDLE_UNI_DRC_CONFIG hUniDrcConfig) {
1537
21.6k
  DRC_ERROR err = DE_OK;
1538
21.6k
  int downmixInstructionsV1Present;
1539
21.6k
  int drcCoeffsAndInstructionsUniDrcV1Present;
1540
21.6k
  int loudEqInstructionsPresent, loudEqInstructionsCount;
1541
21.6k
  int eqPresent, eqInstructionsCount;
1542
21.6k
  int i, offset;
1543
21.6k
  int diff = hUniDrcConfig->diff;
1544
1545
21.6k
  downmixInstructionsV1Present = FDKreadBits(hBs, 1);
1546
21.6k
  if (downmixInstructionsV1Present == 1) {
1547
3.28k
    diff |= _compAssign(&hUniDrcConfig->downmixInstructionsCountV1,
1548
3.28k
                        FDKreadBits(hBs, 7));
1549
3.28k
    offset = hUniDrcConfig->downmixInstructionsCountV0;
1550
3.28k
    hUniDrcConfig->downmixInstructionsCount = fMin(
1551
3.28k
        (UCHAR)(offset + hUniDrcConfig->downmixInstructionsCountV1), (UCHAR)6);
1552
44.8k
    for (i = 0; i < hUniDrcConfig->downmixInstructionsCountV1; i++) {
1553
41.6k
      DOWNMIX_INSTRUCTIONS tmpDown;
1554
41.6k
      FDKmemclear(&tmpDown, sizeof(DOWNMIX_INSTRUCTIONS));
1555
41.6k
      err = _readDownmixInstructions(hBs, 1, &hUniDrcConfig->channelLayout,
1556
41.6k
                                     &tmpDown);
1557
41.6k
      if (err) return err;
1558
41.5k
      if ((offset + i) >= 6) continue;
1559
8.44k
      if (!diff)
1560
221
        diff |= (FDKmemcmp(&tmpDown,
1561
221
                           &(hUniDrcConfig->downmixInstructions[offset + i]),
1562
221
                           sizeof(DOWNMIX_INSTRUCTIONS)) != 0);
1563
8.44k
      hUniDrcConfig->downmixInstructions[offset + i] = tmpDown;
1564
8.44k
    }
1565
18.3k
  } else {
1566
18.3k
    diff |= _compAssign(&hUniDrcConfig->downmixInstructionsCountV1, 0);
1567
18.3k
  }
1568
1569
21.5k
  drcCoeffsAndInstructionsUniDrcV1Present = FDKreadBits(hBs, 1);
1570
21.5k
  if (drcCoeffsAndInstructionsUniDrcV1Present == 1) {
1571
10.4k
    diff |= _compAssign(&hUniDrcConfig->drcCoefficientsUniDrcCountV1,
1572
10.4k
                        FDKreadBits(hBs, 3));
1573
10.4k
    offset = hUniDrcConfig->drcCoefficientsUniDrcCountV0;
1574
10.4k
    hUniDrcConfig->drcCoefficientsUniDrcCount =
1575
10.4k
        fMin((UCHAR)(offset + hUniDrcConfig->drcCoefficientsUniDrcCountV1),
1576
10.4k
             (UCHAR)2);
1577
37.8k
    for (i = 0; i < hUniDrcConfig->drcCoefficientsUniDrcCountV1; i++) {
1578
27.4k
      DRC_COEFFICIENTS_UNI_DRC tmpCoef;
1579
27.4k
      FDKmemclear(&tmpCoef, sizeof(DRC_COEFFICIENTS_UNI_DRC));
1580
27.4k
      err = _readDrcCoefficientsUniDrc(hBs, 1, &tmpCoef);
1581
27.4k
      if (err) return err;
1582
27.3k
      if ((offset + i) >= 2) continue;
1583
7.17k
      if (!diff)
1584
295
        diff |= (FDKmemcmp(&tmpCoef,
1585
295
                           &(hUniDrcConfig->drcCoefficientsUniDrc[offset + i]),
1586
295
                           sizeof(DRC_COEFFICIENTS_UNI_DRC)) != 0);
1587
7.17k
      hUniDrcConfig->drcCoefficientsUniDrc[offset + i] = tmpCoef;
1588
7.17k
    }
1589
1590
10.3k
    diff |= _compAssign(&hUniDrcConfig->drcInstructionsUniDrcCountV1,
1591
10.3k
                        FDKreadBits(hBs, 6));
1592
10.3k
    offset = hUniDrcConfig->drcInstructionsUniDrcCount;
1593
10.3k
    hUniDrcConfig->drcInstructionsUniDrcCount =
1594
10.3k
        fMin((UCHAR)(offset + hUniDrcConfig->drcInstructionsUniDrcCountV1),
1595
10.3k
             (UCHAR)12);
1596
79.4k
    for (i = 0; i < hUniDrcConfig->drcInstructionsUniDrcCount; i++) {
1597
69.4k
      DRC_INSTRUCTIONS_UNI_DRC tmpInst;
1598
69.4k
      FDKmemclear(&tmpInst, sizeof(DRC_INSTRUCTIONS_UNI_DRC));
1599
69.4k
      err = _readDrcInstructionsUniDrc(hBs, 1, hUniDrcConfig, &tmpInst);
1600
69.4k
      if (err) return err;
1601
69.0k
      if ((offset + i) >= 12) continue;
1602
23.5k
      if (!diff)
1603
471
        diff |= (FDKmemcmp(&tmpInst,
1604
471
                           &(hUniDrcConfig->drcInstructionsUniDrc[offset + i]),
1605
471
                           sizeof(DRC_INSTRUCTIONS_UNI_DRC)) != 0);
1606
23.5k
      hUniDrcConfig->drcInstructionsUniDrc[offset + i] = tmpInst;
1607
23.5k
    }
1608
11.0k
  } else {
1609
11.0k
    diff |= _compAssign(&hUniDrcConfig->drcCoefficientsUniDrcCountV1, 0);
1610
11.0k
    diff |= _compAssign(&hUniDrcConfig->drcInstructionsUniDrcCountV1, 0);
1611
11.0k
  }
1612
1613
21.0k
  loudEqInstructionsPresent = FDKreadBits(hBs, 1);
1614
21.0k
  if (loudEqInstructionsPresent == 1) {
1615
4.19k
    loudEqInstructionsCount = FDKreadBits(hBs, 4);
1616
23.9k
    for (i = 0; i < loudEqInstructionsCount; i++) {
1617
19.7k
      _skipLoudEqInstructions(hBs);
1618
19.7k
    }
1619
4.19k
  }
1620
1621
21.0k
  eqPresent = FDKreadBits(hBs, 1);
1622
21.0k
  if (eqPresent == 1) {
1623
6.91k
    _skipEqCoefficients(hBs);
1624
6.91k
    eqInstructionsCount = FDKreadBits(hBs, 4);
1625
41.2k
    for (i = 0; i < eqInstructionsCount; i++) {
1626
34.3k
      _skipEqInstructions(hBs, hUniDrcConfig);
1627
34.3k
    }
1628
6.91k
  }
1629
1630
21.0k
  hUniDrcConfig->diff = diff;
1631
1632
21.0k
  return err;
1633
21.5k
}
1634
1635
static DRC_ERROR _readUniDrcConfigExtension(
1636
19.2k
    HANDLE_FDK_BITSTREAM hBs, HANDLE_UNI_DRC_CONFIG hUniDrcConfig) {
1637
19.2k
  DRC_ERROR err = DE_OK;
1638
19.2k
  int k, bitSizeLen, extSizeBits, bitSize;
1639
19.2k
  INT nBitsRemaining;
1640
19.2k
  UNI_DRC_CONFIG_EXTENSION* pExt = &(hUniDrcConfig->uniDrcConfigExt);
1641
1642
19.2k
  k = 0;
1643
19.2k
  pExt->uniDrcConfigExtType[k] = FDKreadBits(hBs, 4);
1644
38.4k
  while (pExt->uniDrcConfigExtType[k] != UNIDRCCONFEXT_TERM) {
1645
37.4k
    if (k >= (8 - 1)) return DE_MEMORY_ERROR;
1646
36.7k
    bitSizeLen = FDKreadBits(hBs, 4);
1647
36.7k
    extSizeBits = bitSizeLen + 4;
1648
1649
36.7k
    bitSize = FDKreadBits(hBs, extSizeBits);
1650
36.7k
    pExt->extBitSize[k] = bitSize + 1;
1651
36.7k
    nBitsRemaining = (INT)FDKgetValidBits(hBs);
1652
1653
36.7k
    switch (pExt->uniDrcConfigExtType[k]) {
1654
21.6k
      case UNIDRCCONFEXT_V1:
1655
21.6k
        err = _readDrcExtensionV1(hBs, hUniDrcConfig);
1656
21.6k
        if (err) return err;
1657
21.0k
        if (nBitsRemaining !=
1658
21.0k
            ((INT)pExt->extBitSize[k] + (INT)FDKgetValidBits(hBs)))
1659
17.0k
          return DE_NOT_OK;
1660
4.00k
        break;
1661
4.00k
      case UNIDRCCONFEXT_PARAM_DRC:
1662
      /* add future extensions here */
1663
15.1k
      default:
1664
15.1k
        FDKpushFor(hBs, pExt->extBitSize[k]);
1665
15.1k
        break;
1666
36.7k
    }
1667
19.1k
    k++;
1668
19.1k
    pExt->uniDrcConfigExtType[k] = FDKreadBits(hBs, 4);
1669
19.1k
  }
1670
1671
1.01k
  return err;
1672
19.2k
}
1673
1674
DRC_ERROR
1675
drcDec_readUniDrcConfig(HANDLE_FDK_BITSTREAM hBs,
1676
32.1k
                        HANDLE_UNI_DRC_CONFIG hUniDrcConfig) {
1677
32.1k
  DRC_ERROR err = DE_OK;
1678
32.1k
  int i, diff = 0;
1679
32.1k
  int drcDescriptionBasicPresent, drcCoefficientsBasicCount,
1680
32.1k
      drcInstructionsBasicCount;
1681
32.1k
  CHANNEL_LAYOUT tmpChan;
1682
32.1k
  FDKmemclear(&tmpChan, sizeof(CHANNEL_LAYOUT));
1683
32.1k
  if (hUniDrcConfig == NULL) return DE_NOT_OK;
1684
1685
32.1k
  diff |= _compAssign(&hUniDrcConfig->sampleRatePresent, FDKreadBits(hBs, 1));
1686
1687
32.1k
  if (hUniDrcConfig->sampleRatePresent == 1) {
1688
993
    diff |=
1689
993
        _compAssign(&hUniDrcConfig->sampleRate, FDKreadBits(hBs, 18) + 1000);
1690
993
  }
1691
1692
32.1k
  diff |= _compAssign(&hUniDrcConfig->downmixInstructionsCountV0,
1693
32.1k
                      FDKreadBits(hBs, 7));
1694
1695
32.1k
  drcDescriptionBasicPresent = FDKreadBits(hBs, 1);
1696
32.1k
  if (drcDescriptionBasicPresent == 1) {
1697
2.37k
    drcCoefficientsBasicCount = FDKreadBits(hBs, 3);
1698
2.37k
    drcInstructionsBasicCount = FDKreadBits(hBs, 4);
1699
29.7k
  } else {
1700
29.7k
    drcCoefficientsBasicCount = 0;
1701
29.7k
    drcInstructionsBasicCount = 0;
1702
29.7k
  }
1703
1704
32.1k
  diff |= _compAssign(&hUniDrcConfig->drcCoefficientsUniDrcCountV0,
1705
32.1k
                      FDKreadBits(hBs, 3));
1706
32.1k
  diff |= _compAssign(&hUniDrcConfig->drcInstructionsUniDrcCountV0,
1707
32.1k
                      FDKreadBits(hBs, 6));
1708
1709
32.1k
  err = _readChannelLayout(hBs, &tmpChan);
1710
32.1k
  if (err) return err;
1711
1712
31.9k
  if (!diff)
1713
16.5k
    diff |= (FDKmemcmp(&tmpChan, &hUniDrcConfig->channelLayout,
1714
16.5k
                       sizeof(CHANNEL_LAYOUT)) != 0);
1715
31.9k
  hUniDrcConfig->channelLayout = tmpChan;
1716
1717
31.9k
  hUniDrcConfig->downmixInstructionsCount =
1718
31.9k
      fMin(hUniDrcConfig->downmixInstructionsCountV0, (UCHAR)6);
1719
1.17M
  for (i = 0; i < hUniDrcConfig->downmixInstructionsCountV0; i++) {
1720
1.14M
    DOWNMIX_INSTRUCTIONS tmpDown;
1721
1.14M
    FDKmemclear(&tmpDown, sizeof(DOWNMIX_INSTRUCTIONS));
1722
1.14M
    err = _readDownmixInstructions(hBs, 0, &hUniDrcConfig->channelLayout,
1723
1.14M
                                   &tmpDown);
1724
1.14M
    if (err) return err;
1725
1.14M
    if (i >= 6) continue;
1726
68.0k
    if (!diff)
1727
11.1k
      diff |= (FDKmemcmp(&tmpDown, &(hUniDrcConfig->downmixInstructions[i]),
1728
11.1k
                         sizeof(DOWNMIX_INSTRUCTIONS)) != 0);
1729
68.0k
    hUniDrcConfig->downmixInstructions[i] = tmpDown;
1730
68.0k
  }
1731
1732
35.7k
  for (i = 0; i < drcCoefficientsBasicCount; i++) {
1733
3.95k
    _skipDrcCoefficientsBasic(hBs);
1734
3.95k
  }
1735
50.8k
  for (i = 0; i < drcInstructionsBasicCount; i++) {
1736
19.0k
    _skipDrcInstructionsBasic(hBs);
1737
19.0k
  }
1738
1739
31.8k
  hUniDrcConfig->drcCoefficientsUniDrcCount =
1740
31.8k
      fMin(hUniDrcConfig->drcCoefficientsUniDrcCountV0, (UCHAR)2);
1741
80.7k
  for (i = 0; i < hUniDrcConfig->drcCoefficientsUniDrcCountV0; i++) {
1742
49.0k
    DRC_COEFFICIENTS_UNI_DRC tmpCoef;
1743
49.0k
    FDKmemclear(&tmpCoef, sizeof(DRC_COEFFICIENTS_UNI_DRC));
1744
49.0k
    err = _readDrcCoefficientsUniDrc(hBs, 0, &tmpCoef);
1745
49.0k
    if (err) return err;
1746
48.9k
    if (i >= 2) continue;
1747
20.1k
    if (!diff)
1748
5.34k
      diff |= (FDKmemcmp(&tmpCoef, &(hUniDrcConfig->drcCoefficientsUniDrc[i]),
1749
5.34k
                         sizeof(DRC_COEFFICIENTS_UNI_DRC)) != 0);
1750
20.1k
    hUniDrcConfig->drcCoefficientsUniDrc[i] = tmpCoef;
1751
20.1k
  }
1752
1753
31.6k
  hUniDrcConfig->drcInstructionsUniDrcCount =
1754
31.6k
      fMin(hUniDrcConfig->drcInstructionsUniDrcCountV0, (UCHAR)12);
1755
708k
  for (i = 0; i < hUniDrcConfig->drcInstructionsUniDrcCountV0; i++) {
1756
678k
    DRC_INSTRUCTIONS_UNI_DRC tmpInst;
1757
678k
    FDKmemclear(&tmpInst, sizeof(DRC_INSTRUCTIONS_UNI_DRC));
1758
678k
    err = _readDrcInstructionsUniDrc(hBs, 0, hUniDrcConfig, &tmpInst);
1759
678k
    if (err) return err;
1760
676k
    if (i >= 12) continue;
1761
166k
    if (!diff)
1762
37.4k
      diff |= (FDKmemcmp(&tmpInst, &(hUniDrcConfig->drcInstructionsUniDrc[i]),
1763
37.4k
                         sizeof(DRC_INSTRUCTIONS_UNI_DRC)) != 0);
1764
166k
    hUniDrcConfig->drcInstructionsUniDrc[i] = tmpInst;
1765
166k
  }
1766
1767
29.9k
  diff |=
1768
29.9k
      _compAssign(&hUniDrcConfig->uniDrcConfigExtPresent, FDKreadBits(hBs, 1));
1769
29.9k
  hUniDrcConfig->diff = diff;
1770
1771
29.9k
  if (hUniDrcConfig->uniDrcConfigExtPresent == 1) {
1772
19.2k
    err = _readUniDrcConfigExtension(hBs, hUniDrcConfig);
1773
19.2k
    if (err) return err;
1774
19.2k
  }
1775
1776
11.6k
  return err;
1777
29.9k
}
1778
1779
/*******************/
1780
/* loudnessInfoSet */
1781
/*******************/
1782
1783
static DRC_ERROR _decodeMethodValue(HANDLE_FDK_BITSTREAM hBs,
1784
                                    const UCHAR methodDefinition,
1785
6.24k
                                    FIXP_DBL* methodValue, INT isBox) {
1786
6.24k
  int tmp;
1787
6.24k
  FIXP_DBL val;
1788
6.24k
  switch (methodDefinition) {
1789
1.61k
    case MD_UNKNOWN_OTHER:
1790
2.16k
    case MD_PROGRAM_LOUDNESS:
1791
2.66k
    case MD_ANCHOR_LOUDNESS:
1792
2.83k
    case MD_MAX_OF_LOUDNESS_RANGE:
1793
3.18k
    case MD_MOMENTARY_LOUDNESS_MAX:
1794
3.35k
    case MD_SHORT_TERM_LOUDNESS_MAX:
1795
3.35k
      tmp = FDKreadBits(hBs, 8);
1796
3.35k
      val = FL2FXCONST_DBL(-57.75f / (float)(1 << 7)) +
1797
3.35k
            (FIXP_DBL)(
1798
3.35k
                tmp << (DFRACT_BITS - 1 - 2 - 7)); /* -57.75 + tmp * 0.25; */
1799
3.35k
      break;
1800
606
    case MD_LOUDNESS_RANGE:
1801
606
      tmp = FDKreadBits(hBs, 8);
1802
606
      if (tmp == 0)
1803
82
        val = (FIXP_DBL)0;
1804
524
      else if (tmp <= 128)
1805
208
        val = (FIXP_DBL)(tmp << (DFRACT_BITS - 1 - 2 - 7)); /* tmp * 0.25; */
1806
316
      else if (tmp <= 204) {
1807
195
        val = (FIXP_DBL)(tmp << (DFRACT_BITS - 1 - 1 - 7)) -
1808
195
              FL2FXCONST_DBL(32.0f / (float)(1 << 7)); /* 0.5 * tmp - 32.0f; */
1809
195
      } else {
1810
        /* downscale by 1 more bit to prevent overflow at intermediate result */
1811
121
        val = (FIXP_DBL)(tmp << (DFRACT_BITS - 1 - 8)) -
1812
121
              FL2FXCONST_DBL(134.0f / (float)(1 << 8)); /* tmp - 134.0; */
1813
121
        val <<= 1;
1814
121
      }
1815
606
      break;
1816
645
    case MD_MIXING_LEVEL:
1817
645
      tmp = FDKreadBits(hBs, isBox ? 8 : 5);
1818
645
      val = (FIXP_DBL)(tmp << (DFRACT_BITS - 1 - 7)) +
1819
645
            FL2FXCONST_DBL(80.0f / (float)(1 << 7)); /* tmp + 80.0; */
1820
645
      break;
1821
759
    case MD_ROOM_TYPE:
1822
759
      tmp = FDKreadBits(hBs, isBox ? 8 : 2);
1823
759
      val = (FIXP_DBL)(tmp << (DFRACT_BITS - 1 - 7)); /* tmp; */
1824
759
      break;
1825
245
    case MD_SHORT_TERM_LOUDNESS:
1826
245
      tmp = FDKreadBits(hBs, 8);
1827
245
      val = FL2FXCONST_DBL(-116.0f / (float)(1 << 7)) +
1828
245
            (FIXP_DBL)(
1829
245
                tmp << (DFRACT_BITS - 1 - 1 - 7)); /* -116.0 + tmp * 0.5; */
1830
245
      break;
1831
635
    default:
1832
635
      return DE_NOT_OK; /* invalid methodDefinition value */
1833
6.24k
  }
1834
5.61k
  *methodValue = val;
1835
5.61k
  return DE_OK;
1836
6.24k
}
1837
1838
static DRC_ERROR _readLoudnessMeasurement(HANDLE_FDK_BITSTREAM hBs,
1839
6.24k
                                          LOUDNESS_MEASUREMENT* pMeas) {
1840
6.24k
  DRC_ERROR err = DE_OK;
1841
1842
6.24k
  pMeas->methodDefinition = FDKreadBits(hBs, 4);
1843
6.24k
  err =
1844
6.24k
      _decodeMethodValue(hBs, pMeas->methodDefinition, &pMeas->methodValue, 0);
1845
6.24k
  if (err) return err;
1846
5.61k
  pMeas->measurementSystem = FDKreadBits(hBs, 4);
1847
5.61k
  pMeas->reliability = FDKreadBits(hBs, 2);
1848
1849
5.61k
  return err;
1850
6.24k
}
1851
1852
static DRC_ERROR _readLoudnessInfo(HANDLE_FDK_BITSTREAM hBs, const int version,
1853
16.1k
                                   LOUDNESS_INFO* loudnessInfo) {
1854
16.1k
  DRC_ERROR err = DE_OK;
1855
16.1k
  int bsSamplePeakLevel, bsTruePeakLevel, i;
1856
16.1k
  int measurementCount;
1857
1858
16.1k
  loudnessInfo->drcSetId = FDKreadBits(hBs, 6);
1859
16.1k
  if (version >= 1) {
1860
3.31k
    loudnessInfo->eqSetId = FDKreadBits(hBs, 6);
1861
12.8k
  } else {
1862
12.8k
    loudnessInfo->eqSetId = 0;
1863
12.8k
  }
1864
16.1k
  loudnessInfo->downmixId = FDKreadBits(hBs, 7);
1865
1866
16.1k
  loudnessInfo->samplePeakLevelPresent = FDKreadBits(hBs, 1);
1867
16.1k
  if (loudnessInfo->samplePeakLevelPresent) {
1868
1.56k
    bsSamplePeakLevel = FDKreadBits(hBs, 12);
1869
1.56k
    if (bsSamplePeakLevel == 0) {
1870
107
      loudnessInfo->samplePeakLevelPresent = 0;
1871
107
      loudnessInfo->samplePeakLevel = (FIXP_DBL)0;
1872
1.46k
    } else { /* 20.0 - bsSamplePeakLevel * 0.03125; */
1873
1.46k
      loudnessInfo->samplePeakLevel =
1874
1.46k
          FL2FXCONST_DBL(20.0f / (float)(1 << 7)) -
1875
1.46k
          (FIXP_DBL)(bsSamplePeakLevel << (DFRACT_BITS - 1 - 5 - 7));
1876
1.46k
    }
1877
1.56k
  }
1878
1879
16.1k
  loudnessInfo->truePeakLevelPresent = FDKreadBits(hBs, 1);
1880
16.1k
  if (loudnessInfo->truePeakLevelPresent) {
1881
995
    bsTruePeakLevel = FDKreadBits(hBs, 12);
1882
995
    if (bsTruePeakLevel == 0) {
1883
121
      loudnessInfo->truePeakLevelPresent = 0;
1884
121
      loudnessInfo->truePeakLevel = (FIXP_DBL)0;
1885
874
    } else {
1886
874
      loudnessInfo->truePeakLevel =
1887
874
          FL2FXCONST_DBL(20.0f / (float)(1 << 7)) -
1888
874
          (FIXP_DBL)(bsTruePeakLevel << (DFRACT_BITS - 1 - 5 - 7));
1889
874
    }
1890
995
    loudnessInfo->truePeakLevelMeasurementSystem = FDKreadBits(hBs, 4);
1891
995
    loudnessInfo->truePeakLevelReliability = FDKreadBits(hBs, 2);
1892
995
  }
1893
1894
16.1k
  measurementCount = FDKreadBits(hBs, 4);
1895
16.1k
  loudnessInfo->measurementCount = fMin(measurementCount, 8);
1896
21.7k
  for (i = 0; i < measurementCount; i++) {
1897
6.24k
    LOUDNESS_MEASUREMENT tmpMeas;
1898
6.24k
    FDKmemclear(&tmpMeas, sizeof(LOUDNESS_MEASUREMENT));
1899
6.24k
    err = _readLoudnessMeasurement(hBs, &tmpMeas);
1900
6.24k
    if (err) return err;
1901
5.61k
    if (i >= 8) continue;
1902
5.16k
    loudnessInfo->loudnessMeasurement[i] = tmpMeas;
1903
5.16k
  }
1904
1905
15.5k
  return err;
1906
16.1k
}
1907
1908
static DRC_ERROR _readLoudnessInfoSetExtEq(
1909
574
    HANDLE_FDK_BITSTREAM hBs, HANDLE_LOUDNESS_INFO_SET hLoudnessInfoSet) {
1910
574
  DRC_ERROR err = DE_OK;
1911
574
  int i, offset;
1912
574
  int diff = hLoudnessInfoSet->diff;
1913
1914
574
  diff |= _compAssign(&hLoudnessInfoSet->loudnessInfoAlbumCountV1,
1915
574
                      FDKreadBits(hBs, 6));
1916
574
  diff |=
1917
574
      _compAssign(&hLoudnessInfoSet->loudnessInfoCountV1, FDKreadBits(hBs, 6));
1918
1919
574
  offset = hLoudnessInfoSet->loudnessInfoAlbumCountV0;
1920
574
  hLoudnessInfoSet->loudnessInfoAlbumCount = fMin(
1921
574
      (UCHAR)(offset + hLoudnessInfoSet->loudnessInfoAlbumCountV1), (UCHAR)12);
1922
2.34k
  for (i = 0; i < hLoudnessInfoSet->loudnessInfoAlbumCountV1; i++) {
1923
1.83k
    LOUDNESS_INFO tmpLoud;
1924
1.83k
    FDKmemclear(&tmpLoud, sizeof(LOUDNESS_INFO));
1925
1.83k
    err = _readLoudnessInfo(hBs, 1, &tmpLoud);
1926
1.83k
    if (err) return err;
1927
1.76k
    if ((offset + i) >= 12) continue;
1928
694
    if (!diff)
1929
115
      diff |= (FDKmemcmp(&tmpLoud,
1930
115
                         &(hLoudnessInfoSet->loudnessInfoAlbum[offset + i]),
1931
115
                         sizeof(LOUDNESS_INFO)) != 0);
1932
694
    hLoudnessInfoSet->loudnessInfoAlbum[offset + i] = tmpLoud;
1933
694
  }
1934
1935
505
  offset = hLoudnessInfoSet->loudnessInfoCountV0;
1936
505
  hLoudnessInfoSet->loudnessInfoCount =
1937
505
      fMin((UCHAR)(offset + hLoudnessInfoSet->loudnessInfoCountV1), (UCHAR)12);
1938
1.91k
  for (i = 0; i < hLoudnessInfoSet->loudnessInfoCountV1; i++) {
1939
1.48k
    LOUDNESS_INFO tmpLoud;
1940
1.48k
    FDKmemclear(&tmpLoud, sizeof(LOUDNESS_INFO));
1941
1.48k
    err = _readLoudnessInfo(hBs, 1, &tmpLoud);
1942
1.48k
    if (err) return err;
1943
1.41k
    if ((offset + i) >= 12) continue;
1944
570
    if (!diff)
1945
81
      diff |=
1946
81
          (FDKmemcmp(&tmpLoud, &(hLoudnessInfoSet->loudnessInfo[offset + i]),
1947
81
                     sizeof(LOUDNESS_INFO)) != 0);
1948
570
    hLoudnessInfoSet->loudnessInfo[offset + i] = tmpLoud;
1949
570
  }
1950
437
  hLoudnessInfoSet->diff = diff;
1951
437
  return err;
1952
505
}
1953
1954
static DRC_ERROR _readLoudnessInfoSetExtension(
1955
970
    HANDLE_FDK_BITSTREAM hBs, HANDLE_LOUDNESS_INFO_SET hLoudnessInfoSet) {
1956
970
  DRC_ERROR err = DE_OK;
1957
970
  int k, bitSizeLen, extSizeBits, bitSize;
1958
970
  INT nBitsRemaining;
1959
970
  LOUDNESS_INFO_SET_EXTENSION* pExt = &(hLoudnessInfoSet->loudnessInfoSetExt);
1960
1961
970
  k = 0;
1962
970
  pExt->loudnessInfoSetExtType[k] = FDKreadBits(hBs, 4);
1963
1.84k
  while (pExt->loudnessInfoSetExtType[k] != UNIDRCLOUDEXT_TERM) {
1964
1.28k
    if (k >= (8 - 1)) return DE_MEMORY_ERROR;
1965
1.22k
    bitSizeLen = FDKreadBits(hBs, 4);
1966
1.22k
    extSizeBits = bitSizeLen + 4;
1967
1968
1.22k
    bitSize = FDKreadBits(hBs, extSizeBits);
1969
1.22k
    pExt->extBitSize[k] = bitSize + 1;
1970
1.22k
    nBitsRemaining = (INT)FDKgetValidBits(hBs);
1971
1972
1.22k
    switch (pExt->loudnessInfoSetExtType[k]) {
1973
574
      case UNIDRCLOUDEXT_EQ:
1974
574
        err = _readLoudnessInfoSetExtEq(hBs, hLoudnessInfoSet);
1975
574
        if (err) return err;
1976
437
        if (nBitsRemaining !=
1977
437
            ((INT)pExt->extBitSize[k] + (INT)FDKgetValidBits(hBs)))
1978
212
          return DE_NOT_OK;
1979
225
        break;
1980
      /* add future extensions here */
1981
649
      default:
1982
649
        FDKpushFor(hBs, pExt->extBitSize[k]);
1983
649
        break;
1984
1.22k
    }
1985
874
    k++;
1986
874
    pExt->loudnessInfoSetExtType[k] = FDKreadBits(hBs, 4);
1987
874
  }
1988
1989
559
  return err;
1990
970
}
1991
1992
/* Parser for loundessInfoSet() */
1993
DRC_ERROR
1994
drcDec_readLoudnessInfoSet(HANDLE_FDK_BITSTREAM hBs,
1995
5.21k
                           HANDLE_LOUDNESS_INFO_SET hLoudnessInfoSet) {
1996
5.21k
  DRC_ERROR err = DE_OK;
1997
5.21k
  int i, diff = 0;
1998
5.21k
  if (hLoudnessInfoSet == NULL) return DE_NOT_OK;
1999
2000
5.21k
  diff |= _compAssign(&hLoudnessInfoSet->loudnessInfoAlbumCountV0,
2001
5.21k
                      FDKreadBits(hBs, 6));
2002
5.21k
  diff |=
2003
5.21k
      _compAssign(&hLoudnessInfoSet->loudnessInfoCountV0, FDKreadBits(hBs, 6));
2004
2005
5.21k
  hLoudnessInfoSet->loudnessInfoAlbumCount =
2006
5.21k
      fMin(hLoudnessInfoSet->loudnessInfoAlbumCountV0, (UCHAR)12);
2007
9.89k
  for (i = 0; i < hLoudnessInfoSet->loudnessInfoAlbumCountV0; i++) {
2008
5.04k
    LOUDNESS_INFO tmpLoud;
2009
5.04k
    FDKmemclear(&tmpLoud, sizeof(LOUDNESS_INFO));
2010
5.04k
    err = _readLoudnessInfo(hBs, 0, &tmpLoud);
2011
5.04k
    if (err) return err;
2012
4.67k
    if (i >= 12) continue;
2013
2.42k
    if (!diff)
2014
258
      diff |= (FDKmemcmp(&tmpLoud, &(hLoudnessInfoSet->loudnessInfoAlbum[i]),
2015
258
                         sizeof(LOUDNESS_INFO)) != 0);
2016
2.42k
    hLoudnessInfoSet->loudnessInfoAlbum[i] = tmpLoud;
2017
2.42k
  }
2018
2019
4.85k
  hLoudnessInfoSet->loudnessInfoCount =
2020
4.85k
      fMin(hLoudnessInfoSet->loudnessInfoCountV0, (UCHAR)12);
2021
12.5k
  for (i = 0; i < hLoudnessInfoSet->loudnessInfoCountV0; i++) {
2022
7.80k
    LOUDNESS_INFO tmpLoud;
2023
7.80k
    FDKmemclear(&tmpLoud, sizeof(LOUDNESS_INFO));
2024
7.80k
    err = _readLoudnessInfo(hBs, 0, &tmpLoud);
2025
7.80k
    if (err) return err;
2026
7.67k
    if (i >= 12) continue;
2027
4.92k
    if (!diff)
2028
1.70k
      diff |= (FDKmemcmp(&tmpLoud, &(hLoudnessInfoSet->loudnessInfo[i]),
2029
1.70k
                         sizeof(LOUDNESS_INFO)) != 0);
2030
4.92k
    hLoudnessInfoSet->loudnessInfo[i] = tmpLoud;
2031
4.92k
  }
2032
2033
4.72k
  diff |= _compAssign(&hLoudnessInfoSet->loudnessInfoSetExtPresent,
2034
4.72k
                      FDKreadBits(hBs, 1));
2035
4.72k
  hLoudnessInfoSet->diff = diff;
2036
2037
4.72k
  if (hLoudnessInfoSet->loudnessInfoSetExtPresent) {
2038
970
    err = _readLoudnessInfoSetExtension(hBs, hLoudnessInfoSet);
2039
970
    if (err) return err;
2040
970
  }
2041
2042
4.30k
  return err;
2043
4.72k
}