Coverage Report

Created: 2025-07-23 06:43

/src/aac/libSBRdec/src/sbrdecoder.cpp
Line
Count
Source (jump to first uncovered line)
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
599k
static void setFrameErrorFlag(SBR_DECODER_ELEMENT *pSbrElement, UCHAR value) {
170
599k
  if (pSbrElement != NULL) {
171
599k
    switch (value) {
172
163k
      case FRAME_ERROR_ALLSLOTS:
173
163k
        FDKmemset(pSbrElement->frameErrorFlag, FRAME_ERROR,
174
163k
                  sizeof(pSbrElement->frameErrorFlag));
175
163k
        break;
176
436k
      default:
177
436k
        pSbrElement->frameErrorFlag[pSbrElement->useFrameSlot] = value;
178
599k
    }
179
599k
  }
180
599k
}
181
182
719k
static UCHAR getHeaderSlot(UCHAR currentSlot, UCHAR hdrSlotUsage[(1) + 1]) {
183
719k
  UINT occupied = 0;
184
719k
  int s;
185
719k
  UCHAR slot = hdrSlotUsage[currentSlot];
186
187
719k
  FDK_ASSERT((1) + 1 < 32);
188
189
1.93M
  for (s = 0; s < (1) + 1; s++) {
190
1.40M
    if ((hdrSlotUsage[s] == slot) && (s != slot)) {
191
191k
      occupied = 1;
192
191k
      break;
193
191k
    }
194
1.40M
  }
195
196
719k
  if (occupied) {
197
191k
    occupied = 0;
198
199
574k
    for (s = 0; s < (1) + 1; s++) {
200
383k
      occupied |= 1 << hdrSlotUsage[s];
201
383k
    }
202
356k
    for (s = 0; s < (1) + 1; s++) {
203
354k
      if (!(occupied & 0x1)) {
204
189k
        slot = s;
205
189k
        break;
206
189k
      }
207
165k
      occupied >>= 1;
208
165k
    }
209
191k
  }
210
211
719k
  return slot;
212
719k
}
213
214
static void copySbrHeader(HANDLE_SBR_HEADER_DATA hDst,
215
38.3k
                          const HANDLE_SBR_HEADER_DATA hSrc) {
216
  /* copy the whole header memory (including pointers) */
217
38.3k
  FDKmemcpy(hDst, hSrc, sizeof(SBR_HEADER_DATA));
218
219
  /* update pointers */
220
38.3k
  hDst->freqBandData.freqBandTable[0] = hDst->freqBandData.freqBandTableLo;
221
38.3k
  hDst->freqBandData.freqBandTable[1] = hDst->freqBandData.freqBandTableHi;
222
38.3k
}
223
224
static int compareSbrHeader(const HANDLE_SBR_HEADER_DATA hHdr1,
225
6.99k
                            const HANDLE_SBR_HEADER_DATA hHdr2) {
226
6.99k
  int result = 0;
227
228
  /* compare basic data */
229
6.99k
  result |= (hHdr1->syncState != hHdr2->syncState) ? 1 : 0;
230
6.99k
  result |= (hHdr1->status != hHdr2->status) ? 1 : 0;
231
6.99k
  result |= (hHdr1->frameErrorFlag != hHdr2->frameErrorFlag) ? 1 : 0;
232
6.99k
  result |= (hHdr1->numberTimeSlots != hHdr2->numberTimeSlots) ? 1 : 0;
233
6.99k
  result |=
234
6.99k
      (hHdr1->numberOfAnalysisBands != hHdr2->numberOfAnalysisBands) ? 1 : 0;
235
6.99k
  result |= (hHdr1->timeStep != hHdr2->timeStep) ? 1 : 0;
236
6.99k
  result |= (hHdr1->sbrProcSmplRate != hHdr2->sbrProcSmplRate) ? 1 : 0;
237
238
  /* compare bitstream data */
239
6.99k
  result |=
240
6.99k
      FDKmemcmp(&hHdr1->bs_data, &hHdr2->bs_data, sizeof(SBR_HEADER_DATA_BS));
241
6.99k
  result |=
242
6.99k
      FDKmemcmp(&hHdr1->bs_dflt, &hHdr2->bs_dflt, sizeof(SBR_HEADER_DATA_BS));
243
6.99k
  result |= FDKmemcmp(&hHdr1->bs_info, &hHdr2->bs_info,
244
6.99k
                      sizeof(SBR_HEADER_DATA_BS_INFO));
245
246
  /* compare frequency band data */
247
6.99k
  result |= FDKmemcmp(&hHdr1->freqBandData, &hHdr2->freqBandData,
248
6.99k
                      (8 + MAX_NUM_LIMITERS + 1) * sizeof(UCHAR));
249
6.99k
  result |= FDKmemcmp(hHdr1->freqBandData.freqBandTableLo,
250
6.99k
                      hHdr2->freqBandData.freqBandTableLo,
251
6.99k
                      (MAX_FREQ_COEFFS / 2 + 1) * sizeof(UCHAR));
252
6.99k
  result |= FDKmemcmp(hHdr1->freqBandData.freqBandTableHi,
253
6.99k
                      hHdr2->freqBandData.freqBandTableHi,
254
6.99k
                      (MAX_FREQ_COEFFS + 1) * sizeof(UCHAR));
255
6.99k
  result |= FDKmemcmp(hHdr1->freqBandData.freqBandTableNoise,
256
6.99k
                      hHdr2->freqBandData.freqBandTableNoise,
257
6.99k
                      (MAX_NOISE_COEFFS + 1) * sizeof(UCHAR));
258
6.99k
  result |=
259
6.99k
      FDKmemcmp(hHdr1->freqBandData.v_k_master, hHdr2->freqBandData.v_k_master,
260
6.99k
                (MAX_FREQ_COEFFS + 1) * sizeof(UCHAR));
261
262
6.99k
  return result;
263
6.99k
}
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
106k
                                         const int overlap) {
279
106k
  SBR_ERROR sbrError = SBRDEC_OK;
280
106k
  HANDLE_SBR_HEADER_DATA hSbrHeader;
281
106k
  UINT qmfFlags = 0;
282
283
106k
  int i, synDownsampleFac;
284
285
  /* USAC: assuming theoretical case 8 kHz output sample rate with 4:1 SBR */
286
106k
  const int sbr_min_sample_rate_in = IS_USAC(self->coreCodec) ? 2000 : 6400;
287
288
  /* Check in/out samplerates */
289
106k
  if (sampleRateIn < sbr_min_sample_rate_in || sampleRateIn > (96000)) {
290
665
    sbrError = SBRDEC_UNSUPPORTED_CONFIG;
291
665
    goto bail;
292
665
  }
293
294
105k
  if (sampleRateOut > (96000)) {
295
320
    sbrError = SBRDEC_UNSUPPORTED_CONFIG;
296
320
    goto bail;
297
320
  }
298
299
  /* Set QMF mode flags */
300
105k
  if (self->flags & SBRDEC_LOW_POWER) qmfFlags |= QMF_FLAG_LP;
301
302
105k
  if (self->coreCodec == AOT_ER_AAC_ELD) {
303
67.0k
    if (self->flags & SBRDEC_LD_MPS_QMF) {
304
0
      qmfFlags |= QMF_FLAG_MPSLDFB;
305
67.0k
    } else {
306
67.0k
      qmfFlags |= QMF_FLAG_CLDFB;
307
67.0k
    }
308
67.0k
  }
309
310
  /* Set downsampling factor for synthesis filter bank */
311
105k
  if (sampleRateOut == 0) {
312
    /* no single rate mode */
313
5.27k
    sampleRateOut =
314
5.27k
        sampleRateIn
315
5.27k
        << 1; /* In case of implicit signalling, assume dual rate SBR */
316
5.27k
  }
317
318
105k
  if (sampleRateIn == sampleRateOut) {
319
49.4k
    synDownsampleFac = 2;
320
49.4k
    self->flags |= SBRDEC_DOWNSAMPLE;
321
55.8k
  } else {
322
55.8k
    synDownsampleFac = 1;
323
55.8k
    self->flags &= ~SBRDEC_DOWNSAMPLE;
324
55.8k
  }
325
326
105k
  self->synDownsampleFac = synDownsampleFac;
327
105k
  self->sampleRateOut = sampleRateOut;
328
329
105k
  {
330
315k
    for (i = 0; i < (1) + 1; i++) {
331
210k
      int setDflt;
332
210k
      hSbrHeader = &(self->sbrHeader[elementIndex][i]);
333
210k
      setDflt = ((hSbrHeader->syncState == SBR_NOT_INITIALIZED) ||
334
210k
                 (self->flags & SBRDEC_FORCE_RESET))
335
210k
                    ? 1
336
210k
                    : 0;
337
338
      /* init a default header such that we can at least do upsampling later */
339
210k
      sbrError = initHeaderData(hSbrHeader, sampleRateIn, sampleRateOut,
340
210k
                                self->downscaleFactor, samplesPerFrame,
341
210k
                                self->flags, setDflt);
342
343
      /* Set synchState to UPSAMPLING in case it already is initialized */
344
210k
      hSbrHeader->syncState = hSbrHeader->syncState > UPSAMPLING
345
210k
                                  ? UPSAMPLING
346
210k
                                  : hSbrHeader->syncState;
347
210k
    }
348
105k
  }
349
350
105k
  if (sbrError != SBRDEC_OK) {
351
58
    goto bail;
352
58
  }
353
354
105k
  if (!self->pQmfDomain->globalConf.qmfDomainExplicitConfig) {
355
105k
    self->pQmfDomain->globalConf.flags_requested |= qmfFlags;
356
105k
    self->pQmfDomain->globalConf.nBandsAnalysis_requested =
357
105k
        self->sbrHeader[elementIndex][0].numberOfAnalysisBands;
358
105k
    self->pQmfDomain->globalConf.nBandsSynthesis_requested =
359
105k
        (synDownsampleFac == 1) ? 64 : 32; /* may be overwritten by MPS */
360
105k
    self->pQmfDomain->globalConf.nBandsSynthesis_requested /=
361
105k
        self->downscaleFactor;
362
105k
    self->pQmfDomain->globalConf.nQmfTimeSlots_requested =
363
105k
        self->sbrHeader[elementIndex][0].numberTimeSlots *
364
105k
        self->sbrHeader[elementIndex][0].timeStep;
365
105k
    self->pQmfDomain->globalConf.nQmfOvTimeSlots_requested = overlap;
366
105k
    self->pQmfDomain->globalConf.nQmfProcBands_requested = 64; /* always 64 */
367
105k
    self->pQmfDomain->globalConf.nQmfProcChannels_requested =
368
105k
        1; /* may be overwritten by MPS */
369
105k
  }
370
371
  /* Init SBR channels going to be assigned to a SBR element */
372
105k
  {
373
105k
    int ch;
374
264k
    for (ch = 0; ch < self->pSbrElement[elementIndex]->nChannels; ch++) {
375
160k
      int headerIndex =
376
160k
          getHeaderSlot(self->pSbrElement[elementIndex]->useFrameSlot,
377
160k
                        self->pSbrElement[elementIndex]->useHeaderSlot);
378
379
      /* and create sbrDec */
380
160k
      sbrError =
381
160k
          createSbrDec(self->pSbrElement[elementIndex]->pSbrChannel[ch],
382
160k
                       &self->sbrHeader[elementIndex][headerIndex],
383
160k
                       &self->pSbrElement[elementIndex]->transposerSettings,
384
160k
                       synDownsampleFac, qmfFlags, self->flags, overlap, ch,
385
160k
                       self->codecFrameSize);
386
387
160k
      if (sbrError != SBRDEC_OK) {
388
953
        goto bail;
389
953
      }
390
160k
    }
391
105k
  }
392
393
  // FDKmemclear(sbr_OverlapBuffer, sizeof(sbr_OverlapBuffer));
394
395
104k
  if (self->numSbrElements == 1) {
396
64.0k
    switch (self->coreCodec) {
397
1.26k
      case AOT_AAC_LC:
398
1.26k
      case AOT_SBR:
399
1.26k
      case AOT_PS:
400
4.54k
      case AOT_ER_AAC_SCAL:
401
4.54k
      case AOT_DRM_AAC:
402
4.54k
      case AOT_DRM_SURROUND:
403
4.54k
        if (CreatePsDec(&self->hParametricStereoDec, samplesPerFrame)) {
404
0
          sbrError = SBRDEC_CREATE_ERROR;
405
0
          goto bail;
406
0
        }
407
4.54k
        break;
408
59.5k
      default:
409
59.5k
        break;
410
64.0k
    }
411
64.0k
  }
412
413
  /* Init frame delay slot handling */
414
104k
  self->pSbrElement[elementIndex]->useFrameSlot = 0;
415
312k
  for (i = 0; i < ((1) + 1); i++) {
416
208k
    self->pSbrElement[elementIndex]->useHeaderSlot[i] = i;
417
208k
  }
418
419
106k
bail:
420
421
106k
  return sbrError;
422
104k
}
423
424
/*!
425
  \brief Assign QMF domain provided QMF channels to SBR channels.
426
427
  \return void
428
*/
429
106k
static void sbrDecoder_AssignQmfChannels2SbrChannels(HANDLE_SBRDECODER self) {
430
106k
  int ch, el, absCh_offset = 0;
431
305k
  for (el = 0; el < self->numSbrElements; el++) {
432
198k
    if (self->pSbrElement[el] != NULL) {
433
500k
      for (ch = 0; ch < self->pSbrElement[el]->nChannels; ch++) {
434
301k
        FDK_ASSERT(((absCh_offset + ch) < ((8) + (1))) &&
435
301k
                   ((absCh_offset + ch) < ((8) + (1))));
436
301k
        self->pSbrElement[el]->pSbrChannel[ch]->SbrDec.qmfDomainInCh =
437
301k
            &self->pQmfDomain->QmfDomainIn[absCh_offset + ch];
438
301k
        self->pSbrElement[el]->pSbrChannel[ch]->SbrDec.qmfDomainOutCh =
439
301k
            &self->pQmfDomain->QmfDomainOut[absCh_offset + ch];
440
301k
      }
441
198k
      absCh_offset += self->pSbrElement[el]->nChannels;
442
198k
    }
443
198k
  }
444
106k
}
445
446
SBR_ERROR sbrDecoder_Open(HANDLE_SBRDECODER *pSelf,
447
36.8k
                          HANDLE_FDK_QMF_DOMAIN pQmfDomain) {
448
36.8k
  HANDLE_SBRDECODER self = NULL;
449
36.8k
  SBR_ERROR sbrError = SBRDEC_OK;
450
36.8k
  int elIdx;
451
452
36.8k
  if ((pSelf == NULL) || (pQmfDomain == NULL)) {
453
0
    return SBRDEC_INVALID_ARGUMENT;
454
0
  }
455
456
  /* Get memory for this instance */
457
36.8k
  self = GetRam_SbrDecoder();
458
36.8k
  if (self == NULL) {
459
0
    sbrError = SBRDEC_MEM_ALLOC_FAILED;
460
0
    goto bail;
461
0
  }
462
463
36.8k
  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
36.8k
  self->numDelayFrames = (1); /* set to the max value by default */
473
474
  /* Initialize header sync state */
475
331k
  for (elIdx = 0; elIdx < (8); elIdx += 1) {
476
294k
    int i;
477
884k
    for (i = 0; i < (1) + 1; i += 1) {
478
589k
      self->sbrHeader[elIdx][i].syncState = SBR_NOT_INITIALIZED;
479
589k
    }
480
294k
  }
481
482
36.8k
  *pSelf = self;
483
484
36.8k
bail:
485
36.8k
  return sbrError;
486
36.8k
}
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.44M
static int sbrDecoder_isCoreCodecValid(AUDIO_OBJECT_TYPE coreCodec) {
494
1.44M
  switch (coreCodec) {
495
13.1k
    case AOT_AAC_LC:
496
13.1k
    case AOT_SBR:
497
13.1k
    case AOT_PS:
498
71.6k
    case AOT_ER_AAC_SCAL:
499
1.09M
    case AOT_ER_AAC_ELD:
500
1.09M
    case AOT_DRM_AAC:
501
1.09M
    case AOT_DRM_SURROUND:
502
1.44M
    case AOT_USAC:
503
1.44M
      return 1;
504
1.04k
    default:
505
1.04k
      return 0;
506
1.44M
  }
507
1.44M
}
508
509
static void sbrDecoder_DestroyElement(HANDLE_SBRDECODER self,
510
1.57M
                                      const int elementIndex) {
511
1.57M
  if (self->pSbrElement[elementIndex] != NULL) {
512
105k
    int ch;
513
514
316k
    for (ch = 0; ch < SBRDEC_MAX_CH_PER_ELEMENT; ch++) {
515
211k
      if (self->pSbrElement[elementIndex]->pSbrChannel[ch] != NULL) {
516
160k
        deleteSbrDec(self->pSbrElement[elementIndex]->pSbrChannel[ch]);
517
160k
        FreeRam_SbrDecChannel(
518
160k
            &self->pSbrElement[elementIndex]->pSbrChannel[ch]);
519
160k
        self->numSbrChannels -= 1;
520
160k
      }
521
211k
    }
522
105k
    FreeRam_SbrDecElement(&self->pSbrElement[elementIndex]);
523
105k
    self->numSbrElements -= 1;
524
105k
  }
525
1.57M
}
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
820k
    const UCHAR configMode, UCHAR *configChanged, const INT downscaleFactor) {
533
820k
  SBR_ERROR sbrError = SBRDEC_OK;
534
820k
  int chCnt = 0;
535
820k
  int nSbrElementsStart;
536
820k
  int nSbrChannelsStart;
537
820k
  if (self == NULL) {
538
0
    return SBRDEC_INVALID_ARGUMENT;
539
0
  }
540
541
820k
  nSbrElementsStart = self->numSbrElements;
542
820k
  nSbrChannelsStart = self->numSbrChannels;
543
544
  /* Check core codec AOT */
545
820k
  if (!sbrDecoder_isCoreCodecValid(coreCodec) || elementIndex >= (8)) {
546
1.04k
    sbrError = SBRDEC_UNSUPPORTED_CONFIG;
547
1.04k
    goto bail;
548
1.04k
  }
549
550
819k
  if (elementID != ID_SCE && elementID != ID_CPE && elementID != ID_LFE) {
551
0
    sbrError = SBRDEC_UNSUPPORTED_CONFIG;
552
0
    goto bail;
553
0
  }
554
555
819k
  if (self->sampleRateIn == sampleRateIn &&
556
819k
      self->codecFrameSize == samplesPerFrame && self->coreCodec == coreCodec &&
557
819k
      self->pSbrElement[elementIndex] != NULL &&
558
819k
      self->pSbrElement[elementIndex]->elementID == elementID &&
559
819k
      !(self->flags & SBRDEC_FORCE_RESET) &&
560
819k
      ((sampleRateOut == 0) ? 1 : (self->sampleRateOut == sampleRateOut)) &&
561
819k
      ((harmonicSBR == 2) ? 1
562
581k
                          : (self->harmonicSBR ==
563
387k
                             harmonicSBR)) /* The value 2 signalizes that
564
                                              harmonicSBR shall be ignored in
565
                                              the config change detection */
566
819k
  ) {
567
    /* Nothing to do */
568
578k
    return SBRDEC_OK;
569
578k
  } else {
570
241k
    if (configMode & AC_CM_DET_CFG_CHANGE) {
571
135k
      *configChanged = 1;
572
135k
    }
573
241k
  }
574
575
  /* reaching this point the SBR-decoder gets (re-)configured */
576
577
  /* The flags field is used for all elements! */
578
241k
  self->flags &=
579
241k
      (SBRDEC_FORCE_RESET | SBRDEC_FLUSH); /* Keep the global flags. They will
580
                                              be reset after decoding. */
581
241k
  self->flags |= (downscaleFactor > 1) ? SBRDEC_ELD_DOWNSCALE : 0;
582
241k
  self->flags |= (coreCodec == AOT_ER_AAC_ELD) ? SBRDEC_ELD_GRID : 0;
583
241k
  self->flags |= (coreCodec == AOT_ER_AAC_SCAL) ? SBRDEC_SYNTAX_SCAL : 0;
584
241k
  self->flags |=
585
241k
      (coreCodec == AOT_DRM_AAC) ? SBRDEC_SYNTAX_SCAL | SBRDEC_SYNTAX_DRM : 0;
586
241k
  self->flags |= (coreCodec == AOT_DRM_SURROUND)
587
241k
                     ? SBRDEC_SYNTAX_SCAL | SBRDEC_SYNTAX_DRM
588
241k
                     : 0;
589
241k
  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
241k
  self->flags |= (sampleRateIn == sampleRateOut / 4) ? SBRDEC_QUAD_RATE : 0;
593
241k
  self->flags |= (harmonicSBR == 1) ? SBRDEC_USAC_HARMONICSBR : 0;
594
595
241k
  if (configMode & AC_CM_DET_CFG_CHANGE) {
596
135k
    return SBRDEC_OK;
597
135k
  }
598
599
106k
  self->sampleRateIn = sampleRateIn;
600
106k
  self->codecFrameSize = samplesPerFrame;
601
106k
  self->coreCodec = coreCodec;
602
106k
  self->harmonicSBR = harmonicSBR;
603
106k
  self->downscaleFactor = downscaleFactor;
604
605
  /* Init SBR elements */
606
106k
  {
607
106k
    int elChannels, ch;
608
609
106k
    if (self->pSbrElement[elementIndex] == NULL) {
610
105k
      self->pSbrElement[elementIndex] = GetRam_SbrDecElement(elementIndex);
611
105k
      if (self->pSbrElement[elementIndex] == NULL) {
612
0
        sbrError = SBRDEC_MEM_ALLOC_FAILED;
613
0
        goto bail;
614
0
      }
615
105k
      self->numSbrElements++;
616
105k
    } else {
617
753
      self->numSbrChannels -= self->pSbrElement[elementIndex]->nChannels;
618
753
    }
619
620
    /* Determine amount of channels for this element */
621
106k
    switch (elementID) {
622
0
      case ID_NONE:
623
52.2k
      case ID_CPE:
624
52.2k
        elChannels = 2;
625
52.2k
        break;
626
8.32k
      case ID_LFE:
627
54.0k
      case ID_SCE:
628
54.0k
        elChannels = 1;
629
54.0k
        break;
630
0
      default:
631
0
        elChannels = 0;
632
0
        break;
633
106k
    }
634
635
    /* Handle case of Parametric Stereo */
636
106k
    if (elementIndex == 0 && elementID == ID_SCE) {
637
42.2k
      switch (coreCodec) {
638
1.23k
        case AOT_AAC_LC:
639
1.23k
        case AOT_SBR:
640
1.23k
        case AOT_PS:
641
3.46k
        case AOT_ER_AAC_SCAL:
642
3.46k
        case AOT_DRM_AAC:
643
3.46k
        case AOT_DRM_SURROUND:
644
3.46k
          elChannels = 2;
645
3.46k
          break;
646
38.7k
        default:
647
38.7k
          break;
648
42.2k
      }
649
42.2k
    }
650
651
    /* Sanity check to avoid memory leaks */
652
106k
    if (elChannels < self->pSbrElement[elementIndex]->nChannels ||
653
106k
        (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
106k
    self->pSbrElement[elementIndex]->elementID = elementID;
662
106k
    self->pSbrElement[elementIndex]->nChannels = elChannels;
663
664
268k
    for (ch = 0; ch < elChannels; ch++) {
665
162k
      if (self->pSbrElement[elementIndex]->pSbrChannel[ch] == NULL) {
666
160k
        self->pSbrElement[elementIndex]->pSbrChannel[ch] =
667
160k
            GetRam_SbrDecChannel(chCnt);
668
160k
        if (self->pSbrElement[elementIndex]->pSbrChannel[ch] == NULL) {
669
0
          sbrError = SBRDEC_MEM_ALLOC_FAILED;
670
0
          goto bail;
671
0
        }
672
160k
      }
673
162k
      self->numSbrChannels++;
674
675
162k
      sbrDecoder_drcInitChannel(&self->pSbrElement[elementIndex]
676
162k
                                     ->pSbrChannel[ch]
677
162k
                                     ->SbrDec.sbrDrcChannel);
678
679
162k
      chCnt++;
680
162k
    }
681
106k
  }
682
683
106k
  if (!self->pQmfDomain->globalConf.qmfDomainExplicitConfig) {
684
106k
    self->pQmfDomain->globalConf.nInputChannels_requested =
685
106k
        self->numSbrChannels;
686
106k
    self->pQmfDomain->globalConf.nOutputChannels_requested =
687
106k
        fMax((INT)self->numSbrChannels,
688
106k
             (INT)self->pQmfDomain->globalConf.nOutputChannels_requested);
689
106k
  }
690
691
  /* Make sure each SBR channel has one QMF channel assigned even if
692
   * numSbrChannels or element set-up has changed. */
693
106k
  sbrDecoder_AssignQmfChannels2SbrChannels(self);
694
695
  /* clear error flags for all delay slots */
696
106k
  FDKmemclear(self->pSbrElement[elementIndex]->frameErrorFlag,
697
106k
              ((1) + 1) * sizeof(UCHAR));
698
699
106k
  {
700
106k
    int overlap;
701
702
106k
    if (coreCodec == AOT_ER_AAC_ELD) {
703
67.8k
      overlap = 0;
704
67.8k
    } else if (self->flags & SBRDEC_QUAD_RATE) {
705
9.58k
      overlap = (3 * 4);
706
28.8k
    } else {
707
28.8k
      overlap = (3 * 2);
708
28.8k
    }
709
    /* Initialize this instance */
710
106k
    sbrError = sbrDecoder_ResetElement(self, sampleRateIn, sampleRateOut,
711
106k
                                       samplesPerFrame, elementID, elementIndex,
712
106k
                                       overlap);
713
106k
  }
714
715
107k
bail:
716
107k
  if (sbrError != SBRDEC_OK) {
717
3.04k
    if ((nSbrElementsStart < self->numSbrElements) ||
718
3.04k
        (nSbrChannelsStart < self->numSbrChannels)) {
719
      /* Free the memory allocated for this element */
720
1.99k
      sbrDecoder_DestroyElement(self, elementIndex);
721
1.99k
    } else if ((elementIndex < (8)) &&
722
1.04k
               (self->pSbrElement[elementIndex] !=
723
1.04k
                NULL)) { /* Set error flag to trigger concealment */
724
0
      setFrameErrorFlag(self->pSbrElement[elementIndex], FRAME_ERROR);
725
0
    }
726
3.04k
  }
727
728
107k
  return sbrError;
729
106k
}
730
731
/**
732
 * \brief Free config dependent SBR memory.
733
 * \param self SBR decoder instance handle
734
 */
735
159k
SBR_ERROR sbrDecoder_FreeMem(HANDLE_SBRDECODER *self) {
736
159k
  int i;
737
159k
  int elIdx;
738
739
159k
  if (self != NULL && *self != NULL) {
740
1.43M
    for (i = 0; i < (8); i++) {
741
1.27M
      sbrDecoder_DestroyElement(*self, i);
742
1.27M
    }
743
744
1.43M
    for (elIdx = 0; elIdx < (8); elIdx += 1) {
745
3.83M
      for (i = 0; i < (1) + 1; i += 1) {
746
2.55M
        (*self)->sbrHeader[elIdx][i].syncState = SBR_NOT_INITIALIZED;
747
2.55M
      }
748
1.27M
    }
749
159k
  }
750
751
159k
  return SBRDEC_OK;
752
159k
}
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
276k
                                         const int numElementChannels) {
769
276k
  SBR_ERROR errorStatus = SBRDEC_OK;
770
771
  /*
772
    change of control data, reset decoder
773
  */
774
276k
  errorStatus = resetFreqBandTables(hSbrHeader, self->flags);
775
776
276k
  if (errorStatus == SBRDEC_OK) {
777
241k
    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
51.2k
      hSbrHeader->freqBandData.lowSubband = hSbrHeader->numberOfAnalysisBands;
788
51.2k
      hSbrHeader->freqBandData.highSubband = hSbrHeader->numberOfAnalysisBands;
789
51.2k
    }
790
791
    /* Trigger a reset before processing this slot */
792
241k
    hSbrHeader->status |= SBRDEC_HDR_STAT_RESET;
793
241k
  }
794
795
276k
  return errorStatus;
796
276k
}
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
620k
                      const INT downscaleFactor) {
806
620k
  SBR_HEADER_STATUS headerStatus;
807
620k
  HANDLE_SBR_HEADER_DATA hSbrHeader;
808
620k
  SBR_ERROR sbrError = SBRDEC_OK;
809
620k
  int headerIndex;
810
620k
  UINT flagsSaved =
811
620k
      0; /* flags should not be changed in AC_CM_DET_CFG_CHANGE - mode after
812
            parsing */
813
814
620k
  if (self == NULL || elementIndex >= (8)) {
815
0
    return SBRDEC_UNSUPPORTED_CONFIG;
816
0
  }
817
818
620k
  if (!sbrDecoder_isCoreCodecValid(coreCodec)) {
819
0
    return SBRDEC_UNSUPPORTED_CONFIG;
820
0
  }
821
822
620k
  if (configMode & AC_CM_DET_CFG_CHANGE) {
823
399k
    flagsSaved = self->flags; /* store */
824
399k
  }
825
826
620k
  sbrError = sbrDecoder_InitElement(
827
620k
      self, sampleRateIn, sampleRateOut, samplesPerFrame, coreCodec, elementID,
828
620k
      elementIndex, harmonicSBR, stereoConfigIndex, configMode, configChanged,
829
620k
      downscaleFactor);
830
831
620k
  if ((sbrError != SBRDEC_OK) || (elementID == ID_LFE)) {
832
79.7k
    goto bail;
833
79.7k
  }
834
835
540k
  if (configMode & AC_CM_DET_CFG_CHANGE) {
836
348k
    hSbrHeader = NULL;
837
348k
  } else {
838
192k
    headerIndex = getHeaderSlot(self->pSbrElement[elementIndex]->useFrameSlot,
839
192k
                                self->pSbrElement[elementIndex]->useHeaderSlot);
840
841
192k
    hSbrHeader = &(self->sbrHeader[elementIndex][headerIndex]);
842
192k
  }
843
844
540k
  headerStatus = sbrGetHeaderData(hSbrHeader, hBs, self->flags, 0, configMode);
845
846
540k
  if (coreCodec == AOT_USAC) {
847
170k
    if (configMode & AC_CM_DET_CFG_CHANGE) {
848
107k
      self->flags = flagsSaved; /* restore */
849
107k
    }
850
170k
    return sbrError;
851
170k
  }
852
853
370k
  if (configMode & AC_CM_ALLOC_MEM) {
854
130k
    SBR_DECODER_ELEMENT *pSbrElement;
855
856
130k
    pSbrElement = self->pSbrElement[elementIndex];
857
858
    /* Sanity check */
859
130k
    if (pSbrElement != NULL) {
860
130k
      if ((elementID == ID_CPE && pSbrElement->nChannels != 2) ||
861
130k
          (elementID != ID_CPE && pSbrElement->nChannels != 1)) {
862
0
        return SBRDEC_UNSUPPORTED_CONFIG;
863
0
      }
864
130k
      if (headerStatus == HEADER_RESET) {
865
93.4k
        sbrError = sbrDecoder_HeaderUpdate(self, hSbrHeader, headerStatus,
866
93.4k
                                           pSbrElement->pSbrChannel,
867
93.4k
                                           pSbrElement->nChannels);
868
869
93.4k
        if (sbrError == SBRDEC_OK) {
870
85.4k
          hSbrHeader->syncState = SBR_HEADER;
871
85.4k
          hSbrHeader->status |= SBRDEC_HDR_STAT_UPDATE;
872
85.4k
        } else {
873
8.03k
          hSbrHeader->syncState = SBR_NOT_INITIALIZED;
874
8.03k
          hSbrHeader->status = HEADER_ERROR;
875
8.03k
        }
876
93.4k
      }
877
130k
    }
878
130k
  }
879
450k
bail:
880
450k
  if (configMode & AC_CM_DET_CFG_CHANGE) {
881
292k
    self->flags = flagsSaved; /* restore */
882
292k
  }
883
450k
  return sbrError;
884
370k
}
885
886
SBR_ERROR sbrDecoder_SetParam(HANDLE_SBRDECODER self, const SBRDEC_PARAM param,
887
1.63M
                              const INT value) {
888
1.63M
  SBR_ERROR errorStatus = SBRDEC_OK;
889
890
  /* configure the subsystems */
891
1.63M
  switch (param) {
892
399k
    case SBR_SYSTEM_BITSTREAM_DELAY:
893
399k
      if (value < 0 || value > (1)) {
894
0
        errorStatus = SBRDEC_SET_PARAM_FAIL;
895
0
        break;
896
0
      }
897
399k
      if (self == NULL) {
898
0
        errorStatus = SBRDEC_NOT_INITIALIZED;
899
399k
      } else {
900
399k
        self->numDelayFrames = (UCHAR)value;
901
399k
      }
902
399k
      break;
903
497k
    case SBR_QMF_MODE:
904
497k
      if (self == NULL) {
905
0
        errorStatus = SBRDEC_NOT_INITIALIZED;
906
497k
      } else {
907
497k
        if (value == 1) {
908
146k
          self->flags |= SBRDEC_LOW_POWER;
909
350k
        } else {
910
350k
          self->flags &= ~SBRDEC_LOW_POWER;
911
350k
        }
912
497k
      }
913
497k
      break;
914
45.7k
    case SBR_LD_QMF_TIME_ALIGN:
915
45.7k
      if (self == NULL) {
916
0
        errorStatus = SBRDEC_NOT_INITIALIZED;
917
45.7k
      } else {
918
45.7k
        if (value == 1) {
919
2.39k
          self->flags |= SBRDEC_LD_MPS_QMF;
920
43.3k
        } else {
921
43.3k
          self->flags &= ~SBRDEC_LD_MPS_QMF;
922
43.3k
        }
923
45.7k
      }
924
45.7k
      break;
925
339k
    case SBR_FLUSH_DATA:
926
339k
      if (value != 0) {
927
22
        if (self == NULL) {
928
0
          errorStatus = SBRDEC_NOT_INITIALIZED;
929
22
        } else {
930
22
          self->flags |= SBRDEC_FLUSH;
931
22
        }
932
22
      }
933
339k
      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
8.76k
    case SBR_BS_INTERRUPTION: {
944
8.76k
      int elementIndex;
945
946
8.76k
      if (self == NULL) {
947
0
        errorStatus = SBRDEC_NOT_INITIALIZED;
948
0
        break;
949
0
      }
950
951
      /* Loop over SBR elements */
952
16.1k
      for (elementIndex = 0; elementIndex < self->numSbrElements;
953
8.76k
           elementIndex++) {
954
7.39k
        if (self->pSbrElement[elementIndex] != NULL) {
955
7.39k
          HANDLE_SBR_HEADER_DATA hSbrHeader;
956
7.39k
          int headerIndex =
957
7.39k
              getHeaderSlot(self->pSbrElement[elementIndex]->useFrameSlot,
958
7.39k
                            self->pSbrElement[elementIndex]->useHeaderSlot);
959
960
7.39k
          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
7.39k
          if (hSbrHeader->syncState != SBR_NOT_INITIALIZED) {
965
7.25k
            hSbrHeader->syncState = UPSAMPLING;
966
7.25k
            hSbrHeader->status |= SBRDEC_HDR_STAT_UPDATE;
967
7.25k
          }
968
7.39k
        }
969
7.39k
      }
970
8.76k
    } break;
971
972
339k
    case SBR_SKIP_QMF:
973
339k
      if (self == NULL) {
974
0
        errorStatus = SBRDEC_NOT_INITIALIZED;
975
339k
      } else {
976
339k
        if (value == 1) {
977
18.9k
          self->flags |= SBRDEC_SKIP_QMF_ANA;
978
320k
        } else {
979
320k
          self->flags &= ~SBRDEC_SKIP_QMF_ANA;
980
320k
        }
981
339k
        if (value == 2) {
982
152k
          self->flags |= SBRDEC_SKIP_QMF_SYN;
983
186k
        } else {
984
186k
          self->flags &= ~SBRDEC_SKIP_QMF_SYN;
985
186k
        }
986
339k
      }
987
339k
      break;
988
0
    default:
989
0
      errorStatus = SBRDEC_SET_PARAM_FAIL;
990
0
      break;
991
1.63M
  } /* switch(param) */
992
993
1.63M
  return (errorStatus);
994
1.63M
}
995
996
static SBRDEC_DRC_CHANNEL *sbrDecoder_drcGetChannel(
997
607k
    const HANDLE_SBRDECODER self, const INT channel) {
998
607k
  SBRDEC_DRC_CHANNEL *pSbrDrcChannelData = NULL;
999
607k
  int elementIndex, elChanIdx = 0, numCh = 0;
1000
1001
1.55M
  for (elementIndex = 0; (elementIndex < (8)) && (numCh <= channel);
1002
948k
       elementIndex++) {
1003
948k
    SBR_DECODER_ELEMENT *pSbrElement = self->pSbrElement[elementIndex];
1004
948k
    int c, elChannels;
1005
1006
948k
    elChanIdx = 0;
1007
948k
    if (pSbrElement == NULL) break;
1008
1009
    /* Determine amount of channels for this element */
1010
945k
    switch (pSbrElement->elementID) {
1011
523k
      case ID_CPE:
1012
523k
        elChannels = 2;
1013
523k
        break;
1014
49.4k
      case ID_LFE:
1015
421k
      case ID_SCE:
1016
421k
        elChannels = 1;
1017
421k
        break;
1018
0
      case ID_NONE:
1019
0
      default:
1020
0
        elChannels = 0;
1021
0
        break;
1022
945k
    }
1023
1024
    /* Limit with actual allocated element channels */
1025
945k
    elChannels = fMin(elChannels, pSbrElement->nChannels);
1026
1027
2.23M
    for (c = 0; (c < elChannels) && (numCh <= channel); c++) {
1028
1.28M
      if (pSbrElement->pSbrChannel[elChanIdx] != NULL) {
1029
1.28M
        numCh++;
1030
1.28M
        elChanIdx++;
1031
1.28M
      }
1032
1.28M
    }
1033
945k
  }
1034
607k
  elementIndex -= 1;
1035
607k
  elChanIdx -= 1;
1036
1037
607k
  if (elChanIdx < 0 || elementIndex < 0) {
1038
2.99k
    return NULL;
1039
2.99k
  }
1040
1041
604k
  if (self->pSbrElement[elementIndex] != NULL) {
1042
604k
    if (self->pSbrElement[elementIndex]->pSbrChannel[elChanIdx] != NULL) {
1043
604k
      pSbrDrcChannelData = &self->pSbrElement[elementIndex]
1044
604k
                                ->pSbrChannel[elChanIdx]
1045
604k
                                ->SbrDec.sbrDrcChannel;
1046
604k
    }
1047
604k
  }
1048
1049
604k
  return (pSbrDrcChannelData);
1050
607k
}
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
253k
                                    UCHAR winSequence, USHORT *pBandTop) {
1057
253k
  SBRDEC_DRC_CHANNEL *pSbrDrcChannelData = NULL;
1058
253k
  int band, isValidData = 0;
1059
1060
253k
  if (self == NULL) {
1061
0
    return SBRDEC_NOT_INITIALIZED;
1062
0
  }
1063
253k
  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
491k
  for (band = 0; band < (int)numBands; band += 1) {
1069
254k
    if (!((pNextFact_mag[band] == FL2FXCONST_DBL(0.5)) &&
1070
254k
          (nextFact_exp == 1)) &&
1071
254k
        !((pNextFact_mag[band] == (FIXP_DBL)MAXVAL_DBL) &&
1072
15.9k
          (nextFact_exp == 0))) {
1073
15.9k
      isValidData = 1;
1074
15.9k
      break;
1075
15.9k
    }
1076
254k
  }
1077
1078
  /* Find the right SBR channel */
1079
253k
  pSbrDrcChannelData = sbrDecoder_drcGetChannel(self, ch);
1080
1081
253k
  if (pSbrDrcChannelData != NULL) {
1082
253k
    if (pSbrDrcChannelData->enable ||
1083
253k
        isValidData) { /* Activate processing only with real and valid data */
1084
21.2k
      int i;
1085
1086
21.2k
      pSbrDrcChannelData->enable = 1;
1087
21.2k
      pSbrDrcChannelData->numBandsNext = numBands;
1088
1089
21.2k
      pSbrDrcChannelData->winSequenceNext = winSequence;
1090
21.2k
      pSbrDrcChannelData->drcInterpolationSchemeNext = drcInterpolationScheme;
1091
21.2k
      pSbrDrcChannelData->nextFact_exp = nextFact_exp;
1092
1093
93.4k
      for (i = 0; i < (int)numBands; i++) {
1094
72.2k
        pSbrDrcChannelData->bandTopNext[i] = pBandTop[i];
1095
72.2k
        pSbrDrcChannelData->nextFact_mag[i] = pNextFact_mag[i];
1096
72.2k
      }
1097
21.2k
    }
1098
253k
  }
1099
1100
253k
  return SBRDEC_OK;
1101
253k
}
1102
1103
384k
void sbrDecoder_drcDisable(HANDLE_SBRDECODER self, INT ch) {
1104
384k
  SBRDEC_DRC_CHANNEL *pSbrDrcChannelData = NULL;
1105
1106
384k
  if ((self == NULL) || (ch > (8)) || (self->numSbrElements == 0) ||
1107
384k
      (self->numSbrChannels == 0)) {
1108
30.5k
    return;
1109
30.5k
  }
1110
1111
  /* Find the right SBR channel */
1112
353k
  pSbrDrcChannelData = sbrDecoder_drcGetChannel(self, ch);
1113
1114
353k
  if (pSbrDrcChannelData != NULL) {
1115
351k
    sbrDecoder_drcInitChannel(pSbrDrcChannelData);
1116
351k
  }
1117
353k
}
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
436k
                           UINT acFlags, UINT acElFlags[]) {
1124
436k
  SBR_DECODER_ELEMENT *hSbrElement = NULL;
1125
436k
  HANDLE_SBR_HEADER_DATA hSbrHeader = NULL;
1126
436k
  HANDLE_SBR_CHANNEL *pSbrChannel;
1127
1128
436k
  SBR_FRAME_DATA *hFrameDataLeft = NULL;
1129
436k
  SBR_FRAME_DATA *hFrameDataRight = NULL;
1130
436k
  SBR_FRAME_DATA frameDataLeftCopy;
1131
436k
  SBR_FRAME_DATA frameDataRightCopy;
1132
1133
436k
  SBR_ERROR errorStatus = SBRDEC_OK;
1134
436k
  SBR_HEADER_STATUS headerStatus = HEADER_NOT_PRESENT;
1135
1136
436k
  INT startPos = FDKgetValidBits(hBs);
1137
436k
  FDK_CRCINFO crcInfo;
1138
436k
  INT crcReg = 0;
1139
436k
  USHORT sbrCrc = 0;
1140
436k
  UINT crcPoly;
1141
436k
  UINT crcStartValue = 0;
1142
436k
  UINT crcLen;
1143
1144
436k
  HANDLE_FDK_BITSTREAM hBsOriginal = hBs;
1145
436k
  FDK_BITSTREAM bsBwd;
1146
1147
436k
  const int fGlobalIndependencyFlag = acFlags & AC_INDEP;
1148
436k
  const int bs_pvc = acElFlags[elementIndex] & AC_EL_USAC_PVC;
1149
436k
  const int bs_interTes = acElFlags[elementIndex] & AC_EL_USAC_ITES;
1150
436k
  int stereo;
1151
436k
  int fDoDecodeSbrData = 1;
1152
436k
  int alignBits = 0;
1153
1154
436k
  int lastSlot, lastHdrSlot = 0, thisHdrSlot = 0;
1155
1156
436k
  if (*count <= 0) {
1157
77.3k
    setFrameErrorFlag(self->pSbrElement[elementIndex], FRAME_ERROR);
1158
77.3k
    return SBRDEC_OK;
1159
77.3k
  }
1160
1161
  /* SBR sanity checks */
1162
358k
  if (self == NULL) {
1163
0
    errorStatus = SBRDEC_NOT_INITIALIZED;
1164
0
    goto bail;
1165
0
  }
1166
1167
  /* Reverse bits of DRM SBR payload */
1168
358k
  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
358k
  startPos = FDKgetValidBits(hBs);
1212
1213
  /* SBR sanity checks */
1214
358k
  if (self->pSbrElement[elementIndex] == NULL) {
1215
0
    errorStatus = SBRDEC_NOT_INITIALIZED;
1216
0
    goto bail;
1217
0
  }
1218
358k
  hSbrElement = self->pSbrElement[elementIndex];
1219
1220
358k
  lastSlot = (hSbrElement->useFrameSlot > 0) ? hSbrElement->useFrameSlot - 1
1221
358k
                                             : self->numDelayFrames;
1222
358k
  lastHdrSlot = hSbrElement->useHeaderSlot[lastSlot];
1223
358k
  thisHdrSlot = getHeaderSlot(
1224
358k
      hSbrElement->useFrameSlot,
1225
358k
      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
358k
  hSbrHeader = &self->sbrHeader[elementIndex][thisHdrSlot];
1230
1231
358k
  pSbrChannel = hSbrElement->pSbrChannel;
1232
358k
  stereo = (hSbrElement->elementID == ID_CPE) ? 1 : 0;
1233
1234
358k
  hFrameDataLeft = &self->pSbrElement[elementIndex]
1235
358k
                        ->pSbrChannel[0]
1236
358k
                        ->frameData[hSbrElement->useFrameSlot];
1237
358k
  if (stereo) {
1238
129k
    hFrameDataRight = &self->pSbrElement[elementIndex]
1239
129k
                           ->pSbrChannel[1]
1240
129k
                           ->frameData[hSbrElement->useFrameSlot];
1241
129k
  }
1242
1243
  /* store frameData; new parsed frameData possibly corrupted */
1244
358k
  FDKmemcpy(&frameDataLeftCopy, hFrameDataLeft, sizeof(SBR_FRAME_DATA));
1245
358k
  if (stereo) {
1246
129k
    FDKmemcpy(&frameDataRightCopy, hFrameDataRight, sizeof(SBR_FRAME_DATA));
1247
129k
  }
1248
1249
  /* reset PS flag; will be set after PS was found */
1250
358k
  self->flags &= ~SBRDEC_PS_DECODED;
1251
1252
358k
  if (hSbrHeader->status & SBRDEC_HDR_STAT_UPDATE) {
1253
    /* Got a new header from extern (e.g. from an ASC) */
1254
40.4k
    headerStatus = HEADER_OK;
1255
40.4k
    hSbrHeader->status &= ~SBRDEC_HDR_STAT_UPDATE;
1256
318k
  } 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
38.3k
    copySbrHeader(hSbrHeader, &self->sbrHeader[elementIndex][lastHdrSlot]);
1260
38.3k
  }
1261
1262
  /*
1263
     Check if bit stream data is valid and matches the element context
1264
  */
1265
358k
  if (((prevElement != ID_SCE) && (prevElement != ID_CPE)) ||
1266
358k
      prevElement != hSbrElement->elementID) {
1267
    /* In case of LFE we also land here, since there is no LFE SBR element (do
1268
     * upsampling only) */
1269
2.88k
    fDoDecodeSbrData = 0;
1270
2.88k
  }
1271
1272
358k
  if (fDoDecodeSbrData) {
1273
356k
    if ((INT)FDKgetValidBits(hBs) <= 0) {
1274
4
      fDoDecodeSbrData = 0;
1275
4
    }
1276
356k
  }
1277
1278
  /*
1279
     SBR CRC-check
1280
  */
1281
358k
  if (fDoDecodeSbrData) {
1282
356k
    if (crcFlag) {
1283
45.2k
      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
45.2k
        default:
1291
45.2k
          crcPoly = 0x0633;
1292
45.2k
          crcLen = 10;
1293
45.2k
          crcStartValue = 0x00000000;
1294
45.2k
          break;
1295
45.2k
      }
1296
45.2k
      sbrCrc = (USHORT)FDKreadBits(hBs, crcLen);
1297
      /* Setup CRC decoder */
1298
45.2k
      FDKcrcInit(&crcInfo, crcPoly, crcStartValue, crcLen);
1299
      /* Start CRC region */
1300
45.2k
      crcReg = FDKcrcStartReg(&crcInfo, hBs, 0);
1301
45.2k
    }
1302
356k
  } /* if (fDoDecodeSbrData) */
