~ubuntu-branches/ubuntu/hardy/avidemux/hardy

« back to all changes in this revision

Viewing changes to avidemux/ADM_libMad/mad.h

  • Committer: Bazaar Package Importer
  • Author(s): Matvey Kozhev
  • Date: 2007-12-18 13:53:04 UTC
  • mfrom: (1.1.7 upstream)
  • Revision ID: james.westby@ubuntu.com-20071218135304-cdqec2lg2bglyz15
Tags: 1:2.4~preview3-0.0ubuntu1
* Upload to Ubuntu. (LP: #163287, LP: #126572)
* debian/changelog: re-added Ubuntu releases.
* debian/control:
  - Require debhelper >= 5.0.51 (for dh_icons) and imagemagick.
  - Build-depend on libsdl1.2-dev instead of libsdl-dev.
  - Build against newer libx264-dev. (LP: #138854)
  - Removed libamrnb-dev, not in Ubuntu yet.
* debian/rules:
  - Install all icon sizes, using convert (upstream installs none).
  - Added missing calls to dh_installmenu, dh_installman, dh_icons and
    dh_desktop.
* debian/menu, debian/avidemux-qt.menu:
  - Corrected package and executable names.
* debian/avidemux-common.install: Install icons.
* debian/avidemux.common.manpages: Install man/avidemux.1.
* debian/links, debian/avidemux-cli.links, debian/avidemux-gtk.links:
  - Link manpages to avidemux.1.gz.
* debian/install, debian/avidemux-qt.install, debian/avidemux-gtk.desktop,
  debian/avidemux-qt.desktop: Install desktop files.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 * libmad - MPEG audio decoder library
3
 
 * Copyright (C) 2000-2004 Underbit Technologies, Inc.
4
 
 *
5
 
 * This program is free software; you can redistribute it and/or modify
6
 
 * it under the terms of the GNU General Public License as published by
7
 
 * the Free Software Foundation; either version 2 of the License, or
8
 
 * (at your option) any later version.
9
 
 *
10
 
 * This program is distributed in the hope that it will be useful,
11
 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 
 * GNU General Public License for more details.
14
 
 *
15
 
 * You should have received a copy of the GNU General Public License
16
 
 * along with this program; if not, write to the Free Software
17
 
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18
 
 *
19
 
 * If you would like to negotiate alternate licensing terms, you may do
20
 
 * so by contacting: Underbit Technologies, Inc. <info@underbit.com>
21
 
 */
22
 
 
23
 
# ifdef __cplusplus
24
 
extern "C" {
25
 
# endif
26
 
 
27
 
//# define FPM_DEFAULT
28
 
 
29
 
#if 0 //MEANX
30
 
 
31
 
# define SIZEOF_INT 4
32
 
# define SIZEOF_LONG 8
33
 
# define SIZEOF_LONG_LONG 8
34
 
#else
35
 
typedef int32_t mad_fixed_t ;    
36
 
typedef int32_t mad_fixed64hi_t ;
37
 
typedef uint32_t mad_fixed64lo_t ;
38
 
 
39
 
#endif //MEANX
40
 
 
41
 
/* Id: version.h,v 1.26 2004/01/23 09:41:33 rob Exp */
42
 
 
43
 
# ifndef LIBMAD_VERSION_H
44
 
# define LIBMAD_VERSION_H
45
 
 
46
 
# define MAD_VERSION_MAJOR      0
47
 
# define MAD_VERSION_MINOR      15
48
 
# define MAD_VERSION_PATCH      1
49
 
# define MAD_VERSION_EXTRA      " (beta)"
50
 
 
51
 
# define MAD_VERSION_STRINGIZE(str)     #str
52
 
# define MAD_VERSION_STRING(num)        MAD_VERSION_STRINGIZE(num)
53
 
 
54
 
# define MAD_VERSION            MAD_VERSION_STRING(MAD_VERSION_MAJOR) "."  \
55
 
                                MAD_VERSION_STRING(MAD_VERSION_MINOR) "."  \
56
 
                                MAD_VERSION_STRING(MAD_VERSION_PATCH)  \
57
 
                                MAD_VERSION_EXTRA
58
 
 
59
 
# define MAD_PUBLISHYEAR        "2000-2004"
60
 
# define MAD_AUTHOR             "Underbit Technologies, Inc."
61
 
# define MAD_EMAIL              "info@underbit.com"
62
 
 
63
 
extern char const mad_version[];
64
 
extern char const mad_copyright[];
65
 
extern char const mad_author[];
66
 
extern char const mad_build[];
67
 
 
68
 
# endif
69
 
 
70
 
/* Id: fixed.h,v 1.38 2004/02/17 02:02:03 rob Exp */
71
 
 
72
 
# ifndef LIBMAD_FIXED_H
73
 
# define LIBMAD_FIXED_H
74
 
#if 0 //MEANX
75
 
# if SIZEOF_INT >= 4
76
 
typedef   signed int mad_fixed_t;
77
 
 
78
 
typedef   signed int mad_fixed64hi_t;
79
 
typedef unsigned int mad_fixed64lo_t;
80
 
# else
81
 
typedef   signed long mad_fixed_t;
82
 
 
83
 
typedef   signed long mad_fixed64hi_t;
84
 
typedef unsigned long mad_fixed64lo_t;
85
 
# endif
86
 
#endif
87
 
# if defined(_MSC_VER)
88
 
#  define mad_fixed64_t  signed __int64
89
 
# elif 1 || defined(__GNUC__)
90
 
#  define mad_fixed64_t  signed long long
91
 
# endif
92
 
 
93
 
# if defined(FPM_FLOAT)
94
 
typedef double mad_sample_t;
95
 
# else
96
 
typedef mad_fixed_t mad_sample_t;
97
 
# endif
98
 
 
99
 
/*
100
 
 * Fixed-point format: 0xABBBBBBB
101
 
 * A == whole part      (sign + 3 bits)
102
 
 * B == fractional part (28 bits)
103
 
 *
104
 
 * Values are signed two's complement, so the effective range is:
105
 
 * 0x80000000 to 0x7fffffff
106
 
 *       -8.0 to +7.9999999962747097015380859375
107
 
 *
108
 
 * The smallest representable value is:
109
 
 * 0x00000001 == 0.0000000037252902984619140625 (i.e. about 3.725e-9)
110
 
 *
111
 
 * 28 bits of fractional accuracy represent about
112
 
 * 8.6 digits of decimal accuracy.
113
 
 *
114
 
 * Fixed-point numbers can be added or subtracted as normal
115
 
 * integers, but multiplication requires shifting the 64-bit result
116
 
 * from 56 fractional bits back to 28 (and rounding.)
117
 
 *
118
 
 * Changing the definition of MAD_F_FRACBITS is only partially
119
 
 * supported, and must be done with care.
120
 
 */
121
 
 
122
 
# define MAD_F_FRACBITS         28
123
 
 
124
 
# if MAD_F_FRACBITS == 28
125
 
#  define MAD_F(x)              ((mad_fixed_t) (x##L))
126
 
# else
127
 
#  if MAD_F_FRACBITS < 28
128
 
#   warning "MAD_F_FRACBITS < 28"
129
 
#   define MAD_F(x)             ((mad_fixed_t)  \
130
 
                                 (((x##L) +  \
131
 
                                   (1L << (28 - MAD_F_FRACBITS - 1))) >>  \
132
 
                                  (28 - MAD_F_FRACBITS)))
133
 
#  elif MAD_F_FRACBITS > 28
134
 
#   error "MAD_F_FRACBITS > 28 not currently supported"
135
 
#   define MAD_F(x)             ((mad_fixed_t)  \
136
 
                                 ((x##L) << (MAD_F_FRACBITS - 28)))
137
 
#  endif
138
 
# endif
139
 
 
140
 
# define MAD_F_MIN              ((mad_fixed_t) -0x80000000L)
141
 
# define MAD_F_MAX              ((mad_fixed_t) +0x7fffffffL)
142
 
 
143
 
# define MAD_F_ONE              MAD_F(0x10000000)
144
 
 
145
 
# define mad_f_tofixed(x)       ((mad_fixed_t)  \
146
 
                                 ((x) * (double) (1L << MAD_F_FRACBITS) + 0.5))
147
 
# define mad_f_todouble(x)      ((double)  \
148
 
                                 ((x) / (double) (1L << MAD_F_FRACBITS)))
149
 
 
150
 
# define mad_f_intpart(x)       ((x) >> MAD_F_FRACBITS)
151
 
# define mad_f_fracpart(x)      ((x) & ((1L << MAD_F_FRACBITS) - 1))
152
 
                                /* (x should be positive) */
153
 
 
154
 
# define mad_f_fromint(x)       ((x) << MAD_F_FRACBITS)
155
 
 
156
 
# define mad_f_add(x, y)        ((x) + (y))
157
 
# define mad_f_sub(x, y)        ((x) - (y))
158
 
 
159
 
# if defined(FPM_FLOAT)
160
 
#  error "FPM_FLOAT not yet supported"
161
 
 
162
 
#  undef MAD_F
163
 
#  define MAD_F(x)              mad_f_todouble(x)
164
 
 
165
 
#  define mad_f_mul(x, y)       ((x) * (y))
166
 
#  define mad_f_scale64
167
 
 
168
 
#  undef ASO_ZEROCHECK
169
 
 
170
 
# elif defined(FPM_64BIT)
171
 
 
172
 
/*
173
 
 * This version should be the most accurate if 64-bit types are supported by
174
 
 * the compiler, although it may not be the most efficient.
175
 
 */
176
 
#  if defined(OPT_ACCURACY)
177
 
#   define mad_f_mul(x, y)  \
178
 
    ((mad_fixed_t)  \
179
 
     ((((mad_fixed64_t) (x) * (y)) +  \
180
 
       (1L << (MAD_F_SCALEBITS - 1))) >> MAD_F_SCALEBITS))
181
 
#  else
182
 
#   define mad_f_mul(x, y)  \
183
 
    ((mad_fixed_t) (((mad_fixed64_t) (x) * (y)) >> MAD_F_SCALEBITS))
184
 
#  endif
185
 
 
186
 
#  define MAD_F_SCALEBITS  MAD_F_FRACBITS
187
 
 
188
 
/* --- Intel --------------------------------------------------------------- */
189
 
 
190
 
# elif defined(FPM_INTEL)
191
 
 
192
 
#  if defined(_MSC_VER)
193
 
#   pragma warning(push)
194
 
#   pragma warning(disable: 4035)  /* no return value */
195
 
static __forceinline
196
 
mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y)
197
 
{
198
 
  enum {
199
 
    fracbits = MAD_F_FRACBITS
200
 
  };
201
 
 
202
 
  __asm {
203
 
    mov eax, x
204
 
    imul y
205
 
    shrd eax, edx, fracbits
206
 
  }
207
 
 
208
 
  /* implicit return of eax */
209
 
}
210
 
#   pragma warning(pop)
211
 
 
212
 
#   define mad_f_mul            mad_f_mul_inline
213
 
#   define mad_f_scale64
214
 
#  else
215
 
/*
216
 
 * This Intel version is fast and accurate; the disposition of the least
217
 
 * significant bit depends on OPT_ACCURACY via mad_f_scale64().
218
 
 */
219
 
#   define MAD_F_MLX(hi, lo, x, y)  \
220
 
    asm ("imull %3"  \
221
 
         : "=a" (lo), "=d" (hi)  \
222
 
         : "%a" (x), "rm" (y)  \
223
 
         : "cc")
224
 
 
225
 
#   if defined(OPT_ACCURACY)
226
 
/*
227
 
 * This gives best accuracy but is not very fast.
228
 
 */
229
 
#    define MAD_F_MLA(hi, lo, x, y)  \
230
 
    ({ mad_fixed64hi_t __hi;  \
231
 
       mad_fixed64lo_t __lo;  \
232
 
       MAD_F_MLX(__hi, __lo, (x), (y));  \
233
 
       asm ("addl %2,%0\n\t"  \
234
 
            "adcl %3,%1"  \
235
 
            : "=rm" (lo), "=rm" (hi)  \
236
 
            : "r" (__lo), "r" (__hi), "0" (lo), "1" (hi)  \
237
 
            : "cc");  \
238
 
    })
239
 
#   endif  /* OPT_ACCURACY */
240
 
 
241
 
#   if defined(OPT_ACCURACY)
242
 
/*
243
 
 * Surprisingly, this is faster than SHRD followed by ADC.
244
 
 */
245
 
#    define mad_f_scale64(hi, lo)  \
246
 
    ({ mad_fixed64hi_t __hi_;  \
247
 
       mad_fixed64lo_t __lo_;  \
248
 
       mad_fixed_t __result;  \
249
 
       asm ("addl %4,%2\n\t"  \
250
 
            "adcl %5,%3"  \
251
 
            : "=rm" (__lo_), "=rm" (__hi_)  \
252
 
            : "0" (lo), "1" (hi),  \
253
 
              "ir" (1L << (MAD_F_SCALEBITS - 1)), "ir" (0)  \
254
 
            : "cc");  \
255
 
       asm ("shrdl %3,%2,%1"  \
256
 
            : "=rm" (__result)  \
257
 
            : "0" (__lo_), "r" (__hi_), "I" (MAD_F_SCALEBITS)  \
258
 
            : "cc");  \
259
 
       __result;  \
260
 
    })
261
 
#   elif defined(OPT_INTEL)
262
 
/*
263
 
 * Alternate Intel scaling that may or may not perform better.
264
 
 */
265
 
#    define mad_f_scale64(hi, lo)  \
266
 
    ({ mad_fixed_t __result;  \
267
 
       asm ("shrl %3,%1\n\t"  \
268
 
            "shll %4,%2\n\t"  \
269
 
            "orl %2,%1"  \
270
 
            : "=rm" (__result)  \
271
 
            : "0" (lo), "r" (hi),  \
272
 
              "I" (MAD_F_SCALEBITS), "I" (32 - MAD_F_SCALEBITS)  \
273
 
            : "cc");  \
274
 
       __result;  \
275
 
    })
276
 
#   else
277
 
#    define mad_f_scale64(hi, lo)  \
278
 
    ({ mad_fixed_t __result;  \
279
 
       asm ("shrdl %3,%2,%1"  \
280
 
            : "=rm" (__result)  \
281
 
            : "0" (lo), "r" (hi), "I" (MAD_F_SCALEBITS)  \
282
 
            : "cc");  \
283
 
       __result;  \
284
 
    })
285
 
#   endif  /* OPT_ACCURACY */
286
 
 
287
 
#   define MAD_F_SCALEBITS  MAD_F_FRACBITS
288
 
#  endif
289
 
 
290
 
/* --- ARM ----------------------------------------------------------------- */
291
 
 
292
 
# elif defined(FPM_ARM)
293
 
 
294
 
/* 
295
 
 * This ARM V4 version is as accurate as FPM_64BIT but much faster. The
296
 
 * least significant bit is properly rounded at no CPU cycle cost!
297
 
 */
298
 
# if 1
299
 
/*
300
 
 * This is faster than the default implementation via MAD_F_MLX() and
301
 
 * mad_f_scale64().
302
 
 */
303
 
#  define mad_f_mul(x, y)  \
304
 
    ({ mad_fixed64hi_t __hi;  \
305
 
       mad_fixed64lo_t __lo;  \
306
 
       mad_fixed_t __result;  \
307
 
       asm ("smull      %0, %1, %3, %4\n\t"  \
308
 
            "movs       %0, %0, lsr %5\n\t"  \
309
 
            "adc        %2, %0, %1, lsl %6"  \
310
 
            : "=&r" (__lo), "=&r" (__hi), "=r" (__result)  \
311
 
            : "%r" (x), "r" (y),  \
312
 
              "M" (MAD_F_SCALEBITS), "M" (32 - MAD_F_SCALEBITS)  \
313
 
            : "cc");  \
314
 
       __result;  \
315
 
    })
316
 
# endif
317
 
 
318
 
#  define MAD_F_MLX(hi, lo, x, y)  \
319
 
    asm ("smull %0, %1, %2, %3"  \
320
 
         : "=&r" (lo), "=&r" (hi)  \
321
 
         : "%r" (x), "r" (y))
322
 
 
323
 
#  define MAD_F_MLA(hi, lo, x, y)  \
324
 
    asm ("smlal %0, %1, %2, %3"  \
325
 
         : "+r" (lo), "+r" (hi)  \
326
 
         : "%r" (x), "r" (y))
327
 
 
328
 
#  define MAD_F_MLN(hi, lo)  \
329
 
    asm ("rsbs  %0, %2, #0\n\t"  \
330
 
         "rsc   %1, %3, #0"  \
331
 
         : "=r" (lo), "=r" (hi)  \
332
 
         : "0" (lo), "1" (hi)  \
333
 
         : "cc")
334
 
 
335
 
#  define mad_f_scale64(hi, lo)  \
336
 
    ({ mad_fixed_t __result;  \
337
 
       asm ("movs       %0, %1, lsr %3\n\t"  \
338
 
            "adc        %0, %0, %2, lsl %4"  \
339
 
            : "=&r" (__result)  \
340
 
            : "r" (lo), "r" (hi),  \
341
 
              "M" (MAD_F_SCALEBITS), "M" (32 - MAD_F_SCALEBITS)  \
342
 
            : "cc");  \
343
 
       __result;  \
344
 
    })
345
 
 
346
 
#  define MAD_F_SCALEBITS  MAD_F_FRACBITS
347
 
 
348
 
/* --- MIPS ---------------------------------------------------------------- */
349
 
 
350
 
# elif defined(FPM_MIPS)
351
 
 
352
 
/*
353
 
 * This MIPS version is fast and accurate; the disposition of the least
354
 
 * significant bit depends on OPT_ACCURACY via mad_f_scale64().
355
 
 */
356
 
#  define MAD_F_MLX(hi, lo, x, y)  \
357
 
    asm ("mult  %2,%3"  \
358
 
         : "=l" (lo), "=h" (hi)  \
359
 
         : "%r" (x), "r" (y))
360
 
 
361
 
# if defined(HAVE_MADD_ASM)
362
 
#  define MAD_F_MLA(hi, lo, x, y)  \
363
 
    asm ("madd  %2,%3"  \
364
 
         : "+l" (lo), "+h" (hi)  \
365
 
         : "%r" (x), "r" (y))
366
 
# elif defined(HAVE_MADD16_ASM)
367
 
/*
368
 
 * This loses significant accuracy due to the 16-bit integer limit in the
369
 
 * multiply/accumulate instruction.
370
 
 */
371
 
#  define MAD_F_ML0(hi, lo, x, y)  \
372
 
    asm ("mult  %2,%3"  \
373
 
         : "=l" (lo), "=h" (hi)  \
374
 
         : "%r" ((x) >> 12), "r" ((y) >> 16))
375
 
#  define MAD_F_MLA(hi, lo, x, y)  \
376
 
    asm ("madd16        %2,%3"  \
377
 
         : "+l" (lo), "+h" (hi)  \
378
 
         : "%r" ((x) >> 12), "r" ((y) >> 16))
379
 
#  define MAD_F_MLZ(hi, lo)  ((mad_fixed_t) (lo))
380
 
# endif
381
 
 
382
 
# if defined(OPT_SPEED)
383
 
#  define mad_f_scale64(hi, lo)  \
384
 
    ((mad_fixed_t) ((hi) << (32 - MAD_F_SCALEBITS)))
385
 
#  define MAD_F_SCALEBITS  MAD_F_FRACBITS
386
 
# endif
387
 
 
388
 
/* --- SPARC --------------------------------------------------------------- */
389
 
 
390
 
# elif defined(FPM_SPARC)
391
 
 
392
 
/*
393
 
 * This SPARC V8 version is fast and accurate; the disposition of the least
394
 
 * significant bit depends on OPT_ACCURACY via mad_f_scale64().
395
 
 */
396
 
#  define MAD_F_MLX(hi, lo, x, y)  \
397
 
    asm ("smul %2, %3, %0\n\t"  \
398
 
         "rd %%y, %1"  \
399
 
         : "=r" (lo), "=r" (hi)  \
400
 
         : "%r" (x), "rI" (y))
401
 
 
402
 
/* --- PowerPC ------------------------------------------------------------- */
403
 
 
404
 
# elif defined(FPM_PPC)
405
 
 
406
 
/*
407
 
 * This PowerPC version is fast and accurate; the disposition of the least
408
 
 * significant bit depends on OPT_ACCURACY via mad_f_scale64().
409
 
 */
410
 
#  define MAD_F_MLX(hi, lo, x, y)  \
411
 
    do {  \
412
 
      asm ("mullw %0,%1,%2"  \
413
 
           : "=r" (lo)  \
414
 
           : "%r" (x), "r" (y));  \
415
 
      asm ("mulhw %0,%1,%2"  \
416
 
           : "=r" (hi)  \
417
 
           : "%r" (x), "r" (y));  \
418
 
    }  \
419
 
    while (0)
420
 
 
421
 
#  if defined(OPT_ACCURACY)
422
 
/*
423
 
 * This gives best accuracy but is not very fast.
424
 
 */
425
 
#   define MAD_F_MLA(hi, lo, x, y)  \
426
 
    ({ mad_fixed64hi_t __hi;  \
427
 
       mad_fixed64lo_t __lo;  \
428
 
       MAD_F_MLX(__hi, __lo, (x), (y));  \
429
 
       asm ("addc %0,%2,%3\n\t"  \
430
 
            "adde %1,%4,%5"  \
431
 
            : "=r" (lo), "=r" (hi)  \
432
 
            : "%r" (lo), "r" (__lo),  \
433
 
              "%r" (hi), "r" (__hi)  \
434
 
            : "xer");  \
435
 
    })
436
 
#  endif
437
 
 
438
 
#  if defined(OPT_ACCURACY)
439
 
/*
440
 
 * This is slower than the truncating version below it.
441
 
 */
442
 
#   define mad_f_scale64(hi, lo)  \
443
 
    ({ mad_fixed_t __result, __round;  \
444
 
       asm ("rotrwi %0,%1,%2"  \
445
 
            : "=r" (__result)  \
446
 
            : "r" (lo), "i" (MAD_F_SCALEBITS));  \
447
 
       asm ("extrwi %0,%1,1,0"  \
448
 
            : "=r" (__round)  \
449
 
            : "r" (__result));  \
450
 
       asm ("insrwi %0,%1,%2,0"  \
451
 
            : "+r" (__result)  \
452
 
            : "r" (hi), "i" (MAD_F_SCALEBITS));  \
453
 
       asm ("add %0,%1,%2"  \
454
 
            : "=r" (__result)  \
455
 
            : "%r" (__result), "r" (__round));  \
456
 
       __result;  \
457
 
    })
458
 
#  else
459
 
#   define mad_f_scale64(hi, lo)  \
460
 
    ({ mad_fixed_t __result;  \
461
 
       asm ("rotrwi %0,%1,%2"  \
462
 
            : "=r" (__result)  \
463
 
            : "r" (lo), "i" (MAD_F_SCALEBITS));  \
464
 
       asm ("insrwi %0,%1,%2,0"  \
465
 
            : "+r" (__result)  \
466
 
            : "r" (hi), "i" (MAD_F_SCALEBITS));  \
467
 
       __result;  \
468
 
    })
469
 
#  endif
470
 
 
471
 
#  define MAD_F_SCALEBITS  MAD_F_FRACBITS
472
 
 
473
 
/* --- Default ------------------------------------------------------------- */
474
 
 
475
 
# elif defined(FPM_DEFAULT)
476
 
 
477
 
/*
478
 
 * This version is the most portable but it loses significant accuracy.
479
 
 * Furthermore, accuracy is biased against the second argument, so care
480
 
 * should be taken when ordering operands.
481
 
 *
482
 
 * The scale factors are constant as this is not used with SSO.
483
 
 *
484
 
 * Pre-rounding is required to stay within the limits of compliance.
485
 
 */
486
 
#  if defined(OPT_SPEED)
487
 
#   define mad_f_mul(x, y)      (((x) >> 12) * ((y) >> 16))
488
 
#  else
489
 
#   define mad_f_mul(x, y)      ((((x) + (1L << 11)) >> 12) *  \
490
 
                                 (((y) + (1L << 15)) >> 16))
491
 
#  endif
492
 
 
493
 
/* ------------------------------------------------------------------------- */
494
 
 
495
 
# else
496
 
#  error "no FPM selected"
497
 
# endif
498
 
 
499
 
/* default implementations */
500
 
 
501
 
# if !defined(mad_f_mul)
502
 
#  define mad_f_mul(x, y)  \
503
 
    ({ register mad_fixed64hi_t __hi;  \
504
 
       register mad_fixed64lo_t __lo;  \
505
 
       MAD_F_MLX(__hi, __lo, (x), (y));  \
506
 
       mad_f_scale64(__hi, __lo);  \
507
 
    })
508
 
# endif
509
 
 
510
 
# if !defined(MAD_F_MLA)
511
 
#  define MAD_F_ML0(hi, lo, x, y)       ((lo)  = mad_f_mul((x), (y)))
512
 
#  define MAD_F_MLA(hi, lo, x, y)       ((lo) += mad_f_mul((x), (y)))
513
 
#  define MAD_F_MLN(hi, lo)             ((lo)  = -(lo))
514
 
#  define MAD_F_MLZ(hi, lo)             ((void) (hi), (mad_fixed_t) (lo))
515
 
# endif
516
 
 
517
 
# if !defined(MAD_F_ML0)
518
 
#  define MAD_F_ML0(hi, lo, x, y)       MAD_F_MLX((hi), (lo), (x), (y))
519
 
# endif
520
 
 
521
 
# if !defined(MAD_F_MLN)
522
 
#  define MAD_F_MLN(hi, lo)             ((hi) = ((lo) = -(lo)) ? ~(hi) : -(hi))
523
 
# endif
524
 
 
525
 
# if !defined(MAD_F_MLZ)
526
 
#  define MAD_F_MLZ(hi, lo)             mad_f_scale64((hi), (lo))
527
 
# endif
528
 
 
529
 
# if !defined(mad_f_scale64)
530
 
#  if defined(OPT_ACCURACY)
531
 
#   define mad_f_scale64(hi, lo)  \
532
 
    ((((mad_fixed_t)  \
533
 
       (((hi) << (32 - (MAD_F_SCALEBITS - 1))) |  \
534
 
        ((lo) >> (MAD_F_SCALEBITS - 1)))) + 1) >> 1)
535
 
#  else
536
 
#   define mad_f_scale64(hi, lo)  \
537
 
    ((mad_fixed_t)  \
538
 
     (((hi) << (32 - MAD_F_SCALEBITS)) |  \
539
 
      ((lo) >> MAD_F_SCALEBITS)))
540
 
#  endif
541
 
#  define MAD_F_SCALEBITS  MAD_F_FRACBITS
542
 
# endif
543
 
 
544
 
/* C routines */
545
 
 
546
 
mad_fixed_t mad_f_abs(mad_fixed_t);
547
 
mad_fixed_t mad_f_div(mad_fixed_t, mad_fixed_t);
548
 
 
549
 
# endif
550
 
 
551
 
/* Id: bit.h,v 1.12 2004/01/23 09:41:32 rob Exp */
552
 
 
553
 
# ifndef LIBMAD_BIT_H
554
 
# define LIBMAD_BIT_H
555
 
 
556
 
struct mad_bitptr {
557
 
  unsigned char const *byte;
558
 
  unsigned short cache;
559
 
  unsigned short left;
560
 
};
561
 
 
562
 
void mad_bit_init(struct mad_bitptr *, unsigned char const *);
563
 
 
564
 
# define mad_bit_finish(bitptr)         /* nothing */
565
 
 
566
 
unsigned int mad_bit_length(struct mad_bitptr const *,
567
 
                            struct mad_bitptr const *);
568
 
 
569
 
# define mad_bit_bitsleft(bitptr)  ((bitptr)->left)
570
 
unsigned char const *mad_bit_nextbyte(struct mad_bitptr const *);
571
 
 
572
 
void mad_bit_skip(struct mad_bitptr *, unsigned int);
573
 
unsigned long mad_bit_read(struct mad_bitptr *, unsigned int);
574
 
void mad_bit_write(struct mad_bitptr *, unsigned int, unsigned long);
575
 
 
576
 
unsigned short mad_bit_crc(struct mad_bitptr, unsigned int, unsigned short);
577
 
 
578
 
# endif
579
 
 
580
 
/* Id: timer.h,v 1.16 2004/01/23 09:41:33 rob Exp */
581
 
 
582
 
# ifndef LIBMAD_TIMER_H
583
 
# define LIBMAD_TIMER_H
584
 
 
585
 
typedef struct {
586
 
  signed long seconds;          /* whole seconds */
587
 
  unsigned long fraction;       /* 1/MAD_TIMER_RESOLUTION seconds */
588
 
} mad_timer_t;
589
 
 
590
 
extern mad_timer_t const mad_timer_zero;
591
 
 
592
 
# define MAD_TIMER_RESOLUTION   352800000UL
593
 
 
594
 
enum mad_units {
595
 
  MAD_UNITS_HOURS        =    -2,
596
 
  MAD_UNITS_MINUTES      =    -1,
597
 
  MAD_UNITS_SECONDS      =     0,
598
 
 
599
 
  /* metric units */
600
 
 
601
 
  MAD_UNITS_DECISECONDS  =    10,
602
 
  MAD_UNITS_CENTISECONDS =   100,
603
 
  MAD_UNITS_MILLISECONDS =  1000,
604
 
 
605
 
  /* audio sample units */
606
 
 
607
 
  MAD_UNITS_8000_HZ      =  8000,
608
 
  MAD_UNITS_11025_HZ     = 11025,
609
 
  MAD_UNITS_12000_HZ     = 12000,
610
 
 
611
 
  MAD_UNITS_16000_HZ     = 16000,
612
 
  MAD_UNITS_22050_HZ     = 22050,
613
 
  MAD_UNITS_24000_HZ     = 24000,
614
 
 
615
 
  MAD_UNITS_32000_HZ     = 32000,
616
 
  MAD_UNITS_44100_HZ     = 44100,
617
 
  MAD_UNITS_48000_HZ     = 48000,
618
 
 
619
 
  /* video frame/field units */
620
 
 
621
 
  MAD_UNITS_24_FPS       =    24,
622
 
  MAD_UNITS_25_FPS       =    25,
623
 
  MAD_UNITS_30_FPS       =    30,
624
 
  MAD_UNITS_48_FPS       =    48,
625
 
  MAD_UNITS_50_FPS       =    50,
626
 
  MAD_UNITS_60_FPS       =    60,
627
 
 
628
 
  /* CD audio frames */
629
 
 
630
 
  MAD_UNITS_75_FPS       =    75,
631
 
 
632
 
  /* video drop-frame units */
633
 
 
634
 
  MAD_UNITS_23_976_FPS   =   -24,
635
 
  MAD_UNITS_24_975_FPS   =   -25,
636
 
  MAD_UNITS_29_97_FPS    =   -30,
637
 
  MAD_UNITS_47_952_FPS   =   -48,
638
 
  MAD_UNITS_49_95_FPS    =   -50,
639
 
  MAD_UNITS_59_94_FPS    =   -60
640
 
};
641
 
 
642
 
# define mad_timer_reset(timer) ((void) (*(timer) = mad_timer_zero))
643
 
 
644
 
int mad_timer_compare(mad_timer_t, mad_timer_t);
645
 
 
646
 
# define mad_timer_sign(timer)  mad_timer_compare((timer), mad_timer_zero)
647
 
 
648
 
void mad_timer_negate(mad_timer_t *);
649
 
mad_timer_t mad_timer_abs(mad_timer_t);
650
 
 
651
 
void mad_timer_set(mad_timer_t *, unsigned long, unsigned long, unsigned long);
652
 
void mad_timer_add(mad_timer_t *, mad_timer_t);
653
 
void mad_timer_multiply(mad_timer_t *, signed long);
654
 
 
655
 
signed long mad_timer_count(mad_timer_t, enum mad_units);
656
 
unsigned long mad_timer_fraction(mad_timer_t, unsigned long);
657
 
void mad_timer_string(mad_timer_t, char *, char const *,
658
 
                      enum mad_units, enum mad_units, unsigned long);
659
 
 
660
 
# endif
661
 
 
662
 
/* Id: stream.h,v 1.20 2004/02/05 09:02:39 rob Exp */
663
 
 
664
 
# ifndef LIBMAD_STREAM_H
665
 
# define LIBMAD_STREAM_H
666
 
 
667
 
 
668
 
# define MAD_BUFFER_GUARD       8
669
 
# define MAD_BUFFER_MDLEN       (511 + 2048 + MAD_BUFFER_GUARD)
670
 
 
671
 
enum mad_error {
672
 
  MAD_ERROR_NONE           = 0x0000,    /* no error */
673
 
 
674
 
  MAD_ERROR_BUFLEN         = 0x0001,    /* input buffer too small (or EOF) */
675
 
  MAD_ERROR_BUFPTR         = 0x0002,    /* invalid (null) buffer pointer */
676
 
 
677
 
  MAD_ERROR_NOMEM          = 0x0031,    /* not enough memory */
678
 
 
679
 
  MAD_ERROR_LOSTSYNC       = 0x0101,    /* lost synchronization */
680
 
  MAD_ERROR_BADLAYER       = 0x0102,    /* reserved header layer value */
681
 
  MAD_ERROR_BADBITRATE     = 0x0103,    /* forbidden bitrate value */
682
 
  MAD_ERROR_BADSAMPLERATE  = 0x0104,    /* reserved sample frequency value */
683
 
  MAD_ERROR_BADEMPHASIS    = 0x0105,    /* reserved emphasis value */
684
 
 
685
 
  MAD_ERROR_BADCRC         = 0x0201,    /* CRC check failed */
686
 
  MAD_ERROR_BADBITALLOC    = 0x0211,    /* forbidden bit allocation value */
687
 
  MAD_ERROR_BADSCALEFACTOR = 0x0221,    /* bad scalefactor index */
688
 
  MAD_ERROR_BADMODE        = 0x0222,    /* bad bitrate/mode combination */
689
 
  MAD_ERROR_BADFRAMELEN    = 0x0231,    /* bad frame length */
690
 
  MAD_ERROR_BADBIGVALUES   = 0x0232,    /* bad big_values count */
691
 
  MAD_ERROR_BADBLOCKTYPE   = 0x0233,    /* reserved block_type */
692
 
  MAD_ERROR_BADSCFSI       = 0x0234,    /* bad scalefactor selection info */
693
 
  MAD_ERROR_BADDATAPTR     = 0x0235,    /* bad main_data_begin pointer */
694
 
  MAD_ERROR_BADPART3LEN    = 0x0236,    /* bad audio data length */
695
 
  MAD_ERROR_BADHUFFTABLE   = 0x0237,    /* bad Huffman table select */
696
 
  MAD_ERROR_BADHUFFDATA    = 0x0238,    /* Huffman data overrun */
697
 
  MAD_ERROR_BADSTEREO      = 0x0239     /* incompatible block_type for JS */
698
 
};
699
 
 
700
 
# define MAD_RECOVERABLE(error) ((error) & 0xff00)
701
 
 
702
 
struct mad_stream {
703
 
  unsigned char const *buffer;          /* input bitstream buffer */
704
 
  unsigned char const *bufend;          /* end of buffer */
705
 
  unsigned long skiplen;                /* bytes to skip before next frame */
706
 
 
707
 
  int sync;                             /* stream sync found */
708
 
  unsigned long freerate;               /* free bitrate (fixed) */
709
 
 
710
 
  unsigned char const *this_frame;      /* start of current frame */
711
 
  unsigned char const *next_frame;      /* start of next frame */
712
 
  struct mad_bitptr ptr;                /* current processing bit pointer */
713
 
 
714
 
  struct mad_bitptr anc_ptr;            /* ancillary bits pointer */
715
 
  unsigned int anc_bitlen;              /* number of ancillary bits */
716
 
 
717
 
  unsigned char (*main_data)[MAD_BUFFER_MDLEN];
718
 
                                        /* Layer III main_data() */
719
 
  unsigned int md_len;                  /* bytes in main_data */
720
 
 
721
 
  int options;                          /* decoding options (see below) */
722
 
  enum mad_error error;                 /* error code (see above) */
723
 
};
724
 
 
725
 
enum {
726
 
  MAD_OPTION_IGNORECRC      = 0x0001,   /* ignore CRC errors */
727
 
  MAD_OPTION_HALFSAMPLERATE = 0x0002    /* generate PCM at 1/2 sample rate */
728
 
# if 0  /* not yet implemented */
729
 
  MAD_OPTION_LEFTCHANNEL    = 0x0010,   /* decode left channel only */
730
 
  MAD_OPTION_RIGHTCHANNEL   = 0x0020,   /* decode right channel only */
731
 
  MAD_OPTION_SINGLECHANNEL  = 0x0030    /* combine channels */
732
 
# endif
733
 
};
734
 
 
735
 
void mad_stream_init(struct mad_stream *);
736
 
void mad_stream_finish(struct mad_stream *);
737
 
 
738
 
# define mad_stream_options(stream, opts)  \
739
 
    ((void) ((stream)->options = (opts)))
740
 
 
741
 
void mad_stream_buffer(struct mad_stream *,
742
 
                       unsigned char const *, unsigned long);
743
 
void mad_stream_skip(struct mad_stream *, unsigned long);
744
 
 
745
 
int mad_stream_sync(struct mad_stream *);
746
 
 
747
 
char const *mad_stream_errorstr(struct mad_stream const *);
748
 
 
749
 
# endif
750
 
 
751
 
/* Id: frame.h,v 1.20 2004/01/23 09:41:32 rob Exp */
752
 
 
753
 
# ifndef LIBMAD_FRAME_H
754
 
# define LIBMAD_FRAME_H
755
 
 
756
 
 
757
 
enum mad_layer {
758
 
  MAD_LAYER_I   = 1,                    /* Layer I */
759
 
  MAD_LAYER_II  = 2,                    /* Layer II */
760
 
  MAD_LAYER_III = 3                     /* Layer III */
761
 
};
762
 
 
763
 
enum mad_mode {
764
 
  MAD_MODE_SINGLE_CHANNEL = 0,          /* single channel */
765
 
  MAD_MODE_DUAL_CHANNEL   = 1,          /* dual channel */
766
 
  MAD_MODE_JOINT_STEREO   = 2,          /* joint (MS/intensity) stereo */
767
 
  MAD_MODE_STEREO         = 3           /* normal LR stereo */
768
 
};
769
 
 
770
 
enum mad_emphasis {
771
 
  MAD_EMPHASIS_NONE       = 0,          /* no emphasis */
772
 
  MAD_EMPHASIS_50_15_US   = 1,          /* 50/15 microseconds emphasis */
773
 
  MAD_EMPHASIS_CCITT_J_17 = 3,          /* CCITT J.17 emphasis */
774
 
  MAD_EMPHASIS_RESERVED   = 2           /* unknown emphasis */
775
 
};
776
 
 
777
 
struct mad_header {
778
 
  enum mad_layer layer;                 /* audio layer (1, 2, or 3) */
779
 
  enum mad_mode mode;                   /* channel mode (see above) */
780
 
  int mode_extension;                   /* additional mode info */
781
 
  enum mad_emphasis emphasis;           /* de-emphasis to use (see above) */
782
 
 
783
 
  unsigned long bitrate;                /* stream bitrate (bps) */
784
 
  unsigned int samplerate;              /* sampling frequency (Hz) */
785
 
 
786
 
  unsigned short crc_check;             /* frame CRC accumulator */
787
 
  unsigned short crc_target;            /* final target CRC checksum */
788
 
 
789
 
  int flags;                            /* flags (see below) */
790
 
  int private_bits;                     /* private bits (see below) */
791
 
 
792
 
  mad_timer_t duration;                 /* audio playing time of frame */
793
 
};
794
 
 
795
 
struct mad_frame {
796
 
  struct mad_header header;             /* MPEG audio header */
797
 
 
798
 
  int options;                          /* decoding options (from stream) */
799
 
 
800
 
  mad_fixed_t sbsample[2][36][32];      /* synthesis subband filter samples */
801
 
  mad_fixed_t (*overlap)[2][32][18];    /* Layer III block overlap data */
802
 
};
803
 
 
804
 
# define MAD_NCHANNELS(header)          ((header)->mode ? 2 : 1)
805
 
# define MAD_NSBSAMPLES(header)  \
806
 
  ((header)->layer == MAD_LAYER_I ? 12 :  \
807
 
   (((header)->layer == MAD_LAYER_III &&  \
808
 
     ((header)->flags & MAD_FLAG_LSF_EXT)) ? 18 : 36))
809
 
 
810
 
enum {
811
 
  MAD_FLAG_NPRIVATE_III = 0x0007,       /* number of Layer III private bits */
812
 
  MAD_FLAG_INCOMPLETE   = 0x0008,       /* header but not data is decoded */
813
 
 
814
 
  MAD_FLAG_PROTECTION   = 0x0010,       /* frame has CRC protection */
815
 
  MAD_FLAG_COPYRIGHT    = 0x0020,       /* frame is copyright */
816
 
  MAD_FLAG_ORIGINAL     = 0x0040,       /* frame is original (else copy) */
817
 
  MAD_FLAG_PADDING      = 0x0080,       /* frame has additional slot */
818
 
 
819
 
  MAD_FLAG_I_STEREO     = 0x0100,       /* uses intensity joint stereo */
820
 
  MAD_FLAG_MS_STEREO    = 0x0200,       /* uses middle/side joint stereo */
821
 
  MAD_FLAG_FREEFORMAT   = 0x0400,       /* uses free format bitrate */
822
 
 
823
 
  MAD_FLAG_LSF_EXT      = 0x1000,       /* lower sampling freq. extension */
824
 
  MAD_FLAG_MC_EXT       = 0x2000,       /* multichannel audio extension */
825
 
  MAD_FLAG_MPEG_2_5_EXT = 0x4000        /* MPEG 2.5 (unofficial) extension */
826
 
};
827
 
 
828
 
enum {
829
 
  MAD_PRIVATE_HEADER    = 0x0100,       /* header private bit */
830
 
  MAD_PRIVATE_III       = 0x001f        /* Layer III private bits (up to 5) */
831
 
};
832
 
 
833
 
void mad_header_init(struct mad_header *);
834
 
 
835
 
# define mad_header_finish(header)  /* nothing */
836
 
 
837
 
int mad_header_decode(struct mad_header *, struct mad_stream *);
838
 
 
839
 
void mad_frame_init(struct mad_frame *);
840
 
void mad_frame_finish(struct mad_frame *);
841
 
 
842
 
int mad_frame_decode(struct mad_frame *, struct mad_stream *);
843
 
 
844
 
void mad_frame_mute(struct mad_frame *);
845
 
 
846
 
# endif
847
 
 
848
 
/* Id: synth.h,v 1.15 2004/01/23 09:41:33 rob Exp */
849
 
 
850
 
# ifndef LIBMAD_SYNTH_H
851
 
# define LIBMAD_SYNTH_H
852
 
 
853
 
 
854
 
struct mad_pcm {
855
 
  unsigned int samplerate;              /* sampling frequency (Hz) */
856
 
  unsigned short channels;              /* number of channels */
857
 
  unsigned short length;                /* number of samples per channel */
858
 
  mad_fixed_t samples[2][1152];         /* PCM output samples [ch][sample] */
859
 
};
860
 
 
861
 
struct mad_synth {
862
 
  mad_fixed_t filter[2][2][2][16][8];   /* polyphase filterbank outputs */
863
 
                                        /* [ch][eo][peo][s][v] */
864
 
 
865
 
  unsigned int phase;                   /* current processing phase */
866
 
 
867
 
  struct mad_pcm pcm;                   /* PCM output */
868
 
};
869
 
 
870
 
/* single channel PCM selector */
871
 
enum {
872
 
  MAD_PCM_CHANNEL_SINGLE = 0
873
 
};
874
 
 
875
 
/* dual channel PCM selector */
876
 
enum {
877
 
  MAD_PCM_CHANNEL_DUAL_1 = 0,
878
 
  MAD_PCM_CHANNEL_DUAL_2 = 1
879
 
};
880
 
 
881
 
/* stereo PCM selector */
882
 
enum {
883
 
  MAD_PCM_CHANNEL_STEREO_LEFT  = 0,
884
 
  MAD_PCM_CHANNEL_STEREO_RIGHT = 1
885
 
};
886
 
 
887
 
void mad_synth_init(struct mad_synth *);
888
 
 
889
 
# define mad_synth_finish(synth)  /* nothing */
890
 
 
891
 
void mad_synth_mute(struct mad_synth *);
892
 
 
893
 
void mad_synth_frame(struct mad_synth *, struct mad_frame const *);
894
 
 
895
 
# endif
896
 
 
897
 
/* Id: decoder.h,v 1.17 2004/01/23 09:41:32 rob Exp */
898
 
 
899
 
# ifndef LIBMAD_DECODER_H
900
 
# define LIBMAD_DECODER_H
901
 
 
902
 
 
903
 
enum mad_decoder_mode {
904
 
  MAD_DECODER_MODE_SYNC  = 0,
905
 
  MAD_DECODER_MODE_ASYNC
906
 
};
907
 
 
908
 
enum mad_flow {
909
 
  MAD_FLOW_CONTINUE = 0x0000,   /* continue normally */
910
 
  MAD_FLOW_STOP     = 0x0010,   /* stop decoding normally */
911
 
  MAD_FLOW_BREAK    = 0x0011,   /* stop decoding and signal an error */
912
 
  MAD_FLOW_IGNORE   = 0x0020    /* ignore the current frame */
913
 
};
914
 
 
915
 
struct mad_decoder {
916
 
  enum mad_decoder_mode mode;
917
 
 
918
 
  int options;
919
 
 
920
 
  struct {
921
 
    long pid;
922
 
    int in;
923
 
    int out;
924
 
  } async;
925
 
 
926
 
  struct {
927
 
    struct mad_stream stream;
928
 
    struct mad_frame frame;
929
 
    struct mad_synth synth;
930
 
  } *sync;
931
 
 
932
 
  void *cb_data;
933
 
 
934
 
  enum mad_flow (*input_func)(void *, struct mad_stream *);
935
 
  enum mad_flow (*header_func)(void *, struct mad_header const *);
936
 
  enum mad_flow (*filter_func)(void *,
937
 
                               struct mad_stream const *, struct mad_frame *);
938
 
  enum mad_flow (*output_func)(void *,
939
 
                               struct mad_header const *, struct mad_pcm *);
940
 
  enum mad_flow (*error_func)(void *, struct mad_stream *, struct mad_frame *);
941
 
  enum mad_flow (*message_func)(void *, void *, unsigned int *);
942
 
};
943
 
 
944
 
void mad_decoder_init(struct mad_decoder *, void *,
945
 
                      enum mad_flow (*)(void *, struct mad_stream *),
946
 
                      enum mad_flow (*)(void *, struct mad_header const *),
947
 
                      enum mad_flow (*)(void *,
948
 
                                        struct mad_stream const *,
949
 
                                        struct mad_frame *),
950
 
                      enum mad_flow (*)(void *,
951
 
                                        struct mad_header const *,
952
 
                                        struct mad_pcm *),
953
 
                      enum mad_flow (*)(void *,
954
 
                                        struct mad_stream *,
955
 
                                        struct mad_frame *),
956
 
                      enum mad_flow (*)(void *, void *, unsigned int *));
957
 
int mad_decoder_finish(struct mad_decoder *);
958
 
 
959
 
# define mad_decoder_options(decoder, opts)  \
960
 
    ((void) ((decoder)->options = (opts)))
961
 
 
962
 
int mad_decoder_run(struct mad_decoder *, enum mad_decoder_mode);
963
 
int mad_decoder_message(struct mad_decoder *, void *, unsigned int *);
964
 
 
965
 
# endif
966
 
 
967
 
# ifdef __cplusplus
968
 
}
969
 
# endif