Coverage Report

Created: 2026-07-16 06:52

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
758
#define UNIDRCCONFEXT_PARAM_DRC 0x1
112
21.6k
#define UNIDRCCONFEXT_V1 0x2
113
714
#define UNIDRCLOUDEXT_EQ 0x1
114
115
0
#define UNIDRCGAINEXT_TERM 0x0
116
1.95k
#define UNIDRCLOUDEXT_TERM 0x0
117
39.0k
#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
246k
static inline int _compAssign(UCHAR* dest, const UCHAR src) {
140
246k
  int diff = 0;
141
246k
  if (*dest != src) diff = 1;
142
246k
  *dest = src;
143
246k
  return diff;
144
246k
}
145
146
958
static inline int _compAssign(ULONG* dest, const ULONG src) {
147
958
  int diff = 0;
148
958
  if (*dest != src) diff = 1;
149
958
  *dest = src;
150
958
  return diff;
151
958
}
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
14.5k
                                       DUCKING_MODIFICATION* pDMod, int isBox) {
536
14.5k
  int bsDuckingScaling, sigma, mu;
537
538
14.5k
  if (isBox) FDKpushFor(hBs, 7); /* reserved */
539
14.5k
  pDMod->duckingScalingPresent = FDKreadBits(hBs, 1);
540
541
14.5k
  if (pDMod->duckingScalingPresent) {
542
3.02k
    if (isBox) FDKpushFor(hBs, 4); /* reserved */
543
3.02k
    bsDuckingScaling = FDKreadBits(hBs, 4);
544
3.02k
    sigma = bsDuckingScaling >> 3;
545
3.02k
    mu = bsDuckingScaling & 0x7;
546
547
3.02k
    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.41k
      pDMod->duckingScaling = (FIXP_SGL)(
552
1.41k
          (9 + mu) << (FRACT_BITS - 1 - 3 - 2)); /* 1.0 + 0.125 * (1 + mu); */
553
1.41k
    }
554
11.4k
  } else {
555
11.4k
    pDMod->duckingScaling = (FIXP_SGL)(1 << (FRACT_BITS - 1 - 2)); /* 1.0 */
556
11.4k
  }
557
14.5k
}
558
559
static void _decodeGainModification(HANDLE_FDK_BITSTREAM hBs, const int version,
560
                                    int bandCount, GAIN_MODIFICATION* pGMod,
561
33.8k
                                    int isBox) {
562
33.8k
  int sign, bsGainOffset, bsAttenuationScaling, bsAmplificationScaling;
563
564
33.8k
  if (version > 0) {
565
7.94k
    int b, shapeFilterPresent;
566
567
7.94k
    if (isBox) {
568
0
      FDKpushFor(hBs, 4); /* reserved */
569
0
      bandCount = FDKreadBits(hBs, 4);
570
0
    }
571
572
15.8k
    for (b = 0; b < bandCount; b++) {
573
7.93k
      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.93k
      if (!isBox)
582
7.93k
        pGMod[b].targetCharacteristicLeftPresent = FDKreadBits(hBs, 1);
583
7.93k
      if (pGMod[b].targetCharacteristicLeftPresent) {
584
1.87k
        if (isBox) FDKpushFor(hBs, 4); /* reserved */
585
1.87k
        pGMod[b].targetCharacteristicLeftIndex = FDKreadBits(hBs, 4);
586
1.87k
      }
587
7.93k
      if (!isBox)
588
7.93k
        pGMod[b].targetCharacteristicRightPresent = FDKreadBits(hBs, 1);
589
7.93k
      if (pGMod[b].targetCharacteristicRightPresent) {
590
2.32k
        if (isBox) FDKpushFor(hBs, 4); /* reserved */
591
2.32k
        pGMod[b].targetCharacteristicRightIndex = FDKreadBits(hBs, 4);
592
2.32k
      }
593
7.93k
      if (!isBox) pGMod[b].gainScalingPresent = FDKreadBits(hBs, 1);
594
7.93k
      if (pGMod[b].gainScalingPresent) {
595
2.16k
        bsAttenuationScaling = FDKreadBits(hBs, 4);
596
2.16k
        pGMod[b].attenuationScaling = (FIXP_SGL)(
597
2.16k
            bsAttenuationScaling
598
2.16k
            << (FRACT_BITS - 1 - 3 - 2)); /* bsAttenuationScaling * 0.125; */
599
2.16k
        bsAmplificationScaling = FDKreadBits(hBs, 4);
600
2.16k
        pGMod[b].amplificationScaling = (FIXP_SGL)(
601
2.16k
            bsAmplificationScaling
602
2.16k
            << (FRACT_BITS - 1 - 3 - 2)); /* bsAmplificationScaling * 0.125; */
603
2.16k
      }
604
7.93k
      if (!isBox) pGMod[b].gainOffsetPresent = FDKreadBits(hBs, 1);
605
7.93k
      if (pGMod[b].gainOffsetPresent) {
606
2.33k
        if (isBox) FDKpushFor(hBs, 2); /* reserved */
607
2.33k
        sign = FDKreadBits(hBs, 1);
608
2.33k
        bsGainOffset = FDKreadBits(hBs, 5);
609
2.33k
        pGMod[b].gainOffset = (FIXP_SGL)(
610
2.33k
            (1 + bsGainOffset)
611
2.33k
            << (FRACT_BITS - 1 - 2 - 4)); /* (1+bsGainOffset) * 0.25; */
612
2.33k
        if (sign) {
613
991
          pGMod[b].gainOffset = -pGMod[b].gainOffset;
614
991
        }
615
2.33k
      }
616
7.93k
    }
617
7.94k
    if (bandCount == 1) {
618
7.61k
      shapeFilterPresent = FDKreadBits(hBs, 1);
619
7.61k
      if (shapeFilterPresent) {
620
1.94k
        if (isBox) FDKpushFor(hBs, 3); /* reserved */
621
1.94k
        FDKpushFor(hBs, 4);            /* pGMod->shapeFilterIndex */
622
5.67k
      } else {
623
5.67k
        if (isBox) FDKpushFor(hBs, 7); /* reserved */
624
5.67k
      }
625
7.61k
    }
626
25.8k
  } else {
627
25.8k
    int b, gainScalingPresent, gainOffsetPresent;
628
25.8k
    FIXP_SGL attenuationScaling = FL2FXCONST_SGL(1.0f / (float)(1 << 2)),
629
25.8k
             amplificationScaling = FL2FXCONST_SGL(1.0f / (float)(1 << 2)),
630
25.8k
             gainOffset = (FIXP_SGL)0;
631
25.8k
    if (isBox) FDKpushFor(hBs, 7); /* reserved */
632
25.8k
    gainScalingPresent = FDKreadBits(hBs, 1);
633
25.8k
    if (gainScalingPresent) {
634
15.3k
      bsAttenuationScaling = FDKreadBits(hBs, 4);
635
15.3k
      attenuationScaling = (FIXP_SGL)(
636
15.3k
          bsAttenuationScaling
637
15.3k
          << (FRACT_BITS - 1 - 3 - 2)); /* bsAttenuationScaling * 0.125; */
638
15.3k
      bsAmplificationScaling = FDKreadBits(hBs, 4);
639
15.3k
      amplificationScaling = (FIXP_SGL)(
640
15.3k
          bsAmplificationScaling
641
15.3k
          << (FRACT_BITS - 1 - 3 - 2)); /* bsAmplificationScaling * 0.125; */
642
15.3k
    }
643
25.8k
    if (isBox) FDKpushFor(hBs, 7); /* reserved */
644
25.8k
    gainOffsetPresent = FDKreadBits(hBs, 1);
645
25.8k
    if (gainOffsetPresent) {
646
13.4k
      if (isBox) FDKpushFor(hBs, 2); /* reserved */
647
13.4k
      sign = FDKreadBits(hBs, 1);
648
13.4k
      bsGainOffset = FDKreadBits(hBs, 5);
649
13.4k
      gainOffset =
650
13.4k
          (FIXP_SGL)((1 + bsGainOffset) << (FRACT_BITS - 1 - 2 -
651
13.4k
                                            4)); /* (1+bsGainOffset) * 0.25; */
652
13.4k
      if (sign) {
653
7.48k
        gainOffset = -gainOffset;
654
7.48k
      }
655
13.4k
    }
656
129k
    for (b = 0; b < 4; b++) {
657
103k
      pGMod[b].targetCharacteristicLeftPresent = 0;
658
103k
      pGMod[b].targetCharacteristicRightPresent = 0;
659
103k
      pGMod[b].gainScalingPresent = gainScalingPresent;
660
103k
      pGMod[b].attenuationScaling = attenuationScaling;
661
103k
      pGMod[b].amplificationScaling = amplificationScaling;
662
103k
      pGMod[b].gainOffsetPresent = gainOffsetPresent;
663
103k
      pGMod[b].gainOffset = gainOffset;
664
103k
    }
665
25.8k
  }
666
33.8k
}
667
668
static void _readDrcCharacteristic(HANDLE_FDK_BITSTREAM hBs, const int version,
669
11.9k
                                   DRC_CHARACTERISTIC* pDChar, int isBox) {
670
11.9k
  if (version == 0) {
671
2.53k
    if (isBox) FDKpushFor(hBs, 1); /* reserved */
672
2.53k
    pDChar->cicpIndex = FDKreadBits(hBs, 7);
673
2.53k
    if (pDChar->cicpIndex > 0) {
674
1.19k
      pDChar->present = 1;
675
1.19k
      pDChar->isCICP = 1;
676
1.33k
    } else {
677
1.33k
      pDChar->present = 0;
678
1.33k
    }
679
9.40k
  } else {
680
9.40k
    pDChar->present = FDKreadBits(hBs, 1);
681
9.40k
    if (isBox) pDChar->isCICP = FDKreadBits(hBs, 1);
682
9.40k
    if (pDChar->present) {
683
3.16k
      if (!isBox) pDChar->isCICP = FDKreadBits(hBs, 1);
684
3.16k
      if (pDChar->isCICP) {
685
1.10k
        if (isBox) FDKpushFor(hBs, 1); /* reserved */
686
1.10k
        pDChar->cicpIndex = FDKreadBits(hBs, 7);
687
2.05k
      } else {
688
2.05k
        pDChar->custom.left = FDKreadBits(hBs, 4);
689
2.05k
        pDChar->custom.right = FDKreadBits(hBs, 4);
690
2.05k
      }
691
3.16k
    }
692
9.40k
  }
693
11.9k
}
694
695
static void _readBandBorder(HANDLE_FDK_BITSTREAM hBs, BAND_BORDER* pBBord,
696
7.09k
                            int drcBandType, int isBox) {
697
7.09k
  if (drcBandType) {
698
4.01k
    if (isBox) FDKpushFor(hBs, 4); /* reserved */
699
4.01k
    pBBord->crossoverFreqIndex = FDKreadBits(hBs, 4);
700
4.01k
  } else {
701
3.07k
    if (isBox) FDKpushFor(hBs, 6); /* reserved */
702
3.07k
    pBBord->startSubBandIndex = FDKreadBits(hBs, 10);
703
3.07k
  }
704
7.09k
}
705
706
static DRC_ERROR _readGainSet(HANDLE_FDK_BITSTREAM hBs, const int version,
707
                              int* gainSequenceIndex, GAIN_SET* pGSet,
708
88.4k
                              int isBox) {
709
88.4k
  if (isBox) FDKpushFor(hBs, 2); /* reserved */
710
88.4k
  pGSet->gainCodingProfile = FDKreadBits(hBs, 2);
711
88.4k
  pGSet->gainInterpolationType = FDKreadBits(hBs, 1);
712
88.4k
  pGSet->fullFrame = FDKreadBits(hBs, 1);
713
88.4k
  pGSet->timeAlignment = FDKreadBits(hBs, 1);
714
88.4k
  pGSet->timeDeltaMinPresent = FDKreadBits(hBs, 1);
715
716
88.4k
  if (pGSet->timeDeltaMinPresent) {
717
2.22k
    int bsTimeDeltaMin;
718
2.22k
    if (isBox) FDKpushFor(hBs, 5); /* reserved */
719
2.22k
    bsTimeDeltaMin = FDKreadBits(hBs, 11);
720
2.22k
    pGSet->timeDeltaMin = bsTimeDeltaMin + 1;
721
2.22k
  }
722
723
88.4k
  if (pGSet->gainCodingProfile != GCP_CONSTANT) {
724
83.6k
    int i;
725
83.6k
    if (isBox) FDKpushFor(hBs, 3); /* reserved */
726
83.6k
    pGSet->bandCount = FDKreadBits(hBs, 4);
727
83.6k
    if (pGSet->bandCount > 4) return DE_MEMORY_ERROR;
728
729
83.4k
    if ((pGSet->bandCount > 1) || isBox) {
730
3.57k
      pGSet->drcBandType = FDKreadBits(hBs, 1);
731
3.57k
    }
732
733
95.4k
    for (i = 0; i < pGSet->bandCount; i++) {
734
11.9k
      if (version == 0) {
735
2.53k
        *gainSequenceIndex = (*gainSequenceIndex) + 1;
736
9.40k
      } else {
737
9.40k
        int indexPresent;
738
9.40k
        indexPresent = (isBox) ? 1 : FDKreadBits(hBs, 1);
739
9.40k
        if (indexPresent) {
740
2.78k
          int bsIndex;
741
2.78k
          bsIndex = FDKreadBits(hBs, 6);
742
2.78k
          *gainSequenceIndex = bsIndex;
743
6.61k
        } else {
744
6.61k
          *gainSequenceIndex = (*gainSequenceIndex) + 1;
745
6.61k
        }
746
9.40k
      }
747
11.9k
      pGSet->gainSequenceIndex[i] = *gainSequenceIndex;
748
11.9k
      _readDrcCharacteristic(hBs, version, &(pGSet->drcCharacteristic[i]),
749
11.9k
                             isBox);
750
11.9k
    }
751
90.5k
    for (i = 1; i < pGSet->bandCount; i++) {
752
7.09k
      _readBandBorder(hBs, &(pGSet->bandBorder[i]), pGSet->drcBandType, isBox);
753
7.09k
    }
754
83.4k
  } else {
755
4.75k
    pGSet->bandCount = 1;
756
4.75k
    *gainSequenceIndex = (*gainSequenceIndex) + 1;
757
4.75k
    pGSet->gainSequenceIndex[0] = *gainSequenceIndex;
758
4.75k
  }
759
760
88.2k
  return DE_OK;
761
88.4k
}
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.2k
                                              int isBox) {
768
12.2k
  if (isBox) FDKpushFor(hBs, 7); /* reserved */
769
12.2k
  *pCharacteristicFormat = FDKreadBits(hBs, 1);
770
12.2k
  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
4.70k
      pCChar->sigmoid.gain = (FIXP_SGL)(bsGain << (FRACT_BITS - 1 - 6));
776
5.29k
    } else {
777
5.29k
      pCChar->sigmoid.gain = (FIXP_SGL)(-bsGain << (FRACT_BITS - 1 - 6));
778
5.29k
    }
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.55k
      pCChar->sigmoid.exp = (FIXP_SGL)((1 + 2 * bsExp) << (FRACT_BITS - 1 - 5));
