Coverage Report

Created: 2026-04-01 06:56

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
906
#define UNIDRCCONFEXT_PARAM_DRC 0x1
112
21.0k
#define UNIDRCCONFEXT_V1 0x2
113
610
#define UNIDRCLOUDEXT_EQ 0x1
114
115
0
#define UNIDRCGAINEXT_TERM 0x0
116
1.91k
#define UNIDRCLOUDEXT_TERM 0x0
117
38.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
237k
static inline int _compAssign(UCHAR* dest, const UCHAR src) {
140
237k
  int diff = 0;
141
237k
  if (*dest != src) diff = 1;
142
237k
  *dest = src;
143
237k
  return diff;
144
237k
}
145
146
1.07k
static inline int _compAssign(ULONG* dest, const ULONG src) {
147
1.07k
  int diff = 0;
148
1.07k
  if (*dest != src) diff = 1;
149
1.07k
  *dest = src;
150
1.07k
  return diff;
151
1.07k
}
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.9k
                                       DUCKING_MODIFICATION* pDMod, int isBox) {
536
13.9k
  int bsDuckingScaling, sigma, mu;
537
538
13.9k
  if (isBox) FDKpushFor(hBs, 7); /* reserved */
539
13.9k
  pDMod->duckingScalingPresent = FDKreadBits(hBs, 1);
540
541
13.9k
  if (pDMod->duckingScalingPresent) {
542
3.37k
    if (isBox) FDKpushFor(hBs, 4); /* reserved */
543
3.37k
    bsDuckingScaling = FDKreadBits(hBs, 4);
544
3.37k
    sigma = bsDuckingScaling >> 3;
545
3.37k
    mu = bsDuckingScaling & 0x7;
546
547
3.37k
    if (sigma) {
548
1.86k
      pDMod->duckingScaling = (FIXP_SGL)(
549
1.86k
          (7 - mu) << (FRACT_BITS - 1 - 3 - 2)); /* 1.0 - 0.125 * (1 + mu); */
550
1.86k
    } else {
551
1.51k
      pDMod->duckingScaling = (FIXP_SGL)(
552
1.51k
          (9 + mu) << (FRACT_BITS - 1 - 3 - 2)); /* 1.0 + 0.125 * (1 + mu); */
553
1.51k
    }
554
10.6k
  } else {
555
10.6k
    pDMod->duckingScaling = (FIXP_SGL)(1 << (FRACT_BITS - 1 - 2)); /* 1.0 */
556
10.6k
  }
557
13.9k
}
558
559
static void _decodeGainModification(HANDLE_FDK_BITSTREAM hBs, const int version,
560
                                    int bandCount, GAIN_MODIFICATION* pGMod,
561
32.5k
                                    int isBox) {
562
32.5k
  int sign, bsGainOffset, bsAttenuationScaling, bsAmplificationScaling;
563
564
32.5k
  if (version > 0) {
565
7.26k
    int b, shapeFilterPresent;
566
567
7.26k
    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.26k
      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.26k
      if (!isBox)
582
7.26k
        pGMod[b].targetCharacteristicLeftPresent = FDKreadBits(hBs, 1);
583
7.26k
      if (pGMod[b].targetCharacteristicLeftPresent) {
584
1.72k
        if (isBox) FDKpushFor(hBs, 4); /* reserved */
585
1.72k
        pGMod[b].targetCharacteristicLeftIndex = FDKreadBits(hBs, 4);
586
1.72k
      }
587
7.26k
      if (!isBox)
588
7.26k
        pGMod[b].targetCharacteristicRightPresent = FDKreadBits(hBs, 1);
589
7.26k
      if (pGMod[b].targetCharacteristicRightPresent) {
590
2.13k
        if (isBox) FDKpushFor(hBs, 4); /* reserved */
591
2.13k
        pGMod[b].targetCharacteristicRightIndex = FDKreadBits(hBs, 4);
592
2.13k
      }
593
7.26k
      if (!isBox) pGMod[b].gainScalingPresent = FDKreadBits(hBs, 1);
594
7.26k
      if (pGMod[b].gainScalingPresent) {
595
2.11k
        bsAttenuationScaling = FDKreadBits(hBs, 4);
596
2.11k
        pGMod[b].attenuationScaling = (FIXP_SGL)(
597
2.11k
            bsAttenuationScaling
598
2.11k
            << (FRACT_BITS - 1 - 3 - 2)); /* bsAttenuationScaling * 0.125; */
599
2.11k
        bsAmplificationScaling = FDKreadBits(hBs, 4);
600
2.11k
        pGMod[b].amplificationScaling = (FIXP_SGL)(
601
2.11k
            bsAmplificationScaling
602
2.11k
            << (FRACT_BITS - 1 - 3 - 2)); /* bsAmplificationScaling * 0.125; */
603
2.11k
      }
604
7.26k
      if (!isBox) pGMod[b].gainOffsetPresent = FDKreadBits(hBs, 1);
605
7.26k
      if (pGMod[b].gainOffsetPresent) {
606
2.01k
        if (isBox) FDKpushFor(hBs, 2); /* reserved */
607
2.01k
        sign = FDKreadBits(hBs, 1);
608
2.01k
        bsGainOffset = FDKreadBits(hBs, 5);
609
2.01k
        pGMod[b].gainOffset = (FIXP_SGL)(
610
2.01k
            (1 + bsGainOffset)
611
2.01k
            << (FRACT_BITS - 1 - 2 - 4)); /* (1+bsGainOffset) * 0.25; */
612
2.01k
        if (sign) {
613
1.17k
          pGMod[b].gainOffset = -pGMod[b].gainOffset;
614
1.17k
        }
615
2.01k
      }
616
7.26k
    }
617
7.26k
    if (bandCount == 1) {
618
6.95k
      shapeFilterPresent = FDKreadBits(hBs, 1);
619
6.95k
      if (shapeFilterPresent) {
620
1.82k
        if (isBox) FDKpushFor(hBs, 3); /* reserved */
621
1.82k
        FDKpushFor(hBs, 4);            /* pGMod->shapeFilterIndex */
622
5.12k
      } else {
623
5.12k
        if (isBox) FDKpushFor(hBs, 7); /* reserved */
624
5.12k
      }
625
6.95k
    }
626
25.2k
  } else {
627
25.2k
    int b, gainScalingPresent, gainOffsetPresent;
628
25.2k
    FIXP_SGL attenuationScaling = FL2FXCONST_SGL(1.0f / (float)(1 << 2)),
629
25.2k
             amplificationScaling = FL2FXCONST_SGL(1.0f / (float)(1 << 2)),
630
25.2k
             gainOffset = (FIXP_SGL)0;
631
25.2k
    if (isBox) FDKpushFor(hBs, 7); /* reserved */
632
25.2k
    gainScalingPresent = FDKreadBits(hBs, 1);
633
25.2k
    if (gainScalingPresent) {
634
15.2k
      bsAttenuationScaling = FDKreadBits(hBs, 4);
635
15.2k
      attenuationScaling = (FIXP_SGL)(
636
15.2k
          bsAttenuationScaling
637
15.2k
          << (FRACT_BITS - 1 - 3 - 2)); /* bsAttenuationScaling * 0.125; */
638
15.2k
      bsAmplificationScaling = FDKreadBits(hBs, 4);
639
15.2k
      amplificationScaling = (FIXP_SGL)(
640
15.2k
          bsAmplificationScaling
641
15.2k
          << (FRACT_BITS - 1 - 3 - 2)); /* bsAmplificationScaling * 0.125; */
642
15.2k
    }
643
25.2k
    if (isBox) FDKpushFor(hBs, 7); /* reserved */
644
25.2k
    gainOffsetPresent = FDKreadBits(hBs, 1);
645
25.2k
    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.84k
        gainOffset = -gainOffset;
654
7.84k
      }
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.2k
  }
