Coverage Report

Created: 2026-09-04 07:02

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/aac/libSBRdec/src/sbrdecoder.cpp
Line
Count
Source
1
/* -----------------------------------------------------------------------------
2
Software License for The Fraunhofer FDK AAC Codec Library for Android
3
4
© Copyright  1995 - 2021 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
/**************************** SBR decoder library ******************************
96
97
   Author(s):
98
99
   Description:
100
101
*******************************************************************************/
102
103
/*!
104
  \file
105
  \brief  SBR decoder frontend
106
  This module provides a frontend to the SBR decoder. The function openSBR() is
107
  called for initialization. The function sbrDecoder_Apply() is called for each
108
  frame. sbr_Apply() will call the required functions to decode the raw SBR data
109
  (provided by env_extr.cpp), to decode the envelope data and noise floor levels
110
  [decodeSbrData()], and to finally apply SBR to the current frame [sbr_dec()].
111
112
  \sa sbrDecoder_Apply(), \ref documentationOverview
113
*/
114
115
/*!
116
  \page documentationOverview Overview of important information resources and
117
  source code documentation
118
119
  As part of this documentation you can find more extensive descriptions about
120
  key concepts and algorithms at the following locations:
121
122
  <h2>Programming</h2>
123
124
  \li Buffer management: sbrDecoder_Apply() and sbr_dec()
125
  \li Internal scale factors to maximize SNR on fixed point processors:
126
  #QMF_SCALE_FACTOR \li Special mantissa-exponent format: Created in
127
  requantizeEnvelopeData() and used in calculateSbrEnvelope()
128
129
  <h2>Algorithmic details</h2>
130
  \li About the SBR data format: \ref SBR_HEADER_ELEMENT and \ref
131
  SBR_STANDARD_ELEMENT \li Details about the bitstream decoder: env_extr.cpp \li
132
  Details about the QMF filterbank and the provided polyphase implementation:
133
  qmf_dec.cpp \li Details about the transposer: lpp_tran.cpp \li Details about
134
  the envelope adjuster: env_calc.cpp
135
136
*/
137
138
#include "sbrdecoder.h"
139
140
#include "FDK_bitstream.h"
141
142
#include "sbrdec_freq_sca.h"
143
#include "env_extr.h"
144
#include "sbr_dec.h"
145
#include "env_dec.h"
146
#include "FDK_crc.h"
147
#include "sbr_ram.h"
148
#include "sbr_rom.h"
149
#include "lpp_tran.h"
150
#include "transcendent.h"
151
152
#include "sbrdec_drc.h"
153
154
#include "psbitdec.h"
155
156
/* Decoder library info */
157
#define SBRDECODER_LIB_VL0 3
158
#define SBRDECODER_LIB_VL1 1
159
#define SBRDECODER_LIB_VL2 0
160
0
#define SBRDECODER_LIB_TITLE "SBR Decoder"
161
#ifdef SUPPRESS_BUILD_DATE_INFO
162
#define SBRDECODER_LIB_BUILD_DATE ""
163
#define SBRDECODER_LIB_BUILD_TIME ""
164
#else
165
0
#define SBRDECODER_LIB_BUILD_DATE __DATE__
166
0
#define SBRDECODER_LIB_BUILD_TIME __TIME__
167
#endif
168
169
387k
static void setFrameErrorFlag(SBR_DECODER_ELEMENT *pSbrElement, UCHAR value) {
170
387k
  if (pSbrElement != NULL) {
171
387k
    switch (value) {
172
94.3k
      case FRAME_ERROR_ALLSLOTS:
173
94.3k
        FDKmemset(pSbrElement->frameErrorFlag, FRAME_ERROR,
174
94.3k
                  sizeof(pSbrElement->frameErrorFlag));
175
94.3k
        break;
176
292k
      default:
177
292k
        pSbrElement->frameErrorFlag[pSbrElement->useFrameSlot] = value;
178
387k
    }
179
387k
  }
180
387k
}
181
182
532k
static UCHAR getHeaderSlot(UCHAR currentSlot, UCHAR hdrSlotUsage[(1) + 1]) {
183
532k
  UINT occupied = 0;
184
532k
  int s;
185
532k
  UCHAR slot = hdrSlotUsage[currentSlot];
186
187
532k
  FDK_ASSERT((1) + 1 < 32);
188
189
1.41M
  for (s = 0; s < (1) + 1; s++) {
190
1.04M
    if ((hdrSlotUsage[s] == slot) && (s != slot)) {
191
156k
      occupied = 1;
192
156k
      break;
193
156k
    }
194
1.04M
  }
195
196
532k
  if (occupied) {
197
156k
    occupied = 0;
198
199
468k
    for (s = 0; s < (1) + 1; s++) {
200
312k
      occupied |= 1 << hdrSlotUsage[s];
201
312k
    }
202
290k
    for (s = 0; s < (1) + 1; s++) {
203
289k
      if (!(occupied & 0x1)) {
204
155k
        slot = s;
205
155k
        break;
206
155k
      }
207
133k
      occupied >>= 1;
208
133k
    }
209
156k
  }
210
211
532k
  return slot;
212
532k
}
213
214
static void copySbrHeader(HANDLE_SBR_HEADER_DATA hDst,
215
32.8k
                          const HANDLE_SBR_HEADER_DATA hSrc) {
216
  /* copy the whole header memory (including pointers) */
217
32.8k
  FDKmemcpy(hDst, hSrc, sizeof(SBR_HEADER_DATA));
218
219
  /* update pointers */
220
32.8k
  hDst->freqBandData.freqBandTable[0] = hDst->freqBandData.freqBandTableLo;
221
32.8k
  hDst->freqBandData.freqBandTable[1] = hDst->freqBandData.freqBandTableHi;
222
32.8k
}
223
224
static int compareSbrHeader(const HANDLE_SBR_HEADER_DATA hHdr1,
225
7.03k
                            const HANDLE_SBR_HEADER_DATA hHdr2) {
226
7.03k
  int result = 0;
227
228
  /* compare basic data */
229
7.03k
  result |= (hHdr1->syncState != hHdr2->syncState) ? 1 : 0;
230
7.03k
  result |= (hHdr1->status != hHdr2->status) ? 1 : 0;
231
7.03k
  result |= (hHdr1->frameErrorFlag != hHdr2->frameErrorFlag) ? 1 : 0;
232
7.03k
  result |= (hHdr1->numberTimeSlots != hHdr2->numberTimeSlots) ? 1 : 0;
233
7.03k
  result |=
234
7.03k
      (hHdr1->numberOfAnalysisBands != hHdr2->numberOfAnalysisBands) ? 1 : 0;
235
7.03k
  result |= (hHdr1->timeStep != hHdr2->timeStep) ? 1 : 0;
236
7.03k
  result |= (hHdr1->sbrProcSmplRate != hHdr2->sbrProcSmplRate) ? 1 : 0;
237
238
  /* compare bitstream data */
239
7.03k
  result |=
240
7.03k
      FDKmemcmp(&hHdr1->bs_data, &hHdr2->bs_data, sizeof(SBR_HEADER_DATA_BS));
241
7.03k
  result |=
242
7.03k
      FDKmemcmp(&hHdr1->bs_dflt, &hHdr2->bs_dflt, sizeof(SBR_HEADER_DATA_BS));
243
7.03k
  result |= FDKmemcmp(&hHdr1->bs_info, &hHdr2->bs_info,
244
7.03k
                      sizeof(SBR_HEADER_DATA_BS_INFO));
245
246
  /* compare frequency band data */
247
7.03k
  result |= FDKmemcmp(&hHdr1->freqBandData, &hHdr2->freqBandData,
248
7.03k
                      (8 + MAX_NUM_LIMITERS + 1) * sizeof(UCHAR));
249
7.03k
  result |= FDKmemcmp(hHdr1->freqBandData.freqBandTableLo,
250
7.03k
                      hHdr2->freqBandData.freqBandTableLo,
251
7.03k
                      (MAX_FREQ_COEFFS / 2 + 1) * sizeof(UCHAR));
252
7.03k
  result |= FDKmemcmp(hHdr1->freqBandData.freqBandTableHi,
253
7.03k
                      hHdr2->freqBandData.freqBandTableHi,
254
7.03k
                      (MAX_FREQ_COEFFS + 1) * sizeof(UCHAR));
255
7.03k
  result |= FDKmemcmp(hHdr1->freqBandData.freqBandTableNoise,
256
7.03k
                      hHdr2->freqBandData.freqBandTableNoise,
257
7.03k
                      (MAX_NOISE_COEFFS + 1) * sizeof(UCHAR));
258
7.03k
  result |=
259
7.03k
      FDKmemcmp(hHdr1->freqBandData.v_k_master, hHdr2->freqBandData.v_k_master,
260
7.03k
                (MAX_FREQ_COEFFS + 1) * sizeof(UCHAR));
261
262
7.03k
  return result;
263
7.03k
}
264
265
/*!
266
  \brief Reset SBR decoder.
267
268
  Reset should only be called if SBR has been sucessfully detected by
269
  an appropriate checkForPayload() function.
270
271
  \return Error code.
272
*/
273
static SBR_ERROR sbrDecoder_ResetElement(HANDLE_SBRDECODER self,
274
                                         int sampleRateIn, int sampleRateOut,
275
                                         int samplesPerFrame,
276
                                         const MP4_ELEMENT_ID elementID,
277
                                         const int elementIndex,
278
88.0k
                                         const int overlap) {
279
88.0k
  SBR_ERROR sbrError = SBRDEC_OK;
280
88.0k
  HANDLE_SBR_HEADER_DATA hSbrHeader;
281
88.0k
  UINT qmfFlags = 0;
282
283
88.0k
  int i, synDownsampleFac;
284
285
  /* USAC: assuming theoretical case 8 kHz output sample rate with 4:1 SBR */
286
88.0k
  const int sbr_min_sample_rate_in = IS_USAC(self->coreCodec) ? 2000 : 6400;
287
288
  /* Check in/out samplerates */
289
88.0k
  if (sampleRateIn < sbr_min_sample_rate_in || sampleRateIn > (96000)) {
290
829
    sbrError = SBRDEC_UNSUPPORTED_CONFIG;
291
829
    goto bail;
292
829
  }
293
294
87.2k
  if (sampleRateOut > (96000)) {
295
844
    sbrError = SBRDEC_UNSUPPORTED_CONFIG;
296
844
    goto bail;
297
844
  }
298
299
  /* Set QMF mode flags */
300
86.4k
  if (self->flags & SBRDEC_LOW_POWER) qmfFlags |= QMF_FLAG_LP;
301
302
86.4k
  if (self->coreCodec == AOT_ER_AAC_ELD) {
303
45.4k
    if (self->flags & SBRDEC_LD_MPS_QMF) {
304
0
      qmfFlags |= QMF_FLAG_MPSLDFB;
305
45.4k
    } else {
306
45.4k
      qmfFlags |= QMF_FLAG_CLDFB;
307
45.4k
    }
308
45.4k
  }
309
310
  /* Set downsampling factor for synthesis filter bank */
311
86.4k
  if (sampleRateOut == 0) {
312
    /* no single rate mode */
313
4.10k
    sampleRateOut =
314
4.10k
        sampleRateIn
315
4.10k
        << 1; /* In case of implicit signalling, assume dual rate SBR */
316
4.10k
  }
317
318
86.4k
  if (sampleRateIn == sampleRateOut) {
319
35.2k
    synDownsampleFac = 2;
320
35.2k
    self->flags |= SBRDEC_DOWNSAMPLE;
321
51.1k
  } else {
322
51.1k
    synDownsampleFac = 1;
323
51.1k
    self->flags &= ~SBRDEC_DOWNSAMPLE;
324
51.1k
  }
325
326
86.4k
  self->synDownsampleFac = synDownsampleFac;
327
86.4k
  self->sampleRateOut = sampleRateOut;
328
329
86.4k
  {
330
259k
    for (i = 0; i < (1) + 1; i++) {
331
172k
      int setDflt;
332
172k
      hSbrHeader = &(self->sbrHeader[elementIndex][i]);
333
172k
      setDflt = ((hSbrHeader->syncState == SBR_NOT_INITIALIZED) ||
334
1.06k
                 (self->flags & SBRDEC_FORCE_RESET))
335
172k
                    ? 1
336
172k
                    : 0;
337
338
      /* init a default header such that we can at least do upsampling later */
339
172k
      sbrError = initHeaderData(hSbrHeader, sampleRateIn, sampleRateOut,
340
172k
                                self->downscaleFactor, samplesPerFrame,
341
172k
                                self->flags, setDflt);
342
343
      /* Set synchState to UPSAMPLING in case it already is initialized */
344
172k
      hSbrHeader->syncState = hSbrHeader->syncState > UPSAMPLING
345
172k
                                  ? UPSAMPLING
346
172k
                                  : hSbrHeader->syncState;
347
172k
    }
348
86.4k
  }
349
350
86.4k
  if (sbrError != SBRDEC_OK) {
351
32
    goto bail;
352
32
  }
353
354
86.3k
  if (!self->pQmfDomain->globalConf.qmfDomainExplicitConfig) {
355
86.3k
    self->pQmfDomain->globalConf.flags_requested |= qmfFlags;
356
86.3k
    self->pQmfDomain->globalConf.nBandsAnalysis_requested =
357
86.3k
        self->sbrHeader[elementIndex][0].numberOfAnalysisBands;
358
86.3k
    self->pQmfDomain->globalConf.nBandsSynthesis_requested =
359
86.3k
        (synDownsampleFac == 1) ? 64 : 32; /* may be overwritten by MPS */
360
86.3k
    self->pQmfDomain->globalConf.nBandsSynthesis_requested /=
361
86.3k
        self->downscaleFactor;
362
86.3k
    self->pQmfDomain->globalConf.nQmfTimeSlots_requested =
363
86.3k
        self->sbrHeader[elementIndex][0].numberTimeSlots *
364
86.3k
        self->sbrHeader[elementIndex][0].timeStep;
365
86.3k
    self->pQmfDomain->globalConf.nQmfOvTimeSlots_requested = overlap;
366
86.3k
    self->pQmfDomain->globalConf.nQmfProcBands_requested = 64; /* always 64 */
367
86.3k
    self->pQmfDomain->globalConf.nQmfProcChannels_requested =
368
86.3k
        1; /* may be overwritten by MPS */
369
86.3k
  }
370
371
  /* Init SBR channels going to be assigned to a SBR element */
372
86.3k
  {
373
86.3k
    int ch;
374
211k
    for (ch = 0; ch < self->pSbrElement[elementIndex]->nChannels; ch++) {
375
128k
      int headerIndex =
376
128k
          getHeaderSlot(self->pSbrElement[elementIndex]->useFrameSlot,
377
128k
                        self->pSbrElement[elementIndex]->useHeaderSlot);
378
379
      /* and create sbrDec */
380
128k
      sbrError =
381
128k
          createSbrDec(self->pSbrElement[elementIndex]->pSbrChannel[ch],
382
128k
                       &self->sbrHeader[elementIndex][headerIndex],
383
128k
                       &self->pSbrElement[elementIndex]->transposerSettings,
384
128k
                       synDownsampleFac, qmfFlags, self->flags, overlap, ch,
385
128k
                       self->codecFrameSize);
386
387
128k
      if (sbrError != SBRDEC_OK) {
388
3.11k
        goto bail;
389
3.11k
      }
390
128k
    }
391
86.3k
  }
392
393
  // FDKmemclear(sbr_OverlapBuffer, sizeof(sbr_OverlapBuffer));
394
395
83.2k
  if (self->numSbrElements == 1) {
396
55.7k
    switch (self->coreCodec) {
397
1.20k
      case AOT_AAC_LC:
398
1.20k
      case AOT_SBR:
399
1.20k
      case AOT_PS:
400
3.71k
      case AOT_ER_AAC_SCAL:
401
3.71k
      case AOT_DRM_AAC:
402
3.71k
      case AOT_DRM_SURROUND:
403
3.71k
        if (CreatePsDec(&self->hParametricStereoDec, samplesPerFrame)) {
404
0
          sbrError = SBRDEC_CREATE_ERROR;
405
0
          goto bail;
406
0
        }
407
3.71k
        break;
408
51.9k
      default:
409
51.9k
        break;
410
55.7k
    }
411
55.7k
  }
412
413
  /* Init frame delay slot handling */
414
83.2k
  self->pSbrElement[elementIndex]->useFrameSlot = 0;
415
249k
  for (i = 0; i < ((1) + 1); i++) {
416
166k
    self->pSbrElement[elementIndex]->useHeaderSlot[i] = i;
417
166k
  }
418
419
88.0k
bail:
420
421
88.0k
  return sbrError;
422
83.2k
}
423
424
/*!
425
  \brief Assign QMF domain provided QMF channels to SBR channels.
426
427
  \return void
428
*/
429
88.0k
static void sbrDecoder_AssignQmfChannels2SbrChannels(HANDLE_SBRDECODER self) {
430
88.0k
  int ch, el, absCh_offset = 0;
431
238k
  for (el = 0; el < self->numSbrElements; el++) {
432
150k
    if (self->pSbrElement[el] != NULL) {
433
377k
      for (ch = 0; ch < self->pSbrElement[el]->nChannels; ch++) {
434
226k
        FDK_ASSERT(((absCh_offset + ch) < ((8) + (1))) &&
435
226k
                   ((absCh_offset + ch) < ((8) + (1))));
436
226k
        self->pSbrElement[el]->pSbrChannel[ch]->SbrDec.qmfDomainInCh =
437
226k
            &self->pQmfDomain->QmfDomainIn[absCh_offset + ch];
438
226k
        self->pSbrElement[el]->pSbrChannel[ch]->SbrDec.qmfDomainOutCh =
439
226k
            &self->pQmfDomain->QmfDomainOut[absCh_offset + ch];
440
226k
      }
441
150k
      absCh_offset += self->pSbrElement[el]->nChannels;
442
150k
    }
443
150k
  }
444
88.0k
}
445
446
SBR_ERROR sbrDecoder_Open(HANDLE_SBRDECODER *pSelf,
447
29.4k
                          HANDLE_FDK_QMF_DOMAIN pQmfDomain) {
448
29.4k
  HANDLE_SBRDECODER self = NULL;
449
29.4k
  SBR_ERROR sbrError = SBRDEC_OK;
450
29.4k
  int elIdx;
451
452
29.4k
  if ((pSelf == NULL) || (pQmfDomain == NULL)) {
453
0
    return SBRDEC_INVALID_ARGUMENT;
454
0
  }
455
456
  /* Get memory for this instance */
457
29.4k
  self = GetRam_SbrDecoder();
458
29.4k
  if (self == NULL) {
459
0
    sbrError = SBRDEC_MEM_ALLOC_FAILED;
460
0
    goto bail;
461
0
  }
462
463
29.4k
  self->pQmfDomain = pQmfDomain;
464
465
  /*
466
  Already zero because of calloc
467
  self->numSbrElements = 0;
468
  self->numSbrChannels = 0;
469
  self->codecFrameSize = 0;
470
  */
471
472
29.4k
  self->numDelayFrames = (1); /* set to the max value by default */
473
474
  /* Initialize header sync state */
475
265k
  for (elIdx = 0; elIdx < (8); elIdx += 1) {
476
235k
    int i;
477
707k
    for (i = 0; i < (1) + 1; i += 1) {
478
471k
      self->sbrHeader[elIdx][i].syncState = SBR_NOT_INITIALIZED;
479
471k
    }
480
235k
  }
481
482
29.4k
  *pSelf = self;
483
484
29.4k
bail:
485
29.4k
  return sbrError;
486
29.4k
}
487
488
/**
489
 * \brief determine if the given core codec AOT can be processed or not.
490
 * \param coreCodec core codec audio object type.
491
 * \return 1 if SBR can be processed, 0 if SBR cannot be processed/applied.
492
 */
