Coverage Report

Created: 2025-07-01 06:21

/src/aac/libSBRenc/src/bit_sbr.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 - 2018 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 encoder library ******************************
96
97
   Author(s):
98
99
   Description:
100
101
*******************************************************************************/
102
103
/*!
104
  \file
105
  \brief  SBR bit writing routines $Revision: 93300 $
106
*/
107
108
#include "bit_sbr.h"
109
110
#include "code_env.h"
111
#include "cmondata.h"
112
#include "sbr.h"
113
114
#include "ps_main.h"
115
116
typedef enum { SBR_ID_SCE = 1, SBR_ID_CPE } SBR_ELEMENT_TYPE;
117
118
static INT encodeSbrData(HANDLE_SBR_ENV_DATA sbrEnvDataLeft,
119
                         HANDLE_SBR_ENV_DATA sbrEnvDataRight,
120
                         HANDLE_PARAMETRIC_STEREO hParametricStereo,
121
                         HANDLE_COMMON_DATA cmonData, SBR_ELEMENT_TYPE sbrElem,
122
                         INT coupling, UINT sbrSyntaxFlags);
123
124
static INT encodeSbrHeader(HANDLE_SBR_HEADER_DATA sbrHeaderData,
125
                           HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData,
126
                           HANDLE_COMMON_DATA cmonData);
127
128
static INT encodeSbrHeaderData(HANDLE_SBR_HEADER_DATA sbrHeaderData,
129
                               HANDLE_FDK_BITSTREAM hBitStream);
130
131
static INT encodeSbrSingleChannelElement(
132
    HANDLE_SBR_ENV_DATA sbrEnvData, HANDLE_FDK_BITSTREAM hBitStream,
133
    HANDLE_PARAMETRIC_STEREO hParametricStereo, const UINT sbrSyntaxFlags);
134
135
static INT encodeSbrChannelPairElement(
136
    HANDLE_SBR_ENV_DATA sbrEnvDataLeft, HANDLE_SBR_ENV_DATA sbrEnvDataRight,
137
    HANDLE_PARAMETRIC_STEREO hParametricStereo, HANDLE_FDK_BITSTREAM hBitStream,
138
    const INT coupling, const UINT sbrSyntaxFlags);
139
140
static INT encodeSbrGrid(HANDLE_SBR_ENV_DATA sbrEnvData,
141
                         HANDLE_FDK_BITSTREAM hBitStream);
142
143
static int encodeLowDelaySbrGrid(HANDLE_SBR_ENV_DATA sbrEnvData,
144
                                 HANDLE_FDK_BITSTREAM hBitStream,
145
                                 const int transmitFreqs,
146
                                 const UINT sbrSyntaxFlags);
147
148
static INT encodeSbrDtdf(HANDLE_SBR_ENV_DATA sbrEnvData,
149
                         HANDLE_FDK_BITSTREAM hBitStream);
150
151
static INT writeNoiseLevelData(HANDLE_SBR_ENV_DATA sbrEnvData,
152
                               HANDLE_FDK_BITSTREAM hBitStream, INT coupling);
153
154
static INT writeEnvelopeData(HANDLE_SBR_ENV_DATA sbrEnvData,
155
                             HANDLE_FDK_BITSTREAM hBitStream, INT coupling);
156
157
static INT writeSyntheticCodingData(HANDLE_SBR_ENV_DATA sbrEnvData,
158
                                    HANDLE_FDK_BITSTREAM hBitStream);
159
160
static INT encodeExtendedData(HANDLE_PARAMETRIC_STEREO hParametricStereo,
161
                              HANDLE_FDK_BITSTREAM hBitStream);
162
163
static INT getSbrExtendedDataSize(HANDLE_PARAMETRIC_STEREO hParametricStereo);
164
165
/*****************************************************************************
166
167
    functionname: FDKsbrEnc_WriteEnvSingleChannelElement
168
    description:  writes pure SBR single channel data element
169
    returns:      number of bits written
170
    input:
171
    output:
172
173
*****************************************************************************/
174
INT FDKsbrEnc_WriteEnvSingleChannelElement(
175
    HANDLE_SBR_HEADER_DATA sbrHeaderData,
176
    HANDLE_PARAMETRIC_STEREO hParametricStereo,
177
    HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData, HANDLE_SBR_ENV_DATA sbrEnvData,
178
    HANDLE_COMMON_DATA cmonData, UINT sbrSyntaxFlags)
179
180
0
{
181
0
  INT payloadBits = 0;
182
183
0
  cmonData->sbrHdrBits = 0;
184
0
  cmonData->sbrDataBits = 0;
185
186
  /* write pure sbr data */
187
0
  if (sbrEnvData != NULL) {
188
    /* write header */
189
0
    payloadBits += encodeSbrHeader(sbrHeaderData, sbrBitstreamData, cmonData);
190
191
    /* write data */
192
0
    payloadBits += encodeSbrData(sbrEnvData, NULL, hParametricStereo, cmonData,
193
0
                                 SBR_ID_SCE, 0, sbrSyntaxFlags);
194
0
  }
195
0
  return payloadBits;
196
0
}
197
198
/*****************************************************************************
199
200
    functionname: FDKsbrEnc_WriteEnvChannelPairElement
201
    description:  writes pure SBR channel pair data element
202
    returns:      number of bits written
203
    input:
204
    output:
205
206
*****************************************************************************/
207
INT FDKsbrEnc_WriteEnvChannelPairElement(
208
    HANDLE_SBR_HEADER_DATA sbrHeaderData,
209
    HANDLE_PARAMETRIC_STEREO hParametricStereo,
210
    HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData,
211
    HANDLE_SBR_ENV_DATA sbrEnvDataLeft, HANDLE_SBR_ENV_DATA sbrEnvDataRight,
212
    HANDLE_COMMON_DATA cmonData, UINT sbrSyntaxFlags)