787
9.55k
    } else {
788
452
      pCChar->sigmoid.exp = (FIXP_SGL)MAXVAL_SGL; /* represents infinity */
789
452
    }
790
10.0k
    pCChar->sigmoid.flipSign = FDKreadBits(hBs, 1);
791
10.0k
  } else { /* CF_NODES */
792
2.26k
    int i, bsCharacteristicNodeCount, bsNodeLevelDelta, bsNodeGain;
793
2.26k
    if (isBox) FDKpushFor(hBs, 6); /* reserved */
794
2.26k
    bsCharacteristicNodeCount = FDKreadBits(hBs, 2);
795
2.26k
    pCChar->nodes.characteristicNodeCount = bsCharacteristicNodeCount + 1;
796
2.26k
    if (pCChar->nodes.characteristicNodeCount > 4) return DE_MEMORY_ERROR;
797
2.26k
    pCChar->nodes.nodeLevel[0] = DRC_INPUT_LOUDNESS_TARGET_SGL;
798
2.26k
    pCChar->nodes.nodeGain[0] = (FIXP_SGL)0;
799
7.20k
    for (i = 0; i < pCChar->nodes.characteristicNodeCount; i++) {
800
4.93k
      if (isBox) FDKpushFor(hBs, 3); /* reserved */
801
4.93k
      bsNodeLevelDelta = FDKreadBits(hBs, 5);
802
4.93k
      if (side == CS_LEFT) {
803
3.20k
        pCChar->nodes.nodeLevel[i + 1] =
804
3.20k
            pCChar->nodes.nodeLevel[i] -
805
3.20k
            (FIXP_SGL)((1 + bsNodeLevelDelta) << (FRACT_BITS - 1 - 7));
806
3.20k
      } else {
807
1.72k
        pCChar->nodes.nodeLevel[i + 1] =
808
1.72k
            pCChar->nodes.nodeLevel[i] +
809
1.72k
            (FIXP_SGL)((1 + bsNodeLevelDelta) << (FRACT_BITS - 1 - 7));
810
1.72k
      }
811
4.93k
      bsNodeGain = FDKreadBits(hBs, 8);
812
4.93k
      pCChar->nodes.nodeGain[i + 1] = (FIXP_SGL)(
813
4.93k
          (bsNodeGain - 128)
814
4.93k
          << (FRACT_BITS - 1 - 1 - 7)); /* 0.5f * bsNodeGain - 64.0f; */
815
4.93k
    }
816
2.26k
  }
817
12.2k
  return DE_OK;