493
1.01M
static int sbrDecoder_isCoreCodecValid(AUDIO_OBJECT_TYPE coreCodec) {
494
1.01M
  switch (coreCodec) {
495
18.6k
    case AOT_AAC_LC:
496
18.6k
    case AOT_SBR:
497
18.6k
    case AOT_PS:
498
61.6k
    case AOT_ER_AAC_SCAL:
499
635k
    case AOT_ER_AAC_ELD:
500
635k
    case AOT_DRM_AAC:
501
635k
    case AOT_DRM_SURROUND:
502
1.01M
    case AOT_USAC:
503
1.01M
      return 1;
504
887
    default:
505
887
      return 0;
506
1.01M
  }
507
1.01M
}
508
509
static void sbrDecoder_DestroyElement(HANDLE_SBRDECODER self,
510
2.12M
                                      const int elementIndex) {
511
2.12M
  if (self->pSbrElement[elementIndex] != NULL) {
512
87.4k
    int ch;
513
514
262k
    for (ch = 0; ch < SBRDEC_MAX_CH_PER_ELEMENT; ch++) {
515
174k
      if (self->pSbrElement[elementIndex]->pSbrChannel[ch] != NULL) {
516
132k
        deleteSbrDec(self->pSbrElement[elementIndex]->pSbrChannel[ch]);
517
132k
        FreeRam_SbrDecChannel(
518
132k
            &self->pSbrElement[elementIndex]->pSbrChannel[ch]);
519
132k
        self->numSbrChannels -= 1;
520
132k
      }
521
174k
    }
522
87.4k
    FreeRam_SbrDecElement(&self->pSbrElement[elementIndex]);
523
87.4k
    self->numSbrElements -= 1;
524
87.4k
  }
525
2.12M
}
526
527
SBR_ERROR sbrDecoder_InitElement(
528
    HANDLE_SBRDECODER self, const int sampleRateIn, const int sampleRateOut,
529
    const int samplesPerFrame, const AUDIO_OBJECT_TYPE coreCodec,
530
    const MP4_ELEMENT_ID elementID, const int elementIndex,
531
    const UCHAR harmonicSBR, const UCHAR stereoConfigIndex,
532
569k
    const UCHAR configMode, UCHAR *configChanged, const INT downscaleFactor) {
533
569k
  SBR_ERROR sbrError = SBRDEC_OK;
534
569k
  int chCnt = 0;
535
569k
  int nSbrElementsStart;
536
569k
  int nSbrChannelsStart;
537
569k
  if (self == NULL) {
538
0
    return SBRDEC_INVALID_ARGUMENT;
539
0
  }
540
541
569k
  nSbrElementsStart = self->numSbrElements;
542
569k
  nSbrChannelsStart = self->numSbrChannels;
543
544
  /* Check core codec AOT */
545
569k
  if (!sbrDecoder_isCoreCodecValid(coreCodec) || elementIndex >= (8)) {
546
887
    sbrError = SBRDEC_UNSUPPORTED_CONFIG;
547
887
    goto bail;
548
887
  }
549
550
569k
  if (elementID != ID_SCE && elementID != ID_CPE && elementID != ID_LFE) {
551
0
    sbrError = SBRDEC_UNSUPPORTED_CONFIG;
552
0
    goto bail;
553
0
  }
554
555
569k
  if (self->sampleRateIn == sampleRateIn &&
556
459k
      self->codecFrameSize == samplesPerFrame && self->coreCodec == coreCodec &&
557
433k
      self->pSbrElement[elementIndex] != NULL &&
558
375k
      self->pSbrElement[elementIndex]->elementID == elementID &&
559
373k
      !(self->flags & SBRDEC_FORCE_RESET) &&
560
373k
      ((sampleRateOut == 0) ? 1 : (self->sampleRateOut == sampleRateOut)) &&
561
370k
      ((harmonicSBR == 2) ? 1
562
370k
                          : (self->harmonicSBR ==
563
248k
                             harmonicSBR)) /* The value 2 signalizes that
564
                                              harmonicSBR shall be ignored in
565
                                              the config change detection */
566
569k
  ) {
567
    /* Nothing to do */
568
367k
    return SBRDEC_OK;
569
367k
  } else {
570
201k
    if (configMode & AC_CM_DET_CFG_CHANGE) {
571
113k
      *configChanged = 1;
572
113k
    }
573
201k
  }
574
575
  /* reaching this point the SBR-decoder gets (re-)configured */
576
577
  /* The flags field is used for all elements! */
578
201k
  self->flags &=
579
201k
      (SBRDEC_FORCE_RESET | SBRDEC_FLUSH); /* Keep the global flags. They will
580
                                              be reset after decoding. */
581
201k
  self->flags |= (downscaleFactor > 1) ? SBRDEC_ELD_DOWNSCALE : 0;
582
201k
  self->flags |= (coreCodec == AOT_ER_AAC_ELD) ? SBRDEC_ELD_GRID : 0;
583
201k
  self->flags |= (coreCodec == AOT_ER_AAC_SCAL) ? SBRDEC_SYNTAX_SCAL : 0;
584
201k
  self->flags |=
585
201k
      (coreCodec == AOT_DRM_AAC) ? SBRDEC_SYNTAX_SCAL | SBRDEC_SYNTAX_DRM : 0;
586
201k
  self->flags |= (coreCodec == AOT_DRM_SURROUND)
587
201k
                     ? SBRDEC_SYNTAX_SCAL | SBRDEC_SYNTAX_DRM
588
201k
                     : 0;
589
201k
  self->flags |= (coreCodec == AOT_USAC) ? SBRDEC_SYNTAX_USAC : 0;
590
  /* Robustness: Take integer division rounding into consideration. E.g. 22050
591
   * Hz with 4:1 SBR => 5512 Hz core sampling rate. */
592
201k
  self->flags |= (sampleRateIn == sampleRateOut / 4) ? SBRDEC_QUAD_RATE : 0;
593
201k
  self->flags |= (harmonicSBR == 1) ? SBRDEC_USAC_HARMONICSBR : 0;
594
595
201k
  if (configMode & AC_CM_DET_CFG_CHANGE) {
596
113k
    return SBRDEC_OK;
597
113k
  }
598
599
88.0k
  self->sampleRateIn = sampleRateIn;
600
88.0k
  self->codecFrameSize = samplesPerFrame;
601
88.0k
  self->coreCodec = coreCodec;
602
88.0k
  self->harmonicSBR = harmonicSBR;
603
88.0k
  self->downscaleFactor = downscaleFactor;
604
605
  /* Init SBR elements */
606
88.0k
  {
607
88.0k
    int elChannels, ch;
608
609
88.0k
    if (self->pSbrElement[elementIndex] == NULL) {
610
87.4k
      self->pSbrElement[elementIndex] = GetRam_SbrDecElement(elementIndex);
611
87.4k
      if (self->pSbrElement[elementIndex] == NULL) {
612
0
        sbrError = SBRDEC_MEM_ALLOC_FAILED;
613
0
        goto bail;
614
0
      }
615
87.4k
      self->numSbrElements++;
616
87.4k
    } else {
617
608
      self->numSbrChannels -= self->pSbrElement[elementIndex]->nChannels;
618
608
    }
619
620
    /* Determine amount of channels for this element */
621
88.0k
    switch (elementID) {
622
0
      case ID_NONE:
623
42.4k
      case ID_CPE:
624
42.4k
        elChannels = 2;
625
42.4k
        break;
626
5.55k
      case ID_LFE:
627
45.6k
      case ID_SCE:
628
45.6k
        elChannels = 1;
629
45.6k
        break;
630
0
      default:
631
0
        elChannels = 0;
632
0
        break;
633
88.0k
    }
634
635
    /* Handle case of Parametric Stereo */
636
88.0k
    if (elementIndex == 0 && elementID == ID_SCE) {
637
38.6k
      switch (coreCodec) {
638
1.01k
        case AOT_AAC_LC:
639
1.01k
        case AOT_SBR:
640
1.01k
        case AOT_PS:
641
2.73k
        case AOT_ER_AAC_SCAL:
642
2.73k
        case AOT_DRM_AAC:
643
2.73k
        case AOT_DRM_SURROUND:
644
2.73k
          elChannels = 2;
645
2.73k
          break;
646
35.8k
        default:
647
35.8k
          break;
648
38.6k
      }
649
38.6k
    }
650
651
    /* Sanity check to avoid memory leaks */
652
88.0k
    if (elChannels < self->pSbrElement[elementIndex]->nChannels ||
653
88.0k
        (self->numSbrChannels + elChannels) > (8) + (1)) {
654
0
      self->numSbrChannels += self->pSbrElement[elementIndex]->nChannels;
655
0
      sbrError = SBRDEC_PARSE_ERROR;
656
0
      goto bail;
657
0
    }
658
659
    /* Save element ID for sanity checks and to have a fallback for concealment.
660
     */
661
88.0k
    self->pSbrElement[elementIndex]->elementID = elementID;
662
88.0k
    self->pSbrElement[elementIndex]->nChannels = elChannels;
663
664
221k
    for (ch = 0; ch < elChannels; ch++) {
665
133k
      if (self->pSbrElement[elementIndex]->pSbrChannel[ch] == NULL) {
666
132k
        self->pSbrElement[elementIndex]->pSbrChannel[ch] =
667
132k
            GetRam_SbrDecChannel(chCnt);
668
132k
        if (self->pSbrElement[elementIndex]->pSbrChannel[ch] == NULL) {
669
0
          sbrError = SBRDEC_MEM_ALLOC_FAILED;
670
0
          goto bail;
671
0
        }
672
132k
      }
673
133k
      self->numSbrChannels++;
674
675
133k
      sbrDecoder_drcInitChannel(&self->pSbrElement[elementIndex]
676
133k
                                     ->pSbrChannel[ch]
677
133k
                                     ->SbrDec.sbrDrcChannel);
678
679
133k
      chCnt++;
680
133k
    }
681
88.0k
  }
682
683
88.0k
  if (!self->pQmfDomain->globalConf.qmfDomainExplicitConfig) {
684
88.0k
    self->pQmfDomain->globalConf.nInputChannels_requested =
685
88.0k
        self->numSbrChannels;
686
88.0k
    self->pQmfDomain->globalConf.nOutputChannels_requested =
687
88.0k
        fMax((INT)self->numSbrChannels,
688
88.0k
             (INT)self->pQmfDomain->globalConf.nOutputChannels_requested);
689
88.0k
  }
690
691
  /* Make sure each SBR channel has one QMF channel assigned even if
692
   * numSbrChannels or element set-up has changed. */
693
88.0k
  sbrDecoder_AssignQmfChannels2SbrChannels(self);
694
695
  /* clear error flags for all delay slots */
696
88.0k
  FDKmemclear(self->pSbrElement[elementIndex]->frameErrorFlag,
697
88.0k
              ((1) + 1) * sizeof(UCHAR));
698
699
88.0k
  {
700
88.0k
    int overlap;
701
702
88.0k
    if (coreCodec == AOT_ER_AAC_ELD) {
703
46.7k
      overlap = 0;
704
46.7k
    } else if (self->flags & SBRDEC_QUAD_RATE) {
705
14.6k
      overlap = (3 * 4);
706
26.7k
    } else {
707
26.7k
      overlap = (3 * 2);
708
26.7k
    }
709
    /* Initialize this instance */
710
88.0k
    sbrError = sbrDecoder_ResetElement(self, sampleRateIn, sampleRateOut,
711
88.0k
                                       samplesPerFrame, elementID, elementIndex,
712
88.0k
                                       overlap);
713
88.0k
  }
714
715
88.9k
bail:
716
88.9k
  if (sbrError != SBRDEC_OK) {
717
5.70k
    if ((nSbrElementsStart < self->numSbrElements) ||
718
4.81k
        (nSbrChannelsStart < self->numSbrChannels)) {
719
      /* Free the memory allocated for this element */
720
4.81k
      sbrDecoder_DestroyElement(self, elementIndex);
721
4.81k
    } else if ((elementIndex < (8)) &&
722
887
               (self->pSbrElement[elementIndex] !=
723
887
                NULL)) { /* Set error flag to trigger concealment */
724
0
      setFrameErrorFlag(self->pSbrElement[elementIndex], FRAME_ERROR);
725
0
    }
726
5.70k
  }
727
728
88.9k
  return sbrError;
729
88.0k
}
730
731
/**
732
 * \brief Free config dependent SBR memory.
733
 * \param self SBR decoder instance handle
734
 */
