]> git.sesse.net Git - vlc/blob - contrib/src/a52/liba52-fixed.diff
369da65f5e6ebeaad3ffd5f613d8eddb755bdff4
[vlc] / contrib / src / a52 / liba52-fixed.diff
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
4 @@ -1,6 +1,6 @@
5  /*
6   * a52.h
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>
10   *
11   * This file is part of a52dec, a free ATSC A-52 stream decoder.
12 @@ -24,10 +24,15 @@
13  #ifndef A52_H
14  #define A52_H
15  
16 -#ifndef LIBA52_DOUBLE
17 -typedef float sample_t;
18 -#else
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;
25 +#else
26 +typedef float sample_t;
27 +typedef float level_t;
28  #endif
29  
30  typedef struct a52_state_s a52_state_t;
31 @@ -53,9 +58,9 @@
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);
42  
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
46 @@ -1,6 +1,6 @@
47  /*
48   * attributes.h
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>
52   *
53   * This file is part of a52dec, a free ATSC A-52 stream decoder.
54 @@ -27,3 +27,11 @@
55  #else
56  #define ATTR_ALIGN(align)
57  #endif
58 +
59 +#ifdef HAVE_BUILTIN_EXPECT
60 +#define likely(x) __builtin_expect ((x) != 0, 1)
61 +#define unlikely(x) __builtin_expect ((x) != 0, 0)
62 +#else
63 +#define likely(x) (x)
64 +#define unlikely(x) (x)
65 +#endif
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
69 @@ -1,6 +1,6 @@
70  /*
71   * mm_accel.h
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>
75   *
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
80 @@ -1,6 +1,6 @@
81  /*
82   * tendra.h
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>
86   *
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
91 @@ -1,6 +1,6 @@
92  /*
93   * a52_internal.h
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>
97   *
98   * This file is part of a52dec, a free ATSC A-52 stream decoder.
99 @@ -37,24 +37,24 @@
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 */
107  
108      int output;                        /* type of output */
109 -    sample_t level;            /* output level */
110 +    level_t level;             /* output level */
111      sample_t bias;             /* output bias */
112  
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);
119  
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 */
127  
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,
132                        expbap_t * expbap);
133  
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);
146  
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);
150 +
151 +#define ROUND(x) ((int)((x) + ((x) > 0 ? 0.5 : -0.5)))
152 +
153 +#ifndef LIBA52_FIXED
154 +
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)
163 +
164 +#else /* LIBA52_FIXED */
165 +
166 +typedef int16_t quantizer_t;
167 +#define SAMPLE(x) (sample_t)((x) * (1 << 30))
168 +#define LEVEL(x) (level_t)((x) * (1 << 26))
169 +
170 +#if 0
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 */
175 +#define MUL(a, b) \
176 +({ \
177 +    int32_t t; \
178 +    asm volatile ( \
179 +        "mac.l %[A], %[B], %%acc0\n\t" \
180 +        "movclr.l %%acc0, %[t]\n\t" \
181 +        "asl.l #1, %[t]" \
182 +        : [t] "=d" (t) \
183 +        : [A] "r" ((a)), [B] "r" ((b))); \
184 +    t; \
185 +})
186 +/* loses 5 bits of accuracy */
187 +#define MUL_L(a, b) \
188 +({ \
189 +    int32_t t; \
190 +    asm volatile ( \
191 +        "mac.l %[A], %[B], %%acc0\n\t" \
192 +        "movclr.l %%acc0, %[t]\n\t" \
193 +        "asl.l #5, %[t]" \
194 +        : [t] "=d" (t) \
195 +        : [A] "r" ((a)), [B] "r" ((b))); \
196 +    t; \
197 +})
198 +#elif 1
199 +#define MUL(a,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)); })
205 +#else
206 +#define MUL(a,b) (((a) >> 15) * ((b) >> 15))
207 +#define MUL_L(a,b) (((a) >> 13) * ((b) >> 13))
208 +#endif
209 +
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))
213 +
214 +#endif
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
218 @@ -1,6 +1,6 @@
219  /*
220   * bit_allocate.c
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>
224   *
225   * This file is part of a52dec, a free ATSC A-52 stream decoder.
226 @@ -21,14 +21,14 @@
227   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
228   */
229  
230 -#include "config.h"
231 +#include "config-a52.h"
232  
233  #include <inttypes.h>
234  
235  #include "a52.h"
236  #include "a52_internal.h"
237  
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,
243 @@ -46,7 +46,7 @@
244       0x8d0, 0x8b0, 0x840, 0x7f0, 0x790, 0x760, 0x7a0, 0x7c0, 0x7b0, 0x720}
245  };
246  
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,
252 @@ -71,11 +71,11 @@
253       0,  0,  0,  0                                     /* 148 padding elems */
254  };
255  
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};
260  
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,
266 @@ -231,7 +231,7 @@
267         int startband, endband;
268  
269         startband = j;
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) {
274             int next, delta;
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
278 @@ -1,6 +1,6 @@
279  /*
280   * bitstream.c
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>
284   *
285   * This file is part of a52dec, a free ATSC A-52 stream decoder.
286 @@ -21,7 +21,7 @@
287   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
288   */
289  
290 -#include "config.h"
291 +#include "config-a52.h"
292  
293  #include <inttypes.h>
294  
295 @@ -38,7 +38,9 @@
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 */
302  }
303  
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
308 @@ -1,6 +1,6 @@
309  /*
310   * bitstream.h
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>
314   *
315   * This file is part of a52dec, a free ATSC A-52 stream decoder.
316 @@ -21,29 +21,29 @@
317   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
318   */
319  
320 -/* (stolen from the kernel) */
321 +//#define swab32(x) (betoh32(x))
322  #ifdef WORDS_BIGENDIAN
323  
324 -#      define swab32(x) (x)
325 +#   define swab32(x) (x)
326  
327  #else
328  
329 -#      if 0 && defined (__i386__)
330 +#   if defined (__i386__)
331  
332 -#      define swab32(x) __i386_swab32(x)
333 -       static inline const uint32_t __i386_swab32(uint32_t x)
334 -       {
335 -               __asm__("bswap %0" : "=r" (x) : "0" (x));
336 -               return x;
337 -       }
338 +#   define swab32(x) __i386_swab32(x)
339 +    static inline const uint32_t __i386_swab32(uint32_t x)
340 +    {
341 +        __asm__("bswap %0" : "=r" (x) : "0" (x));
342 +        return x;
343 +    }
344  
345 -#      else
346 +#   else
347  
348 -#      define swab32(x)\
349 +#   define swab32(x)\
350  ((((uint8_t*)&x)[0] << 24) | (((uint8_t*)&x)[1] << 16) |  \
351   (((uint8_t*)&x)[2] << 8)  | (((uint8_t*)&x)[3]))
352  
353 -#      endif
354 +#   endif
355  #endif
356  
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
361 @@ -0,0 +1,26 @@
362 +#define IDATA_ATTR
363 +#define IBSS_ATTR
364 +/* a52dec profiling */
365 +/* #undef A52DEC_GPROF */
366 +
367 +/* Define to 1 if you have the `memalign' function. */
368 +/* #undef HAVE_MEMALIGN 1 */
369 +
370 +/* liba52 djbfft support */
371 +/* #undef LIBA52_DJBFFT */
372 +
373 +/* a52 sample precision */
374 +/* #undef LIBA52_DOUBLE */
375 +
376 +/* use fixed-point arithmetic */
377 +#define LIBA52_FIXED
378 +
379 +/* Define to 1 if your processor stores words with the most significant byte
380 +   first (like Motorola and SPARC, unlike Intel and VAX). */
381 +
382 +/* Used in bitstream.h */
383 +
384 +#ifdef ROCKBOX_BIG_ENDIAN
385 +#define WORDS_BIGENDIAN 1
386 +#endif
387 +
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
391 @@ -1,6 +1,6 @@
392  /*
393   * downmix.c
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>
397   *
398   * This file is part of a52dec, a free ATSC A-52 stream decoder.
399 @@ -21,7 +21,7 @@
400   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
401   */
402  
403 -#include "config.h"
404 +#include "config-a52.h"
405  
406  #include <string.h>
407  #include <inttypes.h>
408 @@ -31,8 +31,8 @@
409  
410  #define CONVERT(acmod,output) (((output) << 3) + (acmod))
411  
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)
416  {
417      static uint8_t table[11][8] = {
418         {A52_CHANNEL,   A52_DOLBY,      A52_STEREO,     A52_STEREO,
419 @@ -66,94 +66,106 @@
420  
421      output = table[output][input & 7];
422  
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))))
427         output = A52_DOLBY;
428  
429 -    if (flags & A52_ADJUST_LEVEL)
430 +    if (flags & A52_ADJUST_LEVEL) {
431 +       level_t adjust;
432 +
433         switch (CONVERT (input & 7, output)) {
434  
435         case CONVERT (A52_3F, A52_MONO):
436 -           *level *= LEVEL_3DB / (1 + clev);
437 +           adjust = DIV (LEVEL_3DB, LEVEL (1) + clev);
438             break;
439  
440         case CONVERT (A52_STEREO, A52_MONO):
441         case CONVERT (A52_2F2R, A52_2F1R):
442         case CONVERT (A52_3F2R, A52_3F1R):
443         level_3db:
444 -           *level *= LEVEL_3DB;
445 +           adjust = LEVEL (LEVEL_3DB);
446             break;
447  
448         case CONVERT (A52_3F2R, A52_2F1R):
449 -           if (clev < LEVEL_PLUS3DB - 1)
450 +           if (clev < LEVEL (LEVEL_PLUS3DB - 1))
451                 goto level_3db;
452             /* break thru */
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);
459             break;
460  
461         case CONVERT (A52_2F1R, A52_MONO):
462 -           *level *= LEVEL_PLUS3DB / (2 + slev);
463 +           adjust = DIV (LEVEL_PLUS3DB, LEVEL (2) + slev);
464             break;
465  
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));
470             break;
471  
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));
475             break;
476  
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));
480             break;
481  
482         case CONVERT (A52_2F2R, A52_MONO):
483 -           *level *= LEVEL_3DB / (1 + slev);
484 +           adjust = DIV (LEVEL_3DB, LEVEL (1) + slev);
485             break;
486  
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);
491             break;
492  
493         case CONVERT (A52_3F2R, A52_MONO):
494 -           *level *= LEVEL_3DB / (1 + clev + slev);
495 +           adjust = DIV (LEVEL_3DB, LEVEL (1) + clev + slev);
496             break;
497  
498         case CONVERT (A52_3F2R, A52_STEREO):
499 -           *level /= 1 + clev + slev;
500 +           adjust = DIV (1, LEVEL (1) + clev + slev);
501             break;
502  
503         case CONVERT (A52_MONO, A52_DOLBY):
504 -           *level *= LEVEL_PLUS3DB;
505 +           adjust = LEVEL (LEVEL_PLUS3DB);
506             break;
507  
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));
512             break;
513  
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));
518             break;
519  
520         case CONVERT (A52_3F2R, A52_DOLBY):
521 -           *level *= 1 / (1 + 3 * LEVEL_3DB);
522 +           adjust = LEVEL (1 / (1 + 3 * LEVEL_3DB));
523             break;
524 +
525 +       default:
526 +           return output;
527         }
528  
529 +       *level = MUL_L (*level, adjust);
530 +    }
531 +
532      return output;
533  }
534  
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)
539  {
540 +    level_t level_3db;
541 +
542 +    level_3db = MUL_C (level, LEVEL_3DB);
543 +
544      switch (CONVERT (acmod, output & A52_CHANNEL_MASK)) {
545  
546      case CONVERT (A52_CHANNEL, A52_CHANNEL):
547 @@ -169,120 +181,138 @@
548         return 0;
549  
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);
553         return 3;
554  
555      case CONVERT (A52_STEREO, A52_MONO):
556 -       coeff[0] = coeff[1] = level * LEVEL_3DB;
557 +       coeff[0] = coeff[1] = level_3db;
558         return 3;
559  
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);
565         return 7;
566  
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);
572         return 7;
573  
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);
579         return 15;
580  
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);
588         return 15;
589  
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);
597         return 31;
598  
599      case CONVERT (A52_MONO, A52_DOLBY):
600 -       coeff[0] = level * LEVEL_3DB;
601 +       coeff[0] = level_3db;
602         return 0;
603  
604      case CONVERT (A52_3F, A52_DOLBY):
605 -       clev = LEVEL_3DB;
606 +       coeff[0] = coeff[2] = coeff[3] = coeff[4] = level;
607 +       coeff[1] = level_3db;
608 +       return 7;
609 +
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);
616         return 7;
617  
618      case CONVERT (A52_2F1R, A52_DOLBY):
619 -       slev = 1;
620 +       coeff[0] = coeff[1] = level;
621 +       coeff[2] = level_3db;
622 +       return 7;
623 +
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);
628         return 7;
629  
630      case CONVERT (A52_3F1R, A52_DOLBY):
631 -       clev = LEVEL_3DB;
632 -       slev = 1;
633 +       coeff[0] = coeff[2] = level;
634 +       coeff[1] = coeff[3] = level_3db;
635 +       return 15;
636 +
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);
643         return 15;
644  
645      case CONVERT (A52_2F2R, A52_DOLBY):
646 -       slev = LEVEL_3DB;
647 +       coeff[0] = coeff[1] = level;
648 +       coeff[2] = coeff[3] = level_3db;
649 +       return 15;
650 +
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);
655         return 15;
656  
657      case CONVERT (A52_3F2R, A52_DOLBY):
658 -       clev = LEVEL_3DB;
659 +       coeff[0] = coeff[2] = level;
660 +       coeff[1] = coeff[3] = coeff[4] = level_3db;
661 +       return 31;
662 +
663      case CONVERT (A52_3F2R, A52_2F1R):
664 -       slev = LEVEL_3DB;
665 +       coeff[0] = coeff[2] = level;
666 +       coeff[1] = MUL_L (level, clev);
667 +       coeff[3] = coeff[4] = level_3db;
668 +       return 31;
669 +
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);
676         return 31;
677  
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);
682         return 13;
683  
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);
688         return 29;
689  
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;
694         return 12;
695  
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;
700         return 24;
701  
702      case CONVERT (A52_2F1R, A52_2F2R):
703         coeff[0] = coeff[1] = level;
704 -       coeff[2] = level * LEVEL_3DB;
705 +       coeff[2] = level_3db;
706         return 0;
707  
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;
714         return 7;
715  
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;
720         return 0;
721  
722      case CONVERT (A52_CHANNEL, A52_CHANNEL1):
723 @@ -304,7 +334,7 @@
724      int i;
725  
726      for (i = 0; i < 256; i++)
727 -       dest[i] += src[i] + bias;
728 +       dest[i] += BIAS (src[i]);
729  }
730  
731  static void mix3to1 (sample_t * samples, sample_t bias)
732 @@ -312,7 +342,7 @@
733      int i;
734  
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]);
738  }
739  
740  static void mix4to1 (sample_t * samples, sample_t bias)
741 @@ -320,8 +350,8 @@
742      int i;
743  
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] +
748 +                           samples[i + 768]);
749  }
750  
751  static void mix5to1 (sample_t * samples, sample_t bias)
752 @@ -329,8 +359,8 @@
753      int i;
754  
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]);
760  }
761  
762  static void mix3to2 (sample_t * samples, sample_t bias)
763 @@ -339,7 +369,7 @@
764      sample_t common;
765  
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;
771      }
772 @@ -351,7 +381,7 @@
773      sample_t common;
774  
775      for (i = 0; i < 256; i++) {
776 -       common = right[i + 256] + bias;
777 +       common = BIAS (right[i + 256]);
778         left[i] += common;
779         right[i] += common;
780      }
781 @@ -364,8 +394,8 @@
782  
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);
789      }
790  }
791  
792 @@ -375,7 +405,7 @@
793      sample_t common;
794  
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;
800      }
801 @@ -387,7 +417,7 @@
802      sample_t common, surround;
803  
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;
810 @@ -401,8 +431,8 @@
811  
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);
818      }
819  }
820  
821 @@ -412,7 +442,7 @@
822      sample_t common;
823  
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];
829      }
830 @@ -424,7 +454,7 @@
831      sample_t common, surround;
832  
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;
839 @@ -436,7 +466,7 @@
840      int i;
841  
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]);
845  }
846  
847  static void zero (sample_t * samples)
848 @@ -448,8 +478,11 @@
849  }
850  
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)
854  {
855 +    /* avoid compiler warning */
856 +    (void)clev;
857 +
858      switch (CONVERT (acmod, output & A52_CHANNEL_MASK)) {
859  
860      case CONVERT (A52_CHANNEL, A52_CHANNEL2):
861 @@ -583,7 +616,7 @@
862         break;
863  
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));
867         break;
868      }
869  }
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
873 @@ -1,6 +1,6 @@
874  /*
875   * imdct.c
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>
879   *
880   * The ifft algorithms in this file have been largely inspired by Dan
881 @@ -24,12 +24,13 @@
882   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
883   */
884  
885 -#include "config.h"
886 +#include "config-a52.h"
887  
888  #include <math.h>
889  #include <stdio.h>
890  #ifdef LIBA52_DJBFFT
891  #include <fftc4.h>
892 +#include <fftc8.h>
893  #endif
894  #ifndef M_PI
895  #define M_PI 3.1415926535897932384626433832795029
896 @@ -57,25 +58,26 @@
897  };
898  
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];
908  
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];
918  
919 -static sample_t a52_imdct_window[256];
920 +//static sample_t a52_imdct_window[256];
921 +#include "imdct_lookups.h"
922  
923  static void (* ifft128) (complex_t * buf);
924  static void (* ifft64) (complex_t * buf);
925  
926  static inline void ifft2 (complex_t * buf)
927  {
928 -    double r, i;
929 +    sample_t r, i;
930  
931      r = buf[0].real;
932      i = buf[0].imag;
933 @@ -87,7 +89,7 @@
934  
935  static inline void ifft4 (complex_t * buf)
936  {
937 -    double tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8;
938 +    sample_t tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8;
939  
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;
944  }
945  
946 +/* basic radix-2 ifft butterfly */
947 +
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);          \
951 +} while (0)
952 +
953 +/* radix-2 ifft butterfly with bias */
954 +
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));   \
958 +} while (0)
959 +
960  /* the basic split-radix ifft butterfly */
961  
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;                  \
975 -    a0.real += tmp1;                           \
976 -    a0.imag += tmp2;                           \
977 -    a1.real += tmp3;                           \
978 -    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;                          \
990 +    a0.real += tmp1;                                   \
991 +    a0.imag += tmp2;                                   \
992 +    a1.real += tmp3;                                   \
993 +    a1.imag += tmp4;                                   \
994  } while (0)
995  
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 */
999  
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;                                \
1012 @@ -169,7 +183,7 @@
1013  
1014  static inline void ifft8 (complex_t * buf)
1015  {
1016 -    double tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8;
1017 +    sample_t tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8;
1018  
1019      ifft4 (buf);
1020      ifft2 (buf + 4);
1021 @@ -183,7 +197,7 @@
1022      complex_t * buf1;
1023      complex_t * buf2;
1024      complex_t * buf3;
1025 -    double tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8;
1026 +    sample_t tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8;
1027      int i;
1028  
1029      buf++;
1030 @@ -196,7 +210,8 @@
1031      i = n - 1;
1032  
1033      do {
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]);
1037         buf++;
1038         buf1++;
1039         buf2++;
1040 @@ -210,7 +225,7 @@
1041      ifft8 (buf);
1042      ifft4 (buf + 8);
1043      ifft4 (buf + 12);
1044 -    ifft_pass (buf, roots16 - 4, 4);
1045 +    ifft_pass (buf, roots16, 4);
1046  }
1047  
1048  static void ifft32 (complex_t * buf)
1049 @@ -218,7 +233,7 @@
1050      ifft16 (buf);
1051      ifft8 (buf + 16);
1052      ifft8 (buf + 24);
1053 -    ifft_pass (buf, roots32 - 8, 8);
1054 +    ifft_pass (buf, roots32, 8);
1055  }
1056  
1057  static void ifft64_c (complex_t * buf)
1058 @@ -226,7 +241,7 @@
1059      ifft32 (buf);
1060      ifft16 (buf + 32);
1061      ifft16 (buf + 48);
1062 -    ifft_pass (buf, roots64 - 16, 16);
1063 +    ifft_pass (buf, roots64, 16);
1064  }
1065  
1066  static void ifft128_c (complex_t * buf)
1067 @@ -234,11 +249,11 @@
1068      ifft32 (buf);
1069      ifft16 (buf + 32);
1070      ifft16 (buf + 48);
1071 -    ifft_pass (buf, roots64 - 16, 16);
1072 +    ifft_pass (buf, roots64, 16);
1073  
1074      ifft32 (buf + 64);
1075      ifft32 (buf + 96);
1076 -    ifft_pass (buf, roots128 - 32, 32);
1077 +    ifft_pass (buf, roots128, 32);
1078  }
1079  
1080  void a52_imdct_512 (sample_t * data, sample_t * delay, sample_t bias)
1081 @@ -252,9 +267,7 @@
1082         k = fftorder[i];
1083         t_r = pre1[i].real;
1084         t_i = pre1[i].imag;
1085 -
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]);
1089      }
1090  
1091      ifft128 (buf);
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;
1096 -
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);
1103  
1104         w_1 = window[2*i];
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]);
1109         delay[2*i] = a_i;
1110  
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]);
1116         delay[2*i+1] = b_i;
1117      }
1118  }
1119  
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)
1122  {
1123      int i, k;
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 @@
1126         k = fftorder[i];
1127         t_r = pre2[i].real;
1128         t_i = pre2[i].imag;
1129 -
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];
1132 -
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]);
1137      }
1138  
1139      ifft64 (buf1);
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;
1144 -
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;
1149 -
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);
1158  
1159         w_1 = window[2*i];
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]);
1164         delay[2*i] = c_i;
1165  
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;
1172  
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]);
1178         delay[2*i+1] = d_r;
1179  
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;
1186      }
1187  }
1188  
1189 +/*
1190  static double besselI0 (double x)
1191  {
1192      double bessel = 1;
1193 @@ -361,66 +356,118 @@
1194      while (--i);
1195      return bessel;
1196  }
1197 +*/
1198  
1199  void a52_imdct_init (uint32_t mm_accel)
1200  {
1201 -    int i, k;
1202 +  (void)mm_accel;
1203 +/*    int i, k;
1204      double sum;
1205 +    double local_imdct_window[256];*/
1206  
1207      /* compute imdct window - kaiser-bessel derived window, alpha = 5.0 */
1208 -    sum = 0;
1209 +    /*    sum = 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;
1214      }
1215      sum++;
1216 -    for (i = 0; i < 256; i++)
1217 -       a52_imdct_window[i] = sqrt (a52_imdct_window[i] / sum);
1218 +    */
1219 +    /*    for (i = 0; i < 256; i++)
1220 +       a52_imdct_window[i] = SAMPLE (sqrt (local_imdct_window[i] / sum));
1221 +
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]);
1226 +    }
1227 +    printf("\n}\n");
1228 +    */
1229 +
1230 +    /*    for (i = 0; i < 3; i++)
1231 +       roots16[i] = SAMPLE (cos ((M_PI / 8) * (i + 1)));
1232  
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]);
1236  
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)));
1240 +
1241 +    printf("static sample_t roots32[7]={");
1242 +    for (i=0;i<7;i++) { printf("%d%s",roots32[i],(i < 6 ? "," : "")); }
1243 +    printf("};\n");
1244  
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)));
1248 +
1249 +    printf("static sample_t roots64[15]={");
1250 +    for (i=0;i<15;i++) { printf("%d%s",roots64[i],(i < 14 ? "," : "")); }
1251 +    printf("};\n");
1252  
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)));
1256  
1257 +    printf("static sample_t roots128[31]={");
1258 +    for (i=0;i<31;i++) { printf("%d%s",roots128[i],(i < 30 ? "," : "")); }
1259 +    printf("};\n");
1260 +    */
1261 +    /*
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)));
1268      }
1269  
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)));
1276      }
1277  
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 ? "," : "")); }
1280 +    printf("};\n");
1281 +    */
1282 +    /*
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)));
1288      }
1289  
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 ? "," : "")); }
1292 +    printf("};\n");
1293 +    */
1294 +
1295 +    /*
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)));
1302      }
1303  
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 ? "," : "")); }
1306 +    printf("};\n");
1307 +
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)));
1313      }
1314  
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 ? "," : "")); }
1317 +    printf("};\n");
1318 +    */
1319 +
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;
1325 +#else
1326 +       ifft128 = (void (*) (complex_t *)) fftc8_un128;
1327 +       ifft64 = (void (*) (complex_t *)) fftc8_un64;
1328 +#endif
1329      } else
1330  #endif
1331      {
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
1335 @@ -0,0 +1,15 @@
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
1338 +};
1339 +
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};
1344 +
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}};
1346 +
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}};
1348 +
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
1354 @@ -1,6 +1,6 @@
1355  /*
1356   * parse.c
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>
1360   *
1361   * This file is part of a52dec, a free ATSC A-52 stream decoder.
1362 @@ -21,9 +21,8 @@
1363   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
1364   */
1365  
1366 -#include "config.h"
1367 +#include "config-a52.h"
1368  
1369 -#include <stdlib.h>
1370  #include <string.h>
1371  #include <inttypes.h>
1372  
1373 @@ -32,7 +31,7 @@
1374  #include "bitstream.h"
1375  #include "tables.h"
1376  
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);
1381  #else
1382 @@ -41,13 +40,16 @@
1383  #endif
1384  
1385  typedef struct {
1386 -    sample_t q1[2];
1387 -    sample_t q2[2];
1388 -    sample_t q4;
1389 +    quantizer_t q1[2];
1390 +    quantizer_t q2[2];
1391 +    quantizer_t q4;
1392      int q1_ptr;
1393      int q2_ptr;
1394      int q4_ptr;
1395 -} quantizer_t;
1396 +} quantizer_set_t;
1397 +
1398 +static a52_state_t istate IBSS_ATTR;
1399 +static sample_t isamples[256*12] IBSS_ATTR;
1400  
1401  static uint8_t halfrate[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3};
1402  
1403 @@ -56,16 +58,25 @@
1404      a52_state_t * state;
1405      int i;
1406  
1407 -    state = malloc (sizeof (a52_state_t));
1408 +    #if defined(CPU_COLDFIRE)
1409 +    coldfire_set_macsr(EMAC_FRACTIONAL | EMAC_ROUND | EMAC_SATURATE);
1410 +    #endif
1411 +    /* 
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));
1415      if (state == NULL)
1416         return NULL;
1417  
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) {
1421         free (state);
1422         return NULL;
1423      }
1424  
1425 +    */
1426 +    state = &istate;
1427 +    state->samples = isamples;
1428      for (i = 0; i < 256 * 12; i++)
1429         state->samples[i] = 0;
1430  
1431 @@ -129,10 +140,12 @@
1432  }
1433  
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)
1437  {
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) };
1444      int chaninfo;
1445      int acmod;
1446  
1447 @@ -146,6 +159,8 @@
1448      if ((acmod == 2) && (bitstream_get (state, 2) == 2))       /* dsurmod */
1449         acmod = A52_DOLBY;
1450  
1451 +    state->clev = state->slev = 0;
1452 +
1453      if ((acmod & 1) && (acmod != 1))
1454         state->clev = clev[bitstream_get (state, 2)];   /* cmixlev */
1455  
1456 @@ -162,7 +177,7 @@
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);
1462      state->bias = bias;
1463      state->dynrnge = 1;
1464      state->dynrngcall = NULL;
1465 @@ -201,7 +216,7 @@
1466  }
1467  
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)
1471  {
1472      state->dynrnge = 0;
1473      if (call) {
1474 @@ -311,20 +326,38 @@
1475         
1476      state->lfsr_state = (uint16_t) nstate;
1477  
1478 -    return nstate;
1479 +    return (3 * nstate) >> 2;
1480  }
1481  
1482 +#ifndef LIBA52_FIXED
1483 +#define COEFF(c,t,l,s,e) (c) = (t) * (s)[e]
1484 +#else
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); \
1490 +    if (shift >= 0)                                            \
1491 +       (c) = tmp >> shift;                                     \
1492 +    else                                                       \
1493 +       (c) = tmp << -shift;                                    \
1494 +} while (0)
1495 +#endif
1496 +
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)
1502  {
1503      int i;
1504      uint8_t * exp;
1505      int8_t * bap;
1506 +
1507 +#ifndef LIBA52_FIXED
1508      sample_t factor[25];
1509  
1510      for (i = 0; i <= 24; i++)
1511         factor[i] = scale_factor[i] * level;
1512 +#endif
1513  
1514      exp = expbap->exp;
1515      bap = expbap->bap;
1516 @@ -336,7 +369,7 @@
1517         switch (bapi) {
1518         case 0:
1519             if (dither) {
1520 -               coeff[i] = dither_gen (state) * LEVEL_3DB * factor[exp[i]];
1521 +               COEFF (coeff[i], dither_gen (state), level, factor, exp[i]);
1522                 continue;
1523             } else {
1524                 coeff[i] = 0;
1525 @@ -344,76 +377,80 @@
1526             }
1527  
1528         case -1:
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,
1533 +                      factor, exp[i]);
1534                 continue;
1535             } else {
1536                 int code;
1537  
1538                 code = bitstream_get (state, 5);
1539  
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]);
1548                 continue;
1549             }
1550  
1551         case -2:
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,
1556 +                      factor, exp[i]);
1557                 continue;
1558             } else {
1559                 int code;
1560  
1561                 code = bitstream_get (state, 7);
1562  
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]);
1571                 continue;
1572             }
1573  
1574         case 3:
1575 -           coeff[i] = q_3[bitstream_get (state, 3)] * factor[exp[i]];
1576 +           COEFF (coeff[i], q_3[bitstream_get (state, 3)], level,
1577 +                  factor, exp[i]);
1578             continue;
1579  
1580         case -3:
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]);
1587                 continue;
1588             } else {
1589                 int code;
1590  
1591                 code = bitstream_get (state, 7);
1592  
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]);
1599                 continue;
1600             }
1601  
1602         case 4:
1603 -           coeff[i] = q_5[bitstream_get (state, 4)] * factor[exp[i]];
1604 +           COEFF (coeff[i], q_5[bitstream_get (state, 4)], level,
1605 +                  factor, exp[i]);
1606             continue;
1607  
1608         default:
1609 -           coeff[i] = ((bitstream_get_2 (state, bapi) << (16 - bapi)) *
1610 -                         factor[exp[i]]);
1611 +           COEFF (coeff[i], bitstream_get_2 (state, bapi) << (16 - bapi),
1612 +                  level, factor, exp[i]);
1613         }
1614      }
1615  }
1616  
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])
1622  {
1623      int cplbndstrc, bnd, i, i_end, ch;
1624      uint8_t * exp;
1625      int8_t * bap;
1626 -    sample_t cplco[5];
1627 +    level_t cplco[5];
1628  
1629      exp = state->cpl_expbap.exp;
1630      bap = state->cpl_expbap.bap;
1631 @@ -428,22 +465,26 @@
1632         }
1633         cplbndstrc >>= 1;
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]);
1637         bnd++;
1638  
1639         while (i < i_end) {
1640 -           sample_t cplcoeff;
1641 +           quantizer_t cplcoeff;
1642             int bapi;
1643  
1644             bapi = bap[i];
1645             switch (bapi) {
1646             case 0:
1647 -               cplcoeff = LEVEL_3DB * scale_factor[exp[i]];
1648                 for (ch = 0; ch < nfchans; ch++)
1649                     if ((state->chincpl >> ch) & 1) {
1650                         if (dithflag[ch])
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));
1656 +#else
1657 +                           COEFF (samples[ch][i], dither_gen (state),
1658 +                                  cplco[ch], scale_factor, exp[i]);
1659 +#endif
1660                         else
1661                             samples[ch][i] = 0;
1662                     }
1663 @@ -451,33 +492,33 @@
1664                 continue;
1665  
1666             case -1:
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--];
1671                     break;
1672                 } else {
1673                     int code;
1674  
1675                     code = bitstream_get (state, 5);
1676  
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];
1684                     break;
1685                 }
1686  
1687             case -2:
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--];
1692                     break;
1693                 } else {
1694                     int code;
1695  
1696                     code = bitstream_get (state, 7);
1697  
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];
1705                     break;
1706                 }
1707 @@ -487,17 +528,17 @@
1708                 break;
1709  
1710             case -3:
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;
1717                     break;
1718                 } else {
1719                     int code;
1720  
1721                     code = bitstream_get (state, 7);
1722  
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];
1728                     break;
1729                 }
1730 @@ -509,11 +550,17 @@
1731             default:
1732                 cplcoeff = bitstream_get_2 (state, bapi) << (16 - bapi);
1733             }
1734 -
1735 +#ifndef LIBA52_FIXED
1736             cplcoeff *= scale_factor[exp[i]];
1737 +#endif
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];
1743 +#else
1744 +                   COEFF (samples[ch][i], cplcoeff, cplco[ch],
1745 +                          scale_factor, exp[i]);
1746 +#endif
1747             i++;
1748         }
1749      }
1750 @@ -526,9 +573,9 @@
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];
1755 +    level_t coeff[5];
1756      int chanbias;
1757 -    quantizer_t quantizer;
1758 +    quantizer_set_t quant;
1759      sample_t * samples;
1760  
1761      nfchans = nfchans_tbl[state->acmod];
1762 @@ -546,13 +593,17 @@
1763  
1764             dynrng = bitstream_get_2 (state, 8);
1765             if (state->dynrnge) {
1766 -               sample_t range;
1767 +               level_t range;
1768  
1769 +#if !defined(LIBA52_FIXED)
1770                 range = ((((dynrng & 0x1f) | 0x20) << 13) *
1771                          scale_factor[3 - (dynrng >> 5)]);
1772 +#else
1773 +               range = ((dynrng & 0x1f) | 0x20) << (21 + (dynrng >> 5));
1774 +#endif
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);
1779             }
1780         }
1781      } while (chaninfo--);
1782 @@ -611,8 +662,13 @@
1783                             cplcomant <<= 14;
1784                         else
1785                             cplcomant = (cplcomant | 0x10) << 13;
1786 +#ifndef LIBA52_FIXED
1787                         state->cplco[i][j] =
1788                             cplcomant * scale_factor[cplcoexp + mstrcplco];
1789 +#else
1790 +                       state->cplco[i][j] = (cplcomant << 11) >> (cplcoexp + mstrcplco);
1791 +#endif
1792 +
1793                     }
1794                 }
1795         if ((state->acmod == 2) && state->phsflginu && cplcoe)
1796 @@ -691,11 +747,11 @@
1797      }
1798  
1799      if (bitstream_get (state, 1)) {    /* baie */
1800 -       do_bit_alloc = -1;
1801 +       do_bit_alloc = 127;
1802         state->bai = bitstream_get (state, 11);
1803      }
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);
1810 @@ -711,7 +767,7 @@
1811      }
1812  
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);
1822  
1823 -    quantizer.q1_ptr = quantizer.q2_ptr = quantizer.q4_ptr = -1;
1824 +    quant.q1_ptr = quant.q2_ptr = quant.q4_ptr = -1;
1825      done_cpl = 0;
1826  
1827      for (i = 0; i < nfchans; i++) {
1828         int j;
1829  
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]);
1833  
1834         if ((state->chincpl >> i) & 1) {
1835             if (!done_cpl) {
1836                 done_cpl = 1;
1837                 coeff_get_coupling (state, nfchans, coeff,
1838 -                                   (sample_t (*)[256])samples, &quantizer,
1839 +                                   (sample_t (*)[256])samples, &quant,
1840                                     dithflag);
1841             }
1842             j = state->cplendmant;
1843 @@ -821,14 +877,14 @@
1844  
1845      if (state->lfeon) {
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);
1853         } else {
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,
1857                        0, 0, 7);
1858         }
1859      }
1860 @@ -896,6 +952,9 @@
1861  
1862  void a52_free (a52_state_t * state)
1863  {
1864 +    (void)state;
1865 +    /*
1866      free (state->samples);
1867      free (state);
1868 +    */
1869  }
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
1873 @@ -1,6 +1,6 @@
1874  /*
1875   * tables.h
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>
1879   *
1880   * This file is part of a52dec, a free ATSC A-52 stream decoder.
1881 @@ -46,42 +46,44 @@
1882      25,25,25
1883  };
1884  
1885 -#define Q0 ((-2 << 15) / 3.0)
1886 -#define Q1 (0)
1887 -#define Q2 ((2 << 15) / 3.0)
1888 -
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,
1893 -    0,0,0,0,0
1894 -};
1895 -
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,
1900 -    0,0,0,0,0
1901 -};
1902 -
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,
1907 -    0,0,0,0,0
1908 +#define Q(x) ROUND (32768.0 * x)
1909 +
1910 +#define Q0 Q (-2/3)
1911 +#define Q1 Q (0)
1912 +#define Q2 Q (2/3)
1913 +
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,
1918 +    0,  0,  0,  0,  0
1919 +};
1920 +
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,
1925 +    0,  0,  0,  0,  0
1926 +};
1927 +
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,
1932 +    0,  0,  0,  0,  0
1933  };
1934  
1935  #undef Q0
1936  #undef Q1
1937  #undef Q2
1938  
1939 -#define Q0 ((-4 << 15) / 5.0)
1940 -#define Q1 ((-2 << 15) / 5.0)
1941 -#define Q2 (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)
1946 +#define Q2 Q (0)
1947 +#define Q3 Q (2/5)
1948 +#define Q4 Q (4/5)
1949  
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,
1955 @@ -90,7 +92,7 @@
1956      0,0,0
1957  };
1958  
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,
1964 @@ -99,7 +101,7 @@
1965      0,0,0
1966  };
1967  
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 @@
1974  #undef Q3
1975  #undef Q4
1976  
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
1980 -};
1981 -
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)
1987 -#define Q5 (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
1995 +};
1996 +
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)
2002 +#define Q5 Q (0)
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)
2008  
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,
2014 @@ -146,7 +147,7 @@
2015      0,  0,  0,  0,  0,  0,  0
2016  };
2017  
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 @@
2024  #undef Q9
2025  #undef QA
2026  
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,
2033 -    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
2038  };
2039  
2040 +#ifndef LIBA52_FIXED
2041  static const sample_t scale_factor[25] = {
2042      0.000030517578125,
2043      0.0000152587890625,
2044 @@ -209,6 +208,7 @@
2045      0.00000000000363797880709171295166015625,
2046      0.000000000001818989403545856475830078125
2047  };
2048 +#endif
2049  
2050  static const uint16_t dither_lut[256] = {
2051      0x0000, 0xa011, 0xe033, 0x4022, 0x6077, 0xc066, 0x8044, 0x2055,