1 diff -ruN a52dec.orig/include/a52.h a52dec/include/a52.h
2 --- a52dec.orig/include/a52.h 2012-11-13 17:25:33.438758556 +0100
3 +++ a52dec/include/a52.h 2012-11-13 17:27:31.143704187 +0100
7 - * Copyright (C) 2000-2002 Michel Lespinasse <walken@zoy.org>
8 + * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org>
9 * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
11 * This file is part of a52dec, a free ATSC A-52 stream decoder.
16 -#ifndef LIBA52_DOUBLE
17 -typedef float sample_t;
19 +#if defined(LIBA52_FIXED)
20 +typedef int32_t sample_t;
21 +typedef int32_t level_t;
22 +#elif defined(LIBA52_DOUBLE)
23 typedef double sample_t;
24 +typedef double level_t;
26 +typedef float sample_t;
27 +typedef float level_t;
30 typedef struct a52_state_s a52_state_t;
32 int a52_syncinfo (uint8_t * buf, int * flags,
33 int * sample_rate, int * bit_rate);
34 int a52_frame (a52_state_t * state, uint8_t * buf, int * flags,
35 - sample_t * level, sample_t bias);
36 + level_t * level, sample_t bias);
37 void a52_dynrng (a52_state_t * state,
38 - sample_t (* call) (sample_t, void *), void * data);
39 + level_t (* call) (level_t, void *), void * data);
40 int a52_block (a52_state_t * state);
41 void a52_free (a52_state_t * state);
43 diff -ruN a52dec.orig/include/attributes.h a52dec/include/attributes.h
44 --- a52dec.orig/include/attributes.h 2012-11-13 17:25:33.438758556 +0100
45 +++ a52dec/include/attributes.h 2012-11-13 17:27:31.147037566 +0100
49 - * Copyright (C) 2000-2002 Michel Lespinasse <walken@zoy.org>
50 + * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org>
51 * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
53 * This file is part of a52dec, a free ATSC A-52 stream decoder.
56 #define ATTR_ALIGN(align)
59 +#ifdef HAVE_BUILTIN_EXPECT
60 +#define likely(x) __builtin_expect ((x) != 0, 1)
61 +#define unlikely(x) __builtin_expect ((x) != 0, 0)
63 +#define likely(x) (x)
64 +#define unlikely(x) (x)
66 diff -ruN a52dec.orig/include/mm_accel.h a52dec/include/mm_accel.h
67 --- a52dec.orig/include/mm_accel.h 2012-11-13 17:25:33.438758556 +0100
68 +++ a52dec/include/mm_accel.h 2012-11-13 17:27:31.147037566 +0100
72 - * Copyright (C) 2000-2002 Michel Lespinasse <walken@zoy.org>
73 + * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org>
74 * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
76 * This file is part of a52dec, a free ATSC A-52 stream decoder.
77 diff -ruN a52dec.orig/include/tendra.h a52dec/include/tendra.h
78 --- a52dec.orig/include/tendra.h 2012-11-13 17:25:33.438758556 +0100
79 +++ a52dec/include/tendra.h 2012-11-13 17:27:31.147037566 +0100
83 - * Copyright (C) 2000-2002 Michel Lespinasse <walken@zoy.org>
84 + * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org>
85 * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
87 * This file is part of a52dec, a free ATSC A-52 stream decoder.
88 diff -ruN a52dec.orig/liba52/a52_internal.h a52dec/liba52/a52_internal.h
89 --- a52dec.orig/liba52/a52_internal.h 2012-11-13 17:25:33.438758556 +0100
90 +++ a52dec/liba52/a52_internal.h 2012-11-13 17:27:31.147037566 +0100
94 - * Copyright (C) 2000-2002 Michel Lespinasse <walken@zoy.org>
95 + * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org>
96 * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
98 * This file is part of a52dec, a free ATSC A-52 stream decoder.
100 uint8_t halfrate; /* halfrate factor */
101 uint8_t acmod; /* coded channels */
102 uint8_t lfeon; /* coded lfe channel */
103 - sample_t clev; /* centre channel mix level */
104 - sample_t slev; /* surround channels mix level */
105 + level_t clev; /* centre channel mix level */
106 + level_t slev; /* surround channels mix level */
108 int output; /* type of output */
109 - sample_t level; /* output level */
110 + level_t level; /* output level */
111 sample_t bias; /* output bias */
113 int dynrnge; /* apply dynamic range */
114 - sample_t dynrng; /* dynamic range */
115 + level_t dynrng; /* dynamic range */
116 void * dynrngdata; /* dynamic range callback funtion and data */
117 - sample_t (* dynrngcall) (sample_t range, void * dynrngdata);
118 + level_t (* dynrngcall) (level_t range, void * dynrngdata);
120 uint8_t chincpl; /* channel coupled */
121 uint8_t phsflginu; /* phase flags in use (stereo only) */
122 uint8_t cplstrtmant; /* coupling channel start mantissa */
123 uint8_t cplendmant; /* coupling channel end mantissa */
124 uint32_t cplbndstrc; /* coupling band structure */
125 - sample_t cplco[5][18]; /* coupling coordinates */
126 + level_t cplco[5][18]; /* coupling coordinates */
128 /* derived information */
129 uint8_t cplstrtbnd; /* coupling start band (for bit allocation) */
130 @@ -107,14 +107,79 @@
131 int start, int end, int fastleak, int slowleak,
134 -int a52_downmix_init (int input, int flags, sample_t * level,
135 - sample_t clev, sample_t slev);
136 -int a52_downmix_coeff (sample_t * coeff, int acmod, int output, sample_t level,
137 - sample_t clev, sample_t slev);
138 +int a52_downmix_init (int input, int flags, level_t * level,
139 + level_t clev, level_t slev);
140 +int a52_downmix_coeff (level_t * coeff, int acmod, int output, level_t level,
141 + level_t clev, level_t slev);
142 void a52_downmix (sample_t * samples, int acmod, int output, sample_t bias,
143 - sample_t clev, sample_t slev);
144 + level_t clev, level_t slev);
145 void a52_upmix (sample_t * samples, int acmod, int output);
147 void a52_imdct_init (uint32_t mm_accel);
148 void a52_imdct_256 (sample_t * data, sample_t * delay, sample_t bias);
149 void a52_imdct_512 (sample_t * data, sample_t * delay, sample_t bias);
151 +#define ROUND(x) ((int)((x) + ((x) > 0 ? 0.5 : -0.5)))
153 +#ifndef LIBA52_FIXED
155 +typedef sample_t quantizer_t;
156 +#define SAMPLE(x) (x)
157 +#define LEVEL(x) (x)
158 +#define MUL(a,b) ((a) * (b))
159 +#define MUL_L(a,b) ((a) * (b))
160 +#define MUL_C(a,b) ((a) * (b))
161 +#define DIV(a,b) ((a) / (b))
162 +#define BIAS(x) ((x) + bias)
164 +#else /* LIBA52_FIXED */
166 +typedef int16_t quantizer_t;
167 +#define SAMPLE(x) (sample_t)((x) * (1 << 30))
168 +#define LEVEL(x) (level_t)((x) * (1 << 26))
171 +#define MUL(a,b) ((int)(((int64_t)(a) * (b) + (1 << 29)) >> 30))
172 +#define MUL_L(a,b) ((int)(((int64_t)(a) * (b) + (1 << 25)) >> 26))
173 +#elif defined(CPU_COLDFIRE)
174 +/* loses 1 bit of accuracy */
179 + "mac.l %[A], %[B], %%acc0\n\t" \
180 + "movclr.l %%acc0, %[t]\n\t" \
183 + : [A] "r" ((a)), [B] "r" ((b))); \
186 +/* loses 5 bits of accuracy */
187 +#define MUL_L(a, b) \
191 + "mac.l %[A], %[B], %%acc0\n\t" \
192 + "movclr.l %%acc0, %[t]\n\t" \
195 + : [A] "r" ((a)), [B] "r" ((b))); \
200 +({ int32_t _ta=(a), _tb=(b), _tc; \
201 + _tc=(_ta & 0xffff)*(_tb >> 16)+(_ta >> 16)*(_tb & 0xffff); (int32_t)(((_tc >> 14))+ (((_ta >> 16)*(_tb >> 16)) << 2 )); })
202 +#define MUL_L(a,b) \
203 +({ int32_t _ta=(a), _tb=(b), _tc; \
204 + _tc=(_ta & 0xffff)*(_tb >> 16)+(_ta >> 16)*(_tb & 0xffff); (int32_t)((_tc >> 10) + (((_ta >> 16)*(_tb >> 16)) << 6)); })
206 +#define MUL(a,b) (((a) >> 15) * ((b) >> 15))
207 +#define MUL_L(a,b) (((a) >> 13) * ((b) >> 13))
210 +#define MUL_C(a,b) MUL_L (a, LEVEL (b))
211 +#define DIV(a,b) ((((int64_t)LEVEL (a)) << 26) / (b))
212 +#define BIAS(x) ((x) + (bias*0))
215 diff -ruN a52dec.orig/liba52/bit_allocate.c a52dec/liba52/bit_allocate.c
216 --- a52dec.orig/liba52/bit_allocate.c 2012-11-13 17:25:33.438758556 +0100
217 +++ a52dec/liba52/bit_allocate.c 2012-11-13 17:27:31.147037566 +0100
221 - * Copyright (C) 2000-2002 Michel Lespinasse <walken@zoy.org>
222 + * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org>
223 * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
225 * This file is part of a52dec, a free ATSC A-52 stream decoder.
227 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
231 +#include "config-a52.h"
233 #include <inttypes.h>
236 #include "a52_internal.h"
238 -static int hthtab[3][50] = {
239 +static int hthtab[3][50] IDATA_ATTR = {
240 {0x730, 0x730, 0x7c0, 0x800, 0x820, 0x840, 0x850, 0x850, 0x860, 0x860,
241 0x860, 0x860, 0x860, 0x870, 0x870, 0x870, 0x880, 0x880, 0x890, 0x890,
242 0x8a0, 0x8a0, 0x8b0, 0x8b0, 0x8c0, 0x8c0, 0x8d0, 0x8e0, 0x8f0, 0x900,
244 0x8d0, 0x8b0, 0x840, 0x7f0, 0x790, 0x760, 0x7a0, 0x7c0, 0x7b0, 0x720}
247 -static int8_t baptab[305] = {
248 +static int8_t baptab[305] IDATA_ATTR = {
249 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
250 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
251 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
253 0, 0, 0, 0 /* 148 padding elems */
256 -static int bndtab[30] = {21, 22, 23, 24, 25, 26, 27, 28, 31, 34,
257 +static int bndtab[30] IDATA_ATTR = {21, 22, 23, 24, 25, 26, 27, 28, 31, 34,
258 37, 40, 43, 46, 49, 55, 61, 67, 73, 79,
259 85, 97, 109, 121, 133, 157, 181, 205, 229, 253};
261 -static int8_t latab[256] = {
262 +static int8_t latab[256] IDATA_ATTR = {
263 -64, -63, -62, -61, -60, -59, -58, -57, -56, -55, -54, -53,
264 -52, -52, -51, -50, -49, -48, -47, -47, -46, -45, -44, -44,
265 -43, -42, -41, -41, -40, -39, -38, -38, -37, -36, -36, -35,
267 int startband, endband;
270 - endband = ((bndtab-20)[i] < end) ? (bndtab-20)[i] : end;
271 + endband = (bndtab[i-20] < end) ? bndtab[i-20] : end;
272 psd = 128 * exp[j++];
273 while (j < endband) {
275 diff -ruN a52dec.orig/liba52/bitstream.c a52dec/liba52/bitstream.c
276 --- a52dec.orig/liba52/bitstream.c 2012-11-13 17:25:33.442091935 +0100
277 +++ a52dec/liba52/bitstream.c 2012-11-13 17:27:31.147037566 +0100
281 - * Copyright (C) 2000-2002 Michel Lespinasse <walken@zoy.org>
282 + * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org>
283 * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
285 * This file is part of a52dec, a free ATSC A-52 stream decoder.
287 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
291 +#include "config-a52.h"
293 #include <inttypes.h>
296 align = (long)buf & 3;
297 state->buffer_start = (uint32_t *) (buf - align);
298 state->bits_left = 0;
299 + state->current_word = 0;
300 bitstream_get (state, align * 8);
301 + bitstream_get_2 (state, 0); /* pretend function is used - keep gcc happy */
304 static inline void bitstream_fill_current (a52_state_t * state)
305 diff -ruN a52dec.orig/liba52/bitstream.h a52dec/liba52/bitstream.h
306 --- a52dec.orig/liba52/bitstream.h 2012-11-13 17:25:33.442091935 +0100
307 +++ a52dec/liba52/bitstream.h 2012-11-13 17:27:31.147037566 +0100
311 - * Copyright (C) 2000-2002 Michel Lespinasse <walken@zoy.org>
312 + * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org>
313 * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
315 * This file is part of a52dec, a free ATSC A-52 stream decoder.
317 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
320 -/* (stolen from the kernel) */
321 +//#define swab32(x) (betoh32(x))
322 #ifdef WORDS_BIGENDIAN
324 -# define swab32(x) (x)
325 +# define swab32(x) (x)
329 -# if 0 && defined (__i386__)
330 +# if defined (__i386__)
332 -# define swab32(x) __i386_swab32(x)
333 - static inline const uint32_t __i386_swab32(uint32_t x)
335 - __asm__("bswap %0" : "=r" (x) : "0" (x));
338 +# define swab32(x) __i386_swab32(x)
339 + static inline const uint32_t __i386_swab32(uint32_t x)
341 + __asm__("bswap %0" : "=r" (x) : "0" (x));
350 ((((uint8_t*)&x)[0] << 24) | (((uint8_t*)&x)[1] << 16) | \
351 (((uint8_t*)&x)[2] << 8) | (((uint8_t*)&x)[3]))
357 void a52_bitstream_set_ptr (a52_state_t * state, uint8_t * buf);
358 diff -ruN a52dec.orig/liba52/config-a52.h a52dec/liba52/config-a52.h
359 --- a52dec.orig/liba52/config-a52.h 1970-01-01 01:00:00.000000000 +0100
360 +++ a52dec/liba52/config-a52.h 2012-11-13 17:27:31.150370945 +0100
364 +/* a52dec profiling */
365 +/* #undef A52DEC_GPROF */
367 +/* Define to 1 if you have the `memalign' function. */
368 +/* #undef HAVE_MEMALIGN 1 */
370 +/* liba52 djbfft support */
371 +/* #undef LIBA52_DJBFFT */
373 +/* a52 sample precision */
374 +/* #undef LIBA52_DOUBLE */
376 +/* use fixed-point arithmetic */
377 +#define LIBA52_FIXED
379 +/* Define to 1 if your processor stores words with the most significant byte
380 + first (like Motorola and SPARC, unlike Intel and VAX). */
382 +/* Used in bitstream.h */
384 +#ifdef ROCKBOX_BIG_ENDIAN
385 +#define WORDS_BIGENDIAN 1
388 diff -ruN a52dec.orig/liba52/downmix.c a52dec/liba52/downmix.c
389 --- a52dec.orig/liba52/downmix.c 2012-11-13 17:25:33.442091935 +0100
390 +++ a52dec/liba52/downmix.c 2012-11-13 17:27:31.150370945 +0100
394 - * Copyright (C) 2000-2002 Michel Lespinasse <walken@zoy.org>
395 + * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org>
396 * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
398 * This file is part of a52dec, a free ATSC A-52 stream decoder.
400 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
404 +#include "config-a52.h"
407 #include <inttypes.h>
410 #define CONVERT(acmod,output) (((output) << 3) + (acmod))
412 -int a52_downmix_init (int input, int flags, sample_t * level,
413 - sample_t clev, sample_t slev)
414 +int a52_downmix_init (int input, int flags, level_t * level,
415 + level_t clev, level_t slev)
417 static uint8_t table[11][8] = {
418 {A52_CHANNEL, A52_DOLBY, A52_STEREO, A52_STEREO,
421 output = table[output][input & 7];
423 - if ((output == A52_STEREO) &&
424 - ((input == A52_DOLBY) || ((input == A52_3F) && (clev == LEVEL_3DB))))
425 + if (output == A52_STEREO &&
426 + (input == A52_DOLBY || (input == A52_3F && clev == LEVEL (LEVEL_3DB))))
429 - if (flags & A52_ADJUST_LEVEL)
430 + if (flags & A52_ADJUST_LEVEL) {
433 switch (CONVERT (input & 7, output)) {
435 case CONVERT (A52_3F, A52_MONO):
436 - *level *= LEVEL_3DB / (1 + clev);
437 + adjust = DIV (LEVEL_3DB, LEVEL (1) + clev);
440 case CONVERT (A52_STEREO, A52_MONO):
441 case CONVERT (A52_2F2R, A52_2F1R):
442 case CONVERT (A52_3F2R, A52_3F1R):
444 - *level *= LEVEL_3DB;
445 + adjust = LEVEL (LEVEL_3DB);
448 case CONVERT (A52_3F2R, A52_2F1R):
449 - if (clev < LEVEL_PLUS3DB - 1)
450 + if (clev < LEVEL (LEVEL_PLUS3DB - 1))
453 case CONVERT (A52_3F, A52_STEREO):
454 case CONVERT (A52_3F1R, A52_2F1R):
455 case CONVERT (A52_3F1R, A52_2F2R):
456 case CONVERT (A52_3F2R, A52_2F2R):
457 - *level /= 1 + clev;
458 + adjust = DIV (1, LEVEL (1) + clev);
461 case CONVERT (A52_2F1R, A52_MONO):
462 - *level *= LEVEL_PLUS3DB / (2 + slev);
463 + adjust = DIV (LEVEL_PLUS3DB, LEVEL (2) + slev);
466 case CONVERT (A52_2F1R, A52_STEREO):
467 case CONVERT (A52_3F1R, A52_3F):
468 - *level /= 1 + slev * LEVEL_3DB;
469 + adjust = DIV (1, LEVEL (1) + MUL_C (slev, LEVEL_3DB));
472 case CONVERT (A52_3F1R, A52_MONO):
473 - *level *= LEVEL_3DB / (1 + clev + 0.5 * slev);
474 + adjust = DIV (LEVEL_3DB, LEVEL (1) + clev + MUL_C (slev, 0.5));
477 case CONVERT (A52_3F1R, A52_STEREO):
478 - *level /= 1 + clev + slev * LEVEL_3DB;
479 + adjust = DIV (1, LEVEL (1) + clev + MUL_C (slev, LEVEL_3DB));
482 case CONVERT (A52_2F2R, A52_MONO):
483 - *level *= LEVEL_3DB / (1 + slev);
484 + adjust = DIV (LEVEL_3DB, LEVEL (1) + slev);
487 case CONVERT (A52_2F2R, A52_STEREO):
488 case CONVERT (A52_3F2R, A52_3F):
489 - *level /= 1 + slev;
490 + adjust = DIV (1, LEVEL (1) + slev);
493 case CONVERT (A52_3F2R, A52_MONO):
494 - *level *= LEVEL_3DB / (1 + clev + slev);
495 + adjust = DIV (LEVEL_3DB, LEVEL (1) + clev + slev);
498 case CONVERT (A52_3F2R, A52_STEREO):
499 - *level /= 1 + clev + slev;
500 + adjust = DIV (1, LEVEL (1) + clev + slev);
503 case CONVERT (A52_MONO, A52_DOLBY):
504 - *level *= LEVEL_PLUS3DB;
505 + adjust = LEVEL (LEVEL_PLUS3DB);
508 case CONVERT (A52_3F, A52_DOLBY):
509 case CONVERT (A52_2F1R, A52_DOLBY):
510 - *level *= 1 / (1 + LEVEL_3DB);
511 + adjust = LEVEL (1 / (1 + LEVEL_3DB));
514 case CONVERT (A52_3F1R, A52_DOLBY):
515 case CONVERT (A52_2F2R, A52_DOLBY):
516 - *level *= 1 / (1 + 2 * LEVEL_3DB);
517 + adjust = LEVEL (1 / (1 + 2 * LEVEL_3DB));
520 case CONVERT (A52_3F2R, A52_DOLBY):
521 - *level *= 1 / (1 + 3 * LEVEL_3DB);
522 + adjust = LEVEL (1 / (1 + 3 * LEVEL_3DB));
529 + *level = MUL_L (*level, adjust);
535 -int a52_downmix_coeff (sample_t * coeff, int acmod, int output, sample_t level,
536 - sample_t clev, sample_t slev)
537 +int a52_downmix_coeff (level_t * coeff, int acmod, int output, level_t level,
538 + level_t clev, level_t slev)
542 + level_3db = MUL_C (level, LEVEL_3DB);
544 switch (CONVERT (acmod, output & A52_CHANNEL_MASK)) {
546 case CONVERT (A52_CHANNEL, A52_CHANNEL):
547 @@ -169,120 +181,138 @@
550 case CONVERT (A52_CHANNEL, A52_MONO):
551 - coeff[0] = coeff[1] = level * LEVEL_6DB;
552 + coeff[0] = coeff[1] = MUL_C (level, LEVEL_6DB);
555 case CONVERT (A52_STEREO, A52_MONO):
556 - coeff[0] = coeff[1] = level * LEVEL_3DB;
557 + coeff[0] = coeff[1] = level_3db;
560 case CONVERT (A52_3F, A52_MONO):
561 - coeff[0] = coeff[2] = level * LEVEL_3DB;
562 - coeff[1] = level * clev * LEVEL_PLUS3DB;
563 + coeff[0] = coeff[2] = level_3db;
564 + coeff[1] = MUL_C (MUL_L (level_3db, clev), LEVEL_PLUS6DB);
567 case CONVERT (A52_2F1R, A52_MONO):
568 - coeff[0] = coeff[1] = level * LEVEL_3DB;
569 - coeff[2] = level * slev * LEVEL_3DB;
570 + coeff[0] = coeff[1] = level_3db;
571 + coeff[2] = MUL_L (level_3db, slev);
574 case CONVERT (A52_2F2R, A52_MONO):
575 - coeff[0] = coeff[1] = level * LEVEL_3DB;
576 - coeff[2] = coeff[3] = level * slev * LEVEL_3DB;
577 + coeff[0] = coeff[1] = level_3db;
578 + coeff[2] = coeff[3] = MUL_L (level_3db, slev);
581 case CONVERT (A52_3F1R, A52_MONO):
582 - coeff[0] = coeff[2] = level * LEVEL_3DB;
583 - coeff[1] = level * clev * LEVEL_PLUS3DB;
584 - coeff[3] = level * slev * LEVEL_3DB;
585 + coeff[0] = coeff[2] = level_3db;
586 + coeff[1] = MUL_C (MUL_L (level_3db, clev), LEVEL_PLUS6DB);
587 + coeff[3] = MUL_L (level_3db, slev);
590 case CONVERT (A52_3F2R, A52_MONO):
591 - coeff[0] = coeff[2] = level * LEVEL_3DB;
592 - coeff[1] = level * clev * LEVEL_PLUS3DB;
593 - coeff[3] = coeff[4] = level * slev * LEVEL_3DB;
594 + coeff[0] = coeff[2] = level_3db;
595 + coeff[1] = MUL_C (MUL_L (level_3db, clev), LEVEL_PLUS6DB);
596 + coeff[3] = coeff[4] = MUL_L (level_3db, slev);
599 case CONVERT (A52_MONO, A52_DOLBY):
600 - coeff[0] = level * LEVEL_3DB;
601 + coeff[0] = level_3db;
604 case CONVERT (A52_3F, A52_DOLBY):
606 + coeff[0] = coeff[2] = coeff[3] = coeff[4] = level;
607 + coeff[1] = level_3db;
610 case CONVERT (A52_3F, A52_STEREO):
611 case CONVERT (A52_3F1R, A52_2F1R):
612 case CONVERT (A52_3F2R, A52_2F2R):
613 coeff[0] = coeff[2] = coeff[3] = coeff[4] = level;
614 - coeff[1] = level * clev;
615 + coeff[1] = MUL_L (level, clev);
618 case CONVERT (A52_2F1R, A52_DOLBY):
620 + coeff[0] = coeff[1] = level;
621 + coeff[2] = level_3db;
624 case CONVERT (A52_2F1R, A52_STEREO):
625 coeff[0] = coeff[1] = level;
626 - coeff[2] = level * slev * LEVEL_3DB;
627 + coeff[2] = MUL_L (level_3db, slev);
630 case CONVERT (A52_3F1R, A52_DOLBY):
633 + coeff[0] = coeff[2] = level;
634 + coeff[1] = coeff[3] = level_3db;
637 case CONVERT (A52_3F1R, A52_STEREO):
638 coeff[0] = coeff[2] = level;
639 - coeff[1] = level * clev;
640 - coeff[3] = level * slev * LEVEL_3DB;
641 + coeff[1] = MUL_L (level, clev);
642 + coeff[3] = MUL_L (level_3db, slev);
645 case CONVERT (A52_2F2R, A52_DOLBY):
647 + coeff[0] = coeff[1] = level;
648 + coeff[2] = coeff[3] = level_3db;
651 case CONVERT (A52_2F2R, A52_STEREO):
652 coeff[0] = coeff[1] = level;
653 - coeff[2] = coeff[3] = level * slev;
654 + coeff[2] = coeff[3] = MUL_L (level, slev);
657 case CONVERT (A52_3F2R, A52_DOLBY):
659 + coeff[0] = coeff[2] = level;
660 + coeff[1] = coeff[3] = coeff[4] = level_3db;
663 case CONVERT (A52_3F2R, A52_2F1R):
665 + coeff[0] = coeff[2] = level;
666 + coeff[1] = MUL_L (level, clev);
667 + coeff[3] = coeff[4] = level_3db;
670 case CONVERT (A52_3F2R, A52_STEREO):
671 coeff[0] = coeff[2] = level;
672 - coeff[1] = level * clev;
673 - coeff[3] = coeff[4] = level * slev;
674 + coeff[1] = MUL_L (level, clev);
675 + coeff[3] = coeff[4] = MUL_L (level, slev);
678 case CONVERT (A52_3F1R, A52_3F):
679 coeff[0] = coeff[1] = coeff[2] = level;
680 - coeff[3] = level * slev * LEVEL_3DB;
681 + coeff[3] = MUL_L (level_3db, slev);
684 case CONVERT (A52_3F2R, A52_3F):
685 coeff[0] = coeff[1] = coeff[2] = level;
686 - coeff[3] = coeff[4] = level * slev;
687 + coeff[3] = coeff[4] = MUL_L (level, slev);
690 case CONVERT (A52_2F2R, A52_2F1R):
691 coeff[0] = coeff[1] = level;
692 - coeff[2] = coeff[3] = level * LEVEL_3DB;
693 + coeff[2] = coeff[3] = level_3db;
696 case CONVERT (A52_3F2R, A52_3F1R):
697 coeff[0] = coeff[1] = coeff[2] = level;
698 - coeff[3] = coeff[4] = level * LEVEL_3DB;
699 + coeff[3] = coeff[4] = level_3db;
702 case CONVERT (A52_2F1R, A52_2F2R):
703 coeff[0] = coeff[1] = level;
704 - coeff[2] = level * LEVEL_3DB;
705 + coeff[2] = level_3db;
708 case CONVERT (A52_3F1R, A52_2F2R):
709 coeff[0] = coeff[2] = level;
710 - coeff[1] = level * clev;
711 - coeff[3] = level * LEVEL_3DB;
712 + coeff[1] = MUL_L (level, clev);
713 + coeff[3] = level_3db;
716 case CONVERT (A52_3F1R, A52_3F2R):
717 coeff[0] = coeff[1] = coeff[2] = level;
718 - coeff[3] = level * LEVEL_3DB;
719 + coeff[3] = level_3db;
722 case CONVERT (A52_CHANNEL, A52_CHANNEL1):
726 for (i = 0; i < 256; i++)
727 - dest[i] += src[i] + bias;
728 + dest[i] += BIAS (src[i]);
731 static void mix3to1 (sample_t * samples, sample_t bias)
735 for (i = 0; i < 256; i++)
736 - samples[i] += samples[i + 256] + samples[i + 512] + bias;
737 + samples[i] += BIAS (samples[i + 256] + samples[i + 512]);
740 static void mix4to1 (sample_t * samples, sample_t bias)
744 for (i = 0; i < 256; i++)
745 - samples[i] += (samples[i + 256] + samples[i + 512] +
746 - samples[i + 768] + bias);
747 + samples[i] += BIAS (samples[i + 256] + samples[i + 512] +
751 static void mix5to1 (sample_t * samples, sample_t bias)
755 for (i = 0; i < 256; i++)
756 - samples[i] += (samples[i + 256] + samples[i + 512] +
757 - samples[i + 768] + samples[i + 1024] + bias);
758 + samples[i] += BIAS (samples[i + 256] + samples[i + 512] +
759 + samples[i + 768] + samples[i + 1024]);
762 static void mix3to2 (sample_t * samples, sample_t bias)
766 for (i = 0; i < 256; i++) {
767 - common = samples[i + 256] + bias;
768 + common = BIAS (samples[i + 256]);
769 samples[i] += common;
770 samples[i + 256] = samples[i + 512] + common;
775 for (i = 0; i < 256; i++) {
776 - common = right[i + 256] + bias;
777 + common = BIAS (right[i + 256]);
783 for (i = 0; i < 256; i++) {
784 surround = samples[i + 512];
785 - samples[i] += bias - surround;
786 - samples[i + 256] += bias + surround;
787 + samples[i] += BIAS (-surround);
788 + samples[i + 256] += BIAS (surround);
795 for (i = 0; i < 256; i++) {
796 - common = samples[i + 256] + samples[i + 768] + bias;
797 + common = BIAS (samples[i + 256] + samples[i + 768]);
798 samples[i] += common;
799 samples[i + 256] = samples[i + 512] + common;
802 sample_t common, surround;
804 for (i = 0; i < 256; i++) {
805 - common = samples[i + 256] + bias;
806 + common = BIAS (samples[i + 256]);
807 surround = samples[i + 768];
808 samples[i] += common - surround;
809 samples[i + 256] = samples[i + 512] + common + surround;
812 for (i = 0; i < 256; i++) {
813 surround = samples[i + 512] + samples[i + 768];
814 - samples[i] += bias - surround;
815 - samples[i + 256] += bias + surround;
816 + samples[i] += BIAS (-surround);
817 + samples[i + 256] += BIAS (surround);
824 for (i = 0; i < 256; i++) {
825 - common = samples[i + 256] + bias;
826 + common = BIAS (samples[i + 256]);
827 samples[i] += common + samples[i + 768];
828 samples[i + 256] = common + samples[i + 512] + samples[i + 1024];
831 sample_t common, surround;
833 for (i = 0; i < 256; i++) {
834 - common = samples[i + 256] + bias;
835 + common = BIAS (samples[i + 256]);
836 surround = samples[i + 768] + samples[i + 1024];
837 samples[i] += common - surround;
838 samples[i + 256] = samples[i + 512] + common + surround;
842 for (i = 0; i < 256; i++)
843 - dest[i] = src[i] + src[i + 256] + bias;
844 + dest[i] = BIAS (src[i] + src[i + 256]);
847 static void zero (sample_t * samples)
851 void a52_downmix (sample_t * samples, int acmod, int output, sample_t bias,
852 - sample_t clev, sample_t slev)
853 + level_t clev, level_t slev)
855 + /* avoid compiler warning */
858 switch (CONVERT (acmod, output & A52_CHANNEL_MASK)) {
860 case CONVERT (A52_CHANNEL, A52_CHANNEL2):
864 case CONVERT (A52_3F1R, A52_3F2R):
865 - memcpy (samples + 1027, samples + 768, 256 * sizeof (sample_t));
866 + memcpy (samples + 1024, samples + 768, 256 * sizeof (sample_t));
870 diff -ruN a52dec.orig/liba52/imdct.c a52dec/liba52/imdct.c
871 --- a52dec.orig/liba52/imdct.c 2012-11-13 17:25:33.438758556 +0100
872 +++ a52dec/liba52/imdct.c 2012-11-13 17:27:31.150370945 +0100
876 - * Copyright (C) 2000-2002 Michel Lespinasse <walken@zoy.org>
877 + * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org>
878 * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
880 * The ifft algorithms in this file have been largely inspired by Dan
882 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
886 +#include "config-a52.h"
895 #define M_PI 3.1415926535897932384626433832795029
899 /* Root values for IFFT */
900 -static sample_t roots16[3];
901 -static sample_t roots32[7];
902 -static sample_t roots64[15];
903 -static sample_t roots128[31];
904 +//static sample_t roots16[3];
905 +//static sample_t roots32[7];
906 +//static sample_t roots64[15];
907 +//static sample_t roots128[31];
909 /* Twiddle factors for IMDCT */
910 -static complex_t pre1[128];
911 -static complex_t post1[64];
912 -static complex_t pre2[64];
913 -static complex_t post2[32];
914 +//static complex_t pre1[128];
915 +//static complex_t post1[64];
916 +//static complex_t pre2[64];
917 +//static complex_t post2[32];
919 -static sample_t a52_imdct_window[256];
920 +//static sample_t a52_imdct_window[256];
921 +#include "imdct_lookups.h"
923 static void (* ifft128) (complex_t * buf);
924 static void (* ifft64) (complex_t * buf);
926 static inline void ifft2 (complex_t * buf)
935 static inline void ifft4 (complex_t * buf)
937 - double tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8;
938 + sample_t tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8;
940 tmp1 = buf[0].real + buf[1].real;
941 tmp2 = buf[3].real + buf[2].real;
942 @@ -108,25 +110,37 @@
943 buf[3].imag = tmp6 - tmp8;
946 +/* basic radix-2 ifft butterfly */
948 +#define BUTTERFLY_0(t0,t1,W0,W1,d0,d1) do { \
949 + t0 = MUL (W1, d1) + MUL (W0, d0); \
950 + t1 = MUL (W0, d1) - MUL (W1, d0); \
953 +/* radix-2 ifft butterfly with bias */
955 +#define BUTTERFLY_B(t0,t1,W0,W1,d0,d1) do { \
956 + t0 = BIAS (MUL (d1, W1) + MUL (d0, W0)); \
957 + t1 = BIAS (MUL (d1, W0) - MUL (d0, W1)); \
960 /* the basic split-radix ifft butterfly */
962 -#define BUTTERFLY(a0,a1,a2,a3,wr,wi) do { \
963 - tmp5 = a2.real * wr + a2.imag * wi; \
964 - tmp6 = a2.imag * wr - a2.real * wi; \
965 - tmp7 = a3.real * wr - a3.imag * wi; \
966 - tmp8 = a3.imag * wr + a3.real * wi; \
967 - tmp1 = tmp5 + tmp7; \
968 - tmp2 = tmp6 + tmp8; \
969 - tmp3 = tmp6 - tmp8; \
970 - tmp4 = tmp7 - tmp5; \
971 - a2.real = a0.real - tmp1; \
972 - a2.imag = a0.imag - tmp2; \
973 - a3.real = a1.real - tmp3; \
974 - a3.imag = a1.imag - tmp4; \
979 +#define BUTTERFLY(a0,a1,a2,a3,wr,wi) do { \
980 + BUTTERFLY_0 (tmp5, tmp6, wr, wi, a2.real, a2.imag); \
981 + BUTTERFLY_0 (tmp8, tmp7, wr, wi, a3.imag, a3.real); \
982 + tmp1 = tmp5 + tmp7; \
983 + tmp2 = tmp6 + tmp8; \
984 + tmp3 = tmp6 - tmp8; \
985 + tmp4 = tmp7 - tmp5; \
986 + a2.real = a0.real - tmp1; \
987 + a2.imag = a0.imag - tmp2; \
988 + a3.real = a1.real - tmp3; \
989 + a3.imag = a1.imag - tmp4; \
996 /* split-radix ifft butterfly, specialized for wr=1 wi=0 */
997 @@ -149,10 +163,10 @@
998 /* split-radix ifft butterfly, specialized for wr=wi */
1000 #define BUTTERFLY_HALF(a0,a1,a2,a3,w) do { \
1001 - tmp5 = (a2.real + a2.imag) * w; \
1002 - tmp6 = (a2.imag - a2.real) * w; \
1003 - tmp7 = (a3.real - a3.imag) * w; \
1004 - tmp8 = (a3.imag + a3.real) * w; \
1005 + tmp5 = MUL (a2.real + a2.imag, w); \
1006 + tmp6 = MUL (a2.imag - a2.real, w); \
1007 + tmp7 = MUL (a3.real - a3.imag, w); \
1008 + tmp8 = MUL (a3.imag + a3.real, w); \
1009 tmp1 = tmp5 + tmp7; \
1010 tmp2 = tmp6 + tmp8; \
1011 tmp3 = tmp6 - tmp8; \
1014 static inline void ifft8 (complex_t * buf)
1016 - double tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8;
1017 + sample_t tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8;
1025 - double tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8;
1026 + sample_t tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8;
1034 - BUTTERFLY (buf[0], buf1[0], buf2[0], buf3[0], weight[n], weight[2*i]);
1035 + BUTTERFLY (buf[0], buf1[0], buf2[0], buf3[0],
1036 + weight[0], weight[2*i-n]);
1044 - ifft_pass (buf, roots16 - 4, 4);
1045 + ifft_pass (buf, roots16, 4);
1048 static void ifft32 (complex_t * buf)
1053 - ifft_pass (buf, roots32 - 8, 8);
1054 + ifft_pass (buf, roots32, 8);
1057 static void ifft64_c (complex_t * buf)
1062 - ifft_pass (buf, roots64 - 16, 16);
1063 + ifft_pass (buf, roots64, 16);
1066 static void ifft128_c (complex_t * buf)
1067 @@ -234,11 +249,11 @@
1071 - ifft_pass (buf, roots64 - 16, 16);
1072 + ifft_pass (buf, roots64, 16);
1076 - ifft_pass (buf, roots128 - 32, 32);
1077 + ifft_pass (buf, roots128, 32);
1080 void a52_imdct_512 (sample_t * data, sample_t * delay, sample_t bias)
1086 - buf[i].real = t_i * data[255-k] + t_r * data[k];
1087 - buf[i].imag = t_r * data[255-k] - t_i * data[k];
1088 + BUTTERFLY_0 (buf[i].real, buf[i].imag, t_r, t_i, data[k], data[255-k]);
1092 @@ -265,27 +278,22 @@
1093 /* y[n] = z[n] * (xcos1[n] + j * xsin1[n]) ; */
1094 t_r = post1[i].real;
1095 t_i = post1[i].imag;
1097 - a_r = t_r * buf[i].real + t_i * buf[i].imag;
1098 - a_i = t_i * buf[i].real - t_r * buf[i].imag;
1099 - b_r = t_i * buf[127-i].real + t_r * buf[127-i].imag;
1100 - b_i = t_r * buf[127-i].real - t_i * buf[127-i].imag;
1101 + BUTTERFLY_0 (a_r, a_i, t_i, t_r, buf[i].imag, buf[i].real);
1102 + BUTTERFLY_0 (b_r, b_i, t_r, t_i, buf[127-i].imag, buf[127-i].real);
1105 w_2 = window[255-2*i];
1106 - data[2*i] = delay[2*i] * w_2 - a_r * w_1 + bias;
1107 - data[255-2*i] = delay[2*i] * w_1 + a_r * w_2 + bias;
1108 + BUTTERFLY_B (data[255-2*i], data[2*i], w_2, w_1, a_r, delay[2*i]);
1111 w_1 = window[2*i+1];
1112 w_2 = window[254-2*i];
1113 - data[2*i+1] = delay[2*i+1] * w_2 + b_r * w_1 + bias;
1114 - data[254-2*i] = delay[2*i+1] * w_1 - b_r * w_2 + bias;
1115 + BUTTERFLY_B (data[2*i+1], data[254-2*i], w_1, w_2, b_r, delay[2*i+1]);
1120 -void a52_imdct_256(sample_t * data, sample_t * delay, sample_t bias)
1121 +void a52_imdct_256 (sample_t * data, sample_t * delay, sample_t bias)
1124 sample_t t_r, t_i, a_r, a_i, b_r, b_i, c_r, c_i, d_r, d_i, w_1, w_2;
1125 @@ -297,12 +305,8 @@
1130 - buf1[i].real = t_i * data[254-k] + t_r * data[k];
1131 - buf1[i].imag = t_r * data[254-k] - t_i * data[k];
1133 - buf2[i].real = t_i * data[255-k] + t_r * data[k+1];
1134 - buf2[i].imag = t_r * data[255-k] - t_i * data[k+1];
1135 + BUTTERFLY_0 (buf1[i].real, buf1[i].imag, t_r, t_i, data[k], data[254-k]);
1136 + BUTTERFLY_0 (buf2[i].real, buf2[i].imag, t_r, t_i, data[k+1], data[255-k]);
1140 @@ -314,43 +318,34 @@
1141 /* y1[n] = z1[n] * (xcos2[n] + j * xs in2[n]) ; */
1142 t_r = post2[i].real;
1143 t_i = post2[i].imag;
1145 - a_r = t_r * buf1[i].real + t_i * buf1[i].imag;
1146 - a_i = t_i * buf1[i].real - t_r * buf1[i].imag;
1147 - b_r = t_i * buf1[63-i].real + t_r * buf1[63-i].imag;
1148 - b_i = t_r * buf1[63-i].real - t_i * buf1[63-i].imag;
1150 - c_r = t_r * buf2[i].real + t_i * buf2[i].imag;
1151 - c_i = t_i * buf2[i].real - t_r * buf2[i].imag;
1152 - d_r = t_i * buf2[63-i].real + t_r * buf2[63-i].imag;
1153 - d_i = t_r * buf2[63-i].real - t_i * buf2[63-i].imag;
1154 + BUTTERFLY_0 (a_r, a_i, t_i, t_r, buf1[i].imag, buf1[i].real);
1155 + BUTTERFLY_0 (b_r, b_i, t_r, t_i, buf1[63-i].imag, buf1[63-i].real);
1156 + BUTTERFLY_0 (c_r, c_i, t_i, t_r, buf2[i].imag, buf2[i].real);
1157 + BUTTERFLY_0 (d_r, d_i, t_r, t_i, buf2[63-i].imag, buf2[63-i].real);
1160 w_2 = window[255-2*i];
1161 - data[2*i] = delay[2*i] * w_2 - a_r * w_1 + bias;
1162 - data[255-2*i] = delay[2*i] * w_1 + a_r * w_2 + bias;
1163 + BUTTERFLY_B (data[255-2*i], data[2*i], w_2, w_1, a_r, delay[2*i]);
1166 w_1 = window[128+2*i];
1167 w_2 = window[127-2*i];
1168 - data[128+2*i] = delay[127-2*i] * w_2 + a_i * w_1 + bias;
1169 - data[127-2*i] = delay[127-2*i] * w_1 - a_i * w_2 + bias;
1170 + BUTTERFLY_B (data[128+2*i], data[127-2*i], w_1, w_2, a_i, delay[127-2*i]);
1171 delay[127-2*i] = c_r;
1173 w_1 = window[2*i+1];
1174 w_2 = window[254-2*i];
1175 - data[2*i+1] = delay[2*i+1] * w_2 - b_i * w_1 + bias;
1176 - data[254-2*i] = delay[2*i+1] * w_1 + b_i * w_2 + bias;
1177 + BUTTERFLY_B (data[254-2*i], data[2*i+1], w_2, w_1, b_i, delay[2*i+1]);
1180 w_1 = window[129+2*i];
1181 w_2 = window[126-2*i];
1182 - data[129+2*i] = delay[126-2*i] * w_2 + b_r * w_1 + bias;
1183 - data[126-2*i] = delay[126-2*i] * w_1 - b_r * w_2 + bias;
1184 + BUTTERFLY_B (data[129+2*i], data[126-2*i], w_1, w_2, b_r, delay[126-2*i]);
1185 delay[126-2*i] = d_i;
1190 static double besselI0 (double x)
1193 @@ -361,66 +356,118 @@
1199 void a52_imdct_init (uint32_t mm_accel)
1205 + double local_imdct_window[256];*/
1207 /* compute imdct window - kaiser-bessel derived window, alpha = 5.0 */
1210 for (i = 0; i < 256; i++) {
1211 sum += besselI0 (i * (256 - i) * (5 * M_PI / 256) * (5 * M_PI / 256));
1212 - a52_imdct_window[i] = sum;
1213 + local_imdct_window[i] = sum;
1216 - for (i = 0; i < 256; i++)
1217 - a52_imdct_window[i] = sqrt (a52_imdct_window[i] / sum);
1219 + /* for (i = 0; i < 256; i++)
1220 + a52_imdct_window[i] = SAMPLE (sqrt (local_imdct_window[i] / sum));
1222 + printf("static sample_t a52_imdct_window[256]={");
1223 + for (i=0;i<256;i++) {
1224 + if ((i % 16)==0) { printf("\n"); }
1225 + printf("%d,",a52_imdct_window[i]);
1230 + /* for (i = 0; i < 3; i++)
1231 + roots16[i] = SAMPLE (cos ((M_PI / 8) * (i + 1)));
1233 - for (i = 0; i < 3; i++)
1234 - roots16[i] = cos ((M_PI / 8) * (i + 1));
1235 + printf("static sample_t roots16[3]={%d,%d,%d};\n\n",roots16[0],roots16[1],roots16[2]);
1237 for (i = 0; i < 7; i++)
1238 - roots32[i] = cos ((M_PI / 16) * (i + 1));
1239 + roots32[i] = SAMPLE (cos ((M_PI / 16) * (i + 1)));
1241 + printf("static sample_t roots32[7]={");
1242 + for (i=0;i<7;i++) { printf("%d%s",roots32[i],(i < 6 ? "," : "")); }
1245 for (i = 0; i < 15; i++)
1246 - roots64[i] = cos ((M_PI / 32) * (i + 1));
1247 + roots64[i] = SAMPLE (cos ((M_PI / 32) * (i + 1)));
1249 + printf("static sample_t roots64[15]={");
1250 + for (i=0;i<15;i++) { printf("%d%s",roots64[i],(i < 14 ? "," : "")); }
1253 for (i = 0; i < 31; i++)
1254 - roots128[i] = cos ((M_PI / 64) * (i + 1));
1255 + roots128[i] = SAMPLE (cos ((M_PI / 64) * (i + 1)));
1257 + printf("static sample_t roots128[31]={");
1258 + for (i=0;i<31;i++) { printf("%d%s",roots128[i],(i < 30 ? "," : "")); }
1262 for (i = 0; i < 64; i++) {
1263 k = fftorder[i] / 2 + 64;
1264 - pre1[i].real = cos ((M_PI / 256) * (k - 0.25));
1265 - pre1[i].imag = sin ((M_PI / 256) * (k - 0.25));
1266 + pre1[i].real = SAMPLE (cos ((M_PI / 256) * (k - 0.25)));
1267 + pre1[i].imag = SAMPLE (sin ((M_PI / 256) * (k - 0.25)));
1270 for (i = 64; i < 128; i++) {
1271 k = fftorder[i] / 2 + 64;
1272 - pre1[i].real = -cos ((M_PI / 256) * (k - 0.25));
1273 - pre1[i].imag = -sin ((M_PI / 256) * (k - 0.25));
1274 + pre1[i].real = SAMPLE (-cos ((M_PI / 256) * (k - 0.25)));
1275 + pre1[i].imag = SAMPLE (-sin ((M_PI / 256) * (k - 0.25)));
1278 + printf("static complex_t pre1[128]={");
1279 + for (i=0;i<128;i++) { printf("{%d,%d}%s",pre1[i].real,pre1[i].imag,(i < 127 ? "," : "")); }
1283 for (i = 0; i < 64; i++) {
1284 - post1[i].real = cos ((M_PI / 256) * (i + 0.5));
1285 - post1[i].imag = sin ((M_PI / 256) * (i + 0.5));
1286 + post1[i].real = SAMPLE (cos ((M_PI / 256) * (i + 0.5)));
1287 + post1[i].imag = SAMPLE (sin ((M_PI / 256) * (i + 0.5)));
1290 + printf("static complex_t post1[64]={");
1291 + for (i=0;i<64;i++) { printf("{%d,%d}%s",post1[i].real,post1[i].imag,(i < 63 ? "," : "")); }
1296 for (i = 0; i < 64; i++) {
1297 k = fftorder[i] / 4;
1298 - pre2[i].real = cos ((M_PI / 128) * (k - 0.25));
1299 - pre2[i].imag = sin ((M_PI / 128) * (k - 0.25));
1300 + pre2[i].real = SAMPLE (cos ((M_PI / 128) * (k - 0.25)));
1301 + pre2[i].imag = SAMPLE (sin ((M_PI / 128) * (k - 0.25)));
1304 + printf("static complex_t pre2[64]={");
1305 + for (i=0;i<64;i++) { printf("{%d,%d}%s",pre2[i].real,pre2[i].imag,(i < 63 ? "," : "")); }
1308 for (i = 0; i < 32; i++) {
1309 - post2[i].real = cos ((M_PI / 128) * (i + 0.5));
1310 - post2[i].imag = sin ((M_PI / 128) * (i + 0.5));
1311 + post2[i].real = SAMPLE (cos ((M_PI / 128) * (i + 0.5)));
1312 + post2[i].imag = SAMPLE (sin ((M_PI / 128) * (i + 0.5)));
1315 + printf("static complex_t post2[32]={");
1316 + for (i=0;i<32;i++) { printf("{%d,%d}%s",post2[i].real,post2[i].imag,(i < 31 ? "," : "")); }
1320 #ifdef LIBA52_DJBFFT
1321 if (mm_accel & MM_ACCEL_DJBFFT) {
1322 +#ifndef LIBA52_DOUBLE
1323 ifft128 = (void (*) (complex_t *)) fftc4_un128;
1324 ifft64 = (void (*) (complex_t *)) fftc4_un64;
1326 + ifft128 = (void (*) (complex_t *)) fftc8_un128;
1327 + ifft64 = (void (*) (complex_t *)) fftc8_un64;
1332 diff -ruN a52dec.orig/liba52/imdct_lookups.h a52dec/liba52/imdct_lookups.h
1333 --- a52dec.orig/liba52/imdct_lookups.h 1970-01-01 01:00:00.000000000 +0100
1334 +++ a52dec/liba52/imdct_lookups.h 2012-11-13 17:27:31.150370945 +0100
1336 +static sample_t a52_imdct_window[256]IDATA_ATTR={
1337 + 146020,261886,393529,545197,719447,918478,1144416,1399394,1685589,2005234,2360623,2754115,3188134,3665170,4187773,4758556, 5380193,6055411,6786995,7577779,8430645,9348521,10334375,11391212,12522071,13730020,15018150,16389576,17847424,19394833,21034947,22770912, 24605865,26542938,28585242,30735872,32997891,35374332,37868188,40482408,43219889,46083473,49075937,52199993,55458273,58853331,62387636,66063559, 69883377,73849259,77963266,82227341,86643307,91212859,95937560,100818835,105857968,111056092,116414194,121933098,127613474,133455822,139460477,145627601, 151957182,158449029,165102772,171917855,178893540,186028900,193322822,200774000,208380940,216141958,224055176,232118527,240329753,248686407,257185854,265825270, 274601649,283511802,292552357,301719768,311010314,320420105,329945084,339581031,349323572,359168178,369110174,379144743,389266934,399471665,409753732,420107815, 430528483,441010205,451547355,462134219,472765003,483433845,494134818,504861939,515609181,526370480,537139740,547910849,558677680,569434108,580174011,590891284, 601579849,612233658,622846709,633413050,643926788,654382103,664773249,675094567,685340494,695505569,705584441,715571877,725462772,735252152,744935184,754507184, 763963620,773300119,782512477,791596659,800548807,809365245,818042484,826577226,834966364,843206992,851296404,859232096,867011771,874633340,882094922,889394844, 896531647,903504079,910311101,916951881,923425798,929732436,935871584,941843233,947647575,953284997,958756080,964061593,969202490,974179906,978995149,983649698, 988145195,992483442,996666390,1000696136,1004574919,1008305104,1011889185,1015329772,1018629583,1021791439,1024818257,1027713038,1030478862,1033118881,1035636308,1038034411, 1040316504,1042485942,1044546109,1046500412,1048352275,1050105129,1051762405,1053327531,1054803917,1056194958,1057504020,1058734435,1059889501,1060972468,1061986539,1062934861, 1063820523,1064646551,1065415903,1066131467,1066796055,1067412403,1067983168,1068510924,1068998160,1069447282,1069860607,1070240366,1070588702,1070907668,1071199230,1071465266, 1071707567,1071927836,1072127692,1072308670,1072472221,1072619716,1072752449,1072871635,1072978415,1073073858,1073158963,1073234663,1073301826,1073361257,1073413702,1073459852, 1073500344,1073535763,1073566646,1073593486,1073616731,1073636791,1073654036,1073668804,1073681398,1073692090,1073701126,1073708726,1073715084,1073720373,1073724748,1073728344, 1073731279,1073733657,1073735568,1073737090,1073738291,1073739229,1073739951,1073740500,1073740912,1073741214,1073741431,1073741582,1073741685,1073741751,1073741792,1073741814
1340 +static sample_t roots16[3]IDATA_ATTR={992008094,759250124,410903206};
1341 +static sample_t roots32[7]IDATA_ATTR={1053110175,992008094,892783698,759250124,596538995,410903206,209476638};
1342 +static sample_t roots64[15]IDATA_ATTR={1068571463,1053110175,1027506861,992008094,946955747,892783698,830013654,759250124,681174602,596538995,506158392,410903206,311690798,209476638,105245103};
1343 +static sample_t roots128[31]IDATA_ATTR={1072448454,1068571463,1062120190,1053110175,1041563127,1027506861,1010975241,992008094,970651112,946955747,920979082,892783698,862437519,830013654,795590212,759250124,721080937,681174602,639627257,596538995,552013618,506158392,459083785,410903206,361732725,311690798,260897981,209476638,157550647,105245103,52686014};
1345 +static complex_t pre1[128]IDATA_ATTR={{761575898,756917205},{3294193,1073736770},{413944710,990742792},{-407857834,993264059},{599275209,890949340},{-206244755,1053747885},{-593797166,894609652},{212706548,1052462554},{683717842,827919933},{-101966276,1068889322},{314841678,1026545772},{-503250790,948504162},{-678624950,832099562},{108522938,1068243547},{509061229,945398418},{-308536985,1028458279},{723518379,793374223},{-49395540,1072605046},{364832651,1009860703},{-456103709,972054993},{554836544,919281193},{-257701283,1042358649},{-636978326,864395809},{160808444,1061631832},{-718636707,797798713},{55975991,1072281769},{462059540,969238095},{-358629394,1012080264},{642270168,860471112},{-154291366,1062598550},{-549185496,922668301},{264092224,1040757801},{742770847,775379244},{-23057618,1073494224},{389505993,1000603111},{-432110916,982955574},{577229727,905387953},{-232042906,1048369016},{-615573145,879767700},{186813761,1057365652},{663193747,844449855},{-128167423,1066065014},{289554159,1033963197},{-526376678,935868098},{-698841306,815194659},{82274244,1070585098},{485706670,957606670},{-333683689,1020576650},{-737999227,779922204},{29644020,1073332537},{438134083,980285687},{-383359075,1002974238},{620959710,875974053},{-180322371,1058492015},{-571663505,908912724},{238471209,1046925492},{703830091,810891303},{-75703709,1071069770},{339939548,1018509994},{-479821763,960568883},{-657999815,848503239},{134706262,1065258526},{532109148,932620694},{-283204430,1035720404},{-752230014,-766205918},{9882456,-1073696345},{-401755603,-995747929},{420016001,-988184225},{-588296766,-898236282},{219160333,-1051137599},{604730690,-887255485},{-199775197,-1054993542},{-673506508,-836247862},{115075515,-1067557553},{-302220675,-1030332066},{514852501,-942257080},{688784992,-823709134},{-95405775,-1069494853},{-497421404,-951574195},{321134518,-1024594615},{-713727978,-802193167},{62554335,-1071918121},{-352412636,-1014261720},{467997975,-966384705},{-543513771,-926020671},{270473222,-1039117770},{647537829,-856514018},{-147768480,-1063525261},{728372812,-788919863},{-42813229,-1072887940},{-450130706,-974835294},{371022172,-1007603122},{-631662502,-868287963},{167319467,-1060625145},{560466703,-915859475},{-251300639,-1043920252},{747514502,-770807091},{-16470347,-1073615495},{-426071479,-985588453},{395638246,-998194311},{-610163404,-883528225},{193298118,-1056199480},{582774217,-901829094},{-225605866,-1049773069},{-693826210,-819467323},{88841682,-1070060119},{-327415267,-1022604883},{491573291,-954608403},{668362709,-840364678},{-121623758,-1066831367},{-520624390,-939080267},{295892987,-1032167062},{-733199822,-784435800},{36229307,-1073130440},{-377197724,-1005307605},{444140755,-977578893},{-566075760,-912403275},{244890534,-1045442552},{626322896,-872147426},{-173824191,-1059578527},{708792377,-806557418},{-69130323,-1071514117},{-473918791,-963494932},{346182609,-1016404991},{-652781111,-852524677},{141240030,-1064411930},{537821584,-929338177},{-276844037,-1037438616}};
1347 +static complex_t post1[64]IDATA_ATTR={{1073721611,6588355},{1073559912,19764075},{1073236539,32936819},{1072751541,46104602},{1072104991,59265442},{1071296985,72417357},{1070327646,85558366},{1069197119,98686490},{1067905576,111799753},{1066453209,124896178},{1064840239,137973795},{1063066908,151030634},{1061133483,164064728},{1059040255,177074114},{1056787539,190056834},{1054375675,203010932},{1051805026,215934457},{1049075979,228825463},{1046188946,241682009},{1043144359,254502159},{1039942680,267283981},{1036584388,280025551},{1033069991,292724951},{1029400017,305380267},{1025575020,317989594},{1021595574,330551034},{1017462280,343062693},{1013175760,355522688},{1008736660,367929143},{1004145647,380280189},{999403414,392573967},{994510674,404808624},{989468165,416982318},{984276645,429093217},{978936897,441139495},{973449725,453119340},{967815955,465030947},{962036435,476872521},{956112036,488642280},{950043650,500338452},{943832191,511959274},{937478594,523502998},{930983817,534967883},{924348836,546352205},{917574653,557654248},{910662286,568872310},{903612776,580004702},{896427186,591049747},{889106597,602005783},{881652112,612871159},{874064853,623644238},{866345963,634323399},{858496605,644907034},{850517961,655393547},{842411231,665781361},{834177638,676068911},{825818420,686254647},{817334837,696337035},{808728167,706314558},{799999705,716185713},{791150766,725949012},{782182683,735602987},{773096806,745146182},{763894503,754577161}};
1349 +static complex_t pre2[64]IDATA_ATTR={{1073721611,-6588355},{763894503,754577161},{994510674,404808624},{416982318,989468165},{1054375675,203010932},{602005783,889106597},{215934457,1051805026},{896427186,591049747},{1069197119,98686490},{686254647,825818420},{950043650,500338452},{317989594,1025575020},{111799753,1067905576},{834177638,676068911},{1029400017,305380267},{511959274,943832191},{1072751541,46104602},{725949012,791150766},{973449725,453119340},{367929143,1008736660},{1043144359,254502159},{557654248,917574653},{164064728,1061133483},{866345963,634323399},{59265442,1072104991},{799999705,716185713},{1013175760,355522688},{465030947,967815955},{1063066908,151030634},{644907034,858496605},{267283981,1039942680},{924348836,546352205},{1073559912,19764075},{745146182,773096806},{984276645,429093217},{392573967,999403414},{1049075979,228825463},{580004702,903612776},{190056834,1056787539},{881652112,612871159},{1066453209,124896178},{665781361,842411231},{937478594,523502998},{292724951,1033069991},{85558366,1070327646},{817334837,696337035},{1021595574,330551034},{488642280,956112036},{32936819,1073236539},{782182683,735602987},{1004145647,380280189},{441139495,978936897},{1059040255,177074114},{623644238,874064853},{241682009,1046188946},{910662286,568872310},{1071296985,72417357},{706314558,808728167},{962036435,476872521},{343062693,1017462280},{137973795,1064840239},{850517961,655393547},{1036584388,280025551},{534967883,930983817}};
1350 +static complex_t post2[32]IDATA_ATTR={{1073660973,13176463},{1073014239,39521454},{1071721163,65842639},{1069782521,92124162},{1067199482,118350193},{1063973603,144504935},{1060106825,170572632},{1055601479,196537583},{1050460278,222384146},{1044686318,248096754},{1038283079,273659918},{1031254417,299058239},{1023604566,324276418},{1015338134,349299266},{1006460100,374111709},{996975812,398698801},{986890983,423045731},{976211688,447137835},{964944359,470960600},{953095785,494499675},{940673100,517740882},{927683790,540670222},{914135677,563273882},{900036924,585538247},{885396022,607449906},{870221790,628995659},{854523369,650162530},{838310215,670937766},{821592095,691308855},{804379078,711263525},{786681534,730789756},{768510121,749875787}};
1351 diff -ruN a52dec.orig/liba52/parse.c a52dec/liba52/parse.c
1352 --- a52dec.orig/liba52/parse.c 2012-11-13 17:25:33.438758556 +0100
1353 +++ a52dec/liba52/parse.c 2012-11-13 17:27:31.150370945 +0100
1357 - * Copyright (C) 2000-2002 Michel Lespinasse <walken@zoy.org>
1358 + * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org>
1359 * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
1361 * This file is part of a52dec, a free ATSC A-52 stream decoder.
1363 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
1366 -#include "config.h"
1367 +#include "config-a52.h"
1369 -#include <stdlib.h>
1371 #include <inttypes.h>
1374 #include "bitstream.h"
1377 -#ifdef HAVE_MEMALIGN
1378 +#if defined(HAVE_MEMALIGN) && !defined(__cplusplus)
1379 /* some systems have memalign() but no declaration for it */
1380 void * memalign (size_t align, size_t size);
1389 + quantizer_t q1[2];
1390 + quantizer_t q2[2];
1398 +static a52_state_t istate IBSS_ATTR;
1399 +static sample_t isamples[256*12] IBSS_ATTR;
1401 static uint8_t halfrate[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3};
1404 a52_state_t * state;
1407 - state = malloc (sizeof (a52_state_t));
1408 + #if defined(CPU_COLDFIRE)
1409 + coldfire_set_macsr(EMAC_FRACTIONAL | EMAC_ROUND | EMAC_SATURATE);
1412 + this needs to come back if we ever want two decoder instances
1413 + simultenously. NOTE, you also need to remove comments in a52_free.
1414 + state = (a52_state_t *) malloc (sizeof (a52_state_t));
1418 - state->samples = memalign (16, 256 * 12 * sizeof (sample_t));
1419 + state->samples = (sample_t *) memalign (16, 256 * 12 * sizeof (sample_t));
1420 if (state->samples == NULL) {
1427 + state->samples = isamples;
1428 for (i = 0; i < 256 * 12; i++)
1429 state->samples[i] = 0;
1431 @@ -129,10 +140,12 @@
1434 int a52_frame (a52_state_t * state, uint8_t * buf, int * flags,
1435 - sample_t * level, sample_t bias)
1436 + level_t * level, sample_t bias)
1438 - static sample_t clev[4] = {LEVEL_3DB, LEVEL_45DB, LEVEL_6DB, LEVEL_45DB};
1439 - static sample_t slev[4] = {LEVEL_3DB, LEVEL_6DB, 0, LEVEL_6DB};
1440 + static level_t clev[4] = { LEVEL (LEVEL_3DB), LEVEL (LEVEL_45DB),
1441 + LEVEL (LEVEL_6DB), LEVEL (LEVEL_45DB) };
1442 + static level_t slev[4] = { LEVEL (LEVEL_3DB), LEVEL (LEVEL_6DB),
1443 + 0, LEVEL (LEVEL_6DB) };
1448 if ((acmod == 2) && (bitstream_get (state, 2) == 2)) /* dsurmod */
1451 + state->clev = state->slev = 0;
1453 if ((acmod & 1) && (acmod != 1))
1454 state->clev = clev[bitstream_get (state, 2)]; /* cmixlev */
1457 state->output |= A52_LFE;
1458 *flags = state->output;
1459 /* the 2* compensates for differences in imdct */
1460 - state->dynrng = state->level = 2 * *level;
1461 + state->dynrng = state->level = MUL_C (*level, 2);
1464 state->dynrngcall = NULL;
1468 void a52_dynrng (a52_state_t * state,
1469 - sample_t (* call) (sample_t, void *), void * data)
1470 + level_t (* call) (level_t, void *), void * data)
1474 @@ -311,20 +326,38 @@
1476 state->lfsr_state = (uint16_t) nstate;
1479 + return (3 * nstate) >> 2;
1482 +#ifndef LIBA52_FIXED
1483 +#define COEFF(c,t,l,s,e) (c) = (t) * (s)[e]
1485 +#define COEFF(c,_t,_l,s,e) do { \
1486 + quantizer_t t = (_t); \
1487 + level_t l = (_l); \
1488 + int shift = e - 5; \
1489 + sample_t tmp = t * (l >> 16) + ((t * (l & 0xffff)) >> 16); \
1491 + (c) = tmp >> shift; \
1493 + (c) = tmp << -shift; \
1497 static void coeff_get (a52_state_t * state, sample_t * coeff,
1498 - expbap_t * expbap, quantizer_t * quantizer,
1499 - sample_t level, int dither, int end)
1500 + expbap_t * expbap, quantizer_set_t * quant,
1501 + level_t level, int dither, int end)
1507 +#ifndef LIBA52_FIXED
1508 sample_t factor[25];
1510 for (i = 0; i <= 24; i++)
1511 factor[i] = scale_factor[i] * level;
1520 - coeff[i] = dither_gen (state) * LEVEL_3DB * factor[exp[i]];
1521 + COEFF (coeff[i], dither_gen (state), level, factor, exp[i]);
1525 @@ -344,76 +377,80 @@
1529 - if (quantizer->q1_ptr >= 0) {
1530 - coeff[i] = quantizer->q1[quantizer->q1_ptr--] * factor[exp[i]];
1531 + if (quant->q1_ptr >= 0) {
1532 + COEFF (coeff[i], quant->q1[quant->q1_ptr--], level,
1538 code = bitstream_get (state, 5);
1540 - quantizer->q1_ptr = 1;
1541 - quantizer->q1[0] = q_1_2[code];
1542 - quantizer->q1[1] = q_1_1[code];
1543 - coeff[i] = q_1_0[code] * factor[exp[i]];
1544 + quant->q1_ptr = 1;
1545 + quant->q1[0] = q_1_2[code];
1546 + quant->q1[1] = q_1_1[code];
1547 + COEFF (coeff[i], q_1_0[code], level, factor, exp[i]);
1552 - if (quantizer->q2_ptr >= 0) {
1553 - coeff[i] = quantizer->q2[quantizer->q2_ptr--] * factor[exp[i]];
1554 + if (quant->q2_ptr >= 0) {
1555 + COEFF (coeff[i], quant->q2[quant->q2_ptr--], level,
1561 code = bitstream_get (state, 7);
1563 - quantizer->q2_ptr = 1;
1564 - quantizer->q2[0] = q_2_2[code];
1565 - quantizer->q2[1] = q_2_1[code];
1566 - coeff[i] = q_2_0[code] * factor[exp[i]];
1567 + quant->q2_ptr = 1;
1568 + quant->q2[0] = q_2_2[code];
1569 + quant->q2[1] = q_2_1[code];
1570 + COEFF (coeff[i], q_2_0[code], level, factor, exp[i]);
1575 - coeff[i] = q_3[bitstream_get (state, 3)] * factor[exp[i]];
1576 + COEFF (coeff[i], q_3[bitstream_get (state, 3)], level,
1581 - if (quantizer->q4_ptr == 0) {
1582 - quantizer->q4_ptr = -1;
1583 - coeff[i] = quantizer->q4 * factor[exp[i]];
1584 + if (quant->q4_ptr == 0) {
1585 + quant->q4_ptr = -1;
1586 + COEFF (coeff[i], quant->q4, level, factor, exp[i]);
1591 code = bitstream_get (state, 7);
1593 - quantizer->q4_ptr = 0;
1594 - quantizer->q4 = q_4_1[code];
1595 - coeff[i] = q_4_0[code] * factor[exp[i]];
1596 + quant->q4_ptr = 0;
1597 + quant->q4 = q_4_1[code];
1598 + COEFF (coeff[i], q_4_0[code], level, factor, exp[i]);
1603 - coeff[i] = q_5[bitstream_get (state, 4)] * factor[exp[i]];
1604 + COEFF (coeff[i], q_5[bitstream_get (state, 4)], level,
1609 - coeff[i] = ((bitstream_get_2 (state, bapi) << (16 - bapi)) *
1611 + COEFF (coeff[i], bitstream_get_2 (state, bapi) << (16 - bapi),
1612 + level, factor, exp[i]);
1617 static void coeff_get_coupling (a52_state_t * state, int nfchans,
1618 - sample_t * coeff, sample_t (* samples)[256],
1619 - quantizer_t * quantizer, uint8_t dithflag[5])
1620 + level_t * coeff, sample_t (* samples)[256],
1621 + quantizer_set_t * quant, uint8_t dithflag[5])
1623 int cplbndstrc, bnd, i, i_end, ch;
1626 - sample_t cplco[5];
1629 exp = state->cpl_expbap.exp;
1630 bap = state->cpl_expbap.bap;
1631 @@ -428,22 +465,26 @@
1634 for (ch = 0; ch < nfchans; ch++)
1635 - cplco[ch] = state->cplco[ch][bnd] * coeff[ch];
1636 + cplco[ch] = MUL_L (state->cplco[ch][bnd], coeff[ch]);
1640 - sample_t cplcoeff;
1641 + quantizer_t cplcoeff;
1647 - cplcoeff = LEVEL_3DB * scale_factor[exp[i]];
1648 for (ch = 0; ch < nfchans; ch++)
1649 if ((state->chincpl >> ch) & 1) {
1651 - samples[ch][i] = (cplcoeff * cplco[ch] *
1652 - dither_gen (state));
1653 +#ifndef LIBA52_FIXED
1654 + samples[ch][i] = (scale_factor[exp[i]] *
1655 + cplco[ch] * dither_gen (state));
1657 + COEFF (samples[ch][i], dither_gen (state),
1658 + cplco[ch], scale_factor, exp[i]);
1663 @@ -451,33 +492,33 @@
1667 - if (quantizer->q1_ptr >= 0) {
1668 - cplcoeff = quantizer->q1[quantizer->q1_ptr--];
1669 + if (quant->q1_ptr >= 0) {
1670 + cplcoeff = quant->q1[quant->q1_ptr--];
1675 code = bitstream_get (state, 5);
1677 - quantizer->q1_ptr = 1;
1678 - quantizer->q1[0] = q_1_2[code];
1679 - quantizer->q1[1] = q_1_1[code];
1680 + quant->q1_ptr = 1;
1681 + quant->q1[0] = q_1_2[code];
1682 + quant->q1[1] = q_1_1[code];
1683 cplcoeff = q_1_0[code];
1688 - if (quantizer->q2_ptr >= 0) {
1689 - cplcoeff = quantizer->q2[quantizer->q2_ptr--];
1690 + if (quant->q2_ptr >= 0) {
1691 + cplcoeff = quant->q2[quant->q2_ptr--];
1696 code = bitstream_get (state, 7);
1698 - quantizer->q2_ptr = 1;
1699 - quantizer->q2[0] = q_2_2[code];
1700 - quantizer->q2[1] = q_2_1[code];
1701 + quant->q2_ptr = 1;
1702 + quant->q2[0] = q_2_2[code];
1703 + quant->q2[1] = q_2_1[code];
1704 cplcoeff = q_2_0[code];
1707 @@ -487,17 +528,17 @@
1711 - if (quantizer->q4_ptr == 0) {
1712 - quantizer->q4_ptr = -1;
1713 - cplcoeff = quantizer->q4;
1714 + if (quant->q4_ptr == 0) {
1715 + quant->q4_ptr = -1;
1716 + cplcoeff = quant->q4;
1721 code = bitstream_get (state, 7);
1723 - quantizer->q4_ptr = 0;
1724 - quantizer->q4 = q_4_1[code];
1725 + quant->q4_ptr = 0;
1726 + quant->q4 = q_4_1[code];
1727 cplcoeff = q_4_0[code];
1730 @@ -509,11 +550,17 @@
1732 cplcoeff = bitstream_get_2 (state, bapi) << (16 - bapi);
1735 +#ifndef LIBA52_FIXED
1736 cplcoeff *= scale_factor[exp[i]];
1738 for (ch = 0; ch < nfchans; ch++)
1739 - if ((state->chincpl >> ch) & 1)
1740 + if ((state->chincpl >> ch) & 1)
1741 +#ifndef LIBA52_FIXED
1742 samples[ch][i] = cplcoeff * cplco[ch];
1744 + COEFF (samples[ch][i], cplcoeff, cplco[ch],
1745 + scale_factor, exp[i]);
1751 int i, nfchans, chaninfo;
1752 uint8_t cplexpstr, chexpstr[5], lfeexpstr, do_bit_alloc, done_cpl;
1753 uint8_t blksw[5], dithflag[5];
1754 - sample_t coeff[5];
1757 - quantizer_t quantizer;
1758 + quantizer_set_t quant;
1761 nfchans = nfchans_tbl[state->acmod];
1762 @@ -546,13 +593,17 @@
1764 dynrng = bitstream_get_2 (state, 8);
1765 if (state->dynrnge) {
1769 +#if !defined(LIBA52_FIXED)
1770 range = ((((dynrng & 0x1f) | 0x20) << 13) *
1771 scale_factor[3 - (dynrng >> 5)]);
1773 + range = ((dynrng & 0x1f) | 0x20) << (21 + (dynrng >> 5));
1775 if (state->dynrngcall)
1776 range = state->dynrngcall (range, state->dynrngdata);
1777 - state->dynrng = state->level * range;
1778 + state->dynrng = MUL_L (state->level, range);
1781 } while (chaninfo--);
1782 @@ -611,8 +662,13 @@
1785 cplcomant = (cplcomant | 0x10) << 13;
1786 +#ifndef LIBA52_FIXED
1787 state->cplco[i][j] =
1788 cplcomant * scale_factor[cplcoexp + mstrcplco];
1790 + state->cplco[i][j] = (cplcomant << 11) >> (cplcoexp + mstrcplco);
1795 if ((state->acmod == 2) && state->phsflginu && cplcoe)
1796 @@ -691,11 +747,11 @@
1799 if (bitstream_get (state, 1)) { /* baie */
1800 - do_bit_alloc = -1;
1801 + do_bit_alloc = 127;
1802 state->bai = bitstream_get (state, 11);
1804 if (bitstream_get (state, 1)) { /* snroffste */
1805 - do_bit_alloc = -1;
1806 + do_bit_alloc = 127;
1807 state->csnroffst = bitstream_get (state, 6);
1808 if (state->chincpl) /* cplinu */
1809 state->cplba.bai = bitstream_get (state, 7);
1813 if (bitstream_get (state, 1)) { /* deltbaie */
1814 - do_bit_alloc = -1;
1815 + do_bit_alloc = 127;
1816 if (state->chincpl) /* cplinu */
1817 state->cplba.deltbae = bitstream_get (state, 2);
1818 for (i = 0; i < nfchans; i++)
1819 @@ -765,20 +821,20 @@
1820 chanbias = a52_downmix_coeff (coeff, state->acmod, state->output,
1821 state->dynrng, state->clev, state->slev);
1823 - quantizer.q1_ptr = quantizer.q2_ptr = quantizer.q4_ptr = -1;
1824 + quant.q1_ptr = quant.q2_ptr = quant.q4_ptr = -1;
1827 for (i = 0; i < nfchans; i++) {
1830 - coeff_get (state, samples + 256 * i, state->fbw_expbap +i, &quantizer,
1831 + coeff_get (state, samples + 256 * i, state->fbw_expbap +i, &quant,
1832 coeff[i], dithflag[i], state->endmant[i]);
1834 if ((state->chincpl >> i) & 1) {
1837 coeff_get_coupling (state, nfchans, coeff,
1838 - (sample_t (*)[256])samples, &quantizer,
1839 + (sample_t (*)[256])samples, &quant,
1842 j = state->cplendmant;
1843 @@ -821,14 +877,14 @@
1846 if (state->output & A52_LFE) {
1847 - coeff_get (state, samples - 256, &state->lfe_expbap, &quantizer,
1848 + coeff_get (state, samples - 256, &state->lfe_expbap, &quant,
1849 state->dynrng, 0, 7);
1850 for (i = 7; i < 256; i++)
1851 (samples-256)[i] = 0;
1852 a52_imdct_512 (samples - 256, samples + 1536 - 256, state->bias);
1854 /* just skip the LFE coefficients */
1855 - coeff_get (state, samples + 1280, &state->lfe_expbap, &quantizer,
1856 + coeff_get (state, samples + 1280, &state->lfe_expbap, &quant,
1862 void a52_free (a52_state_t * state)
1866 free (state->samples);
1870 diff -ruN a52dec.orig/liba52/tables.h a52dec/liba52/tables.h
1871 --- a52dec.orig/liba52/tables.h 2012-11-13 17:25:33.438758556 +0100
1872 +++ a52dec/liba52/tables.h 2012-11-13 17:27:31.150370945 +0100
1876 - * Copyright (C) 2000-2002 Michel Lespinasse <walken@zoy.org>
1877 + * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org>
1878 * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
1880 * This file is part of a52dec, a free ATSC A-52 stream decoder.
1885 -#define Q0 ((-2 << 15) / 3.0)
1887 -#define Q2 ((2 << 15) / 3.0)
1889 -static const sample_t q_1_0[32] = {
1890 - Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,
1891 - Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,
1892 - Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,
1896 -static const sample_t q_1_1[32] = {
1897 - Q0,Q0,Q0,Q1,Q1,Q1,Q2,Q2,Q2,
1898 - Q0,Q0,Q0,Q1,Q1,Q1,Q2,Q2,Q2,
1899 - Q0,Q0,Q0,Q1,Q1,Q1,Q2,Q2,Q2,
1903 -static const sample_t q_1_2[32] = {
1904 - Q0,Q1,Q2,Q0,Q1,Q2,Q0,Q1,Q2,
1905 - Q0,Q1,Q2,Q0,Q1,Q2,Q0,Q1,Q2,
1906 - Q0,Q1,Q2,Q0,Q1,Q2,Q0,Q1,Q2,
1908 +#define Q(x) ROUND (32768.0 * x)
1910 +#define Q0 Q (-2/3)
1914 +static const quantizer_t q_1_0[32] = {
1915 + Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0,
1916 + Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1,
1917 + Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2,
1921 +static const quantizer_t q_1_1[32] = {
1922 + Q0, Q0, Q0, Q1, Q1, Q1, Q2, Q2, Q2,
1923 + Q0, Q0, Q0, Q1, Q1, Q1, Q2, Q2, Q2,
1924 + Q0, Q0, Q0, Q1, Q1, Q1, Q2, Q2, Q2,
1928 +static const quantizer_t q_1_2[32] = {
1929 + Q0, Q1, Q2, Q0, Q1, Q2, Q0, Q1, Q2,
1930 + Q0, Q1, Q2, Q0, Q1, Q2, Q0, Q1, Q2,
1931 + Q0, Q1, Q2, Q0, Q1, Q2, Q0, Q1, Q2,
1939 -#define Q0 ((-4 << 15) / 5.0)
1940 -#define Q1 ((-2 << 15) / 5.0)
1942 -#define Q3 ((2 << 15) / 5.0)
1943 -#define Q4 ((4 << 15) / 5.0)
1944 +#define Q0 Q (-4/5)
1945 +#define Q1 Q (-2/5)
1950 -static const sample_t q_2_0[128] = {
1951 +static const quantizer_t q_2_0[128] = {
1952 Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,Q0,
1953 Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,Q1,
1954 Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,Q2,
1959 -static const sample_t q_2_1[128] = {
1960 +static const quantizer_t q_2_1[128] = {
1961 Q0,Q0,Q0,Q0,Q0,Q1,Q1,Q1,Q1,Q1,Q2,Q2,Q2,Q2,Q2,Q3,Q3,Q3,Q3,Q3,Q4,Q4,Q4,Q4,Q4,
1962 Q0,Q0,Q0,Q0,Q0,Q1,Q1,Q1,Q1,Q1,Q2,Q2,Q2,Q2,Q2,Q3,Q3,Q3,Q3,Q3,Q4,Q4,Q4,Q4,Q4,
1963 Q0,Q0,Q0,Q0,Q0,Q1,Q1,Q1,Q1,Q1,Q2,Q2,Q2,Q2,Q2,Q3,Q3,Q3,Q3,Q3,Q4,Q4,Q4,Q4,Q4,
1968 -static const sample_t q_2_2[128] = {
1969 +static const quantizer_t q_2_2[128] = {
1970 Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,
1971 Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,
1972 Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,Q0,Q1,Q2,Q3,Q4,
1973 @@ -114,24 +116,23 @@
1977 -static const sample_t q_3[8] = {
1978 - (-6 << 15)/7.0, (-4 << 15)/7.0, (-2 << 15)/7.0, 0,
1979 - ( 2 << 15)/7.0, ( 4 << 15)/7.0, ( 6 << 15)/7.0, 0
1982 -#define Q0 ((-10 << 15) / 11.0)
1983 -#define Q1 ((-8 << 15) / 11.0)
1984 -#define Q2 ((-6 << 15) / 11.0)
1985 -#define Q3 ((-4 << 15) / 11.0)
1986 -#define Q4 ((-2 << 15) / 11.0)
1988 -#define Q6 ((2 << 15) / 11.0)
1989 -#define Q7 ((4 << 15) / 11.0)
1990 -#define Q8 ((6 << 15) / 11.0)
1991 -#define Q9 ((8 << 15) / 11.0)
1992 -#define QA ((10 << 15) / 11.0)
1993 +static const quantizer_t q_3[8] = {
1994 + Q (-6/7), Q (-4/7), Q (-2/7), Q (0), Q (2/7), Q (4/7), Q (6/7), 0
1997 +#define Q0 Q (-10/11)
1998 +#define Q1 Q (-8/11)
1999 +#define Q2 Q (-6/11)
2000 +#define Q3 Q (-4/11)
2001 +#define Q4 Q (-2/11)
2003 +#define Q6 Q (2/11)
2004 +#define Q7 Q (4/11)
2005 +#define Q8 Q (6/11)
2006 +#define Q9 Q (8/11)
2007 +#define QA Q (10/11)
2009 -static const sample_t q_4_0[128] = {
2010 +static const quantizer_t q_4_0[128] = {
2011 Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0, Q0,
2012 Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1, Q1,
2013 Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2, Q2,
2018 -static const sample_t q_4_1[128] = {
2019 +static const quantizer_t q_4_1[128] = {
2020 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
2021 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
2022 Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, QA,
2023 @@ -173,15 +174,13 @@
2027 -static const sample_t q_5[16] = {
2028 - (-14 << 15)/15.0,(-12 << 15)/15.0,(-10 << 15)/15.0,
2029 - ( -8 << 15)/15.0,( -6 << 15)/15.0,( -4 << 15)/15.0,
2030 - ( -2 << 15)/15.0, 0 ,( 2 << 15)/15.0,
2031 - ( 4 << 15)/15.0,( 6 << 15)/15.0,( 8 << 15)/15.0,
2032 - ( 10 << 15)/15.0,( 12 << 15)/15.0,( 14 << 15)/15.0,
2034 +static const quantizer_t q_5[16] = {
2035 + Q (-14/15), Q (-12/15), Q (-10/15), Q (-8/15), Q (-6/15),
2036 + Q (-4/15), Q (-2/15), Q (0), Q (2/15), Q (4/15),
2037 + Q (6/15), Q (8/15), Q (10/15), Q (12/15), Q (14/15), 0
2040 +#ifndef LIBA52_FIXED
2041 static const sample_t scale_factor[25] = {
2045 0.00000000000363797880709171295166015625,
2046 0.000000000001818989403545856475830078125
2050 static const uint16_t dither_lut[256] = {
2051 0x0000, 0xa011, 0xe033, 0x4022, 0x6077, 0xc066, 0x8044, 0x2055,