735
235k
SBR_ERROR sbrDecoder_FreeMem(HANDLE_SBRDECODER *self) {
736
235k
  int i;
737
235k
  int elIdx;
738
739
235k
  if (self != NULL && *self != NULL) {
740
2.12M
    for (i = 0; i < (8); i++) {
741
1.88M
      sbrDecoder_DestroyElement(*self, i);
742
1.88M
    }
743
744
2.12M
    for (elIdx = 0; elIdx < (8); elIdx += 1) {
745
5.65M
      for (i = 0; i < (1) + 1; i += 1) {
746
3.76M
        (*self)->sbrHeader[elIdx][i].syncState = SBR_NOT_INITIALIZED;
747
3.76M
      }
748
1.88M
    }
749
235k
  }
750
751
235k
  return SBRDEC_OK;
752
235k
}
753
754
/**
755
 * \brief Apply decoded SBR header for one element.
756
 * \param self SBR decoder instance handle
757
 * \param hSbrHeader SBR header handle to be processed.
758
 * \param hSbrChannel pointer array to the SBR element channels corresponding to
759
 * the SBR header.
760
 * \param headerStatus header status value returned from SBR header parser.
761
 * \param numElementChannels amount of channels for the SBR element whos header
762
 * is to be processed.
763
 */
764
static SBR_ERROR sbrDecoder_HeaderUpdate(HANDLE_SBRDECODER self,
765
                                         HANDLE_SBR_HEADER_DATA hSbrHeader,
766
                                         SBR_HEADER_STATUS headerStatus,
767
                                         HANDLE_SBR_CHANNEL hSbrChannel[],
768
199k
                                         const int numElementChannels) {
769
199k
  SBR_ERROR errorStatus = SBRDEC_OK;
770
771
  /*
772
    change of control data, reset decoder
773
  */
774
199k
  errorStatus = resetFreqBandTables(hSbrHeader, self->flags);
775
776
199k
  if (errorStatus == SBRDEC_OK) {
777
165k
    if (hSbrHeader->syncState == UPSAMPLING && headerStatus != HEADER_RESET) {
778
#if (SBRDEC_MAX_HB_FADE_FRAMES > 0)
779
      int ch;
780
      for (ch = 0; ch < numElementChannels; ch += 1) {
781
        hSbrChannel[ch]->SbrDec.highBandFadeCnt = SBRDEC_MAX_HB_FADE_FRAMES;
782
      }
783
784
#endif
785
      /* As the default header would limit the frequency range,
786
         lowSubband and highSubband must be patched. */
787
37.5k
      hSbrHeader->freqBandData.lowSubband = hSbrHeader->numberOfAnalysisBands;
788
37.5k
      hSbrHeader->freqBandData.highSubband = hSbrHeader->numberOfAnalysisBands;
789
37.5k
    }
790
791
    /* Trigger a reset before processing this slot */
792
165k
    hSbrHeader->status |= SBRDEC_HDR_STAT_RESET;
793
165k
  }
794
795
199k
  return errorStatus;
796
199k
}
797
798
INT sbrDecoder_Header(HANDLE_SBRDECODER self, HANDLE_FDK_BITSTREAM hBs,
799
                      const INT sampleRateIn, const INT sampleRateOut,
800
                      const INT samplesPerFrame,
801
                      const AUDIO_OBJECT_TYPE coreCodec,
802
                      const MP4_ELEMENT_ID elementID, const INT elementIndex,
803
                      const UCHAR harmonicSBR, const UCHAR stereoConfigIndex,
804
                      const UCHAR configMode, UCHAR *configChanged,
805
443k
                      const INT downscaleFactor) {
806
443k
  SBR_HEADER_STATUS headerStatus;
807
443k
  HANDLE_SBR_HEADER_DATA hSbrHeader;
808
443k
  SBR_ERROR sbrError = SBRDEC_OK;
809
443k
  int headerIndex;
810
443k
  UINT flagsSaved =
811
443k
      0; /* flags should not be changed in AC_CM_DET_CFG_CHANGE - mode after
812
            parsing */
813
814
443k
  if (self == NULL || elementIndex >= (8)) {
815
0
    return SBRDEC_UNSUPPORTED_CONFIG;
816
0
  }
817
818
443k
  if (!sbrDecoder_isCoreCodecValid(coreCodec)) {
819
0
    return SBRDEC_UNSUPPORTED_CONFIG;
820
0
  }
821
822
443k
  if (configMode & AC_CM_DET_CFG_CHANGE) {
823
283k
    flagsSaved = self->flags; /* store */
824
283k
  }
825
826
443k
  sbrError = sbrDecoder_InitElement(
827
443k
      self, sampleRateIn, sampleRateOut, samplesPerFrame, coreCodec, elementID,
828
443k
      elementIndex, harmonicSBR, stereoConfigIndex, configMode, configChanged,
829
443k
      downscaleFactor);
830
831
443k
  if ((sbrError != SBRDEC_OK) || (elementID == ID_LFE)) {
832
45.8k
    goto bail;
833
45.8k
  }
834
835
397k
  if (configMode & AC_CM_DET_CFG_CHANGE) {
836
257k
    hSbrHeader = NULL;
837
257k
  } else {
838
140k
    headerIndex = getHeaderSlot(self->pSbrElement[elementIndex]->useFrameSlot,
839
140k
                                self->pSbrElement[elementIndex]->useHeaderSlot);
840
841
140k
    hSbrHeader = &(self->sbrHeader[elementIndex][headerIndex]);
842
140k
  }
843
844
397k
  headerStatus = sbrGetHeaderData(hSbrHeader, hBs, self->flags, 0, configMode);
845
846
397k
  if (coreCodec == AOT_USAC) {
847
184k
    if (configMode & AC_CM_DET_CFG_CHANGE) {
848
122k
      self->flags = flagsSaved; /* restore */
849
122k
    }
850
184k
    return sbrError;
851
184k
  }
852
853
212k
  if (configMode & AC_CM_ALLOC_MEM) {
854
77.5k
    SBR_DECODER_ELEMENT *pSbrElement;
855
856
77.5k
    pSbrElement = self->pSbrElement[elementIndex];
857
858
    /* Sanity check */
859
77.5k
    if (pSbrElement != NULL) {
860
77.5k
      if ((elementID == ID_CPE && pSbrElement->nChannels != 2) ||
861
77.5k
          (elementID != ID_CPE && pSbrElement->nChannels != 1)) {
862
0
        return SBRDEC_UNSUPPORTED_CONFIG;
863
0
      }
864
77.5k
      if (headerStatus == HEADER_RESET) {
865
55.9k
        sbrError = sbrDecoder_HeaderUpdate(self, hSbrHeader, headerStatus,
866
55.9k
                                           pSbrElement->pSbrChannel,
867
55.9k
                                           pSbrElement->nChannels);
868
869
55.9k
        if (sbrError == SBRDEC_OK) {
870
48.1k
          hSbrHeader->syncState = SBR_HEADER;
871
48.1k
          hSbrHeader->status |= SBRDEC_HDR_STAT_UPDATE;
872
48.1k
        } else {
873
7.82k
          hSbrHeader->syncState = SBR_NOT_INITIALIZED;
874
7.82k
          hSbrHeader->status = HEADER_ERROR;
875
7.82k
        }
876
55.9k
      }
877
77.5k
    }
878
77.5k
  }
879
258k
bail:
880
258k
  if (configMode & AC_CM_DET_CFG_CHANGE) {
881
161k
    self->flags = flagsSaved; /* restore */
882
161k
  }
883
258k
  return sbrError;
884
212k
}
885
886
SBR_ERROR sbrDecoder_SetParam(HANDLE_SBRDECODER self, const SBRDEC_PARAM param,
887
1.20M
                              const INT value) {
888
1.20M
  SBR_ERROR errorStatus = SBRDEC_OK;
889
890
  /* configure the subsystems */
891
1.20M
  switch (param) {
892
294k
    case SBR_SYSTEM_BITSTREAM_DELAY:
893
294k
      if (value < 0 || value > (1)) {
894
0
        errorStatus = SBRDEC_SET_PARAM_FAIL;
895
0
        break;
896
0
      }
897
294k
      if (self == NULL) {
898
0
        errorStatus = SBRDEC_NOT_INITIALIZED;
899
294k
      } else {
900
294k
        self->numDelayFrames = (UCHAR)value;
901
294k
      }
902
294k
      break;
903
379k
    case SBR_QMF_MODE:
904
379k
      if (self == NULL) {
905
0
        errorStatus = SBRDEC_NOT_INITIALIZED;
906
379k
      } else {
907
379k
        if (value == 1) {
908
104k
          self->flags |= SBRDEC_LOW_POWER;
909
274k
        } else {
910
274k
          self->flags &= ~SBRDEC_LOW_POWER;
911
274k
        }
912
379k
      }
913
379k
      break;
914
30.1k
    case SBR_LD_QMF_TIME_ALIGN:
915
30.1k
      if (self == NULL) {
916
0
        errorStatus = SBRDEC_NOT_INITIALIZED;
917
30.1k
      } else {
918
30.1k
        if (value == 1) {
919
2.02k
          self->flags |= SBRDEC_LD_MPS_QMF;
920
28.1k
        } else {
921
28.1k
          self->flags &= ~SBRDEC_LD_MPS_QMF;
922
28.1k
        }
923
30.1k
      }
924
30.1k
      break;
925
247k
    case SBR_FLUSH_DATA:
926
247k
      if (value != 0) {
927
28
        if (self == NULL) {
928
0
          errorStatus = SBRDEC_NOT_INITIALIZED;
929
28
        } else {
930
28
          self->flags |= SBRDEC_FLUSH;
931
28
        }
932
28
      }
933
247k
      break;
934
0
    case SBR_CLEAR_HISTORY:
935
0
      if (value != 0) {
936
0
        if (self == NULL) {
937
0
          errorStatus = SBRDEC_NOT_INITIALIZED;
938
0
        } else {
939
0
          self->flags |= SBRDEC_FORCE_RESET;
940
0
        }
941
0
      }
942
0
      break;
943
6.41k
    case SBR_BS_INTERRUPTION: {
944
6.41k
      int elementIndex;
945
946
6.41k
      if (self == NULL) {
947
0
        errorStatus = SBRDEC_NOT_INITIALIZED;
948
0
        break;
949
0
      }
950
951
      /* Loop over SBR elements */
952
11.8k
      for (elementIndex = 0; elementIndex < self->numSbrElements;
953
6.41k
           elementIndex++) {
954
5.44k
        if (self->pSbrElement[elementIndex] != NULL) {
955
5.43k
          HANDLE_SBR_HEADER_DATA hSbrHeader;
956
5.43k
          int headerIndex =
957
5.43k
              getHeaderSlot(self->pSbrElement[elementIndex]->useFrameSlot,
958
5.43k
                            self->pSbrElement[elementIndex]->useHeaderSlot);
959
960
5.43k
          hSbrHeader = &(self->sbrHeader[elementIndex][headerIndex]);
961
962
          /* Set sync state UPSAMPLING for the corresponding slot.
963
             This switches off bitstream parsing until a new header arrives. */
964
5.43k
          if (hSbrHeader->syncState != SBR_NOT_INITIALIZED) {
965
5.34k
            hSbrHeader->syncState = UPSAMPLING;
966
5.34k
            hSbrHeader->status |= SBRDEC_HDR_STAT_UPDATE;
967
5.34k
          }
968
5.43k
        }
969
5.44k
      }
970
6.41k
    } break;
971
972
247k
    case SBR_SKIP_QMF:
973
247k
      if (self == NULL) {
974
0
        errorStatus = SBRDEC_NOT_INITIALIZED;
975
247k
      } else {
976
247k
        if (value == 1) {
977
12.6k
          self->flags |= SBRDEC_SKIP_QMF_ANA;
978
235k
        } else {
979
235k
          self->flags &= ~SBRDEC_SKIP_QMF_ANA;
980
235k
        }
981
247k
        if (value == 2) {
982
97.6k
          self->flags |= SBRDEC_SKIP_QMF_SYN;
983
149k
        } else {
984
149k
          self->flags &= ~SBRDEC_SKIP_QMF_SYN;
985
149k
        }
986
247k
      }
987
247k
      break;
988
0
    default:
989
0
      errorStatus = SBRDEC_SET_PARAM_FAIL;
990
0
      break;
991
1.20M
  } /* switch(param) */
992
993
1.20M
  return (errorStatus);
994
1.20M
}
995
996
static SBRDEC_DRC_CHANNEL *sbrDecoder_drcGetChannel(
997
409k
    const HANDLE_SBRDECODER self, const INT channel) {
998
409k
  SBRDEC_DRC_CHANNEL *pSbrDrcChannelData = NULL;
999
409k
  int elementIndex, elChanIdx = 0, numCh = 0;
1000
1001
959k
  for (elementIndex = 0; (elementIndex < (8)) && (numCh <= channel);
1002
554k
       elementIndex++) {
1003
554k
    SBR_DECODER_ELEMENT *pSbrElement = self->pSbrElement[elementIndex];
1004
554k
    int c, elChannels;
1005
1006
554k
    elChanIdx = 0;
1007
554k
    if (pSbrElement == NULL) break;
1008
1009
    /* Determine amount of channels for this element */
1010
550k
    switch (pSbrElement->elementID) {
1011
312k
      case ID_CPE:
1012
312k
        elChannels = 2;
1013
312k
        break;
1014
19.6k
      case ID_LFE:
1015
237k
      case ID_SCE:
1016
237k
        elChannels = 1;
1017
237k
        break;
1018
0
      case ID_NONE:
1019
0
      default:
1020
0
        elChannels = 0;
1021
0
        break;
1022
550k
    }
1023
1024
    /* Limit with actual allocated element channels */
1025
550k
    elChannels = fMin(elChannels, pSbrElement->nChannels);
1026
1027
1.29M
    for (c = 0; (c < elChannels) && (numCh <= channel); c++) {
1028
740k
      if (pSbrElement->pSbrChannel[elChanIdx] != NULL) {
1029
740k
        numCh++;
1030
740k
        elChanIdx++;
1031
740k
      }
1032
740k
    }
1033
550k
  }
1034
409k
  elementIndex -= 1;
1035
409k
  elChanIdx -= 1;
1036
1037
409k
  if (elChanIdx < 0 || elementIndex < 0) {
1038
4.35k
    return NULL;
1039
4.35k
  }
1040
1041
404k
  if (self->pSbrElement[elementIndex] != NULL) {
1042
404k
    if (self->pSbrElement[elementIndex]->pSbrChannel[elChanIdx] != NULL) {
1043
404k
      pSbrDrcChannelData = &self->pSbrElement[elementIndex]
1044
404k
                                ->pSbrChannel[elChanIdx]
1045
404k
                                ->SbrDec.sbrDrcChannel;
1046
404k
    }
1047
404k
  }
1048
1049
404k
  return (pSbrDrcChannelData);
1050
409k
}
1051
1052
SBR_ERROR sbrDecoder_drcFeedChannel(HANDLE_SBRDECODER self, INT ch,
1053
                                    UINT numBands, FIXP_DBL *pNextFact_mag,
1054
                                    INT nextFact_exp,
1055
                                    SHORT drcInterpolationScheme,
1056
143k
                                    UCHAR winSequence, USHORT *pBandTop) {
1057
143k
  SBRDEC_DRC_CHANNEL *pSbrDrcChannelData = NULL;
1058
143k
  int band, isValidData = 0;
1059
1060
143k
  if (self == NULL) {
1061
0
    return SBRDEC_NOT_INITIALIZED;
1062
0
  }
1063
143k
  if (ch > (8) || pNextFact_mag == NULL) {
1064
0
    return SBRDEC_SET_PARAM_FAIL;
1065
0
  }
1066
1067
  /* Search for gain values different to 1.0f */
1068
277k
  for (band = 0; band < (int)numBands; band += 1) {
1069
144k
    if (!((pNextFact_mag[band] == FL2FXCONST_DBL(0.5)) &&
1070
134k
          (nextFact_exp == 1)) &&
1071
9.97k
        !((pNextFact_mag[band] == (FIXP_DBL)MAXVAL_DBL) &&
1072
9.97k
          (nextFact_exp == 0))) {
1073
9.97k
      isValidData = 1;
1074
9.97k
      break;
1075
9.97k
    }
1076
144k
  }
1077
1078
  /* Find the right SBR channel */
1079
143k
  pSbrDrcChannelData = sbrDecoder_drcGetChannel(self, ch);
1080
1081
143k
  if (pSbrDrcChannelData != NULL) {
1082
143k
    if (pSbrDrcChannelData->enable ||
1083
130k
        isValidData) { /* Activate processing only with real and valid data */
1084
14.4k
      int i;
1085
1086
14.4k
      pSbrDrcChannelData->enable = 1;
1087
14.4k
      pSbrDrcChannelData->numBandsNext = numBands;
1088
1089
14.4k
      pSbrDrcChannelData->winSequenceNext = winSequence;
1090
14.4k
      pSbrDrcChannelData->drcInterpolationSchemeNext = drcInterpolationScheme;
1091
14.4k
      pSbrDrcChannelData->nextFact_exp = nextFact_exp;
1092
1093
68.1k
      for (i = 0; i < (int)numBands; i++) {
1094
53.7k
        pSbrDrcChannelData->bandTopNext[i] = pBandTop[i];
1095
53.7k
        pSbrDrcChannelData->nextFact_mag[i] = pNextFact_mag[i];
1096
53.7k
      }
1097
14.4k
    }
1098
143k
  }
1099
1100
143k
  return SBRDEC_OK;
1101
143k
}
1102
1103
303k
void sbrDecoder_drcDisable(HANDLE_SBRDECODER self, INT ch) {
1104
303k
  SBRDEC_DRC_CHANNEL *pSbrDrcChannelData = NULL;
1105
1106
303k
  if ((self == NULL) || (ch > (8)) || (self->numSbrElements == 0) ||
1107
265k
      (self->numSbrChannels == 0)) {
1108
38.0k
    return;
1109
38.0k
  }
1110
1111
  /* Find the right SBR channel */
1112
265k
  pSbrDrcChannelData = sbrDecoder_drcGetChannel(self, ch);
1113
1114
265k
  if (pSbrDrcChannelData != NULL) {
1115
261k
    sbrDecoder_drcInitChannel(pSbrDrcChannelData);
1116
261k
  }
1117
265k
}
1118
1119
SBR_ERROR sbrDecoder_Parse(HANDLE_SBRDECODER self, HANDLE_FDK_BITSTREAM hBs,
1120
                           UCHAR *pDrmBsBuffer, USHORT drmBsBufferSize,
1121
                           int *count, int bsPayLen, int crcFlag,
1122
                           MP4_ELEMENT_ID prevElement, int elementIndex,
1123
292k
                           UINT acFlags, UINT acElFlags[]) {
1124
292k
  SBR_DECODER_ELEMENT *hSbrElement = NULL;
1125
292k
  HANDLE_SBR_HEADER_DATA hSbrHeader = NULL;
1126
292k
  HANDLE_SBR_CHANNEL *pSbrChannel;
1127
1128
292k
  SBR_FRAME_DATA *hFrameDataLeft = NULL;
1129
292k
  SBR_FRAME_DATA *hFrameDataRight = NULL;
1130
292k
  SBR_FRAME_DATA frameDataLeftCopy;
1131
292k
  SBR_FRAME_DATA frameDataRightCopy;
1132
1133
292k
  SBR_ERROR errorStatus = SBRDEC_OK;
1134
292k
  SBR_HEADER_STATUS headerStatus = HEADER_NOT_PRESENT;
1135
1136
292k
  INT startPos = FDKgetValidBits(hBs);
1137
292k
  FDK_CRCINFO crcInfo;
1138
292k
  INT crcReg = 0;
1139
292k
  USHORT sbrCrc = 0;
1140
292k
  UINT crcPoly;
1141
292k
  UINT crcStartValue = 0;
1142
292k
  UINT crcLen;
1143
1144
292k
  HANDLE_FDK_BITSTREAM hBsOriginal = hBs;
1145
292k
  FDK_BITSTREAM bsBwd;
1146
1147
292k
  const int fGlobalIndependencyFlag = acFlags & AC_INDEP;
1148
292k
  const int bs_pvc = acElFlags[elementIndex] & AC_EL_USAC_PVC;
1149
292k
  const int bs_interTes = acElFlags[elementIndex] & AC_EL_USAC_ITES;
1150
292k
  int stereo;
1151
292k
  int fDoDecodeSbrData = 1;
1152
292k
  int alignBits = 0;
1153
1154
292k
  int lastSlot, lastHdrSlot = 0, thisHdrSlot = 0;
1155
1156
292k
  if (*count <= 0) {
1157
34.7k
    setFrameErrorFlag(self->pSbrElement[elementIndex], FRAME_ERROR);
1158
34.7k
    return SBRDEC_OK;
1159
34.7k
  }
1160
1161
  /* SBR sanity checks */
1162
257k
  if (self == NULL) {
1163
0
    errorStatus = SBRDEC_NOT_INITIALIZED;
1164
0
    goto bail;
1165
0
  }
1166
1167
  /* Reverse bits of DRM SBR payload */
1168
257k
  if ((self->flags & SBRDEC_SYNTAX_DRM) && *count > 0) {
1169
0
    int dataBytes, dataBits;
1170
1171
0
    FDK_ASSERT(drmBsBufferSize >= (512));
1172
0
    dataBits = *count;
1173
1174
0
    if (dataBits > ((512) * 8)) {
1175
      /* do not flip more data than needed */
1176
0
      dataBits = (512) * 8;
1177
0
    }
1178
1179
0
    dataBytes = (dataBits + 7) >> 3;
1180
1181
0
    int j;
1182
1183
0
    if ((j = (int)FDKgetValidBits(hBs)) != 8) {
1184
0
      FDKpushBiDirectional(hBs, (j - 8));
1185
0
    }
1186
1187
0
    j = 0;
1188
0
    for (; dataBytes > 0; dataBytes--) {
1189
0
      int i;
1190
0
      UCHAR tmpByte;
1191
0
      UCHAR buffer = 0x00;
1192
1193
0
      tmpByte = (UCHAR)FDKreadBits(hBs, 8);
1194
0
      for (i = 0; i < 4; i++) {
1195
0
        int shift = 2 * i + 1;
1196
0
        buffer |= (tmpByte & (0x08 >> i)) << shift;
1197
0
        buffer |= (tmpByte & (0x10 << i)) >> shift;
1198
0
      }
1199
0
      pDrmBsBuffer[j++] = buffer;
1200
0
      FDKpushBack(hBs, 16);
1201
0
    }
1202
1203
0
    FDKinitBitStream(&bsBwd, pDrmBsBuffer, (512), dataBits, BS_READER);
1204
1205
    /* Use reversed data */
1206
0
    hBs = &bsBwd;
1207
0
    bsPayLen = *count;
1208
0
  }
1209
1210
  /* Remember start position of  SBR element */
1211
257k
  startPos = FDKgetValidBits(hBs);
1212
1213
  /* SBR sanity checks */
1214
257k
  if (self->pSbrElement[elementIndex] == NULL) {
1215
0
    errorStatus = SBRDEC_NOT_INITIALIZED;
1216
0
    goto bail;
1217
0
  }
1218
257k
  hSbrElement = self->pSbrElement[elementIndex];
1219
1220
257k
  lastSlot = (hSbrElement->useFrameSlot > 0) ? hSbrElement->useFrameSlot - 1
1221
257k
                                             : self->numDelayFrames;
1222
257k
  lastHdrSlot = hSbrElement->useHeaderSlot[lastSlot];
1223
257k
  thisHdrSlot = getHeaderSlot(
1224
257k
      hSbrElement->useFrameSlot,
1225
257k
      hSbrElement->useHeaderSlot); /* Get a free header slot not used by
1226
                                      frames not processed yet. */
1227
1228
  /* Assign the free slot to store a new header if there is one. */
1229
257k
  hSbrHeader = &self->sbrHeader[elementIndex][thisHdrSlot];
1230
1231
257k
  pSbrChannel = hSbrElement->pSbrChannel;
1232
257k
  stereo = (hSbrElement->elementID == ID_CPE) ? 1 : 0;
1233
1234
257k
  hFrameDataLeft = &self->pSbrElement[elementIndex]
1235
257k
                        ->pSbrChannel[0]
1236
257k
                        ->frameData[hSbrElement->useFrameSlot];
1237
257k
  if (stereo) {
1238
99.2k
    hFrameDataRight = &self->pSbrElement[elementIndex]
1239
99.2k
                           ->pSbrChannel[1]
1240
99.2k
                           ->frameData[hSbrElement->useFrameSlot];
1241
99.2k
  }
1242
1243
  /* store frameData; new parsed frameData possibly corrupted */
1244
257k
  FDKmemcpy(&frameDataLeftCopy, hFrameDataLeft, sizeof(SBR_FRAME_DATA));
1245
257k
  if (stereo) {
1246
99.2k
    FDKmemcpy(&frameDataRightCopy, hFrameDataRight, sizeof(SBR_FRAME_DATA));
1247
99.2k
  }
1248
1249
  /* reset PS flag; will be set after PS was found */
1250
257k
  self->flags &= ~SBRDEC_PS_DECODED;
1251
1252
257k
  if (hSbrHeader->status & SBRDEC_HDR_STAT_UPDATE) {
1253
    /* Got a new header from extern (e.g. from an ASC) */
1254
17.8k
    headerStatus = HEADER_OK;
1255
17.8k
    hSbrHeader->status &= ~SBRDEC_HDR_STAT_UPDATE;
1256
240k
  } else if (thisHdrSlot != lastHdrSlot) {
1257
    /* Copy the last header into this slot otherwise the
1258
       header compare will trigger more HEADER_RESETs than needed. */
1259
32.8k
    copySbrHeader(hSbrHeader, &self->sbrHeader[elementIndex][lastHdrSlot]);
1260
32.8k
  }
1261
1262
  /*
1263
     Check if bit stream data is valid and matches the element context
1264
  */
1265
257k
  if (((prevElement != ID_SCE) && (prevElement != ID_CPE)) ||
1266
256k
      prevElement != hSbrElement->elementID) {
1267
    /* In case of LFE we also land here, since there is no LFE SBR element (do
1268
     * upsampling only) */
1269
1.00k
    fDoDecodeSbrData = 0;
1270
1.00k
  }
1271
1272
257k
  if (fDoDecodeSbrData) {
1273
256k
    if ((INT)FDKgetValidBits(hBs) <= 0) {
1274
6
      fDoDecodeSbrData = 0;
1275
6
    }
1276
256k
  }
1277
1278
  /*
1279
     SBR CRC-check
1280
  */
1281
257k
  if (fDoDecodeSbrData) {
1282
256k
    if (crcFlag) {
1283
27.6k
      switch (self->coreCodec) {
1284
0
        case AOT_DRM_AAC:
1285
0
        case AOT_DRM_SURROUND:
1286
0
          crcPoly = 0x001d;
1287
0
          crcLen = 8;
1288
0
          crcStartValue = 0x000000ff;
1289
0
          break;
1290
27.6k
        default:
1291
27.6k
          crcPoly = 0x0633;
1292
27.6k
          crcLen = 10;
1293
27.6k
          crcStartValue = 0x00000000;
1294
27.6k
          break;
1295
27.6k
      }
1296
27.6k
      sbrCrc = (USHORT)FDKreadBits(hBs, crcLen);
1297
      /* Setup CRC decoder */
1298
27.6k
      FDKcrcInit(&crcInfo, crcPoly, crcStartValue, crcLen);
1299
      /* Start CRC region */
1300
27.6k
      crcReg = FDKcrcStartReg(&crcInfo, hBs, 0);
1301
27.6k
    }
1302
256k
  } /* if (fDoDecodeSbrData) */
1303
1304
  /*
1305
     Read in the header data and issue a reset if change occured
1306
  */
1307
257k
  if (fDoDecodeSbrData) {
1308
256k
    int sbrHeaderPresent;
1309
1310
256k
    if (self->flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC)) {
1311
182k
      SBR_HEADER_DATA_BS_INFO newSbrInfo;
1312
182k
      int sbrInfoPresent;
1313
1314
182k
      if (bs_interTes) {
1315
56.1k
        self->flags |= SBRDEC_USAC_ITES;
1316
126k
      } else {
1317
126k
        self->flags &= ~SBRDEC_USAC_ITES;
1318
126k
      }
1319
1320
182k
      if (fGlobalIndependencyFlag) {
1321
142k
        self->flags |= SBRDEC_USAC_INDEP;
1322
142k
        sbrInfoPresent = 1;
1323
142k
        sbrHeaderPresent = 1;
1324
142k
      } else {
1325
39.8k
        self->flags &= ~SBRDEC_USAC_INDEP;
1326
39.8k
        sbrInfoPresent = FDKreadBit(hBs);
1327
39.8k
        if (sbrInfoPresent) {
1328
6.14k
          sbrHeaderPresent = FDKreadBit(hBs);
1329
33.6k
        } else {
1330
33.6k
          sbrHeaderPresent = 0;
1331
33.6k
        }
1332
39.8k
      }
1333
1334
182k
      if (sbrInfoPresent) {
1335
149k
        newSbrInfo.ampResolution = FDKreadBit(hBs);
1336
149k
        newSbrInfo.xover_band = FDKreadBits(hBs, 4);
1337
149k
        newSbrInfo.sbr_preprocessing = FDKreadBit(hBs);
1338
149k
        if (bs_pvc) {
1339
82.1k
          newSbrInfo.pvc_mode = FDKreadBits(hBs, 2);
1340
          /* bs_pvc_mode: 0 -> no PVC, 1 -> PVC mode 1, 2 -> PVC mode 2, 3 ->
1341
           * reserved */
1342
82.1k
          if (newSbrInfo.pvc_mode > 2) {
1343
8.28k
            headerStatus = HEADER_ERROR;
1344
8.28k
          }
1345
82.1k
          if (stereo && newSbrInfo.pvc_mode > 0) {
1346
            /* bs_pvc is always transmitted but pvc_mode is set to zero in case
1347
             * of stereo SBR. The config might be wrong but we cannot tell for
1348
             * sure. */
1349
8.36k
            newSbrInfo.pvc_mode = 0;
1350
8.36k
          }
1351
82.1k
        } else {
1352
66.9k
          newSbrInfo.pvc_mode = 0;
1353
66.9k
        }
1354
149k
        if (headerStatus != HEADER_ERROR) {
1355
140k
          if (FDKmemcmp(&hSbrHeader->bs_info, &newSbrInfo,
1356
140k
                        sizeof(SBR_HEADER_DATA_BS_INFO))) {
1357
            /* in case of ampResolution and preprocessing change no full reset
1358
             * required    */
1359
            /* HEADER reset would trigger HBE transposer reset which breaks
1360
             * eSbr_3_Eaa.mp4 */
1361
59.4k
            if ((hSbrHeader->bs_info.pvc_mode != newSbrInfo.pvc_mode) ||
1362
51.9k
                (hSbrHeader->bs_info.xover_band != newSbrInfo.xover_band)) {
1363
51.9k
              headerStatus = HEADER_RESET;
1364
51.9k
            } else {
1365
7.53k
              headerStatus = HEADER_OK;
1366
7.53k
            }
1367
1368
59.4k
            hSbrHeader->bs_info = newSbrInfo;
1369
81.4k
          } else {
1370
81.4k
            headerStatus = HEADER_OK;
1371
81.4k
          }
1372
140k
        }
1373
149k
      }
1374
182k
      if (headerStatus == HEADER_ERROR) {
1375
        /* Corrupt SBR info data, do not decode and switch to UPSAMPLING */
1376
8.28k
        hSbrHeader->syncState = hSbrHeader->syncState > UPSAMPLING
1377
8.28k
                                    ? UPSAMPLING
1378
8.28k
                                    : hSbrHeader->syncState;
1379
8.28k
        fDoDecodeSbrData = 0;
1380
8.28k
        sbrHeaderPresent = 0;
1381
8.28k
      }
1382
1383
182k
      if (sbrHeaderPresent && fDoDecodeSbrData) {
1384
138k
        int useDfltHeader;
1385
1386
138k
        useDfltHeader = FDKreadBit(hBs);
1387
1388
138k
        if (useDfltHeader) {
1389
74.5k
          sbrHeaderPresent = 0;
1390
74.5k
          if (FDKmemcmp(&hSbrHeader->bs_data, &hSbrHeader->bs_dflt,
1391
74.5k
                        sizeof(SBR_HEADER_DATA_BS)) ||
1392
57.3k
              hSbrHeader->syncState != SBR_ACTIVE) {
1393
19.4k
            hSbrHeader->bs_data = hSbrHeader->bs_dflt;
1394
19.4k
            headerStatus = HEADER_RESET;
1395
19.4k
          }
1396
74.5k
        }
1397
138k
      }
1398
182k
    } else {
1399
74.1k
      sbrHeaderPresent = FDKreadBit(hBs);
1400
74.1k
    }
1401
1402
256k
    if (sbrHeaderPresent) {
1403
110k
      headerStatus = sbrGetHeaderData(hSbrHeader, hBs, self->flags, 1, 0);
1404
110k
    }
1405
1406
256k
    if (headerStatus == HEADER_RESET) {
1407
105k
      errorStatus = sbrDecoder_HeaderUpdate(
1408
105k
          self, hSbrHeader, headerStatus, pSbrChannel, hSbrElement->nChannels);
1409
1410
105k
      if (errorStatus == SBRDEC_OK) {
1411
79.8k
        hSbrHeader->syncState = SBR_HEADER;
1412
79.8k
      } else {
1413
25.6k
        hSbrHeader->syncState = SBR_NOT_INITIALIZED;
1414
25.6k
        headerStatus = HEADER_ERROR;
1415
25.6k
      }
1416
105k
    }
1417
1418
256k
    if (errorStatus != SBRDEC_OK) {
1419
25.6k
      fDoDecodeSbrData = 0;
1420
25.6k
    }
1421
256k
  } /* if (fDoDecodeSbrData) */