213
214
0
{
215
0
  INT payloadBits = 0;
216
0
  cmonData->sbrHdrBits = 0;
217
0
  cmonData->sbrDataBits = 0;
218
219
  /* write pure sbr data */
220
0
  if ((sbrEnvDataLeft != NULL) && (sbrEnvDataRight != NULL)) {
221
    /* write header */
222
0
    payloadBits += encodeSbrHeader(sbrHeaderData, sbrBitstreamData, cmonData);
223
224
    /* write data */
225
0
    payloadBits += encodeSbrData(sbrEnvDataLeft, sbrEnvDataRight,
226
0
                                 hParametricStereo, cmonData, SBR_ID_CPE,
227
0
                                 sbrHeaderData->coupling, sbrSyntaxFlags);
228
0
  }
229
0
  return payloadBits;
230
0
}
231
232
INT FDKsbrEnc_CountSbrChannelPairElement(
233
    HANDLE_SBR_HEADER_DATA sbrHeaderData,
234
    HANDLE_PARAMETRIC_STEREO hParametricStereo,
235
    HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData,
236
    HANDLE_SBR_ENV_DATA sbrEnvDataLeft, HANDLE_SBR_ENV_DATA sbrEnvDataRight,
237
0
    HANDLE_COMMON_DATA cmonData, UINT sbrSyntaxFlags) {
238
0
  INT payloadBits;
239
0
  INT bitPos = FDKgetValidBits(&cmonData->sbrBitbuf);
240
241
0
  payloadBits = FDKsbrEnc_WriteEnvChannelPairElement(
242
0
      sbrHeaderData, hParametricStereo, sbrBitstreamData, sbrEnvDataLeft,
243
0
      sbrEnvDataRight, cmonData, sbrSyntaxFlags);
244
245
0
  FDKpushBack(&cmonData->sbrBitbuf,
246
0
              (FDKgetValidBits(&cmonData->sbrBitbuf) - bitPos));
247
248
0
  return payloadBits;
249
0
}
250
251
void sbrEncoder_GetHeader(SBR_ENCODER *sbrEncoder, HANDLE_FDK_BITSTREAM hBs,
252
0
                          INT element_index, int fSendHeaders) {
253
0
  encodeSbrHeaderData(&sbrEncoder->sbrElement[element_index]->sbrHeaderData,
254
0
                      hBs);
255
256
0
  if (fSendHeaders == 0) {
257
    /* Prevent header being embedded into the SBR payload. */
258
0
    sbrEncoder->sbrElement[element_index]->sbrBitstreamData.NrSendHeaderData =
259
0
        -1;
260
0
    sbrEncoder->sbrElement[element_index]->sbrBitstreamData.HeaderActive = 0;
261
0
    sbrEncoder->sbrElement[element_index]
262
0
        ->sbrBitstreamData.CountSendHeaderData = -1;
263
0
  }
264
0
}
265
266
/*****************************************************************************
267
268
    functionname: encodeSbrHeader
269
    description:  encodes SBR Header information
270
    returns:      number of bits written
271
    input:
272
    output:
273
274
*****************************************************************************/
275
static INT encodeSbrHeader(HANDLE_SBR_HEADER_DATA sbrHeaderData,
276
                           HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData,
277
0
                           HANDLE_COMMON_DATA cmonData) {
278
0
  INT payloadBits = 0;
279
280
0
  if (sbrBitstreamData->HeaderActive) {
281
0
    payloadBits += FDKwriteBits(&cmonData->sbrBitbuf, 1, 1);
282
0
    payloadBits += encodeSbrHeaderData(sbrHeaderData, &cmonData->sbrBitbuf);
283
0
  } else {
284
0
    payloadBits += FDKwriteBits(&cmonData->sbrBitbuf, 0, 1);
285
0
  }
286
287
0
  cmonData->sbrHdrBits = payloadBits;
288
289
0
  return payloadBits;
290
0
}
291
292
/*****************************************************************************
293
294
    functionname: encodeSbrHeaderData
295
    description:  writes sbr_header()
296
                  bs_protocol_version through bs_header_extra_2
297
    returns:      number of bits written
298
    input:
299
    output:
300
301
*****************************************************************************/
302
static INT encodeSbrHeaderData(HANDLE_SBR_HEADER_DATA sbrHeaderData,
303
                               HANDLE_FDK_BITSTREAM hBitStream)
304
305
0
{
306
0
  INT payloadBits = 0;
307
0
  if (sbrHeaderData != NULL) {
308
0
    payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->sbr_amp_res,
309
0
                                SI_SBR_AMP_RES_BITS);
310
0
    payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->sbr_start_frequency,
311
0
                                SI_SBR_START_FREQ_BITS);
312
0
    payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->sbr_stop_frequency,
313
0
                                SI_SBR_STOP_FREQ_BITS);
314
0
    payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->sbr_xover_band,
315
0
                                SI_SBR_XOVER_BAND_BITS);
316
317
0
    payloadBits += FDKwriteBits(hBitStream, 0, SI_SBR_RESERVED_BITS);
318
319
0
    payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->header_extra_1,
320
0
                                SI_SBR_HEADER_EXTRA_1_BITS);
321
0
    payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->header_extra_2,
322
0
                                SI_SBR_HEADER_EXTRA_2_BITS);
323
324
0
    if (sbrHeaderData->header_extra_1) {
325
0
      payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->freqScale,
326
0
                                  SI_SBR_FREQ_SCALE_BITS);
327
0
      payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->alterScale,
328
0
                                  SI_SBR_ALTER_SCALE_BITS);
329
0
      payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->sbr_noise_bands,
330
0
                                  SI_SBR_NOISE_BANDS_BITS);
331
0
    } /* sbrHeaderData->header_extra_1 */
332
333
0
    if (sbrHeaderData->header_extra_2) {
334
0
      payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->sbr_limiter_bands,
335
0
                                  SI_SBR_LIMITER_BANDS_BITS);
336
0
      payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->sbr_limiter_gains,
337
0
                                  SI_SBR_LIMITER_GAINS_BITS);