818
12.2k
}
819
820
20.4k
static void _skipLoudEqInstructions(HANDLE_FDK_BITSTREAM hBs) {
821
20.4k
  int i;
822
20.4k
  int downmixIdPresent, additionalDownmixIdPresent,
823
20.4k
      additionalDownmixIdCount = 0;
824
20.4k
  int drcSetIdPresent, additionalDrcSetIdPresent, additionalDrcSetIdCount = 0;
825
20.4k
  int eqSetIdPresent, additionalEqSetIdPresent, additionalEqSetIdCount = 0;
826
20.4k
  int loudEqGainSequenceCount, drcCharacteristicFormatIsCICP;
827
828
20.4k
  FDKpushFor(hBs, 4); /* loudEqSetId */
829
20.4k
  FDKpushFor(hBs, 4); /* drcLocation */
830
20.4k
  downmixIdPresent = FDKreadBits(hBs, 1);
831
20.4k
  if (downmixIdPresent) {
832
2.41k
    FDKpushFor(hBs, 7); /* downmixId */
833
2.41k
    additionalDownmixIdPresent = FDKreadBits(hBs, 1);
834
2.41k
    if (additionalDownmixIdPresent) {
835
1.18k
      additionalDownmixIdCount = FDKreadBits(hBs, 7);
836
21.0k
      for (i = 0; i < additionalDownmixIdCount; i++) {
837
19.9k
        FDKpushFor(hBs, 7); /* additionalDownmixId */
838
19.9k
      }
839
1.18k
    }
840
2.41k
  }
841
842
20.4k
  drcSetIdPresent = FDKreadBits(hBs, 1);
843
20.4k
  if (drcSetIdPresent) {
844
2.37k
    FDKpushFor(hBs, 6); /* drcSetId */
845
2.37k
    additionalDrcSetIdPresent = FDKreadBits(hBs, 1);
846
2.37k
    if (additionalDrcSetIdPresent) {
847
800
      additionalDrcSetIdCount = FDKreadBits(hBs, 6);
848
7.28k
      for (i = 0; i < additionalDrcSetIdCount; i++) {
849
6.48k
        FDKpushFor(hBs, 6); /* additionalDrcSetId; */
850
6.48k
      }
851
800
    }
852
2.37k
  }
853
854
20.4k
  eqSetIdPresent = FDKreadBits(hBs, 1);
855
20.4k
  if (eqSetIdPresent) {
856
1.75k
    FDKpushFor(hBs, 6); /* eqSetId */
857
1.75k
    additionalEqSetIdPresent = FDKreadBits(hBs, 1);
858
1.75k
    if (additionalEqSetIdPresent) {
859
1.06k
      additionalEqSetIdCount = FDKreadBits(hBs, 6);
860
8.46k
      for (i = 0; i < additionalEqSetIdCount; i++) {
861
7.39k
        FDKpushFor(hBs, 6); /* additionalEqSetId; */
862
7.39k
      }
863
1.06k
    }
864
1.75k
  }
865
866
20.4k
  FDKpushFor(hBs, 1); /* loudnessAfterDrc */
867
20.4k
  FDKpushFor(hBs, 1); /* loudnessAfterEq */
868
20.4k
  loudEqGainSequenceCount = FDKreadBits(hBs, 6);
869
30.5k
  for (i = 0; i < loudEqGainSequenceCount; i++) {
870
10.0k
    FDKpushFor(hBs, 6); /* gainSequenceIndex */
871
10.0k
    drcCharacteristicFormatIsCICP = FDKreadBits(hBs, 1);
872
10.0k
    if (drcCharacteristicFormatIsCICP) {
873
937
      FDKpushFor(hBs, 7); /* drcCharacteristic */
874
9.08k
    } else {
875
9.08k
      FDKpushFor(hBs, 4); /* drcCharacteristicLeftIndex */
876
9.08k
      FDKpushFor(hBs, 4); /* drcCharacteristicRightIndex */
877
9.08k
    }
878
10.0k
    FDKpushFor(hBs, 6); /* frequencyRangeIndex */
879
10.0k
    FDKpushFor(hBs, 3); /* bsLoudEqScaling */
880
10.0k
    FDKpushFor(hBs, 5); /* bsLoudEqOffset */
881
10.0k
  }
882
20.4k
}
883
884
21.7k
static void _skipEqSubbandGainSpline(HANDLE_FDK_BITSTREAM hBs) {
885
21.7k
  int nEqNodes, k, bits;
886
21.7k
  nEqNodes = FDKreadBits(hBs, 5);
887
21.7k
  nEqNodes += 2;
888
68.1k
  for (k = 0; k < nEqNodes; k++) {
889
46.3k
    bits = FDKreadBits(hBs, 1);
890
46.3k
    if (!bits) {
891
43.9k
      FDKpushFor(hBs, 4);
892
43.9k
    }
893
46.3k
  }
894
21.7k
  FDKpushFor(hBs, 4 * (nEqNodes - 1));
895
21.7k
  bits = FDKreadBits(hBs, 2);
896
21.7k
  switch (bits) {
897
20.4k
    case 0:
898
20.4k
      FDKpushFor(hBs, 5);
899
20.4k
      break;
900
369
    case 1:
901
849
    case 2:
902
849
      FDKpushFor(hBs, 4);
903
849
      break;
904
457
    case 3:
905
457
      FDKpushFor(hBs, 3);
906
457
      break;
907
21.7k
  }
908
21.7k
  FDKpushFor(hBs, 5 * (nEqNodes - 1));
909
21.7k
}
910
911
6.89k
static void _skipEqCoefficients(HANDLE_FDK_BITSTREAM hBs) {
912
6.89k
  int j, k;
913
6.89k
  int eqDelayMaxPresent;
914
6.89k
  int uniqueFilterBlockCount, filterElementCount, filterElementGainPresent;
915
6.89k
  int uniqueTdFilterElementCount, eqFilterFormat, bsRealZeroRadiusOneCount,
916
6.89k
      realZeroCount, genericZeroCount, realPoleCount, complexPoleCount,
917
6.89k
      firFilterOrder;
918
6.89k
  int uniqueEqSubbandGainsCount, eqSubbandGainRepresentation,
919
6.89k
      eqSubbandGainCount;
920
6.89k
  int eqSubbandGainFormat;
921
922
6.89k
  eqDelayMaxPresent = FDKreadBits(hBs, 1);
923
6.89k
  if (eqDelayMaxPresent) {
924
1.44k
    FDKpushFor(hBs, 8); /* bsEqDelayMax */
925
1.44k
  }
926
927
6.89k
  uniqueFilterBlockCount = FDKreadBits(hBs, 6);
928
22.7k
  for (j = 0; j < uniqueFilterBlockCount; j++) {
929
15.8k
    filterElementCount = FDKreadBits(hBs, 6);
930
30.0k
    for (k = 0; k < filterElementCount; k++) {
931
14.1k
      FDKpushFor(hBs, 6); /* filterElementIndex */
932
14.1k
      filterElementGainPresent = FDKreadBits(hBs, 1);
933
14.1k
      if (filterElementGainPresent) {
934
574
        FDKpushFor(hBs, 10); /* bsFilterElementGain */
935
574
      }
936
14.1k
    }
937
15.8k
  }
938
6.89k
  uniqueTdFilterElementCount = FDKreadBits(hBs, 6);
939
25.6k
  for (j = 0; j < uniqueTdFilterElementCount; j++) {
940
18.7k
    eqFilterFormat = FDKreadBits(hBs, 1);
941
18.7k
    if (eqFilterFormat == 0) { /* pole/zero */
942
17.5k
      bsRealZeroRadiusOneCount = FDKreadBits(hBs, 3);
943
17.5k
      realZeroCount = FDKreadBits(hBs, 6);
944
17.5k
      genericZeroCount = FDKreadBits(hBs, 6);
945
17.5k
      realPoleCount = FDKreadBits(hBs, 4);
946
17.5k
      complexPoleCount = FDKreadBits(hBs, 4);
947
17.5k
      FDKpushFor(hBs, 2 * bsRealZeroRadiusOneCount * 1);
948
17.5k
      FDKpushFor(hBs, realZeroCount * 8);
949
17.5k
      FDKpushFor(hBs, genericZeroCount * 14);
950
17.5k
      FDKpushFor(hBs, realPoleCount * 8);
951
17.5k
      FDKpushFor(hBs, complexPoleCount * 14);
952
17.5k
    } else { /* FIR coefficients */
953
1.21k
      firFilterOrder = FDKreadBits(hBs, 7);
954
1.21k
      FDKpushFor(hBs, 1);
955
1.21k
      FDKpushFor(hBs, (firFilterOrder / 2 + 1) * 11);
956
1.21k
    }
957
18.7k
  }
958
6.89k
  uniqueEqSubbandGainsCount = FDKreadBits(hBs, 6);
959
6.89k
  if (uniqueEqSubbandGainsCount > 0) {
960
4.00k
    eqSubbandGainRepresentation = FDKreadBits(hBs, 1);
961
4.00k
    eqSubbandGainFormat = FDKreadBits(hBs, 4);
962
4.00k
    switch (eqSubbandGainFormat) {
963
346
      case GF_QMF32:
964
346
        eqSubbandGainCount = 32;
965
346
        break;
966
97
      case GF_QMFHYBRID39:
967
97
        eqSubbandGainCount = 39;
968
97
        break;
969
505
      case GF_QMF64:
970
505
        eqSubbandGainCount = 64;
971
505
        break;
972
9
      case GF_QMFHYBRID71:
973
9
        eqSubbandGainCount = 71;
974
9
        break;
975
103
      case GF_QMF128:
976
103
        eqSubbandGainCount = 128;
977
103
        break;
978
144
      case GF_QMFHYBRID135:
979
144
        eqSubbandGainCount = 135;
980
144
        break;
981
560
      case GF_UNIFORM:
982
2.79k
      default:
983
2.79k
        eqSubbandGainCount = FDKreadBits(hBs, 8);
984
2.79k
        eqSubbandGainCount++;
985
2.79k
        break;
986
4.00k
    }
987
120k
    for (k = 0; k < uniqueEqSubbandGainsCount; k++) {
988
116k
      if (eqSubbandGainRepresentation == 1) {
989
21.7k
        _skipEqSubbandGainSpline(hBs);
990
94.7k
      } else {
991
94.7k
        FDKpushFor(hBs, eqSubbandGainCount * 9);
992
94.7k
      }
993
116k
    }
994
4.00k
  }
995
6.89k
}
996
997
static void _skipTdFilterCascade(HANDLE_FDK_BITSTREAM hBs,
998
3.55k
                                 const int eqChannelGroupCount) {
999
3.55k
  int i, eqCascadeGainPresent, filterBlockCount, eqPhaseAlignmentPresent;
1000
7.04k
  for (i = 0; i < eqChannelGroupCount; i++) {
1001
3.49k
    eqCascadeGainPresent = FDKreadBits(hBs, 1);
1002
3.49k
    if (eqCascadeGainPresent) {
1003
1.46k
      FDKpushFor(hBs, 10); /* bsEqCascadeGain */
1004
1.46k
    }
1005
3.49k
    filterBlockCount = FDKreadBits(hBs, 4);
1006
3.49k
    FDKpushFor(hBs, filterBlockCount * 7); /* filterBlockIndex */
1007
3.49k
  }
1008
3.55k
  eqPhaseAlignmentPresent = FDKreadBits(hBs, 1);
1009
3.55k
  {
1010
3.55k
    if (eqPhaseAlignmentPresent) {
1011
2.85k
      for (i = 0; i < eqChannelGroupCount; i++) {
1012
791
        FDKpushFor(hBs, (eqChannelGroupCount - i - 1) * 1);
1013
791
      }
1014
2.06k
    }
1015
3.55k
  }
1016
3.55k
}
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
5.43k
    downmixId = FDKreadBits(hBs, 7);
1034
5.43k
    eqApplyToDownmix = FDKreadBits(hBs, 1);
1035
5.43k
    additionalDownmixIdPresent = FDKreadBits(hBs, 1);
1036
5.43k
    if (additionalDownmixIdPresent) {
1037
1.38k
      additionalDownmixIdCount = FDKreadBits(hBs, 7);
1038
1.38k
      FDKpushFor(hBs, additionalDownmixIdCount * 7); /* additionalDownmixId */
1039
1.38k
    }
1040
28.9k
  } else {
1041
28.9k
    downmixId = 0;
1042
28.9k
    eqApplyToDownmix = 0;
1043
28.9k
  }
1044
34.3k
  FDKpushFor(hBs, 6); /* drcSetId */
1045
34.3k
  additionalDrcSetIdPresent = FDKreadBits(hBs, 1);
1046
34.3k
  if (additionalDrcSetIdPresent) {
1047
2.40k
    additionalDrcSetIdCount = FDKreadBits(hBs, 6);
1048
16.5k
    for (i = 0; i < additionalDrcSetIdCount; i++) {
1049
14.1k
      FDKpushFor(hBs, 6); /* additionalDrcSetId */
1050
14.1k
    }
1051
2.40k
  }
1052
34.3k
  FDKpushFor(hBs, 16); /* eqSetPurpose */
1053
34.3k
  dependsOnEqSetPresent = FDKreadBits(hBs, 1);
1054
34.3k
  if (dependsOnEqSetPresent) {
1055
3.84k
    FDKpushFor(hBs, 6); /* dependsOnEqSet */
1056
30.4k
  } else {
1057
30.4k
    FDKpushFor(hBs, 1); /* noIndependentEqUse */
1058
30.4k
  }
1059
1060
34.3k
  channelCount = hUniDrcConfig->channelLayout.baseChannelCount;
1061
34.3k
  if ((downmixIdPresent == 1) && (eqApplyToDownmix == 1) && (downmixId != 0) &&
1062
2.39k
      (downmixId != DOWNMIX_ID_ANY_DOWNMIX) &&
1063
2.02k
      (additionalDownmixIdCount == 0)) {
1064
1.50k
    DOWNMIX_INSTRUCTIONS* pDown =
1065
1.50k
        selectDownmixInstructions(hUniDrcConfig, downmixId);
1066
1.50k
    if (pDown == NULL) return DE_NOT_OK;
1067
1068
258
    channelCount =
1069
258
        pDown->targetChannelCount; /* targetChannelCountFromDownmixId*/
1070
32.8k
  } else if ((downmixId == DOWNMIX_ID_ANY_DOWNMIX) ||
1071
32.2k
             (additionalDownmixIdCount > 1)) {
1072
1.18k
    channelCount = 1;
1073
1.18k
  }
1074
1075
33.0k
  eqChannelGroupCount = 0;
1076
109k
  for (c = 0; c < channelCount; c++) {
1077
76.6k
    int newGroup = 1;
1078
76.6k
    if (c >= 8) return DE_MEMORY_ERROR;
1079
76.4k
    eqChannelGroupForChannel[c] = FDKreadBits(hBs, 7);
1080
265k
    for (k = 0; k < c; k++) {
1081
189k
      if (eqChannelGroupForChannel[c] == eqChannelGroupForChannel[k]) {
1082
169k
        newGroup = 0;
1083
169k
      }
1084
189k
    }
1085
76.4k
    if (newGroup == 1) {
1086
25.7k
      eqChannelGroupCount += 1;
1087
25.7k
    }
1088
76.4k
  }
1089
32.8k
  tdFilterCascadePresent = FDKreadBits(hBs, 1);
1090
32.8k
  if (tdFilterCascadePresent) {
1091
3.55k
    _skipTdFilterCascade(hBs, eqChannelGroupCount);
1092
3.55k
  }
1093
32.8k
  subbandGainsPresent = FDKreadBits(hBs, 1);
1094
32.8k
  if (subbandGainsPresent) {
1095
2.97k
    FDKpushFor(hBs, eqChannelGroupCount * 6); /* subbandGainsIndex */
1096
2.97k
  }
1097
32.8k
  eqTransitionDurationPresent = FDKreadBits(hBs, 1);
1098
32.8k
  if (eqTransitionDurationPresent) {
1099
2.83k
    FDKpushFor(hBs, 5); /* bsEqTransitionDuration */
1100
2.83k
  }
1101
32.8k
  return err;