1422
1423
  /*
1424
    Print debugging output only if state has changed
1425
  */
1426
1427
  /* read frame data */
1428
257k
  if ((hSbrHeader->syncState >= SBR_HEADER) && fDoDecodeSbrData) {
1429
217k
    int sbrFrameOk;
1430
    /* read the SBR element data */
1431
217k
    if (!stereo && (self->hParametricStereoDec != NULL)) {
1432
      /* update slot index for PS bitstream parsing */
1433
26.8k
      self->hParametricStereoDec->bsLastSlot =
1434
26.8k
          self->hParametricStereoDec->bsReadSlot;
1435
26.8k
      self->hParametricStereoDec->bsReadSlot = hSbrElement->useFrameSlot;
1436
26.8k
    }
1437
217k
    sbrFrameOk = sbrGetChannelElement(
1438
217k
        hSbrHeader, hFrameDataLeft, (stereo) ? hFrameDataRight : NULL,
1439
217k
        &pSbrChannel[0]->prevFrameData,
1440
217k
        pSbrChannel[0]->SbrDec.PvcStaticData.pvc_mode_last, hBs,
1441
217k
        (stereo) ? NULL : self->hParametricStereoDec, self->flags,
1442
217k
        self->pSbrElement[elementIndex]->transposerSettings.overlap);
1443
1444
217k
    if (!sbrFrameOk) {
1445
16.5k
      fDoDecodeSbrData = 0;
1446
201k
    } else {
1447
201k
      INT valBits;
1448
1449
201k
      if (bsPayLen > 0) {
1450
27.7k
        valBits = bsPayLen - ((INT)startPos - (INT)FDKgetValidBits(hBs));
1451
173k
      } else {
1452
173k
        valBits = (INT)FDKgetValidBits(hBs);
1453
173k
      }
1454
1455
      /* sanity check of remaining bits */
1456
201k
      if (valBits < 0) {
1457
24.2k
        fDoDecodeSbrData = 0;
1458
176k
      } else {
1459
176k
        switch (self->coreCodec) {
1460
0
          case AOT_SBR:
1461
0
          case AOT_PS:
1462
5.39k
          case AOT_AAC_LC: {
1463
            /* This sanity check is only meaningful with General Audio
1464
             * bitstreams */
1465
5.39k
            alignBits = valBits & 0x7;
1466
1467
5.39k
            if (valBits > alignBits) {
1468
600
              fDoDecodeSbrData = 0;
1469
600
            }
1470
5.39k
          } break;
1471
171k
          default:
1472
            /* No sanity check available */
1473
171k
            break;
1474
176k
        }
1475
176k
      }
1476
201k
    }
1477
217k
  } else {
1478
    /* The returned bit count will not be the actual payload size since we did
1479
       not parse the frame data. Return an error so that the caller can react
1480
       respectively. */
1481
40.1k
    errorStatus = SBRDEC_PARSE_ERROR;
1482
40.1k
  }