1303
1304
  /*
1305
     Read in the header data and issue a reset if change occured
1306
  */
1307
358k
  if (fDoDecodeSbrData) {
1308
356k
    int sbrHeaderPresent;
1309
1310
356k
    if (self->flags & (SBRDEC_SYNTAX_RSVD50 | SBRDEC_SYNTAX_USAC)) {
1311
252k
      SBR_HEADER_DATA_BS_INFO newSbrInfo;
1312
252k
      int sbrInfoPresent;
1313
1314
252k
      if (bs_interTes) {
1315
84.7k
        self->flags |= SBRDEC_USAC_ITES;
1316
167k
      } else {
1317
167k
        self->flags &= ~SBRDEC_USAC_ITES;
1318
167k
      }
1319
1320
252k
      if (fGlobalIndependencyFlag) {
1321
197k
        self->flags |= SBRDEC_USAC_INDEP;
1322
197k
        sbrInfoPresent = 1;
1323
197k
        sbrHeaderPresent = 1;
1324
197k
      } else {
1325
54.7k
        self->flags &= ~SBRDEC_USAC_INDEP;
1326
54.7k
        sbrInfoPresent = FDKreadBit(hBs);
1327
54.7k
        if (sbrInfoPresent) {
1328
8.86k
          sbrHeaderPresent = FDKreadBit(hBs);
1329
45.9k
        } else {
1330
45.9k
          sbrHeaderPresent = 0;
1331
45.9k
        }
1332
54.7k
      }
1333
1334
252k
      if (sbrInfoPresent) {
1335
206k
        newSbrInfo.ampResolution = FDKreadBit(hBs);
1336
206k
        newSbrInfo.xover_band = FDKreadBits(hBs, 4);
1337
206k
        newSbrInfo.sbr_preprocessing = FDKreadBit(hBs);
1338
206k
        if (bs_pvc) {
1339
133k
          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
133k
          if (newSbrInfo.pvc_mode > 2) {
1343
9.07k
            headerStatus = HEADER_ERROR;
1344
9.07k
          }
1345
133k
          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
11.4k
            newSbrInfo.pvc_mode = 0;
1350
11.4k
          }
1351
133k
        } else {
1352
72.9k
          newSbrInfo.pvc_mode = 0;
1353
72.9k
        }
1354
206k
        if (headerStatus != HEADER_ERROR) {
1355
197k
          if (FDKmemcmp(&hSbrHeader->bs_info, &newSbrInfo,
1356
197k
                        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
69.8k
            if ((hSbrHeader->bs_info.pvc_mode != newSbrInfo.pvc_mode) ||
1362
69.8k
                (hSbrHeader->bs_info.xover_band != newSbrInfo.xover_band)) {
1363
60.0k
              headerStatus = HEADER_RESET;
1364
60.0k
            } else {
1365
9.83k
              headerStatus = HEADER_OK;
1366
9.83k
            }
1367
1368
69.8k
            hSbrHeader->bs_info = newSbrInfo;
1369
127k
          } else {
1370
127k
            headerStatus = HEADER_OK;
1371
127k
          }
1372
197k
        }
1373
206k
      }
1374
252k
      if (headerStatus == HEADER_ERROR) {
1375
        /* Corrupt SBR info data, do not decode and switch to UPSAMPLING */
1376
9.07k
        hSbrHeader->syncState = hSbrHeader->syncState > UPSAMPLING
1377
9.07k
                                    ? UPSAMPLING
1378
9.07k
                                    : hSbrHeader->syncState;
1379
9.07k
        fDoDecodeSbrData = 0;
1380
9.07k
        sbrHeaderPresent = 0;
1381
9.07k
      }
1382
1383
252k
      if (sbrHeaderPresent && fDoDecodeSbrData) {
1384
193k
        int useDfltHeader;
1385
1386
193k
        useDfltHeader = FDKreadBit(hBs);
1387
1388
193k
        if (useDfltHeader) {
1389
118k
          sbrHeaderPresent = 0;
1390
118k
          if (FDKmemcmp(&hSbrHeader->bs_data, &hSbrHeader->bs_dflt,
1391
118k
                        sizeof(SBR_HEADER_DATA_BS)) ||
1392
118k
              hSbrHeader->syncState != SBR_ACTIVE) {
1393
24.1k
            hSbrHeader->bs_data = hSbrHeader->bs_dflt;
1394
24.1k
            headerStatus = HEADER_RESET;
1395
24.1k
          }
1396
118k
        }
1397
193k
      }
1398
252k
    } else {
1399
103k
      sbrHeaderPresent = FDKreadBit(hBs);
1400
103k
    }
1401
1402
356k
    if (sbrHeaderPresent) {
1403
133k
      headerStatus = sbrGetHeaderData(hSbrHeader, hBs, self->flags, 1, 0);
1404
133k
    }
1405
1406
356k
    if (headerStatus == HEADER_RESET) {
1407
131k
      errorStatus = sbrDecoder_HeaderUpdate(
1408
131k
          self, hSbrHeader, headerStatus, pSbrChannel, hSbrElement->nChannels);
1409
1410
131k
      if (errorStatus == SBRDEC_OK) {
1411
105k
        hSbrHeader->syncState = SBR_HEADER;
1412
105k
      } else {
1413
26.3k
        hSbrHeader->syncState = SBR_NOT_INITIALIZED;
1414
26.3k
        headerStatus = HEADER_ERROR;
1415
26.3k
      }
1416
131k
    }
1417
1418
356k
    if (errorStatus != SBRDEC_OK) {
1419
26.3k
      fDoDecodeSbrData = 0;
1420
26.3k
    }
1421
356k
  } /* if (fDoDecodeSbrData) */