1102
33.0k
}
1103
1104
4.40k
static void _skipDrcCoefficientsBasic(HANDLE_FDK_BITSTREAM hBs) {
1105
4.40k
  FDKpushFor(hBs, 4); /* drcLocation */
1106
4.40k
  FDKpushFor(hBs, 7); /* drcCharacteristic */
1107
4.40k
}
1108
1109
static DRC_ERROR _readDrcCoefficientsUniDrc(HANDLE_FDK_BITSTREAM hBs,
1110
                                            const int version,
1111
76.9k
                                            DRC_COEFFICIENTS_UNI_DRC* pCoef) {
1112
76.9k
  DRC_ERROR err = DE_OK;
1113
76.9k
  int i, bsDrcFrameSize;
1114
76.9k
  int gainSequenceIndex = -1;
1115
1116
76.9k
  pCoef->drcLocation = FDKreadBits(hBs, 4);
1117
76.9k
  pCoef->drcFrameSizePresent = FDKreadBits(hBs, 1);
1118
1119
76.9k
  if (pCoef->drcFrameSizePresent == 1) {
1120
4.12k
    bsDrcFrameSize = FDKreadBits(hBs, 15);
1121
4.12k
    pCoef->drcFrameSize = bsDrcFrameSize + 1;
1122
4.12k
  }
1123
76.9k
  if (version == 0) {
1124
50.1k
    int gainSequenceCount = 0, gainSetCount;
1125
50.1k
    pCoef->characteristicLeftCount = 0;
1126
50.1k
    pCoef->characteristicRightCount = 0;
1127
50.1k
    gainSetCount = FDKreadBits(hBs, 6);
1128
50.1k
    pCoef->gainSetCount = fMin(gainSetCount, 12);
1129
82.5k
    for (i = 0; i < gainSetCount; i++) {
1130
32.4k
      GAIN_SET tmpGset;
1131
32.4k
      FDKmemclear(&tmpGset, sizeof(GAIN_SET));
1132
32.4k
      err = _readGainSet(hBs, version, &gainSequenceIndex, &tmpGset, 0);
1133
32.4k
      if (err) return err;
1134
32.4k
      gainSequenceCount += tmpGset.bandCount;
1135
1136
32.4k
      if (i >= 12) continue;
1137
12.3k
      pCoef->gainSet[i] = tmpGset;
1138
12.3k
    }
1139
50.0k
    pCoef->gainSequenceCount = gainSequenceCount;
1140
50.0k
  } else { /* (version == 1) */
1141
26.7k
    UCHAR drcCharacteristicLeftPresent, drcCharacteristicRightPresent;
1142
26.7k
    UCHAR shapeFiltersPresent, shapeFilterCount, tmpPresent;
1143
26.7k
    int gainSetCount;
1144
26.7k
    drcCharacteristicLeftPresent = FDKreadBits(hBs, 1);
1145
26.7k
    if (drcCharacteristicLeftPresent) {
1146
2.18k
      pCoef->characteristicLeftCount = FDKreadBits(hBs, 4);
1147
2.18k
      if ((pCoef->characteristicLeftCount + 1) > 16) return DE_MEMORY_ERROR;
1148
8.42k
      for (i = 0; i < pCoef->characteristicLeftCount; i++) {
1149
6.23k
        err = _readCustomDrcCharacteristic(
1150
6.23k
            hBs, CS_LEFT, &(pCoef->characteristicLeftFormat[i + 1]),
1151
6.23k
            &(pCoef->customCharacteristicLeft[i + 1]), 0);
1152
6.23k
        if (err) return err;
1153
6.23k
      }
1154
2.18k
    }
1155
26.7k
    drcCharacteristicRightPresent = FDKreadBits(hBs, 1);
1156
26.7k
    if (drcCharacteristicRightPresent) {
1157
2.05k
      pCoef->characteristicRightCount = FDKreadBits(hBs, 4);
1158
2.05k
      if ((pCoef->characteristicRightCount + 1) > 16) return DE_MEMORY_ERROR;
1159
8.08k
      for (i = 0; i < pCoef->characteristicRightCount; i++) {
1160
6.03k
        err = _readCustomDrcCharacteristic(
1161
6.03k
            hBs, CS_RIGHT, &(pCoef->characteristicRightFormat[i + 1]),
1162
6.03k
            &(pCoef->customCharacteristicRight[i + 1]), 0);
1163
6.03k
        if (err) return err;
1164
6.03k
      }
1165
2.05k
    }
1166
26.7k
    shapeFiltersPresent = FDKreadBits(hBs, 1);
1167
26.7k
    if (shapeFiltersPresent) {
1168
3.39k
      shapeFilterCount = FDKreadBits(hBs, 4);
1169
23.6k
      for (i = 0; i < shapeFilterCount; i++) {
1170
20.2k
        tmpPresent = FDKreadBits(hBs, 1);
1171
20.2k
        if (tmpPresent) /* lfCutParams */
1172
4.41k
          FDKpushFor(hBs, 5);
1173
1174
20.2k
        tmpPresent = FDKreadBits(hBs, 1);
1175
20.2k
        if (tmpPresent) /* lfBoostParams */
1176
4.60k
          FDKpushFor(hBs, 5);
1177
1178
20.2k
        tmpPresent = FDKreadBits(hBs, 1);
1179
20.2k
        if (tmpPresent) /* hfCutParams */
1180
4.91k
          FDKpushFor(hBs, 5);
1181
1182
20.2k
        tmpPresent = FDKreadBits(hBs, 1);
1183
20.2k
        if (tmpPresent) /* hfBoostParams */
1184
2.72k
          FDKpushFor(hBs, 5);
1185
20.2k
      }
1186
3.39k
    }
1187
26.7k
    pCoef->gainSequenceCount = FDKreadBits(hBs, 6);
1188
26.7k
    gainSetCount = FDKreadBits(hBs, 6);
1189
26.7k
    pCoef->gainSetCount = fMin(gainSetCount, 12);
1190
82.6k
    for (i = 0; i < gainSetCount; i++) {
1191
55.9k
      GAIN_SET tmpGset;
1192
55.9k
      FDKmemclear(&tmpGset, sizeof(GAIN_SET));
1193
55.9k
      err = _readGainSet(hBs, version, &gainSequenceIndex, &tmpGset, 0);
1194
55.9k
      if (err) return err;
1195
1196
55.8k
      if (i >= 12) continue;
1197
25.6k
      pCoef->gainSet[i] = tmpGset;
1198
25.6k
    }
1199
26.7k
  }
1200
997k
  for (i = 0; i < 12; i++) {
1201
920k
    pCoef->gainSetIndexForGainSequence[i] = 255;
1202
920k
  }
1203
114k
  for (i = 0; i < pCoef->gainSetCount; i++) {
1204
37.8k
    int b;
1205
54.3k
    for (b = 0; b < pCoef->gainSet[i].bandCount; b++) {
1206
16.4k
      if (pCoef->gainSet[i].gainSequenceIndex[b] >= 12) continue;
1207
12.0k
      pCoef->gainSetIndexForGainSequence[pCoef->gainSet[i]
1208
12.0k
                                             .gainSequenceIndex[b]] = i;
1209
12.0k
    }
1210
37.8k
  }
1211
1212
76.7k
  return err;
1213
76.9k
}
1214
1215
19.5k
static void _skipDrcInstructionsBasic(HANDLE_FDK_BITSTREAM hBs) {
1216
19.5k
  int drcSetEffect;
1217
19.5k
  int additionalDownmixIdPresent, additionalDownmixIdCount,
1218
19.5k
      limiterPeakTargetPresent;
1219
19.5k
  int drcSetTargetLoudnessPresent, drcSetTargetLoudnessValueLowerPresent;
1220
1221
19.5k
  FDKpushFor(hBs, 6); /* drcSetId */
1222
19.5k
  FDKpushFor(hBs, 4); /* drcLocation */
1223
19.5k
  FDKpushFor(hBs, 7); /* downmixId */
1224
19.5k
  additionalDownmixIdPresent = FDKreadBits(hBs, 1);
1225
19.5k
  if (additionalDownmixIdPresent) {
1226
1.87k
    additionalDownmixIdCount = FDKreadBits(hBs, 3);
1227
1.87k
    FDKpushFor(hBs, 7 * additionalDownmixIdCount); /* additionalDownmixId */
1228
1.87k
  }
1229
1230
19.5k
  drcSetEffect = FDKreadBits(hBs, 16);
1231
19.5k
  if (!(drcSetEffect & (EB_DUCK_OTHER | EB_DUCK_SELF))) {
1232
18.2k
    limiterPeakTargetPresent = FDKreadBits(hBs, 1);
1233
18.2k
    if (limiterPeakTargetPresent) {
1234
1.29k
      FDKpushFor(hBs, 8); /* bsLimiterPeakTarget */
1235
1.29k
    }
1236
18.2k
  }
1237
1238
19.5k
  drcSetTargetLoudnessPresent = FDKreadBits(hBs, 1);
1239
19.5k
  if (drcSetTargetLoudnessPresent) {
1240
1.69k
    FDKpushFor(hBs, 6); /* bsDrcSetTargetLoudnessValueUpper */
1241
1.69k
    drcSetTargetLoudnessValueLowerPresent = FDKreadBits(hBs, 1);
1242
1.69k
    if (drcSetTargetLoudnessValueLowerPresent) {
1243
788
      FDKpushFor(hBs, 6); /* bsDrcSetTargetLoudnessValueLower */
1244
788
    }
1245
1.69k
  }
1246
19.5k
}
1247
1248
static DRC_ERROR _readDrcInstructionsUniDrc(HANDLE_FDK_BITSTREAM hBs,
1249
                                            const int version,
1250
                                            HANDLE_UNI_DRC_CONFIG hUniDrcConfig,
1251
767k
                                            DRC_INSTRUCTIONS_UNI_DRC* pInst) {
1252
767k
  DRC_ERROR err = DE_OK;
1253
767k
  int i, g, c;
1254
767k
  int downmixIdPresent, additionalDownmixIdPresent, additionalDownmixIdCount;
1255
767k
  int bsLimiterPeakTarget, channelCount;
1256
767k
  DRC_COEFFICIENTS_UNI_DRC* pCoef = NULL;
1257
767k
  int repeatParameters, bsRepeatParametersCount;
1258
767k
  int repeatSequenceIndex, bsRepeatSequenceCount;
1259
767k
  SCHAR* gainSetIndex = pInst->gainSetIndex;
1260
767k
  SCHAR channelGroupForChannel[8];
1261
767k
  DUCKING_MODIFICATION duckingModificationForChannelGroup[8];
1262
1263
767k
  pInst->drcSetId = FDKreadBits(hBs, 6);
1264
767k
  if (version == 0) {
1265
    /* Assume all v0 DRC sets to be manageable in terms of complexity */
1266
701k
    pInst->drcSetComplexityLevel = 2;
1267
701k
  } else {
1268
66.4k
    pInst->drcSetComplexityLevel = FDKreadBits(hBs, 4);
1269
66.4k
  }
1270
767k
  pInst->drcLocation = FDKreadBits(hBs, 4);
1271
767k
  if (version == 0) {
1272
701k
    downmixIdPresent = 1;
1273
701k
  } else {
1274
66.4k
    downmixIdPresent = FDKreadBits(hBs, 1);
1275
66.4k
  }
1276
767k
  if (downmixIdPresent) {
1277
703k
    pInst->downmixId[0] = FDKreadBits(hBs, 7);
1278
703k
    if (version == 0) {
1279
701k
      if (pInst->downmixId[0] == 0)
1280
691k
        pInst->drcApplyToDownmix = 0;
1281
9.88k
      else
1282
9.88k
        pInst->drcApplyToDownmix = 1;
1283
701k
    } else {
1284
2.00k
      pInst->drcApplyToDownmix = FDKreadBits(hBs, 1);
1285
2.00k
    }
1286
1287
703k
    additionalDownmixIdPresent = FDKreadBits(hBs, 1);
1288
703k
    if (additionalDownmixIdPresent) {
1289
7.60k
      additionalDownmixIdCount = FDKreadBits(hBs, 3);
1290
7.60k
      if ((1 + additionalDownmixIdCount) > 8) return DE_MEMORY_ERROR;
1291
28.8k
      for (i = 0; i < additionalDownmixIdCount; i++) {
1292
21.1k
        pInst->downmixId[i + 1] = FDKreadBits(hBs, 7);
1293
21.1k
      }
1294
7.60k
      pInst->downmixIdCount = 1 + additionalDownmixIdCount;
1295
695k
    } else {
1296
695k
      pInst->downmixIdCount = 1;
1297
695k
    }
1298
703k
  } else {
1299
64.4k
    pInst->downmixId[0] = 0;
1300
64.4k
    pInst->downmixIdCount = 1;
1301
64.4k
  }
1302
1303
767k
  pInst->drcSetEffect = FDKreadBits(hBs, 16);
1304
1305
767k
  if ((pInst->drcSetEffect & (EB_DUCK_OTHER | EB_DUCK_SELF)) == 0) {
1306
760k
    pInst->limiterPeakTargetPresent = FDKreadBits(hBs, 1);
1307
760k
    if (pInst->limiterPeakTargetPresent) {
1308
1.82k
      bsLimiterPeakTarget = FDKreadBits(hBs, 8);
1309
1.82k
      pInst->limiterPeakTarget = -(FIXP_SGL)(
1310
1.82k
          bsLimiterPeakTarget
1311
1.82k
          << (FRACT_BITS - 1 - 3 - 5)); /* - bsLimiterPeakTarget * 0.125; */
1312
1.82k
    }
1313
760k
  }
1314
1315
767k
  pInst->drcSetTargetLoudnessPresent = FDKreadBits(hBs, 1);
1316
1317
  /* set default values */
1318
767k
  pInst->drcSetTargetLoudnessValueUpper = 0;
1319
767k
  pInst->drcSetTargetLoudnessValueLower = -63;
1320
1321
767k
  if (pInst->drcSetTargetLoudnessPresent == 1) {
1322
4.61k
    int bsDrcSetTargetLoudnessValueUpper, bsDrcSetTargetLoudnessValueLower;
1323
4.61k
    int drcSetTargetLoudnessValueLowerPresent;
1324
4.61k
    bsDrcSetTargetLoudnessValueUpper = FDKreadBits(hBs, 6);
1325
4.61k
    pInst->drcSetTargetLoudnessValueUpper =
1326
4.61k
        bsDrcSetTargetLoudnessValueUpper - 63;
1327
4.61k
    drcSetTargetLoudnessValueLowerPresent = FDKreadBits(hBs, 1);
1328
4.61k
    if (drcSetTargetLoudnessValueLowerPresent == 1) {
1329
1.92k
      bsDrcSetTargetLoudnessValueLower = FDKreadBits(hBs, 6);
1330
1.92k
      pInst->drcSetTargetLoudnessValueLower =
1331
1.92k
          bsDrcSetTargetLoudnessValueLower - 63;
1332
1.92k
    }
1333
4.61k
  }
1334
1335
767k
  pInst->dependsOnDrcSetPresent = FDKreadBits(hBs, 1);
1336
1337
767k
  pInst->noIndependentUse = 0;
1338
767k
  if (pInst->dependsOnDrcSetPresent) {
1339
4.41k
    pInst->dependsOnDrcSet = FDKreadBits(hBs, 6);
1340
763k
  } else {
1341
763k
    pInst->noIndependentUse = FDKreadBits(hBs, 1);
1342
763k
  }
1343
1344
767k
  if (version == 0) {
1345
701k
    pInst->requiresEq = 0;
1346
701k
  } else {
1347
66.4k
    pInst->requiresEq = FDKreadBits(hBs, 1);
1348
66.4k
  }
1349
1350
767k
  pCoef = selectDrcCoefficients(hUniDrcConfig, pInst->drcLocation);
1351
1352
767k
  pInst->drcChannelCount = channelCount =
1353
767k
      hUniDrcConfig->channelLayout.baseChannelCount;
1354
1355
767k
  if (pInst->drcSetEffect & (EB_DUCK_OTHER | EB_DUCK_SELF)) {
1356
6.94k
    DUCKING_MODIFICATION* pDModForChannel =
1357
6.94k
        pInst->duckingModificationForChannel;
1358
6.94k
    c = 0;
1359
21.2k
    while (c < channelCount) {
1360
14.5k
      int bsGainSetIndex;
1361
14.5k
      bsGainSetIndex = FDKreadBits(hBs, 6);
1362
14.5k
      if (c >= 8) return DE_MEMORY_ERROR;
1363
14.5k
      gainSetIndex[c] = bsGainSetIndex - 1;
1364
14.5k
      _decodeDuckingModification(hBs, &(pDModForChannel[c]), 0);
1365
1366
14.5k
      c++;
1367
14.5k
      repeatParameters = FDKreadBits(hBs, 1);
1368
14.5k
      if (repeatParameters == 1) {
1369
1.35k
        bsRepeatParametersCount = FDKreadBits(hBs, 5);
1370
1.35k
        bsRepeatParametersCount += 1;
1371
6.95k
        for (i = 0; i < bsRepeatParametersCount; i++) {
1372
5.83k
          if (c >= 8) return DE_MEMORY_ERROR;
1373
5.59k
          gainSetIndex[c] = gainSetIndex[c - 1];
1374
5.59k
          pDModForChannel[c] = pDModForChannel[c - 1];
1375
5.59k
          c++;
1376
5.59k
        }
1377
1.35k
      }
1378
14.5k
    }
1379
6.70k
    if (c > channelCount) {
1380
87
      return DE_NOT_OK;
1381
87
    }
1382
1383
6.61k
    err = deriveDrcChannelGroups(
1384
6.61k
        pInst->drcSetEffect, pInst->drcChannelCount, gainSetIndex,
1385
6.61k
        pDModForChannel, &pInst->nDrcChannelGroups,
1386
6.61k
        pInst->gainSetIndexForChannelGroup, channelGroupForChannel,
1387
6.61k
        duckingModificationForChannelGroup);
1388
6.61k
    if (err) return (err);
1389
760k
  } else {
1390
760k
    int deriveChannelCount = 0;
1391
760k
    if (((version == 0) || (pInst->drcApplyToDownmix != 0)) &&
1392
696k
        (pInst->downmixId[0] != DOWNMIX_ID_BASE_LAYOUT) &&
1393
6.33k
        (pInst->downmixId[0] != DOWNMIX_ID_ANY_DOWNMIX) &&
1394
5.86k
        (pInst->downmixIdCount == 1)) {
1395
2.24k
      if (hUniDrcConfig->downmixInstructionsCount != 0) {
1396
751
        DOWNMIX_INSTRUCTIONS* pDown =
1397
751
            selectDownmixInstructions(hUniDrcConfig, pInst->downmixId[0]);
1398
751
        if (pDown == NULL) return DE_NOT_OK;
1399
507
        pInst->drcChannelCount = channelCount =
1400
507
            pDown->targetChannelCount; /* targetChannelCountFromDownmixId*/
1401
1.49k
      } else {
1402
1.49k
        deriveChannelCount = 1;
1403
1.49k
        channelCount = 1;
1404
1.49k
      }
1405
758k
    } else if (((version == 0) || (pInst->drcApplyToDownmix != 0)) &&
1406
693k
               ((pInst->downmixId[0] == DOWNMIX_ID_ANY_DOWNMIX) ||
1407
693k
                (pInst->downmixIdCount > 1))) {
1408
      /* Set maximum channel count as upper border. The effective channel count
1409
       * is set at the process function. */
1410
4.13k
      pInst->drcChannelCount = 8;
1411
4.13k
      channelCount = 1;
1412
4.13k
    }
1413
1414
760k
    c = 0;
1415
6.08M
    while (c < channelCount) {
1416
5.32M
      int bsGainSetIndex;
1417
5.32M
      bsGainSetIndex = FDKreadBits(hBs, 6);
1418
5.32M
      if (c >= 8) return DE_MEMORY_ERROR;
1419
5.32M
      gainSetIndex[c] = bsGainSetIndex - 1;
1420
5.32M
      c++;
1421
5.32M
      repeatSequenceIndex = FDKreadBits(hBs, 1);
1422
1423
5.32M
      if (repeatSequenceIndex == 1) {
1424
5.45k
        bsRepeatSequenceCount = FDKreadBits(hBs, 5);
1425
5.45k
        bsRepeatSequenceCount += 1;
1426
5.45k
        if (deriveChannelCount) {
1427
594
          channelCount = 1 + bsRepeatSequenceCount;
1428
594
        }
1429
26.5k
        for (i = 0; i < bsRepeatSequenceCount; i++) {
1430
21.3k
          if (c >= 8) return DE_MEMORY_ERROR;
1431
21.0k
          gainSetIndex[c] = bsGainSetIndex - 1;
1432
21.0k
          c++;
1433
21.0k
        }
1434
5.45k
      }
1435
5.32M
    }
1436
760k
    if (c > channelCount) {
1437
110
      return DE_NOT_OK;
1438
110
    }
1439
760k
    if (deriveChannelCount) {
1440
1.46k
      pInst->drcChannelCount = channelCount;
1441
1.46k
    }
1442
1443
    /* DOWNMIX_ID_ANY_DOWNMIX: channelCount is 1. Distribute gainSetIndex to all
1444
     * channels. */
1445
760k
    if ((pInst->downmixId[0] == DOWNMIX_ID_ANY_DOWNMIX) ||
1446
759k
        (pInst->downmixIdCount > 1)) {
1447
32.6k
      for (c = 1; c < pInst->drcChannelCount; c++) {
1448
28.2k
        gainSetIndex[c] = gainSetIndex[0];
1449
28.2k
      }
1450
4.42k
    }
1451
1452
760k
    err = deriveDrcChannelGroups(pInst->drcSetEffect, pInst->drcChannelCount,
1453
760k
                                 gainSetIndex, NULL, &pInst->nDrcChannelGroups,
1454
760k
                                 pInst->gainSetIndexForChannelGroup,
1455
760k
                                 channelGroupForChannel, NULL);
1456
760k
    if (err) return (err);
1457
1458
794k
    for (g = 0; g < pInst->nDrcChannelGroups; g++) {
1459
33.8k
      int set, bandCount;
1460
33.8k
      set = pInst->gainSetIndexForChannelGroup[g];
1461
1462
      /* get bandCount */
1463
33.8k
      if (pCoef != NULL && set < pCoef->gainSetCount) {
1464
1.09k
        bandCount = pCoef->gainSet[set].bandCount;
1465
32.7k
      } else {
1466
32.7k
        bandCount = 1;
1467
32.7k
      }
1468
1469
33.8k
      _decodeGainModification(hBs, version, bandCount,
1470
33.8k
                              pInst->gainModificationForChannelGroup[g], 0);
1471
33.8k
    }
1472
760k
  }
1473
1474
765k
  return err;
1475
767k
}
1476
1477
static DRC_ERROR _readChannelLayout(HANDLE_FDK_BITSTREAM hBs,
1478
33.3k
                                    CHANNEL_LAYOUT* pChan) {
1479
33.3k
  DRC_ERROR err = DE_OK;
1480
1481
33.3k
  pChan->baseChannelCount = FDKreadBits(hBs, 7);
1482
1483
33.3k
  if (pChan->baseChannelCount > 8) return DE_NOT_OK;
1484
1485
33.1k
  pChan->layoutSignalingPresent = FDKreadBits(hBs, 1);
1486
1487
33.1k
  if (pChan->layoutSignalingPresent) {
1488
6.88k
    pChan->definedLayout = FDKreadBits(hBs, 8);
1489
1490
6.88k
    if (pChan->definedLayout == 0) {
1491
411
      int i;
1492
2.02k
      for (i = 0; i < pChan->baseChannelCount; i++) {
1493
1.61k
        if (i < 8) {
1494
1.61k
          pChan->speakerPosition[i] = FDKreadBits(hBs, 7);
1495
1.61k
        } else {
1496
0
          FDKpushFor(hBs, 7);
1497
0
        }
1498
1.61k
      }
1499
411
    }
1500
6.88k
  }
1501
33.1k
  return err;
1502
33.3k
}
1503
1504
static DRC_ERROR _readDownmixInstructions(HANDLE_FDK_BITSTREAM hBs,
1505
                                          const int version,
1506
                                          CHANNEL_LAYOUT* pChan,
1507
1.21M
                                          DOWNMIX_INSTRUCTIONS* pDown) {
1508
1.21M
  DRC_ERROR err = DE_OK;
1509
1510
1.21M
  pDown->downmixId = FDKreadBits(hBs, 7);
1511
1.21M
  pDown->targetChannelCount = FDKreadBits(hBs, 7);
1512
1.21M
  pDown->targetLayout = FDKreadBits(hBs, 8);
1513
1.21M
  pDown->downmixCoefficientsPresent = FDKreadBits(hBs, 1);
1514
1515
1.21M
  if (pDown->downmixCoefficientsPresent) {
1516
3.66k
    int nDownmixCoeffs = pDown->targetChannelCount * pChan->baseChannelCount;
1517
3.66k
    int i;
1518
3.66k
    if (nDownmixCoeffs > 8 * 8) return DE_NOT_OK;
1519
3.48k
    if (version == 0) {
1520
2.47k
      pDown->bsDownmixOffset = 0;
1521
21.5k
      for (i = 0; i < nDownmixCoeffs; i++) {
1522
        /* LFE downmix coefficients are not supported. */
1523
19.0k
        pDown->downmixCoefficient[i] = downmixCoeff[FDKreadBits(hBs, 4)];
1524
19.0k
      }
1525
2.47k
    } else {
1526
1.01k
      pDown->bsDownmixOffset = FDKreadBits(hBs, 4);
1527
5.89k
      for (i = 0; i < nDownmixCoeffs; i++) {
1528
4.87k
        pDown->downmixCoefficient[i] = downmixCoeffV1[FDKreadBits(hBs, 5)];
1529
4.87k
      }
1530
1.01k
    }
1531
3.48k
  }
1532
1.21M
  return err;
1533
1.21M
}
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.12k
    diff |= _compAssign(&hUniDrcConfig->downmixInstructionsCountV1,
1548
3.12k
                        FDKreadBits(hBs, 7));