666
32.5k
}
667
668
static void _readDrcCharacteristic(HANDLE_FDK_BITSTREAM hBs, const int version,
669
10.9k
                                   DRC_CHARACTERISTIC* pDChar, int isBox) {
670
10.9k
  if (version == 0) {
671
2.01k
    if (isBox) FDKpushFor(hBs, 1); /* reserved */
672
2.01k
    pDChar->cicpIndex = FDKreadBits(hBs, 7);
673
2.01k
    if (pDChar->cicpIndex > 0) {
674
851
      pDChar->present = 1;
675
851
      pDChar->isCICP = 1;
676
1.16k
    } else {
677
1.16k
      pDChar->present = 0;
678
1.16k
    }
679
8.91k
  } else {
680
8.91k
    pDChar->present = FDKreadBits(hBs, 1);
681
8.91k
    if (isBox) pDChar->isCICP = FDKreadBits(hBs, 1);
682
8.91k
    if (pDChar->present) {
683
2.90k
      if (!isBox) pDChar->isCICP = FDKreadBits(hBs, 1);
684
2.90k
      if (pDChar->isCICP) {
685
1.03k
        if (isBox) FDKpushFor(hBs, 1); /* reserved */
686
1.03k
        pDChar->cicpIndex = FDKreadBits(hBs, 7);
687
1.87k
      } else {
688
1.87k
        pDChar->custom.left = FDKreadBits(hBs, 4);
689
1.87k
        pDChar->custom.right = FDKreadBits(hBs, 4);
690
1.87k
      }
691
2.90k
    }
692
8.91k
  }
693
10.9k
}
694
695
static void _readBandBorder(HANDLE_FDK_BITSTREAM hBs, BAND_BORDER* pBBord,
696
6.50k
                            int drcBandType, int isBox) {
697
6.50k
  if (drcBandType) {
698
3.70k
    if (isBox) FDKpushFor(hBs, 4); /* reserved */
699
3.70k
    pBBord->crossoverFreqIndex = FDKreadBits(hBs, 4);
700
3.70k
  } else {
701
2.80k
    if (isBox) FDKpushFor(hBs, 6); /* reserved */
702
2.80k
    pBBord->startSubBandIndex = FDKreadBits(hBs, 10);
703
2.80k
  }
704
6.50k
}
705
706
static DRC_ERROR _readGainSet(HANDLE_FDK_BITSTREAM hBs, const int version,
707
                              int* gainSequenceIndex, GAIN_SET* pGSet,
708
79.0k
                              int isBox) {
709
79.0k
  if (isBox) FDKpushFor(hBs, 2); /* reserved */
710
79.0k
  pGSet->gainCodingProfile = FDKreadBits(hBs, 2);
711
79.0k
  pGSet->gainInterpolationType = FDKreadBits(hBs, 1);
712
79.0k
  pGSet->fullFrame = FDKreadBits(hBs, 1);
713
79.0k
  pGSet->timeAlignment = FDKreadBits(hBs, 1);
714
79.0k
  pGSet->timeDeltaMinPresent = FDKreadBits(hBs, 1);
715
716
79.0k
  if (pGSet->timeDeltaMinPresent) {
717
2.13k
    int bsTimeDeltaMin;
718
2.13k
    if (isBox) FDKpushFor(hBs, 5); /* reserved */
719
2.13k
    bsTimeDeltaMin = FDKreadBits(hBs, 11);
720
2.13k
    pGSet->timeDeltaMin = bsTimeDeltaMin + 1;
721
2.13k
  }
722
723
79.0k
  if (pGSet->gainCodingProfile != GCP_CONSTANT) {
724
74.6k
    int i;
725
74.6k
    if (isBox) FDKpushFor(hBs, 3); /* reserved */
726
74.6k
    pGSet->bandCount = FDKreadBits(hBs, 4);
727
74.6k
    if (pGSet->bandCount > 4) return DE_MEMORY_ERROR;
728
729
74.4k
    if ((pGSet->bandCount > 1) || isBox) {
730
2.99k
      pGSet->drcBandType = FDKreadBits(hBs, 1);
731
2.99k
    }
732
733
85.3k
    for (i = 0; i < pGSet->bandCount; i++) {
734
10.9k
      if (version == 0) {
735
2.01k
        *gainSequenceIndex = (*gainSequenceIndex) + 1;
736
8.91k
      } else {
737
8.91k
        int indexPresent;
738
8.91k
        indexPresent = (isBox) ? 1 : FDKreadBits(hBs, 1);
739
8.91k
        if (indexPresent) {
740
2.25k
          int bsIndex;
741
2.25k
          bsIndex = FDKreadBits(hBs, 6);
742
2.25k
          *gainSequenceIndex = bsIndex;
743
6.66k
        } else {
744
6.66k
          *gainSequenceIndex = (*gainSequenceIndex) + 1;
745
6.66k
        }
746
8.91k
      }
747
10.9k
      pGSet->gainSequenceIndex[i] = *gainSequenceIndex;
748
10.9k
      _readDrcCharacteristic(hBs, version, &(pGSet->drcCharacteristic[i]),
749
10.9k
                             isBox);
750
10.9k
    }
751
80.9k
    for (i = 1; i < pGSet->bandCount; i++) {
752
6.50k
      _readBandBorder(hBs, &(pGSet->bandBorder[i]), pGSet->drcBandType, isBox);
753
6.50k
    }
754
74.4k
  } else {
755
4.38k
    pGSet->bandCount = 1;
756
4.38k
    *gainSequenceIndex = (*gainSequenceIndex) + 1;
757
4.38k
    pGSet->gainSequenceIndex[0] = *gainSequenceIndex;
758
4.38k
  }
759
760
78.7k
  return DE_OK;
761
79.0k
}
762
763
static DRC_ERROR _readCustomDrcCharacteristic(HANDLE_FDK_BITSTREAM hBs,
764
                                              const CHARACTERISTIC_SIDE side,
765
                                              UCHAR* pCharacteristicFormat,
766
                                              CUSTOM_DRC_CHAR* pCChar,
767
13.9k
                                              int isBox) {
768
13.9k
  if (isBox) FDKpushFor(hBs, 7); /* reserved */
769
13.9k
  *pCharacteristicFormat = FDKreadBits(hBs, 1);
770
13.9k
  if (*pCharacteristicFormat == CF_SIGMOID) {
771
11.4k
    int bsGain, bsIoRatio, bsExp;
772
11.4k
    if (isBox) FDKpushFor(hBs, 1); /* reserved */
773
11.4k
    bsGain = FDKreadBits(hBs, 6);
774
11.4k
    if (side == CS_LEFT) {
775
5.65k
      pCChar->sigmoid.gain = (FIXP_SGL)(bsGain << (FRACT_BITS - 1 - 6));
776
5.83k
    } else {
777
5.83k
      pCChar->sigmoid.gain = (FIXP_SGL)(-bsGain << (FRACT_BITS - 1 - 6));
778
5.83k
    }
779
11.4k
    bsIoRatio = FDKreadBits(hBs, 4);
780
    /* pCChar->sigmoid.ioRatio = 0.05 + 0.15 * bsIoRatio; */
781
11.4k
    pCChar->sigmoid.ioRatio =
782
11.4k
        FL2FXCONST_SGL(0.05f / (float)(1 << 2)) +
783
11.4k
        (FIXP_SGL)((((3 * bsIoRatio) << (FRACT_BITS - 1)) / 5) >> 4);
784
11.4k
    bsExp = FDKreadBits(hBs, 4);
785
11.4k
    if (bsExp < 15) {
786
11.0k
      pCChar->sigmoid.exp = (FIXP_SGL)((1 + 2 * bsExp) << (FRACT_BITS - 1 - 5));
787
11.0k
    } else {
788
479
      pCChar->sigmoid.exp = (FIXP_SGL)MAXVAL_SGL; /* represents infinity */
789
479
    }
790
11.4k
    pCChar->sigmoid.flipSign = FDKreadBits(hBs, 1);
791
11.4k
  } else { /* CF_NODES */
792
2.49k
    int i, bsCharacteristicNodeCount, bsNodeLevelDelta, bsNodeGain;
793
2.49k
    if (isBox) FDKpushFor(hBs, 6); /* reserved */
794
2.49k
    bsCharacteristicNodeCount = FDKreadBits(hBs, 2);
795
2.49k
    pCChar->nodes.characteristicNodeCount = bsCharacteristicNodeCount + 1;
796
2.49k
    if (pCChar->nodes.characteristicNodeCount > 4) return DE_MEMORY_ERROR;
797
2.49k
    pCChar->nodes.nodeLevel[0] = DRC_INPUT_LOUDNESS_TARGET_SGL;
798
2.49k
    pCChar->nodes.nodeGain[0] = (FIXP_SGL)0;
799
8.09k
    for (i = 0; i < pCChar->nodes.characteristicNodeCount; i++) {
800
5.60k
      if (isBox) FDKpushFor(hBs, 3); /* reserved */
801
5.60k
      bsNodeLevelDelta = FDKreadBits(hBs, 5);
802
5.60k
      if (side == CS_LEFT) {
803
3.01k
        pCChar->nodes.nodeLevel[i + 1] =
804
3.01k
            pCChar->nodes.nodeLevel[i] -
805
3.01k
            (FIXP_SGL)((1 + bsNodeLevelDelta) << (FRACT_BITS - 1 - 7));
806
3.01k
      } else {
807
2.58k
        pCChar->nodes.nodeLevel[i + 1] =
808
2.58k
            pCChar->nodes.nodeLevel[i] +
809
2.58k
            (FIXP_SGL)((1 + bsNodeLevelDelta) << (FRACT_BITS - 1 - 7));
810
2.58k
      }
811
5.60k
      bsNodeGain = FDKreadBits(hBs, 8);
812
5.60k
      pCChar->nodes.nodeGain[i + 1] = (FIXP_SGL)(
813
5.60k
          (bsNodeGain - 128)
814
5.60k
          << (FRACT_BITS - 1 - 1 - 7)); /* 0.5f * bsNodeGain - 64.0f; */
815
5.60k
    }
816
2.49k
  }
817
13.9k
  return DE_OK;
818
13.9k
}
819
820
20.6k
static void _skipLoudEqInstructions(HANDLE_FDK_BITSTREAM hBs) {
821
20.6k
  int i;
822
20.6k
  int downmixIdPresent, additionalDownmixIdPresent,
823
20.6k
      additionalDownmixIdCount = 0;
824
20.6k
  int drcSetIdPresent, additionalDrcSetIdPresent, additionalDrcSetIdCount = 0;
825
20.6k
  int eqSetIdPresent, additionalEqSetIdPresent, additionalEqSetIdCount = 0;
826
20.6k
  int loudEqGainSequenceCount, drcCharacteristicFormatIsCICP;
827
828
20.6k
  FDKpushFor(hBs, 4); /* loudEqSetId */
829
20.6k
  FDKpushFor(hBs, 4); /* drcLocation */
830
20.6k
  downmixIdPresent = FDKreadBits(hBs, 1);
831
20.6k
  if (downmixIdPresent) {
832
2.20k
    FDKpushFor(hBs, 7); /* downmixId */
833
2.20k
    additionalDownmixIdPresent = FDKreadBits(hBs, 1);
834
2.20k
    if (additionalDownmixIdPresent) {
835
1.15k
      additionalDownmixIdCount = FDKreadBits(hBs, 7);
836
25.4k
      for (i = 0; i < additionalDownmixIdCount; i++) {
837
24.2k
        FDKpushFor(hBs, 7); /* additionalDownmixId */
838
24.2k
      }
839
1.15k
    }
840
2.20k
  }
841
842
20.6k
  drcSetIdPresent = FDKreadBits(hBs, 1);
843
20.6k
  if (drcSetIdPresent) {
844
2.30k
    FDKpushFor(hBs, 6); /* drcSetId */
845
2.30k
    additionalDrcSetIdPresent = FDKreadBits(hBs, 1);
846
2.30k
    if (additionalDrcSetIdPresent) {
847
885
      additionalDrcSetIdCount = FDKreadBits(hBs, 6);
848
6.74k
      for (i = 0; i < additionalDrcSetIdCount; i++) {
849
5.85k
        FDKpushFor(hBs, 6); /* additionalDrcSetId; */
850
5.85k
      }
851
885
    }
852
2.30k
  }
853
854
20.6k
  eqSetIdPresent = FDKreadBits(hBs, 1);
855
20.6k
  if (eqSetIdPresent) {
856
1.67k
    FDKpushFor(hBs, 6); /* eqSetId */
857
1.67k
    additionalEqSetIdPresent = FDKreadBits(hBs, 1);
858
1.67k
    if (additionalEqSetIdPresent) {
859
956
      additionalEqSetIdCount = FDKreadBits(hBs, 6);
860
5.84k
      for (i = 0; i < additionalEqSetIdCount; i++) {
861
4.88k
        FDKpushFor(hBs, 6); /* additionalEqSetId; */
862
4.88k
      }
863
956
    }
864
1.67k
  }
865
866
20.6k
  FDKpushFor(hBs, 1); /* loudnessAfterDrc */
867
20.6k
  FDKpushFor(hBs, 1); /* loudnessAfterEq */
868
20.6k
  loudEqGainSequenceCount = FDKreadBits(hBs, 6);
869
29.9k
  for (i = 0; i < loudEqGainSequenceCount; i++) {
870
9.32k
    FDKpushFor(hBs, 6); /* gainSequenceIndex */
871
9.32k
    drcCharacteristicFormatIsCICP = FDKreadBits(hBs, 1);
872
9.32k
    if (drcCharacteristicFormatIsCICP) {
873
727
      FDKpushFor(hBs, 7); /* drcCharacteristic */
874
8.59k
    } else {
875
8.59k
      FDKpushFor(hBs, 4); /* drcCharacteristicLeftIndex */
876
8.59k
      FDKpushFor(hBs, 4); /* drcCharacteristicRightIndex */
877
8.59k
    }
878
9.32k
    FDKpushFor(hBs, 6); /* frequencyRangeIndex */
879
9.32k
    FDKpushFor(hBs, 3); /* bsLoudEqScaling */
880
9.32k
    FDKpushFor(hBs, 5); /* bsLoudEqOffset */
881
9.32k
  }
882
20.6k
}
883
884
23.2k
static void _skipEqSubbandGainSpline(HANDLE_FDK_BITSTREAM hBs) {
885
23.2k
  int nEqNodes, k, bits;
886
23.2k
  nEqNodes = FDKreadBits(hBs, 5);
887
23.2k
  nEqNodes += 2;
888
72.3k
  for (k = 0; k < nEqNodes; k++) {
889
49.0k
    bits = FDKreadBits(hBs, 1);
890
49.0k
    if (!bits) {
891
46.3k
      FDKpushFor(hBs, 4);
892
46.3k
    }
893
49.0k
  }
894
23.2k
  FDKpushFor(hBs, 4 * (nEqNodes - 1));
895
23.2k
  bits = FDKreadBits(hBs, 2);
896
23.2k
  switch (bits) {
897
21.7k
    case 0:
898
21.7k
      FDKpushFor(hBs, 5);
899
21.7k
      break;
900
418
    case 1:
901
1.03k
    case 2:
902
1.03k
      FDKpushFor(hBs, 4);
903
1.03k
      break;
904
501
    case 3:
905
501
      FDKpushFor(hBs, 3);
906
501
      break;
907
23.2k
  }
908
23.2k
  FDKpushFor(hBs, 5 * (nEqNodes - 1));
909
23.2k
}
910
911
6.71k
static void _skipEqCoefficients(HANDLE_FDK_BITSTREAM hBs) {
912
6.71k
  int j, k;
913
6.71k
  int eqDelayMaxPresent;
914
6.71k
  int uniqueFilterBlockCount, filterElementCount, filterElementGainPresent;
915
6.71k
  int uniqueTdFilterElementCount, eqFilterFormat, bsRealZeroRadiusOneCount,
916
6.71k
      realZeroCount, genericZeroCount, realPoleCount, complexPoleCount,
917
6.71k
      firFilterOrder;
918
6.71k
  int uniqueEqSubbandGainsCount, eqSubbandGainRepresentation,
919
6.71k
      eqSubbandGainCount;
920
6.71k
  int eqSubbandGainFormat;
921
922
6.71k
  eqDelayMaxPresent = FDKreadBits(hBs, 1);
923
6.71k
  if (eqDelayMaxPresent) {
924
1.04k
    FDKpushFor(hBs, 8); /* bsEqDelayMax */
925
1.04k
  }
926
927
6.71k
  uniqueFilterBlockCount = FDKreadBits(hBs, 6);
928
23.9k
  for (j = 0; j < uniqueFilterBlockCount; j++) {
929
17.2k
    filterElementCount = FDKreadBits(hBs, 6);
930
29.3k
    for (k = 0; k < filterElementCount; k++) {
931
12.1k
      FDKpushFor(hBs, 6); /* filterElementIndex */
932
12.1k
      filterElementGainPresent = FDKreadBits(hBs, 1);
933
12.1k
      if (filterElementGainPresent) {
934
642
        FDKpushFor(hBs, 10); /* bsFilterElementGain */
935
642
      }
936
12.1k
    }
937
17.2k
  }
938
6.71k
  uniqueTdFilterElementCount = FDKreadBits(hBs, 6);
939
23.0k
  for (j = 0; j < uniqueTdFilterElementCount; j++) {
940
16.3k
    eqFilterFormat = FDKreadBits(hBs, 1);
941
16.3k
    if (eqFilterFormat == 0) { /* pole/zero */
942
15.1k
      bsRealZeroRadiusOneCount = FDKreadBits(hBs, 3);
943
15.1k
      realZeroCount = FDKreadBits(hBs, 6);
944
15.1k
      genericZeroCount = FDKreadBits(hBs, 6);
945
15.1k
      realPoleCount = FDKreadBits(hBs, 4);
946
15.1k
      complexPoleCount = FDKreadBits(hBs, 4);
947
15.1k
      FDKpushFor(hBs, 2 * bsRealZeroRadiusOneCount * 1);
948
15.1k
      FDKpushFor(hBs, realZeroCount * 8);
949
15.1k
      FDKpushFor(hBs, genericZeroCount * 14);
950
15.1k
      FDKpushFor(hBs, realPoleCount * 8);
951
15.1k
      FDKpushFor(hBs, complexPoleCount * 14);
952
15.1k
    } else { /* FIR coefficients */
953
1.15k
      firFilterOrder = FDKreadBits(hBs, 7);
954
1.15k
      FDKpushFor(hBs, 1);
955
1.15k
      FDKpushFor(hBs, (firFilterOrder / 2 + 1) * 11);
956
1.15k
    }
957
16.3k
  }
958
6.71k
  uniqueEqSubbandGainsCount = FDKreadBits(hBs, 6);
959
6.71k
  if (uniqueEqSubbandGainsCount > 0) {
960
4.22k
    eqSubbandGainRepresentation = FDKreadBits(hBs, 1);
961
4.22k
    eqSubbandGainFormat = FDKreadBits(hBs, 4);
962
4.22k
    switch (eqSubbandGainFormat) {
963
341
      case GF_QMF32:
964
341
        eqSubbandGainCount = 32;
965
341
        break;
966
119
      case GF_QMFHYBRID39:
967
119
        eqSubbandGainCount = 39;
968
119
        break;
969
229
      case GF_QMF64:
970
229
        eqSubbandGainCount = 64;
971
229
        break;
972
237
      case GF_QMFHYBRID71:
973
237
        eqSubbandGainCount = 71;
974
237
        break;
975
305
      case GF_QMF128:
976
305
        eqSubbandGainCount = 128;
977
305
        break;
978
114
      case GF_QMFHYBRID135:
979
114
        eqSubbandGainCount = 135;
980
114
        break;
981
373
      case GF_UNIFORM:
982
2.88k
      default:
983
2.88k
        eqSubbandGainCount = FDKreadBits(hBs, 8);
984
2.88k
        eqSubbandGainCount++;
985
2.88k
        break;
986
4.22k
    }
987
125k
    for (k = 0; k < uniqueEqSubbandGainsCount; k++) {
988
120k
      if (eqSubbandGainRepresentation == 1) {
989
23.2k
        _skipEqSubbandGainSpline(hBs);
990
97.5k
      } else {
991
97.5k
        FDKpushFor(hBs, eqSubbandGainCount * 9);
992
97.5k
      }
993
120k
    }
994
4.22k
  }
995
6.71k
}
996
997
static void _skipTdFilterCascade(HANDLE_FDK_BITSTREAM hBs,
998
3.25k
                                 const int eqChannelGroupCount) {
999
3.25k
  int i, eqCascadeGainPresent, filterBlockCount, eqPhaseAlignmentPresent;
1000
7.32k
  for (i = 0; i < eqChannelGroupCount; i++) {
1001
4.07k
    eqCascadeGainPresent = FDKreadBits(hBs, 1);
1002
4.07k
    if (eqCascadeGainPresent) {
1003
1.47k
      FDKpushFor(hBs, 10); /* bsEqCascadeGain */
1004
1.47k
    }
1005
4.07k
    filterBlockCount = FDKreadBits(hBs, 4);
1006
4.07k
    FDKpushFor(hBs, filterBlockCount * 7); /* filterBlockIndex */
1007
4.07k
  }
1008
3.25k
  eqPhaseAlignmentPresent = FDKreadBits(hBs, 1);
1009
3.25k
  {
1010
3.25k
    if (eqPhaseAlignmentPresent) {
1011
2.85k
      for (i = 0; i < eqChannelGroupCount; i++) {
1012
1.07k
        FDKpushFor(hBs, (eqChannelGroupCount - i - 1) * 1);
1013
1.07k
      }
1014
1.78k
    }
1015
3.25k
  }
1016
3.25k
}
1017
1018
static DRC_ERROR _skipEqInstructions(HANDLE_FDK_BITSTREAM hBs,
1019
32.6k
                                     HANDLE_UNI_DRC_CONFIG hUniDrcConfig) {
1020
32.6k
  DRC_ERROR err = DE_OK;
1021
32.6k
  int c, i, k, channelCount;
1022
32.6k
  int downmixIdPresent, downmixId, eqApplyToDownmix, additionalDownmixIdPresent,
1023
32.6k
      additionalDownmixIdCount = 0;
1024
32.6k
  int additionalDrcSetIdPresent, additionalDrcSetIdCount;
1025
32.6k
  int dependsOnEqSetPresent, eqChannelGroupCount, tdFilterCascadePresent,
1026
32.6k
      subbandGainsPresent, eqTransitionDurationPresent;
1027
32.6k
  UCHAR eqChannelGroupForChannel[8];
1028
1029
32.6k
  FDKpushFor(hBs, 6); /* eqSetId */
1030
32.6k
  FDKpushFor(hBs, 4); /* eqSetComplexityLevel */
1031
32.6k
  downmixIdPresent = FDKreadBits(hBs, 1);
1032
32.6k
  if (downmixIdPresent) {
1033
5.47k
    downmixId = FDKreadBits(hBs, 7);
1034
5.47k
    eqApplyToDownmix = FDKreadBits(hBs, 1);
1035
5.47k
    additionalDownmixIdPresent = FDKreadBits(hBs, 1);
1036
5.47k
    if (additionalDownmixIdPresent) {
1037
1.57k
      additionalDownmixIdCount = FDKreadBits(hBs, 7);
1038
1.57k
      FDKpushFor(hBs, additionalDownmixIdCount * 7); /* additionalDownmixId */
1039
1.57k
    }
1040
27.1k
  } else {
1041
27.1k
    downmixId = 0;
1042
27.1k
    eqApplyToDownmix = 0;
1043
27.1k
  }
1044
32.6k
  FDKpushFor(hBs, 6); /* drcSetId */
1045
32.6k
  additionalDrcSetIdPresent = FDKreadBits(hBs, 1);
1046
32.6k
  if (additionalDrcSetIdPresent) {
1047
2.67k
    additionalDrcSetIdCount = FDKreadBits(hBs, 6);
1048
19.7k
    for (i = 0; i < additionalDrcSetIdCount; i++) {
1049
17.0k
      FDKpushFor(hBs, 6); /* additionalDrcSetId */
1050
17.0k
    }
1051
2.67k
  }
1052
32.6k
  FDKpushFor(hBs, 16); /* eqSetPurpose */
1053
32.6k
  dependsOnEqSetPresent = FDKreadBits(hBs, 1);
1054
32.6k
  if (dependsOnEqSetPresent) {
1055
3.21k
    FDKpushFor(hBs, 6); /* dependsOnEqSet */
1056
29.4k
  } else {
1057
29.4k
    FDKpushFor(hBs, 1); /* noIndependentEqUse */
1058
29.4k
  }
1059
1060
32.6k
  channelCount = hUniDrcConfig->channelLayout.baseChannelCount;
1061
32.6k
  if ((downmixIdPresent == 1) && (eqApplyToDownmix == 1) && (downmixId != 0) &&
1062
2.26k
      (downmixId != DOWNMIX_ID_ANY_DOWNMIX) &&
1063
1.95k
      (additionalDownmixIdCount == 0)) {
1064
1.44k
    DOWNMIX_INSTRUCTIONS* pDown =
1065
1.44k
        selectDownmixInstructions(hUniDrcConfig, downmixId);
1066
1.44k
    if (pDown == NULL) return DE_NOT_OK;
1067
1068
349
    channelCount =
1069
349
        pDown->targetChannelCount; /* targetChannelCountFromDownmixId*/
1070
31.1k
  } else if ((downmixId == DOWNMIX_ID_ANY_DOWNMIX) ||
1071
30.6k
             (additionalDownmixIdCount > 1)) {
1072
1.19k
    channelCount = 1;
1073
1.19k
  }
1074
1075
31.5k
  eqChannelGroupCount = 0;
1076
106k
  for (c = 0; c < channelCount; c++) {
1077
74.9k
    int newGroup = 1;
1078
74.9k
    if (c >= 8) return DE_MEMORY_ERROR;
1079
74.6k
    eqChannelGroupForChannel[c] = FDKreadBits(hBs, 7);
1080
261k
    for (k = 0; k < c; k++) {
1081
186k
      if (eqChannelGroupForChannel[c] == eqChannelGroupForChannel[k]) {
1082
163k
        newGroup = 0;
1083
163k
      }
1084
186k
    }
1085
74.6k
    if (newGroup == 1) {
1086
26.1k
      eqChannelGroupCount += 1;
1087
26.1k
    }
1088
74.6k
  }
1089
31.2k
  tdFilterCascadePresent = FDKreadBits(hBs, 1);
1090
31.2k
  if (tdFilterCascadePresent) {
1091
3.25k
    _skipTdFilterCascade(hBs, eqChannelGroupCount);
1092
3.25k
  }
1093
31.2k
  subbandGainsPresent = FDKreadBits(hBs, 1);
1094
31.2k
  if (subbandGainsPresent) {
1095
2.75k
    FDKpushFor(hBs, eqChannelGroupCount * 6); /* subbandGainsIndex */
1096
2.75k
  }
1097
31.2k
  eqTransitionDurationPresent = FDKreadBits(hBs, 1);
1098
31.2k
  if (eqTransitionDurationPresent) {
1099
2.89k
    FDKpushFor(hBs, 5); /* bsEqTransitionDuration */
1100
2.89k
  }
1101
31.2k
  return err;
1102
31.5k
}
1103
1104
4.08k
static void _skipDrcCoefficientsBasic(HANDLE_FDK_BITSTREAM hBs) {
1105
4.08k
  FDKpushFor(hBs, 4); /* drcLocation */
1106
4.08k
  FDKpushFor(hBs, 7); /* drcCharacteristic */
1107
4.08k
}
1108
1109
static DRC_ERROR _readDrcCoefficientsUniDrc(HANDLE_FDK_BITSTREAM hBs,
1110
                                            const int version,
1111
77.2k
                                            DRC_COEFFICIENTS_UNI_DRC* pCoef) {
1112
77.2k
  DRC_ERROR err = DE_OK;
1113
77.2k
  int i, bsDrcFrameSize;
1114
77.2k
  int gainSequenceIndex = -1;
1115
1116
77.2k
  pCoef->drcLocation = FDKreadBits(hBs, 4);
1117
77.2k
  pCoef->drcFrameSizePresent = FDKreadBits(hBs, 1);
1118
1119
77.2k
  if (pCoef->drcFrameSizePresent == 1) {
1120
4.21k
    bsDrcFrameSize = FDKreadBits(hBs, 15);
1121
4.21k
    pCoef->drcFrameSize = bsDrcFrameSize + 1;
1122
4.21k
  }
1123
77.2k
  if (version == 0) {
1124
49.7k
    int gainSequenceCount = 0, gainSetCount;
1125
49.7k
    pCoef->characteristicLeftCount = 0;
1126
49.7k
    pCoef->characteristicRightCount = 0;
1127
49.7k
    gainSetCount = FDKreadBits(hBs, 6);
1128
49.7k
    pCoef->gainSetCount = fMin(gainSetCount, 12);
1129
73.8k
    for (i = 0; i < gainSetCount; i++) {
1130
24.2k
      GAIN_SET tmpGset;
1131
24.2k
      FDKmemclear(&tmpGset, sizeof(GAIN_SET));
1132
24.2k
      err = _readGainSet(hBs, version, &gainSequenceIndex, &tmpGset, 0);
1133
24.2k
      if (err) return err;
1134
24.1k
      gainSequenceCount += tmpGset.bandCount;
1135
1136
24.1k
      if (i >= 12) continue;
1137
10.2k
      pCoef->gainSet[i] = tmpGset;
1138
10.2k
    }
1139
49.5k
    pCoef->gainSequenceCount = gainSequenceCount;
1140
49.5k
  } else { /* (version == 1) */
1141
27.5k
    UCHAR drcCharacteristicLeftPresent, drcCharacteristicRightPresent;
1142
27.5k
    UCHAR shapeFiltersPresent, shapeFilterCount, tmpPresent;
1143
27.5k
    int gainSetCount;
1144
27.5k
    drcCharacteristicLeftPresent = FDKreadBits(hBs, 1);
1145
27.5k
    if (drcCharacteristicLeftPresent) {
1146
2.16k
      pCoef->characteristicLeftCount = FDKreadBits(hBs, 4);
1147
2.16k
      if ((pCoef->characteristicLeftCount + 1) > 16) return DE_MEMORY_ERROR;
1148
9.25k
      for (i = 0; i < pCoef->characteristicLeftCount; i++) {
1149
7.09k
        err = _readCustomDrcCharacteristic(
1150
7.09k
            hBs, CS_LEFT, &(pCoef->characteristicLeftFormat[i + 1]),
1151
7.09k
            &(pCoef->customCharacteristicLeft[i + 1]), 0);
1152
7.09k
        if (err) return err;
1153
7.09k
      }
1154
2.16k
    }
1155
27.5k
    drcCharacteristicRightPresent = FDKreadBits(hBs, 1);
1156
27.5k
    if (drcCharacteristicRightPresent) {
1157
2.22k
      pCoef->characteristicRightCount = FDKreadBits(hBs, 4);
1158
2.22k
      if ((pCoef->characteristicRightCount + 1) > 16) return DE_MEMORY_ERROR;
1159
9.10k
      for (i = 0; i < pCoef->characteristicRightCount; i++) {
1160
6.88k
        err = _readCustomDrcCharacteristic(
1161
6.88k
            hBs, CS_RIGHT, &(pCoef->characteristicRightFormat[i + 1]),
1162
6.88k
            &(pCoef->customCharacteristicRight[i + 1]), 0);
1163
6.88k
        if (err) return err;
1164
6.88k
      }
1165
2.22k
    }
1166
27.5k
    shapeFiltersPresent = FDKreadBits(hBs, 1);
1167
27.5k
    if (shapeFiltersPresent) {
1168
3.97k
      shapeFilterCount = FDKreadBits(hBs, 4);
1169
28.0k
      for (i = 0; i < shapeFilterCount; i++) {
1170
24.0k
        tmpPresent = FDKreadBits(hBs, 1);
1171
24.0k
        if (tmpPresent) /* lfCutParams */
1172
5.38k
          FDKpushFor(hBs, 5);
1173
1174
24.0k
        tmpPresent = FDKreadBits(hBs, 1);
1175
24.0k
        if (tmpPresent) /* lfBoostParams */
1176
5.71k
          FDKpushFor(hBs, 5);
1177
1178
24.0k
        tmpPresent = FDKreadBits(hBs, 1);
1179
24.0k
        if (tmpPresent) /* hfCutParams */
1180
5.49k
          FDKpushFor(hBs, 5);
1181
1182
24.0k
        tmpPresent = FDKreadBits(hBs, 1);
1183
24.0k
        if (tmpPresent) /* hfBoostParams */
1184
4.26k
          FDKpushFor(hBs, 5);
1185
24.0k
      }
1186
3.97k
    }
1187
27.5k
    pCoef->gainSequenceCount = FDKreadBits(hBs, 6);
1188
27.5k
    gainSetCount = FDKreadBits(hBs, 6);
1189
27.5k
    pCoef->gainSetCount = fMin(gainSetCount, 12);
1190
82.2k
    for (i = 0; i < gainSetCount; i++) {
1191
54.7k
      GAIN_SET tmpGset;
1192
54.7k
      FDKmemclear(&tmpGset, sizeof(GAIN_SET));
1193
54.7k
      err = _readGainSet(hBs, version, &gainSequenceIndex, &tmpGset, 0);
1194
54.7k
      if (err) return err;
1195
1196
54.6k
      if (i >= 12) continue;
1197
24.7k
      pCoef->gainSet[i] = tmpGset;
1198
24.7k
    }
1199
27.5k
  }
1200
1.00M
  for (i = 0; i < 12; i++) {
1201
924k
    pCoef->gainSetIndexForGainSequence[i] = 255;
1202
924k
  }
1203
111k
  for (i = 0; i < pCoef->gainSetCount; i++) {
1204
34.7k
    int b;
1205
49.8k
    for (b = 0; b < pCoef->gainSet[i].bandCount; b++) {
1206
15.0k
      if (pCoef->gainSet[i].gainSequenceIndex[b] >= 12) continue;
1207
11.3k
      pCoef->gainSetIndexForGainSequence[pCoef->gainSet[i]
1208
11.3k
                                             .gainSequenceIndex[b]] = i;
1209
11.3k
    }
1210
34.7k
  }
1211
1212
77.0k
  return err;
1213
77.2k
}
1214
1215
19.7k
static void _skipDrcInstructionsBasic(HANDLE_FDK_BITSTREAM hBs) {
1216
19.7k
  int drcSetEffect;
1217
19.7k
  int additionalDownmixIdPresent, additionalDownmixIdCount,
1218
19.7k
      limiterPeakTargetPresent;
1219
19.7k
  int drcSetTargetLoudnessPresent, drcSetTargetLoudnessValueLowerPresent;
1220
1221
19.7k
  FDKpushFor(hBs, 6); /* drcSetId */
1222
19.7k
  FDKpushFor(hBs, 4); /* drcLocation */
1223
19.7k
  FDKpushFor(hBs, 7); /* downmixId */
1224
19.7k
  additionalDownmixIdPresent = FDKreadBits(hBs, 1);
1225
19.7k
  if (additionalDownmixIdPresent) {
1226
2.11k
    additionalDownmixIdCount = FDKreadBits(hBs, 3);
1227
2.11k
    FDKpushFor(hBs, 7 * additionalDownmixIdCount); /* additionalDownmixId */
1228
2.11k
  }
1229
1230
19.7k
  drcSetEffect = FDKreadBits(hBs, 16);
1231
19.7k
  if (!(drcSetEffect & (EB_DUCK_OTHER | EB_DUCK_SELF))) {
1232
18.1k
    limiterPeakTargetPresent = FDKreadBits(hBs, 1);
1233
18.1k
    if (limiterPeakTargetPresent) {
1234
1.34k
      FDKpushFor(hBs, 8); /* bsLimiterPeakTarget */
1235
1.34k
    }
1236
18.1k
  }
1237
1238
19.7k
  drcSetTargetLoudnessPresent = FDKreadBits(hBs, 1);
1239
19.7k
  if (drcSetTargetLoudnessPresent) {
1240
1.82k
    FDKpushFor(hBs, 6); /* bsDrcSetTargetLoudnessValueUpper */
1241
1.82k
    drcSetTargetLoudnessValueLowerPresent = FDKreadBits(hBs, 1);
1242
1.82k
    if (drcSetTargetLoudnessValueLowerPresent) {
1243
861
      FDKpushFor(hBs, 6); /* bsDrcSetTargetLoudnessValueLower */
1244
861
    }
1245
1.82k
  }
1246
19.7k
}
1247
1248
static DRC_ERROR _readDrcInstructionsUniDrc(HANDLE_FDK_BITSTREAM hBs,
1249
                                            const int version,
1250
                                            HANDLE_UNI_DRC_CONFIG hUniDrcConfig,
1251
739k
                                            DRC_INSTRUCTIONS_UNI_DRC* pInst) {
1252
739k
  DRC_ERROR err = DE_OK;
1253
739k
  int i, g, c;
1254
739k
  int downmixIdPresent, additionalDownmixIdPresent, additionalDownmixIdCount;
1255
739k
  int bsLimiterPeakTarget, channelCount;
1256
739k
  DRC_COEFFICIENTS_UNI_DRC* pCoef = NULL;
1257
739k
  int repeatParameters, bsRepeatParametersCount;
1258
739k
  int repeatSequenceIndex, bsRepeatSequenceCount;
1259
739k
  SCHAR* gainSetIndex = pInst->gainSetIndex;
1260
739k
  SCHAR channelGroupForChannel[8];
1261
739k
  DUCKING_MODIFICATION duckingModificationForChannelGroup[8];
1262
1263
739k
  pInst->drcSetId = FDKreadBits(hBs, 6);
1264
739k
  if (version == 0) {
1265
    /* Assume all v0 DRC sets to be manageable in terms of complexity */
1266
673k
    pInst->drcSetComplexityLevel = 2;
1267
673k
  } else {
1268
66.1k
    pInst->drcSetComplexityLevel = FDKreadBits(hBs, 4);
1269
66.1k
  }
1270
739k
  pInst->drcLocation = FDKreadBits(hBs, 4);
1271
739k
  if (version == 0) {
1272
673k
    downmixIdPresent = 1;
1273
673k
  } else {
1274
66.1k
    downmixIdPresent = FDKreadBits(hBs, 1);
1275
66.1k
  }
1276
739k
  if (downmixIdPresent) {
1277
675k
    pInst->downmixId[0] = FDKreadBits(hBs, 7);
1278
675k
    if (version == 0) {
1279
673k
      if (pInst->downmixId[0] == 0)
1280
663k
        pInst->drcApplyToDownmix = 0;
1281
9.64k
      else
1282
9.64k
        pInst->drcApplyToDownmix = 1;
1283
673k
    } else {
1284
1.96k
      pInst->drcApplyToDownmix = FDKreadBits(hBs, 1);
1285
1.96k
    }
1286
1287
675k
    additionalDownmixIdPresent = FDKreadBits(hBs, 1);
1288
675k
    if (additionalDownmixIdPresent) {
1289
7.31k
      additionalDownmixIdCount = FDKreadBits(hBs, 3);
1290
7.31k
      if ((1 + additionalDownmixIdCount) > 8) return DE_MEMORY_ERROR;
1291
28.0k
      for (i = 0; i < additionalDownmixIdCount; i++) {
1292
20.7k
        pInst->downmixId[i + 1] = FDKreadBits(hBs, 7);
1293
20.7k
      }
1294
7.31k
      pInst->downmixIdCount = 1 + additionalDownmixIdCount;
1295
668k
    } else {
1296
668k
      pInst->downmixIdCount = 1;
1297
668k
    }
1298
675k
  } else {
1299
64.1k
    pInst->downmixId[0] = 0;
1300
64.1k
    pInst->downmixIdCount = 1;
1301
64.1k
  }
1302
1303
739k
  pInst->drcSetEffect = FDKreadBits(hBs, 16);
1304
1305
739k
  if ((pInst->drcSetEffect & (EB_DUCK_OTHER | EB_DUCK_SELF)) == 0) {
1306
733k
    pInst->limiterPeakTargetPresent = FDKreadBits(hBs, 1);
1307
733k
    if (pInst->limiterPeakTargetPresent) {
1308
2.02k
      bsLimiterPeakTarget = FDKreadBits(hBs, 8);
1309
2.02k
      pInst->limiterPeakTarget = -(FIXP_SGL)(
1310
2.02k
          bsLimiterPeakTarget
1311
2.02k
          << (FRACT_BITS - 1 - 3 - 5)); /* - bsLimiterPeakTarget * 0.125; */
1312
2.02k
    }
1313
733k
  }
1314
1315
739k
  pInst->drcSetTargetLoudnessPresent = FDKreadBits(hBs, 1);
1316
1317
  /* set default values */
1318
739k
  pInst->drcSetTargetLoudnessValueUpper = 0;
1319
739k
  pInst->drcSetTargetLoudnessValueLower = -63;
1320
1321
739k
  if (pInst->drcSetTargetLoudnessPresent == 1) {
1322
4.35k
    int bsDrcSetTargetLoudnessValueUpper, bsDrcSetTargetLoudnessValueLower;
1323
4.35k
    int drcSetTargetLoudnessValueLowerPresent;
1324
4.35k
    bsDrcSetTargetLoudnessValueUpper = FDKreadBits(hBs, 6);
1325
4.35k
    pInst->drcSetTargetLoudnessValueUpper =
1326
4.35k
        bsDrcSetTargetLoudnessValueUpper - 63;
1327
4.35k
    drcSetTargetLoudnessValueLowerPresent = FDKreadBits(hBs, 1);
1328
4.35k
    if (drcSetTargetLoudnessValueLowerPresent == 1) {
1329
1.68k
      bsDrcSetTargetLoudnessValueLower = FDKreadBits(hBs, 6);
1330
1.68k
      pInst->drcSetTargetLoudnessValueLower =
1331
1.68k
          bsDrcSetTargetLoudnessValueLower - 63;
1332
1.68k
    }
1333
4.35k
  }
1334
1335
739k
  pInst->dependsOnDrcSetPresent = FDKreadBits(hBs, 1);
1336
1337
739k
  pInst->noIndependentUse = 0;
1338
739k
  if (pInst->dependsOnDrcSetPresent) {
1339
4.15k
    pInst->dependsOnDrcSet = FDKreadBits(hBs, 6);
1340
735k
  } else {
1341
735k
    pInst->noIndependentUse = FDKreadBits(hBs, 1);
1342
735k
  }
1343
1344
739k
  if (version == 0) {
1345
673k
    pInst->requiresEq = 0;
1346
673k
  } else {
1347
66.1k
    pInst->requiresEq = FDKreadBits(hBs, 1);
1348
66.1k
  }
1349
1350
739k
  pCoef = selectDrcCoefficients(hUniDrcConfig, pInst->drcLocation);
1351
1352
739k
  pInst->drcChannelCount = channelCount =
1353
739k
      hUniDrcConfig->channelLayout.baseChannelCount;
1354
1355
739k
  if (pInst->drcSetEffect & (EB_DUCK_OTHER | EB_DUCK_SELF)) {
1356
6.52k
    DUCKING_MODIFICATION* pDModForChannel =
1357
6.52k
        pInst->duckingModificationForChannel;
1358
6.52k
    c = 0;
1359
20.1k
    while (c < channelCount) {
1360
13.9k
      int bsGainSetIndex;
1361
13.9k
      bsGainSetIndex = FDKreadBits(hBs, 6);
1362
13.9k
      if (c >= 8) return DE_MEMORY_ERROR;
1363
13.9k
      gainSetIndex[c] = bsGainSetIndex - 1;
1364
13.9k
      _decodeDuckingModification(hBs, &(pDModForChannel[c]), 0);
1365
1366
13.9k
      c++;
1367
13.9k
      repeatParameters = FDKreadBits(hBs, 1);
1368
13.9k
      if (repeatParameters == 1) {
1369
1.43k
        bsRepeatParametersCount = FDKreadBits(hBs, 5);
1370
1.43k
        bsRepeatParametersCount += 1;
1371
6.85k
        for (i = 0; i < bsRepeatParametersCount; i++) {
1372
5.74k
          if (c >= 8) return DE_MEMORY_ERROR;
1373
5.41k
          gainSetIndex[c] = gainSetIndex[c - 1];
1374
5.41k
          pDModForChannel[c] = pDModForChannel[c - 1];
1375
5.41k
          c++;
1376
5.41k
        }
1377
1.43k
      }
1378
13.9k
    }
1379
6.20k
    if (c > channelCount) {
1380
85
      return DE_NOT_OK;
1381
85
    }
1382
1383
6.11k
    err = deriveDrcChannelGroups(
1384
6.11k
        pInst->drcSetEffect, pInst->drcChannelCount, gainSetIndex,
1385
6.11k
        pDModForChannel, &pInst->nDrcChannelGroups,
1386
6.11k
        pInst->gainSetIndexForChannelGroup, channelGroupForChannel,
1387
6.11k
        duckingModificationForChannelGroup);
1388
6.11k
    if (err) return (err);
1389
733k
  } else {
1390
733k
    int deriveChannelCount = 0;
1391
733k
    if (((version == 0) || (pInst->drcApplyToDownmix != 0)) &&
1392
668k
        (pInst->downmixId[0] != DOWNMIX_ID_BASE_LAYOUT) &&
1393
6.25k
        (pInst->downmixId[0] != DOWNMIX_ID_ANY_DOWNMIX) &&
1394
5.78k
        (pInst->downmixIdCount == 1)) {
1395
2.22k
      if (hUniDrcConfig->downmixInstructionsCount != 0) {
1396
819
        DOWNMIX_INSTRUCTIONS* pDown =
1397
819
            selectDownmixInstructions(hUniDrcConfig, pInst->downmixId[0]);
1398
819
        if (pDown == NULL) return DE_NOT_OK;
1399
521
        pInst->drcChannelCount = channelCount =
1400
521
            pDown->targetChannelCount; /* targetChannelCountFromDownmixId*/
1401
1.40k
      } else {
1402
1.40k
        deriveChannelCount = 1;
1403
1.40k
        channelCount = 1;
1404
1.40k
      }
1405
731k
    } else if (((version == 0) || (pInst->drcApplyToDownmix != 0)) &&
1406
666k
               ((pInst->downmixId[0] == DOWNMIX_ID_ANY_DOWNMIX) ||
1407
666k
                (pInst->downmixIdCount > 1))) {
1408
      /* Set maximum channel count as upper border. The effective channel count
1409
       * is set at the process function. */
1410
4.08k
      pInst->drcChannelCount = 8;
1411
4.08k
      channelCount = 1;
1412
4.08k
    }
1413
1414
732k
    c = 0;
1415
5.86M
    while (c < channelCount) {
1416
5.12M
      int bsGainSetIndex;
1417
5.12M
      bsGainSetIndex = FDKreadBits(hBs, 6);
1418
5.12M
      if (c >= 8) return DE_MEMORY_ERROR;
1419
5.12M
      gainSetIndex[c] = bsGainSetIndex - 1;
1420
5.12M
      c++;
1421
5.12M
      repeatSequenceIndex = FDKreadBits(hBs, 1);
1422
1423
5.12M
      if (repeatSequenceIndex == 1) {
1424
5.59k
        bsRepeatSequenceCount = FDKreadBits(hBs, 5);
1425
5.59k
        bsRepeatSequenceCount += 1;
1426
5.59k
        if (deriveChannelCount) {
1427
633
          channelCount = 1 + bsRepeatSequenceCount;
1428
633
        }
1429
26.3k
        for (i = 0; i < bsRepeatSequenceCount; i++) {
1430
21.1k
          if (c >= 8) return DE_MEMORY_ERROR;
1431
20.7k
          gainSetIndex[c] = bsGainSetIndex - 1;
1432
20.7k
          c++;
1433
20.7k
        }
1434
5.59k
      }
1435
5.12M
    }
1436
732k
    if (c > channelCount) {
1437
89
      return DE_NOT_OK;
1438
89
    }
1439
732k
    if (deriveChannelCount) {
1440
1.34k
      pInst->drcChannelCount = channelCount;
1441
1.34k
    }
1442
1443
    /* DOWNMIX_ID_ANY_DOWNMIX: channelCount is 1. Distribute gainSetIndex to all
1444
     * channels. */
1445
732k
    if ((pInst->downmixId[0] == DOWNMIX_ID_ANY_DOWNMIX) ||
1446
731k
        (pInst->downmixIdCount > 1)) {
1447
32.5k
      for (c = 1; c < pInst->drcChannelCount; c++) {
1448
28.1k
        gainSetIndex[c] = gainSetIndex[0];
1449
28.1k
      }
1450
4.40k
    }
1451
1452
732k
    err = deriveDrcChannelGroups(pInst->drcSetEffect, pInst->drcChannelCount,
1453
732k
                                 gainSetIndex, NULL, &pInst->nDrcChannelGroups,
1454
732k
                                 pInst->gainSetIndexForChannelGroup,
1455
732k
                                 channelGroupForChannel, NULL);
1456
732k
    if (err) return (err);
1457
1458
764k
    for (g = 0; g < pInst->nDrcChannelGroups; g++) {
1459
32.5k
      int set, bandCount;
1460
32.5k
      set = pInst->gainSetIndexForChannelGroup[g];
1461
1462
      /* get bandCount */
1463
32.5k
      if (pCoef != NULL && set < pCoef->gainSetCount) {
1464
1.11k
        bandCount = pCoef->gainSet[set].bandCount;
1465
31.4k
      } else {
1466
31.4k
        bandCount = 1;
1467
31.4k
      }
1468
1469
32.5k
      _decodeGainModification(hBs, version, bandCount,
1470
32.5k
                              pInst->gainModificationForChannelGroup[g], 0);
1471
32.5k
    }
1472
732k
  }
1473
1474
737k
  return err;
1475
739k
}
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.8k
  pChan->layoutSignalingPresent = FDKreadBits(hBs, 1);
