Coverage Report

Created: 2026-09-14 08:00

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