338
0
      payloadBits += FDKwriteBits(hBitStream, sbrHeaderData->sbr_interpol_freq,
339
0
                                  SI_SBR_INTERPOL_FREQ_BITS);
340
0
      payloadBits +=
341
0
          FDKwriteBits(hBitStream, sbrHeaderData->sbr_smoothing_length,
342
0
                       SI_SBR_SMOOTHING_LENGTH_BITS);
343
344
0
    } /* sbrHeaderData->header_extra_2 */
345
0
  }   /* sbrHeaderData != NULL */
346
347
0
  return payloadBits;
348
0
}
349
350
/*****************************************************************************
351
352
    functionname: encodeSbrData
353
    description:  encodes sbr Data information
354
    returns:      number of bits written
355
    input:
356
    output:
357
358
*****************************************************************************/
359
static INT encodeSbrData(HANDLE_SBR_ENV_DATA sbrEnvDataLeft,
360
                         HANDLE_SBR_ENV_DATA sbrEnvDataRight,
361
                         HANDLE_PARAMETRIC_STEREO hParametricStereo,
362
                         HANDLE_COMMON_DATA cmonData, SBR_ELEMENT_TYPE sbrElem,
363
0
                         INT coupling, UINT sbrSyntaxFlags) {
364
0
  INT payloadBits = 0;
365
366
0
  switch (sbrElem) {
367
0
    case SBR_ID_SCE:
368
0
      payloadBits +=
369
0
          encodeSbrSingleChannelElement(sbrEnvDataLeft, &cmonData->sbrBitbuf,
370
0
                                        hParametricStereo, sbrSyntaxFlags);
371
0
      break;
372
0
    case SBR_ID_CPE:
373
0
      payloadBits += encodeSbrChannelPairElement(
374
0
          sbrEnvDataLeft, sbrEnvDataRight, hParametricStereo,
375
0
          &cmonData->sbrBitbuf, coupling, sbrSyntaxFlags);
376
0
      break;
377
0
    default:
378
      /* we never should apply SBR to any other element type */
379
0
      FDK_ASSERT(0);
380
0
  }
381
382
0
  cmonData->sbrDataBits = payloadBits;
383
384
0
  return payloadBits;
385
0
}
386
387
0
#define MODE_FREQ_TANS 1
388
#define MODE_NO_FREQ_TRAN 0
389
0
#define LD_TRANSMISSION MODE_FREQ_TANS
390
0
static int encodeFreqs(int mode) { return ((mode & MODE_FREQ_TANS) ? 1 : 0); }
391
392
/*****************************************************************************
393
394
    functionname: encodeSbrSingleChannelElement
395
    description:  encodes sbr SCE information
396
    returns:      number of bits written
397
    input:
398
    output:
399
400
*****************************************************************************/
401
static INT encodeSbrSingleChannelElement(
402
    HANDLE_SBR_ENV_DATA sbrEnvData, HANDLE_FDK_BITSTREAM hBitStream,
403
0
    HANDLE_PARAMETRIC_STEREO hParametricStereo, const UINT sbrSyntaxFlags) {
404
0
  INT i, payloadBits = 0;
405
406
0
  payloadBits += FDKwriteBits(hBitStream, 0,
407
0
                              SI_SBR_DATA_EXTRA_BITS); /* no reserved bits */
408
409
0
  if (sbrEnvData->ldGrid) {
410
0
    if (sbrEnvData->hSbrBSGrid->frameClass != FIXFIXonly) {
411
      /* encode normal SbrGrid */
412
0
      payloadBits += encodeSbrGrid(sbrEnvData, hBitStream);
413
0
    } else {
414
      /* use FIXFIXonly frame Grid */
415
0
      payloadBits += encodeLowDelaySbrGrid(
416
0
          sbrEnvData, hBitStream, encodeFreqs(LD_TRANSMISSION), sbrSyntaxFlags);
417
0
    }
418
0
  } else {
419
0
    if (sbrSyntaxFlags & SBR_SYNTAX_SCALABLE) {
420
0
      payloadBits += FDKwriteBits(hBitStream, 1, SI_SBR_COUPLING_BITS);
421
0
    }
422
0
    payloadBits += encodeSbrGrid(sbrEnvData, hBitStream);
423
0
  }
424
425
0
  payloadBits += encodeSbrDtdf(sbrEnvData, hBitStream);
426
427
0
  for (i = 0; i < sbrEnvData->noOfnoisebands; i++) {
428
0
    payloadBits += FDKwriteBits(hBitStream, sbrEnvData->sbr_invf_mode_vec[i],
429
0
                                SI_SBR_INVF_MODE_BITS);
430
0
  }
431
432
0
  payloadBits += writeEnvelopeData(sbrEnvData, hBitStream, 0);
433
0
  payloadBits += writeNoiseLevelData(sbrEnvData, hBitStream, 0);
434
435
0
  payloadBits += writeSyntheticCodingData(sbrEnvData, hBitStream);
436
437
0
  payloadBits += encodeExtendedData(hParametricStereo, hBitStream);
438
439
0
  return payloadBits;
440
0
}
441
442
/*****************************************************************************
443
444
    functionname: encodeSbrChannelPairElement
445
    description:  encodes sbr CPE information
446
    returns:
447
    input:
448
    output:
449
450
*****************************************************************************/
451
static INT encodeSbrChannelPairElement(
452
    HANDLE_SBR_ENV_DATA sbrEnvDataLeft, HANDLE_SBR_ENV_DATA sbrEnvDataRight,
453
    HANDLE_PARAMETRIC_STEREO hParametricStereo, HANDLE_FDK_BITSTREAM hBitStream,
454
0
    const INT coupling, const UINT sbrSyntaxFlags) {
455
0
  INT payloadBits = 0;
456
0
  INT i = 0;
457
458
0
  payloadBits += FDKwriteBits(hBitStream, 0,
459
0
                              SI_SBR_DATA_EXTRA_BITS); /* no reserved bits */
460
461
0
  payloadBits += FDKwriteBits(hBitStream, coupling, SI_SBR_COUPLING_BITS);
462
463
0
  if (coupling) {
464
0
    if (sbrEnvDataLeft->ldGrid) {
465
0
      if (sbrEnvDataLeft->hSbrBSGrid->frameClass != FIXFIXonly) {
466
        /* normal SbrGrid */
467
0
        payloadBits += encodeSbrGrid(sbrEnvDataLeft, hBitStream);
468
469
0
      } else {
470
        /* FIXFIXonly frame Grid */
471
0
        payloadBits +=
472
0
            encodeLowDelaySbrGrid(sbrEnvDataLeft, hBitStream,
473
0
                                  encodeFreqs(LD_TRANSMISSION), sbrSyntaxFlags);
474
0
      }
475
0
    } else
476
0
      payloadBits += encodeSbrGrid(sbrEnvDataLeft, hBitStream);
477
478
0
    payloadBits += encodeSbrDtdf(sbrEnvDataLeft, hBitStream);
479
0
    payloadBits += encodeSbrDtdf(sbrEnvDataRight, hBitStream);
480
481
0
    for (i = 0; i < sbrEnvDataLeft->noOfnoisebands; i++) {
482
0
      payloadBits +=
483
0
          FDKwriteBits(hBitStream, sbrEnvDataLeft->sbr_invf_mode_vec[i],
484
0
                       SI_SBR_INVF_MODE_BITS);
485
0
    }
486
487
0
    payloadBits += writeEnvelopeData(sbrEnvDataLeft, hBitStream, 1);
488
0
    payloadBits += writeNoiseLevelData(sbrEnvDataLeft, hBitStream, 1);
489
0
    payloadBits += writeEnvelopeData(sbrEnvDataRight, hBitStream, 1);
490
0
    payloadBits += writeNoiseLevelData(sbrEnvDataRight, hBitStream, 1);
491
492
0
    payloadBits += writeSyntheticCodingData(sbrEnvDataLeft, hBitStream);
493
0
    payloadBits += writeSyntheticCodingData(sbrEnvDataRight, hBitStream);
494
495
0
  } else { /* no coupling */
496
0
    FDK_ASSERT(sbrEnvDataLeft->ldGrid == sbrEnvDataRight->ldGrid);
497
498
0
    if (sbrEnvDataLeft->ldGrid || sbrEnvDataRight->ldGrid) {
499
      /* sbrEnvDataLeft (left channel) */
500
0
      if (sbrEnvDataLeft->hSbrBSGrid->frameClass != FIXFIXonly) {
501
        /* no FIXFIXonly Frame so we dont need encodeLowDelaySbrGrid */
502
        /* normal SbrGrid */
503
0
        payloadBits += encodeSbrGrid(sbrEnvDataLeft, hBitStream);
504
505
0
      } else {
506
        /* FIXFIXonly frame Grid */
507
0
        payloadBits +=
508
0
            encodeLowDelaySbrGrid(sbrEnvDataLeft, hBitStream,
509
0
                                  encodeFreqs(LD_TRANSMISSION), sbrSyntaxFlags);
510
0
      }
511
512
      /* sbrEnvDataRight (right channel) */
513
0
      if (sbrEnvDataRight->hSbrBSGrid->frameClass != FIXFIXonly) {
514
        /* no FIXFIXonly Frame so we dont need encodeLowDelaySbrGrid */
515
        /* normal SbrGrid */
516
0
        payloadBits += encodeSbrGrid(sbrEnvDataRight, hBitStream);
517
518
0
      } else {
519
        /* FIXFIXonly frame Grid */
520
0
        payloadBits +=
521
0
            encodeLowDelaySbrGrid(sbrEnvDataRight, hBitStream,
522
0
                                  encodeFreqs(LD_TRANSMISSION), sbrSyntaxFlags);
523
0
      }
524
0
    } else {
525
0
      payloadBits += encodeSbrGrid(sbrEnvDataLeft, hBitStream);
526
0
      payloadBits += encodeSbrGrid(sbrEnvDataRight, hBitStream);
527
0
    }
528
0
    payloadBits += encodeSbrDtdf(sbrEnvDataLeft, hBitStream);
529
0
    payloadBits += encodeSbrDtdf(sbrEnvDataRight, hBitStream);
530
531
0
    for (i = 0; i < sbrEnvDataLeft->noOfnoisebands; i++) {
532
0
      payloadBits +=
533
0
          FDKwriteBits(hBitStream, sbrEnvDataLeft->sbr_invf_mode_vec[i],
534
0
                       SI_SBR_INVF_MODE_BITS);
535
0
    }
536
0
    for (i = 0; i < sbrEnvDataRight->noOfnoisebands; i++) {
537
0
      payloadBits +=
538
0
          FDKwriteBits(hBitStream, sbrEnvDataRight->sbr_invf_mode_vec[i],
539
0
                       SI_SBR_INVF_MODE_BITS);
540
0
    }
541
542
0
    payloadBits += writeEnvelopeData(sbrEnvDataLeft, hBitStream, 0);
543
0
    payloadBits += writeEnvelopeData(sbrEnvDataRight, hBitStream, 0);
544
0
    payloadBits += writeNoiseLevelData(sbrEnvDataLeft, hBitStream, 0);
545
0
    payloadBits += writeNoiseLevelData(sbrEnvDataRight, hBitStream, 0);
546
547
0
    payloadBits += writeSyntheticCodingData(sbrEnvDataLeft, hBitStream);
548
0
    payloadBits += writeSyntheticCodingData(sbrEnvDataRight, hBitStream);
549
550
0
  } /* coupling */
551
552
0
  payloadBits += encodeExtendedData(hParametricStereo, hBitStream);
553
554
0
  return payloadBits;
555
0
}
556
557
0
static INT ceil_ln2(INT x) {
558
0
  INT tmp = -1;
559
0
  while ((1 << ++tmp) < x)
560
0
    ;
561
0
  return (tmp);
562
0
}
563
564
/*****************************************************************************
565
566
    functionname: encodeSbrGrid
567
    description:  if hBitStream != NULL writes bits that describes the
568
                  time/frequency grouping of a frame; else counts them only
569
    returns:      number of bits written or counted
570
    input:
571
    output:
572
573
*****************************************************************************/
574
static INT encodeSbrGrid(HANDLE_SBR_ENV_DATA sbrEnvData,
575
0
                         HANDLE_FDK_BITSTREAM hBitStream) {
576
0
  INT payloadBits = 0;
577
0
  INT i, temp;
578
0
  INT bufferFrameStart = sbrEnvData->hSbrBSGrid->bufferFrameStart;
579
0
  INT numberTimeSlots = sbrEnvData->hSbrBSGrid->numberTimeSlots;
580
581
0
  if (sbrEnvData->ldGrid)
582
0
    payloadBits += FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->frameClass,
583
0
                                SBR_CLA_BITS_LD);