1422
1423
  /*
1424
    Print debugging output only if state has changed
1425
  */
1426
1427
  /* read frame data */
1428
358k
  if ((hSbrHeader->syncState >= SBR_HEADER) && fDoDecodeSbrData) {
1429
314k
    int sbrFrameOk;
1430
    /* read the SBR element data */
1431
314k
    if (!stereo && (self->hParametricStereoDec != NULL)) {
1432
      /* update slot index for PS bitstream parsing */
1433
27.8k
      self->hParametricStereoDec->bsLastSlot =
1434
27.8k
          self->hParametricStereoDec->bsReadSlot;
1435
27.8k
      self->hParametricStereoDec->bsReadSlot = hSbrElement->useFrameSlot;
1436
27.8k
    }
1437
314k
    sbrFrameOk = sbrGetChannelElement(
1438
314k
        hSbrHeader, hFrameDataLeft, (stereo) ? hFrameDataRight : NULL,
1439
314k
        &pSbrChannel[0]->prevFrameData,
1440
314k
        pSbrChannel[0]->SbrDec.PvcStaticData.pvc_mode_last, hBs,
1441
314k
        (stereo) ? NULL : self->hParametricStereoDec, self->flags,
1442
314k
        self->pSbrElement[elementIndex]->transposerSettings.overlap);
1443
1444
314k
    if (!sbrFrameOk) {
1445
20.3k
      fDoDecodeSbrData = 0;
1446
293k
    } else {
1447
293k
      INT valBits;
1448
1449
293k
      if (bsPayLen > 0) {
1450
28.8k
        valBits = bsPayLen - ((INT)startPos - (INT)FDKgetValidBits(hBs));
1451
265k
      } else {
1452
265k
        valBits = (INT)FDKgetValidBits(hBs);
1453
265k
      }
1454
1455
      /* sanity check of remaining bits */
1456
293k
      if (valBits < 0) {
1457
31.5k
        fDoDecodeSbrData = 0;
1458
262k
      } else {
1459
262k
        switch (self->coreCodec) {
1460
0
          case AOT_SBR:
1461
0
          case AOT_PS:
1462
2.00k
          case AOT_AAC_LC: {
1463
            /* This sanity check is only meaningful with General Audio
1464
             * bitstreams */
1465
2.00k
            alignBits = valBits & 0x7;
1466
1467
2.00k
            if (valBits > alignBits) {
1468
179
              fDoDecodeSbrData = 0;
1469
179
            }
1470
2.00k
          } break;
1471
260k
          default:
1472
            /* No sanity check available */
1473
260k
            break;
1474
262k
        }
1475
262k
      }
1476
293k
    }
1477
314k
  } 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