1486
1487
31.8k
  if (pChan->layoutSignalingPresent) {
1488
6.92k
    pChan->definedLayout = FDKreadBits(hBs, 8);
1489
1490
6.92k
    if (pChan->definedLayout == 0) {
1491
578
      int i;
1492
3.09k
      for (i = 0; i < pChan->baseChannelCount; i++) {
1493
2.52k
        if (i < 8) {
1494
2.52k
          pChan->speakerPosition[i] = FDKreadBits(hBs, 7);
1495
2.52k
        } else {
1496
0
          FDKpushFor(hBs, 7);
1497
0
        }
1498
2.52k
      }
1499
578
    }
1500
6.92k
  }
1501
31.8k
  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.19M
                                          DOWNMIX_INSTRUCTIONS* pDown) {
1508
1.19M
  DRC_ERROR err = DE_OK;
1509
1510
1.19M
  pDown->downmixId = FDKreadBits(hBs, 7);
1511
1.19M
  pDown->targetChannelCount = FDKreadBits(hBs, 7);
1512
1.19M
  pDown->targetLayout = FDKreadBits(hBs, 8);
1513
1.19M
  pDown->downmixCoefficientsPresent = FDKreadBits(hBs, 1);
1514
1515
1.19M
  if (pDown->downmixCoefficientsPresent) {
1516
5.47k
    int nDownmixCoeffs = pDown->targetChannelCount * pChan->baseChannelCount;
1517
5.47k
    int i;
1518
5.47k
    if (nDownmixCoeffs > 8 * 8) return DE_NOT_OK;
1519
5.27k
    if (version == 0) {
1520
2.76k
      pDown->bsDownmixOffset = 0;
1521
21.0k
      for (i = 0; i < nDownmixCoeffs; i++) {
1522
        /* LFE downmix coefficients are not supported. */
1523
18.3k
        pDown->downmixCoefficient[i] = downmixCoeff[FDKreadBits(hBs, 4)];
1524
18.3k
      }
1525
2.76k
    } else {
1526
2.50k
      pDown->bsDownmixOffset = FDKreadBits(hBs, 4);
1527
6.42k
      for (i = 0; i < nDownmixCoeffs; i++) {
1528
3.91k
        pDown->downmixCoefficient[i] = downmixCoeffV1[FDKreadBits(hBs, 5)];
1529
3.91k
      }
1530
2.50k
    }
1531
5.27k
  }
1532
1.19M
  return err;
1533
1.19M
}
1534
1535
static DRC_ERROR _readDrcExtensionV1(HANDLE_FDK_BITSTREAM hBs,
1536
21.0k
                                     HANDLE_UNI_DRC_CONFIG hUniDrcConfig) {
1537
21.0k
  DRC_ERROR err = DE_OK;
1538
21.0k
  int downmixInstructionsV1Present;
1539
21.0k
  int drcCoeffsAndInstructionsUniDrcV1Present;
1540
21.0k
  int loudEqInstructionsPresent, loudEqInstructionsCount;
1541
21.0k
  int eqPresent, eqInstructionsCount;
1542
21.0k
  int i, offset;
1543
21.0k
  int diff = hUniDrcConfig->diff;
1544
1545
21.0k
  downmixInstructionsV1Present = FDKreadBits(hBs, 1);
1546
21.0k
  if (downmixInstructionsV1Present == 1) {
1547
3.25k
    diff |= _compAssign(&hUniDrcConfig->downmixInstructionsCountV1,
1548
3.25k
                        FDKreadBits(hBs, 7));
1549
3.25k
    offset = hUniDrcConfig->downmixInstructionsCountV0;
1550
3.25k
    hUniDrcConfig->downmixInstructionsCount = fMin(
1551
3.25k
        (UCHAR)(offset + hUniDrcConfig->downmixInstructionsCountV1), (UCHAR)6);
1552
38.3k
    for (i = 0; i < hUniDrcConfig->downmixInstructionsCountV1; i++) {
1553
35.1k
      DOWNMIX_INSTRUCTIONS tmpDown;
1554
35.1k
      FDKmemclear(&tmpDown, sizeof(DOWNMIX_INSTRUCTIONS));
1555
35.1k
      err = _readDownmixInstructions(hBs, 1, &hUniDrcConfig->channelLayout,
1556
35.1k
                                     &tmpDown);
1557
35.1k
      if (err) return err;
1558
35.1k
      if ((offset + i) >= 6) continue;
1559
8.25k
      if (!diff)
1560
235
        diff |= (FDKmemcmp(&tmpDown,
1561
235
                           &(hUniDrcConfig->downmixInstructions[offset + i]),
1562
235
                           sizeof(DOWNMIX_INSTRUCTIONS)) != 0);
1563
8.25k
      hUniDrcConfig->downmixInstructions[offset + i] = tmpDown;
1564
8.25k
    }
1565
17.8k
  } else {
1566
17.8k
    diff |= _compAssign(&hUniDrcConfig->downmixInstructionsCountV1, 0);
1567
17.8k
  }
1568
1569
21.0k
  drcCoeffsAndInstructionsUniDrcV1Present = FDKreadBits(hBs, 1);
1570
21.0k
  if (drcCoeffsAndInstructionsUniDrcV1Present == 1) {
1571
10.1k
    diff |= _compAssign(&hUniDrcConfig->drcCoefficientsUniDrcCountV1,
1572
10.1k
                        FDKreadBits(hBs, 3));
1573
10.1k
    offset = hUniDrcConfig->drcCoefficientsUniDrcCountV0;
1574
10.1k
    hUniDrcConfig->drcCoefficientsUniDrcCount =
1575
10.1k
        fMin((UCHAR)(offset + hUniDrcConfig->drcCoefficientsUniDrcCountV1),
1576
10.1k
             (UCHAR)2);
1577
37.6k
    for (i = 0; i < hUniDrcConfig->drcCoefficientsUniDrcCountV1; i++) {
1578
27.5k
      DRC_COEFFICIENTS_UNI_DRC tmpCoef;
1579
27.5k
      FDKmemclear(&tmpCoef, sizeof(DRC_COEFFICIENTS_UNI_DRC));
1580
27.5k
      err = _readDrcCoefficientsUniDrc(hBs, 1, &tmpCoef);
1581
27.5k
      if (err) return err;
1582
27.4k
      if ((offset + i) >= 2) continue;
1583
6.85k
      if (!diff)
1584
283
        diff |= (FDKmemcmp(&tmpCoef,
1585
283
                           &(hUniDrcConfig->drcCoefficientsUniDrc[offset + i]),
1586
283
                           sizeof(DRC_COEFFICIENTS_UNI_DRC)) != 0);
1587
6.85k
      hUniDrcConfig->drcCoefficientsUniDrc[offset + i] = tmpCoef;
1588
6.85k
    }
1589
1590
10.0k
    diff |= _compAssign(&hUniDrcConfig->drcInstructionsUniDrcCountV1,
1591
10.0k
                        FDKreadBits(hBs, 6));
1592
10.0k
    offset = hUniDrcConfig->drcInstructionsUniDrcCount;
1593
10.0k
    hUniDrcConfig->drcInstructionsUniDrcCount =
1594
10.0k
        fMin((UCHAR)(offset + hUniDrcConfig->drcInstructionsUniDrcCountV1),
1595
10.0k
             (UCHAR)12);
1596
75.8k
    for (i = 0; i < hUniDrcConfig->drcInstructionsUniDrcCount; i++) {
1597
66.1k
      DRC_INSTRUCTIONS_UNI_DRC tmpInst;
1598
66.1k
      FDKmemclear(&tmpInst, sizeof(DRC_INSTRUCTIONS_UNI_DRC));
1599
66.1k
      err = _readDrcInstructionsUniDrc(hBs, 1, hUniDrcConfig, &tmpInst);
1600
66.1k
      if (err) return err;
1601
65.7k
      if ((offset + i) >= 12) continue;
1602
21.3k
      if (!diff)
1603
469
        diff |= (FDKmemcmp(&tmpInst,
1604
469
                           &(hUniDrcConfig->drcInstructionsUniDrc[offset + i]),
1605
469
                           sizeof(DRC_INSTRUCTIONS_UNI_DRC)) != 0);
1606
21.3k
      hUniDrcConfig->drcInstructionsUniDrc[offset + i] = tmpInst;
1607
21.3k
    }
1608
10.8k
  } else {
1609
10.8k
    diff |= _compAssign(&hUniDrcConfig->drcCoefficientsUniDrcCountV1, 0);
1610
10.8k
    diff |= _compAssign(&hUniDrcConfig->drcInstructionsUniDrcCountV1, 0);
1611
10.8k
  }
1612
1613
20.5k
  loudEqInstructionsPresent = FDKreadBits(hBs, 1);
1614
20.5k
  if (loudEqInstructionsPresent == 1) {
1615
4.16k
    loudEqInstructionsCount = FDKreadBits(hBs, 4);
1616
24.7k
    for (i = 0; i < loudEqInstructionsCount; i++) {
1617
20.6k
      _skipLoudEqInstructions(hBs);
1618
20.6k
    }
1619
4.16k
  }
1620
1621
20.5k
  eqPresent = FDKreadBits(hBs, 1);
1622
20.5k
  if (eqPresent == 1) {
1623
6.71k
    _skipEqCoefficients(hBs);
1624
6.71k
    eqInstructionsCount = FDKreadBits(hBs, 4);
1625
39.3k
    for (i = 0; i < eqInstructionsCount; i++) {
1626
32.6k
      _skipEqInstructions(hBs, hUniDrcConfig);
1627
32.6k
    }
1628
6.71k
  }
1629
1630
20.5k
  hUniDrcConfig->diff = diff;
1631
1632
20.5k
  return err;
1633
21.0k
}
1634
1635
static DRC_ERROR _readUniDrcConfigExtension(
1636
18.9k
    HANDLE_FDK_BITSTREAM hBs, HANDLE_UNI_DRC_CONFIG hUniDrcConfig) {
1637
18.9k
  DRC_ERROR err = DE_OK;
1638
18.9k
  int k, bitSizeLen, extSizeBits, bitSize;
1639
18.9k
  INT nBitsRemaining;
1640
18.9k
  UNI_DRC_CONFIG_EXTENSION* pExt = &(hUniDrcConfig->uniDrcConfigExt);
1641
1642
18.9k
  k = 0;
1643
18.9k
  pExt->uniDrcConfigExtType[k] = FDKreadBits(hBs, 4);
1644
38.0k
  while (pExt->uniDrcConfigExtType[k] != UNIDRCCONFEXT_TERM) {
1645
37.1k
    if (k >= (8 - 1)) return DE_MEMORY_ERROR;
1646
36.4k
    bitSizeLen = FDKreadBits(hBs, 4);
1647
36.4k
    extSizeBits = bitSizeLen + 4;
1648
1649
36.4k
    bitSize = FDKreadBits(hBs, extSizeBits);
1650
36.4k
    pExt->extBitSize[k] = bitSize + 1;
1651
36.4k
    nBitsRemaining = (INT)FDKgetValidBits(hBs);
1652
1653
36.4k
    switch (pExt->uniDrcConfigExtType[k]) {
1654
21.0k
      case UNIDRCCONFEXT_V1:
1655
21.0k
        err = _readDrcExtensionV1(hBs, hUniDrcConfig);
1656
21.0k
        if (err) return err;
1657
20.5k
        if (nBitsRemaining !=
1658
20.5k
            ((INT)pExt->extBitSize[k] + (INT)FDKgetValidBits(hBs)))
1659
16.8k
          return DE_NOT_OK;
1660
3.70k
        break;
1661
3.70k
      case UNIDRCCONFEXT_PARAM_DRC:
1662
      /* add future extensions here */
1663
15.3k
      default:
1664
15.3k
        FDKpushFor(hBs, pExt->extBitSize[k]);
1665
15.3k
        break;
1666
36.4k
    }
1667
19.0k
    k++;
1668
19.0k
    pExt->uniDrcConfigExtType[k] = FDKreadBits(hBs, 4);
1669
19.0k
  }
1670
1671
924
  return err;
1672
18.9k
}
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
1.07k
    diff |=