1483
1484
257k
  if (crcFlag && (hSbrHeader->syncState >= SBR_HEADER) && fDoDecodeSbrData) {
1485
12.3k
    FDKpushFor(hBs, alignBits);
1486
12.3k
    FDKcrcEndReg(&crcInfo, hBs, crcReg); /* End CRC region */
1487
12.3k
    FDKpushBack(hBs, alignBits);
1488
    /* Check CRC */
1489
12.3k
    if ((FDKcrcGetCRC(&crcInfo) ^ crcStartValue) != sbrCrc) {
1490
10.7k
      fDoDecodeSbrData = 0;
1491
10.7k
      if (headerStatus != HEADER_NOT_PRESENT) {
1492
9.83k
        headerStatus = HEADER_ERROR;
1493
9.83k
        hSbrHeader->syncState = SBR_NOT_INITIALIZED;
1494
9.83k
      }
1495
10.7k
    }
1496
12.3k
  }
1497
1498
257k
  if (!fDoDecodeSbrData) {
1499
    /* Set error flag for this slot to trigger concealment */
1500
87.1k
    setFrameErrorFlag(self->pSbrElement[elementIndex], FRAME_ERROR);
1501
    /* restore old frameData for concealment */
1502
87.1k
    FDKmemcpy(hFrameDataLeft, &frameDataLeftCopy, sizeof(SBR_FRAME_DATA));
1503
87.1k
    if (stereo) {
1504
30.8k
      FDKmemcpy(hFrameDataRight, &frameDataRightCopy, sizeof(SBR_FRAME_DATA));
1505
30.8k
    }
1506
87.1k
    errorStatus = SBRDEC_PARSE_ERROR;
1507
170k
  } else {
1508
    /* Everything seems to be ok so clear the error flag */
1509
170k
    setFrameErrorFlag(self->pSbrElement[elementIndex], FRAME_OK);
1510
170k
  }