44.5k
    errorStatus = SBRDEC_PARSE_ERROR;
1482
44.5k
  }
1483
1484
358k
  if (crcFlag && (hSbrHeader->syncState >= SBR_HEADER) && fDoDecodeSbrData) {
1485
23.5k
    FDKpushFor(hBs, alignBits);
1486
23.5k
    FDKcrcEndReg(&crcInfo, hBs, crcReg); /* End CRC region */
1487
23.5k
    FDKpushBack(hBs, alignBits);
1488
    /* Check CRC */
1489
23.5k
    if ((FDKcrcGetCRC(&crcInfo) ^ crcStartValue) != sbrCrc) {
1490
22.0k
      fDoDecodeSbrData = 0;
1491
22.0k
      if (headerStatus != HEADER_NOT_PRESENT) {
1492
20.7k
        headerStatus = HEADER_ERROR;
1493
20.7k
        hSbrHeader->syncState = SBR_NOT_INITIALIZED;
1494
20.7k
      }
1495
22.0k
    }
1496
23.5k
  }
1497
1498
358k
  if (!fDoDecodeSbrData) {
1499
    /* Set error flag for this slot to trigger concealment */
1500
112k
    setFrameErrorFlag(self->pSbrElement[elementIndex], FRAME_ERROR);
1501
    /* restore old frameData for concealment */
1502
112k
    FDKmemcpy(hFrameDataLeft, &frameDataLeftCopy, sizeof(SBR_FRAME_DATA));
1503
112k
    if (stereo) {
1504
38.9k
      FDKmemcpy(hFrameDataRight, &frameDataRightCopy, sizeof(SBR_FRAME_DATA));
1505
38.9k
    }
1506
112k
    errorStatus = SBRDEC_PARSE_ERROR;
1507
246k
  } else {
1508
    /* Everything seems to be ok so clear the error flag */
1509
246k
    setFrameErrorFlag(self->pSbrElement[elementIndex], FRAME_OK);
1510
246k
  }