1549
3.12k
    offset = hUniDrcConfig->downmixInstructionsCountV0;
1550
3.12k
    hUniDrcConfig->downmixInstructionsCount = fMin(
1551
3.12k
        (UCHAR)(offset + hUniDrcConfig->downmixInstructionsCountV1), (UCHAR)6);
1552
41.9k
    for (i = 0; i < hUniDrcConfig->downmixInstructionsCountV1; i++) {
1553
38.9k
      DOWNMIX_INSTRUCTIONS tmpDown;
1554
38.9k
      FDKmemclear(&tmpDown, sizeof(DOWNMIX_INSTRUCTIONS));
1555
38.9k
      err = _readDownmixInstructions(hBs, 1, &hUniDrcConfig->channelLayout,
1556
38.9k
                                     &tmpDown);
1557
38.9k
      if (err) return err;
1558
38.8k
      if ((offset + i) >= 6) continue;
1559
7.13k
      if (!diff)
1560
239
        diff |= (FDKmemcmp(&tmpDown,
1561
239
                           &(hUniDrcConfig->downmixInstructions[offset + i]),
1562
239
                           sizeof(DOWNMIX_INSTRUCTIONS)) != 0);
1563
7.13k
      hUniDrcConfig->downmixInstructions[offset + i] = tmpDown;
1564
7.13k
    }