1511
1512
257k
  if (!stereo) {
1513
    /* Turn coupling off explicitely to avoid access to absent right frame data
1514
       that might occur with corrupt bitstreams. */
1515
158k
    hFrameDataLeft->coupling = COUPLING_OFF;
1516
158k
  }
1517
1518
257k
bail:
1519
1520
257k
  if (self != NULL) {
1521
257k
    if (self->flags & SBRDEC_SYNTAX_DRM) {
1522
0
      hBs = hBsOriginal;
1523
0
    }
1524
1525
257k
    if (errorStatus != SBRDEC_NOT_INITIALIZED) {
1526
257k
      int useOldHdr =
1527
257k
          ((headerStatus == HEADER_NOT_PRESENT) ||
1528
207k
           (headerStatus == HEADER_ERROR) ||
1529
163k
           (headerStatus == HEADER_RESET && errorStatus == SBRDEC_PARSE_ERROR))
1530
257k
              ? 1
1531
257k
              : 0;
1532
1533
257k
      if (!useOldHdr && (thisHdrSlot != lastHdrSlot) && (hSbrHeader != NULL)) {
1534
7.03k
        useOldHdr |=
1535
7.03k
            (compareSbrHeader(hSbrHeader,
1536
7.03k
                              &self->sbrHeader[elementIndex][lastHdrSlot]) == 0)
1537
7.03k
                ? 1
1538
7.03k
                : 0;
1539
7.03k
      }
1540
1541
257k
      if (hSbrElement != NULL) {
1542
257k
        if (useOldHdr != 0) {
1543
          /* Use the old header for this frame */
1544
127k
          hSbrElement->useHeaderSlot[hSbrElement->useFrameSlot] = lastHdrSlot;
1545
130k
        } else {
1546
          /* Use the new header for this frame */
1547
130k
          hSbrElement->useHeaderSlot[hSbrElement->useFrameSlot] = thisHdrSlot;
1548
130k
        }
1549
1550
        /* Move frame pointer to the next slot which is up to be decoded/applied
1551
         * next */
1552
257k
        hSbrElement->useFrameSlot =
1553
257k
            (hSbrElement->useFrameSlot + 1) % (self->numDelayFrames + 1);
1554
257k
      }
1555
257k
    }
1556
257k
  }