1689
1.07k
        _compAssign(&hUniDrcConfig->sampleRate, FDKreadBits(hBs, 18) + 1000);
1690
1.07k
  }
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.45k
    drcCoefficientsBasicCount = FDKreadBits(hBs, 3);
1698
2.45k
    drcInstructionsBasicCount = FDKreadBits(hBs, 4);
1699
29.6k
  } else {
1700
29.6k
    drcCoefficientsBasicCount = 0;
1701
29.6k
    drcInstructionsBasicCount = 0;
1702
29.6k
  }
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.8k
  if (!diff)
1713
16.4k
    diff |= (FDKmemcmp(&tmpChan, &hUniDrcConfig->channelLayout,
1714
16.4k
                       sizeof(CHANNEL_LAYOUT)) != 0);
1715
31.8k
  hUniDrcConfig->channelLayout = tmpChan;
1716
1717
31.8k
  hUniDrcConfig->downmixInstructionsCount =
1718
31.8k
      fMin(hUniDrcConfig->downmixInstructionsCountV0, (UCHAR)6);
1719
1.18M
  for (i = 0; i < hUniDrcConfig->downmixInstructionsCountV0; i++) {
1720
1.15M
    DOWNMIX_INSTRUCTIONS tmpDown;
1721
1.15M
    FDKmemclear(&tmpDown, sizeof(DOWNMIX_INSTRUCTIONS));
1722
1.15M
    err = _readDownmixInstructions(hBs, 0, &hUniDrcConfig->channelLayout,
1723
1.15M
                                   &tmpDown);
1724
1.15M
    if (err) return err;
1725
1.15M
    if (i >= 6) continue;
1726
67.8k
    if (!diff)
1727
11.1k
      diff |= (FDKmemcmp(&tmpDown, &(hUniDrcConfig->downmixInstructions[i]),
1728
11.1k
                         sizeof(DOWNMIX_INSTRUCTIONS)) != 0);
1729
67.8k
    hUniDrcConfig->downmixInstructions[i] = tmpDown;
1730
67.8k
  }