1565
18.5k
  } else {
1566
18.5k
    diff |= _compAssign(&hUniDrcConfig->downmixInstructionsCountV1, 0);
1567
18.5k
  }
1568
1569
21.6k
  drcCoeffsAndInstructionsUniDrcV1Present = FDKreadBits(hBs, 1);
1570
21.6k
  if (drcCoeffsAndInstructionsUniDrcV1Present == 1) {
1571
10.3k
    diff |= _compAssign(&hUniDrcConfig->drcCoefficientsUniDrcCountV1,
1572
10.3k
                        FDKreadBits(hBs, 3));
1573
10.3k
    offset = hUniDrcConfig->drcCoefficientsUniDrcCountV0;
1574
10.3k
    hUniDrcConfig->drcCoefficientsUniDrcCount =
1575
10.3k
        fMin((UCHAR)(offset + hUniDrcConfig->drcCoefficientsUniDrcCountV1),
1576
10.3k
             (UCHAR)2);
1577
37.0k
    for (i = 0; i < hUniDrcConfig->drcCoefficientsUniDrcCountV1; i++) {
1578
26.7k
      DRC_COEFFICIENTS_UNI_DRC tmpCoef;
1579
26.7k
      FDKmemclear(&tmpCoef, sizeof(DRC_COEFFICIENTS_UNI_DRC));
1580
26.7k
      err = _readDrcCoefficientsUniDrc(hBs, 1, &tmpCoef);
1581
26.7k
      if (err) return err;
1582
26.6k
      if ((offset + i) >= 2) continue;
1583
7.00k
      if (!diff)
1584
297
        diff |= (FDKmemcmp(&tmpCoef,
1585
297
                           &(hUniDrcConfig->drcCoefficientsUniDrc[offset + i]),
1586
297
                           sizeof(DRC_COEFFICIENTS_UNI_DRC)) != 0);
1587
7.00k
      hUniDrcConfig->drcCoefficientsUniDrc[offset + i] = tmpCoef;
1588
7.00k
    }
1589
1590
10.2k
    diff |= _compAssign(&hUniDrcConfig->drcInstructionsUniDrcCountV1,
1591
10.2k
                        FDKreadBits(hBs, 6));
1592
10.2k
    offset = hUniDrcConfig->drcInstructionsUniDrcCount;
1593
10.2k
    hUniDrcConfig->drcInstructionsUniDrcCount =
1594
10.2k
        fMin((UCHAR)(offset + hUniDrcConfig->drcInstructionsUniDrcCountV1),
1595
10.2k
             (UCHAR)12);
1596
76.4k
    for (i = 0; i < hUniDrcConfig->drcInstructionsUniDrcCount; i++) {
1597
66.4k
      DRC_INSTRUCTIONS_UNI_DRC tmpInst;
1598
66.4k
      FDKmemclear(&tmpInst, sizeof(DRC_INSTRUCTIONS_UNI_DRC));
1599
66.4k
      err = _readDrcInstructionsUniDrc(hBs, 1, hUniDrcConfig, &tmpInst);
1600
66.4k
      if (err) return err;
1601
66.1k
      if ((offset + i) >= 12) continue;
1602
22.3k
      if (!diff)
1603
472
        diff |= (FDKmemcmp(&tmpInst,
1604
472
                           &(hUniDrcConfig->drcInstructionsUniDrc[offset + i]),
1605
472
                           sizeof(DRC_INSTRUCTIONS_UNI_DRC)) != 0);
1606
22.3k
      hUniDrcConfig->drcInstructionsUniDrc[offset + i] = tmpInst;
1607
22.3k
    }
1608
11.2k
  } else {
1609
11.2k
    diff |= _compAssign(&hUniDrcConfig->drcCoefficientsUniDrcCountV1, 0);
1610
11.2k
    diff |= _compAssign(&hUniDrcConfig->drcInstructionsUniDrcCountV1, 0);
1611
11.2k
  }
1612
1613
21.1k
  loudEqInstructionsPresent = FDKreadBits(hBs, 1);
1614
21.1k
  if (loudEqInstructionsPresent == 1) {
1615
4.54k
    loudEqInstructionsCount = FDKreadBits(hBs, 4);
1616
25.0k
    for (i = 0; i < loudEqInstructionsCount; i++) {
1617
20.4k
      _skipLoudEqInstructions(hBs);
1618
20.4k
    }
1619
4.54k
  }
1620
1621
21.1k
  eqPresent = FDKreadBits(hBs, 1);
1622
21.1k
  if (eqPresent == 1) {
1623
6.89k
    _skipEqCoefficients(hBs);
1624
6.89k
    eqInstructionsCount = FDKreadBits(hBs, 4);
1625
41.2k
    for (i = 0; i < eqInstructionsCount; i++) {
1626
34.3k
      _skipEqInstructions(hBs, hUniDrcConfig);
1627
34.3k
    }
1628
6.89k
  }
1629
1630
21.1k
  hUniDrcConfig->diff = diff;
1631
1632
21.1k
  return err;
1633
21.6k
}
1634
1635
static DRC_ERROR _readUniDrcConfigExtension(
1636
19.8k
    HANDLE_FDK_BITSTREAM hBs, HANDLE_UNI_DRC_CONFIG hUniDrcConfig) {
1637
19.8k
  DRC_ERROR err = DE_OK;
1638
19.8k
  int k, bitSizeLen, extSizeBits, bitSize;
1639
19.8k
  INT nBitsRemaining;
1640
19.8k
  UNI_DRC_CONFIG_EXTENSION* pExt = &(hUniDrcConfig->uniDrcConfigExt);
1641
1642
19.8k
  k = 0;
1643
19.8k
  pExt->uniDrcConfigExtType[k] = FDKreadBits(hBs, 4);
1644
39.0k
  while (pExt->uniDrcConfigExtType[k] != UNIDRCCONFEXT_TERM) {
1645
38.0k
    if (k >= (8 - 1)) return DE_MEMORY_ERROR;
1646
37.4k
    bitSizeLen = FDKreadBits(hBs, 4);
1647
37.4k
    extSizeBits = bitSizeLen + 4;
1648
1649
37.4k
    bitSize = FDKreadBits(hBs, extSizeBits);
1650
37.4k
    pExt->extBitSize[k] = bitSize + 1;
1651
37.4k
    nBitsRemaining = (INT)FDKgetValidBits(hBs);
1652
1653
37.4k
    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.1k
        if (nBitsRemaining !=
1658
21.1k
            ((INT)pExt->extBitSize[k] + (INT)FDKgetValidBits(hBs)))
1659
17.7k
          return DE_NOT_OK;
1660
3.40k
        break;
1661
3.40k
      case UNIDRCCONFEXT_PARAM_DRC:
1662
      /* add future extensions here */
1663
15.8k
      default:
1664
15.8k
        FDKpushFor(hBs, pExt->extBitSize[k]);
1665
15.8k
        break;
1666
37.4k
    }
1667
19.2k
    k++;
1668
19.2k
    pExt->uniDrcConfigExtType[k] = FDKreadBits(hBs, 4);
1669
19.2k
  }
1670
1671
972
  return err;