1511
1512
358k
  if (!stereo) {
1513
    /* Turn coupling off explicitely to avoid access to absent right frame data
1514
       that might occur with corrupt bitstreams. */
1515
229k
    hFrameDataLeft->coupling = COUPLING_OFF;
1516
229k
  }
1517
1518
358k
bail:
1519
1520
358k
  if (self != NULL) {
1521
358k
    if (self->flags & SBRDEC_SYNTAX_DRM) {
1522
0
      hBs = hBsOriginal;
1523
0
    }
1524
1525
358k
    if (errorStatus != SBRDEC_NOT_INITIALIZED) {
1526
358k
      int useOldHdr =
1527
358k
          ((headerStatus == HEADER_NOT_PRESENT) ||
1528
358k
           (headerStatus == HEADER_ERROR) ||
1529
358k
           (headerStatus == HEADER_RESET && errorStatus == SBRDEC_PARSE_ERROR))
1530
358k
              ? 1
1531
358k
              : 0;
1532
1533
358k
      if (!useOldHdr && (thisHdrSlot != lastHdrSlot) && (hSbrHeader != NULL)) {
1534
6.99k
        useOldHdr |=
1535
6.99k
            (compareSbrHeader(hSbrHeader,
1536
6.99k
                              &self->sbrHeader[elementIndex][lastHdrSlot]) == 0)
1537
6.99k
                ? 1
1538
6.99k
                : 0;
1539
6.99k
      }
1540
1541
358k
      if (hSbrElement != NULL) {
1542
358k
        if (useOldHdr != 0) {
1543
          /* Use the old header for this frame */
1544
159k
          hSbrElement->useHeaderSlot[hSbrElement->useFrameSlot] = lastHdrSlot;
1545
199k
        } else {
1546
          /* Use the new header for this frame */
1547
199k
          hSbrElement->useHeaderSlot[hSbrElement->useFrameSlot] = thisHdrSlot;
1548
199k
        }
1549
1550
        /* Move frame pointer to the next slot which is up to be decoded/applied
1551
         * next */
1552
358k
        hSbrElement->useFrameSlot =
1553
358k
            (hSbrElement->useFrameSlot + 1) % (self->numDelayFrames + 1);
1554
358k
      }
1555
358k
    }
1556
358k
  }