584
0
  else
585
0
    payloadBits += FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->frameClass,
586
0
                                SBR_CLA_BITS);
587
588
0
  switch (sbrEnvData->hSbrBSGrid->frameClass) {
589
0
    case FIXFIXonly:
590
0
      FDK_ASSERT(0 /* Fatal error in encodeSbrGrid! */);
591
0
      break;
592
0
    case FIXFIX:
593
0
      temp = ceil_ln2(sbrEnvData->hSbrBSGrid->bs_num_env);
594
0
      payloadBits += FDKwriteBits(hBitStream, temp, SBR_ENV_BITS);
595
0
      if ((sbrEnvData->ldGrid) && (sbrEnvData->hSbrBSGrid->bs_num_env == 1))
596
0
        payloadBits += FDKwriteBits(hBitStream, sbrEnvData->currentAmpResFF,
597
0
                                    SI_SBR_AMP_RES_BITS);
598
0
      payloadBits += FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->v_f[0],
599
0
                                  SBR_RES_BITS);
600
601
0
      break;
602
603
0
    case FIXVAR:
604
0
    case VARFIX:
605
0
      if (sbrEnvData->hSbrBSGrid->frameClass == FIXVAR)
606
0
        temp = sbrEnvData->hSbrBSGrid->bs_abs_bord -
