summaryrefslogtreecommitdiff
path: root/apps/plugins/mp3_encoder.c
diff options
context:
space:
mode:
authorThom Johansen <thomj@rockbox.org>2006-04-04 19:08:54 +0000
committerThom Johansen <thomj@rockbox.org>2006-04-04 19:08:54 +0000
commitd3fea146e1724f52bc6d34e671f4446a8b381f27 (patch)
tree0ab03ae1a7afe683010dc47f685330da35198051 /apps/plugins/mp3_encoder.c
parent89725765721ad27c6ac47c79e428fbcdad2f122b (diff)
downloadrockbox-d3fea146e1724f52bc6d34e671f4446a8b381f27.zip
rockbox-d3fea146e1724f52bc6d34e671f4446a8b381f27.tar.gz
rockbox-d3fea146e1724f52bc6d34e671f4446a8b381f27.tar.bz2
rockbox-d3fea146e1724f52bc6d34e671f4446a8b381f27.tar.xz
MP3 encoder enhancements and optimisations by Antonius Hellman. Details
at http://www.rockbox.org/tracker/task/5033 git-svn-id: svn://svn.rockbox.org/rockbox/trunk@9498 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/plugins/mp3_encoder.c')
-rw-r--r--apps/plugins/mp3_encoder.c3582
1 files changed, 2017 insertions, 1565 deletions
diff --git a/apps/plugins/mp3_encoder.c b/apps/plugins/mp3_encoder.c
index e5b7cc8..b31f428 100644
--- a/apps/plugins/mp3_encoder.c
+++ b/apps/plugins/mp3_encoder.c
@@ -1,44 +1,21 @@
-/* Shine is an MP3 encoder
- * Copyright (C) 1999-2000 Gabriel Bouvigne
+/* Shine is an MP3 encoder
+ * Copyright (C) 1999-2000 Gabriel Bouvigne
*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
*
- * This library 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
- * Library General Public License for more details. */
-
-#define samp_per_frame 1152
-#define samp_per_frame2 576
-#define HAN_SIZE 512
-#define SBLIMIT 32
-#define WAVE_RIFF_PCM 0
-#define MAX_CHANNELS 2
-#define MAX_GRANULES 2
-#define HTN 34
-#define true 1
-#define false 0
-#define uint32 unsigned int
-#define uint16 unsigned short
-#define uint8 unsigned char
-#define enct8 unsigned char
-#ifndef bool
-#define bool int
-#endif
-
-enum e_byte_order { order_unknown, order_bigEndian, order_littleEndian };
+ * This library 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
+ * Library General Public License for more details. */
#include "plugin.h"
-#define PFILE int*
-#define memcpy rb->memcpy
-#define memset rb->memset
PLUGIN_HEADER
-static struct plugin_api* rb;
+static struct plugin_api* rb;
#ifdef USE_IRAM
extern char iramcopy[];
@@ -48,242 +25,461 @@ extern char iedata[];
extern char iend[];
#endif
-typedef struct {
- PFILE file;
- int channels;
- int bits;
- long samplerate;
- long total_samples;
- long length;
-} wave_t;
+#define SAMP_PER_FRAME 1152
+#define SAMPL2 576
+#define SBLIMIT 32
+#define HTN 16
+#define memcpy rb->memcpy
+#define memset rb->memset
+#define putlong(c, s) if(s+sz <= 32) { cc = (cc << s) | c; sz+= s; } \
+ else { putbits(cc, sz); cc = c; sz = s; }
+
+enum e_byte_order { order_unknown, order_bigEndian, order_littleEndian };
+
+typedef unsigned long uint32;
+typedef unsigned short uint16;
+typedef unsigned char uint8;
+
typedef struct {
- int type;
- int layr;
- int mode;
- int bitr;
- int emph;
- int padding;
- long bits_per_frame;
- long bitrate_index;
- int samplerate_index;
- int crc;
- int ext;
- int mode_ext;
- int copyright;
- int original;
+ int type; /* 0=(22.05,24,16kHz) 1=(44.1,48,32kHz) */
+ int mode; /* 0=stereo, 1=jstereo, 2=dual, 3=mono */
+ int bitrate;
+ int padding;
+ int num_bands;
+ long bitr_id;
+ int smpl_id;
} mpeg_t;
+/* Side information */
typedef struct {
- enum e_byte_order byte_order;
- char* infile;
- wave_t wave;
- char* outfile;
- mpeg_t mpeg;
-} config_t;
+ uint32 part2_3_length;
+ int count1; /* number of 0-1-quadruples */
+ uint32 global_gain;
+ uint32 table_select[4];
+ uint32 region_0_1;
+ uint32 address1;
+ uint32 address2;
+ uint32 address3;
+ long quantStep;
+ long additStep;
+ long max_val;
+} side_info_t;
typedef struct {
- int bitpos;
- uint32 bbuf[257];
-} BF_Data;
+ enum e_byte_order byte_order;
+ side_info_t cod_info[2][2];
+ mpeg_t mpg;
+ long frac_per_frame;
+ long byte_per_frame;
+ long slot_lag;
+ int sideinfo_len;
+ int mean_bits;
+ int ResvSize;
+ int channels;
+ int granules;
+ int resample;
+ long samplerate;
+} config_t;
-/* Side information */
typedef struct {
- unsigned part2_3_length;
- unsigned big_values;
- int count1;
- unsigned global_gain;
- unsigned table_select[4];
- unsigned region0_count;
- unsigned region1_count;
- unsigned address1;
- unsigned address2;
- unsigned address3;
- long quantizerStepSize;
-} side_info_t;
+ int bitpos; /* current bitpos for writing */
+ uint32 bbuf[263];
+} BF_Data;
struct huffcodetab {
- int xlen; /*max. x-index+ */
- int ylen; /*max. y-index+ */
- int linbits; /*number of linbits */
- int linmax; /*max number stored in linbits */
- const uint16 *table; /*pointer to array[xlen][ylen] */
- const uint8 *hlen; /*pointer to array[xlen][ylen] */
+ int len; /* max. index */
+ const uint8 *table; /* pointer to array[len][len] */
+ const uint8 *hlen; /* pointer to array[len][len] */
};
-/* !!!!!!!! start of IRAM area: do not insert before x_int1 array !!!!!!!!!!!!! */
-short x_int0 [HAN_SIZE] IBSS_ATTR; /* 1024 Bytes */
-int mdct_freq [2][2][samp_per_frame2] IBSS_ATTR; /* 9216 Bytes */
-short x_int1 [HAN_SIZE] IBSS_ATTR; /* 1024 Bytes */
-/* !!!!!!!!!!!!!!!!!!!!! here you may insert other data !!!!!!!!!!!!!!!!!!!!!!! */
-uint8 int2idx [4096] IBSS_ATTR; /* 4096 Bytes */
-enct8 enc_data [2][2][samp_per_frame2] IBSS_ATTR; /* 4608 Bytes */
-short y_int [64] IBSS_ATTR; /* 256 Bytes */
-int off [2] IBSS_ATTR; /* 16 Bytes */
-int scalefac_long[23] IBSS_ATTR; /* 96 Bytes */
-int mdct_in [36] IBSS_ATTR; /* 144 Bytes */
-int sb_sample [2][3][18][SBLIMIT] IBSS_ATTR; /* 13824 Bytes */
-BF_Data CodedData IBSS_ATTR; /* 1040 Bytes */
-int ca_int [8] IBSS_ATTR; /* 32 Bytes */
-int cs_int [8] IBSS_ATTR; /* 32 Bytes */
-int win_int [18][36] IBSS_ATTR; /* 2592 Bytes */
-short filter_int [SBLIMIT][64] IBSS_ATTR; /* 8192 Bytes */
-short enwindow_int[512] IBSS_ATTR; /* 1024 Bytes */
-uint8 ht_count1 [2][2][16] IBSS_ATTR; /* 64 Bytes */
-uint16 t1HB [ 4] IBSS_ATTR; /* Bytes */
-uint16 t2HB [ 9] IBSS_ATTR; /* Bytes */
-uint16 t3HB [ 9] IBSS_ATTR; /* Bytes */
-uint16 t5HB [ 16] IBSS_ATTR; /* Bytes */
-uint16 t6HB [ 16] IBSS_ATTR; /* Bytes */
-uint16 t7HB [ 36] IBSS_ATTR; /* Bytes */
-uint16 t8HB [ 36] IBSS_ATTR; /* Bytes */
-uint16 t9HB [ 36] IBSS_ATTR; /* Bytes */
-uint16 t10HB [ 64] IBSS_ATTR; /* Bytes */
-uint16 t11HB [ 64] IBSS_ATTR; /* Bytes */
-uint16 t12HB [ 64] IBSS_ATTR; /* Bytes */
-uint16 t13HB [256] IBSS_ATTR; /* Bytes */
-uint16 t15HB [256] IBSS_ATTR; /* Bytes */
-uint16 t16HB [256] IBSS_ATTR; /* Bytes */
-uint16 t24HB [256] IBSS_ATTR; /* Bytes */
-uint8 t1l [ 4] IBSS_ATTR; /* Bytes */
-uint8 t2l [ 9] IBSS_ATTR; /* Bytes */
-uint8 t3l [ 9] IBSS_ATTR; /* Bytes */
-uint8 t5l [ 16] IBSS_ATTR; /* Bytes */
-uint8 t6l [ 16] IBSS_ATTR; /* Bytes */
-uint8 t7l [ 36] IBSS_ATTR; /* Bytes */
-uint8 t8l [ 36] IBSS_ATTR; /* Bytes */
-uint8 t9l [ 36] IBSS_ATTR; /* Bytes */
-uint8 t10l [ 64] IBSS_ATTR; /* Bytes */
-uint8 t11l [ 64] IBSS_ATTR; /* Bytes */
-uint8 t12l [ 64] IBSS_ATTR; /* Bytes */
-uint8 t13l [256] IBSS_ATTR; /* Bytes */
-uint8 t15l [256] IBSS_ATTR; /* Bytes */
-uint8 t16l [256] IBSS_ATTR; /* Bytes */
-uint8 t24l [256] IBSS_ATTR; /* Bytes */
-struct huffcodetab ht [HTN] IBSS_ATTR; /* Bytes */
-
-static const uint8 ht_count1_const[2][2][16] =
+struct huffcodebig {
+ int len; /* max. index */
+ int linbits; /* number of linbits */
+ int linmax; /* max number stored in linbits */
+};
+
+#define shft4(x) ((x + 8) >> 4)
+#define shft9(x) ((x + 256) >> 9)
+#define shft13(x) ((x + 4096) >> 13)
+#define shft15(x) ((x + 16384) >> 15)
+#define shft16(x) ((x + 32768) >> 16)
+#define shft_n(x,n) ((x) >> n)
+#define SQRT 724 /* sqrt(2) * 512 */
+
+short mfbuf [2*(1152+512)] IBSS_ATTR; /* 3328 Bytes */
+int sb_data [2][2][18][SBLIMIT] IBSS_ATTR; /* 13824 Bytes */
+int mdct_freq [SAMPL2] IBSS_ATTR; /* 9216 Bytes */
+short enc_data [SAMPL2] IBSS_ATTR; /* 4608 Bytes */
+uint32 scalefac [23] IBSS_ATTR; /* 92 Bytes */
+BF_Data CodedData IBSS_ATTR; /* 1056 Bytes */
+int ca [8] IBSS_ATTR; /* 32 Bytes */
+int cs [8] IBSS_ATTR; /* 32 Bytes */
+int cx [9] IBSS_ATTR; /* 36 Bytes */
+int win [18][4] IBSS_ATTR; /* 288 Bytes */
+short enwindow [15*27+24] IBSS_ATTR; /* 862 Bytes */
+short int2idx [4096] IBSS_ATTR; /* 8192 Bytes */
+uint8 ht_count [2][2][16] IBSS_ATTR; /* 64 Bytes */
+uint32 tab01 [ 16] IBSS_ATTR; /* 64 Bytes */
+uint32 tab23 [ 9] IBSS_ATTR; /* 36 Bytes */
+uint32 tab56 [ 16] IBSS_ATTR; /* 64 Bytes */
+uint32 tab1315 [256] IBSS_ATTR; /* 1024 Bytes */
+uint32 tab1624 [256] IBSS_ATTR; /* 1024 Bytes */
+uint32 tab789 [ 36] IBSS_ATTR; /* 144 Bytes */
+uint32 tabABC [ 64] IBSS_ATTR; /* 256 Bytes */
+uint8 t1HB [ 4] IBSS_ATTR;
+uint8 t2HB [ 9] IBSS_ATTR;
+uint8 t3HB [ 9] IBSS_ATTR;
+uint8 t5HB [ 16] IBSS_ATTR;
+uint8 t6HB [ 16] IBSS_ATTR;
+uint8 t7HB [ 36] IBSS_ATTR;
+uint8 t8HB [ 36] IBSS_ATTR;
+uint8 t9HB [ 36] IBSS_ATTR;
+uint8 t10HB [ 64] IBSS_ATTR;
+uint8 t11HB [ 64] IBSS_ATTR;
+uint8 t12HB [ 64] IBSS_ATTR;
+uint8 t13HB [256] IBSS_ATTR;
+uint8 t15HB [256] IBSS_ATTR;
+uint16 t16HB [256] IBSS_ATTR;
+uint16 t24HB [256] IBSS_ATTR;
+uint8 t1l [ 8] IBSS_ATTR;
+uint8 t2l [ 9] IBSS_ATTR;
+uint8 t3l [ 9] IBSS_ATTR;
+uint8 t5l [ 16] IBSS_ATTR;
+uint8 t6l [ 16] IBSS_ATTR;
+uint8 t7l [ 36] IBSS_ATTR;
+uint8 t8l [ 36] IBSS_ATTR;
+uint8 t9l [ 36] IBSS_ATTR;
+uint8 t10l [ 64] IBSS_ATTR;
+uint8 t11l [ 64] IBSS_ATTR;
+uint8 t12l [ 64] IBSS_ATTR;
+uint8 t13l [256] IBSS_ATTR;
+uint8 t15l [256] IBSS_ATTR;
+uint8 t16l [256] IBSS_ATTR;
+uint8 t24l [256] IBSS_ATTR;
+struct huffcodetab ht [HTN] IBSS_ATTR;
+
+static const uint8 ht_count_const[2][2][16] =
{ { { 1, 5, 4, 5, 6, 5, 4, 4, 7, 3, 6, 0, 7, 2, 3, 1 }, /* table0 */
{ 1, 5, 5, 7, 5, 8, 7, 9, 5, 7, 7, 9, 7, 9, 9,10 } }, /* hleng0 */
{ {15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }, /* table1 */
{ 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 } } }; /* hleng1 */
-static const uint16 t1HB_const[4] = {1, 1, 1, 0};
-static const uint16 t2HB_const[9] = {1, 2, 1, 3, 1, 1, 3, 2, 0};
-static const uint16 t3HB_const[9] = {3, 2, 1, 1, 1, 1, 3, 2, 0};
-static const uint16 t5HB_const[16] = {1, 2, 6, 5, 3, 1, 4, 4, 7, 5, 7, 1, 6, 1, 1, 0};
-static const uint16 t6HB_const[16] = {7, 3, 5, 1, 6, 2, 3, 2, 5, 4, 4, 1, 3, 3, 2, 0};
-static const uint16 t7HB_const[36] = {1, 2, 10, 19, 16, 10, 3, 3, 7, 10, 5, 3, 11, 4, 13, 17, 8, 4, 12, 11, 18, 15, 11, 2, 7, 6, 9, 14, 3, 1, 6, 4, 5, 3, 2, 0};
-static const uint16 t8HB_const[36] = {3, 4, 6, 18, 12, 5, 5, 1, 2, 16, 9, 3, 7, 3, 5, 14, 7, 3, 19, 17, 15, 13, 10, 4, 13, 5, 8, 11, 5, 1, 12, 4, 4, 1, 1, 0};
-static const uint16 t9HB_const[36] = {7, 5, 9, 14, 15, 7, 6, 4, 5, 5, 6, 7, 7, 6, 8, 8, 8, 5, 15, 6, 9, 10, 5, 1, 11, 7, 9, 6, 4, 1, 14, 4, 6, 2, 6, 0};
-static const uint16 t10HB_const[64] = {1, 2, 10, 23, 35, 30, 12, 17, 3, 3, 8, 12, 18, 21, 12, 7, 11, 9, 15, 21, 32, 40, 19, 6, 14, 13, 22, 34, 46, 23, 18, 7, 20, 19, 33, 47, 27, 22, 9, 3, 31, 22, 41, 26, 21, 20, 5, 3, 14, 13, 10, 11, 16, 6, 5, 1, 9, 8, 7, 8, 4 , 4, 2, 0};
-static const uint16 t11HB_const[64] = {3, 4, 10, 24, 34, 33, 21, 15, 5, 3, 4, 10, 32, 17, 11, 10, 11, 7, 13, 18, 30, 31, 20, 5, 25, 11, 19, 59, 27, 18, 12, 5, 35, 33, 31, 58, 30, 16, 7, 5, 28, 26, 32, 19, 17, 15, 8, 14, 14, 12, 9, 13, 14, 9, 4, 1, 11, 4, 6, 6, 6, 3, 2, 0};
-static const uint16 t12HB_const[64] = {9, 6, 16, 33, 41, 39, 38, 26, 7, 5, 6, 9, 23, 16, 26, 11, 17, 7, 11, 14, 21, 30, 10, 7, 17, 10, 15, 12, 18, 28, 14, 5, 32, 13, 22, 19, 18, 16, 9, 5, 40, 17, 31, 29, 17, 13, 4, 2, 27, 12, 11, 15, 10, 7, 4, 1, 27, 12, 8, 12 , 6, 3, 1, 0};
-static const uint16 t13HB_const[256] = {1, 5, 14, 21, 34, 51, 46, 71, 42, 52, 68, 52, 67, 44, 43, 19, 3, 4, 12, 19, 31, 26, 44, 33, 31, 24, 32, 24, 31, 35, 22, 14, 15, 13, 23, 36, 59, 49, 77, 65, 29, 40, 30, 40, 27, 33, 42, 16, 22,
- 20, 37, 61, 56, 79, 73, 64, 43, 76, 56, 37, 26, 31, 25, 14, 35, 16, 60, 57, 97, 75, 114, 91, 54, 73, 55, 41, 48, 53, 23, 24, 58, 27, 50, 96, 76, 70, 93, 84, 77, 58, 79, 29, 74, 49, 41, 17, 47,
- 45, 78, 74, 115, 94, 90, 79, 69, 83, 71, 50, 59, 38, 36, 15, 72, 34, 56, 95, 92, 85, 91, 90, 86, 73, 77, 65, 51, 44, 43, 42, 43, 20, 30, 44, 55, 78, 72, 87, 78, 61, 46, 54, 37, 30, 20, 16, 53,
- 25, 41, 37, 44, 59, 54, 81, 66, 76, 57, 54, 37, 18, 39, 11, 35, 33, 31, 57, 42, 82, 72, 80, 47, 58, 55, 21, 22, 26, 38, 22, 53, 25, 23, 38, 70, 60, 51, 36, 55, 26, 34, 23, 27, 14, 9, 7, 34, 32,
- 28, 39, 49, 75, 30, 52, 48, 40, 52, 28, 18, 17, 9, 5, 45, 21, 34, 64, 56, 50, 49, 45, 31, 19, 12, 15, 10, 7, 6, 3, 48, 23, 20, 39, 36, 35, 53, 21, 16, 23, 13, 10, 6, 1, 4, 2, 16, 15, 17, 27, 25,
- 20, 29, 11, 17, 12, 16, 8, 1, 1, 0, 1};
-static const uint16 t15HB_const[256] = {7, 12, 18, 53, 47, 76, 124, 108, 89, 123, 108, 119, 107, 81, 122, 63, 13, 5, 16, 27, 46, 36, 61, 51, 42, 70, 52, 83, 65, 41, 59, 36, 19, 17, 15, 24, 41, 34, 59, 48, 40, 64, 50, 78, 62, 80, 56,
- 33, 29, 28, 25, 43, 39, 63, 55, 93, 76, 59, 93, 72, 54, 75, 50, 29, 52, 22, 42, 40, 67, 57, 95, 79, 72, 57, 89, 69, 49, 66, 46, 27, 77, 37, 35, 66, 58, 52, 91, 74, 62, 48, 79, 63, 90, 62, 40, 38,
- 125, 32, 60, 56, 50, 92, 78, 65, 55, 87, 71, 51, 73, 51, 70, 30, 109, 53, 49, 94, 88, 75, 66, 122, 91, 73, 56, 42, 64, 44, 21, 25, 90, 43, 41, 77, 73, 63, 56, 92, 77, 66, 47, 67, 48, 53, 36, 20,
- 71, 34, 67, 60, 58, 49, 88, 76, 67, 106, 71, 54, 38, 39, 23, 15, 109, 53, 51, 47, 90, 82, 58, 57, 48, 72, 57, 41, 23, 27, 62, 9, 86, 42, 40, 37, 70, 64, 52, 43, 70, 55, 42, 25, 29, 18, 11, 11,
- 118, 68, 30, 55, 50, 46, 74, 65, 49, 39, 24, 16, 22, 13, 14, 7, 91, 44, 39, 38, 34, 63, 52, 45, 31, 52, 28, 19, 14, 8, 9, 3, 123, 60, 58, 53, 47, 43, 32, 22, 37, 24, 17, 12, 15, 10, 2, 1, 71,
- 37, 34, 30, 28, 20, 17, 26, 21, 16, 10, 6, 8, 6, 2, 0};
-static const uint16 t16HB_const[256] = {1, 5, 14, 44, 74, 63, 110, 93, 172, 149, 138, 242, 225, 195, 376, 17, 3, 4, 12, 20, 35, 62, 53, 47, 83, 75, 68, 119, 201, 107, 207, 9, 15, 13, 23, 38, 67, 58, 103, 90, 161, 72, 127, 117,
- 110, 209, 206, 16, 45, 21, 39, 69, 64, 114, 99, 87, 158, 140, 252, 212, 199, 387, 365, 26, 75, 36, 68, 65, 115, 101, 179, 164, 155, 264, 246, 226, 395, 382, 362, 9, 66, 30, 59, 56, 102,
- 185, 173, 265, 142, 253, 232, 400, 388, 378, 445, 16, 111, 54, 52, 100, 184, 178, 160, 133, 257, 244, 228, 217, 385, 366, 715, 10, 98, 48, 91, 88, 165, 157, 148, 261, 248, 407, 397, 372,
- 380, 889, 884, 8, 85, 84, 81, 159, 156, 143, 260, 249, 427, 401, 392, 383, 727, 713, 708, 7, 154, 76, 73, 141, 131, 256, 245, 426, 406, 394, 384, 735, 359, 710, 352, 11, 139, 129, 67, 125,
- 247, 233, 229, 219, 393, 743, 737, 720, 885, 882, 439, 4, 243, 120, 118, 115, 227, 223, 396, 746, 742, 736, 721, 712, 706, 223, 436, 6, 202, 224, 222, 218, 216, 389, 386, 381, 364, 888,
- 443, 707, 440, 437, 1728, 4, 747, 211, 210, 208, 370, 379, 734, 723, 714, 1735, 883, 877, 876, 3459, 865, 2, 377, 369, 102, 187, 726, 722, 358, 711, 709, 866, 1734, 871, 3458, 870, 434,
- 0, 12, 10, 7, 11, 10, 17, 11, 9, 13, 12, 10, 7, 5, 3, 1, 3};
-static const uint16 t24HB_const[256] = {15, 13, 46, 80, 146, 262, 248, 434, 426, 669, 653, 649, 621, 517, 1032, 88, 14, 12, 21, 38, 71, 130, 122, 216, 209, 198, 327, 345, 319, 297, 279, 42, 47, 22, 41, 74, 68, 128, 120, 221,
- 207, 194, 182, 340, 315, 295, 541, 18, 81, 39, 75, 70, 134, 125, 116, 220, 204, 190, 178, 325, 311, 293, 271, 16, 147, 72, 69, 135, 127, 118, 112, 210, 200, 188, 352, 323, 306, 285,
- 540, 14, 263, 66, 129, 126, 119, 114, 214, 202, 192, 180, 341, 317, 301, 281, 262, 12, 249, 123, 121, 117, 113, 215, 206, 195, 185, 347, 330, 308, 291, 272, 520, 10, 435, 115, 111,
- 109, 211, 203, 196, 187, 353, 332, 313, 298, 283, 531, 381, 17, 427, 212, 208, 205, 201, 193, 186, 177, 169, 320, 303, 286, 268, 514, 377, 16, 335, 199, 197, 191, 189, 181, 174, 333,
- 321, 305, 289, 275, 521, 379, 371, 11, 668, 184, 183, 179, 175, 344, 331, 314, 304, 290, 277, 530, 383, 373, 366, 10, 652, 346, 171, 168, 164, 318, 309, 299, 287, 276, 263, 513, 375,
- 368, 362, 6, 648, 322, 316, 312, 307, 302, 292, 284, 269, 261, 512, 376, 370, 364, 359, 4, 620, 300, 296, 294, 288, 282, 273, 266, 515, 380, 374, 369, 365, 361, 357, 2, 1033, 280, 278,
- 274, 267, 264, 259, 382, 378, 372, 367, 363, 360, 358, 356, 0, 43, 20, 19, 17, 15, 13, 11, 9, 7, 6, 4, 7, 5, 3, 1, 3};
-
-static const uint8 t1l_const[4] = {1, 3, 2, 3};
-static const uint8 t2l_const[9] = {1, 3, 6, 3, 3, 5, 5, 5, 6};
-static const uint8 t3l_const[9] = {2, 2, 6, 3, 2, 5, 5, 5, 6};
-static const uint8 t5l_const[16] = {1, 3, 6, 7, 3, 3, 6, 7, 6, 6, 7, 8, 7, 6, 7, 8};
-static const uint8 t6l_const[16] = {3, 3, 5, 7, 3, 2, 4, 5, 4, 4, 5, 6, 6, 5, 6, 7};
-static const uint8 t7l_const[36] = {1, 3, 6, 8, 8, 9, 3, 4, 6, 7, 7, 8, 6, 5, 7, 8, 8, 9, 7, 7, 8, 9, 9, 9, 7, 7, 8, 9, 9, 10, 8, 8, 9, 10, 10, 10};
-static const uint8 t8l_const[36] = {2, 3, 6, 8, 8, 9, 3, 2, 4, 8, 8, 8, 6, 4, 6, 8, 8, 9, 8, 8, 8, 9, 9, 10, 8, 7, 8, 9, 10, 10, 9, 8, 9, 9, 11, 11};
-static const uint8 t9l_const[36] = {3, 3, 5, 6, 8, 9, 3, 3, 4, 5, 6, 8, 4, 4, 5, 6, 7, 8, 6, 5, 6, 7, 7, 8, 7, 6, 7, 7, 8, 9, 8, 7, 8, 8, 9, 9};
-static const uint8 t10l_const[64] = {1, 3, 6, 8, 9, 9, 9, 10, 3, 4, 6, 7, 8, 9, 8, 8, 6, 6, 7, 8, 9, 10, 9, 9, 7, 7, 8, 9, 10, 10, 9, 10, 8, 8, 9, 10, 10, 10, 10, 10, 9, 9, 10, 10, 11, 11, 10, 11, 8, 8, 9, 10, 10, 10, 11, 11, 9, 8, 9, 10, 10, 11, 11, 11};
-static const uint8 t11l_const[64] = {2, 3, 5, 7, 8, 9, 8, 9, 3, 3, 4, 6, 8, 8, 7, 8, 5, 5, 6, 7, 8, 9, 8, 8, 7, 6, 7, 9, 8, 10, 8, 9, 8, 8, 8, 9, 9, 10, 9, 10, 8, 8, 9, 10, 10, 11, 10, 11, 8, 7, 7, 8, 9, 10, 10, 10, 8, 7, 8, 9, 10, 10, 10, 10};
-static const uint8 t12l_const[64] = {4, 3, 5, 7, 8, 9, 9, 9, 3, 3, 4, 5, 7, 7, 8, 8, 5, 4, 5, 6, 7, 8, 7, 8, 6, 5, 6, 6, 7, 8, 8, 8, 7, 6, 7, 7, 8, 8, 8, 9, 8, 7, 8, 8, 8, 9, 8, 9, 8, 7, 7, 8, 8, 9, 9, 10, 9, 8, 8, 9, 9, 9, 9, 10};
-static const uint8 t13l_const[256] = {1, 4, 6, 7, 8, 9, 9, 10, 9, 10, 11, 11, 12, 12, 13, 13, 3, 4, 6, 7, 8, 8, 9, 9, 9, 9, 10, 10, 11, 12, 12, 12, 6, 6, 7, 8, 9, 9, 10, 10, 9, 10, 10, 11, 11, 12, 13, 13, 7, 7, 8, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 13, 13,
-8, 7, 9, 9, 10, 10, 11, 11, 10, 11, 11, 12, 12, 13, 13, 14, 9, 8, 9, 10, 10, 10, 11, 11, 11, 11, 12, 11, 13, 13, 14, 14, 9, 9, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 13, 13, 14, 14, 10, 9, 10, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 16, 16, 9, 8, 9, 10,
-10, 11, 11, 12, 12, 12, 12, 13, 13, 14, 15, 15, 10, 9, 10, 10, 11, 11, 11, 13, 12, 13, 13, 14, 14, 14, 16, 15, 10, 10, 10, 11, 11, 12, 12, 13, 12, 13, 14, 13, 14, 15, 16, 17, 11, 10, 10, 11, 12, 12, 12, 12, 13, 13, 13, 14, 15, 15, 15, 16, 11, 11, 11, 12, 12,
-13, 12, 13, 14, 14, 15, 15, 15, 16, 16, 16, 12, 11, 12, 13, 13, 13, 14, 14, 14, 14, 14, 15, 16, 15, 16, 16, 13, 12, 12, 13, 13, 13, 15, 14, 14, 17, 15, 15, 15, 17, 16, 16, 12, 12, 13, 14, 14, 14, 15, 14, 15, 15, 16, 16, 19, 18, 19, 16};
-static const uint8 t15l_const[256] = {3, 4, 5, 7, 7, 8, 9, 9, 9, 10, 10, 11, 11, 11, 12, 13, 4, 3, 5, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 5, 5, 5, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 11, 11, 11, 6, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 7, 6, 7,
- 7, 8, 8, 9, 9, 9, 9, 10, 10, 10, 11, 11, 11, 8, 7, 7, 8, 8, 8, 9, 9, 9, 9, 10, 10, 11, 11, 11, 12, 9, 7, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 11, 11, 12, 12, 9, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 12, 9, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11,
- 12, 12, 12, 9, 8, 9, 9, 9, 9, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 10, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 12, 13, 12, 10, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 13, 11, 10, 9, 10, 10, 10, 11, 11, 11, 11, 11, 11, 12, 12, 13, 13,
-11, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 12, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 12, 13, 12, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13};
-static const uint8 t16l_const[256] = {1, 4, 6, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12, 13, 9, 3, 4, 6, 7, 8, 9, 9, 9, 10, 10, 10, 11, 12, 11, 12, 8, 6, 6, 7, 8, 9, 9, 10, 10, 11, 10, 11, 11, 11, 12, 12, 9, 8, 7, 8, 9, 9, 10, 10, 10, 11, 11, 12, 12, 12, 13, 13,
- 10, 9, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 9, 9, 8, 9, 9, 10, 11, 11, 12, 11, 12, 12, 13, 13, 13, 14, 10, 10, 9, 9, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 14, 10, 10, 9, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 13, 15, 15, 10, 10, 10,
- 10, 11, 11, 11, 12, 12, 13, 13, 13, 13, 14, 14, 14, 10, 11, 10, 10, 11, 11, 12, 12, 13, 13, 13, 13, 14, 13, 14, 13, 11, 11, 11, 10, 11, 12, 12, 12, 12, 13, 14, 14, 14, 15, 15, 14, 10, 12, 11, 11, 11, 12, 12, 13, 14, 14, 14, 14, 14, 14, 13, 14, 11, 12, 12,
- 12, 12, 12, 13, 13, 13, 13, 15, 14, 14, 14, 14, 16, 11, 14, 12, 12, 12, 13, 13, 14, 14, 14, 16, 15, 15, 15, 17, 15, 11, 13, 13, 11, 12, 14, 14, 13, 14, 14, 15, 16, 15, 17, 15, 14, 11, 9, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 8};
-static const uint8 t24l_const[256] = {4, 4, 6, 7, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 12, 9, 4, 4, 5, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 10, 8, 6, 5, 6, 7, 7, 8, 8, 9, 9, 9, 9, 10, 10, 10, 11, 7, 7, 6, 7, 7, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 7, 8, 7, 7, 8,
- 8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 7, 9, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 7, 9, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 7, 10, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 8, 10, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11,
-8, 10, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 8, 11, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 8, 11, 10, 9, 9, 9, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 8, 11, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 8, 11, 10, 10,
- 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 8, 12, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 4};
-
-const struct huffcodetab ht_const[HTN] =
-{
-{ 0, 0, 0, 0, NULL, NULL},
-{ 2, 2, 0, 0, t1HB, t1l},
-{ 3, 3, 0, 0, t2HB, t2l},
-{ 3, 3, 0, 0, t3HB, t3l},
-{ 0, 0, 0, 0, NULL, NULL},/* Apparently not used */
-{ 4, 4, 0, 0, t5HB, t5l},
-{ 4, 4, 0, 0, t6HB, t6l},
-{ 6, 6, 0, 0, t7HB, t7l},
-{ 6, 6, 0, 0, t8HB, t8l},
-{ 6, 6, 0, 0, t9HB, t9l},
-{ 8, 8, 0, 0,t10HB, t10l},
-{ 8, 8, 0, 0,t11HB, t11l},
-{ 8, 8, 0, 0,t12HB, t12l},
-{16,16, 0, 0,t13HB, t13l},
-{ 0, 0, 0, 0, NULL, NULL},/* Apparently not used */
-{16,16, 0, 0,t15HB, t15l},
-{16,16, 1, 1,t16HB, t16l},
-{16,16, 2, 3,t16HB, t16l},
-{16,16, 3, 7,t16HB, t16l},
-{16,16, 4, 15,t16HB, t16l},
-{16,16, 6, 63,t16HB, t16l},
-{16,16, 8, 255,t16HB, t16l},
-{16,16,10,1023,t16HB, t16l},
-{16,16,13,8191,t16HB, t16l},
-{16,16, 4, 15,t24HB, t24l},
-{16,16, 5, 31,t24HB, t24l},
-{16,16, 6, 63,t24HB, t24l},
-{16,16, 7, 127,t24HB, t24l},
-{16,16, 8, 255,t24HB, t24l},
-{16,16, 9, 511,t24HB, t24l},
-{16,16,11,2047,t24HB, t24l},
-{16,16,13,8191,t24HB, t24l} };
-
-const struct
+static const uint8 t1HB_const[4] = {1,1,1,0};
+static const uint8 t2HB_const[9] = {1,2,1,3,1,1,3,2,0};
+static const uint8 t3HB_const[9] = {3,2,1,1,1,1,3,2,0};
+static const uint8 t5HB_const[16] = {1,2,6,5,3,1,4,4,7,5,7,1,6,1,1,0};
+static const uint8 t6HB_const[16] = {7,3,5,1,6,2,3,2,5,4,4,1,3,3,2,0};
+
+static const uint8 t7HB_const[36] =
+{ 1, 2,10,19,16,10, 3, 3, 7,10, 5, 3,11, 4,13,17, 8, 4,
+ 12,11,18,15,11, 2, 7, 6, 9,14, 3, 1, 6, 4, 5, 3, 2, 0 };
+
+static const uint8 t8HB_const[36] =
+{ 3, 4, 6,18,12, 5, 5, 1, 2,16, 9, 3, 7, 3, 5,14, 7, 3,
+ 19,17,15,13,10, 4,13, 5, 8,11, 5, 1,12, 4, 4, 1, 1, 0 };
+
+static const uint8 t9HB_const[36] =
+{ 7, 5, 9,14,15, 7, 6, 4, 5, 5, 6, 7, 7, 6, 8, 8, 8, 5,
+ 15, 6, 9,10, 5, 1,11, 7, 9, 6, 4, 1,14, 4, 6, 2, 6, 0 };
+
+static const uint8 t10HB_const[64] =
+{1,2,10,23,35,30,12,17,3,3,8,12,18,21,12,7,11,9,15,21,32,
+ 40,19,6,14,13,22,34,46,23,18,7,20,19,33,47,27,22,9,3,31,22,
+ 41,26,21,20,5,3,14,13,10,11,16,6,5,1,9,8,7,8,4,4,2,0 };
+
+static const uint8 t11HB_const[64] =
+{3,4,10,24,34,33,21,15,5,3,4,10,32,17,11,10,11,7,13,18,30,
+ 31,20,5,25,11,19,59,27,18,12,5,35,33,31,58,30,16,7,5,28,26,
+ 32,19,17,15,8,14,14,12,9,13,14,9,4,1,11,4,6,6,6,3,2,0 };
+
+static const uint8 t12HB_const[64] =
+{9,6,16,33,41,39,38,26,7,5,6,9,23,16,26,11,17,7,11,14,21,
+30,10,7,17,10,15,12,18,28,14,5,32,13,22,19,18,16,9,5,40,17,
+31,29,17,13,4,2,27,12,11,15,10,7,4,1,27,12,8,12,6,3,1,0 };
+
+static const uint8 t13HB_const[256] =
+{1,5,14,21,34,51,46,71,42,52,68,52,67,44,43,19,3,4,12,19,31,26,44,33,31,24,32,
+ 24,31,35,22,14,15,13,23,36,59,49,77,65,29,40,30,40,27,33,42,16,22,20,37,61,56,
+ 79,73,64,43,76,56,37,26,31,25,14,35,16,60,57,97,75,114,91,54,73,55,41,48,53,
+ 23,24,58,27,50,96,76,70,93,84,77,58,79,29,74,49,41,17,47,45,78,74,115,94,90,
+ 79,69,83,71,50,59,38,36,15,72,34,56,95,92,85,91,90,86,73,77,65,51,44,43,42,43,
+ 20,30,44,55,78,72,87,78,61,46,54,37,30,20,16,53,25,41,37,44,59,54,81,66,76,57,
+ 54,37,18,39,11,35,33,31,57,42,82,72,80,47,58,55,21,22,26,38,22,53,25,23,38,70,
+ 60,51,36,55,26,34,23,27,14,9,7,34,32,28,39,49,75,30,52,48,40,52,28,18,17,9,5,
+ 45,21,34,64,56,50,49,45,31,19,12,15,10,7,6,3,48,23,20,39,36,35,53,21,16,23,13,
+ 10,6,1,4,2,16,15,17,27,25,20,29,11,17,12,16,8,1,1,0,1 };
+
+static const uint8 t15HB_const[256] =
+{7,12,18,53,47,76,124,108,89,123,108,119,107,81,122,63,13,5,16,27,46,36,61,51,
+ 42,70,52,83,65,41,59,36,19,17,15,24,41,34,59,48,40,64,50,78,62,80,56,33,29,28,
+ 25,43,39,63,55,93,76,59,93,72,54,75,50,29,52,22,42,40,67,57,95,79,72,57,89,69,
+ 49,66,46,27,77,37,35,66,58,52,91,74,62,48,79,63,90,62,40,38,125,32,60,56,50,
+ 92,78,65,55,87,71,51,73,51,70,30,109,53,49,94,88,75,66,122,91,73,56,42,64,44,
+ 21,25,90,43,41,77,73,63,56,92,77,66,47,67,48,53,36,20,71,34,67,60,58,49,88,76,
+ 67,106,71,54,38,39,23,15,109,53,51,47,90,82,58,57,48,72,57,41,23,27,62,9,86,
+ 42,40,37,70,64,52,43,70,55,42,25,29,18,11,11,118,68,30,55,50,46,74,65,49,39,
+ 24,16,22,13,14,7,91,44,39,38,34,63,52,45,31,52,28,19,14,8,9,3,123,60,58,53,47,
+ 43,32,22,37,24,17,12,15,10,2,1,71,37,34,30,28,20,17,26,21,16,10,6,8,6,2,0};
+
+static const uint16 t16HB_const[256] =
+{1,5,14,44,74,63,110,93,172,149,138,242,225,195,376,17,3,4,12,20,35,62,53,47,
+ 83,75,68,119,201,107,207,9,15,13,23,38,67,58,103,90,161,72,127,117,110,209,
+ 206,16,45,21,39,69,64,114,99,87,158,140,252,212,199,387,365,26,75,36,68,65,
+ 115,101,179,164,155,264,246,226,395,382,362,9,66,30,59,56,102,185,173,265,142,
+ 253,232,400,388,378,445,16,111,54,52,100,184,178,160,133,257,244,228,217,385,
+ 366,715,10,98,48,91,88,165,157,148,261,248,407,397,372,380,889,884,8,85,84,81,
+ 159,156,143,260,249,427,401,392,383,727,713,708,7,154,76,73,141,131,256,245,
+ 426,406,394,384,735,359,710,352,11,139,129,67,125,247,233,229,219,393,743,737,
+ 720,885,882,439,4,243,120,118,115,227,223,396,746,742,736,721,712,706,223,436,
+ 6,202,224,222,218,216,389,386,381,364,888,443,707,440,437,1728,4,747,211,210,
+ 208,370,379,734,723,714,1735,883,877,876,3459,865,2,377,369,102,187,726,722,
+ 358,711,709,866,1734,871,3458,870,434,0,12,10,7,11,10,17,11,9,13,12,10,7,5,3,
+ 1,3};
+
+static const uint16 t24HB_const[256] =
+{15,13,46,80,146,262,248,434,426,669,653,649,621,517,1032,88,14,12,21,38,71,
+ 130,122,216,209,198,327,345,319,297,279,42,47,22,41,74,68,128,120,221,207,194,
+ 182,340,315,295,541,18,81,39,75,70,134,125,116,220,204,190,178,325,311,293,
+ 271,16,147,72,69,135,127,118,112,210,200,188,352,323,306,285,540,14,263,66,
+ 129,126,119,114,214,202,192,180,341,317,301,281,262,12,249,123,121,117,113,
+ 215,206,195,185,347,330,308,291,272,520,10,435,115,111,109,211,203,196,187,
+ 353,332,313,298,283,531,381,17,427,212,208,205,201,193,186,177,169,320,303,
+ 286,268,514,377,16,335,199,197,191,189,181,174,333,321,305,289,275,521,379,
+ 371,11,668,184,183,179,175,344,331,314,304,290,277,530,383,373,366,10,652,346,
+ 171,168,164,318,309,299,287,276,263,513,375,368,362,6,648,322,316,312,307,302,
+ 292,284,269,261,512,376,370,364,359,4,620,300,296,294,288,282,273,266,515,380,
+ 374,369,365,361,357,2,1033,280,278,274,267,264,259,382,378,372,367,363,360,
+ 358,356,0,43,20,19,17,15,13,11,9,7,6,4,7,5,3,1,3};
+
+static const uint32 tab1315_const[256] =
+{ 0x010003,0x050005,0x070006,0x080008,0x090008,0x0a0009,0x0a000a,0x0b000a,
+ 0x0a000a,0x0b000b,0x0c000b,0x0c000c,0x0d000c,0x0d000c,0x0e000d,0x0e000e,
+ 0x040005,0x060005,0x080007,0x090008,0x0a0009,0x0a0009,0x0b000a,0x0b000a,
+ 0x0b000a,0x0b000b,0x0c000b,0x0c000c,0x0d000c,0x0e000c,0x0e000d,0x0e000d,
+ 0x070006,0x080007,0x090007,0x0a0008,0x0b0009,0x0b0009,0x0c000a,0x0c000a,
+ 0x0b000a,0x0c000b,0x0c000b,0x0d000c,0x0d000c,0x0e000d,0x0f000d,0x0f000d,
+ 0x080007,0x090008,0x0a0008,0x0b0009,0x0b0009,0x0c000a,0x0c000a,0x0c000b,
+ 0x0c000b,0x0d000b,0x0d000c,0x0d000c,0x0d000c,0x0e000d,0x0f000d,0x0f000d,
+ 0x090008,0x090008,0x0b0009,0x0b0009,0x0c000a,0x0c000a,0x0d000b,0x0d000b,
+ 0x0c000b,0x0d000b,0x0d000c,0x0e000c,0x0e000c,0x0f000d,0x0f000d,0x10000d,
+ 0x0a0009,0x0a0009,0x0b0009,0x0c000a,0x0c000a,0x0c000a,0x0d000b,0x0d000b,
+ 0x0d000b,0x0d000b,0x0e000c,0x0d000c,0x0f000d,0x0f000d,0x10000d,0x10000e,
+ 0x0a000a,0x0b0009,0x0c000a,0x0c000a,0x0d000a,0x0d000b,0x0d000b,0x0d000b,
+ 0x0d000b,0x0e000c,0x0e000c,0x0e000c,0x0f000d,0x0f000d,0x10000e,0x10000e,
+ 0x0b000a,0x0b000a,0x0c000a,0x0d000b,0x0d000b,0x0d000b,0x0e000b,0x0e000c,
+ 0x0e000c,0x0e000c,0x0f000c,0x0f000c,0x0f000d,0x10000d,0x12000d,0x12000e,
+ 0x0a000a,0x0a000a,0x0b000a,0x0c000b,0x0c000b,0x0d000b,0x0d000b,0x0e000c,
+ 0x0e000c,0x0e000c,0x0e000c,0x0f000d,0x0f000d,0x10000e,0x11000e,0x11000e,
+ 0x0b000a,0x0b000a,0x0c000b,0x0c000b,0x0d000b,0x0d000b,0x0d000c,0x0f000c,
+ 0x0e000c,0x0f000d,0x0f000d,0x10000d,0x10000d,0x10000e,0x12000e,0x11000e,
+ 0x0b000b,0x0c000b,0x0c000b,0x0d000b,0x0d000c,0x0e000c,0x0e000c,0x0f000c,
+ 0x0e000c,0x0f000d,0x10000d,0x0f000d,0x10000d,0x11000e,0x12000f,0x13000e,
+ 0x0c000b,0x0c000b,0x0c000b,0x0d000b,0x0e000c,0x0e000c,0x0e000c,0x0e000c,
+ 0x0f000d,0x0f000d,0x0f000d,0x10000d,0x11000e,0x11000e,0x11000e,0x12000f,
+ 0x0c000c,0x0d000c,0x0d000b,0x0e000c,0x0e000c,0x0f000c,0x0e000d,0x0f000d,
+ 0x10000d,0x10000d,0x11000d,0x11000d,0x11000e,0x12000e,0x12000f,0x12000f,
+ 0x0d000c,0x0d000c,0x0e000c,0x0f000c,0x0f000c,0x0f000d,0x10000d,0x10000d,
+ 0x10000d,0x10000e,0x10000e,0x11000e,0x12000e,0x11000e,0x12000f,0x12000f,
+ 0x0e000d,0x0e000d,0x0e000d,0x0f000d,0x0f000d,0x0f000d,0x11000d,0x10000d,
+ 0x10000e,0x13000e,0x11000e,0x11000e,0x11000f,0x13000f,0x12000e,0x12000f,
+ 0x0d000d,0x0e000d,0x0f000d,0x10000d,0x10000d,0x10000d,0x11000d,0x10000e,
+ 0x11000e,0x11000e,0x12000e,0x12000e,0x15000f,0x14000f,0x15000f,0x12000f };
+
+static const uint32 tab01_const[16] =
+{ 0x10004,0x50005,0x50005,0x70006,0x50005,0x80006,0x70006,0x90007,
+ 0x50005,0x70006,0x70006,0x90007,0x70006,0x90007,0x90007,0xa0008 };
+
+static const uint32 tab23_const[ 9] =
+{ 0x10002,0x40003,0x70007,0x40004,0x50004,0x70007,0x60006,0x70007,0x80008 };
+
+static const uint32 tab56_const[16] =
+{ 0x10003,0x40004,0x70006,0x80008,0x40004,0x50004,0x80006,0x90007,
+ 0x70005,0x80006,0x90007,0xa0008,0x80007,0x80007,0x90008,0xa0009 };
+
+static const uint32 tab789_const[36] =
+{0x00100803,0x00401004,0x00701c06,0x00902407,0x00902409,0x00a0280a,0x00401004,
+ 0x00601005,0x00801806,0x00902807,0x00902808,0x00a0280a,0x00701c05,0x00701806,
+ 0x00902007,0x00a02808,0x00a02809,0x00b02c0a,0x00802407,0x00902807,0x00a02808,
+ 0x00b02c09,0x00b02c09,0x00b0300a,0x00802408,0x00902408,0x00a02809,0x00b02c09,
+ 0x00b0300a,0x00c0300b,0x00902809,0x00a02809,0x00b02c0a,0x00c02c0a,0x00c0340b,
+ 0x00c0340b};
+
+static const uint32 tabABC_const[64] =
+{0x00100804,0x00401004,0x00701806,0x00902008,0x00a02409,0x00a0280a,0x00a0240a,
+ 0x00b0280a,0x00401004,0x00601405,0x00801806,0x00902007,0x00a02809,0x00b02809,
+ 0x00a0240a,0x00a0280a,0x00701806,0x00801c06,0x00902007,0x00a02408,0x00b02809,
+ 0x00c02c0a,0x00b02809,0x00b0280a,0x00802007,0x00902007,0x00a02408,0x00b02c08,
+ 0x00c02809,0x00c0300a,0x00b0280a,0x00c02c0a,0x00902408,0x00a02808,0x00b02809,
+ 0x00c02c09,0x00c02c0a,0x00c0300a,0x00c02c0a,0x00c0300b,0x00a02409,0x00b02809,
+ 0x00c02c0a,0x00c0300a,0x00d0300a,0x00d0340b,0x00c0300a,0x00d0340b,0x00902409,
+ 0x00a02409,0x00b02409,0x00c0280a,0x00c02c0a,0x00c0300b,0x00d0300b,0x00d0300c,
+ 0x00a0240a,0x00a0240a,0x00b0280a,0x00c02c0b,0x00c0300b,0x00d0300b,0x00d0300b,
+ 0x00d0300c};
+
+static const uint32 tab1624_const[256] =
+{0x00010004,0x00050005,0x00070007,0x00090008,0x000a0009,0x000a000a,0x000b000a,
+ 0x000b000b,0x000c000b,0x000c000c,0x000c000c,0x000d000c,0x000d000c,0x000d000c,
+ 0x000e000d,0x000a000a,0x00040005,0x00060006,0x00080007,0x00090008,0x000a0009,
+ 0x000b000a,0x000b000a,0x000b000b,0x000c000b,0x000c000b,0x000c000c,0x000d000c,
+ 0x000e000c,0x000d000c,0x000e000c,0x000a000a,0x00070007,0x00080007,0x00090008,
+ 0x000a0009,0x000b0009,0x000b000a,0x000c000a,0x000c000b,0x000d000b,0x000c000b,
+ 0x000d000b,0x000d000c,0x000d000c,0x000e000c,0x000e000d,0x000b0009,0x00090008,
+ 0x00090008,0x000a0009,0x000b0009,0x000b000a,0x000c000a,0x000c000a,0x000c000b,
+ 0x000d000b,0x000d000b,0x000e000b,0x000e000c,0x000e000c,0x000f000c,0x000f000c,
+ 0x000c0009,0x000a0009,0x000a0009,0x000b0009,0x000b000a,0x000c000a,0x000c000a,
+ 0x000d000a,0x000d000b,0x000d000b,0x000e000b,0x000e000c,0x000e000c,0x000f000c,
+ 0x000f000c,0x000f000d,0x000b0009,0x000a000a,0x000a0009,0x000b000a,0x000b000a,
+ 0x000c000a,0x000d000a,0x000d000b,0x000e000b,0x000d000b,0x000e000b,0x000e000c,
+ 0x000f000c,0x000f000c,0x000f000c,0x0010000c,0x000c0009,0x000b000a,0x000b000a,
+ 0x000b000a,0x000c000a,0x000d000a,0x000d000b,0x000d000b,0x000d000b,0x000e000b,
+ 0x000e000c,0x000e000c,0x000e000c,0x000f000c,0x000f000c,0x0010000d,0x000c0009,
+ 0x000b000b,0x000b000a,0x000c000a,0x000c000a,0x000d000b,0x000d000b,0x000d000b,
+ 0x000e000b,0x000e000c,0x000f000c,0x000f000c,0x000f000c,0x000f000c,0x0011000d,
+ 0x0011000d,0x000c000a,0x000b000b,0x000c000b,0x000c000b,0x000d000b,0x000d000b,
+ 0x000d000b,0x000e000b,0x000e000b,0x000f000b,0x000f000c,0x000f000c,0x000f000c,
+ 0x0010000c,0x0010000d,0x0010000d,0x000c000a,0x000c000b,0x000c000b,0x000c000b,
+ 0x000d000b,0x000d000b,0x000e000b,0x000e000b,0x000f000c,0x000f000c,0x000f000c,
+ 0x000f000c,0x0010000c,0x000f000d,0x0010000d,0x000f000d,0x000d000a,0x000c000c,
+ 0x000d000b,0x000c000b,0x000d000b,0x000e000b,0x000e000c,0x000e000c,0x000e000c,
+ 0x000f000c,0x0010000c,0x0010000c,0x0010000d,0x0011000d,0x0011000d,0x0010000d,
+ 0x000c000a,0x000d000c,0x000d000c,0x000d000b,0x000d000b,0x000e000b,0x000e000c,
+ 0x000f000c,0x0010000c,0x0010000c,0x0010000c,0x0010000c,0x0010000d,0x0010000d,
+ 0x000f000d,0x0010000d,0x000d000a,0x000d000c,0x000e000c,0x000e000c,0x000e000c,
+ 0x000e000c,0x000f000c,0x000f000c,0x000f000c,0x000f000c,0x0011000c,0x0010000d,
+ 0x0010000d,0x0010000d,0x0010000d,0x0012000d,0x000d000a,0x000f000c,0x000e000c,
+ 0x000e000c,0x000e000c,0x000f000c,0x000f000c,0x0010000c,0x0010000c,0x0010000d,
+ 0x0012000d,0x0011000d,0x0011000d,0x0011000d,0x0013000d,0x0011000d,0x000d000a,
+ 0x000e000d,0x000f000c,0x000d000c,0x000e000c,0x0010000c,0x0010000c,0x000f000c,
+ 0x0010000d,0x0010000d,0x0011000d,0x0012000d,0x0011000d,0x0013000d,0x0011000d,
+ 0x0010000d,0x000d000a,0x000a0009,0x000a0009,0x000a0009,0x000b0009,0x000b0009,
+ 0x000c0009,0x000c0009,0x000c0009,0x000d0009,0x000d0009,0x000d0009,0x000d000a,
+ 0x000d000a,0x000d000a,0x000d000a,0x000a0006};
+
+static const uint8 t1l_const[8] = {1,3,2,3,1,4,3,5};
+static const uint8 t2l_const[9] = {1,3,6,3,3,5,5,5,6};
+static const uint8 t3l_const[9] = {2,2,6,3,2,5,5,5,6};
+static const uint8 t5l_const[16] = {1,3,6,7,3,3,6,7,6,6,7,8,7,6,7,8};
+static const uint8 t6l_const[16] = {3,3,5,7,3,2,4,5,4,4,5,6,6,5,6,7};
+
+static const uint8 t7l_const[36] =
+{1,3,6,8,8,9,3,4,6,7,7,8,6,5,7,8,8,9,7,7,8,9,9,9,7,7,8,9,9,10,8,8,9,10,10,10};
+
+static const uint8 t8l_const[36] =
+{2,3,6,8,8,9,3,2,4,8,8,8,6,4,6,8,8,9,8,8,8,9,9,10,8,7,8,9,10,10,9,8,9,9,11,11};
+
+static const uint8 t9l_const[36] =
+{3,3,5,6,8,9,3,3,4,5,6,8,4,4,5,6,7,8,6,5,6,7,7,8,7,6,7,7,8,9,8,7,8,8,9,9};
+
+static const uint8 t10l_const[64] =
+{1,3,6,8,9,9,9,10,3,4,6,7,8,9,8,8,6,6,7,8,9,10,9,9,7,7,8,9,10,10,9,10,8,8,9,10,
+ 10,10,10,10,9,9,10,10,11,11,10,11,8,8,9,10,10,10,11,11,9,8,9,10,10,11,11,11};
+
+static const uint8 t11l_const[64] =
+{2,3,5,7,8,9,8,9,3,3,4,6,8,8,7,8,5,5,6,7,8,9,8,8,7,6,7,9,8,10,8,9,8,8,8,9,9,10,
+ 9,10,8,8,9,10,10,11,10,11,8,7,7,8,9,10,10,10,8,7,8,9,10,10,10,10};
+
+static const uint8 t12l_const[64] =
+{4,3,5,7,8,9,9,9,3,3,4,5,7,7,8,8,5,4,5,6,7,8,7,8,6,5,6,6,7,8,8,8,7,6,7,7,8,
+ 8,8,9,8,7,8,8,8,9,8,9,8,7,7,8,8,9,9,10,9,8,8,9,9,9,9,10};
+
+static const uint8 t13l_const[256] =
+{1,4,6,7,8,9,9,10,9,10,11,11,12,12,13,13,3,4,6,7,8,8,9,9,9,9,10,10,11,12,12,12,
+ 6,6,7,8,9,9,10,10,9,10,10,11,11,12,13,13,7,7,8,9,9,10,10,10,10,11,11,11,11,12,
+ 13,13,8,7,9,9,10,10,11,11,10,11,11,12,12,13,13,14,9,8,9,10,10,10,11,11,11,11,
+ 12,11,13,13,14,14,9,9,10,10,11,11,11,11,11,12,12,12,13,13,14,14,10,9,10,11,11,
+ 11,12,12,12,12,13,13,13,14,16,16,9,8,9,10,10,11,11,12,12,12,12,13,13,14,15,15,
+ 10,9,10,10,11,11,11,13,12,13,13,14,14,14,16,15,10,10,10,11,11,12,12,13,12,13,
+ 14,13,14,15,16,17,11,10,10,11,12,12,12,12,13,13,13,14,15,15,15,16,11,11,11,12,
+ 12,13,12,13,14,14,15,15,15,16,16,16,12,11,12,13,13,13,14,14,14,14,14,15,16,15,
+ 16,16,13,12,12,13,13,13,15,14,14,17,15,15,15,17,16,16,12,12,13,14,14,14,15,14,
+ 15,15,16,16,19,18,19,16};
+
+static const uint8 t15l_const[256] =
+{3,4,5,7,7,8,9,9,9,10,10,11,11,11,12,13,4,3,5,6,7,7,8,8,8,9,9,10,10,10,11,11,5,
+ 5,5,6,7,7,8,8,8,9,9,10,10,11,11,11,6,6,6,7,7,8,8,9,9,9,10,10,10,11,11,11,7,6,
+ 7,7,8,8,9,9,9,9,10,10,10,11,11,11,8,7,7,8,8,8,9,9,9,9,10,10,11,11,11,12,9,7,8,
+ 8,8,9,9,9,9,10,10,10,11,11,12,12,9,8,8,9,9,9,9,10,10,10,10,10,11,11,11,12,9,8,
+ 8,9,9,9,9,10,10,10,10,11,11,12,12,12,9,8,9,9,9,9,10,10,10,11,11,11,11,12,12,
+ 12,10,9,9,9,10,10,10,10,10,11,11,11,11,12,13,12,10,9,9,9,10,10,10,10,11,11,11,
+ 11,12,12,12,13,11,10,9,10,10,10,11,11,11,11,11,11,12,12,13,13,11,10,10,10,10,
+ 11,11,11,11,12,12,12,12,12,13,13,12,11,11,11,11,11,11,11,12,12,12,12,13,13,12,
+ 13,12,11,11,11,11,11,11,12,12,12,12,12,13,13,13,13};
+
+static const uint8 t16l_const[256] =
+{1,4,6,8,9,9,10,10,11,11,11,12,12,12,13,9,3,4,6,7,8,9,9,9,10,10,10,11,12,11,12,
+ 8,6,6,7,8,9,9,10,10,11,10,11,11,11,12,12,9,8,7,8,9,9,10,10,10,11,11,12,12,12,
+ 13,13,10,9,8,9,9,10,10,11,11,11,12,12,12,13,13,13,9,9,8,9,9,10,11,11,12,11,12,
+ 12,13,13,13,14,10,10,9,9,10,11,11,11,11,12,12,12,12,13,13,14,10,10,9,10,10,11,
+ 11,11,12,12,13,13,13,13,15,15,10,10,10,10,11,11,11,12,12,13,13,13,13,14,14,14,
+ 10,11,10,10,11,11,12,12,13,13,13,13,14,13,14,13,11,11,11,10,11,12,12,12,12,13,
+ 14,14,14,15,15,14,10,12,11,11,11,12,12,13,14,14,14,14,14,14,13,14,11,12,12,12,
+ 12,12,13,13,13,13,15,14,14,14,14,16,11,14,12,12,12,13,13,14,14,14,16,15,15,15,
+ 17,15,11,13,13,11,12,14,14,13,14,14,15,16,15,17,15,14,11,9,8,8,9,9,10,10,10,
+ 11,11,11,11,11,11,11,8};
+
+static const uint8 t24l_const[256] =
+{4,4,6,7,8,9,9,10,10,11,11,11,11,11,12,9,4,4,5,6,7,8,8,9,9,9,10,10,10,10,10,8,
+ 6,5,6,7,7,8,8,9,9,9,9,10,10,10,11,7,7,6,7,7,8,8,8,9,9,9,9,10,10,10,10,7,8,7,7,
+ 8,8,8,8,9,9,9,10,10,10,10,11,7,9,7,8,8,8,8,9,9,9,9,10,10,10,10,10,7,9,8,8,8,8,
+ 9,9,9,9,10,10,10,10,10,11,7,10,8,8,8,9,9,9,9,10,10,10,10,10,11,11,8,10,9,9,9,
+ 9,9,9,9,9,10,10,10,10,11,11,8,10,9,9,9,9,9,9,10,10,10,10,10,11,11,11,8,11,9,9,
+ 9,9,10,10,10,10,10,10,11,11,11,11,8,11,10,9,9,9,10,10,10,10,10,10,11,11,11,11,
+ 8,11,10,10,10,10,10,10,10,10,10,11,11,11,11,11,8,11,10,10,10,10,10,10,10,11,
+ 11,11,11,11,11,11,8,12,10,10,10,10,10,10,11,11,11,11,11,11,11,11,8,8,7,7,7,7,
+ 7,7,7,7,7,7,8,8,8,8,4};
+
+static const struct huffcodetab ht_const[HTN] =
+{ { 0, NULL, NULL}, /* Apparently not used */
+ { 2, t1HB, t1l},
+ { 3, t2HB, t2l},
+ { 3, t3HB, t3l},
+ { 0, NULL, NULL}, /* Apparently not used */
+ { 4, t5HB, t5l},
+ { 4, t6HB, t6l},
+ { 6, t7HB, t7l},
+ { 6, t8HB, t8l},
+ { 6, t9HB, t9l},
+ { 8, t10HB, t10l},
+ { 8, t11HB, t11l},
+ { 8, t12HB, t12l},
+ {16, t13HB, t13l},
+ { 0, NULL, NULL}, /* Apparently not used */
+ {16, t15HB, t15l} };
+
+static const struct huffcodebig ht_big[HTN] =
+{ { 16, 1, 1 },
+ { 16, 2, 3 },
+ { 16, 3, 7 },
+ { 16, 4, 15 },
+ { 16, 6, 63 },
+ { 16, 8, 255 },
+ { 16, 10, 1023 },
+ { 16, 13, 8191 },
+ { 16, 4, 15 },
+ { 16, 5, 31 },
+ { 16, 6, 63 },
+ { 16, 7, 127 },
+ { 16, 8, 255 },
+ { 16, 9, 511 },
+ { 16, 11, 2047 },
+ { 16, 13, 8191 } };
+
+static const struct
{
- unsigned region0_count;
- unsigned region1_count;
+ uint32 region0_cnt;
+ uint32 region1_cnt;
} subdv_table[23] =
-{ {0, 0}, /* 0 bands */
- {0, 0}, /* 1 bands */
- {0, 0}, /* 2 bands */
- {0, 0}, /* 3 bands */
- {0, 0}, /* 4 bands */
- {0, 1}, /* 5 bands */
- {1, 1}, /* 6 bands */
- {1, 1}, /* 7 bands */
- {1, 2}, /* 8 bands */
- {2, 2}, /* 9 bands */
+{ {0, 0}, /* 0 bands */
+ {0, 0}, /* 1 bands */
+ {0, 0}, /* 2 bands */
+ {0, 0}, /* 3 bands */
+ {0, 0}, /* 4 bands */
+ {0, 1}, /* 5 bands */
+ {1, 1}, /* 6 bands */
+ {1, 1}, /* 7 bands */
+ {1, 2}, /* 8 bands */
+ {2, 2}, /* 9 bands */
{2, 3}, /* 10 bands */
{2, 3}, /* 11 bands */
{3, 4}, /* 12 bands */
@@ -299,64 +495,7 @@ const struct
{6, 7}, /* 22 bands */
};
-/* This is table B.9: coefficients for aliasing reduction */
-static const int ca_int_const[8] = {0xffffbe25,0xffffc39e,0xffffd7e3,0xffffe8b7,0xfffff3e5,0xfffffac2,0xfffffe2f,0xffffff87};
-static const int cs_int_const[8] = {0x00006dc2,0x000070dd,0x0000798d,0x00007ddd,0x00007f6d,0x00007fe4,0x00007ffd,0x00008000};
-static const int win_int_const[18][36] = {
-{ 0x0000006b,0x00000121,0x000001a7,0x000001f9,0x00000215,0x000001f9,0x000001a7,0x00000121,0x0000006b,0xffffff8b,0xfffffe87,0xfffffd68,0xfffffc35,0xfffffaf9,0xfffff9bd,0xfffff88b,0xfffff76b,0xfffff667,0xfffff587,0xfffff4d1,0xfffff44b,0xfffff3f8,0xfffff3dd,0xfffff3f8,0xfffff44b,0xfffff4d1,0xfffff587,0xfffff667,0xfffff76b,0xfffff88b,0xfffff9bd,0xfffffaf9,0xfffffc35,0xfffffd68,0xfffffe87,0xffffff8b,},
-{ 0xffffff83,0xfffffe49,0xfffffcf3,0xfffffbc3,0xfffffaf9,0xfffffacb,0xfffffb5a,0xfffffcb0,0xfffffebf,0x0000015e,0x00000451,0x0000074d,0x00000a02,0x00000c23,0x00000d72,0x00000dc4,0x00000d06,0x00000b45,0x000008a6,0x00000565,0x000001cf,0xfffffe3b,0xfffffaf9,0xfffff853,0xfffff67c,0xfffff594,0xfffff59b,0xfffff67a,0xfffff801,0xfffff9f1,0xfffffc01,0xfffffdeb,0xffffff72,0x00000066,0x000000b5,0x00000060,},
-{ 0xffffffab,0xffffffc2,0x000000ec,0x000002e3,0x00000507,0x0000068f,0x000006c7,0x00000545,0x00000214,0xfffffdbc,0xfffff922,0xfffff55d,0xfffff366,0xfffff3dd,0xfffff6d7,0xfffffbd4,0x000001d7,0x000007a2,0x00000bfb,0x00000dfa,0x00000d3e,0x00000a00,0x00000507,0xffffff74,0xfffffa77,0xfffff70d,0xfffff5c4,0xfffff69f,0xfffff922,0xfffffc79,0xffffffb7,0x00000215,0x00000327,0x000002ef,0x000001d7,0x00000085,},
-{ 0x0000008c,0x000001d7,0x00000244,0x000000ec,0xfffffdeb,0xfffffa77,0xfffff85e,0xfffff922,0xfffffd1d,0x00000327,0x000008f3,0x00000bfb,0x00000aa3,0x00000507,0xfffffd11,0xfffff5c4,0xfffff206,0xfffff366,0xfffff971,0x000001d7,0x00000961,0x00000d3e,0x00000c23,0x000006c7,0xffffff7b,0xfffff922,0xfffff600,0xfffff6d7,0xfffffabb,0xffffffab,0x00000387,0x00000507,0x0000042c,0x00000214,0x0000003e,0xffffffb7,},
-{ 0x0000003c,0xffffff4b,0xfffffd28,0xfffffc0d,0xfffffdeb,0x00000283,0x0000070f,0x000007ff,0x000003ad,0xfffffbfd,0xfffff594,0xfffff4ec,0xfffffb2d,0x00000507,0x00000c88,0x00000cd4,0x00000565,0xfffffa91,0xfffff2e0,0xfffff2fa,0xfffffab0,0x00000530,0x00000c23,0x00000ba7,0x00000497,0xfffffbaf,0xfffff650,0xfffff720,0xfffffcb0,0x000002ec,0x00000611,0x00000507,0x000001a2,0xfffffed3,0xfffffe49,0xffffff6e,},
-{ 0xffffff69,0xfffffe87,0x00000022,0x0000039b,0x00000507,0x0000016b,0xfffffad7,0xfffff76b,0xfffffb91,0x000004d7,0x00000b2f,0x0000081a,0xfffffd46,0xfffff3dd,0xfffff490,0xffffff65,0x00000b2f,0x00000d8d,0x00000445,0xfffff76b,0xfffff221,0xfffff8b7,0x00000507,0x00000c50,0x000008d7,0xfffffe87,0xfffff6b3,0xfffff77b,0xfffffedf,0x000005a2,0x00000669,0x00000215,0xfffffdb4,0xfffffced,0xfffffedf,0x0000002f,},
-{ 0xffffffde,0x00000179,0x000002ba,0xffffffd1,0xfffffaf9,0xfffffb29,0x0000024c,0x00000895,0x00000529,0xfffffa5e,0xfffff4d1,0xfffffc65,0x0000094d,0x00000c23,0x00000097,0xfffff3b0,0xfffff4d1,0x00000313,0x00000ddf,0x00000895,0xfffff997,0xfffff273,0xfffffaf9,0x00000885,0x00000b70,0x00000179,0xfffff729,0xfffff7e6,0x00000121,0x00000749,0x0000046f,0xfffffdeb,0xfffffbbb,0xfffffe95,0x00000121,0x0000009b,},
-{ 0x0000009d,0x000000b5,0xfffffd8f,0xfffffc9c,0x00000215,0x00000682,0x000000ff,0xfffff801,0xfffffa27,0x00000662,0x00000a6c,0xfffffe70,0xfffff37f,0xfffffaf9,0x00000ac2,0x00000b04,0xfffffa9b,0xfffff1ea,0xfffffe26,0x00000d06,0x00000873,0xfffff7bf,0xfffff3dd,0x000001a5,0x00000be4,0x00000451,0xfffff7af,0xfffff861,0x00000350,0x00000793,0x000000db,0xfffffaf9,0xfffffd66,0x000001df,0x000001b7,0xffffffec,},
-{ 0x00000006,0xfffffe29,0xffffff56,0x00000414,0x00000215,0xfffffa2d,0xfffffbe5,0x000006de,0x0000067d,0xfffff8eb,0xfffff70d,0x00000671,0x00000b30,0xfffffaf9,0xfffff311,0x00000301,0x00000dfa,0xffffff62,0xfffff1cf,0xfffffe29,0x00000d8e,0x00000414,0xfffff3dd,0xfffffa2d,0x00000a1d,0x000006de,0xfffff845,0xfffff8eb,0x00000545,0x00000671,0xfffffcf8,0xfffffaf9,0x00000149,0x00000301,0xffffffc2,0xffffff62,},
-{ 0xffffff62,0x0000003e,0x00000301,0xfffffeb7,0xfffffaf9,0x00000308,0x00000671,0xfffffabb,0xfffff8eb,0x000007bb,0x000006de,0xfffff5e3,0xfffffa2d,0x00000c23,0x00000414,0xfffff272,0xfffffe29,0x00000e31,0xffffff62,0xfffff206,0x00000301,0x00000cef,0xfffffaf9,0xfffff4d0,0x00000671,0x000008f3,0xfffff8eb,0xfffff983,0x000006de,0x0000041b,0xfffffa2d,0xfffffdeb,0x00000414,0x000000aa,0xfffffe29,0xfffffffa,},
-{ 0x00000014,0x000001b7,0xfffffe21,0xfffffd66,0x00000507,0x000000db,0xfffff86d,0x00000350,0x0000079f,0xfffff7af,0xfffffbaf,0x00000be4,0xfffffe5b,0xfffff3dd,0x00000841,0x00000873,0xfffff2fa,0xfffffe26,0x00000e16,0xfffffa9b,0xfffff4fc,0x00000ac2,0x00000507,0xfffff37f,0x00000190,0x00000a6c,0xfffff99e,0xfffffa27,0x000007ff,0x000000ff,0xfffff97e,0x00000215,0x00000364,0xfffffd8f,0xffffff4b,0x0000009d,},
-{ 0x0000009b,0xfffffedf,0xfffffe95,0x00000445,0xfffffdeb,0xfffffb91,0x00000749,0xfffffedf,0xfffff7e6,0x000008d7,0x00000179,0xfffff490,0x00000885,0x00000507,0xfffff273,0x00000669,0x00000895,0xfffff221,0x00000313,0x00000b2f,0xfffff3b0,0xffffff69,0x00000c23,0xfffff6b3,0xfffffc65,0x00000b2f,0xfffffa5e,0xfffffad7,0x00000895,0xfffffdb4,0xfffffb29,0x00000507,0xffffffd1,0xfffffd46,0x00000179,0x00000022,},
-{ 0xffffffd1,0xfffffedf,0x00000313,0xfffffdb4,0xfffffdeb,0x00000669,0xfffffa5e,0xfffffedf,0x00000885,0xfffff6b3,0x00000179,0x000008d7,0xfffff3b0,0x00000507,0x00000749,0xfffff221,0x00000895,0x00000445,0xfffff273,0x00000b2f,0x0000009b,0xfffff490,0x00000c23,0xfffffd46,0xfffff7e6,0x00000b2f,0xfffffb29,0xfffffb91,0x00000895,0xfffffad7,0xfffffe95,0x00000507,0xfffffc65,0x00000022,0x00000179,0xffffff69,},
-{ 0xffffff6e,0x000001b7,0xfffffed3,0xfffffe5e,0x00000507,0xfffff9ef,0x000002ec,0x00000350,0xfffff720,0x000009b0,0xfffffbaf,0xfffffb69,0x00000ba7,0xfffff3dd,0x00000530,0x00000550,0xfffff2fa,0x00000d20,0xfffffa91,0xfffffa9b,0x00000cd4,0xfffff378,0x00000507,0x000004d3,0xfffff4ec,0x00000a6c,0xfffffbfd,0xfffffc53,0x000007ff,0xfffff8f1,0x00000283,0x00000215,0xfffffc0d,0x000002d8,0xffffff4b,0xffffffc4,},
-{ 0x00000049,0x0000003e,0xfffffdec,0x0000042c,0xfffffaf9,0x00000387,0x00000055,0xfffffabb,0x00000929,0xfffff600,0x000006de,0xffffff7b,0xfffff939,0x00000c23,0xfffff2c2,0x00000961,0xfffffe29,0xfffff971,0x00000c9a,0xfffff206,0x00000a3c,0xfffffd11,0xfffffaf9,0x00000aa3,0xfffff405,0x000008f3,0xfffffcd9,0xfffffd1d,0x000006de,0xfffff85e,0x00000589,0xfffffdeb,0xffffff14,0x00000244,0xfffffe29,0x0000008c,},
-{ 0x00000085,0xfffffe29,0x000002ef,0xfffffcd9,0x00000215,0x00000049,0xfffffc79,0x000006de,0xfffff69f,0x00000a3c,0xfffff70d,0x00000589,0xffffff74,0xfffffaf9,0x00000a00,0xfffff2c2,0x00000dfa,0xfffff405,0x000007a2,0xfffffe29,0xfffffbd4,0x00000929,0xfffff3dd,0x00000c9a,0xfffff55d,0x000006de,0xfffffdbc,0xfffffdec,0x00000545,0xfffff939,0x0000068f,0xfffffaf9,0x000002e3,0xffffff14,0xffffffc2,0x00000055,},
-{ 0xffffffa0,0x000000b5,0xffffff9a,0xffffff72,0x00000215,0xfffffc01,0x0000060f,0xfffff801,0x00000986,0xfffff59b,0x00000a6c,0xfffff67c,0x000007ad,0xfffffaf9,0x000001c5,0x000001cf,0xfffffa9b,0x000008a6,0xfffff4bb,0x00000d06,0xfffff23c,0x00000d72,0xfffff3dd,0x00000a02,0xfffff8b3,0x00000451,0xfffffea2,0xfffffebf,0x00000350,0xfffffb5a,0x00000535,0xfffffaf9,0x0000043d,0xfffffcf3,0x000001b7,0xffffff83,},
-{ 0xffffff8b,0x00000179,0xfffffd68,0x000003cb,0xfffffaf9,0x00000643,0xfffff88b,0x00000895,0xfffff667,0x00000a79,0xfffff4d1,0x00000bb5,0xfffff3f8,0x00000c23,0xfffff3f8,0x00000bb5,0xfffff4d1,0x00000a79,0xfffff667,0x00000895,0xfffff88b,0x00000643,0xfffffaf9,0x000003cb,0xfffffd68,0x00000179,0xffffff8b,0xffffff95,0x00000121,0xfffffe59,0x000001f9,0xfffffdeb,0x000001f9,0xfffffe59,0x00000121,0xffffff95,}};
-
-const short filter_int_const[SBLIMIT][64] = {
-{ 23170, 24279, 25330, 26320, 27246, 28106, 28899, 29622, 30274, 30853, 31357, 31786, 32138, 32413, 32610, 32729, 32767, 32729, 32610, 32413, 32138, 31786, 31357, 30853, 30274, 29622, 28899, 28106, 27246, 26320, 25330, 24279, 23170, 22006, 20788, 19520, 18205, 16846, 15447, 14010, 12540, 11039, 9512, 7962, 6393, 4808, 3212, 1608, 0, -1607, -3211, -4807, -6392, -7961, -9511,-11038,-12539,-14009,-15446,-16845,-18204,-19519,-20787,-22005, },
-{ -23169,-19519,-15446,-11038, -6392, -1607, 3212, 7962, 12540, 16846, 20788, 24279, 27246, 29622, 31357, 32413, 32767, 32413, 31357, 29622, 27246, 24279, 20788, 16846, 12540, 7962, 3212, -1607, -6392,-11038,-15446,-19519,-23169,-26319,-28898,-30852,-32137,-32728,-32609,-31785,-30273,-28105,-25329,-22005,-18204,-14009, -9511, -4807, 0, 4808, 9512, 14010, 18205, 22006, 25330, 28106, 30274, 31786, 32610, 32729, 32138, 30853, 28899, 26320, },
-{ -23169,-28105,-31356,-32728,-32137,-29621,-25329,-19519,-12539, -4807, 3212, 11039, 18205, 24279, 28899, 31786, 32767, 31786, 28899, 24279, 18205, 11039, 3212, -4807,-12539,-19519,-25329,-29621,-32137,-32728,-31356,-28105,-23169,-16845, -9511, -1607, 6393, 14010, 20788, 26320, 30274, 32413, 32610, 30853, 27246, 22006, 15447, 7962, 0, -7961,-15446,-22005,-27245,-30852,-32609,-32412,-30273,-26319,-20787,-14009, -6392, 1608, 9512, 16846, },
-{ 23170, 14010, 3212, -7961,-18204,-26319,-31356,-32728,-30273,-24278,-15446, -4807, 6393, 16846, 25330, 30853, 32767, 30853, 25330, 16846, 6393, -4807,-15446,-24278,-30273,-32728,-31356,-26319,-18204, -7961, 3212, 14010, 23170, 29622, 32610, 31786, 27246, 19520, 9512, -1607,-12539,-22005,-28898,-32412,-32137,-28105,-20787,-11038, 0, 11039, 20788, 28106, 32138, 32413, 28899, 22006, 12540, 1608, -9511,-19519,-27245,-31785,-32609,-29621, },
-{ 23170, 30853, 32610, 28106, 18205, 4808, -9511,-22005,-30273,-32728,-28898,-19519, -6392, 7962, 20788, 29622, 32767, 29622, 20788, 7962, -6392,-19519,-28898,-32728,-30273,-22005, -9511, 4808, 18205, 28106, 32610, 30853, 23170, 11039, -3211,-16845,-27245,-32412,-31356,-24278,-12539, 1608, 15447, 26320, 32138, 31786, 25330, 14010, 0,-14009,-25329,-31785,-32137,-26319,-15446, -1607, 12540, 24279, 31357, 32413, 27246, 16846, 3212,-11038, },
-{ -23169, -7961, 9512, 24279, 32138, 30853, 20788, 4808,-12539,-26319,-32609,-29621,-18204, -1607, 15447, 28106, 32767, 28106, 15447, -1607,-18204,-29621,-32609,-26319,-12539, 4808, 20788, 30853, 32138, 24279, 9512, -7961,-23169,-31785,-31356,-22005, -6392, 11039, 25330, 32413, 30274, 19520, 3212,-14009,-27245,-32728,-28898,-16845, 0, 16846, 28899, 32729, 27246, 14010, -3211,-19519,-30273,-32412,-25329,-11038, 6393, 22006, 31357, 31786, },
-{ -23169,-32412,-28898,-14009, 6393, 24279, 32610, 28106, 12540, -7961,-25329,-32728,-27245,-11038, 9512, 26320, 32767, 26320, 9512,-11038,-27245,-32728,-25329, -7961, 12540, 28106, 32610, 24279, 6393,-14009,-28898,-32412,-23169, -4807, 15447, 29622, 32138, 22006, 3212,-16845,-30273,-31785,-20787, -1607, 18205, 30853, 31357, 19520, 0,-19519,-31356,-30852,-18204, 1608, 20788, 31786, 30274, 16846, -3211,-22005,-32137,-29621,-15446, 4808, },
-{ 23170, 1608,-20787,-32412,-27245, -7961, 15447, 30853, 30274, 14010, -9511,-28105,-32137,-19519, 3212, 24279, 32767, 24279, 3212,-19519,-32137,-28105, -9511, 14010, 30274, 30853, 15447, -7961,-27245,-32412,-20787, 1608, 23170, 32729, 25330, 4808,-18204,-31785,-28898,-11038, 12540, 29622, 31357, 16846, -6392,-26319,-32609,-22005, 0, 22006, 32610, 26320, 6393,-16845,-31356,-29621,-12539, 11039, 28899, 31786, 18205, -4807,-25329,-32728, },
-{ 23170, 32729, 20788, -4807,-27245,-31785,-15446, 11039, 30274, 29622, 9512,-16845,-32137,-26319, -3211, 22006, 32767, 22006, -3211,-26319,-32137,-16845, 9512, 29622, 30274, 11039,-15446,-31785,-27245, -4807, 20788, 32729, 23170, -1607,-25329,-32412,-18204, 7962, 28899, 30853, 12540,-14009,-31356,-28105, -6392, 19520, 32610, 24279, 0,-24278,-32609,-19519, 6393, 28106, 31357, 14010,-12539,-30852,-28898, -7961, 18205, 32413, 25330, 1608, },
-{ -23169, 4808, 28899, 29622, 6393,-22005,-32609,-16845, 12540, 31786, 25330, -1607,-27245,-30852, -9511, 19520, 32767, 19520, -9511,-30852,-27245, -1607, 25330, 31786, 12540,-16845,-32609,-22005, 6393, 29622, 28899, 4808,-23169,-32412,-15446, 14010, 32138, 24279, -3211,-28105,-30273, -7961, 20788, 32729, 18205,-11038,-31356,-26319, 0, 26320, 31357, 11039,-18204,-32728,-20787, 7962, 30274, 28106, 3212,-24278,-32137,-14009, 15447, 32413, },
-{ -23169,-31785, -9511, 22006, 32138, 11039,-20787,-32412,-12539, 19520, 32610, 14010,-18204,-32728,-15446, 16846, 32767, 16846,-15446,-32728,-18204, 14010, 32610, 19520,-12539,-32412,-20787, 11039, 32138, 22006, -9511,-31785,-23169, 7962, 31357, 24279, -6392,-30852,-25329, 4808, 30274, 26320, -3211,-29621,-27245, 1608, 28899, 28106, 0,-28105,-28898, -1607, 27246, 29622, 3212,-26319,-30273, -4807, 25330, 30853, 6393,-24278,-31356, -7961, },
-{ 23170,-11038,-32609,-16845, 18205, 32413, 9512,-24278,-30273, -1607, 28899, 26320, -6392,-31785,-20787, 14010, 32767, 14010,-20787,-31785, -6392, 26320, 28899, -1607,-30273,-24278, 9512, 32413, 18205,-16845,-32609,-11038, 23170, 30853, 3212,-28105,-27245, 4808, 31357, 22006,-12539,-32728,-15446, 19520, 32138, 7962,-25329,-29621, 0, 29622, 25330, -7961,-32137,-19519, 15447, 32729, 12540,-22005,-31356, -4807, 27246, 28106, -3211,-30852, },
-{ 23170, 29622, -3211,-31785,-18204, 19520, 31357, 1608,-30273,-22005, 15447, 32413, 6393,-28105,-25329, 11039, 32767, 11039,-25329,-28105, 6393, 32413, 15447,-22005,-30273, 1608, 31357, 19520,-18204,-31785, -3211, 29622, 23170,-14009,-32609, -7961, 27246, 26320, -9511,-32728,-12539, 24279, 28899, -4807,-32137,-16845, 20788, 30853, 0,-30852,-20787, 16846, 32138, 4808,-28898,-24278, 12540, 32729, 9512,-26319,-27245, 7962, 32610, 14010, },
-{ -23169, 16846, 31357, -1607,-32137,-14009, 25330, 26320,-12539,-32412, -3211, 30853, 18205,-22005,-28898, 7962, 32767, 7962,-28898,-22005, 18205, 30853, -3211,-32412,-12539, 26320, 25330,-14009,-32137, -1607, 31357, 16846,-23169,-28105, 9512, 32729, 6393,-29621,-20787, 19520, 30274, -4807,-32609,-11038, 27246, 24279,-15446,-31785, 0, 31786, 15447,-24278,-27245, 11039, 32610, 4808,-30273,-19519, 20788, 29622, -6392,-32728, -9511, 28106, },
-{ -23169,-26319, 15447, 30853, -6392,-32728, -3211, 31786, 12540,-28105,-20787, 22006, 27246,-14009,-31356, 4808, 32767, 4808,-31356,-14009, 27246, 22006,-20787,-28105, 12540, 31786, -3211,-32728, -6392, 30853, 15447,-26319,-23169, 19520, 28899,-11038,-32137, 1608, 32610, 7962,-30273,-16845, 25330, 24279,-18204,-29621, 9512, 32413, 0,-32412, -9511, 29622, 18205,-24278,-25329, 16846, 30274, -7961,-32609, -1607, 32138, 11039,-28898,-19519, },
-{ 23170,-22005,-25329, 19520, 27246,-16845,-28898, 14010, 30274,-11038,-31356, 7962, 32138, -4807,-32609, 1608, 32767, 1608,-32609, -4807, 32138, 7962,-31356,-11038, 30274, 14010,-28898,-16845, 27246, 19520,-25329,-22005, 23170, 24279,-20787,-26319, 18205, 28106,-15446,-29621, 12540, 30853, -9511,-31785, 6393, 32413, -3211,-32728, 0, 32729, 3212,-32412, -6392, 31786, 9512,-30852,-12539, 29622, 15447,-28105,-18204, 26320, 20788,-24278, },
-{ 23170, 22006,-25329,-19519, 27246, 16846,-28898,-14009, 30274, 11039,-31356, -7961, 32138, 4808,-32609, -1607, 32767, -1607,-32609, 4808, 32138, -7961,-31356, 11039, 30274,-14009,-28898, 16846, 27246,-19519,-25329, 22006, 23170,-24278,-20787, 26320, 18205,-28105,-15446, 29622, 12540,-30852, -9511, 31786, 6393,-32412, -3211, 32729, 0,-32728, 3212, 32413, -6392,-31785, 9512, 30853,-12539,-29621, 15447, 28106,-18204,-26319, 20788, 24279, },
-{ -23169, 26320, 15447,-30852, -6392, 32729, -3211,-31785, 12540, 28106,-20787,-22005, 27246, 14010,-31356, -4807, 32767, -4807,-31356, 14010, 27246,-22005,-20787, 28106, 12540,-31785, -3211, 32729, -6392,-30852, 15447, 26320,-23169,-19519, 28899, 11039,-32137, -1607, 32610, -7961,-30273, 16846, 25330,-24278,-18204, 29622, 9512,-32412, 0, 32413, -9511,-29621, 18205, 24279,-25329,-16845, 30274, 7962,-32609, 1608, 32138,-11038,-28898, 19520, },
-{ -23169,-16845, 31357, 1608,-32137, 14010, 25330,-26319,-12539, 32413, -3211,-30852, 18205, 22006,-28898, -7961, 32767, -7961,-28898, 22006, 18205,-30852, -3211, 32413,-12539,-26319, 25330, 14010,-32137, 1608, 31357,-16845,-23169, 28106, 9512,-32728, 6393, 29622,-20787,-19519, 30274, 4808,-32609, 11039, 27246,-24278,-15446, 31786, 0,-31785, 15447, 24279,-27245,-11038, 32610, -4807,-30273, 19520, 20788,-29621, -6392, 32729, -9511,-28105, },
-{ 23170,-29621, -3211, 31786,-18204,-19519, 31357, -1607,-30273, 22006, 15447,-32412, 6393, 28106,-25329,-11038, 32767,-11038,-25329, 28106, 6393,-32412, 15447, 22006,-30273, -1607, 31357,-19519,-18204, 31786, -3211,-29621, 23170, 14010,-32609, 7962, 27246,-26319, -9511, 32729,-12539,-24278, 28899, 4808,-32137, 16846, 20788,-30852, 0, 30853,-20787,-16845, 32138, -4807,-28898, 24279, 12540,-32728, 9512, 26320,-27245, -7961, 32610,-14009, },
-{ 23170, 11039,-32609, 16846, 18205,-32412, 9512, 24279,-30273, 1608, 28899,-26319, -6392, 31786,-20787,-14009, 32767,-14009,-20787, 31786, -6392,-26319, 28899, 1608,-30273, 24279, 9512,-32412, 18205, 16846,-32609, 11039, 23170,-30852, 3212, 28106,-27245, -4807, 31357,-22005,-12539, 32729,-15446,-19519, 32138, -7961,-25329, 29622, 0,-29621, 25330, 7962,-32137, 19520, 15447,-32728, 12540, 22006,-31356, 4808, 27246,-28105, -3211, 30853, },
-{ -23169, 31786, -9511,-22005, 32138,-11038,-20787, 32413,-12539,-19519, 32610,-14009,-18204, 32729,-15446,-16845, 32767,-16845,-15446, 32729,-18204,-14009, 32610,-19519,-12539, 32413,-20787,-11038, 32138,-22005, -9511, 31786,-23169, -7961, 31357,-24278, -6392, 30853,-25329, -4807, 30274,-26319, -3211, 29622,-27245, -1607, 28899,-28105, 0, 28106,-28898, 1608, 27246,-29621, 3212, 26320,-30273, 4808, 25330,-30852, 6393, 24279,-31356, 7962, },
-{ -23169, -4807, 28899,-29621, 6393, 22006,-32609, 16846, 12540,-31785, 25330, 1608,-27245, 30853, -9511,-19519, 32767,-19519, -9511, 30853,-27245, 1608, 25330,-31785, 12540, 16846,-32609, 22006, 6393,-29621, 28899, -4807,-23169, 32413,-15446,-14009, 32138,-24278, -3211, 28106,-30273, 7962, 20788,-32728, 18205, 11039,-31356, 26320, 0,-26319, 31357,-11038,-18204, 32729,-20787, -7961, 30274,-28105, 3212, 24279,-32137, 14010, 15447,-32412, },
-{ 23170,-32728, 20788, 4808,-27245, 31786,-15446,-11038, 30274,-29621, 9512, 16846,-32137, 26320, -3211,-22005, 32767,-22005, -3211, 26320,-32137, 16846, 9512,-29621, 30274,-11038,-15446, 31786,-27245, 4808, 20788,-32728, 23170, 1608,-25329, 32413,-18204, -7961, 28899,-30852, 12540, 14010,-31356, 28106, -6392,-19519, 32610,-24278, 0, 24279,-32609, 19520, 6393,-28105, 31357,-14009,-12539, 30853,-28898, 7962, 18205,-32412, 25330, -1607, },
-{ 23170, -1607,-20787, 32413,-27245, 7962, 15447,-30852, 30274,-14009, -9511, 28106,-32137, 19520, 3212,-24278, 32767,-24278, 3212, 19520,-32137, 28106, -9511,-14009, 30274,-30852, 15447, 7962,-27245, 32413,-20787, -1607, 23170,-32728, 25330, -4807,-18204, 31786,-28898, 11039, 12540,-29621, 31357,-16845, -6392, 26320,-32609, 22006, 0,-22005, 32610,-26319, 6393, 16846,-31356, 29622,-12539,-11038, 28899,-31785, 18205, 4808,-25329, 32729, },
-{ -23169, 32413,-28898, 14010, 6393,-24278, 32610,-28105, 12540, 7962,-25329, 32729,-27245, 11039, 9512,-26319, 32767,-26319, 9512, 11039,-27245, 32729,-25329, 7962, 12540,-28105, 32610,-24278, 6393, 14010,-28898, 32413,-23169, 4808, 15447,-29621, 32138,-22005, 3212, 16846,-30273, 31786,-20787, 1608, 18205,-30852, 31357,-19519, 0, 19520,-31356, 30853,-18204, -1607, 20788,-31785, 30274,-16845, -3211, 22006,-32137, 29622,-15446, -4807, },
-{ -23169, 7962, 9512,-24278, 32138,-30852, 20788, -4807,-12539, 26320,-32609, 29622,-18204, 1608, 15447,-28105, 32767,-28105, 15447, 1608,-18204, 29622,-32609, 26320,-12539, -4807, 20788,-30852, 32138,-24278, 9512, 7962,-23169, 31786,-31356, 22006, -6392,-11038, 25330,-32412, 30274,-19519, 3212, 14010,-27245, 32729,-28898, 16846, 0,-16845, 28899,-32728, 27246,-14009, -3211, 19520,-30273, 32413,-25329, 11039, 6393,-22005, 31357,-31785, },
-{ 23170,-30852, 32610,-28105, 18205, -4807, -9511, 22006,-30273, 32729,-28898, 19520, -6392, -7961, 20788,-29621, 32767,-29621, 20788, -7961, -6392, 19520,-28898, 32729,-30273, 22006, -9511, -4807, 18205,-28105, 32610,-30852, 23170,-11038, -3211, 16846,-27245, 32413,-31356, 24279,-12539, -1607, 15447,-26319, 32138,-31785, 25330,-14009, 0, 14010,-25329, 31786,-32137, 26320,-15446, 1608, 12540,-24278, 31357,-32412, 27246,-16845, 3212, 11039, },
-{ 23170,-14009, 3212, 7962,-18204, 26320,-31356, 32729,-30273, 24279,-15446, 4808, 6393,-16845, 25330,-30852, 32767,-30852, 25330,-16845, 6393, 4808,-15446, 24279,-30273, 32729,-31356, 26320,-18204, 7962, 3212,-14009, 23170,-29621, 32610,-31785, 27246,-19519, 9512, 1608,-12539, 22006,-28898, 32413,-32137, 28106,-20787, 11039, 0,-11038, 20788,-28105, 32138,-32412, 28899,-22005, 12540, -1607, -9511, 19520,-27245, 31786,-32609, 29622, },
-{ -23169, 28106,-31356, 32729,-32137, 29622,-25329, 19520,-12539, 4808, 3212,-11038, 18205,-24278, 28899,-31785, 32767,-31785, 28899,-24278, 18205,-11038, 3212, 4808,-12539, 19520,-25329, 29622,-32137, 32729,-31356, 28106,-23169, 16846, -9511, 1608, 6393,-14009, 20788,-26319, 30274,-32412, 32610,-30852, 27246,-22005, 15447, -7961, 0, 7962,-15446, 22006,-27245, 30853,-32609, 32413,-30273, 26320,-20787, 14010, -6392, -1607, 9512,-16845, },
-{ -23169, 19520,-15446, 11039, -6392, 1608, 3212, -7961, 12540,-16845, 20788,-24278, 27246,-29621, 31357,-32412, 32767,-32412, 31357,-29621, 27246,-24278, 20788,-16845, 12540, -7961, 3212, 1608, -6392, 11039,-15446, 19520,-23169, 26320,-28898, 30853,-32137, 32729,-32609, 31786,-30273, 28106,-25329, 22006,-18204, 14010, -9511, 4808, 0, -4807, 9512,-14009, 18205,-22005, 25330,-28105, 30274,-31785, 32610,-32728, 32138,-30852, 28899,-26319, },
-{ 23170,-24278, 25330,-26319, 27246,-28105, 28899,-29621, 30274,-30852, 31357,-31785, 32138,-32412, 32610,-32728, 32767,-32728, 32610,-32412, 32138,-31785, 31357,-30852, 30274,-29621, 28899,-28105, 27246,-26319, 25330,-24278, 23170,-22005, 20788,-19519, 18205,-16845, 15447,-14009, 12540,-11038, 9512, -7961, 6393, -4807, 3212, -1607, 0, 1608, -3211, 4808, -6392, 7962, -9511, 11039,-12539, 14010,-15446, 16846,-18204, 19520,-20787, 22006, } };
-
-const int sfBandIndex[6][23] =
+static const uint32 sfBand[6][23] =
{
/* Table B.2.b: 22.05 kHz */
{0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
@@ -371,744 +510,830 @@ const int sfBandIndex[6][23] =
/* Table B.8.a: 32 kHz */
{0,4, 8,12,16,20,24,30,36,44,54,66, 82,102,126,156,194,240,296,364,448,550,576} };
-const unsigned short enwindow_int_const[512] = {
-0x0000,0x0035,0x01fd,0x066c,0x4948,0x066c,0x01fd,0x0035,0x0000,0x0037,0x01f4,0x05d2,0x493c,0x06f8,0x0204,0x0034,
-0x0000,0x0038,0x01e8,0x052a,0x491a,0x0776,0x0208,0x0032,0x0000,0x0038,0x01d9,0x0474,0x48e1,0x07e7,0x020a,0x0031,
-0x0000,0x0039,0x01c8,0x03b0,0x4892,0x084b,0x0209,0x0030,0x0000,0x0039,0x01b3,0x02de,0x482d,0x08a2,0x0207,0x002e,
-0x0000,0x0039,0x019b,0x01fd,0x47b2,0x08ed,0x0202,0x002c,0x0000,0x0039,0x0180,0x010f,0x4721,0x092b,0x01fc,0x002a,
-0x0000,0x0038,0x0161,0x0011,0x467a,0x095e,0x01f4,0x0028,0x0000,0x0037,0x0140,0xff07,0x45bf,0x0985,0x01eb,0x0026,
-0x0000,0x0036,0x011b,0xfdee,0x44f0,0x09a2,0x01e0,0x0025,0x0000,0x0034,0x00f3,0xfcc8,0x440c,0x09b4,0x01d4,0x0023,
-0x0000,0x0032,0x00c7,0xfb93,0x4315,0x09bb,0x01c6,0x0021,0x0000,0x002f,0x0097,0xfa53,0x420b,0x09ba,0x01b8,0x001f,
-0x0000,0x002c,0x0065,0xf905,0x40f0,0x09af,0x01a9,0x001d,0x0000,0x0029,0x002e,0xf7aa,0x3fc3,0x099b,0x0198,0x001c,
-0x0000,0x0025,0xfff6,0xf643,0x3e85,0x0980,0x0188,0x001a,0xffff,0x0020,0xffb9,0xf4d1,0x3d37,0x095c,0x0176,0x0018,
-0xffff,0x001b,0xff79,0xf354,0x3bda,0x0932,0x0165,0x0017,0xffff,0x0015,0xff36,0xf1cc,0x3a70,0x0901,0x0153,0x0015,
-0xffff,0x000e,0xfeef,0xf03a,0x38f7,0x08ca,0x0141,0x0014,0xffff,0x0007,0xfea6,0xee9f,0x3773,0x088d,0x012f,0x0012,
-0xfffe,0x0000,0xfe5a,0xecfb,0x35e3,0x084b,0x011c,0x0011,0xfffe,0xfff8,0xfe0b,0xeb50,0x3447,0x0804,0x010a,0x0010,
-0xfffe,0xffef,0xfdbb,0xe99d,0x32a3,0x07ba,0x00f8,0x000f,0xfffd,0xffe5,0xfd67,0xe7e4,0x30f6,0x076b,0x00e6,0x000d,
-0xfffd,0xffdb,0xfd12,0xe624,0x2f41,0x071a,0x00d4,0x000c,0xfffd,0xffd0,0xfcbb,0xe461,0x2d86,0x06c6,0x00c3,0x000b,
-0xfffc,0xffc4,0xfc63,0xe299,0x2bc5,0x066f,0x00b2,0x000a,0xfffc,0xffb8,0xfc09,0xe0ce,0x2a00,0x0617,0x00a1,0x0009,
-0xfffb,0xffaa,0xfbaf,0xdf01,0x2836,0x05be,0x0091,0x0009,0xfffb,0xff9d,0xfb54,0xdd33,0x266a,0x0563,0x0081,0x0008,
-0xfffa,0xff8e,0xfaf9,0xdb65,0x249c,0x0508,0x0073,0x0007,0xfff9,0xff80,0xfa9e,0xd997,0x22ce,0x04ad,0x0064,0x0006,
-0xfff8,0xff70,0xfa43,0xd7cb,0x2100,0x0452,0x0057,0x0006,0xfff8,0xff60,0xf9ea,0xd601,0x1f33,0x03f8,0x0049,0x0005,
-0xfff7,0xff4f,0xf992,0xd43c,0x1d68,0x039e,0x003d,0x0005,0xfff6,0xff3e,0xf93b,0xd27b,0x1ba0,0x0346,0x0031,0x0004,
-0xfff5,0xff2d,0xf8e7,0xd0c0,0x19dd,0x02ef,0x0026,0x0004,0xfff4,0xff1b,0xf896,0xcf0b,0x181d,0x029a,0x001c,0x0004,
-0xfff2,0xff09,0xf847,0xcd5e,0x1664,0x0246,0x0012,0x0003,0xfff1,0xfef7,0xf7fd,0xcbba,0x14b1,0x01f6,0x0009,0x0003,
-0xfff0,0xfee5,0xf7b6,0xca1e,0x1306,0x01a7,0x0001,0x0003,0xffef,0xfed2,0xf774,0xc88e,0x1162,0x015b,0xfffa,0x0002,
-0xffed,0xfec0,0xf737,0xc70a,0x0fc7,0x0112,0xfff3,0x0002,0xffec,0xfeae,0xf700,0xc591,0x0e35,0x00cb,0xffec,0x0002,
-0xffea,0xfe9c,0xf6cf,0xc427,0x0cad,0x0088,0xffe6,0x0002,0xffe9,0xfe8b,0xf6a5,0xc2ca,0x0b30,0x0048,0xffe1,0x0002,
-0xffe7,0xfe79,0xf681,0xc17c,0x09be,0x000b,0xffdc,0x0001,0xffe5,0xfe69,0xf666,0xc03e,0x0857,0xffd3,0xffd8,0x0001,
-0xffe4,0xfe58,0xf652,0xbf11,0x06fc,0xff9c,0xffd5,0x0001,0xffe2,0xfe49,0xf647,0xbdf6,0x05ae,0xff6a,0xffd2,0x0001,
-0xffe0,0xfe3b,0xf646,0xbcec,0x046e,0xff3a,0xffcf,0x0001,0xffde,0xfe2d,0xf64d,0xbbf5,0x0339,0xff0e,0xffcd,0x0001,
-0xffdc,0xfe21,0xf65f,0xbb11,0x0213,0xfee6,0xffcb,0x0001,0xffdb,0xfe16,0xf67c,0xba42,0x00fa,0xfec1,0xffca,0x0001,
-0xffd9,0xfe0d,0xf6a3,0xb987,0xfff0,0xfea0,0xffc9,0x0001,0xffd7,0xfe05,0xf6d6,0xb8e0,0xfef2,0xfe81,0xffc8,0x0001,
-0xffd5,0xfdff,0xf714,0xb84f,0xfe04,0xfe66,0xffc8,0x0000,0xffd3,0xfdfa,0xf75f,0xb7d4,0xfd23,0xfe4e,0xffc8,0x0000,
-0xffd1,0xfdf8,0xf7b6,0xb76f,0xfc51,0xfe39,0xffc8,0x0000,0xffd0,0xfdf7,0xf81a,0xb720,0xfb8d,0xfe28,0xffc9,0x0000,
-0xffcf,0xfdf9,0xf88b,0xb6e7,0xfad7,0xfe19,0xffc9,0x0000,0xffcd,0xfdfd,0xf909,0xb6c5,0xfa2f,0xfe0d,0xffca,0x0000,
+
+static const short int2idx_const[4096] = /* int2idx[i] = sqrt(i*sqrt(i)); */
+{
+ 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9,
+ 9, 10, 10, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16,
+ 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21,
+ 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26,
+ 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31,
+ 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36,
+ 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 40,
+ 41, 41, 41, 41, 42, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 44, 45, 45,
+ 45, 45, 45, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49,
+ 49, 49, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 52, 52, 52, 52, 52, 53, 53, 53,
+ 53, 53, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 56, 56, 56, 56, 56, 57, 57, 57,
+ 57, 57, 58, 58, 58, 58, 58, 58, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 61, 61,
+ 61, 61, 61, 62, 62, 62, 62, 62, 62, 63, 63, 63, 63, 63, 64, 64, 64, 64, 64, 65,
+ 65, 65, 65, 65, 65, 66, 66, 66, 66, 66, 67, 67, 67, 67, 67, 68, 68, 68, 68, 68,
+ 68, 69, 69, 69, 69, 69, 70, 70, 70, 70, 70, 70, 71, 71, 71, 71, 71, 72, 72, 72,
+ 72, 72, 72, 73, 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75,
+ 76, 76, 76, 76, 76, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 78, 78, 79, 79, 79,
+ 79, 79, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 82, 82, 82, 82, 82, 82,
+ 83, 83, 83, 83, 83, 84, 84, 84, 84, 84, 84, 85, 85, 85, 85, 85, 85, 86, 86, 86,
+ 86, 86, 86, 87, 87, 87, 87, 87, 87, 88, 88, 88, 88, 88, 88, 89, 89, 89, 89, 89,
+ 89, 90, 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, 92, 92, 92, 92, 92, 92, 93,
+ 93, 93, 93, 93, 93, 94, 94, 94, 94, 94, 94, 95, 95, 95, 95, 95, 95, 96, 96, 96,
+ 96, 96, 96, 97, 97, 97, 97, 97, 97, 98, 98, 98, 98, 98, 98, 99, 99, 99, 99, 99,
+ 99, 99,100,100,100,100,100,100,101,101,101,101,101,101,102,102,102,102,102,102,
+103,103,103,103,103,103,104,104,104,104,104,104,104,105,105,105,105,105,105,106,
+106,106,106,106,106,107,107,107,107,107,107,107,108,108,108,108,108,108,109,109,
+109,109,109,109,110,110,110,110,110,110,110,111,111,111,111,111,111,112,112,112,
+112,112,112,112,113,113,113,113,113,113,114,114,114,114,114,114,115,115,115,115,
+115,115,115,116,116,116,116,116,116,117,117,117,117,117,117,117,118,118,118,118,
+118,118,118,119,119,119,119,119,119,120,120,120,120,120,120,120,121,121,121,121,
+121,121,122,122,122,122,122,122,122,123,123,123,123,123,123,123,124,124,124,124,
+124,124,125,125,125,125,125,125,125,126,126,126,126,126,126,126,127,127,127,127,
+127,127,128,128,128,128,128,128,128,129,129,129,129,129,129,129,130,130,130,130,
+130,130,131,131,131,131,131,131,131,132,132,132,132,132,132,132,133,133,133,133,
+133,133,133,134,134,134,134,134,134,134,135,135,135,135,135,135,136,136,136,136,
+136,136,136,137,137,137,137,137,137,137,138,138,138,138,138,138,138,139,139,139,
+139,139,139,139,140,140,140,140,140,140,140,141,141,141,141,141,141,141,142,142,
+142,142,142,142,142,143,143,143,143,143,143,143,144,144,144,144,144,144,144,145,
+145,145,145,145,145,145,146,146,146,146,146,146,146,147,147,147,147,147,147,147,
+148,148,148,148,148,148,148,149,149,149,149,149,149,149,150,150,150,150,150,150,
+150,151,151,151,151,151,151,151,152,152,152,152,152,152,152,153,153,153,153,153,
+153,153,154,154,154,154,154,154,154,154,155,155,155,155,155,155,155,156,156,156,
+156,156,156,156,157,157,157,157,157,157,157,158,158,158,158,158,158,158,159,159,
+159,159,159,159,159,160,160,160,160,160,160,160,160,161,161,161,161,161,161,161,
+162,162,162,162,162,162,162,163,163,163,163,163,163,163,163,164,164,164,164,164,
+164,164,165,165,165,165,165,165,165,166,166,166,166,166,166,166,167,167,167,167,
+167,167,167,167,168,168,168,168,168,168,168,169,169,169,169,169,169,169,169,170,
+170,170,170,170,170,170,171,171,171,171,171,171,171,172,172,172,172,172,172,172,
+172,173,173,173,173,173,173,173,174,174,174,174,174,174,174,174,175,175,175,175,
+175,175,175,176,176,176,176,176,176,176,176,177,177,177,177,177,177,177,178,178,
+178,178,178,178,178,178,179,179,179,179,179,179,179,180,180,180,180,180,180,180,
+180,181,181,181,181,181,181,181,182,182,182,182,182,182,182,182,183,183,183,183,
+183,183,183,184,184,184,184,184,184,184,184,185,185,185,185,185,185,185,186,186,
+186,186,186,186,186,186,187,187,187,187,187,187,187,187,188,188,188,188,188,188,
+188,189,189,189,189,189,189,189,189,190,190,190,190,190,190,190,190,191,191,191,
+191,191,191,191,192,192,192,192,192,192,192,192,193,193,193,193,193,193,193,193,
+194,194,194,194,194,194,194,195,195,195,195,195,195,195,195,196,196,196,196,196,
+196,196,196,197,197,197,197,197,197,197,197,198,198,198,198,198,198,198,199,199,
+199,199,199,199,199,199,200,200,200,200,200,200,200,200,201,201,201,201,201,201,
+201,201,202,202,202,202,202,202,202,202,203,203,203,203,203,203,203,204,204,204,
+204,204,204,204,204,205,205,205,205,205,205,205,205,206,206,206,206,206,206,206,
+206,207,207,207,207,207,207,207,207,208,208,208,208,208,208,208,208,209,209,209,
+209,209,209,209,209,210,210,210,210,210,210,210,210,211,211,211,211,211,211,211,
+211,212,212,212,212,212,212,212,212,213,213,213,213,213,213,213,213,214,214,214,
+214,214,214,214,214,215,215,215,215,215,215,215,215,216,216,216,216,216,216,216,
+216,217,217,217,217,217,217,217,217,218,218,218,218,218,218,218,218,219,219,219,
+219,219,219,219,219,220,220,220,220,220,220,220,220,221,221,221,221,221,221,221,
+221,222,222,222,222,222,222,222,222,223,223,223,223,223,223,223,223,224,224,224,
+224,224,224,224,224,225,225,225,225,225,225,225,225,226,226,226,226,226,226,226,
+226,227,227,227,227,227,227,227,227,228,228,228,228,228,228,228,228,229,229,229,
+229,229,229,229,229,229,230,230,230,230,230,230,230,230,231,231,231,231,231,231,
+231,231,232,232,232,232,232,232,232,232,233,233,233,233,233,233,233,233,234,234,
+234,234,234,234,234,234,234,235,235,235,235,235,235,235,235,236,236,236,236,236,
+236,236,236,237,237,237,237,237,237,237,237,238,238,238,238,238,238,238,238,238,
+239,239,239,239,239,239,239,239,240,240,240,240,240,240,240,240,241,241,241,241,
+241,241,241,241,242,242,242,242,242,242,242,242,242,243,243,243,243,243,243,243,
+243,244,244,244,244,244,244,244,244,245,245,245,245,245,245,245,245,245,246,246,
+246,246,246,246,246,246,247,247,247,247,247,247,247,247,248,248,248,248,248,248,
+248,248,248,249,249,249,249,249,249,249,249,250,250,250,250,250,250,250,250,250,
+251,251,251,251,251,251,251,251,252,252,252,252,252,252,252,252,253,253,253,253,
+253,253,253,253,253,254,254,254,254,254,254,254,254,255,255,255,255,255,255,255,
+255,255,256,256,256,256,256,256,256,256,257,257,257,257,257,257,257,257,257,258,
+258,258,258,258,258,258,258,259,259,259,259,259,259,259,259,259,260,260,260,260,
+260,260,260,260,261,261,261,261,261,261,261,261,261,262,262,262,262,262,262,262,
+262,263,263,263,263,263,263,263,263,263,264,264,264,264,264,264,264,264,265,265,
+265,265,265,265,265,265,265,266,266,266,266,266,266,266,266,267,267,267,267,267,
+267,267,267,267,268,268,268,268,268,268,268,268,268,269,269,269,269,269,269,269,
+269,270,270,270,270,270,270,270,270,270,271,271,271,271,271,271,271,271,271,272,
+272,272,272,272,272,272,272,273,273,273,273,273,273,273,273,273,274,274,274,274,
+274,274,274,274,275,275,275,275,275,275,275,275,275,276,276,276,276,276,276,276,
+276,276,277,277,277,277,277,277,277,277,277,278,278,278,278,278,278,278,278,279,
+279,279,279,279,279,279,279,279,280,280,280,280,280,280,280,280,280,281,281,281,
+281,281,281,281,281,282,282,282,282,282,282,282,282,282,283,283,283,283,283,283,
+283,283,283,284,284,284,284,284,284,284,284,284,285,285,285,285,285,285,285,285,
+286,286,286,286,286,286,286,286,286,287,287,287,287,287,287,287,287,287,288,288,
+288,288,288,288,288,288,288,289,289,289,289,289,289,289,289,289,290,290,290,290,
+290,290,290,290,291,291,291,291,291,291,291,291,291,292,292,292,292,292,292,292,
+292,292,293,293,293,293,293,293,293,293,293,294,294,294,294,294,294,294,294,294,
+295,295,295,295,295,295,295,295,295,296,296,296,296,296,296,296,296,296,297,297,
+297,297,297,297,297,297,297,298,298,298,298,298,298,298,298,299,299,299,299,299,
+299,299,299,299,300,300,300,300,300,300,300,300,300,301,301,301,301,301,301,301,
+301,301,302,302,302,302,302,302,302,302,302,303,303,303,303,303,303,303,303,303,
+304,304,304,304,304,304,304,304,304,305,305,305,305,305,305,305,305,305,306,306,
+306,306,306,306,306,306,306,307,307,307,307,307,307,307,307,307,308,308,308,308,
+308,308,308,308,308,309,309,309,309,309,309,309,309,309,310,310,310,310,310,310,
+310,310,310,311,311,311,311,311,311,311,311,311,312,312,312,312,312,312,312,312,
+312,313,313,313,313,313,313,313,313,313,314,314,314,314,314,314,314,314,314,315,
+315,315,315,315,315,315,315,315,316,316,316,316,316,316,316,316,316,317,317,317,
+317,317,317,317,317,317,318,318,318,318,318,318,318,318,318,318,319,319,319,319,
+319,319,319,319,319,320,320,320,320,320,320,320,320,320,321,321,321,321,321,321,
+321,321,321,322,322,322,322,322,322,322,322,322,323,323,323,323,323,323,323,323,
+323,324,324,324,324,324,324,324,324,324,325,325,325,325,325,325,325,325,325,325,
+326,326,326,326,326,326,326,326,326,327,327,327,327,327,327,327,327,327,328,328,
+328,328,328,328,328,328,328,329,329,329,329,329,329,329,329,329,330,330,330,330,
+330,330,330,330,330,330,331,331,331,331,331,331,331,331,331,332,332,332,332,332,
+332,332,332,332,333,333,333,333,333,333,333,333,333,334,334,334,334,334,334,334,
+334,334,335,335,335,335,335,335,335,335,335,335,336,336,336,336,336,336,336,336,
+336,337,337,337,337,337,337,337,337,337,338,338,338,338,338,338,338,338,338,338,
+339,339,339,339,339,339,339,339,339,340,340,340,340,340,340,340,340,340,341,341,
+341,341,341,341,341,341,341,341,342,342,342,342,342,342,342,342,342,343,343,343,
+343,343,343,343,343,343,344,344,344,344,344,344,344,344,344,344,345,345,345,345,
+345,345,345,345,345,346,346,346,346,346,346,346,346,346,347,347,347,347,347,347,
+347,347,347,347,348,348,348,348,348,348,348,348,348,349,349,349,349,349,349,349,
+349,349,350,350,350,350,350,350,350,350,350,350,351,351,351,351,351,351,351,351,
+351,352,352,352,352,352,352,352,352,352,352,353,353,353,353,353,353,353,353,353,
+354,354,354,354,354,354,354,354,354,355,355,355,355,355,355,355,355,355,355,356,
+356,356,356,356,356,356,356,356,357,357,357,357,357,357,357,357,357,357,358,358,
+358,358,358,358,358,358,358,359,359,359,359,359,359,359,359,359,359,360,360,360,
+360,360,360,360,360,360,361,361,361,361,361,361,361,361,361,361,362,362,362,362,
+362,362,362,362,362,363,363,363,363,363,363,363,363,363,363,364,364,364,364,364,
+364,364,364,364,365,365,365,365,365,365,365,365,365,365,366,366,366,366,366,366,
+366,366,366,367,367,367,367,367,367,367,367,367,367,368,368,368,368,368,368,368,
+368,368,369,369,369,369,369,369,369,369,369,369,370,370,370,370,370,370,370,370,
+370,370,371,371,371,371,371,371,371,371,371,372,372,372,372,372,372,372,372,372,
+372,373,373,373,373,373,373,373,373,373,374,374,374,374,374,374,374,374,374,374,
+375,375,375,375,375,375,375,375,375,375,376,376,376,376,376,376,376,376,376,377,
+377,377,377,377,377,377,377,377,377,378,378,378,378,378,378,378,378,378,379,379,
+379,379,379,379,379,379,379,379,380,380,380,380,380,380,380,380,380,380,381,381,
+381,381,381,381,381,381,381,382,382,382,382,382,382,382,382,382,382,383,383,383,
+383,383,383,383,383,383,383,384,384,384,384,384,384,384,384,384,385,385,385,385,
+385,385,385,385,385,385,386,386,386,386,386,386,386,386,386,386,387,387,387,387,
+387,387,387,387,387,387,388,388,388,388,388,388,388,388,388,389,389,389,389,389,
+389,389,389,389,389,390,390,390,390,390,390,390,390,390,390,391,391,391,391,391,
+391,391,391,391,391,392,392,392,392,392,392,392,392,392,393,393,393,393,393,393,
+393,393,393,393,394,394,394,394,394,394,394,394,394,394,395,395,395,395,395,395,
+395,395,395,395,396,396,396,396,396,396,396,396,396,397,397,397,397,397,397,397,
+397,397,397,398,398,398,398,398,398,398,398,398,398,399,399,399,399,399,399,399,
+399,399,399,400,400,400,400,400,400,400,400,400,400,401,401,401,401,401,401,401,
+401,401,402,402,402,402,402,402,402,402,402,402,403,403,403,403,403,403,403,403,
+403,403,404,404,404,404,404,404,404,404,404,404,405,405,405,405,405,405,405,405,
+405,405,406,406,406,406,406,406,406,406,406,406,407,407,407,407,407,407,407,407,
+407,407,408,408,408,408,408,408,408,408,408,408,409,409,409,409,409,409,409,409,
+409,410,410,410,410,410,410,410,410,410,410,411,411,411,411,411,411,411,411,411,
+411,412,412,412,412,412,412,412,412,412,412,413,413,413,413,413,413,413,413,413,
+413,414,414,414,414,414,414,414,414,414,414,415,415,415,415,415,415,415,415,415,
+415,416,416,416,416,416,416,416,416,416,416,417,417,417,417,417,417,417,417,417,
+417,418,418,418,418,418,418,418,418,418,418,419,419,419,419,419,419,419,419,419,
+419,420,420,420,420,420,420,420,420,420,420,421,421,421,421,421,421,421,421,421,
+421,422,422,422,422,422,422,422,422,422,422,423,423,423,423,423,423,423,423,423,
+423,424,424,424,424,424,424,424,424,424,424,425,425,425,425,425,425,425,425,425,
+425,426,426,426,426,426,426,426,426,426,426,427,427,427,427,427,427,427,427,427,
+427,428,428,428,428,428,428,428,428,428,428,429,429,429,429,429,429,429,429,429,
+429,430,430,430,430,430,430,430,430,430,430,431,431,431,431,431,431,431,431,431,
+431,432,432,432,432,432,432,432,432,432,432,433,433,433,433,433,433,433,433,433,
+433,434,434,434,434,434,434,434,434,434,434,435,435,435,435,435,435,435,435,435,
+435,435,436,436,436,436,436,436,436,436,436,436,437,437,437,437,437,437,437,437,
+437,437,438,438,438,438,438,438,438,438,438,438,439,439,439,439,439,439,439,439,
+439,439,440,440,440,440,440,440,440,440,440,440,441,441,441,441,441,441,441,441,
+441,441,442,442,442,442,442,442,442,442,442,442,443,443,443,443,443,443,443,443,
+443,443,443,444,444,444,444,444,444,444,444,444,444,445,445,445,445,445,445,445,
+445,445,445,446,446,446,446,446,446,446,446,446,446,447,447,447,447,447,447,447,
+447,447,447,448,448,448,448,448,448,448,448,448,448,448,449,449,449,449,449,449,
+449,449,449,449,450,450,450,450,450,450,450,450,450,450,451,451,451,451,451,451,
+451,451,451,451,452,452,452,452,452,452,452,452,452,452,453,453,453,453,453,453,
+453,453,453,453,453,454,454,454,454,454,454,454,454,454,454,455,455,455,455,455,
+455,455,455,455,455,456,456,456,456,456,456,456,456,456,456,457,457,457,457,457,
+457,457,457,457,457,457,458,458,458,458,458,458,458,458,458,458,459,459,459,459,
+459,459,459,459,459,459,460,460,460,460,460,460,460,460,460,460,460,461,461,461,
+461,461,461,461,461,461,461,462,462,462,462,462,462,462,462,462,462,463,463,463,
+463,463,463,463,463,463,463,463,464,464,464,464,464,464,464,464,464,464,465,465,
+465,465,465,465,465,465,465,465,466,466,466,466,466,466,466,466,466,466,466,467,
+467,467,467,467,467,467,467,467,467,468,468,468,468,468,468,468,468,468,468,469,
+469,469,469,469,469,469,469,469,469,469,470,470,470,470,470,470,470,470,470,470,
+471,471,471,471,471,471,471,471,471,471,472,472,472,472,472,472,472,472,472,472,
+472,473,473,473,473,473,473,473,473,473,473,474,474,474,474,474,474,474,474,474,
+474,475,475,475,475,475,475,475,475,475,475,475,476,476,476,476,476,476,476,476,
+476,476,477,477,477,477,477,477,477,477,477,477,477,478,478,478,478,478,478,478,
+478,478,478,479,479,479,479,479,479,479,479,479,479,479,480,480,480,480,480,480,
+480,480,480,480,481,481,481,481,481,481,481,481,481,481,482,482,482,482,482,482,
+482,482,482,482,482,483,483,483,483,483,483,483,483,483,483,484,484,484,484,484,
+484,484,484,484,484,484,485,485,485,485,485,485,485,485,485,485,486,486,486,486,
+486,486,486,486,486,486,486,487,487,487,487,487,487,487,487,487,487,488,488,488,
+488,488,488,488,488,488,488,488,489,489,489,489,489,489,489,489,489,489,490,490,
+490,490,490,490,490,490,490,490,490,491,491,491,491,491,491,491,491,491,491,492,
+492,492,492,492,492,492,492,492,492,492,493,493,493,493,493,493,493,493,493,493,
+494,494,494,494,494,494,494,494,494,494,494,495,495,495,495,495,495,495,495,495,
+495,496,496,496,496,496,496,496,496,496,496,496,497,497,497,497,497,497,497,497,
+497,497,497,498,498,498,498,498,498,498,498,498,498,499,499,499,499,499,499,499,
+499,499,499,499,500,500,500,500,500,500,500,500,500,500,501,501,501,501,501,501,
+501,501,501,501,501,502,502,502,502,502,502,502,502,502,502,503,503,503,503,503,
+503,503,503,503,503,503,504,504,504,504,504,504,504,504,504,504,504,505,505,505,
+505,505,505,505,505,505,505,506,506,506,506,506,506,506,506,506,506,506,507,507,
+507,507,507,507,507,507,507,507,507,508,508,508,508,508,508,508,508,508,508,509,
+509,509,509,509,509,509,509,509,509,509,510,510,510,510,510,510,510,510,510,510,
+510,511,511,511,511,511,511,511,511,511,511,512,512,512,512,512 };
+
+static const int order[32] =
+{ 0, 1, 16, 17, 8, 9, 24, 25, 4, 5, 20, 21, 12, 13, 28, 29,
+ 2, 3, 18, 19,10,11, 26, 27, 6, 7, 22, 23, 14, 15, 30, 31 };
+
+static const int bitr_index[2][15] =
+{ {0, 8,16,24,32,40,48,56, 64, 80, 96,112,128,144,160},
+ {0,32,40,48,56,64,80,96,112,128,160,192,224,256,320} };
+
+static const int num_bands[3][15] =
+{ {0,10,10,10,10,12,14,16, 20, 22, 24, 26, 28, 30, 32},
+ {0,10,10,10,10,10,12,14, 18, 24, 26, 28, 30, 32, 32},
+ {0,10,12,14,18,24,26,28, 30, 32, 32, 32, 32, 32, 32} };
+
+static const int cx_const[9] =
+{ 16135, 10531, 5604, 15396, -2845,-12551, 14189, 8192, 16384 };
+
+static const int ca_const[8] =
+{-16859,-15458,-10269, -5961, -3099, -1342, -465, -121 };
+
+static const int cs_const[8] =
+{ 28098, 28893, 31117, 32221, 32621, 32740, 32765, 32768 };
+
+static const short enwindow_const[15*27+24] =
+{ 0, 65, 593, 1766, 22228, 2115, 611, 62,
+ 8, 119, 1419, 10564,-11659,-1635,-154, -9,
+ -8, -119,-1419,-10564, 11659, 1635, 154, 9, 464, 100, 91,
+ 0, 69, 604, 1635, 23148, 2363, 643, 62,
+ 7, 107, 1368, 10449,-12733,-1818,-180,-11,
+ -7, -107,-1368,-10449, 12733, 1818, 180, 11, 420, 200, 164,
+ 0, 72, 608, 1465, 23979, 2600, 671, 63,
+ 7, 94, 1305, 10265,-13818,-2004,-207,-12,
+ -7, -94,-1305,-10265, 13818, 2004, 207, 12, 380, 297, 220,
+ 0, 76, 606, 1256, 24718, 2825, 693, 63,
+ 6, 81, 1232, 10016,-14908,-2192,-236,-14,
+ -6, -81,-1232,-10016, 14908, 2192, 236, 14, 342, 392, 262,
+ 0, 78, 597, 1007, 25359, 3033, 712, 63,
+ 6, 68, 1150, 9706,-15995,-2380,-267,-15,
+ -6, -68,-1150, -9706, 15995, 2380, 267, 15, 307, 483, 289,
+ 0, 80, 580, 719, 25901, 3224, 726, 62,
+ 6, 54, 1060, 9343,-17072,-2565,-299,-17,
+ -6, -54,-1060, -9343, 17072, 2565, 299, 17, 274, 569, 304,
+ -1, 82, 555, 391, 26339, 3395, 735, 61,
+ 5, 40, 963, 8930,-18131,-2747,-332,-19,
+ -5, -40, -963, -8930, 18131, 2747, 332, 19, 242, 650, 307,
+ -1, 83, 523, 26, 26672, 3545, 740, 60,
+ 5, 27, 861, 8474,-19164,-2923,-366,-21,
+ -5, -27, -861, -8474, 19164, 2923, 366, 21, 212, 724, 300,
+ -1, 83, 482, -376, 26900, 3672, 739, 58,
+ 4, 14, 756, 7981,-20163,-3092,-401,-24,
+ -4, -14, -756, -7981, 20163, 3092, 401, 24, 183, 792, 283,
+ -1, 82, 433, -812, 27022, 3776, 735, 56,
+ 4, 1, 648, 7456,-21122,-3250,-435,-26,
+ -4, -1, -648, -7456, 21122, 3250, 435, 26, 155, 851, 258,
+ -1, 81, 376, -1281, 27038, 3855, 726, 54,
+ 3, -11, 539, 6907,-22032,-3397,-470,-28,
+ -3, 11, -539, -6907, 22032, 3397, 470, 28, 128, 903, 226,
+ -1, 78, 312, -1778, 26951, 3910, 713, 52,
+ 3, -22, 430, 6338,-22887,-3530,-503,-31,
+ -3, 22, -430, -6338, 22887, 3530, 503, 31, 102, 946, 188,
+ -2, 75, 239, -2302, 26761, 3941, 696, 49,
+ 3, -33, 322, 5757,-23678,-3648,-537,-34,
+ -3, 33, -322, -5757, 23678, 3648, 537, 34, 76, 980, 145,
+ -2, 70, 160, -2848, 26472, 3948, 676, 47,
+ 3, -42, 217, 5167,-24399,-3749,-568,-36,
+ -3, 42, -217, -5167, 24399, 3749, 568, 36, 50, 1004, 99,
+ -2, 65, 74, -3412, 26087, 3931, 653, 44,
+ 2, -51, 115, 4577,-25045,-3830,-599,-39,
+ -2, 51, -115, -4577, 25045, 3830, 599, 39, 25, 1019, 50,
+
+ 25610,3891,627,42,-3990,-18,58,-2,
+ 21226,-21226,10604,-10604,1860,-1860,1458,-1458,576,-576,130,-130,60,-60,8,-8
};
-const uint8 int2idx_const[4096] = {
- 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8,
- 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11,
- 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18,
- 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23,
- 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25,
- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29,
- 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 31,
- 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
- 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
- 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
- 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 38, 38, 38, 38, 38, 38, 38, 38,
- 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 40, 40, 40, 40,
- 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
- 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
- 43, 43, 43, 43, 43, 43, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 45, 45, 45, 45, 45, 45, 45, 45,
- 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 50, 50, 50, 50, 50, 50, 50,
- 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
- 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
- 53, 53, 53, 53, 53, 53, 53, 53, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 55, 55, 55, 55,
- 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
- 56, 56, 56, 56, 56, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 58, 58, 58, 58, 58, 58, 58,
- 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
- 59, 59, 59, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 61, 61, 61, 61, 61, 61, 61, 61,
- 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
- 62, 62, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 64, 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
- 65, 65, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 67, 67, 67, 67, 67, 67, 67, 67,
- 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 70, 70, 70, 70, 70, 70, 70,
- 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71,
- 71, 71, 71, 71, 71, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 73, 73, 73, 73, 73,
- 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
- 74, 74, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 76, 76,
- 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
- 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
- 78, 78, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
- 81, 81, 81, 81, 81, 81, 81, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 83,
- 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84,
- 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85,
- 85, 85, 85, 85, 85, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 87, 87, 87, 87,
- 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
- 89, 89, 89, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 91, 91, 91, 91, 91,
- 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
- 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93,
- 93, 93, 93, 93, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 95, 95, 95, 95,
- 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,
- 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,
- 97, 97, 97, 97, 97, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 99, 99,
- 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,100,100,100,100,100,100,100,100,100,100,
-100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,
-101,101,101,101,101,101,101,101,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
-102,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,104,104,104,104,104,104,
-104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,105,105,105,105,105,105,105,105,105,105,105,105,105,
-105,105,105,105,105,105,105,105,105,105,105,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,
-106,106,106,106,106,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,108,
-108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,109,109,109,109,109,109,109,109,
-109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,110,110,110,110,110,110,110,110,110,110,110,110,110,110,
-110,110,110,110,110,110,110,110,110,110,110,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,111,
-111,111,111,111,111,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,112,113,
-113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,114,114,114,114,114,114,114,114,
-114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,114,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
-115,115,115,115,115,115,115,115,115,115,115,115,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,
-116,116,116,116,116,116,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,
-118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,119,119,119,119,119,119,
-119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,120,120,120,120,120,120,120,120,120,120,120,
-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,121,
-121,121,121,121,121,121,121,121,121,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,
-122,122,122,122,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,124,124,
-124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,125,125,125,125,125,125,125,
-125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,126,126,126,126,126,126,126,126,126,126,126,126,
-126,126,126,126,126,126,126,126,126,126,126,126,126,126,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,
-127,127,127,127,127,127,127,127,127,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
-128,128,128,128,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,130,
-130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,131,131,131,131,131,131,
-131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,132,132,132,132,132,132,132,132,132,132,132,
-132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,
-133,133,133,133,133,133,133,133,133,133,133,133,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,
-134,134,134,134,134,134,134,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,
-135,135,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,137,137,
-137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,138,138,138,138,138,138,138,
-138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,139,139,139,139,139,139,139,139,139,139,139,
-139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,
-140,140,140,140,140,140,140,140,140,140,140,140,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,
-141,141,141,141,141,141,141,141,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,
-142,142,142,142,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,144,
-144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,144,145,145,145,145,145,
-145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,146,146,146,146,146,146,146,146,146,
-146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,147,147,147,147,147,147,147,147,147,147,147,147,
-147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,
-148,148,148,148,148,148,148,148,148,148,148,148,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,
-149,149,149,149,149,149,149,149,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,
-150,150,150,150,150,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,
-151,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,153,153,153,
-153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,154,154,154,154,154,154,
-154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,155,155,155,155,155,155,155,155,155,
-155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,156,156,156,156,156,156,156,156,156,156,156,156,156,
-156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,
-157,157,157,157,157,157,157,157,157,157,157,157,157,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,
-158,158,158,158,158,158,158,158,158,158,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,
-159,159,159,159,159,159,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,
-160,160,160,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,
-162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,163,163,163,
-163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,164,164,164,164,164,
-164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,165,165,165,165,165,165,165,165,
-165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,166,166,166,166,166,166,166,166,166,166,166,
-166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,167,167,167,167,167,167,167,167,167,167,167,167,167,167,
-167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,
-168,168,168,168,168,168,168,168,168,168,168,168,168,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,
-169,169,169,169,169,169,169,169,169,169,169,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,
-170,170,170,170,170,170,170,170,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,
-171,171,171,171,171,171,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,
-172,172,172,172,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
-173,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,175,
-175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,176,176,176,
-176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,177,177,177,177,177,
-177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,178,178,178,178,178,178,178,
-178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,179,179,179,179,179,179,179,179,179,
-179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,180,180,180,180,180,180,180,180,180,180,180,
-180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,181,181,181,181,181,181,181,181,181,181,181,181,181};
-
-short *x_int[2];
-short buffer[2*samp_per_frame];
-config_t config;
-PFILE mp3file;
-int mp3_hdl, file_hdl;
-int frames_processed;
-long wav_size;
-uint32 enc_buffer[16384]; /* storage for 64 CodedData buffers */
-int enc_chunk = 0; /* chunk (each 256Byte) counter */
+static const int win_const[18][4] = {
+ { -3072, -134, -146, 3352 },
+ { -2747, -362, -471, 3579 },
+ { -2387, -529, -831, 3747 },
+ { -2004, -632,-1214, 3850 },
+ { -1609, -666,-1609, 3884 },
+ { -1214, -632,-2004, 3850 },
+ { -831, -529,-2387, 3747 },
+ { -471, -362,-2747, 3579 },
+ { -146, -134,-3072, 3352 },
+ { 134,-3072,-3352, -146 },
+ { 362,-2747,-3579, -471 },
+ { 529,-2387,-3747, -831 },
+ { 632,-2004,-3850,-1214 },
+ { 666,-1609,-3884,-1609 },
+ { 632,-1214,-3850,-2004 },
+ { 529, -831,-3747,-2387 },
+ { 362, -471,-3579,-2747 },
+ { 134, -146,-3352,-3072 } };
+
+
+static char* wav_filename;
+static int mp3file, wavfile, wav_size, frames;
+static uint32 enc_buffer[16384]; /* storage for 65536 Bytes */
+static int enc_chunk = 0; /* encode chunk counter */
+static int enc_size;
+static config_t cfg;
/* forward declarations */
-void encodeSideInfo( side_info_t si[2][2] );
-void Huffmancodebits( enct8 *ix, int *xr, side_info_t *gi );
-int HuffmanCode(int table_select, enct8 *ix, int *xr);
-int HuffmanCount1(unsigned tbl, enct8 *ix, int *xr );
-int new_choose_table( enct8 ix[samp_per_frame2], unsigned int begin, unsigned int end );
+int HuffmanCode( short *ix, int *xr, uint32 begin, uint32 end, int table);
+int HuffmanCod1( short *ix, int *xr, uint32 begin, uint32 end, int table);
void putbits(uint32 val, uint32 nbit);
-int count_bit(enct8 ix[samp_per_frame2], unsigned int start, unsigned int end, unsigned int table );
-int bigv_bitcount(enct8 ix[samp_per_frame2], side_info_t *gi);
-void bigv_tab_select( enct8 ix[samp_per_frame2], side_info_t *cod_info );
-void subdivide(side_info_t *cod_info);
-void mdct_sub_int(int sb_sample[2][3][18][SBLIMIT], int (*mdct_freq)[2][samp_per_frame2]);
-void filter_subband(short *buffer, int s[SBLIMIT], int k);
-int read_samples(short *sample_buffer, int frame_size);
+int find_best_2( short *ix, uint32 start, uint32 end, const uint32 *table,
+ uint32 len, int *bits);
+int find_best_3( short *ix, uint32 start, uint32 end, const uint32 *table,
+ uint32 len, int *bits);
+int count_bit1 ( short *ix, uint32 start, uint32 end, int *bits );
+int count_bigv ( short *ix, uint32 start, uint32 end, int table0, int table1,
+ int *bits);
-bool checkString(int *file, char *string)
+bool checkString(int fd, char *string)
{
char temp[4];
- rb->read(*file, temp, 4);
+ rb->read(fd, temp, 4);
return (*(long*)temp == *(long*)string) ? 1 : 0;
}
-int Read16BitsLowHigh(PFILE fp)
+int Read16BitsLowHigh(int fd)
{
- char first, second;
+ char first, second;
- rb->read(*fp, &first, 1);
- rb->read(*fp, &second, 1);
+ rb->read(fd, &first, 1);
+ rb->read(fd, &second, 1);
return ((int)second << 8) | (first & 0xff);
}
-int Read32BitsLowHigh(PFILE fp)
+int Read32BitsLowHigh(int fd)
{
- int first, second, result;
-
- first = 0xffff & Read16BitsLowHigh(fp);
- second = 0xffff & Read16BitsLowHigh(fp);
- result = (second << 16) + first;
-
- return result;
-}
+ int first = 0xffff & Read16BitsLowHigh(fd);
+ int second = 0xffff & Read16BitsLowHigh(fd);
-void wave_close(void)
-{
- rb->close(*config.wave.file);
-}
-
-PFILE fread_open(char *filename)
-{
- file_hdl = rb->open(filename, O_RDONLY);
- return file_hdl < 0 ? NULL : &file_hdl;
+ return (second << 16) + first;
}
int wave_open(void)
{
- unsigned short wFormatTag;
- unsigned long dAvgBytesPerSec;
- unsigned short wBlockAlign;
- long header_size;
-
- if((config.wave.file = fread_open(config.infile)) == NULL)
- return -1;
-
- if(!checkString(config.wave.file,"RIFF")) return -2;
- Read32BitsLowHigh(config.wave.file); /* complete wave chunk size */
- if(!checkString(config.wave.file,"WAVE")) return -3;
- if(!checkString(config.wave.file,"fmt ")) return -4;
-
- header_size = Read32BitsLowHigh(config.wave.file); /* chunk size */
- wFormatTag = Read16BitsLowHigh(config.wave.file);
-
- config.wave.channels = Read16BitsLowHigh(config.wave.file);
- config.wave.samplerate = Read32BitsLowHigh(config.wave.file);
- dAvgBytesPerSec = Read32BitsLowHigh(config.wave.file);
- wBlockAlign = Read16BitsLowHigh(config.wave.file);
- config.wave.bits = Read16BitsLowHigh(config.wave.file);
-
- if(wFormatTag != 0x0001) return -5;
- if(config.wave.bits != 16) return -6;
- if(config.wave.channels > 2) return -7;
- if(!checkString(config.wave.file,"data")) return -8;
+ unsigned short wFormatTag;
+ unsigned long dAvgBytesPerSec;
+ unsigned short wBlockAlign;
+ unsigned short bits_per_samp;
+ long header_size;
- header_size = 0x28;
- wav_size = rb->filesize(*config.wave.file);
- rb->lseek(*config.wave.file, header_size, SEEK_SET);
-
- config.wave.total_samples = (wav_size-header_size) / (2*config.wave.channels);
- config.wave.length = config.wave.total_samples / config.wave.samplerate;
-
- return 0;
+ if((wavfile = rb->open(wav_filename, O_RDONLY)) < 0)
+ return -1;
+
+ if(!checkString(wavfile,"RIFF")) return -2;
+ Read32BitsLowHigh(wavfile); /* complete wave chunk size */
+ if(!checkString(wavfile,"WAVE")) return -3;
+ if(!checkString(wavfile,"fmt ")) return -4;
+
+ header_size = Read32BitsLowHigh(wavfile); /* chunk size */
+ wFormatTag = Read16BitsLowHigh(wavfile);
+
+ cfg.channels = Read16BitsLowHigh(wavfile);
+ cfg.samplerate = Read32BitsLowHigh(wavfile);
+ dAvgBytesPerSec = Read32BitsLowHigh(wavfile);
+ wBlockAlign = Read16BitsLowHigh(wavfile);
+ bits_per_samp = Read16BitsLowHigh(wavfile);
+
+ if(wFormatTag != 0x0001) return -5;
+ if(bits_per_samp != 16) return -6;
+ if(cfg.channels > 2) return -7;
+ if(!checkString(wavfile,"data")) return -8;
+
+ header_size = 0x28;
+ wav_size = rb->filesize(wavfile);
+ rb->lseek(wavfile, header_size, SEEK_SET);
+
+ return 0;
}
-int read_samples(short *sample_buffer, int frame_size)
+int read_samples(uint32 *buffer, int num_samples)
{
- int samples = rb->read(*config.wave.file, sample_buffer, sizeof(short) * frame_size) / sizeof(short);
- /* Pad last sample with zeros */
- if((samples < frame_size) && (samples > 0))
- while(samples < frame_size)
- sample_buffer[samples++] = 0;
+ int s, samples = rb->read(wavfile, buffer, 4 * num_samples) / 4;
+ /* Pad last sample with zeros */
+ for(s=samples; s<num_samples; s++)
+ buffer[s] = 0;
- return samples;
+ return samples;
}
inline uint32 myswap32(uint32 val)
{
- const uint8* src = (const uint8*)&val;
-
- return (uint32)src[3] | ((uint32)src[2] << 8) | ((uint32)src[1] << 16) | ((uint32)src[0] << 24);
-}
-
-void putbits(uint32 val, uint32 nbit)
-{
- int new_bitpos = CodedData.bitpos + nbit;
- int i, ptrpos = CodedData.bitpos >> 5;
-
- val = val & (0xffffffff >> (32 - nbit));
-
- /* data fit in one uint32 */
- if(((new_bitpos - 1) >> 5) == ptrpos)
- CodedData.bbuf[ptrpos] |= val << ((32 - new_bitpos) & 31);
- else
- {
- CodedData.bbuf[ptrpos ] |= val >> ((new_bitpos - 32) & 31);
- CodedData.bbuf[ptrpos+1] |= val << ((32 - new_bitpos) & 31);
- }
-
- CodedData.bitpos = new_bitpos;
-
- /* copy iram mp3 buffer to sdram/file */
- if(new_bitpos >= 256 * 32)
- {
- if(config.byte_order != order_bigEndian)
- for(i=0; i<256; i++)
- CodedData.bbuf[i] = myswap32(CodedData.bbuf[i]);
-
- if(enc_chunk >= 64) /* sdram encoder buffer full? */
- {
- rb->write(*mp3file, enc_buffer, 16384*sizeof(uint32));
- enc_chunk = 0;
- }
-
- /* copy iram buffer to sdram */
- memcpy(enc_buffer + enc_chunk*256, CodedData.bbuf, 256*sizeof(uint32));
- enc_chunk++;
-
- CodedData.bbuf[0] = CodedData.bbuf[256];
- memset(CodedData.bbuf+1, 0, 256*sizeof(uint32));
- CodedData.bitpos &=31;
- }
-}
-
-/* open the device to write the bit stream into it */
-void open_bitstream(char *bs_filenam) /* name of the bit stream file */
-{
- mp3file = (mp3_hdl=rb->open(bs_filenam, O_WRONLY|O_CREAT|O_TRUNC)) < 0 ? NULL : &mp3_hdl;
-}
-
-/* This is called after a frame of audio has been quantized and coded.
- It will write the encoded audio to the bitstream. Note that from a
- layer3 encoder's perspective the bit stream is primarily a series
- of main_data() blocks, with header and side information inserted at
- the proper locations to maintain framing. See Figure A.7 in the IS */
-void format_bitstream( enct8 enc[2][2][samp_per_frame2], side_info_t side[2][2], int (*xr)[2][samp_per_frame2] )
-{
- int gr, ch;
+ const uint8* v = (const uint8*)&val;
- encodeSideInfo( side );
-
- for(gr=0; gr<2; gr++)
- for(ch=0; ch<config.wave.channels; ch++)
- Huffmancodebits( &enc[gr][ch][0], &xr[gr][ch][0], &side[gr][ch] );
+ return ((uint32)v[0]<<24) | ((uint32)v[1]<<16) | ((uint32)v[2]<<8) | v[3];
}
void encodeSideInfo( side_info_t si[2][2] )
{
int gr, ch, header;
+ uint32 cc=0, sz=0;
header = 0xfff00000;
- header |= config.mpeg.type << 19;
- header |= 1 /*config.mpeg.layr*/ << 17;
- header |= !config.mpeg.crc << 16;
- header |= config.mpeg.bitrate_index << 12;
- header |= config.mpeg.samplerate_index << 10;
- header |= config.mpeg.padding << 9;
- header |= config.mpeg.ext << 8;
- header |= config.mpeg.mode << 6;
- header |= config.mpeg.mode_ext << 4;
- header |= config.mpeg.copyright << 3;
- header |= config.mpeg.original << 2;
- header |= config.mpeg.emph << 0;
-
+ header |= cfg.mpg.type << 19; /* mp3 type: 1 */
+ header |= 1 << 17; /* mp3 layer: 1 */
+ header |= 1 << 16; /* mp3 crc: 0 */
+ header |= cfg.mpg.bitr_id << 12;
+ header |= cfg.mpg.smpl_id << 10;
+ header |= cfg.mpg.padding << 9;
+ header |= cfg.mpg.mode << 6;
+ header |= 1 << 2; /* mp3 original: 1 */
putbits( header, 32 );
- putbits( 0, config.wave.channels == 2 ? 20 : 18 );
- for(gr=0; gr<2; gr++)
- for(ch=0; ch<config.wave.channels; ch++)
+ if(cfg.mpg.type)
+ { /* MPEG1 */
+ if(cfg.channels == 2) { putlong( 0, 20); }
+ else { putlong( 0, 18); }
+
+ for(gr=0; gr<cfg.granules; gr++)
+ for(ch=0; ch<cfg.channels; ch++)
+ {
+ side_info_t *gi = &si[gr][ch];
+
+ putlong( gi->part2_3_length, 12 );
+ putlong( gi->address3>>1, 9 );
+ putlong( gi->global_gain, 8 );
+ putlong( gi->table_select[0], 10 );
+ putlong( gi->table_select[1], 5 );
+ putlong( gi->table_select[2], 5 );
+ putlong( gi->region_0_1, 7 );
+ putlong( gi->table_select[3], 3 );
+ }
+ }
+ else
+ { /* MPEG2 */
+ if(cfg.channels == 2) { putlong( 0, 10); }
+ else { putlong( 0, 9); }
+
+ for(ch=0; ch<cfg.channels; ch++)
{
- side_info_t *gi = &si[gr][ch];
-
- putbits( gi->part2_3_length, 12 );
- putbits( gi->big_values, 9 );
- putbits( gi->global_gain, 8 );
- putbits( gi->table_select[0], 10 );
- putbits( gi->table_select[1], 5 );
- putbits( gi->table_select[2], 5 );
- putbits( gi->region0_count, 4 );
- putbits( gi->region1_count, 3 );
- putbits( gi->table_select[3], 3 );
+ side_info_t *gi = &si[0][ch];
+
+ putlong( gi->part2_3_length, 12);
+ putlong( gi->address3>>1, 9);
+ putlong( gi->global_gain, 8);
+ putlong( gi->table_select[0], 15);
+ putlong( gi->table_select[1], 5);
+ putlong( gi->table_select[2], 5);
+ putlong( gi->region_0_1, 7);
+ putlong( gi->table_select[3], 2);
}
+ }
+ /* flush remaining bits */
+ putbits(cc, sz);
}
/* Note the discussion of huffmancodebits() on pages 28 and 29 of the IS,
as well as the definitions of the side information on pages 26 and 27. */
-void Huffmancodebits( enct8 *ix, int *xr, side_info_t *gi )
+void Huffmancodebits( short *ix, int *xr, side_info_t *gi )
{
- int region1Start;
- int region2Start;
- int i, bigvalues, count1End;
- int stuffingBits;
- int bitsWritten = 0;
- unsigned scalefac_index;
-
- /* 1: Write the bigvalues */
- bigvalues = gi->big_values << 1;
- scalefac_index = gi->region0_count + 1;
- region1Start = scalefac_long[ scalefac_index ];
- scalefac_index += gi->region1_count + 1;
- region2Start = scalefac_long[ scalefac_index ];
-
- for(i=0; i<region1Start; i+=2)
- bitsWritten += HuffmanCode(gi->table_select[0], ix+i, xr+i);
-
- for( ; i<region2Start; i+=2)
- bitsWritten += HuffmanCode(gi->table_select[1], ix+i, xr+i);
-
- for( ; i<bigvalues; i+=2)
- bitsWritten += HuffmanCode(gi->table_select[2], ix+i, xr+i);
-
- /* 2: Write count1 area */
- count1End = bigvalues + (gi->count1 << 2);
- for(i=bigvalues; i<count1End; i+=4)
- bitsWritten += HuffmanCount1(gi->table_select[3], ix+i, xr+i);
-
- if((stuffingBits = gi->part2_3_length - bitsWritten) != 0)
+ int region1 = gi->address1;
+ int region2 = gi->address2;
+ int bigvals = gi->address3;
+ int count1 = bigvals + (gi->count1 << 2);
+ int stuffBits = 0;
+ int bits = 0;
+
+ if(region1 > 0)
+ bits += HuffmanCode(ix, xr, 0 , region1, gi->table_select[0]);
+
+ if(region2 > region1)
+ bits += HuffmanCode(ix, xr, region1, region2, gi->table_select[1]);
+
+ if(bigvals > region2)
+ bits += HuffmanCode(ix, xr, region2, bigvals, gi->table_select[2]);
+
+ if(count1 > bigvals)
+ bits += HuffmanCod1(ix, xr, bigvals, count1, gi->table_select[3]);
+
+ if((stuffBits = gi->part2_3_length - bits) > 0)
{
- int stuffingWords = stuffingBits / 32;
- int remainingBits = stuffingBits % 32;
-
- if( remainingBits )
- putbits( ~0, remainingBits );
+ int stuffWords = stuffBits >> 5;
+ int remainBits = stuffBits & 31;
- /* Due to the nature of the Huffman code tables, we will pad with ones */
- while( stuffingWords-- )
- putbits( ~0, 32 );
+ if( remainBits )
+ putbits( ~0, remainBits );
- bitsWritten += stuffingBits;
+ while( stuffWords-- )
+ putbits( ~0, 32 ); /* Huffman code tables leed to padding ones */
}
}
-int HuffmanCount1(unsigned tbl, enct8 *ix, int *xr)
+int HuffmanCod1( short *ix, int *xr, uint32 begin, uint32 end, int tbl)
{
- uint32 dat, p, s;
- int len, v, w, x, y;
- #define signv (xr[0] < 0 ? 1 : 0)
- #define signw (xr[1] < 0 ? 1 : 0)
- #define signx (xr[2] < 0 ? 1 : 0)
- #define signy (xr[3] < 0 ? 1 : 0)
-
- v = ix[0];
- w = ix[1];
- x = ix[2];
- y = ix[3];
- p = v + (w << 1) + (x << 2) + (y << 3);
-
- switch(p)
+ uint32 cc=0, sz=0;
+ uint32 i, d, p;
+ int sumbit=0, s=0, l=0, v, w, x, y;
+ #define sgnv (xr[i+0] < 0 ? 1 : 0)
+ #define sgnw (xr[i+1] < 0 ? 1 : 0)
+ #define sgnx (xr[i+2] < 0 ? 1 : 0)
+ #define sgny (xr[i+3] < 0 ? 1 : 0)
+
+ for(i=begin; i<end; i+=4)
{
- default: len = 0; s = 0; break;
- case 1: len = 1; s = signv; break;
- case 2: len = 1; s = signw; break;
- case 3: len = 2; s = (signv << 1) + signw; break;
- case 4: len = 1; s = signx; break;
- case 5: len = 2; s = (signv << 1) + signx; break;
- case 6: len = 2; s = (signw << 1) + signx; break;
- case 7: len = 3; s = (signv << 2) + (signw << 1) + signx; break;
- case 8: len = 1; s = signy; break;
- case 9: len = 2; s = (signv << 1) + signy; break;
- case 10: len = 2; s = (signw << 1) + signy; break;
- case 11: len = 3; s = (signv << 2) + (signw << 1) + signy; break;
- case 12: len = 2; s = (signx << 1) + signy; break;
- case 13: len = 3; s = (signv << 2) + (signx << 1) + signy; break;
- case 14: len = 3; s = (signw << 2) + (signx << 1) + signy; break;
- case 15: len = 4; s = (signv << 3) + (signw << 2) + (signx << 1) + signy; break;
+ v = ix[i+0];
+ w = ix[i+1];
+ x = ix[i+2];
+ y = ix[i+3];
+ p = (v << 3) + (w << 2) + (x << 1) + y;
+
+ switch(p)
+ {
+ case 0: l=0; s = 0; break;
+ case 1: l=1; s = sgnv; break;
+ case 2: l=1; s = sgnw; break;
+ case 3: l=2; s = (sgnv << 1) + sgnw; break;
+ case 4: l=1; s = sgnx; break;
+ case 5: l=2; s = (sgnv << 1) + sgnx; break;
+ case 6: l=2; s = (sgnw << 1) + sgnx; break;
+ case 7: l=3; s = (sgnv << 2) + (sgnw << 1) + sgnx; break;
+ case 8: l=1; s = sgny; break;
+ case 9: l=2; s = (sgnv << 1) + sgny; break;
+ case 10: l=2; s = (sgnw << 1) + sgny; break;
+ case 11: l=3; s = (sgnv << 2) + (sgnw << 1) + sgny; break;
+ case 12: l=2; s = (sgnx << 1) + sgny; break;
+ case 13: l=3; s = (sgnv << 2) + (sgnx << 1) + sgny; break;
+ case 14: l=3; s = (sgnw << 2) + (sgnx << 1) + sgny; break;
+ case 15: l=4; s = (sgnv << 3) + (sgnw << 2) + (sgnx << 1) + sgny; break;
+ }
+
+ d = (ht_count[tbl][0][p] << l) + s;
+ l = ht_count[tbl][1][p];
+ putlong( d, l );
+ sumbit += l;
}
- dat = (ht_count1[tbl][0][p] << len) + s;
- len = ht_count1[tbl][1][p];
- putbits( dat, len );
+ /* flush remaining bits */
+ putbits(cc, sz);
- return len;
+ return sumbit;
}
/* Implements the pseudocode of page 98 of the IS */
-int HuffmanCode(int table_select, enct8 *ix, int *xr)
+int HuffmanCode( short *ix, int *xr, uint32 begin, uint32 end, int table)
{
- unsigned linbitsx, linbitsy, linbits, idx;
- const struct huffcodetab *h;
- int x, y, bit;
- uint32 code;
- #define sign_x (xr[0] < 0 ? 1 : 0)
- #define sign_y (xr[1] < 0 ? 1 : 0)
-
- if(table_select == 0)
- return 0;
+ uint32 cc=0, sz=0, code;
+ uint32 i, xl=0, yl=0, idx;
+ int x, y, bit, sumbit=0;
+ #define sign_x (xr[i+0] < 0 ? 1 : 0)
+ #define sign_y (xr[i+1] < 0 ? 1 : 0)
- x = ix[0];
- y = ix[1];
- h = &ht[table_select];
- linbits = h->linbits;
- linbitsx = linbitsy = 0;
+ if(table == 0)
+ return 0;
- if( table_select > 15 )
+ if( table > 15 )
{ /* ESC-table is used */
- if(x > 14) { linbitsx = x - 15; x = 15; }
- if(y > 14) { linbitsy = y - 15; y = 15; }
+ uint32 linbits = ht_big[table-16].linbits;
+ uint16 *hffcode = table < 24 ? t16HB : t24HB;
+ uint8 *hlen = table < 24 ? t16l : t24l;
- idx = (x * h->ylen) + y;
- code = h->table[idx];
- bit = h->hlen [idx];
-
- if(x)
+ for(i=begin; i<end; i+=2)
{
- if(x > 14)
+ x = ix[ i ];
+ y = ix[i+1];
+
+ if(x > 14) { xl = x - 15; x = 15; }
+ if(y > 14) { yl = y - 15; y = 15; }
+
+ idx = x * 16 + y;
+ code = hffcode[idx];
+ bit = hlen [idx];
+
+ if(x)
{
- code = (code << linbits) | linbitsx;
- bit += linbits;
- }
+ if(x > 14)
+ {
+ code = (code << linbits) | xl;
+ bit += linbits;
+ }
- code = (code << 1) | sign_x;
- bit += 1;
- }
+ code = (code << 1) | sign_x;
+ bit += 1;
+ }
- if(y)
- {
- if(y > 14)
+ if(y)
{
- code = (code << linbits) | linbitsy;
- bit += linbits;
+ if(y > 14)
+ {
+ code = (code << linbits) | yl;
+ bit += linbits;
+ }
+
+ code = (code << 1) | sign_y;
+ bit += 1;
}
- code = (code << 1) | sign_y;
- bit += 1;
+ putlong( code, bit );
+ sumbit += bit;
}
}
else
{ /* No ESC-words */
- idx = (x * h->ylen) + y;
- code = h->table[idx];
- bit = h->hlen [idx];
+ const struct huffcodetab *h = &ht[table];
- if(x)
+ for(i=begin; i<end; i+=2)
{
- code = (code << 1) | sign_x;
- bit += 1;
- }
+ x = ix[i];
+ y = ix[i+1];
- if(y)
- {
- code = (code << 1) | sign_y;
- bit += 1;
+ idx = x * h->len + y;
+ code = h->table[idx];
+ bit = h->hlen [idx];
+
+ if(x)
+ {
+ code = (code << 1) | sign_x;
+ bit += 1;
+ }
+
+ if(y)
+ {
+ code = (code << 1) | sign_y;
+ bit += 1;
+ }
+
+ putlong( code, bit );
+ sumbit += bit;
}
}
- putbits( code, bit );
-
- return bit;
+ /* flush remaining bits */
+ putbits(cc, sz);
+
+ return sumbit;
}
-/*************************************************************************/
-/* Choose the Huffman table that will encode ix[begin..end] with */
-/* the fewest bits. */
-/* Note: This code contains knowledge about the sizes and characteristics */
-/* of the Huffman tables as defined in the IS (Table B.7), and will not work */
-/* with any arbitrary tables. */
-/*************************************************************************/
-int new_choose_table( enct8 ix[samp_per_frame2], uint32 begin, uint32 end )
+void putbits(uint32 val, uint32 nbit)
+{
+ int new_bitpos = CodedData.bitpos + nbit;
+ int ptrpos = CodedData.bitpos >> 5;
+
+ val = val & (0xffffffff >> (32 - nbit));
+
+ /* data fit in one uint32 */
+ if(((new_bitpos - 1) >> 5) == ptrpos)
+ CodedData.bbuf[ptrpos] |= val << ((32 - new_bitpos) & 31);
+ else
+ {
+ CodedData.bbuf[ptrpos ] |= val >> ((new_bitpos - 32) & 31);
+ CodedData.bbuf[ptrpos+1] |= val << ((32 - new_bitpos) & 31);
+ }
+
+ CodedData.bitpos = new_bitpos;
+}
+
+/***************************************************************************/
+/* Choose the Huffman table that will encode ix[begin..end] with */
+/* the fewest bits. */
+/* Note: This code contains knowledge about the sizes and characteristic */
+/* of the Huffman tables as defined in the IS (Table B.7), and will not */
+/* work with any arbitrary tables. */
+/***************************************************************************/
+int choose_table( short *ix, uint32 begin, uint32 end, int *bits )
{
uint32 i;
- int max, sum0, sum1, table0, table1;
+ int max, table0, table1;
for(i=begin,max=0; i<end; i++)
if(ix[i] > max)
max = ix[i];
- if(!max)
- return 0;
-
- table0 = 0;
- table1 = 0;
-
- if(max <= 15)
+ if(max < 16)
{
- /* try tables with no linbits */
+ /* tables without linbits */
/* indx: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */
- /* xlen: 0, 2, 3, 3, 0, 4, 4, 6, 6, 6, 8, 8, 8, 16, 0, 16 */
- for(table0=0; table0<14; table0++)
- if(ht[table0].xlen > max)
- break;
-
- sum0 = count_bit(ix, begin, end, table0);
-
- switch( table0 )
+ /* len: 0, 2, 3, 3, 0, 4, 4, 6, 6, 6, 8, 8, 8, 16, 0, 16 */
+ switch(max)
{
- case 2: sum1 = count_bit( ix, begin, end, 3 );
- if(sum1 <= sum0) table0 = 3; break;
-
- case 5: sum1 = count_bit( ix, begin, end, 6 );
- if(sum1 <= sum0) table0 = 6; break;
-
- case 7: sum1 = count_bit( ix, begin, end, 8 );
- if(sum1 <= sum0) { table0 = 8; sum0 = sum1; }
- sum1 = count_bit( ix, begin, end, 9 );
- if(sum1 <= sum0) table0 = 9; break;
-
- case 10: sum1 = count_bit( ix, begin, end, 11 );
- if(sum1 <= sum0) { table0 =11; sum0 = sum1; }
- sum1 = count_bit( ix, begin, end, 12);
- if(sum1 <= sum0) table0 = 12; break;
-
- case 13: sum1 = count_bit( ix, begin, end, 15 );
- if(sum1 <= sum0) table0 = 15; break;
+ case 0: return 0;
+ case 1: return count_bit1(ix, begin, end, bits);
+ case 2: return 2 + find_best_2(ix, begin, end, tab23, 3, bits);
+ case 3: return 5 + find_best_2(ix, begin, end, tab56, 4, bits);
+ case 4:
+ case 5: return 7 + find_best_3(ix, begin, end, tab789, 6, bits);
+ case 6:
+ case 7: return 10 + find_best_3(ix, begin, end, tabABC, 8, bits);
+ default: return 13 + find_best_2(ix, begin, end, tab1315, 16, bits) * 2;
}
}
else
{
- /* try tables with linbits */
+ /* tables with linbits */
max -= 15;
- /* index : 15 16 17 18 19 20 21 22 23 */
- /* linmax: 0 1 3 7 15 63 255 1023 8191 */
- for(table0=15; table0<24; table0++)
- if(ht[table0].linmax >= max)
+ for(table0=0; table0<8; table0++)
+ if(ht_big[table0].linmax >= max)
break;
- /* index : 24 25 26 27 28 29 30 31 */
- /* linmax: 15 31 63 127 255 511 2047 8191 */
- for(table1=24; table1<32; table1++)
- if(ht[table1].linmax >= max)
+ for(table1=8; table1<16; table1++)
+ if(ht_big[table1].linmax >= max)
break;
- sum0 = count_bit(ix, begin, end, table0);
- sum1 = count_bit(ix, begin, end, table1);
-
- if(sum1 < sum0)
- table0 = table1;
+ return 16 + count_bigv(ix, begin, end, table0, table1, bits);
}
- return table0;
}
-/*************************************************************************/
-/* Function: Count the number of bits necessary to code the subregion. */
-/*************************************************************************/
-int count_bit(enct8 ix[samp_per_frame2], unsigned int start, unsigned int end, unsigned int table )
+int find_best_2(short *ix, uint32 start, uint32 end, const uint32 *table,
+ uint32 len, int *bits)
{
- uint32 i;
- int sum;
- int x, y;
- unsigned linbits, ylen;
- const struct huffcodetab *h;
-
- h = &ht[table];
- sum = 0;
- ylen = h->ylen;
-
- if(table > 15)
- { /* ESC-table is used */
- linbits = h->linbits;
- for(i=start; i<end; i+=2)
- {
- x = ix[i];
- y = ix[i+1];
+ uint32 i, sum = 0;
- if(x)
- {
- if(x > 14) { x = 15; sum += linbits; }
- sum++;
- }
+ for(i=start; i<end; i+=2)
+ sum += table[ix[i] * len + ix[i+1]];
- if(y)
- {
- if(y > 14) { y = 15; sum += linbits; }
- sum++;
- }
-
- sum += h->hlen[(x * ylen) + y];
- }
+ if((sum & 0xffff) <= (sum >> 16))
+ {
+ *bits = (sum & 0xffff);
+ return 1;
}
else
- { /* No ESC-words */
- for(i=start; i<end; i+=2)
- {
- x = ix[i];
- y = ix[i+1];
+ {
+ *bits = sum >> 16;
+ return 0;
+ }
+}
- sum += h->hlen[(x * ylen) + y];
+int find_best_3(short *ix, uint32 start, uint32 end, const uint32 *table,
+ uint32 len, int *bits)
+{
+ uint32 i, j, sum = 0;
+ int sum1 = 0;
+ int sum2 = 0;
+ int sum3 = 0;
- if(x) sum++;
- if(y) sum++;
- }
+ /* avoid overflow in packed additions: 78*13 < 1024 */
+ for(i=start; i<end; )
+ {
+ j = i + 2*78 > end ? end : i + 2*78;
+
+ for(sum=0; i<j; i+=2)
+ sum += table[ix[i] * len + ix[i+1]];
+
+ sum1 += (sum >> 20);
+ sum2 += (sum >> 10) & 0x3ff;
+ sum3 += (sum >> 0) & 0x3ff;
}
-
- return sum;
+
+ i = 0;
+ if(sum1 > sum2) { sum1 = sum2; i = 1; }
+ if(sum1 > sum3) { sum1 = sum3; i = 2; }
+
+ *bits = sum1;
+
+ return i;
}
/*************************************************************************/
-/* Function: Quantization of the vector xr ( -> ix) */
+/* Function: Count the number of bits necessary to code the subregion. */
/*************************************************************************/
-int quantize_int(int xr[samp_per_frame2], enct8 ix[samp_per_frame2], side_info_t *cod_info)
+int count_bit1(short *ix, uint32 start, uint32 end, int *bits )
{
- int i;
-#if 0
- long step;
- uint32 frac_pow[] = { 0, 12400, 27146, 44682 };
+ uint32 i, sum = 0;
- step = 1 << cod_info->quantizerStepSize / 4;
- step += (step * frac_pow[cod_info->quantizerStepSize & 3] + 32768) >> 16;
+ for(i=start; i<end; i+=2)
+ sum += t1l[4 + ix[i] * 2 + ix[i+1]];
- for(i=samp_per_frame2; i--; )
- ix[i] = int2idx[4 * abs(xr[i]) / step];
+ *bits = sum;
- return 1;
-#else
- uint32 max=0, val, step, frac_pow[] = { 0x40000, 0x35d14, 0x2d414,0x260e0 };
+ return 1; /* this is table1 */
+}
- step = frac_pow[cod_info->quantizerStepSize & 3] >> cod_info->quantizerStepSize / 4;
+int count_bigv(short *ix, uint32 start, uint32 end, int table0,
+ int table1, int *bits )
+{
+ uint32 i, sum0, sum1, sum=0, bigv=0, x, y;
- for(i=samp_per_frame2; i--; )
+ /* ESC-table is used */
+ for(i=start; i<end; i+=2)
{
- val = (((unsigned long)abs(xr[i]) * step + 32768) >> 16);
- max |= val;
- ix[i] = int2idx[val];
+ x = ix[i];
+ y = ix[i+1];
+
+ if(x > 14) { x = 15; bigv++; }
+ if(y > 14) { y = 15; bigv++; }
+
+ sum += tab1624[x * 16 + y];
+ }
+
+ sum0 = (sum >> 16) + bigv * ht_big[table0].linbits;
+ sum1 = (sum & 0xffff) + bigv * ht_big[table1].linbits;
+
+ if(sum0 <= sum1)
+ {
+ *bits = sum0;
+ return table0;
+ }
+ else
+ {
+ *bits = sum1;
+ return table1;
}
- return max < 4096 ? 1 : 0;
-#endif
}
/*************************************************************************/
-/* Function: Calculation of rzero, count1, big_values */
+/* Function: Calculation of rzero, count1, address3 */
/* (Partitions ix into big values, quadruples and zeros). */
/*************************************************************************/
-int calc_runlen( enct8 ix[samp_per_frame2], side_info_t *cod_info )
+int calc_runlen( short *ix, side_info_t *si )
{
- int p, i, sum0 = 0, sum1 = 0;
+ int p, i, sum = 0;
- for(i=samp_per_frame2; i-=2; )
- if(ix[i-1] | ix[i-2])
+ for(i=SAMPL2; i-=2; )
+ if(*(uint32*)&ix[i-2]) /* !!!! short *ix; !!!!! */
break;
- cod_info->count1 = 0;
+ si->count1 = 0;
for( ; i>3; i-=4)
{
@@ -1119,583 +1344,741 @@ int calc_runlen( enct8 ix[samp_per_frame2], side_info_t *cod_info )
if((v | w | x | y) <= 1)
{
- p = (y) + (x<<1) + (w<<2) + (v<<3);
+ p = (y<<3) + (x<<2) + (w<<1) + (v);
- sum0 += ht_count1[0][1][p]; /* add table0 hlength */
- sum1 += ht_count1[1][1][p]; /* add table1 hlength */
+ sum += tab01[p];
- cod_info->count1++;
+ si->count1++;
}
else break;
}
- cod_info->big_values = i >> 1;
+ si->address3 = i;
- if(sum0 < sum1)
+ if((sum >> 16) < (sum & 0xffff))
{
- cod_info->table_select[3] = 0;
- return sum0;
+ si->table_select[3] = 0;
+ return sum >> 16;
}
else
{
- cod_info->table_select[3] = 1;
- return sum1;
+ si->table_select[3] = 1;
+ return sum & 0xffff;
}
}
+
/*************************************************************************/
-/* presumable subdivides the bigvalue region which will use separate Huffman tables */
+/* Function: Quantization of the vector xr ( -> ix) */
/*************************************************************************/
-void subdivide(side_info_t *cod_info)
+int quantize_int(int *xr, short *ix, side_info_t *si)
{
- int scfb_anz = 0;
- int bigvalues_region;
- int thiscount, index;
-
- if( !cod_info->big_values )
- { /* no big_values region */
- cod_info->region0_count = 0;
- cod_info->region1_count = 0;
- }
- else
- {
- bigvalues_region = 2 * cod_info->big_values;
-
- /* Calculate scfb_anz */
- while( scalefac_long[scfb_anz] < bigvalues_region )
- scfb_anz++;
-
- cod_info->region0_count = subdv_table[scfb_anz].region0_count;
- thiscount = cod_info->region0_count;
- index = thiscount + 1;
- while(thiscount && (scalefac_long[index] > bigvalues_region))
- {
- thiscount--;
- index--;
- }
- cod_info->region0_count = thiscount;
- cod_info->region1_count = subdv_table[scfb_anz].region1_count;
- index = cod_info->region0_count + cod_info->region1_count + 2;
- thiscount = cod_info->region1_count;
- while(thiscount && (scalefac_long[index] > bigvalues_region))
- {
- thiscount--;
- index--;
- }
- cod_info->region1_count = thiscount;
- cod_info->address1 = scalefac_long[cod_info->region0_count+1];
- cod_info->address2 = scalefac_long[cod_info->region0_count+cod_info->region1_count+2];
- cod_info->address3 = bigvalues_region;
- }
+ int i, s, frac_pow[] = { 0x10000, 0xd745, 0xb505, 0x9838 };
+
+ s = frac_pow[si->quantStep & 3] >> si->quantStep / 4;
+
+ /* check for integer overflow */
+ if(((si->max_val + 256) >> 8) * s >= (1622 << 8))
+ return 0;
+
+ for(i=SAMPL2; i--; )
+ ix[i] = int2idx[(abs(xr[i]) * s + 0x8000) >> 16];
+
+ return 1;
}
/*************************************************************************/
-/* Function: Select huffman code tables for bigvalues regions */
+/* subdivides the bigvalue region which will use separate Huffman tables */
/*************************************************************************/
-void bigv_tab_select( enct8 ix[samp_per_frame2], side_info_t *cod_info )
+void subdivide(side_info_t *si)
{
- cod_info->table_select[0] = 0;
- cod_info->table_select[1] = 0;
- cod_info->table_select[2] = 0;
+ int scfb, count0, count1;
- if( cod_info->address1 > 0 )
- cod_info->table_select[0] = new_choose_table(ix, 0 , cod_info->address1);
-
- if( cod_info->address2 > cod_info->address1 )
- cod_info->table_select[1] = new_choose_table(ix, cod_info->address1, cod_info->address2);
-
- if( cod_info->big_values<<1 > cod_info->address2 )
- cod_info->table_select[2] = new_choose_table(ix, cod_info->address2, cod_info->big_values<<1);
+ if( !si->address3 )
+ { /* no bigvalue region */
+ si->region_0_1 = 0;
+ si->address1 = 0;
+ si->address2 = 0;
+ }
+ else
+ {
+ /* Calculate scale factor band index */
+ for(scfb=0; scalefac[scfb] < si->address3; )
+ scfb++;
+
+ count0 = subdv_table[scfb].region0_cnt;
+ count1 = subdv_table[scfb].region1_cnt;
+
+ si->region_0_1 = (count0 << 3) | count1;
+ si->address1 = scalefac[count0 + 1];
+ si->address2 = scalefac[count0 + 1 + count1 + 1];
+ }
}
-/*************************************************************************/
-/* Function: Count the number of bits necessary to code the bigvalues region */
-/*************************************************************************/
-int bigv_bitcount(enct8 ix[samp_per_frame2], side_info_t *gi)
+/*******************************************************************/
+/* Count the number of bits necessary to code the bigvalues region */
+/*******************************************************************/
+int bigv_bitcount(short *ix, side_info_t *gi)
{
- int bits = 0;
- uint32 table;
+ int b1=0, b2=0, b3=0;
- if((table=gi->table_select[0])) /* region0 */
- bits += count_bit(ix, 0 , gi->address1, table);
+ /* Select huffman code tables for bigvalues regions */
+ gi->table_select[0] = 0;
+ gi->table_select[1] = 0;
+ gi->table_select[2] = 0;
- if((table=gi->table_select[1])) /* region1 */
- bits += count_bit(ix, gi->address1, gi->address2, table);
+ if( gi->address1 > 0 ) /* region0 */
+ gi->table_select[0] = choose_table(ix, 0 , gi->address1, &b1);
- if((table=gi->table_select[2])) /* region2 */
- bits += count_bit(ix, gi->address2, gi->address3, table);
+ if( gi->address2 > gi->address1 ) /* region1 */
+ gi->table_select[1] = choose_table(ix, gi->address1, gi->address2, &b2);
- return bits;
-}
+ if( gi->address3 > gi->address2 ) /* region2 */
+ gi->table_select[2] = choose_table(ix, gi->address2, gi->address3, &b3);
-int quantcnt;
+ return b1+b2+b3;
+}
-/* Speed up the outer_loop code which is called by iteration_loop.
- The outer_loop function precedes the call to the function inner_loop
- with a call to bin_search gain defined below,
- which returns a good starting quantizerStepSize. */
-int quantize_and_count_bits(int xr[samp_per_frame2], enct8 ix[samp_per_frame2], side_info_t *cod_info)
+int quantize_and_count_bits(int *xr, short *ix, side_info_t *si)
{
int bits = 10000;
- quantcnt++;
-
- if(quantize_int(xr, ix, cod_info))
+ if(quantize_int(xr, ix, si))
{
- bits = calc_runlen(ix, cod_info); /* rzero,count1,big_values*/
- subdivide(cod_info); /* bigvalues sfb division */
- bigv_tab_select(ix,cod_info); /* codebook selection*/
- bits += bigv_bitcount(ix,cod_info); /* bit count */
+ bits = calc_runlen(ix, si); /* rzero,count1,address3 */
+ subdivide(si); /* bigvalues sfb division */
+ bits += bigv_bitcount(ix,si); /* bit count */
}
return bits;
}
-/******************************************************************************/
-/* The code selects the best quantizerStepSize for a particular set of scalefacs */
-/******************************************************************************/
-int inner_loop_int(int xr[2][2][samp_per_frame2], int max_bits, side_info_t *cod_info, int gr, int ch )
+/***********************************************************************/
+/* The code selects the best quantStep for a particular set of scalefacs */
+/***********************************************************************/
+int inner_loop(int *xr, int max_bits, side_info_t *si)
{
- int *xrs; /* int[samp_per_frame2] *xr; */
- enct8 *ix; /* int[samp_per_frame2] *ix; */
- int bits;
+ int bits;
- xrs = &xr[gr][ch][0];
- ix = enc_data[gr][ch];
-
- while((bits=quantize_and_count_bits(xrs, ix, cod_info)) < max_bits- 128)
+ while((bits=quantize_and_count_bits(xr, enc_data, si)) < max_bits-64)
{
- if(cod_info->quantizerStepSize == 0)
+ if(si->quantStep == 0)
break;
- if(cod_info->quantizerStepSize <= 2)
- cod_info->quantizerStepSize = 0;
+ if(si->quantStep <= 2)
+ si->quantStep = 0;
else
- cod_info->quantizerStepSize -= 2;
+ si->quantStep -= 2;
}
while(bits > max_bits)
{
- cod_info->quantizerStepSize++;
- bits = quantize_and_count_bits(xrs, ix, cod_info);
+ si->quantStep++;
+ bits = quantize_and_count_bits(xr, enc_data, si);
}
return bits;
}
-/************************************************************************/
-/* iteration_loop() */
-/************************************************************************/
-void iteration_loop(int mdct_freq_org[2][2][samp_per_frame2], side_info_t cod_info[2][2], int mean_bits)
+void iteration_loop(int *xr, side_info_t *si, int gr_cnt)
{
- int max_bits;
- int ch, gr;
- int ResvSize = 0; /* Layer3 bit reservoir: Described in C.1.5.4.2.2 of the IS */
-
- for(gr=2; gr--; )
+ int remain, tar_bits, max_bits = cfg.mean_bits;
+
+ /* distribute reserved bits to remaining granules */
+ tar_bits = max_bits + (cfg.ResvSize / gr_cnt & ~7);
+ if(tar_bits > max_bits + max_bits/2)
+ tar_bits = max_bits + max_bits/2;
+
+ si->part2_3_length = inner_loop(xr, tar_bits, si);
+ si->global_gain = si->quantStep + 142 - si->additStep;
+
+ /* unused bits of the reservoir can be used for remaining granules */
+ cfg.ResvSize += max_bits - si->part2_3_length;
+
+ /* end: distribute the reserved bits to one or two granules */
+ if(gr_cnt == 1)
{
- for(ch=config.wave.channels; ch--; )
+ si->part2_3_length += cfg.ResvSize;
+ /* mp3 format allows max 12bits for granule length */
+ if(si->part2_3_length > 4092)
{
- /* calculation of number of available bit( per granule ) */
- max_bits = mean_bits / config.wave.channels;
-
- cod_info[gr][ch].big_values = 0;
- cod_info[gr][ch].count1 = 0;
- cod_info[gr][ch].table_select[0] = 0;
- cod_info[gr][ch].table_select[1] = 0;
- cod_info[gr][ch].table_select[2] = 0;
- cod_info[gr][ch].region0_count = 0;
- cod_info[gr][ch].region1_count = 0;
- cod_info[gr][ch].table_select[3] = 0;
- cod_info[gr][ch].part2_3_length = inner_loop_int(mdct_freq_org, max_bits, &cod_info[gr][ch], gr, ch);
- cod_info[gr][ch].global_gain = cod_info[gr][ch].quantizerStepSize + 210 - 0x3c;
-
- /* Readjusts the size of the reservoir to reflect the granule's usage */
- ResvSize += max_bits - cod_info[gr][ch].part2_3_length;
+ remain = (si->part2_3_length - 4092 + 31) >> 5;
+ si->part2_3_length -= remain << 5;
+ si[-1].part2_3_length += remain << 5;
+
+ while(remain--)
+ putbits(~0, 32);
}
}
-
-/* Makes sure that the reservoir size is within limits, possibly by adding stuffing
- bits. Note that stuffing bits are added by increasing a granule's part2_3_length */
- cod_info[0][0].part2_3_length += ResvSize;
}
-/*-------------------------------------------------------------------*/
-/* Function: Calculation of the MDCT */
-/* In the case of long blocks ( block_type 0,1,3 ) there are */
-/* 36 coefficents in the time domain and 18 in the frequency */
-/* domain. */
-/*-------------------------------------------------------------------*/
-/* TODO: This MDCT implementation is very crude, and should be replaced by
- a completely different algorithm. */
-void mdct_int( int *in, int *out )
+/* returns sum_j=0^31 a[j]*cos(PI*j*(k+1/2)/32), 0<=k<32 */
+void window_subband1(short *wk, int sb0[SBLIMIT], int sb1[SBLIMIT]) ICODE_ATTR;
+void window_subband1(short *wk, int sb0[SBLIMIT], int sb1[SBLIMIT])
{
- int m, tmp=0;
-
- for(m=18; m--; )
- {
+ int k, i, u, v;
+ short *wp, *x1, *x2;
+
#ifdef CPU_COLDFIRE
- { int *wint = win_int[m];
- int *indat = in;
+ int s0, s1, t0, t1;
+ for(k=0; k<18; k++, wk+=64, sb0+=SBLIMIT, sb1+=SBLIMIT)
+ {
+ wp = enwindow;
+ x1 = wk;
+ x2 = x1 - 124;
+
+ for(i=-15; i<0; i++)
+ {
asm volatile(
- "movem.l (%[indat]), %%d0-%%d7\n"
- "move.l (%[wint])+, %%a5\n"
- "mac.l %%d0, %%a5, (%[wint])+, %%a5, %%acc0\n"
- "mac.l %%d1, %%a5, (%[wint])+, %%a5, %%acc0\n"
- "mac.l %%d2, %%a5, (%[wint])+, %%a5, %%acc0\n"
- "mac.l %%d3, %%a5, (%[wint])+, %%a5, %%acc0\n"
- "mac.l %%d4, %%a5, (%[wint])+, %%a5, %%acc0\n"
- "mac.l %%d5, %%a5, (%[wint])+, %%a5, %%acc0\n"
- "mac.l %%d6, %%a5, (%[wint])+, %%a5, %%acc0\n"
- "mac.l %%d7, %%a5, (%[wint])+, %%a5, %%acc0\n"
- "movem.l (32,%[indat]), %%d0-%%d7\n"
- "mac.l %%d0, %%a5, (%[wint])+, %%a5, %%acc0\n"
- "mac.l %%d1, %%a5, (%[wint])+, %%a5, %%acc0\n"
- "mac.l %%d2, %%a5, (%[wint])+, %%a5, %%acc0\n"
- "mac.l %%d3, %%a5, (%[wint])+, %%a5, %%acc0\n"
- "mac.l %%d4, %%a5, (%[wint])+, %%a5, %%acc0\n"
- "mac.l %%d5, %%a5, (%[wint])+, %%a5, %%acc0\n"
- "mac.l %%d6, %%a5, (%[wint])+, %%a5, %%acc0\n"
- "mac.l %%d7, %%a5, (%[wint])+, %%a5, %%acc0\n"
- "movem.l (64,%[indat]), %%d0-%%d7\n"
- "mac.l %%d0, %%a5, (%[wint])+, %%a5, %%acc0\n"
- "mac.l %%d1, %%a5, (%[wint])+, %%a5, %%acc0\n"
- "mac.l %%d2, %%a5, (%[wint])+, %%a5, %%acc0\n"
- "mac.l %%d3, %%a5, (%[wint])+, %%a5, %%acc0\n"
- "mac.l %%d4, %%a5, (%[wint])+, %%a5, %%acc0\n"
- "mac.l %%d5, %%a5, (%[wint])+, %%a5, %%acc0\n"
- "mac.l %%d6, %%a5, (%[wint])+, %%a5, %%acc0\n"
- "mac.l %%d7, %%a5, (%[wint])+, %%a5, %%acc0\n"
- "movem.l (96,%[indat]), %%d0-%%d7\n"
- "mac.l %%d0, %%a5, (%[wint])+, %%a5, %%acc0\n"
- "mac.l %%d1, %%a5, (%[wint])+, %%a5, %%acc0\n"
- "mac.l %%d2, %%a5, (%[wint])+, %%a5, %%acc0\n"
- "mac.l %%d3, %%a5, (%[wint])+, %%a5, %%acc0\n"
- "mac.l %%d4, %%a5, (%[wint])+, %%a5, %%acc0\n"
- "mac.l %%d5, %%a5, (%[wint])+, %%a5, %%acc0\n"
- "mac.l %%d6, %%a5, (%[wint])+, %%a5, %%acc0\n"
- "mac.l %%d7, %%a5, (%[wint])+, %%a5, %%acc0\n"
- "movem.l (128,%[indat]), %%d0-%%d3\n"
- "mac.l %%d0, %%a5, (%[wint])+, %%a5, %%acc0\n"
- "mac.l %%d1, %%a5, (%[wint])+, %%a5, %%acc0\n"
- "mac.l %%d2, %%a5, (%[wint])+, %%a5, %%acc0\n"
- "mac.l %%d3, %%a5, %%acc0\n"
- "movclr.l %%acc0, %[tmp]"
- : [wint] "+a" (wint), [tmp] "+r" (tmp) : [indat] "a" (indat)
- : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "a5");
+ "move.l (-224*4,%[x2]), %%d4\n" /* d4 = x2[-224] */
+ "movem.l (%[wp]), %%d0-%%d3\n" /* load 8 values */
+ "mac.w %%d0u, %%d4u, %%acc0\n"
+ "mac.w %%d0u, %%d4l, (-160*4,%[x2]), %%d4, %%acc1\n"
+ "mac.w %%d0l, %%d4u, %%acc0\n"
+ "mac.w %%d0l, %%d4l, ( -96*4,%[x2]), %%d4, %%acc1\n"
+ "mac.w %%d1u, %%d4u, %%acc0\n"
+ "mac.w %%d1u, %%d4l, ( -32*4,%[x2]), %%d4, %%acc1\n"
+ "mac.w %%d1l, %%d4u, %%acc0\n"
+ "mac.w %%d1l, %%d4l, ( 32*4,%[x2]), %%d4, %%acc1\n"
+ "mac.w %%d2u, %%d4u, %%acc0\n"
+ "mac.w %%d2u, %%d4l, ( 96*4,%[x2]), %%d4, %%acc1\n"
+ "mac.w %%d2l, %%d4u, %%acc0\n"
+ "mac.w %%d2l, %%d4l, ( 160*4,%[x2]), %%d4, %%acc1\n"
+ "mac.w %%d3u, %%d4u, %%acc0\n"
+ "mac.w %%d3u, %%d4l, ( 224*4,%[x2]), %%d4, %%acc1\n"
+ "mac.w %%d3l, %%d4u, %%acc0\n"
+ "mac.w %%d3l, %%d4l, (-256*4,%[x1]), %%d4, %%acc1\n"
+ "movem.l (16,%[wp]), %%d0-%%d3\n" /* load 8 values */
+ "mac.w %%d0u, %%d4u, %%acc0\n"
+ "mac.w %%d0u, %%d4l, (-192*4,%[x1]), %%d4, %%acc1\n"
+ "mac.w %%d0l, %%d4u, %%acc0\n"
+ "mac.w %%d0l, %%d4l, (-128*4,%[x1]), %%d4, %%acc1\n"
+ "mac.w %%d1u, %%d4u, %%acc0\n"
+ "mac.w %%d1u, %%d4l, ( -64*4,%[x1]), %%d4, %%acc1\n"
+ "mac.w %%d1l, %%d4u, %%acc0\n"
+ "mac.w %%d1l, %%d4l, ( 0*4,%[x1]), %%d4, %%acc1\n"
+ "mac.w %%d2u, %%d4u, %%acc0\n"
+ "mac.w %%d2u, %%d4l, ( 64*4,%[x1]), %%d4, %%acc1\n"
+ "mac.w %%d2l, %%d4u, %%acc0\n"
+ "mac.w %%d2l, %%d4l, ( 128*4,%[x1]), %%d4, %%acc1\n"
+ "mac.w %%d3u, %%d4u, %%acc0\n"
+ "mac.w %%d3u, %%d4l, ( 192*4,%[x1]), %%d4, %%acc1\n"
+ "mac.w %%d3l, %%d4u, %%acc0\n"
+ "mac.w %%d3l, %%d4l, ( 224*4,%[x1]), %%d4, %%acc1\n"
+ "movclr.l %%acc0, %%d0\n"
+ "move.l %%d0, %[s0]\n"
+ "movclr.l %%acc1, %%d0\n"
+ "move.l %%d0, %[s1]\n"
+
+ "movem.l (%[wp]), %%d0-%%d3\n" /* load 8 values */
+ "mac.w %%d0u, %%d4u, %%acc0\n"
+ "mac.w %%d0u, %%d4l, ( 160*4,%[x1]), %%d4, %%acc1\n"
+ "mac.w %%d0l, %%d4u, %%acc0\n"
+ "mac.w %%d0l, %%d4l, ( 96*4,%[x1]), %%d4, %%acc1\n"
+ "mac.w %%d1u, %%d4u, %%acc0\n"
+ "mac.w %%d1u, %%d4l, ( 32*4,%[x1]), %%d4, %%acc1\n"
+ "mac.w %%d1l, %%d4u, %%acc0\n"
+ "mac.w %%d1l, %%d4l, ( -32*4,%[x1]), %%d4, %%acc1\n"
+ "mac.w %%d2u, %%d4u, %%acc0\n"
+ "mac.w %%d2u, %%d4l, ( -96*4,%[x1]), %%d4, %%acc1\n"
+ "mac.w %%d2l, %%d4u, %%acc0\n"
+ "mac.w %%d2l, %%d4l, (-160*4,%[x1]), %%d4, %%acc1\n"
+ "mac.w %%d3u, %%d4u, %%acc0\n"
+ "mac.w %%d3u, %%d4l, (-224*4,%[x1]), %%d4, %%acc1\n"
+ "mac.w %%d3l, %%d4u, %%acc0\n"
+ "mac.w %%d3l, %%d4l, ( 256*4,%[x2]), %%d4, %%acc1\n"
+ "movem.l (32,%[wp]), %%d0-%%d3\n" /* load 8 values */
+ "mac.w %%d0u, %%d4u, %%acc0\n"
+ "mac.w %%d0u, %%d4l, ( 192*4,%[x2]), %%d4, %%acc1\n"
+ "mac.w %%d0l, %%d4u, %%acc0\n"
+ "mac.w %%d0l, %%d4l, ( 128*4,%[x2]), %%d4, %%acc1\n"
+ "mac.w %%d1u, %%d4u, %%acc0\n"
+ "mac.w %%d1u, %%d4l, ( 64*4,%[x2]), %%d4, %%acc1\n"
+ "mac.w %%d1l, %%d4u, %%acc0\n"
+ "mac.w %%d1l, %%d4l, ( 0*4,%[x2]), %%d4, %%acc1\n"
+ "mac.w %%d2u, %%d4u, %%acc0\n"
+ "mac.w %%d2u, %%d4l, ( -64*4,%[x2]), %%d4, %%acc1\n"
+ "mac.w %%d2l, %%d4u, %%acc0\n"
+ "mac.w %%d2l, %%d4l, (-128*4,%[x2]), %%d4, %%acc1\n"
+ "mac.w %%d3u, %%d4u, %%acc0\n"
+ "mac.w %%d3u, %%d4l, (-192*4,%[x2]), %%d4, %%acc1\n"
+ "mac.w %%d3l, %%d4u, %%acc0\n"
+ "mac.w %%d3l, %%d4l, %%acc1\n"
+ "movclr.l %%acc0, %%d0\n"
+ "move.l %%d0, %[t0]\n"
+ "movclr.l %%acc1, %%d0\n"
+ "move.l %%d0, %[t1]\n"
+
+ : [x1] "+a" (x1), [x2] "+a" (x2), [s0] "+m" (s0), [t0] "+m" (t0),
+ [s1] "+m" (s1), [t1] "+m" (t1)
+ : [wp] "a" (wp) : "d0", "d1", "d2", "d3", "d4");
+
+ sb0[30+i*2] = shft4(t0) + shft13(s0) * wp[24];
+ sb0[31+i*2] = shft13(t0) * wp[25] - shft13(s0) * wp[26];
+ sb1[30+i*2] = shft4(t1) + shft13(s1) * wp[24];
+ sb1[31+i*2] = shft13(t1) * wp[25] - shft13(s1) * wp[26];
+ wp += 27;
+ x1 -= 2;
+ x2 += 2;
}
-#else
- int k;
- for(k=36,tmp=0; k--; )
- tmp += in[k] * win_int[m][k];
-#endif
- out[m] = (tmp + 16384) >> 15;
- }
-}
+ asm volatile(
+ "move.l ( -32*4,%[x1]), %%d4\n" /* d4 = x1[-32] */
+ "movem.l (%[wp]), %%d0-%%d3\n" /* load 8 values */
+
+ "mac.w %%d0u, %%d4u, %%acc0\n"
+ "mac.w %%d0u, %%d4l, ( -96*4,%[x1]), %%d4, %%acc1\n"
+ "mac.w %%d0l, %%d4u, %%acc0\n"
+ "mac.w %%d0l, %%d4l, (-160*4,%[x1]), %%d4, %%acc1\n"
+ "mac.w %%d1u, %%d4u, %%acc0\n"
+ "mac.w %%d1u, %%d4l, (-224*4,%[x1]), %%d4, %%acc1\n"
+ "mac.w %%d1l, %%d4u, %%acc0\n"
+ "mac.w %%d1l, %%d4l, ( 32*4,%[x1]), %%d4, %%acc1\n"
+ "mac.w %%d2u, %%d4u, %%acc0\n"
+ "mac.w %%d2u, %%d4l, ( 96*4,%[x1]), %%d4, %%acc1\n"
+ "mac.w %%d2l, %%d4u, %%acc0\n"
+ "mac.w %%d2l, %%d4l, ( 160*4,%[x1]), %%d4, %%acc1\n"
+ "mac.w %%d3u, %%d4u, %%acc0\n"
+ "mac.w %%d3u, %%d4l, ( 224*4,%[x1]), %%d4, %%acc1\n"
+ "mac.w %%d3l, %%d4u, %%acc0\n"
+ "mac.w %%d3l, %%d4l, ( -16*4,%[x1]), %%d4, %%acc1\n"
+ "movclr.l %%acc0, %%d0\n"
+ "move.l %%d0, %[s0]\n"
+ "movclr.l %%acc1, %%d0\n"
+ "move.l %%d0, %[s1]\n"
+
+ "movem.l (16,%[wp]), %%d0-%%d3\n" /* load 8 values */
+ "mac.w %%d0u, %%d4u, %%acc0\n"
+ "mac.w %%d0u, %%d4l, ( -48*4,%[x1]), %%d4, %%acc1\n"
+ "mac.w %%d1u, %%d4u, %%acc0\n"
+ "mac.w %%d1u, %%d4l, ( 16*4,%[x1]), %%d4, %%acc1\n"
+ "mac.w %%d1l, %%d4u, %%acc0\n"
+ "mac.w %%d1l, %%d4l, ( -80*4,%[x1]), %%d4, %%acc1\n"
+ "mac.w %%d2u, %%d4u, %%acc0\n"
+ "mac.w %%d2u, %%d4l, ( 48*4,%[x1]), %%d4, %%acc1\n"
+ "mac.w %%d2u, %%d4u, %%acc0\n"
+ "mac.w %%d2u, %%d4l, (-112*4,%[x1]), %%d4, %%acc1\n"
+ "mac.w %%d3u, %%d4u, %%acc0\n"
+ "mac.w %%d3u, %%d4l, ( 80*4,%[x1]), %%d4, %%acc1\n"
+ "mac.w %%d3l, %%d4u, %%acc0\n"
+ "mac.w %%d3l, %%d4l, (-144*4,%[x1]), %%d4, %%acc1\n"
+ "movem.l (32,%[wp]), %%d0-%%d3\n" /* load 8 values */
+ "mac.w %%d0u, %%d4u, %%acc0\n"
+ "mac.w %%d0u, %%d4l, ( 112*4,%[x1]), %%d4, %%acc1\n"
+ "mac.w %%d0u, %%d4u, %%acc0\n"
+ "mac.w %%d0u, %%d4l, (-176*4,%[x1]), %%d4, %%acc1\n"
+ "mac.w %%d1u, %%d4u, %%acc0\n"
+ "mac.w %%d1u, %%d4l, ( 144*4,%[x1]), %%d4, %%acc1\n"
+ "mac.w %%d1l, %%d4u, %%acc0\n"
+ "mac.w %%d1l, %%d4l, (-208*4,%[x1]), %%d4, %%acc1\n"
+ "mac.w %%d2u, %%d4u, %%acc0\n"
+ "mac.w %%d2u, %%d4l, ( 176*4,%[x1]), %%d4, %%acc1\n"
+ "mac.w %%d2u, %%d4u, %%acc0\n"
+ "mac.w %%d2u, %%d4l, (-240*4,%[x1]), %%d4, %%acc1\n"
+ "mac.w %%d3u, %%d4u, %%acc0\n"
+ "mac.w %%d3u, %%d4l, ( 208*4,%[x1]), %%d4, %%acc1\n"
+ "mac.w %%d3l, %%d4u, %%acc0\n"
+ "mac.w %%d3l, %%d4l, %%acc1\n"
+ "movclr.l %%acc0, %%d0\n"
+ "move.l %%d0, %[t0]\n"
+ "movclr.l %%acc1, %%d0\n"
+ "move.l %%d0, %[t1]\n"
+
+ : [x1] "+a" (x1), [s0] "+m" (s0), [t0] "+m" (t0),
+ [s1] "+m" (s1), [t1] "+m" (t1)
+ : [wp] "a" (wp) : "d0", "d1", "d2", "d3", "d4");
+
+ u = shft4(s0 - t0);
+ v = shft4(s0 + t0);
+ t0 = sb0[14];
+ s0 = sb0[15] - t0;
+
+ sb0[31] = v + t0; /* A0 */
+ sb0[30] = u + s0; /* A1 */
+ sb0[15] = u - s0; /* A2 */
+ sb0[14] = v - t0; /* A3 */
+
+ u = shft4(s1 - t1);
+ v = shft4(s1 + t1);
+ t1 = sb1[14];
+ s1 = sb1[15] - t1;
+
+ sb1[31] = v + t1; /* A0 */
+ sb1[30] = u + s1; /* A1 */
+ sb1[15] = u - s1; /* A2 */
+ sb1[14] = v - t1; /* A3 */
+ }
+#else
+ int ch, s, t, *a;
-void mdct_sub_int(int sb_sample[2][3][18][SBLIMIT], int (*mdct_freq)[2][samp_per_frame2])
-{
- int (*mdct_enc)[2][32][18] = (int (*)[2][32][18]) mdct_freq;
- int ch, gr, band, k, bu, bd;
-
- for(gr=0; gr<2; gr++)
- for(ch=config.wave.channels; ch--; )
+ for(ch=0; ch<cfg.channels; ch++)
+ {
+ a = ch ? sb1 : sb0;
+ for(k=0; k<18; k++, wk+=64, a+=SBLIMIT)
{
- /* 576=4*16*9: Compensate for inversion in the analysis filter */
- for(band=33; (band-=2)>0; )
- for(k=19; (k-=2)>0; )
- sb_sample[ch][gr+1][k][band] = -sb_sample[ch][gr+1][k][band];
+ wp = enwindow;
+ x1 = wk;
+ x2 = x1 - 124;
- /* 82944=4*32*648: Perform imdct of 18 previous subband samples + 18 current subband samples */
- for(band=32; band--; )
+ /* x1[-572] .... x1[448] = 1022 */
+ /* 18*4*16*32 */
+ for(i=-15; i<0; i++)
{
- for(k=18; k--; )
- {
- mdct_in[k] = sb_sample[ch][ gr ][k][band];
- mdct_in[k+18] = sb_sample[ch][gr+1][k][band];
- }
-
- mdct_int(mdct_in, &mdct_enc[gr][ch][band][0]);
+ s = (int)x2[-224*2] * wp[ 0]; t = (int)x1[ 224*2] * wp[ 0];
+ s += (int)x2[-160*2] * wp[ 1]; t += (int)x1[ 160*2] * wp[ 1];
+ s += (int)x2[- 96*2] * wp[ 2]; t += (int)x1[ 96*2] * wp[ 2];
+ s += (int)x2[- 32*2] * wp[ 3]; t += (int)x1[ 32*2] * wp[ 3];
+ s += (int)x2[ 32*2] * wp[ 4]; t += (int)x1[- 32*2] * wp[ 4];
+ s += (int)x2[ 96*2] * wp[ 5]; t += (int)x1[- 96*2] * wp[ 5];
+ s += (int)x2[ 160*2] * wp[ 6]; t += (int)x1[-160*2] * wp[ 6];
+ s += (int)x2[ 224*2] * wp[ 7]; t += (int)x1[-224*2] * wp[ 7];
+ s += (int)x1[-256*2] * wp[ 8]; t += (int)x2[ 256*2] * wp[16];
+ s += (int)x1[-192*2] * wp[ 9]; t += (int)x2[ 192*2] * wp[17];
+ s += (int)x1[-128*2] * wp[10]; t += (int)x2[ 128*2] * wp[18];
+ s += (int)x1[- 64*2] * wp[11]; t += (int)x2[ 64*2] * wp[19];
+ s += (int)x1[ 0*2] * wp[12]; t += (int)x2[ 0*2] * wp[20];
+ s += (int)x1[ 64*2] * wp[13]; t += (int)x2[- 64*2] * wp[21];
+ s += (int)x1[ 128*2] * wp[14]; t += (int)x2[-128*2] * wp[22];
+ s += (int)x1[ 192*2] * wp[15]; t += (int)x2[-192*2] * wp[23];
+
+ a[30+i*2] = shft4(t) + shft13(s) * wp[24];
+ a[31+i*2] = shft13(t) * wp[25] - shft13(s) * wp[26];
+ wp += 27;
+ x1 -= 2;
+ x2 += 2;
}
- /* 1024=4*256: Perform aliasing reduction butterfly*/
- for(band=31; band--; )
- for(k=8; k--; )
- {
- bu = mdct_enc[gr][ch][band][17-k] * cs_int[k] + mdct_enc[gr][ch][band+1][k] * ca_int[k];
- bd = mdct_enc[gr][ch][band+1][k] * cs_int[k] - mdct_enc[gr][ch][band][17-k] * ca_int[k];
- mdct_enc[gr][ch][band][17-k] = (bu + 16384) >> 15;
- mdct_enc[gr][ch][band+1][k] = (bd + 16384) >> 15;
- }
+ t = (int)x1[- 16*2] * wp[ 8]; s = (int)x1[ -32*2] * wp[0];
+ t += ((int)x1[- 48*2]-x1[ 16*2]) * wp[10]; s += (int)x1[ -96*2] * wp[1];
+ t += ((int)x1[- 80*2]+x1[ 48*2]) * wp[12]; s += (int)x1[-160*2] * wp[2];
+ t += ((int)x1[-112*2]-x1[ 80*2]) * wp[14]; s += (int)x1[-224*2] * wp[3];
+ t += ((int)x1[-144*2]+x1[112*2]) * wp[16]; s += (int)x1[ 32*2] * wp[4];
+ t += ((int)x1[-176*2]-x1[144*2]) * wp[18]; s += (int)x1[ 96*2] * wp[5];
+ t += ((int)x1[-208*2]+x1[176*2]) * wp[20]; s += (int)x1[ 160*2] * wp[6];
+ t += ((int)x1[-240*2]-x1[208*2]) * wp[22]; s += (int)x1[ 224*2] * wp[7];
+
+ u = shft4(s - t);
+ v = shft4(s + t);
+ t = a[14];
+ s = a[15] - t;
+
+ a[31] = v + t; /* A0 */
+ a[30] = u + s; /* A1 */
+ a[15] = u - s; /* A2 */
+ a[14] = v - t; /* A3 */
}
+ wk -= 18 * 64 - 1; /* rewind wk (to next channel start) */
+ }
+#endif
+}
- /* Save latest granule's subband samples to be used in the next mdct call */
- for(ch=config.wave.channels ;ch--; )
- memcpy(sb_sample[ch][0], sb_sample[ch][2], 18 * 32 * sizeof(int));
+void window_subband2(short *x1, int a[SBLIMIT]) ICODE_ATTR;
+void window_subband2(short *x1, int a[SBLIMIT])
+{
+ int xr;
+ short *wp = enwindow;
+ short *x2 = x1 - 124;
+
+ wp += 27 * 15;
+ x1 -= 2 * 15;
+ x2 += 2 * 15;
+
+ xr = a[28] - a[0]; a[0] += a[28]; a[28] = shft9(xr) * wp[-2*27+25];
+ xr = a[29] - a[1]; a[1] += a[29]; a[29] = shft9(xr) * wp[-2*27+25];
+ xr = a[26] - a[2]; a[2] += a[26]; a[26] = shft9(xr) * wp[-4*27+25];
+ xr = a[27] - a[3]; a[3] += a[27]; a[27] = shft9(xr) * wp[-4*27+25];
+ xr = a[24] - a[4]; a[4] += a[24]; a[24] = shft9(xr) * wp[-6*27+25];
+ xr = a[25] - a[5]; a[5] += a[25]; a[25] = shft9(xr) * wp[-6*27+25];
+ xr = a[22] - a[6]; a[6] += a[22]; a[22] = shft9(xr) * SQRT ;
+ xr = a[23] - a[7]; a[7] += a[23]; a[23] = shft9(xr) * SQRT - a[7];
+ a[ 7] -= a[ 6];
+ a[22] -= a[ 7];
+ a[23] -= a[22];
+
+ xr = a[ 6]; a[ 6] = a[31] - xr; a[31] = a[31] + xr;
+ xr = a[ 7]; a[ 7] = a[30] - xr; a[30] = a[30] + xr;
+ xr = a[22]; a[22] = a[15] - xr; a[15] = a[15] + xr;
+ xr = a[23]; a[23] = a[14] - xr; a[14] = a[14] + xr;
+
+ xr = a[20] - a[ 8]; a[ 8] += a[20]; a[20] = shft9(xr) * wp[-10*27+25];
+ xr = a[21] - a[ 9]; a[ 9] += a[21]; a[21] = shft9(xr) * wp[-10*27+25];
+ xr = a[18] - a[10]; a[10] += a[18]; a[18] = shft9(xr) * wp[-12*27+25];
+ xr = a[19] - a[11]; a[11] += a[19]; a[19] = shft9(xr) * wp[-12*27+25];
+ xr = a[16] - a[12]; a[12] += a[16]; a[16] = shft9(xr) * wp[-14*27+25];
+ xr = a[17] - a[13]; a[13] += a[17]; a[17] = shft9(xr) * wp[-14*27+25];
+ xr =-a[20] + a[24]; a[20] += a[24]; a[24] = shft9(xr) * wp[-12*27+25];
+ xr =-a[21] + a[25]; a[21] += a[25]; a[25] = shft9(xr) * wp[-12*27+25];
+ xr = a[ 4] - a[ 8]; a[ 4] += a[ 8]; a[ 8] = shft9(xr) * wp[-12*27+25];
+ xr = a[ 5] - a[ 9]; a[ 5] += a[ 9]; a[ 9] = shft9(xr) * wp[-12*27+25];
+ xr = a[ 0] - a[12]; a[ 0] += a[12]; a[12] = shft9(xr) * wp[ -4*27+25];
+ xr = a[ 1] - a[13]; a[ 1] += a[13]; a[13] = shft9(xr) * wp[ -4*27+25];
+ xr = a[16] - a[28]; a[16] += a[28]; a[28] = shft9(xr) * wp[ -4*27+25];
+ xr =-a[17] + a[29]; a[17] += a[29]; a[29] = shft9(xr) * wp[ -4*27+25];
+
+ xr = SQRT * shft9(a[ 2] - a[10]); a[ 2] += a[10]; a[10] = xr;
+ xr = SQRT * shft9(a[ 3] - a[11]); a[ 3] += a[11]; a[11] = xr;
+ xr = SQRT * shft9(a[26] - a[18]); a[18] += a[26]; a[26] = xr - a[18];
+ xr = SQRT * shft9(a[27] - a[19]); a[19] += a[27]; a[27] = xr - a[19];
+
+ xr = a[ 2]; a[19] -= a[ 3]; a[ 3] -= xr; a[ 2] = a[31] - xr; a[31] += xr;
+ xr = a[ 3]; a[11] -= a[19]; a[18] -= xr; a[ 3] = a[30] - xr; a[30] += xr;
+ xr = a[18]; a[27] -= a[11]; a[19] -= xr; a[18] = a[15] - xr; a[15] += xr;
+
+ xr = a[19]; a[10] -= xr; a[19] = a[14] - xr; a[14] += xr;
+ xr = a[10]; a[11] -= xr; a[10] = a[23] - xr; a[23] += xr;
+ xr = a[11]; a[26] -= xr; a[11] = a[22] - xr; a[22] += xr;
+ xr = a[26]; a[27] -= xr; a[26] = a[ 7] - xr; a[ 7] += xr;
+
+ xr = a[27]; a[27] = a[6] - xr; a[6] += xr;
+
+ xr = SQRT * shft9(a[ 0] - a[ 4]); a[ 0] += a[ 4]; a[ 4] = xr;
+ xr = SQRT * shft9(a[ 1] - a[ 5]); a[ 1] += a[ 5]; a[ 5] = xr;
+ xr = SQRT * shft9(a[16] - a[20]); a[16] += a[20]; a[20] = xr;
+ xr = SQRT * shft9(a[17] - a[21]); a[17] += a[21]; a[21] = xr;
+ xr =-SQRT * shft9(a[ 8] - a[12]); a[ 8] += a[12]; a[12] = xr - a[ 8];
+ xr =-SQRT * shft9(a[ 9] - a[13]); a[ 9] += a[13]; a[13] = xr - a[ 9];
+ xr =-SQRT * shft9(a[25] - a[29]); a[25] += a[29]; a[29] = xr - a[25];
+ xr =-SQRT * shft9(a[24] + a[28]); a[24] -= a[28]; a[28] = xr - a[24];
+
+ xr = a[24] - a[16]; a[24] = xr;
+ xr = a[20] - xr; a[20] = xr;
+ xr = a[28] - xr; a[28] = xr;
+
+ xr = a[25] - a[17]; a[25] = xr;
+ xr = a[21] - xr; a[21] = xr;
+ xr = a[29] - xr; a[29] = xr;
+
+ xr = a[17] - a[1]; a[17] = xr;
+ xr = a[ 9] - xr; a[ 9] = xr;
+ xr = a[25] - xr; a[25] = xr;
+ xr = a[ 5] - xr; a[ 5] = xr;
+ xr = a[21] - xr; a[21] = xr;
+ xr = a[13] - xr; a[13] = xr;
+ xr = a[29] - xr; a[29] = xr;
+
+ xr = a[ 1] - a[0]; a[ 1] = xr;
+ xr = a[16] - xr; a[16] = xr;
+ xr = a[17] - xr; a[17] = xr;
+ xr = a[ 8] - xr; a[ 8] = xr;
+ xr = a[ 9] - xr; a[ 9] = xr;
+ xr = a[24] - xr; a[24] = xr;
+ xr = a[25] - xr; a[25] = xr;
+ xr = a[ 4] - xr; a[ 4] = xr;
+ xr = a[ 5] - xr; a[ 5] = xr;
+ xr = a[20] - xr; a[20] = xr;
+ xr = a[21] - xr; a[21] = xr;
+ xr = a[12] - xr; a[12] = xr;
+ xr = a[13] - xr; a[13] = xr;
+ xr = a[28] - xr; a[28] = xr;
+ xr = a[29] - xr; a[29] = xr;
+
+ xr = a[ 0]; a[ 0] += a[31]; a[31] -= xr;
+ xr = a[ 1]; a[ 1] += a[30]; a[30] -= xr;
+ xr = a[16]; a[16] += a[15]; a[15] -= xr;
+ xr = a[17]; a[17] += a[14]; a[14] -= xr;
+ xr = a[ 8]; a[ 8] += a[23]; a[23] -= xr;
+ xr = a[ 9]; a[ 9] += a[22]; a[22] -= xr;
+ xr = a[24]; a[24] += a[ 7]; a[ 7] -= xr;
+ xr = a[25]; a[25] += a[ 6]; a[ 6] -= xr;
+ xr = a[ 4]; a[ 4] += a[27]; a[27] -= xr;
+ xr = a[ 5]; a[ 5] += a[26]; a[26] -= xr;
+ xr = a[20]; a[20] += a[11]; a[11] -= xr;
+ xr = a[21]; a[21] += a[10]; a[10] -= xr;
+ xr = a[12]; a[12] += a[19]; a[19] -= xr;
+ xr = a[13]; a[13] += a[18]; a[18] -= xr;
+ xr = a[28]; a[28] += a[ 3]; a[ 3] -= xr;
+ xr = a[29]; a[29] += a[ 2]; a[ 2] -= xr;
}
-void filter_subband(short *buffer, int s[SBLIMIT], int k)
+void mdct_long(int *out, int *in) ICODE_ATTR;
+void mdct_long(int *out, int *in)
{
- short *enwindow = enwindow_int;
- int i, j, tmp = 0;
-#ifdef CPU_COLDFIRE
- int reg_buff[14]; /* register storage buffer */
-#endif
+ int ct,st;
+ int tc1, tc2, tc3, tc4, ts5, ts6, ts7, ts8;
+ int ts1, ts2, ts3, ts4, tc5, tc6, tc7, tc8;
+
+ /* 1,2, 5,6, 9,10, 13,14, 17 */
+ tc1 = in[17] - in[ 9];
+ tc3 = in[15] - in[11];
+ tc4 = in[14] - in[12];
+ ts5 = in[ 0] + in[ 8];
+ ts6 = in[ 1] + in[ 7];
+ ts7 = in[ 2] + in[ 6];
+ ts8 = in[ 3] + in[ 5];
+
+ out[17] = (ts5 + ts7 - ts8) * cx[8] - (ts6 - in[4]) * cx[8];
+ st = (ts5 + ts7 - ts8) * cx[7] + (ts6 - in[4]) * cx[8];
+ ct = (tc1 - tc3 - tc4) * cx[6];
+ out[5] = ct + st;
+ out[6] = ct - st;
+
+ tc2 = (in[16] - in[10]) * cx[6];
+ ts6 = ts6 * cx[7] + in[4] * cx[8];
- /* replace 32 oldest samples with 32 new samples */
- /* 2304=72*32: PCM Samples are little-endian, swap if necessary */
- if(config.byte_order == order_bigEndian)
- {
- for(i=32; i--; )
- {
- j = *(unsigned short*)(buffer+=2);
- x_int[k][i+off[k]] = (short)((j >> 8) | (j << 8));
- }
- }
- else
- {
- for(i=32; i--; )
- x_int[k][i+off[k]] = (short)*(buffer+=2);
- }
+ ct = tc1 * cx[0] + tc2 + tc3 * cx[1] + tc4 * cx[2];
+ st = -ts5 * cx[4] + ts6 - ts7 * cx[5] + ts8 * cx[3];
+ out[1] = ct + st;
+ out[2] = ct - st;
+
+ ct = tc1 * cx[1] - tc2 - tc3 * cx[2] + tc4 * cx[0];
+ st = -ts5 * cx[5] + ts6 - ts7 * cx[3] + ts8 * cx[4];
+ out[ 9] = ct + st;
+ out[10] = ct - st;
+
+ ct = tc1 * cx[2] - tc2 + tc3 * cx[0] - tc4 * cx[1];
+ st = ts5 * cx[3] - ts6 + ts7 * cx[4] - ts8 * cx[5];
+ out[13] = ct + st;
+ out[14] = ct - st;
+
+ ts1 = in[ 8] - in[ 0];
+ ts3 = in[ 6] - in[ 2];
+ ts4 = in[ 5] - in[ 3];
+ tc5 = in[17] + in[ 9];
+ tc6 = in[16] + in[10];
+ tc7 = in[15] + in[11];
+ tc8 = in[14] + in[12];
+
+ out[0] = (tc5 + tc7 + tc8) * cx[8] + (tc6 + in[13]) * cx[8];
+ ct = (tc5 + tc7 + tc8) * cx[7] - (tc6 + in[13]) * cx[8];
+ st = (ts1 - ts3 + ts4) * cx[6];
+ out[11] = ct + st;
+ out[12] = ct - st;
+
+ ts2 = (in[7] - in[1]) * cx[6];
+ tc6 = in[13] * cx[8] - tc6 * cx[7];
+
+ ct = tc5 * cx[3] - tc6 + tc7 * cx[4] + tc8 * cx[5];
+ st = ts1 * cx[2] + ts2 + ts3 * cx[0] + ts4 * cx[1];
+ out[3] = ct + st;
+ out[4] = ct - st;
+
+ ct =-tc5 * cx[5] + tc6 - tc7 * cx[3] - tc8 * cx[4];
+ st = ts1 * cx[1] + ts2 - ts3 * cx[2] - ts4 * cx[0];
+ out[7] = ct + st;
+ out[8] = ct - st;
+
+ ct =-tc5 * cx[4] + tc6 - tc7 * cx[5] - tc8 * cx[3];
+ st = ts1 * cx[0] - ts2 + ts3 * cx[1] - ts4 * cx[2];
+ out[15] = ct + st;
+ out[16] = ct - st;
+}
- /* 36864=72*512: shift samples into proper window positions */
-#ifdef CPU_COLDFIRE
- { short *xint = &x_int[k][off[k]];
- short *yint = y_int;
+static int find_bitrate_index(int type, int bitrate)
+{
+ int i;
- asm volatile ("movem.l %%d0/%%d2-%%d7/%%a2-%%a7,(%0)\n" : : "a" (reg_buff) : "d0");
- asm volatile(
- "moveq.l #32, %%d0\n"
- "move.l %%d0, %%acc2\n" /* set loop counter */
- "move.l %[xint], %%d0\n" /* d0 = x_int[k] */
- "or.l #0x3ff, %%d0\n"
- "move.l %%d0, %%mask\n" /* set address mask */
- "move.l (%[xint]), %%d4\n" /* d4 = x_int[k][off[k]] */
-
- "loop_start:\n"
- "movem.l (%[enwindow]), %%d0-%%d3\n" /* load 4 values */
- "mac.w %%d0u, %%d4u, (0x080,%[xint])&, %%d5, %%acc0\n"
- "mac.w %%d0l, %%d5u, (0x100,%[xint])&, %%d6, %%acc0\n"
- "mac.w %%d1u, %%d6u, (0x180,%[xint])&, %%d7, %%acc0\n"
- "mac.w %%d1l, %%d7u, (0x200,%[xint])&, %%a2, %%acc0\n"
- "mac.w %%d2u, %%a2u, (0x280,%[xint])&, %%a3, %%acc0\n"
- "mac.w %%d2l, %%a3u, (0x300,%[xint])&, %%a4, %%acc0\n"
- "mac.w %%d3u, %%a4u, (0x380,%[xint])&, %%a5, %%acc0\n"
- "mac.w %%d3l, %%a5u, %%acc0\n"
-
- "movem.l (16,%[enwindow]), %%d0-%%d3\n" /* load 8 values */
- "mac.w %%d0u, %%d4l, %%acc1\n"
- "mac.w %%d0l, %%d5l, %%acc1\n"
- "mac.w %%d1u, %%d6l, %%acc1\n"
- "mac.w %%d1l, %%d7l, %%acc1\n"
- "mac.w %%d2u, %%a2l, %%acc1\n"
- "mac.w %%d2l, %%a3l, %%acc1\n"
- "mac.w %%d3u, %%a4l, %%acc1\n"
- "addq.l #4, %[xint]\n" /* xint += 2 */
- "mac.w %%d3l, %%a5l, (%[xint])&, %%d4, %%acc1\n"
-
- "movclr.l %%acc0, %%d5\n"
- "movclr.l %%acc1, %%d6\n"
- "move.l #262144, %%d7\n"
- "add.l %%d7, %%d5\n"
- "add.l %%d7, %%d6\n"
- "moveq.l #19, %%d7\n"
- "asr.l %%d7, %%d5\n"
- "asr.l %%d7, %%d6\n"
- "move.w %%d5, (%[yint])+\n"
- "move.w %%d6, (%[yint])+\n"
-
- "add.l #32, %[enwindow]\n" /* enwindow += 16 */
-
- "moveq.l #1, %%d0\n"
- "msac.l %%d0, %%d0, %%acc2\n"
- "move.l %%acc2, %%d0\n"
- "tst.b %%d0\n"
- "jbne loop_start\n"
-
- : [xint] "+a" (xint), [yint] "+a" (yint)
- : [enwindow] "a" (enwindow)
- : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "a2", "a3", "a4", "a5");
-
- asm volatile ("movem.l (%0),%%d0/%%d2-%%d7/%%a2-%%a7\n" : : "a" (reg_buff) : "d0");
- }
-#else
- for(i=0; i<64; i++)
- {
- for(j=0, tmp=0; j<512; j+=64)
- tmp += (int)x_int[k][(i+0+j+off[k])&(HAN_SIZE-1)] * (int)*(enwindow++);
- y_int[i] = (short)((tmp + (1<<18)) >> 19);
- }
-#endif
-
- /* 147456=72*2048 */
- for(i=SBLIMIT; i--; ) /* SBLIMIT: 32 */
- {
- short *filt = filter_int[i];
+ for(i=0;i<14;i++)
+ if(bitrate == bitr_index[type][i])
+ break;
-#ifdef CPU_COLDFIRE
- {
- asm volatile(
- "move.l (%[yint])+, %%a5\n"
- "movem.l (%[filt]), %%d0-%%d7\n"
- "mac.w %%d0u, %%a5u, %%acc0\n"
- "mac.w %%d0l, %%a5l, (%[yint])+, %%a5, %%acc0\n"
- "mac.w %%d1u, %%a5u, %%acc0\n"
- "mac.w %%d1l, %%a5l, (%[yint])+, %%a5, %%acc0\n"
- "mac.w %%d2u, %%a5u, %%acc0\n"
- "mac.w %%d2l, %%a5l, (%[yint])+, %%a5, %%acc0\n"
- "mac.w %%d3u, %%a5u, %%acc0\n"
- "mac.w %%d3l, %%a5l, (%[yint])+, %%a5, %%acc0\n"
- "mac.w %%d4u, %%a5u, %%acc0\n"
- "mac.w %%d4l, %%a5l, (%[yint])+, %%a5, %%acc0\n"
- "mac.w %%d5u, %%a5u, %%acc0\n"
- "mac.w %%d5l, %%a5l, (%[yint])+, %%a5, %%acc0\n"
- "mac.w %%d6u, %%a5u, %%acc0\n"
- "mac.w %%d6l, %%a5l, (%[yint])+, %%a5, %%acc0\n"
- "mac.w %%d7u, %%a5u, %%acc0\n"
- "mac.w %%d7l, %%a5l, (%[yint])+, %%a5, %%acc0\n"
- "movem.l (32,%[filt]), %%d0-%%d7\n"
- "mac.w %%d0u, %%a5u, %%acc0\n"
- "mac.w %%d0l, %%a5l, (%[yint])+, %%a5, %%acc0\n"
- "mac.w %%d1u, %%a5u, %%acc0\n"
- "mac.w %%d1l, %%a5l, (%[yint])+, %%a5, %%acc0\n"
- "mac.w %%d2u, %%a5u, %%acc0\n"
- "mac.w %%d2l, %%a5l, (%[yint])+, %%a5, %%acc0\n"
- "mac.w %%d3u, %%a5u, %%acc0\n"
- "mac.w %%d3l, %%a5l, (%[yint])+, %%a5, %%acc0\n"
- "mac.w %%d4u, %%a5u, %%acc0\n"
- "mac.w %%d4l, %%a5l, (%[yint])+, %%a5, %%acc0\n"
- "mac.w %%d5u, %%a5u, %%acc0\n"
- "mac.w %%d5l, %%a5l, (%[yint])+, %%a5, %%acc0\n"
- "mac.w %%d6u, %%a5u, %%acc0\n"
- "mac.w %%d6l, %%a5l, (%[yint])+, %%a5, %%acc0\n"
- "mac.w %%d7u, %%a5u, %%acc0\n"
- "mac.w %%d7l, %%a5l, (%[yint])+, %%a5, %%acc0\n"
- "movem.l (64,%[filt]), %%d0-%%d7\n"
- "mac.w %%d0u, %%a5u, %%acc0\n"
- "mac.w %%d0l, %%a5l, (%[yint])+, %%a5, %%acc0\n"
- "mac.w %%d1u, %%a5u, %%acc0\n"
- "mac.w %%d1l, %%a5l, (%[yint])+, %%a5, %%acc0\n"
- "mac.w %%d2u, %%a5u, %%acc0\n"
- "mac.w %%d2l, %%a5l, (%[yint])+, %%a5, %%acc0\n"
- "mac.w %%d3u, %%a5u, %%acc0\n"
- "mac.w %%d3l, %%a5l, (%[yint])+, %%a5, %%acc0\n"
- "mac.w %%d4u, %%a5u, %%acc0\n"
- "mac.w %%d4l, %%a5l, (%[yint])+, %%a5, %%acc0\n"
- "mac.w %%d5u, %%a5u, %%acc0\n"
- "mac.w %%d5l, %%a5l, (%[yint])+, %%a5, %%acc0\n"
- "mac.w %%d6u, %%a5u, %%acc0\n"
- "mac.w %%d6l, %%a5l, (%[yint])+, %%a5, %%acc0\n"
- "mac.w %%d7u, %%a5u, %%acc0\n"
- "mac.w %%d7l, %%a5l, (%[yint])+, %%a5, %%acc0\n"
- "movem.l (96,%[filt]), %%d0-%%d7\n"
- "mac.w %%d0u, %%a5u, %%acc0\n"
- "mac.w %%d0l, %%a5l, (%[yint])+, %%a5, %%acc0\n"
- "mac.w %%d1u, %%a5u, %%acc0\n"
- "mac.w %%d1l, %%a5l, (%[yint])+, %%a5, %%acc0\n"
- "mac.w %%d2u, %%a5u, %%acc0\n"
- "mac.w %%d2l, %%a5l, (%[yint])+, %%a5, %%acc0\n"
- "mac.w %%d3u, %%a5u, %%acc0\n"
- "mac.w %%d3l, %%a5l, (%[yint])+, %%a5, %%acc0\n"
- "mac.w %%d4u, %%a5u, %%acc0\n"
- "mac.w %%d4l, %%a5l, (%[yint])+, %%a5, %%acc0\n"
- "mac.w %%d5u, %%a5u, %%acc0\n"
- "mac.w %%d5l, %%a5l, (%[yint])+, %%a5, %%acc0\n"
- "mac.w %%d6u, %%a5u, %%acc0\n"
- "mac.w %%d6l, %%a5l, (%[yint]), %%a5, %%acc0\n"
- "mac.w %%d7u, %%a5u, %%acc0\n"
- "mac.w %%d7l, %%a5l, %%acc0\n"
- "lea.l (-31*4, %[yint]), %[yint]\n" /* wrap yint back to start */
- "movclr.l %%acc0, %[tmp]"
- : [tmp] "=r" (tmp) : [filt] "a" (filt), [yint] "a" (y_int)
- : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "a5" );
- }
-#else
- for(j=64, tmp=0; j--; )
- tmp += (long)filt[j] * (long)y_int[j];
-#endif
- s[i] = (tmp + 16384) >> 15;
- }
+ return i;
+}
+
+static int find_samplerate_index(long freq, int *mp3_type)
+{ /* MPEG 2 */ /* MPEG 1 */
+ static long mpeg[2][3] = { {22050, 24000, 16000}, {44100, 48000, 32000} };
+ int mpg, rate;
+
+ /* set default values: MPEG1 at 44100/s */
+ *mp3_type = 1;
+
+ for(mpg=0; mpg<2; mpg++)
+ for(rate=0; rate<3; rate++)
+ if(freq == mpeg[mpg][rate])
+ { *mp3_type = mpg; return rate; }
- off[k] = (off[k] + 480) & (HAN_SIZE-1); /* offset is modulo HAN_SIZE */
+ return 0;
}
-void compress(void)
+void init_mp3_encoder_engine(bool stereo, int bitrate, int sample_rate)
{
- int channel;
- int i;
- char stg[20];
- int gr;
- side_info_t cod_info[2][2];
- short *buffer_window[2];
- unsigned long avg_slots_per_frame;
- long frac_slots_per_frame;
- long whole_slots_per_frame;
- long slot_lag;
- int mean_bits;
- int sideinfo_len;
-
- open_bitstream(config.outfile);
-
- memset(cod_info , 0 , sizeof(cod_info ));
- memset(x_int0 , 0 , sizeof(x_int0 ));
- memset(x_int1 , 0 , sizeof(x_int1 ));
- memset(y_int , 0 , sizeof(y_int ));
- memset(mdct_freq , 0 , sizeof(mdct_freq ));
- memset(enc_data , 0 , sizeof(enc_data ));
- memset(off , 0 , sizeof(off ));
- memset(mdct_in , 0 , sizeof(mdct_in ));
- memset(sb_sample , 0 , sizeof(sb_sample ));
- memset(&CodedData , 0 , sizeof(CodedData ));
- memcpy(scalefac_long, sfBandIndex[config.mpeg.samplerate_index + (config.mpeg.type * 3)], sizeof(scalefac_long));
- memcpy(ca_int , ca_int_const , sizeof(ca_int ));
- memcpy(cs_int , cs_int_const , sizeof(cs_int ));
- memcpy(win_int , win_int_const , sizeof(win_int ));
- memcpy(filter_int , filter_int_const , sizeof(filter_int ));
- memcpy(enwindow_int, enwindow_int_const, sizeof(enwindow_int));
- memcpy(int2idx , int2idx_const , sizeof(int2idx ));
- memcpy(ht_count1 , ht_count1_const , sizeof(ht_count1 ));
- memcpy( t1HB , t1HB_const , sizeof(t1HB ));
- memcpy( t2HB , t2HB_const , sizeof(t2HB ));
- memcpy( t3HB , t3HB_const , sizeof(t3HB ));
- memcpy( t5HB , t5HB_const , sizeof(t5HB ));
- memcpy( t6HB , t6HB_const , sizeof(t6HB ));
- memcpy( t7HB , t7HB_const , sizeof(t7HB ));
- memcpy( t8HB , t8HB_const , sizeof(t8HB ));
- memcpy( t9HB , t9HB_const , sizeof(t9HB ));
- memcpy(t10HB , t10HB_const , sizeof(t10HB ));
- memcpy(t11HB , t11HB_const , sizeof(t11HB ));
- memcpy(t12HB , t12HB_const , sizeof(t12HB ));
- memcpy(t13HB , t13HB_const , sizeof(t13HB ));
- memcpy(t15HB , t15HB_const , sizeof(t15HB ));
- memcpy(t16HB , t16HB_const , sizeof(t16HB ));
- memcpy(t24HB , t24HB_const , sizeof(t24HB ));
- memcpy( t1l , t1l_const , sizeof(t1l ));
- memcpy( t2l , t2l_const , sizeof(t2l ));
- memcpy( t3l , t3l_const , sizeof(t3l ));
- memcpy( t5l , t5l_const , sizeof(t5l ));
- memcpy( t6l , t6l_const , sizeof(t6l ));
- memcpy( t7l , t7l_const , sizeof(t7l ));
- memcpy( t8l , t8l_const , sizeof(t8l ));
- memcpy( t9l , t9l_const , sizeof(t9l ));
- memcpy(t10l , t10l_const , sizeof(t10l ));
- memcpy(t11l , t11l_const , sizeof(t11l ));
- memcpy(t12l , t12l_const , sizeof(t12l ));
- memcpy(t13l , t13l_const , sizeof(t13l ));
- memcpy(t15l , t15l_const , sizeof(t15l ));
- memcpy(t16l , t16l_const , sizeof(t16l ));
- memcpy(t24l , t24l_const , sizeof(t24l ));
- memcpy(ht , ht_const , sizeof(ht ));
-
- /* I don't know, wether this is really necessary */
- ht[ 0].table = NULL; ht[ 0].hlen = NULL;/* Apparently not used */
+ uint32 avg_byte_per_frame;
+
+#ifdef ROCKBOX_LITTLE_ENDIAN
+ cfg.byte_order = order_littleEndian;
+#else
+ cfg.byte_order = order_bigEndian;
+#endif
+
+ if(bitrate < 96 && stereo && sample_rate >= 32000)
+ { /* use MPEG2 format */
+ sample_rate >>= 1;
+ cfg.resample = 1;
+ cfg.granules = 1;
+ }
+ else
+ { /* use MPEG1 format */
+ cfg.resample = 0;
+ cfg.granules = 2;
+ }
+
+ cfg.samplerate = sample_rate;
+ cfg.channels = stereo ? 2 : 1;
+ cfg.mpg.mode = stereo ? 0 : 3; /* 0=stereo, 3=mono */
+ cfg.mpg.bitrate = stereo ? bitrate : bitrate > 160 ? 160 : bitrate;
+ cfg.mpg.smpl_id = find_samplerate_index(cfg.samplerate, &cfg.mpg.type);
+ cfg.mpg.bitr_id = find_bitrate_index(cfg.mpg.type, cfg.mpg.bitrate);
+ cfg.mpg.num_bands = num_bands[stereo ? cfg.mpg.type : 2][cfg.mpg.bitr_id];
+
+ memcpy(scalefac, sfBand[cfg.mpg.smpl_id + 3*cfg.mpg.type], sizeof(scalefac));
+ memset(mfbuf , 0 , sizeof(mfbuf ));
+ memset(mdct_freq , 0 , sizeof(mdct_freq ));
+ memset(enc_data , 0 , sizeof(enc_data ));
+ memset(sb_data , 0 , sizeof(sb_data ));
+ memset(&CodedData, 0 , sizeof(CodedData ));
+ memcpy(ca , ca_const , sizeof(ca ));
+ memcpy(cs , cs_const , sizeof(cs ));
+ memcpy(cx , cx_const , sizeof(cx ));
+ memcpy(win , win_const , sizeof(win ));
+ memcpy(enwindow , enwindow_const , sizeof(enwindow ));
+ memcpy(int2idx , int2idx_const , sizeof(int2idx ));
+ memcpy(ht_count , ht_count_const , sizeof(ht_count ));
+ memcpy( tab01 , tab01_const , sizeof(tab01 ));
+ memcpy( tab23 , tab23_const , sizeof(tab23 ));
+ memcpy( tab56 , tab56_const , sizeof(tab56 ));
+ memcpy( tab1315 , tab1315_const , sizeof(tab1315 ));
+ memcpy( tab1624 , tab1624_const , sizeof(tab1624 ));
+ memcpy( tab789 , tab789_const , sizeof(tab789 ));
+ memcpy( tabABC , tabABC_const , sizeof(tabABC ));
+ memcpy( t1HB , t1HB_const , sizeof(t1HB ));
+ memcpy( t2HB , t2HB_const , sizeof(t2HB ));
+ memcpy( t3HB , t3HB_const , sizeof(t3HB ));
+ memcpy( t5HB , t5HB_const , sizeof(t5HB ));
+ memcpy( t6HB , t6HB_const , sizeof(t6HB ));
+ memcpy( t7HB , t7HB_const , sizeof(t7HB ));
+ memcpy( t8HB , t8HB_const , sizeof(t8HB ));
+ memcpy( t9HB , t9HB_const , sizeof(t9HB ));
+ memcpy(t10HB , t10HB_const , sizeof(t10HB ));
+ memcpy(t11HB , t11HB_const , sizeof(t11HB ));
+ memcpy(t12HB , t12HB_const , sizeof(t12HB ));
+ memcpy(t13HB , t13HB_const , sizeof(t13HB ));
+ memcpy(t15HB , t15HB_const , sizeof(t15HB ));
+ memcpy(t16HB , t16HB_const , sizeof(t16HB ));
+ memcpy(t24HB , t24HB_const , sizeof(t24HB ));
+ memcpy( t1l , t1l_const , sizeof(t1l ));
+ memcpy( t2l , t2l_const , sizeof(t2l ));
+ memcpy( t3l , t3l_const , sizeof(t3l ));
+ memcpy( t5l , t5l_const , sizeof(t5l ));
+ memcpy( t6l , t6l_const , sizeof(t6l ));
+ memcpy( t7l , t7l_const , sizeof(t7l ));
+ memcpy( t8l , t8l_const , sizeof(t8l ));
+ memcpy( t9l , t9l_const , sizeof(t9l ));
+ memcpy(t10l , t10l_const , sizeof(t10l ));
+ memcpy(t11l , t11l_const , sizeof(t11l ));
+ memcpy(t12l , t12l_const , sizeof(t12l ));
+ memcpy(t13l , t13l_const , sizeof(t13l ));
+ memcpy(t15l , t15l_const , sizeof(t15l ));
+ memcpy(t16l , t16l_const , sizeof(t16l ));
+ memcpy(t24l , t24l_const , sizeof(t24l ));
+ memcpy(ht , ht_const , sizeof(ht ));
+
+ ht[ 0].table = NULL; ht[ 0].hlen = NULL; /* Apparently not used */
ht[ 1].table = t1HB; ht[ 1].hlen = t1l;
ht[ 2].table = t2HB; ht[ 2].hlen = t2l;
ht[ 3].table = t3HB; ht[ 3].hlen = t3l;
- ht[ 4].table = NULL; ht[ 4].hlen = NULL;/* Apparently not used */
+ ht[ 4].table = NULL; ht[ 4].hlen = NULL; /* Apparently not used */
ht[ 5].table = t5HB; ht[ 5].hlen = t5l;
ht[ 6].table = t6HB; ht[ 6].hlen = t6l;
ht[ 7].table = t7HB; ht[ 7].hlen = t7l;
@@ -1705,126 +2088,197 @@ void compress(void)
ht[11].table = t11HB; ht[11].hlen = t11l;
ht[12].table = t12HB; ht[12].hlen = t12l;
ht[13].table = t13HB; ht[13].hlen = t13l;
- ht[14].table = NULL; ht[14].hlen = NULL;/* Apparently not used */
+ ht[14].table = NULL; ht[14].hlen = NULL; /* Apparently not used */
ht[15].table = t15HB; ht[15].hlen = t15l;
- ht[16].table = t16HB; ht[16].hlen = t16l;
- ht[17].table = t16HB; ht[17].hlen = t16l;
- ht[18].table = t16HB; ht[18].hlen = t16l;
- ht[19].table = t16HB; ht[19].hlen = t16l;
- ht[20].table = t16HB; ht[20].hlen = t16l;
- ht[21].table = t16HB; ht[21].hlen = t16l;
- ht[22].table = t16HB; ht[22].hlen = t16l;
- ht[23].table = t16HB; ht[23].hlen = t16l;
- ht[24].table = t24HB; ht[24].hlen = t24l;
- ht[25].table = t24HB; ht[25].hlen = t24l;
- ht[26].table = t24HB; ht[26].hlen = t24l;
- ht[27].table = t24HB; ht[27].hlen = t24l;
- ht[28].table = t24HB; ht[28].hlen = t24l;
- ht[29].table = t24HB; ht[29].hlen = t24l;
- ht[30].table = t24HB; ht[30].hlen = t24l;
- ht[31].table = t24HB; ht[31].hlen = t24l;
-
- x_int[0] = x_int0;
- x_int[1] = x_int1;
-#ifdef CPU_COLDFIRE
- asm volatile ("move.l #0, %macsr"); /* integer mode */
-#endif
-
-#ifndef SIMULATOR
- if(((long)x_int0 | (long)x_int1) & 0x7ff)
- return; /* both arrays must be aligned to 0x800 boundary */
-#endif
+ /* Figure average number of 'bytes' per frame */
+ avg_byte_per_frame = SAMPL2 * 16000 * cfg.mpg.bitrate / (2 - cfg.mpg.type);
+ avg_byte_per_frame = avg_byte_per_frame / cfg.samplerate;
+ cfg.byte_per_frame = avg_byte_per_frame / 64;
+ cfg.frac_per_frame = avg_byte_per_frame & 63;
+ cfg.slot_lag = 0;
+ cfg.sideinfo_len = 32 + (cfg.mpg.type ? (cfg.channels == 1 ? 136 : 256)
+ : (cfg.channels == 1 ? 72 : 136));
+}
- if(config.wave.channels == 1)
- sideinfo_len = 32 + 136;
- else
- sideinfo_len = 32 + 256;
-
- /* Set initial step size */
- cod_info[0][0].quantizerStepSize = 0x10;
- cod_info[0][1].quantizerStepSize = 0x10;
- cod_info[1][0].quantizerStepSize = 0x10;
- cod_info[1][1].quantizerStepSize = 0x10;
-
- /* Figure average number of 'slots' per frame. */
- frames_processed = 0;
- avg_slots_per_frame = (uint32)(samp_per_frame * 8000 * config.mpeg.bitr) / config.wave.samplerate;
- whole_slots_per_frame = avg_slots_per_frame / 64;
- frac_slots_per_frame = avg_slots_per_frame - 64 * whole_slots_per_frame;
- slot_lag = -frac_slots_per_frame;
- if(frac_slots_per_frame == 0)
- config.mpeg.padding = 0;
+void compress(void)
+{
+ int i, ii, gr, k, ch, shift, gr_cnt;
+ int max, min;
+ char stg[20];
while(1)
{
- rb->lcd_clear_display();
- rb->snprintf(stg, 20, "Frame %d / %d", frames_processed++, wav_size/samp_per_frame/4);
- rb->lcd_putsxy(4, 20, stg);
- rb->lcd_update();
+ if((frames & 7) == 0)
+ { rb->lcd_clear_display();
+ rb->snprintf(stg, 20, "Frame %d / %d", frames, wav_size/SAMPL2/8);
+ rb->lcd_putsxy(4, 20, stg);
+ rb->lcd_update();
+ }
+ /* encode one mp3 frame in this loop */
+ memset(CodedData.bbuf, 0, sizeof(CodedData.bbuf));
+
+ if((cfg.slot_lag += cfg.frac_per_frame) >= 64)
+ { /* Padding for this frame */
+ cfg.slot_lag -= 64;
+ cfg.mpg.padding = 1;
+ }
+ else
+ cfg.mpg.padding = 0;
- if(read_samples(buffer, samp_per_frame<<1) == 0)
- break;
+ cfg.mean_bits = (8 * cfg.byte_per_frame + 8 * cfg.mpg.padding
+ - cfg.sideinfo_len) / cfg.granules / cfg.channels;
- buffer_window[0] = &buffer[-2];
- buffer_window[1] = &buffer[-1];
+ /* shift out old samples */
+ memcpy(mfbuf, mfbuf + 2*cfg.granules*576, 4*512);
- if(frac_slots_per_frame)
- {
- if(slot_lag > frac_slots_per_frame - 64)
- { /* No padding for this frame */
- slot_lag -= frac_slots_per_frame;
- config.mpeg.padding = 0;
+ /* read new samples to iram for further processing */
+ if(read_samples((uint32*)(mfbuf + 2*512), SAMP_PER_FRAME) == 0)
+ break;
+
+ /* swap bytes if neccessary */
+ if(cfg.byte_order == order_bigEndian)
+ for(i=0; i<SAMP_PER_FRAME; i++)
+ {
+ uint32 t = ((uint32*)mfbuf)[512 + i];
+ t = ((t >> 8) & 0xff00ff) | ((t << 8) & 0xff00ff00);
+ ((uint32*)mfbuf)[512 + i] = t;
}
- else
- { /* Padding for this frame */
- slot_lag += (64 - frac_slots_per_frame);
- config.mpeg.padding = 1;
+
+ if(cfg.resample) /* downsample to half of original */
+ for(i=2*512; i<2*512+2*SAMP_PER_FRAME; i+=4)
+ {
+ mfbuf[i/2+512] = (short)(((int)mfbuf[i+0] + mfbuf[i+2]) >> 1);
+ mfbuf[i/2+513] = (short)(((int)mfbuf[i+1] + mfbuf[i+3]) >> 1);
}
- }
- config.mpeg.bits_per_frame = 8 * (whole_slots_per_frame + config.mpeg.padding);
- mean_bits = (config.mpeg.bits_per_frame - sideinfo_len) >> 1;
+ if(cfg.channels == 1) /* mix left and right channels to mono */
+ for(i=2*512; i<2*512+2*SAMP_PER_FRAME; i+=2)
+ mfbuf[i] = mfbuf[i+1] = (short)(((int)mfbuf[i] + mfbuf[i+1]) >> 1);
+
+ cfg.ResvSize = 0;
+ gr_cnt = cfg.granules * cfg.channels;
+ CodedData.bitpos = cfg.sideinfo_len; /* leave space for mp3 header */
+ for(gr=0; gr<cfg.granules; gr++)
+ {
+ short *wk = mfbuf + 2*286 + gr*1152;
+
+ /* 16bit packed wav data can be windowed efficiently on coldfire */
+ window_subband1(wk, sb_data[0][1-gr][0], sb_data[1][1-gr][0]);
+
+ for(ch=0; ch<cfg.channels; ch++)
+ {
+ int band;
+ int *mdct;
- /* polyphase filtering */
- for(gr=0; gr<2; gr++)
- for(channel=config.wave.channels; channel--; )
- for(i=0; i<18; i++)
+ wk = mfbuf + 2*286 + gr*1152 + ch;
+
+ /* 36864=4*18*16*32 */
+ for(k=0; k<18; k++, wk+=64)
{
- filter_subband(buffer_window[channel], &sb_sample[channel][gr+1][i][0], channel);
- buffer_window[channel] += 64;
+ window_subband2(wk, sb_data[ch][1-gr][k]);
+ /* Compensate for inversion in the analysis filter */
+ if(k & 1)
+ for(band=1; band<32; band+=2)
+ sb_data[ch][1-gr][k][band] *= -1;
}
- mdct_sub_int(sb_sample, mdct_freq);
- /* bit and noise allocation */
- iteration_loop(mdct_freq, cod_info, mean_bits);
- /* write the frame to the bitstream */
- format_bitstream(enc_data, cod_info, mdct_freq);
- }
- /* write last chunks to disk */
- rb->write(*mp3file, enc_buffer, enc_chunk*256*sizeof(uint32));
-}
+ /* Perform imdct of 18 previous + 18 current subband samples */
+ /* for integer precision do this loop twice (if neccessary) */
+ shift = k = 14;
+ for(ii=0; ii<2 && k; ii++)
+ {
+ mdct = mdct_freq;
+ cfg.cod_info[gr][ch].additStep = 4 * (14 - shift);
+ for(band=0; band<cfg.mpg.num_bands; band++, mdct+=18)
+ {
+ int *band0 = sb_data[ch][ gr][0] + order[band];
+ int *band1 = sb_data[ch][1-gr][0] + order[band];
+ int work[18];
+
+ /* 9216=4*32*9*8 */
+ for(k=-9; k<0; k++)
+ {
+ int a = shft_n(band1[(k+9)*32], shift);
+ int b = shft_n(band1[(8-k)*32], shift);
+ int c = shft_n(band0[(k+9)*32], shift);
+ int d = shft_n(band0[(8-k)*32], shift);
-static int find_bitrate_index(int bitr)
-{
- static long mpeg1[15] = {0,32,40,48,56,64,80,96,112,128,160,192,224,256,320};
- int i;
+ work[k+ 9] = shft16(a * win[k+ 9][0] + b * win[k+ 9][1]
+ + c * win[k+ 9][2] + d * win[k+ 9][3]);
- for(i=0;i<15;i++)
- if(bitr==mpeg1[i]) return i;
+ work[k+18] = shft16(c * win[k+18][0] + d * win[k+18][1]
+ + a * win[k+18][2] + b * win[k+18][3]);
+ }
- return -1;
-}
+ /* 7200=4*18*100 */
+ mdct_long(mdct, work);
+
+ /* Perform aliasing reduction butterfly */
+ if(band != 0)
+ for(k=7; k>=0; --k)
+ {
+ int bu, bd;
+ bu = shft15(mdct[k]) * ca[k] + shft15(mdct[-1-k]) * cs[k];
+ bd = shft15(mdct[k]) * cs[k] - shft15(mdct[-1-k]) * ca[k];
+ mdct[-1-k] = bu;
+ mdct[ k ] = bd;
+ }
+ }
+
+ max = min = 0;
+ for(k=0; k<576; k++)
+ {
+ mdct_freq[k] = shft13(mdct_freq[k]);
+ if(max < mdct_freq[k]) max = mdct_freq[k];
+ if(min > mdct_freq[k]) min = mdct_freq[k];
+ }
+
+ max = (max > -min) ? max : -min;
+ cfg.cod_info[gr][ch].max_val = (long)max;
+
+ /* calc new shift for higher integer precision */
+ for(k=0; max<(0x3c00>>k); k++);
+ shift = 12 - k;
+ }
-static int find_samplerate_index(long freq)
-{
- static long mpeg1[3] = {44100, 48000, 32000};
- int i;
+ cfg.cod_info[gr][ch].quantStep += cfg.cod_info[gr][ch].additStep;
- for(i=0;i<3;i++)
- if(freq==mpeg1[i]) return i;
+ /* bit and noise allocation */
+ iteration_loop(mdct_freq, &cfg.cod_info[gr][ch], gr_cnt--);
+ /* write the frame to the bitstream */
+ Huffmancodebits(enc_data, mdct_freq, &cfg.cod_info[gr][ch]);
- return -1;
+ cfg.cod_info[gr][ch].quantStep -= cfg.cod_info[gr][ch].additStep;
+
+ if(cfg.granules == 1)
+ memcpy(sb_data[ch][0], sb_data[ch][1], sizeof(sb_data[ch][0]));
+ }
+ }
+
+ enc_size = (CodedData.bitpos + 7) >> 3;
+ /* finish this chunk by adding sideinfo header data */
+ CodedData.bitpos = 0;
+ encodeSideInfo( cfg.cod_info );
+
+ if(cfg.byte_order != order_bigEndian)
+ for(i=0; i<(enc_size+3)/4; i++)
+ CodedData.bbuf[i] = myswap32(CodedData.bbuf[i]);
+
+ if(enc_chunk + enc_size > 65536)
+ {
+ /* copy iram mp3 buffer to sdram/file */
+ rb->write(mp3file, enc_buffer, enc_chunk & ~3);
+ memcpy(enc_buffer, enc_buffer + (enc_chunk >> 2), enc_chunk & 3);
+ enc_chunk &= 3;
+ }
+
+ memcpy((char*)enc_buffer + enc_chunk, CodedData.bbuf, enc_size);
+ enc_chunk += enc_size;
+ frames++;
+ }
+ /* write last chunks to disk */
+ rb->write(mp3file, enc_buffer, enc_chunk);
}
@@ -1834,45 +2288,43 @@ char mp3_name[80];
void read_wav_files(char *dirname)
{
- DIR *dir = rb->opendir(dirname);
+ DIR *dir = rb->opendir(dirname);
- if(!dir)
- return;
+ if(!dir)
+ return;
- while(true)
- {
- struct dirent *entry;
+ while(true)
+ {
+ struct dirent *entry;
- entry = rb->readdir(dir);
- if(!entry)
- break;
+ entry = rb->readdir(dir);
+ if(!entry)
+ break;
- if( !(entry->attribute & ATTR_DIRECTORY) )
- {
- int slen = rb->strlen(entry->d_name);
+ if( !(entry->attribute & ATTR_DIRECTORY) )
+ {
+ int slen = rb->strlen(entry->d_name);
- /* add all wav audio files */
- if(!rb->strcasecmp(entry->d_name + slen - 4, ".wav"))
- {
- if(num_file >= 12)
- break;
+ /* add all wav audio files */
+ if(!rb->strcasecmp(entry->d_name + slen - 4, ".wav"))
+ {
+ if(num_file >= 12)
+ break;
- rb->strncpy(filename[num_file], dirname, 79);
- slen = rb->strlen(filename[num_file]);
- rb->strncpy(filename[num_file++] + slen, entry->d_name, 79);
- }
- }
+ rb->strncpy(filename[num_file], dirname, 79);
+ slen = rb->strlen(filename[num_file]);
+ rb->strncpy(filename[num_file++] + slen, entry->d_name, 79);
+ }
}
- rb->closedir(dir);
+ }
+ rb->closedir(dir);
}
-char *get_mp3_filename(char *wav_name)
+void get_mp3_filename(char *wav_name)
{
int slen = rb->strlen(wav_name);
rb->strncpy(mp3_name, wav_name, 79);
rb->strncpy(mp3_name + slen - 4, ".mp3", 5);
-
- return mp3_name;
}
#if CONFIG_KEYPAD == IRIVER_H100_PAD || CONFIG_KEYPAD == IRIVER_H300_PAD
@@ -1902,16 +2354,20 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
{
int fil, sfil, nfil; /* for file selection */
int rat, srat, nrat; /* for rate selection */
- int i, cont, butt;
- long tim = 0;
+ int cont = 1, butt;
+ long tim = 0;
char stg[40];
- char *bitratename[] = { "64","80","96","112","128","160","192","224","256","320" };
- int brate[] = { 64,80,96,112,128,160,192,224,256,320 };
+ char* bstrg[] = {"64","80","96","112","128","160","192","224","256","320"};
+ int brate[] = { 64, 80, 96, 112, 128, 160, 192, 224, 256, 320 };
(void)parameter;
rb = api;
-#ifdef USE_IRAM
+#ifdef CPU_COLDFIRE
+ asm volatile ("move.l #0, %macsr"); /* integer mode */
+#endif
+
+#ifdef USE_IRAM
memcpy(iramstart, iramcopy, iramend - iramstart);
memset(iedata, 0, iend - iedata);
#endif
@@ -1923,31 +2379,40 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
#endif
rb->button_clear_queue();
- read_wav_files("/");
- read_wav_files(REC_BASE_DIR"/");
+ /* check 'viewer' or 'plugin' call */
+ if(parameter == NULL || *(char*)parameter == 0)
+ {
+ read_wav_files("/");
+ read_wav_files(REC_BASE_DIR"/");
- nfil = num_file - 1;
- sfil = 0; /* set first file as default */
- cont = 1;
+ nfil = num_file - 1;
+ sfil = 0; /* set first file as default */
- while(cont && (butt = rb->button_get_w_tmo(HZ/10)) != MP3ENC_SELECT)
- {
- switch(butt)
+ while(cont && (butt = rb->button_get_w_tmo(HZ/10)) != MP3ENC_SELECT)
{
- case MP3ENC_DONE: cont = 0; break;
- case MP3ENC_PREV: if(sfil > 0 ) sfil--; break;
- case MP3ENC_NEXT: if(sfil < nfil) sfil++; break;
- }
+ switch(butt)
+ {
+ case MP3ENC_DONE: cont = 0; break;
+ case MP3ENC_PREV: if(sfil > 0 ) sfil--; break;
+ case MP3ENC_NEXT: if(sfil < nfil) sfil++; break;
+ }
- rb->lcd_clear_display();
- rb->lcd_putsxy(2, 2, "-- Select WAV-File --");
+ rb->lcd_clear_display();
+ rb->lcd_putsxy(2, 2, "-- Select WAV-File --");
- for(fil=0; fil<=nfil; fil++)
- rb->lcd_putsxy(2, 12 + fil*8, filename[fil]);
- rb->lcd_set_drawmode(DRMODE_COMPLEMENT);
- rb->lcd_fillrect(0, 12 + sfil*8, 127, 8);
- rb->lcd_set_drawmode(DRMODE_SOLID);
- rb->lcd_update();
+ for(fil=0; fil<=nfil; fil++)
+ rb->lcd_putsxy(2, 12 + fil*8, filename[fil]);
+
+ rb->lcd_set_drawmode(DRMODE_COMPLEMENT);
+ rb->lcd_fillrect(0, 12 + sfil*8, 127, 8);
+ rb->lcd_set_drawmode(DRMODE_SOLID);
+ rb->lcd_update();
+ }
+ }
+ else
+ {
+ sfil = 0;
+ rb->strncpy(filename[0], (char*)parameter, 79);
}
nrat = 9;
@@ -1966,58 +2431,45 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
rb->lcd_putsxy(2, 2, "-- Select Bitrate --");
for(rat=0; rat<=nrat; rat++)
- rb->lcd_putsxy(2, 12 + rat*8, bitratename[rat]);
+ rb->lcd_putsxy(2, 12 + rat*8, bstrg[rat]);
rb->lcd_set_drawmode(DRMODE_COMPLEMENT);
rb->lcd_fillrect(0, 12 + srat*8, 127, 8);
rb->lcd_set_drawmode(DRMODE_SOLID);
rb->lcd_update();
}
- config.infile = filename[sfil];
- config.outfile = get_mp3_filename(filename[sfil]);
-#ifdef ROCKBOX_LITTLE_ENDIAN
- config.byte_order = order_littleEndian;
-#else
- config.byte_order = order_bigEndian;
-#endif
- config.mpeg.type = 1;
- config.mpeg.layr = 2;
- config.mpeg.mode = 0;
- config.mpeg.bitr = brate[srat];
- config.mpeg.emph = 0;
- config.mpeg.crc = 0;
- config.mpeg.ext = 0;
- config.mpeg.mode_ext = 0;
- config.mpeg.copyright = 0;
- config.mpeg.original = 1;
- config.mpeg.bitrate_index = find_bitrate_index(config.mpeg.bitr);
+ wav_filename = filename[sfil];
if(cont)
{
- if((i=wave_open()) == 0)
+ if(wave_open() == 0)
{
- config.mpeg.samplerate_index = find_samplerate_index(config.wave.samplerate);
+ init_mp3_encoder_engine(true, brate[srat], cfg.samplerate);
+ get_mp3_filename(wav_filename);
+ mp3file = rb->open(mp3_name , O_WRONLY|O_CREAT|O_TRUNC);
+ frames = 0;
tim = *rb->current_tick;
compress();
tim = *rb->current_tick - tim;
- wave_close();
- rb->close(*mp3file);
+ rb->close(wavfile);
+ rb->close(mp3file);
}
else
{
- rb->snprintf(stg, 20, "WaveOpen failed: %d", i);
+ rb->close(wavfile);
+ rb->snprintf(stg, 20, "WaveOpen failed %d", wave_open());
rb->lcd_putsxy(0, 20, stg);
rb->lcd_update();
- rb->sleep(2*HZ);
+ rb->sleep(5*HZ);
}
rb->lcd_clear_display();
- rb->snprintf(stg, 30, " Conversion: %d.%02ds ", tim/100, tim%100);
+ rb->snprintf(stg, 30, " Conversion: %d.%02ds ", tim/100, tim%100);
rb->lcd_putsxy(0, 30, stg);
- tim = frames_processed * samp_per_frame * 100 / 44100; /* unit=.01s */
- rb->snprintf(stg, 30, " WAV-Length: %d.%02ds ", tim/100, tim%100);
+ tim = frames * SAMP_PER_FRAME * 100 / 44100; /* unit=.01s */
+ rb->snprintf(stg, 30, " WAV-Length: %d.%02ds ", tim/100, tim%100);
rb->lcd_putsxy(0, 20, stg);
rb->lcd_update();
rb->sleep(5*HZ);