1731
1732
35.8k
  for (i = 0; i < drcCoefficientsBasicCount; i++) {
1733
4.08k
    _skipDrcCoefficientsBasic(hBs);
1734
4.08k
  }
1735
51.5k
  for (i = 0; i < drcInstructionsBasicCount; i++) {
1736
19.7k
    _skipDrcInstructionsBasic(hBs);
1737
19.7k
  }
1738
1739
31.7k
  hUniDrcConfig->drcCoefficientsUniDrcCount =
1740
31.7k
      fMin(hUniDrcConfig->drcCoefficientsUniDrcCountV0, (UCHAR)2);
1741
81.3k
  for (i = 0; i < hUniDrcConfig->drcCoefficientsUniDrcCountV0; i++) {
1742
49.7k
    DRC_COEFFICIENTS_UNI_DRC tmpCoef;
1743
49.7k
    FDKmemclear(&tmpCoef, sizeof(DRC_COEFFICIENTS_UNI_DRC));
1744
49.7k
    err = _readDrcCoefficientsUniDrc(hBs, 0, &tmpCoef);
1745
49.7k
    if (err) return err;
1746
49.5k
    if (i >= 2) continue;
1747
20.0k
    if (!diff)
1748
5.07k
      diff |= (FDKmemcmp(&tmpCoef, &(hUniDrcConfig->drcCoefficientsUniDrc[i]),
1749
5.07k
                         sizeof(DRC_COEFFICIENTS_UNI_DRC)) != 0);
1750
20.0k
    hUniDrcConfig->drcCoefficientsUniDrc[i] = tmpCoef;
1751
20.0k
  }