607
0
               (bufferFrameStart + numberTimeSlots);
608
0
      else
609
0
        temp = sbrEnvData->hSbrBSGrid->bs_abs_bord - bufferFrameStart;
610
611
0
      payloadBits += FDKwriteBits(hBitStream, temp, SBR_ABS_BITS);
612
0
      payloadBits +=
613
0
          FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->n, SBR_NUM_BITS);
614
615
0
      for (i = 0; i < sbrEnvData->hSbrBSGrid->n; i++) {
616
0
        temp = (sbrEnvData->hSbrBSGrid->bs_rel_bord[i] - 2) >> 1;
617
0
        payloadBits += FDKwriteBits(hBitStream, temp, SBR_REL_BITS);
618
0
      }
619
620
0
      temp = ceil_ln2(sbrEnvData->hSbrBSGrid->n + 2);
621
0
      payloadBits += FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->p, temp);
622
623
0
      for (i = 0; i < sbrEnvData->hSbrBSGrid->n + 1; i++) {
624
0
        payloadBits += FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->v_f[i],
625
0
                                    SBR_RES_BITS);
626
0
      }
627
0
      break;
628
629
0
    case VARVAR:
630
0
      temp = sbrEnvData->hSbrBSGrid->bs_abs_bord_0 - bufferFrameStart;
631
0
      payloadBits += FDKwriteBits(hBitStream, temp, SBR_ABS_BITS);
632
0
      temp = sbrEnvData->hSbrBSGrid->bs_abs_bord_1 -
633
0
             (bufferFrameStart + numberTimeSlots);
634
0
      payloadBits += FDKwriteBits(hBitStream, temp, SBR_ABS_BITS);
635
636
0
      payloadBits += FDKwriteBits(
637
0
          hBitStream, sbrEnvData->hSbrBSGrid->bs_num_rel_0, SBR_NUM_BITS);
638
0
      payloadBits += FDKwriteBits(
639
0
          hBitStream, sbrEnvData->hSbrBSGrid->bs_num_rel_1, SBR_NUM_BITS);
640
641
0
      for (i = 0; i < sbrEnvData->hSbrBSGrid->bs_num_rel_0; i++) {
642
0
        temp = (sbrEnvData->hSbrBSGrid->bs_rel_bord_0[i] - 2) >> 1;
643
0
        payloadBits += FDKwriteBits(hBitStream, temp, SBR_REL_BITS);
644
0
      }
645
646
0
      for (i = 0; i < sbrEnvData->hSbrBSGrid->bs_num_rel_1; i++) {
647
0
        temp = (sbrEnvData->hSbrBSGrid->bs_rel_bord_1[i] - 2) >> 1;
648
0
        payloadBits += FDKwriteBits(hBitStream, temp, SBR_REL_BITS);
649
0
      }
650
651
0
      temp = ceil_ln2(sbrEnvData->hSbrBSGrid->bs_num_rel_0 +
652
0
                      sbrEnvData->hSbrBSGrid->bs_num_rel_1 + 2);
653
0
      payloadBits += FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->p, temp);
654
655
0
      temp = sbrEnvData->hSbrBSGrid->bs_num_rel_0 +
656
0
             sbrEnvData->hSbrBSGrid->bs_num_rel_1 + 1;
657
658
0
      for (i = 0; i < temp; i++) {
659
0
        payloadBits += FDKwriteBits(
660
0
            hBitStream, sbrEnvData->hSbrBSGrid->v_fLR[i], SBR_RES_BITS);
661
0
      }
662
0
      break;
663
0
  }
664
665
0
  return payloadBits;