1557
1558
358k
  *count -= startPos - (INT)FDKgetValidBits(hBs);
1559
1560
358k
  return errorStatus;
1561
358k
}
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
423k
    int *numOutChannels, const int psPossible) {
1581
423k
  SBR_DECODER_ELEMENT *hSbrElement = self->pSbrElement[elementIndex];
1582
423k
  HANDLE_SBR_CHANNEL *pSbrChannel =
1583
423k
      self->pSbrElement[elementIndex]->pSbrChannel;
1584
423k
  HANDLE_SBR_HEADER_DATA hSbrHeader =
1585
423k
      &self->sbrHeader[elementIndex]
1586
423k
                      [hSbrElement->useHeaderSlot[hSbrElement->useFrameSlot]];
1587
423k
  HANDLE_PS_DEC h_ps_d = self->hParametricStereoDec;
1588
1589
  /* get memory for frame data from scratch */
1590
423k
  SBR_FRAME_DATA *hFrameDataLeft = NULL;
1591
423k
  SBR_FRAME_DATA *hFrameDataRight = NULL;
1592
1593
423k
  SBR_ERROR errorStatus = SBRDEC_OK;
1594
1595
423k
  INT strideOut, offset0 = 255, offset0_block = 0, offset1 = 255,
1596
423k
                 offset1_block = 0;
1597
423k
  INT codecFrameSize = self->codecFrameSize;
1598
1599
423k
  int stereo = (hSbrElement->elementID == ID_CPE) ? 1 : 0;
1600
423k
  int numElementChannels =
1601
423k
      hSbrElement
1602
423k
          ->nChannels; /* Number of channels of the current SBR element */
1603
1604
423k
  hFrameDataLeft =
1605
423k
      &hSbrElement->pSbrChannel[0]->frameData[hSbrElement->useFrameSlot];
1606
423k
  if (stereo) {
1607
180k
    hFrameDataRight =
1608
180k
        &hSbrElement->pSbrChannel[1]->frameData[hSbrElement->useFrameSlot];
1609
180k
  }
1610
1611
423k
  if (self->flags & SBRDEC_FLUSH) {
1612
22
    if (self->numFlushedFrames > self->numDelayFrames) {
1613
22
      int hdrIdx;
1614
      /* No valid SBR payload available, hence switch to upsampling (in all
1615
       * headers) */
1616
66
      for (hdrIdx = 0; hdrIdx < ((1) + 1); hdrIdx += 1) {
1617
44
        if (self->sbrHeader[elementIndex][hdrIdx].syncState > UPSAMPLING) {
1618
21
          self->sbrHeader[elementIndex][hdrIdx].syncState = UPSAMPLING;
1619
21
        }
1620
44
      }
1621
22
    } 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
22
  }
1640
1641
  /* Update the header error flag */
1642
423k
  hSbrHeader->frameErrorFlag =
1643
423k
      hSbrElement->frameErrorFlag[hSbrElement->useFrameSlot];
1644
1645
  /*
1646
     Prepare filterbank for upsampling if no valid bit stream data is available.
1647
   */
1648
423k
  if (hSbrHeader->syncState == SBR_NOT_INITIALIZED) {
1649
51.2k
    errorStatus =
1650
51.2k
        initHeaderData(hSbrHeader, self->sampleRateIn, self->sampleRateOut,
1651
51.2k
                       self->downscaleFactor, codecFrameSize, self->flags,
1652
51.2k
                       1 /* SET_DEFAULT_HDR */
1653
51.2k
        );
1654
1655
51.2k
    if (errorStatus != SBRDEC_OK) {
1656
0
      return errorStatus;
1657
0
    }
1658
1659
51.2k
    hSbrHeader->syncState = UPSAMPLING;
1660
1661
51.2k
    errorStatus = sbrDecoder_HeaderUpdate(self, hSbrHeader, HEADER_NOT_PRESENT,
1662
51.2k
                                          pSbrChannel, hSbrElement->nChannels);
1663
1664
51.2k
    if (errorStatus != SBRDEC_OK) {
1665
0
      hSbrHeader->syncState = SBR_NOT_INITIALIZED;
1666
0
      return errorStatus;
1667
0
    }
1668
51.2k
  }
1669
1670
  /* reset */
1671
423k
  if (hSbrHeader->status & SBRDEC_HDR_STAT_RESET) {
1672
223k
    int ch;
1673
223k
    int applySbrProc = (hSbrHeader->syncState == SBR_ACTIVE ||
1674
223k
                        (hSbrHeader->frameErrorFlag == 0 &&
1675
223k
                         hSbrHeader->syncState == SBR_HEADER));
1676
582k
    for (ch = 0; ch < numElementChannels; ch++) {
1677
358k
      SBR_ERROR errorStatusTmp = SBRDEC_OK;
1678
1679
358k
      errorStatusTmp = resetSbrDec(
1680
358k
          &pSbrChannel[ch]->SbrDec, hSbrHeader, &pSbrChannel[ch]->prevFrameData,
1681
358k
          self->synDownsampleFac, self->flags, pSbrChannel[ch]->frameData);
1682
1683
358k
      if (errorStatusTmp != SBRDEC_OK) {
1684
7.09k
        hSbrHeader->syncState = UPSAMPLING;
1685
7.09k
      }
1686
358k
    }
1687
223k
    if (applySbrProc) {
1688
61.1k
      hSbrHeader->status &= ~SBRDEC_HDR_STAT_RESET;
1689
61.1k
    }
1690
223k
  }
1691
1692
  /* decoding */
1693
423k
  if ((hSbrHeader->syncState == SBR_ACTIVE) ||
1694
423k
      ((hSbrHeader->syncState == SBR_HEADER) &&
1695
255k
       (hSbrHeader->frameErrorFlag == 0))) {
1696
255k
    errorStatus = SBRDEC_OK;
1697
1698
255k
    decodeSbrData(hSbrHeader, hFrameDataLeft, &pSbrChannel[0]->prevFrameData,
1699
255k
                  (stereo) ? hFrameDataRight : NULL,
1700
255k
                  (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
255k
    hSbrHeader->syncState = SBR_ACTIVE;
1705
255k
  }
1706
1707
423k
  if (timeDataSize <
1708
423k
      hSbrHeader->numberTimeSlots * hSbrHeader->timeStep *
1709
423k
          self->pQmfDomain->globalConf.nBandsSynthesis *
1710
423k
          (psPossible ? fMax(2, numInChannels) : numInChannels)) {
1711
0
    return SBRDEC_OUTPUT_BUFFER_TOO_SMALL;
1712
0
  }
1713
1714
423k
  {
1715
423k
    self->flags &= ~SBRDEC_PS_DECODED;
1716
423k
    C_ALLOC_SCRATCH_START(pPsScratch, struct PS_DEC_COEFFICIENTS, 1)
1717
1718
    /* decode PS data if available */
1719
423k
    if (h_ps_d != NULL && psPossible && (hSbrHeader->syncState == SBR_ACTIVE)) {
1720
3.83k
      int applyPs = 1;
1721
1722
      /* define which frame delay line slot to process */
1723
3.83k
      h_ps_d->processSlot = hSbrElement->useFrameSlot;
1724
1725
3.83k
      applyPs = DecodePs(h_ps_d, hSbrHeader->frameErrorFlag, pPsScratch);
1726
3.83k
      self->flags |= (applyPs) ? SBRDEC_PS_DECODED : 0;
1727
3.83k
    }
1728
1729
423k
    offset0 = FDK_chMapDescr_getMapValue(mapDescr, channelIndex, mapIdx);
1730
423k
    offset0_block = offset0 * codecFrameSize;
1731
423k
    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
186k
      offset1 = FDK_chMapDescr_getMapValue(mapDescr, channelIndex + 1, mapIdx);
1737
186k
      offset1_block = offset1 * codecFrameSize;
1738
186k
    }
1739
    /* Set strides for reading and writing */
1740
423k
    if (psPossible)
1741
6.16k
      strideOut = (numInChannels < 2) ? 2 : numInChannels;
1742
417k
    else
1743
417k
      strideOut = numInChannels;
1744
1745
    /* use same buffers for left and right channel and apply PS per timeslot */
1746
    /* Process left channel */
1747
423k
    sbr_dec(&pSbrChannel[0]->SbrDec, input + offset0_block, timeData + offset0,
1748
423k
            (self->flags & SBRDEC_PS_DECODED) ? &pSbrChannel[1]->SbrDec : NULL,
1749
423k
            timeData + offset1, strideOut, hSbrHeader, hFrameDataLeft,
1750
423k
            &pSbrChannel[0]->prevFrameData,
1751
423k
            (hSbrHeader->syncState == SBR_ACTIVE), h_ps_d, self->flags,
1752
423k
            codecFrameSize, self->sbrInDataHeadroom);
1753
1754
423k
    if (stereo) {
1755
      /* Process right channel */
1756
180k
      sbr_dec(&pSbrChannel[1]->SbrDec, input + offset1_block,
1757
180k
              timeData + offset1, NULL, NULL, strideOut, hSbrHeader,
1758
180k
              hFrameDataRight, &pSbrChannel[1]->prevFrameData,
1759
180k
              (hSbrHeader->syncState == SBR_ACTIVE), NULL, self->flags,
1760
180k
              codecFrameSize, self->sbrInDataHeadroom);
1761
180k
    }
1762
1763
423k
    C_ALLOC_SCRATCH_END(pPsScratch, struct PS_DEC_COEFFICIENTS, 1)
1764
423k
  }
1765
1766
423k
  if (h_ps_d != NULL) {
1767
    /* save PS status for next run */
1768
31.0k
    h_ps_d->psDecodedPrv = (self->flags & SBRDEC_PS_DECODED) ? 1 : 0;
1769
31.0k
  }
1770
1771
423k
  if (psPossible && !(self->flags & SBRDEC_SKIP_QMF_SYN)) {
1772
6.16k
    FDK_ASSERT(strideOut > 1);
1773
6.16k
    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
2.79k
      int copyFrameSize =
1778
2.79k
          codecFrameSize * self->pQmfDomain->QmfDomainOut->fb.no_channels;
1779
2.79k
      copyFrameSize /= self->pQmfDomain->QmfDomainIn->fb.no_channels;
1780
2.79k
      LONG *ptr;
1781
2.79k
      INT i;
1782
2.79k
      FDK_ASSERT(strideOut == 2);
1783
1784
2.79k
      ptr = timeData;
1785
2.74M
      for (i = copyFrameSize >> 1; i--;) {
1786
2.74M
        LONG tmp; /* This temporal variable is required because some compilers
1787
                     can't do *ptr++ = *ptr++ correctly. */
1788
2.74M
        tmp = *ptr++;
1789
2.74M
        *ptr++ = tmp;
1790
2.74M
        tmp = *ptr++;
1791
2.74M
        *ptr++ = tmp;
1792
2.74M
      }
1793
2.79k
    }
1794
6.16k
    *numOutChannels = 2; /* Output minimum two channels when PS is enabled. */
1795
6.16k
  }
1796
1797
423k
  return errorStatus;
1798
423k
}
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
339k
                           INT *outDataHeadroom) {
1807
339k
  SBR_ERROR errorStatus = SBRDEC_OK;
1808
1809
339k
  int psPossible;
1810
339k
  int sbrElementNum;
1811
339k
  int numCoreChannels;
1812
339k
  int numSbrChannels = 0;
1813
1814
339k
  if ((self == NULL) || (timeData == NULL) || (numChannels == NULL) ||
1815
339k
      (sampleRate == NULL) || (psDecoded == NULL) ||
1816
339k
      !FDK_chMapDescr_isValid(mapDescr)) {
1817
0
    return SBRDEC_INVALID_ARGUMENT;
1818
0
  }
1819
1820
339k
  psPossible = *psDecoded;
1821
339k
  numCoreChannels = *numChannels;
1822
339k
  if (numCoreChannels <= 0) {
1823
0
    return SBRDEC_INVALID_ARGUMENT;
1824
0
  }
1825
1826
339k
  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
764k
  for (sbrElementNum = 0; sbrElementNum < self->numSbrElements;
1833
425k
       sbrElementNum++) {
1834
425k
    if (self->pSbrElement[sbrElementNum] == NULL) {
1835
186
      return SBRDEC_NOT_INITIALIZED;
1836
186
    }
1837
425k
  }
1838
1839
339k
  if (self->numSbrElements != 1 || self->pSbrElement[0]->elementID != ID_SCE) {
1840
143k
    psPossible = 0;
1841
143k
  }
1842
1843
339k
  self->sbrInDataHeadroom = inDataHeadroom;
1844
339k
  *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
339k
  if (psPossible == 0) {
1849
333k
    self->flags &= ~SBRDEC_PS_DECODED;
1850
333k
  }
1851
1852
  /* replaces channel based reset inside sbr_dec() */
1853
339k
  if (((self->flags & SBRDEC_LOW_POWER) ? 1 : 0) !=
1854
339k
      ((self->pQmfDomain->globalConf.flags & QMF_FLAG_LP) ? 1 : 0)) {
1855
18.4k
    if (self->flags & SBRDEC_LOW_POWER) {
1856
17.7k
      self->pQmfDomain->globalConf.flags |= QMF_FLAG_LP;
1857
17.7k
      self->pQmfDomain->globalConf.flags_requested |= QMF_FLAG_LP;
1858
17.7k
    } else {
1859
699
      self->pQmfDomain->globalConf.flags &= ~QMF_FLAG_LP;
1860
699
      self->pQmfDomain->globalConf.flags_requested &= ~QMF_FLAG_LP;
1861
699
    }
1862
18.4k
    if (FDK_QmfDomain_InitFilterBank(self->pQmfDomain, QMF_FLAG_KEEP_STATES)) {
1863
0
      return SBRDEC_UNSUPPORTED_CONFIG;
1864
0
    }
1865
18.4k
  }
1866
339k
  if (self->numSbrChannels > self->pQmfDomain->globalConf.nInputChannels) {
1867
0
    return SBRDEC_UNSUPPORTED_CONFIG;
1868
0
  }
1869
1870
339k
  if (self->flags & SBRDEC_FLUSH) {
1871
    /* flushing is signalized, hence increment the flush frame counter */
1872
22
    self->numFlushedFrames++;
1873
339k
  } else {
1874
    /* no flushing is signalized, hence reset the flush frame counter */
1875
339k
    self->numFlushedFrames = 0;
1876
339k
  }
1877
1878
  /* Loop over SBR elements */
1879
425k
  for (sbrElementNum = 0; sbrElementNum < self->numSbrElements;
1880
423k
       sbrElementNum++) {
1881
423k
    int numElementChan;
1882
1883
423k
    if (psPossible &&
1884
423k
        self->pSbrElement[sbrElementNum]->pSbrChannel[1] == NULL) {
1885
      /* Disable PS and try decoding SBR mono. */
1886
0
      psPossible = 0;
1887
0
    }
1888
1889
423k
    numElementChan =
1890
423k
        (self->pSbrElement[sbrElementNum]->elementID == ID_CPE) ? 2 : 1;
1891
1892
    /* If core signal is bad then force upsampling */
1893
423k
    if (!coreDecodedOk) {
1894
163k
      setFrameErrorFlag(self->pSbrElement[sbrElementNum], FRAME_ERROR_ALLSLOTS);
1895
163k
    }
1896
1897
423k
    errorStatus = sbrDecoder_DecodeElement(
1898
423k
        self, input, timeData, timeDataSize, mapDescr, mapIdx, numSbrChannels,
1899
423k
        sbrElementNum,
1900
423k
        numCoreChannels, /* is correct even for USC SCI==2 case */
1901
423k
        &numElementChan, psPossible);
1902
1903
423k
    if (errorStatus != SBRDEC_OK) {
1904
0
      goto bail;
1905
0
    }
1906
1907
423k
    numSbrChannels += numElementChan;
1908
1909
423k
    if (numSbrChannels >= numCoreChannels) {
1910
336k
      break;
1911
336k
    }
1912
423k
  }
1913
1914
  /* Update numChannels and samplerate */
1915
  /* Do not mess with output channels in case of USAC. numSbrChannels !=
1916
   * numChannels for stereoConfigIndex == 2 */
1917
339k
  if (!(self->flags & SBRDEC_SYNTAX_USAC)) {
1918
74.8k
    *numChannels = numSbrChannels;
1919
74.8k
  }
1920
339k
  *sampleRate = self->sampleRateOut;
1921
339k
  *psDecoded = (self->flags & SBRDEC_PS_DECODED) ? 1 : 0;
1922
1923
  /* Clear reset and flush flag because everything seems to be done
1924
   * successfully. */
1925
339k
  self->flags &= ~SBRDEC_FORCE_RESET;
1926
339k
  self->flags &= ~SBRDEC_FLUSH;
1927
1928
339k
bail:
1929
1930
339k
  return errorStatus;
1931
339k
}
1932
1933
36.8k
SBR_ERROR sbrDecoder_Close(HANDLE_SBRDECODER *pSelf) {
1934
36.8k
  HANDLE_SBRDECODER self = *pSelf;
1935
36.8k
  int i;
1936
1937
36.8k
  if (self != NULL) {
1938
36.8k
    if (self->hParametricStereoDec != NULL) {
1939
2.19k
      DeletePsDec(&self->hParametricStereoDec);
1940
2.19k
    }
1941
1942
331k
    for (i = 0; i < (8); i++) {
1943
294k
      sbrDecoder_DestroyElement(self, i);
1944
294k
    }
1945
1946
36.8k
    FreeRam_SbrDecoder(pSelf);
1947
36.8k
  }
1948
1949
36.8k
  return SBRDEC_OK;
1950
36.8k
}
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
320k
UINT sbrDecoder_GetDelay(const HANDLE_SBRDECODER self) {
1984
320k
  UINT outputDelay = 0;
1985
1986
320k
  if (self != NULL) {
1987
320k
    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
320k
    if ((self->numSbrChannels > 0) && (self->numSbrElements > 0)) {
1993
      /* Add QMF synthesis delay */
1994
320k
      if ((flags & SBRDEC_ELD_GRID) && IS_LOWDELAY(self->coreCodec)) {
1995
        /* Low delay SBR: */
1996
45.7k
        if (!(flags & SBRDEC_SKIP_QMF_SYN)) {
1997
44.3k
          outputDelay +=
1998
44.3k
              (flags & SBRDEC_DOWNSAMPLE) ? 32 : 64; /* QMF synthesis */
1999
44.3k
          if (flags & SBRDEC_LD_MPS_QMF) {
2000
1.04k
            outputDelay += 32;
2001
1.04k
          }
2002
44.3k
        }
2003
274k
      } else if (!IS_USAC(self->coreCodec)) {
2004
        /* By the method of elimination this is the GA (AAC-LC, HE-AAC, ...)
2005
         * branch: */
2006
29.0k
        outputDelay += (flags & SBRDEC_DOWNSAMPLE) ? 481 : 962;
2007
29.0k
        if (flags & SBRDEC_SKIP_QMF_SYN) {
2008
0
          outputDelay -= 257; /* QMF synthesis */
2009
0
        }
2010
29.0k
      }
2011
320k
    }
2012
320k
  }
2013
2014
320k
  return (outputDelay);
2015
320k
}