Mercurial > mplayer.hg
annotate libfaad2/specrec.c @ 27518:e54c9b7eb0d8
Revert bad changes to SSA/ASS subtitle packet format
The following commits are reverted partially or completely:
"a valid ASS line contains 9 ',' before actual text"
"demux_mkv: output correctly formated ASS packets"
"libass: add a new ass_process_data() to process demuxed subtitle packets"
These commits converted the internal representation of SSA/ASS
subtitle packets from the format used by Matroska to a custom format
where each packet has contents exactly matching one line in complete
SSA script files. AFAIK no files natively use such a format for muxed
subtitles. The stated reason for this change was to use a format that
could in principle be muxed into a maximal number of containers. SSA
subtitles do not have an implicit duration so both start time and
duration or end time need to be specified explicitly; the new format
moved timing information inside the codec packet data so it could be
muxed without modification into containers that can represent only
start time at the container level. However such a change is wrong from
the viewpoint of program architecture. Timing information belongs to
the demuxer level, but these commits moved not only the duration but
also the authoritative value of the start time to inside the codec
data. Additionally the new format lost the value of the Matroska
ReadOrder field which is used by MPlayer.
This commit changes the internal packet format back to that used by
Matroska and makes the internal Matroska demuxer output that format
again. Libavformat still outputs the "new" format; it could be
converted back to the Matroska format in demux_lavf.c, but I'm not
adding that code at least yet. The current lavf code has similar
problems as the reverted code in MPlayer, and it also currently fails
to provide any way to access the value of the ReadOrder field. I hope
that the lavf side will be improved; if it isn't conversion can be
added later. For now I'll make MPlayer default to the internal Matroska
demuxer instead of the lavf one in a separate commit.
author | uau |
---|---|
date | Mon, 08 Sep 2008 21:26:22 +0000 |
parents | 0783dd397f74 |
children | 5f24919c13ef |
rev | line source |
---|---|
10725 | 1 /* |
2 ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding | |
12527 | 3 ** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com |
14729
b4378a6f87a6
Sync missing cosmetics from the 2004-07-12 CVS snapshot.
diego
parents:
14727
diff
changeset
|
4 ** |
10725 | 5 ** This program is free software; you can redistribute it and/or modify |
6 ** it under the terms of the GNU General Public License as published by | |
7 ** the Free Software Foundation; either version 2 of the License, or | |
8 ** (at your option) any later version. | |
14729
b4378a6f87a6
Sync missing cosmetics from the 2004-07-12 CVS snapshot.
diego
parents:
14727
diff
changeset
|
9 ** |
10725 | 10 ** This program is distributed in the hope that it will be useful, |
11 ** but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 ** GNU General Public License for more details. | |
14729
b4378a6f87a6
Sync missing cosmetics from the 2004-07-12 CVS snapshot.
diego
parents:
14727
diff
changeset
|
14 ** |
10725 | 15 ** You should have received a copy of the GNU General Public License |
14729
b4378a6f87a6
Sync missing cosmetics from the 2004-07-12 CVS snapshot.
diego
parents:
14727
diff
changeset
|
16 ** along with this program; if not, write to the Free Software |
10725 | 17 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
18 ** | |
19 ** Any non-GPL usage of this software or parts of this software is strictly | |
20 ** forbidden. | |
21 ** | |
18141 | 22 ** Initially modified for use with MPlayer on 2006/04/18 |
23 ** $Id: specrec.c,v 1.56 2004/09/08 09:43:11 gcp Exp $ | |
18783 | 24 ** detailed changelog at http://svn.mplayerhq.hu/mplayer/trunk/ |
18141 | 25 ** local_changes.diff contains the exact changes to this file. |
10725 | 26 **/ |
27 | |
28 /* | |
29 Spectral reconstruction: | |
30 - grouping/sectioning | |
31 - inverse quantization | |
32 - applying scalefactors | |
33 */ | |
34 | |
35 #include "common.h" | |
36 #include "structs.h" | |
37 | |
38 #include <string.h> | |
12527 | 39 #include <stdlib.h> |
10725 | 40 #include "specrec.h" |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
41 #include "filtbank.h" |
10725 | 42 #include "syntax.h" |
43 #include "iq_table.h" | |
12527 | 44 #include "ms.h" |
45 #include "is.h" | |
46 #include "pns.h" | |
47 #include "tns.h" | |
48 #include "drc.h" | |
49 #include "lt_predict.h" | |
50 #include "ic_predict.h" | |
51 #ifdef SSR_DEC | |
52 #include "ssr.h" | |
53 #include "ssr_fb.h" | |
54 #endif | |
55 | |
56 | |
57 /* static function declarations */ | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
58 static uint8_t quant_to_spec(NeAACDecHandle hDecoder, |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
59 ic_stream *ics, int16_t *quant_data, |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
60 real_t *spec_data, uint16_t frame_len); |
12527 | 61 |
10725 | 62 |
63 #ifdef LD_DEC | |
12527 | 64 ALIGN static const uint8_t num_swb_512_window[] = |
10725 | 65 { |
66 0, 0, 0, 36, 36, 37, 31, 31, 0, 0, 0, 0 | |
67 }; | |
12527 | 68 ALIGN static const uint8_t num_swb_480_window[] = |
10725 | 69 { |
70 0, 0, 0, 35, 35, 37, 30, 30, 0, 0, 0, 0 | |
71 }; | |
72 #endif | |
73 | |
12527 | 74 ALIGN static const uint8_t num_swb_960_window[] = |
10725 | 75 { |
76 40, 40, 45, 49, 49, 49, 46, 46, 42, 42, 42, 40 | |
77 }; | |
78 | |
12527 | 79 ALIGN static const uint8_t num_swb_1024_window[] = |
10725 | 80 { |
81 41, 41, 47, 49, 49, 51, 47, 47, 43, 43, 43, 40 | |
82 }; | |
83 | |
12527 | 84 ALIGN static const uint8_t num_swb_128_window[] = |
10725 | 85 { |
86 12, 12, 12, 14, 14, 14, 15, 15, 15, 15, 15, 15 | |
87 }; | |
88 | |
12527 | 89 ALIGN static const uint16_t swb_offset_1024_96[] = |
10725 | 90 { |
91 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, | |
92 64, 72, 80, 88, 96, 108, 120, 132, 144, 156, 172, 188, 212, 240, | |
93 276, 320, 384, 448, 512, 576, 640, 704, 768, 832, 896, 960, 1024 | |
94 }; | |
95 | |
12527 | 96 ALIGN static const uint16_t swb_offset_128_96[] = |
10725 | 97 { |
98 0, 4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 92, 128 | |
99 }; | |
100 | |
12527 | 101 ALIGN static const uint16_t swb_offset_1024_64[] = |
10725 | 102 { |
103 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, | |
104 64, 72, 80, 88, 100, 112, 124, 140, 156, 172, 192, 216, 240, 268, | |
105 304, 344, 384, 424, 464, 504, 544, 584, 624, 664, 704, 744, 784, 824, | |
106 864, 904, 944, 984, 1024 | |
107 }; | |
108 | |
12527 | 109 ALIGN static const uint16_t swb_offset_128_64[] = |
10725 | 110 { |
111 0, 4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 92, 128 | |
112 }; | |
113 | |
12527 | 114 ALIGN static const uint16_t swb_offset_1024_48[] = |
10725 | 115 { |
116 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, | |
117 80, 88, 96, 108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292, | |
118 320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640, 672, 704, 736, | |
119 768, 800, 832, 864, 896, 928, 1024 | |
120 }; | |
121 | |
122 #ifdef LD_DEC | |
12527 | 123 ALIGN static const uint16_t swb_offset_512_48[] = |
10725 | 124 { |
125 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 68, 76, 84, | |
126 92, 100, 112, 124, 136, 148, 164, 184, 208, 236, 268, 300, 332, 364, 396, | |
127 428, 460, 512 | |
128 }; | |
129 | |
12527 | 130 ALIGN static const uint16_t swb_offset_480_48[] = |
10725 | 131 { |
132 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 64, 72 ,80 ,88, | |
133 96, 108, 120, 132, 144, 156, 172, 188, 212, 240, 272, 304, 336, 368, 400, | |
134 432, 480 | |
135 }; | |
136 #endif | |
137 | |
12527 | 138 ALIGN static const uint16_t swb_offset_128_48[] = |
10725 | 139 { |
140 0, 4, 8, 12, 16, 20, 28, 36, 44, 56, 68, 80, 96, 112, 128 | |
141 }; | |
142 | |
12527 | 143 ALIGN static const uint16_t swb_offset_1024_32[] = |
10725 | 144 { |
145 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, | |
146 80, 88, 96, 108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292, | |
147 320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640, 672, 704, 736, | |
148 768, 800, 832, 864, 896, 928, 960, 992, 1024 | |
149 }; | |
150 | |
151 #ifdef LD_DEC | |
12527 | 152 ALIGN static const uint16_t swb_offset_512_32[] = |
10725 | 153 { |
154 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 64, 72, 80, | |
155 88, 96, 108, 120, 132, 144, 160, 176, 192, 212, 236, 260, 288, 320, 352, | |
156 384, 416, 448, 480, 512 | |
157 }; | |
158 | |
12527 | 159 ALIGN static const uint16_t swb_offset_480_32[] = |
10725 | 160 { |
161 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 72, 80, | |
162 88, 96, 104, 112, 124, 136, 148, 164, 180, 200, 224, 256, 288, 320, 352, | |
163 384, 416, 448, 480 | |
164 }; | |
165 #endif | |
166 | |
12527 | 167 ALIGN static const uint16_t swb_offset_1024_24[] = |
10725 | 168 { |
169 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68, | |
170 76, 84, 92, 100, 108, 116, 124, 136, 148, 160, 172, 188, 204, 220, | |
171 240, 260, 284, 308, 336, 364, 396, 432, 468, 508, 552, 600, 652, 704, | |
172 768, 832, 896, 960, 1024 | |
173 }; | |
174 | |
175 #ifdef LD_DEC | |
12527 | 176 ALIGN static const uint16_t swb_offset_512_24[] = |
10725 | 177 { |
178 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68, | |
179 80, 92, 104, 120, 140, 164, 192, 224, 256, 288, 320, 352, 384, 416, | |
180 448, 480, 512 | |
181 }; | |
182 | |
12527 | 183 ALIGN static const uint16_t swb_offset_480_24[] = |
10725 | 184 { |
185 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68, 80, 92, 104, 120, | |
186 140, 164, 192, 224, 256, 288, 320, 352, 384, 416, 448, 480 | |
187 }; | |
188 #endif | |
189 | |
12527 | 190 ALIGN static const uint16_t swb_offset_128_24[] = |
10725 | 191 { |
192 0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 64, 76, 92, 108, 128 | |
193 }; | |
194 | |
12527 | 195 ALIGN static const uint16_t swb_offset_1024_16[] = |
10725 | 196 { |
197 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 100, 112, 124, | |
198 136, 148, 160, 172, 184, 196, 212, 228, 244, 260, 280, 300, 320, 344, | |
199 368, 396, 424, 456, 492, 532, 572, 616, 664, 716, 772, 832, 896, 960, 1024 | |
200 }; | |
201 | |
12527 | 202 ALIGN static const uint16_t swb_offset_128_16[] = |
10725 | 203 { |
204 0, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 60, 72, 88, 108, 128 | |
205 }; | |
206 | |
12527 | 207 ALIGN static const uint16_t swb_offset_1024_8[] = |
10725 | 208 { |
209 0, 12, 24, 36, 48, 60, 72, 84, 96, 108, 120, 132, 144, 156, 172, | |
210 188, 204, 220, 236, 252, 268, 288, 308, 328, 348, 372, 396, 420, 448, | |
211 476, 508, 544, 580, 620, 664, 712, 764, 820, 880, 944, 1024 | |
212 }; | |
213 | |
12527 | 214 ALIGN static const uint16_t swb_offset_128_8[] = |
10725 | 215 { |
216 0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 60, 72, 88, 108, 128 | |
217 }; | |
218 | |
12527 | 219 ALIGN static const uint16_t *swb_offset_1024_window[] = |
10725 | 220 { |
221 swb_offset_1024_96, /* 96000 */ | |
222 swb_offset_1024_96, /* 88200 */ | |
223 swb_offset_1024_64, /* 64000 */ | |
224 swb_offset_1024_48, /* 48000 */ | |
225 swb_offset_1024_48, /* 44100 */ | |
226 swb_offset_1024_32, /* 32000 */ | |
227 swb_offset_1024_24, /* 24000 */ | |
228 swb_offset_1024_24, /* 22050 */ | |
229 swb_offset_1024_16, /* 16000 */ | |
230 swb_offset_1024_16, /* 12000 */ | |
231 swb_offset_1024_16, /* 11025 */ | |
232 swb_offset_1024_8 /* 8000 */ | |
233 }; | |
234 | |
235 #ifdef LD_DEC | |
12527 | 236 ALIGN static const uint16_t *swb_offset_512_window[] = |
10725 | 237 { |
238 0, /* 96000 */ | |
239 0, /* 88200 */ | |
240 0, /* 64000 */ | |
241 swb_offset_512_48, /* 48000 */ | |
242 swb_offset_512_48, /* 44100 */ | |
243 swb_offset_512_32, /* 32000 */ | |
244 swb_offset_512_24, /* 24000 */ | |
245 swb_offset_512_24, /* 22050 */ | |
246 0, /* 16000 */ | |
247 0, /* 12000 */ | |
248 0, /* 11025 */ | |
249 0 /* 8000 */ | |
250 }; | |
251 | |
12527 | 252 ALIGN static const uint16_t *swb_offset_480_window[] = |
10725 | 253 { |
254 0, /* 96000 */ | |
255 0, /* 88200 */ | |
256 0, /* 64000 */ | |
257 swb_offset_480_48, /* 48000 */ | |
258 swb_offset_480_48, /* 44100 */ | |
259 swb_offset_480_32, /* 32000 */ | |
260 swb_offset_480_24, /* 24000 */ | |
261 swb_offset_480_24, /* 22050 */ | |
262 0, /* 16000 */ | |
263 0, /* 12000 */ | |
264 0, /* 11025 */ | |
265 0 /* 8000 */ | |
266 }; | |
267 #endif | |
268 | |
12527 | 269 ALIGN static const uint16_t *swb_offset_128_window[] = |
10725 | 270 { |
271 swb_offset_128_96, /* 96000 */ | |
272 swb_offset_128_96, /* 88200 */ | |
273 swb_offset_128_64, /* 64000 */ | |
274 swb_offset_128_48, /* 48000 */ | |
275 swb_offset_128_48, /* 44100 */ | |
276 swb_offset_128_48, /* 32000 */ | |
277 swb_offset_128_24, /* 24000 */ | |
278 swb_offset_128_24, /* 22050 */ | |
279 swb_offset_128_16, /* 16000 */ | |
280 swb_offset_128_16, /* 12000 */ | |
281 swb_offset_128_16, /* 11025 */ | |
282 swb_offset_128_8 /* 8000 */ | |
283 }; | |
284 | |
285 #define bit_set(A, B) ((A) & (1<<(B))) | |
286 | |
287 /* 4.5.2.3.4 */ | |
288 /* | |
289 - determine the number of windows in a window_sequence named num_windows | |
290 - determine the number of window_groups named num_window_groups | |
291 - determine the number of windows in each group named window_group_length[g] | |
292 - determine the total number of scalefactor window bands named num_swb for | |
293 the actual window type | |
294 - determine swb_offset[swb], the offset of the first coefficient in | |
295 scalefactor window band named swb of the window actually used | |
296 - determine sect_sfb_offset[g][section],the offset of the first coefficient | |
297 in section named section. This offset depends on window_sequence and | |
298 scale_factor_grouping and is needed to decode the spectral_data(). | |
299 */ | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
300 uint8_t window_grouping_info(NeAACDecHandle hDecoder, ic_stream *ics) |
10725 | 301 { |
302 uint8_t i, g; | |
303 | |
304 uint8_t sf_index = hDecoder->sf_index; | |
305 | |
306 switch (ics->window_sequence) { | |
307 case ONLY_LONG_SEQUENCE: | |
308 case LONG_START_SEQUENCE: | |
309 case LONG_STOP_SEQUENCE: | |
310 ics->num_windows = 1; | |
311 ics->num_window_groups = 1; | |
312 ics->window_group_length[ics->num_window_groups-1] = 1; | |
313 #ifdef LD_DEC | |
314 if (hDecoder->object_type == LD) | |
315 { | |
316 if (hDecoder->frameLength == 512) | |
317 ics->num_swb = num_swb_512_window[sf_index]; | |
318 else /* if (hDecoder->frameLength == 480) */ | |
319 ics->num_swb = num_swb_480_window[sf_index]; | |
320 } else { | |
321 #endif | |
322 if (hDecoder->frameLength == 1024) | |
323 ics->num_swb = num_swb_1024_window[sf_index]; | |
324 else /* if (hDecoder->frameLength == 960) */ | |
325 ics->num_swb = num_swb_960_window[sf_index]; | |
326 #ifdef LD_DEC | |
327 } | |
328 #endif | |
329 | |
330 /* preparation of sect_sfb_offset for long blocks */ | |
331 /* also copy the last value! */ | |
332 #ifdef LD_DEC | |
333 if (hDecoder->object_type == LD) | |
334 { | |
335 if (hDecoder->frameLength == 512) | |
336 { | |
337 for (i = 0; i < ics->num_swb; i++) | |
338 { | |
339 ics->sect_sfb_offset[0][i] = swb_offset_512_window[sf_index][i]; | |
340 ics->swb_offset[i] = swb_offset_512_window[sf_index][i]; | |
341 } | |
342 } else /* if (hDecoder->frameLength == 480) */ { | |
343 for (i = 0; i < ics->num_swb; i++) | |
344 { | |
345 ics->sect_sfb_offset[0][i] = swb_offset_480_window[sf_index][i]; | |
346 ics->swb_offset[i] = swb_offset_480_window[sf_index][i]; | |
347 } | |
348 } | |
349 ics->sect_sfb_offset[0][ics->num_swb] = hDecoder->frameLength; | |
350 ics->swb_offset[ics->num_swb] = hDecoder->frameLength; | |
351 } else { | |
352 #endif | |
353 for (i = 0; i < ics->num_swb; i++) | |
354 { | |
355 ics->sect_sfb_offset[0][i] = swb_offset_1024_window[sf_index][i]; | |
356 ics->swb_offset[i] = swb_offset_1024_window[sf_index][i]; | |
357 } | |
358 ics->sect_sfb_offset[0][ics->num_swb] = hDecoder->frameLength; | |
359 ics->swb_offset[ics->num_swb] = hDecoder->frameLength; | |
360 #ifdef LD_DEC | |
361 } | |
362 #endif | |
363 return 0; | |
364 case EIGHT_SHORT_SEQUENCE: | |
365 ics->num_windows = 8; | |
366 ics->num_window_groups = 1; | |
367 ics->window_group_length[ics->num_window_groups-1] = 1; | |
368 ics->num_swb = num_swb_128_window[sf_index]; | |
369 | |
370 for (i = 0; i < ics->num_swb; i++) | |
371 ics->swb_offset[i] = swb_offset_128_window[sf_index][i]; | |
372 ics->swb_offset[ics->num_swb] = hDecoder->frameLength/8; | |
373 | |
374 for (i = 0; i < ics->num_windows-1; i++) { | |
375 if (bit_set(ics->scale_factor_grouping, 6-i) == 0) | |
376 { | |
377 ics->num_window_groups += 1; | |
378 ics->window_group_length[ics->num_window_groups-1] = 1; | |
379 } else { | |
380 ics->window_group_length[ics->num_window_groups-1] += 1; | |
381 } | |
382 } | |
383 | |
384 /* preparation of sect_sfb_offset for short blocks */ | |
385 for (g = 0; g < ics->num_window_groups; g++) | |
386 { | |
387 uint16_t width; | |
388 uint8_t sect_sfb = 0; | |
389 uint16_t offset = 0; | |
390 | |
391 for (i = 0; i < ics->num_swb; i++) | |
392 { | |
393 if (i+1 == ics->num_swb) | |
394 { | |
395 width = (hDecoder->frameLength/8) - swb_offset_128_window[sf_index][i]; | |
396 } else { | |
397 width = swb_offset_128_window[sf_index][i+1] - | |
398 swb_offset_128_window[sf_index][i]; | |
399 } | |
400 width *= ics->window_group_length[g]; | |
401 ics->sect_sfb_offset[g][sect_sfb++] = offset; | |
402 offset += width; | |
403 } | |
404 ics->sect_sfb_offset[g][sect_sfb] = offset; | |
405 } | |
406 return 0; | |
407 default: | |
408 return 1; | |
409 } | |
410 } | |
411 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
412 /* iquant() * |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
413 /* output = sign(input)*abs(input)^(4/3) */ |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
414 /**/ |
12527 | 415 static INLINE real_t iquant(int16_t q, const real_t *tab, uint8_t *error) |
10725 | 416 { |
10989 | 417 #ifdef FIXED_POINT |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
418 /* For FIXED_POINT the iq_table is prescaled by 3 bits (iq_table[]/8) */ |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
419 /* BIG_IQ_TABLE allows you to use the full 8192 value table, if this is not |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
420 * defined a 1026 value table and interpolation will be used |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
421 */ |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
422 #ifndef BIG_IQ_TABLE |
12527 | 423 static const real_t errcorr[] = { |
424 REAL_CONST(0), REAL_CONST(1.0/8.0), REAL_CONST(2.0/8.0), REAL_CONST(3.0/8.0), | |
425 REAL_CONST(4.0/8.0), REAL_CONST(5.0/8.0), REAL_CONST(6.0/8.0), REAL_CONST(7.0/8.0), | |
426 REAL_CONST(0) | |
427 }; | |
428 real_t x1, x2; | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
429 #endif |
10725 | 430 int16_t sgn = 1; |
431 | |
10989 | 432 if (q < 0) |
433 { | |
434 q = -q; | |
435 sgn = -1; | |
436 } | |
437 | |
438 if (q < IQ_TABLE_SIZE) | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
439 { |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
440 //#define IQUANT_PRINT |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
441 #ifdef IQUANT_PRINT |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
442 //printf("0x%.8X\n", sgn * tab[q]); |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
443 printf("%d\n", sgn * tab[q]); |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
444 #endif |
10989 | 445 return sgn * tab[q]; |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
446 } |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
447 |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
448 #ifndef BIG_IQ_TABLE |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
449 if (q >= 8192) |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
450 { |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
451 *error = 17; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
452 return 0; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
453 } |
10989 | 454 |
12527 | 455 /* linear interpolation */ |
456 x1 = tab[q>>3]; | |
457 x2 = tab[(q>>3) + 1]; | |
458 return sgn * 16 * (MUL_R(errcorr[q&7],(x2-x1)) + x1); | |
459 #else | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
460 *error = 17; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
461 return 0; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
462 #endif |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
463 |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
464 #else |
12527 | 465 if (q < 0) |
466 { | |
467 /* tab contains a value for all possible q [0,8192] */ | |
468 if (-q < IQ_TABLE_SIZE) | |
469 return -tab[-q]; | |
470 | |
471 *error = 17; | |
472 return 0; | |
473 } else { | |
474 /* tab contains a value for all possible q [0,8192] */ | |
475 if (q < IQ_TABLE_SIZE) | |
476 return tab[q]; | |
477 | |
478 *error = 17; | |
479 return 0; | |
480 } | |
10989 | 481 #endif |
10725 | 482 } |
483 | |
484 #ifndef FIXED_POINT | |
12527 | 485 ALIGN static const real_t pow2sf_tab[] = { |
486 2.9802322387695313E-008, 5.9604644775390625E-008, 1.1920928955078125E-007, | |
487 2.384185791015625E-007, 4.76837158203125E-007, 9.5367431640625E-007, | |
488 1.9073486328125E-006, 3.814697265625E-006, 7.62939453125E-006, | |
489 1.52587890625E-005, 3.0517578125E-005, 6.103515625E-005, | |
490 0.0001220703125, 0.000244140625, 0.00048828125, | |
491 0.0009765625, 0.001953125, 0.00390625, | |
492 0.0078125, 0.015625, 0.03125, | |
493 0.0625, 0.125, 0.25, | |
494 0.5, 1.0, 2.0, | |
495 4.0, 8.0, 16.0, 32.0, | |
496 64.0, 128.0, 256.0, | |
497 512.0, 1024.0, 2048.0, | |
498 4096.0, 8192.0, 16384.0, | |
499 32768.0, 65536.0, 131072.0, | |
500 262144.0, 524288.0, 1048576.0, | |
501 2097152.0, 4194304.0, 8388608.0, | |
502 16777216.0, 33554432.0, 67108864.0, | |
503 134217728.0, 268435456.0, 536870912.0, | |
504 1073741824.0, 2147483648.0, 4294967296.0, | |
505 8589934592.0, 17179869184.0, 34359738368.0, | |
506 68719476736.0, 137438953472.0, 274877906944.0 | |
10725 | 507 }; |
508 #endif | |
509 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
510 /* quant_to_spec: perform dequantisation and scaling |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
511 * and in case of short block it also does the deinterleaving |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
512 */ |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
513 /* |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
514 For ONLY_LONG_SEQUENCE windows (num_window_groups = 1, |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
515 window_group_length[0] = 1) the spectral data is in ascending spectral |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
516 order. |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
517 For the EIGHT_SHORT_SEQUENCE window, the spectral order depends on the |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
518 grouping in the following manner: |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
519 - Groups are ordered sequentially |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
520 - Within a group, a scalefactor band consists of the spectral data of all |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
521 grouped SHORT_WINDOWs for the associated scalefactor window band. To |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
522 clarify via example, the length of a group is in the range of one to eight |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
523 SHORT_WINDOWs. |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
524 - If there are eight groups each with length one (num_window_groups = 8, |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
525 window_group_length[0..7] = 1), the result is a sequence of eight spectra, |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
526 each in ascending spectral order. |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
527 - If there is only one group with length eight (num_window_groups = 1, |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
528 window_group_length[0] = 8), the result is that spectral data of all eight |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
529 SHORT_WINDOWs is interleaved by scalefactor window bands. |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
530 - Within a scalefactor window band, the coefficients are in ascending |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
531 spectral order. |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
532 */ |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
533 static uint8_t quant_to_spec(NeAACDecHandle hDecoder, |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
534 ic_stream *ics, int16_t *quant_data, |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
535 real_t *spec_data, uint16_t frame_len) |
12527 | 536 { |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
537 ALIGN static const real_t pow2_table[] = |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
538 { |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
539 COEF_CONST(1.0), |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
540 COEF_CONST(1.1892071150027210667174999705605), /* 2^0.25 */ |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
541 COEF_CONST(1.4142135623730950488016887242097), /* 2^0.5 */ |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
542 COEF_CONST(1.6817928305074290860622509524664) /* 2^0.75 */ |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
543 }; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
544 const real_t *tab = iq_table; |
12527 | 545 |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
546 uint8_t g, sfb, win; |
18141 | 547 uint16_t width, bin, k, gindex, wa, wb; |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
548 uint8_t error = 0; /* Init error flag */ |
18141 | 549 #ifndef FIXED_POINT |
550 real_t scf; | |
551 #endif | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
552 |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
553 k = 0; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
554 gindex = 0; |
10725 | 555 |
556 for (g = 0; g < ics->num_window_groups; g++) | |
557 { | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
558 uint16_t j = 0; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
559 uint16_t gincrease = 0; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
560 uint16_t win_inc = ics->swb_offset[ics->num_swb]; |
10725 | 561 |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
562 for (sfb = 0; sfb < ics->num_swb; sfb++) |
10725 | 563 { |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
564 int32_t exp, frac; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
565 |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
566 width = ics->swb_offset[sfb+1] - ics->swb_offset[sfb]; |
10725 | 567 |
12527 | 568 /* this could be scalefactor for IS or PNS, those can be negative or bigger then 255 */ |
569 /* just ignore them */ | |
570 if (ics->scale_factors[g][sfb] < 0 || ics->scale_factors[g][sfb] > 255) | |
571 { | |
572 exp = 0; | |
573 frac = 0; | |
574 } else { | |
575 /* ics->scale_factors[g][sfb] must be between 0 and 255 */ | |
576 exp = (ics->scale_factors[g][sfb] /* - 100 */) >> 2; | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
577 /* frac must always be > 0 */ |
12527 | 578 frac = (ics->scale_factors[g][sfb] /* - 100 */) & 3; |
579 } | |
10725 | 580 |
12527 | 581 #ifdef FIXED_POINT |
582 exp -= 25; | |
10989 | 583 /* IMDCT pre-scaling */ |
10725 | 584 if (hDecoder->object_type == LD) |
585 { | |
586 exp -= 6 /*9*/; | |
587 } else { | |
588 if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) | |
589 exp -= 4 /*7*/; | |
590 else | |
591 exp -= 7 /*10*/; | |
592 } | |
593 #endif | |
594 | |
18141 | 595 wa = gindex + j; |
596 | |
597 #ifndef FIXED_POINT | |
598 scf = pow2sf_tab[exp/*+25*/] * pow2_table[frac]; | |
599 #endif | |
600 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
601 for (win = 0; win < ics->window_group_length[g]; win++) |
10725 | 602 { |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
603 for (bin = 0; bin < width; bin += 4) |
10725 | 604 { |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
605 #ifndef FIXED_POINT |
18141 | 606 wb = wa + bin; |
607 | |
608 spec_data[wb+0] = iquant(quant_data[k+0], tab, &error) * scf; | |
609 spec_data[wb+1] = iquant(quant_data[k+1], tab, &error) * scf; | |
610 spec_data[wb+2] = iquant(quant_data[k+2], tab, &error) * scf; | |
611 spec_data[wb+3] = iquant(quant_data[k+3], tab, &error) * scf; | |
612 | |
12527 | 613 #else |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
614 real_t iq0 = iquant(quant_data[k+0], tab, &error); |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
615 real_t iq1 = iquant(quant_data[k+1], tab, &error); |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
616 real_t iq2 = iquant(quant_data[k+2], tab, &error); |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
617 real_t iq3 = iquant(quant_data[k+3], tab, &error); |
18141 | 618 |
619 wb = wa + bin; | |
620 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
621 if (exp < 0) |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
622 { |
18141 | 623 spec_data[wb+0] = iq0 >>= -exp; |
624 spec_data[wb+1] = iq1 >>= -exp; | |
625 spec_data[wb+2] = iq2 >>= -exp; | |
626 spec_data[wb+3] = iq3 >>= -exp; | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
627 } else { |
18141 | 628 spec_data[wb+0] = iq0 <<= exp; |
629 spec_data[wb+1] = iq1 <<= exp; | |
630 spec_data[wb+2] = iq2 <<= exp; | |
631 spec_data[wb+3] = iq3 <<= exp; | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
632 } |
18141 | 633 if (frac != 0) |
634 { | |
635 spec_data[wb+0] = MUL_C(spec_data[wb+0],pow2_table[frac]); | |
636 spec_data[wb+1] = MUL_C(spec_data[wb+1],pow2_table[frac]); | |
637 spec_data[wb+2] = MUL_C(spec_data[wb+2],pow2_table[frac]); | |
638 spec_data[wb+3] = MUL_C(spec_data[wb+3],pow2_table[frac]); | |
639 } | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
640 |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
641 //#define SCFS_PRINT |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
642 #ifdef SCFS_PRINT |
18141 | 643 printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+0]); |
644 printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+1]); | |
645 printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+2]); | |
646 printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+3]); | |
647 //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+0]); | |
648 //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+1]); | |
649 //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+2]); | |
650 //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+3]); | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
651 #endif |
12527 | 652 #endif |
10725 | 653 |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
654 gincrease += 4; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
655 k += 4; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
656 } |
18141 | 657 wa += win_inc; |
12527 | 658 } |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
659 j += width; |
12527 | 660 } |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
661 gindex += gincrease; |
12527 | 662 } |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
663 |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
664 return error; |
12527 | 665 } |
666 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
667 static uint8_t allocate_single_channel(NeAACDecHandle hDecoder, uint8_t channel, |
12527 | 668 uint8_t output_channels) |
669 { | |
670 uint8_t mul = 1; | |
671 | |
672 #ifdef MAIN_DEC | |
673 /* MAIN object type prediction */ | |
674 if (hDecoder->object_type == MAIN) | |
675 { | |
18141 | 676 hDecoder->pred_stat[channel] = (pred_state*)realloc(hDecoder->pred_stat[channel], hDecoder->frameLength * sizeof(pred_state)); |
12527 | 677 reset_all_predictors(hDecoder->pred_stat[channel], hDecoder->frameLength); |
678 } | |
679 #endif | |
680 | |
681 #ifdef LTP_DEC | |
682 if (is_ltp_ot(hDecoder->object_type)) | |
683 { | |
18141 | 684 hDecoder->lt_pred_stat[channel] = (int16_t*)realloc(hDecoder->lt_pred_stat[channel], hDecoder->frameLength*4 * sizeof(int16_t)); |
12527 | 685 memset(hDecoder->lt_pred_stat[channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); |
686 } | |
687 #endif | |
688 | |
689 mul = 1; | |
690 #ifdef SBR_DEC | |
691 hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 0; | |
692 if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | |
693 { | |
694 /* SBR requires 2 times as much output data */ | |
695 mul = 2; | |
696 hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 1; | |
697 } | |
698 #endif | |
18141 | 699 hDecoder->time_out[channel] = (real_t*)realloc(hDecoder->time_out[channel], mul*hDecoder->frameLength*sizeof(real_t)); |
12527 | 700 memset(hDecoder->time_out[channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); |
701 #if (defined(PS_DEC) || defined(DRM_PS)) | |
702 if (output_channels == 2) | |
703 { | |
18141 | 704 hDecoder->time_out[channel+1] = (real_t*)realloc(hDecoder->time_out[channel+1], mul*hDecoder->frameLength*sizeof(real_t)); |
12527 | 705 memset(hDecoder->time_out[channel+1], 0, mul*hDecoder->frameLength*sizeof(real_t)); |
706 } | |
707 #endif | |
708 | |
18141 | 709 hDecoder->fb_intermed[channel] = (real_t*)realloc(hDecoder->fb_intermed[channel], hDecoder->frameLength*sizeof(real_t)); |
12527 | 710 memset(hDecoder->fb_intermed[channel], 0, hDecoder->frameLength*sizeof(real_t)); |
711 | |
712 #ifdef SSR_DEC | |
713 if (hDecoder->object_type == SSR) | |
714 { | |
18141 | 715 uint16_t k; |
716 hDecoder->ssr_overlap[channel] = (real_t*)realloc(hDecoder->ssr_overlap[channel], 2*hDecoder->frameLength*sizeof(real_t)); | |
12527 | 717 memset(hDecoder->ssr_overlap[channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); |
18141 | 718 hDecoder->prev_fmd[channel] = (real_t*)realloc(hDecoder->prev_fmd[channel], 2*hDecoder->frameLength*sizeof(real_t)); |
12527 | 719 for (k = 0; k < 2*hDecoder->frameLength; k++) |
720 hDecoder->prev_fmd[channel][k] = REAL_CONST(-1); | |
721 } | |
722 #endif | |
723 | |
724 return 0; | |
725 } | |
726 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
727 static uint8_t allocate_channel_pair(NeAACDecHandle hDecoder, |
12527 | 728 uint8_t channel, uint8_t paired_channel) |
729 { | |
730 uint8_t mul = 1; | |
731 | |
732 #ifdef MAIN_DEC | |
733 /* MAIN object type prediction */ | |
734 if (hDecoder->object_type == MAIN) | |
735 { | |
736 /* allocate the state only when needed */ | |
737 if (hDecoder->pred_stat[channel] == NULL) | |
738 { | |
739 hDecoder->pred_stat[channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); | |
740 reset_all_predictors(hDecoder->pred_stat[channel], hDecoder->frameLength); | |
741 } | |
742 if (hDecoder->pred_stat[paired_channel] == NULL) | |
743 { | |
744 hDecoder->pred_stat[paired_channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); | |
745 reset_all_predictors(hDecoder->pred_stat[paired_channel], hDecoder->frameLength); | |
746 } | |
747 } | |
748 #endif | |
749 | |
750 #ifdef LTP_DEC | |
751 if (is_ltp_ot(hDecoder->object_type)) | |
752 { | |
753 /* allocate the state only when needed */ | |
754 if (hDecoder->lt_pred_stat[channel] == NULL) | |
755 { | |
756 hDecoder->lt_pred_stat[channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); | |
757 memset(hDecoder->lt_pred_stat[channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); | |
758 } | |
759 if (hDecoder->lt_pred_stat[paired_channel] == NULL) | |
760 { | |
761 hDecoder->lt_pred_stat[paired_channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); | |
762 memset(hDecoder->lt_pred_stat[paired_channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); | |
763 } | |
764 } | |
765 #endif | |
766 | |
767 if (hDecoder->time_out[channel] == NULL) | |
768 { | |
769 mul = 1; | |
770 #ifdef SBR_DEC | |
771 hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 0; | |
772 if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | |
773 { | |
774 /* SBR requires 2 times as much output data */ | |
775 mul = 2; | |
776 hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 1; | |
777 } | |
778 #endif | |
779 hDecoder->time_out[channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); | |
780 memset(hDecoder->time_out[channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); | |
781 } | |
782 if (hDecoder->time_out[paired_channel] == NULL) | |
783 { | |
784 hDecoder->time_out[paired_channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); | |
785 memset(hDecoder->time_out[paired_channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); | |
786 } | |
787 | |
788 if (hDecoder->fb_intermed[channel] == NULL) | |
789 { | |
790 hDecoder->fb_intermed[channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); | |
791 memset(hDecoder->fb_intermed[channel], 0, hDecoder->frameLength*sizeof(real_t)); | |
792 } | |
793 if (hDecoder->fb_intermed[paired_channel] == NULL) | |
794 { | |
795 hDecoder->fb_intermed[paired_channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); | |
796 memset(hDecoder->fb_intermed[paired_channel], 0, hDecoder->frameLength*sizeof(real_t)); | |
797 } | |
798 | |
799 #ifdef SSR_DEC | |
800 if (hDecoder->object_type == SSR) | |
801 { | |
802 if (hDecoder->ssr_overlap[cpe->channel] == NULL) | |
803 { | |
804 hDecoder->ssr_overlap[cpe->channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | |
805 memset(hDecoder->ssr_overlap[cpe->channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); | |
806 } | |
807 if (hDecoder->ssr_overlap[cpe->paired_channel] == NULL) | |
808 { | |
809 hDecoder->ssr_overlap[cpe->paired_channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | |
810 memset(hDecoder->ssr_overlap[cpe->paired_channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); | |
811 } | |
812 if (hDecoder->prev_fmd[cpe->channel] == NULL) | |
813 { | |
814 uint16_t k; | |
815 hDecoder->prev_fmd[cpe->channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | |
816 for (k = 0; k < 2*hDecoder->frameLength; k++) | |
817 hDecoder->prev_fmd[cpe->channel][k] = REAL_CONST(-1); | |
818 } | |
819 if (hDecoder->prev_fmd[cpe->paired_channel] == NULL) | |
820 { | |
821 uint16_t k; | |
822 hDecoder->prev_fmd[cpe->paired_channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); | |
823 for (k = 0; k < 2*hDecoder->frameLength; k++) | |
824 hDecoder->prev_fmd[cpe->paired_channel][k] = REAL_CONST(-1); | |
825 } | |
826 } | |
827 #endif | |
828 | |
829 return 0; | |
830 } | |
831 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
832 uint8_t reconstruct_single_channel(NeAACDecHandle hDecoder, ic_stream *ics, |
12527 | 833 element *sce, int16_t *spec_data) |
834 { | |
835 uint8_t retval, output_channels; | |
836 ALIGN real_t spec_coef[1024]; | |
837 | |
838 #ifdef PROFILE | |
839 int64_t count = faad_get_ts(); | |
840 #endif | |
841 | |
842 | |
18141 | 843 /* always allocate 2 channels, PS can always "suddenly" turn up */ |
12527 | 844 #if (defined(PS_DEC) || defined(DRM_PS)) |
845 output_channels = hDecoder->ps_used[hDecoder->fr_ch_ele] ? 2 : 1; | |
846 #else | |
847 output_channels = 1; | |
848 #endif | |
18141 | 849 |
850 if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] < output_channels) { | |
12527 | 851 hDecoder->element_output_channels[hDecoder->fr_ch_ele] = output_channels; |
852 retval = allocate_single_channel(hDecoder, sce->channel, output_channels); | |
853 if (retval > 0) | |
854 return retval; | |
855 | |
856 hDecoder->element_alloced[hDecoder->fr_ch_ele] = 1; | |
857 } | |
858 | |
859 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
860 /* dequantisation and scaling */ |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
861 retval = quant_to_spec(hDecoder, ics, spec_data, spec_coef, hDecoder->frameLength); |
12527 | 862 if (retval > 0) |
863 return retval; | |
864 | |
865 #ifdef PROFILE | |
866 count = faad_get_ts() - count; | |
867 hDecoder->requant_cycles += count; | |
868 #endif | |
869 | |
870 | |
871 /* pns decoding */ | |
872 pns_decode(ics, NULL, spec_coef, NULL, hDecoder->frameLength, 0, hDecoder->object_type); | |
873 | |
874 #ifdef MAIN_DEC | |
875 /* MAIN object type prediction */ | |
876 if (hDecoder->object_type == MAIN) | |
877 { | |
878 /* intra channel prediction */ | |
879 ic_prediction(ics, spec_coef, hDecoder->pred_stat[sce->channel], hDecoder->frameLength, | |
880 hDecoder->sf_index); | |
881 | |
882 /* In addition, for scalefactor bands coded by perceptual | |
883 noise substitution the predictors belonging to the | |
884 corresponding spectral coefficients are reset. | |
885 */ | |
886 pns_reset_pred_state(ics, hDecoder->pred_stat[sce->channel]); | |
887 } | |
888 #endif | |
889 | |
890 #ifdef LTP_DEC | |
891 if (is_ltp_ot(hDecoder->object_type)) | |
892 { | |
893 #ifdef LD_DEC | |
894 if (hDecoder->object_type == LD) | |
895 { | |
896 if (ics->ltp.data_present) | |
897 { | |
898 if (ics->ltp.lag_update) | |
899 hDecoder->ltp_lag[sce->channel] = ics->ltp.lag; | |
900 } | |
901 ics->ltp.lag = hDecoder->ltp_lag[sce->channel]; | |
902 } | |
903 #endif | |
904 | |
905 /* long term prediction */ | |
906 lt_prediction(ics, &(ics->ltp), spec_coef, hDecoder->lt_pred_stat[sce->channel], hDecoder->fb, | |
907 ics->window_shape, hDecoder->window_shape_prev[sce->channel], | |
908 hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); | |
909 } | |
910 #endif | |
911 | |
912 /* tns decoding */ | |
913 tns_decode_frame(ics, &(ics->tns), hDecoder->sf_index, hDecoder->object_type, | |
914 spec_coef, hDecoder->frameLength); | |
915 | |
916 /* drc decoding */ | |
917 if (hDecoder->drc->present) | |
918 { | |
919 if (!hDecoder->drc->exclude_mask[sce->channel] || !hDecoder->drc->excluded_chns_present) | |
920 drc_decode(hDecoder->drc, spec_coef); | |
921 } | |
922 | |
923 /* filter bank */ | |
924 #ifdef SSR_DEC | |
925 if (hDecoder->object_type != SSR) | |
926 { | |
927 #endif | |
928 ifilter_bank(hDecoder->fb, ics->window_sequence, ics->window_shape, | |
929 hDecoder->window_shape_prev[sce->channel], spec_coef, | |
930 hDecoder->time_out[sce->channel], hDecoder->fb_intermed[sce->channel], | |
931 hDecoder->object_type, hDecoder->frameLength); | |
932 #ifdef SSR_DEC | |
933 } else { | |
934 ssr_decode(&(ics->ssr), hDecoder->fb, ics->window_sequence, ics->window_shape, | |
935 hDecoder->window_shape_prev[sce->channel], spec_coef, hDecoder->time_out[sce->channel], | |
936 hDecoder->ssr_overlap[sce->channel], hDecoder->ipqf_buffer[sce->channel], hDecoder->prev_fmd[sce->channel], | |
937 hDecoder->frameLength); | |
938 } | |
939 #endif | |
940 | |
941 /* save window shape for next frame */ | |
942 hDecoder->window_shape_prev[sce->channel] = ics->window_shape; | |
943 | |
944 #ifdef LTP_DEC | |
945 if (is_ltp_ot(hDecoder->object_type)) | |
946 { | |
947 lt_update_state(hDecoder->lt_pred_stat[sce->channel], hDecoder->time_out[sce->channel], | |
948 hDecoder->fb_intermed[sce->channel], hDecoder->frameLength, hDecoder->object_type); | |
949 } | |
950 #endif | |
951 | |
952 #ifdef SBR_DEC | |
953 if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | |
954 && hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | |
955 { | |
956 uint8_t ele = hDecoder->fr_ch_ele; | |
957 uint8_t ch = sce->channel; | |
958 | |
959 /* following case can happen when forceUpSampling == 1 */ | |
960 if (hDecoder->sbr[ele] == NULL) | |
961 { | |
962 hDecoder->sbr[ele] = sbrDecodeInit(hDecoder->frameLength, | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
963 hDecoder->element_id[ele], 2*get_sample_rate(hDecoder->sf_index), |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
964 hDecoder->downSampledSBR |
12527 | 965 #ifdef DRM |
966 , 0 | |
967 #endif | |
968 ); | |
969 } | |
970 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
971 if (sce->ics1.window_sequence == EIGHT_SHORT_SEQUENCE) |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
972 hDecoder->sbr[ele]->maxAACLine = 8*sce->ics1.swb_offset[max(sce->ics1.max_sfb-1, 0)]; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
973 else |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
974 hDecoder->sbr[ele]->maxAACLine = sce->ics1.swb_offset[max(sce->ics1.max_sfb-1, 0)]; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
975 |
12527 | 976 /* check if any of the PS tools is used */ |
977 #if (defined(PS_DEC) || defined(DRM_PS)) | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
978 if (hDecoder->ps_used[ele] == 0) |
12527 | 979 { |
980 #endif | |
981 retval = sbrDecodeSingleFrame(hDecoder->sbr[ele], hDecoder->time_out[ch], | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
982 hDecoder->postSeekResetFlag, hDecoder->downSampledSBR); |
12527 | 983 #if (defined(PS_DEC) || defined(DRM_PS)) |
984 } else { | |
985 retval = sbrDecodeSingleFramePS(hDecoder->sbr[ele], hDecoder->time_out[ch], | |
986 hDecoder->time_out[ch+1], hDecoder->postSeekResetFlag, | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
987 hDecoder->downSampledSBR); |
12527 | 988 } |
989 #endif | |
990 if (retval > 0) | |
991 return retval; | |
992 } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | |
993 && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | |
994 { | |
995 return 23; | |
996 } | |
997 | |
18141 | 998 /* copy L to R when no PS is used */ |
999 #if (defined(PS_DEC) || defined(DRM_PS)) | |
1000 if ((hDecoder->ps_used[hDecoder->fr_ch_ele] == 0) && (output_channels == 2)) | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1001 { |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1002 uint8_t ele = hDecoder->fr_ch_ele; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1003 uint8_t ch = sce->channel; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1004 uint16_t frame_size = (hDecoder->sbr_alloced[ele]) ? 2 : 1; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1005 frame_size *= hDecoder->frameLength*sizeof(real_t); |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1006 |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1007 memcpy(hDecoder->time_out[ch+1], hDecoder->time_out[ch], frame_size); |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1008 } |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1009 #endif |
18141 | 1010 #endif |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1011 |
12527 | 1012 return 0; |
1013 } | |
1014 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1015 uint8_t reconstruct_channel_pair(NeAACDecHandle hDecoder, ic_stream *ics1, ic_stream *ics2, |
12527 | 1016 element *cpe, int16_t *spec_data1, int16_t *spec_data2) |
1017 { | |
1018 uint8_t retval; | |
1019 ALIGN real_t spec_coef1[1024]; | |
1020 ALIGN real_t spec_coef2[1024]; | |
1021 | |
1022 #ifdef PROFILE | |
1023 int64_t count = faad_get_ts(); | |
1024 #endif | |
1025 if (hDecoder->element_alloced[hDecoder->fr_ch_ele] == 0) | |
1026 { | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1027 retval = allocate_channel_pair(hDecoder, cpe->channel, (uint8_t)cpe->paired_channel); |
12527 | 1028 if (retval > 0) |
1029 return retval; | |
1030 | |
1031 hDecoder->element_alloced[hDecoder->fr_ch_ele] = 1; | |
1032 } | |
1033 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1034 /* dequantisation and scaling */ |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1035 retval = quant_to_spec(hDecoder, ics1, spec_data1, spec_coef1, hDecoder->frameLength); |
12527 | 1036 if (retval > 0) |
1037 return retval; | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1038 retval = quant_to_spec(hDecoder, ics2, spec_data2, spec_coef2, hDecoder->frameLength); |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1039 if (retval > 0) |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1040 return retval; |
12527 | 1041 |
1042 #ifdef PROFILE | |
1043 count = faad_get_ts() - count; | |
1044 hDecoder->requant_cycles += count; | |
1045 #endif | |
1046 | |
1047 | |
1048 /* pns decoding */ | |
1049 if (ics1->ms_mask_present) | |
1050 { | |
1051 pns_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength, 1, hDecoder->object_type); | |
1052 } else { | |
1053 pns_decode(ics1, NULL, spec_coef1, NULL, hDecoder->frameLength, 0, hDecoder->object_type); | |
1054 pns_decode(ics2, NULL, spec_coef2, NULL, hDecoder->frameLength, 0, hDecoder->object_type); | |
1055 } | |
1056 | |
1057 /* mid/side decoding */ | |
1058 ms_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength); | |
1059 | |
18141 | 1060 #if 0 |
1061 { | |
1062 int i; | |
1063 for (i = 0; i < 1024; i++) | |
1064 { | |
1065 //printf("%d\n", spec_coef1[i]); | |
1066 printf("0x%.8X\n", spec_coef1[i]); | |
1067 } | |
1068 for (i = 0; i < 1024; i++) | |
1069 { | |
1070 //printf("%d\n", spec_coef2[i]); | |
1071 printf("0x%.8X\n", spec_coef2[i]); | |
1072 } | |
1073 } | |
1074 #endif | |
1075 | |
12527 | 1076 /* intensity stereo decoding */ |
1077 is_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength); | |
1078 | |
18141 | 1079 #if 0 |
1080 { | |
1081 int i; | |
1082 for (i = 0; i < 1024; i++) | |
1083 { | |
1084 printf("%d\n", spec_coef1[i]); | |
1085 //printf("0x%.8X\n", spec_coef1[i]); | |
1086 } | |
1087 for (i = 0; i < 1024; i++) | |
1088 { | |
1089 printf("%d\n", spec_coef2[i]); | |
1090 //printf("0x%.8X\n", spec_coef2[i]); | |
1091 } | |
1092 } | |
1093 #endif | |
1094 | |
12527 | 1095 #ifdef MAIN_DEC |
1096 /* MAIN object type prediction */ | |
1097 if (hDecoder->object_type == MAIN) | |
1098 { | |
1099 /* intra channel prediction */ | |
1100 ic_prediction(ics1, spec_coef1, hDecoder->pred_stat[cpe->channel], hDecoder->frameLength, | |
1101 hDecoder->sf_index); | |
1102 ic_prediction(ics2, spec_coef2, hDecoder->pred_stat[cpe->paired_channel], hDecoder->frameLength, | |
1103 hDecoder->sf_index); | |
1104 | |
1105 /* In addition, for scalefactor bands coded by perceptual | |
1106 noise substitution the predictors belonging to the | |
1107 corresponding spectral coefficients are reset. | |
1108 */ | |
1109 pns_reset_pred_state(ics1, hDecoder->pred_stat[cpe->channel]); | |
1110 pns_reset_pred_state(ics2, hDecoder->pred_stat[cpe->paired_channel]); | |
1111 } | |
1112 #endif | |
1113 | |
1114 #ifdef LTP_DEC | |
1115 if (is_ltp_ot(hDecoder->object_type)) | |
1116 { | |
1117 ltp_info *ltp1 = &(ics1->ltp); | |
1118 ltp_info *ltp2 = (cpe->common_window) ? &(ics2->ltp2) : &(ics2->ltp); | |
1119 #ifdef LD_DEC | |
1120 if (hDecoder->object_type == LD) | |
1121 { | |
1122 if (ltp1->data_present) | |
1123 { | |
1124 if (ltp1->lag_update) | |
1125 hDecoder->ltp_lag[cpe->channel] = ltp1->lag; | |
1126 } | |
1127 ltp1->lag = hDecoder->ltp_lag[cpe->channel]; | |
1128 if (ltp2->data_present) | |
1129 { | |
1130 if (ltp2->lag_update) | |
1131 hDecoder->ltp_lag[cpe->paired_channel] = ltp2->lag; | |
1132 } | |
1133 ltp2->lag = hDecoder->ltp_lag[cpe->paired_channel]; | |
1134 } | |
1135 #endif | |
1136 | |
1137 /* long term prediction */ | |
1138 lt_prediction(ics1, ltp1, spec_coef1, hDecoder->lt_pred_stat[cpe->channel], hDecoder->fb, | |
1139 ics1->window_shape, hDecoder->window_shape_prev[cpe->channel], | |
1140 hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); | |
1141 lt_prediction(ics2, ltp2, spec_coef2, hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->fb, | |
1142 ics2->window_shape, hDecoder->window_shape_prev[cpe->paired_channel], | |
1143 hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); | |
1144 } | |
1145 #endif | |
1146 | |
1147 /* tns decoding */ | |
1148 tns_decode_frame(ics1, &(ics1->tns), hDecoder->sf_index, hDecoder->object_type, | |
1149 spec_coef1, hDecoder->frameLength); | |
1150 tns_decode_frame(ics2, &(ics2->tns), hDecoder->sf_index, hDecoder->object_type, | |
1151 spec_coef2, hDecoder->frameLength); | |
1152 | |
1153 /* drc decoding */ | |
1154 if (hDecoder->drc->present) | |
1155 { | |
1156 if (!hDecoder->drc->exclude_mask[cpe->channel] || !hDecoder->drc->excluded_chns_present) | |
1157 drc_decode(hDecoder->drc, spec_coef1); | |
1158 if (!hDecoder->drc->exclude_mask[cpe->paired_channel] || !hDecoder->drc->excluded_chns_present) | |
1159 drc_decode(hDecoder->drc, spec_coef2); | |
1160 } | |
1161 | |
1162 /* filter bank */ | |
1163 #ifdef SSR_DEC | |
1164 if (hDecoder->object_type != SSR) | |
1165 { | |
1166 #endif | |
1167 ifilter_bank(hDecoder->fb, ics1->window_sequence, ics1->window_shape, | |
1168 hDecoder->window_shape_prev[cpe->channel], spec_coef1, | |
1169 hDecoder->time_out[cpe->channel], hDecoder->fb_intermed[cpe->channel], | |
1170 hDecoder->object_type, hDecoder->frameLength); | |
1171 ifilter_bank(hDecoder->fb, ics2->window_sequence, ics2->window_shape, | |
1172 hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2, | |
1173 hDecoder->time_out[cpe->paired_channel], hDecoder->fb_intermed[cpe->paired_channel], | |
1174 hDecoder->object_type, hDecoder->frameLength); | |
1175 #ifdef SSR_DEC | |
1176 } else { | |
1177 ssr_decode(&(ics1->ssr), hDecoder->fb, ics1->window_sequence, ics1->window_shape, | |
1178 hDecoder->window_shape_prev[cpe->channel], spec_coef1, hDecoder->time_out[cpe->channel], | |
1179 hDecoder->ssr_overlap[cpe->channel], hDecoder->ipqf_buffer[cpe->channel], | |
1180 hDecoder->prev_fmd[cpe->channel], hDecoder->frameLength); | |
1181 ssr_decode(&(ics2->ssr), hDecoder->fb, ics2->window_sequence, ics2->window_shape, | |
1182 hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2, hDecoder->time_out[cpe->paired_channel], | |
1183 hDecoder->ssr_overlap[cpe->paired_channel], hDecoder->ipqf_buffer[cpe->paired_channel], | |
1184 hDecoder->prev_fmd[cpe->paired_channel], hDecoder->frameLength); | |
1185 } | |
1186 #endif | |
1187 | |
1188 /* save window shape for next frame */ | |
1189 hDecoder->window_shape_prev[cpe->channel] = ics1->window_shape; | |
1190 hDecoder->window_shape_prev[cpe->paired_channel] = ics2->window_shape; | |
1191 | |
1192 #ifdef LTP_DEC | |
1193 if (is_ltp_ot(hDecoder->object_type)) | |
1194 { | |
1195 lt_update_state(hDecoder->lt_pred_stat[cpe->channel], hDecoder->time_out[cpe->channel], | |
1196 hDecoder->fb_intermed[cpe->channel], hDecoder->frameLength, hDecoder->object_type); | |
1197 lt_update_state(hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->time_out[cpe->paired_channel], | |
1198 hDecoder->fb_intermed[cpe->paired_channel], hDecoder->frameLength, hDecoder->object_type); | |
1199 } | |
1200 #endif | |
1201 | |
1202 #ifdef SBR_DEC | |
1203 if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | |
1204 && hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | |
1205 { | |
1206 uint8_t ele = hDecoder->fr_ch_ele; | |
1207 uint8_t ch0 = cpe->channel; | |
1208 uint8_t ch1 = cpe->paired_channel; | |
1209 | |
1210 /* following case can happen when forceUpSampling == 1 */ | |
1211 if (hDecoder->sbr[ele] == NULL) | |
1212 { | |
1213 hDecoder->sbr[ele] = sbrDecodeInit(hDecoder->frameLength, | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1214 hDecoder->element_id[ele], 2*get_sample_rate(hDecoder->sf_index), |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1215 hDecoder->downSampledSBR |
12527 | 1216 #ifdef DRM |
1217 , 0 | |
1218 #endif | |
1219 ); | |
1220 } | |
1221 | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1222 if (cpe->ics1.window_sequence == EIGHT_SHORT_SEQUENCE) |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1223 hDecoder->sbr[ele]->maxAACLine = 8*cpe->ics1.swb_offset[max(cpe->ics1.max_sfb-1, 0)]; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1224 else |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1225 hDecoder->sbr[ele]->maxAACLine = cpe->ics1.swb_offset[max(cpe->ics1.max_sfb-1, 0)]; |
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1226 |
12527 | 1227 retval = sbrDecodeCoupleFrame(hDecoder->sbr[ele], |
1228 hDecoder->time_out[ch0], hDecoder->time_out[ch1], | |
13453
6d50ef45a058
Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents:
12625
diff
changeset
|
1229 hDecoder->postSeekResetFlag, hDecoder->downSampledSBR); |
12527 | 1230 if (retval > 0) |
1231 return retval; | |
1232 } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) | |
1233 && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) | |
1234 { | |
1235 return 23; | |
1236 } | |
1237 #endif | |
1238 | |
1239 return 0; | |
1240 } |