1752
1753
31.6k
  hUniDrcConfig->drcInstructionsUniDrcCount =
1754
31.6k
      fMin(hUniDrcConfig->drcInstructionsUniDrcCountV0, (UCHAR)12);
1755
703k
  for (i = 0; i < hUniDrcConfig->drcInstructionsUniDrcCountV0; i++) {
1756
673k
    DRC_INSTRUCTIONS_UNI_DRC tmpInst;
1757
673k
    FDKmemclear(&tmpInst, sizeof(DRC_INSTRUCTIONS_UNI_DRC));
1758
673k
    err = _readDrcInstructionsUniDrc(hBs, 0, hUniDrcConfig, &tmpInst);
1759
673k
    if (err) return err;
1760
671k
    if (i >= 12) continue;
1761
164k
    if (!diff)
1762
35.1k
      diff |= (FDKmemcmp(&tmpInst, &(hUniDrcConfig->drcInstructionsUniDrc[i]),
1763
35.1k
                         sizeof(DRC_INSTRUCTIONS_UNI_DRC)) != 0);
1764
164k
    hUniDrcConfig->drcInstructionsUniDrc[i] = tmpInst;
1765
164k
  }
1766
1767
29.6k
  diff |=
1768
29.6k
      _compAssign(&hUniDrcConfig->uniDrcConfigExtPresent, FDKreadBits(hBs, 1));