666
0
}
667
668
0
#define SBR_CLA_BITS_LD 1
669
/*****************************************************************************
670
671
    functionname: encodeLowDelaySbrGrid
672
    description:  if hBitStream != NULL writes bits that describes the
673
                  time/frequency grouping of a frame;
674
                  else counts them only
675
                  (this function only write the FIXFIXonly Bitstream data)
676
    returns:      number of bits written or counted
677
    input:
678
    output:
679
680
*****************************************************************************/
681
static int encodeLowDelaySbrGrid(HANDLE_SBR_ENV_DATA sbrEnvData,
682
                                 HANDLE_FDK_BITSTREAM hBitStream,
683
                                 const int transmitFreqs,
684
0
                                 const UINT sbrSyntaxFlags) {
685
0
  int payloadBits = 0;
686
0
  int i;
687
688
  /* write FIXFIXonly Grid */
689
  /* write frameClass [1 bit] for FIXFIXonly Grid */
690
0
  payloadBits += FDKwriteBits(hBitStream, 1, SBR_CLA_BITS_LD);
691
692
  /* absolute Borders are fix: 0,X,X,X,nTimeSlots; so we dont have to transmit
693
   * them */
694
  /* only transmit the transient position! */
695
  /* with this info (b1) we can reconstruct the Frame on Decoder side : */
696
  /* border[0] = 0; border[1] = b1; border[2]=b1+2; border[3] = nrTimeSlots */
697
698
  /* use 3 or 4bits for transient border (border) */
699
0
  if (sbrEnvData->hSbrBSGrid->numberTimeSlots == 8)
700
0
    payloadBits +=
701
0
        FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->bs_abs_bord, 3);
702
0
  else
703
0
    payloadBits +=
704
0
        FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->bs_abs_bord, 4);
705
706
0
  if (transmitFreqs) {
707
    /* write FreqRes grid */
708
0
    for (i = 0; i < sbrEnvData->hSbrBSGrid->bs_num_env; i++) {
709
0
      payloadBits += FDKwriteBits(hBitStream, sbrEnvData->hSbrBSGrid->v_f[i],
710
0
                                  SBR_RES_BITS);
711
0
    }
712
0
  }
713
714
0
  return payloadBits;
