]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Version 0.1.1 from FTP
authorMark Spencer <markster@digium.com>
Tue, 7 Dec 1999 05:45:48 +0000 (05:45 +0000)
committerMark Spencer <markster@digium.com>
Tue, 7 Dec 1999 05:45:48 +0000 (05:45 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@95 65c4cc65-6c06-0410-ace0-fbb531ad65f3

40 files changed:
codecs/mp3/include/L3.h [new file with mode: 0755]
codecs/mp3/include/htable.h [new file with mode: 0755]
codecs/mp3/include/itype.h [new file with mode: 0755]
codecs/mp3/include/jdw.h [new file with mode: 0755]
codecs/mp3/include/mhead.h [new file with mode: 0755]
codecs/mp3/include/port.h [new file with mode: 0755]
codecs/mp3/include/protos.h [new file with mode: 0755]
codecs/mp3/include/tableawd.h [new file with mode: 0755]
codecs/mp3/include/xinglmc.h [new file with mode: 0755]
codecs/mp3/src/cdct.c [new file with mode: 0755]
codecs/mp3/src/csbt.c [new file with mode: 0755]
codecs/mp3/src/csbtL3.c [new file with mode: 0755]
codecs/mp3/src/csbtb.c [new file with mode: 0755]
codecs/mp3/src/cupini.c [new file with mode: 0755]
codecs/mp3/src/cupl3.c [new file with mode: 0755]
codecs/mp3/src/cwin.c [new file with mode: 0755]
codecs/mp3/src/cwinb.c [new file with mode: 0755]
codecs/mp3/src/cwinm.c [new file with mode: 0755]
codecs/mp3/src/dec8.c [new file with mode: 0755]
codecs/mp3/src/hwin.c [new file with mode: 0755]
codecs/mp3/src/icdct.c [new file with mode: 0755]
codecs/mp3/src/isbt.c [new file with mode: 0755]
codecs/mp3/src/isbtb.c [new file with mode: 0755]
codecs/mp3/src/iup.c [new file with mode: 0755]
codecs/mp3/src/iupL1.c [new file with mode: 0755]
codecs/mp3/src/iupini.c [new file with mode: 0755]
codecs/mp3/src/iwinQ.c [new file with mode: 0755]
codecs/mp3/src/iwinbQ.c [new file with mode: 0755]
codecs/mp3/src/iwinm.c [new file with mode: 0755]
codecs/mp3/src/l3dq.c [new file with mode: 0755]
codecs/mp3/src/l3init.c [new file with mode: 0755]
codecs/mp3/src/mdct.c [new file with mode: 0755]
codecs/mp3/src/mhead.c [new file with mode: 0755]
codecs/mp3/src/msis.c [new file with mode: 0755]
codecs/mp3/src/uph.c [new file with mode: 0755]
codecs/mp3/src/upsf.c [new file with mode: 0755]
codecs/mp3/src/wavep.c [new file with mode: 0755]
codecs/mp3/src/wcvt.c [new file with mode: 0755]
codecs/mp3/src/x86gas.s [new file with mode: 0755]
codecs/mp3/src/x86intel.c [new file with mode: 0755]

diff --git a/codecs/mp3/include/L3.h b/codecs/mp3/include/L3.h
new file mode 100755 (executable)
index 0000000..e920afd
--- /dev/null
@@ -0,0 +1,177 @@
+/*____________________________________________________________________________
+       
+       FreeAmp - The Free MP3 Player
+
+        MP3 Decoder originally Copyright (C) 1996-1997 Xing Technology
+        Corp.  http://www.xingtech.com
+
+       Portions Copyright (C) 1998-1999 Emusic.com
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program; if not, write to the Free Software
+       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+       
+       $Id$
+____________________________________________________________________________*/
+
+/****  L3.h  ***************************************************
+
+  Layer III structures
+
+  *** Layer III is 32 bit only          ***
+  *** Layer III code assumes 32 bit int ***
+
+******************************************************************/
+
+#define GLOBAL_GAIN_SCALE (4*15)
+/* #define GLOBAL_GAIN_SCALE 0 */
+
+
+#ifdef _M_IX86
+#define LITTLE_ENDIAN 1
+#endif
+
+#ifdef _M_ALPHA
+#define LITTLE_ENDIAN 1
+#endif
+
+#ifdef sparc
+#define LITTLE_ENDIAN 0
+#endif
+
+#ifndef LITTLE_ENDIAN
+#error Layer III LITTLE_ENDIAN must be defined 0 or 1
+#endif
+
+/*-----------------------------------------------------------*/
+/*---- huffman lookup tables ---*/
+/* endian dependent !!! */
+#if LITTLE_ENDIAN
+typedef union
+{
+   int ptr;
+   struct
+   {
+      unsigned char signbits;
+      unsigned char x;
+      unsigned char y;
+      unsigned char purgebits; // 0 = esc
+
+   }
+   b;
+}
+HUFF_ELEMENT;
+
+#else /* big endian machines */
+typedef union
+{
+   int ptr;                    /* int must be 32 bits or more */
+   struct
+   {
+      unsigned char purgebits; // 0 = esc
+
+      unsigned char y;
+      unsigned char x;
+      unsigned char signbits;
+   }
+   b;
+}
+HUFF_ELEMENT;
+
+#endif
+/*--------------------------------------------------------------*/
+typedef struct
+{
+   unsigned int bitbuf;
+   int bits;
+   unsigned char *bs_ptr;
+   unsigned char *bs_ptr0;
+   unsigned char *bs_ptr_end;  // optional for overrun test
+
+}
+BITDAT;
+
+/*-- side info ---*/
+typedef struct
+{
+   int part2_3_length;
+   int big_values;
+   int global_gain;
+   int scalefac_compress;
+   int window_switching_flag;
+   int block_type;
+   int mixed_block_flag;
+   int table_select[3];
+   int subblock_gain[3];
+   int region0_count;
+   int region1_count;
+   int preflag;
+   int scalefac_scale;
+   int count1table_select;
+}
+GR;
+typedef struct
+{
+   int mode;
+   int mode_ext;
+/*---------------*/
+   int main_data_begin;                /* beginning, not end, my spec wrong */
+   int private_bits;
+/*---------------*/
+   int scfsi[2];               /* 4 bit flags [ch] */
+   GR gr[2][2];                        /* [gran][ch] */
+}
+SIDE_INFO;
+
+/*-----------------------------------------------------------*/
+/*-- scale factors ---*/
+// check dimensions - need 21 long, 3*12 short
+// plus extra for implicit sf=0 above highest cb
+typedef struct
+{
+   int l[23];                  /* [cb] */
+   int s[3][13];               /* [window][cb] */
+}
+SCALEFACT;
+
+/*-----------------------------------------------------------*/
+typedef struct
+{
+   int cbtype;                 /* long=0 short=1 */
+   int cbmax;                  /* max crit band */
+//   int lb_type;                      /* long block type 0 1 3 */
+   int cbs0;                   /* short band start index 0 3 12 (12=no shorts */
+   int ncbl;                   /* number long cb's 0 8 21 */
+   int cbmax_s[3];             /* cbmax by individual short blocks */
+}
+CB_INFO;
+
+/*-----------------------------------------------------------*/
+/* scale factor infor for MPEG2 intensity stereo  */
+typedef struct
+{
+   int nr[3];
+   int slen[3];
+   int intensity_scale;
+}
+IS_SF_INFO;
+
+/*-----------------------------------------------------------*/
+typedef union
+{
+   int s;
+   float x;
+}
+SAMPLE;
+
+/*-----------------------------------------------------------*/
diff --git a/codecs/mp3/include/htable.h b/codecs/mp3/include/htable.h
new file mode 100755 (executable)
index 0000000..45a5dae
--- /dev/null
@@ -0,0 +1,999 @@
+/*____________________________________________________________________________
+       
+       FreeAmp - The Free MP3 Player
+
+        MP3 Decoder originally Copyright (C) 1995-1997 Xing Technology
+        Corp.  http://www.xingtech.com
+
+       Portions Copyright (C) 1998-1999 EMusic.com
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License}, {or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program; if not}, {write to the Free Software
+       Foundation}, {Inc.}, {675 Mass Ave}, {Cambridge}, {MA 02139}, {USA.
+       
+       $Id$
+____________________________________________________________________________*/
+
+/* TABLE  1    4 entries  maxbits  3  linbits  0 */
+static HUFF_ELEMENT huff_table_1[] =
+{
+  {0xFF000003}, {0x03010102}, {0x03010001}, {0x02000101}, {0x02000101},        /*  4 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},
+};
+
+/* max table bits  3 */
+
+/* TABLE  2    9 entries  maxbits  6  linbits  0 */
+static HUFF_ELEMENT huff_table_2[] =
+{
+  {0xFF000006}, {0x06020202}, {0x06020001}, {0x05020102}, {0x05020102},        /*  4 */
+  {0x05010202}, {0x05010202}, {0x05000201}, {0x05000201}, {0x03010102},        /*  9 */
+  {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102},        /* 14 */
+  {0x03010102}, {0x03010102}, {0x03010001}, {0x03010001}, {0x03010001},        /* 19 */
+  {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001},        /* 24 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101},        /* 29 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x01000000}, {0x01000000},        /* 34 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 39 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 44 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 49 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 54 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 59 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, /* 64 */
+};
+
+/* max table bits  6 */
+
+/* TABLE  3    9 entries  maxbits  6  linbits  0 */
+static HUFF_ELEMENT huff_table_3[] =
+{
+  {0xFF000006}, {0x06020202}, {0x06020001}, {0x05020102}, {0x05020102},        /*  4 */
+  {0x05010202}, {0x05010202}, {0x05000201}, {0x05000201}, {0x03000101},        /*  9 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101},        /* 14 */
+  {0x03000101}, {0x03000101}, {0x02010102}, {0x02010102}, {0x02010102},        /* 19 */
+  {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102},        /* 24 */
+  {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102},        /* 29 */
+  {0x02010102}, {0x02010102}, {0x02010102}, {0x02010001}, {0x02010001},        /* 34 */
+  {0x02010001}, {0x02010001}, {0x02010001}, {0x02010001}, {0x02010001},        /* 39 */
+  {0x02010001}, {0x02010001}, {0x02010001}, {0x02010001}, {0x02010001},        /* 44 */
+  {0x02010001}, {0x02010001}, {0x02010001}, {0x02010001}, {0x02000000},        /* 49 */
+  {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000},        /* 54 */
+  {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000},        /* 59 */
+  {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000}, /* 64 */
+};
+
+/* max table bits  6 */
+/* NO XING TABLE 4 */
+
+/* TABLE  5   16 entries  maxbits  8  linbits  0 */
+static HUFF_ELEMENT huff_table_5[] =
+{
+  {0xFF000008}, {0x08030302}, {0x08030202}, {0x07020302}, {0x07020302},        /*  4 */
+  {0x06010302}, {0x06010302}, {0x06010302}, {0x06010302}, {0x07030102},        /*  9 */
+  {0x07030102}, {0x07030001}, {0x07030001}, {0x07000301}, {0x07000301},        /* 14 */
+  {0x07020202}, {0x07020202}, {0x06020102}, {0x06020102}, {0x06020102},        /* 19 */
+  {0x06020102}, {0x06010202}, {0x06010202}, {0x06010202}, {0x06010202},        /* 24 */
+  {0x06020001}, {0x06020001}, {0x06020001}, {0x06020001}, {0x06000201},        /* 29 */
+  {0x06000201}, {0x06000201}, {0x06000201}, {0x03010102}, {0x03010102},        /* 34 */
+  {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102},        /* 39 */
+  {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102},        /* 44 */
+  {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102},        /* 49 */
+  {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102},        /* 54 */
+  {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102},        /* 59 */
+  {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102},        /* 64 */
+  {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001},        /* 69 */
+  {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001},        /* 74 */
+  {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001},        /* 79 */
+  {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001},        /* 84 */
+  {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001},        /* 89 */
+  {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001},        /* 94 */
+  {0x03010001}, {0x03010001}, {0x03000101}, {0x03000101}, {0x03000101},        /* 99 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101},        /* 104 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101},        /* 109 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101},        /* 114 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101},        /* 119 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101},        /* 124 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101}, {0x01000000},        /* 129 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 134 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 139 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 144 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 149 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 154 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 159 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 164 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 169 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 174 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 179 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 184 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 189 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 194 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 199 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 204 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 209 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 214 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 219 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 224 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 229 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 234 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 239 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 244 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 249 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 254 */
+  {0x01000000}, {0x01000000},
+};
+
+/* max table bits  8 */
+
+/* TABLE  6   16 entries  maxbits  7  linbits  0 */
+static HUFF_ELEMENT huff_table_6[] =
+{
+  {0xFF000007}, {0x07030302}, {0x07030001}, {0x06030202}, {0x06030202},        /*  4 */
+  {0x06020302}, {0x06020302}, {0x06000301}, {0x06000301}, {0x05030102},        /*  9 */
+  {0x05030102}, {0x05030102}, {0x05030102}, {0x05010302}, {0x05010302},        /* 14 */
+  {0x05010302}, {0x05010302}, {0x05020202}, {0x05020202}, {0x05020202},        /* 19 */
+  {0x05020202}, {0x05020001}, {0x05020001}, {0x05020001}, {0x05020001},        /* 24 */
+  {0x04020102}, {0x04020102}, {0x04020102}, {0x04020102}, {0x04020102},        /* 29 */
+  {0x04020102}, {0x04020102}, {0x04020102}, {0x04010202}, {0x04010202},        /* 34 */
+  {0x04010202}, {0x04010202}, {0x04010202}, {0x04010202}, {0x04010202},        /* 39 */
+  {0x04010202}, {0x04000201}, {0x04000201}, {0x04000201}, {0x04000201},        /* 44 */
+  {0x04000201}, {0x04000201}, {0x04000201}, {0x04000201}, {0x03010001},        /* 49 */
+  {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001},        /* 54 */
+  {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001},        /* 59 */
+  {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001},        /* 64 */
+  {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102},        /* 69 */
+  {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102},        /* 74 */
+  {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102},        /* 79 */
+  {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102},        /* 84 */
+  {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102},        /* 89 */
+  {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102},        /* 94 */
+  {0x02010102}, {0x02010102}, {0x03000101}, {0x03000101}, {0x03000101},        /* 99 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101},        /* 104 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101},        /* 109 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x03000000}, {0x03000000},        /* 114 */
+  {0x03000000}, {0x03000000}, {0x03000000}, {0x03000000}, {0x03000000},        /* 119 */
+  {0x03000000}, {0x03000000}, {0x03000000}, {0x03000000}, {0x03000000},        /* 124 */
+  {0x03000000}, {0x03000000}, {0x03000000}, {0x03000000},
+};
+
+/* max table bits  7 */
+
+/* TABLE  7   36 entries  maxbits 10  linbits  0 */
+static HUFF_ELEMENT huff_table_7[] =
+{
+  {0xFF000006}, {0x00000041}, {0x00000052}, {0x0000005B}, {0x00000060},        /*  4 */
+  {0x00000063}, {0x00000068}, {0x0000006B}, {0x06020102}, {0x05010202},        /*  9 */
+  {0x05010202}, {0x06020001}, {0x06000201}, {0x04010102}, {0x04010102},        /* 14 */
+  {0x04010102}, {0x04010102}, {0x03010001}, {0x03010001}, {0x03010001},        /* 19 */
+  {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001},        /* 24 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101},        /* 29 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x01000000}, {0x01000000},        /* 34 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 39 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 44 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 49 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 54 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 59 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 64 */
+  {0xFF000004}, {0x04050502}, {0x04050402}, {0x04040502}, {0x04030502},        /* 69 */
+  {0x03050302}, {0x03050302}, {0x03040402}, {0x03040402}, {0x03050202},        /* 74 */
+  {0x03050202}, {0x03020502}, {0x03020502}, {0x02050102}, {0x02050102},        /* 79 */
+  {0x02050102}, {0x02050102}, {0xFF000003}, {0x02010502}, {0x02010502},        /* 84 */
+  {0x03050001}, {0x03040302}, {0x02000501}, {0x02000501}, {0x03030402},        /* 89 */
+  {0x03030302}, {0xFF000002}, {0x02040202}, {0x02020402}, {0x01040102},        /* 94 */
+  {0x01040102}, {0xFF000001}, {0x01010402}, {0x01000401}, {0xFF000002},        /* 99 */
+  {0x02040001}, {0x02030202}, {0x02020302}, {0x02030001}, {0xFF000001},        /* 104 */
+  {0x01030102}, {0x01010302}, {0xFF000001}, {0x01000301}, {0x01020202}, /* 109 */
+};
+
+/* max table bits  6 */
+
+/* TABLE  8   36 entries  maxbits 11  linbits  0 */
+static HUFF_ELEMENT huff_table_8[] =
+{
+  {0xFF000008}, {0x00000101}, {0x0000010A}, {0x0000010F}, {0x08050102},        /*  4 */
+  {0x08010502}, {0x00000112}, {0x00000115}, {0x08040202}, {0x08020402},        /*  9 */
+  {0x08040102}, {0x07010402}, {0x07010402}, {0x08040001}, {0x08000401},        /* 14 */
+  {0x08030202}, {0x08020302}, {0x08030102}, {0x08010302}, {0x08030001},        /* 19 */
+  {0x08000301}, {0x06020202}, {0x06020202}, {0x06020202}, {0x06020202},        /* 24 */
+  {0x06020001}, {0x06020001}, {0x06020001}, {0x06020001}, {0x06000201},        /* 29 */
+  {0x06000201}, {0x06000201}, {0x06000201}, {0x04020102}, {0x04020102},        /* 34 */
+  {0x04020102}, {0x04020102}, {0x04020102}, {0x04020102}, {0x04020102},        /* 39 */
+  {0x04020102}, {0x04020102}, {0x04020102}, {0x04020102}, {0x04020102},        /* 44 */
+  {0x04020102}, {0x04020102}, {0x04020102}, {0x04020102}, {0x04010202},        /* 49 */
+  {0x04010202}, {0x04010202}, {0x04010202}, {0x04010202}, {0x04010202},        /* 54 */
+  {0x04010202}, {0x04010202}, {0x04010202}, {0x04010202}, {0x04010202},        /* 59 */
+  {0x04010202}, {0x04010202}, {0x04010202}, {0x04010202}, {0x04010202},        /* 64 */
+  {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102},        /* 69 */
+  {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102},        /* 74 */
+  {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102},        /* 79 */
+  {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102},        /* 84 */
+  {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102},        /* 89 */
+  {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102},        /* 94 */
+  {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102},        /* 99 */
+  {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102},        /* 104 */
+  {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102},        /* 109 */
+  {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102},        /* 114 */
+  {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102},        /* 119 */
+  {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102},        /* 124 */
+  {0x02010102}, {0x02010102}, {0x02010102}, {0x02010102}, {0x03010001},        /* 129 */
+  {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001},        /* 134 */
+  {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001},        /* 139 */
+  {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001},        /* 144 */
+  {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001},        /* 149 */
+  {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001},        /* 154 */
+  {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001},        /* 159 */
+  {0x03010001}, {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101},        /* 164 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101},        /* 169 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101},        /* 174 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101},        /* 179 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101},        /* 184 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101},        /* 189 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x02000000}, {0x02000000},        /* 194 */
+  {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000},        /* 199 */
+  {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000},        /* 204 */
+  {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000},        /* 209 */
+  {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000},        /* 214 */
+  {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000},        /* 219 */
+  {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000},        /* 224 */
+  {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000},        /* 229 */
+  {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000},        /* 234 */
+  {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000},        /* 239 */
+  {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000},        /* 244 */
+  {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000},        /* 249 */
+  {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000},        /* 254 */
+  {0x02000000}, {0x02000000}, {0xFF000003}, {0x03050502}, {0x03040502},        /* 259 */
+  {0x02050402}, {0x02050402}, {0x01030502}, {0x01030502}, {0x01030502},        /* 264 */
+  {0x01030502}, {0xFF000002}, {0x02050302}, {0x02040402}, {0x01050202},        /* 269 */
+  {0x01050202}, {0xFF000001}, {0x01020502}, {0x01050001}, {0xFF000001},        /* 274 */
+  {0x01040302}, {0x01030402}, {0xFF000001}, {0x01000501}, {0x01030302}, /* 279 */
+};
+
+/* max table bits  8 */
+
+/* TABLE  9   36 entries  maxbits  9  linbits  0 */
+static HUFF_ELEMENT huff_table_9[] =
+{
+  {0xFF000006}, {0x00000041}, {0x0000004A}, {0x0000004F}, {0x00000052},        /*  4 */
+  {0x00000057}, {0x0000005A}, {0x06040102}, {0x06010402}, {0x06030202},        /*  9 */
+  {0x06020302}, {0x05030102}, {0x05030102}, {0x05010302}, {0x05010302},        /* 14 */
+  {0x06030001}, {0x06000301}, {0x05020202}, {0x05020202}, {0x05020001},        /* 19 */
+  {0x05020001}, {0x04020102}, {0x04020102}, {0x04020102}, {0x04020102},        /* 24 */
+  {0x04010202}, {0x04010202}, {0x04010202}, {0x04010202}, {0x04000201},        /* 29 */
+  {0x04000201}, {0x04000201}, {0x04000201}, {0x03010102}, {0x03010102},        /* 34 */
+  {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102},        /* 39 */
+  {0x03010102}, {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001},        /* 44 */
+  {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001}, {0x03000101},        /* 49 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101},        /* 54 */
+  {0x03000101}, {0x03000101}, {0x03000000}, {0x03000000}, {0x03000000},        /* 59 */
+  {0x03000000}, {0x03000000}, {0x03000000}, {0x03000000}, {0x03000000},        /* 64 */
+  {0xFF000003}, {0x03050502}, {0x03050402}, {0x02050302}, {0x02050302},        /* 69 */
+  {0x02030502}, {0x02030502}, {0x03040502}, {0x03050001}, {0xFF000002},        /* 74 */
+  {0x02040402}, {0x02050202}, {0x02020502}, {0x02050102}, {0xFF000001},        /* 79 */
+  {0x01010502}, {0x01040302}, {0xFF000002}, {0x01030402}, {0x01030402},        /* 84 */
+  {0x02000501}, {0x02040001}, {0xFF000001}, {0x01040202}, {0x01020402},        /* 89 */
+  {0xFF000001}, {0x01030302}, {0x01000401},
+};
+
+/* max table bits  6 */
+
+/* TABLE 10   64 entries  maxbits 11  linbits  0 */
+static HUFF_ELEMENT huff_table_10[] =
+{
+  {0xFF000008}, {0x00000101}, {0x0000010A}, {0x0000010F}, {0x00000118},        /*  4 */
+  {0x0000011B}, {0x00000120}, {0x00000125}, {0x08070102}, {0x08010702},        /*  9 */
+  {0x0000012A}, {0x0000012D}, {0x00000132}, {0x08060102}, {0x08010602},        /* 14 */
+  {0x08000601}, {0x00000137}, {0x0000013A}, {0x0000013D}, {0x08040102},        /* 19 */
+  {0x08010402}, {0x08000401}, {0x08030202}, {0x08020302}, {0x08030001},        /* 24 */
+  {0x07030102}, {0x07030102}, {0x07010302}, {0x07010302}, {0x07000301},        /* 29 */
+  {0x07000301}, {0x07020202}, {0x07020202}, {0x06020102}, {0x06020102},        /* 34 */
+  {0x06020102}, {0x06020102}, {0x06010202}, {0x06010202}, {0x06010202},        /* 39 */
+  {0x06010202}, {0x06020001}, {0x06020001}, {0x06020001}, {0x06020001},        /* 44 */
+  {0x06000201}, {0x06000201}, {0x06000201}, {0x06000201}, {0x04010102},        /* 49 */
+  {0x04010102}, {0x04010102}, {0x04010102}, {0x04010102}, {0x04010102},        /* 54 */
+  {0x04010102}, {0x04010102}, {0x04010102}, {0x04010102}, {0x04010102},        /* 59 */
+  {0x04010102}, {0x04010102}, {0x04010102}, {0x04010102}, {0x04010102},        /* 64 */
+  {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001},        /* 69 */
+  {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001},        /* 74 */
+  {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001},        /* 79 */
+  {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001},        /* 84 */
+  {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001},        /* 89 */
+  {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001},        /* 94 */
+  {0x03010001}, {0x03010001}, {0x03000101}, {0x03000101}, {0x03000101},        /* 99 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101},        /* 104 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101},        /* 109 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101},        /* 114 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101},        /* 119 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101},        /* 124 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101}, {0x01000000},        /* 129 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 134 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 139 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 144 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 149 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 154 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 159 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 164 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 169 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 174 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 179 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 184 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 189 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 194 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 199 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 204 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 209 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 214 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 219 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 224 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 229 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 234 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 239 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 244 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 249 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 254 */
+  {0x01000000}, {0x01000000}, {0xFF000003}, {0x03070702}, {0x03070602},        /* 259 */
+  {0x03060702}, {0x03070502}, {0x03050702}, {0x03060602}, {0x02070402},        /* 264 */
+  {0x02070402}, {0xFF000002}, {0x02040702}, {0x02060502}, {0x02050602},        /* 269 */
+  {0x02070302}, {0xFF000003}, {0x02030702}, {0x02030702}, {0x02060402},        /* 274 */
+  {0x02060402}, {0x03050502}, {0x03040502}, {0x02030602}, {0x02030602},        /* 279 */
+  {0xFF000001}, {0x01070202}, {0x01020702}, {0xFF000002}, {0x02040602},        /* 284 */
+  {0x02070001}, {0x01000701}, {0x01000701}, {0xFF000002}, {0x01020602},        /* 289 */
+  {0x01020602}, {0x02050402}, {0x02050302}, {0xFF000002}, {0x01060001},        /* 294 */
+  {0x01060001}, {0x02030502}, {0x02040402}, {0xFF000001}, {0x01060302},        /* 299 */
+  {0x01060202}, {0xFF000002}, {0x02050202}, {0x02020502}, {0x01050102},        /* 304 */
+  {0x01050102}, {0xFF000002}, {0x01010502}, {0x01010502}, {0x02040302},        /* 309 */
+  {0x02030402}, {0xFF000001}, {0x01050001}, {0x01000501}, {0xFF000001},        /* 314 */
+  {0x01040202}, {0x01020402}, {0xFF000001}, {0x01030302}, {0x01040001}, /* 319 */
+};
+
+/* max table bits  8 */
+
+/* TABLE 11   64 entries  maxbits 11  linbits  0 */
+static HUFF_ELEMENT huff_table_11[] =
+{
+  {0xFF000008}, {0x00000101}, {0x00000106}, {0x0000010F}, {0x00000114},        /*  4 */
+  {0x00000117}, {0x08070202}, {0x08020702}, {0x0000011C}, {0x07010702},        /*  9 */
+  {0x07010702}, {0x08070102}, {0x08000701}, {0x08060302}, {0x08030602},        /* 14 */
+  {0x08000601}, {0x0000011F}, {0x00000122}, {0x08050102}, {0x07020602},        /* 19 */
+  {0x07020602}, {0x08060202}, {0x08060001}, {0x07060102}, {0x07060102},        /* 24 */
+  {0x07010602}, {0x07010602}, {0x08010502}, {0x08040302}, {0x08000501},        /* 29 */
+  {0x00000125}, {0x08040202}, {0x08020402}, {0x08040102}, {0x08010402},        /* 34 */
+  {0x08040001}, {0x08000401}, {0x07030202}, {0x07030202}, {0x07020302},        /* 39 */
+  {0x07020302}, {0x06030102}, {0x06030102}, {0x06030102}, {0x06030102},        /* 44 */
+  {0x06010302}, {0x06010302}, {0x06010302}, {0x06010302}, {0x07030001},        /* 49 */
+  {0x07030001}, {0x07000301}, {0x07000301}, {0x06020202}, {0x06020202},        /* 54 */
+  {0x06020202}, {0x06020202}, {0x05010202}, {0x05010202}, {0x05010202},        /* 59 */
+  {0x05010202}, {0x05010202}, {0x05010202}, {0x05010202}, {0x05010202},        /* 64 */
+  {0x04020102}, {0x04020102}, {0x04020102}, {0x04020102}, {0x04020102},        /* 69 */
+  {0x04020102}, {0x04020102}, {0x04020102}, {0x04020102}, {0x04020102},        /* 74 */
+  {0x04020102}, {0x04020102}, {0x04020102}, {0x04020102}, {0x04020102},        /* 79 */
+  {0x04020102}, {0x05020001}, {0x05020001}, {0x05020001}, {0x05020001},        /* 84 */
+  {0x05020001}, {0x05020001}, {0x05020001}, {0x05020001}, {0x05000201},        /* 89 */
+  {0x05000201}, {0x05000201}, {0x05000201}, {0x05000201}, {0x05000201},        /* 94 */
+  {0x05000201}, {0x05000201}, {0x03010102}, {0x03010102}, {0x03010102},        /* 99 */
+  {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102},        /* 104 */
+  {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102},        /* 109 */
+  {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102},        /* 114 */
+  {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102},        /* 119 */
+  {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102},        /* 124 */
+  {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102}, {0x03010001},        /* 129 */
+  {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001},        /* 134 */
+  {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001},        /* 139 */
+  {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001},        /* 144 */
+  {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001},        /* 149 */
+  {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001},        /* 154 */
+  {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001},        /* 159 */
+  {0x03010001}, {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101},        /* 164 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101},        /* 169 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101},        /* 174 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101},        /* 179 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101},        /* 184 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101},        /* 189 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x02000000}, {0x02000000},        /* 194 */
+  {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000},        /* 199 */
+  {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000},        /* 204 */
+  {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000},        /* 209 */
+  {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000},        /* 214 */
+  {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000},        /* 219 */
+  {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000},        /* 224 */
+  {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000},        /* 229 */
+  {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000},        /* 234 */
+  {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000},        /* 239 */
+  {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000},        /* 244 */
+  {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000},        /* 249 */
+  {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000}, {0x02000000},        /* 254 */
+  {0x02000000}, {0x02000000}, {0xFF000002}, {0x02070702}, {0x02070602},        /* 259 */
+  {0x02060702}, {0x02050702}, {0xFF000003}, {0x02060602}, {0x02060602},        /* 264 */
+  {0x02070402}, {0x02070402}, {0x02040702}, {0x02040702}, {0x03070502},        /* 269 */
+  {0x03050502}, {0xFF000002}, {0x02060502}, {0x02050602}, {0x01070302},        /* 274 */
+  {0x01070302}, {0xFF000001}, {0x01030702}, {0x01060402}, {0xFF000002},        /* 279 */
+  {0x02050402}, {0x02040502}, {0x02050302}, {0x02030502}, {0xFF000001},        /* 284 */
+  {0x01040602}, {0x01070001}, {0xFF000001}, {0x01040402}, {0x01050202},        /* 289 */
+  {0xFF000001}, {0x01020502}, {0x01050001}, {0xFF000001}, {0x01030402},        /* 294 */
+  {0x01030302},
+};
+
+/* max table bits  8 */
+
+/* TABLE 12   64 entries  maxbits 10  linbits  0 */
+static HUFF_ELEMENT huff_table_12[] =
+{
+  {0xFF000007}, {0x00000081}, {0x0000008A}, {0x0000008F}, {0x00000092},        /*  4 */
+  {0x00000097}, {0x0000009A}, {0x0000009D}, {0x000000A2}, {0x000000A5},        /*  9 */
+  {0x000000A8}, {0x07060202}, {0x07020602}, {0x07010602}, {0x000000AD},        /* 14 */
+  {0x000000B0}, {0x000000B3}, {0x07050102}, {0x07010502}, {0x07040302},        /* 19 */
+  {0x07030402}, {0x000000B6}, {0x07040202}, {0x07020402}, {0x07040102},        /* 24 */
+  {0x06030302}, {0x06030302}, {0x06010402}, {0x06010402}, {0x06030202},        /* 29 */
+  {0x06030202}, {0x06020302}, {0x06020302}, {0x07000401}, {0x07030001},        /* 34 */
+  {0x06000301}, {0x06000301}, {0x05030102}, {0x05030102}, {0x05030102},        /* 39 */
+  {0x05030102}, {0x05010302}, {0x05010302}, {0x05010302}, {0x05010302},        /* 44 */
+  {0x05020202}, {0x05020202}, {0x05020202}, {0x05020202}, {0x04020102},        /* 49 */
+  {0x04020102}, {0x04020102}, {0x04020102}, {0x04020102}, {0x04020102},        /* 54 */
+  {0x04020102}, {0x04020102}, {0x04010202}, {0x04010202}, {0x04010202},        /* 59 */
+  {0x04010202}, {0x04010202}, {0x04010202}, {0x04010202}, {0x04010202},        /* 64 */
+  {0x05020001}, {0x05020001}, {0x05020001}, {0x05020001}, {0x05000201},        /* 69 */
+  {0x05000201}, {0x05000201}, {0x05000201}, {0x04000000}, {0x04000000},        /* 74 */
+  {0x04000000}, {0x04000000}, {0x04000000}, {0x04000000}, {0x04000000},        /* 79 */
+  {0x04000000}, {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102},        /* 84 */
+  {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102},        /* 89 */
+  {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102},        /* 94 */
+  {0x03010102}, {0x03010102}, {0x03010001}, {0x03010001}, {0x03010001},        /* 99 */
+  {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001},        /* 104 */
+  {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001}, {0x03010001},        /* 109 */
+  {0x03010001}, {0x03010001}, {0x03010001}, {0x03000101}, {0x03000101},        /* 114 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101},        /* 119 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101},        /* 124 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101}, {0xFF000003},        /* 129 */
+  {0x03070702}, {0x03070602}, {0x02060702}, {0x02060702}, {0x02070502},        /* 134 */
+  {0x02070502}, {0x02050702}, {0x02050702}, {0xFF000002}, {0x02060602},        /* 139 */
+  {0x02070402}, {0x02040702}, {0x02050602}, {0xFF000001}, {0x01060502},        /* 144 */
+  {0x01070302}, {0xFF000002}, {0x02030702}, {0x02050502}, {0x01070202},        /* 149 */
+  {0x01070202}, {0xFF000001}, {0x01020702}, {0x01060402}, {0xFF000001},        /* 154 */
+  {0x01040602}, {0x01070102}, {0xFF000002}, {0x01010702}, {0x01010702},        /* 159 */
+  {0x02070001}, {0x02000701}, {0xFF000001}, {0x01060302}, {0x01030602},        /* 164 */
+  {0xFF000001}, {0x01050402}, {0x01040502}, {0xFF000002}, {0x01040402},        /* 169 */
+  {0x01040402}, {0x02060001}, {0x02050001}, {0xFF000001}, {0x01060102},        /* 174 */
+  {0x01000601}, {0xFF000001}, {0x01050302}, {0x01030502}, {0xFF000001},        /* 179 */
+  {0x01050202}, {0x01020502}, {0xFF000001}, {0x01000501}, {0x01040001}, /* 184 */
+};
+
+/* max table bits  7 */
+
+/* TABLE 13  256 entries  maxbits 19  linbits  0 */
+static HUFF_ELEMENT huff_table_13[] =
+{
+  {0xFF000006}, {0x00000041}, {0x00000082}, {0x000000C3}, {0x000000E4},        /*  4 */
+  {0x00000105}, {0x00000116}, {0x0000011F}, {0x00000130}, {0x00000139},        /*  9 */
+  {0x0000013E}, {0x00000143}, {0x00000146}, {0x06020102}, {0x06010202},        /* 14 */
+  {0x06020001}, {0x06000201}, {0x04010102}, {0x04010102}, {0x04010102},        /* 19 */
+  {0x04010102}, {0x04010001}, {0x04010001}, {0x04010001}, {0x04010001},        /* 24 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101},        /* 29 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x01000000}, {0x01000000},        /* 34 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 39 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 44 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 49 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 54 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 59 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 64 */
+  {0xFF000006}, {0x00000108}, {0x00000111}, {0x0000011A}, {0x00000123},        /* 69 */
+  {0x0000012C}, {0x00000131}, {0x00000136}, {0x0000013F}, {0x00000144},        /* 74 */
+  {0x00000147}, {0x0000014C}, {0x00000151}, {0x00000156}, {0x0000015B},        /* 79 */
+  {0x060F0102}, {0x06010F02}, {0x06000F01}, {0x00000160}, {0x00000163},        /* 84 */
+  {0x00000166}, {0x06020E02}, {0x00000169}, {0x060E0102}, {0x06010E02},        /* 89 */
+  {0x0000016C}, {0x0000016F}, {0x00000172}, {0x00000175}, {0x00000178},        /* 94 */
+  {0x0000017B}, {0x06060C02}, {0x060D0302}, {0x0000017E}, {0x060D0202},        /* 99 */
+  {0x06020D02}, {0x060D0102}, {0x06070B02}, {0x00000181}, {0x00000184},        /* 104 */
+  {0x06030C02}, {0x00000187}, {0x060B0402}, {0x05010D02}, {0x05010D02},        /* 109 */
+  {0x060D0001}, {0x06000D01}, {0x060A0802}, {0x06080A02}, {0x060C0402},        /* 114 */
+  {0x06040C02}, {0x060B0602}, {0x06060B02}, {0x050C0302}, {0x050C0302},        /* 119 */
+  {0x050C0202}, {0x050C0202}, {0x05020C02}, {0x05020C02}, {0x050B0502},        /* 124 */
+  {0x050B0502}, {0x06050B02}, {0x06090802}, {0x050C0102}, {0x050C0102},        /* 129 */
+  {0xFF000006}, {0x05010C02}, {0x05010C02}, {0x06080902}, {0x060C0001},        /* 134 */
+  {0x05000C01}, {0x05000C01}, {0x06040B02}, {0x060A0602}, {0x06060A02},        /* 139 */
+  {0x06090702}, {0x050B0302}, {0x050B0302}, {0x05030B02}, {0x05030B02},        /* 144 */
+  {0x06080802}, {0x060A0502}, {0x050B0202}, {0x050B0202}, {0x06050A02},        /* 149 */
+  {0x06090602}, {0x05040A02}, {0x05040A02}, {0x06080702}, {0x06070802},        /* 154 */
+  {0x05040902}, {0x05040902}, {0x06070702}, {0x06060702}, {0x04020B02},        /* 159 */
+  {0x04020B02}, {0x04020B02}, {0x04020B02}, {0x040B0102}, {0x040B0102},        /* 164 */
+  {0x040B0102}, {0x040B0102}, {0x04010B02}, {0x04010B02}, {0x04010B02},        /* 169 */
+  {0x04010B02}, {0x050B0001}, {0x050B0001}, {0x05000B01}, {0x05000B01},        /* 174 */
+  {0x05060902}, {0x05060902}, {0x050A0402}, {0x050A0402}, {0x050A0302},        /* 179 */
+  {0x050A0302}, {0x05030A02}, {0x05030A02}, {0x05090502}, {0x05090502},        /* 184 */
+  {0x05050902}, {0x05050902}, {0x040A0202}, {0x040A0202}, {0x040A0202},        /* 189 */
+  {0x040A0202}, {0x04020A02}, {0x04020A02}, {0x04020A02}, {0x04020A02},        /* 194 */
+  {0xFF000005}, {0x040A0102}, {0x040A0102}, {0x04010A02}, {0x04010A02},        /* 199 */
+  {0x050A0001}, {0x05080602}, {0x04000A01}, {0x04000A01}, {0x05060802},        /* 204 */
+  {0x05090402}, {0x04030902}, {0x04030902}, {0x05090302}, {0x05080502},        /* 209 */
+  {0x05050802}, {0x05070602}, {0x04090202}, {0x04090202}, {0x04020902},        /* 214 */
+  {0x04020902}, {0x05070502}, {0x05050702}, {0x04080302}, {0x04080302},        /* 219 */
+  {0x04030802}, {0x04030802}, {0x05060602}, {0x05070402}, {0x05040702},        /* 224 */
+  {0x05060502}, {0x05050602}, {0x05030702}, {0xFF000005}, {0x03090102},        /* 229 */
+  {0x03090102}, {0x03090102}, {0x03090102}, {0x03010902}, {0x03010902},        /* 234 */
+  {0x03010902}, {0x03010902}, {0x04090001}, {0x04090001}, {0x04000901},        /* 239 */
+  {0x04000901}, {0x04080402}, {0x04080402}, {0x04040802}, {0x04040802},        /* 244 */
+  {0x04020702}, {0x04020702}, {0x05060402}, {0x05040602}, {0x03080202},        /* 249 */
+  {0x03080202}, {0x03080202}, {0x03080202}, {0x03020802}, {0x03020802},        /* 254 */
+  {0x03020802}, {0x03020802}, {0x03080102}, {0x03080102}, {0x03080102},        /* 259 */
+  {0x03080102}, {0xFF000004}, {0x04070302}, {0x04070202}, {0x03070102},        /* 264 */
+  {0x03070102}, {0x03010702}, {0x03010702}, {0x04050502}, {0x04070001},        /* 269 */
+  {0x04000701}, {0x04060302}, {0x04030602}, {0x04050402}, {0x04040502},        /* 274 */
+  {0x04060202}, {0x04020602}, {0x04050302}, {0xFF000003}, {0x02010802},        /* 279 */
+  {0x02010802}, {0x03080001}, {0x03000801}, {0x03060102}, {0x03010602},        /* 284 */
+  {0x03060001}, {0x03000601}, {0xFF000004}, {0x04030502}, {0x04040402},        /* 289 */
+  {0x03050202}, {0x03050202}, {0x03020502}, {0x03020502}, {0x03050001},        /* 294 */
+  {0x03050001}, {0x02050102}, {0x02050102}, {0x02050102}, {0x02050102},        /* 299 */
+  {0x02010502}, {0x02010502}, {0x02010502}, {0x02010502}, {0xFF000003},        /* 304 */
+  {0x03040302}, {0x03030402}, {0x03000501}, {0x03040202}, {0x03020402},        /* 309 */
+  {0x03030302}, {0x02040102}, {0x02040102}, {0xFF000002}, {0x01010402},        /* 314 */
+  {0x01010402}, {0x02040001}, {0x02000401}, {0xFF000002}, {0x02030202},        /* 319 */
+  {0x02020302}, {0x01030102}, {0x01030102}, {0xFF000001}, {0x01010302},        /* 324 */
+  {0x01030001}, {0xFF000001}, {0x01000301}, {0x01020202}, {0xFF000003},        /* 329 */
+  {0x00000082}, {0x0000008B}, {0x0000008E}, {0x00000091}, {0x00000094},        /* 334 */
+  {0x00000097}, {0x030C0E02}, {0x030D0D02}, {0xFF000003}, {0x00000093},        /* 339 */
+  {0x030E0B02}, {0x030B0E02}, {0x030F0902}, {0x03090F02}, {0x030A0E02},        /* 344 */
+  {0x030D0B02}, {0x030B0D02}, {0xFF000003}, {0x030F0802}, {0x03080F02},        /* 349 */
+  {0x030C0C02}, {0x0000008D}, {0x030E0802}, {0x00000090}, {0x02070F02},        /* 354 */
+  {0x02070F02}, {0xFF000003}, {0x020A0D02}, {0x020A0D02}, {0x030D0A02},        /* 359 */
+  {0x030C0B02}, {0x030B0C02}, {0x03060F02}, {0x020F0602}, {0x020F0602},        /* 364 */
+  {0xFF000002}, {0x02080E02}, {0x020F0502}, {0x020D0902}, {0x02090D02},        /* 369 */
+  {0xFF000002}, {0x02050F02}, {0x02070E02}, {0x020C0A02}, {0x020B0B02},        /* 374 */
+  {0xFF000003}, {0x020F0402}, {0x020F0402}, {0x02040F02}, {0x02040F02},        /* 379 */
+  {0x030A0C02}, {0x03060E02}, {0x02030F02}, {0x02030F02}, {0xFF000002},        /* 384 */
+  {0x010F0302}, {0x010F0302}, {0x020D0802}, {0x02080D02}, {0xFF000001},        /* 389 */
+  {0x010F0202}, {0x01020F02}, {0xFF000002}, {0x020E0602}, {0x020C0902},        /* 394 */
+  {0x010F0001}, {0x010F0001}, {0xFF000002}, {0x02090C02}, {0x020E0502},        /* 399 */
+  {0x010B0A02}, {0x010B0A02}, {0xFF000002}, {0x020D0702}, {0x02070D02},        /* 404 */
+  {0x010E0402}, {0x010E0402}, {0xFF000002}, {0x02080C02}, {0x02060D02},        /* 409 */
+  {0x010E0302}, {0x010E0302}, {0xFF000002}, {0x01090B02}, {0x01090B02},        /* 414 */
+  {0x020B0902}, {0x020A0A02}, {0xFF000001}, {0x010A0B02}, {0x01050E02},        /* 419 */
+  {0xFF000001}, {0x01040E02}, {0x010C0802}, {0xFF000001}, {0x010D0602},        /* 424 */
+  {0x01030E02}, {0xFF000001}, {0x010E0202}, {0x010E0001}, {0xFF000001},        /* 429 */
+  {0x01000E01}, {0x010D0502}, {0xFF000001}, {0x01050D02}, {0x010C0702},        /* 434 */
+  {0xFF000001}, {0x01070C02}, {0x010D0402}, {0xFF000001}, {0x010B0802},        /* 439 */
+  {0x01080B02}, {0xFF000001}, {0x01040D02}, {0x010A0902}, {0xFF000001},        /* 444 */
+  {0x01090A02}, {0x010C0602}, {0xFF000001}, {0x01030D02}, {0x010B0702},        /* 449 */
+  {0xFF000001}, {0x010C0502}, {0x01050C02}, {0xFF000001}, {0x01090902},        /* 454 */
+  {0x010A0702}, {0xFF000001}, {0x01070A02}, {0x01070902}, {0xFF000003},        /* 459 */
+  {0x00000023}, {0x030D0F02}, {0x020D0E02}, {0x020D0E02}, {0x010F0F02},        /* 464 */
+  {0x010F0F02}, {0x010F0F02}, {0x010F0F02}, {0xFF000001}, {0x010F0E02},        /* 469 */
+  {0x010F0D02}, {0xFF000001}, {0x010E0E02}, {0x010F0C02}, {0xFF000001},        /* 474 */
+  {0x010E0D02}, {0x010F0B02}, {0xFF000001}, {0x010B0F02}, {0x010E0C02},        /* 479 */
+  {0xFF000002}, {0x010C0D02}, {0x010C0D02}, {0x020F0A02}, {0x02090E02},        /* 484 */
+  {0xFF000001}, {0x010A0F02}, {0x010D0C02}, {0xFF000001}, {0x010E0A02},        /* 489 */
+  {0x010E0902}, {0xFF000001}, {0x010F0702}, {0x010E0702}, {0xFF000001},        /* 494 */
+  {0x010E0F02}, {0x010C0F02},
+};
+
+/* max table bits  6 */
+/* NO XING TABLE 14 */
+
+/* TABLE 15  256 entries  maxbits 13  linbits  0 */
+static HUFF_ELEMENT huff_table_15[] =
+{
+  {0xFF000008}, {0x00000101}, {0x00000122}, {0x00000143}, {0x00000154},        /*  4 */
+  {0x00000165}, {0x00000176}, {0x0000017F}, {0x00000188}, {0x00000199},        /*  9 */
+  {0x000001A2}, {0x000001AB}, {0x000001B4}, {0x000001BD}, {0x000001C2},        /* 14 */
+  {0x000001CB}, {0x000001D4}, {0x000001D9}, {0x000001DE}, {0x000001E3},        /* 19 */
+  {0x000001E8}, {0x000001ED}, {0x000001F2}, {0x000001F7}, {0x000001FC},        /* 24 */
+  {0x00000201}, {0x00000204}, {0x00000207}, {0x0000020A}, {0x0000020F},        /* 29 */
+  {0x00000212}, {0x00000215}, {0x0000021A}, {0x0000021D}, {0x00000220},        /* 34 */
+  {0x08010902}, {0x00000223}, {0x00000226}, {0x00000229}, {0x0000022C},        /* 39 */
+  {0x0000022F}, {0x08080202}, {0x08020802}, {0x08080102}, {0x08010802},        /* 44 */
+  {0x00000232}, {0x00000235}, {0x00000238}, {0x0000023B}, {0x08070202},        /* 49 */
+  {0x08020702}, {0x08040602}, {0x08070102}, {0x08050502}, {0x08010702},        /* 54 */
+  {0x0000023E}, {0x08060302}, {0x08030602}, {0x08050402}, {0x08040502},        /* 59 */
+  {0x08060202}, {0x08020602}, {0x08060102}, {0x00000241}, {0x08050302},        /* 64 */
+  {0x07010602}, {0x07010602}, {0x08030502}, {0x08040402}, {0x07050202},        /* 69 */
+  {0x07050202}, {0x07020502}, {0x07020502}, {0x07050102}, {0x07050102},        /* 74 */
+  {0x07010502}, {0x07010502}, {0x08050001}, {0x08000501}, {0x07040302},        /* 79 */
+  {0x07040302}, {0x07030402}, {0x07030402}, {0x07040202}, {0x07040202},        /* 84 */
+  {0x07020402}, {0x07020402}, {0x07030302}, {0x07030302}, {0x06010402},        /* 89 */
+  {0x06010402}, {0x06010402}, {0x06010402}, {0x07040102}, {0x07040102},        /* 94 */
+  {0x07040001}, {0x07040001}, {0x06030202}, {0x06030202}, {0x06030202},        /* 99 */
+  {0x06030202}, {0x06020302}, {0x06020302}, {0x06020302}, {0x06020302},        /* 104 */
+  {0x07000401}, {0x07000401}, {0x07030001}, {0x07030001}, {0x06030102},        /* 109 */
+  {0x06030102}, {0x06030102}, {0x06030102}, {0x06010302}, {0x06010302},        /* 114 */
+  {0x06010302}, {0x06010302}, {0x06000301}, {0x06000301}, {0x06000301},        /* 119 */
+  {0x06000301}, {0x05020202}, {0x05020202}, {0x05020202}, {0x05020202},        /* 124 */
+  {0x05020202}, {0x05020202}, {0x05020202}, {0x05020202}, {0x05020102},        /* 129 */
+  {0x05020102}, {0x05020102}, {0x05020102}, {0x05020102}, {0x05020102},        /* 134 */
+  {0x05020102}, {0x05020102}, {0x05010202}, {0x05010202}, {0x05010202},        /* 139 */
+  {0x05010202}, {0x05010202}, {0x05010202}, {0x05010202}, {0x05010202},        /* 144 */
+  {0x05020001}, {0x05020001}, {0x05020001}, {0x05020001}, {0x05020001},        /* 149 */
+  {0x05020001}, {0x05020001}, {0x05020001}, {0x05000201}, {0x05000201},        /* 154 */
+  {0x05000201}, {0x05000201}, {0x05000201}, {0x05000201}, {0x05000201},        /* 159 */
+  {0x05000201}, {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102},        /* 164 */
+  {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102},        /* 169 */
+  {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102},        /* 174 */
+  {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102},        /* 179 */
+  {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102},        /* 184 */
+  {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102}, {0x03010102},        /* 189 */
+  {0x03010102}, {0x03010102}, {0x03010102}, {0x04010001}, {0x04010001},        /* 194 */
+  {0x04010001}, {0x04010001}, {0x04010001}, {0x04010001}, {0x04010001},        /* 199 */
+  {0x04010001}, {0x04010001}, {0x04010001}, {0x04010001}, {0x04010001},        /* 204 */
+  {0x04010001}, {0x04010001}, {0x04010001}, {0x04010001}, {0x04000101},        /* 209 */
+  {0x04000101}, {0x04000101}, {0x04000101}, {0x04000101}, {0x04000101},        /* 214 */
+  {0x04000101}, {0x04000101}, {0x04000101}, {0x04000101}, {0x04000101},        /* 219 */
+  {0x04000101}, {0x04000101}, {0x04000101}, {0x04000101}, {0x04000101},        /* 224 */
+  {0x03000000}, {0x03000000}, {0x03000000}, {0x03000000}, {0x03000000},        /* 229 */
+  {0x03000000}, {0x03000000}, {0x03000000}, {0x03000000}, {0x03000000},        /* 234 */
+  {0x03000000}, {0x03000000}, {0x03000000}, {0x03000000}, {0x03000000},        /* 239 */
+  {0x03000000}, {0x03000000}, {0x03000000}, {0x03000000}, {0x03000000},        /* 244 */
+  {0x03000000}, {0x03000000}, {0x03000000}, {0x03000000}, {0x03000000},        /* 249 */
+  {0x03000000}, {0x03000000}, {0x03000000}, {0x03000000}, {0x03000000},        /* 254 */
+  {0x03000000}, {0x03000000}, {0xFF000005}, {0x050F0F02}, {0x050F0E02},        /* 259 */
+  {0x050E0F02}, {0x050F0D02}, {0x040E0E02}, {0x040E0E02}, {0x050D0F02},        /* 264 */
+  {0x050F0C02}, {0x050C0F02}, {0x050E0D02}, {0x050D0E02}, {0x050F0B02},        /* 269 */
+  {0x040B0F02}, {0x040B0F02}, {0x050E0C02}, {0x050C0E02}, {0x040D0D02},        /* 274 */
+  {0x040D0D02}, {0x040F0A02}, {0x040F0A02}, {0x040A0F02}, {0x040A0F02},        /* 279 */
+  {0x040E0B02}, {0x040E0B02}, {0x040B0E02}, {0x040B0E02}, {0x040D0C02},        /* 284 */
+  {0x040D0C02}, {0x040C0D02}, {0x040C0D02}, {0x040F0902}, {0x040F0902},        /* 289 */
+  {0xFF000005}, {0x04090F02}, {0x04090F02}, {0x040A0E02}, {0x040A0E02},        /* 294 */
+  {0x040D0B02}, {0x040D0B02}, {0x040B0D02}, {0x040B0D02}, {0x040F0802},        /* 299 */
+  {0x040F0802}, {0x04080F02}, {0x04080F02}, {0x040C0C02}, {0x040C0C02},        /* 304 */
+  {0x040E0902}, {0x040E0902}, {0x04090E02}, {0x04090E02}, {0x040F0702},        /* 309 */
+  {0x040F0702}, {0x04070F02}, {0x04070F02}, {0x040D0A02}, {0x040D0A02},        /* 314 */
+  {0x040A0D02}, {0x040A0D02}, {0x040C0B02}, {0x040C0B02}, {0x040F0602},        /* 319 */
+  {0x040F0602}, {0x050E0A02}, {0x050F0001}, {0xFF000004}, {0x030B0C02},        /* 324 */
+  {0x030B0C02}, {0x03060F02}, {0x03060F02}, {0x040E0802}, {0x04080E02},        /* 329 */
+  {0x040F0502}, {0x040D0902}, {0x03050F02}, {0x03050F02}, {0x030E0702},        /* 334 */
+  {0x030E0702}, {0x03070E02}, {0x03070E02}, {0x030C0A02}, {0x030C0A02},        /* 339 */
+  {0xFF000004}, {0x030A0C02}, {0x030A0C02}, {0x030B0B02}, {0x030B0B02},        /* 344 */
+  {0x04090D02}, {0x040D0802}, {0x030F0402}, {0x030F0402}, {0x03040F02},        /* 349 */
+  {0x03040F02}, {0x030F0302}, {0x030F0302}, {0x03030F02}, {0x03030F02},        /* 354 */
+  {0x03080D02}, {0x03080D02}, {0xFF000004}, {0x03060E02}, {0x03060E02},        /* 359 */
+  {0x030F0202}, {0x030F0202}, {0x03020F02}, {0x03020F02}, {0x040E0602},        /* 364 */
+  {0x04000F01}, {0x030F0102}, {0x030F0102}, {0x03010F02}, {0x03010F02},        /* 369 */
+  {0x030C0902}, {0x030C0902}, {0x03090C02}, {0x03090C02}, {0xFF000003},        /* 374 */
+  {0x030E0502}, {0x030B0A02}, {0x030A0B02}, {0x03050E02}, {0x030D0702},        /* 379 */
+  {0x03070D02}, {0x030E0402}, {0x03040E02}, {0xFF000003}, {0x030C0802},        /* 384 */
+  {0x03080C02}, {0x030E0302}, {0x030D0602}, {0x03060D02}, {0x03030E02},        /* 389 */
+  {0x030B0902}, {0x03090B02}, {0xFF000004}, {0x030E0202}, {0x030E0202},        /* 394 */
+  {0x030A0A02}, {0x030A0A02}, {0x03020E02}, {0x03020E02}, {0x030E0102},        /* 399 */
+  {0x030E0102}, {0x03010E02}, {0x03010E02}, {0x040E0001}, {0x04000E01},        /* 404 */
+  {0x030D0502}, {0x030D0502}, {0x03050D02}, {0x03050D02}, {0xFF000003},        /* 409 */
+  {0x030C0702}, {0x03070C02}, {0x030D0402}, {0x030B0802}, {0x02040D02},        /* 414 */
+  {0x02040D02}, {0x03080B02}, {0x030A0902}, {0xFF000003}, {0x03090A02},        /* 419 */
+  {0x030C0602}, {0x03060C02}, {0x030D0302}, {0x02030D02}, {0x02030D02},        /* 424 */
+  {0x02020D02}, {0x02020D02}, {0xFF000003}, {0x030D0202}, {0x030D0001},        /* 429 */
+  {0x020D0102}, {0x020D0102}, {0x020B0702}, {0x020B0702}, {0x02070B02},        /* 434 */
+  {0x02070B02}, {0xFF000003}, {0x02010D02}, {0x02010D02}, {0x030C0502},        /* 439 */
+  {0x03000D01}, {0x02050C02}, {0x02050C02}, {0x020A0802}, {0x020A0802},        /* 444 */
+  {0xFF000002}, {0x02080A02}, {0x020C0402}, {0x02040C02}, {0x020B0602},        /* 449 */
+  {0xFF000003}, {0x02060B02}, {0x02060B02}, {0x03090902}, {0x030C0001},        /* 454 */
+  {0x020C0302}, {0x020C0302}, {0x02030C02}, {0x02030C02}, {0xFF000003},        /* 459 */
+  {0x020A0702}, {0x020A0702}, {0x02070A02}, {0x02070A02}, {0x02060A02},        /* 464 */
+  {0x02060A02}, {0x03000C01}, {0x030B0001}, {0xFF000002}, {0x01020C02},        /* 469 */
+  {0x01020C02}, {0x020C0202}, {0x020B0502}, {0xFF000002}, {0x02050B02},        /* 474 */
+  {0x020C0102}, {0x02090802}, {0x02080902}, {0xFF000002}, {0x02010C02},        /* 479 */
+  {0x020B0402}, {0x02040B02}, {0x020A0602}, {0xFF000002}, {0x020B0302},        /* 484 */
+  {0x02090702}, {0x01030B02}, {0x01030B02}, {0xFF000002}, {0x02070902},        /* 489 */
+  {0x02080802}, {0x020B0202}, {0x020A0502}, {0xFF000002}, {0x01020B02},        /* 494 */
+  {0x01020B02}, {0x02050A02}, {0x020B0102}, {0xFF000002}, {0x01010B02},        /* 499 */
+  {0x01010B02}, {0x02000B01}, {0x02090602}, {0xFF000002}, {0x02060902},        /* 504 */
+  {0x020A0402}, {0x02040A02}, {0x02080702}, {0xFF000002}, {0x02070802},        /* 509 */
+  {0x020A0302}, {0x01030A02}, {0x01030A02}, {0xFF000001}, {0x01090502},        /* 514 */
+  {0x01050902}, {0xFF000001}, {0x010A0202}, {0x01020A02}, {0xFF000001},        /* 519 */
+  {0x010A0102}, {0x01010A02}, {0xFF000002}, {0x020A0001}, {0x02000A01},        /* 524 */
+  {0x01080602}, {0x01080602}, {0xFF000001}, {0x01060802}, {0x01090402},        /* 529 */
+  {0xFF000001}, {0x01040902}, {0x01090302}, {0xFF000002}, {0x01030902},        /* 534 */
+  {0x01030902}, {0x02070702}, {0x02090001}, {0xFF000001}, {0x01080502},        /* 539 */
+  {0x01050802}, {0xFF000001}, {0x01090202}, {0x01070602}, {0xFF000001},        /* 544 */
+  {0x01060702}, {0x01020902}, {0xFF000001}, {0x01090102}, {0x01000901},        /* 549 */
+  {0xFF000001}, {0x01080402}, {0x01040802}, {0xFF000001}, {0x01070502},        /* 554 */
+  {0x01050702}, {0xFF000001}, {0x01080302}, {0x01030802}, {0xFF000001},        /* 559 */
+  {0x01060602}, {0x01070402}, {0xFF000001}, {0x01040702}, {0x01080001},        /* 564 */
+  {0xFF000001}, {0x01000801}, {0x01060502}, {0xFF000001}, {0x01050602},        /* 569 */
+  {0x01070302}, {0xFF000001}, {0x01030702}, {0x01060402}, {0xFF000001},        /* 574 */
+  {0x01070001}, {0x01000701}, {0xFF000001}, {0x01060001}, {0x01000601}, /* 579 */
+};
+
+/* max table bits  8 */
+
+/* TABLE 16  256 entries  maxbits 17  linbits  0 */
+static HUFF_ELEMENT huff_table_16[] =
+{
+  {0xFF000008}, {0x00000101}, {0x0000010A}, {0x00000113}, {0x080F0F02},        /*  4 */
+  {0x00000118}, {0x0000011D}, {0x00000120}, {0x08020F02}, {0x00000131},        /*  9 */
+  {0x080F0102}, {0x08010F02}, {0x00000134}, {0x00000145}, {0x00000156},        /* 14 */
+  {0x00000167}, {0x00000178}, {0x00000189}, {0x0000019A}, {0x000001A3},        /* 19 */
+  {0x000001AC}, {0x000001B5}, {0x000001BE}, {0x000001C7}, {0x000001D0},        /* 24 */
+  {0x000001D9}, {0x000001DE}, {0x000001E3}, {0x000001E6}, {0x000001EB},        /* 29 */
+  {0x000001F0}, {0x08010502}, {0x000001F3}, {0x000001F6}, {0x000001F9},        /* 34 */
+  {0x000001FC}, {0x08040102}, {0x08010402}, {0x000001FF}, {0x08030202},        /* 39 */
+  {0x08020302}, {0x07030102}, {0x07030102}, {0x07010302}, {0x07010302},        /* 44 */
+  {0x08030001}, {0x08000301}, {0x07020202}, {0x07020202}, {0x06020102},        /* 49 */
+  {0x06020102}, {0x06020102}, {0x06020102}, {0x06010202}, {0x06010202},        /* 54 */
+  {0x06010202}, {0x06010202}, {0x06020001}, {0x06020001}, {0x06020001},        /* 59 */
+  {0x06020001}, {0x06000201}, {0x06000201}, {0x06000201}, {0x06000201},        /* 64 */
+  {0x04010102}, {0x04010102}, {0x04010102}, {0x04010102}, {0x04010102},        /* 69 */
+  {0x04010102}, {0x04010102}, {0x04010102}, {0x04010102}, {0x04010102},        /* 74 */
+  {0x04010102}, {0x04010102}, {0x04010102}, {0x04010102}, {0x04010102},        /* 79 */
+  {0x04010102}, {0x04010001}, {0x04010001}, {0x04010001}, {0x04010001},        /* 84 */
+  {0x04010001}, {0x04010001}, {0x04010001}, {0x04010001}, {0x04010001},        /* 89 */
+  {0x04010001}, {0x04010001}, {0x04010001}, {0x04010001}, {0x04010001},        /* 94 */
+  {0x04010001}, {0x04010001}, {0x03000101}, {0x03000101}, {0x03000101},        /* 99 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101},        /* 104 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101},        /* 109 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101},        /* 114 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101},        /* 119 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101},        /* 124 */
+  {0x03000101}, {0x03000101}, {0x03000101}, {0x03000101}, {0x01000000},        /* 129 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 134 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 139 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 144 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 149 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 154 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 159 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 164 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 169 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 174 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 179 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 184 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 189 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 194 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 199 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 204 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 209 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 214 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 219 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 224 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 229 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 234 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 239 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 244 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 249 */
+  {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000}, {0x01000000},        /* 254 */
+  {0x01000000}, {0x01000000}, {0xFF000003}, {0x030F0E02}, {0x030E0F02},        /* 259 */
+  {0x030F0D02}, {0x030D0F02}, {0x030F0C02}, {0x030C0F02}, {0x030F0B02},        /* 264 */
+  {0x030B0F02}, {0xFF000003}, {0x020F0A02}, {0x020F0A02}, {0x030A0F02},        /* 269 */
+  {0x030F0902}, {0x03090F02}, {0x03080F02}, {0x020F0802}, {0x020F0802},        /* 274 */
+  {0xFF000002}, {0x020F0702}, {0x02070F02}, {0x020F0602}, {0x02060F02},        /* 279 */
+  {0xFF000002}, {0x020F0502}, {0x02050F02}, {0x010F0402}, {0x010F0402},        /* 284 */
+  {0xFF000001}, {0x01040F02}, {0x01030F02}, {0xFF000004}, {0x01000F01},        /* 289 */
+  {0x01000F01}, {0x01000F01}, {0x01000F01}, {0x01000F01}, {0x01000F01},        /* 294 */
+  {0x01000F01}, {0x01000F01}, {0x020F0302}, {0x020F0302}, {0x020F0302},        /* 299 */
+  {0x020F0302}, {0x000000E2}, {0x000000F3}, {0x000000FC}, {0x00000105},        /* 304 */
+  {0xFF000001}, {0x010F0202}, {0x010F0001}, {0xFF000004}, {0x000000FA},        /* 309 */
+  {0x000000FF}, {0x00000104}, {0x00000109}, {0x0000010C}, {0x00000111},        /* 314 */
+  {0x00000116}, {0x00000119}, {0x0000011E}, {0x00000123}, {0x00000128},        /* 319 */
+  {0x04030E02}, {0x0000012D}, {0x00000130}, {0x00000133}, {0x00000136},        /* 324 */
+  {0xFF000004}, {0x00000128}, {0x0000012B}, {0x0000012E}, {0x040D0001},        /* 329 */
+  {0x00000131}, {0x00000134}, {0x00000137}, {0x040C0302}, {0x0000013A},        /* 334 */
+  {0x040C0102}, {0x04000C01}, {0x0000013D}, {0x03020E02}, {0x03020E02},        /* 339 */
+  {0x040E0202}, {0x040E0102}, {0xFF000004}, {0x04030D02}, {0x040D0202},        /* 344 */
+  {0x04020D02}, {0x04010D02}, {0x040B0302}, {0x0000012F}, {0x030D0102},        /* 349 */
+  {0x030D0102}, {0x04040C02}, {0x040B0602}, {0x04030C02}, {0x04070A02},        /* 354 */
+  {0x030C0202}, {0x030C0202}, {0x04020C02}, {0x04050B02}, {0xFF000004},        /* 359 */
+  {0x04010C02}, {0x040C0001}, {0x040B0402}, {0x04040B02}, {0x040A0602},        /* 364 */
+  {0x04060A02}, {0x03030B02}, {0x03030B02}, {0x040A0502}, {0x04050A02},        /* 369 */
+  {0x030B0202}, {0x030B0202}, {0x03020B02}, {0x03020B02}, {0x030B0102},        /* 374 */
+  {0x030B0102}, {0xFF000004}, {0x03010B02}, {0x03010B02}, {0x040B0001},        /* 379 */
+  {0x04000B01}, {0x04090602}, {0x04060902}, {0x040A0402}, {0x04040A02},        /* 384 */
+  {0x04080702}, {0x04070802}, {0x03030A02}, {0x03030A02}, {0x040A0302},        /* 389 */
+  {0x04090502}, {0x030A0202}, {0x030A0202}, {0xFF000004}, {0x04050902},        /* 394 */
+  {0x04080602}, {0x03010A02}, {0x03010A02}, {0x04060802}, {0x04070702},        /* 399 */
+  {0x03040902}, {0x03040902}, {0x04090402}, {0x04070502}, {0x03070602},        /* 404 */
+  {0x03070602}, {0x02020A02}, {0x02020A02}, {0x02020A02}, {0x02020A02},        /* 409 */
+  {0xFF000003}, {0x020A0102}, {0x020A0102}, {0x030A0001}, {0x03000A01},        /* 414 */
+  {0x03090302}, {0x03030902}, {0x03080502}, {0x03050802}, {0xFF000003},        /* 419 */
+  {0x02090202}, {0x02090202}, {0x02020902}, {0x02020902}, {0x03060702},        /* 424 */
+  {0x03090001}, {0x02090102}, {0x02090102}, {0xFF000003}, {0x02010902},        /* 429 */
+  {0x02010902}, {0x03000901}, {0x03080402}, {0x03040802}, {0x03050702},        /* 434 */
+  {0x03080302}, {0x03030802}, {0xFF000003}, {0x03060602}, {0x03080202},        /* 439 */
+  {0x02020802}, {0x02020802}, {0x03070402}, {0x03040702}, {0x02080102},        /* 444 */
+  {0x02080102}, {0xFF000003}, {0x02010802}, {0x02010802}, {0x02000801},        /* 449 */
+  {0x02000801}, {0x03080001}, {0x03060502}, {0x02070302}, {0x02070302},        /* 454 */
+  {0xFF000003}, {0x02030702}, {0x02030702}, {0x03050602}, {0x03060402},        /* 459 */
+  {0x02070202}, {0x02070202}, {0x02020702}, {0x02020702}, {0xFF000003},        /* 464 */
+  {0x03040602}, {0x03050502}, {0x02070001}, {0x02070001}, {0x01070102},        /* 469 */
+  {0x01070102}, {0x01070102}, {0x01070102}, {0xFF000002}, {0x01010702},        /* 474 */
+  {0x01010702}, {0x02000701}, {0x02060302}, {0xFF000002}, {0x02030602},        /* 479 */
+  {0x02050402}, {0x02040502}, {0x02060202}, {0xFF000001}, {0x01020602},        /* 484 */
+  {0x01060102}, {0xFF000002}, {0x01010602}, {0x01010602}, {0x02060001},        /* 489 */
+  {0x02000601}, {0xFF000002}, {0x01030502}, {0x01030502}, {0x02050302},        /* 494 */
+  {0x02040402}, {0xFF000001}, {0x01050202}, {0x01020502}, {0xFF000001},        /* 499 */
+  {0x01050102}, {0x01050001}, {0xFF000001}, {0x01040302}, {0x01030402},        /* 504 */
+  {0xFF000001}, {0x01000501}, {0x01040202}, {0xFF000001}, {0x01020402},        /* 509 */
+  {0x01030302}, {0xFF000001}, {0x01040001}, {0x01000401}, {0xFF000004},        /* 514 */
+  {0x040E0C02}, {0x00000086}, {0x030E0D02}, {0x030E0D02}, {0x03090E02},        /* 519 */
+  {0x03090E02}, {0x040A0E02}, {0x04090D02}, {0x020E0E02}, {0x020E0E02},        /* 524 */
+  {0x020E0E02}, {0x020E0E02}, {0x030D0E02}, {0x030D0E02}, {0x030B0E02},        /* 529 */
+  {0x030B0E02}, {0xFF000003}, {0x020E0B02}, {0x020E0B02}, {0x020D0C02},        /* 534 */
+  {0x020D0C02}, {0x030C0D02}, {0x030B0D02}, {0x020E0A02}, {0x020E0A02},        /* 539 */
+  {0xFF000003}, {0x020C0C02}, {0x020C0C02}, {0x030D0A02}, {0x030A0D02},        /* 544 */
+  {0x030E0702}, {0x030C0A02}, {0x020A0C02}, {0x020A0C02}, {0xFF000003},        /* 549 */
+  {0x03090C02}, {0x030D0702}, {0x020E0502}, {0x020E0502}, {0x010D0B02},        /* 554 */
+  {0x010D0B02}, {0x010D0B02}, {0x010D0B02}, {0xFF000002}, {0x010E0902},        /* 559 */
+  {0x010E0902}, {0x020C0B02}, {0x020B0C02}, {0xFF000002}, {0x020E0802},        /* 564 */
+  {0x02080E02}, {0x020D0902}, {0x02070E02}, {0xFF000002}, {0x020B0B02},        /* 569 */
+  {0x020D0802}, {0x02080D02}, {0x020E0602}, {0xFF000001}, {0x01060E02},        /* 574 */
+  {0x010C0902}, {0xFF000002}, {0x020B0A02}, {0x020A0B02}, {0x02050E02},        /* 579 */
+  {0x02070D02}, {0xFF000002}, {0x010E0402}, {0x010E0402}, {0x02040E02},        /* 584 */
+  {0x020C0802}, {0xFF000001}, {0x01080C02}, {0x010E0302}, {0xFF000002},        /* 589 */
+  {0x010D0602}, {0x010D0602}, {0x02060D02}, {0x020B0902}, {0xFF000002},        /* 594 */
+  {0x02090B02}, {0x020A0A02}, {0x01010E02}, {0x01010E02}, {0xFF000002},        /* 599 */
+  {0x01040D02}, {0x01040D02}, {0x02080B02}, {0x02090A02}, {0xFF000002},        /* 604 */
+  {0x010B0702}, {0x010B0702}, {0x02070B02}, {0x02000D01}, {0xFF000001},        /* 609 */
+  {0x010E0001}, {0x01000E01}, {0xFF000001}, {0x010D0502}, {0x01050D02},        /* 614 */
+  {0xFF000001}, {0x010C0702}, {0x01070C02}, {0xFF000001}, {0x010D0402},        /* 619 */
+  {0x010B0802}, {0xFF000001}, {0x010A0902}, {0x010C0602}, {0xFF000001},        /* 624 */
+  {0x01060C02}, {0x010D0302}, {0xFF000001}, {0x010C0502}, {0x01050C02},        /* 629 */
+  {0xFF000001}, {0x010A0802}, {0x01080A02}, {0xFF000001}, {0x01090902},        /* 634 */
+  {0x010C0402}, {0xFF000001}, {0x01060B02}, {0x010A0702}, {0xFF000001},        /* 639 */
+  {0x010B0502}, {0x01090802}, {0xFF000001}, {0x01080902}, {0x01090702},        /* 644 */
+  {0xFF000001}, {0x01070902}, {0x01080802}, {0xFF000001}, {0x010C0E02},        /* 649 */
+  {0x010D0D02},
+};
+
+/* max table bits  8 */
+/* NO XING TABLE 17 */
+/* NO XING TABLE 18 */
+/* NO XING TABLE 19 */
+/* NO XING TABLE 20 */
+/* NO XING TABLE 21 */
+/* NO XING TABLE 22 */
+/* NO XING TABLE 23 */
+
+/* TABLE 24  256 entries  maxbits 12  linbits  0 */
+static HUFF_ELEMENT huff_table_24[] =
+{
+  {0xFF000009}, {0x080F0E02}, {0x080F0E02}, {0x080E0F02}, {0x080E0F02},        /*  4 */
+  {0x080F0D02}, {0x080F0D02}, {0x080D0F02}, {0x080D0F02}, {0x080F0C02},        /*  9 */
+  {0x080F0C02}, {0x080C0F02}, {0x080C0F02}, {0x080F0B02}, {0x080F0B02},        /* 14 */
+  {0x080B0F02}, {0x080B0F02}, {0x070A0F02}, {0x070A0F02}, {0x070A0F02},        /* 19 */
+  {0x070A0F02}, {0x080F0A02}, {0x080F0A02}, {0x080F0902}, {0x080F0902},        /* 24 */
+  {0x07090F02}, {0x07090F02}, {0x07090F02}, {0x07090F02}, {0x07080F02},        /* 29 */
+  {0x07080F02}, {0x07080F02}, {0x07080F02}, {0x080F0802}, {0x080F0802},        /* 34 */
+  {0x080F0702}, {0x080F0702}, {0x07070F02}, {0x07070F02}, {0x07070F02},        /* 39 */
+  {0x07070F02}, {0x070F0602}, {0x070F0602}, {0x070F0602}, {0x070F0602},        /* 44 */
+  {0x07060F02}, {0x07060F02}, {0x07060F02}, {0x07060F02}, {0x070F0502},        /* 49 */
+  {0x070F0502}, {0x070F0502}, {0x070F0502}, {0x07050F02}, {0x07050F02},        /* 54 */
+  {0x07050F02}, {0x07050F02}, {0x070F0402}, {0x070F0402}, {0x070F0402},        /* 59 */
+  {0x070F0402}, {0x07040F02}, {0x07040F02}, {0x07040F02}, {0x07040F02},        /* 64 */
+  {0x070F0302}, {0x070F0302}, {0x070F0302}, {0x070F0302}, {0x07030F02},        /* 69 */
+  {0x07030F02}, {0x07030F02}, {0x07030F02}, {0x070F0202}, {0x070F0202},        /* 74 */
+  {0x070F0202}, {0x070F0202}, {0x07020F02}, {0x07020F02}, {0x07020F02},        /* 79 */
+  {0x07020F02}, {0x07010F02}, {0x07010F02}, {0x07010F02}, {0x07010F02},        /* 84 */
+  {0x080F0102}, {0x080F0102}, {0x08000F01}, {0x08000F01}, {0x090F0001},        /* 89 */
+  {0x00000201}, {0x00000206}, {0x0000020B}, {0x00000210}, {0x00000215},        /* 94 */
+  {0x0000021A}, {0x0000021F}, {0x040F0F02}, {0x040F0F02}, {0x040F0F02},        /* 99 */
+  {0x040F0F02}, {0x040F0F02}, {0x040F0F02}, {0x040F0F02}, {0x040F0F02},        /* 104 */
+  {0x040F0F02}, {0x040F0F02}, {0x040F0F02}, {0x040F0F02}, {0x040F0F02},        /* 109 */
+  {0x040F0F02}, {0x040F0F02}, {0x040F0F02}, {0x040F0F02}, {0x040F0F02},        /* 114 */
+  {0x040F0F02}, {0x040F0F02}, {0x040F0F02}, {0x040F0F02}, {0x040F0F02},        /* 119 */
+  {0x040F0F02}, {0x040F0F02}, {0x040F0F02}, {0x040F0F02}, {0x040F0F02},        /* 124 */
+  {0x040F0F02}, {0x040F0F02}, {0x040F0F02}, {0x040F0F02}, {0x00000224},        /* 129 */
+  {0x00000229}, {0x00000232}, {0x00000237}, {0x0000023A}, {0x0000023F},        /* 134 */
+  {0x00000242}, {0x00000245}, {0x0000024A}, {0x0000024D}, {0x00000250},        /* 139 */
+  {0x00000253}, {0x00000256}, {0x00000259}, {0x0000025C}, {0x0000025F},        /* 144 */
+  {0x00000262}, {0x00000265}, {0x00000268}, {0x0000026B}, {0x0000026E},        /* 149 */
+  {0x00000271}, {0x00000274}, {0x00000277}, {0x0000027A}, {0x0000027D},        /* 154 */
+  {0x00000280}, {0x00000283}, {0x00000288}, {0x0000028B}, {0x0000028E},        /* 159 */
+  {0x00000291}, {0x00000294}, {0x00000297}, {0x0000029A}, {0x0000029F},        /* 164 */
+  {0x09040B02}, {0x000002A4}, {0x000002A7}, {0x000002AA}, {0x09030B02},        /* 169 */
+  {0x09080802}, {0x000002AF}, {0x09020B02}, {0x000002B2}, {0x000002B5},        /* 174 */
+  {0x09060902}, {0x09040A02}, {0x000002B8}, {0x09070802}, {0x090A0302},        /* 179 */
+  {0x09030A02}, {0x09090502}, {0x09050902}, {0x090A0202}, {0x09020A02},        /* 184 */
+  {0x09010A02}, {0x09080602}, {0x09060802}, {0x09070702}, {0x09090402},        /* 189 */
+  {0x09040902}, {0x09090302}, {0x09030902}, {0x09080502}, {0x09050802},        /* 194 */
+  {0x09090202}, {0x09070602}, {0x09060702}, {0x09020902}, {0x09090102},        /* 199 */
+  {0x09010902}, {0x09080402}, {0x09040802}, {0x09070502}, {0x09050702},        /* 204 */
+  {0x09080302}, {0x09030802}, {0x09060602}, {0x09080202}, {0x09020802},        /* 209 */
+  {0x09080102}, {0x09070402}, {0x09040702}, {0x09010802}, {0x000002BB},        /* 214 */
+  {0x09060502}, {0x09050602}, {0x09070102}, {0x000002BE}, {0x08030702},        /* 219 */
+  {0x08030702}, {0x09070302}, {0x09070202}, {0x08020702}, {0x08020702},        /* 224 */
+  {0x08060402}, {0x08060402}, {0x08040602}, {0x08040602}, {0x08050502},        /* 229 */
+  {0x08050502}, {0x08010702}, {0x08010702}, {0x08060302}, {0x08060302},        /* 234 */
+  {0x08030602}, {0x08030602}, {0x08050402}, {0x08050402}, {0x08040502},        /* 239 */
+  {0x08040502}, {0x08060202}, {0x08060202}, {0x08020602}, {0x08020602},        /* 244 */
+  {0x08060102}, {0x08060102}, {0x08010602}, {0x08010602}, {0x09060001},        /* 249 */
+  {0x09000601}, {0x08050302}, {0x08050302}, {0x08030502}, {0x08030502},        /* 254 */
+  {0x08040402}, {0x08040402}, {0x08050202}, {0x08050202}, {0x08020502},        /* 259 */
+  {0x08020502}, {0x08050102}, {0x08050102}, {0x09050001}, {0x09000501},        /* 264 */
+  {0x07010502}, {0x07010502}, {0x07010502}, {0x07010502}, {0x08040302},        /* 269 */
+  {0x08040302}, {0x08030402}, {0x08030402}, {0x07040202}, {0x07040202},        /* 274 */
+  {0x07040202}, {0x07040202}, {0x07020402}, {0x07020402}, {0x07020402},        /* 279 */
+  {0x07020402}, {0x07030302}, {0x07030302}, {0x07030302}, {0x07030302},        /* 284 */
+  {0x07040102}, {0x07040102}, {0x07040102}, {0x07040102}, {0x07010402},        /* 289 */
+  {0x07010402}, {0x07010402}, {0x07010402}, {0x08040001}, {0x08040001},        /* 294 */
+  {0x08000401}, {0x08000401}, {0x07030202}, {0x07030202}, {0x07030202},        /* 299 */
+  {0x07030202}, {0x07020302}, {0x07020302}, {0x07020302}, {0x07020302},        /* 304 */
+  {0x06030102}, {0x06030102}, {0x06030102}, {0x06030102}, {0x06030102},        /* 309 */
+  {0x06030102}, {0x06030102}, {0x06030102}, {0x06010302}, {0x06010302},        /* 314 */
+  {0x06010302}, {0x06010302}, {0x06010302}, {0x06010302}, {0x06010302},        /* 319 */
+  {0x06010302}, {0x07030001}, {0x07030001}, {0x07030001}, {0x07030001},        /* 324 */
+  {0x07000301}, {0x07000301}, {0x07000301}, {0x07000301}, {0x06020202},        /* 329 */
+  {0x06020202}, {0x06020202}, {0x06020202}, {0x06020202}, {0x06020202},        /* 334 */
+  {0x06020202}, {0x06020202}, {0x05020102}, {0x05020102}, {0x05020102},        /* 339 */
+  {0x05020102}, {0x05020102}, {0x05020102}, {0x05020102}, {0x05020102},        /* 344 */
+  {0x05020102}, {0x05020102}, {0x05020102}, {0x05020102}, {0x05020102},        /* 349 */
+  {0x05020102}, {0x05020102}, {0x05020102}, {0x05010202}, {0x05010202},        /* 354 */
+  {0x05010202}, {0x05010202}, {0x05010202}, {0x05010202}, {0x05010202},        /* 359 */
+  {0x05010202}, {0x05010202}, {0x05010202}, {0x05010202}, {0x05010202},        /* 364 */
+  {0x05010202}, {0x05010202}, {0x05010202}, {0x05010202}, {0x06020001},        /* 369 */
+  {0x06020001}, {0x06020001}, {0x06020001}, {0x06020001}, {0x06020001},        /* 374 */
+  {0x06020001}, {0x06020001}, {0x06000201}, {0x06000201}, {0x06000201},        /* 379 */
+  {0x06000201}, {0x06000201}, {0x06000201}, {0x06000201}, {0x06000201},        /* 384 */
+  {0x04010102}, {0x04010102}, {0x04010102}, {0x04010102}, {0x04010102},        /* 389 */
+  {0x04010102}, {0x04010102}, {0x04010102}, {0x04010102}, {0x04010102},        /* 394 */
+  {0x04010102}, {0x04010102}, {0x04010102}, {0x04010102}, {0x04010102},        /* 399 */
+  {0x04010102}, {0x04010102}, {0x04010102}, {0x04010102}, {0x04010102},        /* 404 */
+  {0x04010102}, {0x04010102}, {0x04010102}, {0x04010102}, {0x04010102},        /* 409 */
+  {0x04010102}, {0x04010102}, {0x04010102}, {0x04010102}, {0x04010102},        /* 414 */
+  {0x04010102}, {0x04010102}, {0x04010001}, {0x04010001}, {0x04010001},        /* 419 */
+  {0x04010001}, {0x04010001}, {0x04010001}, {0x04010001}, {0x04010001},        /* 424 */
+  {0x04010001}, {0x04010001}, {0x04010001}, {0x04010001}, {0x04010001},        /* 429 */
+  {0x04010001}, {0x04010001}, {0x04010001}, {0x04010001}, {0x04010001},        /* 434 */
+  {0x04010001}, {0x04010001}, {0x04010001}, {0x04010001}, {0x04010001},        /* 439 */
+  {0x04010001}, {0x04010001}, {0x04010001}, {0x04010001}, {0x04010001},        /* 444 */
+  {0x04010001}, {0x04010001}, {0x04010001}, {0x04010001}, {0x04000101},        /* 449 */
+  {0x04000101}, {0x04000101}, {0x04000101}, {0x04000101}, {0x04000101},        /* 454 */
+  {0x04000101}, {0x04000101}, {0x04000101}, {0x04000101}, {0x04000101},        /* 459 */
+  {0x04000101}, {0x04000101}, {0x04000101}, {0x04000101}, {0x04000101},        /* 464 */
+  {0x04000101}, {0x04000101}, {0x04000101}, {0x04000101}, {0x04000101},        /* 469 */
+  {0x04000101}, {0x04000101}, {0x04000101}, {0x04000101}, {0x04000101},        /* 474 */
+  {0x04000101}, {0x04000101}, {0x04000101}, {0x04000101}, {0x04000101},        /* 479 */
+  {0x04000101}, {0x04000000}, {0x04000000}, {0x04000000}, {0x04000000},        /* 484 */
+  {0x04000000}, {0x04000000}, {0x04000000}, {0x04000000}, {0x04000000},        /* 489 */
+  {0x04000000}, {0x04000000}, {0x04000000}, {0x04000000}, {0x04000000},        /* 494 */
+  {0x04000000}, {0x04000000}, {0x04000000}, {0x04000000}, {0x04000000},        /* 499 */
+  {0x04000000}, {0x04000000}, {0x04000000}, {0x04000000}, {0x04000000},        /* 504 */
+  {0x04000000}, {0x04000000}, {0x04000000}, {0x04000000}, {0x04000000},        /* 509 */
+  {0x04000000}, {0x04000000}, {0x04000000}, {0xFF000002}, {0x020E0E02},        /* 514 */
+  {0x020E0D02}, {0x020D0E02}, {0x020E0C02}, {0xFF000002}, {0x020C0E02},        /* 519 */
+  {0x020D0D02}, {0x020E0B02}, {0x020B0E02}, {0xFF000002}, {0x020D0C02},        /* 524 */
+  {0x020C0D02}, {0x020E0A02}, {0x020A0E02}, {0xFF000002}, {0x020D0B02},        /* 529 */
+  {0x020B0D02}, {0x020C0C02}, {0x020E0902}, {0xFF000002}, {0x02090E02},        /* 534 */
+  {0x020D0A02}, {0x020A0D02}, {0x020C0B02}, {0xFF000002}, {0x020B0C02},        /* 539 */
+  {0x020E0802}, {0x02080E02}, {0x020D0902}, {0xFF000002}, {0x02090D02},        /* 544 */
+  {0x020E0702}, {0x02070E02}, {0x020C0A02}, {0xFF000002}, {0x020A0C02},        /* 549 */
+  {0x020B0B02}, {0x020D0802}, {0x02080D02}, {0xFF000003}, {0x030E0001},        /* 554 */
+  {0x03000E01}, {0x020D0001}, {0x020D0001}, {0x01060E02}, {0x01060E02},        /* 559 */
+  {0x01060E02}, {0x01060E02}, {0xFF000002}, {0x020E0602}, {0x020C0902},        /* 564 */
+  {0x01090C02}, {0x01090C02}, {0xFF000001}, {0x010E0502}, {0x010A0B02},        /* 569 */
+  {0xFF000002}, {0x01050E02}, {0x01050E02}, {0x020B0A02}, {0x020D0702},        /* 574 */
+  {0xFF000001}, {0x01070D02}, {0x01040E02}, {0xFF000001}, {0x010C0802},        /* 579 */
+  {0x01080C02}, {0xFF000002}, {0x020E0402}, {0x020E0202}, {0x010E0302},        /* 584 */
+  {0x010E0302}, {0xFF000001}, {0x010D0602}, {0x01060D02}, {0xFF000001},        /* 589 */
+  {0x01030E02}, {0x010B0902}, {0xFF000001}, {0x01090B02}, {0x010A0A02},        /* 594 */
+  {0xFF000001}, {0x01020E02}, {0x010E0102}, {0xFF000001}, {0x01010E02},        /* 599 */
+  {0x010D0502}, {0xFF000001}, {0x01050D02}, {0x010C0702}, {0xFF000001},        /* 604 */
+  {0x01070C02}, {0x010D0402}, {0xFF000001}, {0x010B0802}, {0x01080B02},        /* 609 */
+  {0xFF000001}, {0x01040D02}, {0x010A0902}, {0xFF000001}, {0x01090A02},        /* 614 */
+  {0x010C0602}, {0xFF000001}, {0x01060C02}, {0x010D0302}, {0xFF000001},        /* 619 */
+  {0x01030D02}, {0x010D0202}, {0xFF000001}, {0x01020D02}, {0x010D0102},        /* 624 */
+  {0xFF000001}, {0x010B0702}, {0x01070B02}, {0xFF000001}, {0x01010D02},        /* 629 */
+  {0x010C0502}, {0xFF000001}, {0x01050C02}, {0x010A0802}, {0xFF000001},        /* 634 */
+  {0x01080A02}, {0x01090902}, {0xFF000001}, {0x010C0402}, {0x01040C02},        /* 639 */
+  {0xFF000001}, {0x010B0602}, {0x01060B02}, {0xFF000002}, {0x02000D01},        /* 644 */
+  {0x020C0001}, {0x010C0302}, {0x010C0302}, {0xFF000001}, {0x01030C02},        /* 649 */
+  {0x010A0702}, {0xFF000001}, {0x01070A02}, {0x010C0202}, {0xFF000001},        /* 654 */
+  {0x01020C02}, {0x010B0502}, {0xFF000001}, {0x01050B02}, {0x010C0102},        /* 659 */
+  {0xFF000001}, {0x01090802}, {0x01080902}, {0xFF000001}, {0x01010C02},        /* 664 */
+  {0x010B0402}, {0xFF000002}, {0x02000C01}, {0x020B0001}, {0x010B0302},        /* 669 */
+  {0x010B0302}, {0xFF000002}, {0x02000B01}, {0x020A0001}, {0x010A0102},        /* 674 */
+  {0x010A0102}, {0xFF000001}, {0x010A0602}, {0x01060A02}, {0xFF000001},        /* 679 */
+  {0x01090702}, {0x01070902}, {0xFF000002}, {0x02000A01}, {0x02090001},        /* 684 */
+  {0x01000901}, {0x01000901}, {0xFF000001}, {0x010B0202}, {0x010A0502},        /* 689 */
+  {0xFF000001}, {0x01050A02}, {0x010B0102}, {0xFF000001}, {0x01010B02},        /* 694 */
+  {0x01090602}, {0xFF000001}, {0x010A0402}, {0x01080702}, {0xFF000001},        /* 699 */
+  {0x01080001}, {0x01000801}, {0xFF000001}, {0x01070001}, {0x01000701}, /* 704 */
+};
+
+/* max table bits  9 */
+/* NO XING TABLE 25 */
+/* NO XING TABLE 26 */
+/* NO XING TABLE 27 */
+/* NO XING TABLE 28 */
+/* NO XING TABLE 29 */
+/* NO XING TABLE 30 */
+/* NO XING TABLE 31 */
+/* done */
diff --git a/codecs/mp3/include/itype.h b/codecs/mp3/include/itype.h
new file mode 100755 (executable)
index 0000000..0b24f40
--- /dev/null
@@ -0,0 +1,108 @@
+/*____________________________________________________________________________
+       
+       FreeAmp - The Free MP3 Player
+
+        MP3 Decoder originally Copyright (C) 1995-1997 Xing Technology
+        Corp.  http://www.xingtech.com
+
+       Portions Copyright (C) 1998 EMusic.com
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program; if not, write to the Free Software
+       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+       
+       $Id$
+____________________________________________________________________________*/
+
+/*---------------------------------------------------------------
+
+mpeg Layer II audio decoder, integer version
+variable type control
+
+-----------------------------------------------------------------*/
+/*-----------------------------------------------------------------
+Variable types can have a large impact on performance.  If the
+native type int is 32 bit or better, setting all variables to the
+native int is probably the best bet.  Machines with fast floating
+point handware will probably run faster with the floating point
+version of this decoder.
+
+On 16 bit machines, use the native 16 bit int where possible
+with special consideration given to the multiplies used in
+the dct and window (see below).
+
+
+The code uses the type INT32 when 32 or more bits are required.
+Use the native int if possible.
+Signed types are required for all but DCTCOEF which may be unsigned.
+
+THe major parts of the decoder are: bit stream unpack (iup.c),
+dct (cidct.c), and window (iwinq.c).  The compute time relationship
+is usually  unpack < dct < window.
+
+-------------------------------------------------------------------*/
+
+/*-------------- dct cidct.c -------------------------------------------
+dct input is type SAMPLEINT, output is WININT
+
+DCTCOEF:  dct coefs, 16 or more bits required
+DCTBITS:  fractional bits in dct coefs. Coefs are unsigned in
+          the range 0.50 to 10.2.  DCTBITS=10 is a compromise
+          between precision and the possibility of overflowing
+          intermediate results.
+
+
+DCTSATURATE:  If set, saturates dct output to 16 bit.
+              Dct output may overflow if WININT is 16 bit, overflow
+              is rare, but very noisy.  Define to 1 for 16 bit WININT.
+              Define to 0 otherwise.
+
+The multiply used in the dct (routine forward_bf in cidct.c) requires
+the multiplication of a 32 bit variable by a 16 bit unsigned coef
+to produce a signed 32 bit result. On 16 bit machines this could be
+faster than a full 32x32 multiply.
+
+------------------------------------------------------------------*/
+/*-------------- WINDOW iwinq.c ---------------------------------------
+window input is type WININT, output is short (16 bit pcm audio)
+
+window coefs WINBITS fractional bits,
+        coefs are signed range in -1.15 to 0.96.
+        WINBITS=14 is maximum for 16 bit signed representation.
+        Some CPU's will multiply faster with fewer bits.
+        WINBITS less that 8 may cause noticeable quality loss.
+
+WINMULT defines the multiply used in the window (iwinq.c)
+WINMULT must produce a 32 bit (or better) result, although both
+multipliers may be 16 bit.  A 16x16-->32 multiply may offer
+a performance advantage if the compiler can be coerced into
+doing the right thing.
+------------------------------------------------------------------*/
+/*-- settings for MS C++ 4.0 flat 32 bit (long=int=32bit) --*/
+/*-- asm replacement modules must use these settings ---*/
+
+typedef long INT32;
+typedef unsigned long UINT32;
+
+typedef int SAMPLEINT;
+
+typedef int DCTCOEF;
+
+#define DCTBITS 10
+#define DCTSATURATE 0
+
+typedef int WININT;
+typedef int WINCOEF;
+
+#define WINBITS 10
+#define WINMULT(x,coef)  ((x)*(coef))
diff --git a/codecs/mp3/include/jdw.h b/codecs/mp3/include/jdw.h
new file mode 100755 (executable)
index 0000000..bbb6e5b
--- /dev/null
@@ -0,0 +1,28 @@
+/*____________________________________________________________________________
+       
+       FreeAmp - The Free MP3 Player
+
+       Copyright (C) 1998 EMusic.com
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program; if not, write to the Free Software
+       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+       
+       $Id$
+____________________________________________________________________________*/
+
+/* LOL */
+
+#ifndef min
+#define min(a,b) ((a>b)?b:a)
+#endif
diff --git a/codecs/mp3/include/mhead.h b/codecs/mp3/include/mhead.h
new file mode 100755 (executable)
index 0000000..06b43ef
--- /dev/null
@@ -0,0 +1,299 @@
+/*____________________________________________________________________________
+       
+       FreeAmp - The Free MP3 Player
+
+        MP3 Decoder originally Copyright (C) 1995-1997 Xing Technology
+        Corp.  http://www.xingtech.com
+
+       Portions Copyright (C) 1998 EMusic.com
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program; if not, write to the Free Software
+       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+       
+       $Id$
+____________________________________________________________________________*/
+
+/* portable copy of eco\mhead.h */
+/* mpeg audio header   */
+
+typedef struct
+{
+   int sync;                   /* 1 if valid sync */
+   int id;
+   int option;
+   int prot;
+   int br_index;
+   int sr_index;
+   int pad;
+   int private_bit;
+   int mode;
+   int mode_ext;
+   int cr;
+   int original;
+   int emphasis;
+}
+MPEG_HEAD;
+
+/* portable mpeg audio decoder, decoder functions */
+typedef struct
+{
+   int in_bytes;
+   int out_bytes;
+}
+IN_OUT;
+
+
+typedef struct
+{
+   int channels;
+   int outvalues;
+   long samprate;
+   int bits;
+   int framebytes;
+   int type;
+}
+DEC_INFO;
+
+typedef IN_OUT(*AUDIO_DECODE_ROUTINE) (void *mv, unsigned char *bs, signed short *pcm);
+typedef IN_OUT(*DECODE_FUNCTION) (void *mv, unsigned char *bs, unsigned char *pcm);
+
+struct _mpeg;
+
+typedef struct _mpeg  MPEG;
+
+typedef void (*SBT_FUNCTION_F) (MPEG *m, float *sample, short *pcm, int n);
+
+/* main data bit buffer */
+#define NBUF (8*1024)
+#define BUF_TRIGGER (NBUF-1500)
+
+typedef void (*XFORM_FUNCTION) (void *mv, void *pcm, int igr);
+
+struct _mpeg
+{
+       struct {
+               float look_c_value[18]; /* built by init */
+               unsigned char *bs_ptr;
+               unsigned long bitbuf;
+               int bits;
+               long bitval;
+               int outbytes;
+               int framebytes;
+               int outvalues;
+               int pad;
+               int stereo_sb;
+               DEC_INFO decinfo;               /* global for Layer III */
+               int max_sb;
+               int nsb_limit;
+               int first_pass;
+               int first_pass_L1;
+               int bit_skip;
+               int nbat[4];
+               int bat[4][16];
+               int ballo[64];          /* set by unpack_ba */
+               unsigned int samp_dispatch[66]; /* set by unpack_ba */
+               float c_value[64];      /* set by unpack_ba */
+               unsigned int sf_dispatch[66];   /* set by unpack_ba */
+               float sf_table[64];
+               float cs_factor[3][64];
+               float *sample;          /* global for use by Later 3 */
+               signed char group3_table[32][3];
+               signed char group5_table[128][3];
+               signed short group9_table[1024][3];
+               SBT_FUNCTION_F sbt;
+               AUDIO_DECODE_ROUTINE audio_decode_routine ;
+               float *cs_factorL1;
+               float look_c_valueL1[16];
+               int nbatL1;
+
+       } cup;
+
+       struct {
+               /* cupl3.c */
+               int nBand[2][22];               /* [long/short][cb] */
+               int sfBandIndex[2][22];         /* [long/short][cb] */
+               int mpeg25_flag;
+               int iframe;
+               int band_limit;
+               int band_limit21;
+               int band_limit12;
+               int band_limit_nsb;
+               int nsb_limit;
+               int gaim_adjust;
+               int id;
+               int ncbl_mixed;
+               int gain_adjust;
+               int sr_index;
+               int outvalues;
+               int outbytes;
+               int half_outbytes;
+               int framebytes;
+               int padframebytes;
+               int crcbytes;
+               int pad;
+               int stereo_flag;
+               int nchan;
+               int ms_mode;
+               int is_mode;
+               unsigned int zero_level_pcm;
+               CB_INFO cb_info[2][2];
+               IS_SF_INFO is_sf_info;  /* MPEG-2 intensity stereo */ 
+               unsigned char buf[NBUF];
+               int buf_ptr0;
+               int buf_ptr1;
+               int main_pos_bit;
+               SIDE_INFO side_info;
+               SCALEFACT sf[2][2];     /* [gr][ch] */
+               int nsamp[2][2];                /* must start = 0, for nsamp[igr_prev] */
+               float yout[576];                /* hybrid out, sbt in */
+               SAMPLE sample[2][2][576];
+               SBT_FUNCTION_F sbt_L3;
+               XFORM_FUNCTION Xform;
+               DECODE_FUNCTION decode_function;
+               /* msis.c */
+               /*-- windows by block type --*/
+               float win[4][36];
+               float csa[8][2];                /* antialias */
+               float lr[2][8][2];      /* [ms_mode 0/1][sf][left/right]  */
+               float lr2[2][2][64][2];
+               /* l3dq.c */
+               float look_global[256 + 2 + 4];
+               float look_scale[2][4][32];
+#define ISMAX 32
+               float look_pow[2 * ISMAX];
+               float look_subblock[8];
+               float re_buf[192][3];
+       } cupl;
+       struct {
+               signed int vb_ptr;
+               signed int vb2_ptr;
+               float vbuf[512];
+               float vbuf2[512];
+               int first_pass;
+       } csbt;
+       struct {
+               float coef32[31];       /* 32 pt dct coefs */
+       } cdct;
+};
+
+typedef int (*CVT_FUNCTION_8) (void *mv, unsigned char *pcm);
+
+typedef struct
+{
+       struct {
+               unsigned char look_u[8192];
+        short pcm[2304];
+        int ncnt;
+        int ncnt1;
+        int nlast;
+        int ndeci;
+        int kdeci;
+               int first_pass;
+        short xsave;
+               CVT_FUNCTION_8 convert_routine;
+       } dec;
+       MPEG cupper;
+}
+MPEG8;
+
+#include "itype.h"
+
+typedef void (*SBT_FUNCTION) (SAMPLEINT * sample, short *pcm, int n);
+typedef void (*UNPACK_FUNCTION) ();
+
+typedef struct
+{
+       struct {
+               DEC_INFO decinfo;
+               int pad;
+               int look_c_value[18];   /* built by init */
+               int look_c_shift[18];   /* built by init */
+               int outbytes;
+               int framebytes;
+               int outvalues;
+               int max_sb;
+               int stereo_sb;
+               int nsb_limit;
+               int bit_skip;
+               int nbat[4];
+               int bat[4][16];
+               int ballo[64];          /* set by unpack_ba */
+               unsigned int samp_dispatch[66]; /* set by unpack_ba */
+               int c_value[64];                /* set by unpack_ba */
+               int c_shift[64];                /* set by unpack_ba */
+               unsigned int sf_dispatch[66];   /* set by unpack_ba */
+               int sf_table[64];
+               INT32 cs_factor[3][64];
+               SAMPLEINT sample[2304];
+               signed char group3_table[32][3];
+               signed char group5_table[128][3];
+               signed short group9_table[1024][3];
+               int nsbt;
+               SBT_FUNCTION sbt;
+               UNPACK_FUNCTION unpack_routine;
+               unsigned char *bs_ptr;
+               UINT32 bitbuf;
+               int bits;
+               INT32 bitval;
+               int first_pass;
+               int first_pass_L1;
+               int nbatL1;
+               INT32 *cs_factorL1;
+               int look_c_valueL1[16]; /* built by init */
+               int look_c_shiftL1[16]; /* built by init */
+       } iup;
+}
+MPEGI;
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+   void mpeg_init(MPEG *m);
+   int head_info(unsigned char *buf, unsigned int n, MPEG_HEAD * h);
+   int head_info2(unsigned char *buf,
+          unsigned int n, MPEG_HEAD * h, int *br);
+       int head_info3(unsigned char *buf, unsigned int n, MPEG_HEAD *h, int*br, unsigned int *searchForward);
+/* head_info returns framebytes > 0 for success */
+/* audio_decode_init returns 1 for success, 0 for fail */
+/* audio_decode returns in_bytes = 0 on sync loss */
+
+   int audio_decode_init(MPEG *m, MPEG_HEAD * h, int framebytes_arg,
+                  int reduction_code, int transform_code, int convert_code,
+                        int freq_limit);
+   void audio_decode_info(MPEG *m, DEC_INFO * info);
+   IN_OUT audio_decode(MPEG *m, unsigned char *bs, short *pcm);
+
+   void mpeg8_init(MPEG8 *m);
+   int audio_decode8_init(MPEG8 *m, MPEG_HEAD * h, int framebytes_arg,
+                  int reduction_code, int transform_code, int convert_code,
+                         int freq_limit);
+   void audio_decode8_info(MPEG8 *m, DEC_INFO * info);
+   IN_OUT audio_decode8(MPEG8 *m, unsigned char *bs, short *pcmbuf);
+
+/*-- integer decode --*/
+   void i_mpeg_init(MPEGI *m);
+   int i_audio_decode_init(MPEGI *m, MPEG_HEAD * h, int framebytes_arg,
+                  int reduction_code, int transform_code, int convert_code,
+                          int freq_limit);
+   void i_audio_decode_info(MPEGI *m, DEC_INFO * info);
+   IN_OUT i_audio_decode(MPEGI *m, unsigned char *bs, short *pcm);
+
+
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/codecs/mp3/include/port.h b/codecs/mp3/include/port.h
new file mode 100755 (executable)
index 0000000..537be83
--- /dev/null
@@ -0,0 +1,99 @@
+/*____________________________________________________________________________
+       
+       FreeAmp - The Free MP3 Player
+
+        MP3 Decoder originally Copyright (C) 1995-1997 Xing Technology
+        Corp.  http://www.xingtech.com
+
+       Portions Copyright (C) 1998-1999 EMusic.com
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program; if not, write to the Free Software
+       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+       
+       $Id$
+____________________________________________________________________________*/
+
+#ifndef O_BINARY
+#define O_BINARY 0
+#endif
+
+
+/*--- no kb function unless DOS ---*/
+
+#ifndef KB_OK
+#ifdef __MSDOS__
+#define KB_OK
+#endif
+#ifdef _CONSOLE
+#define KB_OK
+#endif
+#endif
+
+#ifdef NEED_KBHIT
+#ifdef KB_OK
+#ifdef _MSC_VER
+#pragma warning(disable: 4032)
+#endif
+#include <conio.h>
+#else
+static int kbhit()
+{
+   return 0;
+}
+static int getch()
+{
+   return 0;
+}
+#endif
+#endif
+
+/*-- no pcm conversion to wave required 
+ if short = 16 bits and little endian ---*/
+
+/* mods 1/9/97 LITTLE_SHORT16 detect */
+
+#ifndef LITTLE_SHORT16
+  #ifdef __MSDOS__
+    #undef LITTLE_SHORT16
+    #define LITTLE_SHORT16
+  #endif
+  #ifdef WIN32
+    #undef LITTLE_SHORT16
+    #define LITTLE_SHORT16
+  #endif
+  #ifdef _M_IX86
+    #undef LITTLE_SHORT16
+    #define LITTLE_SHORT16
+  #endif
+#endif
+
+
+// JDW //
+//#ifdef LITTLE_SHORT16
+//#define cvt_to_wave_init(a)
+//#define cvt_to_wave(a, b)  b
+//#else
+//void cvt_to_wave_init(int bits);
+//unsigned int cvt_to_wave(void *a, unsigned int b);
+//
+//#endif
+#ifdef LITTLE_SHORT16
+#define cvt_to_wave_init(a)
+#define cvt_to_wave(a, b) b
+#else
+void cvt_to_wave_init(int);
+unsigned int cvt_to_wave(unsigned char *,unsigned int);
+#endif
+
+int cvt_to_wave_test(void);
diff --git a/codecs/mp3/include/protos.h b/codecs/mp3/include/protos.h
new file mode 100755 (executable)
index 0000000..c812e54
--- /dev/null
@@ -0,0 +1,52 @@
+/*====================================================================*/
+int hybrid(MPEG *m, void *xin, void *xprev, float *y,
+          int btype, int nlong, int ntot, int nprev);
+int hybrid_sum(MPEG *m, void *xin, void *xin_left, float *y,
+              int btype, int nlong, int ntot);
+void sum_f_bands(void *a, void *b, int n);
+void FreqInvert(float *y, int n);
+void antialias(MPEG *m, void *x, int n);
+void ms_process(void *x, int n);       /* sum-difference stereo */
+void is_process_MPEG1(MPEG *m, void *x,        /* intensity stereo */
+                     SCALEFACT * sf,
+                     CB_INFO cb_info[2],       /* [ch] */
+                     int nsamp, int ms_mode);
+void is_process_MPEG2(MPEG *m, void *x,        /* intensity stereo */
+                     SCALEFACT * sf,
+                     CB_INFO cb_info[2],       /* [ch] */
+                     IS_SF_INFO * is_sf_info,
+                     int nsamp, int ms_mode);
+
+void unpack_huff(void *xy, int n, int ntable);
+int unpack_huff_quad(void *vwxy, int n, int nbits, int ntable);
+void dequant(MPEG *m, SAMPLE sample[], int *nsamp,
+            SCALEFACT * sf,
+            GR * gr,
+            CB_INFO * cb_info, int ncbl_mixed);
+void unpack_sf_sub_MPEG1(SCALEFACT * scalefac, GR * gr,
+                        int scfsi,     /* bit flag */
+                        int igr);
+void unpack_sf_sub_MPEG2(SCALEFACT sf[],       /* return intensity scale */
+                        GR * grdat,
+                        int is_and_ch, IS_SF_INFO * is_sf_info);
+
+
+/*---------- quant ---------------------------------*/
+/* 8 bit lookup x = pow(2.0, 0.25*(global_gain-210)) */
+float *quant_init_global_addr(MPEG *m);
+
+
+/* x = pow(2.0, -0.5*(1+scalefact_scale)*scalefac + preemp) */
+typedef float LS[4][32];
+LS *quant_init_scale_addr(MPEG *m);
+
+
+float *quant_init_pow_addr(MPEG *m);
+float *quant_init_subblock_addr(MPEG *m);
+
+typedef int iARRAY22[22];
+iARRAY22 *quant_init_band_addr(MPEG *m);
+
+/*---------- antialias ---------------------------------*/
+typedef float PAIR[2];
+PAIR *alias_init_addr(MPEG *m);
diff --git a/codecs/mp3/include/tableawd.h b/codecs/mp3/include/tableawd.h
new file mode 100755 (executable)
index 0000000..8c0d97f
--- /dev/null
@@ -0,0 +1,93 @@
+/*____________________________________________________________________________
+       
+       FreeAmp - The Free MP3 Player
+
+        MP3 Decoder originally Copyright (C) 1995-1997 Xing Technology
+        Corp.  http://www.xingtech.com
+
+       Portions Copyright (C) 1998 EMusic.com
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program; if not, write to the Free Software
+       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+       
+       $Id$
+____________________________________________________________________________*/
+
+/* decoder analysis window gen by dinit.c (asm version table gen) */
+0.000000000f, 0.000442505f, -0.003250122f, 0.007003784f,
+-0.031082151f, 0.078628540f, -0.100311279f, 0.572036743f,
+-1.144989014f, -0.572036743f, -0.100311279f, -0.078628540f,
+-0.031082151f, -0.007003784f, -0.003250122f, -0.000442505f,
+0.000015259f, 0.000473022f, -0.003326416f, 0.007919312f,
+-0.030517576f, 0.084182739f, -0.090927124f, 0.600219727f,
+-1.144287109f, -0.543823242f, -0.108856201f, -0.073059082f,
+-0.031478882f, -0.006118774f, -0.003173828f, -0.000396729f,
+0.000015259f, 0.000534058f, -0.003387451f, 0.008865356f,
+-0.029785154f, 0.089706421f, -0.080688477f, 0.628295898f,
+-1.142211914f, -0.515609741f, -0.116577141f, -0.067520142f,
+-0.031738281f, -0.005294800f, -0.003082275f, -0.000366211f,
+0.000015259f, 0.000579834f, -0.003433228f, 0.009841919f,
+-0.028884888f, 0.095169067f, -0.069595337f, 0.656219482f,
+-1.138763428f, -0.487472534f, -0.123474121f, -0.061996460f,
+-0.031845093f, -0.004486084f, -0.002990723f, -0.000320435f,
+0.000015259f, 0.000625610f, -0.003463745f, 0.010848999f,
+-0.027801514f, 0.100540161f, -0.057617184f, 0.683914185f,
+-1.133926392f, -0.459472656f, -0.129577637f, -0.056533810f,
+-0.031814575f, -0.003723145f, -0.002899170f, -0.000289917f,
+0.000015259f, 0.000686646f, -0.003479004f, 0.011886597f,
+-0.026535034f, 0.105819702f, -0.044784546f, 0.711318970f,
+-1.127746582f, -0.431655884f, -0.134887695f, -0.051132202f,
+-0.031661987f, -0.003005981f, -0.002792358f, -0.000259399f,
+0.000015259f, 0.000747681f, -0.003479004f, 0.012939452f,
+-0.025085449f, 0.110946655f, -0.031082151f, 0.738372803f,
+-1.120223999f, -0.404083252f, -0.139450073f, -0.045837402f,
+-0.031387329f, -0.002334595f, -0.002685547f, -0.000244141f,
+0.000030518f, 0.000808716f, -0.003463745f, 0.014022826f,
+-0.023422241f, 0.115921021f, -0.016510010f, 0.765029907f,
+-1.111373901f, -0.376800537f, -0.143264771f, -0.040634155f,
+-0.031005858f, -0.001693726f, -0.002578735f, -0.000213623f,
+0.000030518f, 0.000885010f, -0.003417969f, 0.015121460f,
+-0.021575928f, 0.120697014f, -0.001068115f, 0.791213989f,
+-1.101211548f, -0.349868774f, -0.146362305f, -0.035552979f,
+-0.030532837f, -0.001098633f, -0.002456665f, -0.000198364f,
+0.000030518f, 0.000961304f, -0.003372192f, 0.016235352f,
+-0.019531250f, 0.125259399f, 0.015228271f, 0.816864014f,
+-1.089782715f, -0.323318481f, -0.148773193f, -0.030609131f,
+-0.029937742f, -0.000549316f, -0.002349854f, -0.000167847f,
+0.000030518f, 0.001037598f, -0.003280640f, 0.017349243f,
+-0.017257690f, 0.129562378f, 0.032379150f, 0.841949463f,
+-1.077117920f, -0.297210693f, -0.150497437f, -0.025817871f,
+-0.029281614f, -0.000030518f, -0.002243042f, -0.000152588f,
+0.000045776f, 0.001113892f, -0.003173828f, 0.018463135f,
+-0.014801024f, 0.133590698f, 0.050354004f, 0.866363525f,
+-1.063217163f, -0.271591187f, -0.151596069f, -0.021179199f,
+-0.028533936f, 0.000442505f, -0.002120972f, -0.000137329f,
+0.000045776f, 0.001205444f, -0.003051758f, 0.019577026f,
+-0.012115479f, 0.137298584f, 0.069168091f, 0.890090942f,
+-1.048156738f, -0.246505737f, -0.152069092f, -0.016708374f,
+-0.027725220f, 0.000869751f, -0.002014160f, -0.000122070f,
+0.000061035f, 0.001296997f, -0.002883911f, 0.020690918f,
+-0.009231566f, 0.140670776f, 0.088775635f, 0.913055420f,
+-1.031936646f, -0.221984863f, -0.151962280f, -0.012420653f,
+-0.026840210f, 0.001266479f, -0.001907349f, -0.000106812f,
+0.000061035f, 0.001388550f, -0.002700806f, 0.021789551f,
+-0.006134033f, 0.143676758f, 0.109161377f, 0.935195923f,
+-1.014617920f, -0.198059082f, -0.151306152f, -0.008316040f,
+-0.025909424f, 0.001617432f, -0.001785278f, -0.000106812f,
+0.000076294f, 0.001480103f, -0.002487183f, 0.022857666f,
+-0.002822876f, 0.146255493f, 0.130310059f, 0.956481934f,
+-0.996246338f, -0.174789429f, -0.150115967f, -0.004394531f,
+-0.024932859f, 0.001937866f, -0.001693726f, -0.000091553f,
+-0.001586914f, -0.023910521f, -0.148422241f, -0.976852417f,
+0.152206421f, 0.000686646f, -0.002227783f, 0.000076294f,
diff --git a/codecs/mp3/include/xinglmc.h b/codecs/mp3/include/xinglmc.h
new file mode 100755 (executable)
index 0000000..b03caa1
--- /dev/null
@@ -0,0 +1,166 @@
+/*____________________________________________________________________________
+   
+   FreeAmp - The Free MP3 Player
+   Portions Copyright (C) 1998-1999 EMusic.com
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   
+   $Id$
+
+____________________________________________________________________________*/
+
+#ifndef INCLUDED_XINGLMC_H_
+#define INCLUDED_XINGLMC_H_
+
+/* system headers */
+#include <stdlib.h>
+#include <time.h>
+
+/* project headers */
+#include "config.h"
+
+#include "pmi.h"
+#include "pmo.h"
+#include "mutex.h"
+#include "event.h"
+#include "lmc.h"
+#include "thread.h"
+#include "mutex.h"
+#include "queue.h"
+#include "semaphore.h"
+
+extern    "C"
+{
+#include "mhead.h"
+#include "port.h"
+}
+
+#define BS_BUFBYTES 60000U
+#define PCM_BUFBYTES 60000U
+
+typedef struct
+{
+   int       (*decode_init) (MPEG_HEAD * h, int framebytes_arg,
+              int reduction_code, int transform_code,
+              int convert_code, int freq_limit);
+   void      (*decode_info) (DEC_INFO * info);
+             IN_OUT(*decode) (unsigned char *bs, short *pcm);
+}
+AUDIO;
+
+#define FRAMES_FLAG     0x0001
+#define BYTES_FLAG      0x0002
+#define TOC_FLAG        0x0004
+#define VBR_SCALE_FLAG  0x0008
+
+#define FRAMES_AND_BYTES (FRAMES_FLAG | BYTES_FLAG)
+
+// structure to receive extracted header
+// toc may be NULL
+typedef struct 
+{
+    int h_id;       // from MPEG header, 0=MPEG2, 1=MPEG1
+    int samprate;   // determined from MPEG header
+    int flags;      // from Xing header data
+    int frames;     // total bit stream frames from Xing header data
+    int bytes;      // total bit stream bytes from Xing header data
+    int vbr_scale;  // encoded vbr scale from Xing header data
+    unsigned char *toc;  // pointer to unsigned char toc_buffer[100]
+                         // may be NULL if toc not desired
+}   XHEADDATA;
+
+enum
+{
+   lmcError_MinimumError = 1000,
+   lmcError_DecodeFailed,
+   lmcError_AudioDecodeInitFailed,
+   lmcError_DecoderThreadFailed,
+   lmcError_PMIError,
+   lmcError_PMOError,
+   lmcError_MaximumError
+};
+
+class     XingLMC:public LogicalMediaConverter
+{
+
+   public:
+            XingLMC(FAContext *context);
+   virtual ~XingLMC();
+
+   virtual uint32 CalculateSongLength(const char *url);
+
+   virtual Error ChangePosition(int32 position);
+
+   virtual Error CanDecode();
+   virtual void  Clear();
+   virtual Error ExtractMediaInfo();
+
+   virtual void  SetPMI(PhysicalMediaInput *pmi) { m_pPmi = pmi; };
+   virtual void  SetPMO(PhysicalMediaOutput *pmo) { m_pPmo = pmo; };
+   virtual Error Prepare(PullBuffer *pInputBuffer, PullBuffer *&pOutBuffer);
+   virtual Error InitDecoder();
+
+   virtual Error SetEQData(float *);
+   virtual Error SetEQData(bool);
+
+   virtual vector<char *> *GetExtensions(void);
+   
+ private:
+
+   static void          DecodeWorkerThreadFunc(void *);
+   void                 DecodeWork();
+   Error                BeginRead(void *&pBuffer, unsigned int iBytesNeeded,
+                                  bool bBufferUp = true);
+   Error                BlockingBeginRead(void *&pBuffer, 
+                                          unsigned int iBytesNeeded);
+   Error                EndRead(size_t iBytesUsed);
+   Error                AdvanceBufferToNextFrame();
+   Error                GetHeadInfo();
+   Error                GetBitstreamStats(float &fTotalSeconds, float &fMsPerFrame,
+                                          int &iTotalFrames, int &iSampleRate, 
+                                          int &iLayer);
+
+   int                  GetXingHeader(XHEADDATA *X,  unsigned char *buf);
+   int                  SeekPoint(unsigned char TOC[100], int file_bytes, float percent);
+   int                  ExtractI4(unsigned char *buf);
+
+   PhysicalMediaInput  *m_pPmi;
+   PhysicalMediaOutput *m_pPmo;
+
+   int                  m_iMaxWriteSize;
+   int32                m_frameBytes, m_iBufferUpInterval, m_iBufferSize;
+   size_t               m_lFileSize;
+   MPEG_HEAD            m_sMpegHead;
+   int32                m_iBitRate;
+   bool                 m_bBufferingUp;
+   Thread              *m_decoderThread;
+
+   int32                m_frameCounter;
+   time_t               m_iBufferUpdate;
+   char                *m_szUrl;
+   const char          *m_szError;
+   AUDIO                m_audioMethods; 
+   XHEADDATA           *m_pXingHeader;
+   
+   // These vars are used for a nasty hack.
+   FILE                *m_fpFile;
+   char                *m_pLocalReadBuffer;
+};
+
+#endif /* _XINGLMC_H */
+
+
+
+
diff --git a/codecs/mp3/src/cdct.c b/codecs/mp3/src/cdct.c
new file mode 100755 (executable)
index 0000000..f9ce28a
--- /dev/null
@@ -0,0 +1,349 @@
+/*____________________________________________________________________________
+       
+       FreeAmp - The Free MP3 Player
+
+        MP3 Decoder originally Copyright (C) 1995-1997 Xing Technology
+        Corp.  http://www.xingtech.com
+
+       Portions Copyright (C) 1998-1999 EMusic.com
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program; if not, write to the Free Software
+       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+       
+       $Id$
+____________________________________________________________________________*/
+
+/****  cdct.c  ***************************************************
+
+mod 5/16/95 first stage in 8 pt dct does not drop last sb mono
+
+
+MPEG audio decoder, dct
+portable C
+
+******************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <float.h>
+#include <math.h>
+#include "L3.h"
+#include "mhead.h"
+
+#ifdef ASM_X86
+extern void fdct32_asm(float*a, float*b);
+extern void fdct32_dual_asm(float*a, float*b);
+#endif /* ASM_X86 */
+
+/*------------------------------------------------------------*/
+float *dct_coef_addr(MPEG *m)
+{
+   return m->cdct.coef32;
+}
+/*------------------------------------------------------------*/
+static void forward_bf(int m, int n, float x[], float f[], float coef[])
+{
+   int i, j, n2;
+   int p, q, p0, k;
+
+   p0 = 0;
+   n2 = n >> 1;
+   for (i = 0; i < m; i++, p0 += n)
+   {
+      k = 0;
+      p = p0;
+      q = p + n - 1;
+      for (j = 0; j < n2; j++, p++, q--, k++)
+      {
+        f[p] = x[p] + x[q];
+        f[n2 + p] = coef[k] * (x[p] - x[q]);
+      }
+   }
+}
+/*------------------------------------------------------------*/
+static void back_bf(int m, int n, float x[], float f[])
+{
+   int i, j, n2, n21;
+   int p, q, p0;
+
+   p0 = 0;
+   n2 = n >> 1;
+   n21 = n2 - 1;
+   for (i = 0; i < m; i++, p0 += n)
+   {
+      p = p0;
+      q = p0;
+      for (j = 0; j < n2; j++, p += 2, q++)
+        f[p] = x[q];
+      p = p0 + 1;
+      for (j = 0; j < n21; j++, p += 2, q++)
+        f[p] = x[q] + x[q + 1];
+      f[p] = x[q];
+   }
+}
+/*------------------------------------------------------------*/
+
+#ifdef  _EQUALIZER_ENABLE_
+extern float equalizer[32];
+extern int enableEQ;
+#endif
+
+void fdct32(MPEG *m, float x[], float c[])
+{
+#if (!defined(ASM_X86) && !defined(ASM_X86_OLD) || defined(_EQUALIZER_ENABLE_))
+   float a[32];                        /* ping pong buffers */
+   float b[32];
+   int p, q;
+#endif
+
+   float *src = x;
+
+#ifdef  _EQUALIZER_ENABLE_
+   int i;
+   float b[32];
+   if (enableEQ) {
+       for(i=0; i<32; i++)
+          b[i] = x[i] * equalizer[i];
+       src = b;
+   }
+#endif  /* _EQUALIZER_ENABLE_ */
+#undef  _EQUALIZER_ENABLE_
+
+#ifdef ASM_X86
+   fdct32_asm(src, c);
+#elif defined(ASM_X86_OLD)
+   asm_fdct32(src, c);
+#else
+/* special first stage */
+   for (p = 0, q = 31; p < 16; p++, q--)
+   {
+      a[p] = src[p] + src[q];
+      a[16 + p] = m->cdct.coef32[p] * (src[p] - src[q]);
+   }
+   forward_bf(2, 16, a, b, m->cdct.coef32 + 16);
+   forward_bf(4, 8, b, a, m->cdct.coef32 + 16 + 8);
+   forward_bf(8, 4, a, b, m->cdct.coef32 + 16 + 8 + 4);
+   forward_bf(16, 2, b, a, m->cdct.coef32 + 16 + 8 + 4 + 2);
+   back_bf(8, 4, a, b);
+   back_bf(4, 8, b, a);
+   back_bf(2, 16, a, b);
+   back_bf(1, 32, b, c);
+#endif
+}
+/*------------------------------------------------------------*/
+void fdct32_dual(MPEG *m, float x[], float c[])
+{
+#ifdef ASM_X86
+   fdct32_dual_asm(x, c);
+#else
+   float a[32];                        /* ping pong buffers */
+   float b[32];
+   int p, pp, qq;
+
+/* special first stage for dual chan (interleaved x) */
+   pp = 0;
+   qq = 2 * 31;
+   for (p = 0; p < 16; p++, pp += 2, qq -= 2)
+   {
+      a[p] = x[pp] + x[qq];
+      a[16 + p] = m->cdct.coef32[p] * (x[pp] - x[qq]);
+   }
+   forward_bf(2, 16, a, b, m->cdct.coef32 + 16);
+   forward_bf(4, 8, b, a, m->cdct.coef32 + 16 + 8);
+   forward_bf(8, 4, a, b, m->cdct.coef32 + 16 + 8 + 4);
+   forward_bf(16, 2, b, a, m->cdct.coef32 + 16 + 8 + 4 + 2);
+   back_bf(8, 4, a, b);
+   back_bf(4, 8, b, a);
+   back_bf(2, 16, a, b);
+   back_bf(1, 32, b, c);
+#endif
+}
+/*---------------convert dual to mono------------------------------*/
+void fdct32_dual_mono(MPEG *m, float x[], float c[])
+{
+   float a[32];                        /* ping pong buffers */
+   float b[32];
+   float t1, t2;
+   int p, pp, qq;
+
+/* special first stage  */
+   pp = 0;
+   qq = 2 * 31;
+   for (p = 0; p < 16; p++, pp += 2, qq -= 2)
+   {
+      t1 = 0.5F * (x[pp] + x[pp + 1]);
+      t2 = 0.5F * (x[qq] + x[qq + 1]);
+      a[p] = t1 + t2;
+      a[16 + p] = m->cdct.coef32[p] * (t1 - t2);
+   }
+   forward_bf(2, 16, a, b, m->cdct.coef32 + 16);
+   forward_bf(4, 8, b, a, m->cdct.coef32 + 16 + 8);
+   forward_bf(8, 4, a, b, m->cdct.coef32 + 16 + 8 + 4);
+   forward_bf(16, 2, b, a, m->cdct.coef32 + 16 + 8 + 4 + 2);
+   back_bf(8, 4, a, b);
+   back_bf(4, 8, b, a);
+   back_bf(2, 16, a, b);
+   back_bf(1, 32, b, c);
+}
+/*------------------------------------------------------------*/
+/*---------------- 16 pt fdct -------------------------------*/
+void fdct16(MPEG *m, float x[], float c[])
+{
+   float a[16];                        /* ping pong buffers */
+   float b[16];
+   int p, q;
+
+/* special first stage (drop highest sb) */
+   a[0] = x[0];
+   a[8] = m->cdct.coef32[16] * x[0];
+   for (p = 1, q = 14; p < 8; p++, q--)
+   {
+      a[p] = x[p] + x[q];
+      a[8 + p] = m->cdct.coef32[16 + p] * (x[p] - x[q]);
+   }
+   forward_bf(2, 8, a, b, m->cdct.coef32 + 16 + 8);
+   forward_bf(4, 4, b, a, m->cdct.coef32 + 16 + 8 + 4);
+   forward_bf(8, 2, a, b, m->cdct.coef32 + 16 + 8 + 4 + 2);
+   back_bf(4, 4, b, a);
+   back_bf(2, 8, a, b);
+   back_bf(1, 16, b, c);
+}
+/*------------------------------------------------------------*/
+/*---------------- 16 pt fdct dual chan---------------------*/
+void fdct16_dual(MPEG *m, float x[], float c[])
+{
+   float a[16];                        /* ping pong buffers */
+   float b[16];
+   int p, pp, qq;
+
+/* special first stage for interleaved input */
+   a[0] = x[0];
+   a[8] = m->cdct.coef32[16] * x[0];
+   pp = 2;
+   qq = 2 * 14;
+   for (p = 1; p < 8; p++, pp += 2, qq -= 2)
+   {
+      a[p] = x[pp] + x[qq];
+      a[8 + p] = m->cdct.coef32[16 + p] * (x[pp] - x[qq]);
+   }
+   forward_bf(2, 8, a, b, m->cdct.coef32 + 16 + 8);
+   forward_bf(4, 4, b, a, m->cdct.coef32 + 16 + 8 + 4);
+   forward_bf(8, 2, a, b, m->cdct.coef32 + 16 + 8 + 4 + 2);
+   back_bf(4, 4, b, a);
+   back_bf(2, 8, a, b);
+   back_bf(1, 16, b, c);
+}
+/*------------------------------------------------------------*/
+/*---------------- 16 pt fdct dual to mono-------------------*/
+void fdct16_dual_mono(MPEG *m, float x[], float c[])
+{
+   float a[16];                        /* ping pong buffers */
+   float b[16];
+   float t1, t2;
+   int p, pp, qq;
+
+/* special first stage  */
+   a[0] = 0.5F * (x[0] + x[1]);
+   a[8] = m->cdct.coef32[16] * a[0];
+   pp = 2;
+   qq = 2 * 14;
+   for (p = 1; p < 8; p++, pp += 2, qq -= 2)
+   {
+      t1 = 0.5F * (x[pp] + x[pp + 1]);
+      t2 = 0.5F * (x[qq] + x[qq + 1]);
+      a[p] = t1 + t2;
+      a[8 + p] = m->cdct.coef32[16 + p] * (t1 - t2);
+   }
+   forward_bf(2, 8, a, b, m->cdct.coef32 + 16 + 8);
+   forward_bf(4, 4, b, a, m->cdct.coef32 + 16 + 8 + 4);
+   forward_bf(8, 2, a, b, m->cdct.coef32 + 16 + 8 + 4 + 2);
+   back_bf(4, 4, b, a);
+   back_bf(2, 8, a, b);
+   back_bf(1, 16, b, c);
+}
+/*------------------------------------------------------------*/
+/*---------------- 8 pt fdct -------------------------------*/
+void fdct8(MPEG *m, float x[], float c[])
+{
+   float a[8];                 /* ping pong buffers */
+   float b[8];
+   int p, q;
+
+/* special first stage  */
+
+   b[0] = x[0] + x[7];
+   b[4] = m->cdct.coef32[16 + 8] * (x[0] - x[7]);
+   for (p = 1, q = 6; p < 4; p++, q--)
+   {
+      b[p] = x[p] + x[q];
+      b[4 + p] = m->cdct.coef32[16 + 8 + p] * (x[p] - x[q]);
+   }
+
+   forward_bf(2, 4, b, a, m->cdct.coef32 + 16 + 8 + 4);
+   forward_bf(4, 2, a, b, m->cdct.coef32 + 16 + 8 + 4 + 2);
+   back_bf(2, 4, b, a);
+   back_bf(1, 8, a, c);
+}
+/*------------------------------------------------------------*/
+/*---------------- 8 pt fdct dual chan---------------------*/
+void fdct8_dual(MPEG *m, float x[], float c[])
+{
+   float a[8];                 /* ping pong buffers */
+   float b[8];
+   int p, pp, qq;
+
+/* special first stage for interleaved input */
+   b[0] = x[0] + x[14];
+   b[4] = m->cdct.coef32[16 + 8] * (x[0] - x[14]);
+   pp = 2;
+   qq = 2 * 6;
+   for (p = 1; p < 4; p++, pp += 2, qq -= 2)
+   {
+      b[p] = x[pp] + x[qq];
+      b[4 + p] = m->cdct.coef32[16 + 8 + p] * (x[pp] - x[qq]);
+   }
+   forward_bf(2, 4, b, a, m->cdct.coef32 + 16 + 8 + 4);
+   forward_bf(4, 2, a, b, m->cdct.coef32 + 16 + 8 + 4 + 2);
+   back_bf(2, 4, b, a);
+   back_bf(1, 8, a, c);
+}
+/*------------------------------------------------------------*/
+/*---------------- 8 pt fdct dual to mono---------------------*/
+void fdct8_dual_mono(MPEG *m, float x[], float c[])
+{
+   float a[8];                 /* ping pong buffers */
+   float b[8];
+   float t1, t2;
+   int p, pp, qq;
+
+/* special first stage  */
+   t1 = 0.5F * (x[0] + x[1]);
+   t2 = 0.5F * (x[14] + x[15]);
+   b[0] = t1 + t2;
+   b[4] = m->cdct.coef32[16 + 8] * (t1 - t2);
+   pp = 2;
+   qq = 2 * 6;
+   for (p = 1; p < 4; p++, pp += 2, qq -= 2)
+   {
+      t1 = 0.5F * (x[pp] + x[pp + 1]);
+      t2 = 0.5F * (x[qq] + x[qq + 1]);
+      b[p] = t1 + t2;
+      b[4 + p] = m->cdct.coef32[16 + 8 + p] * (t1 - t2);
+   }
+   forward_bf(2, 4, b, a, m->cdct.coef32 + 16 + 8 + 4);
+   forward_bf(4, 2, a, b, m->cdct.coef32 + 16 + 8 + 4 + 2);
+   back_bf(2, 4, b, a);
+   back_bf(1, 8, a, c);
+}
+/*------------------------------------------------------------*/
diff --git a/codecs/mp3/src/csbt.c b/codecs/mp3/src/csbt.c
new file mode 100755 (executable)
index 0000000..bb90795
--- /dev/null
@@ -0,0 +1,345 @@
+/*____________________________________________________________________________
+       
+       FreeAmp - The Free MP3 Player
+
+        MP3 Decoder originally Copyright (C) 1995-1997 Xing Technology
+        Corp.  http://www.xingtech.com
+
+       Portions Copyright (C) 1998 EMusic.com
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program; if not, write to the Free Software
+       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+       
+       $Id$
+____________________________________________________________________________*/
+
+/****  csbt.c  ***************************************************
+
+MPEG audio decoder, dct and window
+portable C
+
+1/7/96 mod for Layer III
+  
+******************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <float.h>
+#include <math.h>
+#include "L3.h"
+#include "mhead.h"
+
+void fdct32(MPEG *m, float *, float *);
+void fdct32_dual(MPEG *m, float *, float *);
+void fdct32_dual_mono(MPEG *m, float *, float *);
+void fdct16(MPEG *m, float *, float *);
+void fdct16_dual(MPEG *m, float *, float *);
+void fdct16_dual_mono(MPEG *m, float *, float *);
+void fdct8(MPEG *m, float *, float *);
+void fdct8_dual(MPEG *m, float *, float *);
+void fdct8_dual_mono(MPEG *m, float *, float *);
+
+void window(float *, int , short *pcm);
+void window_dual(MPEG *m, float *, int , short *pcm);
+void window16(MPEG *m, float *, int , short *pcm);
+void window16_dual(MPEG *m, float *, int , short *pcm);
+void window8(MPEG *m, float *, int , short *pcm);
+void window8_dual(MPEG *m, float *, int , short *pcm);
+float *dct_coef_addr(MPEG *m);
+
+/*-------------------------------------------------------------------------*/
+/* circular window buffers */
+
+/*======================================================================*/
+static void gencoef(MPEG *m)           /* gen coef for N=32 (31 coefs) */
+{
+   int p, n, i, k;
+   double t, pi;
+   float *coef32;
+
+   coef32 = dct_coef_addr(m);
+
+   pi = 4.0 * atan(1.0);
+   n = 16;
+   k = 0;
+   for (i = 0; i < 5; i++, n = n / 2)
+   {
+
+      for (p = 0; p < n; p++, k++)
+      {
+        t = (pi / (4 * n)) * (2 * p + 1);
+        coef32[k] = (float) (0.50 / cos(t));
+      }
+   }
+}
+/*------------------------------------------------------------*/
+void sbt_init(MPEG *m)
+{
+   int i;
+
+   if (m->csbt.first_pass)
+   {
+      gencoef(m);
+      m->csbt.first_pass = 0;
+   }
+
+/* clear window m->csbt.vbuf */
+   for (i = 0; i < 512; i++)
+   {
+      m->csbt.vbuf[i] = 0.0F;
+      m->csbt.vbuf2[i] = 0.0F;
+   }
+   m->csbt.vb2_ptr = m->csbt.vb_ptr = 0;
+
+}
+/*============================================================*/
+/*============================================================*/
+/*============================================================*/
+void sbt_mono(MPEG *m, float *sample, short *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      fdct32(m, sample, m->csbt.vbuf + m->csbt.vb_ptr);
+      window(m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+      sample += 64;
+      m->csbt.vb_ptr = (m->csbt.vb_ptr - 32) & 511;
+      pcm += 32;
+   }
+
+}
+/*------------------------------------------------------------*/
+void sbt_dual(MPEG *m, float *sample, short *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      fdct32_dual(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+      fdct32_dual(m,sample + 1, m->csbt.vbuf2 + m->csbt.vb_ptr);
+      window_dual(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+      window_dual(m,m->csbt.vbuf2, m->csbt.vb_ptr, pcm + 1);
+      sample += 64;
+      m->csbt.vb_ptr = (m->csbt.vb_ptr - 32) & 511;
+      pcm += 64;
+   }
+
+
+}
+/*------------------------------------------------------------*/
+/* convert dual to mono */
+void sbt_dual_mono(MPEG *m, float *sample, short *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      fdct32_dual_mono(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+      window(m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+      sample += 64;
+      m->csbt.vb_ptr = (m->csbt.vb_ptr - 32) & 511;
+      pcm += 32;
+   }
+
+}
+/*------------------------------------------------------------*/
+/* convert dual to left */
+void sbt_dual_left(MPEG *m, float *sample, short *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      fdct32_dual(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+      window(m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+      sample += 64;
+      m->csbt.vb_ptr = (m->csbt.vb_ptr - 32) & 511;
+      pcm += 32;
+   }
+}
+/*------------------------------------------------------------*/
+/* convert dual to right */
+void sbt_dual_right(MPEG *m, float *sample, short *pcm, int n)
+{
+   int i;
+
+   sample++;                   /* point to right chan */
+   for (i = 0; i < n; i++)
+   {
+      fdct32_dual(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+      window(m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+      sample += 64;
+      m->csbt.vb_ptr = (m->csbt.vb_ptr - 32) & 511;
+      pcm += 32;
+   }
+}
+/*------------------------------------------------------------*/
+/*---------------- 16 pt sbt's  -------------------------------*/
+/*------------------------------------------------------------*/
+void sbt16_mono(MPEG *m, float *sample, short *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      fdct16(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+      window16(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+      sample += 64;
+      m->csbt.vb_ptr = (m->csbt.vb_ptr - 16) & 255;
+      pcm += 16;
+   }
+
+
+}
+/*------------------------------------------------------------*/
+void sbt16_dual(MPEG *m, float *sample, short *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      fdct16_dual(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+      fdct16_dual(m,sample + 1, m->csbt.vbuf2 + m->csbt.vb_ptr);
+      window16_dual(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+      window16_dual(m,m->csbt.vbuf2, m->csbt.vb_ptr, pcm + 1);
+      sample += 64;
+      m->csbt.vb_ptr = (m->csbt.vb_ptr - 16) & 255;
+      pcm += 32;
+   }
+}
+/*------------------------------------------------------------*/
+void sbt16_dual_mono(MPEG *m, float *sample, short *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      fdct16_dual_mono(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+      window16(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+      sample += 64;
+      m->csbt.vb_ptr = (m->csbt.vb_ptr - 16) & 255;
+      pcm += 16;
+   }
+}
+/*------------------------------------------------------------*/
+void sbt16_dual_left(MPEG *m, float *sample, short *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      fdct16_dual(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+      window16(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+      sample += 64;
+      m->csbt.vb_ptr = (m->csbt.vb_ptr - 16) & 255;
+      pcm += 16;
+   }
+}
+/*------------------------------------------------------------*/
+void sbt16_dual_right(MPEG *m, float *sample, short *pcm, int n)
+{
+   int i;
+
+   sample++;
+   for (i = 0; i < n; i++)
+   {
+      fdct16_dual(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+      window16(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+      sample += 64;
+      m->csbt.vb_ptr = (m->csbt.vb_ptr - 16) & 255;
+      pcm += 16;
+   }
+}
+/*------------------------------------------------------------*/
+/*---------------- 8 pt sbt's  -------------------------------*/
+/*------------------------------------------------------------*/
+void sbt8_mono(MPEG *m, float *sample, short *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      fdct8(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+      window8(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+      sample += 64;
+      m->csbt.vb_ptr = (m->csbt.vb_ptr - 8) & 127;
+      pcm += 8;
+   }
+
+}
+/*------------------------------------------------------------*/
+void sbt8_dual(MPEG *m, float *sample, short *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      fdct8_dual(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+      fdct8_dual(m,sample + 1, m->csbt.vbuf2 + m->csbt.vb_ptr);
+      window8_dual(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+      window8_dual(m,m->csbt.vbuf2, m->csbt.vb_ptr, pcm + 1);
+      sample += 64;
+      m->csbt.vb_ptr = (m->csbt.vb_ptr - 8) & 127;
+      pcm += 16;
+   }
+}
+/*------------------------------------------------------------*/
+void sbt8_dual_mono(MPEG *m, float *sample, short *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      fdct8_dual_mono(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+      window8(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+      sample += 64;
+      m->csbt.vb_ptr = (m->csbt.vb_ptr - 8) & 127;
+      pcm += 8;
+   }
+}
+/*------------------------------------------------------------*/
+void sbt8_dual_left(MPEG *m, float *sample, short *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      fdct8_dual(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+      window8(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+      sample += 64;
+      m->csbt.vb_ptr = (m->csbt.vb_ptr - 8) & 127;
+      pcm += 8;
+   }
+}
+/*------------------------------------------------------------*/
+void sbt8_dual_right(MPEG *m, float *sample, short *pcm, int n)
+{
+   int i;
+
+   sample++;
+   for (i = 0; i < n; i++)
+   {
+      fdct8_dual(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+      window8(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+      sample += 64;
+      m->csbt.vb_ptr = (m->csbt.vb_ptr - 8) & 127;
+      pcm += 8;
+   }
+}
+/*------------------------------------------------------------*/
+/*------------------------------------------------------------*/
+#include "csbtb.c"             /* 8 bit output */
+#include "csbtL3.c"            /* Layer III */
+/*------------------------------------------------------------*/
diff --git a/codecs/mp3/src/csbtL3.c b/codecs/mp3/src/csbtL3.c
new file mode 100755 (executable)
index 0000000..85f9599
--- /dev/null
@@ -0,0 +1,316 @@
+/*____________________________________________________________________________
+       
+       FreeAmp - The Free MP3 Player
+
+        MP3 Decoder originally Copyright (C) 1995-1997 Xing Technology
+        Corp.  http://www.xingtech.com
+
+       Portions Copyright (C) 1998 EMusic.com
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program; if not, write to the Free Software
+       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+       
+       $Id$
+____________________________________________________________________________*/
+
+/****  csbtL3.c  ***************************************************
+
+layer III
+
+  include to  csbt.c
+
+******************************************************************/
+/*============================================================*/
+/*============ Layer III =====================================*/
+/*============================================================*/
+void sbt_mono_L3(MPEG *m, float *sample, short *pcm, int ch)
+{
+   int i;
+
+   ch = 0;
+   for (i = 0; i < 18; i++)
+   {
+      fdct32(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+      window(m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+      sample += 32;
+      m->csbt.vb_ptr = (m->csbt.vb_ptr - 32) & 511;
+      pcm += 32;
+   }
+
+}
+/*------------------------------------------------------------*/
+void sbt_dual_L3(MPEG *m, float *sample, short *pcm, int ch)
+{
+   int i;
+
+   if (ch == 0)
+      for (i = 0; i < 18; i++)
+      {
+        fdct32(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+        window_dual(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+        sample += 32;
+        m->csbt.vb_ptr = (m->csbt.vb_ptr - 32) & 511;
+        pcm += 64;
+      }
+   else
+      for (i = 0; i < 18; i++)
+      {
+        fdct32(m,sample, m->csbt.vbuf2 + m->csbt.vb2_ptr);
+        window_dual(m,m->csbt.vbuf2, m->csbt.vb2_ptr, pcm + 1);
+        sample += 32;
+        m->csbt.vb2_ptr = (m->csbt.vb2_ptr - 32) & 511;
+        pcm += 64;
+      }
+
+
+}
+/*------------------------------------------------------------*/
+/*------------------------------------------------------------*/
+/*---------------- 16 pt sbt's  -------------------------------*/
+/*------------------------------------------------------------*/
+void sbt16_mono_L3(MPEG *m, float *sample, short *pcm, int ch)
+{
+   int i;
+
+   ch = 0;
+   for (i = 0; i < 18; i++)
+   {
+      fdct16(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+      window16(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+      sample += 32;
+      m->csbt.vb_ptr = (m->csbt.vb_ptr - 16) & 255;
+      pcm += 16;
+   }
+
+
+}
+/*------------------------------------------------------------*/
+void sbt16_dual_L3(MPEG *m, float *sample, short *pcm, int ch)
+{
+   int i;
+
+
+   if (ch == 0)
+   {
+      for (i = 0; i < 18; i++)
+      {
+        fdct16(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+        window16_dual(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+        sample += 32;
+        m->csbt.vb_ptr = (m->csbt.vb_ptr - 16) & 255;
+        pcm += 32;
+      }
+   }
+   else
+   {
+      for (i = 0; i < 18; i++)
+      {
+        fdct16(m,sample, m->csbt.vbuf2 + m->csbt.vb2_ptr);
+        window16_dual(m,m->csbt.vbuf2, m->csbt.vb2_ptr, pcm + 1);
+        sample += 32;
+        m->csbt.vb2_ptr = (m->csbt.vb2_ptr - 16) & 255;
+        pcm += 32;
+      }
+   }
+
+}
+/*------------------------------------------------------------*/
+/*---------------- 8 pt sbt's  -------------------------------*/
+/*------------------------------------------------------------*/
+void sbt8_mono_L3(MPEG *m, float *sample, short *pcm, int ch)
+{
+   int i;
+
+   ch = 0;
+   for (i = 0; i < 18; i++)
+   {
+      fdct8(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+      window8(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+      sample += 32;
+      m->csbt.vb_ptr = (m->csbt.vb_ptr - 8) & 127;
+      pcm += 8;
+   }
+
+}
+/*------------------------------------------------------------*/
+void sbt8_dual_L3(MPEG *m, float *sample, short *pcm, int ch)
+{
+   int i;
+
+   if (ch == 0)
+   {
+      for (i = 0; i < 18; i++)
+      {
+        fdct8(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+        window8_dual(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+        sample += 32;
+        m->csbt.vb_ptr = (m->csbt.vb_ptr - 8) & 127;
+        pcm += 16;
+      }
+   }
+   else
+   {
+      for (i = 0; i < 18; i++)
+      {
+        fdct8(m,sample, m->csbt.vbuf2 + m->csbt.vb2_ptr);
+        window8_dual(m,m->csbt.vbuf2, m->csbt.vb2_ptr, pcm + 1);
+        sample += 32;
+        m->csbt.vb2_ptr = (m->csbt.vb2_ptr - 8) & 127;
+        pcm += 16;
+      }
+   }
+
+
+
+}
+/*------------------------------------------------------------*/
+/*------- 8 bit output ---------------------------------------*/
+/*------------------------------------------------------------*/
+void sbtB_mono_L3(MPEG *m, float *sample, unsigned char *pcm, int ch)
+{
+   int i;
+
+   ch = 0;
+   for (i = 0; i < 18; i++)
+   {
+      fdct32(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+      windowB(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+      sample += 32;
+      m->csbt.vb_ptr = (m->csbt.vb_ptr - 32) & 511;
+      pcm += 32;
+   }
+
+}
+/*------------------------------------------------------------*/
+void sbtB_dual_L3(MPEG *m, float *sample, unsigned char *pcm, int ch)
+{
+   int i;
+
+   if (ch == 0)
+      for (i = 0; i < 18; i++)
+      {
+        fdct32(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+        windowB_dual(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+        sample += 32;
+        m->csbt.vb_ptr = (m->csbt.vb_ptr - 32) & 511;
+        pcm += 64;
+      }
+   else
+      for (i = 0; i < 18; i++)
+      {
+        fdct32(m,sample, m->csbt.vbuf2 + m->csbt.vb2_ptr);
+        windowB_dual(m,m->csbt.vbuf2, m->csbt.vb2_ptr, pcm + 1);
+        sample += 32;
+        m->csbt.vb2_ptr = (m->csbt.vb2_ptr - 32) & 511;
+        pcm += 64;
+      }
+
+}
+/*------------------------------------------------------------*/
+/*------------------------------------------------------------*/
+/*---------------- 16 pt sbtB's  -------------------------------*/
+/*------------------------------------------------------------*/
+void sbtB16_mono_L3(MPEG *m, float *sample, unsigned char *pcm, int ch)
+{
+   int i;
+
+   ch = 0;
+   for (i = 0; i < 18; i++)
+   {
+      fdct16(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+      windowB16(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+      sample += 32;
+      m->csbt.vb_ptr = (m->csbt.vb_ptr - 16) & 255;
+      pcm += 16;
+   }
+
+
+}
+/*------------------------------------------------------------*/
+void sbtB16_dual_L3(MPEG *m, float *sample, unsigned char *pcm, int ch)
+{
+   int i;
+
+   if (ch == 0)
+   {
+      for (i = 0; i < 18; i++)
+      {
+        fdct16(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+        windowB16_dual(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+        sample += 32;
+        m->csbt.vb_ptr = (m->csbt.vb_ptr - 16) & 255;
+        pcm += 32;
+      }
+   }
+   else
+   {
+      for (i = 0; i < 18; i++)
+      {
+        fdct16(m,sample, m->csbt.vbuf2 + m->csbt.vb2_ptr);
+        windowB16_dual(m,m->csbt.vbuf2, m->csbt.vb2_ptr, pcm + 1);
+        sample += 32;
+        m->csbt.vb2_ptr = (m->csbt.vb2_ptr - 16) & 255;
+        pcm += 32;
+      }
+   }
+
+}
+/*------------------------------------------------------------*/
+/*---------------- 8 pt sbtB's  -------------------------------*/
+/*------------------------------------------------------------*/
+void sbtB8_mono_L3(MPEG *m, float *sample, unsigned char *pcm, int ch)
+{
+   int i;
+
+   ch = 0;
+   for (i = 0; i < 18; i++)
+   {
+      fdct8(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+      windowB8(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+      sample += 32;
+      m->csbt.vb_ptr = (m->csbt.vb_ptr - 8) & 127;
+      pcm += 8;
+   }
+
+}
+/*------------------------------------------------------------*/
+void sbtB8_dual_L3(MPEG *m, float *sample, unsigned char *pcm, int ch)
+{
+   int i;
+
+   if (ch == 0)
+   {
+      for (i = 0; i < 18; i++)
+      {
+        fdct8(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+        windowB8_dual(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+        sample += 32;
+        m->csbt.vb_ptr = (m->csbt.vb_ptr - 8) & 127;
+        pcm += 16;
+      }
+   }
+   else
+   {
+      for (i = 0; i < 18; i++)
+      {
+        fdct8(m,sample, m->csbt.vbuf2 + m->csbt.vb2_ptr);
+        windowB8_dual(m,m->csbt.vbuf2, m->csbt.vb2_ptr, pcm + 1);
+        sample += 32;
+        m->csbt.vb2_ptr = (m->csbt.vb2_ptr - 8) & 127;
+        pcm += 16;
+      }
+   }
+
+}
+/*------------------------------------------------------------*/
diff --git a/codecs/mp3/src/csbtb.c b/codecs/mp3/src/csbtb.c
new file mode 100755 (executable)
index 0000000..158c381
--- /dev/null
@@ -0,0 +1,276 @@
+/*____________________________________________________________________________
+       
+       FreeAmp - The Free MP3 Player
+
+        MP3 Decoder originally Copyright (C) 1995-1997 Xing Technology
+        Corp.  http://www.xingtech.com
+
+       Portions Copyright (C) 1998 EMusic.com
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program; if not, write to the Free Software
+       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+       
+       $Id$
+____________________________________________________________________________*/
+
+/****  csbtb.c  ***************************************************
+include to csbt.c
+
+MPEG audio decoder, dct and window - byte (8 pcm bit output)
+portable C
+
+******************************************************************/
+/*============================================================*/
+/*============================================================*/
+void windowB(MPEG *m, float *, int , unsigned char *pcm);
+void windowB_dual(MPEG *m, float *, int , unsigned char *pcm);
+void windowB16(MPEG *m, float *, int , unsigned char *pcm);
+void windowB16_dual(MPEG *m, float *, int , unsigned char *pcm);
+void windowB8(MPEG *m, float *, int , unsigned char *pcm);
+void windowB8_dual(MPEG *m, float *, int , unsigned char *pcm);
+
+/*============================================================*/
+void sbtB_mono(MPEG *m, float *sample, unsigned char *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      fdct32(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+      windowB(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+      sample += 64;
+      m->csbt.vb_ptr = (m->csbt.vb_ptr - 32) & 511;
+      pcm += 32;
+   }
+
+}
+/*------------------------------------------------------------*/
+void sbtB_dual(MPEG *m, float *sample, unsigned char *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      fdct32_dual(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+      fdct32_dual(m,sample + 1, m->csbt.vbuf2 + m->csbt.vb_ptr);
+      windowB_dual(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+      windowB_dual(m,m->csbt.vbuf2, m->csbt.vb_ptr, pcm + 1);
+      sample += 64;
+      m->csbt.vb_ptr = (m->csbt.vb_ptr - 32) & 511;
+      pcm += 64;
+   }
+
+
+}
+/*------------------------------------------------------------*/
+/* convert dual to mono */
+void sbtB_dual_mono(MPEG *m, float *sample, unsigned char *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      fdct32_dual_mono(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+      windowB(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+      sample += 64;
+      m->csbt.vb_ptr = (m->csbt.vb_ptr - 32) & 511;
+      pcm += 32;
+   }
+
+}
+/*------------------------------------------------------------*/
+/* convert dual to left */
+void sbtB_dual_left(MPEG *m, float *sample, unsigned char *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      fdct32_dual(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+      windowB(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+      sample += 64;
+      m->csbt.vb_ptr = (m->csbt.vb_ptr - 32) & 511;
+      pcm += 32;
+   }
+}
+/*------------------------------------------------------------*/
+/* convert dual to right */
+void sbtB_dual_right(MPEG *m, float *sample, unsigned char *pcm, int n)
+{
+   int i;
+
+   sample++;                   /* point to right chan */
+   for (i = 0; i < n; i++)
+   {
+      fdct32_dual(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+      windowB(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+      sample += 64;
+      m->csbt.vb_ptr = (m->csbt.vb_ptr - 32) & 511;
+      pcm += 32;
+   }
+}
+/*------------------------------------------------------------*/
+/*---------------- 16 pt sbt's  -------------------------------*/
+/*------------------------------------------------------------*/
+void sbtB16_mono(MPEG *m, float *sample, unsigned char *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      fdct16(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+      windowB16(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+      sample += 64;
+      m->csbt.vb_ptr = (m->csbt.vb_ptr - 16) & 255;
+      pcm += 16;
+   }
+
+
+}
+/*------------------------------------------------------------*/
+void sbtB16_dual(MPEG *m, float *sample, unsigned char *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      fdct16_dual(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+      fdct16_dual(m,sample + 1, m->csbt.vbuf2 + m->csbt.vb_ptr);
+      windowB16_dual(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+      windowB16_dual(m,m->csbt.vbuf2, m->csbt.vb_ptr, pcm + 1);
+      sample += 64;
+      m->csbt.vb_ptr = (m->csbt.vb_ptr - 16) & 255;
+      pcm += 32;
+   }
+}
+/*------------------------------------------------------------*/
+void sbtB16_dual_mono(MPEG *m, float *sample, unsigned char *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      fdct16_dual_mono(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+      windowB16(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+      sample += 64;
+      m->csbt.vb_ptr = (m->csbt.vb_ptr - 16) & 255;
+      pcm += 16;
+   }
+}
+/*------------------------------------------------------------*/
+void sbtB16_dual_left(MPEG *m, float *sample, unsigned char *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      fdct16_dual(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+      windowB16(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+      sample += 64;
+      m->csbt.vb_ptr = (m->csbt.vb_ptr - 16) & 255;
+      pcm += 16;
+   }
+}
+/*------------------------------------------------------------*/
+void sbtB16_dual_right(MPEG *m, float *sample, unsigned char *pcm, int n)
+{
+   int i;
+
+   sample++;
+   for (i = 0; i < n; i++)
+   {
+      fdct16_dual(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+      windowB16(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+      sample += 64;
+      m->csbt.vb_ptr = (m->csbt.vb_ptr - 16) & 255;
+      pcm += 16;
+   }
+}
+/*------------------------------------------------------------*/
+/*---------------- 8 pt sbt's  -------------------------------*/
+/*------------------------------------------------------------*/
+void sbtB8_mono(MPEG *m, float *sample, unsigned char *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      fdct8(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+      windowB8(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+      sample += 64;
+      m->csbt.vb_ptr = (m->csbt.vb_ptr - 8) & 127;
+      pcm += 8;
+   }
+
+}
+/*------------------------------------------------------------*/
+void sbtB8_dual(MPEG *m, float *sample, unsigned char *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      fdct8_dual(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+      fdct8_dual(m,sample + 1, m->csbt.vbuf2 + m->csbt.vb_ptr);
+      windowB8_dual(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+      windowB8_dual(m,m->csbt.vbuf2, m->csbt.vb_ptr, pcm + 1);
+      sample += 64;
+      m->csbt.vb_ptr = (m->csbt.vb_ptr - 8) & 127;
+      pcm += 16;
+   }
+}
+/*------------------------------------------------------------*/
+void sbtB8_dual_mono(MPEG *m, float *sample, unsigned char *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      fdct8_dual_mono(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+      windowB8(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+      sample += 64;
+      m->csbt.vb_ptr = (m->csbt.vb_ptr - 8) & 127;
+      pcm += 8;
+   }
+}
+/*------------------------------------------------------------*/
+void sbtB8_dual_left(MPEG *m, float *sample, unsigned char *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      fdct8_dual(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+      windowB8(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+      sample += 64;
+      m->csbt.vb_ptr = (m->csbt.vb_ptr - 8) & 127;
+      pcm += 8;
+   }
+}
+/*------------------------------------------------------------*/
+void sbtB8_dual_right(MPEG *m, float *sample, unsigned char *pcm, int n)
+{
+   int i;
+
+   sample++;
+   for (i = 0; i < n; i++)
+   {
+      fdct8_dual(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
+      windowB8(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
+      sample += 64;
+      m->csbt.vb_ptr = (m->csbt.vb_ptr - 8) & 127;
+      pcm += 8;
+   }
+}
+/*------------------------------------------------------------*/
diff --git a/codecs/mp3/src/cupini.c b/codecs/mp3/src/cupini.c
new file mode 100755 (executable)
index 0000000..5775a86
--- /dev/null
@@ -0,0 +1,421 @@
+/*____________________________________________________________________________
+       
+       FreeAmp - The Free MP3 Player
+
+        MP3 Decoder originally Copyright (C) 1995-1997 Xing Technology
+        Corp.  http://www.xingtech.com
+
+       Portions Copyright (C) 1998-1999 EMusic.com
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program; if not, write to the Free Software
+       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+       
+       $Id$
+____________________________________________________________________________*/
+
+/*=========================================================
+ initialization for cup.c - include to cup.c
+ mpeg audio decoder portable "c"
+
+mod 8/6/96 add 8 bit output
+
+mod 5/10/95 add quick (low precision) window
+
+mod 5/16/95 sb limit for reduced samprate output
+            changed from 94% to 100% of Nyquist sb
+
+mod 11/15/95 for Layer I
+
+
+=========================================================*/
+/*-- compiler bug, floating constant overflow w/ansi --*/
+#ifdef _MSC_VER
+#pragma warning(disable:4056)
+#endif
+
+
+
+/* Read Only */
+static long steps[18] =
+{
+   0, 3, 5, 7, 9, 15, 31, 63, 127,
+   255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535};
+
+
+/* ABCD_INDEX = lookqt[mode][sr_index][br_index]  */
+/* -1 = invalid  */
+/* Read Only */
+static signed char lookqt[4][3][16] =
+{
+ {{1, -1, -1, -1, 2, -1, 2, 0, 0, 0, 1, 1, 1, 1, 1, -1},       /*  44ks stereo */
+  {0, -1, -1, -1, 2, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, -1},       /*  48ks */
+  {1, -1, -1, -1, 3, -1, 3, 0, 0, 0, 1, 1, 1, 1, 1, -1}},      /*  32ks */
+ {{1, -1, -1, -1, 2, -1, 2, 0, 0, 0, 1, 1, 1, 1, 1, -1},       /*  44ks joint stereo */
+  {0, -1, -1, -1, 2, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, -1},       /*  48ks */
+  {1, -1, -1, -1, 3, -1, 3, 0, 0, 0, 1, 1, 1, 1, 1, -1}},      /*  32ks */
+ {{1, -1, -1, -1, 2, -1, 2, 0, 0, 0, 1, 1, 1, 1, 1, -1},       /*  44ks dual chan */
+  {0, -1, -1, -1, 2, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, -1},       /*  48ks */
+  {1, -1, -1, -1, 3, -1, 3, 0, 0, 0, 1, 1, 1, 1, 1, -1}},      /*  32ks */
+// mono extended beyond legal br index
+//  1,2,2,0,0,0,1,1,1,1,1,1,1,1,1,-1,          /*  44ks single chan */
+//  0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,-1,          /*  48ks */
+//  1,3,3,0,0,0,1,1,1,1,1,1,1,1,1,-1,          /*  32ks */
+// legal mono
+ {{1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1},       /*  44ks single chan */
+  {0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1},       /*  48ks */
+  {1, 3, 3, 0, 0, 0, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1}},      /*  32ks */
+};
+/* Read Only */
+static long sr_table[8] =
+{22050L, 24000L, 16000L, 1L,
+ 44100L, 48000L, 32000L, 1L};
+
+/* bit allocation table look up */
+/* table per mpeg spec tables 3b2a/b/c/d  /e is mpeg2 */
+/* look_bat[abcd_index][4][16]  */
+/* Read Only */
+static unsigned char look_bat[5][4][16] =
+{
+/* LOOK_BATA */
+ {{0, 1, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17},
+  {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17},
+  {0, 1, 2, 3, 4, 5, 6, 17, 0, 0, 0, 0, 0, 0, 0, 0},
+  {0, 1, 2, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+/* LOOK_BATB */
+ {{0, 1, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17},
+  {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17},
+  {0, 1, 2, 3, 4, 5, 6, 17, 0, 0, 0, 0, 0, 0, 0, 0},
+  {0, 1, 2, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+/* LOOK_BATC */
+ {{0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16},
+  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+  {0, 1, 2, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0},
+  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+/* LOOK_BATD */
+ {{0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16},
+  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+  {0, 1, 2, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0},
+  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+/* LOOK_BATE */
+ {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},
+  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+  {0, 1, 2, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0},
+  {0, 1, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+};
+
+/* look_nbat[abcd_index]][4] */
+/* Read Only */
+static unsigned char look_nbat[5][4] =
+{
+  {3, 8, 12, 4},
+  {3, 8, 12, 7},
+  {2, 0, 6, 0},
+  {2, 0, 10, 0},
+  {4, 0, 7, 19},
+};
+
+
+void sbt_mono(MPEG *m, float *sample, short *pcm, int n);
+void sbt_dual(MPEG *m, float *sample, short *pcm, int n);
+void sbt_dual_mono(MPEG *m, float *sample, short *pcm, int n);
+void sbt_dual_left(MPEG *m, float *sample, short *pcm, int n);
+void sbt_dual_right(MPEG *m, float *sample, short *pcm, int n);
+void sbt16_mono(MPEG *m, float *sample, short *pcm, int n);
+void sbt16_dual(MPEG *m, float *sample, short *pcm, int n);
+void sbt16_dual_mono(MPEG *m, float *sample, short *pcm, int n);
+void sbt16_dual_left(MPEG *m, float *sample, short *pcm, int n);
+void sbt16_dual_right(MPEG *m, float *sample, short *pcm, int n);
+void sbt8_mono(MPEG *m, float *sample, short *pcm, int n);
+void sbt8_dual(MPEG *m, float *sample, short *pcm, int n);
+void sbt8_dual_mono(MPEG *m, float *sample, short *pcm, int n);
+void sbt8_dual_left(MPEG *m, float *sample, short *pcm, int n);
+void sbt8_dual_right(MPEG *m, float *sample, short *pcm, int n);
+
+/*--- 8 bit output ---*/
+void sbtB_mono(MPEG *m, float *sample, unsigned char *pcm, int n);
+void sbtB_dual(MPEG *m, float *sample, unsigned char *pcm, int n);
+void sbtB_dual_mono(MPEG *m, float *sample, unsigned char *pcm, int n);
+void sbtB_dual_left(MPEG *m, float *sample, unsigned char *pcm, int n);
+void sbtB_dual_right(MPEG *m, float *sample, unsigned char *pcm, int n);
+void sbtB16_mono(MPEG *m, float *sample, unsigned char *pcm, int n);
+void sbtB16_dual(MPEG *m, float *sample, unsigned char *pcm, int n);
+void sbtB16_dual_mono(MPEG *m, float *sample, unsigned char *pcm, int n);
+void sbtB16_dual_left(MPEG *m, float *sample, unsigned char *pcm, int n);
+void sbtB16_dual_right(MPEG *m, float *sample, unsigned char *pcm, int n);
+void sbtB8_mono(MPEG *m, float *sample, unsigned char *pcm, int n);
+void sbtB8_dual(MPEG *m, float *sample, unsigned char *pcm, int n);
+void sbtB8_dual_mono(MPEG *m, float *sample, unsigned char *pcm, int n);
+void sbtB8_dual_left(MPEG *m, float *sample, unsigned char *pcm, int n);
+void sbtB8_dual_right(MPEG *m, float *sample, unsigned char *pcm, int n);
+
+
+static SBT_FUNCTION_F sbt_table[2][3][5] =
+{
+ {{sbt_mono, sbt_dual, sbt_dual_mono, sbt_dual_left, sbt_dual_right},
+  {sbt16_mono, sbt16_dual, sbt16_dual_mono, sbt16_dual_left, sbt16_dual_right},
+  {sbt8_mono, sbt8_dual, sbt8_dual_mono, sbt8_dual_left, sbt8_dual_right}},
+ {{(SBT_FUNCTION_F) sbtB_mono,
+   (SBT_FUNCTION_F) sbtB_dual,
+   (SBT_FUNCTION_F) sbtB_dual_mono,
+   (SBT_FUNCTION_F) sbtB_dual_left,
+   (SBT_FUNCTION_F) sbtB_dual_right},
+  {(SBT_FUNCTION_F) sbtB16_mono,
+   (SBT_FUNCTION_F) sbtB16_dual,
+   (SBT_FUNCTION_F) sbtB16_dual_mono,
+   (SBT_FUNCTION_F) sbtB16_dual_left,
+   (SBT_FUNCTION_F) sbtB16_dual_right},
+  {(SBT_FUNCTION_F) sbtB8_mono,
+   (SBT_FUNCTION_F) sbtB8_dual,
+   (SBT_FUNCTION_F) sbtB8_dual_mono,
+   (SBT_FUNCTION_F) sbtB8_dual_left,
+   (SBT_FUNCTION_F) sbtB8_dual_right}},
+};
+
+static int out_chans[5] =
+{1, 2, 1, 1, 1};
+
+
+int audio_decode_initL1(MPEG_HEAD * h, int framebytes_arg,
+                  int reduction_code, int transform_code, int convert_code,
+                       int freq_limit);
+void sbt_init();
+
+
+IN_OUT L1audio_decode(void *mv, unsigned char *bs, signed short *pcm);
+IN_OUT L2audio_decode(void *mv, unsigned char *bs, signed short *pcm);
+IN_OUT L3audio_decode(void *mv, unsigned char *bs, unsigned char *pcm);
+static AUDIO_DECODE_ROUTINE decode_routine_table[4] =
+{
+   L2audio_decode,
+   (AUDIO_DECODE_ROUTINE)L3audio_decode,
+   L2audio_decode,
+   L1audio_decode,};
+
+extern void cup3_init(MPEG *m);
+
+void mpeg_init(MPEG *m)
+{
+       memset(m, 0, sizeof(MPEG));
+       m->cup.nsb_limit = 6;
+       m->cup.nbat[0] = 3;
+       m->cup.nbat[1] = 8;
+       m->cup.nbat[3] = 12;
+       m->cup.nbat[4] = 7;
+       m->cup.sbt = sbt_mono;
+       m->cup.first_pass = 1;
+       m->cup.first_pass_L1 = 1;
+       m->cup.audio_decode_routine = L2audio_decode;
+       m->cup.cs_factorL1 = m->cup.cs_factor[0];
+       m->cup.nbatL1 = 32;
+       m->cupl.band_limit = 576;
+       m->cupl.band_limit21 = 567;
+       m->cupl.band_limit12 = 576;
+       m->cupl.band_limit_nsb = 32;
+       m->cupl.nsb_limit=32;
+       m->cup.sample = (float *)&m->cupl.sample;
+       m->csbt.first_pass = 1;
+       cup3_init(m);
+}
+
+/*---------------------------------------------------------*/
+static void table_init(MPEG *m)
+{
+   int i, j;
+   int code;
+
+/*--  c_values (dequant) --*/
+   for (i = 1; i < 18; i++)
+      m->cup.look_c_value[i] = 2.0F / steps[i];
+
+/*--  scale factor table, scale by 32768 for 16 pcm output  --*/
+   for (i = 0; i < 64; i++)
+      m->cup.sf_table[i] = (float) (32768.0 * 2.0 * pow(2.0, -i / 3.0));
+
+/*--  grouped 3 level lookup table 5 bit token --*/
+   for (i = 0; i < 32; i++)
+   {
+      code = i;
+      for (j = 0; j < 3; j++)
+      {
+        m->cup.group3_table[i][j] = (char) ((code % 3) - 1);
+        code /= 3;
+      }
+   }
+/*--  grouped 5 level lookup table 7 bit token --*/
+   for (i = 0; i < 128; i++)
+   {
+      code = i;
+      for (j = 0; j < 3; j++)
+      {
+        m->cup.group5_table[i][j] = (char) ((code % 5) - 2);
+        code /= 5;
+      }
+   }
+/*--  grouped 9 level lookup table 10 bit token --*/
+   for (i = 0; i < 1024; i++)
+   {
+      code = i;
+      for (j = 0; j < 3; j++)
+      {
+        m->cup.group9_table[i][j] = (short) ((code % 9) - 4);
+        code /= 9;
+      }
+   }
+
+
+}
+/*---------------------------------------------------------*/
+int L1audio_decode_init(MPEG *m, MPEG_HEAD * h, int framebytes_arg,
+                  int reduction_code, int transform_code, int convert_code,
+                       int freq_limit);
+int L3audio_decode_init(MPEG *m, MPEG_HEAD * h, int framebytes_arg,
+                  int reduction_code, int transform_code, int convert_code,
+                       int freq_limit);
+
+/*---------------------------------------------------------*/
+/* mpeg_head defined in mhead.h  frame bytes is without pad */
+int audio_decode_init(MPEG *m, MPEG_HEAD * h, int framebytes_arg,
+                  int reduction_code, int transform_code, int convert_code,
+                     int freq_limit)
+{
+   int i, j, k;
+   int abcd_index;
+   long samprate;
+   int limit;
+   int bit_code;
+
+   if (m->cup.first_pass)
+   {
+      table_init(m);
+      m->cup.first_pass = 0;
+   }
+
+/* select decoder routine Layer I,II,III */
+   m->cup.audio_decode_routine = decode_routine_table[h->option & 3];
+
+
+   if (h->option == 3)         /* layer I */
+      return L1audio_decode_init(m, h, framebytes_arg,
+                 reduction_code, transform_code, convert_code, freq_limit);
+
+   if (h->option == 1)         /* layer III */
+      return L3audio_decode_init(m, h, framebytes_arg,
+                 reduction_code, transform_code, convert_code, freq_limit);
+
+
+
+   transform_code = transform_code;    /* not used, asm compatability */
+   bit_code = 0;
+   if (convert_code & 8)
+      bit_code = 1;
+   convert_code = convert_code & 3;    /* higher bits used by dec8 freq cvt */
+   if (reduction_code < 0)
+      reduction_code = 0;
+   if (reduction_code > 2)
+      reduction_code = 2;
+   if (freq_limit < 1000)
+      freq_limit = 1000;
+
+
+   m->cup.framebytes = framebytes_arg;
+/* check if code handles */
+   if (h->option != 2)
+      return 0;                        /* layer II only */
+   if (h->sr_index == 3)
+      return 0;                        /* reserved */
+
+/* compute abcd index for bit allo table selection */
+   if (h->id)                  /* mpeg 1 */
+      abcd_index = lookqt[h->mode][h->sr_index][h->br_index];
+   else
+      abcd_index = 4;          /* mpeg 2 */
+
+   if (abcd_index < 0)
+      return 0;                        // fail invalid Layer II bit rate index
+
+   for (i = 0; i < 4; i++)
+      for (j = 0; j < 16; j++)
+        m->cup.bat[i][j] = look_bat[abcd_index][i][j];
+   for (i = 0; i < 4; i++)
+      m->cup.nbat[i] = look_nbat[abcd_index][i];
+   m->cup.max_sb = m->cup.nbat[0] + m->cup.nbat[1] + m->cup.nbat[2] + m->cup.nbat[3];
+/*----- compute nsb_limit --------*/
+   samprate = sr_table[4 * h->id + h->sr_index];
+   m->cup.nsb_limit = (freq_limit * 64L + samprate / 2) / samprate;
+/*- caller limit -*/
+/*---- limit = 0.94*(32>>reduction_code);  ----*/
+   limit = (32 >> reduction_code);
+   if (limit > 8)
+      limit--;
+   if (m->cup.nsb_limit > limit)
+      m->cup.nsb_limit = limit;
+   if (m->cup.nsb_limit > m->cup.max_sb)
+      m->cup.nsb_limit = m->cup.max_sb;
+
+   m->cup.outvalues = 1152 >> reduction_code;
+   if (h->mode != 3)
+   {                           /* adjust for 2 channel modes */
+      for (i = 0; i < 4; i++)
+        m->cup.nbat[i] *= 2;
+      m->cup.max_sb *= 2;
+      m->cup.nsb_limit *= 2;
+   }
+
+/* set sbt function */
+   k = 1 + convert_code;
+   if (h->mode == 3)
+   {
+      k = 0;
+   }
+   m->cup.sbt = sbt_table[bit_code][reduction_code][k];
+   m->cup.outvalues *= out_chans[k];
+   if (bit_code)
+      m->cup.outbytes = m->cup.outvalues;
+   else
+      m->cup.outbytes = sizeof(short) * m->cup.outvalues;
+
+   m->cup.decinfo.channels = out_chans[k];
+   m->cup.decinfo.outvalues = m->cup.outvalues;
+   m->cup.decinfo.samprate = samprate >> reduction_code;
+   if (bit_code)
+      m->cup.decinfo.bits = 8;
+   else
+      m->cup.decinfo.bits = sizeof(short) * 8;
+
+   m->cup.decinfo.framebytes = m->cup.framebytes;
+   m->cup.decinfo.type = 0;
+
+
+
+/* clear sample buffer, unused sub bands must be 0 */
+   for (i = 0; i < 2304; i++)
+      m->cup.sample[i] = 0.0F;
+
+
+/* init sub-band transform */
+   sbt_init();
+
+   return 1;
+}
+/*---------------------------------------------------------*/
+void audio_decode_info(MPEG *m, DEC_INFO * info)
+{
+   *info = m->cup.decinfo;             /* info return, call after init */
+}
+/*---------------------------------------------------------*/
+void decode_table_init(MPEG *m)
+{
+/* dummy for asm version compatability */
+}
+/*---------------------------------------------------------*/
diff --git a/codecs/mp3/src/cupl3.c b/codecs/mp3/src/cupl3.c
new file mode 100755 (executable)
index 0000000..7d387b6
--- /dev/null
@@ -0,0 +1,1189 @@
+/*____________________________________________________________________________
+       
+       FreeAmp - The Free MP3 Player
+
+        MP3 Decoder originally Copyright (C) 1995-1997 Xing Technology
+        Corp.  http://www.xingtech.com
+
+       Portions Copyright (C) 1998-1999 EMusic.com
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program; if not, write to the Free Software
+       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+       
+       $Id$
+____________________________________________________________________________*/
+
+/****  cupL3.c  ***************************************************
+unpack Layer III
+
+
+mod 8/18/97  bugfix crc problem
+
+mod 10/9/97  add band_limit12 for short blocks
+
+mod 10/22/97  zero buf_ptrs in init
+
+mod 5/15/98 mpeg 2.5
+
+mod 8/19/98 decode 22 sf bands
+
+******************************************************************/
+
+/*---------------------------------------
+TO DO: Test mixed blocks (mixed long/short)
+  No mixed blocks in mpeg-1 test stream being used for development
+
+-----------------------------------------*/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <float.h>
+#include <math.h>
+#include <memory.h>
+#include <string.h>
+#include <assert.h>
+#include "L3.h"
+#include "mhead.h"             /* mpeg header structure */
+#include "jdw.h"
+#include "protos.h"
+
+
+/*====================================================================*/
+static int mp_sr20_table[2][4] =
+{{441, 480, 320, -999}, {882, 960, 640, -999}};
+static int mp_br_tableL3[2][16] =
+{{0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0},    /* mpeg 2 */
+ {0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0}};
+
+/*====================================================================*/
+
+/*-- global band tables */
+/*-- short portion is 3*x !! --*/
+
+/*====================================================================*/
+
+/*---------------------------------*/
+/*---------------------------------*/
+/*- sample union of int/float  sample[ch][gr][576] */
+/* Sample is the same as cup.sample */
+
+void sbt_dual_L3(MPEG *m, float *sample, short *pcm, int n);
+
+IN_OUT L3audio_decode_MPEG1(void *mv, unsigned char *bs, unsigned char *pcm);
+IN_OUT L3audio_decode_MPEG2(void *mv, unsigned char *bs, unsigned char *pcm);
+/*
+static DECODE_FUNCTION decode_function = L3audio_decode_MPEG1;
+*/
+
+/*====================================================================*/
+/* get bits from bitstream in endian independent way */
+
+BITDAT bitdat;                 /* global for inline use by Huff */
+
+/*------------- initialize bit getter -------------*/
+static void bitget_init(unsigned char *buf)
+{
+   bitdat.bs_ptr0 = bitdat.bs_ptr = buf;
+   bitdat.bits = 0;
+   bitdat.bitbuf = 0;
+}
+/*------------- initialize bit getter -------------*/
+static void bitget_init_end(unsigned char *buf_end)
+{
+   bitdat.bs_ptr_end = buf_end;
+}
+/*------------- get n bits from bitstream -------------*/
+int bitget_bits_used()
+{
+   int n;                      /* compute bits used from last init call */
+
+   n = ((bitdat.bs_ptr - bitdat.bs_ptr0) << 3) - bitdat.bits;
+   return n;
+}
+/*------------- check for n bits in bitbuf -------------*/
+void bitget_check(int n)
+{
+   if (bitdat.bits < n)
+   {
+      while (bitdat.bits <= 24)
+      {
+        bitdat.bitbuf = (bitdat.bitbuf << 8) | *bitdat.bs_ptr++;
+        bitdat.bits += 8;
+      }
+   }
+}
+/*------------- get n bits from bitstream -------------*/
+unsigned int bitget(int n)
+{
+   unsigned int x;
+
+   if (bitdat.bits < n)
+   {                           /* refill bit buf if necessary */
+      while (bitdat.bits <= 24)
+      {
+        bitdat.bitbuf = (bitdat.bitbuf << 8) | *bitdat.bs_ptr++;
+        bitdat.bits += 8;
+      }
+   }
+   bitdat.bits -= n;
+   x = bitdat.bitbuf >> bitdat.bits;
+   bitdat.bitbuf -= x << bitdat.bits;
+   return x;
+}
+/*------------- get 1 bit from bitstream -------------*/
+unsigned int bitget_1bit()
+{
+   unsigned int x;
+
+   if (bitdat.bits <= 0)
+   {                           /* refill bit buf if necessary */
+      while (bitdat.bits <= 24)
+      {
+        bitdat.bitbuf = (bitdat.bitbuf << 8) | *bitdat.bs_ptr++;
+        bitdat.bits += 8;
+      }
+   }
+   bitdat.bits--;
+   x = bitdat.bitbuf >> bitdat.bits;
+   bitdat.bitbuf -= x << bitdat.bits;
+   return x;
+}
+/*====================================================================*/
+static void Xform_mono(void *mv, void *pcm, int igr)
+{
+   MPEG *m = mv;
+   int igr_prev, n1, n2;
+
+/*--- hybrid + sbt ---*/
+   n1 = n2 = m->cupl.nsamp[igr][0];    /* total number bands */
+   if (m->cupl.side_info.gr[igr][0].block_type == 2)
+   {                           /* long bands */
+      n1 = 0;
+      if (m->cupl.side_info.gr[igr][0].mixed_block_flag)
+        n1 = m->cupl.sfBandIndex[0][m->cupl.ncbl_mixed - 1];
+   }
+   if (n1 > m->cupl.band_limit)
+      n1 = m->cupl.band_limit;
+   if (n2 > m->cupl.band_limit)
+      n2 = m->cupl.band_limit;
+   igr_prev = igr ^ 1;
+
+   m->cupl.nsamp[igr][0] = hybrid(m,m->cupl.sample[0][igr], m->cupl.sample[0][igr_prev],
+        m->cupl.yout, m->cupl.side_info.gr[igr][0].block_type, n1, n2, m->cupl.nsamp[igr_prev][0]);
+   FreqInvert(m->cupl.yout, m->cupl.nsamp[igr][0]);
+   m->cupl.sbt_L3(m,m->cupl.yout, pcm, 0);
+
+}
+
+/*--------------------------------------------------------------------*/
+static void Xform_dual_right(void *mv, void *pcm, int igr)
+{
+   MPEG *m = mv;
+   int igr_prev, n1, n2;
+
+/*--- hybrid + sbt ---*/
+   n1 = n2 = m->cupl.nsamp[igr][1];    /* total number bands */
+   if (m->cupl.side_info.gr[igr][1].block_type == 2)
+   {                           /* long bands */
+      n1 = 0;
+      if (m->cupl.side_info.gr[igr][1].mixed_block_flag)
+        n1 = m->cupl.sfBandIndex[0][m->cupl.ncbl_mixed - 1];
+   }
+   if (n1 > m->cupl.band_limit)
+      n1 = m->cupl.band_limit;
+   if (n2 > m->cupl.band_limit)
+      n2 = m->cupl.band_limit;
+   igr_prev = igr ^ 1;
+   m->cupl.nsamp[igr][1] = hybrid(m,m->cupl.sample[1][igr], m->cupl.sample[1][igr_prev],
+        m->cupl.yout, m->cupl.side_info.gr[igr][1].block_type, n1, n2, m->cupl.nsamp[igr_prev][1]);
+   FreqInvert(m->cupl.yout, m->cupl.nsamp[igr][1]);
+   m->cupl.sbt_L3(m,m->cupl.yout, pcm, 0);
+
+}
+/*--------------------------------------------------------------------*/
+static void Xform_dual(void *mv, void *pcm, int igr)
+{
+   MPEG *m = mv;
+   int ch;
+   int igr_prev, n1, n2;
+
+/*--- hybrid + sbt ---*/
+   igr_prev = igr ^ 1;
+   for (ch = 0; ch < m->cupl.nchan; ch++)
+   {
+      n1 = n2 = m->cupl.nsamp[igr][ch];        /* total number bands */
+      if (m->cupl.side_info.gr[igr][ch].block_type == 2)
+      {                                /* long bands */
+        n1 = 0;
+        if (m->cupl.side_info.gr[igr][ch].mixed_block_flag)
+           n1 = m->cupl.sfBandIndex[0][m->cupl.ncbl_mixed - 1];
+      }
+      if (n1 > m->cupl.band_limit)
+        n1 = m->cupl.band_limit;
+      if (n2 > m->cupl.band_limit)
+        n2 = m->cupl.band_limit;
+      m->cupl.nsamp[igr][ch] = hybrid(m,m->cupl.sample[ch][igr], m->cupl.sample[ch][igr_prev],
+       m->cupl.yout, m->cupl.side_info.gr[igr][ch].block_type, n1, n2, m->cupl.nsamp[igr_prev][ch]);
+      FreqInvert(m->cupl.yout, m->cupl.nsamp[igr][ch]);
+      m->cupl.sbt_L3(m,m->cupl.yout, pcm, ch);
+   }
+
+}
+/*--------------------------------------------------------------------*/
+static void Xform_dual_mono(void *mv, void *pcm, int igr)
+{
+   MPEG *m = mv;
+   int igr_prev, n1, n2, n3;
+
+/*--- hybrid + sbt ---*/
+   igr_prev = igr ^ 1;
+   if ((m->cupl.side_info.gr[igr][0].block_type == m->cupl.side_info.gr[igr][1].block_type)
+       && (m->cupl.side_info.gr[igr][0].mixed_block_flag == 0)
+       && (m->cupl.side_info.gr[igr][1].mixed_block_flag == 0))
+   {
+
+      n2 = m->cupl.nsamp[igr][0];      /* total number bands max of L R */
+      if (n2 < m->cupl.nsamp[igr][1])
+        n2 = m->cupl.nsamp[igr][1];
+      if (n2 > m->cupl.band_limit)
+        n2 = m->cupl.band_limit;
+      n1 = n2;                 /* n1 = number long bands */
+      if (m->cupl.side_info.gr[igr][0].block_type == 2)
+        n1 = 0;
+      sum_f_bands(m->cupl.sample[0][igr], m->cupl.sample[1][igr], n2);
+      n3 = m->cupl.nsamp[igr][0] = hybrid(m,m->cupl.sample[0][igr], m->cupl.sample[0][igr_prev],
+        m->cupl.yout, m->cupl.side_info.gr[igr][0].block_type, n1, n2, m->cupl.nsamp[igr_prev][0]);
+   }
+   else
+   {                           /* transform and then sum (not tested - never happens in test) */
+/*-- left chan --*/
+      n1 = n2 = m->cupl.nsamp[igr][0]; /* total number bands */
+      if (m->cupl.side_info.gr[igr][0].block_type == 2)
+      {
+        n1 = 0;                /* long bands */
+        if (m->cupl.side_info.gr[igr][0].mixed_block_flag)
+           n1 = m->cupl.sfBandIndex[0][m->cupl.ncbl_mixed - 1];
+      }
+      n3 = m->cupl.nsamp[igr][0] = hybrid(m,m->cupl.sample[0][igr], m->cupl.sample[0][igr_prev],
+        m->cupl.yout, m->cupl.side_info.gr[igr][0].block_type, n1, n2, m->cupl.nsamp[igr_prev][0]);
+/*-- right chan --*/
+      n1 = n2 = m->cupl.nsamp[igr][1]; /* total number bands */
+      if (m->cupl.side_info.gr[igr][1].block_type == 2)
+      {
+        n1 = 0;                /* long bands */
+        if (m->cupl.side_info.gr[igr][1].mixed_block_flag)
+           n1 = m->cupl.sfBandIndex[0][m->cupl.ncbl_mixed - 1];
+      }
+      m->cupl.nsamp[igr][1] = hybrid_sum(m, m->cupl.sample[1][igr], m->cupl.sample[0][igr],
+                            m->cupl.yout, m->cupl.side_info.gr[igr][1].block_type, n1, n2);
+      if (n3 < m->cupl.nsamp[igr][1])
+        n1 = m->cupl.nsamp[igr][1];
+   }
+
+/*--------*/
+   FreqInvert(m->cupl.yout, n3);
+   m->cupl.sbt_L3(m,m->cupl.yout, pcm, 0);
+
+}
+/*--------------------------------------------------------------------*/
+/*====================================================================*/
+static int unpack_side_MPEG1(MPEG *m)
+{
+   int prot;
+   int br_index;
+   int igr, ch;
+   int side_bytes;
+
+/* decode partial header plus initial side info */
+/* at entry bit getter points at id, sync skipped by caller */
+
+   m->cupl.id = bitget(1);             /* id */
+   bitget(2);                  /* skip layer */
+   prot = bitget(1);           /* bitget prot bit */
+   br_index = bitget(4);
+   m->cupl.sr_index = bitget(2);
+   m->cupl.pad = bitget(1);
+   bitget(1);                  /* skip to mode */
+   m->cupl.side_info.mode = bitget(2); /* mode */
+   m->cupl.side_info.mode_ext = bitget(2);     /* mode ext */
+
+   if (m->cupl.side_info.mode != 1)
+      m->cupl.side_info.mode_ext = 0;
+
+/* adjust global gain in ms mode to avoid having to mult by 1/sqrt(2) */
+   m->cupl.ms_mode = m->cupl.side_info.mode_ext >> 1;
+   m->cupl.is_mode = m->cupl.side_info.mode_ext & 1;
+
+
+   m->cupl.crcbytes = 0;
+   if (prot)
+      bitget(4);               /* skip to data */
+   else
+   {
+      bitget(20);              /* skip crc */
+      m->cupl.crcbytes = 2;
+   }
+
+   if (br_index > 0)           /* framebytes fixed for free format */
+       {
+      m->cupl.framebytes =
+        2880 * mp_br_tableL3[m->cupl.id][br_index] / mp_sr20_table[m->cupl.id][m->cupl.sr_index];
+   }
+
+   m->cupl.side_info.main_data_begin = bitget(9);
+   if (m->cupl.side_info.mode == 3)
+   {
+      m->cupl.side_info.private_bits = bitget(5);
+      m->cupl.nchan = 1;
+      m->cupl.stereo_flag = 0;
+      side_bytes = (4 + 17);
+/*-- with header --*/
+   }
+   else
+   {
+      m->cupl.side_info.private_bits = bitget(3);
+      m->cupl.nchan = 2;
+      m->cupl.stereo_flag = 1;
+      side_bytes = (4 + 32);
+/*-- with header --*/
+   }
+   for (ch = 0; ch < m->cupl.nchan; ch++)
+      m->cupl.side_info.scfsi[ch] = bitget(4);
+/* this always 0 (both igr) for short blocks */
+
+   for (igr = 0; igr < 2; igr++)
+   {
+      for (ch = 0; ch < m->cupl.nchan; ch++)
+      {
+        m->cupl.side_info.gr[igr][ch].part2_3_length = bitget(12);
+        m->cupl.side_info.gr[igr][ch].big_values = bitget(9);
+        m->cupl.side_info.gr[igr][ch].global_gain = bitget(8) + m->cupl.gain_adjust;
+        if (m->cupl.ms_mode)
+           m->cupl.side_info.gr[igr][ch].global_gain -= 2;
+        m->cupl.side_info.gr[igr][ch].scalefac_compress = bitget(4);
+        m->cupl.side_info.gr[igr][ch].window_switching_flag = bitget(1);
+        if (m->cupl.side_info.gr[igr][ch].window_switching_flag)
+        {
+           m->cupl.side_info.gr[igr][ch].block_type = bitget(2);
+           m->cupl.side_info.gr[igr][ch].mixed_block_flag = bitget(1);
+           m->cupl.side_info.gr[igr][ch].table_select[0] = bitget(5);
+           m->cupl.side_info.gr[igr][ch].table_select[1] = bitget(5);
+           m->cupl.side_info.gr[igr][ch].subblock_gain[0] = bitget(3);
+           m->cupl.side_info.gr[igr][ch].subblock_gain[1] = bitget(3);
+           m->cupl.side_info.gr[igr][ch].subblock_gain[2] = bitget(3);
+         /* region count set in terms of long block cb's/bands */
+         /* r1 set so r0+r1+1 = 21 (lookup produces 576 bands ) */
+         /* if(window_switching_flag) always 36 samples in region0 */
+           m->cupl.side_info.gr[igr][ch].region0_count = (8 - 1);      /* 36 samples */
+           m->cupl.side_info.gr[igr][ch].region1_count = 20 - (8 - 1);
+        }
+        else
+        {
+           m->cupl.side_info.gr[igr][ch].mixed_block_flag = 0;
+           m->cupl.side_info.gr[igr][ch].block_type = 0;
+           m->cupl.side_info.gr[igr][ch].table_select[0] = bitget(5);
+           m->cupl.side_info.gr[igr][ch].table_select[1] = bitget(5);
+           m->cupl.side_info.gr[igr][ch].table_select[2] = bitget(5);
+           m->cupl.side_info.gr[igr][ch].region0_count = bitget(4);
+           m->cupl.side_info.gr[igr][ch].region1_count = bitget(3);
+        }
+        m->cupl.side_info.gr[igr][ch].preflag = bitget(1);
+        m->cupl.side_info.gr[igr][ch].scalefac_scale = bitget(1);
+        m->cupl.side_info.gr[igr][ch].count1table_select = bitget(1);
+      }
+   }
+
+
+
+/* return  bytes in header + side info */
+   return side_bytes;
+}
+/*====================================================================*/
+static int unpack_side_MPEG2(MPEG *m, int igr)
+{
+   int prot;
+   int br_index;
+   int ch;
+   int side_bytes;
+
+/* decode partial header plus initial side info */
+/* at entry bit getter points at id, sync skipped by caller */
+
+   m->cupl.id = bitget(1);             /* id */
+   bitget(2);                  /* skip layer */
+   prot = bitget(1);           /* bitget prot bit */
+   br_index = bitget(4);
+   m->cupl.sr_index = bitget(2);
+   m->cupl.pad = bitget(1);
+   bitget(1);                  /* skip to mode */
+   m->cupl.side_info.mode = bitget(2); /* mode */
+   m->cupl.side_info.mode_ext = bitget(2);     /* mode ext */
+
+   if (m->cupl.side_info.mode != 1)
+      m->cupl.side_info.mode_ext = 0;
+
+/* adjust global gain in ms mode to avoid having to mult by 1/sqrt(2) */
+   m->cupl.ms_mode = m->cupl.side_info.mode_ext >> 1;
+   m->cupl.is_mode = m->cupl.side_info.mode_ext & 1;
+
+   m->cupl.crcbytes = 0;
+   if (prot)
+      bitget(4);               /* skip to data */
+   else
+   {
+      bitget(20);              /* skip crc */
+      m->cupl.crcbytes = 2;
+   }
+
+   if (br_index > 0)
+   {                           /* framebytes fixed for free format */
+      if (m->cupl.mpeg25_flag == 0)
+      {
+        m->cupl.framebytes =
+           1440 * mp_br_tableL3[m->cupl.id][br_index] / mp_sr20_table[m->cupl.id][m->cupl.sr_index];
+      }
+      else
+      {
+        m->cupl.framebytes =
+           2880 * mp_br_tableL3[m->cupl.id][br_index] / mp_sr20_table[m->cupl.id][m->cupl.sr_index];
+       //if( sr_index == 2 ) return 0;  // fail mpeg25 8khz
+      }
+   }
+   m->cupl.side_info.main_data_begin = bitget(8);
+   if (m->cupl.side_info.mode == 3)
+   {
+      m->cupl.side_info.private_bits = bitget(1);
+      m->cupl.nchan = 1;
+      m->cupl.stereo_flag = 0;
+      side_bytes = (4 + 9);
+/*-- with header --*/
+   }
+   else
+   {
+      m->cupl.side_info.private_bits = bitget(2);
+      m->cupl.nchan = 2;
+      m->cupl.stereo_flag = 1;
+      side_bytes = (4 + 17);
+/*-- with header --*/
+   }
+   m->cupl.side_info.scfsi[1] = m->cupl.side_info.scfsi[0] = 0;
+
+
+   for (ch = 0; ch < m->cupl.nchan; ch++)
+   {
+      m->cupl.side_info.gr[igr][ch].part2_3_length = bitget(12);
+      m->cupl.side_info.gr[igr][ch].big_values = bitget(9);
+      m->cupl.side_info.gr[igr][ch].global_gain = bitget(8) + m->cupl.gain_adjust;
+      if (m->cupl.ms_mode)
+        m->cupl.side_info.gr[igr][ch].global_gain -= 2;
+      m->cupl.side_info.gr[igr][ch].scalefac_compress = bitget(9);
+      m->cupl.side_info.gr[igr][ch].window_switching_flag = bitget(1);
+      if (m->cupl.side_info.gr[igr][ch].window_switching_flag)
+      {
+        m->cupl.side_info.gr[igr][ch].block_type = bitget(2);
+        m->cupl.side_info.gr[igr][ch].mixed_block_flag = bitget(1);
+        m->cupl.side_info.gr[igr][ch].table_select[0] = bitget(5);
+        m->cupl.side_info.gr[igr][ch].table_select[1] = bitget(5);
+        m->cupl.side_info.gr[igr][ch].subblock_gain[0] = bitget(3);
+        m->cupl.side_info.gr[igr][ch].subblock_gain[1] = bitget(3);
+        m->cupl.side_info.gr[igr][ch].subblock_gain[2] = bitget(3);
+       /* region count set in terms of long block cb's/bands  */
+       /* r1 set so r0+r1+1 = 21 (lookup produces 576 bands ) */
+       /* bt=1 or 3       54 samples */
+       /* bt=2 mixed=0    36 samples */
+       /* bt=2 mixed=1    54 (8 long sf) samples? or maybe 36 */
+       /* region0 discussion says 54 but this would mix long */
+       /* and short in region0 if scale factors switch */
+       /* at band 36 (6 long scale factors) */
+        if ((m->cupl.side_info.gr[igr][ch].block_type == 2))
+        {
+           m->cupl.side_info.gr[igr][ch].region0_count = (6 - 1);      /* 36 samples */
+           m->cupl.side_info.gr[igr][ch].region1_count = 20 - (6 - 1);
+        }
+        else
+        {                      /* long block type 1 or 3 */
+           m->cupl.side_info.gr[igr][ch].region0_count = (8 - 1);      /* 54 samples */
+           m->cupl.side_info.gr[igr][ch].region1_count = 20 - (8 - 1);
+        }
+      }
+      else
+      {
+        m->cupl.side_info.gr[igr][ch].mixed_block_flag = 0;
+        m->cupl.side_info.gr[igr][ch].block_type = 0;
+        m->cupl.side_info.gr[igr][ch].table_select[0] = bitget(5);
+        m->cupl.side_info.gr[igr][ch].table_select[1] = bitget(5);
+        m->cupl.side_info.gr[igr][ch].table_select[2] = bitget(5);
+        m->cupl.side_info.gr[igr][ch].region0_count = bitget(4);
+        m->cupl.side_info.gr[igr][ch].region1_count = bitget(3);
+      }
+      m->cupl.side_info.gr[igr][ch].preflag = 0;
+      m->cupl.side_info.gr[igr][ch].scalefac_scale = bitget(1);
+      m->cupl.side_info.gr[igr][ch].count1table_select = bitget(1);
+   }
+
+/* return  bytes in header + side info */
+   return side_bytes;
+}
+/*-----------------------------------------------------------------*/
+static void unpack_main(MPEG *m, unsigned char *pcm, int igr)
+{
+   int ch;
+   int bit0;
+   int n1, n2, n3, n4, nn2, nn3;
+   int nn4;
+   int qbits;
+   int m0;
+
+
+   for (ch = 0; ch < m->cupl.nchan; ch++)
+   {
+      bitget_init(m->cupl.buf + (m->cupl.main_pos_bit >> 3));
+      bit0 = (m->cupl.main_pos_bit & 7);
+      if (bit0)
+        bitget(bit0);
+      m->cupl.main_pos_bit += m->cupl.side_info.gr[igr][ch].part2_3_length;
+      bitget_init_end(m->cupl.buf + ((m->cupl.main_pos_bit + 39) >> 3));
+/*-- scale factors --*/
+      if (m->cupl.id)
+        unpack_sf_sub_MPEG1(&m->cupl.sf[igr][ch],
+                         &m->cupl.side_info.gr[igr][ch], m->cupl.side_info.scfsi[ch], igr);
+      else
+        unpack_sf_sub_MPEG2(&m->cupl.sf[igr][ch],
+                        &m->cupl.side_info.gr[igr][ch], m->cupl.is_mode & ch, &m->cupl.is_sf_info);
+/*--- huff data ---*/
+      n1 = m->cupl.sfBandIndex[0][m->cupl.side_info.gr[igr][ch].region0_count];
+      n2 = m->cupl.sfBandIndex[0][m->cupl.side_info.gr[igr][ch].region0_count
+                         + m->cupl.side_info.gr[igr][ch].region1_count + 1];
+      n3 = m->cupl.side_info.gr[igr][ch].big_values;
+      n3 = n3 + n3;
+
+
+      if (n3 > m->cupl.band_limit)
+        n3 = m->cupl.band_limit;
+      if (n2 > n3)
+        n2 = n3;
+      if (n1 > n3)
+        n1 = n3;
+      nn3 = n3 - n2;
+      nn2 = n2 - n1;
+      unpack_huff(m->cupl.sample[ch][igr], n1, m->cupl.side_info.gr[igr][ch].table_select[0]);
+      unpack_huff(m->cupl.sample[ch][igr] + n1, nn2, m->cupl.side_info.gr[igr][ch].table_select[1]);
+      unpack_huff(m->cupl.sample[ch][igr] + n2, nn3, m->cupl.side_info.gr[igr][ch].table_select[2]);
+      qbits = m->cupl.side_info.gr[igr][ch].part2_3_length - (bitget_bits_used() - bit0);
+      nn4 = unpack_huff_quad(m->cupl.sample[ch][igr] + n3, m->cupl.band_limit - n3, qbits,
+                            m->cupl.side_info.gr[igr][ch].count1table_select);
+      n4 = n3 + nn4;
+      m->cupl.nsamp[igr][ch] = n4;
+    //limit n4 or allow deqaunt to sf band 22
+      if (m->cupl.side_info.gr[igr][ch].block_type == 2)
+        n4 = min(n4, m->cupl.band_limit12);
+      else
+        n4 = min(n4, m->cupl.band_limit21);
+      if (n4 < 576)
+        memset(m->cupl.sample[ch][igr] + n4, 0, sizeof(SAMPLE) * (576 - n4));
+      if (bitdat.bs_ptr > bitdat.bs_ptr_end)
+      {                                // bad data overrun
+
+        memset(m->cupl.sample[ch][igr], 0, sizeof(SAMPLE) * (576));
+      }
+   }
+
+
+
+/*--- dequant ---*/
+   for (ch = 0; ch < m->cupl.nchan; ch++)
+   {
+      dequant(m,m->cupl.sample[ch][igr],
+             &m->cupl.nsamp[igr][ch],  /* nsamp updated for shorts */
+             &m->cupl.sf[igr][ch], &m->cupl.side_info.gr[igr][ch],
+             &m->cupl.cb_info[igr][ch], m->cupl.ncbl_mixed);
+   }
+
+/*--- ms stereo processing  ---*/
+   if (m->cupl.ms_mode)
+   {
+      if (m->cupl.is_mode == 0)
+      {
+        m0 = m->cupl.nsamp[igr][0];    /* process to longer of left/right */
+        if (m0 < m->cupl.nsamp[igr][1])
+           m0 = m->cupl.nsamp[igr][1];
+      }
+      else
+      {                                /* process to last cb in right */
+        m0 = m->cupl.sfBandIndex[m->cupl.cb_info[igr][1].cbtype][m->cupl.cb_info[igr][1].cbmax];
+      }
+      ms_process(m->cupl.sample[0][igr], m0);
+   }
+
+/*--- is stereo processing  ---*/
+   if (m->cupl.is_mode)
+   {
+      if (m->cupl.id)
+        is_process_MPEG1(m, m->cupl.sample[0][igr], &m->cupl.sf[igr][1],
+                         m->cupl.cb_info[igr], m->cupl.nsamp[igr][0], m->cupl.ms_mode);
+      else
+        is_process_MPEG2(m,m->cupl.sample[0][igr], &m->cupl.sf[igr][1],
+                         m->cupl.cb_info[igr], &m->cupl.is_sf_info,
+                         m->cupl.nsamp[igr][0], m->cupl.ms_mode);
+   }
+
+/*-- adjust ms and is modes to max of left/right */
+   if (m->cupl.side_info.mode_ext)
+   {
+      if (m->cupl.nsamp[igr][0] < m->cupl.nsamp[igr][1])
+        m->cupl.nsamp[igr][0] = m->cupl.nsamp[igr][1];
+      else
+        m->cupl.nsamp[igr][1] = m->cupl.nsamp[igr][0];
+   }
+
+/*--- antialias ---*/
+   for (ch = 0; ch < m->cupl.nchan; ch++)
+   {
+      if (m->cupl.cb_info[igr][ch].ncbl == 0)
+        continue;              /* have no long blocks */
+      if (m->cupl.side_info.gr[igr][ch].mixed_block_flag)
+        n1 = 1;                /* 1 -> 36 samples */
+      else
+        n1 = (m->cupl.nsamp[igr][ch] + 7) / 18;
+      if (n1 > 31)
+        n1 = 31;
+      antialias(m, m->cupl.sample[ch][igr], n1);
+      n1 = 18 * n1 + 8;                /* update number of samples */
+      if (n1 > m->cupl.nsamp[igr][ch])
+        m->cupl.nsamp[igr][ch] = n1;
+   }
+
+
+
+/*--- hybrid + sbt ---*/
+   m->cupl.Xform(m, pcm, igr);
+
+
+/*-- done --*/
+}
+/*--------------------------------------------------------------------*/
+/*-----------------------------------------------------------------*/
+IN_OUT L3audio_decode(void *mv, unsigned char *bs, unsigned char *pcm)
+{
+   MPEG *m = mv;
+   return m->cupl.decode_function((MPEG *)mv, bs, pcm);
+}
+
+/*--------------------------------------------------------------------*/
+IN_OUT L3audio_decode_MPEG1(void *mv, unsigned char *bs, unsigned char *pcm)
+{
+   MPEG *m = mv;
+   int sync;
+   IN_OUT in_out;
+   int side_bytes;
+   int nbytes;
+   
+   m->cupl.iframe++;
+
+   bitget_init(bs);            /* initialize bit getter */
+/* test sync */
+   in_out.in_bytes = 0;                /* assume fail */
+   in_out.out_bytes = 0;
+   sync = bitget(12);
+
+   if (sync != 0xFFF)
+      return in_out;           /* sync fail */
+/*-----------*/
+
+/*-- unpack side info --*/
+   side_bytes = unpack_side_MPEG1(m);
+   m->cupl.padframebytes = m->cupl.framebytes + m->cupl.pad;
+   in_out.in_bytes = m->cupl.padframebytes;
+
+/*-- load main data and update buf pointer --*/
+/*------------------------------------------- 
+   if start point < 0, must just cycle decoder 
+   if jumping into middle of stream, 
+w---------------------------------------------*/
+   m->cupl.buf_ptr0 = m->cupl.buf_ptr1 - m->cupl.side_info.main_data_begin;    /* decode start point */
+   if (m->cupl.buf_ptr1 > BUF_TRIGGER)
+   {                           /* shift buffer */
+      memmove(m->cupl.buf, m->cupl.buf + m->cupl.buf_ptr0, m->cupl.side_info.main_data_begin);
+      m->cupl.buf_ptr0 = 0;
+      m->cupl.buf_ptr1 = m->cupl.side_info.main_data_begin;
+   }
+   nbytes = m->cupl.padframebytes - side_bytes - m->cupl.crcbytes;
+
+   // RAK: This is no bueno. :-(
+       if (nbytes < 0 || nbytes > NBUF)
+       {
+           in_out.in_bytes = 0;
+                return in_out;
+   }
+
+   memmove(m->cupl.buf + m->cupl.buf_ptr1, bs + side_bytes + m->cupl.crcbytes, nbytes);
+   m->cupl.buf_ptr1 += nbytes;
+/*-----------------------*/
+
+   if (m->cupl.buf_ptr0 >= 0)
+   {
+// dump_frame(buf+buf_ptr0, 64);
+      m->cupl.main_pos_bit = m->cupl.buf_ptr0 << 3;
+      unpack_main(m,pcm, 0);
+      unpack_main(m,pcm + m->cupl.half_outbytes, 1);
+      in_out.out_bytes = m->cupl.outbytes;
+   }
+   else
+   {
+      memset(pcm, m->cupl.zero_level_pcm, m->cupl.outbytes);   /* fill out skipped frames */
+      in_out.out_bytes = m->cupl.outbytes;
+/* iframe--;  in_out.out_bytes = 0;  // test test */
+   }
+
+   return in_out;
+}
+/*--------------------------------------------------------------------*/
+/*--------------------------------------------------------------------*/
+IN_OUT L3audio_decode_MPEG2(void *mv, unsigned char *bs, unsigned char *pcm)
+{
+   MPEG *m = mv;
+   int sync;
+   IN_OUT in_out;
+   int side_bytes;
+   int nbytes;
+   static int igr = 0;
+
+   m->cupl.iframe++;
+
+
+   bitget_init(bs);            /* initialize bit getter */
+/* test sync */
+   in_out.in_bytes = 0;                /* assume fail */
+   in_out.out_bytes = 0;
+   sync = bitget(12);
+
+// if( sync != 0xFFF ) return in_out;       /* sync fail */
+
+   m->cupl.mpeg25_flag = 0;
+   if (sync != 0xFFF)
+   {
+      m->cupl.mpeg25_flag = 1;         /* mpeg 2.5 sync */
+      if (sync != 0xFFE)
+        return in_out;         /* sync fail */
+   }
+/*-----------*/
+
+
+/*-- unpack side info --*/
+   side_bytes = unpack_side_MPEG2(m,igr);
+   m->cupl.padframebytes = m->cupl.framebytes + m->cupl.pad;
+   in_out.in_bytes = m->cupl.padframebytes;
+
+   m->cupl.buf_ptr0 = m->cupl.buf_ptr1 - m->cupl.side_info.main_data_begin;    /* decode start point */
+   if (m->cupl.buf_ptr1 > BUF_TRIGGER)
+   {                           /* shift buffer */
+      memmove(m->cupl.buf, m->cupl.buf + m->cupl.buf_ptr0, m->cupl.side_info.main_data_begin);
+      m->cupl.buf_ptr0 = 0;
+      m->cupl.buf_ptr1 = m->cupl.side_info.main_data_begin;
+   }
+   nbytes = m->cupl.padframebytes - side_bytes - m->cupl.crcbytes;
+   // RAK: This is no bueno. :-(
+       if (nbytes < 0 || nbytes > NBUF)
+       {
+           in_out.in_bytes = 0;
+                return in_out;
+   }
+   memmove(m->cupl.buf + m->cupl.buf_ptr1, bs + side_bytes + m->cupl.crcbytes, nbytes);
+   m->cupl.buf_ptr1 += nbytes;
+/*-----------------------*/
+
+   if (m->cupl.buf_ptr0 >= 0)
+   {
+      m->cupl.main_pos_bit = m->cupl.buf_ptr0 << 3;
+      unpack_main(m,pcm, igr);
+      in_out.out_bytes = m->cupl.outbytes;
+   }
+   else
+   {
+      memset(pcm, m->cupl.zero_level_pcm, m->cupl.outbytes);   /* fill out skipped frames */
+      in_out.out_bytes = m->cupl.outbytes;
+// iframe--;  in_out.out_bytes = 0; return in_out;// test test */
+   }
+
+
+
+   igr = igr ^ 1;
+   return in_out;
+}
+/*--------------------------------------------------------------------*/
+/*--------------------------------------------------------------------*/
+/*--------------------------------------------------------------------*/
+static int const sr_table[8] =
+{22050, 24000, 16000, 1,
+ 44100, 48000, 32000, 1};
+
+static const struct
+{
+   int l[23];
+   int s[14];
+}
+sfBandIndexTable[3][3] =
+{
+/* mpeg-2 */
+   {
+      {
+        {
+           0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576
+        }
+        ,
+        {
+           0, 4, 8, 12, 18, 24, 32, 42, 56, 74, 100, 132, 174, 192
+        }
+      }
+      ,
+      {
+        {
+           0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 114, 136, 162, 194, 232, 278, 332, 394, 464, 540, 576
+        }
+        ,
+        {
+           0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 136, 180, 192
+        }
+      }
+      ,
+      {
+        {
+           0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576
+        }
+        ,
+        {
+           0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 134, 174, 192
+        }
+      }
+      ,
+   }
+   ,
+/* mpeg-1 */
+   {
+      {
+        {
+           0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 52, 62, 74, 90, 110, 134, 162, 196, 238, 288, 342, 418, 576
+        }
+        ,
+        {
+           0, 4, 8, 12, 16, 22, 30, 40, 52, 66, 84, 106, 136, 192
+        }
+      }
+      ,
+      {
+        {
+           0, 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 60, 72, 88, 106, 128, 156, 190, 230, 276, 330, 384, 576
+        }
+        ,
+        {
+           0, 4, 8, 12, 16, 22, 28, 38, 50, 64, 80, 100, 126, 192
+        }
+      }
+      ,
+      {
+        {
+           0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 54, 66, 82, 102, 126, 156, 194, 240, 296, 364, 448, 550, 576
+        }
+        ,
+        {
+           0, 4, 8, 12, 16, 22, 30, 42, 58, 78, 104, 138, 180, 192
+        }
+      }
+   }
+   ,
+
+/* mpeg-2.5, 11 & 12 KHz seem ok, 8 ok */
+   {
+      {
+        {
+           0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576
+        }
+        ,
+        {
+           0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 134, 174, 192
+        }
+      }
+      ,
+      {
+        {
+           0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576
+        }
+        ,
+        {
+           0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 134, 174, 192
+        }
+      }
+      ,
+// this 8khz table, and only 8khz, from mpeg123)
+      {
+        {
+           0, 12, 24, 36, 48, 60, 72, 88, 108, 132, 160, 192, 232, 280, 336, 400, 476, 566, 568, 570, 572, 574, 576
+        }
+        ,
+        {
+           0, 8, 16, 24, 36, 52, 72, 96, 124, 160, 162, 164, 166, 192
+        }
+      }
+      ,
+   }
+   ,
+};
+
+
+void sbt_mono_L3(MPEG *m, float *sample, signed short *pcm, int ch);
+void sbt_dual_L3(MPEG *m, float *sample, signed short *pcm, int ch);
+void sbt16_mono_L3(MPEG *m, float *sample, signed short *pcm, int ch);
+void sbt16_dual_L3(MPEG *m, float *sample, signed short *pcm, int ch);
+void sbt8_mono_L3(MPEG *m, float *sample, signed short *pcm, int ch);
+void sbt8_dual_L3(MPEG *m, float *sample, signed short *pcm, int ch);
+
+void sbtB_mono_L3(MPEG *m, float *sample, unsigned char *pcm, int ch);
+void sbtB_dual_L3(MPEG *m, float *sample, unsigned char *pcm, int ch);
+void sbtB16_mono_L3(MPEG *m, float *sample, unsigned char *pcm, int ch);
+void sbtB16_dual_L3(MPEG *m, float *sample, unsigned char *pcm, int ch);
+void sbtB8_mono_L3(MPEG *m, float *sample, unsigned char *pcm, int ch);
+void sbtB8_dual_L3(MPEG *m, float *sample, unsigned char *pcm, int ch);
+
+
+
+static SBT_FUNCTION_F sbt_table[2][3][2] =
+{
+{{ (SBT_FUNCTION_F) sbt_mono_L3,
+   (SBT_FUNCTION_F) sbt_dual_L3 } ,
+ { (SBT_FUNCTION_F) sbt16_mono_L3,
+   (SBT_FUNCTION_F) sbt16_dual_L3 } ,
+ { (SBT_FUNCTION_F) sbt8_mono_L3,
+   (SBT_FUNCTION_F) sbt8_dual_L3 }} ,
+/*-- 8 bit output -*/
+{{ (SBT_FUNCTION_F) sbtB_mono_L3,
+   (SBT_FUNCTION_F) sbtB_dual_L3 },
+ { (SBT_FUNCTION_F) sbtB16_mono_L3,
+   (SBT_FUNCTION_F) sbtB16_dual_L3 },
+ { (SBT_FUNCTION_F) sbtB8_mono_L3,
+   (SBT_FUNCTION_F) sbtB8_dual_L3 }}
+};
+
+
+void Xform_mono(void *mv, void *pcm, int igr);
+void Xform_dual(void *mv, void *pcm, int igr);
+void Xform_dual_mono(void *mv, void *pcm, int igr);
+void Xform_dual_right(void *mv, void *pcm, int igr);
+
+static XFORM_FUNCTION xform_table[5] =
+{
+   Xform_mono,
+   Xform_dual,
+   Xform_dual_mono,
+   Xform_mono,                 /* left */
+   Xform_dual_right,
+};
+int L3table_init(MPEG *m);
+void msis_init(MPEG *m);
+void sbt_init(MPEG *m);
+#if 0
+typedef int iARRAY22[22];
+#endif
+iARRAY22 *quant_init_band_addr();
+iARRAY22 *msis_init_band_addr();
+
+/*---------------------------------------------------------*/
+/* mpeg_head defined in mhead.h  frame bytes is without pad */
+int L3audio_decode_init(void *mv, MPEG_HEAD * h, int framebytes_arg,
+                  int reduction_code, int transform_code, int convert_code,
+                       int freq_limit)
+{
+   MPEG *m = mv;
+   int i, j, k;
+   // static int first_pass = 1;
+   int samprate;
+   int limit;
+   int bit_code;
+   int out_chans;
+
+   m->cupl.buf_ptr0 = 0;
+   m->cupl.buf_ptr1 = 0;
+
+/* check if code handles */
+   if (h->option != 1)
+      return 0;                        /* layer III only */
+
+   if (h->id)
+      m->cupl.ncbl_mixed = 8;          /* mpeg-1 */
+   else
+      m->cupl.ncbl_mixed = 6;          /* mpeg-2 */
+
+   m->cupl.framebytes = framebytes_arg;
+
+   transform_code = transform_code;    /* not used, asm compatability */
+   bit_code = 0;
+   if (convert_code & 8)
+      bit_code = 1;
+   convert_code = convert_code & 3;    /* higher bits used by dec8 freq cvt */
+   if (reduction_code < 0)
+      reduction_code = 0;
+   if (reduction_code > 2)
+      reduction_code = 2;
+   if (freq_limit < 1000)
+      freq_limit = 1000;
+
+
+   samprate = sr_table[4 * h->id + h->sr_index];
+   if ((h->sync & 1) == 0)
+      samprate = samprate / 2; // mpeg 2.5 
+/*----- compute nsb_limit --------*/
+   m->cupl.nsb_limit = (freq_limit * 64L + samprate / 2) / samprate;
+/*- caller limit -*/
+   limit = (32 >> reduction_code);
+   if (limit > 8)
+      limit--;
+   if (m->cupl.nsb_limit > limit)
+      m->cupl.nsb_limit = limit;
+   limit = 18 * m->cupl.nsb_limit;
+
+   k = h->id;
+   if ((h->sync & 1) == 0)
+      k = 2;                   // mpeg 2.5 
+
+   if (k == 1)
+   {
+      m->cupl.band_limit12 = 3 * sfBandIndexTable[k][h->sr_index].s[13];
+      m->cupl.band_limit = m->cupl.band_limit21 = sfBandIndexTable[k][h->sr_index].l[22];
+   }
+   else
+   {
+      m->cupl.band_limit12 = 3 * sfBandIndexTable[k][h->sr_index].s[12];
+      m->cupl.band_limit = m->cupl.band_limit21 = sfBandIndexTable[k][h->sr_index].l[21];
+   }
+   m->cupl.band_limit += 8;            /* allow for antialias */
+   if (m->cupl.band_limit > limit)
+      m->cupl.band_limit = limit;
+
+   if (m->cupl.band_limit21 > m->cupl.band_limit)
+      m->cupl.band_limit21 = m->cupl.band_limit;
+   if (m->cupl.band_limit12 > m->cupl.band_limit)
+      m->cupl.band_limit12 = m->cupl.band_limit;
+
+
+   m->cupl.band_limit_nsb = (m->cupl.band_limit + 17) / 18;    /* limit nsb's rounded up */
+/*----------------------------------------------*/
+   m->cupl.gain_adjust = 0;            /* adjust gain e.g. cvt to mono sum channel */
+   if ((h->mode != 3) && (convert_code == 1))
+      m->cupl.gain_adjust = -4;
+
+   m->cupl.outvalues = 1152 >> reduction_code;
+   if (h->id == 0)
+      m->cupl.outvalues /= 2;
+
+   out_chans = 2;
+   if (h->mode == 3)
+      out_chans = 1;
+   if (convert_code)
+      out_chans = 1;
+
+   m->cupl.sbt_L3 = sbt_table[bit_code][reduction_code][out_chans - 1];
+   k = 1 + convert_code;
+   if (h->mode == 3)
+      k = 0;
+   m->cupl.Xform = xform_table[k];
+
+
+   m->cupl.outvalues *= out_chans;
+
+   if (bit_code)
+      m->cupl.outbytes = m->cupl.outvalues;
+   else
+      m->cupl.outbytes = sizeof(short) * m->cupl.outvalues;
+
+   if (bit_code)
+      m->cupl.zero_level_pcm = 128;    /* 8 bit output */
+   else
+      m->cupl.zero_level_pcm = 0;
+
+
+   m->cup.decinfo.channels = out_chans;
+   m->cup.decinfo.outvalues = m->cupl.outvalues;
+   m->cup.decinfo.samprate = samprate >> reduction_code;
+   if (bit_code)
+      m->cup.decinfo.bits = 8;
+   else
+      m->cup.decinfo.bits = sizeof(short) * 8;
+
+   m->cup.decinfo.framebytes = m->cupl.framebytes;
+   m->cup.decinfo.type = 0;
+
+   m->cupl.half_outbytes = m->cupl.outbytes / 2;
+/*------------------------------------------*/
+
+/*- init band tables --*/
+
+
+   k = h->id;
+   if ((h->sync & 1) == 0)
+      k = 2;                   // mpeg 2.5 
+
+   for (i = 0; i < 22; i++)
+      m->cupl.sfBandIndex[0][i] = sfBandIndexTable[k][h->sr_index].l[i + 1];
+   for (i = 0; i < 13; i++)
+      m->cupl.sfBandIndex[1][i] = 3 * sfBandIndexTable[k][h->sr_index].s[i + 1];
+   for (i = 0; i < 22; i++)
+      m->cupl.nBand[0][i] =
+        sfBandIndexTable[k][h->sr_index].l[i + 1]
+        - sfBandIndexTable[k][h->sr_index].l[i];
+   for (i = 0; i < 13; i++)
+      m->cupl.nBand[1][i] =
+        sfBandIndexTable[k][h->sr_index].s[i + 1]
+        - sfBandIndexTable[k][h->sr_index].s[i];
+
+
+/* init tables */
+   L3table_init(m);
+/* init ms and is stereo modes */
+   msis_init(m);
+
+/*----- init sbt ---*/
+   sbt_init(m);
+
+
+
+/*--- clear buffers --*/
+   for (i = 0; i < 576; i++)
+      m->cupl.yout[i] = 0.0f;
+   for (j = 0; j < 2; j++)
+   {
+      for (k = 0; k < 2; k++)
+      {
+        for (i = 0; i < 576; i++)
+        {
+           m->cupl.sample[j][k][i].x = 0.0f;
+           m->cupl.sample[j][k][i].s = 0;
+        }
+      }
+   }
+
+   if (h->id == 1)
+      m->cupl.decode_function = L3audio_decode_MPEG1;
+   else
+      m->cupl.decode_function = L3audio_decode_MPEG2;
+
+   return 1;
+}
+/*---------------------------------------------------------*/
+/*==========================================================*/
+void cup3_init(MPEG *m)
+{
+       m->cupl.sbt_L3 = sbt_dual_L3;
+       m->cupl.Xform = Xform_dual;
+       m->cupl.sbt_L3 = sbt_dual_L3;
+       m->cupl.decode_function = L3audio_decode_MPEG1;
+}
diff --git a/codecs/mp3/src/cwin.c b/codecs/mp3/src/cwin.c
new file mode 100755 (executable)
index 0000000..5698d82
--- /dev/null
@@ -0,0 +1,500 @@
+/*____________________________________________________________________________
+       
+       FreeAmp - The Free MP3 Player
+
+        MP3 Decoder originally Copyright (C) 1995-1997 Xing Technology
+        Corp.  http://www.xingtech.com
+
+       Portions Copyright (C) 1998-1999 EMusic.com
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program; if not, write to the Free Software
+       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+       
+       $Id$
+____________________________________________________________________________*/
+
+/****  cwin.c  ***************************************************
+
+include to cwinm.c
+
+MPEG audio decoder, float window routines
+portable C
+
+******************************************************************/
+
+#ifdef ASM_X86
+extern void window_mpg_asm(float *a, int b, short *c);
+extern void window_dual_asm(float *a, int b, short *c);
+extern void window16_asm(float *a, int b, short *c);
+extern void window16_dual_asm(float *a, int b, short *c);
+extern void window8_asm(float *a, int b, short *c);
+extern void window8_dual_asm(float *a, int b, short *c);
+#endif /* ASM_X86 */
+
+/*-------------------------------------------------------------------------*/
+void window(float *vbuf, int vb_ptr, short *pcm)
+{
+#ifdef ASM_X86
+   window_mpg_asm(vbuf, vb_ptr, pcm);
+#else
+   int i, j;
+   int si, bx;
+   float *coef;
+   float sum;
+   long tmp;
+
+   si = vb_ptr + 16;
+   bx = (si + 32) & 511;
+   coef = wincoef;
+
+/*-- first 16 --*/
+   for (i = 0; i < 16; i++)
+   {
+      sum = 0.0F;
+      for (j = 0; j < 8; j++)
+      {
+        sum += (*coef++) * vbuf[si];
+        si = (si + 64) & 511;
+        sum -= (*coef++) * vbuf[bx];
+        bx = (bx + 64) & 511;
+      }
+      si++;
+      bx--;
+      tmp = (long) sum;
+      if (tmp > 32767)
+        tmp = 32767;
+      else if (tmp < -32768)
+        tmp = -32768;
+      *pcm++ = tmp;
+   }
+/*--  special case --*/
+   sum = 0.0F;
+   for (j = 0; j < 8; j++)
+   {
+      sum += (*coef++) * vbuf[bx];
+      bx = (bx + 64) & 511;
+   }
+   tmp = (long) sum;
+   if (tmp > 32767)
+      tmp = 32767;
+   else if (tmp < -32768)
+      tmp = -32768;
+   *pcm++ = tmp;
+/*-- last 15 --*/
+   coef = wincoef + 255;       /* back pass through coefs */
+   for (i = 0; i < 15; i++)
+   {
+      si--;
+      bx++;
+      sum = 0.0F;
+      for (j = 0; j < 8; j++)
+      {
+        sum += (*coef--) * vbuf[si];
+        si = (si + 64) & 511;
+        sum += (*coef--) * vbuf[bx];
+        bx = (bx + 64) & 511;
+      }
+      tmp = (long) sum;
+      if (tmp > 32767)
+        tmp = 32767;
+      else if (tmp < -32768)
+        tmp = -32768;
+      *pcm++ = tmp;
+   }
+#endif
+}
+
+
+
+/*------------------------------------------------------------*/
+#ifndef ASM_X86_OLD
+void window_dual(float *vbuf, int vb_ptr, short *pcm)
+{
+#ifdef ASM_X86
+   window_dual_asm(vbuf, vb_ptr, pcm);
+#else
+   int i, j;                   /* dual window interleaves output */
+   int si, bx;
+   float *coef;
+   float sum;
+   long tmp;
+
+   si = vb_ptr + 16;
+   bx = (si + 32) & 511;
+   coef = wincoef;
+
+/*-- first 16 --*/
+   for (i = 0; i < 16; i++)
+   {
+      sum = 0.0F;
+      for (j = 0; j < 8; j++)
+      {
+        sum += (*coef++) * vbuf[si];
+        si = (si + 64) & 511;
+        sum -= (*coef++) * vbuf[bx];
+        bx = (bx + 64) & 511;
+      }
+      si++;
+      bx--;
+      tmp = (long) sum;
+      if (tmp > 32767)
+        tmp = 32767;
+      else if (tmp < -32768)
+        tmp = -32768;
+      *pcm = tmp;
+      pcm += 2;
+   }
+/*--  special case --*/
+   sum = 0.0F;
+   for (j = 0; j < 8; j++)
+   {
+      sum += (*coef++) * vbuf[bx];
+      bx = (bx + 64) & 511;
+   }
+   tmp = (long) sum;
+   if (tmp > 32767)
+      tmp = 32767;
+   else if (tmp < -32768)
+      tmp = -32768;
+   *pcm = tmp;
+   pcm += 2;
+/*-- last 15 --*/
+   coef = wincoef + 255;       /* back pass through coefs */
+   for (i = 0; i < 15; i++)
+   {
+      si--;
+      bx++;
+      sum = 0.0F;
+      for (j = 0; j < 8; j++)
+      {
+        sum += (*coef--) * vbuf[si];
+        si = (si + 64) & 511;
+        sum += (*coef--) * vbuf[bx];
+        bx = (bx + 64) & 511;
+      }
+      tmp = (long) sum;
+      if (tmp > 32767)
+        tmp = 32767;
+      else if (tmp < -32768)
+        tmp = -32768;
+      *pcm = tmp;
+      pcm += 2;
+   }
+#endif
+}
+#endif /* ndef ASM_X86_OLD */
+/*------------------------------------------------------------*/
+/*------------------- 16 pt window ------------------------------*/
+void window16(float *vbuf, int vb_ptr, short *pcm)
+{
+#ifdef ASM_X86
+   window16_asm(vbuf, vb_ptr, pcm);
+#else
+   int i, j;
+   unsigned char si, bx;
+   float *coef;
+   float sum;
+   long tmp;
+
+   si = vb_ptr + 8;
+   bx = si + 16;
+   coef = wincoef;
+
+/*-- first 8 --*/
+   for (i = 0; i < 8; i++)
+   {
+      sum = 0.0F;
+      for (j = 0; j < 8; j++)
+      {
+        sum += (*coef++) * vbuf[si];
+        si += 32;
+        sum -= (*coef++) * vbuf[bx];
+        bx += 32;
+      }
+      si++;
+      bx--;
+      coef += 16;
+      tmp = (long) sum;
+      if (tmp > 32767)
+        tmp = 32767;
+      else if (tmp < -32768)
+        tmp = -32768;
+      *pcm++ = tmp;
+   }
+/*--  special case --*/
+   sum = 0.0F;
+   for (j = 0; j < 8; j++)
+   {
+      sum += (*coef++) * vbuf[bx];
+      bx += 32;
+   }
+   tmp = (long) sum;
+   if (tmp > 32767)
+      tmp = 32767;
+   else if (tmp < -32768)
+      tmp = -32768;
+   *pcm++ = tmp;
+/*-- last 7 --*/
+   coef = wincoef + 255;       /* back pass through coefs */
+   for (i = 0; i < 7; i++)
+   {
+      coef -= 16;
+      si--;
+      bx++;
+      sum = 0.0F;
+      for (j = 0; j < 8; j++)
+      {
+        sum += (*coef--) * vbuf[si];
+        si += 32;
+        sum += (*coef--) * vbuf[bx];
+        bx += 32;
+      }
+      tmp = (long) sum;
+      if (tmp > 32767)
+        tmp = 32767;
+      else if (tmp < -32768)
+        tmp = -32768;
+      *pcm++ = tmp;
+   }
+#endif
+}
+/*--------------- 16 pt dual window (interleaved output) -----------------*/
+void window16_dual(float *vbuf, int vb_ptr, short *pcm)
+{
+#ifdef ASM_X86
+   window16_dual_asm(vbuf, vb_ptr, pcm);
+#else
+   int i, j;
+   unsigned char si, bx;
+   float *coef;
+   float sum;
+   long tmp;
+
+   si = vb_ptr + 8;
+   bx = si + 16;
+   coef = wincoef;
+
+/*-- first 8 --*/
+   for (i = 0; i < 8; i++)
+   {
+      sum = 0.0F;
+      for (j = 0; j < 8; j++)
+      {
+        sum += (*coef++) * vbuf[si];
+        si += 32;
+        sum -= (*coef++) * vbuf[bx];
+        bx += 32;
+      }
+      si++;
+      bx--;
+      coef += 16;
+      tmp = (long) sum;
+      if (tmp > 32767)
+        tmp = 32767;
+      else if (tmp < -32768)
+        tmp = -32768;
+      *pcm = tmp;
+      pcm += 2;
+   }
+/*--  special case --*/
+   sum = 0.0F;
+   for (j = 0; j < 8; j++)
+   {
+      sum += (*coef++) * vbuf[bx];
+      bx += 32;
+   }
+   tmp = (long) sum;
+   if (tmp > 32767)
+      tmp = 32767;
+   else if (tmp < -32768)
+      tmp = -32768;
+   *pcm = tmp;
+   pcm += 2;
+/*-- last 7 --*/
+   coef = wincoef + 255;       /* back pass through coefs */
+   for (i = 0; i < 7; i++)
+   {
+      coef -= 16;
+      si--;
+      bx++;
+      sum = 0.0F;
+      for (j = 0; j < 8; j++)
+      {
+        sum += (*coef--) * vbuf[si];
+        si += 32;
+        sum += (*coef--) * vbuf[bx];
+        bx += 32;
+      }
+      tmp = (long) sum;
+      if (tmp > 32767)
+        tmp = 32767;
+      else if (tmp < -32768)
+        tmp = -32768;
+      *pcm = tmp;
+      pcm += 2;
+   }
+#endif
+}
+/*------------------- 8 pt window ------------------------------*/
+void window8(float *vbuf, int vb_ptr, short *pcm)
+{
+#ifdef ASM_X86
+   window8_asm(vbuf, vb_ptr, pcm);
+#else
+   int i, j;
+   int si, bx;
+   float *coef;
+   float sum;
+   long tmp;
+
+   si = vb_ptr + 4;
+   bx = (si + 8) & 127;
+   coef = wincoef;
+
+/*-- first 4 --*/
+   for (i = 0; i < 4; i++)
+   {
+      sum = 0.0F;
+      for (j = 0; j < 8; j++)
+      {
+        sum += (*coef++) * vbuf[si];
+        si = (si + 16) & 127;
+        sum -= (*coef++) * vbuf[bx];
+        bx = (bx + 16) & 127;
+      }
+      si++;
+      bx--;
+      coef += 48;
+      tmp = (long) sum;
+      if (tmp > 32767)
+        tmp = 32767;
+      else if (tmp < -32768)
+        tmp = -32768;
+      *pcm++ = tmp;
+   }
+/*--  special case --*/
+   sum = 0.0F;
+   for (j = 0; j < 8; j++)
+   {
+      sum += (*coef++) * vbuf[bx];
+      bx = (bx + 16) & 127;
+   }
+   tmp = (long) sum;
+   if (tmp > 32767)
+      tmp = 32767;
+   else if (tmp < -32768)
+      tmp = -32768;
+   *pcm++ = tmp;
+/*-- last 3 --*/
+   coef = wincoef + 255;       /* back pass through coefs */
+   for (i = 0; i < 3; i++)
+   {
+      coef -= 48;
+      si--;
+      bx++;
+      sum = 0.0F;
+      for (j = 0; j < 8; j++)
+      {
+        sum += (*coef--) * vbuf[si];
+        si = (si + 16) & 127;
+        sum += (*coef--) * vbuf[bx];
+        bx = (bx + 16) & 127;
+      }
+      tmp = (long) sum;
+      if (tmp > 32767)
+        tmp = 32767;
+      else if (tmp < -32768)
+        tmp = -32768;
+      *pcm++ = tmp;
+   }
+#endif
+}
+/*--------------- 8 pt dual window (interleaved output) -----------------*/
+void window8_dual(float *vbuf, int vb_ptr, short *pcm)
+{
+#ifdef ASM_X86
+   window8_dual_asm(vbuf, vb_ptr, pcm);
+#else
+   int i, j;
+   int si, bx;
+   float *coef;
+   float sum;
+   long tmp;
+
+   si = vb_ptr + 4;
+   bx = (si + 8) & 127;
+   coef = wincoef;
+
+/*-- first 4 --*/
+   for (i = 0; i < 4; i++)
+   {
+      sum = 0.0F;
+      for (j = 0; j < 8; j++)
+      {
+        sum += (*coef++) * vbuf[si];
+        si = (si + 16) & 127;
+        sum -= (*coef++) * vbuf[bx];
+        bx = (bx + 16) & 127;
+      }
+      si++;
+      bx--;
+      coef += 48;
+      tmp = (long) sum;
+      if (tmp > 32767)
+        tmp = 32767;
+      else if (tmp < -32768)
+        tmp = -32768;
+      *pcm = tmp;
+      pcm += 2;
+   }
+/*--  special case --*/
+   sum = 0.0F;
+   for (j = 0; j < 8; j++)
+   {
+      sum += (*coef++) * vbuf[bx];
+      bx = (bx + 16) & 127;
+   }
+   tmp = (long) sum;
+   if (tmp > 32767)
+      tmp = 32767;
+   else if (tmp < -32768)
+      tmp = -32768;
+   *pcm = tmp;
+   pcm += 2;
+/*-- last 3 --*/
+   coef = wincoef + 255;       /* back pass through coefs */
+   for (i = 0; i < 3; i++)
+   {
+      coef -= 48;
+      si--;
+      bx++;
+      sum = 0.0F;
+      for (j = 0; j < 8; j++)
+      {
+        sum += (*coef--) * vbuf[si];
+        si = (si + 16) & 127;
+        sum += (*coef--) * vbuf[bx];
+        bx = (bx + 16) & 127;
+      }
+      tmp = (long) sum;
+      if (tmp > 32767)
+        tmp = 32767;
+      else if (tmp < -32768)
+        tmp = -32768;
+      *pcm = tmp;
+      pcm += 2;
+   }
+#endif
+}
+/*------------------------------------------------------------*/
diff --git a/codecs/mp3/src/cwinb.c b/codecs/mp3/src/cwinb.c
new file mode 100755 (executable)
index 0000000..6b7212d
--- /dev/null
@@ -0,0 +1,496 @@
+/*____________________________________________________________________________
+       
+       FreeAmp - The Free MP3 Player
+
+        MP3 Decoder originally Copyright (C) 1995-1997 Xing Technology
+        Corp.  http://www.xingtech.com
+
+       Portions Copyright (C) 1998-1999 EMusic.com
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program; if not, write to the Free Software
+       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+       
+       $Id$
+____________________________________________________________________________*/
+
+/****  cwin.c  ***************************************************
+
+include to cwinm.c
+
+MPEG audio decoder, float window routines - 8 bit output
+portable C
+
+******************************************************************/
+/*-------------------------------------------------------------------------*/
+
+
+#ifdef ASM_X86
+extern void windowB_asm(float *a, int b, unsigned char *c);
+extern void windowB_dual_asm(float *a, int b, unsigned char *c);
+extern void windowB16_asm(float *a, int b, unsigned char *c);
+extern void windowB16_dual_asm(float *a, int b, unsigned char *c);
+extern void windowB8_asm(float *a, int b, unsigned char *c);
+extern void windowB8_dual_asm(float *a, int b, unsigned char *c);
+#endif /* ASM_X86 */
+
+void windowB(float *vbuf, int vb_ptr, unsigned char *pcm)
+{
+#ifdef ASM_X86
+   windowB_asm(vbuf, vb_ptr, pcm);
+#else
+   int i, j;
+   int si, bx;
+   float *coef;
+   float sum;
+   long tmp;
+
+   si = vb_ptr + 16;
+   bx = (si + 32) & 511;
+   coef = wincoef;
+
+/*-- first 16 --*/
+   for (i = 0; i < 16; i++)
+   {
+      sum = 0.0F;
+      for (j = 0; j < 8; j++)
+      {
+        sum += (*coef++) * vbuf[si];
+        si = (si + 64) & 511;
+        sum -= (*coef++) * vbuf[bx];
+        bx = (bx + 64) & 511;
+      }
+      si++;
+      bx--;
+      tmp = (long) sum;
+      if (tmp > 32767)
+        tmp = 32767;
+      else if (tmp < -32768)
+        tmp = -32768;
+      *pcm++ = ((unsigned char) (tmp >> 8)) ^ 0x80;
+   }
+/*--  special case --*/
+   sum = 0.0F;
+   for (j = 0; j < 8; j++)
+   {
+      sum += (*coef++) * vbuf[bx];
+      bx = (bx + 64) & 511;
+   }
+   tmp = (long) sum;
+   if (tmp > 32767)
+      tmp = 32767;
+   else if (tmp < -32768)
+      tmp = -32768;
+   *pcm++ = ((unsigned char) (tmp >> 8)) ^ 0x80;
+/*-- last 15 --*/
+   coef = wincoef + 255;       /* back pass through coefs */
+   for (i = 0; i < 15; i++)
+   {
+      si--;
+      bx++;
+      sum = 0.0F;
+      for (j = 0; j < 8; j++)
+      {
+        sum += (*coef--) * vbuf[si];
+        si = (si + 64) & 511;
+        sum += (*coef--) * vbuf[bx];
+        bx = (bx + 64) & 511;
+      }
+      tmp = (long) sum;
+      if (tmp > 32767)
+        tmp = 32767;
+      else if (tmp < -32768)
+        tmp = -32768;
+      *pcm++ = ((unsigned char) (tmp >> 8)) ^ 0x80;
+   }
+#endif
+}
+/*------------------------------------------------------------*/
+void windowB_dual(float *vbuf, int vb_ptr, unsigned char *pcm)
+{
+#ifdef ASM_X86
+   windowB_dual_asm(vbuf, vb_ptr, pcm);
+#else
+   int i, j;                   /* dual window interleaves output */
+   int si, bx;
+   float *coef;
+   float sum;
+   long tmp;
+
+   si = vb_ptr + 16;
+   bx = (si + 32) & 511;
+   coef = wincoef;
+
+/*-- first 16 --*/
+   for (i = 0; i < 16; i++)
+   {
+      sum = 0.0F;
+      for (j = 0; j < 8; j++)
+      {
+        sum += (*coef++) * vbuf[si];
+        si = (si + 64) & 511;
+        sum -= (*coef++) * vbuf[bx];
+        bx = (bx + 64) & 511;
+      }
+      si++;
+      bx--;
+      tmp = (long) sum;
+      if (tmp > 32767)
+        tmp = 32767;
+      else if (tmp < -32768)
+        tmp = -32768;
+      *pcm = ((unsigned char) (tmp >> 8)) ^ 0x80;
+      pcm += 2;
+   }
+/*--  special case --*/
+   sum = 0.0F;
+   for (j = 0; j < 8; j++)
+   {
+      sum += (*coef++) * vbuf[bx];
+      bx = (bx + 64) & 511;
+   }
+   tmp = (long) sum;
+   if (tmp > 32767)
+      tmp = 32767;
+   else if (tmp < -32768)
+      tmp = -32768;
+   *pcm = ((unsigned char) (tmp >> 8)) ^ 0x80;
+   pcm += 2;
+/*-- last 15 --*/
+   coef = wincoef + 255;       /* back pass through coefs */
+   for (i = 0; i < 15; i++)
+   {
+      si--;
+      bx++;
+      sum = 0.0F;
+      for (j = 0; j < 8; j++)
+      {
+        sum += (*coef--) * vbuf[si];
+        si = (si + 64) & 511;
+        sum += (*coef--) * vbuf[bx];
+        bx = (bx + 64) & 511;
+      }
+      tmp = (long) sum;
+      if (tmp > 32767)
+        tmp = 32767;
+      else if (tmp < -32768)
+        tmp = -32768;
+      *pcm = ((unsigned char) (tmp >> 8)) ^ 0x80;
+      pcm += 2;
+   }
+#endif
+}
+/*------------------------------------------------------------*/
+/*------------------- 16 pt window ------------------------------*/
+void windowB16(float *vbuf, int vb_ptr, unsigned char *pcm)
+{
+#ifdef ASM_X86
+   windowB16_asm(vbuf, vb_ptr, pcm);
+#else
+   int i, j;
+   unsigned char si, bx;
+   float *coef;
+   float sum;
+   long tmp;
+
+   si = vb_ptr + 8;
+   bx = si + 16;
+   coef = wincoef;
+
+/*-- first 8 --*/
+   for (i = 0; i < 8; i++)
+   {
+      sum = 0.0F;
+      for (j = 0; j < 8; j++)
+      {
+        sum += (*coef++) * vbuf[si];
+        si += 32;
+        sum -= (*coef++) * vbuf[bx];
+        bx += 32;
+      }
+      si++;
+      bx--;
+      coef += 16;
+      tmp = (long) sum;
+      if (tmp > 32767)
+        tmp = 32767;
+      else if (tmp < -32768)
+        tmp = -32768;
+      *pcm++ = ((unsigned char) (tmp >> 8)) ^ 0x80;
+   }
+/*--  special case --*/
+   sum = 0.0F;
+   for (j = 0; j < 8; j++)
+   {
+      sum += (*coef++) * vbuf[bx];
+      bx += 32;
+   }
+   tmp = (long) sum;
+   if (tmp > 32767)
+      tmp = 32767;
+   else if (tmp < -32768)
+      tmp = -32768;
+   *pcm++ = ((unsigned char) (tmp >> 8)) ^ 0x80;
+/*-- last 7 --*/
+   coef = wincoef + 255;       /* back pass through coefs */
+   for (i = 0; i < 7; i++)
+   {
+      coef -= 16;
+      si--;
+      bx++;
+      sum = 0.0F;
+      for (j = 0; j < 8; j++)
+      {
+        sum += (*coef--) * vbuf[si];
+        si += 32;
+        sum += (*coef--) * vbuf[bx];
+        bx += 32;
+      }
+      tmp = (long) sum;
+      if (tmp > 32767)
+        tmp = 32767;
+      else if (tmp < -32768)
+        tmp = -32768;
+      *pcm++ = ((unsigned char) (tmp >> 8)) ^ 0x80;
+   }
+#endif
+}
+/*--------------- 16 pt dual window (interleaved output) -----------------*/
+void windowB16_dual(float *vbuf, int vb_ptr, unsigned char *pcm)
+{
+#ifdef ASM_X86
+   windowB16_dual_asm(vbuf, vb_ptr, pcm);
+#else
+   int i, j;
+   unsigned char si, bx;
+   float *coef;
+   float sum;
+   long tmp;
+
+   si = vb_ptr + 8;
+   bx = si + 16;
+   coef = wincoef;
+
+/*-- first 8 --*/
+   for (i = 0; i < 8; i++)
+   {
+      sum = 0.0F;
+      for (j = 0; j < 8; j++)
+      {
+        sum += (*coef++) * vbuf[si];
+        si += 32;
+        sum -= (*coef++) * vbuf[bx];
+        bx += 32;
+      }
+      si++;
+      bx--;
+      coef += 16;
+      tmp = (long) sum;
+      if (tmp > 32767)
+        tmp = 32767;
+      else if (tmp < -32768)
+        tmp = -32768;
+      *pcm = ((unsigned char) (tmp >> 8)) ^ 0x80;
+      pcm += 2;
+   }
+/*--  special case --*/
+   sum = 0.0F;
+   for (j = 0; j < 8; j++)
+   {
+      sum += (*coef++) * vbuf[bx];
+      bx += 32;
+   }
+   tmp = (long) sum;
+   if (tmp > 32767)
+      tmp = 32767;
+   else if (tmp < -32768)
+      tmp = -32768;
+   *pcm = ((unsigned char) (tmp >> 8)) ^ 0x80;
+   pcm += 2;
+/*-- last 7 --*/
+   coef = wincoef + 255;       /* back pass through coefs */
+   for (i = 0; i < 7; i++)
+   {
+      coef -= 16;
+      si--;
+      bx++;
+      sum = 0.0F;
+      for (j = 0; j < 8; j++)
+      {
+        sum += (*coef--) * vbuf[si];
+        si += 32;
+        sum += (*coef--) * vbuf[bx];
+        bx += 32;
+      }
+      tmp = (long) sum;
+      if (tmp > 32767)
+        tmp = 32767;
+      else if (tmp < -32768)
+        tmp = -32768;
+      *pcm = ((unsigned char) (tmp >> 8)) ^ 0x80;
+      pcm += 2;
+   }
+#endif
+}
+/*------------------- 8 pt window ------------------------------*/
+void windowB8(float *vbuf, int vb_ptr, unsigned char *pcm)
+{
+#ifdef ASM_X86
+   windowB8_asm(vbuf, vb_ptr, pcm);
+#else
+   int i, j;
+   int si, bx;
+   float *coef;
+   float sum;
+   long tmp;
+
+   si = vb_ptr + 4;
+   bx = (si + 8) & 127;
+   coef = wincoef;
+
+/*-- first 4 --*/
+   for (i = 0; i < 4; i++)
+   {
+      sum = 0.0F;
+      for (j = 0; j < 8; j++)
+      {
+        sum += (*coef++) * vbuf[si];
+        si = (si + 16) & 127;
+        sum -= (*coef++) * vbuf[bx];
+        bx = (bx + 16) & 127;
+      }
+      si++;
+      bx--;
+      coef += 48;
+      tmp = (long) sum;
+      if (tmp > 32767)
+        tmp = 32767;
+      else if (tmp < -32768)
+        tmp = -32768;
+      *pcm++ = ((unsigned char) (tmp >> 8)) ^ 0x80;
+   }
+/*--  special case --*/
+   sum = 0.0F;
+   for (j = 0; j < 8; j++)
+   {
+      sum += (*coef++) * vbuf[bx];
+      bx = (bx + 16) & 127;
+   }
+   tmp = (long) sum;
+   if (tmp > 32767)
+      tmp = 32767;
+   else if (tmp < -32768)
+      tmp = -32768;
+   *pcm++ = ((unsigned char) (tmp >> 8)) ^ 0x80;
+/*-- last 3 --*/
+   coef = wincoef + 255;       /* back pass through coefs */
+   for (i = 0; i < 3; i++)
+   {
+      coef -= 48;
+      si--;
+      bx++;
+      sum = 0.0F;
+      for (j = 0; j < 8; j++)
+      {
+        sum += (*coef--) * vbuf[si];
+        si = (si + 16) & 127;
+        sum += (*coef--) * vbuf[bx];
+        bx = (bx + 16) & 127;
+      }
+      tmp = (long) sum;
+      if (tmp > 32767)
+        tmp = 32767;
+      else if (tmp < -32768)
+        tmp = -32768;
+      *pcm++ = ((unsigned char) (tmp >> 8)) ^ 0x80;
+   }
+#endif
+}
+/*--------------- 8 pt dual window (interleaved output) -----------------*/
+void windowB8_dual(float *vbuf, int vb_ptr, unsigned char *pcm)
+{
+#ifdef ASM_X86
+   windowB8_dual_asm(vbuf, vb_ptr, pcm);
+#else
+   int i, j;
+   int si, bx;
+   float *coef;
+   float sum;
+   long tmp;
+
+   si = vb_ptr + 4;
+   bx = (si + 8) & 127;
+   coef = wincoef;
+
+/*-- first 4 --*/
+   for (i = 0; i < 4; i++)
+   {
+      sum = 0.0F;
+      for (j = 0; j < 8; j++)
+      {
+        sum += (*coef++) * vbuf[si];
+        si = (si + 16) & 127;
+        sum -= (*coef++) * vbuf[bx];
+        bx = (bx + 16) & 127;
+      }
+      si++;
+      bx--;
+      coef += 48;
+      tmp = (long) sum;
+      if (tmp > 32767)
+        tmp = 32767;
+      else if (tmp < -32768)
+        tmp = -32768;
+      *pcm = ((unsigned char) (tmp >> 8)) ^ 0x80;
+      pcm += 2;
+   }
+/*--  special case --*/
+   sum = 0.0F;
+   for (j = 0; j < 8; j++)
+   {
+      sum += (*coef++) * vbuf[bx];
+      bx = (bx + 16) & 127;
+   }
+   tmp = (long) sum;
+   if (tmp > 32767)
+      tmp = 32767;
+   else if (tmp < -32768)
+      tmp = -32768;
+   *pcm = ((unsigned char) (tmp >> 8)) ^ 0x80;
+   pcm += 2;
+/*-- last 3 --*/
+   coef = wincoef + 255;       /* back pass through coefs */
+   for (i = 0; i < 3; i++)
+   {
+      coef -= 48;
+      si--;
+      bx++;
+      sum = 0.0F;
+      for (j = 0; j < 8; j++)
+      {
+        sum += (*coef--) * vbuf[si];
+        si = (si + 16) & 127;
+        sum += (*coef--) * vbuf[bx];
+        bx = (bx + 16) & 127;
+      }
+      tmp = (long) sum;
+      if (tmp > 32767)
+        tmp = 32767;
+      else if (tmp < -32768)
+        tmp = -32768;
+      *pcm = ((unsigned char) (tmp >> 8)) ^ 0x80;
+      pcm += 2;
+   }
+#endif
+}
+/*------------------------------------------------------------*/
diff --git a/codecs/mp3/src/cwinm.c b/codecs/mp3/src/cwinm.c
new file mode 100755 (executable)
index 0000000..c462fcc
--- /dev/null
@@ -0,0 +1,59 @@
+/*____________________________________________________________________________
+       
+       FreeAmp - The Free MP3 Player
+
+        MP3 Decoder originally Copyright (C) 1995-1997 Xing Technology
+        Corp.  http://www.xingtech.com
+
+       Portions Copyright (C) 1998-1999 EMusic.com
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program; if not, write to the Free Software
+       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+       
+       $Id$
+____________________________________________________________________________*/
+
+/****  cwinm.c  ***************************************************
+
+MPEG audio decoder, window master routine
+portable C
+
+
+******************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <float.h>
+#include <math.h>
+
+
+/* disable precision loss warning on type conversion */
+#ifdef _MSC_VER
+#pragma warning(disable:4244 4056)
+#endif
+
+float wincoef[264] =
+{                              /* window coefs */
+#include "tableawd.h"
+};
+
+/*--------------------------------------------------------*/
+#ifdef QUICK_FLOAT
+#include "cwinq.c"
+#include "cwinbq.c"
+#else
+#include "cwin.c"
+#include "cwinb.c"
+#endif
+/*--------------------------------------------------------*/
diff --git a/codecs/mp3/src/dec8.c b/codecs/mp3/src/dec8.c
new file mode 100755 (executable)
index 0000000..478bbf1
--- /dev/null
@@ -0,0 +1,338 @@
+/*____________________________________________________________________________
+       
+       FreeAmp - The Free MP3 Player
+
+        MP3 Decoder originally Copyright (C) 1995-1997 Xing Technology
+        Corp.  http://www.xingtech.com
+
+       Portions Copyright (C) 1998-1999 EMusic.com
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program; if not, write to the Free Software
+       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+       
+       $Id$
+____________________________________________________________________________*/
+
+/****  dec8.c  ***************************************************
+
+
+ANSI C
+MPEG audio decoder Layer II only mpeg1 and mpeg2
+output sample type and sample rate conversion
+  decode mpeg to 8000Ks mono
+  output 16 bit linear, 8 bit linear, or u-law
+
+
+mod 6/29/95  bugfix in u-law table
+
+mod 11/15/95 for Layer I
+
+mod 1/7/97 minor mods for warnings  
+
+******************************************************************/
+/*****************************************************************
+
+       MPEG audio software decoder portable ANSI c.
+       Decodes all Layer II to 8000Ks mono pcm.
+       Output selectable: 16 bit linear, 8 bit linear, u-law.
+
+-------------------------------------
+int audio_decode8_init(MPEG_HEAD *h, int framebytes_arg,
+         int reduction_code, int transform_code, int convert_code,
+         int freq_limit)
+
+initilize decoder:
+       return 0 = fail, not 0 = success
+
+MPEG_HEAD *h    input, mpeg header info (returned by call to head_info)
+framebytes      input, mpeg frame size (returned by call to head_info)
+reduction_code  input, ignored
+transform_code  input, ignored
+convert_code    input, set convert_code = 4*bit_code + chan_code
+                     bit_code:   1 = 16 bit linear pcm
+                                 2 =  8 bit (unsigned) linear pcm
+                                 3 = u-law (8 bits unsigned)
+                     chan_code:  0 = convert two chan to mono
+                                 1 = convert two chan to mono
+                                 2 = convert two chan to left chan
+                                 3 = convert two chan to right chan
+freq_limit      input, ignored
+
+
+---------------------------------
+void audio_decode8_info( DEC_INFO *info)
+
+information return:
+          Call after audio_decode8_init.  See mhead.h for
+          information returned in DEC_INFO structure.
+
+
+---------------------------------
+IN_OUT audio_decode8(unsigned char *bs, void *pcmbuf)
+
+decode one mpeg audio frame:
+bs        input, mpeg bitstream, must start with
+          sync word.  Caution: may read up to 3 bytes
+          beyond end of frame.
+pcmbuf    output, pcm samples.
+
+IN_OUT structure returns:
+          Number bytes conceptually removed from mpeg bitstream.
+          Returns 0 if sync loss.
+          Number bytes of pcm output.  This may vary from frame
+          to frame.
+
+*****************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <float.h>
+#include <math.h>
+#include "L3.h"
+#include "mhead.h"             /* mpeg header structure */
+
+
+
+
+
+/*------------------------------------------*/
+static int output_code;
+static int convert(void *mv, unsigned char *pcm);
+static int convert_8bit(void *mv, unsigned char *pcm);
+static int convert_u(void *mv, unsigned char *pcm);
+static CVT_FUNCTION_8 cvt_table[3] =
+{
+   convert,
+   convert_8bit,
+   convert_u,
+};
+
+void mpeg8_init(MPEG8 *m)
+{
+       memset(&m->dec, 0, sizeof(m->dec));
+       m->dec.ncnt = 8 * 288;
+       m->dec.ncnt1 = 8 * 287;
+       m->dec.nlast = 287;
+       m->dec.ndeci = 11;
+       m->dec.kdeci = 8 * 288;
+       m->dec.first_pass = 1;
+}
+
+/*====================================================================*/
+IN_OUT audio_decode8(MPEG8 *m, unsigned char *bs, signed short *pcmbuf)
+{
+   IN_OUT x;
+
+   x = audio_decode(&m->cupper, bs, m->dec.pcm);
+   if (x.in_bytes <= 0)
+      return x;
+   x.out_bytes = m->dec.convert_routine(m, (void *) pcmbuf);
+
+   return x;
+}
+/*--------------8Ks 16 bit pcm --------------------------------*/
+static int convert(void *mv, unsigned char y0[])
+{
+       MPEG8 *m = mv;
+   int i, k;
+   long alpha;
+   short *y;
+
+   y = (short *) y0;
+   k = 0;
+   if (m->dec.kdeci < m->dec.ncnt)
+   {
+      alpha = m->dec.kdeci & 7;
+      y[k++] = (short) (m->dec.xsave + ((alpha * (m->dec.pcm[0] - m->dec.xsave)) >> 3));
+      m->dec.kdeci += m->dec.ndeci;
+   }
+   m->dec.kdeci -= m->dec.ncnt;
+   for (; m->dec.kdeci < m->dec.ncnt1; m->dec.kdeci += m->dec.ndeci)
+   {
+      i = m->dec.kdeci >> 3;
+      alpha = m->dec.kdeci & 7;
+      y[k++] = (short) (m->dec.pcm[i] + ((alpha * (m->dec.pcm[i + 1] - m->dec.pcm[i])) >> 3));
+   }
+   m->dec.xsave = m->dec.pcm[m->dec.nlast];
+
+/* printf("\n k out = %4d", k);   */
+
+   return sizeof(short) * k;
+}
+/*----------------8Ks 8 bit unsigned pcm ---------------------------*/
+static int convert_8bit(void *mv, unsigned char y[])
+{
+   MPEG8 *m = mv;
+   int i, k;
+   long alpha;
+
+   k = 0;
+   if (m->dec.kdeci < m->dec.ncnt)
+   {
+      alpha = m->dec.kdeci & 7;
+      y[k++] = (unsigned char) (((m->dec.xsave + ((alpha * (m->dec.pcm[0] - m->dec.xsave)) >> 3)) >> 8) + 128);
+      m->dec.kdeci += m->dec.ndeci;
+   }
+   m->dec.kdeci -= m->dec.ncnt;
+   for (; m->dec.kdeci < m->dec.ncnt1; m->dec.kdeci += m->dec.ndeci)
+   {
+      i = m->dec.kdeci >> 3;
+      alpha = m->dec.kdeci & 7;
+      y[k++] = (unsigned char) (((m->dec.pcm[i] + ((alpha * (m->dec.pcm[i + 1] - m->dec.pcm[i])) >> 3)) >> 8) + 128);
+   }
+   m->dec.xsave = m->dec.pcm[m->dec.nlast];
+
+/* printf("\n k out = %4d", k);   */
+
+   return k;
+}
+/*--------------8Ks u-law --------------------------------*/
+static int convert_u(void *mv, unsigned char y[])
+{
+   MPEG8 *m = mv;
+   int i, k;
+   long alpha;
+   unsigned char *look;
+
+   look = m->dec.look_u + 4096;
+
+   k = 0;
+   if (m->dec.kdeci < m->dec.ncnt)
+   {
+      alpha = m->dec.kdeci & 7;
+      y[k++] = look[(m->dec.xsave + ((alpha * (m->dec.pcm[0] - m->dec.xsave)) >> 3)) >> 3];
+      m->dec.kdeci += m->dec.ndeci;
+   }
+   m->dec.kdeci -= m->dec.ncnt;
+   for (; m->dec.kdeci < m->dec.ncnt1; m->dec.kdeci += m->dec.ndeci)
+   {
+      i = m->dec.kdeci >> 3;
+      alpha = m->dec.kdeci & 7;
+      y[k++] = look[(m->dec.pcm[i] + ((alpha * (m->dec.pcm[i + 1] - m->dec.pcm[i])) >> 3)) >> 3];
+   }
+   m->dec.xsave = m->dec.pcm[m->dec.nlast];
+
+/* printf("\n k out = %4d", k);   */
+
+   return k;
+}
+/*--------------------------------------------------------------------*/
+static int ucomp3(int x)       /* re analog devices CCITT G.711 */
+{
+   int s, p, y, t, u, u0, sign;
+
+   sign = 0;
+   if (x < 0)
+   {
+      x = -x;
+      sign = 0x0080;
+   }
+   if (x > 8031)
+      x = 8031;
+   x += 33;
+   t = x;
+   for (s = 0; s < 15; s++)
+   {
+      if (t & 0x4000)
+        break;
+      t <<= 1;
+   }
+   y = x << s;
+   p = (y >> 10) & 0x0f;       /* position */
+   s = 9 - s;                  /* segment */
+   u0 = (((s << 4) | p) & 0x7f) | sign;
+   u = u0 ^ 0xff;
+
+   return u;
+}
+/*------------------------------------------------------------------*/
+static void table_init(MPEG8 *m)
+{
+   int i;
+
+   for (i = -4096; i < 4096; i++)
+      m->dec.look_u[4096 + i] = (unsigned char) (ucomp3(2 * i));
+
+}
+/*-------------------------------------------------------------------*/
+int audio_decode8_init(MPEG8 *m, MPEG_HEAD * h, int framebytes_arg,
+                  int reduction_code, int transform_code, int convert_code,
+                      int freq_limit)
+{
+   int istat;
+   int outvals;
+   static int sr_table[2][4] =
+   {{22, 24, 16, 0}, {44, 48, 32, 0}};
+
+   if (m->dec.first_pass)
+   {
+      table_init(m);
+      m->dec.first_pass = 0;
+   }
+
+   if ((h->sync & 1) == 0)
+      return 0;                        // fail mpeg 2.5
+
+   output_code = convert_code >> 2;
+   if (output_code < 1)
+      output_code = 1;         /* 1= 16bit 2 = 8bit 3 = u */
+   if (output_code > 3)
+      output_code = 3;         /* 1= 16bit 2 = 8bit 3 = u */
+
+   convert_code = convert_code & 3;
+   if (convert_code <= 0)
+      convert_code = 1;                /* always cvt to mono */
+
+   reduction_code = 1;
+   if (h->id)
+      reduction_code = 2;
+
+/* select convert routine */
+   m->dec.convert_routine = cvt_table[output_code - 1];
+
+/* init decimation/convert routine */
+/*-- MPEG-2 layer III --*/
+   if ((h->option == 1) && h->id == 0)
+      outvals = 576 >> reduction_code;
+   else if (h->option == 3)
+      outvals = 384 >> reduction_code;
+/*-- layer I --*/
+   else
+      outvals = 1152 >> reduction_code;
+   m->dec.ncnt = 8 * outvals;
+   m->dec.ncnt1 = 8 * (outvals - 1);
+   m->dec.nlast = outvals - 1;
+   m->dec.ndeci = sr_table[h->id][h->sr_index] >> reduction_code;
+   m->dec.kdeci = 8 * outvals;
+/* printf("\n outvals %d", outvals);  */
+
+   freq_limit = 3200;
+   istat = audio_decode_init(&m->cupper, h, framebytes_arg,
+                            reduction_code, transform_code, convert_code,
+                            freq_limit);
+
+
+   return istat;
+}
+/*-----------------------------------------------------------------*/
+void audio_decode8_info(MPEG8 *m, DEC_INFO * info)
+{
+
+   audio_decode_info(&m->cupper, info);
+   info->samprate = 8000;
+   if (output_code != 1)
+      info->bits = 8;
+   if (output_code == 3)
+      info->type = 10;
+}
diff --git a/codecs/mp3/src/hwin.c b/codecs/mp3/src/hwin.c
new file mode 100755 (executable)
index 0000000..2ba1106
--- /dev/null
@@ -0,0 +1,284 @@
+/*____________________________________________________________________________
+       
+       FreeAmp - The Free MP3 Player
+
+        MP3 Decoder originally Copyright (C) 1995-1997 Xing Technology
+        Corp.  http://www.xingtech.com
+
+       Portions Copyright (C) 1998-1999 EMusic.com
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program; if not, write to the Free Software
+       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+       
+       $Id$
+____________________________________________________________________________*/
+
+/****  hwin.c  ***************************************************
+
+Layer III 
+
+hybrid window/filter 
+
+******************************************************************/
+#include <stdlib.h>
+#include <stdio.h>
+#include <float.h>
+#include <math.h>
+#include "L3.h"
+#include "mhead.h"
+
+#ifdef ASM_X86
+extern int hybrid_asm(float xin[], float xprev[], float y[18][32],
+          int btype, int nlong, int ntot, int nprev);
+extern void FreqInvert_asm(float y[18][32], int n);
+#endif /* ASM_X86 */
+
+
+typedef float ARRAY36[36];
+
+/*====================================================================*/
+void imdct18(float f[]);       /* 18 point */
+void imdct6_3(float f[]);      /* 6 point */
+
+/*====================================================================*/
+ARRAY36 *hwin_init_addr(MPEG *m)
+{
+   return m->cupl.win;
+}
+
+#ifdef ASM_X86
+#ifdef _MSC_VER
+#pragma warning(disable: 4035)
+#endif /* _MSC_VER */ 
+#endif /* ASM_X86 */
+
+/*====================================================================*/
+int hybrid(MPEG *m, float xin[], float xprev[], float y[18][32],
+          int btype, int nlong, int ntot, int nprev)
+{
+#ifdef ASM_X86
+   hybrid_asm(xin, xprev, y, btype, nlong, ntot, nprev);
+#else
+   int i, j;
+   float *x, *x0;
+   float xa, xb;
+   int n;
+   int nout;
+
+
+
+   if (btype == 2)
+      btype = 0;
+   x = xin;
+   x0 = xprev;
+
+/*-- do long blocks (if any) --*/
+   n = (nlong + 17) / 18;      /* number of dct's to do */
+   for (i = 0; i < n; i++)
+   {
+      imdct18(x);
+      for (j = 0; j < 9; j++)
+      {
+        y[j][i] = x0[j] + m->cupl.win[btype][j] * x[9 + j];
+        y[9 + j][i] = x0[9 + j] + m->cupl.win[btype][9 + j] * x[17 - j];
+      }
+    /* window x for next time x0 */
+      for (j = 0; j < 4; j++)
+      {
+        xa = x[j];
+        xb = x[8 - j];
+        x[j] = m->cupl.win[btype][18 + j] * xb;
+        x[8 - j] = m->cupl.win[btype][(18 + 8) - j] * xa;
+        x[9 + j] = m->cupl.win[btype][(18 + 9) + j] * xa;
+        x[17 - j] = m->cupl.win[btype][(18 + 17) - j] * xb;
+      }
+      xa = x[j];
+      x[j] = m->cupl.win[btype][18 + j] * xa;
+      x[9 + j] = m->cupl.win[btype][(18 + 9) + j] * xa;
+
+      x += 18;
+      x0 += 18;
+   }
+
+/*-- do short blocks (if any) --*/
+   n = (ntot + 17) / 18;       /* number of 6 pt dct's triples to do */
+   for (; i < n; i++)
+   {
+      imdct6_3(x);
+      for (j = 0; j < 3; j++)
+      {
+        y[j][i] = x0[j];
+        y[3 + j][i] = x0[3 + j];
+
+        y[6 + j][i] = x0[6 + j] + m->cupl.win[2][j] * x[3 + j];
+        y[9 + j][i] = x0[9 + j] + m->cupl.win[2][3 + j] * x[5 - j];
+
+        y[12 + j][i] = x0[12 + j] + m->cupl.win[2][6 + j] * x[2 - j] + m->cupl.win[2][j] * x[(6 + 3) + j];
+        y[15 + j][i] = x0[15 + j] + m->cupl.win[2][9 + j] * x[j] + m->cupl.win[2][3 + j] * x[(6 + 5) - j];
+      }
+    /* window x for next time x0 */
+      for (j = 0; j < 3; j++)
+      {
+        x[j] = m->cupl.win[2][6 + j] * x[(6 + 2) - j] + m->cupl.win[2][j] * x[(12 + 3) + j];
+        x[3 + j] = m->cupl.win[2][9 + j] * x[6 + j] + m->cupl.win[2][3 + j] * x[(12 + 5) - j];
+      }
+      for (j = 0; j < 3; j++)
+      {
+        x[6 + j] = m->cupl.win[2][6 + j] * x[(12 + 2) - j];
+        x[9 + j] = m->cupl.win[2][9 + j] * x[12 + j];
+      }
+      for (j = 0; j < 3; j++)
+      {
+        x[12 + j] = 0.0f;
+        x[15 + j] = 0.0f;
+      }
+      x += 18;
+      x0 += 18;
+   }
+
+/*--- overlap prev if prev longer that current --*/
+   n = (nprev + 17) / 18;
+   for (; i < n; i++)
+   {
+      for (j = 0; j < 18; j++)
+        y[j][i] = x0[j];
+      x0 += 18;
+   }
+   nout = 18 * i;
+
+/*--- clear remaining only to band limit --*/
+   for (; i < m->cupl.band_limit_nsb; i++)
+   {
+      for (j = 0; j < 18; j++)
+        y[j][i] = 0.0f;
+   }
+
+   return nout;
+#endif
+}
+
+#ifdef ASM_X86
+#ifdef _MSC_VER
+#pragma warning(default: 4035)
+#endif /* _MSC_VER */ 
+#endif /* ASM_X86 */
+
+/*--------------------------------------------------------------------*/
+/*--------------------------------------------------------------------*/
+/*-- convert to mono, add curr result to y,
+    window and add next time to current left */
+int hybrid_sum(MPEG *m, float xin[], float xin_left[], float y[18][32],
+              int btype, int nlong, int ntot)
+{
+   int i, j;
+   float *x, *x0;
+   float xa, xb;
+   int n;
+   int nout;
+
+
+
+   if (btype == 2)
+      btype = 0;
+   x = xin;
+   x0 = xin_left;
+
+/*-- do long blocks (if any) --*/
+   n = (nlong + 17) / 18;      /* number of dct's to do */
+   for (i = 0; i < n; i++)
+   {
+      imdct18(x);
+      for (j = 0; j < 9; j++)
+      {
+        y[j][i] += m->cupl.win[btype][j] * x[9 + j];
+        y[9 + j][i] += m->cupl.win[btype][9 + j] * x[17 - j];
+      }
+    /* window x for next time x0 */
+      for (j = 0; j < 4; j++)
+      {
+        xa = x[j];
+        xb = x[8 - j];
+        x0[j] += m->cupl.win[btype][18 + j] * xb;
+        x0[8 - j] += m->cupl.win[btype][(18 + 8) - j] * xa;
+        x0[9 + j] += m->cupl.win[btype][(18 + 9) + j] * xa;
+        x0[17 - j] += m->cupl.win[btype][(18 + 17) - j] * xb;
+      }
+      xa = x[j];
+      x0[j] += m->cupl.win[btype][18 + j] * xa;
+      x0[9 + j] += m->cupl.win[btype][(18 + 9) + j] * xa;
+
+      x += 18;
+      x0 += 18;
+   }
+
+/*-- do short blocks (if any) --*/
+   n = (ntot + 17) / 18;       /* number of 6 pt dct's triples to do */
+   for (; i < n; i++)
+   {
+      imdct6_3(x);
+      for (j = 0; j < 3; j++)
+      {
+        y[6 + j][i] += m->cupl.win[2][j] * x[3 + j];
+        y[9 + j][i] += m->cupl.win[2][3 + j] * x[5 - j];
+
+        y[12 + j][i] += m->cupl.win[2][6 + j] * x[2 - j] + m->cupl.win[2][j] * x[(6 + 3) + j];
+        y[15 + j][i] += m->cupl.win[2][9 + j] * x[j] + m->cupl.win[2][3 + j] * x[(6 + 5) - j];
+      }
+    /* window x for next time */
+      for (j = 0; j < 3; j++)
+      {
+        x0[j] += m->cupl.win[2][6 + j] * x[(6 + 2) - j] + m->cupl.win[2][j] * x[(12 + 3) + j];
+        x0[3 + j] += m->cupl.win[2][9 + j] * x[6 + j] + m->cupl.win[2][3 + j] * x[(12 + 5) - j];
+      }
+      for (j = 0; j < 3; j++)
+      {
+        x0[6 + j] += m->cupl.win[2][6 + j] * x[(12 + 2) - j];
+        x0[9 + j] += m->cupl.win[2][9 + j] * x[12 + j];
+      }
+      x += 18;
+      x0 += 18;
+   }
+
+   nout = 18 * i;
+
+   return nout;
+}
+/*--------------------------------------------------------------------*/
+void sum_f_bands(float a[], float b[], int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+      a[i] += b[i];
+}
+/*--------------------------------------------------------------------*/
+/*--------------------------------------------------------------------*/
+void FreqInvert(float y[18][32], int n)
+{
+#ifdef ASM_X86
+   FreqInvert_asm(y, n);
+#else
+   int i, j;
+
+   n = (n + 17) / 18;
+   for (j = 0; j < 18; j += 2)
+   {
+      for (i = 0; i < n; i += 2)
+      {
+        y[1 + j][1 + i] = -y[1 + j][1 + i];
+      }
+   }
+#endif
+}
+/*--------------------------------------------------------------------*/
diff --git a/codecs/mp3/src/icdct.c b/codecs/mp3/src/icdct.c
new file mode 100755 (executable)
index 0000000..a38c401
--- /dev/null
@@ -0,0 +1,383 @@
+/*____________________________________________________________________________
+       
+       FreeAmp - The Free MP3 Player
+
+        MP3 Decoder originally Copyright (C) 1995-1997 Xing Technology
+        Corp.  http://www.xingtech.com
+
+       Portions Copyright (C) 1998 EMusic.com
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program; if not, write to the Free Software
+       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+       
+       $Id$
+____________________________________________________________________________*/
+
+/****  icdct.c  ***************************************************
+
+
+MPEG audio decoder, dct
+portable C    integer dct
+
+mod 1/8/97 warnings
+
+******************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <float.h>
+#include <math.h>
+#include "itype.h"
+
+/*-------------------------------------------------------------------*/
+static DCTCOEF coef32[32];     /* 32 pt dct coefs */
+
+
+
+
+#define forward_bf idx_forward_bf
+/*--- #define forward_bf ptr_forward_bf  ---*/
+/*------------------------------------------------------------*/
+DCTCOEF *i_dct_coef_addr()
+{
+   return coef32;
+}
+/*------------------------------------------------------------*/
+static void idx_forward_bf(int m, int n, INT32 x[], INT32 f[], DCTCOEF coef[])
+{
+   int i, j, n2;
+   int p, q, p0, k;
+
+   p0 = 0;
+   n2 = n >> 1;
+   for (i = 0; i < m; i++, p0 += n)
+   {
+      k = 0;
+      p = p0;
+      q = p + n - 1;
+      for (j = 0; j < n2; j++, p++, q--, k++)
+      {
+        f[p] = x[p] + x[q];
+        f[n2 + p] = ((x[p] - x[q]) * coef[k]) >> DCTBITS;
+      }
+   }
+}
+/*------------------------------------------------------------*/
+/*--
+static void ptr_forward_bf(int m, int n, INT32 x[], INT32 f[], DCTCOEF coef[])
+{
+int i, j, n2;
+DCTCOEF *c;
+INT32 *y;
+
+n2 = n >> 1;
+for(i=0; i<m; i++) {
+   c = coef;
+   y = x+n;
+   for(j=0; j<n2; j++) {
+        *f = *x + *--y;
+        *((f++)+n2) = ( (*x++ - *y) * (*c++) ) >> DCTBITS;
+        }
+   f+=n2;
+   x+=n2;
+}
+}
+---*/
+/*------------------------------------------------------------*/
+static void forward_bfm(int m, INT32 x[], INT32 f[])
+{
+   int i;
+   int p;
+
+/*--- special case last fwd stage ----*/
+   for (p = 0, i = 0; i < m; i++, p += 2)
+   {
+      f[p] = x[p] + x[p + 1];
+      f[p + 1] = ((x[p] - x[p + 1]) * coef32[30]) >> DCTBITS;
+   }
+}
+/*------------------------------------------------------------*/
+static void back_bf(int m, int n, INT32 x[], INT32 f[])
+{
+   int i, j, n2, n21;
+   int p, q, p0;
+
+   p0 = 0;
+   n2 = n >> 1;
+   n21 = n2 - 1;
+   for (i = 0; i < m; i++, p0 += n)
+   {
+      p = p0;
+      q = p0;
+      for (j = 0; j < n2; j++, p += 2, q++)
+        f[p] = x[q];
+      p = p0 + 1;
+      for (j = 0; j < n21; j++, p += 2, q++)
+        f[p] = x[q] + x[q + 1];
+      f[p] = x[q];
+   }
+}
+/*------------------------------------------------------------*/
+static void back_bf0(int n, INT32 x[], WININT f[])
+{
+   int p, q;
+
+   n--;
+#if DCTSATURATE
+   for (p = 0, q = 0; p < n; p += 2, q++)
+   {
+      tmp = x[q];
+      if (tmp > 32767)
+        tmp = 32767;
+      else if (tmp < -32768)
+        tmp = -32768;
+      f[p] = tmp;
+   }
+   for (p = 1; q < n; p += 2, q++)
+   {
+      tmp = x[q] + x[q + 1];
+      if (tmp > 32767)
+        tmp = 32767;
+      else if (tmp < -32768)
+        tmp = -32768;
+      f[p] = tmp;
+   }
+   tmp = x[q];
+   if (tmp > 32767)
+      tmp = 32767;
+   else if (tmp < -32768)
+      tmp = -32768;
+   f[p] = tmp;
+#else
+   for (p = 0, q = 0; p < n; p += 2, q++)
+      f[p] = x[q];
+   for (p = 1; q < n; p += 2, q++)
+      f[p] = x[q] + x[q + 1];
+   f[p] = x[q];
+#endif
+
+}
+/*------------------------------------------------------------*/
+void i_dct32(SAMPLEINT x[], WININT c[])
+{
+   INT32 a[32];                        /* ping pong buffers */
+   INT32 b[32];
+   int p, q;
+
+/* special first stage */
+   for (p = 0, q = 31; p < 16; p++, q--)
+   {
+      a[p] = (INT32) x[p] + x[q];
+      a[16 + p] = (coef32[p] * ((INT32) x[p] - x[q])) >> DCTBITS;
+   }
+
+   forward_bf(2, 16, a, b, coef32 + 16);
+   forward_bf(4, 8, b, a, coef32 + 16 + 8);
+   forward_bf(8, 4, a, b, coef32 + 16 + 8 + 4);
+   forward_bfm(16, b, a);
+   back_bf(8, 4, a, b);
+   back_bf(4, 8, b, a);
+   back_bf(2, 16, a, b);
+   back_bf0(32, b, c);
+}
+/*------------------------------------------------------------*/
+void i_dct32_dual(SAMPLEINT x[], WININT c[])
+{
+   INT32 a[32];                        /* ping pong buffers */
+   INT32 b[32];
+   int p, pp, qq;
+
+/* special first stage for dual chan (interleaved x) */
+   pp = 0;
+   qq = 2 * 31;
+   for (p = 0; p < 16; p++, pp += 2, qq -= 2)
+   {
+      a[p] = (INT32) x[pp] + x[qq];
+      a[16 + p] = (coef32[p] * ((INT32) x[pp] - x[qq])) >> DCTBITS;
+   }
+   forward_bf(2, 16, a, b, coef32 + 16);
+   forward_bf(4, 8, b, a, coef32 + 16 + 8);
+   forward_bf(8, 4, a, b, coef32 + 16 + 8 + 4);
+   forward_bfm(16, b, a);
+   back_bf(8, 4, a, b);
+   back_bf(4, 8, b, a);
+   back_bf(2, 16, a, b);
+   back_bf0(32, b, c);
+}
+/*---------------convert dual to mono------------------------------*/
+void i_dct32_dual_mono(SAMPLEINT x[], WININT c[])
+{
+   INT32 a[32];                        /* ping pong buffers */
+   INT32 b[32];
+   INT32 t1, t2;
+   int p, pp, qq;
+
+/* special first stage  */
+   pp = 0;
+   qq = 2 * 31;
+   for (p = 0; p < 16; p++, pp += 2, qq -= 2)
+   {
+      t1 = ((INT32) x[pp] + x[pp + 1]);
+      t2 = ((INT32) x[qq] + x[qq + 1]);
+      a[p] = (t1 + t2) >> 1;
+      a[16 + p] = coef32[p] * (t1 - t2) >> (DCTBITS + 1);
+   }
+   forward_bf(2, 16, a, b, coef32 + 16);
+   forward_bf(4, 8, b, a, coef32 + 16 + 8);
+   forward_bf(8, 4, a, b, coef32 + 16 + 8 + 4);
+   forward_bfm(16, b, a);
+   back_bf(8, 4, a, b);
+   back_bf(4, 8, b, a);
+   back_bf(2, 16, a, b);
+   back_bf0(32, b, c);
+}
+/*------------------------------------------------------------*/
+/*---------------- 16 pt dct -------------------------------*/
+void i_dct16(SAMPLEINT x[], WININT c[])
+{
+   INT32 a[16];                        /* ping pong buffers */
+   INT32 b[16];
+   int p, q;
+
+/* special first stage (drop highest sb) */
+   a[0] = x[0];
+   a[8] = (a[0] * coef32[16]) >> DCTBITS;
+   for (p = 1, q = 14; p < 8; p++, q--)
+   {
+      a[p] = (INT32) x[p] + x[q];
+      a[8 + p] = (((INT32) x[p] - x[q]) * coef32[16 + p]) >> DCTBITS;
+   }
+   forward_bf(2, 8, a, b, coef32 + 16 + 8);
+   forward_bf(4, 4, b, a, coef32 + 16 + 8 + 4);
+   forward_bfm(8, a, b);
+   back_bf(4, 4, b, a);
+   back_bf(2, 8, a, b);
+   back_bf0(16, b, c);
+}
+/*------------------------------------------------------------*/
+/*---------------- 16 pt dct dual chan---------------------*/
+void i_dct16_dual(SAMPLEINT x[], WININT c[])
+{
+   int p, pp, qq;
+   INT32 a[16];                        /* ping pong buffers */
+   INT32 b[16];
+
+/* special first stage for interleaved input */
+   a[0] = x[0];
+   a[8] = (coef32[16] * a[0]) >> DCTBITS;
+   pp = 2;
+   qq = 2 * 14;
+   for (p = 1; p < 8; p++, pp += 2, qq -= 2)
+   {
+      a[p] = (INT32) x[pp] + x[qq];
+      a[8 + p] = (coef32[16 + p] * ((INT32) x[pp] - x[qq])) >> DCTBITS;
+   }
+   forward_bf(2, 8, a, b, coef32 + 16 + 8);
+   forward_bf(4, 4, b, a, coef32 + 16 + 8 + 4);
+   forward_bfm(8, a, b);
+   back_bf(4, 4, b, a);
+   back_bf(2, 8, a, b);
+   back_bf0(16, b, c);
+}
+/*------------------------------------------------------------*/
+/*---------------- 16 pt dct dual to mono-------------------*/
+void i_dct16_dual_mono(SAMPLEINT x[], WININT c[])
+{
+   INT32 a[16];                        /* ping pong buffers */
+   INT32 b[16];
+   INT32 t1, t2;
+   int p, pp, qq;
+
+/* special first stage  */
+   a[0] = ((INT32) x[0] + x[1]) >> 1;
+   a[8] = (coef32[16] * a[0]) >> DCTBITS;
+   pp = 2;
+   qq = 2 * 14;
+   for (p = 1; p < 8; p++, pp += 2, qq -= 2)
+   {
+      t1 = (INT32) x[pp] + x[pp + 1];
+      t2 = (INT32) x[qq] + x[qq + 1];
+      a[p] = (t1 + t2) >> 1;
+      a[8 + p] = (coef32[16 + p] * (t1 - t2)) >> (DCTBITS + 1);
+   }
+   forward_bf(2, 8, a, b, coef32 + 16 + 8);
+   forward_bf(4, 4, b, a, coef32 + 16 + 8 + 4);
+   forward_bfm(8, a, b);
+   back_bf(4, 4, b, a);
+   back_bf(2, 8, a, b);
+   back_bf0(16, b, c);
+}
+/*------------------------------------------------------------*/
+/*---------------- 8 pt dct -------------------------------*/
+void i_dct8(SAMPLEINT x[], WININT c[])
+{
+   int p, q;
+   INT32 a[8];                 /* ping pong buffers */
+   INT32 b[8];
+
+/* special first stage  */
+
+   for (p = 0, q = 7; p < 4; p++, q--)
+   {
+      b[p] = (INT32) x[p] + x[q];
+      b[4 + p] = (coef32[16 + 8 + p] * ((INT32) x[p] - x[q])) >> DCTBITS;
+   }
+
+   forward_bf(2, 4, b, a, coef32 + 16 + 8 + 4);
+   forward_bfm(4, a, b);
+   back_bf(2, 4, b, a);
+   back_bf0(8, a, c);
+}
+/*------------------------------------------------------------*/
+/*---------------- 8 pt dct dual chan---------------------*/
+void i_dct8_dual(SAMPLEINT x[], WININT c[])
+{
+   int p, pp, qq;
+   INT32 a[8];                 /* ping pong buffers */
+   INT32 b[8];
+
+/* special first stage for interleaved input */
+   for (p = 0, pp = 0, qq = 14; p < 4; p++, pp += 2, qq -= 2)
+   {
+      b[p] = (INT32) x[pp] + x[qq];
+      b[4 + p] = (coef32[16 + 8 + p] * ((INT32) x[pp] - x[qq])) >> DCTBITS;
+   }
+   forward_bf(2, 4, b, a, coef32 + 16 + 8 + 4);
+   forward_bfm(4, a, b);
+   back_bf(2, 4, b, a);
+   back_bf0(8, a, c);
+}
+/*------------------------------------------------------------*/
+/*---------------- 8 pt dct dual to mono---------------------*/
+void i_dct8_dual_mono(SAMPLEINT x[], WININT c[])
+{
+   int p, pp, qq;
+   INT32 a[8];                 /* ping pong buffers */
+   INT32 b[8];
+   INT32 t1, t2;
+
+/* special first stage  */
+   for (p = 0, pp = 0, qq = 14; p < 4; p++, pp += 2, qq -= 2)
+   {
+      t1 = (INT32) x[pp] + x[pp + 1];
+      t2 = (INT32) x[qq] + x[qq + 1];
+      b[p] = (t1 + t2) >> 1;
+      b[4 + p] = (coef32[16 + 8 + p] * (t1 - t2)) >> (DCTBITS + 1);
+   }
+   forward_bf(2, 4, b, a, coef32 + 16 + 8 + 4);
+   forward_bfm(4, a, b);
+   back_bf(2, 4, b, a);
+   back_bf0(8, a, c);
+}
+/*------------------------------------------------------------*/
diff --git a/codecs/mp3/src/isbt.c b/codecs/mp3/src/isbt.c
new file mode 100755 (executable)
index 0000000..bc240bd
--- /dev/null
@@ -0,0 +1,458 @@
+/*____________________________________________________________________________
+       
+       FreeAmp - The Free MP3 Player
+
+        MP3 Decoder originally Copyright (C) 1995-1997 Xing Technology
+        Corp.  http://www.xingtech.com
+
+       Portions Copyright (C) 1998-1999 EMusic.com
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program; if not, write to the Free Software
+       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+       
+       $Id$
+____________________________________________________________________________*/
+
+/****  isbt.c  ***************************************************
+
+MPEG audio decoder, dct and window
+portable C       integer version of csbt.c
+
+mods 11/15/95 for Layer I
+
+mods 1/7/97 warnings
+
+******************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <float.h>
+#include <math.h>
+#include "itype.h"
+
+
+#ifdef _MSC_VER
+#pragma warning(disable: 4244)
+#pragma warning(disable: 4056)
+#endif
+
+
+
+/* asm is quick only, c code does not need separate window for right */
+/* full is opposite of quick */
+#ifdef  FULL_INTEGER
+#define i_window_dual_right   i_window_dual
+#define i_window16_dual_right i_window16_dual
+#define i_window8_dual_right  i_window8_dual
+#endif
+
+
+void i_dct32(SAMPLEINT * sample, WININT * vbuf);
+void i_dct32_dual(SAMPLEINT * sample, WININT * vbuf);
+void i_dct32_dual_mono(SAMPLEINT * sample, WININT * vbuf);
+
+void i_dct16(SAMPLEINT * sample, WININT * vbuf);
+void i_dct16_dual(SAMPLEINT * sample, WININT * vbuf);
+void i_dct16_dual_mono(SAMPLEINT * sample, WININT * vbuf);
+
+void i_dct8(SAMPLEINT * sample, WININT * vbuf);
+void i_dct8_dual(SAMPLEINT * sample, WININT * vbuf);
+void i_dct8_dual_mono(SAMPLEINT * sample, WININT * vbuf);
+
+
+void i_window(WININT * vbuf, int vb_ptr, short *pcm);
+void i_window_dual(WININT * vbuf, int vb_ptr, short *pcm);
+void i_window_dual_right(WININT * vbuf, int vb_ptr, short *pcm);
+
+void i_window16(WININT * vbuf, int vb_ptr, short *pcm);
+void i_window16_dual(WININT * vbuf, int vb_ptr, short *pcm);
+void i_window16_dual_right(WININT * vbuf, int vb_ptr, short *pcm);
+
+void i_window8(WININT * vbuf, int vb_ptr, short *pcm);
+void i_window8_dual(WININT * vbuf, int vb_ptr, short *pcm);
+void i_window8_dual_right(WININT * vbuf, int vb_ptr, short *pcm);
+
+/*--------------------------------------------------------------------*/
+/*--  floating point window coefs  ---*/
+/*--  for integer-quick window, table used to generate integer coefs --*/
+static float wincoef[264] =
+{
+#include "tableawd.h"
+};
+
+/* circular window buffers */
+/* extern windows because of asm */
+static signed int vb_ptr;
+
+// static WININT vbuf[512];
+//static WININT vbuf2[512];
+extern WININT vbuf[512];
+extern WININT vbuf2[512];
+
+DCTCOEF *i_dct_coef_addr();
+
+/*======================================================================*/
+static void gencoef()          /* gen coef for N=32 */
+{
+   int p, n, i, k;
+   double t, pi;
+   DCTCOEF *coef32;
+
+   coef32 = i_dct_coef_addr();
+
+
+   pi = 4.0 * atan(1.0);
+   n = 16;
+   k = 0;
+   for (i = 0; i < 5; i++, n = n / 2)
+   {
+      for (p = 0; p < n; p++, k++)
+      {
+        t = (pi / (4 * n)) * (2 * p + 1);
+        coef32[k] = (1 << DCTBITS) * (0.50 / cos(t)) + 0.5;
+      }
+   }
+}
+/*------------------------------------------------------------*/
+WINCOEF *i_wincoef_addr();
+static void genwincoef_q()     /* gen int window coefs from floating table */
+{
+   int i, j, k, m;
+   float x;
+   WINCOEF *iwincoef;
+
+   iwincoef = i_wincoef_addr();
+
+
+/*--- coefs generated inline for quick window ---*/
+/*-- quick uses only 116 coefs --*/
+
+   k = 0;
+   m = 0;
+   for (i = 0; i < 16; i++)
+   {
+      k += 5;
+      for (j = 0; j < 7; j++)
+      {
+        x = (1 << WINBITS) * wincoef[k++];
+        if (x > 0.0)
+           x += 0.5;
+        else
+           x -= 0.5;
+        iwincoef[m++] = x;
+      }
+      k += 4;
+   }
+   k++;
+   for (j = 0; j < 4; j++)
+   {
+      x = (1 << WINBITS) * wincoef[k++];
+      if (x > 0.0)
+        x += 0.5;
+      else
+        x -= 0.5;
+      iwincoef[m++] = x;
+   }
+}
+/*------------------------------------------------------------*/
+static void genwincoef()       /* gen int window coefs from floating table */
+{
+   int i;
+   float x;
+   WINCOEF *iwincoef;
+   WINCOEF *i_wincoef_addr();
+
+   iwincoef = i_wincoef_addr();
+
+   for (i = 0; i < 264; i++)
+   {
+      x = (1 << WINBITS) * wincoef[i];
+      if (x > 0.0)
+        x += 0.5;
+      else
+        x -= 0.5;
+      iwincoef[i] = x;
+   }
+}
+/*------------------------------------------------------------*/
+void i_sbt_init()
+{
+   int i;
+   static int first_pass = 1;
+
+#ifdef FULL_INTEGER
+   static int full_integer = 1;
+
+#else
+   static int full_integer = 0;
+
+#endif
+
+   if (first_pass)
+   {
+      gencoef();
+      if (full_integer)
+        genwincoef();
+      else
+        genwincoef_q();
+      first_pass = 0;
+   }
+
+/* clear window vbuf */
+   for (i = 0; i < 512; i++)
+      vbuf[i] = vbuf2[i] = 0;
+   vb_ptr = 0;
+
+}
+/*==============================================================*/
+/*==============================================================*/
+/*==============================================================*/
+void i_sbt_mono(SAMPLEINT * sample, short *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      i_dct32(sample, vbuf + vb_ptr);
+      i_window(vbuf, vb_ptr, pcm);
+      sample += 64;
+      vb_ptr = (vb_ptr - 32) & 511;
+      pcm += 32;
+   }
+
+}
+/*------------------------------------------------------------*/
+void i_sbt_dual(SAMPLEINT * sample, short *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      i_dct32_dual(sample, vbuf + vb_ptr);
+      i_dct32_dual(sample + 1, vbuf2 + vb_ptr);
+      i_window_dual(vbuf, vb_ptr, pcm);
+      i_window_dual_right(vbuf2, vb_ptr, pcm + 1);
+      sample += 64;
+      vb_ptr = (vb_ptr - 32) & 511;
+      pcm += 64;
+   }
+}
+/*------------------------------------------------------------*/
+/* convert dual to mono */
+void i_sbt_dual_mono(SAMPLEINT * sample, short *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      i_dct32_dual_mono(sample, vbuf + vb_ptr);
+      i_window(vbuf, vb_ptr, pcm);
+      sample += 64;
+      vb_ptr = (vb_ptr - 32) & 511;
+      pcm += 32;
+   }
+}
+/*------------------------------------------------------------*/
+/* convert dual to left */
+void i_sbt_dual_left(SAMPLEINT * sample, short *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      i_dct32_dual(sample, vbuf + vb_ptr);
+      i_window(vbuf, vb_ptr, pcm);
+      sample += 64;
+      vb_ptr = (vb_ptr - 32) & 511;
+      pcm += 32;
+   }
+}
+/*------------------------------------------------------------*/
+/* convert dual to right */
+void i_sbt_dual_right(SAMPLEINT * sample, short *pcm, int n)
+{
+   int i;
+
+   sample++;                   /* point to right chan */
+   for (i = 0; i < n; i++)
+   {
+      i_dct32_dual(sample, vbuf + vb_ptr);
+      i_window(vbuf, vb_ptr, pcm);
+      sample += 64;
+      vb_ptr = (vb_ptr - 32) & 511;
+      pcm += 32;
+   }
+}
+/*------------------------------------------------------------*/
+/*---------------- 16 pt sbt's  -------------------------------*/
+/*------------------------------------------------------------*/
+void i_sbt16_mono(SAMPLEINT * sample, short *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      i_dct16(sample, vbuf + vb_ptr);
+      i_window16(vbuf, vb_ptr, pcm);
+      sample += 64;
+      vb_ptr = (vb_ptr - 16) & 255;
+      pcm += 16;
+   }
+
+}
+/*------------------------------------------------------------*/
+void i_sbt16_dual(SAMPLEINT * sample, short *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      i_dct16_dual(sample, vbuf + vb_ptr);
+      i_dct16_dual(sample + 1, vbuf2 + vb_ptr);
+      i_window16_dual(vbuf, vb_ptr, pcm);
+      i_window16_dual_right(vbuf2, vb_ptr, pcm + 1);
+      sample += 64;
+      vb_ptr = (vb_ptr - 16) & 255;
+      pcm += 32;
+   }
+
+}
+/*------------------------------------------------------------*/
+void i_sbt16_dual_mono(SAMPLEINT * sample, short *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      i_dct16_dual_mono(sample, vbuf + vb_ptr);
+      i_window16(vbuf, vb_ptr, pcm);
+      sample += 64;
+      vb_ptr = (vb_ptr - 16) & 255;
+      pcm += 16;
+   }
+}
+/*------------------------------------------------------------*/
+void i_sbt16_dual_left(SAMPLEINT * sample, short *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      i_dct16_dual(sample, vbuf + vb_ptr);
+      i_window16(vbuf, vb_ptr, pcm);
+      sample += 64;
+      vb_ptr = (vb_ptr - 16) & 255;
+      pcm += 16;
+   }
+}
+/*------------------------------------------------------------*/
+void i_sbt16_dual_right(SAMPLEINT * sample, short *pcm, int n)
+{
+   int i;
+
+   sample++;
+   for (i = 0; i < n; i++)
+   {
+      i_dct16_dual(sample, vbuf + vb_ptr);
+      i_window16(vbuf, vb_ptr, pcm);
+      sample += 64;
+      vb_ptr = (vb_ptr - 16) & 255;
+      pcm += 16;
+   }
+}
+/*------------------------------------------------------------*/
+/*---------------- 8 pt sbt's  -------------------------------*/
+/*------------------------------------------------------------*/
+void i_sbt8_mono(SAMPLEINT * sample, short *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      i_dct8(sample, vbuf + vb_ptr);
+      i_window8(vbuf, vb_ptr, pcm);
+      sample += 64;
+      vb_ptr = (vb_ptr - 8) & 127;
+      pcm += 8;
+   }
+
+}
+/*------------------------------------------------------------*/
+void i_sbt8_dual(SAMPLEINT * sample, short *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      i_dct8_dual(sample, vbuf + vb_ptr);
+      i_dct8_dual(sample + 1, vbuf2 + vb_ptr);
+      i_window8_dual(vbuf, vb_ptr, pcm);
+      i_window8_dual_right(vbuf2, vb_ptr, pcm + 1);
+      sample += 64;
+      vb_ptr = (vb_ptr - 8) & 127;
+      pcm += 16;
+   }
+}
+/*------------------------------------------------------------*/
+void i_sbt8_dual_mono(SAMPLEINT * sample, short *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      i_dct8_dual_mono(sample, vbuf + vb_ptr);
+      i_window8(vbuf, vb_ptr, pcm);
+      sample += 64;
+      vb_ptr = (vb_ptr - 8) & 127;
+      pcm += 8;
+   }
+}
+/*------------------------------------------------------------*/
+void i_sbt8_dual_left(SAMPLEINT * sample, short *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      i_dct8_dual(sample, vbuf + vb_ptr);
+      i_window8(vbuf, vb_ptr, pcm);
+      sample += 64;
+      vb_ptr = (vb_ptr - 8) & 127;
+      pcm += 8;
+   }
+}
+/*------------------------------------------------------------*/
+void i_sbt8_dual_right(SAMPLEINT * sample, short *pcm, int n)
+{
+   int i;
+
+   sample++;
+   for (i = 0; i < n; i++)
+   {
+      i_dct8_dual(sample, vbuf + vb_ptr);
+      i_window8(vbuf, vb_ptr, pcm);
+      sample += 64;
+      vb_ptr = (vb_ptr - 8) & 127;
+      pcm += 8;
+   }
+}
+/*------------------------------------------------------------*/
+/*--- 8 bit output ----------------*/
+#include "isbtb.c"
+/*----------------------------------*/
+
+#ifdef _MSC_VER
+#pragma warning(default: 4244)
+#pragma warning(default: 4056)
+#endif
diff --git a/codecs/mp3/src/isbtb.c b/codecs/mp3/src/isbtb.c
new file mode 100755 (executable)
index 0000000..f598419
--- /dev/null
@@ -0,0 +1,288 @@
+/*____________________________________________________________________________
+       
+       FreeAmp - The Free MP3 Player
+
+        MP3 Decoder originally Copyright (C) 1995-1997 Xing Technology
+        Corp.  http://www.xingtech.com
+
+       Portions Copyright (C) 1998 EMusic.com
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program; if not, write to the Free Software
+       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+       
+       $Id$
+____________________________________________________________________________*/
+
+/****  isbtb.c  ***************************************************
+
+include to isbt.c
+
+
+MPEG audio decoder, integer dct and window, 8 bit output
+
+
+******************************************************************/
+/* asm is quick only, c code does not need separate window for right */
+/* full is opposite of quick */
+#ifdef  FULL_INTEGER
+#define i_windowB_dual_right   i_windowB_dual
+#define i_windowB16_dual_right i_windowB16_dual
+#define i_windowB8_dual_right  i_windowB8_dual
+#endif
+
+void i_windowB(WININT * vbuf, int vb_ptr, unsigned char *pcm);
+void i_windowB_dual(WININT * vbuf, int vb_ptr, unsigned char *pcm);
+void i_windowB_dual_right(WININT * vbuf, int vb_ptr, unsigned char *pcm);
+void i_windowB16(WININT * vbuf, int vb_ptr, unsigned char *pcm);
+void i_windowB16_dual(WININT * vbuf, int vb_ptr, unsigned char *pcm);
+void i_windowB16_dual_right(WININT * vbuf, int vb_ptr, unsigned char *pcm);
+void i_windowB8(WININT * vbuf, int vb_ptr, unsigned char *pcm);
+void i_windowB8_dual(WININT * vbuf, int vb_ptr, unsigned char *pcm);
+void i_windowB8_dual_right(WININT * vbuf, int vb_ptr, unsigned char *pcm);
+
+
+
+/*==============================================================*/
+/*==============================================================*/
+/*==============================================================*/
+void i_sbtB_mono(SAMPLEINT * sample, unsigned char *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      i_dct32(sample, vbuf + vb_ptr);
+      i_windowB(vbuf, vb_ptr, pcm);
+      sample += 64;
+      vb_ptr = (vb_ptr - 32) & 511;
+      pcm += 32;
+   }
+
+}
+/*------------------------------------------------------------*/
+void i_sbtB_dual(SAMPLEINT * sample, unsigned char *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      i_dct32_dual(sample, vbuf + vb_ptr);
+      i_dct32_dual(sample + 1, vbuf2 + vb_ptr);
+      i_windowB_dual(vbuf, vb_ptr, pcm);
+      i_windowB_dual_right(vbuf2, vb_ptr, pcm + 1);
+      sample += 64;
+      vb_ptr = (vb_ptr - 32) & 511;
+      pcm += 64;
+   }
+}
+/*------------------------------------------------------------*/
+/* convert dual to mono */
+void i_sbtB_dual_mono(SAMPLEINT * sample, unsigned char *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      i_dct32_dual_mono(sample, vbuf + vb_ptr);
+      i_windowB(vbuf, vb_ptr, pcm);
+      sample += 64;
+      vb_ptr = (vb_ptr - 32) & 511;
+      pcm += 32;
+   }
+}
+/*------------------------------------------------------------*/
+/* convert dual to left */
+void i_sbtB_dual_left(SAMPLEINT * sample, unsigned char *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      i_dct32_dual(sample, vbuf + vb_ptr);
+      i_windowB(vbuf, vb_ptr, pcm);
+      sample += 64;
+      vb_ptr = (vb_ptr - 32) & 511;
+      pcm += 32;
+   }
+}
+/*------------------------------------------------------------*/
+/* convert dual to right */
+void i_sbtB_dual_right(SAMPLEINT * sample, unsigned char *pcm, int n)
+{
+   int i;
+
+   sample++;                   /* point to right chan */
+   for (i = 0; i < n; i++)
+   {
+      i_dct32_dual(sample, vbuf + vb_ptr);
+      i_windowB(vbuf, vb_ptr, pcm);
+      sample += 64;
+      vb_ptr = (vb_ptr - 32) & 511;
+      pcm += 32;
+   }
+}
+/*------------------------------------------------------------*/
+/*---------------- 16 pt sbt's  -------------------------------*/
+/*------------------------------------------------------------*/
+void i_sbtB16_mono(SAMPLEINT * sample, unsigned char *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      i_dct16(sample, vbuf + vb_ptr);
+      i_windowB16(vbuf, vb_ptr, pcm);
+      sample += 64;
+      vb_ptr = (vb_ptr - 16) & 255;
+      pcm += 16;
+   }
+
+}
+/*------------------------------------------------------------*/
+void i_sbtB16_dual(SAMPLEINT * sample, unsigned char *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      i_dct16_dual(sample, vbuf + vb_ptr);
+      i_dct16_dual(sample + 1, vbuf2 + vb_ptr);
+      i_windowB16_dual(vbuf, vb_ptr, pcm);
+      i_windowB16_dual_right(vbuf2, vb_ptr, pcm + 1);
+      sample += 64;
+      vb_ptr = (vb_ptr - 16) & 255;
+      pcm += 32;
+   }
+
+}
+/*------------------------------------------------------------*/
+void i_sbtB16_dual_mono(SAMPLEINT * sample, unsigned char *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      i_dct16_dual_mono(sample, vbuf + vb_ptr);
+      i_windowB16(vbuf, vb_ptr, pcm);
+      sample += 64;
+      vb_ptr = (vb_ptr - 16) & 255;
+      pcm += 16;
+   }
+}
+/*------------------------------------------------------------*/
+void i_sbtB16_dual_left(SAMPLEINT * sample, unsigned char *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      i_dct16_dual(sample, vbuf + vb_ptr);
+      i_windowB16(vbuf, vb_ptr, pcm);
+      sample += 64;
+      vb_ptr = (vb_ptr - 16) & 255;
+      pcm += 16;
+   }
+}
+/*------------------------------------------------------------*/
+void i_sbtB16_dual_right(SAMPLEINT * sample, unsigned char *pcm, int n)
+{
+   int i;
+
+   sample++;
+   for (i = 0; i < n; i++)
+   {
+      i_dct16_dual(sample, vbuf + vb_ptr);
+      i_windowB16(vbuf, vb_ptr, pcm);
+      sample += 64;
+      vb_ptr = (vb_ptr - 16) & 255;
+      pcm += 16;
+   }
+}
+/*------------------------------------------------------------*/
+/*---------------- 8 pt sbt's  -------------------------------*/
+/*------------------------------------------------------------*/
+void i_sbtB8_mono(SAMPLEINT * sample, unsigned char *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      i_dct8(sample, vbuf + vb_ptr);
+      i_windowB8(vbuf, vb_ptr, pcm);
+      sample += 64;
+      vb_ptr = (vb_ptr - 8) & 127;
+      pcm += 8;
+   }
+
+}
+/*------------------------------------------------------------*/
+void i_sbtB8_dual(SAMPLEINT * sample, unsigned char *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      i_dct8_dual(sample, vbuf + vb_ptr);
+      i_dct8_dual(sample + 1, vbuf2 + vb_ptr);
+      i_windowB8_dual(vbuf, vb_ptr, pcm);
+      i_windowB8_dual_right(vbuf2, vb_ptr, pcm + 1);
+      sample += 64;
+      vb_ptr = (vb_ptr - 8) & 127;
+      pcm += 16;
+   }
+}
+/*------------------------------------------------------------*/
+void i_sbtB8_dual_mono(SAMPLEINT * sample, unsigned char *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      i_dct8_dual_mono(sample, vbuf + vb_ptr);
+      i_windowB8(vbuf, vb_ptr, pcm);
+      sample += 64;
+      vb_ptr = (vb_ptr - 8) & 127;
+      pcm += 8;
+   }
+}
+/*------------------------------------------------------------*/
+void i_sbtB8_dual_left(SAMPLEINT * sample, unsigned char *pcm, int n)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      i_dct8_dual(sample, vbuf + vb_ptr);
+      i_windowB8(vbuf, vb_ptr, pcm);
+      sample += 64;
+      vb_ptr = (vb_ptr - 8) & 127;
+      pcm += 8;
+   }
+}
+/*------------------------------------------------------------*/
+void i_sbtB8_dual_right(SAMPLEINT * sample, unsigned char *pcm, int n)
+{
+   int i;
+
+   sample++;
+   for (i = 0; i < n; i++)
+   {
+      i_dct8_dual(sample, vbuf + vb_ptr);
+      i_windowB8(vbuf, vb_ptr, pcm);
+      sample += 64;
+      vb_ptr = (vb_ptr - 8) & 127;
+      pcm += 8;
+   }
+}
+/*------------------------------------------------------------*/
diff --git a/codecs/mp3/src/iup.c b/codecs/mp3/src/iup.c
new file mode 100755 (executable)
index 0000000..8dd2fcc
--- /dev/null
@@ -0,0 +1,529 @@
+/*____________________________________________________________________________
+       
+       FreeAmp - The Free MP3 Player
+
+        MP3 Decoder originally Copyright (C) 1995-1997 Xing Technology
+        Corp.  http://www.xingtech.com
+
+       Portions Copyright (C) 1998-1999 EMusic.com
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program; if not, write to the Free Software
+       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+       
+       $Id$
+____________________________________________________________________________*/
+
+/****  iup.c  ***************************************************
+
+MPEG audio decoder Layer I/II, mpeg1 and mpeg2
+should be portable ANSI C, should be endian independent
+
+icup integer version of cup.c
+
+
+
+mod 10/18/95   mod grouped sample unpack for:
+               Overflow possible in grouped if native int is 16 bit.
+               Rare occurance.  16x16-->32 mult needed.
+
+mods 11/15/95 for Layer I
+
+
+1/5/95    Quick fix,  cs_factor can overflow int16 (why?).  Typed to int32.
+
+mods 1/7/97 warnings
+
+******************************************************************/
+/******************************************************************
+
+       MPEG audio software decoder portable ANSI c.
+       Decodes all Layer II to 16 bit linear pcm.
+       Optional stereo to mono conversion.  Optional
+       output sample rate conversion to half or quarter of
+       native mpeg rate.
+
+-------------------------------------
+int i_audio_decode_init(MPEG *m, MPEG_HEAD *h, int framebytes_arg,
+         int reduction_code, int transform_code, int convert_code,
+         int freq_limit)
+
+initilize decoder:
+       return 0 = fail, not 0 = success
+
+MPEG_HEAD *h    input, mpeg header info (returned by call to head_info)
+framebytes      input, mpeg frame size (returned by call to head_info)
+reduction_code  input, sample rate reduction code
+                    0 = full rate
+                    1 = half rate
+                    0 = quarter rate
+
+transform_code  input, ignored
+convert_code    input, channel conversion
+                  convert_code:  0 = two chan output
+                                 1 = convert two chan to mono
+                                 2 = convert two chan to left chan
+                                 3 = convert two chan to right chan
+freq_limit      input, limits bandwidth of pcm output to specified
+                frequency.  Special use. Set to 24000 for normal use.
+
+
+---------------------------------
+void i_audio_decode_info( MPEG *m, DEC_INFO *info)
+
+information return:
+          Call after audio_decode_init.  See mhead.h for
+          information returned in DEC_INFO structure.
+
+
+---------------------------------
+IN_OUT i_audio_decode(MPEG *m, unsigned char *bs, void *pcmbuf)
+
+decode one mpeg audio frame:
+bs        input, mpeg bitstream, must start with
+          sync word.  Caution: may read up to 3 bytes
+          beyond end of frame.
+pcmbuf    output, pcm samples.
+
+IN_OUT structure returns:
+          Number bytes conceptually removed from mpeg bitstream.
+          Returns 0 if sync loss.
+          Number bytes of pcm output.
+
+*******************************************************************/
+#include <stdlib.h>
+#include <stdio.h>
+#include <float.h>
+#include <math.h>
+#include "L3.h"
+#include "mhead.h"             /* mpeg header structure */
+#include "jdw.h"
+
+/*-------------------------------------------------------
+NOTE:  Decoder may read up to three bytes beyond end of
+frame.  Calling application must ensure that this does
+not cause a memory access violation (protection fault)
+---------------------------------------------------------*/
+
+
+#ifdef _MSC_VER
+#pragma warning(disable: 4709)
+#endif
+
+
+/* Okay to be global -- is read/only */
+static int look_joint[16] =
+{                              /* lookup stereo sb's by mode+ext */
+   64, 64, 64, 64,             /* stereo */
+   2 * 4, 2 * 8, 2 * 12, 2 * 16,       /* joint */
+   64, 64, 64, 64,             /* dual */
+   32, 32, 32, 32,             /* mono */
+};
+
+/* Okay to be global -- is read/only */
+static int bat_bit_master[] =
+{
+   0, 5, 7, 9, 10, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48};
+
+void i_sbt_mono(SAMPLEINT * sample, short *pcm, int n);
+void i_sbt_dual(SAMPLEINT * sample, short *pcm, int n);
+
+static void unpack();
+
+/*------------- initialize bit getter -------------*/
+static void load_init(MPEGI *m, unsigned char *buf)
+{
+   m->iup.bs_ptr = buf;
+   m->iup.bits = 0;
+   m->iup.bitbuf = 0;
+}
+/*------------- get n bits from bitstream -------------*/
+static INT32 load(MPEGI *m, int n)
+{
+   UINT32 x;
+
+   if (m->iup.bits < n)
+   {                           /* refill bit buf if necessary */
+      while (m->iup.bits <= 24)
+      {
+        m->iup.bitbuf = (m->iup.bitbuf << 8) | *m->iup.bs_ptr++;
+        m->iup.bits += 8;
+      }
+   }
+   m->iup.bits -= n;
+   x = m->iup.bitbuf >> m->iup.bits;
+   m->iup.bitbuf -= x << m->iup.bits;
+   return x;
+}
+/*------------- skip over n bits in bitstream -------------*/
+static void skip(MPEGI *m, int n)
+{
+   int k;
+
+   if (m->iup.bits < n)
+   {
+      n -= m->iup.bits;
+      k = n >> 3;
+/*--- bytes = n/8 --*/
+      m->iup.bs_ptr += k;
+      n -= k << 3;
+      m->iup.bitbuf = *m->iup.bs_ptr++;
+      m->iup.bits = 8;
+   }
+   m->iup.bits -= n;
+   m->iup.bitbuf -= (m->iup.bitbuf >> m->iup.bits) << m->iup.bits;
+}
+/*--------------------------------------------------------------*/
+#define mac_load_check(n)                     \
+   if( m->iup.bits < (n) ) {                           \
+          while( m->iup.bits <= 24 ) {               \
+             m->iup.bitbuf = (m->iup.bitbuf << 8) | *m->iup.bs_ptr++;  \
+             m->iup.bits += 8;                       \
+          }                                   \
+   }
+/*--------------------------------------------------------------*/
+#define mac_load(n)                    \
+       ( m->iup.bits -= n,                    \
+         m->iup.bitval = m->iup.bitbuf >> m->iup.bits,      \
+         m->iup.bitbuf -= m->iup.bitval << m->iup.bits,     \
+         m->iup.bitval )
+/*======================================================================*/
+static void unpack_ba(MPEGI *m)
+{
+   int i, j, k;
+   static int nbit[4] =
+   {4, 4, 3, 2};
+   int nstereo;
+   int n;
+
+   m->iup.bit_skip = 0;
+   nstereo = m->iup.stereo_sb;
+   k = 0;
+   for (i = 0; i < 4; i++)
+   {
+      for (j = 0; j < m->iup.nbat[i]; j++, k++)
+      {
+        mac_load_check(4);
+        n = m->iup.ballo[k] = m->iup.samp_dispatch[k] = m->iup.bat[i][mac_load(nbit[i])];
+        if (k >= m->iup.nsb_limit)
+           m->iup.bit_skip += bat_bit_master[m->iup.samp_dispatch[k]];
+        m->iup.c_value[k] = m->iup.look_c_value[n];
+        m->iup.c_shift[k] = m->iup.look_c_shift[n];
+        if (--nstereo < 0)
+        {
+           m->iup.ballo[k + 1] = m->iup.ballo[k];
+           m->iup.samp_dispatch[k] += 18;      /* flag as joint */
+           m->iup.samp_dispatch[k + 1] = m->iup.samp_dispatch[k];      /* flag for sf */
+           m->iup.c_value[k + 1] = m->iup.c_value[k];
+           m->iup.c_shift[k + 1] = m->iup.c_shift[k];
+           k++;
+           j++;
+        }
+      }
+   }
+   m->iup.samp_dispatch[m->iup.nsb_limit] = 37;        /* terminate the dispatcher with skip */
+   m->iup.samp_dispatch[k] = 36;       /* terminate the dispatcher */
+
+}
+/*-------------------------------------------------------------------------*/
+static void unpack_sfs(MPEGI *m)       /* unpack scale factor selectors */
+{
+   int i;
+
+   for (i = 0; i < m->iup.max_sb; i++)
+   {
+      mac_load_check(2);
+      if (m->iup.ballo[i])
+        m->iup.sf_dispatch[i] = mac_load(2);
+      else
+        m->iup.sf_dispatch[i] = 4;     /* no allo */
+   }
+   m->iup.sf_dispatch[i] = 5;          /* terminate dispatcher */
+}
+/*-------------------------------------------------------------------------*/
+/*--- multiply note -------------------------------------------------------*/
+/*--- 16bit x 16bit mult --> 32bit >> 15 --> 16 bit  or better  -----------*/
+static void unpack_sf(MPEGI *m)                /* unpack scale factor */
+{                              /* combine dequant and scale factors */
+   int i, n;
+   INT32 tmp;                  /* only reason tmp is 32 bit is to get 32 bit mult result */
+
+   i = -1;
+ dispatch:switch (m->iup.sf_dispatch[++i])
+   {
+      case 0:                  /* 3 factors 012 */
+        mac_load_check(18);
+        tmp = m->iup.c_value[i];
+        n = m->iup.c_shift[i];
+        m->iup.cs_factor[0][i] = (tmp * m->iup.sf_table[mac_load(6)]) >> n;
+        m->iup.cs_factor[1][i] = (tmp * m->iup.sf_table[mac_load(6)]) >> n;
+        m->iup.cs_factor[2][i] = (tmp * m->iup.sf_table[mac_load(6)]) >> n;
+        goto dispatch;
+      case 1:                  /* 2 factors 002 */
+        mac_load_check(12);
+        tmp = m->iup.c_value[i];
+        n = m->iup.c_shift[i];
+        m->iup.cs_factor[1][i] = m->iup.cs_factor[0][i] =
+           (tmp * m->iup.sf_table[mac_load(6)]) >> n;
+        m->iup.cs_factor[2][i] = (tmp * m->iup.sf_table[mac_load(6)]) >> n;
+        goto dispatch;
+      case 2:                  /* 1 factor 000 */
+        mac_load_check(6);
+        tmp = m->iup.c_value[i];
+        n = m->iup.c_shift[i];
+        m->iup.cs_factor[2][i] = m->iup.cs_factor[1][i] = m->iup.cs_factor[0][i] =
+           (tmp * m->iup.sf_table[mac_load(6)]) >> n;
+        goto dispatch;
+      case 3:                  /* 2 factors 022 */
+        mac_load_check(12);
+        tmp = m->iup.c_value[i];
+        n = m->iup.c_shift[i];
+        m->iup.cs_factor[0][i] = (tmp * m->iup.sf_table[mac_load(6)]) >> n;
+        m->iup.cs_factor[2][i] = m->iup.cs_factor[1][i] =
+           (tmp * m->iup.sf_table[mac_load(6)]) >> n;
+        goto dispatch;
+      case 4:                  /* no allo */
+        goto dispatch;
+      case 5:                  /* all done */
+        ;
+   }                           /* end switch */
+}
+/*-------------------------------------------------------------------------*/
+/*-------------------------------------------------------------------------*/
+/*--- unpack multiply note ------------------------------------------------*/
+/*--- 16bit x 16bit mult --> 32bit  or better required---------------------*/
+#define UNPACK_N(n)                                          \
+    s[k]     =  ((m->iup.cs_factor[i][k]*(load(m,n)-((1 << (n-1)) -1)))>>(n-1));   \
+    s[k+64]  =  ((m->iup.cs_factor[i][k]*(load(m,n)-((1 << (n-1)) -1)))>>(n-1));   \
+    s[k+128] =  ((m->iup.cs_factor[i][k]*(load(m,n)-((1 << (n-1)) -1)))>>(n-1));   \
+    goto dispatch;
+#define UNPACK_N2(n)                                             \
+    mac_load_check(3*n);                                         \
+    s[k]     =  (m->iup.cs_factor[i][k]*(mac_load(n)-((1 << (n-1)) -1)))>>(n-1);   \
+    s[k+64]  =  (m->iup.cs_factor[i][k]*(mac_load(n)-((1 << (n-1)) -1)))>>(n-1);   \
+    s[k+128] =  (m->iup.cs_factor[i][k]*(mac_load(n)-((1 << (n-1)) -1)))>>(n-1);   \
+    goto dispatch;
+#define UNPACK_N3(n)                                             \
+    mac_load_check(2*n);                                         \
+    s[k]     =  (m->iup.cs_factor[i][k]*(mac_load(n)-((1 << (n-1)) -1)))>>(n-1);   \
+    s[k+64]  =  (m->iup.cs_factor[i][k]*(mac_load(n)-((1 << (n-1)) -1)))>>(n-1);   \
+    mac_load_check(n);                                           \
+    s[k+128] =  (m->iup.cs_factor[i][k]*(mac_load(n)-((1 << (n-1)) -1)))>>(n-1);   \
+    goto dispatch;
+#define UNPACKJ_N(n)                                         \
+    tmp        =  (load(m,n)-((1 << (n-1)) -1));                 \
+    s[k]       =  (m->iup.cs_factor[i][k]*tmp)>>(n-1);                       \
+    s[k+1]     =  (m->iup.cs_factor[i][k+1]*tmp)>>(n-1);                     \
+    tmp        =  (load(m,n)-((1 << (n-1)) -1));                 \
+    s[k+64]    =  (m->iup.cs_factor[i][k]*tmp)>>(n-1);                       \
+    s[k+64+1]  =  (m->iup.cs_factor[i][k+1]*tmp)>>(n-1);                     \
+    tmp        =  (load(m,n)-((1 << (n-1)) -1));                 \
+    s[k+128]   =  (m->iup.cs_factor[i][k]*tmp)>>(n-1);                       \
+    s[k+128+1] =  (m->iup.cs_factor[i][k+1]*tmp)>>(n-1);                     \
+    k++;       /* skip right chan dispatch */                \
+    goto dispatch;
+/*-------------------------------------------------------------------------*/
+static void unpack_samp(MPEGI *m)      /* unpack samples */
+{
+   int i, j, k;
+   SAMPLEINT *s;
+   int n;
+   INT32 tmp;
+
+   s = m->iup.sample;
+   for (i = 0; i < 3; i++)
+   {                           /* 3 groups of scale factors */
+      for (j = 0; j < 4; j++)
+      {
+        k = -1;
+       dispatch:switch (m->iup.samp_dispatch[++k])
+        {
+           case 0:
+              s[k + 128] = s[k + 64] = s[k] = 0;
+              goto dispatch;
+           case 1:             /* 3 levels grouped 5 bits */
+              mac_load_check(5);
+              n = mac_load(5);
+              s[k] = ((INT32) m->iup.cs_factor[i][k] * m->iup.group3_table[n][0]) >> 1;
+              s[k + 64] = ((INT32) m->iup.cs_factor[i][k] * m->iup.group3_table[n][1]) >> 1;
+              s[k + 128] = ((INT32) m->iup.cs_factor[i][k] * m->iup.group3_table[n][2]) >> 1;
+              goto dispatch;
+           case 2:             /* 5 levels grouped 7 bits */
+              mac_load_check(7);
+              n = mac_load(7);
+              s[k] = ((INT32) m->iup.cs_factor[i][k] * m->iup.group5_table[n][0]) >> 2;
+              s[k + 64] = ((INT32) m->iup.cs_factor[i][k] * m->iup.group5_table[n][1]) >> 2;
+              s[k + 128] = ((INT32) m->iup.cs_factor[i][k] * m->iup.group5_table[n][2]) >> 2;
+              goto dispatch;
+           case 3:
+              UNPACK_N2(3)     /* 7 levels */
+           case 4:             /* 9 levels grouped 10 bits */
+              mac_load_check(10);
+              n = mac_load(10);
+              s[k] = ((INT32) m->iup.cs_factor[i][k] * m->iup.group9_table[n][0]) >> 3;
+              s[k + 64] = ((INT32) m->iup.cs_factor[i][k] * m->iup.group9_table[n][1]) >> 3;
+              s[k + 128] = ((INT32) m->iup.cs_factor[i][k] * m->iup.group9_table[n][2]) >> 3;
+              goto dispatch;
+           case 5:
+              UNPACK_N2(4)     /* 15 levels */
+           case 6:
+              UNPACK_N2(5)     /* 31 levels */
+           case 7:
+              UNPACK_N2(6)     /* 63 levels */
+           case 8:
+              UNPACK_N2(7)     /* 127 levels */
+           case 9:
+              UNPACK_N2(8)     /* 255 levels */
+           case 10:
+              UNPACK_N3(9)     /* 511 levels */
+           case 11:
+              UNPACK_N3(10)    /* 1023 levels */
+           case 12:
+              UNPACK_N3(11)    /* 2047 levels */
+           case 13:
+              UNPACK_N3(12)    /* 4095 levels */
+           case 14:
+              UNPACK_N(13)     /* 8191 levels */
+           case 15:
+              UNPACK_N(14)     /* 16383 levels */
+           case 16:
+              UNPACK_N(15)     /* 32767 levels */
+           case 17:
+              UNPACK_N(16)     /* 65535 levels */
+/* -- joint ---- */
+           case 18 + 0:
+              s[k + 128 + 1] = s[k + 128] = s[k + 64 + 1] = s[k + 64] = s[k + 1] = s[k] = 0;
+              k++;             /* skip right chan dispatch */
+              goto dispatch;
+           case 18 + 1:        /* 3 levels grouped 5 bits */
+              n = load(m,5);
+              s[k] = ((INT32) m->iup.cs_factor[i][k] * m->iup.group3_table[n][0]) >> 1;
+              s[k + 1] = ((INT32) m->iup.cs_factor[i][k + 1] * m->iup.group3_table[n][0]) >> 1;
+              s[k + 64] = ((INT32) m->iup.cs_factor[i][k] * m->iup.group3_table[n][1]) >> 1;
+              s[k + 64 + 1] = ((INT32) m->iup.cs_factor[i][k + 1] * m->iup.group3_table[n][1]) >> 1;
+              s[k + 128] = ((INT32) m->iup.cs_factor[i][k] * m->iup.group3_table[n][2]) >> 1;
+              s[k + 128 + 1] = ((INT32) m->iup.cs_factor[i][k + 1] * m->iup.group3_table[n][2]) >> 1;
+              k++;             /* skip right chan dispatch */
+              goto dispatch;
+           case 18 + 2:        /* 5 levels grouped 7 bits */
+              n = load(m,7);
+              s[k] = ((INT32) m->iup.cs_factor[i][k] * m->iup.group5_table[n][0]) >> 2;
+              s[k + 1] = ((INT32) m->iup.cs_factor[i][k + 1] * m->iup.group5_table[n][0]) >> 2;
+              s[k + 64] = ((INT32) m->iup.cs_factor[i][k] * m->iup.group5_table[n][1]) >> 2;
+              s[k + 64 + 1] = ((INT32) m->iup.cs_factor[i][k + 1] * m->iup.group5_table[n][1]) >> 2;
+              s[k + 128] = ((INT32) m->iup.cs_factor[i][k] * m->iup.group5_table[n][2]) >> 2;
+              s[k + 128 + 1] = ((INT32) m->iup.cs_factor[i][k + 1] * m->iup.group5_table[n][2]) >> 2;
+              k++;             /* skip right chan dispatch */
+              goto dispatch;
+           case 18 + 3:
+              UNPACKJ_N(3)     /* 7 levels */
+           case 18 + 4:        /* 9 levels grouped 10 bits */
+              n = load(m,10);
+              s[k] = ((INT32) m->iup.cs_factor[i][k] * m->iup.group9_table[n][0]) >> 3;
+              s[k + 1] = ((INT32) m->iup.cs_factor[i][k + 1] * m->iup.group9_table[n][0]) >> 3;
+              s[k + 64] = ((INT32) m->iup.cs_factor[i][k] * m->iup.group9_table[n][1]) >> 3;
+              s[k + 64 + 1] = ((INT32) m->iup.cs_factor[i][k + 1] * m->iup.group9_table[n][1]) >> 3;
+              s[k + 128] = ((INT32) m->iup.cs_factor[i][k] * m->iup.group9_table[n][2]) >> 3;
+              s[k + 128 + 1] = ((INT32) m->iup.cs_factor[i][k + 1] * m->iup.group9_table[n][2]) >> 3;
+              k++;             /* skip right chan dispatch */
+              goto dispatch;
+           case 18 + 5:
+              UNPACKJ_N(4)     /* 15 levels */
+           case 18 + 6:
+              UNPACKJ_N(5)     /* 31 levels */
+           case 18 + 7:
+              UNPACKJ_N(6)     /* 63 levels */
+           case 18 + 8:
+              UNPACKJ_N(7)     /* 127 levels */
+           case 18 + 9:
+              UNPACKJ_N(8)     /* 255 levels */
+           case 18 + 10:
+              UNPACKJ_N(9)     /* 511 levels */
+           case 18 + 11:
+              UNPACKJ_N(10)    /* 1023 levels */
+           case 18 + 12:
+              UNPACKJ_N(11)    /* 2047 levels */
+           case 18 + 13:
+              UNPACKJ_N(12)    /* 4095 levels */
+           case 18 + 14:
+              UNPACKJ_N(13)    /* 8191 levels */
+           case 18 + 15:
+              UNPACKJ_N(14)    /* 16383 levels */
+           case 18 + 16:
+              UNPACKJ_N(15)    /* 32767 levels */
+           case 18 + 17:
+              UNPACKJ_N(16)    /* 65535 levels */
+/* -- end of dispatch -- */
+           case 37:
+              skip(m, m->iup.bit_skip);
+           case 36:
+              s += 3 * 64;
+        }                      /* end switch */
+      }                                /* end j loop */
+   }                           /* end i loop */
+
+
+}
+/*-------------------------------------------------------------------------*/
+static void unpack(MPEGI *m)
+{
+   int prot;
+
+/* at entry bit getter points at id, sync skipped by caller */
+
+   load(m,3);                  /* skip id and option (checked by init) */
+   prot = load(m,1);           /* load prot bit */
+   load(m,6);                  /* skip to pad */
+   m->iup.pad = load(m,1);
+   load(m,1);                  /* skip to mode */
+   m->iup.stereo_sb = look_joint[load(m,4)];
+   if (prot)
+      load(m,4);                       /* skip to data */
+   else
+      load(m,20);                      /* skip crc */
+
+   unpack_ba(m);                       /* unpack bit allocation */
+   unpack_sfs(m);              /* unpack scale factor selectors */
+   unpack_sf(m);                       /* unpack scale factor */
+   unpack_samp(m);             /* unpack samples */
+
+
+}
+/*-------------------------------------------------------------------------*/
+IN_OUT i_audio_decode(MPEGI *m, unsigned char *bs, signed short *pcm)
+{
+   int sync;
+   IN_OUT in_out;
+
+   load_init(m,bs);            /* initialize bit getter */
+/* test sync */
+   in_out.in_bytes = 0;                /* assume fail */
+   in_out.out_bytes = 0;
+   sync = load(m,12);
+
+   if (sync != 0xFFF)
+      return in_out;           /* sync fail */
+/*-----------*/
+   m->iup.unpack_routine();
+
+
+   m->iup.sbt(m->iup.sample, pcm, m->iup.nsbt);
+/*-----------*/
+   in_out.in_bytes = m->iup.framebytes + m->iup.pad;
+   in_out.out_bytes = m->iup.outbytes;
+   return in_out;
+}
+/*-------------------------------------------------------------------------*/
+#include "iupini.c"            /* initialization */
+#include "iupL1.c"             /* Layer 1 */
+/*-------------------------------------------------------------------------*/
diff --git a/codecs/mp3/src/iupL1.c b/codecs/mp3/src/iupL1.c
new file mode 100755 (executable)
index 0000000..041c2a0
--- /dev/null
@@ -0,0 +1,330 @@
+/*____________________________________________________________________________
+       
+       FreeAmp - The Free MP3 Player
+
+        MP3 Decoder originally Copyright (C) 1995-1997 Xing Technology
+        Corp.  http://www.xingtech.com
+
+       Portions Copyright (C) 1998-1999 EMusic.com
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program; if not, write to the Free Software
+       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+       
+       $Id$
+____________________________________________________________________________*/
+
+/****  iupL1.c  ***************************************************
+
+MPEG audio decoder Layer I mpeg1 and mpeg2
+should be portable ANSI C, should be endian independent
+
+icupL1 integer version of cupL1.c
+
+******************************************************************/
+/*======================================================================*/
+/* Read Only */
+static int bat_bit_masterL1[] =
+{
+   0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
+
+/*======================================================================*/
+static void unpack_baL1(MPEGI *m)
+{
+   int k;
+   int nstereo;
+   int n;
+
+   m->iup.bit_skip = 0;
+   nstereo = m->iup.stereo_sb;
+   for (k = 0; k < m->iup.nbatL1; k++)
+   {
+      mac_load_check(4);
+      n = m->iup.ballo[k] = m->iup.samp_dispatch[k] = mac_load(4);
+      if (k >= m->iup.nsb_limit)
+        m->iup.bit_skip += bat_bit_masterL1[m->iup.samp_dispatch[k]];
+      m->iup.c_value[k] = m->iup.look_c_valueL1[n];
+      m->iup.c_shift[k] = m->iup.look_c_shiftL1[n];
+      if (--nstereo < 0)
+      {
+        m->iup.ballo[k + 1] = m->iup.ballo[k];
+        m->iup.samp_dispatch[k] += 15; /* flag as joint */
+        m->iup.samp_dispatch[k + 1] = m->iup.samp_dispatch[k]; /* flag for sf */
+        m->iup.c_value[k + 1] = m->iup.c_value[k];
+        m->iup.c_shift[k + 1] = m->iup.c_shift[k];
+        k++;
+      }
+   }
+   m->iup.samp_dispatch[m->iup.nsb_limit] = 31;        /* terminate the dispatcher with skip */
+   m->iup.samp_dispatch[k] = 30;       /* terminate the dispatcher */
+
+}
+/*-------------------------------------------------------------------------*/
+static void unpack_sfL1(MPEGI *m)      /* unpack scale factor */
+{                              /* combine dequant and scale factors */
+   int i, n;
+   INT32 tmp;                  /* only reason tmp is 32 bit is to get 32 bit mult result */
+
+   for (i = 0; i < m->iup.nbatL1; i++)
+   {
+      if (m->iup.ballo[i])
+      {
+        mac_load_check(6);
+        tmp = m->iup.c_value[i];
+        n = m->iup.c_shift[i];
+        m->iup.cs_factorL1[i] = (tmp * m->iup.sf_table[mac_load(6)]) >> n;
+      }
+   }
+
+/*-- done --*/
+}
+/*-------------------------------------------------------------------------*/
+#define UNPACKL1_N(n)  s[k]     =  (m->iup.cs_factorL1[k]*(load(m,n)-((1 << (n-1)) -1)))>>(n-1);   \
+    goto dispatch;
+#define UNPACKL1J_N(n) tmp        =  (load(m,n)-((1 << (n-1)) -1));                 \
+    s[k]       =  (m->iup.cs_factorL1[k]*tmp)>>(n-1);               \
+    s[k+1]     =  (m->iup.cs_factorL1[k+1]*tmp)>>(n-1);             \
+    k++;       /* skip right chan dispatch */                \
+    goto dispatch;
+/*-------------------------------------------------------------------------*/
+static void unpack_sampL1(MPEGI *m)    /* unpack samples */
+{
+   int j, k;
+   SAMPLEINT *s;
+   INT32 tmp;
+
+   s = m->iup.sample;
+   for (j = 0; j < 12; j++)
+   {
+      k = -1;
+    dispatch:switch (m->iup.samp_dispatch[++k])
+      {
+        case 0:
+           s[k] = 0;
+           goto dispatch;
+        case 1:
+           UNPACKL1_N(2)       /*  3 levels */
+        case 2:
+           UNPACKL1_N(3)       /*  7 levels */
+        case 3:
+           UNPACKL1_N(4)       /* 15 levels */
+        case 4:
+           UNPACKL1_N(5)       /* 31 levels */
+        case 5:
+           UNPACKL1_N(6)       /* 63 levels */
+        case 6:
+           UNPACKL1_N(7)       /* 127 levels */
+        case 7:
+           UNPACKL1_N(8)       /* 255 levels */
+        case 8:
+           UNPACKL1_N(9)       /* 511 levels */
+        case 9:
+           UNPACKL1_N(10)      /* 1023 levels */
+        case 10:
+           UNPACKL1_N(11)      /* 2047 levels */
+        case 11:
+           UNPACKL1_N(12)      /* 4095 levels */
+        case 12:
+           UNPACKL1_N(13)      /* 8191 levels */
+        case 13:
+           UNPACKL1_N(14)      /* 16383 levels */
+        case 14:
+           UNPACKL1_N(15)      /* 32767 levels */
+/* -- joint ---- */
+        case 15 + 0:
+           s[k + 1] = s[k] = 0;
+           k++;                /* skip right chan dispatch */
+           goto dispatch;
+/* -- joint ---- */
+        case 15 + 1:
+           UNPACKL1J_N(2)      /*  3 levels */
+        case 15 + 2:
+           UNPACKL1J_N(3)      /*  7 levels */
+        case 15 + 3:
+           UNPACKL1J_N(4)      /* 15 levels */
+        case 15 + 4:
+           UNPACKL1J_N(5)      /* 31 levels */
+        case 15 + 5:
+           UNPACKL1J_N(6)      /* 63 levels */
+        case 15 + 6:
+           UNPACKL1J_N(7)      /* 127 levels */
+        case 15 + 7:
+           UNPACKL1J_N(8)      /* 255 levels */
+        case 15 + 8:
+           UNPACKL1J_N(9)      /* 511 levels */
+        case 15 + 9:
+           UNPACKL1J_N(10)     /* 1023 levels */
+        case 15 + 10:
+           UNPACKL1J_N(11)     /* 2047 levels */
+        case 15 + 11:
+           UNPACKL1J_N(12)     /* 4095 levels */
+        case 15 + 12:
+           UNPACKL1J_N(13)     /* 8191 levels */
+        case 15 + 13:
+           UNPACKL1J_N(14)     /* 16383 levels */
+        case 15 + 14:
+           UNPACKL1J_N(15)     /* 32767 levels */
+
+/* -- end of dispatch -- */
+        case 31:
+           skip(m, m->iup.bit_skip);
+        case 30:
+           s += 64;
+      }                                /* end switch */
+   }                           /* end j loop */
+
+/*-- done --*/
+}
+/*-------------------------------------------------------------------------*/
+static void unpackL1(MPEGI *m)
+{
+   int prot;
+
+/* at entry bit getter points at id, sync skipped by caller */
+
+   load(m,3);                  /* skip id and option (checked by init) */
+   prot = load(m,1);           /* load prot bit */
+   load(m,6);                  /* skip to pad */
+   m->iup.pad = load(m,1) << 2;
+   load(m,1);                  /* skip to mode */
+   m->iup.stereo_sb = look_joint[load(m,4)];
+   if (prot)
+      load(m,4);                       /* skip to data */
+   else
+      load(m,20);                      /* skip crc */
+
+   unpack_baL1(m);             /* unpack bit allocation */
+   unpack_sfL1(m);             /* unpack scale factor */
+   unpack_sampL1(m);           /* unpack samples */
+
+
+}
+/*-------------------------------------------------------------------------*/
+
+#ifdef _MSC_VER
+#pragma warning(disable: 4056)
+#endif
+
+int i_audio_decode_initL1(MPEGI *m, MPEG_HEAD * h, int framebytes_arg,
+                  int reduction_code, int transform_code, int convert_code,
+                         int freq_limit)
+{
+   int i, k;
+   long samprate;
+   int limit;
+   int stepbit;
+   long step;
+   int bit_code;
+
+/*--- sf table built by Layer II init ---*/
+
+   if (m->iup.first_pass_L1)
+   {
+      stepbit = 2;
+      step = 4;
+      for (i = 1; i < 16; i++)
+      {
+        m->iup.look_c_valueL1[i] = (int) (32768.0 * 2.0 / (step - 1));
+        m->iup.look_c_shiftL1[i] = 16 - stepbit;
+        stepbit++;
+        step <<= 1;
+      }
+      m->iup.first_pass_L1 = 0;
+   }
+
+   m->iup.unpack_routine = unpackL1;
+
+
+   transform_code = transform_code;    /* not used, asm compatability */
+   bit_code = 0;
+   if (convert_code & 8)
+      bit_code = 1;
+   convert_code = convert_code & 3;    /* higher bits used by dec8 freq cvt */
+   if (reduction_code < 0)
+      reduction_code = 0;
+   if (reduction_code > 2)
+      reduction_code = 2;
+   if (freq_limit < 1000)
+      freq_limit = 1000;
+
+
+   m->iup.framebytes = framebytes_arg;
+/* check if code handles */
+   if (h->option != 3)
+      return 0;                        /* layer I only */
+
+   m->iup.nbatL1 = 32;
+   m->iup.max_sb = m->iup.nbatL1;
+/*----- compute nsb_limit --------*/
+   samprate = sr_table[4 * h->id + h->sr_index];
+   m->iup.nsb_limit = (freq_limit * 64L + samprate / 2) / samprate;
+/*- caller limit -*/
+/*---- limit = 0.94*(32>>reduction_code);  ----*/
+   limit = (32 >> reduction_code);
+   if (limit > 8)
+      limit--;
+   if (m->iup.nsb_limit > limit)
+      m->iup.nsb_limit = limit;
+   if (m->iup.nsb_limit > m->iup.max_sb)
+      m->iup.nsb_limit = m->iup.max_sb;
+
+   m->iup.outvalues = 384 >> reduction_code;
+   if (h->mode != 3)
+   {                           /* adjust for 2 channel modes */
+      m->iup.nbatL1 *= 2;
+      m->iup.max_sb *= 2;
+      m->iup.nsb_limit *= 2;
+   }
+
+/* set sbt function */
+   m->iup.nsbt = 12;
+   k = 1 + convert_code;
+   if (h->mode == 3)
+   {
+      k = 0;
+   }
+   m->iup.sbt = sbt_table[bit_code][reduction_code][k];
+   m->iup.outvalues *= out_chans[k];
+   if (bit_code != 0)
+      m->iup.outbytes = m->iup.outvalues;
+   else
+      m->iup.outbytes = sizeof(short) * m->iup.outvalues;
+
+   m->iup.decinfo.channels = out_chans[k];
+   m->iup.decinfo.outvalues = m->iup.outvalues;
+   m->iup.decinfo.samprate = samprate >> reduction_code;
+   if (bit_code != 0)
+      m->iup.decinfo.bits = 8;
+   else
+      m->iup.decinfo.bits = sizeof(short) * 8;
+
+   m->iup.decinfo.framebytes = m->iup.framebytes;
+   m->iup.decinfo.type = 0;
+
+
+/* clear sample buffer, unused sub bands must be 0 */
+   for (i = 0; i < 768; i++)
+      m->iup.sample[i] = 0;
+
+
+/* init sub-band transform */
+   i_sbt_init();
+
+   return 1;
+}
+
+#ifdef _MSC_VER
+#pragma warning(default: 4056)
+#endif
+
+/*---------------------------------------------------------*/
diff --git a/codecs/mp3/src/iupini.c b/codecs/mp3/src/iupini.c
new file mode 100755 (executable)
index 0000000..83d5793
--- /dev/null
@@ -0,0 +1,389 @@
+/*____________________________________________________________________________
+       
+       FreeAmp - The Free MP3 Player
+
+        MP3 Decoder originally Copyright (C) 1995-1997 Xing Technology
+        Corp.  http://www.xingtech.com
+
+       Portions Copyright (C) 1998-1999 EMusic.com
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program; if not, write to the Free Software
+       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+       
+       $Id$
+____________________________________________________________________________*/
+
+/*=========================================================
+ initialization for iup.c - include to iup.c
+ mpeg audio decoder portable "c"      integer
+
+
+mods 11/15/95 for Layer I
+
+mods 1/8/97 warnings
+
+=========================================================*/
+#include <limits.h>
+
+/* Read only */
+static long steps[18] =
+{
+   0, 3, 5, 7, 9, 15, 31, 63, 127,
+   255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535};
+
+/* Read only */
+static int stepbits[18] =
+{
+   0, 2, 3, 3, 4, 4, 5, 6, 7,
+   8, 9, 10, 11, 12, 13, 14, 15, 16};
+
+/* ABCD_INDEX = lookqt[mode][sr_index][br_index]  */
+/* -1 = invalid  */
+/* Read only */
+static signed char lookqt[4][3][16] =
+{
+ {{1, -1, -1, -1, 2, -1, 2, 0, 0, 0, 1, 1, 1, 1, 1, -1},       /*  44ks stereo */
+  {0, -1, -1, -1, 2, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, -1},       /*  48ks */
+  {1, -1, -1, -1, 3, -1, 3, 0, 0, 0, 1, 1, 1, 1, 1, -1}},      /*  32ks */
+ {{1, -1, -1, -1, 2, -1, 2, 0, 0, 0, 1, 1, 1, 1, 1, -1},       /*  44ks joint stereo */
+  {0, -1, -1, -1, 2, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, -1},       /*  48ks */
+  {1, -1, -1, -1, 3, -1, 3, 0, 0, 0, 1, 1, 1, 1, 1, -1}},      /*  32ks */
+ {{1, -1, -1, -1, 2, -1, 2, 0, 0, 0, 1, 1, 1, 1, 1, -1},       /*  44ks dual chan */
+  {0, -1, -1, -1, 2, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, -1},       /*  48ks */
+  {1, -1, -1, -1, 3, -1, 3, 0, 0, 0, 1, 1, 1, 1, 1, -1}},      /*  32ks */
+ {{1, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1},       /*  44ks single chan */
+  {0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1},       /*  48ks */
+  {1, 3, 3, 0, 0, 0, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1}},      /*  32ks */
+};
+
+/* Read only */
+static long sr_table[8] =
+{22050L, 24000L, 16000L, 1L,
+ 44100L, 48000L, 32000L, 1L};
+
+/* bit allocation table look up */
+/* table per mpeg spec tables 3b2a/b/c/d  /e is mpeg2 */
+/* look_bat[abcd_index][4][16]  */
+/* Read only */
+static unsigned char look_bat[5][4][16] =
+{
+/* LOOK_BATA */
+ {{0, 1, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17},
+  {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17},
+  {0, 1, 2, 3, 4, 5, 6, 17, 0, 0, 0, 0, 0, 0, 0, 0},
+  {0, 1, 2, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+/* LOOK_BATB */
+ {{0, 1, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17},
+  {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17},
+  {0, 1, 2, 3, 4, 5, 6, 17, 0, 0, 0, 0, 0, 0, 0, 0},
+  {0, 1, 2, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+/* LOOK_BATC */
+ {{0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16},
+  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+  {0, 1, 2, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0},
+  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+/* LOOK_BATD */
+ {{0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16},
+  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+  {0, 1, 2, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0},
+  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+/* LOOK_BATE */
+ {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},
+  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+  {0, 1, 2, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0},
+  {0, 1, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+};
+
+/* look_nbat[abcd_index]][4] */
+/* Read only */
+static unsigned char look_nbat[5][4] =
+{
+  {3, 8, 12, 4},
+  {3, 8, 12, 7},
+  {2, 0, 6, 0},
+  {2, 0, 10, 0},
+  {4, 0, 7, 19},
+};
+
+
+void i_sbt_mono(SAMPLEINT * sample, short *pcm, int n);
+void i_sbt_dual(SAMPLEINT * sample, short *pcm, int n);
+void i_sbt_dual_mono(SAMPLEINT * sample, short *pcm, int n);
+void i_sbt_dual_left(SAMPLEINT * sample, short *pcm, int n);
+void i_sbt_dual_right(SAMPLEINT * sample, short *pcm, int n);
+void i_sbt16_mono(SAMPLEINT * sample, short *pcm, int n);
+void i_sbt16_dual(SAMPLEINT * sample, short *pcm, int n);
+void i_sbt16_dual_mono(SAMPLEINT * sample, short *pcm, int n);
+void i_sbt16_dual_left(SAMPLEINT * sample, short *pcm, int n);
+void i_sbt16_dual_right(SAMPLEINT * sample, short *pcm, int n);
+void i_sbt8_mono(SAMPLEINT * sample, short *pcm, int n);
+void i_sbt8_dual(SAMPLEINT * sample, short *pcm, int n);
+void i_sbt8_dual_mono(SAMPLEINT * sample, short *pcm, int n);
+void i_sbt8_dual_left(SAMPLEINT * sample, short *pcm, int n);
+void i_sbt8_dual_right(SAMPLEINT * sample, short *pcm, int n);
+
+/*--- 8 bit output ---*/
+void i_sbtB_mono(SAMPLEINT * sample, unsigned char *pcm, int n);
+void i_sbtB_dual(SAMPLEINT * sample, unsigned char *pcm, int n);
+void i_sbtB_dual_mono(SAMPLEINT * sample, unsigned char *pcm, int n);
+void i_sbtB_dual_left(SAMPLEINT * sample, unsigned char *pcm, int n);
+void i_sbtB_dual_right(SAMPLEINT * sample, unsigned char *pcm, int n);
+void i_sbtB16_mono(SAMPLEINT * sample, unsigned char *pcm, int n);
+void i_sbtB16_dual(SAMPLEINT * sample, unsigned char *pcm, int n);
+void i_sbtB16_dual_mono(SAMPLEINT * sample, unsigned char *pcm, int n);
+void i_sbtB16_dual_left(SAMPLEINT * sample, unsigned char *pcm, int n);
+void i_sbtB16_dual_right(SAMPLEINT * sample, unsigned char *pcm, int n);
+void i_sbtB8_mono(SAMPLEINT * sample, unsigned char *pcm, int n);
+void i_sbtB8_dual(SAMPLEINT * sample, unsigned char *pcm, int n);
+void i_sbtB8_dual_mono(SAMPLEINT * sample, unsigned char *pcm, int n);
+void i_sbtB8_dual_left(SAMPLEINT * sample, unsigned char *pcm, int n);
+void i_sbtB8_dual_right(SAMPLEINT * sample, unsigned char *pcm, int n);
+
+
+/* Read Only */
+static SBT_FUNCTION sbt_table[2][3][5] =
+{
+ {{i_sbt_mono, i_sbt_dual, i_sbt_dual_mono, i_sbt_dual_left, i_sbt_dual_right},
+  {i_sbt16_mono, i_sbt16_dual, i_sbt16_dual_mono, i_sbt16_dual_left, i_sbt16_dual_right},
+  {i_sbt8_mono, i_sbt8_dual, i_sbt8_dual_mono, i_sbt8_dual_left, i_sbt8_dual_right}},
+
+ {{(SBT_FUNCTION) i_sbtB_mono,
+   (SBT_FUNCTION) i_sbtB_dual,
+   (SBT_FUNCTION) i_sbtB_dual_mono,
+   (SBT_FUNCTION) i_sbtB_dual_left,
+   (SBT_FUNCTION) i_sbtB_dual_right},
+  {(SBT_FUNCTION) i_sbtB16_mono,
+   (SBT_FUNCTION) i_sbtB16_dual,
+   (SBT_FUNCTION) i_sbtB16_dual_mono,
+   (SBT_FUNCTION) i_sbtB16_dual_left,
+   (SBT_FUNCTION) i_sbtB16_dual_right},
+  {(SBT_FUNCTION) i_sbtB8_mono,
+   (SBT_FUNCTION) i_sbtB8_dual,
+   (SBT_FUNCTION) i_sbtB8_dual_mono,
+   (SBT_FUNCTION) i_sbtB8_dual_left,
+   (SBT_FUNCTION) i_sbtB8_dual_right}},
+};
+/* Read Only */
+static int out_chans[5] =
+{1, 2, 1, 1, 1};
+
+/*---------------------------------------------------------*/
+
+#ifdef _MSC_VER
+#pragma warning(disable: 4056)
+#endif
+
+void i_mpeg_init(MPEGI *m)
+{
+       memset(&m->iup, 0, sizeof(m->iup));
+       m->iup.nsb_limit = 6;
+       m->iup.nbat[0] = 3;
+       m->iup.nbat[1] = 8;
+       m->iup.nbat[3] = 12;
+       m->iup.nbat[4] = 7;
+       m->iup.nsbt = 36;
+       m->iup.sbt = i_sbt_mono;
+       m->iup.unpack_routine = unpack;
+       m->iup.first_pass = 1;
+       m->iup.first_pass_L1 = 1;
+       m->iup.nbatL1 = 32;
+       m->iup.cs_factorL1 = m->iup.cs_factor[0];
+}
+
+static void table_init(MPEGI *m)
+{
+   int i, j;
+   int code;
+   int bits;
+   long tmp, sfmax;
+
+/*--  c_values (dequant) --*/
+   for (i = 1; i < 18; i++)
+      m->iup.look_c_value[i] = (int) (32768.0 * 2.0 / steps[i]);
+   for (i = 1; i < 18; i++)
+      m->iup.look_c_shift[i] = 16 - stepbits[i];
+
+/*--  scale factor table, scale by 32768 for 16 pcm output  --*/
+   bits = min(8 * sizeof(SAMPLEINT), 8 * sizeof(m->iup.sf_table[0]));
+   tmp = 1L << (bits - 2);
+   sfmax = tmp + (tmp - 1);
+   for (i = 0; i < 64; i++)
+   {
+      tmp = (long) (32768.0 * 2.0 * pow(2.0, -i / 3.0));
+      if (tmp > sfmax)
+        tmp = sfmax;
+      m->iup.sf_table[i] = tmp;
+   }
+/*--  grouped 3 level lookup table 5 bit token --*/
+   for (i = 0; i < 32; i++)
+   {
+      code = i;
+      for (j = 0; j < 3; j++)
+      {
+        m->iup.group3_table[i][j] = (char) ((code % 3) - 1);
+        code /= 3;
+      }
+   }
+/*--  grouped 5 level lookup table 7 bit token --*/
+   for (i = 0; i < 128; i++)
+   {
+      code = i;
+      for (j = 0; j < 3; j++)
+      {
+        m->iup.group5_table[i][j] = (char) ((code % 5) - 2);
+        code /= 5;
+      }
+   }
+/*--  grouped 9 level lookup table 10 bit token --*/
+   for (i = 0; i < 1024; i++)
+   {
+      code = i;
+      for (j = 0; j < 3; j++)
+      {
+        m->iup.group9_table[i][j] = (short) ((code % 9) - 4);
+        code /= 9;
+      }
+   }
+
+
+}
+
+#ifdef _MSC_VER
+#pragma warning(default: 4056)
+#endif
+
+/*---------------------------------------------------------*/
+int i_audio_decode_initL1(MPEGI *m, MPEG_HEAD * h, int framebytes_arg,
+                  int reduction_code, int transform_code, int convert_code,
+                         int freq_limit);
+void i_sbt_init();
+
+/*---------------------------------------------------------*/
+/* mpeg_head defined in mhead.h  frame bytes is without pad */
+int i_audio_decode_init(MPEGI *m, MPEG_HEAD * h, int framebytes_arg,
+                  int reduction_code, int transform_code, int convert_code,
+                       int freq_limit)
+{
+   int i, j, k;
+   int abcd_index;
+   long samprate;
+   int limit;
+   int bit_code;
+
+   if (m->iup.first_pass)
+   {
+      table_init(m);
+      m->iup.first_pass = 0;
+   }
+
+/* check if code handles */
+   if (h->option == 3)         /* layer I */
+      return i_audio_decode_initL1(m, h, framebytes_arg,
+                 reduction_code, transform_code, convert_code, freq_limit);
+   if (h->option != 2)
+      return 0;                        /* layer II only */
+
+
+   m->iup.unpack_routine = unpack;
+
+   transform_code = transform_code;    /* not used, asm compatability */
+   bit_code = 0;
+   if (convert_code & 8)
+      bit_code = 1;
+   convert_code = convert_code & 3;    /* higher bits used by dec8 freq cvt */
+   if (reduction_code < 0)
+      reduction_code = 0;
+   if (reduction_code > 2)
+      reduction_code = 2;
+   if (freq_limit < 1000)
+      freq_limit = 1000;
+
+
+   m->iup.framebytes = framebytes_arg;
+
+/* compute abcd index for bit allo table selection */
+   if (h->id)                  /* mpeg 1 */
+      abcd_index = lookqt[h->mode][h->sr_index][h->br_index];
+   else
+      abcd_index = 4;          /* mpeg 2 */
+   for (i = 0; i < 4; i++)
+      for (j = 0; j < 16; j++)
+        m->iup.bat[i][j] = look_bat[abcd_index][i][j];
+   for (i = 0; i < 4; i++)
+      m->iup.nbat[i] = look_nbat[abcd_index][i];
+   m->iup.max_sb = m->iup.nbat[0] + m->iup.nbat[1] + m->iup.nbat[2] + m->iup.nbat[3];
+/*----- compute nsb_limit --------*/
+   samprate = sr_table[4 * h->id + h->sr_index];
+   m->iup.nsb_limit = (freq_limit * 64L + samprate / 2) / samprate;
+/*- caller limit -*/
+/*---- limit = 0.94*(32>>reduction_code);  ----*/
+   limit = (32 >> reduction_code);
+   if (limit > 8)
+      limit--;
+   if (m->iup.nsb_limit > limit)
+      m->iup.nsb_limit = limit;
+   if (m->iup.nsb_limit > m->iup.max_sb)
+      m->iup.nsb_limit = m->iup.max_sb;
+
+   m->iup.outvalues = 1152 >> reduction_code;
+   if (h->mode != 3)
+   {                           /* adjust for 2 channel modes */
+      for (i = 0; i < 4; i++)
+         m->iup.nbat[i] *= 2;
+      m->iup.max_sb *= 2;
+      m->iup.nsb_limit *= 2;
+   }
+
+/* set sbt function */
+   m->iup.nsbt = 36;
+   k = 1 + convert_code;
+   if (h->mode == 3)
+   {
+      k = 0;
+   }
+   m->iup.sbt = sbt_table[bit_code][reduction_code][k];
+   m->iup.outvalues *= out_chans[k];
+   if (bit_code != 0)
+      m->iup.outbytes = m->iup.outvalues;
+   else
+      m->iup.outbytes = sizeof(short) * m->iup.outvalues;
+
+   m->iup.decinfo.channels = out_chans[k];
+   m->iup.decinfo.outvalues = m->iup.outvalues;
+   m->iup.decinfo.samprate = samprate >> reduction_code;
+   if (bit_code != 0)
+      m->iup.decinfo.bits = 8;
+   else
+      m->iup.decinfo.bits = sizeof(short) * 8;
+
+   m->iup.decinfo.framebytes = m->iup.framebytes;
+   m->iup.decinfo.type = 0;
+
+
+/* clear sample buffer, unused sub bands must be 0 */
+   for (i = 0; i < 2304; i++)
+      m->iup.sample[i] = 0;
+
+
+/* init sub-band transform */
+   i_sbt_init();
+
+   return 1;
+}
+/*---------------------------------------------------------*/
+void i_audio_decode_info(MPEGI *m, DEC_INFO * info)
+{
+   *info = m->iup.decinfo;             /* info return, call after init */
+}
+/*---------------------------------------------------------*/
diff --git a/codecs/mp3/src/iwinQ.c b/codecs/mp3/src/iwinQ.c
new file mode 100755 (executable)
index 0000000..fae859b
--- /dev/null
@@ -0,0 +1,712 @@
+/*____________________________________________________________________________
+       
+       FreeAmp - The Free MP3 Player
+
+        MP3 Decoder originally Copyright (C) 1995-1997 Xing Technology
+        Corp.  http://www.xingtech.com
+
+       Portions Copyright (C) 1998 Emusic.com
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program; if not, write to the Free Software
+       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+       
+       $Id$
+____________________________________________________________________________*/
+
+/*----- iwinq.c ---------------------------------------------------
+
+portable c
+mpeg1/2 Layer II audio decode
+
+conditional include to iwinm.c
+
+quick integer window
+
+mods 1/8/97 warnings
+
+--------------------------------------------------------------*/
+/*--------------------------------------------------------------------*/
+void i_window(WININT * vbuf, int vb_ptr, short *pcm)
+{
+   int i, j;
+   unsigned int si, bx;
+   WINCOEF *coef;
+   INT32 sum;
+
+/*-- first 16 --*/
+   si = (vb_ptr + (16 + 3 * 64)) & 511;
+   bx = (si + (32 + 512 - 3 * 64 + 2 * 64)) & 511;
+   coef = iwincoef;
+   for (i = 0; i < 16; i++)
+   {
+      sum = -WINMULT(vbuf[bx], (*coef++));
+      for (j = 0; j < 3; j++)
+      {
+        bx = (bx + 64) & 511;
+        sum += WINMULT(vbuf[si], (*coef++));
+        si = (si + 64) & 511;
+        sum -= WINMULT(vbuf[bx], (*coef++));
+      }
+      si = (si + (5 * 64 + 1)) & 511;
+      bx = (bx + (64 + 4 * 64 - 1)) & 511;
+      sum >>= WINBITS;
+      if (sum > 32767)
+        sum = 32767;
+      else if (sum < -32768)
+        sum = -32768;
+      *pcm++ = (short) sum;
+   }
+/*--  special case --*/
+   bx = (bx + (512 - 64)) & 511;
+   sum = WINMULT(vbuf[bx], (*coef++));
+   for (j = 0; j < 3; j++)
+   {
+      bx = (bx + 64) & 511;
+      sum += WINMULT(vbuf[bx], (*coef++));
+   }
+   sum >>= WINBITS;
+   if (sum > 32767)
+      sum = 32767;
+   else if (sum < -32768)
+      sum = -32768;
+   *pcm++ = (short) sum;
+
+/*-- last 15 --*/
+   coef = iwincoef + 111;      /* back pass through coefs */
+   si = (si + (512 - 3 * 64 + 2 * 64 - 1)) & 511;
+   bx = (bx + (64 + 3 * 64 + 2 * 64 + 1)) & 511;
+   for (i = 0; i < 15; i++)
+   {
+      sum = WINMULT(vbuf[si], (*coef--));
+      for (j = 0; j < 3; j++)
+      {
+        si = (si + 64) & 511;
+        sum += WINMULT(vbuf[bx], (*coef--));
+        bx = (bx + 64) & 511;
+        sum += WINMULT(vbuf[si], (*coef--));
+      }
+      si = (si + (64 - 1 + 4 * 64)) & 511;
+      bx = (bx + (5 * 64 + 1)) & 511;
+      sum >>= WINBITS;
+      if (sum > 32767)
+        sum = 32767;
+      else if (sum < -32768)
+        sum = -32768;
+      *pcm++ = (short) sum;
+   }
+}
+/*------------------------------------------------------------*/
+void i_window_dual(WININT * vbuf, int vb_ptr, short *pcm)
+{
+/* dual window interleaves output */
+   int i, j;
+   unsigned int si, bx;
+   WINCOEF *coef;
+   INT32 sum;
+
+/*-- first 16 --*/
+   si = (vb_ptr + (16 + 3 * 64)) & 511;
+   bx = (si + (32 + 512 - 3 * 64 + 2 * 64)) & 511;
+   coef = iwincoef;
+   for (i = 0; i < 16; i++)
+   {
+      sum = -WINMULT(vbuf[bx], (*coef++));
+      for (j = 0; j < 3; j++)
+      {
+        bx = (bx + 64) & 511;
+        sum += WINMULT(vbuf[si], (*coef++));
+        si = (si + 64) & 511;
+        sum -= WINMULT(vbuf[bx], (*coef++));
+      }
+      si = (si + (5 * 64 + 1)) & 511;
+      bx = (bx + (64 + 4 * 64 - 1)) & 511;
+      sum >>= WINBITS;
+      if (sum > 32767)
+        sum = 32767;
+      else if (sum < -32768)
+        sum = -32768;
+      *pcm = (short) sum;
+      pcm += 2;
+   }
+/*--  special case --*/
+   bx = (bx + (512 - 64)) & 511;
+   sum = WINMULT(vbuf[bx], (*coef++));
+   for (j = 0; j < 3; j++)
+   {
+      bx = (bx + 64) & 511;
+      sum += WINMULT(vbuf[bx], (*coef++));
+   }
+   sum >>= WINBITS;
+   if (sum > 32767)
+      sum = 32767;
+   else if (sum < -32768)
+      sum = -32768;
+   *pcm = (short) sum;
+   pcm += 2;
+
+/*-- last 15 --*/
+   coef = iwincoef + 111;      /* back pass through coefs */
+   si = (si + (512 - 3 * 64 + 2 * 64 - 1)) & 511;
+   bx = (bx + (64 + 3 * 64 + 2 * 64 + 1)) & 511;
+   for (i = 0; i < 15; i++)
+   {
+      sum = WINMULT(vbuf[si], (*coef--));
+      for (j = 0; j < 3; j++)
+      {
+        si = (si + 64) & 511;
+        sum += WINMULT(vbuf[bx], (*coef--));
+        bx = (bx + 64) & 511;
+        sum += WINMULT(vbuf[si], (*coef--));
+      }
+      si = (si + (64 - 1 + 4 * 64)) & 511;
+      bx = (bx + (5 * 64 + 1)) & 511;
+      sum >>= WINBITS;
+      if (sum > 32767)
+        sum = 32767;
+      else if (sum < -32768)
+        sum = -32768;
+      *pcm = (short) sum;
+      pcm += 2;
+   }
+}
+/*------------------------------------------------------------*/
+void i_window_dual_right(WININT * vbuf, int vb_ptr, short *pcm)
+{
+/* right identical to dual, for asm  */
+/* dual window interleaves output */
+   int i, j;
+   unsigned int si, bx;
+   WINCOEF *coef;
+   INT32 sum;
+
+/*-- first 16 --*/
+   si = (vb_ptr + (16 + 3 * 64)) & 511;
+   bx = (si + (32 + 512 - 3 * 64 + 2 * 64)) & 511;
+   coef = iwincoef;
+   for (i = 0; i < 16; i++)
+   {
+      sum = -WINMULT(vbuf[bx], (*coef++));
+      for (j = 0; j < 3; j++)
+      {
+        bx = (bx + 64) & 511;
+        sum += WINMULT(vbuf[si], (*coef++));
+        si = (si + 64) & 511;
+        sum -= WINMULT(vbuf[bx], (*coef++));
+      }
+      si = (si + (5 * 64 + 1)) & 511;
+      bx = (bx + (64 + 4 * 64 - 1)) & 511;
+      sum >>= WINBITS;
+      if (sum > 32767)
+        sum = 32767;
+      else if (sum < -32768)
+        sum = -32768;
+      *pcm = (short) sum;
+      pcm += 2;
+   }
+/*--  special case --*/
+   bx = (bx + (512 - 64)) & 511;
+   sum = WINMULT(vbuf[bx], (*coef++));
+   for (j = 0; j < 3; j++)
+   {
+      bx = (bx + 64) & 511;
+      sum += WINMULT(vbuf[bx], (*coef++));
+   }
+   sum >>= WINBITS;
+   if (sum > 32767)
+      sum = 32767;
+   else if (sum < -32768)
+      sum = -32768;
+   *pcm = (short) sum;
+   pcm += 2;
+
+/*-- last 15 --*/
+   coef = iwincoef + 111;      /* back pass through coefs */
+   si = (si + (512 - 3 * 64 + 2 * 64 - 1)) & 511;
+   bx = (bx + (64 + 3 * 64 + 2 * 64 + 1)) & 511;
+   for (i = 0; i < 15; i++)
+   {
+      sum = WINMULT(vbuf[si], (*coef--));
+      for (j = 0; j < 3; j++)
+      {
+        si = (si + 64) & 511;
+        sum += WINMULT(vbuf[bx], (*coef--));
+        bx = (bx + 64) & 511;
+        sum += WINMULT(vbuf[si], (*coef--));
+      }
+      si = (si + (64 - 1 + 4 * 64)) & 511;
+      bx = (bx + (5 * 64 + 1)) & 511;
+      sum >>= WINBITS;
+      if (sum > 32767)
+        sum = 32767;
+      else if (sum < -32768)
+        sum = -32768;
+      *pcm = (short) sum;
+      pcm += 2;
+   }
+}
+/*------------------------------------------------------------*/
+/*------------------------------------------------------------*/
+/*------------------- 16 pt window ------------------------------*/
+void i_window16(WININT * vbuf, int vb_ptr, short *pcm)
+{
+   int i, j;
+   unsigned char si, bx;
+   WINCOEF *coef;
+   INT32 sum;
+
+
+/*-- first 8 --*/
+   si = (unsigned char) (vb_ptr + 8 + 3 * 32);
+   bx = (unsigned char) (si + (16 + 256 - 3 * 32 + 2 * 32));
+   coef = iwincoef;
+   for (i = 0; i < 8; i++)
+   {
+      sum = -WINMULT(vbuf[bx], (*coef++));
+      for (j = 0; j < 3; j++)
+      {
+        bx += 32;
+        sum += WINMULT(vbuf[si], (*coef++));
+        si += 32;
+        sum -= WINMULT(vbuf[bx], (*coef++));
+      }
+      si += (5 * 32 + 1);
+      bx += (32 + 4 * 32 - 1);
+      coef += 7;
+      sum >>= WINBITS;
+      if (sum > 32767)
+        sum = 32767;
+      else if (sum < -32768)
+        sum = -32768;
+      *pcm++ = (short) sum;
+   }
+/*--  special case --*/
+   bx += (256 - 32);
+   sum = WINMULT(vbuf[bx], (*coef++));
+   for (j = 0; j < 3; j++)
+   {
+      bx += 32;
+      sum += WINMULT(vbuf[bx], (*coef++));
+   }
+   sum >>= WINBITS;
+   if (sum > 32767)
+      sum = 32767;
+   else if (sum < -32768)
+      sum = -32768;
+   *pcm++ = (short) sum;
+
+/*-- last 7 --*/
+   coef = iwincoef + (111 - 7);        /* back pass through coefs */
+   si += (256 + -3 * 32 + 2 * 32 - 1);
+   bx += (32 + 3 * 32 + 2 * 32 + 1);
+   for (i = 0; i < 7; i++)
+   {
+      sum = WINMULT(vbuf[si], (*coef--));
+      for (j = 0; j < 3; j++)
+      {
+        si += 32;
+        sum += WINMULT(vbuf[bx], (*coef--));
+        bx += 32;
+        sum += WINMULT(vbuf[si], (*coef--));
+      }
+      si += (32 - 1 + 4 * 32);
+      bx += (5 * 32 + 1);
+      coef -= 7;
+      sum >>= WINBITS;
+      if (sum > 32767)
+        sum = 32767;
+      else if (sum < -32768)
+        sum = -32768;
+      *pcm++ = (short) sum;
+   }
+}
+/*--------------- 16 pt dual window (interleaved output) -----------------*/
+void i_window16_dual(WININT * vbuf, int vb_ptr, short *pcm)
+{
+   int i, j;
+   unsigned char si, bx;
+   WINCOEF *coef;
+   INT32 sum;
+
+
+/*-- first 8 --*/
+   si = (unsigned char) (vb_ptr + 8 + 3 * 32);
+   bx = (unsigned char) (si + (16 + 256 - 3 * 32 + 2 * 32));
+   coef = iwincoef;
+   for (i = 0; i < 8; i++)
+   {
+      sum = -WINMULT(vbuf[bx], (*coef++));
+      for (j = 0; j < 3; j++)
+      {
+        bx += 32;
+        sum += WINMULT(vbuf[si], (*coef++));
+        si += 32;
+        sum -= WINMULT(vbuf[bx], (*coef++));
+      }
+      si += (5 * 32 + 1);
+      bx += (32 + 4 * 32 - 1);
+      coef += 7;
+      sum >>= WINBITS;
+      if (sum > 32767)
+        sum = 32767;
+      else if (sum < -32768)
+        sum = -32768;
+      *pcm = (short) sum;
+      pcm += 2;
+   }
+/*--  special case --*/
+   bx += (256 - 32);
+   sum = WINMULT(vbuf[bx], (*coef++));
+   for (j = 0; j < 3; j++)
+   {
+      bx += 32;
+      sum += WINMULT(vbuf[bx], (*coef++));
+   }
+   sum >>= WINBITS;
+   if (sum > 32767)
+      sum = 32767;
+   else if (sum < -32768)
+      sum = -32768;
+   *pcm = (short) sum;
+   pcm += 2;
+
+/*-- last 7 --*/
+   coef = iwincoef + (111 - 7);        /* back pass through coefs */
+   si += (256 + -3 * 32 + 2 * 32 - 1);
+   bx += (32 + 3 * 32 + 2 * 32 + 1);
+   for (i = 0; i < 7; i++)
+   {
+      sum = WINMULT(vbuf[si], (*coef--));
+      for (j = 0; j < 3; j++)
+      {
+        si += 32;
+        sum += WINMULT(vbuf[bx], (*coef--));
+        bx += 32;
+        sum += WINMULT(vbuf[si], (*coef--));
+      }
+      si += (32 - 1 + 4 * 32);
+      bx += (5 * 32 + 1);
+      coef -= 7;
+      sum >>= WINBITS;
+      if (sum > 32767)
+        sum = 32767;
+      else if (sum < -32768)
+        sum = -32768;
+      *pcm = (short) sum;
+      pcm += 2;
+   }
+}
+/*--------------- 16 pt dual window (interleaved output) -----------------*/
+void i_window16_dual_right(WININT * vbuf, int vb_ptr, short *pcm)
+{
+/* right identical to dual, for asm */
+   int i, j;
+   unsigned char si, bx;
+   WINCOEF *coef;
+   INT32 sum;
+
+
+/*-- first 8 --*/
+   si = (unsigned char) (vb_ptr + 8 + 3 * 32);
+   bx = (unsigned char) (si + (16 + 256 - 3 * 32 + 2 * 32));
+   coef = iwincoef;
+   for (i = 0; i < 8; i++)
+   {
+      sum = -WINMULT(vbuf[bx], (*coef++));
+      for (j = 0; j < 3; j++)
+      {
+        bx += 32;
+        sum += WINMULT(vbuf[si], (*coef++));
+        si += 32;
+        sum -= WINMULT(vbuf[bx], (*coef++));
+      }
+      si += (5 * 32 + 1);
+      bx += (32 + 4 * 32 - 1);
+      coef += 7;
+      sum >>= WINBITS;
+      if (sum > 32767)
+        sum = 32767;
+      else if (sum < -32768)
+        sum = -32768;
+      *pcm = (short) sum;
+      pcm += 2;
+   }
+/*--  special case --*/
+   bx += (256 - 32);
+   sum = WINMULT(vbuf[bx], (*coef++));
+   for (j = 0; j < 3; j++)
+   {
+      bx += 32;
+      sum += WINMULT(vbuf[bx], (*coef++));
+   }
+   sum >>= WINBITS;
+   if (sum > 32767)
+      sum = 32767;
+   else if (sum < -32768)
+      sum = -32768;
+   *pcm = (short) sum;
+   pcm += 2;
+
+/*-- last 7 --*/
+   coef = iwincoef + (111 - 7);        /* back pass through coefs */
+   si += (256 + -3 * 32 + 2 * 32 - 1);
+   bx += (32 + 3 * 32 + 2 * 32 + 1);
+   for (i = 0; i < 7; i++)
+   {
+      sum = WINMULT(vbuf[si], (*coef--));
+      for (j = 0; j < 3; j++)
+      {
+        si += 32;
+        sum += WINMULT(vbuf[bx], (*coef--));
+        bx += 32;
+        sum += WINMULT(vbuf[si], (*coef--));
+      }
+      si += (32 - 1 + 4 * 32);
+      bx += (5 * 32 + 1);
+      coef -= 7;
+      sum >>= WINBITS;
+      if (sum > 32767)
+        sum = 32767;
+      else if (sum < -32768)
+        sum = -32768;
+      *pcm = (short) sum;
+      pcm += 2;
+   }
+}
+/*------------------------------------------------------------*/
+/*------------------- 8 pt window ------------------------------*/
+void i_window8(WININT * vbuf, int vb_ptr, short *pcm)
+{
+   int i, j;
+   unsigned int si, bx;
+   WINCOEF *coef;
+   INT32 sum;
+
+/*-- first 4 --*/
+   si = (vb_ptr + (4 + 3 * 16)) & 127;
+   bx = (si + (8 + 128 - 3 * 16 + 2 * 16)) & 127;
+   coef = iwincoef;
+   for (i = 0; i < 4; i++)
+   {
+      sum = -WINMULT(vbuf[bx], (*coef++));
+      for (j = 0; j < 3; j++)
+      {
+        bx = (bx + 16) & 127;
+        sum += WINMULT(vbuf[si], (*coef++));
+        si = (si + 16) & 127;
+        sum -= WINMULT(vbuf[bx], (*coef++));
+      }
+      si = (si + (5 * 16 + 1)) & 127;
+      bx = (bx + (16 + 4 * 16 - 1)) & 127;
+      coef += (3 * 7);
+      sum >>= WINBITS;
+      if (sum > 32767)
+        sum = 32767;
+      else if (sum < -32768)
+        sum = -32768;
+      *pcm++ = (short) sum;
+   }
+/*--  special case --*/
+   bx = (bx + (128 - 16)) & 127;
+   sum = WINMULT(vbuf[bx], (*coef++));
+   for (j = 0; j < 3; j++)
+   {
+      bx = (bx + 16) & 127;
+      sum += WINMULT(vbuf[bx], (*coef++));
+   }
+   sum >>= WINBITS;
+   if (sum > 32767)
+      sum = 32767;
+   else if (sum < -32768)
+      sum = -32768;
+   *pcm++ = (short) sum;
+
+/*-- last 3 --*/
+   coef = iwincoef + (111 - 3 * 7);    /* back pass through coefs */
+   si = (si + (128 - 3 * 16 + 2 * 16 - 1)) & 127;
+   bx = (bx + (16 + 3 * 16 + 2 * 16 + 1)) & 127;
+   for (i = 0; i < 3; i++)
+   {
+      sum = WINMULT(vbuf[si], (*coef--));
+      for (j = 0; j < 3; j++)
+      {
+        si = (si + 16) & 127;
+        sum += WINMULT(vbuf[bx], (*coef--));
+        bx = (bx + 16) & 127;
+        sum += WINMULT(vbuf[si], (*coef--));
+      }
+      si = (si + (16 - 1 + 4 * 16)) & 127;
+      bx = (bx + (5 * 16 + 1)) & 127;
+      coef -= (3 * 7);
+      sum >>= WINBITS;
+      if (sum > 32767)
+        sum = 32767;
+      else if (sum < -32768)
+        sum = -32768;
+      *pcm++ = (short) sum;
+   }
+}
+/*--------------- 8 pt dual window (interleaved output) --------------*/
+void i_window8_dual(WININT * vbuf, int vb_ptr, short *pcm)
+{
+   int i, j;
+   unsigned int si, bx;
+   WINCOEF *coef;
+   INT32 sum;
+
+/*-- first 4 --*/
+   si = (vb_ptr + (4 + 3 * 16)) & 127;
+   bx = (si + (8 + 128 - 3 * 16 + 2 * 16)) & 127;
+   coef = iwincoef;
+   for (i = 0; i < 4; i++)
+   {
+      sum = -WINMULT(vbuf[bx], (*coef++));
+      for (j = 0; j < 3; j++)
+      {
+        bx = (bx + 16) & 127;
+        sum += WINMULT(vbuf[si], (*coef++));
+        si = (si + 16) & 127;
+        sum -= WINMULT(vbuf[bx], (*coef++));
+      }
+      si = (si + (5 * 16 + 1)) & 127;
+      bx = (bx + (16 + 4 * 16 - 1)) & 127;
+      coef += (3 * 7);
+      sum >>= WINBITS;
+      if (sum > 32767)
+        sum = 32767;
+      else if (sum < -32768)
+        sum = -32768;
+      *pcm = (short) sum;
+      pcm += 2;
+   }
+/*--  special case --*/
+   bx = (bx + (128 - 16)) & 127;
+   sum = WINMULT(vbuf[bx], (*coef++));
+   for (j = 0; j < 3; j++)
+   {
+      bx = (bx + 16) & 127;
+      sum += WINMULT(vbuf[bx], (*coef++));
+   }
+   sum >>= WINBITS;
+   if (sum > 32767)
+      sum = 32767;
+   else if (sum < -32768)
+      sum = -32768;
+   *pcm = (short) sum;
+   pcm += 2;
+
+/*-- last 3 --*/
+   coef = iwincoef + (111 - 3 * 7);    /* back pass through coefs */
+   si = (si + (128 - 3 * 16 + 2 * 16 - 1)) & 127;
+   bx = (bx + (16 + 3 * 16 + 2 * 16 + 1)) & 127;
+   for (i = 0; i < 3; i++)
+   {
+      sum = WINMULT(vbuf[si], (*coef--));
+      for (j = 0; j < 3; j++)
+      {
+        si = (si + 16) & 127;
+        sum += WINMULT(vbuf[bx], (*coef--));
+        bx = (bx + 16) & 127;
+        sum += WINMULT(vbuf[si], (*coef--));
+      }
+      si = (si + (16 - 1 + 4 * 16)) & 127;
+      bx = (bx + (5 * 16 + 1)) & 127;
+      coef -= (3 * 7);
+      sum >>= WINBITS;
+      if (sum > 32767)
+        sum = 32767;
+      else if (sum < -32768)
+        sum = -32768;
+      *pcm = (short) sum;
+      pcm += 2;
+   }
+}
+/*------------------------------------------------------------*/
+/*--------------- 8 pt dual window (interleaved output) --------------*/
+void i_window8_dual_right(WININT * vbuf, int vb_ptr, short *pcm)
+{
+   int i, j;
+   unsigned int si, bx;
+   WINCOEF *coef;
+   INT32 sum;
+
+/* right identical to dual, for asm */
+
+/*-- first 4 --*/
+   si = (vb_ptr + (4 + 3 * 16)) & 127;
+   bx = (si + (8 + 128 - 3 * 16 + 2 * 16)) & 127;
+   coef = iwincoef;
+   for (i = 0; i < 4; i++)
+   {
+      sum = -WINMULT(vbuf[bx], (*coef++));
+      for (j = 0; j < 3; j++)
+      {
+        bx = (bx + 16) & 127;
+        sum += WINMULT(vbuf[si], (*coef++));
+        si = (si + 16) & 127;
+        sum -= WINMULT(vbuf[bx], (*coef++));
+      }
+      si = (si + (5 * 16 + 1)) & 127;
+      bx = (bx + (16 + 4 * 16 - 1)) & 127;
+      coef += (3 * 7);
+      sum >>= WINBITS;
+      if (sum > 32767)
+        sum = 32767;
+      else if (sum < -32768)
+        sum = -32768;
+      *pcm = (short) sum;
+      pcm += 2;
+   }
+/*--  special case --*/
+   bx = (bx + (128 - 16)) & 127;
+   sum = WINMULT(vbuf[bx], (*coef++));
+   for (j = 0; j < 3; j++)
+   {
+      bx = (bx + 16) & 127;
+      sum += WINMULT(vbuf[bx], (*coef++));
+   }
+   sum >>= WINBITS;
+   if (sum > 32767)
+      sum = 32767;
+   else if (sum < -32768)
+      sum = -32768;
+   *pcm = (short) sum;
+   pcm += 2;
+
+/*-- last 3 --*/
+   coef = iwincoef + (111 - 3 * 7);    /* back pass through coefs */
+   si = (si + (128 - 3 * 16 + 2 * 16 - 1)) & 127;
+   bx = (bx + (16 + 3 * 16 + 2 * 16 + 1)) & 127;
+   for (i = 0; i < 3; i++)
+   {
+      sum = WINMULT(vbuf[si], (*coef--));
+      for (j = 0; j < 3; j++)
+      {
+        si = (si + 16) & 127;
+        sum += WINMULT(vbuf[bx], (*coef--));
+        bx = (bx + 16) & 127;
+        sum += WINMULT(vbuf[si], (*coef--));
+      }
+      si = (si + (16 - 1 + 4 * 16)) & 127;
+      bx = (bx + (5 * 16 + 1)) & 127;
+      coef -= (3 * 7);
+      sum >>= WINBITS;
+      if (sum > 32767)
+        sum = 32767;
+      else if (sum < -32768)
+        sum = -32768;
+      *pcm = (short) sum;
+      pcm += 2;
+   }
+}
+/*--------------------------------------------------------*/
diff --git a/codecs/mp3/src/iwinbQ.c b/codecs/mp3/src/iwinbQ.c
new file mode 100755 (executable)
index 0000000..15c573a
--- /dev/null
@@ -0,0 +1,712 @@
+/*____________________________________________________________________________
+       
+       FreeAmp - The Free MP3 Player
+
+        MP3 Decoder originally Copyright (C) 1995-1997 Xing Technology
+        Corp.  http://www.xingtech.com
+
+       Portions Copyright (C) 1998 EMusic.com
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program; if not, write to the Free Software
+       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+       
+       $Id$
+____________________________________________________________________________*/
+
+/*----- iwinbq.c ---------------------------------------------------
+
+portable c
+mpeg1/2 Layer I/II audio decode
+
+conditional include to iwinm.c
+
+quick integer window - 8 bit output
+
+mods 1/8/97 warnings
+
+--------------------------------------------------------------*/
+/*--------------------------------------------------------------------*/
+void i_windowB(WININT * vbuf, int vb_ptr, unsigned char *pcm)
+{
+   int i, j;
+   unsigned int si, bx;
+   WINCOEF *coef;
+   INT32 sum;
+
+/*-- first 16 --*/
+   si = (vb_ptr + (16 + 3 * 64)) & 511;
+   bx = (si + (32 + 512 - 3 * 64 + 2 * 64)) & 511;
+   coef = iwincoef;
+   for (i = 0; i < 16; i++)
+   {
+      sum = -WINMULT(vbuf[bx], (*coef++));
+      for (j = 0; j < 3; j++)
+      {
+        bx = (bx + 64) & 511;
+        sum += WINMULT(vbuf[si], (*coef++));
+        si = (si + 64) & 511;
+        sum -= WINMULT(vbuf[bx], (*coef++));
+      }
+      si = (si + (5 * 64 + 1)) & 511;
+      bx = (bx + (64 + 4 * 64 - 1)) & 511;
+      sum >>= WINBITS;
+      if (sum > 32767)
+        sum = 32767;
+      else if (sum < -32768)
+        sum = -32768;
+      *pcm++ = (unsigned char) ((sum >> 8) ^ 0x80);
+   }
+/*--  special case --*/
+   bx = (bx + (512 - 64)) & 511;
+   sum = WINMULT(vbuf[bx], (*coef++));
+   for (j = 0; j < 3; j++)
+   {
+      bx = (bx + 64) & 511;
+      sum += WINMULT(vbuf[bx], (*coef++));
+   }
+   sum >>= WINBITS;
+   if (sum > 32767)
+      sum = 32767;
+   else if (sum < -32768)
+      sum = -32768;
+   *pcm++ = (unsigned char) ((sum >> 8) ^ 0x80);
+
+/*-- last 15 --*/
+   coef = iwincoef + 111;      /* back pass through coefs */
+   si = (si + (512 - 3 * 64 + 2 * 64 - 1)) & 511;
+   bx = (bx + (64 + 3 * 64 + 2 * 64 + 1)) & 511;
+   for (i = 0; i < 15; i++)
+   {
+      sum = WINMULT(vbuf[si], (*coef--));
+      for (j = 0; j < 3; j++)
+      {
+        si = (si + 64) & 511;
+        sum += WINMULT(vbuf[bx], (*coef--));
+        bx = (bx + 64) & 511;
+        sum += WINMULT(vbuf[si], (*coef--));
+      }
+      si = (si + (64 - 1 + 4 * 64)) & 511;
+      bx = (bx + (5 * 64 + 1)) & 511;
+      sum >>= WINBITS;
+      if (sum > 32767)
+        sum = 32767;
+      else if (sum < -32768)
+        sum = -32768;
+      *pcm++ = (unsigned char) ((sum >> 8) ^ 0x80);
+   }
+}
+/*------------------------------------------------------------*/
+void i_windowB_dual(WININT * vbuf, int vb_ptr, unsigned char *pcm)
+{
+/* dual window interleaves output */
+   int i, j;
+   unsigned int si, bx;
+   WINCOEF *coef;
+   INT32 sum;
+
+/*-- first 16 --*/
+   si = (vb_ptr + (16 + 3 * 64)) & 511;
+   bx = (si + (32 + 512 - 3 * 64 + 2 * 64)) & 511;
+   coef = iwincoef;
+   for (i = 0; i < 16; i++)
+   {
+      sum = -WINMULT(vbuf[bx], (*coef++));
+      for (j = 0; j < 3; j++)
+      {
+        bx = (bx + 64) & 511;
+        sum += WINMULT(vbuf[si], (*coef++));
+        si = (si + 64) & 511;
+        sum -= WINMULT(vbuf[bx], (*coef++));
+      }
+      si = (si + (5 * 64 + 1)) & 511;
+      bx = (bx + (64 + 4 * 64 - 1)) & 511;
+      sum >>= WINBITS;
+      if (sum > 32767)
+        sum = 32767;
+      else if (sum < -32768)
+        sum = -32768;
+      *pcm = (unsigned char) ((sum >> 8) ^ 0x80);
+      pcm += 2;
+   }
+/*--  special case --*/
+   bx = (bx + (512 - 64)) & 511;
+   sum = WINMULT(vbuf[bx], (*coef++));
+   for (j = 0; j < 3; j++)
+   {
+      bx = (bx + 64) & 511;
+      sum += WINMULT(vbuf[bx], (*coef++));
+   }
+   sum >>= WINBITS;
+   if (sum > 32767)
+      sum = 32767;
+   else if (sum < -32768)
+      sum = -32768;
+   *pcm = (unsigned char) ((sum >> 8) ^ 0x80);
+   pcm += 2;
+
+/*-- last 15 --*/
+   coef = iwincoef + 111;      /* back pass through coefs */
+   si = (si + (512 - 3 * 64 + 2 * 64 - 1)) & 511;
+   bx = (bx + (64 + 3 * 64 + 2 * 64 + 1)) & 511;
+   for (i = 0; i < 15; i++)
+   {
+      sum = WINMULT(vbuf[si], (*coef--));
+      for (j = 0; j < 3; j++)
+      {
+        si = (si + 64) & 511;
+        sum += WINMULT(vbuf[bx], (*coef--));
+        bx = (bx + 64) & 511;
+        sum += WINMULT(vbuf[si], (*coef--));
+      }
+      si = (si + (64 - 1 + 4 * 64)) & 511;
+      bx = (bx + (5 * 64 + 1)) & 511;
+      sum >>= WINBITS;
+      if (sum > 32767)
+        sum = 32767;
+      else if (sum < -32768)
+        sum = -32768;
+      *pcm = (unsigned char) ((sum >> 8) ^ 0x80);
+      pcm += 2;
+   }
+}
+/*------------------------------------------------------------*/
+void i_windowB_dual_right(WININT * vbuf, int vb_ptr, unsigned char *pcm)
+{
+/* right identical to dual, for asm  */
+/* dual window interleaves output */
+   int i, j;
+   unsigned int si, bx;
+   WINCOEF *coef;
+   INT32 sum;
+
+/*-- first 16 --*/
+   si = (vb_ptr + (16 + 3 * 64)) & 511;
+   bx = (si + (32 + 512 - 3 * 64 + 2 * 64)) & 511;
+   coef = iwincoef;
+   for (i = 0; i < 16; i++)
+   {
+      sum = -WINMULT(vbuf[bx], (*coef++));
+      for (j = 0; j < 3; j++)
+      {
+        bx = (bx + 64) & 511;
+        sum += WINMULT(vbuf[si], (*coef++));
+        si = (si + 64) & 511;
+        sum -= WINMULT(vbuf[bx], (*coef++));
+      }
+      si = (si + (5 * 64 + 1)) & 511;
+      bx = (bx + (64 + 4 * 64 - 1)) & 511;
+      sum >>= WINBITS;
+      if (sum > 32767)
+        sum = 32767;
+      else if (sum < -32768)
+        sum = -32768;
+      *pcm = (unsigned char) ((sum >> 8) ^ 0x80);
+      pcm += 2;
+   }
+/*--  special case --*/
+   bx = (bx + (512 - 64)) & 511;
+   sum = WINMULT(vbuf[bx], (*coef++));
+   for (j = 0; j < 3; j++)
+   {
+      bx = (bx + 64) & 511;
+      sum += WINMULT(vbuf[bx], (*coef++));
+   }
+   sum >>= WINBITS;
+   if (sum > 32767)
+      sum = 32767;
+   else if (sum < -32768)
+      sum = -32768;
+   *pcm = (unsigned char) ((sum >> 8) ^ 0x80);
+   pcm += 2;
+
+/*-- last 15 --*/
+   coef = iwincoef + 111;      /* back pass through coefs */
+   si = (si + (512 - 3 * 64 + 2 * 64 - 1)) & 511;
+   bx = (bx + (64 + 3 * 64 + 2 * 64 + 1)) & 511;
+   for (i = 0; i < 15; i++)
+   {
+      sum = WINMULT(vbuf[si], (*coef--));
+      for (j = 0; j < 3; j++)
+      {
+        si = (si + 64) & 511;
+        sum += WINMULT(vbuf[bx], (*coef--));
+        bx = (bx + 64) & 511;
+        sum += WINMULT(vbuf[si], (*coef--));
+      }
+      si = (si + (64 - 1 + 4 * 64)) & 511;
+      bx = (bx + (5 * 64 + 1)) & 511;
+      sum >>= WINBITS;
+      if (sum > 32767)
+        sum = 32767;
+      else if (sum < -32768)
+        sum = -32768;
+      *pcm = (unsigned char) ((sum >> 8) ^ 0x80);
+      pcm += 2;
+   }
+}
+/*------------------------------------------------------------*/
+/*------------------------------------------------------------*/
+/*------------------- 16 pt window ------------------------------*/
+void i_windowB16(WININT * vbuf, int vb_ptr, unsigned char *pcm)
+{
+   int i, j;
+   unsigned char si, bx;
+   WINCOEF *coef;
+   INT32 sum;
+
+
+/*-- first 8 --*/
+   si = (unsigned char) (vb_ptr + 8 + 3 * 32);
+   bx = (unsigned char) (si + (16 + 256 - 3 * 32 + 2 * 32));
+   coef = iwincoef;
+   for (i = 0; i < 8; i++)
+   {
+      sum = -WINMULT(vbuf[bx], (*coef++));
+      for (j = 0; j < 3; j++)
+      {
+        bx += 32;
+        sum += WINMULT(vbuf[si], (*coef++));
+        si += 32;
+        sum -= WINMULT(vbuf[bx], (*coef++));
+      }
+      si += (5 * 32 + 1);
+      bx += (32 + 4 * 32 - 1);
+      coef += 7;
+      sum >>= WINBITS;
+      if (sum > 32767)
+        sum = 32767;
+      else if (sum < -32768)
+        sum = -32768;
+      *pcm++ = (unsigned char) ((sum >> 8) ^ 0x80);
+   }
+/*--  special case --*/
+   bx += (256 - 32);
+   sum = WINMULT(vbuf[bx], (*coef++));
+   for (j = 0; j < 3; j++)
+   {
+      bx += 32;
+      sum += WINMULT(vbuf[bx], (*coef++));
+   }
+   sum >>= WINBITS;
+   if (sum > 32767)
+      sum = 32767;
+   else if (sum < -32768)
+      sum = -32768;
+   *pcm++ = (unsigned char) ((sum >> 8) ^ 0x80);
+
+/*-- last 7 --*/
+   coef = iwincoef + (111 - 7);        /* back pass through coefs */
+   si += (256 + -3 * 32 + 2 * 32 - 1);
+   bx += (32 + 3 * 32 + 2 * 32 + 1);
+   for (i = 0; i < 7; i++)
+   {
+      sum = WINMULT(vbuf[si], (*coef--));
+      for (j = 0; j < 3; j++)
+      {
+        si += 32;
+        sum += WINMULT(vbuf[bx], (*coef--));
+        bx += 32;
+        sum += WINMULT(vbuf[si], (*coef--));
+      }
+      si += (32 - 1 + 4 * 32);
+      bx += (5 * 32 + 1);
+      coef -= 7;
+      sum >>= WINBITS;
+      if (sum > 32767)
+        sum = 32767;
+      else if (sum < -32768)
+        sum = -32768;
+      *pcm++ = (unsigned char) ((sum >> 8) ^ 0x80);
+   }
+}
+/*--------------- 16 pt dual window (interleaved output) -----------------*/
+void i_windowB16_dual(WININT * vbuf, int vb_ptr, unsigned char *pcm)
+{
+   int i, j;
+   unsigned char si, bx;
+   WINCOEF *coef;
+   INT32 sum;
+
+
+/*-- first 8 --*/
+   si = (unsigned char) (vb_ptr + 8 + 3 * 32);
+   bx = (unsigned char) (si + (16 + 256 - 3 * 32 + 2 * 32));
+   coef = iwincoef;
+   for (i = 0; i < 8; i++)
+   {
+      sum = -WINMULT(vbuf[bx], (*coef++));
+      for (j = 0; j < 3; j++)
+      {
+        bx += 32;
+        sum += WINMULT(vbuf[si], (*coef++));
+        si += 32;
+        sum -= WINMULT(vbuf[bx], (*coef++));
+      }
+      si += (5 * 32 + 1);
+      bx += (32 + 4 * 32 - 1);
+      coef += 7;
+      sum >>= WINBITS;
+      if (sum > 32767)
+        sum = 32767;
+      else if (sum < -32768)
+        sum = -32768;
+      *pcm = (unsigned char) ((sum >> 8) ^ 0x80);
+      pcm += 2;
+   }
+/*--  special case --*/
+   bx += (256 - 32);
+   sum = WINMULT(vbuf[bx], (*coef++));
+   for (j = 0; j < 3; j++)
+   {
+      bx += 32;
+      sum += WINMULT(vbuf[bx], (*coef++));
+   }
+   sum >>= WINBITS;
+   if (sum > 32767)
+      sum = 32767;
+   else if (sum < -32768)
+      sum = -32768;
+   *pcm = (unsigned char) ((sum >> 8) ^ 0x80);
+   pcm += 2;
+
+/*-- last 7 --*/
+   coef = iwincoef + (111 - 7);        /* back pass through coefs */
+   si += (256 + -3 * 32 + 2 * 32 - 1);
+   bx += (32 + 3 * 32 + 2 * 32 + 1);
+   for (i = 0; i < 7; i++)
+   {
+      sum = WINMULT(vbuf[si], (*coef--));
+      for (j = 0; j < 3; j++)
+      {
+        si += 32;
+        sum += WINMULT(vbuf[bx], (*coef--));
+        bx += 32;
+        sum += WINMULT(vbuf[si], (*coef--));
+      }
+      si += (32 - 1 + 4 * 32);
+      bx += (5 * 32 + 1);
+      coef -= 7;
+      sum >>= WINBITS;
+      if (sum > 32767)
+        sum = 32767;
+      else if (sum < -32768)
+        sum = -32768;
+      *pcm = (unsigned char) ((sum >> 8) ^ 0x80);
+      pcm += 2;
+   }
+}
+/*--------------- 16 pt dual window (interleaved output) -----------------*/
+void i_windowB16_dual_right(WININT * vbuf, int vb_ptr, unsigned char *pcm)
+{
+/* right identical to dual, for asm */
+   int i, j;
+   unsigned char si, bx;
+   WINCOEF *coef;
+   INT32 sum;
+
+
+/*-- first 8 --*/
+   si = (unsigned char) (vb_ptr + 8 + 3 * 32);
+   bx = (unsigned char) (si + (16 + 256 - 3 * 32 + 2 * 32));
+   coef = iwincoef;
+   for (i = 0; i < 8; i++)
+   {
+      sum = -WINMULT(vbuf[bx], (*coef++));
+      for (j = 0; j < 3; j++)
+      {
+        bx += 32;
+        sum += WINMULT(vbuf[si], (*coef++));
+        si += 32;
+        sum -= WINMULT(vbuf[bx], (*coef++));
+      }
+      si += (5 * 32 + 1);
+      bx += (32 + 4 * 32 - 1);
+      coef += 7;
+      sum >>= WINBITS;
+      if (sum > 32767)
+        sum = 32767;
+      else if (sum < -32768)
+        sum = -32768;
+      *pcm = (unsigned char) ((sum >> 8) ^ 0x80);
+      pcm += 2;
+   }
+/*--  special case --*/
+   bx += (256 - 32);
+   sum = WINMULT(vbuf[bx], (*coef++));
+   for (j = 0; j < 3; j++)
+   {
+      bx += 32;
+      sum += WINMULT(vbuf[bx], (*coef++));
+   }
+   sum >>= WINBITS;
+   if (sum > 32767)
+      sum = 32767;
+   else if (sum < -32768)
+      sum = -32768;
+   *pcm = (unsigned char) ((sum >> 8) ^ 0x80);
+   pcm += 2;
+
+/*-- last 7 --*/
+   coef = iwincoef + (111 - 7);        /* back pass through coefs */
+   si += (256 + -3 * 32 + 2 * 32 - 1);
+   bx += (32 + 3 * 32 + 2 * 32 + 1);
+   for (i = 0; i < 7; i++)
+   {
+      sum = WINMULT(vbuf[si], (*coef--));
+      for (j = 0; j < 3; j++)
+      {
+        si += 32;
+        sum += WINMULT(vbuf[bx], (*coef--));
+        bx += 32;
+        sum += WINMULT(vbuf[si], (*coef--));
+      }
+      si += (32 - 1 + 4 * 32);
+      bx += (5 * 32 + 1);
+      coef -= 7;
+      sum >>= WINBITS;
+      if (sum > 32767)
+        sum = 32767;
+      else if (sum < -32768)
+        sum = -32768;
+      *pcm = (unsigned char) ((sum >> 8) ^ 0x80);
+      pcm += 2;
+   }
+}
+/*------------------------------------------------------------*/
+/*------------------- 8 pt window ------------------------------*/
+void i_windowB8(WININT * vbuf, int vb_ptr, unsigned char *pcm)
+{
+   int i, j;
+   unsigned int si, bx;
+   WINCOEF *coef;
+   INT32 sum;
+
+/*-- first 4 --*/
+   si = (vb_ptr + (4 + 3 * 16)) & 127;
+   bx = (si + (8 + 128 - 3 * 16 + 2 * 16)) & 127;
+   coef = iwincoef;
+   for (i = 0; i < 4; i++)
+   {
+      sum = -WINMULT(vbuf[bx], (*coef++));
+      for (j = 0; j < 3; j++)
+      {
+        bx = (bx + 16) & 127;
+        sum += WINMULT(vbuf[si], (*coef++));
+        si = (si + 16) & 127;
+        sum -= WINMULT(vbuf[bx], (*coef++));
+      }
+      si = (si + (5 * 16 + 1)) & 127;
+      bx = (bx + (16 + 4 * 16 - 1)) & 127;
+      coef += (3 * 7);
+      sum >>= WINBITS;
+      if (sum > 32767)
+        sum = 32767;
+      else if (sum < -32768)
+        sum = -32768;
+      *pcm++ = (unsigned char) ((sum >> 8) ^ 0x80);
+   }
+/*--  special case --*/
+   bx = (bx + (128 - 16)) & 127;
+   sum = WINMULT(vbuf[bx], (*coef++));
+   for (j = 0; j < 3; j++)
+   {
+      bx = (bx + 16) & 127;
+      sum += WINMULT(vbuf[bx], (*coef++));
+   }
+   sum >>= WINBITS;
+   if (sum > 32767)
+      sum = 32767;
+   else if (sum < -32768)
+      sum = -32768;
+   *pcm++ = (unsigned char) ((sum >> 8) ^ 0x80);
+
+/*-- last 3 --*/
+   coef = iwincoef + (111 - 3 * 7);    /* back pass through coefs */
+   si = (si + (128 - 3 * 16 + 2 * 16 - 1)) & 127;
+   bx = (bx + (16 + 3 * 16 + 2 * 16 + 1)) & 127;
+   for (i = 0; i < 3; i++)
+   {
+      sum = WINMULT(vbuf[si], (*coef--));
+      for (j = 0; j < 3; j++)
+      {
+        si = (si + 16) & 127;
+        sum += WINMULT(vbuf[bx], (*coef--));
+        bx = (bx + 16) & 127;
+        sum += WINMULT(vbuf[si], (*coef--));
+      }
+      si = (si + (16 - 1 + 4 * 16)) & 127;
+      bx = (bx + (5 * 16 + 1)) & 127;
+      coef -= (3 * 7);
+      sum >>= WINBITS;
+      if (sum > 32767)
+        sum = 32767;
+      else if (sum < -32768)
+        sum = -32768;
+      *pcm++ = (unsigned char) ((sum >> 8) ^ 0x80);
+   }
+}
+/*--------------- 8 pt dual window (interleaved output) --------------*/
+void i_windowB8_dual(WININT * vbuf, int vb_ptr, unsigned char *pcm)
+{
+   int i, j;
+   unsigned int si, bx;
+   WINCOEF *coef;
+   INT32 sum;
+
+/*-- first 4 --*/
+   si = (vb_ptr + (4 + 3 * 16)) & 127;
+   bx = (si + (8 + 128 - 3 * 16 + 2 * 16)) & 127;
+   coef = iwincoef;
+   for (i = 0; i < 4; i++)
+   {
+      sum = -WINMULT(vbuf[bx], (*coef++));
+      for (j = 0; j < 3; j++)
+      {
+        bx = (bx + 16) & 127;
+        sum += WINMULT(vbuf[si], (*coef++));
+        si = (si + 16) & 127;
+        sum -= WINMULT(vbuf[bx], (*coef++));
+      }
+      si = (si + (5 * 16 + 1)) & 127;
+      bx = (bx + (16 + 4 * 16 - 1)) & 127;
+      coef += (3 * 7);
+      sum >>= WINBITS;
+      if (sum > 32767)
+        sum = 32767;
+      else if (sum < -32768)
+        sum = -32768;
+      *pcm = (unsigned char) ((sum >> 8) ^ 0x80);
+      pcm += 2;
+   }
+/*--  special case --*/
+   bx = (bx + (128 - 16)) & 127;
+   sum = WINMULT(vbuf[bx], (*coef++));
+   for (j = 0; j < 3; j++)
+   {
+      bx = (bx + 16) & 127;
+      sum += WINMULT(vbuf[bx], (*coef++));
+   }
+   sum >>= WINBITS;
+   if (sum > 32767)
+      sum = 32767;
+   else if (sum < -32768)
+      sum = -32768;
+   *pcm = (unsigned char) ((sum >> 8) ^ 0x80);
+   pcm += 2;
+
+/*-- last 3 --*/
+   coef = iwincoef + (111 - 3 * 7);    /* back pass through coefs */
+   si = (si + (128 - 3 * 16 + 2 * 16 - 1)) & 127;
+   bx = (bx + (16 + 3 * 16 + 2 * 16 + 1)) & 127;
+   for (i = 0; i < 3; i++)
+   {
+      sum = WINMULT(vbuf[si], (*coef--));
+      for (j = 0; j < 3; j++)
+      {
+        si = (si + 16) & 127;
+        sum += WINMULT(vbuf[bx], (*coef--));
+        bx = (bx + 16) & 127;
+        sum += WINMULT(vbuf[si], (*coef--));
+      }
+      si = (si + (16 - 1 + 4 * 16)) & 127;
+      bx = (bx + (5 * 16 + 1)) & 127;
+      coef -= (3 * 7);
+      sum >>= WINBITS;
+      if (sum > 32767)
+        sum = 32767;
+      else if (sum < -32768)
+        sum = -32768;
+      *pcm = (unsigned char) ((sum >> 8) ^ 0x80);
+      pcm += 2;
+   }
+}
+/*------------------------------------------------------------*/
+/*--------------- 8 pt dual window (interleaved output) --------------*/
+void i_windowB8_dual_right(WININT * vbuf, int vb_ptr, unsigned char *pcm)
+{
+   int i, j;
+   unsigned int si, bx;
+   WINCOEF *coef;
+   INT32 sum;
+
+/* right identical to dual, for asm */
+
+/*-- first 4 --*/
+   si = (vb_ptr + (4 + 3 * 16)) & 127;
+   bx = (si + (8 + 128 - 3 * 16 + 2 * 16)) & 127;
+   coef = iwincoef;
+   for (i = 0; i < 4; i++)
+   {
+      sum = -WINMULT(vbuf[bx], (*coef++));
+      for (j = 0; j < 3; j++)
+      {
+        bx = (bx + 16) & 127;
+        sum += WINMULT(vbuf[si], (*coef++));
+        si = (si + 16) & 127;
+        sum -= WINMULT(vbuf[bx], (*coef++));
+      }
+      si = (si + (5 * 16 + 1)) & 127;
+      bx = (bx + (16 + 4 * 16 - 1)) & 127;
+      coef += (3 * 7);
+      sum >>= WINBITS;
+      if (sum > 32767)
+        sum = 32767;
+      else if (sum < -32768)
+        sum = -32768;
+      *pcm = (unsigned char) ((sum >> 8) ^ 0x80);
+      pcm += 2;
+   }
+/*--  special case --*/
+   bx = (bx + (128 - 16)) & 127;
+   sum = WINMULT(vbuf[bx], (*coef++));
+   for (j = 0; j < 3; j++)
+   {
+      bx = (bx + 16) & 127;
+      sum += WINMULT(vbuf[bx], (*coef++));
+   }
+   sum >>= WINBITS;
+   if (sum > 32767)
+      sum = 32767;
+   else if (sum < -32768)
+      sum = -32768;
+   *pcm = (unsigned char) ((sum >> 8) ^ 0x80);
+   pcm += 2;
+
+/*-- last 3 --*/
+   coef = iwincoef + (111 - 3 * 7);    /* back pass through coefs */
+   si = (si + (128 - 3 * 16 + 2 * 16 - 1)) & 127;
+   bx = (bx + (16 + 3 * 16 + 2 * 16 + 1)) & 127;
+   for (i = 0; i < 3; i++)
+   {
+      sum = WINMULT(vbuf[si], (*coef--));
+      for (j = 0; j < 3; j++)
+      {
+        si = (si + 16) & 127;
+        sum += WINMULT(vbuf[bx], (*coef--));
+        bx = (bx + 16) & 127;
+        sum += WINMULT(vbuf[si], (*coef--));
+      }
+      si = (si + (16 - 1 + 4 * 16)) & 127;
+      bx = (bx + (5 * 16 + 1)) & 127;
+      coef -= (3 * 7);
+      sum >>= WINBITS;
+      if (sum > 32767)
+        sum = 32767;
+      else if (sum < -32768)
+        sum = -32768;
+      *pcm = (unsigned char) ((sum >> 8) ^ 0x80);
+      pcm += 2;
+   }
+}
+/*--------------------------------------------------------*/
diff --git a/codecs/mp3/src/iwinm.c b/codecs/mp3/src/iwinm.c
new file mode 100755 (executable)
index 0000000..6bd12b6
--- /dev/null
@@ -0,0 +1,64 @@
+/*____________________________________________________________________________
+       
+       FreeAmp - The Free MP3 Player
+
+        MP3 Decoder originally Copyright (C) 1995-1997 Xing Technology
+        Corp.  http://www.xingtech.com
+
+       Portions Copyright (C) 1998 EMusic.com
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program; if not, write to the Free Software
+       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+       
+       $Id$
+____________________________________________________________________________*/
+
+/****  iwinm.c  ***************************************************
+
+MPEG audio decoder, window master
+portable C       integer version of cwinm.c
+
+
+
+******************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <float.h>
+#include <math.h>
+#include "itype.h"
+
+/*-------------------------------------------------------------------------*/
+/* public vbuf's */
+WININT vbuf[512];
+WININT vbuf2[512];
+
+/*--  integer point window coefs  ---*/
+/*--  quick uses only first 116  ----*/
+static WINCOEF iwincoef[264];
+
+/*==================================================================*/
+WINCOEF *i_wincoef_addr()
+{
+   return iwincoef;
+}
+/*-------------------------------------------------------------------*/
+#ifdef FULL_INTEGER
+#include "iwin.c"
+#include "iwinb.c"
+#else
+#include "iwinQ.c"
+#include "iwinbQ.c"
+#endif
+/*-------------------------------------------------------------------*/
diff --git a/codecs/mp3/src/l3dq.c b/codecs/mp3/src/l3dq.c
new file mode 100755 (executable)
index 0000000..3ee0764
--- /dev/null
@@ -0,0 +1,256 @@
+/*____________________________________________________________________________
+       
+       FreeAmp - The Free MP3 Player
+
+        MP3 Decoder originally Copyright (C) 1995-1997 Xing Technology
+        Corp.  http://www.xingtech.com
+
+       Portions Copyright (C) 1998-1999 EMusic.com
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program; if not, write to the Free Software
+       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+       
+       $Id$
+____________________________________________________________________________*/
+
+/****  quant.c  ***************************************************
+  Layer III  dequant
+
+  does reordering of short blocks
+
+  mod 8/19/98 decode 22 sf bands
+
+******************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <float.h>
+#include <math.h>
+#include <string.h>
+#include "L3.h"
+#include "mhead.h"
+#include "protos.h"
+
+
+/*----------
+static struct  {
+int l[23];
+int s[14];} sfBandTable[3] =   
+{{{0,4,8,12,16,20,24,30,36,44,52,62,74,90,110,134,162,196,238,288,342,418,576},
+ {0,4,8,12,16,22,30,40,52,66,84,106,136,192}},
+{{0,4,8,12,16,20,24,30,36,42,50,60,72,88,106,128,156,190,230,276,330,384,576},
+ {0,4,8,12,16,22,28,38,50,64,80,100,126,192}},
+{{0,4,8,12,16,20,24,30,36,44,54,66,82,102,126,156,194,240,296,364,448,550,576},
+ {0,4,8,12,16,22,30,42,58,78,104,138,180,192}}};
+----------*/
+
+/*--------------------------------*/
+static int pretab[2][22] =
+{
+   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0},
+};
+
+
+/* 8 bit plus 2 lookup x = pow(2.0, 0.25*(global_gain-210)) */
+/* two extra slots to do 1/sqrt(2) scaling for ms */
+/* 4 extra slots to do 1/2 scaling for cvt to mono */
+
+/*-------- scaling lookup
+x = pow(2.0, -0.5*(1+scalefact_scale)*scalefac + preemp)
+look_scale[scalefact_scale][preemp][scalefac]
+-----------------------*/
+#if 0
+typedef float LS[4][32];
+#endif
+
+/*--- iSample**(4/3) lookup, -32<=i<=31 ---*/
+
+/*-- pow(2.0, -0.25*8.0*subblock_gain) --*/
+
+/*-- reorder buffer ---*/
+typedef float ARRAY3[3];
+
+
+/*=============================================================*/
+float *quant_init_global_addr(MPEG *m)
+{
+   return m->cupl.look_global;
+}
+/*-------------------------------------------------------------*/
+LS *quant_init_scale_addr(MPEG *m)
+{
+   return m->cupl.look_scale;
+}
+/*-------------------------------------------------------------*/
+float *quant_init_pow_addr(MPEG *m)
+{
+   return m->cupl.look_pow;
+}
+/*-------------------------------------------------------------*/
+float *quant_init_subblock_addr(MPEG *m)
+{
+   return m->cupl.look_subblock;
+}
+/*=============================================================*/
+
+#ifdef _MSC_VER
+#pragma warning(disable: 4056)
+#endif
+
+void dequant(MPEG *m, SAMPLE Sample[], int *nsamp,
+            SCALEFACT * sf,
+            GR * gr,
+            CB_INFO * cb_info, int ncbl_mixed)
+{
+   int i, j;
+   int cb, n, w;
+   float x0, xs;
+   float xsb[3];
+   double tmp;
+   int ncbl;
+   int cbs0;
+   ARRAY3 *buf;                        /* short block reorder */
+   int nbands;
+   int i0;
+   int non_zero;
+   int cbmax[3];
+
+   nbands = *nsamp;
+
+
+   ncbl = 22;                  /* long block cb end */
+   cbs0 = 12;                  /* short block cb start */
+/* ncbl_mixed = 8 or 6  mpeg1 or 2 */
+   if (gr->block_type == 2)
+   {
+      ncbl = 0;
+      cbs0 = 0;
+      if (gr->mixed_block_flag)
+      {
+        ncbl = ncbl_mixed;
+        cbs0 = 3;
+      }
+   }
+/* fill in cb_info -- */
+   /* This doesn't seem used anywhere...
+   cb_info->lb_type = gr->block_type;
+   if (gr->block_type == 2)
+      cb_info->lb_type;
+   */
+   cb_info->cbs0 = cbs0;
+   cb_info->ncbl = ncbl;
+
+   cbmax[2] = cbmax[1] = cbmax[0] = 0;
+/* global gain pre-adjusted by 2 if ms_mode, 0 otherwise */
+   x0 = m->cupl.look_global[(2 + 4) + gr->global_gain];
+   i = 0;
+/*----- long blocks ---*/
+   for (cb = 0; cb < ncbl; cb++)
+   {
+      non_zero = 0;
+      xs = x0 * m->cupl.look_scale[gr->scalefac_scale][pretab[gr->preflag][cb]][sf->l[cb]];
+      n = m->cupl.nBand[0][cb];
+      for (j = 0; j < n; j++, i++)
+      {
+        if (Sample[i].s == 0)
+           Sample[i].x = 0.0F;
+        else
+        {
+           non_zero = 1;
+           if ((Sample[i].s >= (-ISMAX)) && (Sample[i].s < ISMAX))
+              Sample[i].x = xs * m->cupl.look_pow[ISMAX + Sample[i].s];
+           else
+           {
+               float tmpConst = (float)(1.0/3.0);
+              tmp = (double) Sample[i].s;
+              Sample[i].x = (float) (xs * tmp * pow(fabs(tmp), tmpConst));
+           }
+        }
+      }
+      if (non_zero)
+        cbmax[0] = cb;
+      if (i >= nbands)
+        break;
+   }
+
+   cb_info->cbmax = cbmax[0];
+   cb_info->cbtype = 0;                // type = long
+
+   if (cbs0 >= 12)
+      return;
+/*---------------------------
+block type = 2  short blocks
+----------------------------*/
+   cbmax[2] = cbmax[1] = cbmax[0] = cbs0;
+   i0 = i;                     /* save for reorder */
+   buf = m->cupl.re_buf;
+   for (w = 0; w < 3; w++)
+      xsb[w] = x0 * m->cupl.look_subblock[gr->subblock_gain[w]];
+   for (cb = cbs0; cb < 13; cb++)
+   {
+      n = m->cupl.nBand[1][cb];
+      for (w = 0; w < 3; w++)
+      {
+        non_zero = 0;
+        xs = xsb[w] * m->cupl.look_scale[gr->scalefac_scale][0][sf->s[w][cb]];
+        for (j = 0; j < n; j++, i++)
+        {
+           if (Sample[i].s == 0)
+              buf[j][w] = 0.0F;
+           else
+           {
+              non_zero = 1;
+              if ((Sample[i].s >= (-ISMAX)) && (Sample[i].s < ISMAX))
+                 buf[j][w] = xs * m->cupl.look_pow[ISMAX + Sample[i].s];
+              else
+              {
+                 float tmpConst = (float)(1.0/3.0);
+                 tmp = (double) Sample[i].s;
+                 buf[j][w] = (float) (xs * tmp * pow(fabs(tmp), tmpConst));
+              }
+           }
+        }
+        if (non_zero)
+           cbmax[w] = cb;
+      }
+      if (i >= nbands)
+        break;
+      buf += n;
+   }
+
+
+   memmove(&Sample[i0].x, &m->cupl.re_buf[0][0], sizeof(float) * (i - i0));
+
+   *nsamp = i;                 /* update nsamp */
+   cb_info->cbmax_s[0] = cbmax[0];
+   cb_info->cbmax_s[1] = cbmax[1];
+   cb_info->cbmax_s[2] = cbmax[2];
+   if (cbmax[1] > cbmax[0])
+      cbmax[0] = cbmax[1];
+   if (cbmax[2] > cbmax[0])
+      cbmax[0] = cbmax[2];
+
+   cb_info->cbmax = cbmax[0];
+   cb_info->cbtype = 1;                /* type = short */
+
+
+   return;
+}
+
+#ifdef _MSC_VER
+#pragma warning(default: 4056)
+#endif
+
+/*-------------------------------------------------------------*/
diff --git a/codecs/mp3/src/l3init.c b/codecs/mp3/src/l3init.c
new file mode 100755 (executable)
index 0000000..c3e724b
--- /dev/null
@@ -0,0 +1,383 @@
+/*____________________________________________________________________________
+       
+       FreeAmp - The Free MP3 Player
+
+        MP3 Decoder originally Copyright (C) 1995-1997 Xing Technology
+        Corp.  http://www.xingtech.com
+
+       Portions Copyright (C) 1998 EMusic.com
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program; if not, write to the Free Software
+       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+       
+       $Id$
+____________________________________________________________________________*/
+
+/****  tinit.c  ***************************************************
+  Layer III  init tables
+
+
+******************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <float.h>
+#include <math.h>
+#include "L3.h"
+#include "mhead.h"
+#include "protos.h"
+
+/* get rid of precision loss warnings on conversion */
+#ifdef _MSC_VER
+#pragma warning(disable:4244 4056)
+#endif
+
+
+
+static const float Ci[8] =
+{
+   -0.6f, -0.535f, -0.33f, -0.185f, -0.095f, -0.041f, -0.0142f, -0.0037f};
+
+
+void hwin_init(MPEG *m);               /* hybrid windows -- */
+void imdct_init(MPEG *m);
+typedef struct
+{
+   float *w;
+   float *w2;
+   void *coef;
+}
+IMDCT_INIT_BLOCK;
+
+void msis_init(MPEG *m);
+void msis_init_MPEG2(MPEG *m);
+
+/*=============================================================*/
+int L3table_init(MPEG *m)
+{
+   int i;
+   float *x;
+   LS *ls;
+   int scalefact_scale, preemp, scalefac;
+   double tmp;
+   PAIR *csa;
+
+/*================ quant ===============================*/
+
+/* 8 bit plus 2 lookup x = pow(2.0, 0.25*(global_gain-210)) */
+/* extra 2 for ms scaling by 1/sqrt(2) */
+/* extra 4 for cvt to mono scaling by 1/2 */
+   x = quant_init_global_addr(m);
+   for (i = 0; i < 256 + 2 + 4; i++)
+      x[i] = (float) pow(2.0, 0.25 * ((i - (2 + 4)) - 210 + GLOBAL_GAIN_SCALE));
+
+
+/* x = pow(2.0, -0.5*(1+scalefact_scale)*scalefac + preemp) */
+   ls = quant_init_scale_addr(m);
+   for (scalefact_scale = 0; scalefact_scale < 2; scalefact_scale++)
+   {
+      for (preemp = 0; preemp < 4; preemp++)
+      {
+        for (scalefac = 0; scalefac < 32; scalefac++)
+        {
+           ls[scalefact_scale][preemp][scalefac] =
+              (float) pow(2.0, -0.5 * (1 + scalefact_scale) * (scalefac + preemp));
+        }
+      }
+   }
+
+/*--- iSample**(4/3) lookup, -32<=i<=31 ---*/
+   x = quant_init_pow_addr(m);
+   for (i = 0; i < 64; i++)
+   {
+      tmp = i - 32;
+      x[i] = (float) (tmp * pow(fabs(tmp), (1.0 / 3.0)));
+   }
+
+
+/*-- pow(2.0, -0.25*8.0*subblock_gain)  3 bits --*/
+   x = quant_init_subblock_addr(m);
+   for (i = 0; i < 8; i++)
+   {
+      x[i] = (float) pow(2.0, 0.25 * -8.0 * i);
+   }
+
+/*-------------------------*/
+// quant_init_sf_band(sr_index);   replaced by code in sup.c
+
+
+/*================ antialias ===============================*/
+   csa = alias_init_addr(m);
+   for (i = 0; i < 8; i++)
+   {
+      csa[i][0] = (float) (1.0 / sqrt(1.0 + Ci[i] * Ci[i]));
+      csa[i][1] = (float) (Ci[i] / sqrt(1.0 + Ci[i] * Ci[i]));
+   }
+
+
+/*================ msis ===============================*/
+   msis_init(m);
+   msis_init_MPEG2(m);
+
+/*================ imdct ===============================*/
+   imdct_init(m);
+
+/*--- hybrid windows ------------*/
+   hwin_init(m);
+
+   return 0;
+}
+/*====================================================================*/
+typedef float ARRAY36[36];
+ARRAY36 *hwin_init_addr();
+
+/*--------------------------------------------------------------------*/
+void hwin_init(MPEG *m)
+{
+   int i, j;
+   double pi;
+   ARRAY36 *win;
+
+   win = hwin_init_addr(m);
+
+   pi = 4.0 * atan(1.0);
+
+/* type 0 */
+   for (i = 0; i < 36; i++)
+      win[0][i] = (float) sin(pi / 36 * (i + 0.5));
+
+/* type 1 */
+   for (i = 0; i < 18; i++)
+      win[1][i] = (float) sin(pi / 36 * (i + 0.5));
+   for (i = 18; i < 24; i++)
+      win[1][i] = 1.0F;
+   for (i = 24; i < 30; i++)
+      win[1][i] = (float) sin(pi / 12 * (i + 0.5 - 18));
+   for (i = 30; i < 36; i++)
+      win[1][i] = 0.0F;
+
+/* type 3 */
+   for (i = 0; i < 6; i++)
+      win[3][i] = 0.0F;
+   for (i = 6; i < 12; i++)
+      win[3][i] = (float) sin(pi / 12 * (i + 0.5 - 6));
+   for (i = 12; i < 18; i++)
+      win[3][i] = 1.0F;
+   for (i = 18; i < 36; i++)
+      win[3][i] = (float) sin(pi / 36 * (i + 0.5));
+
+/* type 2 */
+   for (i = 0; i < 12; i++)
+      win[2][i] = (float) sin(pi / 12 * (i + 0.5));
+   for (i = 12; i < 36; i++)
+      win[2][i] = 0.0F;
+
+/*--- invert signs by region to match mdct 18pt --> 36pt mapping */
+   for (j = 0; j < 4; j++)
+   {
+      if (j == 2)
+        continue;
+      for (i = 9; i < 36; i++)
+        win[j][i] = -win[j][i];
+   }
+
+/*-- invert signs for short blocks --*/
+   for (i = 3; i < 12; i++)
+      win[2][i] = -win[2][i];
+
+   return;
+}
+/*=============================================================*/
+typedef float ARRAY4[4];
+IMDCT_INIT_BLOCK *imdct_init_addr_18();
+IMDCT_INIT_BLOCK *imdct_init_addr_6();
+
+/*-------------------------------------------------------------*/
+void imdct_init(MPEG *m)
+{
+   int k, p, n;
+   double t, pi;
+   IMDCT_INIT_BLOCK *addr;
+   float *w, *w2;
+   float *v, *v2, *coef87;
+   ARRAY4 *coef;
+
+/*--- 18 point --*/
+   addr = imdct_init_addr_18();
+   w = addr->w;
+   w2 = addr->w2;
+   coef = addr->coef;
+/*----*/
+   n = 18;
+   pi = 4.0 * atan(1.0);
+   t = pi / (4 * n);
+   for (p = 0; p < n; p++)
+      w[p] = (float) (2.0 * cos(t * (2 * p + 1)));
+   for (p = 0; p < 9; p++)
+      w2[p] = (float) 2.0 *cos(2 * t * (2 * p + 1));
+
+   t = pi / (2 * n);
+   for (k = 0; k < 9; k++)
+   {
+      for (p = 0; p < 4; p++)
+        coef[k][p] = (float) cos(t * (2 * k) * (2 * p + 1));
+   }
+
+/*--- 6 point */
+   addr = imdct_init_addr_6();
+   v = addr->w;
+   v2 = addr->w2;
+   coef87 = addr->coef;
+/*----*/
+   n = 6;
+   pi = 4.0 * atan(1.0);
+   t = pi / (4 * n);
+   for (p = 0; p < n; p++)
+      v[p] = (float) 2.0 *cos(t * (2 * p + 1));
+
+   for (p = 0; p < 3; p++)
+      v2[p] = (float) 2.0 *cos(2 * t * (2 * p + 1));
+
+   t = pi / (2 * n);
+   k = 1;
+   p = 0;
+   *coef87 = (float) cos(t * (2 * k) * (2 * p + 1));
+/* adjust scaling to save a few mults */
+   for (p = 0; p < 6; p++)
+      v[p] = v[p] / 2.0f;
+   *coef87 = (float) 2.0 *(*coef87);
+
+
+   return;
+}
+/*===============================================================*/
+typedef float ARRAY8_2[8][2];
+ARRAY8_2 *msis_init_addr(MPEG *m);
+
+/*-------------------------------------------------------------*/
+void msis_init(MPEG *m)
+{
+   int i;
+   double s, c;
+   double pi;
+   double t;
+   ARRAY8_2 *lr;
+
+   lr = msis_init_addr(m);
+
+
+   pi = 4.0 * atan(1.0);
+   t = pi / 12.0;
+   for (i = 0; i < 7; i++)
+   {
+      s = sin(i * t);
+      c = cos(i * t);
+    /* ms_mode = 0 */
+      lr[0][i][0] = (float) (s / (s + c));
+      lr[0][i][1] = (float) (c / (s + c));
+    /* ms_mode = 1 */
+      lr[1][i][0] = (float) (sqrt(2.0) * (s / (s + c)));
+      lr[1][i][1] = (float) (sqrt(2.0) * (c / (s + c)));
+   }
+/* sf = 7 */
+/* ms_mode = 0 */
+   lr[0][i][0] = 1.0f;
+   lr[0][i][1] = 0.0f;
+/* ms_mode = 1, in is bands is routine does ms processing */
+   lr[1][i][0] = 1.0f;
+   lr[1][i][1] = 1.0f;
+
+
+/*-------
+for(i=0;i<21;i++) nBand[0][i] = 
+            sfBandTable[sr_index].l[i+1] - sfBandTable[sr_index].l[i];
+for(i=0;i<12;i++) nBand[1][i] = 
+            sfBandTable[sr_index].s[i+1] - sfBandTable[sr_index].s[i];
+-------------*/
+
+}
+/*-------------------------------------------------------------*/
+/*===============================================================*/
+typedef float ARRAY2_64_2[2][64][2];
+ARRAY2_64_2 *msis_init_addr_MPEG2(MPEG *m);
+
+/*-------------------------------------------------------------*/
+void msis_init_MPEG2(MPEG *m)
+{
+   int k, n;
+   double t;
+   ARRAY2_64_2 *lr;
+   int intensity_scale, ms_mode, sf, sflen;
+   float ms_factor[2];
+
+
+   ms_factor[0] = 1.0;
+   ms_factor[1] = (float) sqrt(2.0);
+
+   lr = msis_init_addr_MPEG2(m);
+
+/* intensity stereo MPEG2 */
+/* lr2[intensity_scale][ms_mode][sflen_offset+sf][left/right] */
+
+   for (intensity_scale = 0; intensity_scale < 2; intensity_scale++)
+   {
+      t = pow(2.0, -0.25 * (1 + intensity_scale));
+      for (ms_mode = 0; ms_mode < 2; ms_mode++)
+      {
+
+        n = 1;
+        k = 0;
+        for (sflen = 0; sflen < 6; sflen++)
+        {
+           for (sf = 0; sf < (n - 1); sf++, k++)
+           {
+              if (sf == 0)
+              {
+                 lr[intensity_scale][ms_mode][k][0] = ms_factor[ms_mode] * 1.0f;
+                 lr[intensity_scale][ms_mode][k][1] = ms_factor[ms_mode] * 1.0f;
+              }
+              else if ((sf & 1))
+              {
+                 lr[intensity_scale][ms_mode][k][0] =
+                    (float) (ms_factor[ms_mode] * pow(t, (sf + 1) / 2));
+                 lr[intensity_scale][ms_mode][k][1] = ms_factor[ms_mode] * 1.0f;
+              }
+              else
+              {
+                 lr[intensity_scale][ms_mode][k][0] = ms_factor[ms_mode] * 1.0f;
+                 lr[intensity_scale][ms_mode][k][1] =
+                    (float) (ms_factor[ms_mode] * pow(t, sf / 2));
+              }
+           }
+
+         /* illegal is_pos used to do ms processing */
+           if (ms_mode == 0)
+           {                   /* ms_mode = 0 */
+              lr[intensity_scale][ms_mode][k][0] = 1.0f;
+              lr[intensity_scale][ms_mode][k][1] = 0.0f;
+           }
+           else
+           {
+            /* ms_mode = 1, in is bands is routine does ms processing */
+              lr[intensity_scale][ms_mode][k][0] = 1.0f;
+              lr[intensity_scale][ms_mode][k][1] = 1.0f;
+           }
+           k++;
+           n = n + n;
+        }
+      }
+   }
+
+}
+/*-------------------------------------------------------------*/
diff --git a/codecs/mp3/src/mdct.c b/codecs/mp3/src/mdct.c
new file mode 100755 (executable)
index 0000000..7e95317
--- /dev/null
@@ -0,0 +1,239 @@
+/*____________________________________________________________________________
+       
+       FreeAmp - The Free MP3 Player
+
+        MP3 Decoder originally Copyright (C) 1995-1997 Xing Technology
+        Corp.  http://www.xingtech.com
+
+       Portions Copyright (C) 1998-1999 EMusic.com
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program; if not, write to the Free Software
+       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+       
+       $Id$
+____________________________________________________________________________*/
+
+/****  mdct.c  ***************************************************
+
+Layer III 
+
+  cos transform for n=18, n=6
+
+computes  c[k] =  Sum( cos((pi/4*n)*(2*k+1)*(2*p+1))*f[p] )
+                k = 0, ...n-1,  p = 0...n-1
+
+
+inplace ok.
+
+******************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <float.h>
+#include <math.h>
+
+#ifdef ASM_X86
+extern void imdct18_asm(float f[18]);
+extern void imdct6_3_asm(float f[]);
+#endif /* ASM_X86 */
+
+/*------ 18 point xform -------*/
+float mdct18w[18];
+float mdct18w2[9];
+float coef[9][4];
+
+float mdct6_3v[6];
+float mdct6_3v2[3];
+float coef87;
+
+typedef struct
+{
+   float *w;
+   float *w2;
+   void *coef;
+}
+IMDCT_INIT_BLOCK;
+
+static IMDCT_INIT_BLOCK imdct_info_18 =
+{mdct18w, mdct18w2, coef};
+static IMDCT_INIT_BLOCK imdct_info_6 =
+{mdct6_3v, mdct6_3v2, &coef87};
+
+/*====================================================================*/
+IMDCT_INIT_BLOCK *imdct_init_addr_18()
+{
+   return &imdct_info_18;
+}
+IMDCT_INIT_BLOCK *imdct_init_addr_6()
+{
+   return &imdct_info_6;
+}
+/*--------------------------------------------------------------------*/
+void imdct18(float f[18])      /* 18 point */
+{
+#ifdef ASM_X86
+   imdct18_asm(f);
+#else
+   int p;
+   float a[9], b[9];
+   float ap, bp, a8p, b8p;
+   float g1, g2;
+
+
+   for (p = 0; p < 4; p++)
+   {
+      g1 = mdct18w[p] * f[p];
+      g2 = mdct18w[17 - p] * f[17 - p];
+      ap = g1 + g2;            // a[p]
+
+      bp = mdct18w2[p] * (g1 - g2);    // b[p]
+
+      g1 = mdct18w[8 - p] * f[8 - p];
+      g2 = mdct18w[9 + p] * f[9 + p];
+      a8p = g1 + g2;           // a[8-p]
+
+      b8p = mdct18w2[8 - p] * (g1 - g2);       // b[8-p]
+
+      a[p] = ap + a8p;
+      a[5 + p] = ap - a8p;
+      b[p] = bp + b8p;
+      b[5 + p] = bp - b8p;
+   }
+   g1 = mdct18w[p] * f[p];
+   g2 = mdct18w[17 - p] * f[17 - p];
+   a[p] = g1 + g2;
+   b[p] = mdct18w2[p] * (g1 - g2);
+
+
+   f[0] = 0.5f * (a[0] + a[1] + a[2] + a[3] + a[4]);
+   f[1] = 0.5f * (b[0] + b[1] + b[2] + b[3] + b[4]);
+
+   f[2] = coef[1][0] * a[5] + coef[1][1] * a[6] + coef[1][2] * a[7]
+      + coef[1][3] * a[8];
+   f[3] = coef[1][0] * b[5] + coef[1][1] * b[6] + coef[1][2] * b[7]
+      + coef[1][3] * b[8] - f[1];
+   f[1] = f[1] - f[0];
+   f[2] = f[2] - f[1];
+
+   f[4] = coef[2][0] * a[0] + coef[2][1] * a[1] + coef[2][2] * a[2]
+      + coef[2][3] * a[3] - a[4];
+   f[5] = coef[2][0] * b[0] + coef[2][1] * b[1] + coef[2][2] * b[2]
+      + coef[2][3] * b[3] - b[4] - f[3];
+   f[3] = f[3] - f[2];
+   f[4] = f[4] - f[3];
+
+   f[6] = coef[3][0] * (a[5] - a[7] - a[8]);
+   f[7] = coef[3][0] * (b[5] - b[7] - b[8]) - f[5];
+   f[5] = f[5] - f[4];
+   f[6] = f[6] - f[5];
+
+   f[8] = coef[4][0] * a[0] + coef[4][1] * a[1] + coef[4][2] * a[2]
+      + coef[4][3] * a[3] + a[4];
+   f[9] = coef[4][0] * b[0] + coef[4][1] * b[1] + coef[4][2] * b[2]
+      + coef[4][3] * b[3] + b[4] - f[7];
+   f[7] = f[7] - f[6];
+   f[8] = f[8] - f[7];
+
+   f[10] = coef[5][0] * a[5] + coef[5][1] * a[6] + coef[5][2] * a[7]
+      + coef[5][3] * a[8];
+   f[11] = coef[5][0] * b[5] + coef[5][1] * b[6] + coef[5][2] * b[7]
+      + coef[5][3] * b[8] - f[9];
+   f[9] = f[9] - f[8];
+   f[10] = f[10] - f[9];
+
+   f[12] = 0.5f * (a[0] + a[2] + a[3]) - a[1] - a[4];
+   f[13] = 0.5f * (b[0] + b[2] + b[3]) - b[1] - b[4] - f[11];
+   f[11] = f[11] - f[10];
+   f[12] = f[12] - f[11];
+
+   f[14] = coef[7][0] * a[5] + coef[7][1] * a[6] + coef[7][2] * a[7]
+      + coef[7][3] * a[8];
+   f[15] = coef[7][0] * b[5] + coef[7][1] * b[6] + coef[7][2] * b[7]
+      + coef[7][3] * b[8] - f[13];
+   f[13] = f[13] - f[12];
+   f[14] = f[14] - f[13];
+
+   f[16] = coef[8][0] * a[0] + coef[8][1] * a[1] + coef[8][2] * a[2]
+      + coef[8][3] * a[3] + a[4];
+   f[17] = coef[8][0] * b[0] + coef[8][1] * b[1] + coef[8][2] * b[2]
+      + coef[8][3] * b[3] + b[4] - f[15];
+   f[15] = f[15] - f[14];
+   f[16] = f[16] - f[15];
+   f[17] = f[17] - f[16];
+
+
+   return;
+#endif
+}
+/*--------------------------------------------------------------------*/
+/* does 3, 6 pt dct.  changes order from f[i][window] c[window][i] */
+void imdct6_3(float f[])       /* 6 point */
+{
+#ifdef ASM_X86
+   imdct6_3_asm(f);
+#else
+   int w;
+   float buf[18];
+   float *a, *c;               // b[i] = a[3+i]
+
+   float g1, g2;
+   float a02, b02;
+
+   c = f;
+   a = buf;
+   for (w = 0; w < 3; w++)
+   {
+      g1 = mdct6_3v[0] * f[3 * 0];
+      g2 = mdct6_3v[5] * f[3 * 5];
+      a[0] = g1 + g2;
+      a[3 + 0] = mdct6_3v2[0] * (g1 - g2);
+
+      g1 = mdct6_3v[1] * f[3 * 1];
+      g2 = mdct6_3v[4] * f[3 * 4];
+      a[1] = g1 + g2;
+      a[3 + 1] = mdct6_3v2[1] * (g1 - g2);
+
+      g1 = mdct6_3v[2] * f[3 * 2];
+      g2 = mdct6_3v[3] * f[3 * 3];
+      a[2] = g1 + g2;
+      a[3 + 2] = mdct6_3v2[2] * (g1 - g2);
+
+      a += 6;
+      f++;
+   }
+
+   a = buf;
+   for (w = 0; w < 3; w++)
+   {
+      a02 = (a[0] + a[2]);
+      b02 = (a[3 + 0] + a[3 + 2]);
+      c[0] = a02 + a[1];
+      c[1] = b02 + a[3 + 1];
+      c[2] = coef87 * (a[0] - a[2]);
+      c[3] = coef87 * (a[3 + 0] - a[3 + 2]) - c[1];
+      c[1] = c[1] - c[0];
+      c[2] = c[2] - c[1];
+      c[4] = a02 - a[1] - a[1];
+      c[5] = b02 - a[3 + 1] - a[3 + 1] - c[3];
+      c[3] = c[3] - c[2];
+      c[4] = c[4] - c[3];
+      c[5] = c[5] - c[4];
+      a += 6;
+      c += 6;
+   }
+
+   return;
+#endif
+}
+/*--------------------------------------------------------------------*/
diff --git a/codecs/mp3/src/mhead.c b/codecs/mp3/src/mhead.c
new file mode 100755 (executable)
index 0000000..d368f09
--- /dev/null
@@ -0,0 +1,321 @@
+/*____________________________________________________________________________
+       
+       FreeAmp - The Free MP3 Player
+
+        MP3 Decoder originally Copyright (C) 1995-1997 Xing Technology
+        Corp.  http://www.xingtech.com
+
+       Portions Copyright (C) 1998-1999 EMusic.com
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program; if not, write to the Free Software
+       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+       
+       $Id$
+____________________________________________________________________________*/
+
+/*------------ mhead.c ----------------------------------------------
+  mpeg audio
+  extract info from mpeg header
+  portable version (adapted from c:\eco\mhead.c
+
+  add Layer III
+
+  mods 6/18/97 re mux restart, 32 bit ints
+
+  mod 5/7/98 parse mpeg 2.5
+
+---------------------------------------------------------------------*/
+#include <stdlib.h>
+#include <stdio.h>
+#include <float.h>
+#include <math.h>
+#include "L3.h"
+#include "mhead.h"             /* mpeg header structure */
+
+static int mp_br_table[2][16] =
+{{0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0},
+ {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 0}};
+static int mp_sr20_table[2][4] =
+{{441, 480, 320, -999}, {882, 960, 640, -999}};
+
+static int mp_br_tableL1[2][16] =
+{{0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 0},/* mpeg2 */
+ {0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 0}};
+
+static int mp_br_tableL3[2][16] =
+{{0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0},      /* mpeg 2 */
+ {0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0}};
+
+
+
+static int find_sync(unsigned char *buf, int n);
+static int sync_scan(unsigned char *buf, int n, int i0);
+static int sync_test(unsigned char *buf, int n, int isync, int padbytes);
+
+// jdw
+extern unsigned int g_jdw_additional;
+
+/*--------------------------------------------------------------*/
+int head_info(unsigned char *buf, unsigned int n, MPEG_HEAD * h)
+{
+   int framebytes;
+   int mpeg25_flag;
+  
+   if (n > 10000)
+      n = 10000;               /* limit scan for free format */
+
+
+
+   h->sync = 0;
+   //if ((buf[0] == 0xFF) && ((buf[1] & 0xF0) == 0xF0))
+   if ((buf[0] == 0xFF) && ((buf[0+1] & 0xF0) == 0xF0))
+   {
+      mpeg25_flag = 0;         // mpeg 1 & 2
+
+   }
+   else if ((buf[0] == 0xFF) && ((buf[0+1] & 0xF0) == 0xE0))
+   {
+      mpeg25_flag = 1;         // mpeg 2.5
+
+   }
+   else
+      return 0;                        // sync fail
+
+   h->sync = 1;
+   if (mpeg25_flag)
+      h->sync = 2;             //low bit clear signals mpeg25 (as in 0xFFE)
+
+   h->id = (buf[0+1] & 0x08) >> 3;
+   h->option = (buf[0+1] & 0x06) >> 1;
+   h->prot = (buf[0+1] & 0x01);
+
+   h->br_index = (buf[0+2] & 0xf0) >> 4;
+   h->sr_index = (buf[0+2] & 0x0c) >> 2;
+   h->pad = (buf[0+2] & 0x02) >> 1;
+   h->private_bit = (buf[0+2] & 0x01);
+   h->mode = (buf[0+3] & 0xc0) >> 6;
+   h->mode_ext = (buf[0+3] & 0x30) >> 4;
+   h->cr = (buf[0+3] & 0x08) >> 3;
+   h->original = (buf[0+3] & 0x04) >> 2;
+   h->emphasis = (buf[0+3] & 0x03);
+
+
+// if( mpeg25_flag ) {
+ //    if( h->sr_index == 2 ) return 0;   // fail 8khz
+ //}
+
+
+/* compute framebytes for Layer I, II, III */
+   if (h->option < 1)
+      return 0;
+   if (h->option > 3)
+      return 0;
+
+   framebytes = 0;
+
+   if (h->br_index > 0)
+   {
+      if (h->option == 3)
+      {                                /* layer I */
+        framebytes =
+           240 * mp_br_tableL1[h->id][h->br_index]
+           / mp_sr20_table[h->id][h->sr_index];
+        framebytes = 4 * framebytes;
+      }
+      else if (h->option == 2)
+      {                                /* layer II */
+        framebytes =
+           2880 * mp_br_table[h->id][h->br_index]
+           / mp_sr20_table[h->id][h->sr_index];
+      }
+      else if (h->option == 1)
+      {                                /* layer III */
+        if (h->id)
+        {                      // mpeg1
+
+           framebytes =
+              2880 * mp_br_tableL3[h->id][h->br_index]
+              / mp_sr20_table[h->id][h->sr_index];
+        }
+        else
+        {                      // mpeg2
+
+           if (mpeg25_flag)
+           {                   // mpeg2.2
+
+              framebytes =
+                 2880 * mp_br_tableL3[h->id][h->br_index]
+                 / mp_sr20_table[h->id][h->sr_index];
+           }
+           else
+           {
+              framebytes =
+                 1440 * mp_br_tableL3[h->id][h->br_index]
+                 / mp_sr20_table[h->id][h->sr_index];
+           }
+        }
+      }
+   }
+   else
+      framebytes = find_sync(buf, n);  /* free format */
+
+  return framebytes;
+}
+
+int head_info3(unsigned char *buf, unsigned int n, MPEG_HEAD *h, int *br, unsigned int *searchForward) {
+       unsigned int pBuf = 0;
+       // jdw insertion...
+   while ((pBuf < n) && !((buf[pBuf] == 0xFF) && 
+          ((buf[pBuf+1] & 0xF0) == 0xF0 || (buf[pBuf+1] & 0xF0) == 0xE0))) 
+   {
+               pBuf++;
+   }
+
+   if (pBuf == n) return 0;
+
+   *searchForward = pBuf;
+   return head_info2(&(buf[pBuf]),n,h,br);
+
+}
+
+/*--------------------------------------------------------------*/
+int head_info2(unsigned char *buf, unsigned int n, MPEG_HEAD * h, int *br)
+{
+   int framebytes;
+
+/*---  return br (in bits/sec) in addition to frame bytes ---*/
+
+   *br = 0;
+/*-- assume fail --*/
+   framebytes = head_info(buf, n, h);
+
+   if (framebytes == 0)
+      return 0; 
+
+   if (h->option == 1)
+   {                           /* layer III */
+      if (h->br_index > 0)
+        *br = 1000 * mp_br_tableL3[h->id][h->br_index];
+      else
+      {
+        if (h->id)             // mpeg1
+
+           *br = 1000 * framebytes * mp_sr20_table[h->id][h->sr_index] / (144 * 20);
+        else
+        {                      // mpeg2
+
+           if ((h->sync & 1) == 0)     //  flags mpeg25
+
+              *br = 500 * framebytes * mp_sr20_table[h->id][h->sr_index] / (72 * 20);
+           else
+              *br = 1000 * framebytes * mp_sr20_table[h->id][h->sr_index] / (72 * 20);
+        }
+      }
+   }
+   if (h->option == 2)
+   {                           /* layer II */
+      if (h->br_index > 0)
+        *br = 1000 * mp_br_table[h->id][h->br_index];
+      else
+        *br = 1000 * framebytes * mp_sr20_table[h->id][h->sr_index]
+           / (144 * 20);
+   }
+   if (h->option == 3)
+   {                           /* layer I */
+      if (h->br_index > 0)
+        *br = 1000 * mp_br_tableL1[h->id][h->br_index];
+      else
+        *br = 1000 * framebytes * mp_sr20_table[h->id][h->sr_index]
+           / (48 * 20);
+   }
+
+
+   return framebytes;
+}
+/*--------------------------------------------------------------*/
+static int compare(unsigned char *buf, unsigned char *buf2)
+{
+   if (buf[0] != buf2[0])
+      return 0;
+   if (buf[1] != buf2[1])
+      return 0;
+   return 1;
+}
+/*----------------------------------------------------------*/
+/*-- does not scan for initial sync, initial sync assumed --*/
+static int find_sync(unsigned char *buf, int n)
+{
+   int i0, isync, nmatch, pad;
+   int padbytes, option;
+
+/* mod 4/12/95 i0 change from 72, allows as low as 8kbits for mpeg1 */
+   i0 = 24;
+   padbytes = 1;
+   option = (buf[1] & 0x06) >> 1;
+   if (option == 3)
+   {
+      padbytes = 4;
+      i0 = 24;                 /* for shorter layer I frames */
+   }
+
+   pad = (buf[2] & 0x02) >> 1;
+
+   n -= 3;                     /*  need 3 bytes of header  */
+
+   while (i0 < 2000)
+   {
+      isync = sync_scan(buf, n, i0);
+      i0 = isync + 1;
+      isync -= pad;
+      if (isync <= 0)
+        return 0;
+      nmatch = sync_test(buf, n, isync, padbytes);
+      if (nmatch > 0)
+        return isync;
+   }
+
+   return 0;
+}
+/*------------------------------------------------------*/
+/*---- scan for next sync, assume start is valid -------*/
+/*---- return number bytes to next sync ----------------*/
+static int sync_scan(unsigned char *buf, int n, int i0)
+{
+   int i;
+
+   for (i = i0; i < n; i++)
+      if (compare(buf, buf + i))
+        return i;
+
+   return 0;
+}
+/*------------------------------------------------------*/
+/*- test consecutative syncs, input isync without pad --*/
+static int sync_test(unsigned char *buf, int n, int isync, int padbytes)
+{
+   int i, nmatch, pad;
+
+   nmatch = 0;
+   for (i = 0;;)
+   {
+      pad = padbytes * ((buf[i + 2] & 0x02) >> 1);
+      i += (pad + isync);
+      if (i > n)
+        break;
+      if (!compare(buf, buf + i))
+        return -nmatch;
+      nmatch++;
+   }
+   return nmatch;
+}
diff --git a/codecs/mp3/src/msis.c b/codecs/mp3/src/msis.c
new file mode 100755 (executable)
index 0000000..a30e534
--- /dev/null
@@ -0,0 +1,300 @@
+/*____________________________________________________________________________
+       
+       FreeAmp - The Free MP3 Player
+
+        MP3 Decoder originally Copyright (C) 1995-1997 Xing Technology
+        Corp.  http://www.xingtech.com
+
+       Portions Copyright (C) 1998-1999 EMusic.com
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program; if not, write to the Free Software
+       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+       
+       $Id$
+____________________________________________________________________________*/
+
+/****  msis.c  ***************************************************
+  Layer III  
+ antialias, ms and is stereo precessing
+
+**** is_process assumes never switch 
+      from short to long in is region *****
+     
+is_process does ms or stereo in "forbidded sf regions"
+    //ms_mode = 0 
+    lr[0][i][0] = 1.0f;
+    lr[0][i][1] = 0.0f;
+    // ms_mode = 1, in is bands is routine does ms processing 
+    lr[1][i][0] = 1.0f;
+    lr[1][i][1] = 1.0f;
+
+******************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <float.h>
+#include <math.h>
+#include "L3.h"
+#include "mhead.h"
+
+/* The functions are different than their prototypes, by design */
+
+typedef float ARRAY2[2];
+typedef float ARRAY8_2[8][2];
+
+
+/* nBand[0] = long, nBand[1] = short */
+
+/* intensity stereo */
+/* if ms mode quant pre-scales all values by 1.0/sqrt(2.0) ms_mode in table
+   compensates   */
+
+
+/* intensity stereo MPEG2 */
+/* lr2[intensity_scale][ms_mode][sflen_offset+sf][left/right] */
+typedef float ARRAY2_64_2[2][64][2];
+typedef float ARRAY64_2[64][2];
+
+#ifdef ASM_X86
+extern void antialias_asm(float x[], int n);
+#endif /* ASM_X86 */
+
+
+/*===============================================================*/
+ARRAY2 *alias_init_addr(MPEG *m)
+{
+   return m->cupl.csa;
+}
+/*-----------------------------------------------------------*/
+ARRAY8_2 *msis_init_addr(MPEG *m)
+{
+/*-------
+pi = 4.0*atan(1.0);
+t = pi/12.0;
+for(i=0;i<7;i++) {
+    s = sin(i*t);
+    c = cos(i*t);
+    // ms_mode = 0 
+    m->cupl.lr[0][i][0] = (float)(s/(s+c));
+    m->cupl.lr[0][i][1] = (float)(c/(s+c));
+    // ms_mode = 1 
+    m->cupl.lr[1][i][0] = (float)(sqrt(2.0)*(s/(s+c)));
+    m->cupl.lr[1][i][1] = (float)(sqrt(2.0)*(c/(s+c)));
+}
+//sf = 7 
+//ms_mode = 0 
+m->cupl.lr[0][i][0] = 1.0f;
+m->cupl.lr[0][i][1] = 0.0f;
+// ms_mode = 1, in is bands is routine does ms processing 
+m->cupl.lr[1][i][0] = 1.0f;
+m->cupl.lr[1][i][1] = 1.0f;
+------------*/
+
+   return m->cupl.lr;
+}
+/*-------------------------------------------------------------*/
+ARRAY2_64_2 *msis_init_addr_MPEG2(MPEG *m)
+{
+   return m->cupl.lr2;
+}
+/*===============================================================*/
+void antialias(MPEG *m, float x[], int n)
+{
+#ifdef ASM_X86
+   antialias_asm(x, n);
+#else
+   int i, k;
+   float a, b;
+
+   for (k = 0; k < n; k++)
+   {
+      for (i = 0; i < 8; i++)
+      {
+        a = x[17 - i];
+        b = x[18 + i];
+        x[17 - i] = a * m->cupl.csa[i][0] - b * m->cupl.csa[i][1];
+        x[18 + i] = b * m->cupl.csa[i][0] + a * m->cupl.csa[i][1];
+      }
+      x += 18;
+   }
+#endif
+}
+/*===============================================================*/
+void ms_process(float x[][1152], int n)                /* sum-difference stereo */
+{
+   int i;
+   float xl, xr;
+
+/*-- note: sqrt(2) done scaling by dequant ---*/
+   for (i = 0; i < n; i++)
+   {
+      xl = x[0][i] + x[1][i];
+      xr = x[0][i] - x[1][i];
+      x[0][i] = xl;
+      x[1][i] = xr;
+   }
+   return;
+}
+/*===============================================================*/
+void is_process_MPEG1(MPEG *vm, float x[][1152],       /* intensity stereo */
+                     SCALEFACT * sf,
+                     CB_INFO cb_info[2],       /* [ch] */
+                     int nsamp, int ms_mode)
+{
+   int i, j, n, cb, w;
+   float fl, fr;
+   int m;
+   int isf;
+   float fls[3], frs[3];
+   int cb0;
+
+
+   cb0 = cb_info[1].cbmax;     /* start at end of right */
+   i = vm->cupl.sfBandIndex[cb_info[1].cbtype][cb0];
+   cb0++;
+   m = nsamp - i;              /* process to len of left */
+
+   if (cb_info[1].cbtype)
+      goto short_blocks;
+/*------------------------*/
+/* long_blocks: */
+   for (cb = cb0; cb < 21; cb++)
+   {
+      isf = sf->l[cb];
+      n = vm->cupl.nBand[0][cb];
+      fl = vm->cupl.lr[ms_mode][isf][0];
+      fr = vm->cupl.lr[ms_mode][isf][1];
+      for (j = 0; j < n; j++, i++)
+      {
+        if (--m < 0)
+           goto exit;
+        x[1][i] = fr * x[0][i];
+        x[0][i] = fl * x[0][i];
+      }
+   }
+   return;
+/*------------------------*/
+ short_blocks:
+   for (cb = cb0; cb < 12; cb++)
+   {
+      for (w = 0; w < 3; w++)
+      {
+        isf = sf->s[w][cb];
+        fls[w] = vm->cupl.lr[ms_mode][isf][0];
+        frs[w] = vm->cupl.lr[ms_mode][isf][1];
+      }
+      n = vm->cupl.nBand[1][cb];
+      for (j = 0; j < n; j++)
+      {
+        m -= 3;
+        if (m < 0)
+           goto exit;
+        x[1][i] = frs[0] * x[0][i];
+        x[0][i] = fls[0] * x[0][i];
+        x[1][1 + i] = frs[1] * x[0][1 + i];
+        x[0][1 + i] = fls[1] * x[0][1 + i];
+        x[1][2 + i] = frs[2] * x[0][2 + i];
+        x[0][2 + i] = fls[2] * x[0][2 + i];
+        i += 3;
+      }
+   }
+
+ exit:
+   return;
+}
+/*===============================================================*/
+void is_process_MPEG2(MPEG *vm, float x[][1152],       /* intensity stereo */
+                     SCALEFACT * sf,
+                     CB_INFO cb_info[2],       /* [ch] */
+                     IS_SF_INFO * is_sf_info,
+                     int nsamp, int ms_mode)
+{
+   int i, j, k, n, cb, w;
+   float fl, fr;
+   int m;
+   int isf;
+   int il[21];
+   int tmp;
+   int r;
+   ARRAY2 *lr;
+   int cb0, cb1;
+
+   lr = vm->cupl.lr2[is_sf_info->intensity_scale][ms_mode];
+
+   if (cb_info[1].cbtype)
+      goto short_blocks;
+
+/*------------------------*/
+/* long_blocks: */
+   cb0 = cb_info[1].cbmax;     /* start at end of right */
+   i = vm->cupl.sfBandIndex[0][cb0];
+   m = nsamp - i;              /* process to len of left */
+/* gen sf info */
+   for (k = r = 0; r < 3; r++)
+   {
+      tmp = (1 << is_sf_info->slen[r]) - 1;
+      for (j = 0; j < is_sf_info->nr[r]; j++, k++)
+        il[k] = tmp;
+   }
+   for (cb = cb0 + 1; cb < 21; cb++)
+   {
+      isf = il[cb] + sf->l[cb];
+      fl = lr[isf][0];
+      fr = lr[isf][1];
+      n = vm->cupl.nBand[0][cb];
+      for (j = 0; j < n; j++, i++)
+      {
+        if (--m < 0)
+           goto exit;
+        x[1][i] = fr * x[0][i];
+        x[0][i] = fl * x[0][i];
+      }
+   }
+   return;
+/*------------------------*/
+ short_blocks:
+
+   for (k = r = 0; r < 3; r++)
+   {
+      tmp = (1 << is_sf_info->slen[r]) - 1;
+      for (j = 0; j < is_sf_info->nr[r]; j++, k++)
+        il[k] = tmp;
+   }
+
+   for (w = 0; w < 3; w++)
+   {
+      cb0 = cb_info[1].cbmax_s[w];     /* start at end of right */
+      i = vm->cupl.sfBandIndex[1][cb0] + w;
+      cb1 = cb_info[0].cbmax_s[w];     /* process to end of left */
+
+      for (cb = cb0 + 1; cb <= cb1; cb++)
+      {
+        isf = il[cb] + sf->s[w][cb];
+        fl = lr[isf][0];
+        fr = lr[isf][1];
+        n = vm->cupl.nBand[1][cb];
+        for (j = 0; j < n; j++)
+        {
+           x[1][i] = fr * x[0][i];
+           x[0][i] = fl * x[0][i];
+           i += 3;
+        }
+      }
+
+   }
+
+ exit:
+   return;
+}
+/*===============================================================*/
diff --git a/codecs/mp3/src/uph.c b/codecs/mp3/src/uph.c
new file mode 100755 (executable)
index 0000000..c3cab0a
--- /dev/null
@@ -0,0 +1,505 @@
+/*____________________________________________________________________________
+       
+       FreeAmp - The Free MP3 Player
+
+        MP3 Decoder originally Copyright (C) 1995-1997 Xing Technology
+        Corp.  http://www.xingtech.com
+
+       Portions Copyright (C) 1998-1999 EMusic.com
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program; if not, write to the Free Software
+       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+       
+       $Id$
+____________________________________________________________________________*/
+
+/****  uph.c  ***************************************************
+
+Layer 3 audio
+ huffman decode
+
+
+******************************************************************/
+#include <stdlib.h>
+#include <stdio.h>
+#include <float.h>
+#include <math.h>
+
+#include "L3.h"
+
+
+#ifdef _MSC_VER
+#pragma warning(disable: 4505)
+#endif
+
+/*===============================================================*/
+
+/* max bits required for any lookup - change if htable changes */
+/* quad required 10 bit w/signs  must have (MAXBITS+2) >= 10   */
+#define MAXBITS 9
+
+static HUFF_ELEMENT huff_table_0[4] =
+{{0}, {0}, {0}, {64}};                 /* dummy must not use */
+
+#include "htable.h"
+
+/*-- 6 bit lookup (purgebits, value) --*/
+static unsigned char quad_table_a[][2] =
+{
+  {6, 11}, {6, 15}, {6, 13}, {6, 14}, {6, 7}, {6, 5}, {5, 9},
+  {5, 9}, {5, 6}, {5, 6}, {5, 3}, {5, 3}, {5, 10}, {5, 10},
+  {5, 12}, {5, 12}, {4, 2}, {4, 2}, {4, 2}, {4, 2}, {4, 1},
+  {4, 1}, {4, 1}, {4, 1}, {4, 4}, {4, 4}, {4, 4}, {4, 4},
+  {4, 8}, {4, 8}, {4, 8}, {4, 8}, {1, 0}, {1, 0}, {1, 0},
+  {1, 0}, {1, 0}, {1, 0}, {1, 0}, {1, 0}, {1, 0}, {1, 0},
+  {1, 0}, {1, 0}, {1, 0}, {1, 0}, {1, 0}, {1, 0}, {1, 0},
+  {1, 0}, {1, 0}, {1, 0}, {1, 0}, {1, 0}, {1, 0}, {1, 0},
+  {1, 0}, {1, 0}, {1, 0}, {1, 0}, {1, 0}, {1, 0}, {1, 0},
+  {1, 0},
+};
+
+
+typedef struct
+{
+   HUFF_ELEMENT *table;
+   int linbits;
+   int ncase;
+}
+HUFF_SETUP;
+
+#define no_bits       0
+#define one_shot      1
+#define no_linbits    2
+#define have_linbits  3
+#define quad_a        4
+#define quad_b        5
+
+
+static HUFF_SETUP table_look[] =
+{
+  {huff_table_0, 0, no_bits},
+  {huff_table_1, 0, one_shot},
+  {huff_table_2, 0, one_shot},
+  {huff_table_3, 0, one_shot},
+  {huff_table_0, 0, no_bits},
+  {huff_table_5, 0, one_shot},
+  {huff_table_6, 0, one_shot},
+  {huff_table_7, 0, no_linbits},
+  {huff_table_8, 0, no_linbits},
+  {huff_table_9, 0, no_linbits},
+  {huff_table_10, 0, no_linbits},
+  {huff_table_11, 0, no_linbits},
+  {huff_table_12, 0, no_linbits},
+  {huff_table_13, 0, no_linbits},
+  {huff_table_0, 0, no_bits},
+  {huff_table_15, 0, no_linbits},
+  {huff_table_16, 1, have_linbits},
+  {huff_table_16, 2, have_linbits},
+  {huff_table_16, 3, have_linbits},
+  {huff_table_16, 4, have_linbits},
+  {huff_table_16, 6, have_linbits},
+  {huff_table_16, 8, have_linbits},
+  {huff_table_16, 10, have_linbits},
+  {huff_table_16, 13, have_linbits},
+  {huff_table_24, 4, have_linbits},
+  {huff_table_24, 5, have_linbits},
+  {huff_table_24, 6, have_linbits},
+  {huff_table_24, 7, have_linbits},
+  {huff_table_24, 8, have_linbits},
+  {huff_table_24, 9, have_linbits},
+  {huff_table_24, 11, have_linbits},
+  {huff_table_24, 13, have_linbits},
+  {huff_table_0, 0, quad_a},
+  {huff_table_0, 0, quad_b},
+};
+
+/*========================================================*/
+extern BITDAT bitdat;
+
+/*------------- get n bits from bitstream -------------*/
+/* unused
+static unsigned int bitget(int n)
+{
+   unsigned int x;
+
+   if (bitdat.bits < n)
+   {                   */      /* refill bit buf if necessary */
+/*      while (bitdat.bits <= 24)
+      {
+        bitdat.bitbuf = (bitdat.bitbuf << 8) | *bitdat.bs_ptr++;
+        bitdat.bits += 8;
+      }
+   }
+   bitdat.bits -= n;
+   x = bitdat.bitbuf >> bitdat.bits;
+   bitdat.bitbuf -= x << bitdat.bits;
+   return x;
+}
+*/
+/*----- get n bits  - checks for n+2 avail bits (linbits+sign) -----*/
+static unsigned int bitget_lb(int n)
+{
+   unsigned int x;
+
+   if (bitdat.bits < (n + 2))
+   {                           /* refill bit buf if necessary */
+      while (bitdat.bits <= 24)
+      {
+        bitdat.bitbuf = (bitdat.bitbuf << 8) | *bitdat.bs_ptr++;
+        bitdat.bits += 8;
+      }
+   }
+   bitdat.bits -= n;
+   x = bitdat.bitbuf >> bitdat.bits;
+   bitdat.bitbuf -= x << bitdat.bits;
+   return x;
+}
+
+
+
+
+/*------------- get n bits but DO NOT remove from bitstream --*/
+static unsigned int bitget2(int n)
+{
+   unsigned int x;
+
+   if (bitdat.bits < (MAXBITS + 2))
+   {                           /* refill bit buf if necessary */
+      while (bitdat.bits <= 24)
+      {
+        bitdat.bitbuf = (bitdat.bitbuf << 8) | *bitdat.bs_ptr++;
+        bitdat.bits += 8;
+      }
+   }
+   x = bitdat.bitbuf >> (bitdat.bits - n);
+   return x;
+}
+/*------------- remove n bits from bitstream ---------*/
+/* unused
+static void bitget_purge(int n)
+{
+   bitdat.bits -= n;
+   bitdat.bitbuf -= (bitdat.bitbuf >> bitdat.bits) << bitdat.bits;
+}
+*/
+/*------------- get 1 bit from bitstream NO CHECK -------------*/
+/* unused
+static unsigned int bitget_1bit()
+{
+   unsigned int x;
+
+   bitdat.bits--;
+   x = bitdat.bitbuf >> bitdat.bits;
+   bitdat.bitbuf -= x << bitdat.bits;
+   return x;
+}
+*/
+/*========================================================*/
+/*========================================================*/
+#define mac_bitget_check(n) if( bitdat.bits < (n) ) {                   \
+    while( bitdat.bits <= 24 ) {            \
+        bitdat.bitbuf = (bitdat.bitbuf << 8) | *bitdat.bs_ptr++; \
+        bitdat.bits += 8;                   \
+    }                                       \
+}
+/*---------------------------------------------------------*/
+#define mac_bitget2(n)  (bitdat.bitbuf >> (bitdat.bits-n));
+/*---------------------------------------------------------*/
+#define mac_bitget(n) ( bitdat.bits -= n,           \
+         code  = bitdat.bitbuf >> bitdat.bits,     \
+         bitdat.bitbuf -= code << bitdat.bits,     \
+         code )
+/*---------------------------------------------------------*/
+#define mac_bitget_purge(n) bitdat.bits -= n,                    \
+    bitdat.bitbuf -= (bitdat.bitbuf >> bitdat.bits) << bitdat.bits;
+/*---------------------------------------------------------*/
+#define mac_bitget_1bit() ( bitdat.bits--,                           \
+         code  = bitdat.bitbuf >> bitdat.bits,    \
+         bitdat.bitbuf -= code << bitdat.bits,  \
+         code )
+/*========================================================*/
+/*========================================================*/
+void unpack_huff(int xy[][2], int n, int ntable)
+{
+   int i;
+   HUFF_ELEMENT *t;
+   HUFF_ELEMENT *t0;
+   int linbits;
+   int bits;
+   int code;
+   int x, y;
+
+   if (n <= 0)
+      return;
+   n = n >> 1;                 /* huff in pairs */
+/*-------------*/
+   t0 = table_look[ntable].table;
+   linbits = table_look[ntable].linbits;
+   switch (table_look[ntable].ncase)
+   {
+      default:
+/*------------------------------------------*/
+      case no_bits:
+/*- table 0, no data, x=y=0--*/
+        for (i = 0; i < n; i++)
+        {
+           xy[i][0] = 0;
+           xy[i][1] = 0;
+        }
+        return;
+/*------------------------------------------*/
+      case one_shot:
+/*- single lookup, no escapes -*/
+        for (i = 0; i < n; i++)
+        {
+           mac_bitget_check((MAXBITS + 2));
+           bits = t0[0].b.signbits;
+           code = mac_bitget2(bits);
+           mac_bitget_purge(t0[1 + code].b.purgebits);
+           x = t0[1 + code].b.x;
+           y = t0[1 + code].b.y;
+           if (x)
+              if (mac_bitget_1bit())
+                 x = -x;
+           if (y)
+              if (mac_bitget_1bit())
+                 y = -y;
+           xy[i][0] = x;
+           xy[i][1] = y;
+           if (bitdat.bs_ptr > bitdat.bs_ptr_end)
+              break;           // bad data protect
+
+        }
+        return;
+/*------------------------------------------*/
+      case no_linbits:
+        for (i = 0; i < n; i++)
+        {
+           t = t0;
+           for (;;)
+           {
+              mac_bitget_check((MAXBITS + 2));
+              bits = t[0].b.signbits;
+              code = mac_bitget2(bits);
+              if (t[1 + code].b.purgebits)
+                 break;
+              t += t[1 + code].ptr;    /* ptr include 1+code */
+              mac_bitget_purge(bits);
+           }
+           mac_bitget_purge(t[1 + code].b.purgebits);
+           x = t[1 + code].b.x;
+           y = t[1 + code].b.y;
+           if (x)
+              if (mac_bitget_1bit())
+                 x = -x;
+           if (y)
+              if (mac_bitget_1bit())
+                 y = -y;
+           xy[i][0] = x;
+           xy[i][1] = y;
+           if (bitdat.bs_ptr > bitdat.bs_ptr_end)
+              break;           // bad data protect
+
+        }
+        return;
+/*------------------------------------------*/
+      case have_linbits:
+        for (i = 0; i < n; i++)
+        {
+           t = t0;
+           for (;;)
+           {
+              bits = t[0].b.signbits;
+              code = bitget2(bits);
+              if (t[1 + code].b.purgebits)
+                 break;
+              t += t[1 + code].ptr;    /* ptr includes 1+code */
+              mac_bitget_purge(bits);
+           }
+           mac_bitget_purge(t[1 + code].b.purgebits);
+           x = t[1 + code].b.x;
+           y = t[1 + code].b.y;
+           if (x == 15)
+              x += bitget_lb(linbits);
+           if (x)
+              if (mac_bitget_1bit())
+                 x = -x;
+           if (y == 15)
+              y += bitget_lb(linbits);
+           if (y)
+              if (mac_bitget_1bit())
+                 y = -y;
+           xy[i][0] = x;
+           xy[i][1] = y;
+           if (bitdat.bs_ptr > bitdat.bs_ptr_end)
+              break;           // bad data protect
+
+        }
+        return;
+   }
+/*--- end switch ---*/
+
+}
+/*==========================================================*/
+int unpack_huff_quad(int vwxy[][4], int n, int nbits, int ntable)
+{
+   int i;
+   int code;
+   int x, y, v, w;
+   int tmp;
+   int i_non_zero, tmp_nz;
+
+   tmp_nz = 15;
+   i_non_zero = -1;
+
+   n = n >> 2;                 /* huff in quads */
+
+   if (ntable)
+      goto case_quad_b;
+
+/* case_quad_a: */
+   for (i = 0; i < n; i++)
+   {
+      if (nbits <= 0)
+        break;
+      mac_bitget_check(10);
+      code = mac_bitget2(6);
+      nbits -= quad_table_a[code][0];
+      mac_bitget_purge(quad_table_a[code][0]);
+      tmp = quad_table_a[code][1];
+      if (tmp)
+      {
+        i_non_zero = i;
+        tmp_nz = tmp;
+      }
+      v = (tmp >> 3) & 1;
+      w = (tmp >> 2) & 1;
+      x = (tmp >> 1) & 1;
+      y = tmp & 1;
+      if (v)
+      {
+        if (mac_bitget_1bit())
+           v = -v;
+        nbits--;
+      }
+      if (w)
+      {
+        if (mac_bitget_1bit())
+           w = -w;
+        nbits--;
+      }
+      if (x)
+      {
+        if (mac_bitget_1bit())
+           x = -x;
+        nbits--;
+      }
+      if (y)
+      {
+        if (mac_bitget_1bit())
+           y = -y;
+        nbits--;
+      }
+      vwxy[i][0] = v;
+      vwxy[i][1] = w;
+      vwxy[i][2] = x;
+      vwxy[i][3] = y;
+      if (bitdat.bs_ptr > bitdat.bs_ptr_end)
+        break;                 // bad data protect
+
+   }
+   if (nbits < 0)
+   {
+      i--;
+      vwxy[i][0] = 0;
+      vwxy[i][1] = 0;
+      vwxy[i][2] = 0;
+      vwxy[i][3] = 0;
+   }
+
+   i_non_zero = (i_non_zero + 1) << 2;
+
+   if ((tmp_nz & 3) == 0)
+      i_non_zero -= 2;
+
+   return i_non_zero;
+
+/*--------------------*/
+ case_quad_b:
+   for (i = 0; i < n; i++)
+   {
+      if (nbits < 4)
+        break;
+      nbits -= 4;
+      mac_bitget_check(8);
+      tmp = mac_bitget(4) ^ 15;        /* one's complement of bitstream */
+      if (tmp)
+      {
+        i_non_zero = i;
+        tmp_nz = tmp;
+      }
+      v = (tmp >> 3) & 1;
+      w = (tmp >> 2) & 1;
+      x = (tmp >> 1) & 1;
+      y = tmp & 1;
+      if (v)
+      {
+        if (mac_bitget_1bit())
+           v = -v;
+        nbits--;
+      }
+      if (w)
+      {
+        if (mac_bitget_1bit())
+           w = -w;
+        nbits--;
+      }
+      if (x)
+      {
+        if (mac_bitget_1bit())
+           x = -x;
+        nbits--;
+      }
+      if (y)
+      {
+        if (mac_bitget_1bit())
+           y = -y;
+        nbits--;
+      }
+      vwxy[i][0] = v;
+      vwxy[i][1] = w;
+      vwxy[i][2] = x;
+      vwxy[i][3] = y;
+      if (bitdat.bs_ptr > bitdat.bs_ptr_end)
+        break;                 // bad data protect
+
+   }
+   if (nbits < 0)
+   {
+      i--;
+      vwxy[i][0] = 0;
+      vwxy[i][1] = 0;
+      vwxy[i][2] = 0;
+      vwxy[i][3] = 0;
+   }
+
+   i_non_zero = (i_non_zero + 1) << 2;
+
+   if ((tmp_nz & 3) == 0)
+      i_non_zero -= 2;
+
+   return i_non_zero;          /* return non-zero sample (to nearest pair) */
+
+}
+/*-----------------------------------------------------*/
diff --git a/codecs/mp3/src/upsf.c b/codecs/mp3/src/upsf.c
new file mode 100755 (executable)
index 0000000..1280620
--- /dev/null
@@ -0,0 +1,404 @@
+/*____________________________________________________________________________
+       
+       FreeAmp - The Free MP3 Player
+
+        MP3 Decoder originally Copyright (C) 1995-1997 Xing Technology
+        Corp.  http://www.xingtech.com
+
+       Portions Copyright (C) 1998-1999 EMusic.com
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program; if not, write to the Free Software
+       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+       
+       $Id$
+____________________________________________________________________________*/
+
+/****  upsf.c  ***************************************************
+
+Layer III 
+    unpack scale factors
+
+
+
+******************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <float.h>
+#include <math.h>
+#include "L3.h"
+
+extern int iframe;
+
+unsigned int bitget(int n);
+
+/*------------------------------------------------------------*/
+static const int slen_table[16][2] =
+{
+  {0, 0}, {0, 1},
+  {0, 2}, {0, 3},
+  {3, 0}, {1, 1},
+  {1, 2}, {1, 3},
+  {2, 1}, {2, 2},
+  {2, 3}, {3, 1},
+  {3, 2}, {3, 3},
+  {4, 2}, {4, 3},
+};
+
+/* nr_table[size+3*is_right][block type 0,1,3  2, 2+mixed][4]  */
+/* for bt=2 nr is count for group of 3 */
+static const int nr_table[6][3][4] =
+{
+ {{6, 5, 5, 5},
+  {3, 3, 3, 3},
+  {6, 3, 3, 3}},
+
+ {{6, 5, 7, 3},
+  {3, 3, 4, 2},
+  {6, 3, 4, 2}},
+
+ {{11, 10, 0, 0},
+  {6, 6, 0, 0},
+  {6, 3, 6, 0}},                       /* adjusted *//* 15, 18, 0, 0,   */
+/*-intensity stereo right chan--*/
+ {{7, 7, 7, 0},
+  {4, 4, 4, 0},
+  {6, 5, 4, 0}},
+
+ {{6, 6, 6, 3},
+  {4, 3, 3, 2},
+  {6, 4, 3, 2}},
+
+ {{8, 8, 5, 0},
+  {5, 4, 3, 0},
+  {6, 6, 3, 0}},
+};
+
+/*=============================================================*/
+void unpack_sf_sub_MPEG1(SCALEFACT sf[],
+                        GR * grdat,
+                        int scfsi,     /* bit flag */
+                        int gr)
+{
+   int sfb;
+   int slen0, slen1;
+   int block_type, mixed_block_flag, scalefac_compress;
+
+
+   block_type = grdat->block_type;
+   mixed_block_flag = grdat->mixed_block_flag;
+   scalefac_compress = grdat->scalefac_compress;
+
+   slen0 = slen_table[scalefac_compress][0];
+   slen1 = slen_table[scalefac_compress][1];
+
+
+   if (block_type == 2)
+   {
+      if (mixed_block_flag)
+      {                                /* mixed */
+        for (sfb = 0; sfb < 8; sfb++)
+           sf[0].l[sfb] = bitget(slen0);
+        for (sfb = 3; sfb < 6; sfb++)
+        {
+           sf[0].s[0][sfb] = bitget(slen0);
+           sf[0].s[1][sfb] = bitget(slen0);
+           sf[0].s[2][sfb] = bitget(slen0);
+        }
+        for (sfb = 6; sfb < 12; sfb++)
+        {
+           sf[0].s[0][sfb] = bitget(slen1);
+           sf[0].s[1][sfb] = bitget(slen1);
+           sf[0].s[2][sfb] = bitget(slen1);
+        }
+        return;
+      }
+      for (sfb = 0; sfb < 6; sfb++)
+      {
+        sf[0].s[0][sfb] = bitget(slen0);
+        sf[0].s[1][sfb] = bitget(slen0);
+        sf[0].s[2][sfb] = bitget(slen0);
+      }
+      for (; sfb < 12; sfb++)
+      {
+        sf[0].s[0][sfb] = bitget(slen1);
+        sf[0].s[1][sfb] = bitget(slen1);
+        sf[0].s[2][sfb] = bitget(slen1);
+      }
+      return;
+   }
+
+/* long blocks types 0 1 3, first granule */
+   if (gr == 0)
+   {
+      for (sfb = 0; sfb < 11; sfb++)
+        sf[0].l[sfb] = bitget(slen0);
+      for (; sfb < 21; sfb++)
+        sf[0].l[sfb] = bitget(slen1);
+      return;
+   }
+
+/* long blocks 0, 1, 3, second granule */
+   sfb = 0;
+   if (scfsi & 8)
+      for (; sfb < 6; sfb++)
+        sf[0].l[sfb] = sf[-2].l[sfb];
+   else
+      for (; sfb < 6; sfb++)
+        sf[0].l[sfb] = bitget(slen0);
+   if (scfsi & 4)
+      for (; sfb < 11; sfb++)
+        sf[0].l[sfb] = sf[-2].l[sfb];
+   else
+      for (; sfb < 11; sfb++)
+        sf[0].l[sfb] = bitget(slen0);
+   if (scfsi & 2)
+      for (; sfb < 16; sfb++)
+        sf[0].l[sfb] = sf[-2].l[sfb];
+   else
+      for (; sfb < 16; sfb++)
+        sf[0].l[sfb] = bitget(slen1);
+   if (scfsi & 1)
+      for (; sfb < 21; sfb++)
+        sf[0].l[sfb] = sf[-2].l[sfb];
+   else
+      for (; sfb < 21; sfb++)
+        sf[0].l[sfb] = bitget(slen1);
+
+
+
+   return;
+}
+/*=============================================================*/
+void unpack_sf_sub_MPEG2(SCALEFACT sf[],
+                        GR * grdat,
+                        int is_and_ch, IS_SF_INFO * sf_info)
+{
+   int sfb;
+   int slen1, slen2, slen3, slen4;
+   int nr1, nr2, nr3, nr4;
+   int i, k;
+   int preflag, intensity_scale;
+   int block_type, mixed_block_flag, scalefac_compress;
+
+
+   block_type = grdat->block_type;
+   mixed_block_flag = grdat->mixed_block_flag;
+   scalefac_compress = grdat->scalefac_compress;
+
+   preflag = 0;
+   intensity_scale = 0;                /* to avoid compiler warning */
+   if (is_and_ch == 0)
+   {
+      if (scalefac_compress < 400)
+      {
+        slen2 = scalefac_compress >> 4;
+        slen1 = slen2 / 5;
+        slen2 = slen2 % 5;
+        slen4 = scalefac_compress & 15;
+        slen3 = slen4 >> 2;
+        slen4 = slen4 & 3;
+        k = 0;
+      }
+      else if (scalefac_compress < 500)
+      {
+        scalefac_compress -= 400;
+        slen2 = scalefac_compress >> 2;
+        slen1 = slen2 / 5;
+        slen2 = slen2 % 5;
+        slen3 = scalefac_compress & 3;
+        slen4 = 0;
+        k = 1;
+      }
+      else
+      {
+        scalefac_compress -= 500;
+        slen1 = scalefac_compress / 3;
+        slen2 = scalefac_compress % 3;
+        slen3 = slen4 = 0;
+        if (mixed_block_flag)
+        {
+           slen3 = slen2;      /* adjust for long/short mix logic */
+           slen2 = slen1;
+        }
+        preflag = 1;
+        k = 2;
+      }
+   }
+   else
+   {                           /* intensity stereo ch = 1 (right) */
+      intensity_scale = scalefac_compress & 1;
+      scalefac_compress >>= 1;
+      if (scalefac_compress < 180)
+      {
+        slen1 = scalefac_compress / 36;
+        slen2 = scalefac_compress % 36;
+        slen3 = slen2 % 6;
+        slen2 = slen2 / 6;
+        slen4 = 0;
+        k = 3 + 0;
+      }
+      else if (scalefac_compress < 244)
+      {
+        scalefac_compress -= 180;
+        slen3 = scalefac_compress & 3;
+        scalefac_compress >>= 2;
+        slen2 = scalefac_compress & 3;
+        slen1 = scalefac_compress >> 2;
+        slen4 = 0;
+        k = 3 + 1;
+      }
+      else
+      {
+        scalefac_compress -= 244;
+        slen1 = scalefac_compress / 3;
+        slen2 = scalefac_compress % 3;
+        slen3 = slen4 = 0;
+        k = 3 + 2;
+      }
+   }
+
+   i = 0;
+   if (block_type == 2)
+      i = (mixed_block_flag & 1) + 1;
+   nr1 = nr_table[k][i][0];
+   nr2 = nr_table[k][i][1];
+   nr3 = nr_table[k][i][2];
+   nr4 = nr_table[k][i][3];
+
+
+/* return is scale factor info (for right chan is mode) */
+   if (is_and_ch)
+   {
+      sf_info->nr[0] = nr1;
+      sf_info->nr[1] = nr2;
+      sf_info->nr[2] = nr3;
+      sf_info->slen[0] = slen1;
+      sf_info->slen[1] = slen2;
+      sf_info->slen[2] = slen3;
+      sf_info->intensity_scale = intensity_scale;
+   }
+   grdat->preflag = preflag;   /* return preflag */
+
+/*--------------------------------------*/
+   if (block_type == 2)
+   {
+      if (mixed_block_flag)
+      {                                /* mixed */
+        if (slen1 != 0)        /* long block portion */
+           for (sfb = 0; sfb < 6; sfb++)
+              sf[0].l[sfb] = bitget(slen1);
+        else
+           for (sfb = 0; sfb < 6; sfb++)
+              sf[0].l[sfb] = 0;
+        sfb = 3;               /* start sfb for short */
+      }
+      else
+      {                                /* all short, initial short blocks */
+        sfb = 0;
+        if (slen1 != 0)
+           for (i = 0; i < nr1; i++, sfb++)
+           {
+              sf[0].s[0][sfb] = bitget(slen1);
+              sf[0].s[1][sfb] = bitget(slen1);
+              sf[0].s[2][sfb] = bitget(slen1);
+           }
+        else
+           for (i = 0; i < nr1; i++, sfb++)
+           {
+              sf[0].s[0][sfb] = 0;
+              sf[0].s[1][sfb] = 0;
+              sf[0].s[2][sfb] = 0;
+           }
+      }
+/* remaining short blocks */
+      if (slen2 != 0)
+        for (i = 0; i < nr2; i++, sfb++)
+        {
+           sf[0].s[0][sfb] = bitget(slen2);
+           sf[0].s[1][sfb] = bitget(slen2);
+           sf[0].s[2][sfb] = bitget(slen2);
+        }
+      else
+        for (i = 0; i < nr2; i++, sfb++)
+        {
+           sf[0].s[0][sfb] = 0;
+           sf[0].s[1][sfb] = 0;
+           sf[0].s[2][sfb] = 0;
+        }
+      if (slen3 != 0)
+        for (i = 0; i < nr3; i++, sfb++)
+        {
+           sf[0].s[0][sfb] = bitget(slen3);
+           sf[0].s[1][sfb] = bitget(slen3);
+           sf[0].s[2][sfb] = bitget(slen3);
+        }
+      else
+        for (i = 0; i < nr3; i++, sfb++)
+        {
+           sf[0].s[0][sfb] = 0;
+           sf[0].s[1][sfb] = 0;
+           sf[0].s[2][sfb] = 0;
+        }
+      if (slen4 != 0)
+        for (i = 0; i < nr4; i++, sfb++)
+        {
+           sf[0].s[0][sfb] = bitget(slen4);
+           sf[0].s[1][sfb] = bitget(slen4);
+           sf[0].s[2][sfb] = bitget(slen4);
+        }
+      else
+        for (i = 0; i < nr4; i++, sfb++)
+        {
+           sf[0].s[0][sfb] = 0;
+           sf[0].s[1][sfb] = 0;
+           sf[0].s[2][sfb] = 0;
+        }
+      return;
+   }
+
+
+/* long blocks types 0 1 3 */
+   sfb = 0;
+   if (slen1 != 0)
+      for (i = 0; i < nr1; i++, sfb++)
+        sf[0].l[sfb] = bitget(slen1);
+   else
+      for (i = 0; i < nr1; i++, sfb++)
+        sf[0].l[sfb] = 0;
+
+   if (slen2 != 0)
+      for (i = 0; i < nr2; i++, sfb++)
+        sf[0].l[sfb] = bitget(slen2);
+   else
+      for (i = 0; i < nr2; i++, sfb++)
+        sf[0].l[sfb] = 0;
+
+   if (slen3 != 0)
+      for (i = 0; i < nr3; i++, sfb++)
+        sf[0].l[sfb] = bitget(slen3);
+   else
+      for (i = 0; i < nr3; i++, sfb++)
+        sf[0].l[sfb] = 0;
+
+   if (slen4 != 0)
+      for (i = 0; i < nr4; i++, sfb++)
+        sf[0].l[sfb] = bitget(slen4);
+   else
+      for (i = 0; i < nr4; i++, sfb++)
+        sf[0].l[sfb] = 0;
+
+
+}
+/*-------------------------------------------------*/
diff --git a/codecs/mp3/src/wavep.c b/codecs/mp3/src/wavep.c
new file mode 100755 (executable)
index 0000000..d6d2829
--- /dev/null
@@ -0,0 +1,165 @@
+/*____________________________________________________________________________
+       
+       FreeAmp - The Free MP3 Player
+
+        MP3 Decoder originally Copyright (C) 1995-1997 Xing Technology
+        Corp.  http://www.xingtech.com
+
+       Portions Copyright (C) 1998-1999 EMusic.com
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program; if not, write to the Free Software
+       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+       
+       $Id$
+____________________________________________________________________________*/
+
+/*---- wavep.c --------------------------------------------
+
+WAVE FILE HEADER ROUTINES
+with conditional pcm conversion to MS wave format
+portable version
+
+-----------------------------------------------------------*/
+#include <stdlib.h>
+#include <stdio.h>
+#include <float.h>
+#include <math.h>
+#ifdef WIN32
+#include <io.h>
+#else
+#include <unistd.h>
+#endif
+#include "port.h"
+
+typedef struct
+{
+   unsigned char riff[4];
+   unsigned char size[4];
+   unsigned char wave[4];
+   unsigned char fmt[4];
+   unsigned char fmtsize[4];
+   unsigned char tag[2];
+   unsigned char nChannels[2];
+   unsigned char nSamplesPerSec[4];
+   unsigned char nAvgBytesPerSec[4];
+   unsigned char nBlockAlign[2];
+   unsigned char nBitsPerSample[2];
+   unsigned char data[4];
+   unsigned char pcm_bytes[4];
+}
+BYTE_WAVE;
+
+static BYTE_WAVE wave =
+{
+   "RIFF",
+   {(sizeof(BYTE_WAVE) - 8), 0, 0, 0},
+   "WAVE",
+   "fmt ",
+   {16, 0, 0, 0},
+   {1, 0},
+   {1, 0},
+   {34, 86, 0, 0},             /* 86 * 256 + 34 = 22050 */
+   {172, 68, 0, 0},            /* 172 * 256 + 68 = 44100 */
+   {2, 0},
+   {16, 0},
+   "data",
+   {0, 0, 0, 0}
+};
+
+/*---------------------------------------------------------*/
+static void set_wave(unsigned char w[], int n, long x)
+{
+   int i;
+
+   for (i = 0; i < n; i++)
+   {
+      w[i] = (unsigned char) (x & 0xff);
+      x >>= 8;
+   }
+}
+/*---------------------------------------------------------*/
+int write_pcm_header_wave(int handout,
+                         long samprate, int channels, int bits, int type)
+{
+   int nwrite;
+
+   if (type == 0)
+      set_wave(wave.tag, sizeof(wave.tag), 1);
+   else if (type == 10)
+      set_wave(wave.tag, sizeof(wave.tag), 7);
+   else
+      return 0;
+
+   set_wave(wave.size, sizeof(wave.size), sizeof(wave) - 8);
+   set_wave(wave.nChannels, sizeof(wave.nChannels), channels);
+   set_wave(wave.nSamplesPerSec, sizeof(wave.nSamplesPerSec), samprate);
+   set_wave(wave.nAvgBytesPerSec, sizeof(wave.nAvgBytesPerSec),
+           (channels * samprate * bits + 7) / 8);
+   set_wave(wave.nBlockAlign, sizeof(wave.nBlockAlign), (channels * bits + 7) / 8);
+   set_wave(wave.nBitsPerSample, sizeof(wave.nBitsPerSample), bits);
+   set_wave(wave.pcm_bytes, sizeof(wave.pcm_bytes), 0);
+
+   nwrite = write(handout, &wave, sizeof(wave));
+   if (nwrite != sizeof(wave))
+      return 0;
+
+   return 1;
+}
+/*-----------------------------------------------*/
+int write_pcm_tailer_wave(int handout, unsigned long pcm_bytes)
+{
+   unsigned long pos;
+   int nwrite;
+
+
+   set_wave(wave.size, sizeof(wave.size), sizeof(wave) - 8 + pcm_bytes);
+   set_wave(wave.pcm_bytes, sizeof(wave.pcm_bytes), pcm_bytes);
+
+
+   pos = lseek(handout, 0L, 2);
+/*-- save current position */
+   lseek(handout, 0L, 0);
+/*-- pos to header --*/
+   nwrite = write(handout, &wave, sizeof(wave));
+   lseek(handout, pos, 0);
+/*-- restore pos --*/
+
+   if (nwrite != sizeof(wave))
+      return 0;
+   return 1;
+}
+/*-----------------------------------------------*/
+/*----------------------------------------------------------------
+  pcm conversion to wave format
+
+  This conversion code required for big endian machine, or,
+  if sizeof(short) != 16 bits.
+  Conversion routines may be used on any machine, but if
+  not required, the do nothing macros in port.h can be used instead
+  to reduce overhead.
+
+-----------------------------------------------------------------*/
+#ifndef LITTLE_SHORT16
+#include "wcvt.c"
+#endif
+/*-----------------------------------------------*/
+int cvt_to_wave_test()
+{
+/*-- test for valid compile ---*/
+
+   return sizeof(short) - 2;
+
+
+}
+/*-----------------------------------------------*/
diff --git a/codecs/mp3/src/wcvt.c b/codecs/mp3/src/wcvt.c
new file mode 100755 (executable)
index 0000000..d373cd6
--- /dev/null
@@ -0,0 +1,92 @@
+/*____________________________________________________________________________
+       
+       FreeAmp - The Free MP3 Player
+
+        MP3 Decoder originally Copyright (C) 1995-1997 Xing Technology
+        Corp.  http://www.xingtech.com
+
+       Portions Copyright (C) 1998 EMusic.com
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       (at your option) any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+       You should have received a copy of the GNU General Public License
+       along with this program; if not, write to the Free Software
+       Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+       
+       $Id$
+____________________________________________________________________________*/
+
+/*---- wcvt.c --------------------------------------------
+
+conditional inclusion to wavep.c
+
+pcm conversion to wave format
+  for big endians or when sizeof(short) > 16 bits
+
+mod 1/9/97 warnings
+
+-----------------------------------------------------------*/
+static int bytes_per_samp = 1;
+static int big_ender;
+static int cvt_flag;
+
+/*-------------------------------------------------------*/
+void cvt_to_wave_init(int bits)
+{
+
+   big_ender = 1;
+   if ((*(unsigned char *) &big_ender) == 1)
+      big_ender = 0;
+
+/*--- printf("\n big_ender = %d", big_ender );  ---*/
+
+   if (bits == 8)
+      bytes_per_samp = 1;
+   else
+      bytes_per_samp = sizeof(short);
+
+
+   cvt_flag = 0;
+   if (bits > 8)
+   {
+      if (big_ender)
+        cvt_flag = 1;
+      cvt_flag |= (sizeof(short) > 2);
+   }
+
+}
+/*-------------------------------------------------------*/
+unsigned int cvt_to_wave(unsigned char *pcm, unsigned int bytes_in)
+{
+   unsigned int i, k;
+   unsigned int nsamp;
+   short tmp;
+   unsigned short *w;
+
+// printf("\n wave convert");
+
+   if (cvt_flag == 0)
+      return bytes_in;
+/*-- no conversion required --*/
+
+   nsamp = bytes_in / bytes_per_samp;
+   w = (unsigned short *) pcm;
+   for (i = 0, k = 0; i < nsamp; i++, k += 2)
+   {
+      tmp = w[i];
+      pcm[k] = (unsigned char) tmp;
+      pcm[k + 1] = (unsigned char) (tmp >> 8);
+   }
+
+   return (nsamp << 1);
+/*--- return bytes out ---*/
+}
+/*-------------------------------------------------------*/
diff --git a/codecs/mp3/src/x86gas.s b/codecs/mp3/src/x86gas.s
new file mode 100755 (executable)
index 0000000..9fe5537
--- /dev/null
@@ -0,0 +1,393 @@
+#      
+#      FreeAmp - The Free MP3 Player
+#
+#      Based on MP3 decoder originally Copyright (C) 1995-1997
+#      Xing Technology Corp.  http://www.xingtech.com
+#
+#      Copyright (C) 1999 Mark H. Weaver <mhw@netris.org>
+#
+#      This program is free software; you can redistribute it and/or modify
+#      it under the terms of the GNU General Public License as published by
+#      the Free Software Foundation; either version 2 of the License, or
+#      (at your option) any later version.
+#
+#      This program is distributed in the hope that it will be useful,
+#      but WITHOUT ANY WARRANTY; without even the implied warranty of
+#      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#      GNU General Public License for more details.
+#
+#      You should have received a copy of the GNU General Public License
+#      along with this program; if not, write to the Free Software
+#      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#      
+#      $Id$
+#
+
+#%% extern wincoef,dword
+#%% extern coef32,dword
+#%% ! extern float wincoef[264];
+#%% ! extern float coef32[31];
+
+.equ L_tmp,    0
+#%!.equ L_pcm, 4
+#%% if-not-inline
+.equ L_vbuf,   24
+.equ L_vb_ptr, 28
+.equ L_pcm,    32
+
+.globl window_dual
+       .align 16
+#%% end-not-inline
+#%% ! void window_dual(float *vbuf, int vb_ptr, short *pcm)
+#%% ! {
+window_dual:   #%% proc
+#%% if-not-inline
+       pushl %ebp
+       pushl %edi
+       pushl %esi
+       pushl %ebx
+       subl $4,%esp
+
+       movl L_vb_ptr(%esp),%esi
+       movl L_vbuf(%esp),%edi
+#%% end-not-inline
+
+#%!    movl vb_ptr,%esi
+#%!    movl vbuf,%edi
+#%!    movl pcm,%ecx
+#%!    pushl %ebp
+#%!    subl $8,%esp
+#%!    movl %ecx,L_pcm(%esp)
+
+       movl $511,%ebp          # ebp = 511
+       leal wincoef,%ecx       # coef = wincoef
+       addl $16,%esi           # si = vb_ptr + 16
+       movl %esi,%ebx
+       addl $32,%ebx
+       andl %ebp,%ebx          # bx = (si + 32) & 511
+
+# First 16
+       movb $16,%dh            # i = 16
+       .align 4
+.FirstOuter:
+       fldz                    # sum = 0.0
+       movb $2,%dl             # j = 2
+       .align 4
+.FirstInner:
+.rept 4                # Unrolled loop
+       flds (%ecx)             # Push *coef
+       fmuls (%edi,%esi,4)     # Multiply by vbuf[si]
+       addl $64,%esi           # si += 64
+       addl $4,%ecx            # Advance coef pointer
+       andl %ebp,%esi          # si &= 511
+       faddp %st,%st(1)        # Add to sum
+       
+       flds (%ecx)             # Push *coef
+       fmuls (%edi,%ebx,4)     # Multiply by vbuf[bx]
+       addl $64,%ebx           # bx += 64
+       addl $4,%ecx            # Advance coef pointer
+       andl %ebp,%ebx          # bx &= 511
+       fsubrp %st,%st(1)       # Subtract from sum
+.endr
+
+       decb %dl                # --j
+       jg .FirstInner          # Jump back if j > 0
+
+       fistpl L_tmp(%esp)      # tmp = (long) round (sum)
+       incl %esi               # si++
+       movl L_tmp(%esp),%eax
+       decl %ebx               # bx--
+       movl %eax,%ebp
+       sarl $15,%eax
+       incl %eax
+       sarl $1,%eax
+       jz .FirstInRange        # Jump if in range
+
+       sarl $16,%eax           # Out of range
+       movl $32767,%ebp
+       xorl %eax,%ebp
+.FirstInRange:
+       movl L_pcm(%esp),%eax
+       movw %bp,(%eax)         # Store sample in *pcm
+       addl $4,%eax            # Increment pcm
+       movl $511,%ebp          # Reload ebp with 511
+       movl %eax,L_pcm(%esp)
+
+       decb %dh                # --i
+       jg .FirstOuter          # Jump back if i > 0
+
+
+# Special case
+       fldz                    # sum = 0.0
+       movb $4,%dl             # j = 4
+       .align 4
+.SpecialInner:
+.rept 2                # Unrolled loop
+       flds (%ecx)             # Push *coef
+       fmuls (%edi,%ebx,4)     # Multiply by vbuf[bx]
+       addl $64,%ebx           # bx += 64
+       addl $4,%ecx            # Increment coef pointer
+       andl %ebp,%ebx          # bx &= 511
+       faddp %st,%st(1)        # Add to sum
+.endr
+       
+       decb %dl                # --j
+       jg .SpecialInner        # Jump back if j > 0
+
+       fistpl L_tmp(%esp)      # tmp = (long) round (sum)
+       decl %esi               # si--
+       movl L_tmp(%esp),%eax
+       incl %ebx               # bx++
+       movl %eax,%ebp
+       sarl $15,%eax
+       incl %eax
+       sarl $1,%eax
+       jz .SpecialInRange      # Jump if within range
+
+       sarl $16,%eax           # Out of range
+       movl $32767,%ebp
+       xorl %eax,%ebp
+.SpecialInRange:
+       movl L_pcm(%esp),%eax
+       subl $36,%ecx           # Readjust coef pointer for last round
+       movw %bp,(%eax)         # Store sample in *pcm
+       addl $4,%eax            # Increment pcm
+       movl $511,%ebp          # Reload ebp with 511
+       movl %eax,L_pcm(%esp)
+
+
+# Last 15
+       movb $15,%dh            # i = 15
+       .align 4
+.LastOuter:
+       fldz                    # sum = 0.0
+       movb $2,%dl             # j = 2
+       .align 4
+.LastInner:
+.rept 4                # Unrolled loop
+       flds (%ecx)             # Push *coef
+       fmuls (%edi,%esi,4)     # Multiply by vbuf[si]
+       addl $64,%esi           # si += 64
+       subl $4,%ecx            # Back up coef pointer
+       andl %ebp,%esi          # si &= 511
+       faddp %st,%st(1)        # Add to sum
+       
+       flds (%ecx)             # Push *coef
+       fmuls (%edi,%ebx,4)     # Multiply by vbuf[bx]
+       addl $64,%ebx           # bx += 64
+       subl $4,%ecx            # Back up coef pointer
+       andl %ebp,%ebx          # bx &= 511
+       faddp %st,%st(1)        # Add to sum
+.endr
+
+       decb %dl                # --j
+       jg .LastInner           # Jump back if j > 0
+
+       fistpl L_tmp(%esp)      # tmp = (long) round (sum)
+       decl %esi               # si--
+       movl L_tmp(%esp),%eax
+       incl %ebx               # bx++
+       movl %eax,%ebp
+       sarl $15,%eax
+       incl %eax
+       sarl $1,%eax
+       jz .LastInRange         # Jump if in range
+
+       sarl $16,%eax           # Out of range
+       movl $32767,%ebp
+       xorl %eax,%ebp
+.LastInRange:
+       movl L_pcm(%esp),%eax
+       movw %bp,(%eax)         # Store sample in *pcm
+       addl $4,%eax            # Increment pcm
+       movl $511,%ebp          # Reload ebp with 511
+       movl %eax,L_pcm(%esp)
+
+       decb %dh                # --i
+       jg .LastOuter           # Jump back if i > 0
+
+#%!    addl $8,%esp
+#%!    popl %ebp
+
+#%% if-not-inline
+# Restore regs and return
+       addl $4,%esp    
+       popl %ebx
+       popl %esi
+       popl %edi
+       popl %ebp
+       ret
+#%% end-not-inline
+#%% endp
+#%% ! }
+
+#---------------------------------------------------------------------------
+
+.equ L_mi,     0
+.equ L_m,      4
+.equ L_dummy,  8
+#%!.equ L_in,  12
+#%!.equ L_out, 16
+#%!.equ L_buf, 20      # Temporary buffer
+#%!.equ L_locals, 148  # Bytes used for locals
+#%% if-not-inline
+.equ L_buf,    12      # Temporary buffer
+.equ L_in,     160
+.equ L_out,    164
+.equ L_locals, 140     # Bytes used for locals
+
+.globl asm_fdct32
+       .align 16
+#%% end-not-inline
+#%% ! void asm_fdct32(float in[], float out[])
+#%% ! {
+asm_fdct32:    #%% proc
+#%% if-not-inline
+       pushl %ebp
+       pushl %edi
+       pushl %esi
+       pushl %ebx
+       subl $L_locals,%esp
+
+       movl L_in(%esp),%edi    # edi = x
+       movl L_out(%esp),%esi   # esi = f
+#%% end-not-inline
+
+#%!    movl in,%edi            # edi = x
+#%!    movl out,%esi           # esi = f
+#%!    pushl %ebp
+#%!    subl $L_locals,%esp
+
+       leal coef32-128,%ecx    # coef = coef32 - (32 * 4)
+       movl $1,4(%esp)         # m = 1
+       movl $16,%ebp           # n = 32 / 2
+       
+       leal L_buf(%esp),%ebx
+       movl %ebx,L_out(%esp)   # From now on, use temp buf instead of orig x
+       jmp .ForwardLoopStart
+
+       .align 4
+.ForwardOuterLoop:
+       movl L_in(%esp),%edi    # edi = x
+       movl L_out(%esp),%esi   # esi = f
+       movl %edi,L_out(%esp)   # Exchange mem versions of f/x for next iter
+.ForwardLoopStart:
+       movl %esi,L_in(%esp)
+       movl L_m(%esp),%ebx     # ebx = m (temporarily)
+       movl %ebx,L_mi(%esp)    # mi = m
+       sall $1,%ebx            # Double m for next iter
+       leal (%ecx,%ebp,8),%ecx # coef += n * 8
+       movl %ebx,L_m(%esp)     # Store doubled m
+       leal (%esi,%ebp,4),%ebx # ebx = f2 = f + n * 4
+       sall $3,%ebp            # n *= 8
+
+       .align 4
+.ForwardMiddleLoop:
+       movl %ebp,%eax          # q = n
+       xorl %edx,%edx          # p = 0
+       test $8,%eax
+       jnz .ForwardInnerLoop1
+
+       .align 4
+.ForwardInnerLoop:
+       subl $4,%eax            # q -= 4
+       flds (%edi,%eax)        # push x[q]
+       flds (%edi,%edx)        # push x[p]
+       fld %st(1)              # Duplicate top two stack entries
+       fld %st(1)
+       faddp %st,%st(1)
+       fstps (%esi,%edx)       # f[p] = x[p] + x[q]
+       fsubp %st,%st(1)
+       fmuls (%ecx,%edx)
+       fstps (%ebx,%edx)       # f2[p] = coef[p] * (x[p] - x[q])
+       addl $4,%edx            # p += 4
+
+.ForwardInnerLoop1:
+       subl $4,%eax            # q -= 4
+       flds (%edi,%eax)        # push x[q]
+       flds (%edi,%edx)        # push x[p]
+       fld %st(1)              # Duplicate top two stack entries
+       fld %st(1)
+       faddp %st,%st(1)
+       fstps (%esi,%edx)       # f[p] = x[p] + x[q]
+       fsubp %st,%st(1)
+       fmuls (%ecx,%edx)
+       fstps (%ebx,%edx)       # f2[p] = coef[p] * (x[p] - x[q])
+       addl $4,%edx            # p += 4
+
+       cmpl %eax,%edx
+       jb .ForwardInnerLoop    # Jump back if (p < q)
+
+       addl %ebp,%esi          # f += n
+       addl %ebp,%ebx          # f2 += n
+       addl %ebp,%edi          # x += n
+       decl L_mi(%esp)         # mi--
+       jg .ForwardMiddleLoop   # Jump back if mi > 0
+
+       sarl $4,%ebp            # n /= 16
+       jg .ForwardOuterLoop    # Jump back if n > 0
+
+
+# Setup back loop
+       movl $8,%ebx            # ebx = m = 8 (temporarily)
+       movl %ebx,%ebp          # n = 4 * 2
+
+       .align 4
+.BackOuterLoop:
+       movl L_out(%esp),%esi   # esi = f
+       movl %ebx,L_mi(%esp)    # mi = m
+       movl L_in(%esp),%edi    # edi = x
+       movl %ebx,L_m(%esp)     # Store m
+       movl %esi,L_in(%esp)    # Exchange mem versions of f/x for next iter
+       movl %edi,%ebx
+       movl %edi,L_out(%esp)
+       subl %ebp,%ebx          # ebx = x2 = x - n
+       sall $1,%ebp            # n *= 2
+
+       .align 4
+.BackMiddleLoop:
+       movl -4(%ebx,%ebp),%ecx
+       movl %ecx,-8(%esi,%ebp) # f[n - 8] = x2[n - 4]
+       flds -4(%edi,%ebp)      # push x[n - 4]
+       fsts -4(%esi,%ebp)      # f[n - 4] = x[n - 4], without popping
+       leal -8(%ebp),%eax      # q = n - 8
+       leal -16(%ebp),%edx     # p = n - 16
+
+       .align 4
+.BackInnerLoop:
+       movl (%ebx,%eax),%ecx
+       movl %ecx,(%esi,%edx)   # f[p] = x2[q]
+       flds (%edi,%eax)        # push x[q]
+       fadd %st,%st(1)
+       fxch
+       fstps 4(%esi,%edx)      # f[p + 4] = x[q] + x[q + 4]
+       subl $4,%eax            # q -= 4
+       subl $8,%edx            # p -= 8
+       jge .BackInnerLoop      # Jump back if p >= 0
+
+       fstps L_dummy(%esp)     # Pop (XXX is there a better way to do this?)
+       addl %ebp,%esi          # f += n
+       addl %ebp,%ebx          # x2 += n
+       addl %ebp,%edi          # x += n
+       decl L_mi(%esp)         # mi--
+       jg .BackMiddleLoop      # Jump back if mi > 0
+
+       movl L_m(%esp),%ebx     # ebx = m (temporarily)
+       sarl $1,%ebx            # Halve m for next iter
+       jg .BackOuterLoop       # Jump back if m > 0
+
+#%!    addl $L_locals,%esp
+#%!    popl %ebp
+
+#%% if-not-inline
+# Restore regs and return
+       addl $L_locals,%esp
+       popl %ebx
+       popl %esi
+       popl %edi
+       popl %ebp
+       ret
+#%% end-not-inline
+#%% endp
+#%% ! }
+
diff --git a/codecs/mp3/src/x86intel.c b/codecs/mp3/src/x86intel.c
new file mode 100755 (executable)
index 0000000..d9f0e61
--- /dev/null
@@ -0,0 +1,437 @@
+/* *************************************************** */
+/* ************ DO NOT EDIT THIS FILE!!!! ************ */
+/* *************************************************** */
+/* This file was automatically generated by gas2intel. */
+/* Edit the original gas version instead. */
+
+
+/*     FreeAmp - The Free MP3 Player */
+
+/*     Based on MP3 decoder originally Copyright (C) 1995-1997 */
+/*     Xing Technology Corp.  http://www.xingtech.com */
+
+/*     Copyright (C) 1999 Mark H. Weaver <mhw@netris.org> */
+
+/*     This program is free software; you can redistribute it and/or modify */
+/*     it under the terms of the GNU General Public License as published by */
+/*     the Free Software Foundation; either version 2 of the License, or */
+/*     (at your option) any later version. */
+
+/*     This program is distributed in the hope that it will be useful, */
+/*     but WITHOUT ANY WARRANTY; without even the implied warranty of */
+/*     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the */
+/*     GNU General Public License for more details. */
+
+/*     You should have received a copy of the GNU General Public License */
+/*     along with this program; if not, write to the Free Software */
+/*     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+/*     $Id$ */
+/*     Generated from Id: x86gas.s,v 1.9 1999/03/05 08:58:18 mhw Exp $ */
+
+
+extern float wincoef[264];
+extern float coef32[31];
+
+#define L_tmp 0
+#define L_pcm 4
+void window_dual(float *vbuf, int vb_ptr, short *pcm)
+{
+__asm {
+
+       mov esi,vb_ptr
+       mov edi,vbuf
+       mov ecx,pcm
+       push ebp
+       sub esp,8
+       mov DWORD PTR [esp+L_pcm],ecx
+
+       mov ebp,511             ; ebp = 511
+       lea ecx,wincoef ; coef = wincoef
+       add esi,16              ; si = vb_ptr + 16
+       mov ebx,esi
+       add ebx,32
+       and ebx,ebp             ; bx = (si + 32) & 511
+
+; First 16
+       mov dh,16               ; i = 16
+       align 4
+FirstOuter:
+       fldz                    ; sum = 0.0
+       mov dl,2                ; j = 2
+       align 4
+FirstInner:
+; REPEAT 4             ; Unrolled loop
+       fld DWORD PTR [ecx]             ; Push *coef
+       fmul DWORD PTR [edi+esi*4]      ; Multiply by vbuf[si]
+       add esi,64              ; si += 64
+       add ecx,4               ; Advance coef pointer
+       and esi,ebp             ; si &= 511
+       faddp st(1),st  ; Add to sum
+
+       fld DWORD PTR [ecx]             ; Push *coef
+       fmul DWORD PTR [edi+ebx*4]      ; Multiply by vbuf[bx]
+       add ebx,64              ; bx += 64
+       add ecx,4               ; Advance coef pointer
+       and ebx,ebp             ; bx &= 511
+       fsubp st(1),st  ; Subtract from sum
+;--
+       fld DWORD PTR [ecx]             ; Push *coef
+       fmul DWORD PTR [edi+esi*4]      ; Multiply by vbuf[si]
+       add esi,64              ; si += 64
+       add ecx,4               ; Advance coef pointer
+       and esi,ebp             ; si &= 511
+       faddp st(1),st  ; Add to sum
+
+       fld DWORD PTR [ecx]             ; Push *coef
+       fmul DWORD PTR [edi+ebx*4]      ; Multiply by vbuf[bx]
+       add ebx,64              ; bx += 64
+       add ecx,4               ; Advance coef pointer
+       and ebx,ebp             ; bx &= 511
+       fsubp st(1),st  ; Subtract from sum
+;--
+       fld DWORD PTR [ecx]             ; Push *coef
+       fmul DWORD PTR [edi+esi*4]      ; Multiply by vbuf[si]
+       add esi,64              ; si += 64
+       add ecx,4               ; Advance coef pointer
+       and esi,ebp             ; si &= 511
+       faddp st(1),st  ; Add to sum
+
+       fld DWORD PTR [ecx]             ; Push *coef
+       fmul DWORD PTR [edi+ebx*4]      ; Multiply by vbuf[bx]
+       add ebx,64              ; bx += 64
+       add ecx,4               ; Advance coef pointer
+       and ebx,ebp             ; bx &= 511
+       fsubp st(1),st  ; Subtract from sum
+;--
+       fld DWORD PTR [ecx]             ; Push *coef
+       fmul DWORD PTR [edi+esi*4]      ; Multiply by vbuf[si]
+       add esi,64              ; si += 64
+       add ecx,4               ; Advance coef pointer
+       and esi,ebp             ; si &= 511
+       faddp st(1),st  ; Add to sum
+
+       fld DWORD PTR [ecx]             ; Push *coef
+       fmul DWORD PTR [edi+ebx*4]      ; Multiply by vbuf[bx]
+       add ebx,64              ; bx += 64
+       add ecx,4               ; Advance coef pointer
+       and ebx,ebp             ; bx &= 511
+       fsubp st(1),st  ; Subtract from sum
+;--
+; END REPEAT
+
+       dec dl          ; --j
+       jg FirstInner           ; Jump back if j > 0
+
+       fistp DWORD PTR [esp+L_tmp]     ; tmp = (long) round (sum)
+       inc esi         ; si++
+       mov eax,DWORD PTR [esp+L_tmp]
+       dec ebx         ; bx--
+       mov ebp,eax
+       sar eax,15
+       inc eax
+       sar eax,1
+       jz FirstInRange ; Jump if in range
+
+       sar eax,16              ; Out of range
+       mov ebp,32767
+       xor ebp,eax
+FirstInRange:
+       mov eax,DWORD PTR [esp+L_pcm]
+       mov WORD PTR [eax],bp           ; Store sample in *pcm
+       add eax,4               ; Increment pcm
+       mov ebp,511             ; Reload ebp with 511
+       mov DWORD PTR [esp+L_pcm],eax
+
+       dec dh          ; --i
+       jg FirstOuter           ; Jump back if i > 0
+
+
+; Special case
+       fldz                    ; sum = 0.0
+       mov dl,4                ; j = 4
+       align 4
+SpecialInner:
+; REPEAT 2             ; Unrolled loop
+       fld DWORD PTR [ecx]             ; Push *coef
+       fmul DWORD PTR [edi+ebx*4]      ; Multiply by vbuf[bx]
+       add ebx,64              ; bx += 64
+       add ecx,4               ; Increment coef pointer
+       and ebx,ebp             ; bx &= 511
+       faddp st(1),st  ; Add to sum
+;--
+       fld DWORD PTR [ecx]             ; Push *coef
+       fmul DWORD PTR [edi+ebx*4]      ; Multiply by vbuf[bx]
+       add ebx,64              ; bx += 64
+       add ecx,4               ; Increment coef pointer
+       and ebx,ebp             ; bx &= 511
+       faddp st(1),st  ; Add to sum
+;--
+; END REPEAT
+
+       dec dl          ; --j
+       jg SpecialInner ; Jump back if j > 0
+
+       fistp DWORD PTR [esp+L_tmp]     ; tmp = (long) round (sum)
+       dec esi         ; si--
+       mov eax,DWORD PTR [esp+L_tmp]
+       inc ebx         ; bx++
+       mov ebp,eax
+       sar eax,15
+       inc eax
+       sar eax,1
+       jz SpecialInRange       ; Jump if within range
+
+       sar eax,16              ; Out of range
+       mov ebp,32767
+       xor ebp,eax
+SpecialInRange:
+       mov eax,DWORD PTR [esp+L_pcm]
+       sub ecx,36              ; Readjust coef pointer for last round
+       mov WORD PTR [eax],bp           ; Store sample in *pcm
+       add eax,4               ; Increment pcm
+       mov ebp,511             ; Reload ebp with 511
+       mov DWORD PTR [esp+L_pcm],eax
+
+
+; Last 15
+       mov dh,15               ; i = 15
+       align 4
+LastOuter:
+       fldz                    ; sum = 0.0
+       mov dl,2                ; j = 2
+       align 4
+LastInner:
+; REPEAT 4             ; Unrolled loop
+       fld DWORD PTR [ecx]             ; Push *coef
+       fmul DWORD PTR [edi+esi*4]      ; Multiply by vbuf[si]
+       add esi,64              ; si += 64
+       sub ecx,4               ; Back up coef pointer
+       and esi,ebp             ; si &= 511
+       faddp st(1),st  ; Add to sum
+
+       fld DWORD PTR [ecx]             ; Push *coef
+       fmul DWORD PTR [edi+ebx*4]      ; Multiply by vbuf[bx]
+       add ebx,64              ; bx += 64
+       sub ecx,4               ; Back up coef pointer
+       and ebx,ebp             ; bx &= 511
+       faddp st(1),st  ; Add to sum
+;--
+       fld DWORD PTR [ecx]             ; Push *coef
+       fmul DWORD PTR [edi+esi*4]      ; Multiply by vbuf[si]
+       add esi,64              ; si += 64
+       sub ecx,4               ; Back up coef pointer
+       and esi,ebp             ; si &= 511
+       faddp st(1),st  ; Add to sum
+
+       fld DWORD PTR [ecx]             ; Push *coef
+       fmul DWORD PTR [edi+ebx*4]      ; Multiply by vbuf[bx]
+       add ebx,64              ; bx += 64
+       sub ecx,4               ; Back up coef pointer
+       and ebx,ebp             ; bx &= 511
+       faddp st(1),st  ; Add to sum
+;--
+       fld DWORD PTR [ecx]             ; Push *coef
+       fmul DWORD PTR [edi+esi*4]      ; Multiply by vbuf[si]
+       add esi,64              ; si += 64
+       sub ecx,4               ; Back up coef pointer
+       and esi,ebp             ; si &= 511
+       faddp st(1),st  ; Add to sum
+
+       fld DWORD PTR [ecx]             ; Push *coef
+       fmul DWORD PTR [edi+ebx*4]      ; Multiply by vbuf[bx]
+       add ebx,64              ; bx += 64
+       sub ecx,4               ; Back up coef pointer
+       and ebx,ebp             ; bx &= 511
+       faddp st(1),st  ; Add to sum
+;--
+       fld DWORD PTR [ecx]             ; Push *coef
+       fmul DWORD PTR [edi+esi*4]      ; Multiply by vbuf[si]
+       add esi,64              ; si += 64
+       sub ecx,4               ; Back up coef pointer
+       and esi,ebp             ; si &= 511
+       faddp st(1),st  ; Add to sum
+
+       fld DWORD PTR [ecx]             ; Push *coef
+       fmul DWORD PTR [edi+ebx*4]      ; Multiply by vbuf[bx]
+       add ebx,64              ; bx += 64
+       sub ecx,4               ; Back up coef pointer
+       and ebx,ebp             ; bx &= 511
+       faddp st(1),st  ; Add to sum
+;--
+; END REPEAT
+
+       dec dl          ; --j
+       jg LastInner            ; Jump back if j > 0
+
+       fistp DWORD PTR [esp+L_tmp]     ; tmp = (long) round (sum)
+       dec esi         ; si--
+       mov eax,DWORD PTR [esp+L_tmp]
+       inc ebx         ; bx++
+       mov ebp,eax
+       sar eax,15
+       inc eax
+       sar eax,1
+       jz LastInRange          ; Jump if in range
+
+       sar eax,16              ; Out of range
+       mov ebp,32767
+       xor ebp,eax
+LastInRange:
+       mov eax,DWORD PTR [esp+L_pcm]
+       mov WORD PTR [eax],bp           ; Store sample in *pcm
+       add eax,4               ; Increment pcm
+       mov ebp,511             ; Reload ebp with 511
+       mov DWORD PTR [esp+L_pcm],eax
+
+       dec dh          ; --i
+       jg LastOuter            ; Jump back if i > 0
+
+       add esp,8
+       pop ebp
+
+  }
+}
+
+/*--------------------------------------------------------------------------- */
+
+#define L_mi 0
+#define L_m 4
+#define L_dummy 8
+#define L_in 12
+#define L_out 16
+#define L_buf 20       /* Temporary buffer */
+#define L_locals 148   /* Bytes used for locals */
+void asm_fdct32(float in[], float out[])
+{
+__asm {
+
+       mov edi,in              ; edi = x
+       mov esi,out             ; esi = f
+       push ebp
+       sub esp,L_locals
+
+       lea ecx,coef32-128      ; coef = coef32 - (32 * 4)
+       mov DWORD PTR [esp+4],1         ; m = 1
+       mov ebp,16              ; n = 32 / 2
+
+       lea ebx,DWORD PTR [esp+L_buf]
+       mov DWORD PTR [esp+L_out],ebx   ; From now on, use temp buf instead of orig x
+       jmp ForwardLoopStart
+
+       align 4
+ForwardOuterLoop:
+       mov edi,DWORD PTR [esp+L_in]    ; edi = x
+       mov esi,DWORD PTR [esp+L_out]   ; esi = f
+       mov DWORD PTR [esp+L_out],edi   ; Exchange mem versions of f/x for next iter
+ForwardLoopStart:
+       mov DWORD PTR [esp+L_in],esi
+       mov ebx,DWORD PTR [esp+L_m]     ; ebx = m (temporarily)
+       mov DWORD PTR [esp+L_mi],ebx    ; mi = m
+       sal ebx,1               ; Double m for next iter
+       lea ecx,DWORD PTR [ecx+ebp*8]   ; coef += n * 8
+       mov DWORD PTR [esp+L_m],ebx     ; Store doubled m
+       lea ebx,DWORD PTR [esi+ebp*4]   ; ebx = f2 = f + n * 4
+       sal ebp,3               ; n *= 8
+
+       align 4
+ForwardMiddleLoop:
+       mov eax,ebp             ; q = n
+       xor edx,edx             ; p = 0
+       test eax,8
+       jnz ForwardInnerLoop1
+
+       align 4
+ForwardInnerLoop:
+       sub eax,4               ; q -= 4
+       fld DWORD PTR [edi+eax] ; push x[q]
+       fld DWORD PTR [edi+edx] ; push x[p]
+       fld st(1)               ; Duplicate top two stack entries
+       fld st(1)
+       faddp st(1),st
+       fstp DWORD PTR [esi+edx]        ; f[p] = x[p] + x[q]
+       fsubrp st(1),st
+       fmul DWORD PTR [ecx+edx]
+       fstp DWORD PTR [ebx+edx]        ; f2[p] = coef[p] * (x[p] - x[q])
+       add edx,4               ; p += 4
+
+ForwardInnerLoop1:
+       sub eax,4               ; q -= 4
+       fld DWORD PTR [edi+eax] ; push x[q]
+       fld DWORD PTR [edi+edx] ; push x[p]
+       fld st(1)               ; Duplicate top two stack entries
+       fld st(1)
+       faddp st(1),st
+       fstp DWORD PTR [esi+edx]        ; f[p] = x[p] + x[q]
+       fsubrp st(1),st
+       fmul DWORD PTR [ecx+edx]
+       fstp DWORD PTR [ebx+edx]        ; f2[p] = coef[p] * (x[p] - x[q])
+       add edx,4               ; p += 4
+
+       cmp edx,eax
+       jb ForwardInnerLoop     ; Jump back if (p < q)
+
+       add esi,ebp             ; f += n
+       add ebx,ebp             ; f2 += n
+       add edi,ebp             ; x += n
+       dec DWORD PTR [esp+L_mi]                ; mi--
+       jg ForwardMiddleLoop    ; Jump back if mi > 0
+
+       sar ebp,4               ; n /= 16
+       jg ForwardOuterLoop     ; Jump back if n > 0
+
+
+; Setup back loop
+       mov ebx,8               ; ebx = m = 8 (temporarily)
+       mov ebp,ebx             ; n = 4 * 2
+
+       align 4
+BackOuterLoop:
+       mov esi,DWORD PTR [esp+L_out]   ; esi = f
+       mov DWORD PTR [esp+L_mi],ebx    ; mi = m
+       mov edi,DWORD PTR [esp+L_in]    ; edi = x
+       mov DWORD PTR [esp+L_m],ebx     ; Store m
+       mov DWORD PTR [esp+L_in],esi    ; Exchange mem versions of f/x for next iter
+       mov ebx,edi
+       mov DWORD PTR [esp+L_out],edi
+       sub ebx,ebp             ; ebx = x2 = x - n
+       sal ebp,1               ; n *= 2
+
+       align 4
+BackMiddleLoop:
+       mov ecx,DWORD PTR [ebx+ebp-4]
+       mov DWORD PTR [esi+ebp-8],ecx   ; f[n - 8] = x2[n - 4]
+       fld DWORD PTR [edi+ebp-4]       ; push x[n - 4]
+       fst DWORD PTR [esi+ebp-4]       ; f[n - 4] = x[n - 4], without popping
+       lea eax,DWORD PTR [ebp-8]       ; q = n - 8
+       lea edx,DWORD PTR [ebp-16]      ; p = n - 16
+
+       align 4
+BackInnerLoop:
+       mov ecx,DWORD PTR [ebx+eax]
+       mov DWORD PTR [esi+edx],ecx     ; f[p] = x2[q]
+       fld DWORD PTR [edi+eax] ; push x[q]
+       fadd st(1),st
+       fxch 
+       fstp DWORD PTR [esi+edx+4]      ; f[p + 4] = x[q] + x[q + 4]
+       sub eax,4               ; q -= 4
+       sub edx,8               ; p -= 8
+       jge BackInnerLoop       ; Jump back if p >= 0
+
+       fstp DWORD PTR [esp+L_dummy]    ; Pop (XXX is there a better way to do this?)
+       add esi,ebp             ; f += n
+       add ebx,ebp             ; x2 += n
+       add edi,ebp             ; x += n
+       dec DWORD PTR [esp+L_mi]                ; mi--
+       jg BackMiddleLoop       ; Jump back if mi > 0
+
+       mov ebx,DWORD PTR [esp+L_m]     ; ebx = m (temporarily)
+       sar ebx,1               ; Halve m for next iter
+       jg BackOuterLoop        ; Jump back if m > 0
+
+       add esp,L_locals
+       pop ebp
+
+  }
+}
+