blob: db3faeecde10818941d5e10f0f476737ffb97b97
1 | /* |
2 | ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding |
3 | ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com |
4 | ** |
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. |
9 | ** |
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. |
14 | ** |
15 | ** You should have received a copy of the GNU General Public License |
16 | ** along with this program; if not, write to the Free Software |
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 | ** |
22 | ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 |
23 | ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" |
24 | ** |
25 | ** Commercial non-GPL licensing of this software is possible. |
26 | ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. |
27 | ** |
28 | ** $Id: hcr.c,v 1.26 2009/01/26 23:51:15 menno Exp $ |
29 | **/ |
30 | #include <stdlib.h> |
31 | #include "common.h" |
32 | #include "structs.h" |
33 | |
34 | #include <string.h> |
35 | |
36 | #include "specrec.h" |
37 | #include "huffman.h" |
38 | |
39 | /* ISO/IEC 14496-3/Amd.1 |
40 | * 8.5.3.3: Huffman Codeword Reordering for AAC spectral data (HCR) |
41 | * |
42 | * HCR devides the spectral data in known fixed size segments, and |
43 | * sorts it by the importance of the data. The importance is firstly |
44 | * the (lower) position in the spectrum, and secondly the largest |
45 | * value in the used codebook. |
46 | * The most important data is written at the start of each segment |
47 | * (at known positions), the remaining data is interleaved inbetween, |
48 | * with the writing direction alternating. |
49 | * Data length is not increased. |
50 | */ |
51 | |
52 | #ifdef ERROR_RESILIENCE |
53 | |
54 | /* 8.5.3.3.1 Pre-sorting */ |
55 | |
56 | #define NUM_CB 6 |
57 | #define NUM_CB_ER 22 |
58 | #define MAX_CB 32 |
59 | #define VCB11_FIRST 16 |
60 | #define VCB11_LAST 31 |
61 | |
62 | static const uint8_t PreSortCB_STD[NUM_CB] = |
63 | { 11, 9, 7, 5, 3, 1}; |
64 | |
65 | static const uint8_t PreSortCB_ER[NUM_CB_ER] = |
66 | { 11, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 9, 7, 5, 3, 1}; |
67 | |
68 | /* 8.5.3.3.2 Derivation of segment width */ |
69 | |
70 | static const uint8_t maxCwLen[MAX_CB] = {0, 11, 9, 20, 16, 13, 11, 14, 12, 17, 14, 49, |
71 | 0, 0, 0, 0, 14, 17, 21, 21, 25, 25, 29, 29, 29, 29, 33, 33, 33, 37, 37, 41 |
72 | }; |
73 | |
74 | #define segmentWidth(cb) min(maxCwLen[cb], ics->length_of_longest_codeword) |
75 | |
76 | /* bit-twiddling helpers */ |
77 | static const uint8_t S[] = {1, 2, 4, 8, 16}; |
78 | static const uint32_t B[] = {0x55555555, 0x33333333, 0x0F0F0F0F, 0x00FF00FF, 0x0000FFFF}; |
79 | |
80 | typedef struct { |
81 | uint8_t cb; |
82 | uint8_t decoded; |
83 | uint16_t sp_offset; |
84 | bits_t bits; |
85 | } codeword_t; |
86 | |
87 | /* rewind and reverse */ |
88 | /* 32 bit version */ |
89 | static uint32_t rewrev_word(uint32_t v, const uint8_t len) |
90 | { |
91 | /* 32 bit reverse */ |
92 | v = ((v >> S[0]) & B[0]) | ((v << S[0]) & ~B[0]); |
93 | v = ((v >> S[1]) & B[1]) | ((v << S[1]) & ~B[1]); |
94 | v = ((v >> S[2]) & B[2]) | ((v << S[2]) & ~B[2]); |
95 | v = ((v >> S[3]) & B[3]) | ((v << S[3]) & ~B[3]); |
96 | v = ((v >> S[4]) & B[4]) | ((v << S[4]) & ~B[4]); |
97 | |
98 | /* shift off low bits */ |
99 | v >>= (32 - len); |
100 | |
101 | return v; |
102 | } |
103 | |
104 | /* 64 bit version */ |
105 | static void rewrev_lword(uint32_t *hi, uint32_t *lo, const uint8_t len) |
106 | { |
107 | if (len <= 32) { |
108 | *hi = 0; |
109 | *lo = rewrev_word(*lo, len); |
110 | } else { |
111 | uint32_t t = *hi, v = *lo; |
112 | |
113 | /* double 32 bit reverse */ |
114 | v = ((v >> S[0]) & B[0]) | ((v << S[0]) & ~B[0]); |
115 | t = ((t >> S[0]) & B[0]) | ((t << S[0]) & ~B[0]); |
116 | v = ((v >> S[1]) & B[1]) | ((v << S[1]) & ~B[1]); |
117 | t = ((t >> S[1]) & B[1]) | ((t << S[1]) & ~B[1]); |
118 | v = ((v >> S[2]) & B[2]) | ((v << S[2]) & ~B[2]); |
119 | t = ((t >> S[2]) & B[2]) | ((t << S[2]) & ~B[2]); |
120 | v = ((v >> S[3]) & B[3]) | ((v << S[3]) & ~B[3]); |
121 | t = ((t >> S[3]) & B[3]) | ((t << S[3]) & ~B[3]); |
122 | v = ((v >> S[4]) & B[4]) | ((v << S[4]) & ~B[4]); |
123 | t = ((t >> S[4]) & B[4]) | ((t << S[4]) & ~B[4]); |
124 | |
125 | /* last 32<>32 bit swap is implicit below */ |
126 | |
127 | /* shift off low bits (this is really only one 64 bit shift) */ |
128 | *lo = (t >> (64 - len)) | (v << (len - 32)); |
129 | *hi = v >> (64 - len); |
130 | } |
131 | } |
132 | |
133 | |
134 | /* bits_t version */ |
135 | static void rewrev_bits(bits_t *bits) |
136 | { |
137 | if (bits->len == 0) { |
138 | return; |
139 | } |
140 | rewrev_lword(&bits->bufb, &bits->bufa, bits->len); |
141 | } |
142 | |
143 | |
144 | /* merge bits of a to b */ |
145 | static void concat_bits(bits_t *b, bits_t *a) |
146 | { |
147 | uint32_t bl, bh, al, ah; |
148 | |
149 | if (a->len == 0) { |
150 | return; |
151 | } |
152 | |
153 | al = a->bufa; |
154 | ah = a->bufb; |
155 | |
156 | if (b->len > 32) { |
157 | /* maskoff superfluous high b bits */ |
158 | bl = b->bufa; |
159 | bh = b->bufb & ((1 << (b->len - 32)) - 1); |
160 | /* left shift a b->len bits */ |
161 | ah = al << (b->len - 32); |
162 | al = 0; |
163 | } else { |
164 | bl = b->bufa & ((1 << (b->len)) - 1); |
165 | bh = 0; |
166 | ah = (ah << (b->len)) | (al >> (32 - b->len)); |
167 | al = al << b->len; |
168 | } |
169 | |
170 | /* merge */ |
171 | b->bufa = bl | al; |
172 | b->bufb = bh | ah; |
173 | |
174 | b->len += a->len; |
175 | } |
176 | |
177 | static uint8_t is_good_cb(uint8_t this_CB, uint8_t this_sec_CB) |
178 | { |
179 | /* only want spectral data CB's */ |
180 | if ((this_sec_CB > ZERO_HCB && this_sec_CB <= ESC_HCB) || (this_sec_CB >= VCB11_FIRST && this_sec_CB <= VCB11_LAST)) { |
181 | if (this_CB < ESC_HCB) { |
182 | /* normal codebook pairs */ |
183 | return ((this_sec_CB == this_CB) || (this_sec_CB == this_CB + 1)); |
184 | } else { |
185 | /* escape codebook */ |
186 | return (this_sec_CB == this_CB); |
187 | } |
188 | } |
189 | return 0; |
190 | } |
191 | |
192 | static void read_segment(bits_t *segment, uint8_t segwidth, bitfile *ld) |
193 | { |
194 | segment->len = segwidth; |
195 | |
196 | if (segwidth > 32) { |
197 | segment->bufb = faad_getbits(ld, segwidth - 32); |
198 | segment->bufa = faad_getbits(ld, 32); |
199 | |
200 | } else { |
201 | segment->bufa = faad_getbits(ld, segwidth); |
202 | segment->bufb = 0; |
203 | } |
204 | } |
205 | |
206 | static void fill_in_codeword(codeword_t *codeword, uint16_t index, uint16_t sp, uint8_t cb) |
207 | { |
208 | codeword[index].sp_offset = sp; |
209 | codeword[index].cb = cb; |
210 | codeword[index].decoded = 0; |
211 | codeword[index].bits.len = 0; |
212 | } |
213 | |
214 | uint8_t reordered_spectral_data(NeAACDecStruct *hDecoder, ic_stream *ics, |
215 | bitfile *ld, int16_t *spectral_data) |
216 | { |
217 | uint16_t PCWs_done; |
218 | uint16_t numberOfSegments, numberOfSets, numberOfCodewords; |
219 | |
220 | codeword_t codeword[512]; |
221 | bits_t segment[512]; |
222 | |
223 | uint16_t sp_offset[8]; |
224 | uint16_t g, i, sortloop, set, bitsread; |
225 | uint16_t bitsleft, codewordsleft; |
226 | uint8_t w_idx, sfb, this_CB, last_CB, this_sec_CB; |
227 | |
228 | const uint16_t nshort = hDecoder->frameLength / 8; |
229 | const uint16_t sp_data_len = ics->length_of_reordered_spectral_data; |
230 | |
231 | const uint8_t *PreSortCb; |
232 | |
233 | /* no data (e.g. silence) */ |
234 | if (sp_data_len == 0) { |
235 | return 0; |
236 | } |
237 | |
238 | /* since there is spectral data, at least one codeword has nonzero length */ |
239 | if (ics->length_of_longest_codeword == 0) { |
240 | return 10; |
241 | } |
242 | |
243 | if (sp_data_len < ics->length_of_longest_codeword) { |
244 | return 10; |
245 | } |
246 | |
247 | sp_offset[0] = 0; |
248 | for (g = 1; g < ics->num_window_groups; g++) { |
249 | sp_offset[g] = sp_offset[g - 1] + nshort * ics->window_group_length[g - 1]; |
250 | } |
251 | |
252 | PCWs_done = 0; |
253 | numberOfSegments = 0; |
254 | numberOfCodewords = 0; |
255 | bitsread = 0; |
256 | |
257 | /* VCB11 code books in use */ |
258 | if (hDecoder->aacSectionDataResilienceFlag) { |
259 | PreSortCb = PreSortCB_ER; |
260 | last_CB = NUM_CB_ER; |
261 | } else { |
262 | PreSortCb = PreSortCB_STD; |
263 | last_CB = NUM_CB; |
264 | } |
265 | |
266 | /* step 1: decode PCW's (set 0), and stuff data in easier-to-use format */ |
267 | for (sortloop = 0; sortloop < last_CB; sortloop++) { |
268 | /* select codebook to process this pass */ |
269 | this_CB = PreSortCb[sortloop]; |
270 | |
271 | /* loop over sfbs */ |
272 | for (sfb = 0; sfb < ics->max_sfb; sfb++) { |
273 | /* loop over all in this sfb, 4 lines per loop */ |
274 | for (w_idx = 0; 4 * w_idx < (min(ics->swb_offset[sfb + 1], ics->swb_offset_max) - ics->swb_offset[sfb]); w_idx++) { |
275 | for (g = 0; g < ics->num_window_groups; g++) { |
276 | for (i = 0; i < ics->num_sec[g]; i++) { |
277 | /* check whether sfb used here is the one we want to process */ |
278 | if ((ics->sect_start[g][i] <= sfb) && (ics->sect_end[g][i] > sfb)) { |
279 | /* check whether codebook used here is the one we want to process */ |
280 | this_sec_CB = ics->sect_cb[g][i]; |
281 | |
282 | if (is_good_cb(this_CB, this_sec_CB)) { |
283 | /* precalculate some stuff */ |
284 | uint16_t sect_sfb_size = ics->sect_sfb_offset[g][sfb + 1] - ics->sect_sfb_offset[g][sfb]; |
285 | uint8_t inc = (this_sec_CB < FIRST_PAIR_HCB) ? QUAD_LEN : PAIR_LEN; |
286 | uint16_t group_cws_count = (4 * ics->window_group_length[g]) / inc; |
287 | uint8_t segwidth = segmentWidth(this_sec_CB); |
288 | uint16_t cws; |
289 | |
290 | /* read codewords until end of sfb or end of window group (shouldn't only 1 trigger?) */ |
291 | for (cws = 0; (cws < group_cws_count) && ((cws + w_idx * group_cws_count) < sect_sfb_size); cws++) { |
292 | uint16_t sp = sp_offset[g] + ics->sect_sfb_offset[g][sfb] + inc * (cws + w_idx * group_cws_count); |
293 | |
294 | /* read and decode PCW */ |
295 | if (!PCWs_done) { |
296 | /* read in normal segments */ |
297 | if (bitsread + segwidth <= sp_data_len) { |
298 | read_segment(&segment[numberOfSegments], segwidth, ld); |
299 | bitsread += segwidth; |
300 | |
301 | huffman_spectral_data_2(this_sec_CB, &segment[numberOfSegments], &spectral_data[sp]); |
302 | |
303 | /* keep leftover bits */ |
304 | rewrev_bits(&segment[numberOfSegments]); |
305 | |
306 | numberOfSegments++; |
307 | } else { |
308 | /* remaining stuff after last segment, we unfortunately couldn't read |
309 | this in earlier because it might not fit in 64 bits. since we already |
310 | decoded (and removed) the PCW it is now guaranteed to fit */ |
311 | if (bitsread < sp_data_len) { |
312 | const uint8_t additional_bits = sp_data_len - bitsread; |
313 | |
314 | read_segment(&segment[numberOfSegments], additional_bits, ld); |
315 | segment[numberOfSegments].len += segment[numberOfSegments - 1].len; |
316 | rewrev_bits(&segment[numberOfSegments]); |
317 | |
318 | if (segment[numberOfSegments - 1].len > 32) { |
319 | segment[numberOfSegments - 1].bufb = segment[numberOfSegments].bufb + |
320 | showbits_hcr(&segment[numberOfSegments - 1], segment[numberOfSegments - 1].len - 32); |
321 | segment[numberOfSegments - 1].bufa = segment[numberOfSegments].bufa + |
322 | showbits_hcr(&segment[numberOfSegments - 1], 32); |
323 | } else { |
324 | segment[numberOfSegments - 1].bufa = segment[numberOfSegments].bufa + |
325 | showbits_hcr(&segment[numberOfSegments - 1], segment[numberOfSegments - 1].len); |
326 | segment[numberOfSegments - 1].bufb = segment[numberOfSegments].bufb; |
327 | } |
328 | segment[numberOfSegments - 1].len += additional_bits; |
329 | } |
330 | bitsread = sp_data_len; |
331 | PCWs_done = 1; |
332 | |
333 | fill_in_codeword(codeword, 0, sp, this_sec_CB); |
334 | } |
335 | } else { |
336 | fill_in_codeword(codeword, numberOfCodewords - numberOfSegments, sp, this_sec_CB); |
337 | } |
338 | numberOfCodewords++; |
339 | } |
340 | } |
341 | } |
342 | } |
343 | } |
344 | } |
345 | } |
346 | } |
347 | |
348 | if (numberOfSegments == 0) { |
349 | return 10; |
350 | } |
351 | |
352 | numberOfSets = numberOfCodewords / numberOfSegments; |
353 | |
354 | /* step 2: decode nonPCWs */ |
355 | for (set = 1; set <= numberOfSets; set++) { |
356 | uint16_t trial; |
357 | |
358 | for (trial = 0; trial < numberOfSegments; trial++) { |
359 | uint16_t codewordBase; |
360 | |
361 | for (codewordBase = 0; codewordBase < numberOfSegments; codewordBase++) { |
362 | const uint16_t segment_idx = (trial + codewordBase) % numberOfSegments; |
363 | const uint16_t codeword_idx = codewordBase + set * numberOfSegments - numberOfSegments; |
364 | |
365 | /* data up */ |
366 | if (codeword_idx >= numberOfCodewords - numberOfSegments) { |
367 | break; |
368 | } |
369 | |
370 | if (!codeword[codeword_idx].decoded && segment[segment_idx].len > 0) { |
371 | uint8_t tmplen; |
372 | |
373 | if (codeword[codeword_idx].bits.len != 0) { |
374 | concat_bits(&segment[segment_idx], &codeword[codeword_idx].bits); |
375 | } |
376 | |
377 | tmplen = segment[segment_idx].len; |
378 | |
379 | if (huffman_spectral_data_2(codeword[codeword_idx].cb, &segment[segment_idx], |
380 | &spectral_data[codeword[codeword_idx].sp_offset]) >= 0) { |
381 | codeword[codeword_idx].decoded = 1; |
382 | } else { |
383 | codeword[codeword_idx].bits = segment[segment_idx]; |
384 | codeword[codeword_idx].bits.len = tmplen; |
385 | } |
386 | |
387 | } |
388 | } |
389 | } |
390 | for (i = 0; i < numberOfSegments; i++) { |
391 | rewrev_bits(&segment[i]); |
392 | } |
393 | } |
394 | |
395 | #if 0 // Seems to give false errors |
396 | bitsleft = 0; |
397 | |
398 | for (i = 0; i < numberOfSegments && !bitsleft; i++) { |
399 | bitsleft += segment[i].len; |
400 | } |
401 | |
402 | if (bitsleft) { |
403 | return 10; |
404 | } |
405 | |
406 | codewordsleft = 0; |
407 | |
408 | for (i = 0; (i < numberOfCodewords - numberOfSegments) && (!codewordsleft); i++) |
409 | if (!codeword[i].decoded) { |
410 | codewordsleft++; |
411 | } |
412 | |
413 | if (codewordsleft) { |
414 | return 10; |
415 | } |
416 | #endif |
417 | |
418 | |
419 | return 0; |
420 | |
421 | } |
422 | #endif |
423 |