1672
19.8k
}
1673
1674
DRC_ERROR
1675
drcDec_readUniDrcConfig(HANDLE_FDK_BITSTREAM hBs,
1676
33.3k
                        HANDLE_UNI_DRC_CONFIG hUniDrcConfig) {
1677
33.3k
  DRC_ERROR err = DE_OK;
1678
33.3k
  int i, diff = 0;
1679
33.3k
  int drcDescriptionBasicPresent, drcCoefficientsBasicCount,
1680
33.3k
      drcInstructionsBasicCount;
1681
33.3k
  CHANNEL_LAYOUT tmpChan;
1682
33.3k
  FDKmemclear(&tmpChan, sizeof(CHANNEL_LAYOUT));
1683
33.3k
  if (hUniDrcConfig == NULL) return DE_NOT_OK;
1684
1685
33.3k
  diff |= _compAssign(&hUniDrcConfig->sampleRatePresent, FDKreadBits(hBs, 1));
1686
1687
33.3k
  if (hUniDrcConfig->sampleRatePresent == 1) {
1688
958
    diff |=
1689
958
        _compAssign(&hUniDrcConfig->sampleRate, FDKreadBits(hBs, 18) + 1000);
1690
958
  }
1691
1692
33.3k
  diff |= _compAssign(&hUniDrcConfig->downmixInstructionsCountV0,
1693
33.3k
                      FDKreadBits(hBs, 7));
1694
1695
33.3k
  drcDescriptionBasicPresent = FDKreadBits(hBs, 1);
1696
33.3k
  if (drcDescriptionBasicPresent == 1) {
1697
2.44k
    drcCoefficientsBasicCount = FDKreadBits(hBs, 3);
1698
2.44k
    drcInstructionsBasicCount = FDKreadBits(hBs, 4);
1699
30.8k
  } else {
1700
30.8k
    drcCoefficientsBasicCount = 0;
1701
30.8k
    drcInstructionsBasicCount = 0;
1702
30.8k
  }
1703
1704
33.3k
  diff |= _compAssign(&hUniDrcConfig->drcCoefficientsUniDrcCountV0,
1705
33.3k
                      FDKreadBits(hBs, 3));
1706
33.3k
  diff |= _compAssign(&hUniDrcConfig->drcInstructionsUniDrcCountV0,
1707
33.3k
                      FDKreadBits(hBs, 6));
1708
1709
33.3k
  err = _readChannelLayout(hBs, &tmpChan);
1710
33.3k
  if (err) return err;
1711
1712
33.1k
  if (!diff)
1713
17.6k
    diff |= (FDKmemcmp(&tmpChan, &hUniDrcConfig->channelLayout,
1714
17.6k
                       sizeof(CHANNEL_LAYOUT)) != 0);
1715
33.1k
  hUniDrcConfig->channelLayout = tmpChan;
1716
1717
33.1k
  hUniDrcConfig->downmixInstructionsCount =
1718
33.1k
      fMin(hUniDrcConfig->downmixInstructionsCountV0, (UCHAR)6);
1719
1.20M
  for (i = 0; i < hUniDrcConfig->downmixInstructionsCountV0; i++) {
1720
1.17M
    DOWNMIX_INSTRUCTIONS tmpDown;
1721
1.17M
    FDKmemclear(&tmpDown, sizeof(DOWNMIX_INSTRUCTIONS));
1722
1.17M
    err = _readDownmixInstructions(hBs, 0, &hUniDrcConfig->channelLayout,
1723
1.17M
                                   &tmpDown);
1724
1.17M
    if (err) return err;
1725
1.17M
    if (i >= 6) continue;
1726
69.8k
    if (!diff)
1727
12.4k
      diff |= (FDKmemcmp(&tmpDown, &(hUniDrcConfig->downmixInstructions[i]),
1728
12.4k
                         sizeof(DOWNMIX_INSTRUCTIONS)) != 0);
1729
69.8k
    hUniDrcConfig->downmixInstructions[i] = tmpDown;
1730
69.8k
  }
1731
1732
37.4k
  for (i = 0; i < drcCoefficientsBasicCount; i++) {
1733
4.40k
    _skipDrcCoefficientsBasic(hBs);
1734
4.40k
  }
1735
52.5k
  for (i = 0; i < drcInstructionsBasicCount; i++) {
1736
19.5k
    _skipDrcInstructionsBasic(hBs);
1737
19.5k
  }
1738
1739
33.0k
  hUniDrcConfig->drcCoefficientsUniDrcCount =
1740
33.0k
      fMin(hUniDrcConfig->drcCoefficientsUniDrcCountV0, (UCHAR)2);
1741
83.0k
  for (i = 0; i < hUniDrcConfig->drcCoefficientsUniDrcCountV0; i++) {
1742
50.1k
    DRC_COEFFICIENTS_UNI_DRC tmpCoef;
1743
50.1k
    FDKmemclear(&tmpCoef, sizeof(DRC_COEFFICIENTS_UNI_DRC));
1744
50.1k
    err = _readDrcCoefficientsUniDrc(hBs, 0, &tmpCoef);
1745
50.1k
    if (err) return err;
1746
50.0k
    if (i >= 2) continue;
1747
20.5k
    if (!diff)
1748
5.48k
      diff |= (FDKmemcmp(&tmpCoef, &(hUniDrcConfig->drcCoefficientsUniDrc[i]),
1749
5.48k
                         sizeof(DRC_COEFFICIENTS_UNI_DRC)) != 0);
1750
20.5k
    hUniDrcConfig->drcCoefficientsUniDrc[i] = tmpCoef;
1751
20.5k
  }
1752
1753
32.9k
  hUniDrcConfig->drcInstructionsUniDrcCount =
1754
32.9k
      fMin(hUniDrcConfig->drcInstructionsUniDrcCountV0, (UCHAR)12);
1755
732k
  for (i = 0; i < hUniDrcConfig->drcInstructionsUniDrcCountV0; i++) {
1756
701k
    DRC_INSTRUCTIONS_UNI_DRC tmpInst;
1757
701k
    FDKmemclear(&tmpInst, sizeof(DRC_INSTRUCTIONS_UNI_DRC));
1758
701k
    err = _readDrcInstructionsUniDrc(hBs, 0, hUniDrcConfig, &tmpInst);
1759
701k
    if (err) return err;
1760
699k
    if (i >= 12) continue;
1761
172k
    if (!diff)
1762
40.5k
      diff |= (FDKmemcmp(&tmpInst, &(hUniDrcConfig->drcInstructionsUniDrc[i]),
1763
40.5k
                         sizeof(DRC_INSTRUCTIONS_UNI_DRC)) != 0);
1764
172k
    hUniDrcConfig->drcInstructionsUniDrc[i] = tmpInst;
1765
172k
  }
1766
1767
31.2k
  diff |=
1768
31.2k
      _compAssign(&hUniDrcConfig->uniDrcConfigExtPresent, FDKreadBits(hBs, 1));
1769
31.2k
  hUniDrcConfig->diff = diff;
1770
1771
31.2k
  if (hUniDrcConfig->uniDrcConfigExtPresent == 1) {
1772
19.8k
    err = _readUniDrcConfigExtension(hBs, hUniDrcConfig);
1773
19.8k
    if (err) return err;
1774
19.8k
  }
1775
1776
12.3k
  return err;
1777
31.2k
}
1778
1779
/*******************/
1780
/* loudnessInfoSet */
1781
/*******************/
1782
1783
static DRC_ERROR _decodeMethodValue(HANDLE_FDK_BITSTREAM hBs,
1784
                                    const UCHAR methodDefinition,
1785
6.59k
                                    FIXP_DBL* methodValue, INT isBox) {
1786
6.59k
  int tmp;
1787
6.59k
  FIXP_DBL val;
1788
6.59k
  switch (methodDefinition) {
1789
1.75k
    case MD_UNKNOWN_OTHER:
1790
2.49k
    case MD_PROGRAM_LOUDNESS:
1791
2.98k
    case MD_ANCHOR_LOUDNESS:
1792
3.20k
    case MD_MAX_OF_LOUDNESS_RANGE:
1793
3.55k
    case MD_MOMENTARY_LOUDNESS_MAX:
1794
3.71k
    case MD_SHORT_TERM_LOUDNESS_MAX:
1795
3.71k
      tmp = FDKreadBits(hBs, 8);
1796
3.71k
      val = FL2FXCONST_DBL(-57.75f / (float)(1 << 7)) +
1797
3.71k
            (FIXP_DBL)(
1798
3.71k
                tmp << (DFRACT_BITS - 1 - 2 - 7)); /* -57.75 + tmp * 0.25; */
1799
3.71k
      break;
1800
634
    case MD_LOUDNESS_RANGE:
1801
634
      tmp = FDKreadBits(hBs, 8);
1802
634
      if (tmp == 0)
1803
77
        val = (FIXP_DBL)0;
1804
557
      else if (tmp <= 128)
1805
276
        val = (FIXP_DBL)(tmp << (DFRACT_BITS - 1 - 2 - 7)); /* tmp * 0.25; */
1806
281
      else if (tmp <= 204) {
1807
167
        val = (FIXP_DBL)(tmp << (DFRACT_BITS - 1 - 1 - 7)) -
1808
167
              FL2FXCONST_DBL(32.0f / (float)(1 << 7)); /* 0.5 * tmp - 32.0f; */
1809
167
      } else {
1810
        /* downscale by 1 more bit to prevent overflow at intermediate result */
1811
114
        val = (FIXP_DBL)(tmp << (DFRACT_BITS - 1 - 8)) -
1812
114
              FL2FXCONST_DBL(134.0f / (float)(1 << 8)); /* tmp - 134.0; */
1813
114
        val <<= 1;
1814
114
      }
1815
634
      break;
1816
568
    case MD_MIXING_LEVEL:
1817
568
      tmp = FDKreadBits(hBs, isBox ? 8 : 5);
1818
568
      val = (FIXP_DBL)(tmp << (DFRACT_BITS - 1 - 7)) +
1819
568
            FL2FXCONST_DBL(80.0f / (float)(1 << 7)); /* tmp + 80.0; */
1820
568
      break;
1821
856
    case MD_ROOM_TYPE:
1822
856
      tmp = FDKreadBits(hBs, isBox ? 8 : 2);
1823
856
      val = (FIXP_DBL)(tmp << (DFRACT_BITS - 1 - 7)); /* tmp; */
1824
856
      break;
1825
235
    case MD_SHORT_TERM_LOUDNESS:
1826
235
      tmp = FDKreadBits(hBs, 8);
1827
235
      val = FL2FXCONST_DBL(-116.0f / (float)(1 << 7)) +
1828
235
            (FIXP_DBL)(
1829
235
                tmp << (DFRACT_BITS - 1 - 1 - 7)); /* -116.0 + tmp * 0.5; */
1830
235
      break;
1831
589
    default:
1832
589
      return DE_NOT_OK; /* invalid methodDefinition value */
1833
6.59k
  }
1834
6.01k
  *methodValue = val;
1835
6.01k
  return DE_OK;
1836
6.59k
}
1837
1838
static DRC_ERROR _readLoudnessMeasurement(HANDLE_FDK_BITSTREAM hBs,
1839
6.59k
                                          LOUDNESS_MEASUREMENT* pMeas) {
1840
6.59k
  DRC_ERROR err = DE_OK;
1841
1842
6.59k
  pMeas->methodDefinition = FDKreadBits(hBs, 4);
1843
6.59k
  err =
1844
6.59k
      _decodeMethodValue(hBs, pMeas->methodDefinition, &pMeas->methodValue, 0);
1845
6.59k
  if (err) return err;
1846
6.01k
  pMeas->measurementSystem = FDKreadBits(hBs, 4);
1847
6.01k
  pMeas->reliability = FDKreadBits(hBs, 2);
1848
1849
6.01k
  return err;
1850
6.59k
}
1851
1852
static DRC_ERROR _readLoudnessInfo(HANDLE_FDK_BITSTREAM hBs, const int version,
1853
17.7k
                                   LOUDNESS_INFO* loudnessInfo) {
1854
17.7k
  DRC_ERROR err = DE_OK;
1855
17.7k
  int bsSamplePeakLevel, bsTruePeakLevel, i;
1856
17.7k
  int measurementCount;
1857
1858
17.7k
  loudnessInfo->drcSetId = FDKreadBits(hBs, 6);
1859
17.7k
  if (version >= 1) {
1860
3.37k
    loudnessInfo->eqSetId = FDKreadBits(hBs, 6);
1861
14.3k
  } else {
1862
14.3k
    loudnessInfo->eqSetId = 0;
1863
14.3k
  }
1864
17.7k
  loudnessInfo->downmixId = FDKreadBits(hBs, 7);
1865
1866
17.7k
  loudnessInfo->samplePeakLevelPresent = FDKreadBits(hBs, 1);
1867
17.7k
  if (loudnessInfo->samplePeakLevelPresent) {
1868
1.65k
    bsSamplePeakLevel = FDKreadBits(hBs, 12);
1869
1.65k
    if (bsSamplePeakLevel == 0) {
1870
80
      loudnessInfo->samplePeakLevelPresent = 0;
1871
80
      loudnessInfo->samplePeakLevel = (FIXP_DBL)0;
1872
1.57k
    } else { /* 20.0 - bsSamplePeakLevel * 0.03125; */
1873
1.57k
      loudnessInfo->samplePeakLevel =
1874
1.57k
          FL2FXCONST_DBL(20.0f / (float)(1 << 7)) -
1875
1.57k
          (FIXP_DBL)(bsSamplePeakLevel << (DFRACT_BITS - 1 - 5 - 7));
1876
1.57k
    }
1877
1.65k
  }
1878
1879
17.7k
  loudnessInfo->truePeakLevelPresent = FDKreadBits(hBs, 1);
1880
17.7k
  if (loudnessInfo->truePeakLevelPresent) {
1881
858
    bsTruePeakLevel = FDKreadBits(hBs, 12);
1882
858
    if (bsTruePeakLevel == 0) {
1883
108
      loudnessInfo->truePeakLevelPresent = 0;
1884
108
      loudnessInfo->truePeakLevel = (FIXP_DBL)0;
1885
750
    } else {
1886
750
      loudnessInfo->truePeakLevel =
1887
750
          FL2FXCONST_DBL(20.0f / (float)(1 << 7)) -
1888
750
          (FIXP_DBL)(bsTruePeakLevel << (DFRACT_BITS - 1 - 5 - 7));
1889
750
    }
1890
858
    loudnessInfo->truePeakLevelMeasurementSystem = FDKreadBits(hBs, 4);
1891
858
    loudnessInfo->truePeakLevelReliability = FDKreadBits(hBs, 2);
1892
858
  }
1893
1894
17.7k
  measurementCount = FDKreadBits(hBs, 4);
1895
17.7k
  loudnessInfo->measurementCount = fMin(measurementCount, 8);
1896
23.7k
  for (i = 0; i < measurementCount; i++) {
1897
6.59k
    LOUDNESS_MEASUREMENT tmpMeas;
1898
6.59k
    FDKmemclear(&tmpMeas, sizeof(LOUDNESS_MEASUREMENT));
1899
6.59k
    err = _readLoudnessMeasurement(hBs, &tmpMeas);
1900
6.59k
    if (err) return err;
1901
6.01k
    if (i >= 8) continue;
1902
5.41k
    loudnessInfo->loudnessMeasurement[i] = tmpMeas;
1903
5.41k
  }
1904
1905
17.1k
  return err;
1906
17.7k
}
1907
1908
static DRC_ERROR _readLoudnessInfoSetExtEq(
1909
714
    HANDLE_FDK_BITSTREAM hBs, HANDLE_LOUDNESS_INFO_SET hLoudnessInfoSet) {
1910
714
  DRC_ERROR err = DE_OK;
1911
714
  int i, offset;
1912
714
  int diff = hLoudnessInfoSet->diff;
1913
1914
714
  diff |= _compAssign(&hLoudnessInfoSet->loudnessInfoAlbumCountV1,
1915
714
                      FDKreadBits(hBs, 6));
1916
714
  diff |=
1917
714
      _compAssign(&hLoudnessInfoSet->loudnessInfoCountV1, FDKreadBits(hBs, 6));
1918
1919
714
  offset = hLoudnessInfoSet->loudnessInfoAlbumCountV0;
1920
714
  hLoudnessInfoSet->loudnessInfoAlbumCount = fMin(
1921
714
      (UCHAR)(offset + hLoudnessInfoSet->loudnessInfoAlbumCountV1), (UCHAR)12);
1922
2.47k
  for (i = 0; i < hLoudnessInfoSet->loudnessInfoAlbumCountV1; i++) {
1923
1.84k
    LOUDNESS_INFO tmpLoud;
1924
1.84k
    FDKmemclear(&tmpLoud, sizeof(LOUDNESS_INFO));
1925
1.84k
    err = _readLoudnessInfo(hBs, 1, &tmpLoud);
1926
1.84k
    if (err) return err;
1927
1.75k
    if ((offset + i) >= 12) continue;
1928
712
    if (!diff)
1929
88
      diff |= (FDKmemcmp(&tmpLoud,
1930
88
                         &(hLoudnessInfoSet->loudnessInfoAlbum[offset + i]),
1931
88
                         sizeof(LOUDNESS_INFO)) != 0);
1932
712
    hLoudnessInfoSet->loudnessInfoAlbum[offset + i] = tmpLoud;
1933
712
  }
1934
1935
626
  offset = hLoudnessInfoSet->loudnessInfoCountV0;
1936
626
  hLoudnessInfoSet->loudnessInfoCount =
1937
626
      fMin((UCHAR)(offset + hLoudnessInfoSet->loudnessInfoCountV1), (UCHAR)12);
1938
2.08k
  for (i = 0; i < hLoudnessInfoSet->loudnessInfoCountV1; i++) {
1939
1.52k
    LOUDNESS_INFO tmpLoud;
1940
1.52k
    FDKmemclear(&tmpLoud, sizeof(LOUDNESS_INFO));
1941
1.52k
    err = _readLoudnessInfo(hBs, 1, &tmpLoud);
1942
1.52k
    if (err) return err;
1943
1.45k
    if ((offset + i) >= 12) continue;
1944
608
    if (!diff)
1945
122
      diff |=
1946
122
          (FDKmemcmp(&tmpLoud, &(hLoudnessInfoSet->loudnessInfo[offset + i]),
1947
122
                     sizeof(LOUDNESS_INFO)) != 0);
1948
608
    hLoudnessInfoSet->loudnessInfo[offset + i] = tmpLoud;
1949
608
  }
1950
559
  hLoudnessInfoSet->diff = diff;
1951
559
  return err;
1952
626
}
1953
1954
static DRC_ERROR _readLoudnessInfoSetExtension(
1955
1.09k
    HANDLE_FDK_BITSTREAM hBs, HANDLE_LOUDNESS_INFO_SET hLoudnessInfoSet) {
1956
1.09k
  DRC_ERROR err = DE_OK;
1957
1.09k
  int k, bitSizeLen, extSizeBits, bitSize;
1958
1.09k
  INT nBitsRemaining;
1959
1.09k
  LOUDNESS_INFO_SET_EXTENSION* pExt = &(hLoudnessInfoSet->loudnessInfoSetExt);
1960
1961
1.09k
  k = 0;
1962
1.09k
  pExt->loudnessInfoSetExtType[k] = FDKreadBits(hBs, 4);
1963
1.95k
  while (pExt->loudnessInfoSetExtType[k] != UNIDRCLOUDEXT_TERM) {
1964
1.39k
    if (k >= (8 - 1)) return DE_MEMORY_ERROR;
1965
1.33k
    bitSizeLen = FDKreadBits(hBs, 4);
1966
1.33k
    extSizeBits = bitSizeLen + 4;
1967
1968
1.33k
    bitSize = FDKreadBits(hBs, extSizeBits);
1969
1.33k
    pExt->extBitSize[k] = bitSize + 1;
1970
1.33k
    nBitsRemaining = (INT)FDKgetValidBits(hBs);
1971
1972
1.33k
    switch (pExt->loudnessInfoSetExtType[k]) {
1973
714
      case UNIDRCLOUDEXT_EQ:
1974
714
        err = _readLoudnessInfoSetExtEq(hBs, hLoudnessInfoSet);
1975
714
        if (err) return err;
1976
559
        if (nBitsRemaining !=
1977
559
            ((INT)pExt->extBitSize[k] + (INT)FDKgetValidBits(hBs)))
1978
323
          return DE_NOT_OK;
1979
236
        break;
1980
      /* add future extensions here */
1981
622
      default:
1982
622
        FDKpushFor(hBs, pExt->extBitSize[k]);
1983
622
        break;
1984
1.33k
    }
1985
858
    k++;
1986
858
    pExt->loudnessInfoSetExtType[k] = FDKreadBits(hBs, 4);
1987
858
  }
1988
1989
554
  return err;
1990
1.09k
}
1991
1992
/* Parser for loundessInfoSet() */
1993
DRC_ERROR
1994
drcDec_readLoudnessInfoSet(HANDLE_FDK_BITSTREAM hBs,
1995
5.53k
                           HANDLE_LOUDNESS_INFO_SET hLoudnessInfoSet) {
1996
5.53k
  DRC_ERROR err = DE_OK;
1997
5.53k
  int i, diff = 0;
1998
5.53k
  if (hLoudnessInfoSet == NULL) return DE_NOT_OK;
1999
2000
5.53k
  diff |= _compAssign(&hLoudnessInfoSet->loudnessInfoAlbumCountV0,
2001
5.53k
                      FDKreadBits(hBs, 6));
2002
5.53k
  diff |=
2003
5.53k
      _compAssign(&hLoudnessInfoSet->loudnessInfoCountV0, FDKreadBits(hBs, 6));
2004
2005
5.53k
  hLoudnessInfoSet->loudnessInfoAlbumCount =
2006
5.53k
      fMin(hLoudnessInfoSet->loudnessInfoAlbumCountV0, (UCHAR)12);
2007
10.8k
  for (i = 0; i < hLoudnessInfoSet->loudnessInfoAlbumCountV0; i++) {
2008
5.65k
    LOUDNESS_INFO tmpLoud;
2009
5.65k
    FDKmemclear(&tmpLoud, sizeof(LOUDNESS_INFO));
2010
5.65k
    err = _readLoudnessInfo(hBs, 0, &tmpLoud);
2011
5.65k
    if (err) return err;
2012
5.31k
    if (i >= 12) continue;
2013
2.60k
    if (!diff)
2014
267
      diff |= (FDKmemcmp(&tmpLoud, &(hLoudnessInfoSet->loudnessInfoAlbum[i]),
2015
267
                         sizeof(LOUDNESS_INFO)) != 0);
2016
2.60k
    hLoudnessInfoSet->loudnessInfoAlbum[i] = tmpLoud;
2017
2.60k
  }
2018
2019
5.19k
  hLoudnessInfoSet->loudnessInfoCount =
2020
5.19k
      fMin(hLoudnessInfoSet->loudnessInfoCountV0, (UCHAR)12);
2021
13.8k
  for (i = 0; i < hLoudnessInfoSet->loudnessInfoCountV0; i++) {
2022
8.73k
    LOUDNESS_INFO tmpLoud;
2023
8.73k
    FDKmemclear(&tmpLoud, sizeof(LOUDNESS_INFO));
2024
8.73k
    err = _readLoudnessInfo(hBs, 0, &tmpLoud);
2025
8.73k
    if (err) return err;
2026
8.64k
    if (i >= 12) continue;
2027
5.40k
    if (!diff)
2028
1.85k
      diff |= (FDKmemcmp(&tmpLoud, &(hLoudnessInfoSet->loudnessInfo[i]),
2029
1.85k
                         sizeof(LOUDNESS_INFO)) != 0);
2030
5.40k
    hLoudnessInfoSet->loudnessInfo[i] = tmpLoud;
2031
5.40k
  }
2032
2033
5.10k
  diff |= _compAssign(&hLoudnessInfoSet->loudnessInfoSetExtPresent,
2034
5.10k
                      FDKreadBits(hBs, 1));
2035
5.10k
  hLoudnessInfoSet->diff = diff;
2036
2037
5.10k
  if (hLoudnessInfoSet->loudnessInfoSetExtPresent) {
2038
1.09k
    err = _readLoudnessInfoSetExtension(hBs, hLoudnessInfoSet);
2039
1.09k
    if (err) return err;
2040
1.09k
  }
2041
2042
4.56k
  return err;
2043
5.10k
}