1557
1558
257k
  *count -= startPos - (INT)FDKgetValidBits(hBs);
1559
1560
257k
  return errorStatus;
1561
257k
}
1562
1563
/**
1564
 * \brief Render one SBR element into time domain signal.
1565
 * \param self SBR decoder handle
1566
 * \param timeData pointer to output buffer
1567
 * \param channelMapping pointer to UCHAR array where next 2 channel offsets are
1568
 * stored.
1569
 * \param elementIndex enumerating index of the SBR element to render.
1570
 * \param numInChannels number of channels from core coder.
1571
 * \param numOutChannels pointer to a location to return number of output
1572
 * channels.
1573
 * \param psPossible flag indicating if PS is possible or not.
1574
 * \return SBRDEC_OK if successfull, else error code
1575
 */
1576
static SBR_ERROR sbrDecoder_DecodeElement(
1577
    HANDLE_SBRDECODER self, LONG *input, LONG *timeData, const int timeDataSize,
1578
    const FDK_channelMapDescr *const mapDescr, const int mapIdx,
1579
    int channelIndex, const int elementIndex, const int numInChannels,
1580
282k
    int *numOutChannels, const int psPossible) {
1581
282k
  SBR_DECODER_ELEMENT *hSbrElement = self->pSbrElement[elementIndex];
1582
282k
  HANDLE_SBR_CHANNEL *pSbrChannel =
1583
282k
      self->pSbrElement[elementIndex]->pSbrChannel;
1584
282k
  HANDLE_SBR_HEADER_DATA hSbrHeader =
1585
282k
      &self->sbrHeader[elementIndex]
1586
282k
                      [hSbrElement->useHeaderSlot[hSbrElement->useFrameSlot]];
1587
282k
  HANDLE_PS_DEC h_ps_d = self->hParametricStereoDec;
1588
1589
  /* get memory for frame data from scratch */
1590
282k
  SBR_FRAME_DATA *hFrameDataLeft = NULL;
1591
282k
  SBR_FRAME_DATA *hFrameDataRight = NULL;
1592
1593
282k
  SBR_ERROR errorStatus = SBRDEC_OK;
1594
1595
282k
  INT strideOut, offset0 = 255, offset0_block = 0, offset1 = 255,
1596
282k
                 offset1_block = 0;
1597
282k
  INT codecFrameSize = self->codecFrameSize;
1598
1599
282k
  int stereo = (hSbrElement->elementID == ID_CPE) ? 1 : 0;
1600
282k
  int numElementChannels =
1601
282k
      hSbrElement
1602
282k
          ->nChannels; /* Number of channels of the current SBR element */
1603
1604
282k
  hFrameDataLeft =
1605
282k
      &hSbrElement->pSbrChannel[0]->frameData[hSbrElement->useFrameSlot];
1606
282k
  if (stereo) {
1607
121k
    hFrameDataRight =
1608
121k
        &hSbrElement->pSbrChannel[1]->frameData[hSbrElement->useFrameSlot];
1609
121k
  }
1610
1611
282k
  if (self->flags & SBRDEC_FLUSH) {
1612
28
    if (self->numFlushedFrames > self->numDelayFrames) {
1613
28
      int hdrIdx;
1614
      /* No valid SBR payload available, hence switch to upsampling (in all
1615
       * headers) */
1616
84
      for (hdrIdx = 0; hdrIdx < ((1) + 1); hdrIdx += 1) {
1617
56
        if (self->sbrHeader[elementIndex][hdrIdx].syncState > UPSAMPLING) {
1618
22
          self->sbrHeader[elementIndex][hdrIdx].syncState = UPSAMPLING;
1619
22
        }
1620
56
      }
1621
28
    } else {
1622
      /* Move frame pointer to the next slot which is up to be decoded/applied
1623
       * next */
1624
0
      hSbrElement->useFrameSlot =
1625
0
          (hSbrElement->useFrameSlot + 1) % (self->numDelayFrames + 1);
1626
      /* Update header and frame data pointer because they have already been set
1627
       */
1628
0
      hSbrHeader =
1629
0
          &self->sbrHeader[elementIndex]
1630
0
                          [hSbrElement
1631
0
                               ->useHeaderSlot[hSbrElement->useFrameSlot]];
1632
0
      hFrameDataLeft =
1633
0
          &hSbrElement->pSbrChannel[0]->frameData[hSbrElement->useFrameSlot];
1634
0
      if (stereo) {
1635
0
        hFrameDataRight =
1636
0
            &hSbrElement->pSbrChannel[1]->frameData[hSbrElement->useFrameSlot];
1637
0
      }
1638
0
    }
1639
28
  }
1640
1641
  /* Update the header error flag */
1642
282k
  hSbrHeader->frameErrorFlag =
1643
282k
      hSbrElement->frameErrorFlag[hSbrElement->useFrameSlot];
1644
1645
  /*
1646
     Prepare filterbank for upsampling if no valid bit stream data is available.
1647
   */
1648
282k
  if (hSbrHeader->syncState == SBR_NOT_INITIALIZED) {
1649
37.5k
    errorStatus =
1650
37.5k
        initHeaderData(hSbrHeader, self->sampleRateIn, self->sampleRateOut,
1651
37.5k
                       self->downscaleFactor, codecFrameSize, self->flags,
1652
37.5k
                       1 /* SET_DEFAULT_HDR */
1653
37.5k
        );
1654
1655
37.5k
    if (errorStatus != SBRDEC_OK) {
1656
0
      return errorStatus;
1657
0
    }
1658
1659
37.5k
    hSbrHeader->syncState = UPSAMPLING;
1660
1661
37.5k
    errorStatus = sbrDecoder_HeaderUpdate(self, hSbrHeader, HEADER_NOT_PRESENT,
1662
37.5k
                                          pSbrChannel, hSbrElement->nChannels);
1663
1664
37.5k
    if (errorStatus != SBRDEC_OK) {
1665
0
      hSbrHeader->syncState = SBR_NOT_INITIALIZED;
1666
0
      return errorStatus;
1667
0
    }
1668
37.5k
  }
1669
1670
  /* reset */
1671
282k
  if (hSbrHeader->status & SBRDEC_HDR_STAT_RESET) {
1672
144k
    int ch;
1673
144k
    int applySbrProc = (hSbrHeader->syncState == SBR_ACTIVE ||
1674
144k
                        (hSbrHeader->frameErrorFlag == 0 &&
1675
90.0k
                         hSbrHeader->syncState == SBR_HEADER));
1676
372k
    for (ch = 0; ch < numElementChannels; ch++) {
1677
228k
      SBR_ERROR errorStatusTmp = SBRDEC_OK;
1678
1679
228k
      errorStatusTmp = resetSbrDec(
1680
228k
          &pSbrChannel[ch]->SbrDec, hSbrHeader, &pSbrChannel[ch]->prevFrameData,
1681
228k
          self->synDownsampleFac, self->flags, pSbrChannel[ch]->frameData);
1682
1683
228k
      if (errorStatusTmp != SBRDEC_OK) {
1684
4.54k
        hSbrHeader->syncState = UPSAMPLING;
1685
4.54k
      }
1686
228k
    }
1687
144k
    if (applySbrProc) {
1688
46.6k
      hSbrHeader->status &= ~SBRDEC_HDR_STAT_RESET;
1689
46.6k
    }
1690
144k
  }
1691
1692
  /* decoding */
1693
282k
  if ((hSbrHeader->syncState == SBR_ACTIVE) ||
1694
148k
      ((hSbrHeader->syncState == SBR_HEADER) &&
1695
180k
       (hSbrHeader->frameErrorFlag == 0))) {
1696
180k
    errorStatus = SBRDEC_OK;
1697
1698
180k
    decodeSbrData(hSbrHeader, hFrameDataLeft, &pSbrChannel[0]->prevFrameData,
1699
180k
                  (stereo) ? hFrameDataRight : NULL,
1700
180k
                  (stereo) ? &pSbrChannel[1]->prevFrameData : NULL);
1701
1702
    /* Now we have a full parameter set and can do parameter
1703
       based concealment instead of plain upsampling. */
1704
180k
    hSbrHeader->syncState = SBR_ACTIVE;
1705
180k
  }
1706
1707
282k
  if (timeDataSize <
1708
282k
      hSbrHeader->numberTimeSlots * hSbrHeader->timeStep *
1709
282k
          self->pQmfDomain->globalConf.nBandsSynthesis *
1710
282k
          (psPossible ? fMax(2, numInChannels) : numInChannels)) {
1711
0
    return SBRDEC_OUTPUT_BUFFER_TOO_SMALL;
1712
0
  }
1713
1714
282k
  {
1715
282k
    self->flags &= ~SBRDEC_PS_DECODED;
1716
282k
    C_ALLOC_SCRATCH_START(pPsScratch, struct PS_DEC_COEFFICIENTS, 1)
1717
1718
    /* decode PS data if available */
1719
282k
    if (h_ps_d != NULL && psPossible && (hSbrHeader->syncState == SBR_ACTIVE)) {
1720
7.19k
      int applyPs = 1;
1721
1722
      /* define which frame delay line slot to process */
1723
7.19k
      h_ps_d->processSlot = hSbrElement->useFrameSlot;
1724
1725
7.19k
      applyPs = DecodePs(h_ps_d, hSbrHeader->frameErrorFlag, pPsScratch);
1726
7.19k
      self->flags |= (applyPs) ? SBRDEC_PS_DECODED : 0;
1727
7.19k
    }
1728
1729
282k
    offset0 = FDK_chMapDescr_getMapValue(mapDescr, channelIndex, mapIdx);
1730
282k
    offset0_block = offset0 * codecFrameSize;
1731
282k
    if (stereo || psPossible) {
1732
      /* the value of offset1 only matters if the condition is true, however if
1733
      it is not true channelIndex+1 may exceed the channel map resutling in an
1734
      error, though the value of offset1 is actually meaningless. This is
1735
      prevented here. */
1736
131k
      offset1 = FDK_chMapDescr_getMapValue(mapDescr, channelIndex + 1, mapIdx);
1737
131k
      offset1_block = offset1 * codecFrameSize;
1738
131k
    }
1739
    /* Set strides for reading and writing */
1740
282k
    if (psPossible)
1741
9.68k
      strideOut = (numInChannels < 2) ? 2 : numInChannels;
1742
273k
    else
1743
273k
      strideOut = numInChannels;
1744
1745
    /* use same buffers for left and right channel and apply PS per timeslot */
1746
    /* Process left channel */
1747
282k
    sbr_dec(&pSbrChannel[0]->SbrDec, input + offset0_block, timeData + offset0,
1748
282k
            (self->flags & SBRDEC_PS_DECODED) ? &pSbrChannel[1]->SbrDec : NULL,
1749
282k
            timeData + offset1, strideOut, hSbrHeader, hFrameDataLeft,
1750
282k
            &pSbrChannel[0]->prevFrameData,
1751
282k
            (hSbrHeader->syncState == SBR_ACTIVE), h_ps_d, self->flags,
1752
282k
            codecFrameSize, self->sbrInDataHeadroom);
1753
1754
282k
    if (stereo) {
1755
      /* Process right channel */
1756
121k
      sbr_dec(&pSbrChannel[1]->SbrDec, input + offset1_block,
1757
121k
              timeData + offset1, NULL, NULL, strideOut, hSbrHeader,
1758
121k
              hFrameDataRight, &pSbrChannel[1]->prevFrameData,
1759
121k
              (hSbrHeader->syncState == SBR_ACTIVE), NULL, self->flags,
1760
121k
              codecFrameSize, self->sbrInDataHeadroom);
1761
121k
    }
1762
1763
282k
    C_ALLOC_SCRATCH_END(pPsScratch, struct PS_DEC_COEFFICIENTS, 1)
1764
282k
  }
1765
1766
282k
  if (h_ps_d != NULL) {
1767
    /* save PS status for next run */
1768
27.3k
    h_ps_d->psDecodedPrv = (self->flags & SBRDEC_PS_DECODED) ? 1 : 0;
1769
27.3k
  }
1770
1771
282k
  if (psPossible && !(self->flags & SBRDEC_SKIP_QMF_SYN)) {
1772
9.68k
    FDK_ASSERT(strideOut > 1);
1773
9.68k
    if (!(self->flags & SBRDEC_PS_DECODED)) {
1774
      /* A decoder which is able to decode PS has to produce a stereo output
1775
       * even if no PS data is available. */
1776
      /* So copy left channel to right channel. */
1777
3.13k
      int copyFrameSize =
1778
3.13k
          codecFrameSize * self->pQmfDomain->QmfDomainOut->fb.no_channels;
1779
3.13k
      copyFrameSize /= self->pQmfDomain->QmfDomainIn->fb.no_channels;
1780
3.13k
      LONG *ptr;
1781
3.13k
      INT i;
1782
3.13k
      FDK_ASSERT(strideOut == 2);
1783
1784
3.13k
      ptr = timeData;
1785
3.08M
      for (i = copyFrameSize >> 1; i--;) {
1786
3.08M
        LONG tmp; /* This temporal variable is required because some compilers
1787
                     can't do *ptr++ = *ptr++ correctly. */
1788
3.08M
        tmp = *ptr++;
1789
3.08M
        *ptr++ = tmp;
1790
3.08M
        tmp = *ptr++;
1791
3.08M
        *ptr++ = tmp;
1792
3.08M
      }
1793
3.13k
    }
1794
9.68k
    *numOutChannels = 2; /* Output minimum two channels when PS is enabled. */
1795
9.68k
  }
1796
1797
282k
  return errorStatus;
1798
282k
}
1799
1800
SBR_ERROR sbrDecoder_Apply(HANDLE_SBRDECODER self, LONG *input, LONG *timeData,
1801
                           const int timeDataSize, int *numChannels,
1802
                           int *sampleRate,
1803
                           const FDK_channelMapDescr *const mapDescr,
1804
                           const int mapIdx, const int coreDecodedOk,
1805
                           UCHAR *psDecoded, const INT inDataHeadroom,
1806
247k
                           INT *outDataHeadroom) {
1807
247k
  SBR_ERROR errorStatus = SBRDEC_OK;
1808
1809
247k
  int psPossible;
1810
247k
  int sbrElementNum;
1811
247k
  int numCoreChannels;
1812
247k
  int numSbrChannels = 0;
1813
1814
247k
  if ((self == NULL) || (timeData == NULL) || (numChannels == NULL) ||
1815
247k
      (sampleRate == NULL) || (psDecoded == NULL) ||
1816
247k
      !FDK_chMapDescr_isValid(mapDescr)) {
1817
0
    return SBRDEC_INVALID_ARGUMENT;
1818
0
  }
1819
1820
247k
  psPossible = *psDecoded;
1821
247k
  numCoreChannels = *numChannels;
1822
247k
  if (numCoreChannels <= 0) {
1823
0
    return SBRDEC_INVALID_ARGUMENT;
1824
0
  }
1825
1826
247k
  if (self->numSbrElements < 1) {
1827
    /* exit immediately to avoid access violations */
1828
0
    return SBRDEC_NOT_INITIALIZED;
1829
0
  }
1830
1831
  /* Sanity check of allocated SBR elements. */
1832
531k
  for (sbrElementNum = 0; sbrElementNum < self->numSbrElements;
1833
283k
       sbrElementNum++) {
1834
283k
    if (self->pSbrElement[sbrElementNum] == NULL) {
1835
85
      return SBRDEC_NOT_INITIALIZED;
1836
85
    }
1837
283k
  }
1838
1839
247k
  if (self->numSbrElements != 1 || self->pSbrElement[0]->elementID != ID_SCE) {
1840
106k
    psPossible = 0;
1841
106k
  }
1842
1843
247k
  self->sbrInDataHeadroom = inDataHeadroom;
1844
247k
  *outDataHeadroom = (INT)(8);
1845
1846
  /* Make sure that even if no SBR data was found/parsed *psDecoded is returned
1847
   * 1 if psPossible was 0. */
1848
247k
  if (psPossible == 0) {
1849
237k
    self->flags &= ~SBRDEC_PS_DECODED;
1850
237k
  }
1851
1852
  /* replaces channel based reset inside sbr_dec() */
1853
247k
  if (((self->flags & SBRDEC_LOW_POWER) ? 1 : 0) !=
1854
247k
      ((self->pQmfDomain->globalConf.flags & QMF_FLAG_LP) ? 1 : 0)) {
1855
10.4k
    if (self->flags & SBRDEC_LOW_POWER) {
1856
9.99k
      self->pQmfDomain->globalConf.flags |= QMF_FLAG_LP;
1857
9.99k
      self->pQmfDomain->globalConf.flags_requested |= QMF_FLAG_LP;
1858
9.99k
    } else {
1859
437
      self->pQmfDomain->globalConf.flags &= ~QMF_FLAG_LP;
1860
437
      self->pQmfDomain->globalConf.flags_requested &= ~QMF_FLAG_LP;
1861
437
    }
1862
10.4k
    if (FDK_QmfDomain_InitFilterBank(self->pQmfDomain, QMF_FLAG_KEEP_STATES)) {
1863
0
      return SBRDEC_UNSUPPORTED_CONFIG;
1864
0
    }
1865
10.4k
  }
1866
247k
  if (self->numSbrChannels > self->pQmfDomain->globalConf.nInputChannels) {
1867
0
    return SBRDEC_UNSUPPORTED_CONFIG;
1868
0
  }
1869
1870
247k
  if (self->flags & SBRDEC_FLUSH) {
1871
    /* flushing is signalized, hence increment the flush frame counter */
1872
28
    self->numFlushedFrames++;
1873
247k
  } else {
1874
    /* no flushing is signalized, hence reset the flush frame counter */
1875
247k
    self->numFlushedFrames = 0;
1876
247k
  }
1877
1878
  /* Loop over SBR elements */
1879
286k
  for (sbrElementNum = 0; sbrElementNum < self->numSbrElements;
1880
282k
       sbrElementNum++) {
1881
282k
    int numElementChan;
1882
1883
282k
    if (psPossible &&
1884
9.68k
        self->pSbrElement[sbrElementNum]->pSbrChannel[1] == NULL) {
1885
      /* Disable PS and try decoding SBR mono. */
1886
0
      psPossible = 0;
1887
0
    }
1888
1889
282k
    numElementChan =
1890
282k
        (self->pSbrElement[sbrElementNum]->elementID == ID_CPE) ? 2 : 1;
1891
1892
    /* If core signal is bad then force upsampling */
1893
282k
    if (!coreDecodedOk) {
1894
94.3k
      setFrameErrorFlag(self->pSbrElement[sbrElementNum], FRAME_ERROR_ALLSLOTS);
1895
94.3k
    }
1896
1897
282k
    errorStatus = sbrDecoder_DecodeElement(
1898
282k
        self, input, timeData, timeDataSize, mapDescr, mapIdx, numSbrChannels,
1899
282k
        sbrElementNum,
1900
282k
        numCoreChannels, /* is correct even for USC SCI==2 case */
1901
282k
        &numElementChan, psPossible);
1902
1903
282k
    if (errorStatus != SBRDEC_OK) {
1904
0
      goto bail;
1905
0
    }
1906
1907
282k
    numSbrChannels += numElementChan;
1908
1909
282k
    if (numSbrChannels >= numCoreChannels) {
1910
243k
      break;
1911
243k
    }
1912
282k
  }
1913
1914
  /* Update numChannels and samplerate */
1915
  /* Do not mess with output channels in case of USAC. numSbrChannels !=
1916
   * numChannels for stereoConfigIndex == 2 */
1917
247k
  if (!(self->flags & SBRDEC_SYNTAX_USAC)) {
1918
56.6k
    *numChannels = numSbrChannels;
1919
56.6k
  }
1920
247k
  *sampleRate = self->sampleRateOut;
1921
247k
  *psDecoded = (self->flags & SBRDEC_PS_DECODED) ? 1 : 0;
1922
1923
  /* Clear reset and flush flag because everything seems to be done
1924
   * successfully. */
1925
247k
  self->flags &= ~SBRDEC_FORCE_RESET;
1926
247k
  self->flags &= ~SBRDEC_FLUSH;
1927
1928
247k
bail:
1929
1930
247k
  return errorStatus;
1931
247k
}
1932
1933
29.4k
SBR_ERROR sbrDecoder_Close(HANDLE_SBRDECODER *pSelf) {
1934
29.4k
  HANDLE_SBRDECODER self = *pSelf;
1935
29.4k
  int i;
1936
1937
29.4k
  if (self != NULL) {
1938
29.4k
    if (self->hParametricStereoDec != NULL) {
1939
1.69k
      DeletePsDec(&self->hParametricStereoDec);
1940
1.69k
    }
1941
1942
265k
    for (i = 0; i < (8); i++) {
1943
235k
      sbrDecoder_DestroyElement(self, i);
1944
235k
    }
1945
1946
29.4k
    FreeRam_SbrDecoder(pSelf);
1947
29.4k
  }
1948
1949
29.4k
  return SBRDEC_OK;
1950
29.4k
}
1951
1952
0
INT sbrDecoder_GetLibInfo(LIB_INFO *info) {
1953
0
  int i;
1954
1955
0
  if (info == NULL) {
1956
0
    return -1;
1957
0
  }
1958
1959
  /* search for next free tab */
1960
0
  for (i = 0; i < FDK_MODULE_LAST; i++) {
1961
0
    if (info[i].module_id == FDK_NONE) break;
1962
0
  }
1963
0
  if (i == FDK_MODULE_LAST) return -1;
1964
0
  info += i;
1965
1966
0
  info->module_id = FDK_SBRDEC;
1967
0
  info->version =
1968
0
      LIB_VERSION(SBRDECODER_LIB_VL0, SBRDECODER_LIB_VL1, SBRDECODER_LIB_VL2);
1969
0
  LIB_VERSION_STRING(info);
1970
0
  info->build_date = SBRDECODER_LIB_BUILD_DATE;
1971
0
  info->build_time = SBRDECODER_LIB_BUILD_TIME;
1972
0
  info->title = SBRDECODER_LIB_TITLE;
1973
1974
  /* Set flags */
1975
0
  info->flags = 0 | CAPF_SBR_HQ | CAPF_SBR_LP | CAPF_SBR_PS_MPEG |
1976
0
                CAPF_SBR_DRM_BS | CAPF_SBR_CONCEALMENT | CAPF_SBR_DRC |
1977
0
                CAPF_SBR_ELD_DOWNSCALE | CAPF_SBR_HBEHQ;
1978
  /* End of flags */
1979
1980
0
  return 0;
1981
0
}
1982
1983
234k
UINT sbrDecoder_GetDelay(const HANDLE_SBRDECODER self) {
1984
234k
  UINT outputDelay = 0;
1985
1986
234k
  if (self != NULL) {
1987
234k
    UINT flags = self->flags;
1988
1989
    /* See chapter 1.6.7.2 of ISO/IEC 14496-3 for the GA-SBR figures below. */
1990
1991
    /* Are we initialized? */
1992
234k
    if ((self->numSbrChannels > 0) && (self->numSbrElements > 0)) {
1993
      /* Add QMF synthesis delay */
1994
234k
      if ((flags & SBRDEC_ELD_GRID) && IS_LOWDELAY(self->coreCodec)) {
1995
        /* Low delay SBR: */
1996
30.1k
        if (!(flags & SBRDEC_SKIP_QMF_SYN)) {
1997
28.6k
          outputDelay +=
1998
28.6k
              (flags & SBRDEC_DOWNSAMPLE) ? 32 : 64; /* QMF synthesis */
1999
28.6k
          if (flags & SBRDEC_LD_MPS_QMF) {
2000
487
            outputDelay += 32;
2001
487
          }
2002
28.6k
        }
2003
204k
      } else if (!IS_USAC(self->coreCodec)) {
2004
        /* By the method of elimination this is the GA (AAC-LC, HE-AAC, ...)
2005
         * branch: */
2006
26.4k
        outputDelay += (flags & SBRDEC_DOWNSAMPLE) ? 481 : 962;
2007
26.4k
        if (flags & SBRDEC_SKIP_QMF_SYN) {
2008
0
          outputDelay -= 257; /* QMF synthesis */
2009
0
        }
2010
26.4k
      }
2011
234k
    }
2012
234k
  }
2013
2014
234k
  return (outputDelay);
2015
234k
}