/proc/self/cwd/libfaad/hcr.c
Line | Count | Source (jump to first uncovered line) |
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 | | |
31 | | #include "common.h" |
32 | | #include "structs.h" |
33 | | |
34 | | #include <stdlib.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 | 122 | #define NUM_CB 6 |
57 | 2.28k | #define NUM_CB_ER 22 |
58 | | #define MAX_CB 32 |
59 | 287k | #define VCB11_FIRST 16 |
60 | 59.6k | #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 | 22.6k | #define segmentWidth(cb) min(maxCwLen[cb], ics->length_of_longest_codeword) |
74 | | |
75 | | /* bit-twiddling helpers */ |
76 | | static const uint8_t S[] = {1, 2, 4, 8, 16}; |
77 | | static const uint32_t B[] = {0x55555555, 0x33333333, 0x0F0F0F0F, 0x00FF00FF, 0x0000FFFF}; |
78 | | |
79 | | typedef struct |
80 | | { |
81 | | uint8_t cb; |
82 | | uint8_t decoded; |
83 | | uint16_t sp_offset; |
84 | | bits_t bits; |
85 | | } codeword_t; |
86 | | |
87 | | static uint32_t reverse_word(uint32_t v) |
88 | 102k | { |
89 | 102k | v = ((v >> S[0]) & B[0]) | ((v << S[0]) & ~B[0]); |
90 | 102k | v = ((v >> S[1]) & B[1]) | ((v << S[1]) & ~B[1]); |
91 | 102k | v = ((v >> S[2]) & B[2]) | ((v << S[2]) & ~B[2]); |
92 | 102k | v = ((v >> S[3]) & B[3]) | ((v << S[3]) & ~B[3]); |
93 | 102k | v = ((v >> S[4]) & B[4]) | ((v << S[4]) & ~B[4]); |
94 | 102k | return v; |
95 | 102k | } |
96 | | |
97 | | /* bits_t version */ |
98 | | static void rewrev_bits(bits_t *bits) |
99 | 129k | { |
100 | 129k | if (bits->len == 0) return; |
101 | 89.5k | if (bits->len <= 32) { |
102 | 76.8k | bits->bufb = 0; |
103 | 76.8k | bits->bufa = reverse_word(bits->bufa) >> (32 - bits->len); |
104 | 76.8k | } else { |
105 | | /* last 32<>32 bit swap via rename */ |
106 | 12.6k | uint32_t lo = reverse_word(bits->bufb); |
107 | 12.6k | uint32_t hi = reverse_word(bits->bufa); |
108 | | |
109 | 12.6k | if (bits->len == 64) { |
110 | 28 | bits->bufb = hi; |
111 | 28 | bits->bufa = lo; |
112 | 12.6k | } else { |
113 | | /* shift off low bits (this is really only one 64 bit shift) */ |
114 | 12.6k | bits->bufb = hi >> (64 - bits->len); |
115 | 12.6k | bits->bufa = (lo >> (64 - bits->len)) | (hi << (bits->len - 32)); |
116 | 12.6k | } |
117 | 12.6k | } |
118 | 89.5k | } |
119 | | |
120 | | |
121 | | /* merge bits of a to b */ |
122 | | /* precondition: a->len + b->len <= 64 */ |
123 | | static void concat_bits(bits_t *b, bits_t *a) |
124 | 6.99k | { |
125 | 6.99k | uint32_t bl, bh, al, ah; |
126 | | |
127 | | /* empty addend */ |
128 | 6.99k | if (a->len == 0) return; |
129 | | |
130 | | /* addend becomes result */ |
131 | 6.99k | if (b->len == 0) |
132 | 0 | { |
133 | 0 | *b = *a; |
134 | 0 | return; |
135 | 0 | } |
136 | | |
137 | 6.99k | al = a->bufa; |
138 | 6.99k | ah = a->bufb; |
139 | | |
140 | 6.99k | if (b->len > 32) |
141 | 468 | { |
142 | | /* (b->len - 32) is 1..31 */ |
143 | | /* maskoff superfluous high b bits */ |
144 | 468 | bl = b->bufa; |
145 | 468 | bh = b->bufb & ((1u << (b->len-32)) - 1); |
146 | | /* left shift a b->len bits */ |
147 | 468 | ah = al << (b->len - 32); |
148 | 468 | al = 0; |
149 | 6.52k | } else if (b->len == 32) { |
150 | 65 | bl = b->bufa; |
151 | 65 | bh = 0; |
152 | 65 | ah = al; |
153 | 65 | al = 0; |
154 | 6.45k | } else { |
155 | | /* b->len is 1..31, (32 - b->len) is 1..31 */ |
156 | 6.45k | bl = b->bufa & ((1u << (b->len)) - 1); |
157 | 6.45k | bh = 0; |
158 | 6.45k | ah = (ah << (b->len)) | (al >> (32 - b->len)); |
159 | 6.45k | al = al << b->len; |
160 | 6.45k | } |
161 | | |
162 | | /* merge */ |
163 | 6.99k | b->bufa = bl | al; |
164 | 6.99k | b->bufb = bh | ah; |
165 | | |
166 | 6.99k | b->len += a->len; |
167 | 6.99k | } |
168 | | |
169 | | static uint8_t is_good_cb(uint8_t this_CB, uint8_t this_sec_CB) |
170 | 557k | { |
171 | | /* only want spectral data CB's */ |
172 | 557k | if ((this_sec_CB > ZERO_HCB && this_sec_CB <= ESC_HCB) || (this_sec_CB >= VCB11_FIRST && this_sec_CB <= VCB11_LAST)) |
173 | 472k | { |
174 | 472k | if (this_CB < ESC_HCB) |
175 | 113k | { |
176 | | /* normal codebook pairs */ |
177 | 113k | return ((this_sec_CB == this_CB) || (this_sec_CB == this_CB + 1)); |
178 | 113k | } else |
179 | 359k | { |
180 | | /* escape codebook */ |
181 | 359k | return (this_sec_CB == this_CB); |
182 | 359k | } |
183 | 472k | } |
184 | 84.3k | return 0; |
185 | 557k | } |
186 | | |
187 | | static void read_segment(bits_t *segment, uint8_t segwidth, bitfile *ld) |
188 | 51.8k | { |
189 | 51.8k | segment->len = segwidth; |
190 | | |
191 | 51.8k | if (segwidth > 32) |
192 | 7.44k | { |
193 | 7.44k | segment->bufb = faad_getbits(ld, segwidth - 32); |
194 | 7.44k | segment->bufa = faad_getbits(ld, 32); |
195 | | |
196 | 44.4k | } else { |
197 | 44.4k | segment->bufb = 0; |
198 | 44.4k | segment->bufa = faad_getbits(ld, segwidth); |
199 | 44.4k | } |
200 | 51.8k | } |
201 | | |
202 | | static void fill_in_codeword(codeword_t *codeword, uint16_t index, uint16_t sp, uint8_t cb) |
203 | 37.0k | { |
204 | 37.0k | codeword[index].sp_offset = sp; |
205 | 37.0k | codeword[index].cb = cb; |
206 | 37.0k | codeword[index].decoded = 0; |
207 | 37.0k | codeword[index].bits.len = 0; |
208 | 37.0k | } |
209 | | |
210 | | uint8_t reordered_spectral_data(NeAACDecStruct *hDecoder, ic_stream *ics, |
211 | | bitfile *ld, int16_t *spectral_data) |
212 | 6.58k | { |
213 | 6.58k | uint16_t PCWs_done; |
214 | 6.58k | uint16_t numberOfSegments, numberOfSets, numberOfCodewords; |
215 | | |
216 | 6.58k | codeword_t codeword[512]; |
217 | 6.58k | bits_t segment[512]; |
218 | | |
219 | 6.58k | uint16_t sp_offset[8]; |
220 | 6.58k | uint16_t g, i, sortloop, set, bitsread; |
221 | 6.58k | /*uint16_t bitsleft, codewordsleft*/; |
222 | 6.58k | uint8_t w_idx, sfb, this_CB, last_CB, this_sec_CB; |
223 | | |
224 | 6.58k | const uint16_t nshort = hDecoder->frameLength/8; |
225 | 6.58k | const uint16_t sp_data_len = ics->length_of_reordered_spectral_data; |
226 | | |
227 | 6.58k | const uint8_t *PreSortCb; |
228 | | |
229 | | /* no data (e.g. silence) */ |
230 | 6.58k | if (sp_data_len == 0) |
231 | 4.14k | return 0; |
232 | | |
233 | | /* since there is spectral data, at least one codeword has nonzero length */ |
234 | 2.44k | if (ics->length_of_longest_codeword == 0) |
235 | 31 | return 10; |
236 | | |
237 | 2.41k | if (sp_data_len < ics->length_of_longest_codeword) |
238 | 4 | return 10; |
239 | | |
240 | 2.40k | sp_offset[0] = 0; |
241 | 2.76k | for (g = 1; g < ics->num_window_groups; g++) |
242 | 355 | { |
243 | 355 | sp_offset[g] = sp_offset[g-1] + nshort*ics->window_group_length[g-1]; |
244 | 355 | } |
245 | | |
246 | 2.40k | PCWs_done = 0; |
247 | 2.40k | numberOfSegments = 0; |
248 | 2.40k | numberOfCodewords = 0; |
249 | 2.40k | bitsread = 0; |
250 | | |
251 | | /* VCB11 code books in use */ |
252 | 2.40k | if (hDecoder->aacSectionDataResilienceFlag) |
253 | 2.28k | { |
254 | 2.28k | PreSortCb = PreSortCB_ER; |
255 | 2.28k | last_CB = NUM_CB_ER; |
256 | 2.28k | } else |
257 | 122 | { |
258 | 122 | PreSortCb = PreSortCB_STD; |
259 | 122 | last_CB = NUM_CB; |
260 | 122 | } |
261 | | |
262 | | /* step 1: decode PCW's (set 0), and stuff data in easier-to-use format */ |
263 | 52.7k | for (sortloop = 0; sortloop < last_CB; sortloop++) |
264 | 50.3k | { |
265 | | /* select codebook to process this pass */ |
266 | 50.3k | this_CB = PreSortCb[sortloop]; |
267 | | |
268 | | /* loop over sfbs */ |
269 | 439k | for (sfb = 0; sfb < ics->max_sfb; sfb++) |
270 | 389k | { |
271 | | /* loop over all in this sfb, 4 lines per loop */ |
272 | 927k | for (w_idx = 0; 4*w_idx < (min(ics->swb_offset[sfb+1], ics->swb_offset_max) - ics->swb_offset[sfb]); w_idx++) |
273 | 538k | { |
274 | 1.09M | for(g = 0; g < ics->num_window_groups; g++) |
275 | 557k | { |
276 | 1.82M | for (i = 0; i < ics->num_sec[g]; i++) |
277 | 1.27M | { |
278 | | /* check whether sfb used here is the one we want to process */ |
279 | 1.27M | if ((ics->sect_start[g][i] <= sfb) && (ics->sect_end[g][i] > sfb)) |
280 | 557k | { |
281 | | /* check whether codebook used here is the one we want to process */ |
282 | 557k | this_sec_CB = ics->sect_cb[g][i]; |
283 | | |
284 | 557k | if (is_good_cb(this_CB, this_sec_CB)) |
285 | 22.6k | { |
286 | | /* precalculate some stuff */ |
287 | 22.6k | uint16_t sect_sfb_size = ics->sect_sfb_offset[g][sfb+1] - ics->sect_sfb_offset[g][sfb]; |
288 | 22.6k | uint8_t inc = (this_sec_CB < FIRST_PAIR_HCB) ? QUAD_LEN : PAIR_LEN; |
289 | 22.6k | uint16_t group_cws_count = (4*ics->window_group_length[g])/inc; |
290 | 22.6k | uint8_t segwidth = segmentWidth(this_sec_CB); |
291 | 22.6k | uint16_t cws; |
292 | | |
293 | | /* read codewords until end of sfb or end of window group (shouldn't only 1 trigger?) */ |
294 | 111k | for (cws = 0; (cws < group_cws_count) && ((cws + w_idx*group_cws_count) < sect_sfb_size); cws++) |
295 | 88.5k | { |
296 | 88.5k | uint16_t sp = sp_offset[g] + ics->sect_sfb_offset[g][sfb] + inc * (cws + w_idx*group_cws_count); |
297 | | |
298 | | /* read and decode PCW */ |
299 | 88.5k | if (!PCWs_done) |
300 | 51.9k | { |
301 | | /* read in normal segments */ |
302 | 51.9k | if (bitsread + segwidth <= sp_data_len) |
303 | 51.4k | { |
304 | 51.4k | read_segment(&segment[numberOfSegments], segwidth, ld); |
305 | 51.4k | bitsread += segwidth; |
306 | | |
307 | 51.4k | huffman_spectral_data_2(this_sec_CB, &segment[numberOfSegments], &spectral_data[sp]); |
308 | | |
309 | | /* keep leftover bits */ |
310 | 51.4k | rewrev_bits(&segment[numberOfSegments]); |
311 | | |
312 | 51.4k | numberOfSegments++; |
313 | 51.4k | } else { // sp_data_len - bitsread < segwidth |
314 | | /* remaining stuff after last segment, we unfortunately couldn't read |
315 | | this in earlier because it might not fit in 64 bits. since we already |
316 | | decoded (and removed) the PCW it is now should fit */ |
317 | 457 | if (bitsread < sp_data_len) |
318 | 368 | { |
319 | 368 | const uint8_t additional_bits = (uint8_t)(sp_data_len - bitsread); |
320 | | |
321 | 368 | read_segment(&segment[numberOfSegments], additional_bits, ld); |
322 | 368 | segment[numberOfSegments].len += segment[numberOfSegments-1].len; |
323 | 368 | if (segment[numberOfSegments].len > 64) |
324 | 33 | return 10; |
325 | 335 | rewrev_bits(&segment[numberOfSegments]); |
326 | | |
327 | 335 | if (segment[numberOfSegments-1].len > 32) |
328 | 73 | { |
329 | 73 | segment[numberOfSegments-1].bufb = segment[numberOfSegments].bufb + |
330 | 73 | showbits_hcr(&segment[numberOfSegments-1], segment[numberOfSegments-1].len - 32); |
331 | 73 | segment[numberOfSegments-1].bufa = segment[numberOfSegments].bufa + |
332 | 73 | showbits_hcr(&segment[numberOfSegments-1], 32); |
333 | 262 | } else { |
334 | 262 | segment[numberOfSegments-1].bufa = segment[numberOfSegments].bufa + |
335 | 262 | showbits_hcr(&segment[numberOfSegments-1], segment[numberOfSegments-1].len); |
336 | 262 | segment[numberOfSegments-1].bufb = segment[numberOfSegments].bufb; |
337 | 262 | } |
338 | 335 | segment[numberOfSegments-1].len += additional_bits; |
339 | 335 | } |
340 | 424 | bitsread = sp_data_len; |
341 | 424 | PCWs_done = 1; |
342 | | |
343 | 424 | fill_in_codeword(codeword, 0, sp, this_sec_CB); |
344 | 424 | } |
345 | 51.9k | } else { |
346 | 36.5k | fill_in_codeword(codeword, numberOfCodewords - numberOfSegments, sp, this_sec_CB); |
347 | 36.5k | } |
348 | 88.5k | numberOfCodewords++; |
349 | 88.5k | } |
350 | 22.6k | } |
351 | 557k | } |
352 | 1.27M | } |
353 | 557k | } |
354 | 538k | } |
355 | 389k | } |
356 | 50.3k | } |
357 | | |
358 | 2.37k | if (numberOfSegments == 0) |
359 | 38 | return 10; |
360 | | |
361 | 2.33k | numberOfSets = numberOfCodewords / numberOfSegments; |
362 | | |
363 | | /* step 2: decode nonPCWs */ |
364 | 7.95k | for (set = 1; set <= numberOfSets; set++) |
365 | 5.62k | { |
366 | 5.62k | uint16_t trial; |
367 | | |
368 | 83.5k | for (trial = 0; trial < numberOfSegments; trial++) |
369 | 77.9k | { |
370 | 77.9k | uint16_t codewordBase; |
371 | | |
372 | 3.89M | for (codewordBase = 0; codewordBase < numberOfSegments; codewordBase++) |
373 | 3.87M | { |
374 | 3.87M | const uint16_t segment_idx = (trial + codewordBase) % numberOfSegments; |
375 | 3.87M | const uint16_t codeword_idx = codewordBase + set*numberOfSegments - numberOfSegments; |
376 | | |
377 | | /* data up */ |
378 | 3.87M | if (codeword_idx >= numberOfCodewords - numberOfSegments) break; |
379 | | |
380 | 3.82M | if (!codeword[codeword_idx].decoded && segment[segment_idx].len > 0) |
381 | 35.3k | { |
382 | 35.3k | uint8_t tmplen = segment[segment_idx].len + codeword[codeword_idx].bits.len; |
383 | | |
384 | 35.3k | if (tmplen > 64) |
385 | 356 | { |
386 | | // Drop bits that do not fit concatenation result. |
387 | 356 | flushbits_hcr(&codeword[codeword_idx].bits, tmplen - 64); |
388 | 356 | } |
389 | | |
390 | 35.3k | if (codeword[codeword_idx].bits.len != 0) |
391 | 6.99k | concat_bits(&segment[segment_idx], &codeword[codeword_idx].bits); |
392 | | |
393 | 35.3k | tmplen = segment[segment_idx].len; |
394 | | |
395 | 35.3k | if (huffman_spectral_data_2(codeword[codeword_idx].cb, &segment[segment_idx], |
396 | 35.3k | &spectral_data[codeword[codeword_idx].sp_offset]) >= 0) |
397 | 27.3k | { |
398 | 27.3k | codeword[codeword_idx].decoded = 1; |
399 | 27.3k | } else |
400 | 7.99k | { |
401 | 7.99k | codeword[codeword_idx].bits = segment[segment_idx]; |
402 | 7.99k | codeword[codeword_idx].bits.len = tmplen; |
403 | 7.99k | } |
404 | | |
405 | 35.3k | } |
406 | 3.82M | } |
407 | 77.9k | } |
408 | 83.5k | for (i = 0; i < numberOfSegments; i++) |
409 | 77.9k | rewrev_bits(&segment[i]); |
410 | 5.62k | } |
411 | | |
412 | | #if 0 // Seems to give false errors |
413 | | bitsleft = 0; |
414 | | |
415 | | for (i = 0; i < numberOfSegments && !bitsleft; i++) |
416 | | bitsleft += segment[i].len; |
417 | | |
418 | | if (bitsleft) return 10; |
419 | | |
420 | | codewordsleft = 0; |
421 | | |
422 | | for (i = 0; (i < numberOfCodewords - numberOfSegments) && (!codewordsleft); i++) |
423 | | if (!codeword[i].decoded) |
424 | | codewordsleft++; |
425 | | |
426 | | if (codewordsleft) return 10; |
427 | | #endif |
428 | | |
429 | | |
430 | 2.33k | return 0; |
431 | | |
432 | 2.37k | } |
433 | | #endif |