715
0
}
716
717
/*****************************************************************************
718
719
    functionname: encodeSbrDtdf
720
    description:  writes bits that describes the direction of the envelopes of a
721
frame returns:      number of bits written input: output:
722
723
*****************************************************************************/
724
static INT encodeSbrDtdf(HANDLE_SBR_ENV_DATA sbrEnvData,
725
0
                         HANDLE_FDK_BITSTREAM hBitStream) {
726
0
  INT i, payloadBits = 0, noOfNoiseEnvelopes;
727
728
0
  noOfNoiseEnvelopes = sbrEnvData->noOfEnvelopes > 1 ? 2 : 1;
729
730
0
  for (i = 0; i < sbrEnvData->noOfEnvelopes; ++i) {
731
0
    payloadBits +=
732
0
        FDKwriteBits(hBitStream, sbrEnvData->domain_vec[i], SBR_DIR_BITS);
733
0
  }
734
0
  for (i = 0; i < noOfNoiseEnvelopes; ++i) {
735
0
    payloadBits +=
736
0
        FDKwriteBits(hBitStream, sbrEnvData->domain_vec_noise[i], SBR_DIR_BITS);
737
0
  }
738
739
0
  return payloadBits;
740
0
}
741
742
/*****************************************************************************
743
744
    functionname: writeNoiseLevelData
745
    description:  writes bits corresponding to the noise-floor-level
746
    returns:      number of bits written
747
    input:
748
    output:
749
750
*****************************************************************************/
751
static INT writeNoiseLevelData(HANDLE_SBR_ENV_DATA sbrEnvData,
752
0
                               HANDLE_FDK_BITSTREAM hBitStream, INT coupling) {
753
0
  INT j, i, payloadBits = 0;
754
0
  INT nNoiseEnvelopes = sbrEnvData->noOfEnvelopes > 1 ? 2 : 1;
755
756
0
  for (i = 0; i < nNoiseEnvelopes; i++) {
757
0
    switch (sbrEnvData->domain_vec_noise[i]) {
758
0
      case FREQ:
759
0
        if (coupling && sbrEnvData->balance) {
760
0
          payloadBits += FDKwriteBits(
761
0
              hBitStream,
762
0
              sbrEnvData->sbr_noise_levels[i * sbrEnvData->noOfnoisebands],
763
0
              sbrEnvData->si_sbr_start_noise_bits_balance);
764
0
        } else {
765
0
          payloadBits += FDKwriteBits(
766
0
              hBitStream,
767
0
              sbrEnvData->sbr_noise_levels[i * sbrEnvData->noOfnoisebands],
768
0
              sbrEnvData->si_sbr_start_noise_bits);
769
0
        }
770
771
0
        for (j = 1 + i * sbrEnvData->noOfnoisebands;
772
0
             j < (sbrEnvData->noOfnoisebands * (1 + i)); j++) {
773
0
          if (coupling) {
774
0
            if (sbrEnvData->balance) {
775
              /* coupling && balance */
776
0
              payloadBits += FDKwriteBits(hBitStream,
777
0
                                          sbrEnvData->hufftableNoiseBalanceFreqC
778
0
                                              [sbrEnvData->sbr_noise_levels[j] +
779
0
                                               CODE_BOOK_SCF_LAV_BALANCE11],
780
0
                                          sbrEnvData->hufftableNoiseBalanceFreqL
781
0
                                              [sbrEnvData->sbr_noise_levels[j] +
782
0
                                               CODE_BOOK_SCF_LAV_BALANCE11]);
783
0
            } else {
784
              /* coupling && !balance */
785
0
              payloadBits += FDKwriteBits(
786
0
                  hBitStream,
787
0
                  sbrEnvData->hufftableNoiseLevelFreqC
788
0
                      [sbrEnvData->sbr_noise_levels[j] + CODE_BOOK_SCF_LAV11],
789
0
                  sbrEnvData->hufftableNoiseLevelFreqL
790
0
                      [sbrEnvData->sbr_noise_levels[j] + CODE_BOOK_SCF_LAV11]);
791
0
            }
792
0
          } else {
793
            /* !coupling */
794
0
            payloadBits += FDKwriteBits(
795
0
                hBitStream,
796
0
                sbrEnvData
797
0
                    ->hufftableNoiseFreqC[sbrEnvData->sbr_noise_levels[j] +
798
0
                                          CODE_BOOK_SCF_LAV11],
799
0
                sbrEnvData
800
0
                    ->hufftableNoiseFreqL[sbrEnvData->sbr_noise_levels[j] +
801
0
                                          CODE_BOOK_SCF_LAV11]);
802
0
          }
803
0
        }
804
0
        break;
805
806
0
      case TIME:
807
0
        for (j = i * sbrEnvData->noOfnoisebands;
808
0
             j < (sbrEnvData->noOfnoisebands * (1 + i)); j++) {
809
0
          if (coupling) {
810
0
            if (sbrEnvData->balance) {
811
              /* coupling && balance */
812
0
              payloadBits += FDKwriteBits(hBitStream,
813
0
                                          sbrEnvData->hufftableNoiseBalanceTimeC
814
0
                                              [sbrEnvData->sbr_noise_levels[j] +
815
0
                                               CODE_BOOK_SCF_LAV_BALANCE11],
816
0
                                          sbrEnvData->hufftableNoiseBalanceTimeL
817
0
                                              [sbrEnvData->sbr_noise_levels[j] +
818
0
                                               CODE_BOOK_SCF_LAV_BALANCE11]);
819
0
            } else {
820
              /* coupling && !balance */
821
0
              payloadBits += FDKwriteBits(
822
0
                  hBitStream,
823
0
                  sbrEnvData->hufftableNoiseLevelTimeC
824
0
                      [sbrEnvData->sbr_noise_levels[j] + CODE_BOOK_SCF_LAV11],
825
0
                  sbrEnvData->hufftableNoiseLevelTimeL
826
0
                      [sbrEnvData->sbr_noise_levels[j] + CODE_BOOK_SCF_LAV11]);
827
0
            }
828
0
          } else {
829
            /* !coupling */
830
0
            payloadBits += FDKwriteBits(
831
0
                hBitStream,
832
0
                sbrEnvData
833
0
                    ->hufftableNoiseLevelTimeC[sbrEnvData->sbr_noise_levels[j] +
834
0
                                               CODE_BOOK_SCF_LAV11],
835
0
                sbrEnvData
836
0
                    ->hufftableNoiseLevelTimeL[sbrEnvData->sbr_noise_levels[j] +
837
0
                                               CODE_BOOK_SCF_LAV11]);
838
0
          }
839
0
        }
840
0
        break;
841
0
    }
842
0
  }
843
0
  return payloadBits;
844
0
}
845
846
/*****************************************************************************
847
848
    functionname: writeEnvelopeData
849
    description:  writes bits corresponding to the envelope
850
    returns:      number of bits written
851
    input:
852
    output:
853
854
*****************************************************************************/
855
static INT writeEnvelopeData(HANDLE_SBR_ENV_DATA sbrEnvData,
856
0
                             HANDLE_FDK_BITSTREAM hBitStream, INT coupling) {
857
0
  INT payloadBits = 0, j, i, delta;
858
859
0
  for (j = 0; j < sbrEnvData->noOfEnvelopes;
860
0
       j++) { /* loop over all envelopes */
861
0
    if (sbrEnvData->domain_vec[j] == FREQ) {
862
0
      if (coupling && sbrEnvData->balance) {
863
0
        payloadBits += FDKwriteBits(hBitStream, sbrEnvData->ienvelope[j][0],
864
0
                                    sbrEnvData->si_sbr_start_env_bits_balance);
865
0
      } else {
866
0
        payloadBits += FDKwriteBits(hBitStream, sbrEnvData->ienvelope[j][0],
867
0
                                    sbrEnvData->si_sbr_start_env_bits);
868
0
      }
869
0
    }
870
871
0
    for (i = 1 - sbrEnvData->domain_vec[j]; i < sbrEnvData->noScfBands[j];
872
0
         i++) {
873
0
      delta = sbrEnvData->ienvelope[j][i];
874
0
      if (coupling && sbrEnvData->balance) {
875
0
        FDK_ASSERT(fixp_abs(delta) <= sbrEnvData->codeBookScfLavBalance);
876
0
      } else {
877
0
        FDK_ASSERT(fixp_abs(delta) <= sbrEnvData->codeBookScfLav);
878
0
      }
879
0
      if (coupling) {
880
0
        if (sbrEnvData->balance) {
881
0
          if (sbrEnvData->domain_vec[j]) {
882
            /* coupling && balance && TIME */
883
0
            payloadBits += FDKwriteBits(
884
0
                hBitStream,
885
0
                sbrEnvData
886
0
                    ->hufftableBalanceTimeC[delta +
887
0
                                            sbrEnvData->codeBookScfLavBalance],
888
0
                sbrEnvData
889
0
                    ->hufftableBalanceTimeL[delta +
890
0
                                            sbrEnvData->codeBookScfLavBalance]);
891
0
          } else {
892
            /* coupling && balance && FREQ */
893
0
            payloadBits += FDKwriteBits(
894
0
                hBitStream,
895
0
                sbrEnvData
896
0
                    ->hufftableBalanceFreqC[delta +
897
0
                                            sbrEnvData->codeBookScfLavBalance],
898
0
                sbrEnvData
899
0
                    ->hufftableBalanceFreqL[delta +
900
0
                                            sbrEnvData->codeBookScfLavBalance]);
901
0
          }
902
0
        } else {
903
0
          if (sbrEnvData->domain_vec[j]) {
904
            /* coupling && !balance && TIME */
905
0
            payloadBits += FDKwriteBits(
906
0
                hBitStream,
907
0
                sbrEnvData
908
0
                    ->hufftableLevelTimeC[delta + sbrEnvData->codeBookScfLav],
909
0
                sbrEnvData
910
0
                    ->hufftableLevelTimeL[delta + sbrEnvData->codeBookScfLav]);
911
0
          } else {
912
            /* coupling && !balance && FREQ */
913
0
            payloadBits += FDKwriteBits(
914
0
                hBitStream,
915
0
                sbrEnvData
916
0
                    ->hufftableLevelFreqC[delta + sbrEnvData->codeBookScfLav],
917
0
                sbrEnvData
918
0
                    ->hufftableLevelFreqL[delta + sbrEnvData->codeBookScfLav]);
919
0
          }
920
0
        }
921
0
      } else {
922
0
        if (sbrEnvData->domain_vec[j]) {
923
          /* !coupling && TIME */
924
0
          payloadBits += FDKwriteBits(
925
0
              hBitStream,
926
0
              sbrEnvData->hufftableTimeC[delta + sbrEnvData->codeBookScfLav],
927
0
              sbrEnvData->hufftableTimeL[delta + sbrEnvData->codeBookScfLav]);
928
0
        } else {
929
          /* !coupling && FREQ */
930
0
          payloadBits += FDKwriteBits(
931
0
              hBitStream,
932
0
              sbrEnvData->hufftableFreqC[delta + sbrEnvData->codeBookScfLav],
933
0
              sbrEnvData->hufftableFreqL[delta + sbrEnvData->codeBookScfLav]);
934
0
        }
935
0
      }
936
0
    }
937
0
  }
938
0
  return payloadBits;
939
0
}
940
941
/*****************************************************************************
942
943
    functionname: encodeExtendedData
944
    description:  writes bits corresponding to the extended data
945
    returns:      number of bits written
946
    input:
947
    output:
948
949
*****************************************************************************/
950
static INT encodeExtendedData(HANDLE_PARAMETRIC_STEREO hParametricStereo,
951
0
                              HANDLE_FDK_BITSTREAM hBitStream) {
952
0
  INT extDataSize;
953
0
  INT payloadBits = 0;
954
955
0
  extDataSize = getSbrExtendedDataSize(hParametricStereo);
956
957
0
  if (extDataSize != 0) {
958
0
    INT maxExtSize = (1 << SI_SBR_EXTENSION_SIZE_BITS) - 1;
959
0
    INT writtenNoBits = 0; /* needed to byte align the extended data */
960
961
0
    payloadBits += FDKwriteBits(hBitStream, 1, SI_SBR_EXTENDED_DATA_BITS);
962
0
    FDK_ASSERT(extDataSize <= SBR_EXTENDED_DATA_MAX_CNT);
963
964
0
    if (extDataSize < maxExtSize) {
965
0
      payloadBits +=
966
0
          FDKwriteBits(hBitStream, extDataSize, SI_SBR_EXTENSION_SIZE_BITS);
967
0
    } else {
968
0
      payloadBits +=
969
0
          FDKwriteBits(hBitStream, maxExtSize, SI_SBR_EXTENSION_SIZE_BITS);
970
0
      payloadBits += FDKwriteBits(hBitStream, extDataSize - maxExtSize,
971
0
                                  SI_SBR_EXTENSION_ESC_COUNT_BITS);
972
0
    }
973
974
    /* parametric coding signalled here? */
975
0
    if (hParametricStereo) {
976
0
      writtenNoBits += FDKwriteBits(hBitStream, EXTENSION_ID_PS_CODING,
977
0
                                    SI_SBR_EXTENSION_ID_BITS);
978
0
      writtenNoBits +=
979
0
          FDKsbrEnc_PSEnc_WritePSData(hParametricStereo, hBitStream);
980
0
    }
981
982
0
    payloadBits += writtenNoBits;
983
984
    /* byte alignment */
985
0
    writtenNoBits = writtenNoBits % 8;
986
0
    if (writtenNoBits)
987
0
      payloadBits += FDKwriteBits(hBitStream, 0, (8 - writtenNoBits));
988
0
  } else {
989
0
    payloadBits += FDKwriteBits(hBitStream, 0, SI_SBR_EXTENDED_DATA_BITS);
990
0
  }
991
992
0
  return payloadBits;
993
0
}
994
995
/*****************************************************************************
996
997
    functionname: writeSyntheticCodingData
998
    description:  writes bits corresponding to the "synthetic-coding"-extension
999
    returns:      number of bits written
1000
    input:
1001
    output:
1002
1003
*****************************************************************************/
1004
static INT writeSyntheticCodingData(HANDLE_SBR_ENV_DATA sbrEnvData,
1005
                                    HANDLE_FDK_BITSTREAM hBitStream)