1769
29.6k
  hUniDrcConfig->diff = diff;
1770
1771
29.6k
  if (hUniDrcConfig->uniDrcConfigExtPresent == 1) {
1772
18.9k
    err = _readUniDrcConfigExtension(hBs, hUniDrcConfig);
1773
18.9k
    if (err) return err;
1774
18.9k
  }
1775
1776
11.5k
  return err;
1777
29.6k
}
1778
1779
/*******************/
1780
/* loudnessInfoSet */
1781
/*******************/
1782
1783
static DRC_ERROR _decodeMethodValue(HANDLE_FDK_BITSTREAM hBs,
1784
                                    const UCHAR methodDefinition,
1785
6.26k
                                    FIXP_DBL* methodValue, INT isBox) {
1786
6.26k
  int tmp;
1787
6.26k
  FIXP_DBL val;
1788
6.26k
  switch (methodDefinition) {
1789
1.60k
    case MD_UNKNOWN_OTHER:
1790
2.33k
    case MD_PROGRAM_LOUDNESS:
1791
2.78k
    case MD_ANCHOR_LOUDNESS:
1792
2.99k
    case MD_MAX_OF_LOUDNESS_RANGE:
1793
3.29k
    case MD_MOMENTARY_LOUDNESS_MAX:
1794
3.43k
    case MD_SHORT_TERM_LOUDNESS_MAX:
1795
3.43k
      tmp = FDKreadBits(hBs, 8);
1796
3.43k
      val = FL2FXCONST_DBL(-57.75f / (float)(1 << 7)) +
1797
3.43k
            (FIXP_DBL)(
1798
3.43k
                tmp << (DFRACT_BITS - 1 - 2 - 7)); /* -57.75 + tmp * 0.25; */
1799
3.43k
      break;
1800
578
    case MD_LOUDNESS_RANGE:
1801
578
      tmp = FDKreadBits(hBs, 8);
1802
578
      if (tmp == 0)
1803
77
        val = (FIXP_DBL)0;
1804
501
      else if (tmp <= 128)
1805
286
        val = (FIXP_DBL)(tmp << (DFRACT_BITS - 1 - 2 - 7)); /* tmp * 0.25; */
1806
215
      else if (tmp <= 204) {
1807
107
        val = (FIXP_DBL)(tmp << (DFRACT_BITS - 1 - 1 - 7)) -
1808
107
              FL2FXCONST_DBL(32.0f / (float)(1 << 7)); /* 0.5 * tmp - 32.0f; */
1809
108
      } else {
1810
        /* downscale by 1 more bit to prevent overflow at intermediate result */
1811
108
        val = (FIXP_DBL)(tmp << (DFRACT_BITS - 1 - 8)) -
1812
108
              FL2FXCONST_DBL(134.0f / (float)(1 << 8)); /* tmp - 134.0; */
1813
108
        val <<= 1;
1814
108
      }
1815
578
      break;
1816
648
    case MD_MIXING_LEVEL:
1817
648
      tmp = FDKreadBits(hBs, isBox ? 8 : 5);
1818
648
      val = (FIXP_DBL)(tmp << (DFRACT_BITS - 1 - 7)) +
1819
648
            FL2FXCONST_DBL(80.0f / (float)(1 << 7)); /* tmp + 80.0; */
1820
648
      break;
1821
760
    case MD_ROOM_TYPE:
1822
760
      tmp = FDKreadBits(hBs, isBox ? 8 : 2);
1823
760
      val = (FIXP_DBL)(tmp << (DFRACT_BITS - 1 - 7)); /* tmp; */
1824
760
      break;
1825
262
    case MD_SHORT_TERM_LOUDNESS:
1826
262
      tmp = FDKreadBits(hBs, 8);
1827
262
      val = FL2FXCONST_DBL(-116.0f / (float)(1 << 7)) +
1828
262
            (FIXP_DBL)(
1829
262
                tmp << (DFRACT_BITS - 1 - 1 - 7)); /* -116.0 + tmp * 0.5; */
1830
262
      break;
1831
585
    default:
1832
585
      return DE_NOT_OK; /* invalid methodDefinition value */
1833
6.26k
  }
1834
5.67k
  *methodValue = val;
1835
5.67k
  return DE_OK;
1836
6.26k
}
1837
1838
static DRC_ERROR _readLoudnessMeasurement(HANDLE_FDK_BITSTREAM hBs,
1839
6.26k
                                          LOUDNESS_MEASUREMENT* pMeas) {
1840
6.26k
  DRC_ERROR err = DE_OK;
1841
1842
6.26k
  pMeas->methodDefinition = FDKreadBits(hBs, 4);
1843
6.26k
  err =
1844
6.26k
      _decodeMethodValue(hBs, pMeas->methodDefinition, &pMeas->methodValue, 0);
1845
6.26k
  if (err) return err;
1846
5.67k
  pMeas->measurementSystem = FDKreadBits(hBs, 4);
1847
5.67k
  pMeas->reliability = FDKreadBits(hBs, 2);
1848
1849
5.67k
  return err;
1850
6.26k
}
1851
1852
static DRC_ERROR _readLoudnessInfo(HANDLE_FDK_BITSTREAM hBs, const int version,
1853
17.1k
                                   LOUDNESS_INFO* loudnessInfo) {
1854
17.1k
  DRC_ERROR err = DE_OK;
1855
17.1k
  int bsSamplePeakLevel, bsTruePeakLevel, i;
1856
17.1k
  int measurementCount;
1857
1858
17.1k
  loudnessInfo->drcSetId = FDKreadBits(hBs, 6);
1859
17.1k
  if (version >= 1) {
1860
2.86k
    loudnessInfo->eqSetId = FDKreadBits(hBs, 6);
1861
14.2k
  } else {
1862
14.2k
    loudnessInfo->eqSetId = 0;
1863
14.2k
  }
1864
17.1k
  loudnessInfo->downmixId = FDKreadBits(hBs, 7);
1865
1866
17.1k
  loudnessInfo->samplePeakLevelPresent = FDKreadBits(hBs, 1);
1867
17.1k
  if (loudnessInfo->samplePeakLevelPresent) {
1868
1.58k
    bsSamplePeakLevel = FDKreadBits(hBs, 12);
1869
1.58k
    if (bsSamplePeakLevel == 0) {
1870
71
      loudnessInfo->samplePeakLevelPresent = 0;
1871
71
      loudnessInfo->samplePeakLevel = (FIXP_DBL)0;
1872
1.51k
    } else { /* 20.0 - bsSamplePeakLevel * 0.03125; */
1873
1.51k
      loudnessInfo->samplePeakLevel =
1874
1.51k
          FL2FXCONST_DBL(20.0f / (float)(1 << 7)) -
1875
1.51k
          (FIXP_DBL)(bsSamplePeakLevel << (DFRACT_BITS - 1 - 5 - 7));
1876
1.51k
    }
1877
1.58k
  }
1878
1879
17.1k
  loudnessInfo->truePeakLevelPresent = FDKreadBits(hBs, 1);
1880
17.1k
  if (loudnessInfo->truePeakLevelPresent) {
1881
830
    bsTruePeakLevel = FDKreadBits(hBs, 12);
1882
830
    if (bsTruePeakLevel == 0) {
1883
132
      loudnessInfo->truePeakLevelPresent = 0;
1884
132
      loudnessInfo->truePeakLevel = (FIXP_DBL)0;
1885
698
    } else {
1886
698
      loudnessInfo->truePeakLevel =
1887
698
          FL2FXCONST_DBL(20.0f / (float)(1 << 7)) -
1888
698
          (FIXP_DBL)(bsTruePeakLevel << (DFRACT_BITS - 1 - 5 - 7));
1889
698
    }
1890
830
    loudnessInfo->truePeakLevelMeasurementSystem = FDKreadBits(hBs, 4);
1891
830
    loudnessInfo->truePeakLevelReliability = FDKreadBits(hBs, 2);
1892
830
  }
1893
1894
17.1k
  measurementCount = FDKreadBits(hBs, 4);
1895
17.1k
  loudnessInfo->measurementCount = fMin(measurementCount, 8);
1896
22.7k
  for (i = 0; i < measurementCount; i++) {
1897
6.26k
    LOUDNESS_MEASUREMENT tmpMeas;
1898
6.26k
    FDKmemclear(&tmpMeas, sizeof(LOUDNESS_MEASUREMENT));
1899
6.26k
    err = _readLoudnessMeasurement(hBs, &tmpMeas);
1900
6.26k
    if (err) return err;
1901
5.67k
    if (i >= 8) continue;
1902
5.17k
    loudnessInfo->loudnessMeasurement[i] = tmpMeas;
1903
5.17k
  }
1904
1905
16.5k
  return err;
1906
17.1k
}
1907
1908
static DRC_ERROR _readLoudnessInfoSetExtEq(
1909
610
    HANDLE_FDK_BITSTREAM hBs, HANDLE_LOUDNESS_INFO_SET hLoudnessInfoSet) {
1910
610
  DRC_ERROR err = DE_OK;
1911
610
  int i, offset;
1912
610
  int diff = hLoudnessInfoSet->diff;
1913
1914
610
  diff |= _compAssign(&hLoudnessInfoSet->loudnessInfoAlbumCountV1,
1915
610
                      FDKreadBits(hBs, 6));
1916
610
  diff |=
1917
610
      _compAssign(&hLoudnessInfoSet->loudnessInfoCountV1, FDKreadBits(hBs, 6));
1918
1919
610
  offset = hLoudnessInfoSet->loudnessInfoAlbumCountV0;
1920
610
  hLoudnessInfoSet->loudnessInfoAlbumCount = fMin(
1921
610
      (UCHAR)(offset + hLoudnessInfoSet->loudnessInfoAlbumCountV1), (UCHAR)12);
1922
2.14k
  for (i = 0; i < hLoudnessInfoSet->loudnessInfoAlbumCountV1; i++) {
1923
1.57k
    LOUDNESS_INFO tmpLoud;
1924
1.57k
    FDKmemclear(&tmpLoud, sizeof(LOUDNESS_INFO));
1925
1.57k
    err = _readLoudnessInfo(hBs, 1, &tmpLoud);
1926
1.57k
    if (err) return err;
1927
1.53k
    if ((offset + i) >= 12) continue;
1928
651
    if (!diff)
1929
111
      diff |= (FDKmemcmp(&tmpLoud,
1930
111
                         &(hLoudnessInfoSet->loudnessInfoAlbum[offset + i]),
1931
111
                         sizeof(LOUDNESS_INFO)) != 0);
1932
651
    hLoudnessInfoSet->loudnessInfoAlbum[offset + i] = tmpLoud;
1933
651
  }
1934
1935
565
  offset = hLoudnessInfoSet->loudnessInfoCountV0;
1936
565
  hLoudnessInfoSet->loudnessInfoCount =
1937
565
      fMin((UCHAR)(offset + hLoudnessInfoSet->loudnessInfoCountV1), (UCHAR)12);
1938
1.81k
  for (i = 0; i < hLoudnessInfoSet->loudnessInfoCountV1; i++) {
1939
1.28k
    LOUDNESS_INFO tmpLoud;
1940
1.28k
    FDKmemclear(&tmpLoud, sizeof(LOUDNESS_INFO));
1941
1.28k
    err = _readLoudnessInfo(hBs, 1, &tmpLoud);
1942
1.28k
    if (err) return err;
1943
1.24k
    if ((offset + i) >= 12) continue;
1944
571
    if (!diff)
1945
116
      diff |=
1946
116
          (FDKmemcmp(&tmpLoud, &(hLoudnessInfoSet->loudnessInfo[offset + i]),
1947
116
                     sizeof(LOUDNESS_INFO)) != 0);
1948
571
    hLoudnessInfoSet->loudnessInfo[offset + i] = tmpLoud;
1949
571
  }
1950
527
  hLoudnessInfoSet->diff = diff;
1951
527
  return err;
1952
565
}
1953
1954
static DRC_ERROR _readLoudnessInfoSetExtension(
1955
965
    HANDLE_FDK_BITSTREAM hBs, HANDLE_LOUDNESS_INFO_SET hLoudnessInfoSet) {
1956
965
  DRC_ERROR err = DE_OK;
1957
965
  int k, bitSizeLen, extSizeBits, bitSize;
1958
965
  INT nBitsRemaining;
1959
965
  LOUDNESS_INFO_SET_EXTENSION* pExt = &(hLoudnessInfoSet->loudnessInfoSetExt);
1960
1961
965
  k = 0;
1962
965
  pExt->loudnessInfoSetExtType[k] = FDKreadBits(hBs, 4);
1963
1.91k
  while (pExt->loudnessInfoSetExtType[k] != UNIDRCLOUDEXT_TERM) {
1964
1.35k
    if (k >= (8 - 1)) return DE_MEMORY_ERROR;
1965
1.29k
    bitSizeLen = FDKreadBits(hBs, 4);
1966
1.29k
    extSizeBits = bitSizeLen + 4;
1967
1968
1.29k
    bitSize = FDKreadBits(hBs, extSizeBits);
1969
1.29k
    pExt->extBitSize[k] = bitSize + 1;
1970
1.29k
    nBitsRemaining = (INT)FDKgetValidBits(hBs);
1971
1972
1.29k
    switch (pExt->loudnessInfoSetExtType[k]) {
1973
610
      case UNIDRCLOUDEXT_EQ:
1974
610
        err = _readLoudnessInfoSetExtEq(hBs, hLoudnessInfoSet);
1975
610
        if (err) return err;
1976
527
        if (nBitsRemaining !=
1977
527
            ((INT)pExt->extBitSize[k] + (INT)FDKgetValidBits(hBs)))
1978
259
          return DE_NOT_OK;
1979
268
        break;
1980
      /* add future extensions here */
1981
681
      default:
1982
681
        FDKpushFor(hBs, pExt->extBitSize[k]);
1983
681
        break;
1984
1.29k
    }
1985
949
    k++;
1986
949
    pExt->loudnessInfoSetExtType[k] = FDKreadBits(hBs, 4);
1987
949
  }
1988
1989
555
  return err;
1990
965
}
1991
1992
/* Parser for loundessInfoSet() */
1993
DRC_ERROR
1994
drcDec_readLoudnessInfoSet(HANDLE_FDK_BITSTREAM hBs,
1995
5.28k
                           HANDLE_LOUDNESS_INFO_SET hLoudnessInfoSet) {
1996
5.28k
  DRC_ERROR err = DE_OK;
1997
5.28k
  int i, diff = 0;
1998
5.28k
  if (hLoudnessInfoSet == NULL) return DE_NOT_OK;
1999
2000
5.28k
  diff |= _compAssign(&hLoudnessInfoSet->loudnessInfoAlbumCountV0,
2001
5.28k
                      FDKreadBits(hBs, 6));
2002
5.28k
  diff |=
2003
5.28k
      _compAssign(&hLoudnessInfoSet->loudnessInfoCountV0, FDKreadBits(hBs, 6));
2004
2005
5.28k
  hLoudnessInfoSet->loudnessInfoAlbumCount =
2006
5.28k
      fMin(hLoudnessInfoSet->loudnessInfoAlbumCountV0, (UCHAR)12);
2007
10.9k
  for (i = 0; i < hLoudnessInfoSet->loudnessInfoAlbumCountV0; i++) {
2008
5.98k
    LOUDNESS_INFO tmpLoud;
2009
5.98k
    FDKmemclear(&tmpLoud, sizeof(LOUDNESS_INFO));
2010
5.98k
    err = _readLoudnessInfo(hBs, 0, &tmpLoud);
2011
5.98k
    if (err) return err;
2012
5.63k
    if (i >= 12) continue;
2013
2.65k
    if (!diff)
2014
294
      diff |= (FDKmemcmp(&tmpLoud, &(hLoudnessInfoSet->loudnessInfoAlbum[i]),
2015
294
                         sizeof(LOUDNESS_INFO)) != 0);
2016
2.65k
    hLoudnessInfoSet->loudnessInfoAlbum[i] = tmpLoud;
2017
2.65k
  }
2018
2019
4.93k
  hLoudnessInfoSet->loudnessInfoCount =
2020
4.93k
      fMin(hLoudnessInfoSet->loudnessInfoCountV0, (UCHAR)12);
2021
13.0k
  for (i = 0; i < hLoudnessInfoSet->loudnessInfoCountV0; i++) {
2022
8.26k
    LOUDNESS_INFO tmpLoud;
2023
8.26k
    FDKmemclear(&tmpLoud, sizeof(LOUDNESS_INFO));
2024
8.26k
    err = _readLoudnessInfo(hBs, 0, &tmpLoud);
2025
8.26k
    if (err) return err;
2026
8.10k
    if (i >= 12) continue;
2027
5.09k
    if (!diff)
2028
1.68k
      diff |= (FDKmemcmp(&tmpLoud, &(hLoudnessInfoSet->loudnessInfo[i]),
2029
1.68k
                         sizeof(LOUDNESS_INFO)) != 0);
2030
5.09k
    hLoudnessInfoSet->loudnessInfo[i] = tmpLoud;
2031
5.09k
  }
2032
2033
4.78k
  diff |= _compAssign(&hLoudnessInfoSet->loudnessInfoSetExtPresent,
2034
4.78k
                      FDKreadBits(hBs, 1));
2035
4.78k
  hLoudnessInfoSet->diff = diff;
2036
2037
4.78k
  if (hLoudnessInfoSet->loudnessInfoSetExtPresent) {
2038
965
    err = _readLoudnessInfoSetExtension(hBs, hLoudnessInfoSet);
2039
965
    if (err) return err;
2040
965
  }
2041
2042
4.37k
  return err;
2043
4.78k
}