/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 | } |