1006
1007
0
{
1008
0
  INT i;
1009
0
  INT payloadBits = 0;
1010
1011
0
  payloadBits += FDKwriteBits(hBitStream, sbrEnvData->addHarmonicFlag, 1);
1012
1013
0
  if (sbrEnvData->addHarmonicFlag) {
1014
0
    for (i = 0; i < sbrEnvData->noHarmonics; i++) {
1015
0
      payloadBits += FDKwriteBits(hBitStream, sbrEnvData->addHarmonic[i], 1);
1016
0
    }
1017
0
  }
1018
1019
0
  return payloadBits;
1020
0
}
1021
1022
/*****************************************************************************
1023
1024
    functionname: getSbrExtendedDataSize
1025
    description:  counts the number of bits needed for encoding the
1026
                  extended data (including extension id)
1027
1028
    returns:      number of bits needed for the extended data
1029
    input:
1030
    output:
1031
1032
*****************************************************************************/
1033
0
static INT getSbrExtendedDataSize(HANDLE_PARAMETRIC_STEREO hParametricStereo) {
1034
0
  INT extDataBits = 0;
1035
1036
  /* add your new extended data counting methods here */
1037
1038
  /*
1039
    no extended data
1040
  */
1041
1042
0
  if (hParametricStereo) {
1043
    /* PS extended data */
1044
0
    extDataBits += SI_SBR_EXTENSION_ID_BITS;
1045
0
    extDataBits += FDKsbrEnc_PSEnc_WritePSData(hParametricStereo, NULL);
1046
0
  }
1047
1048
0
  return (extDataBits + 7) >> 3;
1049
0
}