author | llornkcor <llornkcor> | 2005-11-08 23:16:03 (UTC) |
---|---|---|
committer | llornkcor <llornkcor> | 2005-11-08 23:16:03 (UTC) |
commit | 6bd52d3658f01c966d690b12235592a5473a4d57 (patch) (unidiff) | |
tree | 76e25003b738fde6ebbea5d338b7cf76b82f47fa | |
parent | a8063e0797d6edf2ead22fc8c5346ddf187f0b5d (diff) | |
download | opie-6bd52d3658f01c966d690b12235592a5473a4d57.zip opie-6bd52d3658f01c966d690b12235592a5473a4d57.tar.gz opie-6bd52d3658f01c966d690b12235592a5473a4d57.tar.bz2 |
update libmad and add 64bit define
33 files changed, 799 insertions, 342 deletions
diff --git a/core/multimedia/opieplayer/libmad/D.dat b/core/multimedia/opieplayer/libmad/D.dat index c3ee74c..89b01da 100644 --- a/core/multimedia/opieplayer/libmad/D.dat +++ b/core/multimedia/opieplayer/libmad/D.dat | |||
@@ -1,131 +1,131 @@ | |||
1 | /* | 1 | /* |
2 | * libmad - MPEG audio decoder library | 2 | * libmad - MPEG audio decoder library |
3 | * Copyright (C) 2000-2001 Robert Leslie | 3 | * Copyright (C) 2000-2004 Underbit Technologies, Inc. |
4 | * | 4 | * |
5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
7 | * the Free Software Foundation; either version 2 of the License, or | 7 | * the Free Software Foundation; either version 2 of the License, or |
8 | * (at your option) any later version. | 8 | * (at your option) any later version. |
9 | * | 9 | * |
10 | * This program is distributed in the hope that it will be useful, | 10 | * This program is distributed in the hope that it will be useful, |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | * GNU General Public License for more details. | 13 | * GNU General Public License for more details. |
14 | * | 14 | * |
15 | * You should have received a copy of the GNU General Public License | 15 | * You should have received a copy of the GNU General Public License |
16 | * along with this program; if not, write to the Free Software | 16 | * along with this program; if not, write to the Free Software |
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
18 | * | 18 | * |
19 | * $Id$ | 19 | * $Id$ |
20 | */ | 20 | */ |
21 | 21 | ||
22 | /* | 22 | /* |
23 | * These are the coefficients for the subband synthesis window. This is a | 23 | * These are the coefficients for the subband synthesis window. This is a |
24 | * reordered version of Table B.3 from ISO/IEC 11172-3. | 24 | * reordered version of Table B.3 from ISO/IEC 11172-3. |
25 | * | 25 | * |
26 | * Every value is parameterized so that shift optimizations can be made at | 26 | * Every value is parameterized so that shift optimizations can be made at |
27 | * compile-time. For example, every value can be right-shifted 12 bits to | 27 | * compile-time. For example, every value can be right-shifted 12 bits to |
28 | * minimize multiply instruction times without any loss of accuracy. | 28 | * minimize multiply instruction times without any loss of accuracy. |
29 | */ | 29 | */ |
30 | 30 | ||
31 | { PRESHIFT(0x00000000) /* 0.000000000 */,/* 0 */ | 31 | { PRESHIFT(0x00000000) /* 0.000000000 */,/* 0 */ |
32 | -PRESHIFT(0x0001d000) /* -0.000442505 */, | 32 | -PRESHIFT(0x0001d000) /* -0.000442505 */, |
33 | PRESHIFT(0x000d5000) /* 0.003250122 */, | 33 | PRESHIFT(0x000d5000) /* 0.003250122 */, |
34 | -PRESHIFT(0x001cb000) /* -0.007003784 */, | 34 | -PRESHIFT(0x001cb000) /* -0.007003784 */, |
35 | PRESHIFT(0x007f5000) /* 0.031082153 */, | 35 | PRESHIFT(0x007f5000) /* 0.031082153 */, |
36 | -PRESHIFT(0x01421000) /* -0.078628540 */, | 36 | -PRESHIFT(0x01421000) /* -0.078628540 */, |
37 | PRESHIFT(0x019ae000) /* 0.100311279 */, | 37 | PRESHIFT(0x019ae000) /* 0.100311279 */, |
38 | -PRESHIFT(0x09271000) /* -0.572036743 */, | 38 | -PRESHIFT(0x09271000) /* -0.572036743 */, |
39 | PRESHIFT(0x1251e000) /* 1.144989014 */, | 39 | PRESHIFT(0x1251e000) /* 1.144989014 */, |
40 | PRESHIFT(0x09271000) /* 0.572036743 */, | 40 | PRESHIFT(0x09271000) /* 0.572036743 */, |
41 | PRESHIFT(0x019ae000) /* 0.100311279 */, | 41 | PRESHIFT(0x019ae000) /* 0.100311279 */, |
42 | PRESHIFT(0x01421000) /* 0.078628540 */, | 42 | PRESHIFT(0x01421000) /* 0.078628540 */, |
43 | PRESHIFT(0x007f5000) /* 0.031082153 */, | 43 | PRESHIFT(0x007f5000) /* 0.031082153 */, |
44 | PRESHIFT(0x001cb000) /* 0.007003784 */, | 44 | PRESHIFT(0x001cb000) /* 0.007003784 */, |
45 | PRESHIFT(0x000d5000) /* 0.003250122 */, | 45 | PRESHIFT(0x000d5000) /* 0.003250122 */, |
46 | PRESHIFT(0x0001d000) /* 0.000442505 */, | 46 | PRESHIFT(0x0001d000) /* 0.000442505 */, |
47 | 47 | ||
48 | PRESHIFT(0x00000000) /* 0.000000000 */, | 48 | PRESHIFT(0x00000000) /* 0.000000000 */, |
49 | -PRESHIFT(0x0001d000) /* -0.000442505 */, | 49 | -PRESHIFT(0x0001d000) /* -0.000442505 */, |
50 | PRESHIFT(0x000d5000) /* 0.003250122 */, | 50 | PRESHIFT(0x000d5000) /* 0.003250122 */, |
51 | -PRESHIFT(0x001cb000) /* -0.007003784 */, | 51 | -PRESHIFT(0x001cb000) /* -0.007003784 */, |
52 | PRESHIFT(0x007f5000) /* 0.031082153 */, | 52 | PRESHIFT(0x007f5000) /* 0.031082153 */, |
53 | -PRESHIFT(0x01421000) /* -0.078628540 */, | 53 | -PRESHIFT(0x01421000) /* -0.078628540 */, |
54 | PRESHIFT(0x019ae000) /* 0.100311279 */, | 54 | PRESHIFT(0x019ae000) /* 0.100311279 */, |
55 | -PRESHIFT(0x09271000) /* -0.572036743 */, | 55 | -PRESHIFT(0x09271000) /* -0.572036743 */, |
56 | PRESHIFT(0x1251e000) /* 1.144989014 */, | 56 | PRESHIFT(0x1251e000) /* 1.144989014 */, |
57 | PRESHIFT(0x09271000) /* 0.572036743 */, | 57 | PRESHIFT(0x09271000) /* 0.572036743 */, |
58 | PRESHIFT(0x019ae000) /* 0.100311279 */, | 58 | PRESHIFT(0x019ae000) /* 0.100311279 */, |
59 | PRESHIFT(0x01421000) /* 0.078628540 */, | 59 | PRESHIFT(0x01421000) /* 0.078628540 */, |
60 | PRESHIFT(0x007f5000) /* 0.031082153 */, | 60 | PRESHIFT(0x007f5000) /* 0.031082153 */, |
61 | PRESHIFT(0x001cb000) /* 0.007003784 */, | 61 | PRESHIFT(0x001cb000) /* 0.007003784 */, |
62 | PRESHIFT(0x000d5000) /* 0.003250122 */, | 62 | PRESHIFT(0x000d5000) /* 0.003250122 */, |
63 | PRESHIFT(0x0001d000) /* 0.000442505 */ }, | 63 | PRESHIFT(0x0001d000) /* 0.000442505 */ }, |
64 | 64 | ||
65 | { -PRESHIFT(0x00001000) /* -0.000015259 */,/* 1 */ | 65 | { -PRESHIFT(0x00001000) /* -0.000015259 */,/* 1 */ |
66 | -PRESHIFT(0x0001f000) /* -0.000473022 */, | 66 | -PRESHIFT(0x0001f000) /* -0.000473022 */, |
67 | PRESHIFT(0x000da000) /* 0.003326416 */, | 67 | PRESHIFT(0x000da000) /* 0.003326416 */, |
68 | -PRESHIFT(0x00207000) /* -0.007919312 */, | 68 | -PRESHIFT(0x00207000) /* -0.007919312 */, |
69 | PRESHIFT(0x007d0000) /* 0.030517578 */, | 69 | PRESHIFT(0x007d0000) /* 0.030517578 */, |
70 | -PRESHIFT(0x0158d000) /* -0.084182739 */, | 70 | -PRESHIFT(0x0158d000) /* -0.084182739 */, |
71 | PRESHIFT(0x01747000) /* 0.090927124 */, | 71 | PRESHIFT(0x01747000) /* 0.090927124 */, |
72 | -PRESHIFT(0x099a8000) /* -0.600219727 */, | 72 | -PRESHIFT(0x099a8000) /* -0.600219727 */, |
73 | PRESHIFT(0x124f0000) /* 1.144287109 */, | 73 | PRESHIFT(0x124f0000) /* 1.144287109 */, |
74 | PRESHIFT(0x08b38000) /* 0.543823242 */, | 74 | PRESHIFT(0x08b38000) /* 0.543823242 */, |
75 | PRESHIFT(0x01bde000) /* 0.108856201 */, | 75 | PRESHIFT(0x01bde000) /* 0.108856201 */, |
76 | PRESHIFT(0x012b4000) /* 0.073059082 */, | 76 | PRESHIFT(0x012b4000) /* 0.073059082 */, |
77 | PRESHIFT(0x0080f000) /* 0.031478882 */, | 77 | PRESHIFT(0x0080f000) /* 0.031478882 */, |
78 | PRESHIFT(0x00191000) /* 0.006118774 */, | 78 | PRESHIFT(0x00191000) /* 0.006118774 */, |
79 | PRESHIFT(0x000d0000) /* 0.003173828 */, | 79 | PRESHIFT(0x000d0000) /* 0.003173828 */, |
80 | PRESHIFT(0x0001a000) /* 0.000396729 */, | 80 | PRESHIFT(0x0001a000) /* 0.000396729 */, |
81 | 81 | ||
82 | -PRESHIFT(0x00001000) /* -0.000015259 */, | 82 | -PRESHIFT(0x00001000) /* -0.000015259 */, |
83 | -PRESHIFT(0x0001f000) /* -0.000473022 */, | 83 | -PRESHIFT(0x0001f000) /* -0.000473022 */, |
84 | PRESHIFT(0x000da000) /* 0.003326416 */, | 84 | PRESHIFT(0x000da000) /* 0.003326416 */, |
85 | -PRESHIFT(0x00207000) /* -0.007919312 */, | 85 | -PRESHIFT(0x00207000) /* -0.007919312 */, |
86 | PRESHIFT(0x007d0000) /* 0.030517578 */, | 86 | PRESHIFT(0x007d0000) /* 0.030517578 */, |
87 | -PRESHIFT(0x0158d000) /* -0.084182739 */, | 87 | -PRESHIFT(0x0158d000) /* -0.084182739 */, |
88 | PRESHIFT(0x01747000) /* 0.090927124 */, | 88 | PRESHIFT(0x01747000) /* 0.090927124 */, |
89 | -PRESHIFT(0x099a8000) /* -0.600219727 */, | 89 | -PRESHIFT(0x099a8000) /* -0.600219727 */, |
90 | PRESHIFT(0x124f0000) /* 1.144287109 */, | 90 | PRESHIFT(0x124f0000) /* 1.144287109 */, |
91 | PRESHIFT(0x08b38000) /* 0.543823242 */, | 91 | PRESHIFT(0x08b38000) /* 0.543823242 */, |
92 | PRESHIFT(0x01bde000) /* 0.108856201 */, | 92 | PRESHIFT(0x01bde000) /* 0.108856201 */, |
93 | PRESHIFT(0x012b4000) /* 0.073059082 */, | 93 | PRESHIFT(0x012b4000) /* 0.073059082 */, |
94 | PRESHIFT(0x0080f000) /* 0.031478882 */, | 94 | PRESHIFT(0x0080f000) /* 0.031478882 */, |
95 | PRESHIFT(0x00191000) /* 0.006118774 */, | 95 | PRESHIFT(0x00191000) /* 0.006118774 */, |
96 | PRESHIFT(0x000d0000) /* 0.003173828 */, | 96 | PRESHIFT(0x000d0000) /* 0.003173828 */, |
97 | PRESHIFT(0x0001a000) /* 0.000396729 */ }, | 97 | PRESHIFT(0x0001a000) /* 0.000396729 */ }, |
98 | 98 | ||
99 | { -PRESHIFT(0x00001000) /* -0.000015259 */,/* 2 */ | 99 | { -PRESHIFT(0x00001000) /* -0.000015259 */,/* 2 */ |
100 | -PRESHIFT(0x00023000) /* -0.000534058 */, | 100 | -PRESHIFT(0x00023000) /* -0.000534058 */, |
101 | PRESHIFT(0x000de000) /* 0.003387451 */, | 101 | PRESHIFT(0x000de000) /* 0.003387451 */, |
102 | -PRESHIFT(0x00245000) /* -0.008865356 */, | 102 | -PRESHIFT(0x00245000) /* -0.008865356 */, |
103 | PRESHIFT(0x007a0000) /* 0.029785156 */, | 103 | PRESHIFT(0x007a0000) /* 0.029785156 */, |
104 | -PRESHIFT(0x016f7000) /* -0.089706421 */, | 104 | -PRESHIFT(0x016f7000) /* -0.089706421 */, |
105 | PRESHIFT(0x014a8000) /* 0.080688477 */, | 105 | PRESHIFT(0x014a8000) /* 0.080688477 */, |
106 | -PRESHIFT(0x0a0d8000) /* -0.628295898 */, | 106 | -PRESHIFT(0x0a0d8000) /* -0.628295898 */, |
107 | PRESHIFT(0x12468000) /* 1.142211914 */, | 107 | PRESHIFT(0x12468000) /* 1.142211914 */, |
108 | PRESHIFT(0x083ff000) /* 0.515609741 */, | 108 | PRESHIFT(0x083ff000) /* 0.515609741 */, |
109 | PRESHIFT(0x01dd8000) /* 0.116577148 */, | 109 | PRESHIFT(0x01dd8000) /* 0.116577148 */, |
110 | PRESHIFT(0x01149000) /* 0.067520142 */, | 110 | PRESHIFT(0x01149000) /* 0.067520142 */, |
111 | PRESHIFT(0x00820000) /* 0.031738281 */, | 111 | PRESHIFT(0x00820000) /* 0.031738281 */, |
112 | PRESHIFT(0x0015b000) /* 0.005294800 */, | 112 | PRESHIFT(0x0015b000) /* 0.005294800 */, |
113 | PRESHIFT(0x000ca000) /* 0.003082275 */, | 113 | PRESHIFT(0x000ca000) /* 0.003082275 */, |
114 | PRESHIFT(0x00018000) /* 0.000366211 */, | 114 | PRESHIFT(0x00018000) /* 0.000366211 */, |
115 | 115 | ||
116 | -PRESHIFT(0x00001000) /* -0.000015259 */, | 116 | -PRESHIFT(0x00001000) /* -0.000015259 */, |
117 | -PRESHIFT(0x00023000) /* -0.000534058 */, | 117 | -PRESHIFT(0x00023000) /* -0.000534058 */, |
118 | PRESHIFT(0x000de000) /* 0.003387451 */, | 118 | PRESHIFT(0x000de000) /* 0.003387451 */, |
119 | -PRESHIFT(0x00245000) /* -0.008865356 */, | 119 | -PRESHIFT(0x00245000) /* -0.008865356 */, |
120 | PRESHIFT(0x007a0000) /* 0.029785156 */, | 120 | PRESHIFT(0x007a0000) /* 0.029785156 */, |
121 | -PRESHIFT(0x016f7000) /* -0.089706421 */, | 121 | -PRESHIFT(0x016f7000) /* -0.089706421 */, |
122 | PRESHIFT(0x014a8000) /* 0.080688477 */, | 122 | PRESHIFT(0x014a8000) /* 0.080688477 */, |
123 | -PRESHIFT(0x0a0d8000) /* -0.628295898 */, | 123 | -PRESHIFT(0x0a0d8000) /* -0.628295898 */, |
124 | PRESHIFT(0x12468000) /* 1.142211914 */, | 124 | PRESHIFT(0x12468000) /* 1.142211914 */, |
125 | PRESHIFT(0x083ff000) /* 0.515609741 */, | 125 | PRESHIFT(0x083ff000) /* 0.515609741 */, |
126 | PRESHIFT(0x01dd8000) /* 0.116577148 */, | 126 | PRESHIFT(0x01dd8000) /* 0.116577148 */, |
127 | PRESHIFT(0x01149000) /* 0.067520142 */, | 127 | PRESHIFT(0x01149000) /* 0.067520142 */, |
128 | PRESHIFT(0x00820000) /* 0.031738281 */, | 128 | PRESHIFT(0x00820000) /* 0.031738281 */, |
129 | PRESHIFT(0x0015b000) /* 0.005294800 */, | 129 | PRESHIFT(0x0015b000) /* 0.005294800 */, |
130 | PRESHIFT(0x000ca000) /* 0.003082275 */, | 130 | PRESHIFT(0x000ca000) /* 0.003082275 */, |
131 | PRESHIFT(0x00018000) /* 0.000366211 */ }, | 131 | PRESHIFT(0x00018000) /* 0.000366211 */ }, |
diff --git a/core/multimedia/opieplayer/libmad/bit.c b/core/multimedia/opieplayer/libmad/bit.c index 4a4661b..568d204 100644 --- a/core/multimedia/opieplayer/libmad/bit.c +++ b/core/multimedia/opieplayer/libmad/bit.c | |||
@@ -1,131 +1,131 @@ | |||
1 | /* | 1 | /* |
2 | * libmad - MPEG audio decoder library | 2 | * libmad - MPEG audio decoder library |
3 | * Copyright (C) 2000-2001 Robert Leslie | 3 | * Copyright (C) 2000-2004 Underbit Technologies, Inc. |
4 | * | 4 | * |
5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
7 | * the Free Software Foundation; either version 2 of the License, or | 7 | * the Free Software Foundation; either version 2 of the License, or |
8 | * (at your option) any later version. | 8 | * (at your option) any later version. |
9 | * | 9 | * |
10 | * This program is distributed in the hope that it will be useful, | 10 | * This program is distributed in the hope that it will be useful, |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | * GNU General Public License for more details. | 13 | * GNU General Public License for more details. |
14 | * | 14 | * |
15 | * You should have received a copy of the GNU General Public License | 15 | * You should have received a copy of the GNU General Public License |
16 | * along with this program; if not, write to the Free Software | 16 | * along with this program; if not, write to the Free Software |
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
18 | * | 18 | * |
19 | * $Id$ | 19 | * $Id$ |
20 | */ | 20 | */ |
21 | 21 | ||
22 | # ifdef HAVE_CONFIG_H | 22 | # ifdef HAVE_CONFIG_H |
23 | # include "libmad_config.h" | 23 | # include "libmad_config.h" |
24 | # endif | 24 | # endif |
25 | 25 | ||
26 | # include "libmad_global.h" | 26 | # include "libmad_global.h" |
27 | 27 | ||
28 | # ifdef HAVE_LIMITS_H | 28 | # ifdef HAVE_LIMITS_H |
29 | # include <limits.h> | 29 | # include <limits.h> |
30 | # else | 30 | # else |
31 | # define CHAR_BIT 8 | 31 | # define CHAR_BIT 8 |
32 | # endif | 32 | # endif |
33 | 33 | ||
34 | # include "bit.h" | 34 | # include "bit.h" |
35 | 35 | ||
36 | /* | 36 | /* |
37 | * This is the lookup table for computing the CRC-check word. | 37 | * This is the lookup table for computing the CRC-check word. |
38 | * As described in section 2.4.3.1 and depicted in Figure A.9 | 38 | * As described in section 2.4.3.1 and depicted in Figure A.9 |
39 | * of ISO/IEC 11172-3, the generator polynomial is: | 39 | * of ISO/IEC 11172-3, the generator polynomial is: |
40 | * | 40 | * |
41 | * G(X) = X^16 + X^15 + X^2 + 1 | 41 | * G(X) = X^16 + X^15 + X^2 + 1 |
42 | */ | 42 | */ |
43 | static | 43 | static |
44 | unsigned short const crc_table[256] = { | 44 | unsigned short const crc_table[256] = { |
45 | 0x0000, 0x8005, 0x800f, 0x000a, 0x801b, 0x001e, 0x0014, 0x8011, | 45 | 0x0000, 0x8005, 0x800f, 0x000a, 0x801b, 0x001e, 0x0014, 0x8011, |
46 | 0x8033, 0x0036, 0x003c, 0x8039, 0x0028, 0x802d, 0x8027, 0x0022, | 46 | 0x8033, 0x0036, 0x003c, 0x8039, 0x0028, 0x802d, 0x8027, 0x0022, |
47 | 0x8063, 0x0066, 0x006c, 0x8069, 0x0078, 0x807d, 0x8077, 0x0072, | 47 | 0x8063, 0x0066, 0x006c, 0x8069, 0x0078, 0x807d, 0x8077, 0x0072, |
48 | 0x0050, 0x8055, 0x805f, 0x005a, 0x804b, 0x004e, 0x0044, 0x8041, | 48 | 0x0050, 0x8055, 0x805f, 0x005a, 0x804b, 0x004e, 0x0044, 0x8041, |
49 | 0x80c3, 0x00c6, 0x00cc, 0x80c9, 0x00d8, 0x80dd, 0x80d7, 0x00d2, | 49 | 0x80c3, 0x00c6, 0x00cc, 0x80c9, 0x00d8, 0x80dd, 0x80d7, 0x00d2, |
50 | 0x00f0, 0x80f5, 0x80ff, 0x00fa, 0x80eb, 0x00ee, 0x00e4, 0x80e1, | 50 | 0x00f0, 0x80f5, 0x80ff, 0x00fa, 0x80eb, 0x00ee, 0x00e4, 0x80e1, |
51 | 0x00a0, 0x80a5, 0x80af, 0x00aa, 0x80bb, 0x00be, 0x00b4, 0x80b1, | 51 | 0x00a0, 0x80a5, 0x80af, 0x00aa, 0x80bb, 0x00be, 0x00b4, 0x80b1, |
52 | 0x8093, 0x0096, 0x009c, 0x8099, 0x0088, 0x808d, 0x8087, 0x0082, | 52 | 0x8093, 0x0096, 0x009c, 0x8099, 0x0088, 0x808d, 0x8087, 0x0082, |
53 | 53 | ||
54 | 0x8183, 0x0186, 0x018c, 0x8189, 0x0198, 0x819d, 0x8197, 0x0192, | 54 | 0x8183, 0x0186, 0x018c, 0x8189, 0x0198, 0x819d, 0x8197, 0x0192, |
55 | 0x01b0, 0x81b5, 0x81bf, 0x01ba, 0x81ab, 0x01ae, 0x01a4, 0x81a1, | 55 | 0x01b0, 0x81b5, 0x81bf, 0x01ba, 0x81ab, 0x01ae, 0x01a4, 0x81a1, |
56 | 0x01e0, 0x81e5, 0x81ef, 0x01ea, 0x81fb, 0x01fe, 0x01f4, 0x81f1, | 56 | 0x01e0, 0x81e5, 0x81ef, 0x01ea, 0x81fb, 0x01fe, 0x01f4, 0x81f1, |
57 | 0x81d3, 0x01d6, 0x01dc, 0x81d9, 0x01c8, 0x81cd, 0x81c7, 0x01c2, | 57 | 0x81d3, 0x01d6, 0x01dc, 0x81d9, 0x01c8, 0x81cd, 0x81c7, 0x01c2, |
58 | 0x0140, 0x8145, 0x814f, 0x014a, 0x815b, 0x015e, 0x0154, 0x8151, | 58 | 0x0140, 0x8145, 0x814f, 0x014a, 0x815b, 0x015e, 0x0154, 0x8151, |
59 | 0x8173, 0x0176, 0x017c, 0x8179, 0x0168, 0x816d, 0x8167, 0x0162, | 59 | 0x8173, 0x0176, 0x017c, 0x8179, 0x0168, 0x816d, 0x8167, 0x0162, |
60 | 0x8123, 0x0126, 0x012c, 0x8129, 0x0138, 0x813d, 0x8137, 0x0132, | 60 | 0x8123, 0x0126, 0x012c, 0x8129, 0x0138, 0x813d, 0x8137, 0x0132, |
61 | 0x0110, 0x8115, 0x811f, 0x011a, 0x810b, 0x010e, 0x0104, 0x8101, | 61 | 0x0110, 0x8115, 0x811f, 0x011a, 0x810b, 0x010e, 0x0104, 0x8101, |
62 | 62 | ||
63 | 0x8303, 0x0306, 0x030c, 0x8309, 0x0318, 0x831d, 0x8317, 0x0312, | 63 | 0x8303, 0x0306, 0x030c, 0x8309, 0x0318, 0x831d, 0x8317, 0x0312, |
64 | 0x0330, 0x8335, 0x833f, 0x033a, 0x832b, 0x032e, 0x0324, 0x8321, | 64 | 0x0330, 0x8335, 0x833f, 0x033a, 0x832b, 0x032e, 0x0324, 0x8321, |
65 | 0x0360, 0x8365, 0x836f, 0x036a, 0x837b, 0x037e, 0x0374, 0x8371, | 65 | 0x0360, 0x8365, 0x836f, 0x036a, 0x837b, 0x037e, 0x0374, 0x8371, |
66 | 0x8353, 0x0356, 0x035c, 0x8359, 0x0348, 0x834d, 0x8347, 0x0342, | 66 | 0x8353, 0x0356, 0x035c, 0x8359, 0x0348, 0x834d, 0x8347, 0x0342, |
67 | 0x03c0, 0x83c5, 0x83cf, 0x03ca, 0x83db, 0x03de, 0x03d4, 0x83d1, | 67 | 0x03c0, 0x83c5, 0x83cf, 0x03ca, 0x83db, 0x03de, 0x03d4, 0x83d1, |
68 | 0x83f3, 0x03f6, 0x03fc, 0x83f9, 0x03e8, 0x83ed, 0x83e7, 0x03e2, | 68 | 0x83f3, 0x03f6, 0x03fc, 0x83f9, 0x03e8, 0x83ed, 0x83e7, 0x03e2, |
69 | 0x83a3, 0x03a6, 0x03ac, 0x83a9, 0x03b8, 0x83bd, 0x83b7, 0x03b2, | 69 | 0x83a3, 0x03a6, 0x03ac, 0x83a9, 0x03b8, 0x83bd, 0x83b7, 0x03b2, |
70 | 0x0390, 0x8395, 0x839f, 0x039a, 0x838b, 0x038e, 0x0384, 0x8381, | 70 | 0x0390, 0x8395, 0x839f, 0x039a, 0x838b, 0x038e, 0x0384, 0x8381, |
71 | 71 | ||
72 | 0x0280, 0x8285, 0x828f, 0x028a, 0x829b, 0x029e, 0x0294, 0x8291, | 72 | 0x0280, 0x8285, 0x828f, 0x028a, 0x829b, 0x029e, 0x0294, 0x8291, |
73 | 0x82b3, 0x02b6, 0x02bc, 0x82b9, 0x02a8, 0x82ad, 0x82a7, 0x02a2, | 73 | 0x82b3, 0x02b6, 0x02bc, 0x82b9, 0x02a8, 0x82ad, 0x82a7, 0x02a2, |
74 | 0x82e3, 0x02e6, 0x02ec, 0x82e9, 0x02f8, 0x82fd, 0x82f7, 0x02f2, | 74 | 0x82e3, 0x02e6, 0x02ec, 0x82e9, 0x02f8, 0x82fd, 0x82f7, 0x02f2, |
75 | 0x02d0, 0x82d5, 0x82df, 0x02da, 0x82cb, 0x02ce, 0x02c4, 0x82c1, | 75 | 0x02d0, 0x82d5, 0x82df, 0x02da, 0x82cb, 0x02ce, 0x02c4, 0x82c1, |
76 | 0x8243, 0x0246, 0x024c, 0x8249, 0x0258, 0x825d, 0x8257, 0x0252, | 76 | 0x8243, 0x0246, 0x024c, 0x8249, 0x0258, 0x825d, 0x8257, 0x0252, |
77 | 0x0270, 0x8275, 0x827f, 0x027a, 0x826b, 0x026e, 0x0264, 0x8261, | 77 | 0x0270, 0x8275, 0x827f, 0x027a, 0x826b, 0x026e, 0x0264, 0x8261, |
78 | 0x0220, 0x8225, 0x822f, 0x022a, 0x823b, 0x023e, 0x0234, 0x8231, | 78 | 0x0220, 0x8225, 0x822f, 0x022a, 0x823b, 0x023e, 0x0234, 0x8231, |
79 | 0x8213, 0x0216, 0x021c, 0x8219, 0x0208, 0x820d, 0x8207, 0x0202 | 79 | 0x8213, 0x0216, 0x021c, 0x8219, 0x0208, 0x820d, 0x8207, 0x0202 |
80 | }; | 80 | }; |
81 | 81 | ||
82 | # define CRC_POLY 0x8005 | 82 | # define CRC_POLY 0x8005 |
83 | 83 | ||
84 | /* | 84 | /* |
85 | * NAME:bit->init() | 85 | * NAME:bit->init() |
86 | * DESCRIPTION:initialize bit pointer struct | 86 | * DESCRIPTION:initialize bit pointer struct |
87 | */ | 87 | */ |
88 | void mad_bit_init(struct mad_bitptr *bitptr, unsigned char const *byte) | 88 | void mad_bit_init(struct mad_bitptr *bitptr, unsigned char const *byte) |
89 | { | 89 | { |
90 | bitptr->byte = byte; | 90 | bitptr->byte = byte; |
91 | bitptr->cache = 0; | 91 | bitptr->cache = 0; |
92 | bitptr->left = CHAR_BIT; | 92 | bitptr->left = CHAR_BIT; |
93 | } | 93 | } |
94 | 94 | ||
95 | /* | 95 | /* |
96 | * NAME:bit->length() | 96 | * NAME:bit->length() |
97 | * DESCRIPTION:return number of bits between start and end points | 97 | * DESCRIPTION:return number of bits between start and end points |
98 | */ | 98 | */ |
99 | unsigned int mad_bit_length(struct mad_bitptr const *begin, | 99 | unsigned int mad_bit_length(struct mad_bitptr const *begin, |
100 | struct mad_bitptr const *end) | 100 | struct mad_bitptr const *end) |
101 | { | 101 | { |
102 | return begin->left + | 102 | return begin->left + |
103 | CHAR_BIT * (end->byte - (begin->byte + 1)) + (CHAR_BIT - end->left); | 103 | CHAR_BIT * (end->byte - (begin->byte + 1)) + (CHAR_BIT - end->left); |
104 | } | 104 | } |
105 | 105 | ||
106 | /* | 106 | /* |
107 | * NAME:bit->nextbyte() | 107 | * NAME:bit->nextbyte() |
108 | * DESCRIPTION:return pointer to next unprocessed byte | 108 | * DESCRIPTION:return pointer to next unprocessed byte |
109 | */ | 109 | */ |
110 | unsigned char const *mad_bit_nextbyte(struct mad_bitptr const *bitptr) | 110 | unsigned char const *mad_bit_nextbyte(struct mad_bitptr const *bitptr) |
111 | { | 111 | { |
112 | return bitptr->left == CHAR_BIT ? bitptr->byte : bitptr->byte + 1; | 112 | return bitptr->left == CHAR_BIT ? bitptr->byte : bitptr->byte + 1; |
113 | } | 113 | } |
114 | 114 | ||
115 | /* | 115 | /* |
116 | * NAME:bit->skip() | 116 | * NAME:bit->skip() |
117 | * DESCRIPTION:advance bit pointer | 117 | * DESCRIPTION:advance bit pointer |
118 | */ | 118 | */ |
119 | void mad_bit_skip(struct mad_bitptr *bitptr, unsigned int len) | 119 | void mad_bit_skip(struct mad_bitptr *bitptr, unsigned int len) |
120 | { | 120 | { |
121 | bitptr->byte += len / CHAR_BIT; | 121 | bitptr->byte += len / CHAR_BIT; |
122 | bitptr->left -= len % CHAR_BIT; | 122 | bitptr->left -= len % CHAR_BIT; |
123 | 123 | ||
124 | if (bitptr->left > CHAR_BIT) { | 124 | if (bitptr->left > CHAR_BIT) { |
125 | bitptr->byte++; | 125 | bitptr->byte++; |
126 | bitptr->left += CHAR_BIT; | 126 | bitptr->left += CHAR_BIT; |
127 | } | 127 | } |
128 | 128 | ||
129 | if (bitptr->left < CHAR_BIT) | 129 | if (bitptr->left < CHAR_BIT) |
130 | bitptr->cache = *bitptr->byte; | 130 | bitptr->cache = *bitptr->byte; |
131 | } | 131 | } |
diff --git a/core/multimedia/opieplayer/libmad/bit.h b/core/multimedia/opieplayer/libmad/bit.h index 3448d40..22ae66c 100644 --- a/core/multimedia/opieplayer/libmad/bit.h +++ b/core/multimedia/opieplayer/libmad/bit.h | |||
@@ -1,47 +1,47 @@ | |||
1 | /* | 1 | /* |
2 | * libmad - MPEG audio decoder library | 2 | * libmad - MPEG audio decoder library |
3 | * Copyright (C) 2000-2001 Robert Leslie | 3 | * Copyright (C) 2000-2004 Underbit Technologies, Inc. |
4 | * | 4 | * |
5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
7 | * the Free Software Foundation; either version 2 of the License, or | 7 | * the Free Software Foundation; either version 2 of the License, or |
8 | * (at your option) any later version. | 8 | * (at your option) any later version. |
9 | * | 9 | * |
10 | * This program is distributed in the hope that it will be useful, | 10 | * This program is distributed in the hope that it will be useful, |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | * GNU General Public License for more details. | 13 | * GNU General Public License for more details. |
14 | * | 14 | * |
15 | * You should have received a copy of the GNU General Public License | 15 | * You should have received a copy of the GNU General Public License |
16 | * along with this program; if not, write to the Free Software | 16 | * along with this program; if not, write to the Free Software |
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
18 | * | 18 | * |
19 | * $Id$ | 19 | * $Id$ |
20 | */ | 20 | */ |
21 | 21 | ||
22 | # ifndef LIBMAD_BIT_H | 22 | # ifndef LIBMAD_BIT_H |
23 | # define LIBMAD_BIT_H | 23 | # define LIBMAD_BIT_H |
24 | 24 | ||
25 | struct mad_bitptr { | 25 | struct mad_bitptr { |
26 | unsigned char const *byte; | 26 | unsigned char const *byte; |
27 | unsigned short cache; | 27 | unsigned short cache; |
28 | unsigned short left; | 28 | unsigned short left; |
29 | }; | 29 | }; |
30 | 30 | ||
31 | void mad_bit_init(struct mad_bitptr *, unsigned char const *); | 31 | void mad_bit_init(struct mad_bitptr *, unsigned char const *); |
32 | 32 | ||
33 | # define mad_bit_finish(bitptr) /* nothing */ | 33 | # define mad_bit_finish(bitptr) /* nothing */ |
34 | 34 | ||
35 | unsigned int mad_bit_length(struct mad_bitptr const *, | 35 | unsigned int mad_bit_length(struct mad_bitptr const *, |
36 | struct mad_bitptr const *); | 36 | struct mad_bitptr const *); |
37 | 37 | ||
38 | # define mad_bit_bitsleft(bitptr) ((bitptr)->left) | 38 | # define mad_bit_bitsleft(bitptr) ((bitptr)->left) |
39 | unsigned char const *mad_bit_nextbyte(struct mad_bitptr const *); | 39 | unsigned char const *mad_bit_nextbyte(struct mad_bitptr const *); |
40 | 40 | ||
41 | void mad_bit_skip(struct mad_bitptr *, unsigned int); | 41 | void mad_bit_skip(struct mad_bitptr *, unsigned int); |
42 | unsigned long mad_bit_read(struct mad_bitptr *, unsigned int); | 42 | unsigned long mad_bit_read(struct mad_bitptr *, unsigned int); |
43 | void mad_bit_write(struct mad_bitptr *, unsigned int, unsigned long); | 43 | void mad_bit_write(struct mad_bitptr *, unsigned int, unsigned long); |
44 | 44 | ||
45 | unsigned short mad_bit_crc(struct mad_bitptr, unsigned int, unsigned short); | 45 | unsigned short mad_bit_crc(struct mad_bitptr, unsigned int, unsigned short); |
46 | 46 | ||
47 | # endif | 47 | # endif |
diff --git a/core/multimedia/opieplayer/libmad/decoder.c b/core/multimedia/opieplayer/libmad/decoder.c index b2b6cbb..d039bfb 100644 --- a/core/multimedia/opieplayer/libmad/decoder.c +++ b/core/multimedia/opieplayer/libmad/decoder.c | |||
@@ -1,182 +1,186 @@ | |||
1 | /* | 1 | /* |
2 | * libmad - MPEG audio decoder library | 2 | * libmad - MPEG audio decoder library |
3 | * Copyright (C) 2000-2001 Robert Leslie | 3 | * Copyright (C) 2000-2004 Underbit Technologies, Inc. |
4 | * | 4 | * |
5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
7 | * the Free Software Foundation; either version 2 of the License, or | 7 | * the Free Software Foundation; either version 2 of the License, or |
8 | * (at your option) any later version. | 8 | * (at your option) any later version. |
9 | * | 9 | * |
10 | * This program is distributed in the hope that it will be useful, | 10 | * This program is distributed in the hope that it will be useful, |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | * GNU General Public License for more details. | 13 | * GNU General Public License for more details. |
14 | * | 14 | * |
15 | * You should have received a copy of the GNU General Public License | 15 | * You should have received a copy of the GNU General Public License |
16 | * along with this program; if not, write to the Free Software | 16 | * along with this program; if not, write to the Free Software |
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
18 | * | 18 | * |
19 | * $Id$ | 19 | * $Id$ |
20 | */ | 20 | */ |
21 | 21 | ||
22 | # ifdef HAVE_CONFIG_H | 22 | # ifdef HAVE_CONFIG_H |
23 | # include "libmad_config.h" | 23 | # include "libmad_config.h" |
24 | # endif | 24 | # endif |
25 | 25 | ||
26 | # include "libmad_global.h" | 26 | # include "libmad_global.h" |
27 | 27 | ||
28 | # ifdef HAVE_SYS_TYPES_H | 28 | # ifdef HAVE_SYS_TYPES_H |
29 | # include <sys/types.h> | 29 | # include <sys/types.h> |
30 | # endif | 30 | # endif |
31 | 31 | ||
32 | # ifdef HAVE_SYS_WAIT_H | 32 | # ifdef HAVE_SYS_WAIT_H |
33 | # include <sys/wait.h> | 33 | # include <sys/wait.h> |
34 | # endif | 34 | # endif |
35 | 35 | ||
36 | # ifdef HAVE_UNISTD_H | 36 | # ifdef HAVE_UNISTD_H |
37 | # include <unistd.h> | 37 | # include <unistd.h> |
38 | # endif | 38 | # endif |
39 | 39 | ||
40 | # ifdef HAVE_FCNTL_H | 40 | # ifdef HAVE_FCNTL_H |
41 | # include <fcntl.h> | 41 | # include <fcntl.h> |
42 | # endif | 42 | # endif |
43 | 43 | ||
44 | # include <stdlib.h> | 44 | # include <stdlib.h> |
45 | 45 | ||
46 | # ifdef HAVE_ERRNO_H | 46 | # ifdef HAVE_ERRNO_H |
47 | # include <errno.h> | 47 | # include <errno.h> |
48 | # endif | 48 | # endif |
49 | 49 | ||
50 | # include "stream.h" | 50 | # include "stream.h" |
51 | # include "frame.h" | 51 | # include "frame.h" |
52 | # include "synth.h" | 52 | # include "synth.h" |
53 | # include "decoder.h" | 53 | # include "decoder.h" |
54 | 54 | ||
55 | /* | ||
56 | * NAME:decoder->init() | ||
57 | * DESCRIPTION:initialize a decoder object with callback routines | ||
58 | */ | ||
55 | void mad_decoder_init(struct mad_decoder *decoder, void *data, | 59 | void mad_decoder_init(struct mad_decoder *decoder, void *data, |
56 | enum mad_flow (*input_func)(void *, | 60 | enum mad_flow (*input_func)(void *, |
57 | struct mad_stream *), | 61 | struct mad_stream *), |
58 | enum mad_flow (*header_func)(void *, | 62 | enum mad_flow (*header_func)(void *, |
59 | struct mad_header const *), | 63 | struct mad_header const *), |
60 | enum mad_flow (*filter_func)(void *, | 64 | enum mad_flow (*filter_func)(void *, |
61 | struct mad_stream const *, | 65 | struct mad_stream const *, |
62 | struct mad_frame *), | 66 | struct mad_frame *), |
63 | enum mad_flow (*output_func)(void *, | 67 | enum mad_flow (*output_func)(void *, |
64 | struct mad_header const *, | 68 | struct mad_header const *, |
65 | struct mad_pcm *), | 69 | struct mad_pcm *), |
66 | enum mad_flow (*error_func)(void *, | 70 | enum mad_flow (*error_func)(void *, |
67 | struct mad_stream *, | 71 | struct mad_stream *, |
68 | struct mad_frame *), | 72 | struct mad_frame *), |
69 | enum mad_flow (*message_func)(void *, | 73 | enum mad_flow (*message_func)(void *, |
70 | void *, unsigned int *)) | 74 | void *, unsigned int *)) |
71 | { | 75 | { |
72 | decoder->mode = -1; | 76 | decoder->mode = -1; |
73 | 77 | ||
74 | decoder->options = 0; | 78 | decoder->options = 0; |
75 | 79 | ||
76 | decoder->async.pid = 0; | 80 | decoder->async.pid = 0; |
77 | decoder->async.in = -1; | 81 | decoder->async.in = -1; |
78 | decoder->async.out = -1; | 82 | decoder->async.out = -1; |
79 | 83 | ||
80 | decoder->sync = 0; | 84 | decoder->sync = 0; |
81 | 85 | ||
82 | decoder->cb_data = data; | 86 | decoder->cb_data = data; |
83 | 87 | ||
84 | decoder->input_func = input_func; | 88 | decoder->input_func = input_func; |
85 | decoder->header_func = header_func; | 89 | decoder->header_func = header_func; |
86 | decoder->filter_func = filter_func; | 90 | decoder->filter_func = filter_func; |
87 | decoder->output_func = output_func; | 91 | decoder->output_func = output_func; |
88 | decoder->error_func = error_func; | 92 | decoder->error_func = error_func; |
89 | decoder->message_func = message_func; | 93 | decoder->message_func = message_func; |
90 | } | 94 | } |
91 | 95 | ||
92 | int mad_decoder_finish(struct mad_decoder *decoder) | 96 | int mad_decoder_finish(struct mad_decoder *decoder) |
93 | { | 97 | { |
94 | # if defined(USE_ASYNC) | 98 | # if defined(USE_ASYNC) |
95 | if (decoder->mode == MAD_DECODER_MODE_ASYNC && decoder->async.pid) { | 99 | if (decoder->mode == MAD_DECODER_MODE_ASYNC && decoder->async.pid) { |
96 | pid_t pid; | 100 | pid_t pid; |
97 | int status; | 101 | int status; |
98 | 102 | ||
99 | close(decoder->async.in); | 103 | close(decoder->async.in); |
100 | 104 | ||
101 | do | 105 | do |
102 | pid = waitpid(decoder->async.pid, &status, 0); | 106 | pid = waitpid(decoder->async.pid, &status, 0); |
103 | while (pid == -1 && errno == EINTR); | 107 | while (pid == -1 && errno == EINTR); |
104 | 108 | ||
105 | decoder->mode = -1; | 109 | decoder->mode = -1; |
106 | 110 | ||
107 | close(decoder->async.out); | 111 | close(decoder->async.out); |
108 | 112 | ||
109 | decoder->async.pid = 0; | 113 | decoder->async.pid = 0; |
110 | decoder->async.in = -1; | 114 | decoder->async.in = -1; |
111 | decoder->async.out = -1; | 115 | decoder->async.out = -1; |
112 | 116 | ||
113 | if (pid == -1) | 117 | if (pid == -1) |
114 | return -1; | 118 | return -1; |
115 | 119 | ||
116 | return (!WIFEXITED(status) || WEXITSTATUS(status)) ? -1 : 0; | 120 | return (!WIFEXITED(status) || WEXITSTATUS(status)) ? -1 : 0; |
117 | } | 121 | } |
118 | # endif | 122 | # endif |
119 | 123 | ||
120 | return 0; | 124 | return 0; |
121 | } | 125 | } |
122 | 126 | ||
123 | # if defined(USE_ASYNC) | 127 | # if defined(USE_ASYNC) |
124 | static | 128 | static |
125 | enum mad_flow send_io(int fd, void const *data, size_t len) | 129 | enum mad_flow send_io(int fd, void const *data, size_t len) |
126 | { | 130 | { |
127 | char const *ptr = data; | 131 | char const *ptr = data; |
128 | ssize_t count; | 132 | ssize_t count; |
129 | 133 | ||
130 | while (len) { | 134 | while (len) { |
131 | do | 135 | do |
132 | count = write(fd, ptr, len); | 136 | count = write(fd, ptr, len); |
133 | while (count == -1 && errno == EINTR); | 137 | while (count == -1 && errno == EINTR); |
134 | 138 | ||
135 | if (count == -1) | 139 | if (count == -1) |
136 | return MAD_FLOW_BREAK; | 140 | return MAD_FLOW_BREAK; |
137 | 141 | ||
138 | len -= count; | 142 | len -= count; |
139 | ptr += count; | 143 | ptr += count; |
140 | } | 144 | } |
141 | 145 | ||
142 | return MAD_FLOW_CONTINUE; | 146 | return MAD_FLOW_CONTINUE; |
143 | } | 147 | } |
144 | 148 | ||
145 | static | 149 | static |
146 | enum mad_flow receive_io(int fd, void *buffer, size_t len) | 150 | enum mad_flow receive_io(int fd, void *buffer, size_t len) |
147 | { | 151 | { |
148 | char *ptr = buffer; | 152 | char *ptr = buffer; |
149 | ssize_t count; | 153 | ssize_t count; |
150 | 154 | ||
151 | while (len) { | 155 | while (len) { |
152 | do | 156 | do |
153 | count = read(fd, ptr, len); | 157 | count = read(fd, ptr, len); |
154 | while (count == -1 && errno == EINTR); | 158 | while (count == -1 && errno == EINTR); |
155 | 159 | ||
156 | if (count == -1) | 160 | if (count == -1) |
157 | return (errno == EAGAIN) ? MAD_FLOW_IGNORE : MAD_FLOW_BREAK; | 161 | return (errno == EAGAIN) ? MAD_FLOW_IGNORE : MAD_FLOW_BREAK; |
158 | else if (count == 0) | 162 | else if (count == 0) |
159 | return MAD_FLOW_STOP; | 163 | return MAD_FLOW_STOP; |
160 | 164 | ||
161 | len -= count; | 165 | len -= count; |
162 | ptr += count; | 166 | ptr += count; |
163 | } | 167 | } |
164 | 168 | ||
165 | return MAD_FLOW_CONTINUE; | 169 | return MAD_FLOW_CONTINUE; |
166 | } | 170 | } |
167 | 171 | ||
168 | static | 172 | static |
169 | enum mad_flow receive_io_blocking(int fd, void *buffer, size_t len) | 173 | enum mad_flow receive_io_blocking(int fd, void *buffer, size_t len) |
170 | { | 174 | { |
171 | int flags, blocking; | 175 | int flags, blocking; |
172 | enum mad_flow result; | 176 | enum mad_flow result; |
173 | 177 | ||
174 | flags = fcntl(fd, F_GETFL); | 178 | flags = fcntl(fd, F_GETFL); |
175 | if (flags == -1) | 179 | if (flags == -1) |
176 | return MAD_FLOW_BREAK; | 180 | return MAD_FLOW_BREAK; |
177 | 181 | ||
178 | blocking = flags & ~O_NONBLOCK; | 182 | blocking = flags & ~O_NONBLOCK; |
179 | 183 | ||
180 | if (blocking != flags && | 184 | if (blocking != flags && |
181 | fcntl(fd, F_SETFL, blocking) == -1) | 185 | fcntl(fd, F_SETFL, blocking) == -1) |
182 | return MAD_FLOW_BREAK; | 186 | return MAD_FLOW_BREAK; |
@@ -397,174 +401,182 @@ int run_sync(struct mad_decoder *decoder) | |||
397 | } | 401 | } |
398 | } | 402 | } |
399 | 403 | ||
400 | if (mad_frame_decode(frame, stream) == -1) { | 404 | if (mad_frame_decode(frame, stream) == -1) { |
401 | if (!MAD_RECOVERABLE(stream->error)) | 405 | if (!MAD_RECOVERABLE(stream->error)) |
402 | break; | 406 | break; |
403 | 407 | ||
404 | switch (error_func(error_data, stream, frame)) { | 408 | switch (error_func(error_data, stream, frame)) { |
405 | case MAD_FLOW_STOP: | 409 | case MAD_FLOW_STOP: |
406 | goto done; | 410 | goto done; |
407 | case MAD_FLOW_BREAK: | 411 | case MAD_FLOW_BREAK: |
408 | goto fail; | 412 | goto fail; |
409 | case MAD_FLOW_IGNORE: | 413 | case MAD_FLOW_IGNORE: |
410 | break; | 414 | break; |
411 | case MAD_FLOW_CONTINUE: | 415 | case MAD_FLOW_CONTINUE: |
412 | default: | 416 | default: |
413 | continue; | 417 | continue; |
414 | } | 418 | } |
415 | } | 419 | } |
416 | else | 420 | else |
417 | bad_last_frame = 0; | 421 | bad_last_frame = 0; |
418 | 422 | ||
419 | if (decoder->filter_func) { | 423 | if (decoder->filter_func) { |
420 | switch (decoder->filter_func(decoder->cb_data, stream, frame)) { | 424 | switch (decoder->filter_func(decoder->cb_data, stream, frame)) { |
421 | case MAD_FLOW_STOP: | 425 | case MAD_FLOW_STOP: |
422 | goto done; | 426 | goto done; |
423 | case MAD_FLOW_BREAK: | 427 | case MAD_FLOW_BREAK: |
424 | goto fail; | 428 | goto fail; |
425 | case MAD_FLOW_IGNORE: | 429 | case MAD_FLOW_IGNORE: |
426 | continue; | 430 | continue; |
427 | case MAD_FLOW_CONTINUE: | 431 | case MAD_FLOW_CONTINUE: |
428 | break; | 432 | break; |
429 | } | 433 | } |
430 | } | 434 | } |
431 | 435 | ||
432 | mad_synth_frame(synth, frame); | 436 | mad_synth_frame(synth, frame); |
433 | 437 | ||
434 | if (decoder->output_func) { | 438 | if (decoder->output_func) { |
435 | switch (decoder->output_func(decoder->cb_data, | 439 | switch (decoder->output_func(decoder->cb_data, |
436 | &frame->header, &synth->pcm)) { | 440 | &frame->header, &synth->pcm)) { |
437 | case MAD_FLOW_STOP: | 441 | case MAD_FLOW_STOP: |
438 | goto done; | 442 | goto done; |
439 | case MAD_FLOW_BREAK: | 443 | case MAD_FLOW_BREAK: |
440 | goto fail; | 444 | goto fail; |
441 | case MAD_FLOW_IGNORE: | 445 | case MAD_FLOW_IGNORE: |
442 | case MAD_FLOW_CONTINUE: | 446 | case MAD_FLOW_CONTINUE: |
443 | break; | 447 | break; |
444 | } | 448 | } |
445 | } | 449 | } |
446 | } | 450 | } |
447 | } | 451 | } |
448 | while (stream->error == MAD_ERROR_BUFLEN); | 452 | while (stream->error == MAD_ERROR_BUFLEN); |
449 | 453 | ||
450 | fail: | 454 | fail: |
451 | result = -1; | 455 | result = -1; |
452 | 456 | ||
453 | done: | 457 | done: |
454 | mad_synth_finish(synth); | 458 | mad_synth_finish(synth); |
455 | mad_frame_finish(frame); | 459 | mad_frame_finish(frame); |
456 | mad_stream_finish(stream); | 460 | mad_stream_finish(stream); |
457 | 461 | ||
458 | return result; | 462 | return result; |
459 | } | 463 | } |
460 | 464 | ||
461 | # if defined(USE_ASYNC) | 465 | # if defined(USE_ASYNC) |
462 | static | 466 | static |
463 | int run_async(struct mad_decoder *decoder) | 467 | int run_async(struct mad_decoder *decoder) |
464 | { | 468 | { |
465 | pid_t pid; | 469 | pid_t pid; |
466 | int ptoc[2], ctop[2], flags; | 470 | int ptoc[2], ctop[2], flags; |
467 | 471 | ||
468 | if (pipe(ptoc) == -1) | 472 | if (pipe(ptoc) == -1) |
469 | return -1; | 473 | return -1; |
470 | 474 | ||
471 | if (pipe(ctop) == -1) { | 475 | if (pipe(ctop) == -1) { |
472 | close(ptoc[0]); | 476 | close(ptoc[0]); |
473 | close(ptoc[1]); | 477 | close(ptoc[1]); |
474 | return -1; | 478 | return -1; |
475 | } | 479 | } |
476 | 480 | ||
477 | flags = fcntl(ptoc[0], F_GETFL); | 481 | flags = fcntl(ptoc[0], F_GETFL); |
478 | if (flags == -1 || | 482 | if (flags == -1 || |
479 | fcntl(ptoc[0], F_SETFL, flags | O_NONBLOCK) == -1) { | 483 | fcntl(ptoc[0], F_SETFL, flags | O_NONBLOCK) == -1) { |
480 | close(ctop[0]); | 484 | close(ctop[0]); |
481 | close(ctop[1]); | 485 | close(ctop[1]); |
482 | close(ptoc[0]); | 486 | close(ptoc[0]); |
483 | close(ptoc[1]); | 487 | close(ptoc[1]); |
484 | return -1; | 488 | return -1; |
485 | } | 489 | } |
486 | 490 | ||
487 | pid = fork(); | 491 | pid = fork(); |
488 | if (pid == -1) { | 492 | if (pid == -1) { |
489 | close(ctop[0]); | 493 | close(ctop[0]); |
490 | close(ctop[1]); | 494 | close(ctop[1]); |
491 | close(ptoc[0]); | 495 | close(ptoc[0]); |
492 | close(ptoc[1]); | 496 | close(ptoc[1]); |
493 | return -1; | 497 | return -1; |
494 | } | 498 | } |
495 | 499 | ||
496 | decoder->async.pid = pid; | 500 | decoder->async.pid = pid; |
497 | 501 | ||
498 | if (pid) { | 502 | if (pid) { |
499 | /* parent */ | 503 | /* parent */ |
500 | 504 | ||
501 | close(ptoc[0]); | 505 | close(ptoc[0]); |
502 | close(ctop[1]); | 506 | close(ctop[1]); |
503 | 507 | ||
504 | decoder->async.in = ctop[0]; | 508 | decoder->async.in = ctop[0]; |
505 | decoder->async.out = ptoc[1]; | 509 | decoder->async.out = ptoc[1]; |
506 | 510 | ||
507 | return 0; | 511 | return 0; |
508 | } | 512 | } |
509 | 513 | ||
510 | /* child */ | 514 | /* child */ |
511 | 515 | ||
512 | close(ptoc[1]); | 516 | close(ptoc[1]); |
513 | close(ctop[0]); | 517 | close(ctop[0]); |
514 | 518 | ||
515 | decoder->async.in = ptoc[0]; | 519 | decoder->async.in = ptoc[0]; |
516 | decoder->async.out = ctop[1]; | 520 | decoder->async.out = ctop[1]; |
517 | 521 | ||
518 | _exit(run_sync(decoder)); | 522 | _exit(run_sync(decoder)); |
519 | 523 | ||
520 | /* not reached */ | 524 | /* not reached */ |
521 | return -1; | 525 | return -1; |
522 | } | 526 | } |
523 | # endif | 527 | # endif |
524 | 528 | ||
529 | /* | ||
530 | * NAME:decoder->run() | ||
531 | * DESCRIPTION:run the decoder thread either synchronously or asynchronously | ||
532 | */ | ||
525 | int mad_decoder_run(struct mad_decoder *decoder, enum mad_decoder_mode mode) | 533 | int mad_decoder_run(struct mad_decoder *decoder, enum mad_decoder_mode mode) |
526 | { | 534 | { |
527 | int result; | 535 | int result; |
528 | int (*run)(struct mad_decoder *) = 0; | 536 | int (*run)(struct mad_decoder *) = 0; |
529 | 537 | ||
530 | switch (decoder->mode = mode) { | 538 | switch (decoder->mode = mode) { |
531 | case MAD_DECODER_MODE_SYNC: | 539 | case MAD_DECODER_MODE_SYNC: |
532 | run = run_sync; | 540 | run = run_sync; |
533 | break; | 541 | break; |
534 | 542 | ||
535 | case MAD_DECODER_MODE_ASYNC: | 543 | case MAD_DECODER_MODE_ASYNC: |
536 | # if defined(USE_ASYNC) | 544 | # if defined(USE_ASYNC) |
537 | run = run_async; | 545 | run = run_async; |
538 | # endif | 546 | # endif |
539 | break; | 547 | break; |
540 | } | 548 | } |
541 | 549 | ||
542 | if (run == 0) | 550 | if (run == 0) |
543 | return -1; | 551 | return -1; |
544 | 552 | ||
545 | decoder->sync = malloc(sizeof(*decoder->sync)); | 553 | decoder->sync = malloc(sizeof(*decoder->sync)); |
546 | if (decoder->sync == 0) | 554 | if (decoder->sync == 0) |
547 | return -1; | 555 | return -1; |
548 | 556 | ||
549 | result = run(decoder); | 557 | result = run(decoder); |
550 | 558 | ||
551 | free(decoder->sync); | 559 | free(decoder->sync); |
552 | decoder->sync = 0; | 560 | decoder->sync = 0; |
553 | 561 | ||
554 | return result; | 562 | return result; |
555 | } | 563 | } |
556 | 564 | ||
565 | /* | ||
566 | * NAME:decoder->message() | ||
567 | * DESCRIPTION:send a message to and receive a reply from the decoder process | ||
568 | */ | ||
557 | int mad_decoder_message(struct mad_decoder *decoder, | 569 | int mad_decoder_message(struct mad_decoder *decoder, |
558 | void *message, unsigned int *len) | 570 | void *message, unsigned int *len) |
559 | { | 571 | { |
560 | # if defined(USE_ASYNC) | 572 | # if defined(USE_ASYNC) |
561 | if (decoder->mode != MAD_DECODER_MODE_ASYNC || | 573 | if (decoder->mode != MAD_DECODER_MODE_ASYNC || |
562 | send(decoder->async.out, message, *len) != MAD_FLOW_CONTINUE || | 574 | send(decoder->async.out, message, *len) != MAD_FLOW_CONTINUE || |
563 | receive(decoder->async.in, &message, len) != MAD_FLOW_CONTINUE) | 575 | receive(decoder->async.in, &message, len) != MAD_FLOW_CONTINUE) |
564 | return -1; | 576 | return -1; |
565 | 577 | ||
566 | return 0; | 578 | return 0; |
567 | # else | 579 | # else |
568 | return -1; | 580 | return -1; |
569 | # endif | 581 | # endif |
570 | } | 582 | } |
diff --git a/core/multimedia/opieplayer/libmad/decoder.h b/core/multimedia/opieplayer/libmad/decoder.h index f34150d..714e72c 100644 --- a/core/multimedia/opieplayer/libmad/decoder.h +++ b/core/multimedia/opieplayer/libmad/decoder.h | |||
@@ -1,91 +1,91 @@ | |||
1 | /* | 1 | /* |
2 | * libmad - MPEG audio decoder library | 2 | * libmad - MPEG audio decoder library |
3 | * Copyright (C) 2000-2001 Robert Leslie | 3 | * Copyright (C) 2000-2004 Underbit Technologies, Inc. |
4 | * | 4 | * |
5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
7 | * the Free Software Foundation; either version 2 of the License, or | 7 | * the Free Software Foundation; either version 2 of the License, or |
8 | * (at your option) any later version. | 8 | * (at your option) any later version. |
9 | * | 9 | * |
10 | * This program is distributed in the hope that it will be useful, | 10 | * This program is distributed in the hope that it will be useful, |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | * GNU General Public License for more details. | 13 | * GNU General Public License for more details. |
14 | * | 14 | * |
15 | * You should have received a copy of the GNU General Public License | 15 | * You should have received a copy of the GNU General Public License |
16 | * along with this program; if not, write to the Free Software | 16 | * along with this program; if not, write to the Free Software |
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
18 | * | 18 | * |
19 | * $Id$ | 19 | * $Id$ |
20 | */ | 20 | */ |
21 | 21 | ||
22 | # ifndef LIBMAD_DECODER_H | 22 | # ifndef LIBMAD_DECODER_H |
23 | # define LIBMAD_DECODER_H | 23 | # define LIBMAD_DECODER_H |
24 | 24 | ||
25 | # include "stream.h" | 25 | # include "stream.h" |
26 | # include "frame.h" | 26 | # include "frame.h" |
27 | # include "synth.h" | 27 | # include "synth.h" |
28 | 28 | ||
29 | enum mad_decoder_mode { | 29 | enum mad_decoder_mode { |
30 | MAD_DECODER_MODE_SYNC = 0, | 30 | MAD_DECODER_MODE_SYNC = 0, |
31 | MAD_DECODER_MODE_ASYNC | 31 | MAD_DECODER_MODE_ASYNC |
32 | }; | 32 | }; |
33 | 33 | ||
34 | enum mad_flow { | 34 | enum mad_flow { |
35 | MAD_FLOW_CONTINUE = 0x0000,/* continue normally */ | 35 | MAD_FLOW_CONTINUE = 0x0000,/* continue normally */ |
36 | MAD_FLOW_STOP = 0x0010,/* stop decoding normally */ | 36 | MAD_FLOW_STOP = 0x0010,/* stop decoding normally */ |
37 | MAD_FLOW_BREAK = 0x0011,/* stop decoding and signal an error */ | 37 | MAD_FLOW_BREAK = 0x0011,/* stop decoding and signal an error */ |
38 | MAD_FLOW_IGNORE = 0x0020/* ignore the current frame */ | 38 | MAD_FLOW_IGNORE = 0x0020/* ignore the current frame */ |
39 | }; | 39 | }; |
40 | 40 | ||
41 | struct mad_decoder { | 41 | struct mad_decoder { |
42 | enum mad_decoder_mode mode; | 42 | enum mad_decoder_mode mode; |
43 | 43 | ||
44 | int options; | 44 | int options; |
45 | 45 | ||
46 | struct { | 46 | struct { |
47 | long pid; | 47 | long pid; |
48 | int in; | 48 | int in; |
49 | int out; | 49 | int out; |
50 | } async; | 50 | } async; |
51 | 51 | ||
52 | struct { | 52 | struct { |
53 | struct mad_stream stream; | 53 | struct mad_stream stream; |
54 | struct mad_frame frame; | 54 | struct mad_frame frame; |
55 | struct mad_synth synth; | 55 | struct mad_synth synth; |
56 | } *sync; | 56 | } *sync; |
57 | 57 | ||
58 | void *cb_data; | 58 | void *cb_data; |
59 | 59 | ||
60 | enum mad_flow (*input_func)(void *, struct mad_stream *); | 60 | enum mad_flow (*input_func)(void *, struct mad_stream *); |
61 | enum mad_flow (*header_func)(void *, struct mad_header const *); | 61 | enum mad_flow (*header_func)(void *, struct mad_header const *); |
62 | enum mad_flow (*filter_func)(void *, | 62 | enum mad_flow (*filter_func)(void *, |
63 | struct mad_stream const *, struct mad_frame *); | 63 | struct mad_stream const *, struct mad_frame *); |
64 | enum mad_flow (*output_func)(void *, | 64 | enum mad_flow (*output_func)(void *, |
65 | struct mad_header const *, struct mad_pcm *); | 65 | struct mad_header const *, struct mad_pcm *); |
66 | enum mad_flow (*error_func)(void *, struct mad_stream *, struct mad_frame *); | 66 | enum mad_flow (*error_func)(void *, struct mad_stream *, struct mad_frame *); |
67 | enum mad_flow (*message_func)(void *, void *, unsigned int *); | 67 | enum mad_flow (*message_func)(void *, void *, unsigned int *); |
68 | }; | 68 | }; |
69 | 69 | ||
70 | void mad_decoder_init(struct mad_decoder *, void *, | 70 | void mad_decoder_init(struct mad_decoder *, void *, |
71 | enum mad_flow (*)(void *, struct mad_stream *), | 71 | enum mad_flow (*)(void *, struct mad_stream *), |
72 | enum mad_flow (*)(void *, struct mad_header const *), | 72 | enum mad_flow (*)(void *, struct mad_header const *), |
73 | enum mad_flow (*)(void *, | 73 | enum mad_flow (*)(void *, |
74 | struct mad_stream const *, | 74 | struct mad_stream const *, |
75 | struct mad_frame *), | 75 | struct mad_frame *), |
76 | enum mad_flow (*)(void *, | 76 | enum mad_flow (*)(void *, |
77 | struct mad_header const *, | 77 | struct mad_header const *, |
78 | struct mad_pcm *), | 78 | struct mad_pcm *), |
79 | enum mad_flow (*)(void *, | 79 | enum mad_flow (*)(void *, |
80 | struct mad_stream *, | 80 | struct mad_stream *, |
81 | struct mad_frame *), | 81 | struct mad_frame *), |
82 | enum mad_flow (*)(void *, void *, unsigned int *)); | 82 | enum mad_flow (*)(void *, void *, unsigned int *)); |
83 | int mad_decoder_finish(struct mad_decoder *); | 83 | int mad_decoder_finish(struct mad_decoder *); |
84 | 84 | ||
85 | # define mad_decoder_options(decoder, opts) \ | 85 | # define mad_decoder_options(decoder, opts) \ |
86 | ((void) ((decoder)->options = (opts))) | 86 | ((void) ((decoder)->options = (opts))) |
87 | 87 | ||
88 | int mad_decoder_run(struct mad_decoder *, enum mad_decoder_mode); | 88 | int mad_decoder_run(struct mad_decoder *, enum mad_decoder_mode); |
89 | int mad_decoder_message(struct mad_decoder *, void *, unsigned int *); | 89 | int mad_decoder_message(struct mad_decoder *, void *, unsigned int *); |
90 | 90 | ||
91 | # endif | 91 | # endif |
diff --git a/core/multimedia/opieplayer/libmad/fixed.c b/core/multimedia/opieplayer/libmad/fixed.c index af1e87e..e71418a 100644 --- a/core/multimedia/opieplayer/libmad/fixed.c +++ b/core/multimedia/opieplayer/libmad/fixed.c | |||
@@ -1,37 +1,81 @@ | |||
1 | /* | 1 | /* |
2 | * libmad - MPEG audio decoder library | 2 | * libmad - MPEG audio decoder library |
3 | * Copyright (C) 2000-2001 Robert Leslie | 3 | * Copyright (C) 2000-2004 Underbit Technologies, Inc. |
4 | * | 4 | * |
5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
7 | * the Free Software Foundation; either version 2 of the License, or | 7 | * the Free Software Foundation; either version 2 of the License, or |
8 | * (at your option) any later version. | 8 | * (at your option) any later version. |
9 | * | 9 | * |
10 | * This program is distributed in the hope that it will be useful, | 10 | * This program is distributed in the hope that it will be useful, |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | * GNU General Public License for more details. | 13 | * GNU General Public License for more details. |
14 | * | 14 | * |
15 | * You should have received a copy of the GNU General Public License | 15 | * You should have received a copy of the GNU General Public License |
16 | * along with this program; if not, write to the Free Software | 16 | * along with this program; if not, write to the Free Software |
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
18 | * | 18 | * |
19 | * $Id$ | 19 | * $Id$ |
20 | */ | 20 | */ |
21 | 21 | ||
22 | # ifdef HAVE_CONFIG_H | 22 | # ifdef HAVE_CONFIG_H |
23 | # include "libmad_config.h" | 23 | # include "libmad_config.h" |
24 | # endif | 24 | # endif |
25 | 25 | ||
26 | # include "libmad_global.h" | 26 | # include "libmad_global.h" |
27 | 27 | ||
28 | # include "fixed.h" | 28 | # include "fixed.h" |
29 | 29 | ||
30 | /* | 30 | /* |
31 | * NAME:fixed->abs() | 31 | * NAME:fixed->abs() |
32 | * DESCRIPTION:return absolute value of a fixed-point number | 32 | * DESCRIPTION:return absolute value of a fixed-point number |
33 | */ | 33 | */ |
34 | mad_fixed_t mad_f_abs(mad_fixed_t x) | 34 | mad_fixed_t mad_f_abs(mad_fixed_t x) |
35 | { | 35 | { |
36 | return x < 0 ? -x : x; | 36 | return x < 0 ? -x : x; |
37 | } | 37 | } |
38 | |||
39 | /* | ||
40 | * NAME:fixed->div() | ||
41 | * DESCRIPTION:perform division using fixed-point math | ||
42 | */ | ||
43 | mad_fixed_t mad_f_div(mad_fixed_t x, mad_fixed_t y) | ||
44 | { | ||
45 | mad_fixed_t q, r; | ||
46 | unsigned int bits; | ||
47 | |||
48 | q = mad_f_abs(x / y); | ||
49 | |||
50 | if (x < 0) { | ||
51 | x = -x; | ||
52 | y = -y; | ||
53 | } | ||
54 | |||
55 | r = x % y; | ||
56 | |||
57 | if (y < 0) { | ||
58 | x = -x; | ||
59 | y = -y; | ||
60 | } | ||
61 | |||
62 | if (q > mad_f_intpart(MAD_F_MAX) && | ||
63 | !(q == -mad_f_intpart(MAD_F_MIN) && r == 0 && (x < 0) != (y < 0))) | ||
64 | return 0; | ||
65 | |||
66 | for (bits = MAD_F_FRACBITS; bits && r; --bits) { | ||
67 | q <<= 1, r <<= 1; | ||
68 | if (r >= y) | ||
69 | r -= y, ++q; | ||
70 | } | ||
71 | |||
72 | /* round */ | ||
73 | if (2 * r >= y) | ||
74 | ++q; | ||
75 | |||
76 | /* fix sign */ | ||
77 | if ((x < 0) != (y < 0)) | ||
78 | q = -q; | ||
79 | |||
80 | return q << bits; | ||
81 | } | ||
diff --git a/core/multimedia/opieplayer/libmad/fixed.h b/core/multimedia/opieplayer/libmad/fixed.h index c9b98ca..baa7dc5 100644 --- a/core/multimedia/opieplayer/libmad/fixed.h +++ b/core/multimedia/opieplayer/libmad/fixed.h | |||
@@ -1,476 +1,499 @@ | |||
1 | /* | 1 | /* |
2 | * libmad - MPEG audio decoder library | 2 | * libmad - MPEG audio decoder library |
3 | * Copyright (C) 2000-2001 Robert Leslie | 3 | * Copyright (C) 2000-2004 Underbit Technologies, Inc. |
4 | * | 4 | * |
5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
7 | * the Free Software Foundation; either version 2 of the License, or | 7 | * the Free Software Foundation; either version 2 of the License, or |
8 | * (at your option) any later version. | 8 | * (at your option) any later version. |
9 | * | 9 | * |
10 | * This program is distributed in the hope that it will be useful, | 10 | * This program is distributed in the hope that it will be useful, |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | * GNU General Public License for more details. | 13 | * GNU General Public License for more details. |
14 | * | 14 | * |
15 | * You should have received a copy of the GNU General Public License | 15 | * You should have received a copy of the GNU General Public License |
16 | * along with this program; if not, write to the Free Software | 16 | * along with this program; if not, write to the Free Software |
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
18 | * | 18 | * |
19 | * $Id$ | 19 | * $Id$ |
20 | */ | 20 | */ |
21 | 21 | ||
22 | # ifndef LIBMAD_FIXED_H | 22 | # ifndef LIBMAD_FIXED_H |
23 | # define LIBMAD_FIXED_H | 23 | # define LIBMAD_FIXED_H |
24 | 24 | ||
25 | # if SIZEOF_INT >= 4 | 25 | # if SIZEOF_INT >= 4 |
26 | typedef signed int mad_fixed_t; | 26 | typedef signed int mad_fixed_t; |
27 | 27 | ||
28 | typedef signed int mad_fixed64hi_t; | 28 | typedef signed int mad_fixed64hi_t; |
29 | typedef unsigned int mad_fixed64lo_t; | 29 | typedef unsigned int mad_fixed64lo_t; |
30 | # else | 30 | # else |
31 | typedef signed long mad_fixed_t; | 31 | typedef signed long mad_fixed_t; |
32 | 32 | ||
33 | typedef signed long mad_fixed64hi_t; | 33 | typedef signed long mad_fixed64hi_t; |
34 | typedef unsigned long mad_fixed64lo_t; | 34 | typedef unsigned long mad_fixed64lo_t; |
35 | # endif | 35 | # endif |
36 | 36 | ||
37 | # if defined(_MSC_VER) | 37 | # if defined(_MSC_VER) |
38 | # define mad_fixed64_t signed __int64 | 38 | # define mad_fixed64_t signed __int64 |
39 | # elif 1 || defined(__GNUC__) | 39 | # elif 1 || defined(__GNUC__) |
40 | # define mad_fixed64_t signed long long | 40 | # define mad_fixed64_t signed long long |
41 | # endif | 41 | # endif |
42 | 42 | ||
43 | # if defined(FPM_FLOAT) | 43 | # if defined(FPM_FLOAT) |
44 | typedef double mad_sample_t; | 44 | typedef double mad_sample_t; |
45 | # else | 45 | # else |
46 | typedef mad_fixed_t mad_sample_t; | 46 | typedef mad_fixed_t mad_sample_t; |
47 | # endif | 47 | # endif |
48 | 48 | ||
49 | /* | 49 | /* |
50 | * Fixed-point format: 0xABBBBBBB | 50 | * Fixed-point format: 0xABBBBBBB |
51 | * A == whole part (sign + 3 bits) | 51 | * A == whole part (sign + 3 bits) |
52 | * B == fractional part (28 bits) | 52 | * B == fractional part (28 bits) |
53 | * | 53 | * |
54 | * Values are signed two's complement, so the effective range is: | 54 | * Values are signed two's complement, so the effective range is: |
55 | * 0x80000000 to 0x7fffffff | 55 | * 0x80000000 to 0x7fffffff |
56 | * -8.0 to +7.9999999962747097015380859375 | 56 | * -8.0 to +7.9999999962747097015380859375 |
57 | * | 57 | * |
58 | * The smallest representable value is: | 58 | * The smallest representable value is: |
59 | * 0x00000001 == 0.0000000037252902984619140625 (i.e. about 3.725e-9) | 59 | * 0x00000001 == 0.0000000037252902984619140625 (i.e. about 3.725e-9) |
60 | * | 60 | * |
61 | * 28 bits of fractional accuracy represent about | 61 | * 28 bits of fractional accuracy represent about |
62 | * 8.6 digits of decimal accuracy. | 62 | * 8.6 digits of decimal accuracy. |
63 | * | 63 | * |
64 | * Fixed-point numbers can be added or subtracted as normal | 64 | * Fixed-point numbers can be added or subtracted as normal |
65 | * integers, but multiplication requires shifting the 64-bit result | 65 | * integers, but multiplication requires shifting the 64-bit result |
66 | * from 56 fractional bits back to 28 (and rounding.) | 66 | * from 56 fractional bits back to 28 (and rounding.) |
67 | * | 67 | * |
68 | * Changing the definition of MAD_F_FRACBITS is only partially | 68 | * Changing the definition of MAD_F_FRACBITS is only partially |
69 | * supported, and must be done with care. | 69 | * supported, and must be done with care. |
70 | */ | 70 | */ |
71 | 71 | ||
72 | # define MAD_F_FRACBITS 28 | 72 | # define MAD_F_FRACBITS 28 |
73 | 73 | ||
74 | # if MAD_F_FRACBITS == 28 | 74 | # if MAD_F_FRACBITS == 28 |
75 | # define MAD_F(x) ((mad_fixed_t) (x##L)) | 75 | # define MAD_F(x) ((mad_fixed_t) (x##L)) |
76 | # else | 76 | # else |
77 | # if MAD_F_FRACBITS < 28 | 77 | # if MAD_F_FRACBITS < 28 |
78 | # warning "MAD_F_FRACBITS < 28" | 78 | # warning "MAD_F_FRACBITS < 28" |
79 | # define MAD_F(x) ((mad_fixed_t) \ | 79 | # define MAD_F(x) ((mad_fixed_t) \ |
80 | (((x##L) + \ | 80 | (((x##L) + \ |
81 | (1L << (28 - MAD_F_FRACBITS - 1))) >> \ | 81 | (1L << (28 - MAD_F_FRACBITS - 1))) >> \ |
82 | (28 - MAD_F_FRACBITS))) | 82 | (28 - MAD_F_FRACBITS))) |
83 | # elif MAD_F_FRACBITS > 28 | 83 | # elif MAD_F_FRACBITS > 28 |
84 | # error "MAD_F_FRACBITS > 28 not currently supported" | 84 | # error "MAD_F_FRACBITS > 28 not currently supported" |
85 | # define MAD_F(x) ((mad_fixed_t) \ | 85 | # define MAD_F(x) ((mad_fixed_t) \ |
86 | ((x##L) << (MAD_F_FRACBITS - 28))) | 86 | ((x##L) << (MAD_F_FRACBITS - 28))) |
87 | # endif | 87 | # endif |
88 | # endif | 88 | # endif |
89 | 89 | ||
90 | # define MAD_F_MIN ((mad_fixed_t) -0x80000000L) | 90 | # define MAD_F_MIN ((mad_fixed_t) -0x80000000L) |
91 | # define MAD_F_MAX ((mad_fixed_t) +0x7fffffffL) | 91 | # define MAD_F_MAX ((mad_fixed_t) +0x7fffffffL) |
92 | 92 | ||
93 | # define MAD_F_ONE MAD_F(0x10000000) | 93 | # define MAD_F_ONE MAD_F(0x10000000) |
94 | 94 | ||
95 | # define mad_f_tofixed(x)((mad_fixed_t) \ | 95 | # define mad_f_tofixed(x)((mad_fixed_t) \ |
96 | ((x) * (double) (1L << MAD_F_FRACBITS) + 0.5)) | 96 | ((x) * (double) (1L << MAD_F_FRACBITS) + 0.5)) |
97 | # define mad_f_todouble(x)((double) \ | 97 | # define mad_f_todouble(x)((double) \ |
98 | ((x) / (double) (1L << MAD_F_FRACBITS))) | 98 | ((x) / (double) (1L << MAD_F_FRACBITS))) |
99 | 99 | ||
100 | # define mad_f_intpart(x)((x) >> MAD_F_FRACBITS) | 100 | # define mad_f_intpart(x)((x) >> MAD_F_FRACBITS) |
101 | # define mad_f_fracpart(x)((x) & ((1L << MAD_F_FRACBITS) - 1)) | 101 | # define mad_f_fracpart(x)((x) & ((1L << MAD_F_FRACBITS) - 1)) |
102 | /* (x should be positive) */ | 102 | /* (x should be positive) */ |
103 | 103 | ||
104 | # define mad_f_fromint(x)((x) << MAD_F_FRACBITS) | 104 | # define mad_f_fromint(x)((x) << MAD_F_FRACBITS) |
105 | 105 | ||
106 | # define mad_f_add(x, y)((x) + (y)) | 106 | # define mad_f_add(x, y)((x) + (y)) |
107 | # define mad_f_sub(x, y)((x) - (y)) | 107 | # define mad_f_sub(x, y)((x) - (y)) |
108 | 108 | ||
109 | # if defined(FPM_FLOAT) | 109 | # if defined(FPM_FLOAT) |
110 | # error "FPM_FLOAT not yet supported" | 110 | # error "FPM_FLOAT not yet supported" |
111 | 111 | ||
112 | # undef MAD_F | 112 | # undef MAD_F |
113 | # define MAD_F(x) mad_f_todouble(x) | 113 | # define MAD_F(x) mad_f_todouble(x) |
114 | 114 | ||
115 | # define mad_f_mul(x, y)((x) * (y)) | 115 | # define mad_f_mul(x, y)((x) * (y)) |
116 | # define mad_f_scale64 | 116 | # define mad_f_scale64 |
117 | 117 | ||
118 | # undef ASO_ZEROCHECK | 118 | # undef ASO_ZEROCHECK |
119 | 119 | ||
120 | # elif defined(FPM_64BIT) | 120 | # elif defined(FPM_64BIT) |
121 | 121 | ||
122 | /* | 122 | /* |
123 | * This version should be the most accurate if 64-bit types are supported by | 123 | * This version should be the most accurate if 64-bit types are supported by |
124 | * the compiler, although it may not be the most efficient. | 124 | * the compiler, although it may not be the most efficient. |
125 | */ | 125 | */ |
126 | # if defined(OPT_ACCURACY) | 126 | # if defined(OPT_ACCURACY) |
127 | # define mad_f_mul(x, y) \ | 127 | # define mad_f_mul(x, y) \ |
128 | ((mad_fixed_t) \ | 128 | ((mad_fixed_t) \ |
129 | ((((mad_fixed64_t) (x) * (y)) + \ | 129 | ((((mad_fixed64_t) (x) * (y)) + \ |
130 | (1L << (MAD_F_SCALEBITS - 1))) >> MAD_F_SCALEBITS)) | 130 | (1L << (MAD_F_SCALEBITS - 1))) >> MAD_F_SCALEBITS)) |
131 | # else | 131 | # else |
132 | # define mad_f_mul(x, y) \ | 132 | # define mad_f_mul(x, y) \ |
133 | ((mad_fixed_t) (((mad_fixed64_t) (x) * (y)) >> MAD_F_SCALEBITS)) | 133 | ((mad_fixed_t) (((mad_fixed64_t) (x) * (y)) >> MAD_F_SCALEBITS)) |
134 | # endif | 134 | # endif |
135 | 135 | ||
136 | # define MAD_F_SCALEBITS MAD_F_FRACBITS | 136 | # define MAD_F_SCALEBITS MAD_F_FRACBITS |
137 | 137 | ||
138 | /* --- Intel --------------------------------------------------------------- */ | 138 | /* --- Intel --------------------------------------------------------------- */ |
139 | 139 | ||
140 | # elif defined(FPM_INTEL) | 140 | # elif defined(FPM_INTEL) |
141 | 141 | ||
142 | # if defined(_MSC_VER) | 142 | # if defined(_MSC_VER) |
143 | # pragma warning(push) | 143 | # pragma warning(push) |
144 | # pragma warning(disable: 4035) /* no return value */ | 144 | # pragma warning(disable: 4035) /* no return value */ |
145 | static __forceinline | 145 | static __forceinline |
146 | mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) | 146 | mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) |
147 | { | 147 | { |
148 | enum { | 148 | enum { |
149 | fracbits = MAD_F_FRACBITS | 149 | fracbits = MAD_F_FRACBITS |
150 | }; | 150 | }; |
151 | 151 | ||
152 | __asm { | 152 | __asm { |
153 | mov eax, x | 153 | mov eax, x |
154 | imul y | 154 | imul y |
155 | shrd eax, edx, fracbits | 155 | shrd eax, edx, fracbits |
156 | } | 156 | } |
157 | 157 | ||
158 | /* implicit return of eax */ | 158 | /* implicit return of eax */ |
159 | } | 159 | } |
160 | # pragma warning(pop) | 160 | # pragma warning(pop) |
161 | 161 | ||
162 | # define mad_f_mul mad_f_mul_inline | 162 | # define mad_f_mul mad_f_mul_inline |
163 | # define mad_f_scale64 | 163 | # define mad_f_scale64 |
164 | # else | 164 | # else |
165 | /* | 165 | /* |
166 | * This Intel version is fast and accurate; the disposition of the least | 166 | * This Intel version is fast and accurate; the disposition of the least |
167 | * significant bit depends on OPT_ACCURACY via mad_f_scale64(). | 167 | * significant bit depends on OPT_ACCURACY via mad_f_scale64(). |
168 | */ | 168 | */ |
169 | # define MAD_F_MLX(hi, lo, x, y) \ | 169 | # define MAD_F_MLX(hi, lo, x, y) \ |
170 | asm ("imull %3" \ | 170 | asm ("imull %3" \ |
171 | : "=a" (lo), "=d" (hi) \ | 171 | : "=a" (lo), "=d" (hi) \ |
172 | : "%a" (x), "rm" (y) \ | 172 | : "%a" (x), "rm" (y) \ |
173 | : "cc") | 173 | : "cc") |
174 | 174 | ||
175 | # if defined(OPT_ACCURACY) | 175 | # if defined(OPT_ACCURACY) |
176 | /* | 176 | /* |
177 | * This gives best accuracy but is not very fast. | 177 | * This gives best accuracy but is not very fast. |
178 | */ | 178 | */ |
179 | # define MAD_F_MLA(hi, lo, x, y) \ | 179 | # define MAD_F_MLA(hi, lo, x, y) \ |
180 | ({ mad_fixed64hi_t __hi; \ | 180 | ({ mad_fixed64hi_t __hi; \ |
181 | mad_fixed64lo_t __lo; \ | 181 | mad_fixed64lo_t __lo; \ |
182 | MAD_F_MLX(__hi, __lo, (x), (y)); \ | 182 | MAD_F_MLX(__hi, __lo, (x), (y)); \ |
183 | asm ("addl %2,%0\n\t" \ | 183 | asm ("addl %2,%0\n\t" \ |
184 | "adcl %3,%1" \ | 184 | "adcl %3,%1" \ |
185 | : "=rm" (lo), "=rm" (hi) \ | 185 | : "=rm" (lo), "=rm" (hi) \ |
186 | : "r" (__lo), "r" (__hi), "0" (lo), "1" (hi) \ | 186 | : "r" (__lo), "r" (__hi), "0" (lo), "1" (hi) \ |
187 | : "cc"); \ | 187 | : "cc"); \ |
188 | }) | 188 | }) |
189 | # endif /* OPT_ACCURACY */ | 189 | # endif /* OPT_ACCURACY */ |
190 | 190 | ||
191 | # if defined(OPT_ACCURACY) | 191 | # if defined(OPT_ACCURACY) |
192 | /* | 192 | /* |
193 | * Surprisingly, this is faster than SHRD followed by ADC. | 193 | * Surprisingly, this is faster than SHRD followed by ADC. |
194 | */ | 194 | */ |
195 | # define mad_f_scale64(hi, lo) \ | 195 | # define mad_f_scale64(hi, lo) \ |
196 | ({ mad_fixed64hi_t __hi_; \ | 196 | ({ mad_fixed64hi_t __hi_; \ |
197 | mad_fixed64lo_t __lo_; \ | 197 | mad_fixed64lo_t __lo_; \ |
198 | mad_fixed_t __result; \ | 198 | mad_fixed_t __result; \ |
199 | asm ("addl %4,%2\n\t" \ | 199 | asm ("addl %4,%2\n\t" \ |
200 | "adcl %5,%3" \ | 200 | "adcl %5,%3" \ |
201 | : "=rm" (__lo_), "=rm" (__hi_) \ | 201 | : "=rm" (__lo_), "=rm" (__hi_) \ |
202 | : "0" (lo), "1" (hi), \ | 202 | : "0" (lo), "1" (hi), \ |
203 | "ir" (1L << (MAD_F_SCALEBITS - 1)), "ir" (0) \ | 203 | "ir" (1L << (MAD_F_SCALEBITS - 1)), "ir" (0) \ |
204 | : "cc"); \ | 204 | : "cc"); \ |
205 | asm ("shrdl %3,%2,%1" \ | 205 | asm ("shrdl %3,%2,%1" \ |
206 | : "=rm" (__result) \ | 206 | : "=rm" (__result) \ |
207 | : "0" (__lo_), "r" (__hi_), "I" (MAD_F_SCALEBITS) \ | 207 | : "0" (__lo_), "r" (__hi_), "I" (MAD_F_SCALEBITS) \ |
208 | : "cc"); \ | 208 | : "cc"); \ |
209 | __result; \ | 209 | __result; \ |
210 | }) | 210 | }) |
211 | # elif defined(OPT_INTEL) | ||
212 | /* | ||
213 | * Alternate Intel scaling that may or may not perform better. | ||
214 | */ | ||
215 | # define mad_f_scale64(hi, lo) \ | ||
216 | ({ mad_fixed_t __result; \ | ||
217 | asm ("shrl %3,%1\n\t" \ | ||
218 | "shll %4,%2\n\t" \ | ||
219 | "orl %2,%1" \ | ||
220 | : "=rm" (__result) \ | ||
221 | : "0" (lo), "r" (hi), \ | ||
222 | "I" (MAD_F_SCALEBITS), "I" (32 - MAD_F_SCALEBITS) \ | ||
223 | : "cc"); \ | ||
224 | __result; \ | ||
225 | }) | ||
211 | # else | 226 | # else |
212 | # define mad_f_scale64(hi, lo) \ | 227 | # define mad_f_scale64(hi, lo) \ |
213 | ({ mad_fixed_t __result; \ | 228 | ({ mad_fixed_t __result; \ |
214 | asm ("shrdl %3,%2,%1" \ | 229 | asm ("shrdl %3,%2,%1" \ |
215 | : "=rm" (__result) \ | 230 | : "=rm" (__result) \ |
216 | : "0" (lo), "r" (hi), "I" (MAD_F_SCALEBITS) \ | 231 | : "0" (lo), "r" (hi), "I" (MAD_F_SCALEBITS) \ |
217 | : "cc"); \ | 232 | : "cc"); \ |
218 | __result; \ | 233 | __result; \ |
219 | }) | 234 | }) |
220 | # endif /* OPT_ACCURACY */ | 235 | # endif /* OPT_ACCURACY */ |
221 | 236 | ||
222 | # define MAD_F_SCALEBITS MAD_F_FRACBITS | 237 | # define MAD_F_SCALEBITS MAD_F_FRACBITS |
223 | # endif | 238 | # endif |
224 | 239 | ||
225 | /* --- ARM ----------------------------------------------------------------- */ | 240 | /* --- ARM ----------------------------------------------------------------- */ |
226 | 241 | ||
227 | # elif defined(FPM_ARM) | 242 | # elif defined(FPM_ARM) |
228 | 243 | ||
229 | /* | 244 | /* |
230 | * This ARM V4 version is as accurate as FPM_64BIT but much faster. The | 245 | * This ARM V4 version is as accurate as FPM_64BIT but much faster. The |
231 | * least significant bit is properly rounded at no CPU cycle cost! | 246 | * least significant bit is properly rounded at no CPU cycle cost! |
232 | */ | 247 | */ |
233 | # if 1 | 248 | # if 1 |
234 | /* | 249 | /* |
235 | * There's a bug somewhere, possibly in the compiler, that sometimes makes | 250 | * This is faster than the default implementation via MAD_F_MLX() and |
236 | * this necessary instead of the default implementation via MAD_F_MLX and | 251 | * mad_f_scale64(). |
237 | * mad_f_scale64. It may be related to the use (or lack) of | ||
238 | * -finline-functions and/or -fstrength-reduce. | ||
239 | * | ||
240 | * This is also apparently faster than MAD_F_MLX/mad_f_scale64. | ||
241 | */ | 252 | */ |
242 | # define mad_f_mul(x, y) \ | 253 | # define mad_f_mul(x, y) \ |
243 | ({ mad_fixed64hi_t __hi; \ | 254 | ({ mad_fixed64hi_t __hi; \ |
244 | mad_fixed64lo_t __lo; \ | 255 | mad_fixed64lo_t __lo; \ |
245 | mad_fixed_t __result; \ | 256 | mad_fixed_t __result; \ |
246 | asm ("smull%0, %1, %3, %4\n\t" \ | 257 | asm ("smull%0, %1, %3, %4\n\t" \ |
247 | "movs%0, %0, lsr %5\n\t" \ | 258 | "movs%0, %0, lsr %5\n\t" \ |
248 | "adc%2, %0, %1, lsl %6" \ | 259 | "adc%2, %0, %1, lsl %6" \ |
249 | : "=&r" (__lo), "=&r" (__hi), "=r" (__result) \ | 260 | : "=&r" (__lo), "=&r" (__hi), "=r" (__result) \ |
250 | : "%r" (x), "r" (y), \ | 261 | : "%r" (x), "r" (y), \ |
251 | "M" (MAD_F_SCALEBITS), "M" (32 - MAD_F_SCALEBITS) \ | 262 | "M" (MAD_F_SCALEBITS), "M" (32 - MAD_F_SCALEBITS) \ |
252 | : "cc"); \ | 263 | : "cc"); \ |
253 | __result; \ | 264 | __result; \ |
254 | }) | 265 | }) |
255 | # endif | 266 | # endif |
256 | 267 | ||
257 | # define MAD_F_MLX(hi, lo, x, y) \ | 268 | # define MAD_F_MLX(hi, lo, x, y) \ |
258 | asm ("smull%0, %1, %2, %3" \ | 269 | asm ("smull%0, %1, %2, %3" \ |
259 | : "=&r" (lo), "=&r" (hi) \ | 270 | : "=&r" (lo), "=&r" (hi) \ |
260 | : "%r" (x), "r" (y)) | 271 | : "%r" (x), "r" (y)) |
261 | 272 | ||
262 | # define MAD_F_MLA(hi, lo, x, y) \ | 273 | # define MAD_F_MLA(hi, lo, x, y) \ |
263 | asm ("smlal%0, %1, %2, %3" \ | 274 | asm ("smlal%0, %1, %2, %3" \ |
264 | : "+r" (lo), "+r" (hi) \ | 275 | : "+r" (lo), "+r" (hi) \ |
265 | : "%r" (x), "r" (y)) | 276 | : "%r" (x), "r" (y)) |
266 | 277 | ||
267 | # define MAD_F_MLN(hi, lo) \ | 278 | # define MAD_F_MLN(hi, lo) \ |
268 | asm ("rsbs%0, %2, #0\n\t" \ | 279 | asm ("rsbs%0, %2, #0\n\t" \ |
269 | "rsc%1, %3, #0" \ | 280 | "rsc%1, %3, #0" \ |
270 | : "=r" (lo), "=r" (hi) \ | 281 | : "=r" (lo), "=r" (hi) \ |
271 | : "0" (lo), "1" (hi) \ | 282 | : "0" (lo), "1" (hi) \ |
272 | : "cc") | 283 | : "cc") |
273 | 284 | ||
274 | # define mad_f_scale64(hi, lo) \ | 285 | # define mad_f_scale64(hi, lo) \ |
275 | ({ mad_fixed_t __result; \ | 286 | ({ mad_fixed_t __result; \ |
276 | asm ("movs%0, %1, lsr %3\n\t" \ | 287 | asm ("movs%0, %1, lsr %3\n\t" \ |
277 | "adc%0, %0, %2, lsl %4" \ | 288 | "adc%0, %0, %2, lsl %4" \ |
278 | : "=r" (__result) \ | 289 | : "=&r" (__result) \ |
279 | : "r" (lo), "r" (hi), \ | 290 | : "r" (lo), "r" (hi), \ |
280 | "M" (MAD_F_SCALEBITS), "M" (32 - MAD_F_SCALEBITS) \ | 291 | "M" (MAD_F_SCALEBITS), "M" (32 - MAD_F_SCALEBITS) \ |
281 | : "cc"); \ | 292 | : "cc"); \ |
282 | __result; \ | 293 | __result; \ |
283 | }) | 294 | }) |
284 | 295 | ||
285 | # define MAD_F_SCALEBITS MAD_F_FRACBITS | 296 | # define MAD_F_SCALEBITS MAD_F_FRACBITS |
286 | 297 | ||
287 | /* --- MIPS ---------------------------------------------------------------- */ | 298 | /* --- MIPS ---------------------------------------------------------------- */ |
288 | 299 | ||
289 | # elif defined(FPM_MIPS) | 300 | # elif defined(FPM_MIPS) |
290 | 301 | ||
291 | /* | 302 | /* |
292 | * This MIPS version is fast and accurate; the disposition of the least | 303 | * This MIPS version is fast and accurate; the disposition of the least |
293 | * significant bit depends on OPT_ACCURACY via mad_f_scale64(). | 304 | * significant bit depends on OPT_ACCURACY via mad_f_scale64(). |
294 | */ | 305 | */ |
295 | # define MAD_F_MLX(hi, lo, x, y) \ | 306 | # define MAD_F_MLX(hi, lo, x, y) \ |
296 | asm ("mult%2,%3" \ | 307 | asm ("mult%2,%3" \ |
297 | : "=l" (lo), "=h" (hi) \ | 308 | : "=l" (lo), "=h" (hi) \ |
298 | : "%r" (x), "r" (y)) | 309 | : "%r" (x), "r" (y)) |
299 | 310 | ||
300 | # if defined(HAVE_MADD_ASM) | 311 | # if defined(HAVE_MADD_ASM) |
301 | # define MAD_F_MLA(hi, lo, x, y) \ | 312 | # define MAD_F_MLA(hi, lo, x, y) \ |
302 | asm ("madd%2,%3" \ | 313 | asm ("madd%2,%3" \ |
303 | : "+l" (lo), "+h" (hi) \ | 314 | : "+l" (lo), "+h" (hi) \ |
304 | : "%r" (x), "r" (y)) | 315 | : "%r" (x), "r" (y)) |
305 | # elif defined(HAVE_MADD16_ASM) | 316 | # elif defined(HAVE_MADD16_ASM) |
306 | /* | 317 | /* |
307 | * This loses significant accuracy due to the 16-bit integer limit in the | 318 | * This loses significant accuracy due to the 16-bit integer limit in the |
308 | * multiply/accumulate instruction. | 319 | * multiply/accumulate instruction. |
309 | */ | 320 | */ |
310 | # define MAD_F_ML0(hi, lo, x, y) \ | 321 | # define MAD_F_ML0(hi, lo, x, y) \ |
311 | asm ("mult%2,%3" \ | 322 | asm ("mult%2,%3" \ |
312 | : "=l" (lo), "=h" (hi) \ | 323 | : "=l" (lo), "=h" (hi) \ |
313 | : "%r" ((x) >> 12), "r" ((y) >> 16)) | 324 | : "%r" ((x) >> 12), "r" ((y) >> 16)) |
314 | # define MAD_F_MLA(hi, lo, x, y) \ | 325 | # define MAD_F_MLA(hi, lo, x, y) \ |
315 | asm ("madd16%2,%3" \ | 326 | asm ("madd16%2,%3" \ |
316 | : "+l" (lo), "+h" (hi) \ | 327 | : "+l" (lo), "+h" (hi) \ |
317 | : "%r" ((x) >> 12), "r" ((y) >> 16)) | 328 | : "%r" ((x) >> 12), "r" ((y) >> 16)) |
318 | # define MAD_F_MLZ(hi, lo) ((mad_fixed_t) (lo)) | 329 | # define MAD_F_MLZ(hi, lo) ((mad_fixed_t) (lo)) |
319 | # endif | 330 | # endif |
320 | 331 | ||
321 | # if defined(OPT_SPEED) | 332 | # if defined(OPT_SPEED) |
322 | # define mad_f_scale64(hi, lo) \ | 333 | # define mad_f_scale64(hi, lo) \ |
323 | ((mad_fixed_t) ((hi) << (32 - MAD_F_SCALEBITS))) | 334 | ((mad_fixed_t) ((hi) << (32 - MAD_F_SCALEBITS))) |
324 | # define MAD_F_SCALEBITS MAD_F_FRACBITS | 335 | # define MAD_F_SCALEBITS MAD_F_FRACBITS |
325 | # endif | 336 | # endif |
326 | 337 | ||
327 | /* --- SPARC --------------------------------------------------------------- */ | 338 | /* --- SPARC --------------------------------------------------------------- */ |
328 | 339 | ||
329 | # elif defined(FPM_SPARC) | 340 | # elif defined(FPM_SPARC) |
330 | 341 | ||
331 | /* | 342 | /* |
332 | * This SPARC V8 version is fast and accurate; the disposition of the least | 343 | * This SPARC V8 version is fast and accurate; the disposition of the least |
333 | * significant bit depends on OPT_ACCURACY via mad_f_scale64(). | 344 | * significant bit depends on OPT_ACCURACY via mad_f_scale64(). |
334 | */ | 345 | */ |
335 | # define MAD_F_MLX(hi, lo, x, y) \ | 346 | # define MAD_F_MLX(hi, lo, x, y) \ |
336 | asm ("smul %2, %3, %0\n\t" \ | 347 | asm ("smul %2, %3, %0\n\t" \ |
337 | "rd %%y, %1" \ | 348 | "rd %%y, %1" \ |
338 | : "=r" (lo), "=r" (hi) \ | 349 | : "=r" (lo), "=r" (hi) \ |
339 | : "%r" (x), "rI" (y)) | 350 | : "%r" (x), "rI" (y)) |
340 | 351 | ||
341 | /* --- PowerPC ------------------------------------------------------------- */ | 352 | /* --- PowerPC ------------------------------------------------------------- */ |
342 | 353 | ||
343 | # elif defined(FPM_PPC) | 354 | # elif defined(FPM_PPC) |
344 | 355 | ||
345 | /* | 356 | /* |
346 | * This PowerPC version is tuned for the 4xx embedded processors. It is | 357 | * This PowerPC version is fast and accurate; the disposition of the least |
347 | * effectively a tuned version of FPM_64BIT. It is a little faster and just | 358 | * significant bit depends on OPT_ACCURACY via mad_f_scale64(). |
348 | * as accurate. The disposition of the least significant bit depends on | ||
349 | * OPT_ACCURACY via mad_f_scale64(). | ||
350 | */ | 359 | */ |
351 | # define MAD_F_MLX(hi, lo, x, y) \ | 360 | # define MAD_F_MLX(hi, lo, x, y) \ |
352 | asm ("mulhw %1, %2, %3\n\t" \ | 361 | do { \ |
353 | "mullw %0, %2, %3" \ | 362 | asm ("mullw %0,%1,%2" \ |
354 | : "=&r" (lo), "=&r" (hi) \ | 363 | : "=r" (lo) \ |
355 | : "%r" (x), "r" (y)) | 364 | : "%r" (x), "r" (y)); \ |
365 | asm ("mulhw %0,%1,%2" \ | ||
366 | : "=r" (hi) \ | ||
367 | : "%r" (x), "r" (y)); \ | ||
368 | } \ | ||
369 | while (0) | ||
356 | 370 | ||
357 | # define MAD_F_MLA(hi, lo, x, y) \ | 371 | # if defined(OPT_ACCURACY) |
372 | /* | ||
373 | * This gives best accuracy but is not very fast. | ||
374 | */ | ||
375 | # define MAD_F_MLA(hi, lo, x, y) \ | ||
358 | ({ mad_fixed64hi_t __hi; \ | 376 | ({ mad_fixed64hi_t __hi; \ |
359 | mad_fixed64lo_t __lo; \ | 377 | mad_fixed64lo_t __lo; \ |
360 | MAD_F_MLX(__hi, __lo, (x), (y)); \ | 378 | MAD_F_MLX(__hi, __lo, (x), (y)); \ |
361 | asm ("addc %0, %2, %3\n\t" \ | 379 | asm ("addc %0,%2,%3\n\t" \ |
362 | "adde %1, %4, %5" \ | 380 | "adde %1,%4,%5" \ |
363 | : "=r" (lo), "=r" (hi) \ | 381 | : "=r" (lo), "=r" (hi) \ |
364 | : "%r" (__lo), "0" (lo), "%r" (__hi), "1" (hi)); \ | 382 | : "%r" (lo), "r" (__lo), \ |
383 | "%r" (hi), "r" (__hi) \ | ||
384 | : "xer"); \ | ||
365 | }) | 385 | }) |
386 | # endif | ||
366 | 387 | ||
367 | # if defined(OPT_ACCURACY) | 388 | # if defined(OPT_ACCURACY) |
368 | /* | 389 | /* |
369 | * This is accurate and ~2 - 2.5 times slower than the unrounded version. | 390 | * This is slower than the truncating version below it. |
370 | * | ||
371 | * The __volatile__ improves the generated code by another 5% (fewer spills | ||
372 | * to memory); eventually they should be removed. | ||
373 | */ | 391 | */ |
374 | # define mad_f_scale64(hi, lo) \ | 392 | # define mad_f_scale64(hi, lo) \ |
375 | ({ mad_fixed_t __result; \ | 393 | ({ mad_fixed_t __result, __round; \ |
376 | mad_fixed64hi_t __hi_; \ | 394 | asm ("rotrwi %0,%1,%2" \ |
377 | mad_fixed64lo_t __lo_; \ | 395 | : "=r" (__result) \ |
378 | asm __volatile__ ("addc %0, %2, %4\n\t" \ | 396 | : "r" (lo), "i" (MAD_F_SCALEBITS)); \ |
379 | "addze %1, %3" \ | 397 | asm ("extrwi %0,%1,1,0" \ |
380 | : "=r" (__lo_), "=r" (__hi_) \ | 398 | : "=r" (__round) \ |
381 | : "r" (lo), "r" (hi), "r" (1 << (MAD_F_SCALEBITS - 1))); \ | 399 | : "r" (__result)); \ |
382 | asm __volatile__ ("rlwinm %0, %2,32-%3,0,%3-1\n\t" \ | 400 | asm ("insrwi %0,%1,%2,0" \ |
383 | "rlwimi %0, %1,32-%3,%3,31" \ | 401 | : "+r" (__result) \ |
384 | : "=&r" (__result) \ | 402 | : "r" (hi), "i" (MAD_F_SCALEBITS)); \ |
385 | : "r" (__lo_), "r" (__hi_), "I" (MAD_F_SCALEBITS)); \ | 403 | asm ("add %0,%1,%2" \ |
386 | __result; \ | 404 | : "=r" (__result) \ |
405 | : "%r" (__result), "r" (__round)); \ | ||
406 | __result; \ | ||
387 | }) | 407 | }) |
388 | # else | 408 | # else |
389 | # define mad_f_scale64(hi, lo) \ | 409 | # define mad_f_scale64(hi, lo) \ |
390 | ({ mad_fixed_t __result; \ | 410 | ({ mad_fixed_t __result; \ |
391 | asm ("rlwinm %0, %2,32-%3,0,%3-1\n\t" \ | 411 | asm ("rotrwi %0,%1,%2" \ |
392 | "rlwimi %0, %1,32-%3,%3,31" \ | ||
393 | : "=r" (__result) \ | 412 | : "=r" (__result) \ |
394 | : "r" (lo), "r" (hi), "I" (MAD_F_SCALEBITS)); \ | 413 | : "r" (lo), "i" (MAD_F_SCALEBITS)); \ |
395 | __result; \ | 414 | asm ("insrwi %0,%1,%2,0" \ |
415 | : "+r" (__result) \ | ||
416 | : "r" (hi), "i" (MAD_F_SCALEBITS)); \ | ||
417 | __result; \ | ||
396 | }) | 418 | }) |
397 | # endif /* OPT_ACCURACY */ | 419 | # endif |
398 | 420 | ||
399 | # define MAD_F_SCALEBITS MAD_F_FRACBITS | 421 | # define MAD_F_SCALEBITS MAD_F_FRACBITS |
400 | 422 | ||
401 | /* --- Default ------------------------------------------------------------- */ | 423 | /* --- Default ------------------------------------------------------------- */ |
402 | 424 | ||
403 | # elif defined(FPM_DEFAULT) | 425 | # elif defined(FPM_DEFAULT) |
404 | 426 | ||
405 | /* | 427 | /* |
406 | * This version is the most portable but it loses significant accuracy. | 428 | * This version is the most portable but it loses significant accuracy. |
407 | * Furthermore, accuracy is biased against the second argument, so care | 429 | * Furthermore, accuracy is biased against the second argument, so care |
408 | * should be taken when ordering operands. | 430 | * should be taken when ordering operands. |
409 | * | 431 | * |
410 | * The scale factors are constant as this is not used with SSO. | 432 | * The scale factors are constant as this is not used with SSO. |
411 | * | 433 | * |
412 | * Pre-rounding is required to stay within the limits of compliance. | 434 | * Pre-rounding is required to stay within the limits of compliance. |
413 | */ | 435 | */ |
414 | # if defined(OPT_SPEED) | 436 | # if defined(OPT_SPEED) |
415 | # define mad_f_mul(x, y)(((x) >> 12) * ((y) >> 16)) | 437 | # define mad_f_mul(x, y)(((x) >> 12) * ((y) >> 16)) |
416 | # else | 438 | # else |
417 | # define mad_f_mul(x, y)((((x) + (1L << 11)) >> 12) * \ | 439 | # define mad_f_mul(x, y)((((x) + (1L << 11)) >> 12) * \ |
418 | (((y) + (1L << 15)) >> 16)) | 440 | (((y) + (1L << 15)) >> 16)) |
419 | # endif | 441 | # endif |
420 | 442 | ||
421 | /* ------------------------------------------------------------------------- */ | 443 | /* ------------------------------------------------------------------------- */ |
422 | 444 | ||
423 | # else | 445 | # else |
424 | # error "no FPM selected" | 446 | # error "no FPM selected" |
425 | # endif | 447 | # endif |
426 | 448 | ||
427 | /* default implementations */ | 449 | /* default implementations */ |
428 | 450 | ||
429 | # if !defined(mad_f_mul) | 451 | # if !defined(mad_f_mul) |
430 | # define mad_f_mul(x, y) \ | 452 | # define mad_f_mul(x, y) \ |
431 | ({ mad_fixed64hi_t __hi; \ | 453 | ({ register mad_fixed64hi_t __hi; \ |
432 | mad_fixed64lo_t __lo; \ | 454 | register mad_fixed64lo_t __lo; \ |
433 | MAD_F_MLX(__hi, __lo, (x), (y)); \ | 455 | MAD_F_MLX(__hi, __lo, (x), (y)); \ |
434 | mad_f_scale64(__hi, __lo); \ | 456 | mad_f_scale64(__hi, __lo); \ |
435 | }) | 457 | }) |
436 | # endif | 458 | # endif |
437 | 459 | ||
438 | # if !defined(MAD_F_MLA) | 460 | # if !defined(MAD_F_MLA) |
439 | # define MAD_F_ML0(hi, lo, x, y)((lo) = mad_f_mul((x), (y))) | 461 | # define MAD_F_ML0(hi, lo, x, y)((lo) = mad_f_mul((x), (y))) |
440 | # define MAD_F_MLA(hi, lo, x, y)((lo) += mad_f_mul((x), (y))) | 462 | # define MAD_F_MLA(hi, lo, x, y)((lo) += mad_f_mul((x), (y))) |
441 | # define MAD_F_MLN(hi, lo) ((lo) = -(lo)) | 463 | # define MAD_F_MLN(hi, lo) ((lo) = -(lo)) |
442 | # define MAD_F_MLZ(hi, lo) ((void) (hi), (mad_fixed_t) (lo)) | 464 | # define MAD_F_MLZ(hi, lo) ((void) (hi), (mad_fixed_t) (lo)) |
443 | # endif | 465 | # endif |
444 | 466 | ||
445 | # if !defined(MAD_F_ML0) | 467 | # if !defined(MAD_F_ML0) |
446 | # define MAD_F_ML0(hi, lo, x, y)MAD_F_MLX((hi), (lo), (x), (y)) | 468 | # define MAD_F_ML0(hi, lo, x, y)MAD_F_MLX((hi), (lo), (x), (y)) |
447 | # endif | 469 | # endif |
448 | 470 | ||
449 | # if !defined(MAD_F_MLN) | 471 | # if !defined(MAD_F_MLN) |
450 | # define MAD_F_MLN(hi, lo) ((hi) = ((lo) = -(lo)) ? ~(hi) : -(hi)) | 472 | # define MAD_F_MLN(hi, lo) ((hi) = ((lo) = -(lo)) ? ~(hi) : -(hi)) |
451 | # endif | 473 | # endif |
452 | 474 | ||
453 | # if !defined(MAD_F_MLZ) | 475 | # if !defined(MAD_F_MLZ) |
454 | # define MAD_F_MLZ(hi, lo) mad_f_scale64((hi), (lo)) | 476 | # define MAD_F_MLZ(hi, lo) mad_f_scale64((hi), (lo)) |
455 | # endif | 477 | # endif |
456 | 478 | ||
457 | # if !defined(mad_f_scale64) | 479 | # if !defined(mad_f_scale64) |
458 | # if defined(OPT_ACCURACY) | 480 | # if defined(OPT_ACCURACY) |
459 | # define mad_f_scale64(hi, lo) \ | 481 | # define mad_f_scale64(hi, lo) \ |
460 | ((((mad_fixed_t) \ | 482 | ((((mad_fixed_t) \ |
461 | (((hi) << (32 - (MAD_F_SCALEBITS - 1))) | \ | 483 | (((hi) << (32 - (MAD_F_SCALEBITS - 1))) | \ |
462 | ((lo) >> (MAD_F_SCALEBITS - 1)))) + 1) >> 1) | 484 | ((lo) >> (MAD_F_SCALEBITS - 1)))) + 1) >> 1) |
463 | # else | 485 | # else |
464 | # define mad_f_scale64(hi, lo) \ | 486 | # define mad_f_scale64(hi, lo) \ |
465 | ((mad_fixed_t) \ | 487 | ((mad_fixed_t) \ |
466 | (((hi) << (32 - MAD_F_SCALEBITS)) | \ | 488 | (((hi) << (32 - MAD_F_SCALEBITS)) | \ |
467 | ((lo) >> MAD_F_SCALEBITS))) | 489 | ((lo) >> MAD_F_SCALEBITS))) |
468 | # endif | 490 | # endif |
469 | # define MAD_F_SCALEBITS MAD_F_FRACBITS | 491 | # define MAD_F_SCALEBITS MAD_F_FRACBITS |
470 | # endif | 492 | # endif |
471 | 493 | ||
472 | /* miscellaneous C routines */ | 494 | /* C routines */ |
473 | 495 | ||
474 | mad_fixed_t mad_f_abs(mad_fixed_t); | 496 | mad_fixed_t mad_f_abs(mad_fixed_t); |
497 | mad_fixed_t mad_f_div(mad_fixed_t, mad_fixed_t); | ||
475 | 498 | ||
476 | # endif | 499 | # endif |
diff --git a/core/multimedia/opieplayer/libmad/frame.c b/core/multimedia/opieplayer/libmad/frame.c index bf15e7f..3aacb56 100644 --- a/core/multimedia/opieplayer/libmad/frame.c +++ b/core/multimedia/opieplayer/libmad/frame.c | |||
@@ -1,499 +1,503 @@ | |||
1 | /* | 1 | /* |
2 | * libmad - MPEG audio decoder library | 2 | * libmad - MPEG audio decoder library |
3 | * Copyright (C) 2000-2001 Robert Leslie | 3 | * Copyright (C) 2000-2004 Underbit Technologies, Inc. |
4 | * | 4 | * |
5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
7 | * the Free Software Foundation; either version 2 of the License, or | 7 | * the Free Software Foundation; either version 2 of the License, or |
8 | * (at your option) any later version. | 8 | * (at your option) any later version. |
9 | * | 9 | * |
10 | * This program is distributed in the hope that it will be useful, | 10 | * This program is distributed in the hope that it will be useful, |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | * GNU General Public License for more details. | 13 | * GNU General Public License for more details. |
14 | * | 14 | * |
15 | * You should have received a copy of the GNU General Public License | 15 | * You should have received a copy of the GNU General Public License |
16 | * along with this program; if not, write to the Free Software | 16 | * along with this program; if not, write to the Free Software |
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
18 | * | 18 | * |
19 | * $Id$ | 19 | * $Id$ |
20 | */ | 20 | */ |
21 | 21 | ||
22 | # ifdef HAVE_CONFIG_H | 22 | # ifdef HAVE_CONFIG_H |
23 | # include "libmad_config.h" | 23 | # include "libmad_config.h" |
24 | # endif | 24 | # endif |
25 | 25 | ||
26 | # include "libmad_global.h" | 26 | # include "libmad_global.h" |
27 | 27 | ||
28 | # include <stdlib.h> | 28 | # include <stdlib.h> |
29 | 29 | ||
30 | # include "bit.h" | 30 | # include "bit.h" |
31 | # include "stream.h" | 31 | # include "stream.h" |
32 | # include "frame.h" | 32 | # include "frame.h" |
33 | # include "timer.h" | 33 | # include "timer.h" |
34 | # include "layer12.h" | 34 | # include "layer12.h" |
35 | # include "layer3.h" | 35 | # include "layer3.h" |
36 | 36 | ||
37 | static | 37 | static |
38 | unsigned long const bitrate_table[5][15] = { | 38 | unsigned long const bitrate_table[5][15] = { |
39 | /* MPEG-1 */ | 39 | /* MPEG-1 */ |
40 | { 0, 32000, 64000, 96000, 128000, 160000, 192000, 224000, /* Layer I */ | 40 | { 0, 32000, 64000, 96000, 128000, 160000, 192000, 224000, /* Layer I */ |
41 | 256000, 288000, 320000, 352000, 384000, 416000, 448000 }, | 41 | 256000, 288000, 320000, 352000, 384000, 416000, 448000 }, |
42 | { 0, 32000, 48000, 56000, 64000, 80000, 96000, 112000, /* Layer II */ | 42 | { 0, 32000, 48000, 56000, 64000, 80000, 96000, 112000, /* Layer II */ |
43 | 128000, 160000, 192000, 224000, 256000, 320000, 384000 }, | 43 | 128000, 160000, 192000, 224000, 256000, 320000, 384000 }, |
44 | { 0, 32000, 40000, 48000, 56000, 64000, 80000, 96000, /* Layer III */ | 44 | { 0, 32000, 40000, 48000, 56000, 64000, 80000, 96000, /* Layer III */ |
45 | 112000, 128000, 160000, 192000, 224000, 256000, 320000 }, | 45 | 112000, 128000, 160000, 192000, 224000, 256000, 320000 }, |
46 | 46 | ||
47 | /* MPEG-2 LSF */ | 47 | /* MPEG-2 LSF */ |
48 | { 0, 32000, 48000, 56000, 64000, 80000, 96000, 112000, /* Layer I */ | 48 | { 0, 32000, 48000, 56000, 64000, 80000, 96000, 112000, /* Layer I */ |
49 | 128000, 144000, 160000, 176000, 192000, 224000, 256000 }, | 49 | 128000, 144000, 160000, 176000, 192000, 224000, 256000 }, |
50 | { 0, 8000, 16000, 24000, 32000, 40000, 48000, 56000, /* Layers */ | 50 | { 0, 8000, 16000, 24000, 32000, 40000, 48000, 56000, /* Layers */ |
51 | 64000, 80000, 96000, 112000, 128000, 144000, 160000 } /* II & III */ | 51 | 64000, 80000, 96000, 112000, 128000, 144000, 160000 } /* II & III */ |
52 | }; | 52 | }; |
53 | 53 | ||
54 | static | 54 | static |
55 | unsigned int const samplerate_table[3] = { 44100, 48000, 32000 }; | 55 | unsigned int const samplerate_table[3] = { 44100, 48000, 32000 }; |
56 | 56 | ||
57 | static | 57 | static |
58 | int (*const decoder_table[3])(struct mad_stream *, struct mad_frame *) = { | 58 | int (*const decoder_table[3])(struct mad_stream *, struct mad_frame *) = { |
59 | mad_layer_I, | 59 | mad_layer_I, |
60 | mad_layer_II, | 60 | mad_layer_II, |
61 | mad_layer_III | 61 | mad_layer_III |
62 | }; | 62 | }; |
63 | 63 | ||
64 | /* | 64 | /* |
65 | * NAME:header->init() | 65 | * NAME:header->init() |
66 | * DESCRIPTION:initialize header struct | 66 | * DESCRIPTION:initialize header struct |
67 | */ | 67 | */ |
68 | void mad_header_init(struct mad_header *header) | 68 | void mad_header_init(struct mad_header *header) |
69 | { | 69 | { |
70 | header->layer = 0; | 70 | header->layer = 0; |
71 | header->mode = 0; | 71 | header->mode = 0; |
72 | header->mode_extension = 0; | 72 | header->mode_extension = 0; |
73 | header->emphasis = 0; | 73 | header->emphasis = 0; |
74 | 74 | ||
75 | header->bitrate = 0; | 75 | header->bitrate = 0; |
76 | header->samplerate = 0; | 76 | header->samplerate = 0; |
77 | 77 | ||
78 | header->crc_check = 0; | 78 | header->crc_check = 0; |
79 | header->crc_target = 0; | 79 | header->crc_target = 0; |
80 | 80 | ||
81 | header->flags = 0; | 81 | header->flags = 0; |
82 | header->private_bits = 0; | 82 | header->private_bits = 0; |
83 | 83 | ||
84 | header->duration = mad_timer_zero; | 84 | header->duration = mad_timer_zero; |
85 | } | 85 | } |
86 | 86 | ||
87 | /* | 87 | /* |
88 | * NAME:frame->init() | 88 | * NAME:frame->init() |
89 | * DESCRIPTION:initialize frame struct | 89 | * DESCRIPTION:initialize frame struct |
90 | */ | 90 | */ |
91 | void mad_frame_init(struct mad_frame *frame) | 91 | void mad_frame_init(struct mad_frame *frame) |
92 | { | 92 | { |
93 | mad_header_init(&frame->header); | 93 | mad_header_init(&frame->header); |
94 | 94 | ||
95 | frame->options = 0; | 95 | frame->options = 0; |
96 | 96 | ||
97 | frame->overlap = 0; | 97 | frame->overlap = 0; |
98 | mad_frame_mute(frame); | 98 | mad_frame_mute(frame); |
99 | } | 99 | } |
100 | 100 | ||
101 | /* | 101 | /* |
102 | * NAME:frame->finish() | 102 | * NAME:frame->finish() |
103 | * DESCRIPTION:deallocate any dynamic memory associated with frame | 103 | * DESCRIPTION:deallocate any dynamic memory associated with frame |
104 | */ | 104 | */ |
105 | void mad_frame_finish(struct mad_frame *frame) | 105 | void mad_frame_finish(struct mad_frame *frame) |
106 | { | 106 | { |
107 | mad_header_finish(&frame->header); | 107 | mad_header_finish(&frame->header); |
108 | 108 | ||
109 | if (frame->overlap) { | 109 | if (frame->overlap) { |
110 | free(frame->overlap); | 110 | free(frame->overlap); |
111 | frame->overlap = 0; | 111 | frame->overlap = 0; |
112 | } | 112 | } |
113 | } | 113 | } |
114 | 114 | ||
115 | /* | 115 | /* |
116 | * NAME:decode_header() | 116 | * NAME:decode_header() |
117 | * DESCRIPTION:read header data and following CRC word | 117 | * DESCRIPTION:read header data and following CRC word |
118 | */ | 118 | */ |
119 | static | 119 | static |
120 | int decode_header(struct mad_header *header, struct mad_stream *stream) | 120 | int decode_header(struct mad_header *header, struct mad_stream *stream) |
121 | { | 121 | { |
122 | unsigned int index; | 122 | unsigned int index; |
123 | 123 | ||
124 | header->flags = 0; | 124 | header->flags = 0; |
125 | header->private_bits = 0; | 125 | header->private_bits = 0; |
126 | 126 | ||
127 | /* header() */ | 127 | /* header() */ |
128 | 128 | ||
129 | /* syncword */ | 129 | /* syncword */ |
130 | mad_bit_skip(&stream->ptr, 11); | 130 | mad_bit_skip(&stream->ptr, 11); |
131 | 131 | ||
132 | /* MPEG 2.5 indicator (really part of syncword) */ | 132 | /* MPEG 2.5 indicator (really part of syncword) */ |
133 | if (mad_bit_read(&stream->ptr, 1) == 0) | 133 | if (mad_bit_read(&stream->ptr, 1) == 0) |
134 | header->flags |= MAD_FLAG_MPEG_2_5_EXT; | 134 | header->flags |= MAD_FLAG_MPEG_2_5_EXT; |
135 | 135 | ||
136 | /* ID */ | 136 | /* ID */ |
137 | if (mad_bit_read(&stream->ptr, 1) == 0) | 137 | if (mad_bit_read(&stream->ptr, 1) == 0) |
138 | header->flags |= MAD_FLAG_LSF_EXT; | 138 | header->flags |= MAD_FLAG_LSF_EXT; |
139 | else if (header->flags & MAD_FLAG_MPEG_2_5_EXT) { | 139 | else if (header->flags & MAD_FLAG_MPEG_2_5_EXT) { |
140 | stream->error = MAD_ERROR_LOSTSYNC; | 140 | stream->error = MAD_ERROR_LOSTSYNC; |
141 | return -1; | 141 | return -1; |
142 | } | 142 | } |
143 | 143 | ||
144 | /* layer */ | 144 | /* layer */ |
145 | header->layer = 4 - mad_bit_read(&stream->ptr, 2); | 145 | header->layer = 4 - mad_bit_read(&stream->ptr, 2); |
146 | 146 | ||
147 | if (header->layer == 4) { | 147 | if (header->layer == 4) { |
148 | stream->error = MAD_ERROR_BADLAYER; | 148 | stream->error = MAD_ERROR_BADLAYER; |
149 | return -1; | 149 | return -1; |
150 | } | 150 | } |
151 | 151 | ||
152 | /* protection_bit */ | 152 | /* protection_bit */ |
153 | if (mad_bit_read(&stream->ptr, 1) == 0) { | 153 | if (mad_bit_read(&stream->ptr, 1) == 0) { |
154 | header->flags |= MAD_FLAG_PROTECTION; | 154 | header->flags |= MAD_FLAG_PROTECTION; |
155 | header->crc_check = mad_bit_crc(stream->ptr, 16, 0xffff); | 155 | header->crc_check = mad_bit_crc(stream->ptr, 16, 0xffff); |
156 | } | 156 | } |
157 | 157 | ||
158 | /* bitrate_index */ | 158 | /* bitrate_index */ |
159 | index = mad_bit_read(&stream->ptr, 4); | 159 | index = mad_bit_read(&stream->ptr, 4); |
160 | 160 | ||
161 | if (index == 15) { | 161 | if (index == 15) { |
162 | stream->error = MAD_ERROR_BADBITRATE; | 162 | stream->error = MAD_ERROR_BADBITRATE; |
163 | return -1; | 163 | return -1; |
164 | } | 164 | } |
165 | 165 | ||
166 | if (header->flags & MAD_FLAG_LSF_EXT) | 166 | if (header->flags & MAD_FLAG_LSF_EXT) |
167 | header->bitrate = bitrate_table[3 + (header->layer >> 1)][index]; | 167 | header->bitrate = bitrate_table[3 + (header->layer >> 1)][index]; |
168 | else | 168 | else |
169 | header->bitrate = bitrate_table[header->layer - 1][index]; | 169 | header->bitrate = bitrate_table[header->layer - 1][index]; |
170 | 170 | ||
171 | /* sampling_frequency */ | 171 | /* sampling_frequency */ |
172 | index = mad_bit_read(&stream->ptr, 2); | 172 | index = mad_bit_read(&stream->ptr, 2); |
173 | 173 | ||
174 | if (index == 3) { | 174 | if (index == 3) { |
175 | stream->error = MAD_ERROR_BADSAMPLERATE; | 175 | stream->error = MAD_ERROR_BADSAMPLERATE; |
176 | return -1; | 176 | return -1; |
177 | } | 177 | } |
178 | 178 | ||
179 | header->samplerate = samplerate_table[index]; | 179 | header->samplerate = samplerate_table[index]; |
180 | 180 | ||
181 | if (header->flags & MAD_FLAG_LSF_EXT) { | 181 | if (header->flags & MAD_FLAG_LSF_EXT) { |
182 | header->samplerate /= 2; | 182 | header->samplerate /= 2; |
183 | 183 | ||
184 | if (header->flags & MAD_FLAG_MPEG_2_5_EXT) | 184 | if (header->flags & MAD_FLAG_MPEG_2_5_EXT) |
185 | header->samplerate /= 2; | 185 | header->samplerate /= 2; |
186 | } | 186 | } |
187 | 187 | ||
188 | /* padding_bit */ | 188 | /* padding_bit */ |
189 | if (mad_bit_read(&stream->ptr, 1)) | 189 | if (mad_bit_read(&stream->ptr, 1)) |
190 | header->flags |= MAD_FLAG_PADDING; | 190 | header->flags |= MAD_FLAG_PADDING; |
191 | 191 | ||
192 | /* private_bit */ | 192 | /* private_bit */ |
193 | if (mad_bit_read(&stream->ptr, 1)) | 193 | if (mad_bit_read(&stream->ptr, 1)) |
194 | header->private_bits |= MAD_PRIVATE_HEADER; | 194 | header->private_bits |= MAD_PRIVATE_HEADER; |
195 | 195 | ||
196 | /* mode */ | 196 | /* mode */ |
197 | header->mode = 3 - mad_bit_read(&stream->ptr, 2); | 197 | header->mode = 3 - mad_bit_read(&stream->ptr, 2); |
198 | 198 | ||
199 | /* mode_extension */ | 199 | /* mode_extension */ |
200 | header->mode_extension = mad_bit_read(&stream->ptr, 2); | 200 | header->mode_extension = mad_bit_read(&stream->ptr, 2); |
201 | 201 | ||
202 | /* copyright */ | 202 | /* copyright */ |
203 | if (mad_bit_read(&stream->ptr, 1)) | 203 | if (mad_bit_read(&stream->ptr, 1)) |
204 | header->flags |= MAD_FLAG_COPYRIGHT; | 204 | header->flags |= MAD_FLAG_COPYRIGHT; |
205 | 205 | ||
206 | /* original/copy */ | 206 | /* original/copy */ |
207 | if (mad_bit_read(&stream->ptr, 1)) | 207 | if (mad_bit_read(&stream->ptr, 1)) |
208 | header->flags |= MAD_FLAG_ORIGINAL; | 208 | header->flags |= MAD_FLAG_ORIGINAL; |
209 | 209 | ||
210 | /* emphasis */ | 210 | /* emphasis */ |
211 | header->emphasis = mad_bit_read(&stream->ptr, 2); | 211 | header->emphasis = mad_bit_read(&stream->ptr, 2); |
212 | 212 | ||
213 | if (header->emphasis == 2) { | 213 | # if defined(OPT_STRICT) |
214 | /* | ||
215 | * ISO/IEC 11172-3 says this is a reserved emphasis value, but | ||
216 | * streams exist which use it anyway. Since the value is not important | ||
217 | * to the decoder proper, we allow it unless OPT_STRICT is defined. | ||
218 | */ | ||
219 | if (header->emphasis == MAD_EMPHASIS_RESERVED) { | ||
214 | stream->error = MAD_ERROR_BADEMPHASIS; | 220 | stream->error = MAD_ERROR_BADEMPHASIS; |
215 | return -1; | 221 | return -1; |
216 | } | 222 | } |
223 | # endif | ||
217 | 224 | ||
218 | /* error_check() */ | 225 | /* error_check() */ |
219 | 226 | ||
220 | /* crc_check */ | 227 | /* crc_check */ |
221 | if (header->flags & MAD_FLAG_PROTECTION) | 228 | if (header->flags & MAD_FLAG_PROTECTION) |
222 | header->crc_target = mad_bit_read(&stream->ptr, 16); | 229 | header->crc_target = mad_bit_read(&stream->ptr, 16); |
223 | 230 | ||
224 | return 0; | 231 | return 0; |
225 | } | 232 | } |
226 | 233 | ||
227 | /* | 234 | /* |
228 | * NAME:free_bitrate() | 235 | * NAME:free_bitrate() |
229 | * DESCRIPTION:attempt to discover the bitstream's free bitrate | 236 | * DESCRIPTION:attempt to discover the bitstream's free bitrate |
230 | */ | 237 | */ |
231 | static | 238 | static |
232 | int free_bitrate(struct mad_stream *stream, struct mad_header const *header) | 239 | int free_bitrate(struct mad_stream *stream, struct mad_header const *header) |
233 | { | 240 | { |
234 | struct mad_bitptr keep_ptr; | 241 | struct mad_bitptr keep_ptr; |
235 | unsigned long rate = 0; | 242 | unsigned long rate = 0; |
236 | unsigned int pad_slot, slots_per_frame; | 243 | unsigned int pad_slot, slots_per_frame; |
237 | unsigned char const *ptr = 0; | 244 | unsigned char const *ptr = 0; |
238 | 245 | ||
239 | keep_ptr = stream->ptr; | 246 | keep_ptr = stream->ptr; |
240 | 247 | ||
241 | pad_slot = (header->flags & MAD_FLAG_PADDING) ? 1 : 0; | 248 | pad_slot = (header->flags & MAD_FLAG_PADDING) ? 1 : 0; |
242 | slots_per_frame = (header->layer == MAD_LAYER_III && | 249 | slots_per_frame = (header->layer == MAD_LAYER_III && |
243 | (header->flags & MAD_FLAG_LSF_EXT)) ? 72 : 144; | 250 | (header->flags & MAD_FLAG_LSF_EXT)) ? 72 : 144; |
244 | 251 | ||
245 | while (mad_stream_sync(stream) == 0) { | 252 | while (mad_stream_sync(stream) == 0) { |
246 | struct mad_stream peek_stream; | 253 | struct mad_stream peek_stream; |
247 | struct mad_header peek_header; | 254 | struct mad_header peek_header; |
248 | 255 | ||
249 | peek_stream = *stream; | 256 | peek_stream = *stream; |
250 | peek_header = *header; | 257 | peek_header = *header; |
251 | 258 | ||
252 | if (decode_header(&peek_header, &peek_stream) == 0 && | 259 | if (decode_header(&peek_header, &peek_stream) == 0 && |
253 | peek_header.layer == header->layer && | 260 | peek_header.layer == header->layer && |
254 | peek_header.samplerate == header->samplerate) { | 261 | peek_header.samplerate == header->samplerate) { |
255 | unsigned int N; | 262 | unsigned int N; |
256 | 263 | ||
257 | ptr = mad_bit_nextbyte(&stream->ptr); | 264 | ptr = mad_bit_nextbyte(&stream->ptr); |
258 | 265 | ||
259 | N = ptr - stream->this_frame; | 266 | N = ptr - stream->this_frame; |
260 | 267 | ||
261 | if (header->layer == MAD_LAYER_I) { | 268 | if (header->layer == MAD_LAYER_I) { |
262 | rate = (unsigned long) header->samplerate * | 269 | rate = (unsigned long) header->samplerate * |
263 | (N - 4 * pad_slot + 4) / 48 / 1000; | 270 | (N - 4 * pad_slot + 4) / 48 / 1000; |
264 | } | 271 | } |
265 | else { | 272 | else { |
266 | rate = (unsigned long) header->samplerate * | 273 | rate = (unsigned long) header->samplerate * |
267 | (N - pad_slot + 1) / slots_per_frame / 1000; | 274 | (N - pad_slot + 1) / slots_per_frame / 1000; |
268 | } | 275 | } |
269 | 276 | ||
270 | if (rate >= 8) | 277 | if (rate >= 8) |
271 | break; | 278 | break; |
272 | } | 279 | } |
273 | 280 | ||
274 | mad_bit_skip(&stream->ptr, 8); | 281 | mad_bit_skip(&stream->ptr, 8); |
275 | } | 282 | } |
276 | 283 | ||
277 | stream->ptr = keep_ptr; | 284 | stream->ptr = keep_ptr; |
278 | 285 | ||
279 | if (rate < 8 || (header->layer == MAD_LAYER_III && rate > 640)) { | 286 | if (rate < 8 || (header->layer == MAD_LAYER_III && rate > 640)) { |
280 | stream->error = MAD_ERROR_LOSTSYNC; | 287 | stream->error = MAD_ERROR_LOSTSYNC; |
281 | return -1; | 288 | return -1; |
282 | } | 289 | } |
283 | 290 | ||
284 | stream->freerate = rate * 1000; | 291 | stream->freerate = rate * 1000; |
285 | 292 | ||
286 | # if 0 && defined(DEBUG) | ||
287 | fprintf(stderr, "free bitrate == %lu\n", stream->freerate); | ||
288 | # endif | ||
289 | |||
290 | return 0; | 293 | return 0; |
291 | } | 294 | } |
292 | 295 | ||
293 | /* | 296 | /* |
294 | * NAME:header->decode() | 297 | * NAME:header->decode() |
295 | * DESCRIPTION:read the next frame header from the stream | 298 | * DESCRIPTION:read the next frame header from the stream |
296 | */ | 299 | */ |
297 | int mad_header_decode(struct mad_header *header, struct mad_stream *stream) | 300 | int mad_header_decode(struct mad_header *header, struct mad_stream *stream) |
298 | { | 301 | { |
299 | register unsigned char const *ptr, *end; | 302 | register unsigned char const *ptr, *end; |
300 | unsigned int pad_slot, N; | 303 | unsigned int pad_slot, N; |
301 | 304 | ||
302 | ptr = stream->next_frame; | 305 | ptr = stream->next_frame; |
303 | end = stream->bufend; | 306 | end = stream->bufend; |
304 | 307 | ||
305 | if (ptr == 0) { | 308 | if (ptr == 0) { |
306 | stream->error = MAD_ERROR_BUFPTR; | 309 | stream->error = MAD_ERROR_BUFPTR; |
307 | goto fail; | 310 | goto fail; |
308 | } | 311 | } |
309 | 312 | ||
310 | /* stream skip */ | 313 | /* stream skip */ |
311 | if (stream->skiplen) { | 314 | if (stream->skiplen) { |
312 | if (!stream->sync) | 315 | if (!stream->sync) |
313 | ptr = stream->this_frame; | 316 | ptr = stream->this_frame; |
314 | 317 | ||
315 | if (end - ptr < stream->skiplen) { | 318 | if (end - ptr < stream->skiplen) { |
316 | stream->skiplen -= end - ptr; | 319 | stream->skiplen -= end - ptr; |
317 | stream->next_frame = end; | 320 | stream->next_frame = end; |
318 | 321 | ||
319 | stream->error = MAD_ERROR_BUFLEN; | 322 | stream->error = MAD_ERROR_BUFLEN; |
320 | goto fail; | 323 | goto fail; |
321 | } | 324 | } |
322 | 325 | ||
323 | ptr += stream->skiplen; | 326 | ptr += stream->skiplen; |
324 | stream->skiplen = 0; | 327 | stream->skiplen = 0; |
325 | 328 | ||
326 | stream->sync = 1; | 329 | stream->sync = 1; |
327 | } | 330 | } |
328 | 331 | ||
329 | sync: | 332 | sync: |
330 | /* synchronize */ | 333 | /* synchronize */ |
331 | if (stream->sync) { | 334 | if (stream->sync) { |
332 | if (end - ptr < MAD_BUFFER_GUARD) { | 335 | if (end - ptr < MAD_BUFFER_GUARD) { |
333 | stream->next_frame = ptr; | 336 | stream->next_frame = ptr; |
334 | 337 | ||
335 | stream->error = MAD_ERROR_BUFLEN; | 338 | stream->error = MAD_ERROR_BUFLEN; |
336 | goto fail; | 339 | goto fail; |
337 | } | 340 | } |
338 | else if (!(ptr[0] == 0xff && (ptr[1] & 0xe0) == 0xe0)) { | 341 | else if (!(ptr[0] == 0xff && (ptr[1] & 0xe0) == 0xe0)) { |
339 | /* mark point where frame sync word was expected */ | 342 | /* mark point where frame sync word was expected */ |
340 | stream->this_frame = ptr; | 343 | stream->this_frame = ptr; |
341 | stream->next_frame = ptr + 1; | 344 | stream->next_frame = ptr + 1; |
342 | 345 | ||
343 | stream->error = MAD_ERROR_LOSTSYNC; | 346 | stream->error = MAD_ERROR_LOSTSYNC; |
344 | goto fail; | 347 | goto fail; |
345 | } | 348 | } |
346 | } | 349 | } |
347 | else { | 350 | else { |
348 | mad_bit_init(&stream->ptr, ptr); | 351 | mad_bit_init(&stream->ptr, ptr); |
349 | 352 | ||
350 | if (mad_stream_sync(stream) == -1) { | 353 | if (mad_stream_sync(stream) == -1) { |
351 | if (end - stream->next_frame >= MAD_BUFFER_GUARD) | 354 | if (end - stream->next_frame >= MAD_BUFFER_GUARD) |
352 | stream->next_frame = end - MAD_BUFFER_GUARD; | 355 | stream->next_frame = end - MAD_BUFFER_GUARD; |
353 | 356 | ||
354 | stream->error = MAD_ERROR_BUFLEN; | 357 | stream->error = MAD_ERROR_BUFLEN; |
355 | goto fail; | 358 | goto fail; |
356 | } | 359 | } |
357 | 360 | ||
358 | ptr = mad_bit_nextbyte(&stream->ptr); | 361 | ptr = mad_bit_nextbyte(&stream->ptr); |
359 | } | 362 | } |
360 | 363 | ||
361 | /* begin processing */ | 364 | /* begin processing */ |
362 | stream->this_frame = ptr; | 365 | stream->this_frame = ptr; |
363 | stream->next_frame = ptr + 1; /* possibly bogus sync word */ | 366 | stream->next_frame = ptr + 1; /* possibly bogus sync word */ |
364 | 367 | ||
365 | mad_bit_init(&stream->ptr, stream->this_frame); | 368 | mad_bit_init(&stream->ptr, stream->this_frame); |
366 | 369 | ||
367 | if (decode_header(header, stream) == -1) | 370 | if (decode_header(header, stream) == -1) |
368 | goto fail; | 371 | goto fail; |
369 | 372 | ||
370 | /* calculate frame duration */ | 373 | /* calculate frame duration */ |
371 | mad_timer_set(&header->duration, 0, | 374 | mad_timer_set(&header->duration, 0, |
372 | 32 * MAD_NSBSAMPLES(header), header->samplerate); | 375 | 32 * MAD_NSBSAMPLES(header), header->samplerate); |
373 | 376 | ||
374 | /* calculate free bit rate */ | 377 | /* calculate free bit rate */ |
375 | if (header->bitrate == 0) { | 378 | if (header->bitrate == 0) { |
376 | if ((stream->freerate == 0 || !stream->sync) && | 379 | if ((stream->freerate == 0 || !stream->sync || |
380 | (header->layer == MAD_LAYER_III && stream->freerate > 640000)) && | ||
377 | free_bitrate(stream, header) == -1) | 381 | free_bitrate(stream, header) == -1) |
378 | goto fail; | 382 | goto fail; |
379 | 383 | ||
380 | header->bitrate = stream->freerate; | 384 | header->bitrate = stream->freerate; |
381 | header->flags |= MAD_FLAG_FREEFORMAT; | 385 | header->flags |= MAD_FLAG_FREEFORMAT; |
382 | } | 386 | } |
383 | 387 | ||
384 | /* calculate beginning of next frame */ | 388 | /* calculate beginning of next frame */ |
385 | pad_slot = (header->flags & MAD_FLAG_PADDING) ? 1 : 0; | 389 | pad_slot = (header->flags & MAD_FLAG_PADDING) ? 1 : 0; |
386 | 390 | ||
387 | if (header->layer == MAD_LAYER_I) | 391 | if (header->layer == MAD_LAYER_I) |
388 | N = ((12 * header->bitrate / header->samplerate) + pad_slot) * 4; | 392 | N = ((12 * header->bitrate / header->samplerate) + pad_slot) * 4; |
389 | else { | 393 | else { |
390 | unsigned int slots_per_frame; | 394 | unsigned int slots_per_frame; |
391 | 395 | ||
392 | slots_per_frame = (header->layer == MAD_LAYER_III && | 396 | slots_per_frame = (header->layer == MAD_LAYER_III && |
393 | (header->flags & MAD_FLAG_LSF_EXT)) ? 72 : 144; | 397 | (header->flags & MAD_FLAG_LSF_EXT)) ? 72 : 144; |
394 | 398 | ||
395 | N = (slots_per_frame * header->bitrate / header->samplerate) + pad_slot; | 399 | N = (slots_per_frame * header->bitrate / header->samplerate) + pad_slot; |
396 | } | 400 | } |
397 | 401 | ||
398 | /* verify there is enough data left in buffer to decode this frame */ | 402 | /* verify there is enough data left in buffer to decode this frame */ |
399 | if (N + MAD_BUFFER_GUARD > end - stream->this_frame) { | 403 | if (N + MAD_BUFFER_GUARD > end - stream->this_frame) { |
400 | stream->next_frame = stream->this_frame; | 404 | stream->next_frame = stream->this_frame; |
401 | 405 | ||
402 | stream->error = MAD_ERROR_BUFLEN; | 406 | stream->error = MAD_ERROR_BUFLEN; |
403 | goto fail; | 407 | goto fail; |
404 | } | 408 | } |
405 | 409 | ||
406 | stream->next_frame = stream->this_frame + N; | 410 | stream->next_frame = stream->this_frame + N; |
407 | 411 | ||
408 | if (!stream->sync) { | 412 | if (!stream->sync) { |
409 | /* check that a valid frame header follows this frame */ | 413 | /* check that a valid frame header follows this frame */ |
410 | 414 | ||
411 | ptr = stream->next_frame; | 415 | ptr = stream->next_frame; |
412 | if (!(ptr[0] == 0xff && (ptr[1] & 0xe0) == 0xe0)) { | 416 | if (!(ptr[0] == 0xff && (ptr[1] & 0xe0) == 0xe0)) { |
413 | ptr = stream->next_frame = stream->this_frame + 1; | 417 | ptr = stream->next_frame = stream->this_frame + 1; |
414 | goto sync; | 418 | goto sync; |
415 | } | 419 | } |
416 | 420 | ||
417 | stream->sync = 1; | 421 | stream->sync = 1; |
418 | } | 422 | } |
419 | 423 | ||
420 | header->flags |= MAD_FLAG_INCOMPLETE; | 424 | header->flags |= MAD_FLAG_INCOMPLETE; |
421 | 425 | ||
422 | return 0; | 426 | return 0; |
423 | 427 | ||
424 | fail: | 428 | fail: |
425 | stream->sync = 0; | 429 | stream->sync = 0; |
426 | 430 | ||
427 | return -1; | 431 | return -1; |
428 | } | 432 | } |
429 | 433 | ||
430 | /* | 434 | /* |
431 | * NAME:frame->decode() | 435 | * NAME:frame->decode() |
432 | * DESCRIPTION:decode a single frame from a bitstream | 436 | * DESCRIPTION:decode a single frame from a bitstream |
433 | */ | 437 | */ |
434 | int mad_frame_decode(struct mad_frame *frame, struct mad_stream *stream) | 438 | int mad_frame_decode(struct mad_frame *frame, struct mad_stream *stream) |
435 | { | 439 | { |
436 | frame->options = stream->options; | 440 | frame->options = stream->options; |
437 | 441 | ||
438 | /* header() */ | 442 | /* header() */ |
439 | /* error_check() */ | 443 | /* error_check() */ |
440 | 444 | ||
441 | if (!(frame->header.flags & MAD_FLAG_INCOMPLETE) && | 445 | if (!(frame->header.flags & MAD_FLAG_INCOMPLETE) && |
442 | mad_header_decode(&frame->header, stream) == -1) | 446 | mad_header_decode(&frame->header, stream) == -1) |
443 | goto fail; | 447 | goto fail; |
444 | 448 | ||
445 | /* audio_data() */ | 449 | /* audio_data() */ |
446 | 450 | ||
447 | frame->header.flags &= ~MAD_FLAG_INCOMPLETE; | 451 | frame->header.flags &= ~MAD_FLAG_INCOMPLETE; |
448 | 452 | ||
449 | if (decoder_table[frame->header.layer - 1](stream, frame) == -1) { | 453 | if (decoder_table[frame->header.layer - 1](stream, frame) == -1) { |
450 | if (!MAD_RECOVERABLE(stream->error)) | 454 | if (!MAD_RECOVERABLE(stream->error)) |
451 | stream->next_frame = stream->this_frame; | 455 | stream->next_frame = stream->this_frame; |
452 | 456 | ||
453 | goto fail; | 457 | goto fail; |
454 | } | 458 | } |
455 | 459 | ||
456 | /* ancillary_data() */ | 460 | /* ancillary_data() */ |
457 | 461 | ||
458 | if (frame->header.layer != MAD_LAYER_III) { | 462 | if (frame->header.layer != MAD_LAYER_III) { |
459 | struct mad_bitptr next_frame; | 463 | struct mad_bitptr next_frame; |
460 | 464 | ||
461 | mad_bit_init(&next_frame, stream->next_frame); | 465 | mad_bit_init(&next_frame, stream->next_frame); |
462 | 466 | ||
463 | stream->anc_ptr = stream->ptr; | 467 | stream->anc_ptr = stream->ptr; |
464 | stream->anc_bitlen = mad_bit_length(&stream->ptr, &next_frame); | 468 | stream->anc_bitlen = mad_bit_length(&stream->ptr, &next_frame); |
465 | 469 | ||
466 | mad_bit_finish(&next_frame); | 470 | mad_bit_finish(&next_frame); |
467 | } | 471 | } |
468 | 472 | ||
469 | return 0; | 473 | return 0; |
470 | 474 | ||
471 | fail: | 475 | fail: |
472 | stream->anc_bitlen = 0; | 476 | stream->anc_bitlen = 0; |
473 | return -1; | 477 | return -1; |
474 | } | 478 | } |
475 | 479 | ||
476 | /* | 480 | /* |
477 | * NAME:frame->mute() | 481 | * NAME:frame->mute() |
478 | * DESCRIPTION:zero all subband values so the frame becomes silent | 482 | * DESCRIPTION:zero all subband values so the frame becomes silent |
479 | */ | 483 | */ |
480 | void mad_frame_mute(struct mad_frame *frame) | 484 | void mad_frame_mute(struct mad_frame *frame) |
481 | { | 485 | { |
482 | unsigned int s, sb; | 486 | unsigned int s, sb; |
483 | 487 | ||
484 | for (s = 0; s < 36; ++s) { | 488 | for (s = 0; s < 36; ++s) { |
485 | for (sb = 0; sb < 32; ++sb) { | 489 | for (sb = 0; sb < 32; ++sb) { |
486 | frame->sbsample[0][s][sb] = | 490 | frame->sbsample[0][s][sb] = |
487 | frame->sbsample[1][s][sb] = 0; | 491 | frame->sbsample[1][s][sb] = 0; |
488 | } | 492 | } |
489 | } | 493 | } |
490 | 494 | ||
491 | if (frame->overlap) { | 495 | if (frame->overlap) { |
492 | for (s = 0; s < 18; ++s) { | 496 | for (s = 0; s < 18; ++s) { |
493 | for (sb = 0; sb < 32; ++sb) { | 497 | for (sb = 0; sb < 32; ++sb) { |
494 | (*frame->overlap)[0][sb][s] = | 498 | (*frame->overlap)[0][sb][s] = |
495 | (*frame->overlap)[1][sb][s] = 0; | 499 | (*frame->overlap)[1][sb][s] = 0; |
496 | } | 500 | } |
497 | } | 501 | } |
498 | } | 502 | } |
499 | } | 503 | } |
diff --git a/core/multimedia/opieplayer/libmad/frame.h b/core/multimedia/opieplayer/libmad/frame.h index 3b8e454..dce573d 100644 --- a/core/multimedia/opieplayer/libmad/frame.h +++ b/core/multimedia/opieplayer/libmad/frame.h | |||
@@ -1,117 +1,118 @@ | |||
1 | /* | 1 | /* |
2 | * libmad - MPEG audio decoder library | 2 | * libmad - MPEG audio decoder library |
3 | * Copyright (C) 2000-2001 Robert Leslie | 3 | * Copyright (C) 2000-2004 Underbit Technologies, Inc. |
4 | * | 4 | * |
5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
7 | * the Free Software Foundation; either version 2 of the License, or | 7 | * the Free Software Foundation; either version 2 of the License, or |
8 | * (at your option) any later version. | 8 | * (at your option) any later version. |
9 | * | 9 | * |
10 | * This program is distributed in the hope that it will be useful, | 10 | * This program is distributed in the hope that it will be useful, |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | * GNU General Public License for more details. | 13 | * GNU General Public License for more details. |
14 | * | 14 | * |
15 | * You should have received a copy of the GNU General Public License | 15 | * You should have received a copy of the GNU General Public License |
16 | * along with this program; if not, write to the Free Software | 16 | * along with this program; if not, write to the Free Software |
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
18 | * | 18 | * |
19 | * $Id$ | 19 | * $Id$ |
20 | */ | 20 | */ |
21 | 21 | ||
22 | # ifndef LIBMAD_FRAME_H | 22 | # ifndef LIBMAD_FRAME_H |
23 | # define LIBMAD_FRAME_H | 23 | # define LIBMAD_FRAME_H |
24 | 24 | ||
25 | # include "fixed.h" | 25 | # include "fixed.h" |
26 | # include "timer.h" | 26 | # include "timer.h" |
27 | # include "stream.h" | 27 | # include "stream.h" |
28 | 28 | ||
29 | enum mad_layer { | 29 | enum mad_layer { |
30 | MAD_LAYER_I = 1, /* Layer I */ | 30 | MAD_LAYER_I = 1, /* Layer I */ |
31 | MAD_LAYER_II = 2, /* Layer II */ | 31 | MAD_LAYER_II = 2, /* Layer II */ |
32 | MAD_LAYER_III = 3 /* Layer III */ | 32 | MAD_LAYER_III = 3 /* Layer III */ |
33 | }; | 33 | }; |
34 | 34 | ||
35 | enum mad_mode { | 35 | enum mad_mode { |
36 | MAD_MODE_SINGLE_CHANNEL = 0, /* single channel */ | 36 | MAD_MODE_SINGLE_CHANNEL = 0, /* single channel */ |
37 | MAD_MODE_DUAL_CHANNEL = 1, /* dual channel */ | 37 | MAD_MODE_DUAL_CHANNEL = 1, /* dual channel */ |
38 | MAD_MODE_JOINT_STEREO = 2, /* joint (MS/intensity) stereo */ | 38 | MAD_MODE_JOINT_STEREO = 2, /* joint (MS/intensity) stereo */ |
39 | MAD_MODE_STEREO = 3 /* normal LR stereo */ | 39 | MAD_MODE_STEREO = 3 /* normal LR stereo */ |
40 | }; | 40 | }; |
41 | 41 | ||
42 | enum mad_emphasis { | 42 | enum mad_emphasis { |
43 | MAD_EMPHASIS_NONE = 0, /* no emphasis */ | 43 | MAD_EMPHASIS_NONE = 0, /* no emphasis */ |
44 | MAD_EMPHASIS_50_15_US = 1, /* 50/15 microseconds emphasis */ | 44 | MAD_EMPHASIS_50_15_US = 1, /* 50/15 microseconds emphasis */ |
45 | MAD_EMPHASIS_CCITT_J_17 = 3 /* CCITT J.17 emphasis */ | 45 | MAD_EMPHASIS_CCITT_J_17 = 3, /* CCITT J.17 emphasis */ |
46 | MAD_EMPHASIS_RESERVED = 2 /* unknown emphasis */ | ||
46 | }; | 47 | }; |
47 | 48 | ||
48 | struct mad_header { | 49 | struct mad_header { |
49 | enum mad_layer layer; /* audio layer (1, 2, or 3) */ | 50 | enum mad_layer layer; /* audio layer (1, 2, or 3) */ |
50 | enum mad_mode mode; /* channel mode (see above) */ | 51 | enum mad_mode mode; /* channel mode (see above) */ |
51 | int mode_extension; /* additional mode info */ | 52 | int mode_extension; /* additional mode info */ |
52 | enum mad_emphasis emphasis; /* de-emphasis to use (see above) */ | 53 | enum mad_emphasis emphasis; /* de-emphasis to use (see above) */ |
53 | 54 | ||
54 | unsigned long bitrate; /* stream bitrate (bps) */ | 55 | unsigned long bitrate; /* stream bitrate (bps) */ |
55 | unsigned int samplerate; /* sampling frequency (Hz) */ | 56 | unsigned int samplerate; /* sampling frequency (Hz) */ |
56 | 57 | ||
57 | unsigned short crc_check; /* frame CRC accumulator */ | 58 | unsigned short crc_check; /* frame CRC accumulator */ |
58 | unsigned short crc_target; /* final target CRC checksum */ | 59 | unsigned short crc_target; /* final target CRC checksum */ |
59 | 60 | ||
60 | int flags; /* flags (see below) */ | 61 | int flags; /* flags (see below) */ |
61 | int private_bits; /* private bits (see below) */ | 62 | int private_bits; /* private bits (see below) */ |
62 | 63 | ||
63 | mad_timer_t duration; /* audio playing time of frame */ | 64 | mad_timer_t duration; /* audio playing time of frame */ |
64 | }; | 65 | }; |
65 | 66 | ||
66 | struct mad_frame { | 67 | struct mad_frame { |
67 | struct mad_header header; /* MPEG audio header */ | 68 | struct mad_header header; /* MPEG audio header */ |
68 | 69 | ||
69 | int options; /* decoding options (from stream) */ | 70 | int options; /* decoding options (from stream) */ |
70 | 71 | ||
71 | mad_fixed_t sbsample[2][36][32];/* synthesis subband filter samples */ | 72 | mad_fixed_t sbsample[2][36][32];/* synthesis subband filter samples */ |
72 | mad_fixed_t (*overlap)[2][32][18];/* Layer III block overlap data */ | 73 | mad_fixed_t (*overlap)[2][32][18];/* Layer III block overlap data */ |
73 | }; | 74 | }; |
74 | 75 | ||
75 | # define MAD_NCHANNELS(header) ((header)->mode ? 2 : 1) | 76 | # define MAD_NCHANNELS(header) ((header)->mode ? 2 : 1) |
76 | # define MAD_NSBSAMPLES(header) \ | 77 | # define MAD_NSBSAMPLES(header) \ |
77 | ((header)->layer == MAD_LAYER_I ? 12 : \ | 78 | ((header)->layer == MAD_LAYER_I ? 12 : \ |
78 | (((header)->layer == MAD_LAYER_III && \ | 79 | (((header)->layer == MAD_LAYER_III && \ |
79 | ((header)->flags & MAD_FLAG_LSF_EXT)) ? 18 : 36)) | 80 | ((header)->flags & MAD_FLAG_LSF_EXT)) ? 18 : 36)) |
80 | 81 | ||
81 | enum { | 82 | enum { |
82 | MAD_FLAG_NPRIVATE_III = 0x0007,/* number of Layer III private bits */ | 83 | MAD_FLAG_NPRIVATE_III = 0x0007,/* number of Layer III private bits */ |
83 | MAD_FLAG_INCOMPLETE = 0x0008,/* header but not data is decoded */ | 84 | MAD_FLAG_INCOMPLETE = 0x0008,/* header but not data is decoded */ |
84 | 85 | ||
85 | MAD_FLAG_PROTECTION = 0x0010,/* frame has CRC protection */ | 86 | MAD_FLAG_PROTECTION = 0x0010,/* frame has CRC protection */ |
86 | MAD_FLAG_COPYRIGHT = 0x0020,/* frame is copyright */ | 87 | MAD_FLAG_COPYRIGHT = 0x0020,/* frame is copyright */ |
87 | MAD_FLAG_ORIGINAL = 0x0040,/* frame is original (else copy) */ | 88 | MAD_FLAG_ORIGINAL = 0x0040,/* frame is original (else copy) */ |
88 | MAD_FLAG_PADDING = 0x0080,/* frame has additional slot */ | 89 | MAD_FLAG_PADDING = 0x0080,/* frame has additional slot */ |
89 | 90 | ||
90 | MAD_FLAG_I_STEREO = 0x0100,/* uses intensity joint stereo */ | 91 | MAD_FLAG_I_STEREO = 0x0100,/* uses intensity joint stereo */ |
91 | MAD_FLAG_MS_STEREO = 0x0200,/* uses middle/side joint stereo */ | 92 | MAD_FLAG_MS_STEREO = 0x0200,/* uses middle/side joint stereo */ |
92 | MAD_FLAG_FREEFORMAT = 0x0400,/* uses free format bitrate */ | 93 | MAD_FLAG_FREEFORMAT = 0x0400,/* uses free format bitrate */ |
93 | 94 | ||
94 | MAD_FLAG_LSF_EXT = 0x1000,/* lower sampling freq. extension */ | 95 | MAD_FLAG_LSF_EXT = 0x1000,/* lower sampling freq. extension */ |
95 | MAD_FLAG_MC_EXT = 0x2000,/* multichannel audio extension */ | 96 | MAD_FLAG_MC_EXT = 0x2000,/* multichannel audio extension */ |
96 | MAD_FLAG_MPEG_2_5_EXT = 0x4000/* MPEG 2.5 (unofficial) extension */ | 97 | MAD_FLAG_MPEG_2_5_EXT = 0x4000/* MPEG 2.5 (unofficial) extension */ |
97 | }; | 98 | }; |
98 | 99 | ||
99 | enum { | 100 | enum { |
100 | MAD_PRIVATE_HEADER = 0x0100,/* header private bit */ | 101 | MAD_PRIVATE_HEADER = 0x0100,/* header private bit */ |
101 | MAD_PRIVATE_III = 0x001f/* Layer III private bits (up to 5) */ | 102 | MAD_PRIVATE_III = 0x001f/* Layer III private bits (up to 5) */ |
102 | }; | 103 | }; |
103 | 104 | ||
104 | void mad_header_init(struct mad_header *); | 105 | void mad_header_init(struct mad_header *); |
105 | 106 | ||
106 | # define mad_header_finish(header) /* nothing */ | 107 | # define mad_header_finish(header) /* nothing */ |
107 | 108 | ||
108 | int mad_header_decode(struct mad_header *, struct mad_stream *); | 109 | int mad_header_decode(struct mad_header *, struct mad_stream *); |
109 | 110 | ||
110 | void mad_frame_init(struct mad_frame *); | 111 | void mad_frame_init(struct mad_frame *); |
111 | void mad_frame_finish(struct mad_frame *); | 112 | void mad_frame_finish(struct mad_frame *); |
112 | 113 | ||
113 | int mad_frame_decode(struct mad_frame *, struct mad_stream *); | 114 | int mad_frame_decode(struct mad_frame *, struct mad_stream *); |
114 | 115 | ||
115 | void mad_frame_mute(struct mad_frame *); | 116 | void mad_frame_mute(struct mad_frame *); |
116 | 117 | ||
117 | # endif | 118 | # endif |
diff --git a/core/multimedia/opieplayer/libmad/huffman.c b/core/multimedia/opieplayer/libmad/huffman.c index 5ea6547..684409e 100644 --- a/core/multimedia/opieplayer/libmad/huffman.c +++ b/core/multimedia/opieplayer/libmad/huffman.c | |||
@@ -1,242 +1,253 @@ | |||
1 | /* | 1 | /* |
2 | * libmad - MPEG audio decoder library | 2 | * libmad - MPEG audio decoder library |
3 | * Copyright (C) 2000-2001 Robert Leslie | 3 | * Copyright (C) 2000-2004 Underbit Technologies, Inc. |
4 | * | 4 | * |
5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
7 | * the Free Software Foundation; either version 2 of the License, or | 7 | * the Free Software Foundation; either version 2 of the License, or |
8 | * (at your option) any later version. | 8 | * (at your option) any later version. |
9 | * | 9 | * |
10 | * This program is distributed in the hope that it will be useful, | 10 | * This program is distributed in the hope that it will be useful, |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | * GNU General Public License for more details. | 13 | * GNU General Public License for more details. |
14 | * | 14 | * |
15 | * You should have received a copy of the GNU General Public License | 15 | * You should have received a copy of the GNU General Public License |
16 | * along with this program; if not, write to the Free Software | 16 | * along with this program; if not, write to the Free Software |
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
18 | * | 18 | * |
19 | * $Id$ | 19 | * $Id$ |
20 | */ | 20 | */ |
21 | 21 | ||
22 | # ifdef HAVE_CONFIG_H | 22 | # ifdef HAVE_CONFIG_H |
23 | # include "libmad_config.h" | 23 | # include "libmad_config.h" |
24 | # endif | 24 | # endif |
25 | 25 | ||
26 | # include "libmad_global.h" | 26 | # include "libmad_global.h" |
27 | 27 | ||
28 | # include "huffman.h" | 28 | # include "huffman.h" |
29 | 29 | ||
30 | /* | 30 | /* |
31 | * These are the Huffman code words for Layer III. | 31 | * These are the Huffman code words for Layer III. |
32 | * The data for these tables are derived from Table B.7 of ISO/IEC 11172-3. | 32 | * The data for these tables are derived from Table B.7 of ISO/IEC 11172-3. |
33 | * | 33 | * |
34 | * These tables support decoding up to 4 Huffman code bits at a time. | 34 | * These tables support decoding up to 4 Huffman code bits at a time. |
35 | */ | 35 | */ |
36 | 36 | ||
37 | # if defined(__GNUC__) | 37 | # if defined(__GNUC__) || \ |
38 | # define PTR(offs, bits){ ptr: { 0, bits, offs } } | 38 | (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901) |
39 | # define V(v, w, x, y, hlen){ value: { 1, hlen, v, w, x, y } } | 39 | # define PTR(offs, bits){ .ptr = { 0, bits, offs } } |
40 | # define V(v, w, x, y, hlen){ .value = { 1, hlen, v, w, x, y } } | ||
40 | # else | 41 | # else |
41 | # define PTR(offs, bits){ { 0, bits, offs } } | 42 | # define PTR(offs, bits){ { 0, bits, offs } } |
42 | # define V(v, w, x, y, hlen){ { 1, hlen, (v << 0) | (w << 1) | \ | 43 | # if defined(WORDS_BIGENDIAN) |
43 | (x << 2) | (y << 3) } } | 44 | # define V(v, w, x, y, hlen){ { 1, hlen, (v << 11) | (w << 10) | \ |
45 | (x << 9) | (y << 8) } } | ||
46 | # else | ||
47 | # define V(v, w, x, y, hlen){ { 1, hlen, (v << 0) | (w << 1) | \ | ||
48 | (x << 2) | (y << 3) } } | ||
49 | # endif | ||
44 | # endif | 50 | # endif |
45 | 51 | ||
46 | static | 52 | static |
47 | union huffquad const hufftabA[] = { | 53 | union huffquad const hufftabA[] = { |
48 | /* 0000 */ PTR(16, 2), | 54 | /* 0000 */ PTR(16, 2), |
49 | /* 0001 */ PTR(20, 2), | 55 | /* 0001 */ PTR(20, 2), |
50 | /* 0010 */ PTR(24, 1), | 56 | /* 0010 */ PTR(24, 1), |
51 | /* 0011 */ PTR(26, 1), | 57 | /* 0011 */ PTR(26, 1), |
52 | /* 0100 */ V(0, 0, 1, 0, 4), | 58 | /* 0100 */ V(0, 0, 1, 0, 4), |
53 | /* 0101 */ V(0, 0, 0, 1, 4), | 59 | /* 0101 */ V(0, 0, 0, 1, 4), |
54 | /* 0110 */ V(0, 1, 0, 0, 4), | 60 | /* 0110 */ V(0, 1, 0, 0, 4), |
55 | /* 0111 */ V(1, 0, 0, 0, 4), | 61 | /* 0111 */ V(1, 0, 0, 0, 4), |
56 | /* 1000 */ V(0, 0, 0, 0, 1), | 62 | /* 1000 */ V(0, 0, 0, 0, 1), |
57 | /* 1001 */ V(0, 0, 0, 0, 1), | 63 | /* 1001 */ V(0, 0, 0, 0, 1), |
58 | /* 1010 */ V(0, 0, 0, 0, 1), | 64 | /* 1010 */ V(0, 0, 0, 0, 1), |
59 | /* 1011 */ V(0, 0, 0, 0, 1), | 65 | /* 1011 */ V(0, 0, 0, 0, 1), |
60 | /* 1100 */ V(0, 0, 0, 0, 1), | 66 | /* 1100 */ V(0, 0, 0, 0, 1), |
61 | /* 1101 */ V(0, 0, 0, 0, 1), | 67 | /* 1101 */ V(0, 0, 0, 0, 1), |
62 | /* 1110 */ V(0, 0, 0, 0, 1), | 68 | /* 1110 */ V(0, 0, 0, 0, 1), |
63 | /* 1111 */ V(0, 0, 0, 0, 1), | 69 | /* 1111 */ V(0, 0, 0, 0, 1), |
64 | 70 | ||
65 | /* 0000 ... */ | 71 | /* 0000 ... */ |
66 | /* 00 */ V(1, 0, 1, 1, 2),/* 16 */ | 72 | /* 00 */ V(1, 0, 1, 1, 2),/* 16 */ |
67 | /* 01 */ V(1, 1, 1, 1, 2), | 73 | /* 01 */ V(1, 1, 1, 1, 2), |
68 | /* 10 */ V(1, 1, 0, 1, 2), | 74 | /* 10 */ V(1, 1, 0, 1, 2), |
69 | /* 11 */ V(1, 1, 1, 0, 2), | 75 | /* 11 */ V(1, 1, 1, 0, 2), |
70 | 76 | ||
71 | /* 0001 ... */ | 77 | /* 0001 ... */ |
72 | /* 00 */ V(0, 1, 1, 1, 2),/* 20 */ | 78 | /* 00 */ V(0, 1, 1, 1, 2),/* 20 */ |
73 | /* 01 */ V(0, 1, 0, 1, 2), | 79 | /* 01 */ V(0, 1, 0, 1, 2), |
74 | /* 10 */ V(1, 0, 0, 1, 1), | 80 | /* 10 */ V(1, 0, 0, 1, 1), |
75 | /* 11 */ V(1, 0, 0, 1, 1), | 81 | /* 11 */ V(1, 0, 0, 1, 1), |
76 | 82 | ||
77 | /* 0010 ... */ | 83 | /* 0010 ... */ |
78 | /* 0 */ V(0, 1, 1, 0, 1),/* 24 */ | 84 | /* 0 */ V(0, 1, 1, 0, 1),/* 24 */ |
79 | /* 1 */ V(0, 0, 1, 1, 1), | 85 | /* 1 */ V(0, 0, 1, 1, 1), |
80 | 86 | ||
81 | /* 0011 ... */ | 87 | /* 0011 ... */ |
82 | /* 0 */ V(1, 0, 1, 0, 1),/* 26 */ | 88 | /* 0 */ V(1, 0, 1, 0, 1),/* 26 */ |
83 | /* 1 */ V(1, 1, 0, 0, 1) | 89 | /* 1 */ V(1, 1, 0, 0, 1) |
84 | }; | 90 | }; |
85 | 91 | ||
86 | static | 92 | static |
87 | union huffquad const hufftabB[] = { | 93 | union huffquad const hufftabB[] = { |
88 | /* 0000 */ V(1, 1, 1, 1, 4), | 94 | /* 0000 */ V(1, 1, 1, 1, 4), |
89 | /* 0001 */ V(1, 1, 1, 0, 4), | 95 | /* 0001 */ V(1, 1, 1, 0, 4), |
90 | /* 0010 */ V(1, 1, 0, 1, 4), | 96 | /* 0010 */ V(1, 1, 0, 1, 4), |
91 | /* 0011 */ V(1, 1, 0, 0, 4), | 97 | /* 0011 */ V(1, 1, 0, 0, 4), |
92 | /* 0100 */ V(1, 0, 1, 1, 4), | 98 | /* 0100 */ V(1, 0, 1, 1, 4), |
93 | /* 0101 */ V(1, 0, 1, 0, 4), | 99 | /* 0101 */ V(1, 0, 1, 0, 4), |
94 | /* 0110 */ V(1, 0, 0, 1, 4), | 100 | /* 0110 */ V(1, 0, 0, 1, 4), |
95 | /* 0111 */ V(1, 0, 0, 0, 4), | 101 | /* 0111 */ V(1, 0, 0, 0, 4), |
96 | /* 1000 */ V(0, 1, 1, 1, 4), | 102 | /* 1000 */ V(0, 1, 1, 1, 4), |
97 | /* 1001 */ V(0, 1, 1, 0, 4), | 103 | /* 1001 */ V(0, 1, 1, 0, 4), |
98 | /* 1010 */ V(0, 1, 0, 1, 4), | 104 | /* 1010 */ V(0, 1, 0, 1, 4), |
99 | /* 1011 */ V(0, 1, 0, 0, 4), | 105 | /* 1011 */ V(0, 1, 0, 0, 4), |
100 | /* 1100 */ V(0, 0, 1, 1, 4), | 106 | /* 1100 */ V(0, 0, 1, 1, 4), |
101 | /* 1101 */ V(0, 0, 1, 0, 4), | 107 | /* 1101 */ V(0, 0, 1, 0, 4), |
102 | /* 1110 */ V(0, 0, 0, 1, 4), | 108 | /* 1110 */ V(0, 0, 0, 1, 4), |
103 | /* 1111 */ V(0, 0, 0, 0, 4) | 109 | /* 1111 */ V(0, 0, 0, 0, 4) |
104 | }; | 110 | }; |
105 | 111 | ||
106 | # undef V | 112 | # undef V |
107 | # undef PTR | 113 | # undef PTR |
108 | 114 | ||
109 | # if defined(__GNUC__) | 115 | # if defined(__GNUC__) || \ |
110 | # define PTR(offs, bits){ ptr: { 0, bits, offs } } | 116 | (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901) |
111 | # define V(x, y, hlen) { value: { 1, hlen, x, y } } | 117 | # define PTR(offs, bits){ .ptr = { 0, bits, offs } } |
118 | # define V(x, y, hlen) { .value = { 1, hlen, x, y } } | ||
112 | # else | 119 | # else |
113 | # define PTR(offs, bits){ { 0, bits, offs } } | 120 | # define PTR(offs, bits){ { 0, bits, offs } } |
114 | # define V(x, y, hlen) { { 1, hlen, (x << 0) | (y << 4) } } | 121 | # if defined(WORDS_BIGENDIAN) |
122 | # define V(x, y, hlen){ { 1, hlen, (x << 8) | (y << 4) } } | ||
123 | # else | ||
124 | # define V(x, y, hlen){ { 1, hlen, (x << 0) | (y << 4) } } | ||
125 | # endif | ||
115 | # endif | 126 | # endif |
116 | 127 | ||
117 | static | 128 | static |
118 | union huffpair const hufftab0[] = { | 129 | union huffpair const hufftab0[] = { |
119 | /* */ V(0, 0, 0) | 130 | /* */ V(0, 0, 0) |
120 | }; | 131 | }; |
121 | 132 | ||
122 | static | 133 | static |
123 | union huffpair const hufftab1[] = { | 134 | union huffpair const hufftab1[] = { |
124 | /* 000 */ V(1, 1, 3), | 135 | /* 000 */ V(1, 1, 3), |
125 | /* 001 */ V(0, 1, 3), | 136 | /* 001 */ V(0, 1, 3), |
126 | /* 010 */ V(1, 0, 2), | 137 | /* 010 */ V(1, 0, 2), |
127 | /* 011 */ V(1, 0, 2), | 138 | /* 011 */ V(1, 0, 2), |
128 | /* 100 */ V(0, 0, 1), | 139 | /* 100 */ V(0, 0, 1), |
129 | /* 101 */ V(0, 0, 1), | 140 | /* 101 */ V(0, 0, 1), |
130 | /* 110 */ V(0, 0, 1), | 141 | /* 110 */ V(0, 0, 1), |
131 | /* 111 */ V(0, 0, 1) | 142 | /* 111 */ V(0, 0, 1) |
132 | }; | 143 | }; |
133 | 144 | ||
134 | static | 145 | static |
135 | union huffpair const hufftab2[] = { | 146 | union huffpair const hufftab2[] = { |
136 | /* 000 */ PTR(8, 3), | 147 | /* 000 */ PTR(8, 3), |
137 | /* 001 */ V(1, 1, 3), | 148 | /* 001 */ V(1, 1, 3), |
138 | /* 010 */ V(0, 1, 3), | 149 | /* 010 */ V(0, 1, 3), |
139 | /* 011 */ V(1, 0, 3), | 150 | /* 011 */ V(1, 0, 3), |
140 | /* 100 */ V(0, 0, 1), | 151 | /* 100 */ V(0, 0, 1), |
141 | /* 101 */ V(0, 0, 1), | 152 | /* 101 */ V(0, 0, 1), |
142 | /* 110 */ V(0, 0, 1), | 153 | /* 110 */ V(0, 0, 1), |
143 | /* 111 */ V(0, 0, 1), | 154 | /* 111 */ V(0, 0, 1), |
144 | 155 | ||
145 | /* 000 ... */ | 156 | /* 000 ... */ |
146 | /* 000 */ V(2, 2, 3),/* 8 */ | 157 | /* 000 */ V(2, 2, 3),/* 8 */ |
147 | /* 001 */ V(0, 2, 3), | 158 | /* 001 */ V(0, 2, 3), |
148 | /* 010 */ V(1, 2, 2), | 159 | /* 010 */ V(1, 2, 2), |
149 | /* 011 */ V(1, 2, 2), | 160 | /* 011 */ V(1, 2, 2), |
150 | /* 100 */ V(2, 1, 2), | 161 | /* 100 */ V(2, 1, 2), |
151 | /* 101 */ V(2, 1, 2), | 162 | /* 101 */ V(2, 1, 2), |
152 | /* 110 */ V(2, 0, 2), | 163 | /* 110 */ V(2, 0, 2), |
153 | /* 111 */ V(2, 0, 2) | 164 | /* 111 */ V(2, 0, 2) |
154 | }; | 165 | }; |
155 | 166 | ||
156 | static | 167 | static |
157 | union huffpair const hufftab3[] = { | 168 | union huffpair const hufftab3[] = { |
158 | /* 000 */ PTR(8, 3), | 169 | /* 000 */ PTR(8, 3), |
159 | /* 001 */ V(1, 0, 3), | 170 | /* 001 */ V(1, 0, 3), |
160 | /* 010 */ V(1, 1, 2), | 171 | /* 010 */ V(1, 1, 2), |
161 | /* 011 */ V(1, 1, 2), | 172 | /* 011 */ V(1, 1, 2), |
162 | /* 100 */ V(0, 1, 2), | 173 | /* 100 */ V(0, 1, 2), |
163 | /* 101 */ V(0, 1, 2), | 174 | /* 101 */ V(0, 1, 2), |
164 | /* 110 */ V(0, 0, 2), | 175 | /* 110 */ V(0, 0, 2), |
165 | /* 111 */ V(0, 0, 2), | 176 | /* 111 */ V(0, 0, 2), |
166 | 177 | ||
167 | /* 000 ... */ | 178 | /* 000 ... */ |
168 | /* 000 */ V(2, 2, 3),/* 8 */ | 179 | /* 000 */ V(2, 2, 3),/* 8 */ |
169 | /* 001 */ V(0, 2, 3), | 180 | /* 001 */ V(0, 2, 3), |
170 | /* 010 */ V(1, 2, 2), | 181 | /* 010 */ V(1, 2, 2), |
171 | /* 011 */ V(1, 2, 2), | 182 | /* 011 */ V(1, 2, 2), |
172 | /* 100 */ V(2, 1, 2), | 183 | /* 100 */ V(2, 1, 2), |
173 | /* 101 */ V(2, 1, 2), | 184 | /* 101 */ V(2, 1, 2), |
174 | /* 110 */ V(2, 0, 2), | 185 | /* 110 */ V(2, 0, 2), |
175 | /* 111 */ V(2, 0, 2) | 186 | /* 111 */ V(2, 0, 2) |
176 | }; | 187 | }; |
177 | 188 | ||
178 | static | 189 | static |
179 | union huffpair const hufftab5[] = { | 190 | union huffpair const hufftab5[] = { |
180 | /* 000 */ PTR(8, 4), | 191 | /* 000 */ PTR(8, 4), |
181 | /* 001 */ V(1, 1, 3), | 192 | /* 001 */ V(1, 1, 3), |
182 | /* 010 */ V(0, 1, 3), | 193 | /* 010 */ V(0, 1, 3), |
183 | /* 011 */ V(1, 0, 3), | 194 | /* 011 */ V(1, 0, 3), |
184 | /* 100 */ V(0, 0, 1), | 195 | /* 100 */ V(0, 0, 1), |
185 | /* 101 */ V(0, 0, 1), | 196 | /* 101 */ V(0, 0, 1), |
186 | /* 110 */ V(0, 0, 1), | 197 | /* 110 */ V(0, 0, 1), |
187 | /* 111 */ V(0, 0, 1), | 198 | /* 111 */ V(0, 0, 1), |
188 | 199 | ||
189 | /* 000 ... */ | 200 | /* 000 ... */ |
190 | /* 0000 */ PTR(24, 1),/* 8 */ | 201 | /* 0000 */ PTR(24, 1),/* 8 */ |
191 | /* 0001 */ V(3, 2, 4), | 202 | /* 0001 */ V(3, 2, 4), |
192 | /* 0010 */ V(3, 1, 3), | 203 | /* 0010 */ V(3, 1, 3), |
193 | /* 0011 */ V(3, 1, 3), | 204 | /* 0011 */ V(3, 1, 3), |
194 | /* 0100 */ V(1, 3, 4), | 205 | /* 0100 */ V(1, 3, 4), |
195 | /* 0101 */ V(0, 3, 4), | 206 | /* 0101 */ V(0, 3, 4), |
196 | /* 0110 */ V(3, 0, 4), | 207 | /* 0110 */ V(3, 0, 4), |
197 | /* 0111 */ V(2, 2, 4), | 208 | /* 0111 */ V(2, 2, 4), |
198 | /* 1000 */ V(1, 2, 3), | 209 | /* 1000 */ V(1, 2, 3), |
199 | /* 1001 */ V(1, 2, 3), | 210 | /* 1001 */ V(1, 2, 3), |
200 | /* 1010 */ V(2, 1, 3), | 211 | /* 1010 */ V(2, 1, 3), |
201 | /* 1011 */ V(2, 1, 3), | 212 | /* 1011 */ V(2, 1, 3), |
202 | /* 1100 */ V(0, 2, 3), | 213 | /* 1100 */ V(0, 2, 3), |
203 | /* 1101 */ V(0, 2, 3), | 214 | /* 1101 */ V(0, 2, 3), |
204 | /* 1110 */ V(2, 0, 3), | 215 | /* 1110 */ V(2, 0, 3), |
205 | /* 1111 */ V(2, 0, 3), | 216 | /* 1111 */ V(2, 0, 3), |
206 | 217 | ||
207 | /* 000 0000 ... */ | 218 | /* 000 0000 ... */ |
208 | /* 0 */ V(3, 3, 1),/* 24 */ | 219 | /* 0 */ V(3, 3, 1),/* 24 */ |
209 | /* 1 */ V(2, 3, 1) | 220 | /* 1 */ V(2, 3, 1) |
210 | }; | 221 | }; |
211 | 222 | ||
212 | static | 223 | static |
213 | union huffpair const hufftab6[] = { | 224 | union huffpair const hufftab6[] = { |
214 | /* 0000 */ PTR(16, 3), | 225 | /* 0000 */ PTR(16, 3), |
215 | /* 0001 */ PTR(24, 1), | 226 | /* 0001 */ PTR(24, 1), |
216 | /* 0010 */ PTR(26, 1), | 227 | /* 0010 */ PTR(26, 1), |
217 | /* 0011 */ V(1, 2, 4), | 228 | /* 0011 */ V(1, 2, 4), |
218 | /* 0100 */ V(2, 1, 4), | 229 | /* 0100 */ V(2, 1, 4), |
219 | /* 0101 */ V(2, 0, 4), | 230 | /* 0101 */ V(2, 0, 4), |
220 | /* 0110 */ V(0, 1, 3), | 231 | /* 0110 */ V(0, 1, 3), |
221 | /* 0111 */ V(0, 1, 3), | 232 | /* 0111 */ V(0, 1, 3), |
222 | /* 1000 */ V(1, 1, 2), | 233 | /* 1000 */ V(1, 1, 2), |
223 | /* 1001 */ V(1, 1, 2), | 234 | /* 1001 */ V(1, 1, 2), |
224 | /* 1010 */ V(1, 1, 2), | 235 | /* 1010 */ V(1, 1, 2), |
225 | /* 1011 */ V(1, 1, 2), | 236 | /* 1011 */ V(1, 1, 2), |
226 | /* 1100 */ V(1, 0, 3), | 237 | /* 1100 */ V(1, 0, 3), |
227 | /* 1101 */ V(1, 0, 3), | 238 | /* 1101 */ V(1, 0, 3), |
228 | /* 1110 */ V(0, 0, 3), | 239 | /* 1110 */ V(0, 0, 3), |
229 | /* 1111 */ V(0, 0, 3), | 240 | /* 1111 */ V(0, 0, 3), |
230 | 241 | ||
231 | /* 0000 ... */ | 242 | /* 0000 ... */ |
232 | /* 000 */ V(3, 3, 3),/* 16 */ | 243 | /* 000 */ V(3, 3, 3),/* 16 */ |
233 | /* 001 */ V(0, 3, 3), | 244 | /* 001 */ V(0, 3, 3), |
234 | /* 010 */ V(2, 3, 2), | 245 | /* 010 */ V(2, 3, 2), |
235 | /* 011 */ V(2, 3, 2), | 246 | /* 011 */ V(2, 3, 2), |
236 | /* 100 */ V(3, 2, 2), | 247 | /* 100 */ V(3, 2, 2), |
237 | /* 101 */ V(3, 2, 2), | 248 | /* 101 */ V(3, 2, 2), |
238 | /* 110 */ V(3, 0, 2), | 249 | /* 110 */ V(3, 0, 2), |
239 | /* 111 */ V(3, 0, 2), | 250 | /* 111 */ V(3, 0, 2), |
240 | 251 | ||
241 | /* 0001 ... */ | 252 | /* 0001 ... */ |
242 | /* 0 */ V(1, 3, 1),/* 24 */ | 253 | /* 0 */ V(1, 3, 1),/* 24 */ |
diff --git a/core/multimedia/opieplayer/libmad/huffman.h b/core/multimedia/opieplayer/libmad/huffman.h index d051949..e4c1b35 100644 --- a/core/multimedia/opieplayer/libmad/huffman.h +++ b/core/multimedia/opieplayer/libmad/huffman.h | |||
@@ -1,66 +1,66 @@ | |||
1 | /* | 1 | /* |
2 | * libmad - MPEG audio decoder library | 2 | * libmad - MPEG audio decoder library |
3 | * Copyright (C) 2000-2001 Robert Leslie | 3 | * Copyright (C) 2000-2004 Underbit Technologies, Inc. |
4 | * | 4 | * |
5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
7 | * the Free Software Foundation; either version 2 of the License, or | 7 | * the Free Software Foundation; either version 2 of the License, or |
8 | * (at your option) any later version. | 8 | * (at your option) any later version. |
9 | * | 9 | * |
10 | * This program is distributed in the hope that it will be useful, | 10 | * This program is distributed in the hope that it will be useful, |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | * GNU General Public License for more details. | 13 | * GNU General Public License for more details. |
14 | * | 14 | * |
15 | * You should have received a copy of the GNU General Public License | 15 | * You should have received a copy of the GNU General Public License |
16 | * along with this program; if not, write to the Free Software | 16 | * along with this program; if not, write to the Free Software |
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
18 | * | 18 | * |
19 | * $Id$ | 19 | * $Id$ |
20 | */ | 20 | */ |
21 | 21 | ||
22 | # ifndef LIBMAD_HUFFMAN_H | 22 | # ifndef LIBMAD_HUFFMAN_H |
23 | # define LIBMAD_HUFFMAN_H | 23 | # define LIBMAD_HUFFMAN_H |
24 | 24 | ||
25 | union huffquad { | 25 | union huffquad { |
26 | struct { | 26 | struct { |
27 | unsigned short final : 1; | 27 | unsigned short final : 1; |
28 | unsigned short bits : 3; | 28 | unsigned short bits : 3; |
29 | unsigned short offset : 12; | 29 | unsigned short offset : 12; |
30 | } ptr; | 30 | } ptr; |
31 | struct { | 31 | struct { |
32 | unsigned short final : 1; | 32 | unsigned short final : 1; |
33 | unsigned short hlen : 3; | 33 | unsigned short hlen : 3; |
34 | unsigned short v : 1; | 34 | unsigned short v : 1; |
35 | unsigned short w : 1; | 35 | unsigned short w : 1; |
36 | unsigned short x : 1; | 36 | unsigned short x : 1; |
37 | unsigned short y : 1; | 37 | unsigned short y : 1; |
38 | } value; | 38 | } value; |
39 | unsigned short final : 1; | 39 | unsigned short final : 1; |
40 | }; | 40 | }; |
41 | 41 | ||
42 | union huffpair { | 42 | union huffpair { |
43 | struct { | 43 | struct { |
44 | unsigned short final : 1; | 44 | unsigned short final : 1; |
45 | unsigned short bits : 3; | 45 | unsigned short bits : 3; |
46 | unsigned short offset : 12; | 46 | unsigned short offset : 12; |
47 | } ptr; | 47 | } ptr; |
48 | struct { | 48 | struct { |
49 | unsigned short final : 1; | 49 | unsigned short final : 1; |
50 | unsigned short hlen : 3; | 50 | unsigned short hlen : 3; |
51 | unsigned short x : 4; | 51 | unsigned short x : 4; |
52 | unsigned short y : 4; | 52 | unsigned short y : 4; |
53 | } value; | 53 | } value; |
54 | unsigned short final : 1; | 54 | unsigned short final : 1; |
55 | }; | 55 | }; |
56 | 56 | ||
57 | struct hufftable { | 57 | struct hufftable { |
58 | union huffpair const *table; | 58 | union huffpair const *table; |
59 | unsigned short linbits; | 59 | unsigned short linbits; |
60 | unsigned short startbits; | 60 | unsigned short startbits; |
61 | }; | 61 | }; |
62 | 62 | ||
63 | extern union huffquad const *const mad_huff_quad_table[2]; | 63 | extern union huffquad const *const mad_huff_quad_table[2]; |
64 | extern struct hufftable const mad_huff_pair_table[32]; | 64 | extern struct hufftable const mad_huff_pair_table[32]; |
65 | 65 | ||
66 | # endif | 66 | # endif |
diff --git a/core/multimedia/opieplayer/libmad/imdct_s.dat b/core/multimedia/opieplayer/libmad/imdct_s.dat index ed70446..e2d91a0 100644 --- a/core/multimedia/opieplayer/libmad/imdct_s.dat +++ b/core/multimedia/opieplayer/libmad/imdct_s.dat | |||
@@ -1,62 +1,62 @@ | |||
1 | /* | 1 | /* |
2 | * libmad - MPEG audio decoder library | 2 | * libmad - MPEG audio decoder library |
3 | * Copyright (C) 2000-2001 Robert Leslie | 3 | * Copyright (C) 2000-2004 Underbit Technologies, Inc. |
4 | * | 4 | * |
5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
7 | * the Free Software Foundation; either version 2 of the License, or | 7 | * the Free Software Foundation; either version 2 of the License, or |
8 | * (at your option) any later version. | 8 | * (at your option) any later version. |
9 | * | 9 | * |
10 | * This program is distributed in the hope that it will be useful, | 10 | * This program is distributed in the hope that it will be useful, |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | * GNU General Public License for more details. | 13 | * GNU General Public License for more details. |
14 | * | 14 | * |
15 | * You should have received a copy of the GNU General Public License | 15 | * You should have received a copy of the GNU General Public License |
16 | * along with this program; if not, write to the Free Software | 16 | * along with this program; if not, write to the Free Software |
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
18 | * | 18 | * |
19 | * $Id$ | 19 | * $Id$ |
20 | */ | 20 | */ |
21 | 21 | ||
22 | /* 0 */ { MAD_F(0x09bd7ca0) /* 0.608761429 */, | 22 | /* 0 */ { MAD_F(0x09bd7ca0) /* 0.608761429 */, |
23 | -MAD_F(0x0ec835e8) /* -0.923879533 */, | 23 | -MAD_F(0x0ec835e8) /* -0.923879533 */, |
24 | -MAD_F(0x0216a2a2) /* -0.130526192 */, | 24 | -MAD_F(0x0216a2a2) /* -0.130526192 */, |
25 | MAD_F(0x0fdcf549) /* 0.991444861 */, | 25 | MAD_F(0x0fdcf549) /* 0.991444861 */, |
26 | -MAD_F(0x061f78aa) /* -0.382683432 */, | 26 | -MAD_F(0x061f78aa) /* -0.382683432 */, |
27 | -MAD_F(0x0cb19346) /* -0.793353340 */ }, | 27 | -MAD_F(0x0cb19346) /* -0.793353340 */ }, |
28 | 28 | ||
29 | /* 6 */ { -MAD_F(0x0cb19346) /* -0.793353340 */, | 29 | /* 6 */ { -MAD_F(0x0cb19346) /* -0.793353340 */, |
30 | MAD_F(0x061f78aa) /* 0.382683432 */, | 30 | MAD_F(0x061f78aa) /* 0.382683432 */, |
31 | MAD_F(0x0fdcf549) /* 0.991444861 */, | 31 | MAD_F(0x0fdcf549) /* 0.991444861 */, |
32 | MAD_F(0x0216a2a2) /* 0.130526192 */, | 32 | MAD_F(0x0216a2a2) /* 0.130526192 */, |
33 | -MAD_F(0x0ec835e8) /* -0.923879533 */, | 33 | -MAD_F(0x0ec835e8) /* -0.923879533 */, |
34 | -MAD_F(0x09bd7ca0) /* -0.608761429 */ }, | 34 | -MAD_F(0x09bd7ca0) /* -0.608761429 */ }, |
35 | 35 | ||
36 | /* 1 */ { MAD_F(0x061f78aa) /* 0.382683432 */, | 36 | /* 1 */ { MAD_F(0x061f78aa) /* 0.382683432 */, |
37 | -MAD_F(0x0ec835e8) /* -0.923879533 */, | 37 | -MAD_F(0x0ec835e8) /* -0.923879533 */, |
38 | MAD_F(0x0ec835e8) /* 0.923879533 */, | 38 | MAD_F(0x0ec835e8) /* 0.923879533 */, |
39 | -MAD_F(0x061f78aa) /* -0.382683432 */, | 39 | -MAD_F(0x061f78aa) /* -0.382683432 */, |
40 | -MAD_F(0x061f78aa) /* -0.382683432 */, | 40 | -MAD_F(0x061f78aa) /* -0.382683432 */, |
41 | MAD_F(0x0ec835e8) /* 0.923879533 */ }, | 41 | MAD_F(0x0ec835e8) /* 0.923879533 */ }, |
42 | 42 | ||
43 | /* 7 */ { -MAD_F(0x0ec835e8) /* -0.923879533 */, | 43 | /* 7 */ { -MAD_F(0x0ec835e8) /* -0.923879533 */, |
44 | -MAD_F(0x061f78aa) /* -0.382683432 */, | 44 | -MAD_F(0x061f78aa) /* -0.382683432 */, |
45 | MAD_F(0x061f78aa) /* 0.382683432 */, | 45 | MAD_F(0x061f78aa) /* 0.382683432 */, |
46 | MAD_F(0x0ec835e8) /* 0.923879533 */, | 46 | MAD_F(0x0ec835e8) /* 0.923879533 */, |
47 | MAD_F(0x0ec835e8) /* 0.923879533 */, | 47 | MAD_F(0x0ec835e8) /* 0.923879533 */, |
48 | MAD_F(0x061f78aa) /* 0.382683432 */ }, | 48 | MAD_F(0x061f78aa) /* 0.382683432 */ }, |
49 | 49 | ||
50 | /* 2 */ { MAD_F(0x0216a2a2) /* 0.130526192 */, | 50 | /* 2 */ { MAD_F(0x0216a2a2) /* 0.130526192 */, |
51 | -MAD_F(0x061f78aa) /* -0.382683432 */, | 51 | -MAD_F(0x061f78aa) /* -0.382683432 */, |
52 | MAD_F(0x09bd7ca0) /* 0.608761429 */, | 52 | MAD_F(0x09bd7ca0) /* 0.608761429 */, |
53 | -MAD_F(0x0cb19346) /* -0.793353340 */, | 53 | -MAD_F(0x0cb19346) /* -0.793353340 */, |
54 | MAD_F(0x0ec835e8) /* 0.923879533 */, | 54 | MAD_F(0x0ec835e8) /* 0.923879533 */, |
55 | -MAD_F(0x0fdcf549) /* -0.991444861 */ }, | 55 | -MAD_F(0x0fdcf549) /* -0.991444861 */ }, |
56 | 56 | ||
57 | /* 8 */ { -MAD_F(0x0fdcf549) /* -0.991444861 */, | 57 | /* 8 */ { -MAD_F(0x0fdcf549) /* -0.991444861 */, |
58 | -MAD_F(0x0ec835e8) /* -0.923879533 */, | 58 | -MAD_F(0x0ec835e8) /* -0.923879533 */, |
59 | -MAD_F(0x0cb19346) /* -0.793353340 */, | 59 | -MAD_F(0x0cb19346) /* -0.793353340 */, |
60 | -MAD_F(0x09bd7ca0) /* -0.608761429 */, | 60 | -MAD_F(0x09bd7ca0) /* -0.608761429 */, |
61 | -MAD_F(0x061f78aa) /* -0.382683432 */, | 61 | -MAD_F(0x061f78aa) /* -0.382683432 */, |
62 | -MAD_F(0x0216a2a2) /* -0.130526192 */ } | 62 | -MAD_F(0x0216a2a2) /* -0.130526192 */ } |
diff --git a/core/multimedia/opieplayer/libmad/layer12.c b/core/multimedia/opieplayer/libmad/layer12.c index d291174..512b6a5 100644 --- a/core/multimedia/opieplayer/libmad/layer12.c +++ b/core/multimedia/opieplayer/libmad/layer12.c | |||
@@ -1,496 +1,534 @@ | |||
1 | /* | 1 | /* |
2 | * libmad - MPEG audio decoder library | 2 | * libmad - MPEG audio decoder library |
3 | * Copyright (C) 2000-2001 Robert Leslie | 3 | * Copyright (C) 2000-2004 Underbit Technologies, Inc. |
4 | * | 4 | * |
5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
7 | * the Free Software Foundation; either version 2 of the License, or | 7 | * the Free Software Foundation; either version 2 of the License, or |
8 | * (at your option) any later version. | 8 | * (at your option) any later version. |
9 | * | 9 | * |
10 | * This program is distributed in the hope that it will be useful, | 10 | * This program is distributed in the hope that it will be useful, |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | * GNU General Public License for more details. | 13 | * GNU General Public License for more details. |
14 | * | 14 | * |
15 | * You should have received a copy of the GNU General Public License | 15 | * You should have received a copy of the GNU General Public License |
16 | * along with this program; if not, write to the Free Software | 16 | * along with this program; if not, write to the Free Software |
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
18 | * | 18 | * |
19 | * $Id$ | 19 | * $Id$ |
20 | */ | 20 | */ |
21 | 21 | ||
22 | # ifdef HAVE_CONFIG_H | 22 | # ifdef HAVE_CONFIG_H |
23 | # include "libmad_config.h" | 23 | # include "libmad_config.h" |
24 | # endif | 24 | # endif |
25 | 25 | ||
26 | # include "libmad_global.h" | 26 | # include "libmad_global.h" |
27 | 27 | ||
28 | # ifdef HAVE_LIMITS_H | 28 | # ifdef HAVE_LIMITS_H |
29 | # include <limits.h> | 29 | # include <limits.h> |
30 | # else | 30 | # else |
31 | # define CHAR_BIT 8 | 31 | # define CHAR_BIT 8 |
32 | # endif | 32 | # endif |
33 | 33 | ||
34 | # include "fixed.h" | 34 | # include "fixed.h" |
35 | # include "bit.h" | 35 | # include "bit.h" |
36 | # include "stream.h" | 36 | # include "stream.h" |
37 | # include "frame.h" | 37 | # include "frame.h" |
38 | # include "layer12.h" | 38 | # include "layer12.h" |
39 | 39 | ||
40 | /* | 40 | /* |
41 | * scalefactor table | 41 | * scalefactor table |
42 | * used in both Layer I and Layer II decoding | 42 | * used in both Layer I and Layer II decoding |
43 | */ | 43 | */ |
44 | static | 44 | static |
45 | mad_fixed_t const sf_table[63] = { | 45 | mad_fixed_t const sf_table[64] = { |
46 | # include "sf_table.dat" | 46 | # include "sf_table.dat" |
47 | }; | 47 | }; |
48 | 48 | ||
49 | /* --- Layer I ------------------------------------------------------------- */ | 49 | /* --- Layer I ------------------------------------------------------------- */ |
50 | 50 | ||
51 | /* linear scaling table */ | 51 | /* linear scaling table */ |
52 | static | 52 | static |
53 | mad_fixed_t const linear_table[14] = { | 53 | mad_fixed_t const linear_table[14] = { |
54 | MAD_F(0x15555555), /* 2^2 / (2^2 - 1) == 1.33333333333333 */ | 54 | MAD_F(0x15555555), /* 2^2 / (2^2 - 1) == 1.33333333333333 */ |
55 | MAD_F(0x12492492), /* 2^3 / (2^3 - 1) == 1.14285714285714 */ | 55 | MAD_F(0x12492492), /* 2^3 / (2^3 - 1) == 1.14285714285714 */ |
56 | MAD_F(0x11111111), /* 2^4 / (2^4 - 1) == 1.06666666666667 */ | 56 | MAD_F(0x11111111), /* 2^4 / (2^4 - 1) == 1.06666666666667 */ |
57 | MAD_F(0x10842108), /* 2^5 / (2^5 - 1) == 1.03225806451613 */ | 57 | MAD_F(0x10842108), /* 2^5 / (2^5 - 1) == 1.03225806451613 */ |
58 | MAD_F(0x10410410), /* 2^6 / (2^6 - 1) == 1.01587301587302 */ | 58 | MAD_F(0x10410410), /* 2^6 / (2^6 - 1) == 1.01587301587302 */ |
59 | MAD_F(0x10204081), /* 2^7 / (2^7 - 1) == 1.00787401574803 */ | 59 | MAD_F(0x10204081), /* 2^7 / (2^7 - 1) == 1.00787401574803 */ |
60 | MAD_F(0x10101010), /* 2^8 / (2^8 - 1) == 1.00392156862745 */ | 60 | MAD_F(0x10101010), /* 2^8 / (2^8 - 1) == 1.00392156862745 */ |
61 | MAD_F(0x10080402), /* 2^9 / (2^9 - 1) == 1.00195694716243 */ | 61 | MAD_F(0x10080402), /* 2^9 / (2^9 - 1) == 1.00195694716243 */ |
62 | MAD_F(0x10040100), /* 2^10 / (2^10 - 1) == 1.00097751710655 */ | 62 | MAD_F(0x10040100), /* 2^10 / (2^10 - 1) == 1.00097751710655 */ |
63 | MAD_F(0x10020040), /* 2^11 / (2^11 - 1) == 1.00048851978505 */ | 63 | MAD_F(0x10020040), /* 2^11 / (2^11 - 1) == 1.00048851978505 */ |
64 | MAD_F(0x10010010), /* 2^12 / (2^12 - 1) == 1.00024420024420 */ | 64 | MAD_F(0x10010010), /* 2^12 / (2^12 - 1) == 1.00024420024420 */ |
65 | MAD_F(0x10008004), /* 2^13 / (2^13 - 1) == 1.00012208521548 */ | 65 | MAD_F(0x10008004), /* 2^13 / (2^13 - 1) == 1.00012208521548 */ |
66 | MAD_F(0x10004001), /* 2^14 / (2^14 - 1) == 1.00006103888177 */ | 66 | MAD_F(0x10004001), /* 2^14 / (2^14 - 1) == 1.00006103888177 */ |
67 | MAD_F(0x10002000) /* 2^15 / (2^15 - 1) == 1.00003051850948 */ | 67 | MAD_F(0x10002000) /* 2^15 / (2^15 - 1) == 1.00003051850948 */ |
68 | }; | 68 | }; |
69 | 69 | ||
70 | /* | 70 | /* |
71 | * NAME:I_sample() | 71 | * NAME:I_sample() |
72 | * DESCRIPTION:decode one requantized Layer I sample from a bitstream | 72 | * DESCRIPTION:decode one requantized Layer I sample from a bitstream |
73 | */ | 73 | */ |
74 | static | 74 | static |
75 | mad_fixed_t I_sample(struct mad_bitptr *ptr, unsigned int nb) | 75 | mad_fixed_t I_sample(struct mad_bitptr *ptr, unsigned int nb) |
76 | { | 76 | { |
77 | mad_fixed_t sample; | 77 | mad_fixed_t sample; |
78 | 78 | ||
79 | sample = mad_bit_read(ptr, nb); | 79 | sample = mad_bit_read(ptr, nb); |
80 | 80 | ||
81 | /* invert most significant bit, extend sign, then scale to fixed format */ | 81 | /* invert most significant bit, extend sign, then scale to fixed format */ |
82 | 82 | ||
83 | sample ^= 1 << (nb - 1); | 83 | sample ^= 1 << (nb - 1); |
84 | sample |= -(sample & (1 << (nb - 1))); | 84 | sample |= -(sample & (1 << (nb - 1))); |
85 | 85 | ||
86 | sample <<= MAD_F_FRACBITS - (nb - 1); | 86 | sample <<= MAD_F_FRACBITS - (nb - 1); |
87 | 87 | ||
88 | /* requantize the sample */ | 88 | /* requantize the sample */ |
89 | 89 | ||
90 | /* s'' = (2^nb / (2^nb - 1)) * (s''' + 2^(-nb + 1)) */ | 90 | /* s'' = (2^nb / (2^nb - 1)) * (s''' + 2^(-nb + 1)) */ |
91 | 91 | ||
92 | sample += MAD_F_ONE >> (nb - 1); | 92 | sample += MAD_F_ONE >> (nb - 1); |
93 | 93 | ||
94 | return mad_f_mul(sample, linear_table[nb - 2]); | 94 | return mad_f_mul(sample, linear_table[nb - 2]); |
95 | 95 | ||
96 | /* s' = factor * s'' */ | 96 | /* s' = factor * s'' */ |
97 | /* (to be performed by caller) */ | 97 | /* (to be performed by caller) */ |
98 | } | 98 | } |
99 | 99 | ||
100 | /* | 100 | /* |
101 | * NAME:layer->I() | 101 | * NAME:layer->I() |
102 | * DESCRIPTION:decode a single Layer I frame | 102 | * DESCRIPTION:decode a single Layer I frame |
103 | */ | 103 | */ |
104 | int mad_layer_I(struct mad_stream *stream, struct mad_frame *frame) | 104 | int mad_layer_I(struct mad_stream *stream, struct mad_frame *frame) |
105 | { | 105 | { |
106 | struct mad_header *header = &frame->header; | 106 | struct mad_header *header = &frame->header; |
107 | unsigned int nch, bound, ch, s, sb, nb; | 107 | unsigned int nch, bound, ch, s, sb, nb; |
108 | unsigned char allocation[2][32], scalefactor[2][32]; | 108 | unsigned char allocation[2][32], scalefactor[2][32]; |
109 | 109 | ||
110 | nch = MAD_NCHANNELS(header); | 110 | nch = MAD_NCHANNELS(header); |
111 | 111 | ||
112 | bound = 32; | 112 | bound = 32; |
113 | if (header->mode == MAD_MODE_JOINT_STEREO) { | 113 | if (header->mode == MAD_MODE_JOINT_STEREO) { |
114 | header->flags |= MAD_FLAG_I_STEREO; | 114 | header->flags |= MAD_FLAG_I_STEREO; |
115 | bound = 4 + header->mode_extension * 4; | 115 | bound = 4 + header->mode_extension * 4; |
116 | } | 116 | } |
117 | 117 | ||
118 | /* check CRC word */ | 118 | /* check CRC word */ |
119 | 119 | ||
120 | if (header->flags & MAD_FLAG_PROTECTION) { | 120 | if (header->flags & MAD_FLAG_PROTECTION) { |
121 | header->crc_check = | 121 | header->crc_check = |
122 | mad_bit_crc(stream->ptr, 4 * (bound * nch + (32 - bound)), | 122 | mad_bit_crc(stream->ptr, 4 * (bound * nch + (32 - bound)), |
123 | header->crc_check); | 123 | header->crc_check); |
124 | 124 | ||
125 | if (header->crc_check != header->crc_target && | 125 | if (header->crc_check != header->crc_target && |
126 | !(frame->options & MAD_OPTION_IGNORECRC)) { | 126 | !(frame->options & MAD_OPTION_IGNORECRC)) { |
127 | stream->error = MAD_ERROR_BADCRC; | 127 | stream->error = MAD_ERROR_BADCRC; |
128 | return -1; | 128 | return -1; |
129 | } | 129 | } |
130 | } | 130 | } |
131 | 131 | ||
132 | /* decode bit allocations */ | 132 | /* decode bit allocations */ |
133 | 133 | ||
134 | for (sb = 0; sb < bound; ++sb) { | 134 | for (sb = 0; sb < bound; ++sb) { |
135 | for (ch = 0; ch < nch; ++ch) { | 135 | for (ch = 0; ch < nch; ++ch) { |
136 | nb = mad_bit_read(&stream->ptr, 4); | 136 | nb = mad_bit_read(&stream->ptr, 4); |
137 | 137 | ||
138 | if (nb == 15) { | 138 | if (nb == 15) { |
139 | stream->error = MAD_ERROR_BADBITALLOC; | 139 | stream->error = MAD_ERROR_BADBITALLOC; |
140 | return -1; | 140 | return -1; |
141 | } | 141 | } |
142 | 142 | ||
143 | allocation[ch][sb] = nb ? nb + 1 : 0; | 143 | allocation[ch][sb] = nb ? nb + 1 : 0; |
144 | } | 144 | } |
145 | } | 145 | } |
146 | 146 | ||
147 | for (sb = bound; sb < 32; ++sb) { | 147 | for (sb = bound; sb < 32; ++sb) { |
148 | nb = mad_bit_read(&stream->ptr, 4); | 148 | nb = mad_bit_read(&stream->ptr, 4); |
149 | 149 | ||
150 | if (nb == 15) { | 150 | if (nb == 15) { |
151 | stream->error = MAD_ERROR_BADBITALLOC; | 151 | stream->error = MAD_ERROR_BADBITALLOC; |
152 | return -1; | 152 | return -1; |
153 | } | 153 | } |
154 | 154 | ||
155 | allocation[0][sb] = | 155 | allocation[0][sb] = |
156 | allocation[1][sb] = nb ? nb + 1 : 0; | 156 | allocation[1][sb] = nb ? nb + 1 : 0; |
157 | } | 157 | } |
158 | 158 | ||
159 | /* decode scalefactors */ | 159 | /* decode scalefactors */ |
160 | 160 | ||
161 | for (sb = 0; sb < 32; ++sb) { | 161 | for (sb = 0; sb < 32; ++sb) { |
162 | for (ch = 0; ch < nch; ++ch) { | 162 | for (ch = 0; ch < nch; ++ch) { |
163 | if (allocation[ch][sb]) { | 163 | if (allocation[ch][sb]) { |
164 | scalefactor[ch][sb] = mad_bit_read(&stream->ptr, 6); | 164 | scalefactor[ch][sb] = mad_bit_read(&stream->ptr, 6); |
165 | 165 | ||
166 | # if defined(OPT_STRICT) | ||
167 | /* | ||
168 | * Scalefactor index 63 does not appear in Table B.1 of | ||
169 | * ISO/IEC 11172-3. Nonetheless, other implementations accept it, | ||
170 | * so we only reject it if OPT_STRICT is defined. | ||
171 | */ | ||
166 | if (scalefactor[ch][sb] == 63) { | 172 | if (scalefactor[ch][sb] == 63) { |
167 | stream->error = MAD_ERROR_BADSCALEFACTOR; | 173 | stream->error = MAD_ERROR_BADSCALEFACTOR; |
168 | return -1; | 174 | return -1; |
169 | } | 175 | } |
176 | # endif | ||
170 | } | 177 | } |
171 | } | 178 | } |
172 | } | 179 | } |
173 | 180 | ||
174 | /* decode samples */ | 181 | /* decode samples */ |
175 | 182 | ||
176 | for (s = 0; s < 12; ++s) { | 183 | for (s = 0; s < 12; ++s) { |
177 | for (sb = 0; sb < bound; ++sb) { | 184 | for (sb = 0; sb < bound; ++sb) { |
178 | for (ch = 0; ch < nch; ++ch) { | 185 | for (ch = 0; ch < nch; ++ch) { |
179 | nb = allocation[ch][sb]; | 186 | nb = allocation[ch][sb]; |
180 | frame->sbsample[ch][s][sb] = nb ? | 187 | frame->sbsample[ch][s][sb] = nb ? |
181 | mad_f_mul(I_sample(&stream->ptr, nb), | 188 | mad_f_mul(I_sample(&stream->ptr, nb), |
182 | sf_table[scalefactor[ch][sb]]) : 0; | 189 | sf_table[scalefactor[ch][sb]]) : 0; |
183 | } | 190 | } |
184 | } | 191 | } |
185 | 192 | ||
186 | for (sb = bound; sb < 32; ++sb) { | 193 | for (sb = bound; sb < 32; ++sb) { |
187 | if ((nb = allocation[0][sb])) { | 194 | if ((nb = allocation[0][sb])) { |
188 | mad_fixed_t sample; | 195 | mad_fixed_t sample; |
189 | 196 | ||
190 | sample = I_sample(&stream->ptr, nb); | 197 | sample = I_sample(&stream->ptr, nb); |
191 | 198 | ||
192 | for (ch = 0; ch < nch; ++ch) { | 199 | for (ch = 0; ch < nch; ++ch) { |
193 | frame->sbsample[ch][s][sb] = | 200 | frame->sbsample[ch][s][sb] = |
194 | mad_f_mul(sample, sf_table[scalefactor[ch][sb]]); | 201 | mad_f_mul(sample, sf_table[scalefactor[ch][sb]]); |
195 | } | 202 | } |
196 | } | 203 | } |
197 | else { | 204 | else { |
198 | for (ch = 0; ch < nch; ++ch) | 205 | for (ch = 0; ch < nch; ++ch) |
199 | frame->sbsample[ch][s][sb] = 0; | 206 | frame->sbsample[ch][s][sb] = 0; |
200 | } | 207 | } |
201 | } | 208 | } |
202 | } | 209 | } |
203 | 210 | ||
204 | return 0; | 211 | return 0; |
205 | } | 212 | } |
206 | 213 | ||
207 | /* --- Layer II ------------------------------------------------------------ */ | 214 | /* --- Layer II ------------------------------------------------------------ */ |
208 | 215 | ||
209 | /* possible quantization per subband table */ | 216 | /* possible quantization per subband table */ |
210 | static | 217 | static |
211 | struct { | 218 | struct { |
212 | unsigned int sblimit; | 219 | unsigned int sblimit; |
213 | unsigned char const offsets[30]; | 220 | unsigned char const offsets[30]; |
214 | } const sbquant_table[5] = { | 221 | } const sbquant_table[5] = { |
215 | /* ISO/IEC 11172-3 Table B.2a */ | 222 | /* ISO/IEC 11172-3 Table B.2a */ |
216 | { 27, { 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3,/* 0 */ | 223 | { 27, { 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3,/* 0 */ |
217 | 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0 } }, | 224 | 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0 } }, |
218 | /* ISO/IEC 11172-3 Table B.2b */ | 225 | /* ISO/IEC 11172-3 Table B.2b */ |
219 | { 30, { 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3,/* 1 */ | 226 | { 30, { 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3,/* 1 */ |
220 | 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0 } }, | 227 | 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0 } }, |
221 | /* ISO/IEC 11172-3 Table B.2c */ | 228 | /* ISO/IEC 11172-3 Table B.2c */ |
222 | { 8, { 5, 5, 2, 2, 2, 2, 2, 2 } }, /* 2 */ | 229 | { 8, { 5, 5, 2, 2, 2, 2, 2, 2 } }, /* 2 */ |
223 | /* ISO/IEC 11172-3 Table B.2d */ | 230 | /* ISO/IEC 11172-3 Table B.2d */ |
224 | { 12, { 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 } }, /* 3 */ | 231 | { 12, { 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 } }, /* 3 */ |
225 | /* ISO/IEC 13818-3 Table B.1 */ | 232 | /* ISO/IEC 13818-3 Table B.1 */ |
226 | { 30, { 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1,/* 4 */ | 233 | { 30, { 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1,/* 4 */ |
227 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } } | 234 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } } |
228 | }; | 235 | }; |
229 | 236 | ||
230 | /* bit allocation table */ | 237 | /* bit allocation table */ |
231 | static | 238 | static |
232 | struct { | 239 | struct { |
233 | unsigned short nbal; | 240 | unsigned short nbal; |
234 | unsigned short offset; | 241 | unsigned short offset; |
235 | } const bitalloc_table[8] = { | 242 | } const bitalloc_table[8] = { |
236 | { 2, 0 }, /* 0 */ | 243 | { 2, 0 }, /* 0 */ |
237 | { 2, 3 }, /* 1 */ | 244 | { 2, 3 }, /* 1 */ |
238 | { 3, 3 }, /* 2 */ | 245 | { 3, 3 }, /* 2 */ |
239 | { 3, 1 }, /* 3 */ | 246 | { 3, 1 }, /* 3 */ |
240 | { 4, 2 }, /* 4 */ | 247 | { 4, 2 }, /* 4 */ |
241 | { 4, 3 }, /* 5 */ | 248 | { 4, 3 }, /* 5 */ |
242 | { 4, 4 }, /* 6 */ | 249 | { 4, 4 }, /* 6 */ |
243 | { 4, 5 } /* 7 */ | 250 | { 4, 5 } /* 7 */ |
244 | }; | 251 | }; |
245 | 252 | ||
246 | /* offsets into quantization class table */ | 253 | /* offsets into quantization class table */ |
247 | static | 254 | static |
248 | unsigned char const offset_table[6][15] = { | 255 | unsigned char const offset_table[6][15] = { |
249 | { 0, 1, 16 }, /* 0 */ | 256 | { 0, 1, 16 }, /* 0 */ |
250 | { 0, 1, 2, 3, 4, 5, 16 }, /* 1 */ | 257 | { 0, 1, 2, 3, 4, 5, 16 }, /* 1 */ |
251 | { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 }, /* 2 */ | 258 | { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 }, /* 2 */ |
252 | { 0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, /* 3 */ | 259 | { 0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, /* 3 */ |
253 | { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16 }, /* 4 */ | 260 | { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16 }, /* 4 */ |
254 | { 0, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 } /* 5 */ | 261 | { 0, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 } /* 5 */ |
255 | }; | 262 | }; |
256 | 263 | ||
257 | /* quantization class table */ | 264 | /* quantization class table */ |
258 | static | 265 | static |
259 | struct quantclass { | 266 | struct quantclass { |
260 | unsigned short nlevels; | 267 | unsigned short nlevels; |
261 | unsigned char group; | 268 | unsigned char group; |
262 | unsigned char bits; | 269 | unsigned char bits; |
263 | mad_fixed_t C; | 270 | mad_fixed_t C; |
264 | mad_fixed_t D; | 271 | mad_fixed_t D; |
265 | } const qc_table[17] = { | 272 | } const qc_table[17] = { |
266 | # include "qc_table.dat" | 273 | # include "qc_table.dat" |
267 | }; | 274 | }; |
268 | 275 | ||
269 | /* | 276 | /* |
270 | * NAME:II_samples() | 277 | * NAME:II_samples() |
271 | * DESCRIPTION:decode three requantized Layer II samples from a bitstream | 278 | * DESCRIPTION:decode three requantized Layer II samples from a bitstream |
272 | */ | 279 | */ |
273 | static | 280 | static |
274 | void II_samples(struct mad_bitptr *ptr, | 281 | void II_samples(struct mad_bitptr *ptr, |
275 | struct quantclass const *quantclass, | 282 | struct quantclass const *quantclass, |
276 | mad_fixed_t output[3]) | 283 | mad_fixed_t output[3]) |
277 | { | 284 | { |
278 | unsigned int nb, s, sample[3]; | 285 | unsigned int nb, s, sample[3]; |
279 | 286 | ||
280 | if ((nb = quantclass->group)) { | 287 | if ((nb = quantclass->group)) { |
281 | unsigned int c, nlevels; | 288 | unsigned int c, nlevels; |
282 | 289 | ||
283 | /* degrouping */ | 290 | /* degrouping */ |
284 | c = mad_bit_read(ptr, quantclass->bits); | 291 | c = mad_bit_read(ptr, quantclass->bits); |
285 | nlevels = quantclass->nlevels; | 292 | nlevels = quantclass->nlevels; |
286 | 293 | ||
287 | for (s = 0; s < 3; ++s) { | 294 | for (s = 0; s < 3; ++s) { |
288 | sample[s] = c % nlevels; | 295 | sample[s] = c % nlevels; |
289 | c /= nlevels; | 296 | c /= nlevels; |
290 | } | 297 | } |
291 | } | 298 | } |
292 | else { | 299 | else { |
293 | nb = quantclass->bits; | 300 | nb = quantclass->bits; |
294 | 301 | ||
295 | for (s = 0; s < 3; ++s) | 302 | for (s = 0; s < 3; ++s) |
296 | sample[s] = mad_bit_read(ptr, nb); | 303 | sample[s] = mad_bit_read(ptr, nb); |
297 | } | 304 | } |
298 | 305 | ||
299 | for (s = 0; s < 3; ++s) { | 306 | for (s = 0; s < 3; ++s) { |
300 | mad_fixed_t requantized; | 307 | mad_fixed_t requantized; |
301 | 308 | ||
302 | /* invert most significant bit, extend sign, then scale to fixed format */ | 309 | /* invert most significant bit, extend sign, then scale to fixed format */ |
303 | 310 | ||
304 | requantized = sample[s] ^ (1 << (nb - 1)); | 311 | requantized = sample[s] ^ (1 << (nb - 1)); |
305 | requantized |= -(requantized & (1 << (nb - 1))); | 312 | requantized |= -(requantized & (1 << (nb - 1))); |
306 | 313 | ||
307 | requantized <<= MAD_F_FRACBITS - (nb - 1); | 314 | requantized <<= MAD_F_FRACBITS - (nb - 1); |
308 | 315 | ||
309 | /* requantize the sample */ | 316 | /* requantize the sample */ |
310 | 317 | ||
311 | /* s'' = C * (s''' + D) */ | 318 | /* s'' = C * (s''' + D) */ |
312 | 319 | ||
313 | output[s] = mad_f_mul(requantized + quantclass->D, quantclass->C); | 320 | output[s] = mad_f_mul(requantized + quantclass->D, quantclass->C); |
314 | 321 | ||
315 | /* s' = factor * s'' */ | 322 | /* s' = factor * s'' */ |
316 | /* (to be performed by caller) */ | 323 | /* (to be performed by caller) */ |
317 | } | 324 | } |
318 | } | 325 | } |
319 | 326 | ||
320 | /* | 327 | /* |
321 | * NAME:layer->II() | 328 | * NAME:layer->II() |
322 | * DESCRIPTION:decode a single Layer II frame | 329 | * DESCRIPTION:decode a single Layer II frame |
323 | */ | 330 | */ |
324 | int mad_layer_II(struct mad_stream *stream, struct mad_frame *frame) | 331 | int mad_layer_II(struct mad_stream *stream, struct mad_frame *frame) |
325 | { | 332 | { |
326 | struct mad_header *header = &frame->header; | 333 | struct mad_header *header = &frame->header; |
327 | struct mad_bitptr start; | 334 | struct mad_bitptr start; |
328 | unsigned int index, sblimit, nbal, nch, bound, gr, ch, s, sb; | 335 | unsigned int index, sblimit, nbal, nch, bound, gr, ch, s, sb; |
329 | unsigned char const *offsets; | 336 | unsigned char const *offsets; |
330 | unsigned char allocation[2][32], scfsi[2][32], scalefactor[2][32][3]; | 337 | unsigned char allocation[2][32], scfsi[2][32], scalefactor[2][32][3]; |
331 | mad_fixed_t samples[3]; | 338 | mad_fixed_t samples[3]; |
332 | 339 | ||
333 | nch = MAD_NCHANNELS(header); | 340 | nch = MAD_NCHANNELS(header); |
334 | 341 | ||
335 | if (header->flags & MAD_FLAG_LSF_EXT) | 342 | if (header->flags & MAD_FLAG_LSF_EXT) |
336 | index = 4; | 343 | index = 4; |
344 | else if (header->flags & MAD_FLAG_FREEFORMAT) | ||
345 | goto freeformat; | ||
337 | else { | 346 | else { |
338 | switch (nch == 2 ? header->bitrate / 2 : header->bitrate) { | 347 | unsigned long bitrate_per_channel; |
339 | case 32000: | 348 | |
340 | case 48000: | 349 | bitrate_per_channel = header->bitrate; |
341 | index = (header->samplerate == 32000) ? 3 : 2; | 350 | if (nch == 2) { |
342 | break; | 351 | bitrate_per_channel /= 2; |
352 | |||
353 | # if defined(OPT_STRICT) | ||
354 | /* | ||
355 | * ISO/IEC 11172-3 allows only single channel mode for 32, 48, 56, and | ||
356 | * 80 kbps bitrates in Layer II, but some encoders ignore this | ||
357 | * restriction. We enforce it if OPT_STRICT is defined. | ||
358 | */ | ||
359 | if (bitrate_per_channel <= 28000 || bitrate_per_channel == 40000) { | ||
360 | stream->error = MAD_ERROR_BADMODE; | ||
361 | return -1; | ||
362 | } | ||
363 | # endif | ||
364 | } | ||
365 | else { /* nch == 1 */ | ||
366 | if (bitrate_per_channel > 192000) { | ||
367 | /* | ||
368 | * ISO/IEC 11172-3 does not allow single channel mode for 224, 256, | ||
369 | * 320, or 384 kbps bitrates in Layer II. | ||
370 | */ | ||
371 | stream->error = MAD_ERROR_BADMODE; | ||
372 | return -1; | ||
373 | } | ||
374 | } | ||
343 | 375 | ||
344 | case 56000: | 376 | if (bitrate_per_channel <= 48000) |
345 | case 64000: | 377 | index = (header->samplerate == 32000) ? 3 : 2; |
346 | case 80000: | 378 | else if (bitrate_per_channel <= 80000) |
347 | index = 0; | 379 | index = 0; |
348 | break; | 380 | else { |
349 | 381 | freeformat: | |
350 | default: | ||
351 | index = (header->samplerate == 48000) ? 0 : 1; | 382 | index = (header->samplerate == 48000) ? 0 : 1; |
352 | } | 383 | } |
353 | } | 384 | } |
354 | 385 | ||
355 | sblimit = sbquant_table[index].sblimit; | 386 | sblimit = sbquant_table[index].sblimit; |
356 | offsets = sbquant_table[index].offsets; | 387 | offsets = sbquant_table[index].offsets; |
357 | 388 | ||
358 | bound = 32; | 389 | bound = 32; |
359 | if (header->mode == MAD_MODE_JOINT_STEREO) { | 390 | if (header->mode == MAD_MODE_JOINT_STEREO) { |
360 | header->flags |= MAD_FLAG_I_STEREO; | 391 | header->flags |= MAD_FLAG_I_STEREO; |
361 | bound = 4 + header->mode_extension * 4; | 392 | bound = 4 + header->mode_extension * 4; |
362 | } | 393 | } |
363 | 394 | ||
364 | if (bound > sblimit) | 395 | if (bound > sblimit) |
365 | bound = sblimit; | 396 | bound = sblimit; |
366 | 397 | ||
367 | start = stream->ptr; | 398 | start = stream->ptr; |
368 | 399 | ||
369 | /* decode bit allocations */ | 400 | /* decode bit allocations */ |
370 | 401 | ||
371 | for (sb = 0; sb < bound; ++sb) { | 402 | for (sb = 0; sb < bound; ++sb) { |
372 | nbal = bitalloc_table[offsets[sb]].nbal; | 403 | nbal = bitalloc_table[offsets[sb]].nbal; |
373 | 404 | ||
374 | for (ch = 0; ch < nch; ++ch) | 405 | for (ch = 0; ch < nch; ++ch) |
375 | allocation[ch][sb] = mad_bit_read(&stream->ptr, nbal); | 406 | allocation[ch][sb] = mad_bit_read(&stream->ptr, nbal); |
376 | } | 407 | } |
377 | 408 | ||
378 | for (sb = bound; sb < sblimit; ++sb) { | 409 | for (sb = bound; sb < sblimit; ++sb) { |
379 | nbal = bitalloc_table[offsets[sb]].nbal; | 410 | nbal = bitalloc_table[offsets[sb]].nbal; |
380 | 411 | ||
381 | allocation[0][sb] = | 412 | allocation[0][sb] = |
382 | allocation[1][sb] = mad_bit_read(&stream->ptr, nbal); | 413 | allocation[1][sb] = mad_bit_read(&stream->ptr, nbal); |
383 | } | 414 | } |
384 | 415 | ||
385 | /* decode scalefactor selection info */ | 416 | /* decode scalefactor selection info */ |
386 | 417 | ||
387 | for (sb = 0; sb < sblimit; ++sb) { | 418 | for (sb = 0; sb < sblimit; ++sb) { |
388 | for (ch = 0; ch < nch; ++ch) { | 419 | for (ch = 0; ch < nch; ++ch) { |
389 | if (allocation[ch][sb]) | 420 | if (allocation[ch][sb]) |
390 | scfsi[ch][sb] = mad_bit_read(&stream->ptr, 2); | 421 | scfsi[ch][sb] = mad_bit_read(&stream->ptr, 2); |
391 | } | 422 | } |
392 | } | 423 | } |
393 | 424 | ||
394 | /* check CRC word */ | 425 | /* check CRC word */ |
395 | 426 | ||
396 | if (header->flags & MAD_FLAG_PROTECTION) { | 427 | if (header->flags & MAD_FLAG_PROTECTION) { |
397 | header->crc_check = | 428 | header->crc_check = |
398 | mad_bit_crc(start, mad_bit_length(&start, &stream->ptr), | 429 | mad_bit_crc(start, mad_bit_length(&start, &stream->ptr), |
399 | header->crc_check); | 430 | header->crc_check); |
400 | 431 | ||
401 | if (header->crc_check != header->crc_target && | 432 | if (header->crc_check != header->crc_target && |
402 | !(frame->options & MAD_OPTION_IGNORECRC)) { | 433 | !(frame->options & MAD_OPTION_IGNORECRC)) { |
403 | stream->error = MAD_ERROR_BADCRC; | 434 | stream->error = MAD_ERROR_BADCRC; |
404 | return -1; | 435 | return -1; |
405 | } | 436 | } |
406 | } | 437 | } |
407 | 438 | ||
408 | /* decode scalefactors */ | 439 | /* decode scalefactors */ |
409 | 440 | ||
410 | for (sb = 0; sb < sblimit; ++sb) { | 441 | for (sb = 0; sb < sblimit; ++sb) { |
411 | for (ch = 0; ch < nch; ++ch) { | 442 | for (ch = 0; ch < nch; ++ch) { |
412 | if (allocation[ch][sb]) { | 443 | if (allocation[ch][sb]) { |
413 | scalefactor[ch][sb][0] = mad_bit_read(&stream->ptr, 6); | 444 | scalefactor[ch][sb][0] = mad_bit_read(&stream->ptr, 6); |
414 | 445 | ||
415 | switch (scfsi[ch][sb]) { | 446 | switch (scfsi[ch][sb]) { |
416 | case 2: | 447 | case 2: |
417 | scalefactor[ch][sb][2] = | 448 | scalefactor[ch][sb][2] = |
418 | scalefactor[ch][sb][1] = | 449 | scalefactor[ch][sb][1] = |
419 | scalefactor[ch][sb][0]; | 450 | scalefactor[ch][sb][0]; |
420 | break; | 451 | break; |
421 | 452 | ||
422 | case 0: | 453 | case 0: |
423 | scalefactor[ch][sb][1] = mad_bit_read(&stream->ptr, 6); | 454 | scalefactor[ch][sb][1] = mad_bit_read(&stream->ptr, 6); |
424 | /* fall through */ | 455 | /* fall through */ |
425 | 456 | ||
426 | case 1: | 457 | case 1: |
427 | case 3: | 458 | case 3: |
428 | scalefactor[ch][sb][2] = mad_bit_read(&stream->ptr, 6); | 459 | scalefactor[ch][sb][2] = mad_bit_read(&stream->ptr, 6); |
429 | } | 460 | } |
430 | 461 | ||
431 | if (scfsi[ch][sb] & 1) | 462 | if (scfsi[ch][sb] & 1) |
432 | scalefactor[ch][sb][1] = scalefactor[ch][sb][scfsi[ch][sb] - 1]; | 463 | scalefactor[ch][sb][1] = scalefactor[ch][sb][scfsi[ch][sb] - 1]; |
433 | 464 | ||
465 | # if defined(OPT_STRICT) | ||
466 | /* | ||
467 | * Scalefactor index 63 does not appear in Table B.1 of | ||
468 | * ISO/IEC 11172-3. Nonetheless, other implementations accept it, | ||
469 | * so we only reject it if OPT_STRICT is defined. | ||
470 | */ | ||
434 | if (scalefactor[ch][sb][0] == 63 || | 471 | if (scalefactor[ch][sb][0] == 63 || |
435 | scalefactor[ch][sb][1] == 63 || | 472 | scalefactor[ch][sb][1] == 63 || |
436 | scalefactor[ch][sb][2] == 63) { | 473 | scalefactor[ch][sb][2] == 63) { |
437 | stream->error = MAD_ERROR_BADSCALEFACTOR; | 474 | stream->error = MAD_ERROR_BADSCALEFACTOR; |
438 | return -1; | 475 | return -1; |
439 | } | 476 | } |
477 | # endif | ||
440 | } | 478 | } |
441 | } | 479 | } |
442 | } | 480 | } |
443 | 481 | ||
444 | /* decode samples */ | 482 | /* decode samples */ |
445 | 483 | ||
446 | for (gr = 0; gr < 12; ++gr) { | 484 | for (gr = 0; gr < 12; ++gr) { |
447 | for (sb = 0; sb < bound; ++sb) { | 485 | for (sb = 0; sb < bound; ++sb) { |
448 | for (ch = 0; ch < nch; ++ch) { | 486 | for (ch = 0; ch < nch; ++ch) { |
449 | if ((index = allocation[ch][sb])) { | 487 | if ((index = allocation[ch][sb])) { |
450 | index = offset_table[bitalloc_table[offsets[sb]].offset][index - 1]; | 488 | index = offset_table[bitalloc_table[offsets[sb]].offset][index - 1]; |
451 | 489 | ||
452 | II_samples(&stream->ptr, &qc_table[index], samples); | 490 | II_samples(&stream->ptr, &qc_table[index], samples); |
453 | 491 | ||
454 | for (s = 0; s < 3; ++s) { | 492 | for (s = 0; s < 3; ++s) { |
455 | frame->sbsample[ch][3 * gr + s][sb] = | 493 | frame->sbsample[ch][3 * gr + s][sb] = |
456 | mad_f_mul(samples[s], sf_table[scalefactor[ch][sb][gr / 4]]); | 494 | mad_f_mul(samples[s], sf_table[scalefactor[ch][sb][gr / 4]]); |
457 | } | 495 | } |
458 | } | 496 | } |
459 | else { | 497 | else { |
460 | for (s = 0; s < 3; ++s) | 498 | for (s = 0; s < 3; ++s) |
461 | frame->sbsample[ch][3 * gr + s][sb] = 0; | 499 | frame->sbsample[ch][3 * gr + s][sb] = 0; |
462 | } | 500 | } |
463 | } | 501 | } |
464 | } | 502 | } |
465 | 503 | ||
466 | for (sb = bound; sb < sblimit; ++sb) { | 504 | for (sb = bound; sb < sblimit; ++sb) { |
467 | if ((index = allocation[0][sb])) { | 505 | if ((index = allocation[0][sb])) { |
468 | index = offset_table[bitalloc_table[offsets[sb]].offset][index - 1]; | 506 | index = offset_table[bitalloc_table[offsets[sb]].offset][index - 1]; |
469 | 507 | ||
470 | II_samples(&stream->ptr, &qc_table[index], samples); | 508 | II_samples(&stream->ptr, &qc_table[index], samples); |
471 | 509 | ||
472 | for (ch = 0; ch < nch; ++ch) { | 510 | for (ch = 0; ch < nch; ++ch) { |
473 | for (s = 0; s < 3; ++s) { | 511 | for (s = 0; s < 3; ++s) { |
474 | frame->sbsample[ch][3 * gr + s][sb] = | 512 | frame->sbsample[ch][3 * gr + s][sb] = |
475 | mad_f_mul(samples[s], sf_table[scalefactor[ch][sb][gr / 4]]); | 513 | mad_f_mul(samples[s], sf_table[scalefactor[ch][sb][gr / 4]]); |
476 | } | 514 | } |
477 | } | 515 | } |
478 | } | 516 | } |
479 | else { | 517 | else { |
480 | for (ch = 0; ch < nch; ++ch) { | 518 | for (ch = 0; ch < nch; ++ch) { |
481 | for (s = 0; s < 3; ++s) | 519 | for (s = 0; s < 3; ++s) |
482 | frame->sbsample[ch][3 * gr + s][sb] = 0; | 520 | frame->sbsample[ch][3 * gr + s][sb] = 0; |
483 | } | 521 | } |
484 | } | 522 | } |
485 | } | 523 | } |
486 | 524 | ||
487 | for (ch = 0; ch < nch; ++ch) { | 525 | for (ch = 0; ch < nch; ++ch) { |
488 | for (s = 0; s < 3; ++s) { | 526 | for (s = 0; s < 3; ++s) { |
489 | for (sb = sblimit; sb < 32; ++sb) | 527 | for (sb = sblimit; sb < 32; ++sb) |
490 | frame->sbsample[ch][3 * gr + s][sb] = 0; | 528 | frame->sbsample[ch][3 * gr + s][sb] = 0; |
491 | } | 529 | } |
492 | } | 530 | } |
493 | } | 531 | } |
494 | 532 | ||
495 | return 0; | 533 | return 0; |
496 | } | 534 | } |
diff --git a/core/multimedia/opieplayer/libmad/layer12.h b/core/multimedia/opieplayer/libmad/layer12.h index c673726..3fe6bd8 100644 --- a/core/multimedia/opieplayer/libmad/layer12.h +++ b/core/multimedia/opieplayer/libmad/layer12.h | |||
@@ -1,31 +1,31 @@ | |||
1 | /* | 1 | /* |
2 | * libmad - MPEG audio decoder library | 2 | * libmad - MPEG audio decoder library |
3 | * Copyright (C) 2000-2001 Robert Leslie | 3 | * Copyright (C) 2000-2004 Underbit Technologies, Inc. |
4 | * | 4 | * |
5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
7 | * the Free Software Foundation; either version 2 of the License, or | 7 | * the Free Software Foundation; either version 2 of the License, or |
8 | * (at your option) any later version. | 8 | * (at your option) any later version. |
9 | * | 9 | * |
10 | * This program is distributed in the hope that it will be useful, | 10 | * This program is distributed in the hope that it will be useful, |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | * GNU General Public License for more details. | 13 | * GNU General Public License for more details. |
14 | * | 14 | * |
15 | * You should have received a copy of the GNU General Public License | 15 | * You should have received a copy of the GNU General Public License |
16 | * along with this program; if not, write to the Free Software | 16 | * along with this program; if not, write to the Free Software |
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
18 | * | 18 | * |
19 | * $Id$ | 19 | * $Id$ |
20 | */ | 20 | */ |
21 | 21 | ||
22 | # ifndef LIBMAD_LAYER12_H | 22 | # ifndef LIBMAD_LAYER12_H |
23 | # define LIBMAD_LAYER12_H | 23 | # define LIBMAD_LAYER12_H |
24 | 24 | ||
25 | # include "stream.h" | 25 | # include "stream.h" |
26 | # include "frame.h" | 26 | # include "frame.h" |
27 | 27 | ||
28 | int mad_layer_I(struct mad_stream *, struct mad_frame *); | 28 | int mad_layer_I(struct mad_stream *, struct mad_frame *); |
29 | int mad_layer_II(struct mad_stream *, struct mad_frame *); | 29 | int mad_layer_II(struct mad_stream *, struct mad_frame *); |
30 | 30 | ||
31 | # endif | 31 | # endif |
diff --git a/core/multimedia/opieplayer/libmad/layer3.c b/core/multimedia/opieplayer/libmad/layer3.c index 03f13fe..3c5dd9e 100644 --- a/core/multimedia/opieplayer/libmad/layer3.c +++ b/core/multimedia/opieplayer/libmad/layer3.c | |||
@@ -1,131 +1,131 @@ | |||
1 | /* | 1 | /* |
2 | * libmad - MPEG audio decoder library | 2 | * libmad - MPEG audio decoder library |
3 | * Copyright (C) 2000-2001 Robert Leslie | 3 | * Copyright (C) 2000-2004 Underbit Technologies, Inc. |
4 | * | 4 | * |
5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
7 | * the Free Software Foundation; either version 2 of the License, or | 7 | * the Free Software Foundation; either version 2 of the License, or |
8 | * (at your option) any later version. | 8 | * (at your option) any later version. |
9 | * | 9 | * |
10 | * This program is distributed in the hope that it will be useful, | 10 | * This program is distributed in the hope that it will be useful, |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | * GNU General Public License for more details. | 13 | * GNU General Public License for more details. |
14 | * | 14 | * |
15 | * You should have received a copy of the GNU General Public License | 15 | * You should have received a copy of the GNU General Public License |
16 | * along with this program; if not, write to the Free Software | 16 | * along with this program; if not, write to the Free Software |
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
18 | * | 18 | * |
19 | * $Id$ | 19 | * $Id$ |
20 | */ | 20 | */ |
21 | 21 | ||
22 | # ifdef HAVE_CONFIG_H | 22 | # ifdef HAVE_CONFIG_H |
23 | # include "libmad_config.h" | 23 | # include "libmad_config.h" |
24 | # endif | 24 | # endif |
25 | 25 | ||
26 | # include "libmad_global.h" | 26 | # include "libmad_global.h" |
27 | 27 | ||
28 | # include <stdlib.h> | 28 | # include <stdlib.h> |
29 | # include <string.h> | 29 | # include <string.h> |
30 | 30 | ||
31 | # ifdef HAVE_ASSERT_H | 31 | # ifdef HAVE_ASSERT_H |
32 | # include <assert.h> | 32 | # include <assert.h> |
33 | # endif | 33 | # endif |
34 | 34 | ||
35 | # ifdef HAVE_LIMITS_H | 35 | # ifdef HAVE_LIMITS_H |
36 | # include <limits.h> | 36 | # include <limits.h> |
37 | # else | 37 | # else |
38 | # define CHAR_BIT 8 | 38 | # define CHAR_BIT 8 |
39 | # endif | 39 | # endif |
40 | 40 | ||
41 | # include "fixed.h" | 41 | # include "fixed.h" |
42 | # include "bit.h" | 42 | # include "bit.h" |
43 | # include "stream.h" | 43 | # include "stream.h" |
44 | # include "frame.h" | 44 | # include "frame.h" |
45 | # include "huffman.h" | 45 | # include "huffman.h" |
46 | # include "layer3.h" | 46 | # include "layer3.h" |
47 | 47 | ||
48 | /* --- Layer III ----------------------------------------------------------- */ | 48 | /* --- Layer III ----------------------------------------------------------- */ |
49 | 49 | ||
50 | enum { | 50 | enum { |
51 | count1table_select = 0x01, | 51 | count1table_select = 0x01, |
52 | scalefac_scale = 0x02, | 52 | scalefac_scale = 0x02, |
53 | preflag = 0x04, | 53 | preflag = 0x04, |
54 | mixed_block_flag = 0x08 | 54 | mixed_block_flag = 0x08 |
55 | }; | 55 | }; |
56 | 56 | ||
57 | enum { | 57 | enum { |
58 | I_STEREO = 0x1, | 58 | I_STEREO = 0x1, |
59 | MS_STEREO = 0x2 | 59 | MS_STEREO = 0x2 |
60 | }; | 60 | }; |
61 | 61 | ||
62 | struct sideinfo { | 62 | struct sideinfo { |
63 | unsigned int main_data_begin; | 63 | unsigned int main_data_begin; |
64 | unsigned int private_bits; | 64 | unsigned int private_bits; |
65 | 65 | ||
66 | unsigned char scfsi[2]; | 66 | unsigned char scfsi[2]; |
67 | 67 | ||
68 | struct granule { | 68 | struct granule { |
69 | struct channel { | 69 | struct channel { |
70 | /* from side info */ | 70 | /* from side info */ |
71 | unsigned short part2_3_length; | 71 | unsigned short part2_3_length; |
72 | unsigned short big_values; | 72 | unsigned short big_values; |
73 | unsigned short global_gain; | 73 | unsigned short global_gain; |
74 | unsigned short scalefac_compress; | 74 | unsigned short scalefac_compress; |
75 | 75 | ||
76 | unsigned char flags; | 76 | unsigned char flags; |
77 | unsigned char block_type; | 77 | unsigned char block_type; |
78 | unsigned char table_select[3]; | 78 | unsigned char table_select[3]; |
79 | unsigned char subblock_gain[3]; | 79 | unsigned char subblock_gain[3]; |
80 | unsigned char region0_count; | 80 | unsigned char region0_count; |
81 | unsigned char region1_count; | 81 | unsigned char region1_count; |
82 | 82 | ||
83 | /* from main_data */ | 83 | /* from main_data */ |
84 | unsigned char scalefac[39];/* scalefac_l and/or scalefac_s */ | 84 | unsigned char scalefac[39];/* scalefac_l and/or scalefac_s */ |
85 | } ch[2]; | 85 | } ch[2]; |
86 | } gr[2]; | 86 | } gr[2]; |
87 | }; | 87 | }; |
88 | 88 | ||
89 | /* | 89 | /* |
90 | * scalefactor bit lengths | 90 | * scalefactor bit lengths |
91 | * derived from section 2.4.2.7 of ISO/IEC 11172-3 | 91 | * derived from section 2.4.2.7 of ISO/IEC 11172-3 |
92 | */ | 92 | */ |
93 | static | 93 | static |
94 | struct { | 94 | struct { |
95 | unsigned char slen1; | 95 | unsigned char slen1; |
96 | unsigned char slen2; | 96 | unsigned char slen2; |
97 | } const sflen_table[16] = { | 97 | } const sflen_table[16] = { |
98 | { 0, 0 }, { 0, 1 }, { 0, 2 }, { 0, 3 }, | 98 | { 0, 0 }, { 0, 1 }, { 0, 2 }, { 0, 3 }, |
99 | { 3, 0 }, { 1, 1 }, { 1, 2 }, { 1, 3 }, | 99 | { 3, 0 }, { 1, 1 }, { 1, 2 }, { 1, 3 }, |
100 | { 2, 1 }, { 2, 2 }, { 2, 3 }, { 3, 1 }, | 100 | { 2, 1 }, { 2, 2 }, { 2, 3 }, { 3, 1 }, |
101 | { 3, 2 }, { 3, 3 }, { 4, 2 }, { 4, 3 } | 101 | { 3, 2 }, { 3, 3 }, { 4, 2 }, { 4, 3 } |
102 | }; | 102 | }; |
103 | 103 | ||
104 | /* | 104 | /* |
105 | * number of LSF scalefactor band values | 105 | * number of LSF scalefactor band values |
106 | * derived from section 2.4.3.2 of ISO/IEC 13818-3 | 106 | * derived from section 2.4.3.2 of ISO/IEC 13818-3 |
107 | */ | 107 | */ |
108 | static | 108 | static |
109 | unsigned char const nsfb_table[6][3][4] = { | 109 | unsigned char const nsfb_table[6][3][4] = { |
110 | { { 6, 5, 5, 5 }, | 110 | { { 6, 5, 5, 5 }, |
111 | { 9, 9, 9, 9 }, | 111 | { 9, 9, 9, 9 }, |
112 | { 6, 9, 9, 9 } }, | 112 | { 6, 9, 9, 9 } }, |
113 | 113 | ||
114 | { { 6, 5, 7, 3 }, | 114 | { { 6, 5, 7, 3 }, |
115 | { 9, 9, 12, 6 }, | 115 | { 9, 9, 12, 6 }, |
116 | { 6, 9, 12, 6 } }, | 116 | { 6, 9, 12, 6 } }, |
117 | 117 | ||
118 | { { 11, 10, 0, 0 }, | 118 | { { 11, 10, 0, 0 }, |
119 | { 18, 18, 0, 0 }, | 119 | { 18, 18, 0, 0 }, |
120 | { 15, 18, 0, 0 } }, | 120 | { 15, 18, 0, 0 } }, |
121 | 121 | ||
122 | { { 7, 7, 7, 0 }, | 122 | { { 7, 7, 7, 0 }, |
123 | { 12, 12, 12, 0 }, | 123 | { 12, 12, 12, 0 }, |
124 | { 6, 15, 12, 0 } }, | 124 | { 6, 15, 12, 0 } }, |
125 | 125 | ||
126 | { { 6, 6, 6, 3 }, | 126 | { { 6, 6, 6, 3 }, |
127 | { 12, 9, 9, 6 }, | 127 | { 12, 9, 9, 6 }, |
128 | { 6, 12, 9, 6 } }, | 128 | { 6, 12, 9, 6 } }, |
129 | 129 | ||
130 | { { 8, 8, 5, 0 }, | 130 | { { 8, 8, 5, 0 }, |
131 | { 15, 12, 9, 0 }, | 131 | { 15, 12, 9, 0 }, |
@@ -163,430 +163,430 @@ unsigned char const sfb_48000_short[] = { | |||
163 | 163 | ||
164 | static | 164 | static |
165 | unsigned char const sfb_44100_short[] = { | 165 | unsigned char const sfb_44100_short[] = { |
166 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, | 166 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, |
167 | 6, 6, 8, 8, 8, 10, 10, 10, 12, 12, 12, 14, 14, | 167 | 6, 6, 8, 8, 8, 10, 10, 10, 12, 12, 12, 14, 14, |
168 | 14, 18, 18, 18, 22, 22, 22, 30, 30, 30, 56, 56, 56 | 168 | 14, 18, 18, 18, 22, 22, 22, 30, 30, 30, 56, 56, 56 |
169 | }; | 169 | }; |
170 | 170 | ||
171 | static | 171 | static |
172 | unsigned char const sfb_32000_short[] = { | 172 | unsigned char const sfb_32000_short[] = { |
173 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, | 173 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, |
174 | 6, 6, 8, 8, 8, 12, 12, 12, 16, 16, 16, 20, 20, | 174 | 6, 6, 8, 8, 8, 12, 12, 12, 16, 16, 16, 20, 20, |
175 | 20, 26, 26, 26, 34, 34, 34, 42, 42, 42, 12, 12, 12 | 175 | 20, 26, 26, 26, 34, 34, 34, 42, 42, 42, 12, 12, 12 |
176 | }; | 176 | }; |
177 | 177 | ||
178 | static | 178 | static |
179 | unsigned char const sfb_48000_mixed[] = { | 179 | unsigned char const sfb_48000_mixed[] = { |
180 | /* long */ 4, 4, 4, 4, 4, 4, 6, 6, | 180 | /* long */ 4, 4, 4, 4, 4, 4, 6, 6, |
181 | /* short */ 4, 4, 4, 6, 6, 6, 6, 6, 6, 10, | 181 | /* short */ 4, 4, 4, 6, 6, 6, 6, 6, 6, 10, |
182 | 10, 10, 12, 12, 12, 14, 14, 14, 16, 16, | 182 | 10, 10, 12, 12, 12, 14, 14, 14, 16, 16, |
183 | 16, 20, 20, 20, 26, 26, 26, 66, 66, 66 | 183 | 16, 20, 20, 20, 26, 26, 26, 66, 66, 66 |
184 | }; | 184 | }; |
185 | 185 | ||
186 | static | 186 | static |
187 | unsigned char const sfb_44100_mixed[] = { | 187 | unsigned char const sfb_44100_mixed[] = { |
188 | /* long */ 4, 4, 4, 4, 4, 4, 6, 6, | 188 | /* long */ 4, 4, 4, 4, 4, 4, 6, 6, |
189 | /* short */ 4, 4, 4, 6, 6, 6, 8, 8, 8, 10, | 189 | /* short */ 4, 4, 4, 6, 6, 6, 8, 8, 8, 10, |
190 | 10, 10, 12, 12, 12, 14, 14, 14, 18, 18, | 190 | 10, 10, 12, 12, 12, 14, 14, 14, 18, 18, |
191 | 18, 22, 22, 22, 30, 30, 30, 56, 56, 56 | 191 | 18, 22, 22, 22, 30, 30, 30, 56, 56, 56 |
192 | }; | 192 | }; |
193 | 193 | ||
194 | static | 194 | static |
195 | unsigned char const sfb_32000_mixed[] = { | 195 | unsigned char const sfb_32000_mixed[] = { |
196 | /* long */ 4, 4, 4, 4, 4, 4, 6, 6, | 196 | /* long */ 4, 4, 4, 4, 4, 4, 6, 6, |
197 | /* short */ 4, 4, 4, 6, 6, 6, 8, 8, 8, 12, | 197 | /* short */ 4, 4, 4, 6, 6, 6, 8, 8, 8, 12, |
198 | 12, 12, 16, 16, 16, 20, 20, 20, 26, 26, | 198 | 12, 12, 16, 16, 16, 20, 20, 20, 26, 26, |
199 | 26, 34, 34, 34, 42, 42, 42, 12, 12, 12 | 199 | 26, 34, 34, 34, 42, 42, 42, 12, 12, 12 |
200 | }; | 200 | }; |
201 | 201 | ||
202 | /* | 202 | /* |
203 | * MPEG-2 scalefactor band widths | 203 | * MPEG-2 scalefactor band widths |
204 | * derived from Table B.2 of ISO/IEC 13818-3 | 204 | * derived from Table B.2 of ISO/IEC 13818-3 |
205 | */ | 205 | */ |
206 | static | 206 | static |
207 | unsigned char const sfb_24000_long[] = { | 207 | unsigned char const sfb_24000_long[] = { |
208 | 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, | 208 | 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, |
209 | 18, 22, 26, 32, 38, 46, 54, 62, 70, 76, 36 | 209 | 18, 22, 26, 32, 38, 46, 54, 62, 70, 76, 36 |
210 | }; | 210 | }; |
211 | 211 | ||
212 | static | 212 | static |
213 | unsigned char const sfb_22050_long[] = { | 213 | unsigned char const sfb_22050_long[] = { |
214 | 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, | 214 | 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, |
215 | 20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54 | 215 | 20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54 |
216 | }; | 216 | }; |
217 | 217 | ||
218 | # define sfb_16000_long sfb_22050_long | 218 | # define sfb_16000_long sfb_22050_long |
219 | 219 | ||
220 | static | 220 | static |
221 | unsigned char const sfb_24000_short[] = { | 221 | unsigned char const sfb_24000_short[] = { |
222 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 8, | 222 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 8, |
223 | 8, 8, 10, 10, 10, 12, 12, 12, 14, 14, 14, 18, 18, | 223 | 8, 8, 10, 10, 10, 12, 12, 12, 14, 14, 14, 18, 18, |
224 | 18, 24, 24, 24, 32, 32, 32, 44, 44, 44, 12, 12, 12 | 224 | 18, 24, 24, 24, 32, 32, 32, 44, 44, 44, 12, 12, 12 |
225 | }; | 225 | }; |
226 | 226 | ||
227 | static | 227 | static |
228 | unsigned char const sfb_22050_short[] = { | 228 | unsigned char const sfb_22050_short[] = { |
229 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 6, | 229 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 6, |
230 | 6, 6, 8, 8, 8, 10, 10, 10, 14, 14, 14, 18, 18, | 230 | 6, 6, 8, 8, 8, 10, 10, 10, 14, 14, 14, 18, 18, |
231 | 18, 26, 26, 26, 32, 32, 32, 42, 42, 42, 18, 18, 18 | 231 | 18, 26, 26, 26, 32, 32, 32, 42, 42, 42, 18, 18, 18 |
232 | }; | 232 | }; |
233 | 233 | ||
234 | static | 234 | static |
235 | unsigned char const sfb_16000_short[] = { | 235 | unsigned char const sfb_16000_short[] = { |
236 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 8, | 236 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 8, |
237 | 8, 8, 10, 10, 10, 12, 12, 12, 14, 14, 14, 18, 18, | 237 | 8, 8, 10, 10, 10, 12, 12, 12, 14, 14, 14, 18, 18, |
238 | 18, 24, 24, 24, 30, 30, 30, 40, 40, 40, 18, 18, 18 | 238 | 18, 24, 24, 24, 30, 30, 30, 40, 40, 40, 18, 18, 18 |
239 | }; | 239 | }; |
240 | 240 | ||
241 | static | 241 | static |
242 | unsigned char const sfb_24000_mixed[] = { | 242 | unsigned char const sfb_24000_mixed[] = { |
243 | /* long */ 6, 6, 6, 6, 6, 6, | 243 | /* long */ 6, 6, 6, 6, 6, 6, |
244 | /* short */ 6, 6, 6, 8, 8, 8, 10, 10, 10, 12, | 244 | /* short */ 6, 6, 6, 8, 8, 8, 10, 10, 10, 12, |
245 | 12, 12, 14, 14, 14, 18, 18, 18, 24, 24, | 245 | 12, 12, 14, 14, 14, 18, 18, 18, 24, 24, |
246 | 24, 32, 32, 32, 44, 44, 44, 12, 12, 12 | 246 | 24, 32, 32, 32, 44, 44, 44, 12, 12, 12 |
247 | }; | 247 | }; |
248 | 248 | ||
249 | static | 249 | static |
250 | unsigned char const sfb_22050_mixed[] = { | 250 | unsigned char const sfb_22050_mixed[] = { |
251 | /* long */ 6, 6, 6, 6, 6, 6, | 251 | /* long */ 6, 6, 6, 6, 6, 6, |
252 | /* short */ 6, 6, 6, 6, 6, 6, 8, 8, 8, 10, | 252 | /* short */ 6, 6, 6, 6, 6, 6, 8, 8, 8, 10, |
253 | 10, 10, 14, 14, 14, 18, 18, 18, 26, 26, | 253 | 10, 10, 14, 14, 14, 18, 18, 18, 26, 26, |
254 | 26, 32, 32, 32, 42, 42, 42, 18, 18, 18 | 254 | 26, 32, 32, 32, 42, 42, 42, 18, 18, 18 |
255 | }; | 255 | }; |
256 | 256 | ||
257 | static | 257 | static |
258 | unsigned char const sfb_16000_mixed[] = { | 258 | unsigned char const sfb_16000_mixed[] = { |
259 | /* long */ 6, 6, 6, 6, 6, 6, | 259 | /* long */ 6, 6, 6, 6, 6, 6, |
260 | /* short */ 6, 6, 6, 8, 8, 8, 10, 10, 10, 12, | 260 | /* short */ 6, 6, 6, 8, 8, 8, 10, 10, 10, 12, |
261 | 12, 12, 14, 14, 14, 18, 18, 18, 24, 24, | 261 | 12, 12, 14, 14, 14, 18, 18, 18, 24, 24, |
262 | 24, 30, 30, 30, 40, 40, 40, 18, 18, 18 | 262 | 24, 30, 30, 30, 40, 40, 40, 18, 18, 18 |
263 | }; | 263 | }; |
264 | 264 | ||
265 | /* | 265 | /* |
266 | * MPEG 2.5 scalefactor band widths | 266 | * MPEG 2.5 scalefactor band widths |
267 | * derived from public sources | 267 | * derived from public sources |
268 | */ | 268 | */ |
269 | # define sfb_12000_long sfb_16000_long | 269 | # define sfb_12000_long sfb_16000_long |
270 | # define sfb_11025_long sfb_12000_long | 270 | # define sfb_11025_long sfb_12000_long |
271 | 271 | ||
272 | static | 272 | static |
273 | unsigned char const sfb_8000_long[] = { | 273 | unsigned char const sfb_8000_long[] = { |
274 | 12, 12, 12, 12, 12, 12, 16, 20, 24, 28, 32, | 274 | 12, 12, 12, 12, 12, 12, 16, 20, 24, 28, 32, |
275 | 40, 48, 56, 64, 76, 90, 2, 2, 2, 2, 2 | 275 | 40, 48, 56, 64, 76, 90, 2, 2, 2, 2, 2 |
276 | }; | 276 | }; |
277 | 277 | ||
278 | # define sfb_12000_short sfb_16000_short | 278 | # define sfb_12000_short sfb_16000_short |
279 | # define sfb_11025_short sfb_12000_short | 279 | # define sfb_11025_short sfb_12000_short |
280 | 280 | ||
281 | static | 281 | static |
282 | unsigned char const sfb_8000_short[] = { | 282 | unsigned char const sfb_8000_short[] = { |
283 | 8, 8, 8, 8, 8, 8, 8, 8, 8, 12, 12, 12, 16, | 283 | 8, 8, 8, 8, 8, 8, 8, 8, 8, 12, 12, 12, 16, |
284 | 16, 16, 20, 20, 20, 24, 24, 24, 28, 28, 28, 36, 36, | 284 | 16, 16, 20, 20, 20, 24, 24, 24, 28, 28, 28, 36, 36, |
285 | 36, 2, 2, 2, 2, 2, 2, 2, 2, 2, 26, 26, 26 | 285 | 36, 2, 2, 2, 2, 2, 2, 2, 2, 2, 26, 26, 26 |
286 | }; | 286 | }; |
287 | 287 | ||
288 | # define sfb_12000_mixed sfb_16000_mixed | 288 | # define sfb_12000_mixed sfb_16000_mixed |
289 | # define sfb_11025_mixed sfb_12000_mixed | 289 | # define sfb_11025_mixed sfb_12000_mixed |
290 | 290 | ||
291 | /* the 8000 Hz short block scalefactor bands do not break after the first 36 | 291 | /* the 8000 Hz short block scalefactor bands do not break after |
292 | frequency lines, so this is probably wrong */ | 292 | the first 36 frequency lines, so this is probably wrong */ |
293 | static | 293 | static |
294 | unsigned char const sfb_8000_mixed[] = { | 294 | unsigned char const sfb_8000_mixed[] = { |
295 | /* long */ 12, 12, 12, | 295 | /* long */ 12, 12, 12, |
296 | /* short */ 4, 4, 4, 8, 8, 8, 12, 12, 12, 16, 16, 16, | 296 | /* short */ 4, 4, 4, 8, 8, 8, 12, 12, 12, 16, 16, 16, |
297 | 20, 20, 20, 24, 24, 24, 28, 28, 28, 36, 36, 36, | 297 | 20, 20, 20, 24, 24, 24, 28, 28, 28, 36, 36, 36, |
298 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 26, 26, 26 | 298 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 26, 26, 26 |
299 | }; | 299 | }; |
300 | 300 | ||
301 | static | 301 | static |
302 | struct { | 302 | struct { |
303 | unsigned char const *l; | 303 | unsigned char const *l; |
304 | unsigned char const *s; | 304 | unsigned char const *s; |
305 | unsigned char const *m; | 305 | unsigned char const *m; |
306 | } const sfbwidth_table[9] = { | 306 | } const sfbwidth_table[9] = { |
307 | { sfb_48000_long, sfb_48000_short, sfb_48000_mixed }, | 307 | { sfb_48000_long, sfb_48000_short, sfb_48000_mixed }, |
308 | { sfb_44100_long, sfb_44100_short, sfb_44100_mixed }, | 308 | { sfb_44100_long, sfb_44100_short, sfb_44100_mixed }, |
309 | { sfb_32000_long, sfb_32000_short, sfb_32000_mixed }, | 309 | { sfb_32000_long, sfb_32000_short, sfb_32000_mixed }, |
310 | { sfb_24000_long, sfb_24000_short, sfb_24000_mixed }, | 310 | { sfb_24000_long, sfb_24000_short, sfb_24000_mixed }, |
311 | { sfb_22050_long, sfb_22050_short, sfb_22050_mixed }, | 311 | { sfb_22050_long, sfb_22050_short, sfb_22050_mixed }, |
312 | { sfb_16000_long, sfb_16000_short, sfb_16000_mixed }, | 312 | { sfb_16000_long, sfb_16000_short, sfb_16000_mixed }, |
313 | { sfb_12000_long, sfb_12000_short, sfb_12000_mixed }, | 313 | { sfb_12000_long, sfb_12000_short, sfb_12000_mixed }, |
314 | { sfb_11025_long, sfb_11025_short, sfb_11025_mixed }, | 314 | { sfb_11025_long, sfb_11025_short, sfb_11025_mixed }, |
315 | { sfb_8000_long, sfb_8000_short, sfb_8000_mixed } | 315 | { sfb_8000_long, sfb_8000_short, sfb_8000_mixed } |
316 | }; | 316 | }; |
317 | 317 | ||
318 | /* | 318 | /* |
319 | * scalefactor band preemphasis (used only when preflag is set) | 319 | * scalefactor band preemphasis (used only when preflag is set) |
320 | * derived from Table B.6 of ISO/IEC 11172-3 | 320 | * derived from Table B.6 of ISO/IEC 11172-3 |
321 | */ | 321 | */ |
322 | static | 322 | static |
323 | unsigned char const pretab[22] = { | 323 | unsigned char const pretab[22] = { |
324 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0 | 324 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0 |
325 | }; | 325 | }; |
326 | 326 | ||
327 | /* | 327 | /* |
328 | * table for requantization | 328 | * table for requantization |
329 | * | 329 | * |
330 | * rq_table[x].mantissa * 2^(rq_table[x].exponent) = x^(4/3) | 330 | * rq_table[x].mantissa * 2^(rq_table[x].exponent) = x^(4/3) |
331 | */ | 331 | */ |
332 | static | 332 | static |
333 | struct fixedfloat { | 333 | struct fixedfloat { |
334 | unsigned long mantissa : 27; | 334 | unsigned long mantissa : 27; |
335 | unsigned short exponent : 5; | 335 | unsigned short exponent : 5; |
336 | } const rq_table[8207] = { | 336 | } const rq_table[8207] = { |
337 | # include "rq_table.dat" | 337 | # include "rq_table.dat" |
338 | }; | 338 | }; |
339 | 339 | ||
340 | /* | 340 | /* |
341 | * fractional powers of two | 341 | * fractional powers of two |
342 | * used for requantization and joint stereo decoding | 342 | * used for requantization and joint stereo decoding |
343 | * | 343 | * |
344 | * root_table[3 + x] = 2^(x/4) | 344 | * root_table[3 + x] = 2^(x/4) |
345 | */ | 345 | */ |
346 | static | 346 | static |
347 | mad_fixed_t const root_table[7] = { | 347 | mad_fixed_t const root_table[7] = { |
348 | MAD_F(0x09837f05) /* 2^(-3/4) == 0.59460355750136 */, | 348 | MAD_F(0x09837f05) /* 2^(-3/4) == 0.59460355750136 */, |
349 | MAD_F(0x0b504f33) /* 2^(-2/4) == 0.70710678118655 */, | 349 | MAD_F(0x0b504f33) /* 2^(-2/4) == 0.70710678118655 */, |
350 | MAD_F(0x0d744fcd) /* 2^(-1/4) == 0.84089641525371 */, | 350 | MAD_F(0x0d744fcd) /* 2^(-1/4) == 0.84089641525371 */, |
351 | MAD_F(0x10000000) /* 2^( 0/4) == 1.00000000000000 */, | 351 | MAD_F(0x10000000) /* 2^( 0/4) == 1.00000000000000 */, |
352 | MAD_F(0x1306fe0a) /* 2^(+1/4) == 1.18920711500272 */, | 352 | MAD_F(0x1306fe0a) /* 2^(+1/4) == 1.18920711500272 */, |
353 | MAD_F(0x16a09e66) /* 2^(+2/4) == 1.41421356237310 */, | 353 | MAD_F(0x16a09e66) /* 2^(+2/4) == 1.41421356237310 */, |
354 | MAD_F(0x1ae89f99) /* 2^(+3/4) == 1.68179283050743 */ | 354 | MAD_F(0x1ae89f99) /* 2^(+3/4) == 1.68179283050743 */ |
355 | }; | 355 | }; |
356 | 356 | ||
357 | /* | 357 | /* |
358 | * coefficients for aliasing reduction | 358 | * coefficients for aliasing reduction |
359 | * derived from Table B.9 of ISO/IEC 11172-3 | 359 | * derived from Table B.9 of ISO/IEC 11172-3 |
360 | * | 360 | * |
361 | * c[] = { -0.6, -0.535, -0.33, -0.185, -0.095, -0.041, -0.0142, -0.0037 } | 361 | * c[] = { -0.6, -0.535, -0.33, -0.185, -0.095, -0.041, -0.0142, -0.0037 } |
362 | * cs[i] = 1 / sqrt(1 + c[i]^2) | 362 | * cs[i] = 1 / sqrt(1 + c[i]^2) |
363 | * ca[i] = c[i] / sqrt(1 + c[i]^2) | 363 | * ca[i] = c[i] / sqrt(1 + c[i]^2) |
364 | */ | 364 | */ |
365 | static | 365 | static |
366 | mad_fixed_t const cs[8] = { | 366 | mad_fixed_t const cs[8] = { |
367 | +MAD_F(0x0db84a81) /* +0.857492926 */, +MAD_F(0x0e1b9d7f) /* +0.881741997 */, | 367 | +MAD_F(0x0db84a81) /* +0.857492926 */, +MAD_F(0x0e1b9d7f) /* +0.881741997 */, |
368 | +MAD_F(0x0f31adcf) /* +0.949628649 */, +MAD_F(0x0fbba815) /* +0.983314592 */, | 368 | +MAD_F(0x0f31adcf) /* +0.949628649 */, +MAD_F(0x0fbba815) /* +0.983314592 */, |
369 | +MAD_F(0x0feda417) /* +0.995517816 */, +MAD_F(0x0ffc8fc8) /* +0.999160558 */, | 369 | +MAD_F(0x0feda417) /* +0.995517816 */, +MAD_F(0x0ffc8fc8) /* +0.999160558 */, |
370 | +MAD_F(0x0fff964c) /* +0.999899195 */, +MAD_F(0x0ffff8d3) /* +0.999993155 */ | 370 | +MAD_F(0x0fff964c) /* +0.999899195 */, +MAD_F(0x0ffff8d3) /* +0.999993155 */ |
371 | }; | 371 | }; |
372 | 372 | ||
373 | static | 373 | static |
374 | mad_fixed_t const ca[8] = { | 374 | mad_fixed_t const ca[8] = { |
375 | -MAD_F(0x083b5fe7) /* -0.514495755 */, -MAD_F(0x078c36d2) /* -0.471731969 */, | 375 | -MAD_F(0x083b5fe7) /* -0.514495755 */, -MAD_F(0x078c36d2) /* -0.471731969 */, |
376 | -MAD_F(0x05039814) /* -0.313377454 */, -MAD_F(0x02e91dd1) /* -0.181913200 */, | 376 | -MAD_F(0x05039814) /* -0.313377454 */, -MAD_F(0x02e91dd1) /* -0.181913200 */, |
377 | -MAD_F(0x0183603a) /* -0.094574193 */, -MAD_F(0x00a7cb87) /* -0.040965583 */, | 377 | -MAD_F(0x0183603a) /* -0.094574193 */, -MAD_F(0x00a7cb87) /* -0.040965583 */, |
378 | -MAD_F(0x003a2847) /* -0.014198569 */, -MAD_F(0x000f27b4) /* -0.003699975 */ | 378 | -MAD_F(0x003a2847) /* -0.014198569 */, -MAD_F(0x000f27b4) /* -0.003699975 */ |
379 | }; | 379 | }; |
380 | 380 | ||
381 | /* | 381 | /* |
382 | * IMDCT coefficients for short blocks | 382 | * IMDCT coefficients for short blocks |
383 | * derived from section 2.4.3.4.10.2 of ISO/IEC 11172-3 | 383 | * derived from section 2.4.3.4.10.2 of ISO/IEC 11172-3 |
384 | * | 384 | * |
385 | * imdct_s[i/even][k] = cos((PI / 24) * (2 * (i / 2) + 7) * (2 * k + 1)) | 385 | * imdct_s[i/even][k] = cos((PI / 24) * (2 * (i / 2) + 7) * (2 * k + 1)) |
386 | * imdct_s[i /odd][k] = cos((PI / 24) * (2 * (6 + (i-1)/2) + 7) * (2 * k + 1)) | 386 | * imdct_s[i /odd][k] = cos((PI / 24) * (2 * (6 + (i-1)/2) + 7) * (2 * k + 1)) |
387 | */ | 387 | */ |
388 | static | 388 | static |
389 | mad_fixed_t const imdct_s[6][6] = { | 389 | mad_fixed_t const imdct_s[6][6] = { |
390 | # include "imdct_s.dat" | 390 | # include "imdct_s.dat" |
391 | }; | 391 | }; |
392 | 392 | ||
393 | # if !defined(ASO_IMDCT) | 393 | # if !defined(ASO_IMDCT) |
394 | /* | 394 | /* |
395 | * windowing coefficients for long blocks | 395 | * windowing coefficients for long blocks |
396 | * derived from section 2.4.3.4.10.3 of ISO/IEC 11172-3 | 396 | * derived from section 2.4.3.4.10.3 of ISO/IEC 11172-3 |
397 | * | 397 | * |
398 | * window_l[i] = sin((PI / 36) * (i + 1/2)) | 398 | * window_l[i] = sin((PI / 36) * (i + 1/2)) |
399 | */ | 399 | */ |
400 | static | 400 | static |
401 | mad_fixed_t const window_l[36] = { | 401 | mad_fixed_t const window_l[36] = { |
402 | MAD_F(0x00b2aa3e) /* 0.043619387 */, MAD_F(0x0216a2a2) /* 0.130526192 */, | 402 | MAD_F(0x00b2aa3e) /* 0.043619387 */, MAD_F(0x0216a2a2) /* 0.130526192 */, |
403 | MAD_F(0x03768962) /* 0.216439614 */, MAD_F(0x04cfb0e2) /* 0.300705800 */, | 403 | MAD_F(0x03768962) /* 0.216439614 */, MAD_F(0x04cfb0e2) /* 0.300705800 */, |
404 | MAD_F(0x061f78aa) /* 0.382683432 */, MAD_F(0x07635284) /* 0.461748613 */, | 404 | MAD_F(0x061f78aa) /* 0.382683432 */, MAD_F(0x07635284) /* 0.461748613 */, |
405 | MAD_F(0x0898c779) /* 0.537299608 */, MAD_F(0x09bd7ca0) /* 0.608761429 */, | 405 | MAD_F(0x0898c779) /* 0.537299608 */, MAD_F(0x09bd7ca0) /* 0.608761429 */, |
406 | MAD_F(0x0acf37ad) /* 0.675590208 */, MAD_F(0x0bcbe352) /* 0.737277337 */, | 406 | MAD_F(0x0acf37ad) /* 0.675590208 */, MAD_F(0x0bcbe352) /* 0.737277337 */, |
407 | MAD_F(0x0cb19346) /* 0.793353340 */, MAD_F(0x0d7e8807) /* 0.843391446 */, | 407 | MAD_F(0x0cb19346) /* 0.793353340 */, MAD_F(0x0d7e8807) /* 0.843391446 */, |
408 | 408 | ||
409 | MAD_F(0x0e313245) /* 0.887010833 */, MAD_F(0x0ec835e8) /* 0.923879533 */, | 409 | MAD_F(0x0e313245) /* 0.887010833 */, MAD_F(0x0ec835e8) /* 0.923879533 */, |
410 | MAD_F(0x0f426cb5) /* 0.953716951 */, MAD_F(0x0f9ee890) /* 0.976296007 */, | 410 | MAD_F(0x0f426cb5) /* 0.953716951 */, MAD_F(0x0f9ee890) /* 0.976296007 */, |
411 | MAD_F(0x0fdcf549) /* 0.991444861 */, MAD_F(0x0ffc19fd) /* 0.999048222 */, | 411 | MAD_F(0x0fdcf549) /* 0.991444861 */, MAD_F(0x0ffc19fd) /* 0.999048222 */, |
412 | MAD_F(0x0ffc19fd) /* 0.999048222 */, MAD_F(0x0fdcf549) /* 0.991444861 */, | 412 | MAD_F(0x0ffc19fd) /* 0.999048222 */, MAD_F(0x0fdcf549) /* 0.991444861 */, |
413 | MAD_F(0x0f9ee890) /* 0.976296007 */, MAD_F(0x0f426cb5) /* 0.953716951 */, | 413 | MAD_F(0x0f9ee890) /* 0.976296007 */, MAD_F(0x0f426cb5) /* 0.953716951 */, |
414 | MAD_F(0x0ec835e8) /* 0.923879533 */, MAD_F(0x0e313245) /* 0.887010833 */, | 414 | MAD_F(0x0ec835e8) /* 0.923879533 */, MAD_F(0x0e313245) /* 0.887010833 */, |
415 | 415 | ||
416 | MAD_F(0x0d7e8807) /* 0.843391446 */, MAD_F(0x0cb19346) /* 0.793353340 */, | 416 | MAD_F(0x0d7e8807) /* 0.843391446 */, MAD_F(0x0cb19346) /* 0.793353340 */, |
417 | MAD_F(0x0bcbe352) /* 0.737277337 */, MAD_F(0x0acf37ad) /* 0.675590208 */, | 417 | MAD_F(0x0bcbe352) /* 0.737277337 */, MAD_F(0x0acf37ad) /* 0.675590208 */, |
418 | MAD_F(0x09bd7ca0) /* 0.608761429 */, MAD_F(0x0898c779) /* 0.537299608 */, | 418 | MAD_F(0x09bd7ca0) /* 0.608761429 */, MAD_F(0x0898c779) /* 0.537299608 */, |
419 | MAD_F(0x07635284) /* 0.461748613 */, MAD_F(0x061f78aa) /* 0.382683432 */, | 419 | MAD_F(0x07635284) /* 0.461748613 */, MAD_F(0x061f78aa) /* 0.382683432 */, |
420 | MAD_F(0x04cfb0e2) /* 0.300705800 */, MAD_F(0x03768962) /* 0.216439614 */, | 420 | MAD_F(0x04cfb0e2) /* 0.300705800 */, MAD_F(0x03768962) /* 0.216439614 */, |
421 | MAD_F(0x0216a2a2) /* 0.130526192 */, MAD_F(0x00b2aa3e) /* 0.043619387 */, | 421 | MAD_F(0x0216a2a2) /* 0.130526192 */, MAD_F(0x00b2aa3e) /* 0.043619387 */, |
422 | }; | 422 | }; |
423 | # endif /* ASO_IMDCT */ | 423 | # endif /* ASO_IMDCT */ |
424 | 424 | ||
425 | /* | 425 | /* |
426 | * windowing coefficients for short blocks | 426 | * windowing coefficients for short blocks |
427 | * derived from section 2.4.3.4.10.3 of ISO/IEC 11172-3 | 427 | * derived from section 2.4.3.4.10.3 of ISO/IEC 11172-3 |
428 | * | 428 | * |
429 | * window_s[i] = sin((PI / 12) * (i + 1/2)) | 429 | * window_s[i] = sin((PI / 12) * (i + 1/2)) |
430 | */ | 430 | */ |
431 | static | 431 | static |
432 | mad_fixed_t const window_s[12] = { | 432 | mad_fixed_t const window_s[12] = { |
433 | MAD_F(0x0216a2a2) /* 0.130526192 */, MAD_F(0x061f78aa) /* 0.382683432 */, | 433 | MAD_F(0x0216a2a2) /* 0.130526192 */, MAD_F(0x061f78aa) /* 0.382683432 */, |
434 | MAD_F(0x09bd7ca0) /* 0.608761429 */, MAD_F(0x0cb19346) /* 0.793353340 */, | 434 | MAD_F(0x09bd7ca0) /* 0.608761429 */, MAD_F(0x0cb19346) /* 0.793353340 */, |
435 | MAD_F(0x0ec835e8) /* 0.923879533 */, MAD_F(0x0fdcf549) /* 0.991444861 */, | 435 | MAD_F(0x0ec835e8) /* 0.923879533 */, MAD_F(0x0fdcf549) /* 0.991444861 */, |
436 | MAD_F(0x0fdcf549) /* 0.991444861 */, MAD_F(0x0ec835e8) /* 0.923879533 */, | 436 | MAD_F(0x0fdcf549) /* 0.991444861 */, MAD_F(0x0ec835e8) /* 0.923879533 */, |
437 | MAD_F(0x0cb19346) /* 0.793353340 */, MAD_F(0x09bd7ca0) /* 0.608761429 */, | 437 | MAD_F(0x0cb19346) /* 0.793353340 */, MAD_F(0x09bd7ca0) /* 0.608761429 */, |
438 | MAD_F(0x061f78aa) /* 0.382683432 */, MAD_F(0x0216a2a2) /* 0.130526192 */, | 438 | MAD_F(0x061f78aa) /* 0.382683432 */, MAD_F(0x0216a2a2) /* 0.130526192 */, |
439 | }; | 439 | }; |
440 | 440 | ||
441 | /* | 441 | /* |
442 | * coefficients for intensity stereo processing | 442 | * coefficients for intensity stereo processing |
443 | * derived from section 2.4.3.4.9.3 of ISO/IEC 11172-3 | 443 | * derived from section 2.4.3.4.9.3 of ISO/IEC 11172-3 |
444 | * | 444 | * |
445 | * is_ratio[i] = tan(i * (PI / 12)) | 445 | * is_ratio[i] = tan(i * (PI / 12)) |
446 | * is_table[i] = is_ratio[i] / (1 + is_ratio[i]) | 446 | * is_table[i] = is_ratio[i] / (1 + is_ratio[i]) |
447 | */ | 447 | */ |
448 | static | 448 | static |
449 | mad_fixed_t const is_table[7] = { | 449 | mad_fixed_t const is_table[7] = { |
450 | MAD_F(0x00000000) /* 0.000000000 */, | 450 | MAD_F(0x00000000) /* 0.000000000 */, |
451 | MAD_F(0x0361962f) /* 0.211324865 */, | 451 | MAD_F(0x0361962f) /* 0.211324865 */, |
452 | MAD_F(0x05db3d74) /* 0.366025404 */, | 452 | MAD_F(0x05db3d74) /* 0.366025404 */, |
453 | MAD_F(0x08000000) /* 0.500000000 */, | 453 | MAD_F(0x08000000) /* 0.500000000 */, |
454 | MAD_F(0x0a24c28c) /* 0.633974596 */, | 454 | MAD_F(0x0a24c28c) /* 0.633974596 */, |
455 | MAD_F(0x0c9e69d1) /* 0.788675135 */, | 455 | MAD_F(0x0c9e69d1) /* 0.788675135 */, |
456 | MAD_F(0x10000000) /* 1.000000000 */ | 456 | MAD_F(0x10000000) /* 1.000000000 */ |
457 | }; | 457 | }; |
458 | 458 | ||
459 | /* | 459 | /* |
460 | * coefficients for LSF intensity stereo processing | 460 | * coefficients for LSF intensity stereo processing |
461 | * derived from section 2.4.3.2 of ISO/IEC 13818-3 | 461 | * derived from section 2.4.3.2 of ISO/IEC 13818-3 |
462 | * | 462 | * |
463 | * is_lsf_table[0][i] = (1 / sqrt(sqrt(2)))^(i + 1) | 463 | * is_lsf_table[0][i] = (1 / sqrt(sqrt(2)))^(i + 1) |
464 | * is_lsf_table[1][i] = (1 / sqrt(2))^(i + 1) | 464 | * is_lsf_table[1][i] = (1 / sqrt(2)) ^(i + 1) |
465 | */ | 465 | */ |
466 | static | 466 | static |
467 | mad_fixed_t const is_lsf_table[2][15] = { | 467 | mad_fixed_t const is_lsf_table[2][15] = { |
468 | { | 468 | { |
469 | MAD_F(0x0d744fcd) /* 0.840896415 */, | 469 | MAD_F(0x0d744fcd) /* 0.840896415 */, |
470 | MAD_F(0x0b504f33) /* 0.707106781 */, | 470 | MAD_F(0x0b504f33) /* 0.707106781 */, |
471 | MAD_F(0x09837f05) /* 0.594603558 */, | 471 | MAD_F(0x09837f05) /* 0.594603558 */, |
472 | MAD_F(0x08000000) /* 0.500000000 */, | 472 | MAD_F(0x08000000) /* 0.500000000 */, |
473 | MAD_F(0x06ba27e6) /* 0.420448208 */, | 473 | MAD_F(0x06ba27e6) /* 0.420448208 */, |
474 | MAD_F(0x05a8279a) /* 0.353553391 */, | 474 | MAD_F(0x05a8279a) /* 0.353553391 */, |
475 | MAD_F(0x04c1bf83) /* 0.297301779 */, | 475 | MAD_F(0x04c1bf83) /* 0.297301779 */, |
476 | MAD_F(0x04000000) /* 0.250000000 */, | 476 | MAD_F(0x04000000) /* 0.250000000 */, |
477 | MAD_F(0x035d13f3) /* 0.210224104 */, | 477 | MAD_F(0x035d13f3) /* 0.210224104 */, |
478 | MAD_F(0x02d413cd) /* 0.176776695 */, | 478 | MAD_F(0x02d413cd) /* 0.176776695 */, |
479 | MAD_F(0x0260dfc1) /* 0.148650889 */, | 479 | MAD_F(0x0260dfc1) /* 0.148650889 */, |
480 | MAD_F(0x02000000) /* 0.125000000 */, | 480 | MAD_F(0x02000000) /* 0.125000000 */, |
481 | MAD_F(0x01ae89fa) /* 0.105112052 */, | 481 | MAD_F(0x01ae89fa) /* 0.105112052 */, |
482 | MAD_F(0x016a09e6) /* 0.088388348 */, | 482 | MAD_F(0x016a09e6) /* 0.088388348 */, |
483 | MAD_F(0x01306fe1) /* 0.074325445 */ | 483 | MAD_F(0x01306fe1) /* 0.074325445 */ |
484 | }, { | 484 | }, { |
485 | MAD_F(0x0b504f33) /* 0.707106781 */, | 485 | MAD_F(0x0b504f33) /* 0.707106781 */, |
486 | MAD_F(0x08000000) /* 0.500000000 */, | 486 | MAD_F(0x08000000) /* 0.500000000 */, |
487 | MAD_F(0x05a8279a) /* 0.353553391 */, | 487 | MAD_F(0x05a8279a) /* 0.353553391 */, |
488 | MAD_F(0x04000000) /* 0.250000000 */, | 488 | MAD_F(0x04000000) /* 0.250000000 */, |
489 | MAD_F(0x02d413cd) /* 0.176776695 */, | 489 | MAD_F(0x02d413cd) /* 0.176776695 */, |
490 | MAD_F(0x02000000) /* 0.125000000 */, | 490 | MAD_F(0x02000000) /* 0.125000000 */, |
491 | MAD_F(0x016a09e6) /* 0.088388348 */, | 491 | MAD_F(0x016a09e6) /* 0.088388348 */, |
492 | MAD_F(0x01000000) /* 0.062500000 */, | 492 | MAD_F(0x01000000) /* 0.062500000 */, |
493 | MAD_F(0x00b504f3) /* 0.044194174 */, | 493 | MAD_F(0x00b504f3) /* 0.044194174 */, |
494 | MAD_F(0x00800000) /* 0.031250000 */, | 494 | MAD_F(0x00800000) /* 0.031250000 */, |
495 | MAD_F(0x005a827a) /* 0.022097087 */, | 495 | MAD_F(0x005a827a) /* 0.022097087 */, |
496 | MAD_F(0x00400000) /* 0.015625000 */, | 496 | MAD_F(0x00400000) /* 0.015625000 */, |
497 | MAD_F(0x002d413d) /* 0.011048543 */, | 497 | MAD_F(0x002d413d) /* 0.011048543 */, |
498 | MAD_F(0x00200000) /* 0.007812500 */, | 498 | MAD_F(0x00200000) /* 0.007812500 */, |
499 | MAD_F(0x0016a09e) /* 0.005524272 */ | 499 | MAD_F(0x0016a09e) /* 0.005524272 */ |
500 | } | 500 | } |
501 | }; | 501 | }; |
502 | 502 | ||
503 | /* | 503 | /* |
504 | * NAME:III_sideinfo() | 504 | * NAME:III_sideinfo() |
505 | * DESCRIPTION:decode frame side information from a bitstream | 505 | * DESCRIPTION:decode frame side information from a bitstream |
506 | */ | 506 | */ |
507 | static | 507 | static |
508 | enum mad_error III_sideinfo(struct mad_bitptr *ptr, unsigned int nch, | 508 | enum mad_error III_sideinfo(struct mad_bitptr *ptr, unsigned int nch, |
509 | int lsf, struct sideinfo *si, | 509 | int lsf, struct sideinfo *si, |
510 | unsigned int *data_bitlen, | 510 | unsigned int *data_bitlen, |
511 | unsigned int *priv_bitlen) | 511 | unsigned int *priv_bitlen) |
512 | { | 512 | { |
513 | unsigned int ngr, gr, ch, i; | 513 | unsigned int ngr, gr, ch, i; |
514 | enum mad_error result = MAD_ERROR_NONE; | 514 | enum mad_error result = MAD_ERROR_NONE; |
515 | 515 | ||
516 | *data_bitlen = 0; | 516 | *data_bitlen = 0; |
517 | *priv_bitlen = lsf ? ((nch == 1) ? 1 : 2) : ((nch == 1) ? 5 : 3); | 517 | *priv_bitlen = lsf ? ((nch == 1) ? 1 : 2) : ((nch == 1) ? 5 : 3); |
518 | 518 | ||
519 | si->main_data_begin = mad_bit_read(ptr, lsf ? 8 : 9); | 519 | si->main_data_begin = mad_bit_read(ptr, lsf ? 8 : 9); |
520 | si->private_bits = mad_bit_read(ptr, *priv_bitlen); | 520 | si->private_bits = mad_bit_read(ptr, *priv_bitlen); |
521 | 521 | ||
522 | ngr = 1; | 522 | ngr = 1; |
523 | if (!lsf) { | 523 | if (!lsf) { |
524 | ngr = 2; | 524 | ngr = 2; |
525 | 525 | ||
526 | for (ch = 0; ch < nch; ++ch) | 526 | for (ch = 0; ch < nch; ++ch) |
527 | si->scfsi[ch] = mad_bit_read(ptr, 4); | 527 | si->scfsi[ch] = mad_bit_read(ptr, 4); |
528 | } | 528 | } |
529 | 529 | ||
530 | for (gr = 0; gr < ngr; ++gr) { | 530 | for (gr = 0; gr < ngr; ++gr) { |
531 | struct granule *granule = &si->gr[gr]; | 531 | struct granule *granule = &si->gr[gr]; |
532 | 532 | ||
533 | for (ch = 0; ch < nch; ++ch) { | 533 | for (ch = 0; ch < nch; ++ch) { |
534 | struct channel *channel = &granule->ch[ch]; | 534 | struct channel *channel = &granule->ch[ch]; |
535 | 535 | ||
536 | channel->part2_3_length = mad_bit_read(ptr, 12); | 536 | channel->part2_3_length = mad_bit_read(ptr, 12); |
537 | channel->big_values = mad_bit_read(ptr, 9); | 537 | channel->big_values = mad_bit_read(ptr, 9); |
538 | channel->global_gain = mad_bit_read(ptr, 8); | 538 | channel->global_gain = mad_bit_read(ptr, 8); |
539 | channel->scalefac_compress = mad_bit_read(ptr, lsf ? 9 : 4); | 539 | channel->scalefac_compress = mad_bit_read(ptr, lsf ? 9 : 4); |
540 | 540 | ||
541 | *data_bitlen += channel->part2_3_length; | 541 | *data_bitlen += channel->part2_3_length; |
542 | 542 | ||
543 | if (channel->big_values > 288 && result == 0) | 543 | if (channel->big_values > 288 && result == 0) |
544 | result = MAD_ERROR_BADBIGVALUES; | 544 | result = MAD_ERROR_BADBIGVALUES; |
545 | 545 | ||
546 | channel->flags = 0; | 546 | channel->flags = 0; |
547 | 547 | ||
548 | /* window_switching_flag */ | 548 | /* window_switching_flag */ |
549 | if (mad_bit_read(ptr, 1)) { | 549 | if (mad_bit_read(ptr, 1)) { |
550 | channel->block_type = mad_bit_read(ptr, 2); | 550 | channel->block_type = mad_bit_read(ptr, 2); |
551 | 551 | ||
552 | if (channel->block_type == 0 && result == 0) | 552 | if (channel->block_type == 0 && result == 0) |
553 | result = MAD_ERROR_BADBLOCKTYPE; | 553 | result = MAD_ERROR_BADBLOCKTYPE; |
554 | 554 | ||
555 | if (!lsf && channel->block_type == 2 && si->scfsi[ch] && result == 0) | 555 | if (!lsf && channel->block_type == 2 && si->scfsi[ch] && result == 0) |
556 | result = MAD_ERROR_BADSCFSI; | 556 | result = MAD_ERROR_BADSCFSI; |
557 | 557 | ||
558 | channel->region0_count = 7; | 558 | channel->region0_count = 7; |
559 | channel->region1_count = 36; | 559 | channel->region1_count = 36; |
560 | 560 | ||
561 | if (mad_bit_read(ptr, 1)) | 561 | if (mad_bit_read(ptr, 1)) |
562 | channel->flags |= mixed_block_flag; | 562 | channel->flags |= mixed_block_flag; |
563 | else if (channel->block_type == 2) | 563 | else if (channel->block_type == 2) |
564 | channel->region0_count = 8; | 564 | channel->region0_count = 8; |
565 | 565 | ||
566 | for (i = 0; i < 2; ++i) | 566 | for (i = 0; i < 2; ++i) |
567 | channel->table_select[i] = mad_bit_read(ptr, 5); | 567 | channel->table_select[i] = mad_bit_read(ptr, 5); |
568 | 568 | ||
569 | # if defined(DEBUG) | 569 | # if defined(DEBUG) |
570 | channel->table_select[2] = 4; /* not used */ | 570 | channel->table_select[2] = 4; /* not used */ |
571 | # endif | 571 | # endif |
572 | 572 | ||
573 | for (i = 0; i < 3; ++i) | 573 | for (i = 0; i < 3; ++i) |
574 | channel->subblock_gain[i] = mad_bit_read(ptr, 3); | 574 | channel->subblock_gain[i] = mad_bit_read(ptr, 3); |
575 | } | 575 | } |
576 | else { | 576 | else { |
577 | channel->block_type = 0; | 577 | channel->block_type = 0; |
578 | 578 | ||
579 | for (i = 0; i < 3; ++i) | 579 | for (i = 0; i < 3; ++i) |
580 | channel->table_select[i] = mad_bit_read(ptr, 5); | 580 | channel->table_select[i] = mad_bit_read(ptr, 5); |
581 | 581 | ||
582 | channel->region0_count = mad_bit_read(ptr, 4); | 582 | channel->region0_count = mad_bit_read(ptr, 4); |
583 | channel->region1_count = mad_bit_read(ptr, 3); | 583 | channel->region1_count = mad_bit_read(ptr, 3); |
584 | } | 584 | } |
585 | 585 | ||
586 | /* [preflag,] scalefac_scale, count1table_select */ | 586 | /* [preflag,] scalefac_scale, count1table_select */ |
587 | channel->flags |= mad_bit_read(ptr, lsf ? 2 : 3); | 587 | channel->flags |= mad_bit_read(ptr, lsf ? 2 : 3); |
588 | } | 588 | } |
589 | } | 589 | } |
590 | 590 | ||
591 | return result; | 591 | return result; |
592 | } | 592 | } |
@@ -1450,256 +1450,443 @@ enum mad_error III_stereo(mad_fixed_t xr[2][576], | |||
1450 | 1450 | ||
1451 | if (illegal_pos[sfbi]) { | 1451 | if (illegal_pos[sfbi]) { |
1452 | modes[sfbi] &= ~I_STEREO; | 1452 | modes[sfbi] &= ~I_STEREO; |
1453 | continue; | 1453 | continue; |
1454 | } | 1454 | } |
1455 | 1455 | ||
1456 | is_pos = right_ch->scalefac[sfbi]; | 1456 | is_pos = right_ch->scalefac[sfbi]; |
1457 | 1457 | ||
1458 | for (i = 0; i < n; ++i) { | 1458 | for (i = 0; i < n; ++i) { |
1459 | register mad_fixed_t left; | 1459 | register mad_fixed_t left; |
1460 | 1460 | ||
1461 | left = xr[0][l + i]; | 1461 | left = xr[0][l + i]; |
1462 | 1462 | ||
1463 | if (is_pos == 0) | 1463 | if (is_pos == 0) |
1464 | xr[1][l + i] = left; | 1464 | xr[1][l + i] = left; |
1465 | else { | 1465 | else { |
1466 | register mad_fixed_t opposite; | 1466 | register mad_fixed_t opposite; |
1467 | 1467 | ||
1468 | opposite = mad_f_mul(left, lsf_scale[(is_pos - 1) / 2]); | 1468 | opposite = mad_f_mul(left, lsf_scale[(is_pos - 1) / 2]); |
1469 | 1469 | ||
1470 | if (is_pos & 1) { | 1470 | if (is_pos & 1) { |
1471 | xr[0][l + i] = opposite; | 1471 | xr[0][l + i] = opposite; |
1472 | xr[1][l + i] = left; | 1472 | xr[1][l + i] = left; |
1473 | } | 1473 | } |
1474 | else | 1474 | else |
1475 | xr[1][l + i] = opposite; | 1475 | xr[1][l + i] = opposite; |
1476 | } | 1476 | } |
1477 | } | 1477 | } |
1478 | } | 1478 | } |
1479 | } | 1479 | } |
1480 | else { /* !(header->flags & MAD_FLAG_LSF_EXT) */ | 1480 | else { /* !(header->flags & MAD_FLAG_LSF_EXT) */ |
1481 | for (sfbi = l = 0; l < 576; ++sfbi, l += n) { | 1481 | for (sfbi = l = 0; l < 576; ++sfbi, l += n) { |
1482 | n = sfbwidth[sfbi]; | 1482 | n = sfbwidth[sfbi]; |
1483 | 1483 | ||
1484 | if (!(modes[sfbi] & I_STEREO)) | 1484 | if (!(modes[sfbi] & I_STEREO)) |
1485 | continue; | 1485 | continue; |
1486 | 1486 | ||
1487 | is_pos = right_ch->scalefac[sfbi]; | 1487 | is_pos = right_ch->scalefac[sfbi]; |
1488 | 1488 | ||
1489 | if (is_pos >= 7) { /* illegal intensity position */ | 1489 | if (is_pos >= 7) { /* illegal intensity position */ |
1490 | modes[sfbi] &= ~I_STEREO; | 1490 | modes[sfbi] &= ~I_STEREO; |
1491 | continue; | 1491 | continue; |
1492 | } | 1492 | } |
1493 | 1493 | ||
1494 | for (i = 0; i < n; ++i) { | 1494 | for (i = 0; i < n; ++i) { |
1495 | register mad_fixed_t left; | 1495 | register mad_fixed_t left; |
1496 | 1496 | ||
1497 | left = xr[0][l + i]; | 1497 | left = xr[0][l + i]; |
1498 | 1498 | ||
1499 | xr[0][l + i] = mad_f_mul(left, is_table[ is_pos]); | 1499 | xr[0][l + i] = mad_f_mul(left, is_table[ is_pos]); |
1500 | xr[1][l + i] = mad_f_mul(left, is_table[6 - is_pos]); | 1500 | xr[1][l + i] = mad_f_mul(left, is_table[6 - is_pos]); |
1501 | } | 1501 | } |
1502 | } | 1502 | } |
1503 | } | 1503 | } |
1504 | } | 1504 | } |
1505 | 1505 | ||
1506 | /* middle/side stereo */ | 1506 | /* middle/side stereo */ |
1507 | 1507 | ||
1508 | if (header->mode_extension & MS_STEREO) { | 1508 | if (header->mode_extension & MS_STEREO) { |
1509 | register mad_fixed_t invsqrt2; | 1509 | register mad_fixed_t invsqrt2; |
1510 | 1510 | ||
1511 | header->flags |= MAD_FLAG_MS_STEREO; | 1511 | header->flags |= MAD_FLAG_MS_STEREO; |
1512 | 1512 | ||
1513 | invsqrt2 = root_table[3 + -2]; | 1513 | invsqrt2 = root_table[3 + -2]; |
1514 | 1514 | ||
1515 | for (sfbi = l = 0; l < 576; ++sfbi, l += n) { | 1515 | for (sfbi = l = 0; l < 576; ++sfbi, l += n) { |
1516 | n = sfbwidth[sfbi]; | 1516 | n = sfbwidth[sfbi]; |
1517 | 1517 | ||
1518 | if (modes[sfbi] != MS_STEREO) | 1518 | if (modes[sfbi] != MS_STEREO) |
1519 | continue; | 1519 | continue; |
1520 | 1520 | ||
1521 | for (i = 0; i < n; ++i) { | 1521 | for (i = 0; i < n; ++i) { |
1522 | register mad_fixed_t m, s; | 1522 | register mad_fixed_t m, s; |
1523 | 1523 | ||
1524 | m = xr[0][l + i]; | 1524 | m = xr[0][l + i]; |
1525 | s = xr[1][l + i]; | 1525 | s = xr[1][l + i]; |
1526 | 1526 | ||
1527 | xr[0][l + i] = mad_f_mul(m + s, invsqrt2); /* l = (m + s) / sqrt(2) */ | 1527 | xr[0][l + i] = mad_f_mul(m + s, invsqrt2); /* l = (m + s) / sqrt(2) */ |
1528 | xr[1][l + i] = mad_f_mul(m - s, invsqrt2); /* r = (m - s) / sqrt(2) */ | 1528 | xr[1][l + i] = mad_f_mul(m - s, invsqrt2); /* r = (m - s) / sqrt(2) */ |
1529 | } | 1529 | } |
1530 | } | 1530 | } |
1531 | } | 1531 | } |
1532 | 1532 | ||
1533 | return MAD_ERROR_NONE; | 1533 | return MAD_ERROR_NONE; |
1534 | } | 1534 | } |
1535 | 1535 | ||
1536 | /* | 1536 | /* |
1537 | * NAME:III_aliasreduce() | 1537 | * NAME:III_aliasreduce() |
1538 | * DESCRIPTION:perform frequency line alias reduction | 1538 | * DESCRIPTION:perform frequency line alias reduction |
1539 | */ | 1539 | */ |
1540 | static | 1540 | static |
1541 | void III_aliasreduce(mad_fixed_t xr[576], int lines) | 1541 | void III_aliasreduce(mad_fixed_t xr[576], int lines) |
1542 | { | 1542 | { |
1543 | mad_fixed_t const *bound; | 1543 | mad_fixed_t const *bound; |
1544 | int i; | 1544 | int i; |
1545 | 1545 | ||
1546 | bound = &xr[lines]; | 1546 | bound = &xr[lines]; |
1547 | for (xr += 18; xr < bound; xr += 18) { | 1547 | for (xr += 18; xr < bound; xr += 18) { |
1548 | for (i = 0; i < 8; ++i) { | 1548 | for (i = 0; i < 8; ++i) { |
1549 | register mad_fixed_t a, b; | 1549 | register mad_fixed_t a, b; |
1550 | register mad_fixed64hi_t hi; | 1550 | register mad_fixed64hi_t hi; |
1551 | register mad_fixed64lo_t lo; | 1551 | register mad_fixed64lo_t lo; |
1552 | 1552 | ||
1553 | a = xr[-1 - i]; | 1553 | a = xr[-1 - i]; |
1554 | b = xr[ i]; | 1554 | b = xr[ i]; |
1555 | 1555 | ||
1556 | # if defined(ASO_ZEROCHECK) | 1556 | # if defined(ASO_ZEROCHECK) |
1557 | if (a | b) { | 1557 | if (a | b) { |
1558 | # endif | 1558 | # endif |
1559 | MAD_F_ML0(hi, lo, a, cs[i]); | 1559 | MAD_F_ML0(hi, lo, a, cs[i]); |
1560 | MAD_F_MLA(hi, lo, -b, ca[i]); | 1560 | MAD_F_MLA(hi, lo, -b, ca[i]); |
1561 | 1561 | ||
1562 | xr[-1 - i] = MAD_F_MLZ(hi, lo); | 1562 | xr[-1 - i] = MAD_F_MLZ(hi, lo); |
1563 | 1563 | ||
1564 | MAD_F_ML0(hi, lo, b, cs[i]); | 1564 | MAD_F_ML0(hi, lo, b, cs[i]); |
1565 | MAD_F_MLA(hi, lo, a, ca[i]); | 1565 | MAD_F_MLA(hi, lo, a, ca[i]); |
1566 | 1566 | ||
1567 | xr[ i] = MAD_F_MLZ(hi, lo); | 1567 | xr[ i] = MAD_F_MLZ(hi, lo); |
1568 | # if defined(ASO_ZEROCHECK) | 1568 | # if defined(ASO_ZEROCHECK) |
1569 | } | 1569 | } |
1570 | # endif | 1570 | # endif |
1571 | } | 1571 | } |
1572 | } | 1572 | } |
1573 | } | 1573 | } |
1574 | 1574 | ||
1575 | # if defined(ASO_IMDCT) | 1575 | # if defined(ASO_IMDCT) |
1576 | void III_imdct_l(mad_fixed_t const [18], mad_fixed_t [36], unsigned int); | 1576 | void III_imdct_l(mad_fixed_t const [18], mad_fixed_t [36], unsigned int); |
1577 | # else | 1577 | # else |
1578 | # if 1 | ||
1579 | static | ||
1580 | void fastsdct(mad_fixed_t const x[9], mad_fixed_t y[18]) | ||
1581 | { | ||
1582 | mad_fixed_t a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12; | ||
1583 | mad_fixed_t a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25; | ||
1584 | mad_fixed_t m0, m1, m2, m3, m4, m5, m6, m7; | ||
1585 | |||
1586 | enum { | ||
1587 | c0 = MAD_F(0x1f838b8d), /* 2 * cos( 1 * PI / 18) */ | ||
1588 | c1 = MAD_F(0x1bb67ae8), /* 2 * cos( 3 * PI / 18) */ | ||
1589 | c2 = MAD_F(0x18836fa3), /* 2 * cos( 4 * PI / 18) */ | ||
1590 | c3 = MAD_F(0x1491b752), /* 2 * cos( 5 * PI / 18) */ | ||
1591 | c4 = MAD_F(0x0af1d43a), /* 2 * cos( 7 * PI / 18) */ | ||
1592 | c5 = MAD_F(0x058e86a0), /* 2 * cos( 8 * PI / 18) */ | ||
1593 | c6 = -MAD_F(0x1e11f642) /* 2 * cos(16 * PI / 18) */ | ||
1594 | }; | ||
1595 | |||
1596 | a0 = x[3] + x[5]; | ||
1597 | a1 = x[3] - x[5]; | ||
1598 | a2 = x[6] + x[2]; | ||
1599 | a3 = x[6] - x[2]; | ||
1600 | a4 = x[1] + x[7]; | ||
1601 | a5 = x[1] - x[7]; | ||
1602 | a6 = x[8] + x[0]; | ||
1603 | a7 = x[8] - x[0]; | ||
1604 | |||
1605 | a8 = a0 + a2; | ||
1606 | a9 = a0 - a2; | ||
1607 | a10 = a0 - a6; | ||
1608 | a11 = a2 - a6; | ||
1609 | a12 = a8 + a6; | ||
1610 | a13 = a1 - a3; | ||
1611 | a14 = a13 + a7; | ||
1612 | a15 = a3 + a7; | ||
1613 | a16 = a1 - a7; | ||
1614 | a17 = a1 + a3; | ||
1615 | |||
1616 | m0 = mad_f_mul(a17, -c3); | ||
1617 | m1 = mad_f_mul(a16, -c0); | ||
1618 | m2 = mad_f_mul(a15, -c4); | ||
1619 | m3 = mad_f_mul(a14, -c1); | ||
1620 | m4 = mad_f_mul(a5, -c1); | ||
1621 | m5 = mad_f_mul(a11, -c6); | ||
1622 | m6 = mad_f_mul(a10, -c5); | ||
1623 | m7 = mad_f_mul(a9, -c2); | ||
1624 | |||
1625 | a18 = x[4] + a4; | ||
1626 | a19 = 2 * x[4] - a4; | ||
1627 | a20 = a19 + m5; | ||
1628 | a21 = a19 - m5; | ||
1629 | a22 = a19 + m6; | ||
1630 | a23 = m4 + m2; | ||
1631 | a24 = m4 - m2; | ||
1632 | a25 = m4 + m1; | ||
1633 | |||
1634 | /* output to every other slot for convenience */ | ||
1635 | |||
1636 | y[ 0] = a18 + a12; | ||
1637 | y[ 2] = m0 - a25; | ||
1638 | y[ 4] = m7 - a20; | ||
1639 | y[ 6] = m3; | ||
1640 | y[ 8] = a21 - m6; | ||
1641 | y[10] = a24 - m1; | ||
1642 | y[12] = a12 - 2 * a18; | ||
1643 | y[14] = a23 + m0; | ||
1644 | y[16] = a22 + m7; | ||
1645 | } | ||
1646 | |||
1647 | static inline | ||
1648 | void sdctII(mad_fixed_t const x[18], mad_fixed_t X[18]) | ||
1649 | { | ||
1650 | mad_fixed_t tmp[9]; | ||
1651 | int i; | ||
1652 | |||
1653 | /* scale[i] = 2 * cos(PI * (2 * i + 1) / (2 * 18)) */ | ||
1654 | static mad_fixed_t const scale[9] = { | ||
1655 | MAD_F(0x1fe0d3b4), MAD_F(0x1ee8dd47), MAD_F(0x1d007930), | ||
1656 | MAD_F(0x1a367e59), MAD_F(0x16a09e66), MAD_F(0x125abcf8), | ||
1657 | MAD_F(0x0d8616bc), MAD_F(0x08483ee1), MAD_F(0x02c9fad7) | ||
1658 | }; | ||
1659 | |||
1660 | /* divide the 18-point SDCT-II into two 9-point SDCT-IIs */ | ||
1661 | |||
1662 | /* even input butterfly */ | ||
1663 | |||
1664 | for (i = 0; i < 9; i += 3) { | ||
1665 | tmp[i + 0] = x[i + 0] + x[18 - (i + 0) - 1]; | ||
1666 | tmp[i + 1] = x[i + 1] + x[18 - (i + 1) - 1]; | ||
1667 | tmp[i + 2] = x[i + 2] + x[18 - (i + 2) - 1]; | ||
1668 | } | ||
1669 | |||
1670 | fastsdct(tmp, &X[0]); | ||
1671 | |||
1672 | /* odd input butterfly and scaling */ | ||
1673 | |||
1674 | for (i = 0; i < 9; i += 3) { | ||
1675 | tmp[i + 0] = mad_f_mul(x[i + 0] - x[18 - (i + 0) - 1], scale[i + 0]); | ||
1676 | tmp[i + 1] = mad_f_mul(x[i + 1] - x[18 - (i + 1) - 1], scale[i + 1]); | ||
1677 | tmp[i + 2] = mad_f_mul(x[i + 2] - x[18 - (i + 2) - 1], scale[i + 2]); | ||
1678 | } | ||
1679 | |||
1680 | fastsdct(tmp, &X[1]); | ||
1681 | |||
1682 | /* output accumulation */ | ||
1683 | |||
1684 | for (i = 3; i < 18; i += 8) { | ||
1685 | X[i + 0] -= X[(i + 0) - 2]; | ||
1686 | X[i + 2] -= X[(i + 2) - 2]; | ||
1687 | X[i + 4] -= X[(i + 4) - 2]; | ||
1688 | X[i + 6] -= X[(i + 6) - 2]; | ||
1689 | } | ||
1690 | } | ||
1691 | |||
1692 | static inline | ||
1693 | void dctIV(mad_fixed_t const y[18], mad_fixed_t X[18]) | ||
1694 | { | ||
1695 | mad_fixed_t tmp[18]; | ||
1696 | int i; | ||
1697 | |||
1698 | /* scale[i] = 2 * cos(PI * (2 * i + 1) / (4 * 18)) */ | ||
1699 | static mad_fixed_t const scale[18] = { | ||
1700 | MAD_F(0x1ff833fa), MAD_F(0x1fb9ea93), MAD_F(0x1f3dd120), | ||
1701 | MAD_F(0x1e84d969), MAD_F(0x1d906bcf), MAD_F(0x1c62648b), | ||
1702 | MAD_F(0x1afd100f), MAD_F(0x1963268b), MAD_F(0x1797c6a4), | ||
1703 | MAD_F(0x159e6f5b), MAD_F(0x137af940), MAD_F(0x11318ef3), | ||
1704 | MAD_F(0x0ec6a507), MAD_F(0x0c3ef153), MAD_F(0x099f61c5), | ||
1705 | MAD_F(0x06ed12c5), MAD_F(0x042d4544), MAD_F(0x0165547c) | ||
1706 | }; | ||
1707 | |||
1708 | /* scaling */ | ||
1709 | |||
1710 | for (i = 0; i < 18; i += 3) { | ||
1711 | tmp[i + 0] = mad_f_mul(y[i + 0], scale[i + 0]); | ||
1712 | tmp[i + 1] = mad_f_mul(y[i + 1], scale[i + 1]); | ||
1713 | tmp[i + 2] = mad_f_mul(y[i + 2], scale[i + 2]); | ||
1714 | } | ||
1715 | |||
1716 | /* SDCT-II */ | ||
1717 | |||
1718 | sdctII(tmp, X); | ||
1719 | |||
1720 | /* scale reduction and output accumulation */ | ||
1721 | |||
1722 | X[0] /= 2; | ||
1723 | for (i = 1; i < 17; i += 4) { | ||
1724 | X[i + 0] = X[i + 0] / 2 - X[(i + 0) - 1]; | ||
1725 | X[i + 1] = X[i + 1] / 2 - X[(i + 1) - 1]; | ||
1726 | X[i + 2] = X[i + 2] / 2 - X[(i + 2) - 1]; | ||
1727 | X[i + 3] = X[i + 3] / 2 - X[(i + 3) - 1]; | ||
1728 | } | ||
1729 | X[17] = X[17] / 2 - X[16]; | ||
1730 | } | ||
1731 | |||
1732 | /* | ||
1733 | * NAME:imdct36 | ||
1734 | * DESCRIPTION:perform X[18]->x[36] IMDCT using Szu-Wei Lee's fast algorithm | ||
1735 | */ | ||
1736 | static inline | ||
1737 | void imdct36(mad_fixed_t const x[18], mad_fixed_t y[36]) | ||
1738 | { | ||
1739 | mad_fixed_t tmp[18]; | ||
1740 | int i; | ||
1741 | |||
1742 | /* DCT-IV */ | ||
1743 | |||
1744 | dctIV(x, tmp); | ||
1745 | |||
1746 | /* convert 18-point DCT-IV to 36-point IMDCT */ | ||
1747 | |||
1748 | for (i = 0; i < 9; i += 3) { | ||
1749 | y[i + 0] = tmp[9 + (i + 0)]; | ||
1750 | y[i + 1] = tmp[9 + (i + 1)]; | ||
1751 | y[i + 2] = tmp[9 + (i + 2)]; | ||
1752 | } | ||
1753 | for (i = 9; i < 27; i += 3) { | ||
1754 | y[i + 0] = -tmp[36 - (9 + (i + 0)) - 1]; | ||
1755 | y[i + 1] = -tmp[36 - (9 + (i + 1)) - 1]; | ||
1756 | y[i + 2] = -tmp[36 - (9 + (i + 2)) - 1]; | ||
1757 | } | ||
1758 | for (i = 27; i < 36; i += 3) { | ||
1759 | y[i + 0] = -tmp[(i + 0) - 27]; | ||
1760 | y[i + 1] = -tmp[(i + 1) - 27]; | ||
1761 | y[i + 2] = -tmp[(i + 2) - 27]; | ||
1762 | } | ||
1763 | } | ||
1764 | # else | ||
1578 | /* | 1765 | /* |
1579 | * NAME:imdct36 | 1766 | * NAME:imdct36 |
1580 | * DESCRIPTION:perform X[18]->x[36] IMDCT | 1767 | * DESCRIPTION:perform X[18]->x[36] IMDCT |
1581 | */ | 1768 | */ |
1582 | static inline | 1769 | static inline |
1583 | void imdct36(mad_fixed_t const X[18], mad_fixed_t x[36]) | 1770 | void imdct36(mad_fixed_t const X[18], mad_fixed_t x[36]) |
1584 | { | 1771 | { |
1585 | mad_fixed_t t0, t1, t2, t3, t4, t5, t6, t7; | 1772 | mad_fixed_t t0, t1, t2, t3, t4, t5, t6, t7; |
1586 | mad_fixed_t t8, t9, t10, t11, t12, t13, t14, t15; | 1773 | mad_fixed_t t8, t9, t10, t11, t12, t13, t14, t15; |
1587 | register mad_fixed64hi_t hi; | 1774 | register mad_fixed64hi_t hi; |
1588 | register mad_fixed64lo_t lo; | 1775 | register mad_fixed64lo_t lo; |
1589 | 1776 | ||
1590 | MAD_F_ML0(hi, lo, X[4], MAD_F(0x0ec835e8)); | 1777 | MAD_F_ML0(hi, lo, X[4], MAD_F(0x0ec835e8)); |
1591 | MAD_F_MLA(hi, lo, X[13], MAD_F(0x061f78aa)); | 1778 | MAD_F_MLA(hi, lo, X[13], MAD_F(0x061f78aa)); |
1592 | 1779 | ||
1593 | t6 = MAD_F_MLZ(hi, lo); | 1780 | t6 = MAD_F_MLZ(hi, lo); |
1594 | 1781 | ||
1595 | MAD_F_MLA(hi, lo, (t14 = X[1] - X[10]), -MAD_F(0x061f78aa)); | 1782 | MAD_F_MLA(hi, lo, (t14 = X[1] - X[10]), -MAD_F(0x061f78aa)); |
1596 | MAD_F_MLA(hi, lo, (t15 = X[7] + X[16]), -MAD_F(0x0ec835e8)); | 1783 | MAD_F_MLA(hi, lo, (t15 = X[7] + X[16]), -MAD_F(0x0ec835e8)); |
1597 | 1784 | ||
1598 | t0 = MAD_F_MLZ(hi, lo); | 1785 | t0 = MAD_F_MLZ(hi, lo); |
1599 | 1786 | ||
1600 | MAD_F_MLA(hi, lo, (t8 = X[0] - X[11] - X[12]), MAD_F(0x0216a2a2)); | 1787 | MAD_F_MLA(hi, lo, (t8 = X[0] - X[11] - X[12]), MAD_F(0x0216a2a2)); |
1601 | MAD_F_MLA(hi, lo, (t9 = X[2] - X[9] - X[14]), MAD_F(0x09bd7ca0)); | 1788 | MAD_F_MLA(hi, lo, (t9 = X[2] - X[9] - X[14]), MAD_F(0x09bd7ca0)); |
1602 | MAD_F_MLA(hi, lo, (t10 = X[3] - X[8] - X[15]), -MAD_F(0x0cb19346)); | 1789 | MAD_F_MLA(hi, lo, (t10 = X[3] - X[8] - X[15]), -MAD_F(0x0cb19346)); |
1603 | MAD_F_MLA(hi, lo, (t11 = X[5] - X[6] - X[17]), -MAD_F(0x0fdcf549)); | 1790 | MAD_F_MLA(hi, lo, (t11 = X[5] - X[6] - X[17]), -MAD_F(0x0fdcf549)); |
1604 | 1791 | ||
1605 | x[7] = MAD_F_MLZ(hi, lo); | 1792 | x[7] = MAD_F_MLZ(hi, lo); |
1606 | x[10] = -x[7]; | 1793 | x[10] = -x[7]; |
1607 | 1794 | ||
1608 | MAD_F_ML0(hi, lo, t8, -MAD_F(0x0cb19346)); | 1795 | MAD_F_ML0(hi, lo, t8, -MAD_F(0x0cb19346)); |
1609 | MAD_F_MLA(hi, lo, t9, MAD_F(0x0fdcf549)); | 1796 | MAD_F_MLA(hi, lo, t9, MAD_F(0x0fdcf549)); |
1610 | MAD_F_MLA(hi, lo, t10, MAD_F(0x0216a2a2)); | 1797 | MAD_F_MLA(hi, lo, t10, MAD_F(0x0216a2a2)); |
1611 | MAD_F_MLA(hi, lo, t11, -MAD_F(0x09bd7ca0)); | 1798 | MAD_F_MLA(hi, lo, t11, -MAD_F(0x09bd7ca0)); |
1612 | 1799 | ||
1613 | x[19] = x[34] = MAD_F_MLZ(hi, lo) - t0; | 1800 | x[19] = x[34] = MAD_F_MLZ(hi, lo) - t0; |
1614 | 1801 | ||
1615 | t12 = X[0] - X[3] + X[8] - X[11] - X[12] + X[15]; | 1802 | t12 = X[0] - X[3] + X[8] - X[11] - X[12] + X[15]; |
1616 | t13 = X[2] + X[5] - X[6] - X[9] - X[14] - X[17]; | 1803 | t13 = X[2] + X[5] - X[6] - X[9] - X[14] - X[17]; |
1617 | 1804 | ||
1618 | MAD_F_ML0(hi, lo, t12, -MAD_F(0x0ec835e8)); | 1805 | MAD_F_ML0(hi, lo, t12, -MAD_F(0x0ec835e8)); |
1619 | MAD_F_MLA(hi, lo, t13, MAD_F(0x061f78aa)); | 1806 | MAD_F_MLA(hi, lo, t13, MAD_F(0x061f78aa)); |
1620 | 1807 | ||
1621 | x[22] = x[31] = MAD_F_MLZ(hi, lo) + t0; | 1808 | x[22] = x[31] = MAD_F_MLZ(hi, lo) + t0; |
1622 | 1809 | ||
1623 | MAD_F_ML0(hi, lo, X[1], -MAD_F(0x09bd7ca0)); | 1810 | MAD_F_ML0(hi, lo, X[1], -MAD_F(0x09bd7ca0)); |
1624 | MAD_F_MLA(hi, lo, X[7], MAD_F(0x0216a2a2)); | 1811 | MAD_F_MLA(hi, lo, X[7], MAD_F(0x0216a2a2)); |
1625 | MAD_F_MLA(hi, lo, X[10], -MAD_F(0x0fdcf549)); | 1812 | MAD_F_MLA(hi, lo, X[10], -MAD_F(0x0fdcf549)); |
1626 | MAD_F_MLA(hi, lo, X[16], MAD_F(0x0cb19346)); | 1813 | MAD_F_MLA(hi, lo, X[16], MAD_F(0x0cb19346)); |
1627 | 1814 | ||
1628 | t1 = MAD_F_MLZ(hi, lo) + t6; | 1815 | t1 = MAD_F_MLZ(hi, lo) + t6; |
1629 | 1816 | ||
1630 | MAD_F_ML0(hi, lo, X[0], MAD_F(0x03768962)); | 1817 | MAD_F_ML0(hi, lo, X[0], MAD_F(0x03768962)); |
1631 | MAD_F_MLA(hi, lo, X[2], MAD_F(0x0e313245)); | 1818 | MAD_F_MLA(hi, lo, X[2], MAD_F(0x0e313245)); |
1632 | MAD_F_MLA(hi, lo, X[3], -MAD_F(0x0ffc19fd)); | 1819 | MAD_F_MLA(hi, lo, X[3], -MAD_F(0x0ffc19fd)); |
1633 | MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0acf37ad)); | 1820 | MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0acf37ad)); |
1634 | MAD_F_MLA(hi, lo, X[6], MAD_F(0x04cfb0e2)); | 1821 | MAD_F_MLA(hi, lo, X[6], MAD_F(0x04cfb0e2)); |
1635 | MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0898c779)); | 1822 | MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0898c779)); |
1636 | MAD_F_MLA(hi, lo, X[9], MAD_F(0x0d7e8807)); | 1823 | MAD_F_MLA(hi, lo, X[9], MAD_F(0x0d7e8807)); |
1637 | MAD_F_MLA(hi, lo, X[11], MAD_F(0x0f426cb5)); | 1824 | MAD_F_MLA(hi, lo, X[11], MAD_F(0x0f426cb5)); |
1638 | MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0bcbe352)); | 1825 | MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0bcbe352)); |
1639 | MAD_F_MLA(hi, lo, X[14], MAD_F(0x00b2aa3e)); | 1826 | MAD_F_MLA(hi, lo, X[14], MAD_F(0x00b2aa3e)); |
1640 | MAD_F_MLA(hi, lo, X[15], -MAD_F(0x07635284)); | 1827 | MAD_F_MLA(hi, lo, X[15], -MAD_F(0x07635284)); |
1641 | MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0f9ee890)); | 1828 | MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0f9ee890)); |
1642 | 1829 | ||
1643 | x[6] = MAD_F_MLZ(hi, lo) + t1; | 1830 | x[6] = MAD_F_MLZ(hi, lo) + t1; |
1644 | x[11] = -x[6]; | 1831 | x[11] = -x[6]; |
1645 | 1832 | ||
1646 | MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0f426cb5)); | 1833 | MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0f426cb5)); |
1647 | MAD_F_MLA(hi, lo, X[2], -MAD_F(0x00b2aa3e)); | 1834 | MAD_F_MLA(hi, lo, X[2], -MAD_F(0x00b2aa3e)); |
1648 | MAD_F_MLA(hi, lo, X[3], MAD_F(0x0898c779)); | 1835 | MAD_F_MLA(hi, lo, X[3], MAD_F(0x0898c779)); |
1649 | MAD_F_MLA(hi, lo, X[5], MAD_F(0x0f9ee890)); | 1836 | MAD_F_MLA(hi, lo, X[5], MAD_F(0x0f9ee890)); |
1650 | MAD_F_MLA(hi, lo, X[6], MAD_F(0x0acf37ad)); | 1837 | MAD_F_MLA(hi, lo, X[6], MAD_F(0x0acf37ad)); |
1651 | MAD_F_MLA(hi, lo, X[8], -MAD_F(0x07635284)); | 1838 | MAD_F_MLA(hi, lo, X[8], -MAD_F(0x07635284)); |
1652 | MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0e313245)); | 1839 | MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0e313245)); |
1653 | MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0bcbe352)); | 1840 | MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0bcbe352)); |
1654 | MAD_F_MLA(hi, lo, X[12], -MAD_F(0x03768962)); | 1841 | MAD_F_MLA(hi, lo, X[12], -MAD_F(0x03768962)); |
1655 | MAD_F_MLA(hi, lo, X[14], MAD_F(0x0d7e8807)); | 1842 | MAD_F_MLA(hi, lo, X[14], MAD_F(0x0d7e8807)); |
1656 | MAD_F_MLA(hi, lo, X[15], MAD_F(0x0ffc19fd)); | 1843 | MAD_F_MLA(hi, lo, X[15], MAD_F(0x0ffc19fd)); |
1657 | MAD_F_MLA(hi, lo, X[17], MAD_F(0x04cfb0e2)); | 1844 | MAD_F_MLA(hi, lo, X[17], MAD_F(0x04cfb0e2)); |
1658 | 1845 | ||
1659 | x[23] = x[30] = MAD_F_MLZ(hi, lo) + t1; | 1846 | x[23] = x[30] = MAD_F_MLZ(hi, lo) + t1; |
1660 | 1847 | ||
1661 | MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0bcbe352)); | 1848 | MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0bcbe352)); |
1662 | MAD_F_MLA(hi, lo, X[2], MAD_F(0x0d7e8807)); | 1849 | MAD_F_MLA(hi, lo, X[2], MAD_F(0x0d7e8807)); |
1663 | MAD_F_MLA(hi, lo, X[3], -MAD_F(0x07635284)); | 1850 | MAD_F_MLA(hi, lo, X[3], -MAD_F(0x07635284)); |
1664 | MAD_F_MLA(hi, lo, X[5], MAD_F(0x04cfb0e2)); | 1851 | MAD_F_MLA(hi, lo, X[5], MAD_F(0x04cfb0e2)); |
1665 | MAD_F_MLA(hi, lo, X[6], MAD_F(0x0f9ee890)); | 1852 | MAD_F_MLA(hi, lo, X[6], MAD_F(0x0f9ee890)); |
1666 | MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0ffc19fd)); | 1853 | MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0ffc19fd)); |
1667 | MAD_F_MLA(hi, lo, X[9], -MAD_F(0x00b2aa3e)); | 1854 | MAD_F_MLA(hi, lo, X[9], -MAD_F(0x00b2aa3e)); |
1668 | MAD_F_MLA(hi, lo, X[11], MAD_F(0x03768962)); | 1855 | MAD_F_MLA(hi, lo, X[11], MAD_F(0x03768962)); |
1669 | MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0f426cb5)); | 1856 | MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0f426cb5)); |
1670 | MAD_F_MLA(hi, lo, X[14], MAD_F(0x0e313245)); | 1857 | MAD_F_MLA(hi, lo, X[14], MAD_F(0x0e313245)); |
1671 | MAD_F_MLA(hi, lo, X[15], MAD_F(0x0898c779)); | 1858 | MAD_F_MLA(hi, lo, X[15], MAD_F(0x0898c779)); |
1672 | MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0acf37ad)); | 1859 | MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0acf37ad)); |
1673 | 1860 | ||
1674 | x[18] = x[35] = MAD_F_MLZ(hi, lo) - t1; | 1861 | x[18] = x[35] = MAD_F_MLZ(hi, lo) - t1; |
1675 | 1862 | ||
1676 | MAD_F_ML0(hi, lo, X[4], MAD_F(0x061f78aa)); | 1863 | MAD_F_ML0(hi, lo, X[4], MAD_F(0x061f78aa)); |
1677 | MAD_F_MLA(hi, lo, X[13], -MAD_F(0x0ec835e8)); | 1864 | MAD_F_MLA(hi, lo, X[13], -MAD_F(0x0ec835e8)); |
1678 | 1865 | ||
1679 | t7 = MAD_F_MLZ(hi, lo); | 1866 | t7 = MAD_F_MLZ(hi, lo); |
1680 | 1867 | ||
1681 | MAD_F_MLA(hi, lo, X[1], -MAD_F(0x0cb19346)); | 1868 | MAD_F_MLA(hi, lo, X[1], -MAD_F(0x0cb19346)); |
1682 | MAD_F_MLA(hi, lo, X[7], MAD_F(0x0fdcf549)); | 1869 | MAD_F_MLA(hi, lo, X[7], MAD_F(0x0fdcf549)); |
1683 | MAD_F_MLA(hi, lo, X[10], MAD_F(0x0216a2a2)); | 1870 | MAD_F_MLA(hi, lo, X[10], MAD_F(0x0216a2a2)); |
1684 | MAD_F_MLA(hi, lo, X[16], -MAD_F(0x09bd7ca0)); | 1871 | MAD_F_MLA(hi, lo, X[16], -MAD_F(0x09bd7ca0)); |
1685 | 1872 | ||
1686 | t2 = MAD_F_MLZ(hi, lo); | 1873 | t2 = MAD_F_MLZ(hi, lo); |
1687 | 1874 | ||
1688 | MAD_F_MLA(hi, lo, X[0], MAD_F(0x04cfb0e2)); | 1875 | MAD_F_MLA(hi, lo, X[0], MAD_F(0x04cfb0e2)); |
1689 | MAD_F_MLA(hi, lo, X[2], MAD_F(0x0ffc19fd)); | 1876 | MAD_F_MLA(hi, lo, X[2], MAD_F(0x0ffc19fd)); |
1690 | MAD_F_MLA(hi, lo, X[3], -MAD_F(0x0d7e8807)); | 1877 | MAD_F_MLA(hi, lo, X[3], -MAD_F(0x0d7e8807)); |
1691 | MAD_F_MLA(hi, lo, X[5], MAD_F(0x03768962)); | 1878 | MAD_F_MLA(hi, lo, X[5], MAD_F(0x03768962)); |
1692 | MAD_F_MLA(hi, lo, X[6], -MAD_F(0x0bcbe352)); | 1879 | MAD_F_MLA(hi, lo, X[6], -MAD_F(0x0bcbe352)); |
1693 | MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0e313245)); | 1880 | MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0e313245)); |
1694 | MAD_F_MLA(hi, lo, X[9], MAD_F(0x07635284)); | 1881 | MAD_F_MLA(hi, lo, X[9], MAD_F(0x07635284)); |
1695 | MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0acf37ad)); | 1882 | MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0acf37ad)); |
1696 | MAD_F_MLA(hi, lo, X[12], MAD_F(0x0f9ee890)); | 1883 | MAD_F_MLA(hi, lo, X[12], MAD_F(0x0f9ee890)); |
1697 | MAD_F_MLA(hi, lo, X[14], MAD_F(0x0898c779)); | 1884 | MAD_F_MLA(hi, lo, X[14], MAD_F(0x0898c779)); |
1698 | MAD_F_MLA(hi, lo, X[15], MAD_F(0x00b2aa3e)); | 1885 | MAD_F_MLA(hi, lo, X[15], MAD_F(0x00b2aa3e)); |
1699 | MAD_F_MLA(hi, lo, X[17], MAD_F(0x0f426cb5)); | 1886 | MAD_F_MLA(hi, lo, X[17], MAD_F(0x0f426cb5)); |
1700 | 1887 | ||
1701 | x[5] = MAD_F_MLZ(hi, lo); | 1888 | x[5] = MAD_F_MLZ(hi, lo); |
1702 | x[12] = -x[5]; | 1889 | x[12] = -x[5]; |
1703 | 1890 | ||
1704 | MAD_F_ML0(hi, lo, X[0], MAD_F(0x0acf37ad)); | 1891 | MAD_F_ML0(hi, lo, X[0], MAD_F(0x0acf37ad)); |
1705 | MAD_F_MLA(hi, lo, X[2], -MAD_F(0x0898c779)); | 1892 | MAD_F_MLA(hi, lo, X[2], -MAD_F(0x0898c779)); |
@@ -1740,458 +1927,467 @@ void imdct36(mad_fixed_t const X[18], mad_fixed_t x[36]) | |||
1740 | t3 = MAD_F_MLZ(hi, lo) + t7; | 1927 | t3 = MAD_F_MLZ(hi, lo) + t7; |
1741 | 1928 | ||
1742 | MAD_F_ML0(hi, lo, X[0], MAD_F(0x00b2aa3e)); | 1929 | MAD_F_ML0(hi, lo, X[0], MAD_F(0x00b2aa3e)); |
1743 | MAD_F_MLA(hi, lo, X[2], MAD_F(0x03768962)); | 1930 | MAD_F_MLA(hi, lo, X[2], MAD_F(0x03768962)); |
1744 | MAD_F_MLA(hi, lo, X[3], -MAD_F(0x04cfb0e2)); | 1931 | MAD_F_MLA(hi, lo, X[3], -MAD_F(0x04cfb0e2)); |
1745 | MAD_F_MLA(hi, lo, X[5], -MAD_F(0x07635284)); | 1932 | MAD_F_MLA(hi, lo, X[5], -MAD_F(0x07635284)); |
1746 | MAD_F_MLA(hi, lo, X[6], MAD_F(0x0898c779)); | 1933 | MAD_F_MLA(hi, lo, X[6], MAD_F(0x0898c779)); |
1747 | MAD_F_MLA(hi, lo, X[8], MAD_F(0x0acf37ad)); | 1934 | MAD_F_MLA(hi, lo, X[8], MAD_F(0x0acf37ad)); |
1748 | MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0bcbe352)); | 1935 | MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0bcbe352)); |
1749 | MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0d7e8807)); | 1936 | MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0d7e8807)); |
1750 | MAD_F_MLA(hi, lo, X[12], MAD_F(0x0e313245)); | 1937 | MAD_F_MLA(hi, lo, X[12], MAD_F(0x0e313245)); |
1751 | MAD_F_MLA(hi, lo, X[14], MAD_F(0x0f426cb5)); | 1938 | MAD_F_MLA(hi, lo, X[14], MAD_F(0x0f426cb5)); |
1752 | MAD_F_MLA(hi, lo, X[15], -MAD_F(0x0f9ee890)); | 1939 | MAD_F_MLA(hi, lo, X[15], -MAD_F(0x0f9ee890)); |
1753 | MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0ffc19fd)); | 1940 | MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0ffc19fd)); |
1754 | 1941 | ||
1755 | x[8] = MAD_F_MLZ(hi, lo) + t3; | 1942 | x[8] = MAD_F_MLZ(hi, lo) + t3; |
1756 | x[9] = -x[8]; | 1943 | x[9] = -x[8]; |
1757 | 1944 | ||
1758 | MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0e313245)); | 1945 | MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0e313245)); |
1759 | MAD_F_MLA(hi, lo, X[2], MAD_F(0x0bcbe352)); | 1946 | MAD_F_MLA(hi, lo, X[2], MAD_F(0x0bcbe352)); |
1760 | MAD_F_MLA(hi, lo, X[3], MAD_F(0x0f9ee890)); | 1947 | MAD_F_MLA(hi, lo, X[3], MAD_F(0x0f9ee890)); |
1761 | MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0898c779)); | 1948 | MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0898c779)); |
1762 | MAD_F_MLA(hi, lo, X[6], -MAD_F(0x0ffc19fd)); | 1949 | MAD_F_MLA(hi, lo, X[6], -MAD_F(0x0ffc19fd)); |
1763 | MAD_F_MLA(hi, lo, X[8], MAD_F(0x04cfb0e2)); | 1950 | MAD_F_MLA(hi, lo, X[8], MAD_F(0x04cfb0e2)); |
1764 | MAD_F_MLA(hi, lo, X[9], MAD_F(0x0f426cb5)); | 1951 | MAD_F_MLA(hi, lo, X[9], MAD_F(0x0f426cb5)); |
1765 | MAD_F_MLA(hi, lo, X[11], -MAD_F(0x00b2aa3e)); | 1952 | MAD_F_MLA(hi, lo, X[11], -MAD_F(0x00b2aa3e)); |
1766 | MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0d7e8807)); | 1953 | MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0d7e8807)); |
1767 | MAD_F_MLA(hi, lo, X[14], -MAD_F(0x03768962)); | 1954 | MAD_F_MLA(hi, lo, X[14], -MAD_F(0x03768962)); |
1768 | MAD_F_MLA(hi, lo, X[15], MAD_F(0x0acf37ad)); | 1955 | MAD_F_MLA(hi, lo, X[15], MAD_F(0x0acf37ad)); |
1769 | MAD_F_MLA(hi, lo, X[17], MAD_F(0x07635284)); | 1956 | MAD_F_MLA(hi, lo, X[17], MAD_F(0x07635284)); |
1770 | 1957 | ||
1771 | x[21] = x[32] = MAD_F_MLZ(hi, lo) + t3; | 1958 | x[21] = x[32] = MAD_F_MLZ(hi, lo) + t3; |
1772 | 1959 | ||
1773 | MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0d7e8807)); | 1960 | MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0d7e8807)); |
1774 | MAD_F_MLA(hi, lo, X[2], MAD_F(0x0f426cb5)); | 1961 | MAD_F_MLA(hi, lo, X[2], MAD_F(0x0f426cb5)); |
1775 | MAD_F_MLA(hi, lo, X[3], MAD_F(0x0acf37ad)); | 1962 | MAD_F_MLA(hi, lo, X[3], MAD_F(0x0acf37ad)); |
1776 | MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0ffc19fd)); | 1963 | MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0ffc19fd)); |
1777 | MAD_F_MLA(hi, lo, X[6], -MAD_F(0x07635284)); | 1964 | MAD_F_MLA(hi, lo, X[6], -MAD_F(0x07635284)); |
1778 | MAD_F_MLA(hi, lo, X[8], MAD_F(0x0f9ee890)); | 1965 | MAD_F_MLA(hi, lo, X[8], MAD_F(0x0f9ee890)); |
1779 | MAD_F_MLA(hi, lo, X[9], MAD_F(0x03768962)); | 1966 | MAD_F_MLA(hi, lo, X[9], MAD_F(0x03768962)); |
1780 | MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0e313245)); | 1967 | MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0e313245)); |
1781 | MAD_F_MLA(hi, lo, X[12], MAD_F(0x00b2aa3e)); | 1968 | MAD_F_MLA(hi, lo, X[12], MAD_F(0x00b2aa3e)); |
1782 | MAD_F_MLA(hi, lo, X[14], MAD_F(0x0bcbe352)); | 1969 | MAD_F_MLA(hi, lo, X[14], MAD_F(0x0bcbe352)); |
1783 | MAD_F_MLA(hi, lo, X[15], -MAD_F(0x04cfb0e2)); | 1970 | MAD_F_MLA(hi, lo, X[15], -MAD_F(0x04cfb0e2)); |
1784 | MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0898c779)); | 1971 | MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0898c779)); |
1785 | 1972 | ||
1786 | x[20] = x[33] = MAD_F_MLZ(hi, lo) - t3; | 1973 | x[20] = x[33] = MAD_F_MLZ(hi, lo) - t3; |
1787 | 1974 | ||
1788 | MAD_F_ML0(hi, lo, t14, -MAD_F(0x0ec835e8)); | 1975 | MAD_F_ML0(hi, lo, t14, -MAD_F(0x0ec835e8)); |
1789 | MAD_F_MLA(hi, lo, t15, MAD_F(0x061f78aa)); | 1976 | MAD_F_MLA(hi, lo, t15, MAD_F(0x061f78aa)); |
1790 | 1977 | ||
1791 | t4 = MAD_F_MLZ(hi, lo) - t7; | 1978 | t4 = MAD_F_MLZ(hi, lo) - t7; |
1792 | 1979 | ||
1793 | MAD_F_ML0(hi, lo, t12, MAD_F(0x061f78aa)); | 1980 | MAD_F_ML0(hi, lo, t12, MAD_F(0x061f78aa)); |
1794 | MAD_F_MLA(hi, lo, t13, MAD_F(0x0ec835e8)); | 1981 | MAD_F_MLA(hi, lo, t13, MAD_F(0x0ec835e8)); |
1795 | 1982 | ||
1796 | x[4] = MAD_F_MLZ(hi, lo) + t4; | 1983 | x[4] = MAD_F_MLZ(hi, lo) + t4; |
1797 | x[13] = -x[4]; | 1984 | x[13] = -x[4]; |
1798 | 1985 | ||
1799 | MAD_F_ML0(hi, lo, t8, MAD_F(0x09bd7ca0)); | 1986 | MAD_F_ML0(hi, lo, t8, MAD_F(0x09bd7ca0)); |
1800 | MAD_F_MLA(hi, lo, t9, -MAD_F(0x0216a2a2)); | 1987 | MAD_F_MLA(hi, lo, t9, -MAD_F(0x0216a2a2)); |
1801 | MAD_F_MLA(hi, lo, t10, MAD_F(0x0fdcf549)); | 1988 | MAD_F_MLA(hi, lo, t10, MAD_F(0x0fdcf549)); |
1802 | MAD_F_MLA(hi, lo, t11, -MAD_F(0x0cb19346)); | 1989 | MAD_F_MLA(hi, lo, t11, -MAD_F(0x0cb19346)); |
1803 | 1990 | ||
1804 | x[1] = MAD_F_MLZ(hi, lo) + t4; | 1991 | x[1] = MAD_F_MLZ(hi, lo) + t4; |
1805 | x[16] = -x[1]; | 1992 | x[16] = -x[1]; |
1806 | 1993 | ||
1807 | MAD_F_ML0(hi, lo, t8, -MAD_F(0x0fdcf549)); | 1994 | MAD_F_ML0(hi, lo, t8, -MAD_F(0x0fdcf549)); |
1808 | MAD_F_MLA(hi, lo, t9, -MAD_F(0x0cb19346)); | 1995 | MAD_F_MLA(hi, lo, t9, -MAD_F(0x0cb19346)); |
1809 | MAD_F_MLA(hi, lo, t10, -MAD_F(0x09bd7ca0)); | 1996 | MAD_F_MLA(hi, lo, t10, -MAD_F(0x09bd7ca0)); |
1810 | MAD_F_MLA(hi, lo, t11, -MAD_F(0x0216a2a2)); | 1997 | MAD_F_MLA(hi, lo, t11, -MAD_F(0x0216a2a2)); |
1811 | 1998 | ||
1812 | x[25] = x[28] = MAD_F_MLZ(hi, lo) + t4; | 1999 | x[25] = x[28] = MAD_F_MLZ(hi, lo) + t4; |
1813 | 2000 | ||
1814 | MAD_F_ML0(hi, lo, X[1], -MAD_F(0x0fdcf549)); | 2001 | MAD_F_ML0(hi, lo, X[1], -MAD_F(0x0fdcf549)); |
1815 | MAD_F_MLA(hi, lo, X[7], -MAD_F(0x0cb19346)); | 2002 | MAD_F_MLA(hi, lo, X[7], -MAD_F(0x0cb19346)); |
1816 | MAD_F_MLA(hi, lo, X[10], -MAD_F(0x09bd7ca0)); | 2003 | MAD_F_MLA(hi, lo, X[10], -MAD_F(0x09bd7ca0)); |
1817 | MAD_F_MLA(hi, lo, X[16], -MAD_F(0x0216a2a2)); | 2004 | MAD_F_MLA(hi, lo, X[16], -MAD_F(0x0216a2a2)); |
1818 | 2005 | ||
1819 | t5 = MAD_F_MLZ(hi, lo) - t6; | 2006 | t5 = MAD_F_MLZ(hi, lo) - t6; |
1820 | 2007 | ||
1821 | MAD_F_ML0(hi, lo, X[0], MAD_F(0x0898c779)); | 2008 | MAD_F_ML0(hi, lo, X[0], MAD_F(0x0898c779)); |
1822 | MAD_F_MLA(hi, lo, X[2], MAD_F(0x04cfb0e2)); | 2009 | MAD_F_MLA(hi, lo, X[2], MAD_F(0x04cfb0e2)); |
1823 | MAD_F_MLA(hi, lo, X[3], MAD_F(0x0bcbe352)); | 2010 | MAD_F_MLA(hi, lo, X[3], MAD_F(0x0bcbe352)); |
1824 | MAD_F_MLA(hi, lo, X[5], MAD_F(0x00b2aa3e)); | 2011 | MAD_F_MLA(hi, lo, X[5], MAD_F(0x00b2aa3e)); |
1825 | MAD_F_MLA(hi, lo, X[6], MAD_F(0x0e313245)); | 2012 | MAD_F_MLA(hi, lo, X[6], MAD_F(0x0e313245)); |
1826 | MAD_F_MLA(hi, lo, X[8], -MAD_F(0x03768962)); | 2013 | MAD_F_MLA(hi, lo, X[8], -MAD_F(0x03768962)); |
1827 | MAD_F_MLA(hi, lo, X[9], MAD_F(0x0f9ee890)); | 2014 | MAD_F_MLA(hi, lo, X[9], MAD_F(0x0f9ee890)); |
1828 | MAD_F_MLA(hi, lo, X[11], -MAD_F(0x07635284)); | 2015 | MAD_F_MLA(hi, lo, X[11], -MAD_F(0x07635284)); |
1829 | MAD_F_MLA(hi, lo, X[12], MAD_F(0x0ffc19fd)); | 2016 | MAD_F_MLA(hi, lo, X[12], MAD_F(0x0ffc19fd)); |
1830 | MAD_F_MLA(hi, lo, X[14], -MAD_F(0x0acf37ad)); | 2017 | MAD_F_MLA(hi, lo, X[14], -MAD_F(0x0acf37ad)); |
1831 | MAD_F_MLA(hi, lo, X[15], MAD_F(0x0f426cb5)); | 2018 | MAD_F_MLA(hi, lo, X[15], MAD_F(0x0f426cb5)); |
1832 | MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0d7e8807)); | 2019 | MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0d7e8807)); |
1833 | 2020 | ||
1834 | x[2] = MAD_F_MLZ(hi, lo) + t5; | 2021 | x[2] = MAD_F_MLZ(hi, lo) + t5; |
1835 | x[15] = -x[2]; | 2022 | x[15] = -x[2]; |
1836 | 2023 | ||
1837 | MAD_F_ML0(hi, lo, X[0], MAD_F(0x07635284)); | 2024 | MAD_F_ML0(hi, lo, X[0], MAD_F(0x07635284)); |
1838 | MAD_F_MLA(hi, lo, X[2], MAD_F(0x0acf37ad)); | 2025 | MAD_F_MLA(hi, lo, X[2], MAD_F(0x0acf37ad)); |
1839 | MAD_F_MLA(hi, lo, X[3], MAD_F(0x03768962)); | 2026 | MAD_F_MLA(hi, lo, X[3], MAD_F(0x03768962)); |
1840 | MAD_F_MLA(hi, lo, X[5], MAD_F(0x0d7e8807)); | 2027 | MAD_F_MLA(hi, lo, X[5], MAD_F(0x0d7e8807)); |
1841 | MAD_F_MLA(hi, lo, X[6], -MAD_F(0x00b2aa3e)); | 2028 | MAD_F_MLA(hi, lo, X[6], -MAD_F(0x00b2aa3e)); |
1842 | MAD_F_MLA(hi, lo, X[8], MAD_F(0x0f426cb5)); | 2029 | MAD_F_MLA(hi, lo, X[8], MAD_F(0x0f426cb5)); |
1843 | MAD_F_MLA(hi, lo, X[9], -MAD_F(0x04cfb0e2)); | 2030 | MAD_F_MLA(hi, lo, X[9], -MAD_F(0x04cfb0e2)); |
1844 | MAD_F_MLA(hi, lo, X[11], MAD_F(0x0ffc19fd)); | 2031 | MAD_F_MLA(hi, lo, X[11], MAD_F(0x0ffc19fd)); |
1845 | MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0898c779)); | 2032 | MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0898c779)); |
1846 | MAD_F_MLA(hi, lo, X[14], MAD_F(0x0f9ee890)); | 2033 | MAD_F_MLA(hi, lo, X[14], MAD_F(0x0f9ee890)); |
1847 | MAD_F_MLA(hi, lo, X[15], -MAD_F(0x0bcbe352)); | 2034 | MAD_F_MLA(hi, lo, X[15], -MAD_F(0x0bcbe352)); |
1848 | MAD_F_MLA(hi, lo, X[17], MAD_F(0x0e313245)); | 2035 | MAD_F_MLA(hi, lo, X[17], MAD_F(0x0e313245)); |
1849 | 2036 | ||
1850 | x[3] = MAD_F_MLZ(hi, lo) + t5; | 2037 | x[3] = MAD_F_MLZ(hi, lo) + t5; |
1851 | x[14] = -x[3]; | 2038 | x[14] = -x[3]; |
1852 | 2039 | ||
1853 | MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0ffc19fd)); | 2040 | MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0ffc19fd)); |
1854 | MAD_F_MLA(hi, lo, X[2], -MAD_F(0x0f9ee890)); | 2041 | MAD_F_MLA(hi, lo, X[2], -MAD_F(0x0f9ee890)); |
1855 | MAD_F_MLA(hi, lo, X[3], -MAD_F(0x0f426cb5)); | 2042 | MAD_F_MLA(hi, lo, X[3], -MAD_F(0x0f426cb5)); |
1856 | MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0e313245)); | 2043 | MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0e313245)); |
1857 | MAD_F_MLA(hi, lo, X[6], -MAD_F(0x0d7e8807)); | 2044 | MAD_F_MLA(hi, lo, X[6], -MAD_F(0x0d7e8807)); |
1858 | MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0bcbe352)); | 2045 | MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0bcbe352)); |
1859 | MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0acf37ad)); | 2046 | MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0acf37ad)); |
1860 | MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0898c779)); | 2047 | MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0898c779)); |
1861 | MAD_F_MLA(hi, lo, X[12], -MAD_F(0x07635284)); | 2048 | MAD_F_MLA(hi, lo, X[12], -MAD_F(0x07635284)); |
1862 | MAD_F_MLA(hi, lo, X[14], -MAD_F(0x04cfb0e2)); | 2049 | MAD_F_MLA(hi, lo, X[14], -MAD_F(0x04cfb0e2)); |
1863 | MAD_F_MLA(hi, lo, X[15], -MAD_F(0x03768962)); | 2050 | MAD_F_MLA(hi, lo, X[15], -MAD_F(0x03768962)); |
1864 | MAD_F_MLA(hi, lo, X[17], -MAD_F(0x00b2aa3e)); | 2051 | MAD_F_MLA(hi, lo, X[17], -MAD_F(0x00b2aa3e)); |
1865 | 2052 | ||
1866 | x[26] = x[27] = MAD_F_MLZ(hi, lo) + t5; | 2053 | x[26] = x[27] = MAD_F_MLZ(hi, lo) + t5; |
1867 | } | 2054 | } |
2055 | # endif | ||
1868 | 2056 | ||
1869 | /* | 2057 | /* |
1870 | * NAME:III_imdct_l() | 2058 | * NAME:III_imdct_l() |
1871 | * DESCRIPTION:perform IMDCT and windowing for long blocks | 2059 | * DESCRIPTION:perform IMDCT and windowing for long blocks |
1872 | */ | 2060 | */ |
1873 | static | 2061 | static |
1874 | void III_imdct_l(mad_fixed_t const X[18], mad_fixed_t z[36], | 2062 | void III_imdct_l(mad_fixed_t const X[18], mad_fixed_t z[36], |
1875 | unsigned int block_type) | 2063 | unsigned int block_type) |
1876 | { | 2064 | { |
1877 | unsigned int i; | 2065 | unsigned int i; |
1878 | 2066 | ||
1879 | /* IMDCT */ | 2067 | /* IMDCT */ |
1880 | 2068 | ||
1881 | imdct36(X, z); | 2069 | imdct36(X, z); |
1882 | 2070 | ||
1883 | /* windowing */ | 2071 | /* windowing */ |
1884 | 2072 | ||
1885 | switch (block_type) { | 2073 | switch (block_type) { |
1886 | case 0: /* normal window */ | 2074 | case 0: /* normal window */ |
1887 | # if defined(ASO_INTERLEAVE1) | 2075 | # if defined(ASO_INTERLEAVE1) |
1888 | { | 2076 | { |
1889 | register mad_fixed_t tmp1, tmp2; | 2077 | register mad_fixed_t tmp1, tmp2; |
1890 | 2078 | ||
1891 | tmp1 = window_l[0]; | 2079 | tmp1 = window_l[0]; |
1892 | tmp2 = window_l[1]; | 2080 | tmp2 = window_l[1]; |
1893 | 2081 | ||
1894 | for (i = 0; i < 34; i += 2) { | 2082 | for (i = 0; i < 34; i += 2) { |
1895 | z[i + 0] = mad_f_mul(z[i + 0], tmp1); | 2083 | z[i + 0] = mad_f_mul(z[i + 0], tmp1); |
1896 | tmp1 = window_l[i + 2]; | 2084 | tmp1 = window_l[i + 2]; |
1897 | z[i + 1] = mad_f_mul(z[i + 1], tmp2); | 2085 | z[i + 1] = mad_f_mul(z[i + 1], tmp2); |
1898 | tmp2 = window_l[i + 3]; | 2086 | tmp2 = window_l[i + 3]; |
1899 | } | 2087 | } |
1900 | 2088 | ||
1901 | z[34] = mad_f_mul(z[34], tmp1); | 2089 | z[34] = mad_f_mul(z[34], tmp1); |
1902 | z[35] = mad_f_mul(z[35], tmp2); | 2090 | z[35] = mad_f_mul(z[35], tmp2); |
1903 | } | 2091 | } |
1904 | # elif defined(ASO_INTERLEAVE2) | 2092 | # elif defined(ASO_INTERLEAVE2) |
1905 | { | 2093 | { |
1906 | register mad_fixed_t tmp1, tmp2; | 2094 | register mad_fixed_t tmp1, tmp2; |
1907 | 2095 | ||
1908 | tmp1 = z[0]; | 2096 | tmp1 = z[0]; |
1909 | tmp2 = window_l[0]; | 2097 | tmp2 = window_l[0]; |
1910 | 2098 | ||
1911 | for (i = 0; i < 35; ++i) { | 2099 | for (i = 0; i < 35; ++i) { |
1912 | z[i] = mad_f_mul(tmp1, tmp2); | 2100 | z[i] = mad_f_mul(tmp1, tmp2); |
1913 | tmp1 = z[i + 1]; | 2101 | tmp1 = z[i + 1]; |
1914 | tmp2 = window_l[i + 1]; | 2102 | tmp2 = window_l[i + 1]; |
1915 | } | 2103 | } |
1916 | 2104 | ||
1917 | z[35] = mad_f_mul(tmp1, tmp2); | 2105 | z[35] = mad_f_mul(tmp1, tmp2); |
1918 | } | 2106 | } |
1919 | # elif 1 | 2107 | # elif 1 |
1920 | for (i = 0; i < 36; i += 4) { | 2108 | for (i = 0; i < 36; i += 4) { |
1921 | z[i + 0] = mad_f_mul(z[i + 0], window_l[i + 0]); | 2109 | z[i + 0] = mad_f_mul(z[i + 0], window_l[i + 0]); |
1922 | z[i + 1] = mad_f_mul(z[i + 1], window_l[i + 1]); | 2110 | z[i + 1] = mad_f_mul(z[i + 1], window_l[i + 1]); |
1923 | z[i + 2] = mad_f_mul(z[i + 2], window_l[i + 2]); | 2111 | z[i + 2] = mad_f_mul(z[i + 2], window_l[i + 2]); |
1924 | z[i + 3] = mad_f_mul(z[i + 3], window_l[i + 3]); | 2112 | z[i + 3] = mad_f_mul(z[i + 3], window_l[i + 3]); |
1925 | } | 2113 | } |
1926 | # else | 2114 | # else |
1927 | for (i = 0; i < 36; ++i) z[i] = mad_f_mul(z[i], window_l[i]); | 2115 | for (i = 0; i < 36; ++i) z[i] = mad_f_mul(z[i], window_l[i]); |
1928 | # endif | 2116 | # endif |
1929 | break; | 2117 | break; |
1930 | 2118 | ||
1931 | case 1: /* start block */ | 2119 | case 1: /* start block */ |
1932 | for (i = 0; i < 18; ++i) z[i] = mad_f_mul(z[i], window_l[i]); | 2120 | for (i = 0; i < 18; i += 3) { |
2121 | z[i + 0] = mad_f_mul(z[i + 0], window_l[i + 0]); | ||
2122 | z[i + 1] = mad_f_mul(z[i + 1], window_l[i + 1]); | ||
2123 | z[i + 2] = mad_f_mul(z[i + 2], window_l[i + 2]); | ||
2124 | } | ||
1933 | /* (i = 18; i < 24; ++i) z[i] unchanged */ | 2125 | /* (i = 18; i < 24; ++i) z[i] unchanged */ |
1934 | for (i = 24; i < 30; ++i) z[i] = mad_f_mul(z[i], window_s[i - 18]); | 2126 | for (i = 24; i < 30; ++i) z[i] = mad_f_mul(z[i], window_s[i - 18]); |
1935 | for (i = 30; i < 36; ++i) z[i] = 0; | 2127 | for (i = 30; i < 36; ++i) z[i] = 0; |
1936 | break; | 2128 | break; |
1937 | 2129 | ||
1938 | case 3: /* stop block */ | 2130 | case 3: /* stop block */ |
1939 | for (i = 0; i < 6; ++i) z[i] = 0; | 2131 | for (i = 0; i < 6; ++i) z[i] = 0; |
1940 | for (i = 6; i < 12; ++i) z[i] = mad_f_mul(z[i], window_s[i - 6]); | 2132 | for (i = 6; i < 12; ++i) z[i] = mad_f_mul(z[i], window_s[i - 6]); |
1941 | /* (i = 12; i < 18; ++i) z[i] unchanged */ | 2133 | /* (i = 12; i < 18; ++i) z[i] unchanged */ |
1942 | for (i = 18; i < 36; ++i) z[i] = mad_f_mul(z[i], window_l[i]); | 2134 | for (i = 18; i < 36; i += 3) { |
2135 | z[i + 0] = mad_f_mul(z[i + 0], window_l[i + 0]); | ||
2136 | z[i + 1] = mad_f_mul(z[i + 1], window_l[i + 1]); | ||
2137 | z[i + 2] = mad_f_mul(z[i + 2], window_l[i + 2]); | ||
2138 | } | ||
1943 | break; | 2139 | break; |
1944 | } | 2140 | } |
1945 | } | 2141 | } |
1946 | # endif /* ASO_IMDCT */ | 2142 | # endif /* ASO_IMDCT */ |
1947 | 2143 | ||
1948 | /* | 2144 | /* |
1949 | * NAME:III_imdct_s() | 2145 | * NAME:III_imdct_s() |
1950 | * DESCRIPTION:perform IMDCT and windowing for short blocks | 2146 | * DESCRIPTION:perform IMDCT and windowing for short blocks |
1951 | */ | 2147 | */ |
1952 | static | 2148 | static |
1953 | void III_imdct_s(mad_fixed_t const X[18], mad_fixed_t z[36]) | 2149 | void III_imdct_s(mad_fixed_t const X[18], mad_fixed_t z[36]) |
1954 | { | 2150 | { |
1955 | mad_fixed_t y[36], *yptr; | 2151 | mad_fixed_t y[36], *yptr; |
1956 | mad_fixed_t const *wptr; | 2152 | mad_fixed_t const *wptr; |
1957 | int w, i; | 2153 | int w, i; |
1958 | register mad_fixed64hi_t hi; | 2154 | register mad_fixed64hi_t hi; |
1959 | register mad_fixed64lo_t lo; | 2155 | register mad_fixed64lo_t lo; |
1960 | 2156 | ||
1961 | /* IMDCT */ | 2157 | /* IMDCT */ |
1962 | 2158 | ||
1963 | yptr = &y[0]; | 2159 | yptr = &y[0]; |
1964 | 2160 | ||
1965 | for (w = 0; w < 3; ++w) { | 2161 | for (w = 0; w < 3; ++w) { |
1966 | register mad_fixed_t const (*s)[6]; | 2162 | register mad_fixed_t const (*s)[6]; |
1967 | 2163 | ||
1968 | s = imdct_s; | 2164 | s = imdct_s; |
1969 | 2165 | ||
1970 | for (i = 0; i < 3; ++i) { | 2166 | for (i = 0; i < 3; ++i) { |
1971 | MAD_F_ML0(hi, lo, X[0], (*s)[0]); | 2167 | MAD_F_ML0(hi, lo, X[0], (*s)[0]); |
1972 | MAD_F_MLA(hi, lo, X[1], (*s)[1]); | 2168 | MAD_F_MLA(hi, lo, X[1], (*s)[1]); |
1973 | MAD_F_MLA(hi, lo, X[2], (*s)[2]); | 2169 | MAD_F_MLA(hi, lo, X[2], (*s)[2]); |
1974 | MAD_F_MLA(hi, lo, X[3], (*s)[3]); | 2170 | MAD_F_MLA(hi, lo, X[3], (*s)[3]); |
1975 | MAD_F_MLA(hi, lo, X[4], (*s)[4]); | 2171 | MAD_F_MLA(hi, lo, X[4], (*s)[4]); |
1976 | MAD_F_MLA(hi, lo, X[5], (*s)[5]); | 2172 | MAD_F_MLA(hi, lo, X[5], (*s)[5]); |
1977 | 2173 | ||
1978 | yptr[i + 0] = MAD_F_MLZ(hi, lo); | 2174 | yptr[i + 0] = MAD_F_MLZ(hi, lo); |
1979 | yptr[5 - i] = -yptr[i + 0]; | 2175 | yptr[5 - i] = -yptr[i + 0]; |
1980 | 2176 | ||
1981 | ++s; | 2177 | ++s; |
1982 | 2178 | ||
1983 | MAD_F_ML0(hi, lo, X[0], (*s)[0]); | 2179 | MAD_F_ML0(hi, lo, X[0], (*s)[0]); |
1984 | MAD_F_MLA(hi, lo, X[1], (*s)[1]); | 2180 | MAD_F_MLA(hi, lo, X[1], (*s)[1]); |
1985 | MAD_F_MLA(hi, lo, X[2], (*s)[2]); | 2181 | MAD_F_MLA(hi, lo, X[2], (*s)[2]); |
1986 | MAD_F_MLA(hi, lo, X[3], (*s)[3]); | 2182 | MAD_F_MLA(hi, lo, X[3], (*s)[3]); |
1987 | MAD_F_MLA(hi, lo, X[4], (*s)[4]); | 2183 | MAD_F_MLA(hi, lo, X[4], (*s)[4]); |
1988 | MAD_F_MLA(hi, lo, X[5], (*s)[5]); | 2184 | MAD_F_MLA(hi, lo, X[5], (*s)[5]); |
1989 | 2185 | ||
1990 | yptr[ i + 6] = MAD_F_MLZ(hi, lo); | 2186 | yptr[ i + 6] = MAD_F_MLZ(hi, lo); |
1991 | yptr[11 - i] = yptr[i + 6]; | 2187 | yptr[11 - i] = yptr[i + 6]; |
1992 | 2188 | ||
1993 | ++s; | 2189 | ++s; |
1994 | } | 2190 | } |
1995 | 2191 | ||
1996 | yptr += 12; | 2192 | yptr += 12; |
1997 | X += 6; | 2193 | X += 6; |
1998 | } | 2194 | } |
1999 | 2195 | ||
2000 | /* windowing, overlapping and concatenation */ | 2196 | /* windowing, overlapping and concatenation */ |
2001 | 2197 | ||
2002 | yptr = &y[0]; | 2198 | yptr = &y[0]; |
2003 | wptr = &window_s[0]; | 2199 | wptr = &window_s[0]; |
2004 | 2200 | ||
2005 | for (i = 0; i < 6; ++i) { | 2201 | for (i = 0; i < 6; ++i) { |
2006 | z[i + 0] = 0; | 2202 | z[i + 0] = 0; |
2007 | z[i + 6] = mad_f_mul(yptr[ 0 + 0], wptr[0]); | 2203 | z[i + 6] = mad_f_mul(yptr[ 0 + 0], wptr[0]); |
2008 | 2204 | ||
2009 | MAD_F_ML0(hi, lo, yptr[ 0 + 6], wptr[6]); | 2205 | MAD_F_ML0(hi, lo, yptr[ 0 + 6], wptr[6]); |
2010 | MAD_F_MLA(hi, lo, yptr[12 + 0], wptr[0]); | 2206 | MAD_F_MLA(hi, lo, yptr[12 + 0], wptr[0]); |
2011 | 2207 | ||
2012 | z[i + 12] = MAD_F_MLZ(hi, lo); | 2208 | z[i + 12] = MAD_F_MLZ(hi, lo); |
2013 | 2209 | ||
2014 | MAD_F_ML0(hi, lo, yptr[12 + 6], wptr[6]); | 2210 | MAD_F_ML0(hi, lo, yptr[12 + 6], wptr[6]); |
2015 | MAD_F_MLA(hi, lo, yptr[24 + 0], wptr[0]); | 2211 | MAD_F_MLA(hi, lo, yptr[24 + 0], wptr[0]); |
2016 | 2212 | ||
2017 | z[i + 18] = MAD_F_MLZ(hi, lo); | 2213 | z[i + 18] = MAD_F_MLZ(hi, lo); |
2018 | 2214 | ||
2019 | z[i + 24] = mad_f_mul(yptr[24 + 6], wptr[6]); | 2215 | z[i + 24] = mad_f_mul(yptr[24 + 6], wptr[6]); |
2020 | z[i + 30] = 0; | 2216 | z[i + 30] = 0; |
2021 | 2217 | ||
2022 | ++yptr; | 2218 | ++yptr; |
2023 | ++wptr; | 2219 | ++wptr; |
2024 | } | 2220 | } |
2025 | } | 2221 | } |
2026 | 2222 | ||
2027 | /* | 2223 | /* |
2028 | * NAME:III_overlap() | 2224 | * NAME:III_overlap() |
2029 | * DESCRIPTION:perform overlap-add of windowed IMDCT outputs | 2225 | * DESCRIPTION:perform overlap-add of windowed IMDCT outputs |
2030 | */ | 2226 | */ |
2031 | static | 2227 | static |
2032 | void III_overlap(mad_fixed_t const output[36], mad_fixed_t overlap[18], | 2228 | void III_overlap(mad_fixed_t const output[36], mad_fixed_t overlap[18], |
2033 | mad_fixed_t sample[18][32], unsigned int sb) | 2229 | mad_fixed_t sample[18][32], unsigned int sb) |
2034 | { | 2230 | { |
2035 | unsigned int i; | 2231 | unsigned int i; |
2036 | 2232 | ||
2037 | # if defined(ASO_INTERLEAVE2) | 2233 | # if defined(ASO_INTERLEAVE2) |
2038 | { | 2234 | { |
2039 | register mad_fixed_t tmp1, tmp2; | 2235 | register mad_fixed_t tmp1, tmp2; |
2040 | 2236 | ||
2041 | tmp1 = overlap[0]; | 2237 | tmp1 = overlap[0]; |
2042 | tmp2 = overlap[1]; | 2238 | tmp2 = overlap[1]; |
2043 | 2239 | ||
2044 | for (i = 0; i < 16; i += 2) { | 2240 | for (i = 0; i < 16; i += 2) { |
2045 | sample[i + 0][sb] = output[i + 0] + tmp1; | 2241 | sample[i + 0][sb] = output[i + 0 + 0] + tmp1; |
2046 | overlap[i + 0] = output[i + 0 + 18]; | 2242 | overlap[i + 0] = output[i + 0 + 18]; |
2047 | tmp1 = overlap[i + 2]; | 2243 | tmp1 = overlap[i + 2]; |
2048 | 2244 | ||
2049 | sample[i + 1][sb] = output[i + 1] + tmp2; | 2245 | sample[i + 1][sb] = output[i + 1 + 0] + tmp2; |
2050 | overlap[i + 1] = output[i + 1 + 18]; | 2246 | overlap[i + 1] = output[i + 1 + 18]; |
2051 | tmp2 = overlap[i + 3]; | 2247 | tmp2 = overlap[i + 3]; |
2052 | } | 2248 | } |
2053 | 2249 | ||
2054 | sample[16][sb] = output[16] + tmp1; | 2250 | sample[16][sb] = output[16 + 0] + tmp1; |
2055 | overlap[16] = output[16 + 18]; | 2251 | overlap[16] = output[16 + 18]; |
2056 | sample[17][sb] = output[17] + tmp2; | 2252 | sample[17][sb] = output[17 + 0] + tmp2; |
2057 | overlap[17] = output[17 + 18]; | 2253 | overlap[17] = output[17 + 18]; |
2058 | } | 2254 | } |
2059 | # elif 0 | 2255 | # elif 0 |
2060 | for (i = 0; i < 18; i += 2) { | 2256 | for (i = 0; i < 18; i += 2) { |
2061 | sample[i + 0][sb] = output[i + 0] + overlap[i + 0]; | 2257 | sample[i + 0][sb] = output[i + 0 + 0] + overlap[i + 0]; |
2062 | overlap[i + 0] = output[i + 0 + 18]; | 2258 | overlap[i + 0] = output[i + 0 + 18]; |
2063 | 2259 | ||
2064 | sample[i + 1][sb] = output[i + 1] + overlap[i + 1]; | 2260 | sample[i + 1][sb] = output[i + 1 + 0] + overlap[i + 1]; |
2065 | overlap[i + 1] = output[i + 1 + 18]; | 2261 | overlap[i + 1] = output[i + 1 + 18]; |
2066 | } | 2262 | } |
2067 | # else | 2263 | # else |
2068 | for (i = 0; i < 18; ++i) { | 2264 | for (i = 0; i < 18; ++i) { |
2069 | sample[i][sb] = output[i] + overlap[i]; | 2265 | sample[i][sb] = output[i + 0] + overlap[i]; |
2070 | overlap[i] = output[i + 18]; | 2266 | overlap[i] = output[i + 18]; |
2071 | } | 2267 | } |
2072 | # endif | 2268 | # endif |
2073 | } | 2269 | } |
2074 | 2270 | ||
2075 | /* | 2271 | /* |
2076 | * NAME:III_overlap_z() | 2272 | * NAME:III_overlap_z() |
2077 | * DESCRIPTION:perform "overlap-add" of zero IMDCT outputs | 2273 | * DESCRIPTION:perform "overlap-add" of zero IMDCT outputs |
2078 | */ | 2274 | */ |
2079 | static inline | 2275 | static inline |
2080 | void III_overlap_z(mad_fixed_t overlap[18], | 2276 | void III_overlap_z(mad_fixed_t overlap[18], |
2081 | mad_fixed_t sample[18][32], unsigned int sb) | 2277 | mad_fixed_t sample[18][32], unsigned int sb) |
2082 | { | 2278 | { |
2083 | unsigned int i; | 2279 | unsigned int i; |
2084 | 2280 | ||
2085 | # if defined(ASO_INTERLEAVE2) | 2281 | # if defined(ASO_INTERLEAVE2) |
2086 | { | 2282 | { |
2087 | register mad_fixed_t tmp1, tmp2; | 2283 | register mad_fixed_t tmp1, tmp2; |
2088 | 2284 | ||
2089 | tmp1 = overlap[0]; | 2285 | tmp1 = overlap[0]; |
2090 | tmp2 = overlap[1]; | 2286 | tmp2 = overlap[1]; |
2091 | 2287 | ||
2092 | for (i = 0; i < 16; i += 2) { | 2288 | for (i = 0; i < 16; i += 2) { |
2093 | sample[i + 0][sb] = tmp1; | 2289 | sample[i + 0][sb] = tmp1; |
2094 | overlap[i + 0] = 0; | 2290 | overlap[i + 0] = 0; |
2095 | tmp1 = overlap[i + 2]; | 2291 | tmp1 = overlap[i + 2]; |
2096 | 2292 | ||
2097 | sample[i + 1][sb] = tmp2; | 2293 | sample[i + 1][sb] = tmp2; |
2098 | overlap[i + 1] = 0; | 2294 | overlap[i + 1] = 0; |
2099 | tmp2 = overlap[i + 3]; | 2295 | tmp2 = overlap[i + 3]; |
2100 | } | 2296 | } |
2101 | 2297 | ||
2102 | sample[16][sb] = tmp1; | 2298 | sample[16][sb] = tmp1; |
2103 | overlap[16] = 0; | 2299 | overlap[16] = 0; |
2104 | sample[17][sb] = tmp2; | 2300 | sample[17][sb] = tmp2; |
2105 | overlap[17] = 0; | 2301 | overlap[17] = 0; |
2106 | } | 2302 | } |
2107 | # else | 2303 | # else |
2108 | for (i = 0; i < 18; ++i) { | 2304 | for (i = 0; i < 18; ++i) { |
2109 | sample[i][sb] = overlap[i]; | 2305 | sample[i][sb] = overlap[i]; |
2110 | overlap[i] = 0; | 2306 | overlap[i] = 0; |
2111 | } | 2307 | } |
2112 | # endif | 2308 | # endif |
2113 | } | 2309 | } |
2114 | 2310 | ||
2115 | /* | 2311 | /* |
2116 | * NAME:III_freqinver() | 2312 | * NAME:III_freqinver() |
2117 | * DESCRIPTION:perform subband frequency inversion for odd sample lines | 2313 | * DESCRIPTION:perform subband frequency inversion for odd sample lines |
2118 | */ | 2314 | */ |
2119 | static | 2315 | static |
2120 | void III_freqinver(mad_fixed_t sample[18][32], unsigned int sb) | 2316 | void III_freqinver(mad_fixed_t sample[18][32], unsigned int sb) |
2121 | { | 2317 | { |
2122 | unsigned int i; | 2318 | unsigned int i; |
2123 | 2319 | ||
2124 | # if 1 || defined(ASO_INTERLEAVE1) || defined(ASO_INTERLEAVE2) | 2320 | # if 1 || defined(ASO_INTERLEAVE1) || defined(ASO_INTERLEAVE2) |
2125 | { | 2321 | { |
2126 | register mad_fixed_t tmp1, tmp2; | 2322 | register mad_fixed_t tmp1, tmp2; |
2127 | 2323 | ||
2128 | tmp1 = sample[1][sb]; | 2324 | tmp1 = sample[1][sb]; |
2129 | tmp2 = sample[3][sb]; | 2325 | tmp2 = sample[3][sb]; |
2130 | 2326 | ||
2131 | for (i = 1; i < 13; i += 4) { | 2327 | for (i = 1; i < 13; i += 4) { |
2132 | sample[i + 0][sb] = -tmp1; | 2328 | sample[i + 0][sb] = -tmp1; |
2133 | tmp1 = sample[i + 4][sb]; | 2329 | tmp1 = sample[i + 4][sb]; |
2134 | sample[i + 2][sb] = -tmp2; | 2330 | sample[i + 2][sb] = -tmp2; |
2135 | tmp2 = sample[i + 6][sb]; | 2331 | tmp2 = sample[i + 6][sb]; |
2136 | } | 2332 | } |
2137 | 2333 | ||
2138 | sample[13][sb] = -tmp1; | 2334 | sample[13][sb] = -tmp1; |
2139 | tmp1 = sample[17][sb]; | 2335 | tmp1 = sample[17][sb]; |
2140 | sample[15][sb] = -tmp2; | 2336 | sample[15][sb] = -tmp2; |
2141 | sample[17][sb] = -tmp1; | 2337 | sample[17][sb] = -tmp1; |
2142 | } | 2338 | } |
2143 | # else | 2339 | # else |
2144 | for (i = 1; i < 18; i += 2) | 2340 | for (i = 1; i < 18; i += 2) |
2145 | sample[i][sb] = -sample[i][sb]; | 2341 | sample[i][sb] = -sample[i][sb]; |
2146 | # endif | 2342 | # endif |
2147 | } | 2343 | } |
2148 | 2344 | ||
2149 | /* | 2345 | /* |
2150 | * NAME:III_decode() | 2346 | * NAME:III_decode() |
2151 | * DESCRIPTION:decode frame main_data | 2347 | * DESCRIPTION:decode frame main_data |
2152 | */ | 2348 | */ |
2153 | static | 2349 | static |
2154 | enum mad_error III_decode(struct mad_bitptr *ptr, struct mad_frame *frame, | 2350 | enum mad_error III_decode(struct mad_bitptr *ptr, struct mad_frame *frame, |
2155 | struct sideinfo *si, unsigned int nch) | 2351 | struct sideinfo *si, unsigned int nch) |
2156 | { | 2352 | { |
2157 | struct mad_header *header = &frame->header; | 2353 | struct mad_header *header = &frame->header; |
2158 | unsigned int sfreqi, ngr, gr; | 2354 | unsigned int sfreqi, ngr, gr; |
2159 | 2355 | ||
2160 | { | 2356 | { |
2161 | unsigned int sfreq; | 2357 | unsigned int sfreq; |
2162 | 2358 | ||
2163 | sfreq = header->samplerate; | 2359 | sfreq = header->samplerate; |
2164 | if (header->flags & MAD_FLAG_MPEG_2_5_EXT) | 2360 | if (header->flags & MAD_FLAG_MPEG_2_5_EXT) |
2165 | sfreq *= 2; | 2361 | sfreq *= 2; |
2166 | 2362 | ||
2167 | /* 48000 => 0, 44100 => 1, 32000 => 2, | 2363 | /* 48000 => 0, 44100 => 1, 32000 => 2, |
2168 | 24000 => 3, 22050 => 4, 16000 => 5 */ | 2364 | 24000 => 3, 22050 => 4, 16000 => 5 */ |
2169 | sfreqi = ((sfreq >> 7) & 0x000f) + | 2365 | sfreqi = ((sfreq >> 7) & 0x000f) + |
2170 | ((sfreq >> 15) & 0x0001) - 8; | 2366 | ((sfreq >> 15) & 0x0001) - 8; |
2171 | 2367 | ||
2172 | if (header->flags & MAD_FLAG_MPEG_2_5_EXT) | 2368 | if (header->flags & MAD_FLAG_MPEG_2_5_EXT) |
2173 | sfreqi += 3; | 2369 | sfreqi += 3; |
2174 | } | 2370 | } |
2175 | 2371 | ||
2176 | /* scalefactors, Huffman decoding, requantization */ | 2372 | /* scalefactors, Huffman decoding, requantization */ |
2177 | 2373 | ||
2178 | ngr = (header->flags & MAD_FLAG_LSF_EXT) ? 1 : 2; | 2374 | ngr = (header->flags & MAD_FLAG_LSF_EXT) ? 1 : 2; |
2179 | 2375 | ||
2180 | for (gr = 0; gr < ngr; ++gr) { | 2376 | for (gr = 0; gr < ngr; ++gr) { |
2181 | struct granule *granule = &si->gr[gr]; | 2377 | struct granule *granule = &si->gr[gr]; |
2182 | unsigned char const *sfbwidth[2]; | 2378 | unsigned char const *sfbwidth[2]; |
2183 | mad_fixed_t xr[2][576]; | 2379 | mad_fixed_t xr[2][576]; |
2184 | unsigned int ch; | 2380 | unsigned int ch; |
2185 | enum mad_error error; | 2381 | enum mad_error error; |
2186 | 2382 | ||
2187 | for (ch = 0; ch < nch; ++ch) { | 2383 | for (ch = 0; ch < nch; ++ch) { |
2188 | struct channel *channel = &granule->ch[ch]; | 2384 | struct channel *channel = &granule->ch[ch]; |
2189 | unsigned int part2_length; | 2385 | unsigned int part2_length; |
2190 | 2386 | ||
2191 | sfbwidth[ch] = sfbwidth_table[sfreqi].l; | 2387 | sfbwidth[ch] = sfbwidth_table[sfreqi].l; |
2192 | if (channel->block_type == 2) { | 2388 | if (channel->block_type == 2) { |
2193 | sfbwidth[ch] = (channel->flags & mixed_block_flag) ? | 2389 | sfbwidth[ch] = (channel->flags & mixed_block_flag) ? |
2194 | sfbwidth_table[sfreqi].m : sfbwidth_table[sfreqi].s; | 2390 | sfbwidth_table[sfreqi].m : sfbwidth_table[sfreqi].s; |
2195 | } | 2391 | } |
2196 | 2392 | ||
2197 | if (header->flags & MAD_FLAG_LSF_EXT) { | 2393 | if (header->flags & MAD_FLAG_LSF_EXT) { |
@@ -2329,174 +2525,174 @@ int mad_layer_III(struct mad_stream *stream, struct mad_frame *frame) | |||
2329 | int result = 0; | 2525 | int result = 0; |
2330 | 2526 | ||
2331 | /* allocate Layer III dynamic structures */ | 2527 | /* allocate Layer III dynamic structures */ |
2332 | 2528 | ||
2333 | if (stream->main_data == 0) { | 2529 | if (stream->main_data == 0) { |
2334 | stream->main_data = malloc(MAD_BUFFER_MDLEN); | 2530 | stream->main_data = malloc(MAD_BUFFER_MDLEN); |
2335 | if (stream->main_data == 0) { | 2531 | if (stream->main_data == 0) { |
2336 | stream->error = MAD_ERROR_NOMEM; | 2532 | stream->error = MAD_ERROR_NOMEM; |
2337 | return -1; | 2533 | return -1; |
2338 | } | 2534 | } |
2339 | } | 2535 | } |
2340 | 2536 | ||
2341 | if (frame->overlap == 0) { | 2537 | if (frame->overlap == 0) { |
2342 | frame->overlap = calloc(2 * 32 * 18, sizeof(mad_fixed_t)); | 2538 | frame->overlap = calloc(2 * 32 * 18, sizeof(mad_fixed_t)); |
2343 | if (frame->overlap == 0) { | 2539 | if (frame->overlap == 0) { |
2344 | stream->error = MAD_ERROR_NOMEM; | 2540 | stream->error = MAD_ERROR_NOMEM; |
2345 | return -1; | 2541 | return -1; |
2346 | } | 2542 | } |
2347 | } | 2543 | } |
2348 | 2544 | ||
2349 | nch = MAD_NCHANNELS(header); | 2545 | nch = MAD_NCHANNELS(header); |
2350 | si_len = (header->flags & MAD_FLAG_LSF_EXT) ? | 2546 | si_len = (header->flags & MAD_FLAG_LSF_EXT) ? |
2351 | (nch == 1 ? 9 : 17) : (nch == 1 ? 17 : 32); | 2547 | (nch == 1 ? 9 : 17) : (nch == 1 ? 17 : 32); |
2352 | 2548 | ||
2353 | /* check frame sanity */ | 2549 | /* check frame sanity */ |
2354 | 2550 | ||
2355 | if (stream->next_frame - mad_bit_nextbyte(&stream->ptr) < | 2551 | if (stream->next_frame - mad_bit_nextbyte(&stream->ptr) < |
2356 | (signed int) si_len) { | 2552 | (signed int) si_len) { |
2357 | stream->error = MAD_ERROR_BADFRAMELEN; | 2553 | stream->error = MAD_ERROR_BADFRAMELEN; |
2358 | stream->md_len = 0; | 2554 | stream->md_len = 0; |
2359 | return -1; | 2555 | return -1; |
2360 | } | 2556 | } |
2361 | 2557 | ||
2362 | /* check CRC word */ | 2558 | /* check CRC word */ |
2363 | 2559 | ||
2364 | if (header->flags & MAD_FLAG_PROTECTION) { | 2560 | if (header->flags & MAD_FLAG_PROTECTION) { |
2365 | header->crc_check = | 2561 | header->crc_check = |
2366 | mad_bit_crc(stream->ptr, si_len * CHAR_BIT, header->crc_check); | 2562 | mad_bit_crc(stream->ptr, si_len * CHAR_BIT, header->crc_check); |
2367 | 2563 | ||
2368 | if (header->crc_check != header->crc_target && | 2564 | if (header->crc_check != header->crc_target && |
2369 | !(frame->options & MAD_OPTION_IGNORECRC)) { | 2565 | !(frame->options & MAD_OPTION_IGNORECRC)) { |
2370 | stream->error = MAD_ERROR_BADCRC; | 2566 | stream->error = MAD_ERROR_BADCRC; |
2371 | result = -1; | 2567 | result = -1; |
2372 | } | 2568 | } |
2373 | } | 2569 | } |
2374 | 2570 | ||
2375 | /* decode frame side information */ | 2571 | /* decode frame side information */ |
2376 | 2572 | ||
2377 | error = III_sideinfo(&stream->ptr, nch, header->flags & MAD_FLAG_LSF_EXT, | 2573 | error = III_sideinfo(&stream->ptr, nch, header->flags & MAD_FLAG_LSF_EXT, |
2378 | &si, &data_bitlen, &priv_bitlen); | 2574 | &si, &data_bitlen, &priv_bitlen); |
2379 | if (error && result == 0) { | 2575 | if (error && result == 0) { |
2380 | stream->error = error; | 2576 | stream->error = error; |
2381 | result = -1; | 2577 | result = -1; |
2382 | } | 2578 | } |
2383 | 2579 | ||
2384 | header->flags |= priv_bitlen; | 2580 | header->flags |= priv_bitlen; |
2385 | header->private_bits |= si.private_bits; | 2581 | header->private_bits |= si.private_bits; |
2386 | 2582 | ||
2387 | /* find main_data of next frame */ | 2583 | /* find main_data of next frame */ |
2388 | 2584 | ||
2389 | { | 2585 | { |
2390 | struct mad_bitptr peek; | 2586 | struct mad_bitptr peek; |
2391 | unsigned long header; | 2587 | unsigned long header; |
2392 | 2588 | ||
2393 | mad_bit_init(&peek, stream->next_frame); | 2589 | mad_bit_init(&peek, stream->next_frame); |
2394 | 2590 | ||
2395 | header = mad_bit_read(&peek, 32); | 2591 | header = mad_bit_read(&peek, 32); |
2396 | if ((header & 0xffe60000L) /* syncword | layer */ == 0xffe20000L) { | 2592 | if ((header & 0xffe60000L) /* syncword | layer */ == 0xffe20000L) { |
2397 | if (!(header & 0x00010000L)) /* protection_bit */ | 2593 | if (!(header & 0x00010000L)) /* protection_bit */ |
2398 | mad_bit_skip(&peek, 16); /* crc_check */ | 2594 | mad_bit_skip(&peek, 16); /* crc_check */ |
2399 | 2595 | ||
2400 | next_md_begin = | 2596 | next_md_begin = |
2401 | mad_bit_read(&peek, (header & 0x00080000L) /* ID */ ? 9 : 8); | 2597 | mad_bit_read(&peek, (header & 0x00080000L) /* ID */ ? 9 : 8); |
2402 | } | 2598 | } |
2403 | 2599 | ||
2404 | mad_bit_finish(&peek); | 2600 | mad_bit_finish(&peek); |
2405 | } | 2601 | } |
2406 | 2602 | ||
2407 | /* find main_data of this frame */ | 2603 | /* find main_data of this frame */ |
2408 | 2604 | ||
2409 | frame_space = stream->next_frame - mad_bit_nextbyte(&stream->ptr); | 2605 | frame_space = stream->next_frame - mad_bit_nextbyte(&stream->ptr); |
2410 | 2606 | ||
2411 | if (next_md_begin > si.main_data_begin + frame_space) | 2607 | if (next_md_begin > si.main_data_begin + frame_space) |
2412 | next_md_begin = 0; | 2608 | next_md_begin = 0; |
2413 | 2609 | ||
2414 | md_len = si.main_data_begin + frame_space - next_md_begin; | 2610 | md_len = si.main_data_begin + frame_space - next_md_begin; |
2415 | 2611 | ||
2416 | frame_used = 0; | 2612 | frame_used = 0; |
2417 | 2613 | ||
2418 | if (si.main_data_begin == 0) { | 2614 | if (si.main_data_begin == 0) { |
2419 | ptr = stream->ptr; | 2615 | ptr = stream->ptr; |
2420 | stream->md_len = 0; | 2616 | stream->md_len = 0; |
2421 | 2617 | ||
2422 | frame_used = md_len; | 2618 | frame_used = md_len; |
2423 | } | 2619 | } |
2424 | else { | 2620 | else { |
2425 | if (si.main_data_begin > stream->md_len) { | 2621 | if (si.main_data_begin > stream->md_len) { |
2426 | if (result == 0) { | 2622 | if (result == 0) { |
2427 | stream->error = MAD_ERROR_BADDATAPTR; | 2623 | stream->error = MAD_ERROR_BADDATAPTR; |
2428 | result = -1; | 2624 | result = -1; |
2429 | } | 2625 | } |
2430 | } | 2626 | } |
2431 | else { | 2627 | else { |
2432 | mad_bit_init(&ptr, | 2628 | mad_bit_init(&ptr, |
2433 | *stream->main_data + stream->md_len - si.main_data_begin); | 2629 | *stream->main_data + stream->md_len - si.main_data_begin); |
2434 | 2630 | ||
2435 | if (md_len > si.main_data_begin) { | 2631 | if (md_len > si.main_data_begin) { |
2436 | assert(stream->md_len + md_len - | 2632 | assert(stream->md_len + md_len - |
2437 | si.main_data_begin <= MAD_BUFFER_MDLEN); | 2633 | si.main_data_begin <= MAD_BUFFER_MDLEN); |
2438 | 2634 | ||
2439 | memcpy(*stream->main_data + stream->md_len, | 2635 | memcpy(*stream->main_data + stream->md_len, |
2440 | mad_bit_nextbyte(&stream->ptr), | 2636 | mad_bit_nextbyte(&stream->ptr), |
2441 | frame_used = md_len - si.main_data_begin); | 2637 | frame_used = md_len - si.main_data_begin); |
2442 | stream->md_len += frame_used; | 2638 | stream->md_len += frame_used; |
2443 | } | 2639 | } |
2444 | } | 2640 | } |
2445 | } | 2641 | } |
2446 | 2642 | ||
2447 | frame_free = frame_space - frame_used; | 2643 | frame_free = frame_space - frame_used; |
2448 | 2644 | ||
2449 | /* decode main_data */ | 2645 | /* decode main_data */ |
2450 | 2646 | ||
2451 | if (result == 0) { | 2647 | if (result == 0) { |
2452 | error = III_decode(&ptr, frame, &si, nch); | 2648 | error = III_decode(&ptr, frame, &si, nch); |
2453 | if (error) { | 2649 | if (error) { |
2454 | stream->error = error; | 2650 | stream->error = error; |
2455 | result = -1; | 2651 | result = -1; |
2456 | } | 2652 | } |
2457 | } | ||
2458 | 2653 | ||
2459 | /* designate ancillary bits */ | 2654 | /* designate ancillary bits */ |
2460 | 2655 | ||
2461 | stream->anc_ptr = ptr; | 2656 | stream->anc_ptr = ptr; |
2462 | stream->anc_bitlen = md_len * CHAR_BIT - data_bitlen; | 2657 | stream->anc_bitlen = md_len * CHAR_BIT - data_bitlen; |
2658 | } | ||
2463 | 2659 | ||
2464 | # if 0 && defined(DEBUG) | 2660 | # if 0 && defined(DEBUG) |
2465 | fprintf(stderr, | 2661 | fprintf(stderr, |
2466 | "main_data_begin:%u, md_len:%u, frame_free:%u, " | 2662 | "main_data_begin:%u, md_len:%u, frame_free:%u, " |
2467 | "data_bitlen:%u, anc_bitlen: %u\n", | 2663 | "data_bitlen:%u, anc_bitlen: %u\n", |
2468 | si.main_data_begin, md_len, frame_free, | 2664 | si.main_data_begin, md_len, frame_free, |
2469 | data_bitlen, stream->anc_bitlen); | 2665 | data_bitlen, stream->anc_bitlen); |
2470 | # endif | 2666 | # endif |
2471 | 2667 | ||
2472 | /* preload main_data buffer with up to 511 bytes for next frame(s) */ | 2668 | /* preload main_data buffer with up to 511 bytes for next frame(s) */ |
2473 | 2669 | ||
2474 | if (frame_free >= next_md_begin) { | 2670 | if (frame_free >= next_md_begin) { |
2475 | memcpy(*stream->main_data, | 2671 | memcpy(*stream->main_data, |
2476 | stream->next_frame - next_md_begin, next_md_begin); | 2672 | stream->next_frame - next_md_begin, next_md_begin); |
2477 | stream->md_len = next_md_begin; | 2673 | stream->md_len = next_md_begin; |
2478 | } | 2674 | } |
2479 | else { | 2675 | else { |
2480 | if (md_len < si.main_data_begin) { | 2676 | if (md_len < si.main_data_begin) { |
2481 | unsigned int extra; | 2677 | unsigned int extra; |
2482 | 2678 | ||
2483 | extra = si.main_data_begin - md_len; | 2679 | extra = si.main_data_begin - md_len; |
2484 | if (extra + frame_free > next_md_begin) | 2680 | if (extra + frame_free > next_md_begin) |
2485 | extra = next_md_begin - frame_free; | 2681 | extra = next_md_begin - frame_free; |
2486 | 2682 | ||
2487 | if (extra < stream->md_len) { | 2683 | if (extra < stream->md_len) { |
2488 | memmove(*stream->main_data, | 2684 | memmove(*stream->main_data, |
2489 | *stream->main_data + stream->md_len - extra, extra); | 2685 | *stream->main_data + stream->md_len - extra, extra); |
2490 | stream->md_len = extra; | 2686 | stream->md_len = extra; |
2491 | } | 2687 | } |
2492 | } | 2688 | } |
2493 | else | 2689 | else |
2494 | stream->md_len = 0; | 2690 | stream->md_len = 0; |
2495 | 2691 | ||
2496 | memcpy(*stream->main_data + stream->md_len, | 2692 | memcpy(*stream->main_data + stream->md_len, |
2497 | stream->next_frame - frame_free, frame_free); | 2693 | stream->next_frame - frame_free, frame_free); |
2498 | stream->md_len += frame_free; | 2694 | stream->md_len += frame_free; |
2499 | } | 2695 | } |
2500 | 2696 | ||
2501 | return result; | 2697 | return result; |
2502 | } | 2698 | } |
diff --git a/core/multimedia/opieplayer/libmad/layer3.h b/core/multimedia/opieplayer/libmad/layer3.h index c1a5c69..1594803 100644 --- a/core/multimedia/opieplayer/libmad/layer3.h +++ b/core/multimedia/opieplayer/libmad/layer3.h | |||
@@ -1,30 +1,30 @@ | |||
1 | /* | 1 | /* |
2 | * libmad - MPEG audio decoder library | 2 | * libmad - MPEG audio decoder library |
3 | * Copyright (C) 2000-2001 Robert Leslie | 3 | * Copyright (C) 2000-2004 Underbit Technologies, Inc. |
4 | * | 4 | * |
5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
7 | * the Free Software Foundation; either version 2 of the License, or | 7 | * the Free Software Foundation; either version 2 of the License, or |
8 | * (at your option) any later version. | 8 | * (at your option) any later version. |
9 | * | 9 | * |
10 | * This program is distributed in the hope that it will be useful, | 10 | * This program is distributed in the hope that it will be useful, |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | * GNU General Public License for more details. | 13 | * GNU General Public License for more details. |
14 | * | 14 | * |
15 | * You should have received a copy of the GNU General Public License | 15 | * You should have received a copy of the GNU General Public License |
16 | * along with this program; if not, write to the Free Software | 16 | * along with this program; if not, write to the Free Software |
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
18 | * | 18 | * |
19 | * $Id$ | 19 | * $Id$ |
20 | */ | 20 | */ |
21 | 21 | ||
22 | # ifndef LIBMAD_LAYER3_H | 22 | # ifndef LIBMAD_LAYER3_H |
23 | # define LIBMAD_LAYER3_H | 23 | # define LIBMAD_LAYER3_H |
24 | 24 | ||
25 | # include "stream.h" | 25 | # include "stream.h" |
26 | # include "frame.h" | 26 | # include "frame.h" |
27 | 27 | ||
28 | int mad_layer_III(struct mad_stream *, struct mad_frame *); | 28 | int mad_layer_III(struct mad_stream *, struct mad_frame *); |
29 | 29 | ||
30 | # endif | 30 | # endif |
diff --git a/core/multimedia/opieplayer/libmad/libmad.pro b/core/multimedia/opieplayer/libmad/libmad.pro index 46af87f..7c41a8f 100644 --- a/core/multimedia/opieplayer/libmad/libmad.pro +++ b/core/multimedia/opieplayer/libmad/libmad.pro | |||
@@ -1,53 +1,44 @@ | |||
1 | QMAKE_CFLAGS += $(if $(CONFIG_TARGET_X86),-DFPM_INTEL) \ | ||
2 | $(if $(CONFIG_TARGET_64BIT),-DFPM_64BIT) \ | ||
3 | $(if $(CONFIG_TARGET_IPAQ),-DFPM_ARM) \ | ||
4 | $(if $(CONFIG_TARGET_SHARP),-DFPM_ARM) | ||
5 | QMAKE_CXXFLAGS += $(if $(CONFIG_TARGET_X86),-DFPM_INTEL) \ | ||
6 | $(if $(CONFIG_TARGET_64BIT),-DFPM_64BIT) \ | ||
7 | $(if $(CONFIG_TARGET_IPAQ),-DFPM_ARM) \ | ||
8 | $(if $(CONFIG_TARGET_SHARP),-DFPM_ARM) | ||
9 | |||
10 | |||
1 | TEMPLATE = lib | 11 | TEMPLATE = lib |
2 | CONFIG += qt warn_on | 12 | CONFIG += qt warn_on release |
3 | HEADERS = libmad_version.h fixed.h bit.h timer.h stream.h frame.h synth.h decoder.h \ | 13 | HEADERS = libmad_version.h fixed.h bit.h timer.h stream.h frame.h synth.h decoder.h \ |
4 | layer12.h layer3.h huffman.h libmad_global.h mad.h libmadplugin.h libmadpluginimpl.h | 14 | layer12.h layer3.h huffman.h libmad_global.h mad.h libmadplugin.h libmadpluginimpl.h |
5 | SOURCES = version.c fixed.c bit.c timer.c stream.c frame.c synth.c decoder.c \ | 15 | SOURCES = version.c fixed.c bit.c timer.c stream.c frame.c synth.c decoder.c \ |
6 | layer12.c layer3.c huffman.c libmadplugin.cpp libmadpluginimpl.cpp | 16 | layer12.c layer3.c huffman.c libmadplugin.cpp libmadpluginimpl.cpp |
7 | TARGET = madplugin | 17 | TARGET = madplugin |
8 | DESTDIR = $(OPIEDIR)/plugins/codecs | 18 | DESTDIR = $(OPIEDIR)/plugins/codecs |
9 | INCLUDEPATH += $(OPIEDIR)/include .. | 19 | INCLUDEPATH += $(OPIEDIR)/include .. |
10 | DEPENDPATH += .. | 20 | DEPENDPATH += ../$(OPIEDIR)/include .. |
11 | LIBS += -lqpe -lm | 21 | LIBS += -lqpe -lm |
12 | VERSION = 1.0.0 | 22 | VERSION = 1.0.0 |
13 | 23 | ||
14 | include( $(OPIEDIR)/include.pro ) | 24 | TRANSLATIONS = ../../../../i18n/de/libmadplugin.ts \ |
15 | 25 | ../../../../i18n/nl/libmadplugin.ts \ | |
16 | DEFINES += FPM_INTEL | 26 | ../../../../i18n/da/libmadplugin.ts \ |
17 | 27 | ../../../../i18n/xx/libmadplugin.ts \ | |
18 | system(echo $QMAKESPEC | grep -s sharp) { | 28 | ../../../../i18n/en/libmadplugin.ts \ |
19 | DEFINES -= FPM_INTEL | 29 | ../../../../i18n/es/libmadplugin.ts \ |
20 | DEFINES += FPM_ARM | 30 | ../../../../i18n/fr/libmadplugin.ts \ |
21 | } | 31 | ../../../../i18n/hu/libmadplugin.ts \ |
22 | 32 | ../../../../i18n/ja/libmadplugin.ts \ | |
23 | system(echo $QMAKESPEC | grep -s ipaq) { | 33 | ../../../../i18n/ko/libmadplugin.ts \ |
24 | DEFINES -= FPM_INTEL | 34 | ../../../../i18n/no/libmadplugin.ts \ |
25 | DEFINES += FPM_ARM | 35 | ../../../../i18n/pl/libmadplugin.ts \ |
26 | } | 36 | ../../../../i18n/pt/libmadplugin.ts \ |
27 | 37 | ../../../../i18n/pt_BR/libmadplugin.ts \ | |
28 | system(echo $QMAKESPEC | grep -s mipsel) { | 38 | ../../../../i18n/sl/libmadplugin.ts \ |
29 | DEFINES -= FPM_INTEL | 39 | ../../../../i18n/zh_CN/libmadplugin.ts \ |
30 | DEFINES += FPM_MIPS | 40 | ../../../../i18n/zh_TW/libmadplugin.ts |
31 | } | 41 | |
32 | 42 | ||
33 | system(echo $QMAKESPEC | grep -s ramses) { | 43 | |
34 | DEFINES -= FPM_INTEL | 44 | include ( $(OPIEDIR)/include.pro ) |
35 | DEFINES += FPM_ARM | ||
36 | } | ||
37 | |||
38 | system(echo $QMAKESPEC | grep -s arm) { | ||
39 | DEFINES -= FPM_INTEL | ||
40 | DEFINES += FPM_ARM | ||
41 | } | ||
42 | |||
43 | system(echo $QMAKESPEC | grep -s simpad) { | ||
44 | DEFINES -= FPM_INTEL | ||
45 | DEFINES += FPM_ARM | ||
46 | } | ||
47 | |||
48 | system(echo $QMAKESPEC | grep -s yopy) { | ||
49 | DEFINES -= FPM_INTEL | ||
50 | DEFINES += FPM_ARM | ||
51 | } | ||
52 | |||
53 | |||
diff --git a/core/multimedia/opieplayer/libmad/libmad_global.h b/core/multimedia/opieplayer/libmad/libmad_global.h index 2c9c713..a3417b4 100644 --- a/core/multimedia/opieplayer/libmad/libmad_global.h +++ b/core/multimedia/opieplayer/libmad/libmad_global.h | |||
@@ -1,58 +1,58 @@ | |||
1 | /* | 1 | /* |
2 | * libmad - MPEG audio decoder library | 2 | * libmad - MPEG audio decoder library |
3 | * Copyright (C) 2000-2001 Robert Leslie | 3 | * Copyright (C) 2000-2004 Underbit Technologies, Inc. |
4 | * | 4 | * |
5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
7 | * the Free Software Foundation; either version 2 of the License, or | 7 | * the Free Software Foundation; either version 2 of the License, or |
8 | * (at your option) any later version. | 8 | * (at your option) any later version. |
9 | * | 9 | * |
10 | * This program is distributed in the hope that it will be useful, | 10 | * This program is distributed in the hope that it will be useful, |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | * GNU General Public License for more details. | 13 | * GNU General Public License for more details. |
14 | * | 14 | * |
15 | * You should have received a copy of the GNU General Public License | 15 | * You should have received a copy of the GNU General Public License |
16 | * along with this program; if not, write to the Free Software | 16 | * along with this program; if not, write to the Free Software |
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
18 | * | 18 | * |
19 | * $Id$ | 19 | * $Id$ |
20 | */ | 20 | */ |
21 | 21 | ||
22 | # ifndef LIBMAD_GLOBAL_H | 22 | # ifndef LIBMAD_GLOBAL_H |
23 | # define LIBMAD_GLOBAL_H | 23 | # define LIBMAD_GLOBAL_H |
24 | 24 | ||
25 | /* conditional debugging */ | 25 | /* conditional debugging */ |
26 | 26 | ||
27 | # if defined(DEBUG) && defined(NDEBUG) | 27 | # if defined(DEBUG) && defined(NDEBUG) |
28 | # error "cannot define both DEBUG and NDEBUG" | 28 | # error "cannot define both DEBUG and NDEBUG" |
29 | # endif | 29 | # endif |
30 | 30 | ||
31 | # if defined(DEBUG) | 31 | # if defined(DEBUG) |
32 | # include <stdio.h> | 32 | # include <stdio.h> |
33 | # endif | 33 | # endif |
34 | 34 | ||
35 | /* conditional features */ | 35 | /* conditional features */ |
36 | 36 | ||
37 | # if defined(OPT_SPEED) && defined(OPT_ACCURACY) | 37 | # if defined(OPT_SPEED) && defined(OPT_ACCURACY) |
38 | # error "cannot optimize for both speed and accuracy" | 38 | # error "cannot optimize for both speed and accuracy" |
39 | # endif | 39 | # endif |
40 | 40 | ||
41 | # if defined(OPT_SPEED) && !defined(OPT_SSO) | 41 | # if defined(OPT_SPEED) && !defined(OPT_SSO) |
42 | # define OPT_SSO 1 | 42 | # define OPT_SSO |
43 | # endif | 43 | # endif |
44 | 44 | ||
45 | # if defined(HAVE_UNISTD_H) && defined(HAVE_WAITPID) && \ | 45 | # if defined(HAVE_UNISTD_H) && defined(HAVE_WAITPID) && \ |
46 | defined(HAVE_FCNTL) && defined(HAVE_PIPE) && defined(HAVE_FORK) | 46 | defined(HAVE_FCNTL) && defined(HAVE_PIPE) && defined(HAVE_FORK) |
47 | # define USE_ASYNC | 47 | # define USE_ASYNC |
48 | # endif | 48 | # endif |
49 | 49 | ||
50 | # if !defined(HAVE_ASSERT_H) | 50 | # if !defined(HAVE_ASSERT_H) |
51 | # if defined(NDEBUG) | 51 | # if defined(NDEBUG) |
52 | # define assert(x)/* nothing */ | 52 | # define assert(x)/* nothing */ |
53 | # else | 53 | # else |
54 | # define assert(x)do { if (!(x)) abort(); } while (0) | 54 | # define assert(x)do { if (!(x)) abort(); } while (0) |
55 | # endif | 55 | # endif |
56 | # endif | 56 | # endif |
57 | 57 | ||
58 | # endif | 58 | # endif |
diff --git a/core/multimedia/opieplayer/libmad/libmad_version.h b/core/multimedia/opieplayer/libmad/libmad_version.h index 9e684a7..d40e425 100644 --- a/core/multimedia/opieplayer/libmad/libmad_version.h +++ b/core/multimedia/opieplayer/libmad/libmad_version.h | |||
@@ -1,47 +1,47 @@ | |||
1 | /* | 1 | /* |
2 | * libmad - MPEG audio decoder library | 2 | * libmad - MPEG audio decoder library |
3 | * Copyright (C) 2000-2001 Robert Leslie | 3 | * Copyright (C) 2000-2004 Underbit Technologies, Inc. |
4 | * | 4 | * |
5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
7 | * the Free Software Foundation; either version 2 of the License, or | 7 | * the Free Software Foundation; either version 2 of the License, or |
8 | * (at your option) any later version. | 8 | * (at your option) any later version. |
9 | * | 9 | * |
10 | * This program is distributed in the hope that it will be useful, | 10 | * This program is distributed in the hope that it will be useful, |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | * GNU General Public License for more details. | 13 | * GNU General Public License for more details. |
14 | * | 14 | * |
15 | * You should have received a copy of the GNU General Public License | 15 | * You should have received a copy of the GNU General Public License |
16 | * along with this program; if not, write to the Free Software | 16 | * along with this program; if not, write to the Free Software |
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
18 | * | 18 | * |
19 | * $Id$ | 19 | * $Id$ |
20 | */ | 20 | */ |
21 | 21 | ||
22 | # ifndef LIBMAD_VERSION_H | 22 | # ifndef LIBMAD_VERSION_H |
23 | # define LIBMAD_VERSION_H | 23 | # define LIBMAD_VERSION_H |
24 | 24 | ||
25 | # define MAD_VERSION_MAJOR0 | 25 | # define MAD_VERSION_MAJOR0 |
26 | # define MAD_VERSION_MINOR14 | 26 | # define MAD_VERSION_MINOR15 |
27 | # define MAD_VERSION_PATCH2 | 27 | # define MAD_VERSION_PATCH1 |
28 | # define MAD_VERSION_EXTRA" (beta)" | 28 | # define MAD_VERSION_EXTRA" (beta)" |
29 | 29 | ||
30 | # define MAD_VERSION_STRINGIZE(str)#str | 30 | # define MAD_VERSION_STRINGIZE(str)#str |
31 | # define MAD_VERSION_STRING(num)MAD_VERSION_STRINGIZE(num) | 31 | # define MAD_VERSION_STRING(num)MAD_VERSION_STRINGIZE(num) |
32 | 32 | ||
33 | # define MAD_VERSION MAD_VERSION_STRING(MAD_VERSION_MAJOR) "." \ | 33 | # define MAD_VERSION MAD_VERSION_STRING(MAD_VERSION_MAJOR) "." \ |
34 | MAD_VERSION_STRING(MAD_VERSION_MINOR) "." \ | 34 | MAD_VERSION_STRING(MAD_VERSION_MINOR) "." \ |
35 | MAD_VERSION_STRING(MAD_VERSION_PATCH) \ | 35 | MAD_VERSION_STRING(MAD_VERSION_PATCH) \ |
36 | MAD_VERSION_EXTRA | 36 | MAD_VERSION_EXTRA |
37 | 37 | ||
38 | # define MAD_PUBLISHYEAR"2000-2001" | 38 | # define MAD_PUBLISHYEAR"2000-2004" |
39 | # define MAD_AUTHOR "Robert Leslie" | 39 | # define MAD_AUTHOR "Underbit Technologies, Inc." |
40 | # define MAD_EMAIL "rob@mars.org" | 40 | # define MAD_EMAIL "info@underbit.com" |
41 | 41 | ||
42 | extern char const mad_version[]; | 42 | extern char const mad_version[]; |
43 | extern char const mad_copyright[]; | 43 | extern char const mad_copyright[]; |
44 | extern char const mad_author[]; | 44 | extern char const mad_author[]; |
45 | extern char const mad_build[]; | 45 | extern char const mad_build[]; |
46 | 46 | ||
47 | # endif | 47 | # endif |
diff --git a/core/multimedia/opieplayer/libmad/libmadplugin.cpp b/core/multimedia/opieplayer/libmad/libmadplugin.cpp index 7438a45..1989b4a 100644 --- a/core/multimedia/opieplayer/libmad/libmadplugin.cpp +++ b/core/multimedia/opieplayer/libmad/libmadplugin.cpp | |||
@@ -1,190 +1,185 @@ | |||
1 | /********************************************************************** | 1 | /********************************************************************** |
2 | ** Copyright (C) 2001 Trolltech AS. All rights reserved. | 2 | ** Copyright (C) 2001 Trolltech AS. All rights reserved. |
3 | ** | 3 | ** |
4 | ** This file is part of Qtopia Environment. | 4 | ** This file is part of Qtopia Environment. |
5 | ** | 5 | ** |
6 | ** This file may be distributed and/or modified under the terms of the | 6 | ** This file may be distributed and/or modified under the terms of the |
7 | ** GNU General Public License version 2 as published by the Free Software | 7 | ** GNU General Public License version 2 as published by the Free Software |
8 | ** Foundation and appearing in the file LICENSE.GPL included in the | 8 | ** Foundation and appearing in the file LICENSE.GPL included in the |
9 | ** packaging of this file. | 9 | ** packaging of this file. |
10 | ** | 10 | ** |
11 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE | 11 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE |
12 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. | 12 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. |
13 | ** | 13 | ** |
14 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | 14 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. |
15 | ** | 15 | ** |
16 | ** Contact info@trolltech.com if any conditions of this licensing are | 16 | ** Contact info@trolltech.com if any conditions of this licensing are |
17 | ** not clear to you. | 17 | ** not clear to you. |
18 | ** | 18 | ** |
19 | **********************************************************************/ | 19 | **********************************************************************/ |
20 | // largly modified by Maximilian Reiss <max.reiss@gmx.de> | 20 | // largly modified by Maximilian Reiss <max.reiss@gmx.de> |
21 | 21 | ||
22 | #include "libmadplugin.h" | ||
23 | |||
24 | /* OPIE */ | ||
25 | #include <qpe/config.h> | ||
26 | #include <opie2/odebug.h> | ||
27 | |||
28 | /* QT */ | ||
29 | #include <qapplication.h> | ||
30 | #include <qmessagebox.h> | ||
31 | #include <qregexp.h> | ||
32 | |||
33 | /* STD */ | ||
34 | #include <stdio.h> | 22 | #include <stdio.h> |
35 | #include <stdarg.h> | 23 | #include <stdarg.h> |
36 | #include <stdlib.h> | 24 | #include <stdlib.h> |
37 | #include <sys/types.h> | 25 | #include <sys/types.h> |
38 | #include <sys/stat.h> | 26 | #include <sys/stat.h> |
39 | #include <fcntl.h> | 27 | #include <fcntl.h> |
40 | #include <unistd.h> | 28 | #include <unistd.h> |
41 | #include <string.h> | 29 | #include <string.h> |
42 | #include <ctype.h> | 30 | #include <ctype.h> |
43 | #include <errno.h> | 31 | #include <errno.h> |
44 | #include <time.h> | 32 | #include <time.h> |
45 | #include <locale.h> | 33 | #include <locale.h> |
46 | #include <math.h> | 34 | #include <math.h> |
47 | #include <assert.h> | 35 | #include <assert.h> |
48 | 36 | ||
37 | #include <qapplication.h> | ||
38 | #include <qmessagebox.h> | ||
39 | #include <qregexp.h> | ||
40 | |||
41 | #include <qpe/config.h> | ||
42 | |||
49 | // for network handling | 43 | // for network handling |
50 | #include <netinet/in.h> | 44 | #include <netinet/in.h> |
51 | #include <netdb.h> | 45 | #include <netdb.h> |
52 | #include <linux/limits.h> | 46 | #include <linux/limits.h> |
53 | #include <sys/socket.h> | 47 | #include <sys/socket.h> |
54 | #include <arpa/inet.h> | 48 | #include <arpa/inet.h> |
55 | #include <unistd.h> | 49 | #include <unistd.h> |
56 | 50 | ||
57 | 51 | ||
58 | //#define HAVE_MMAP | 52 | //#define HAVE_MMAP |
59 | 53 | ||
60 | #if defined(HAVE_MMAP) | 54 | #if defined(HAVE_MMAP) |
61 | # include <sys/mman.h> | 55 | # include <sys/mman.h> |
62 | #endif | 56 | #endif |
57 | #include "libmadplugin.h" | ||
63 | 58 | ||
64 | 59 | ||
65 | extern "C" { | 60 | extern "C" { |
66 | #include "mad.h" | 61 | #include "mad.h" |
67 | } | 62 | } |
68 | 63 | ||
69 | 64 | ||
70 | #define MPEG_BUFFER_SIZE 65536 | 65 | #define MPEG_BUFFER_SIZE 65536 |
71 | //#define MPEG_BUFFER_SIZE 32768 //16384 // 8192 | 66 | //#define MPEG_BUFFER_SIZE 32768 //16384 // 8192 |
72 | //#define debugMsg(a) qDebug(a) | 67 | //#define debugMsg(a) qDebug(a) |
73 | #define debugMsg(a) | 68 | #define debugMsg(a) |
74 | 69 | ||
75 | 70 | ||
76 | class Input { | 71 | class Input { |
77 | public: | 72 | public: |
78 | char const *path; | 73 | char const *path; |
79 | int fd; | 74 | int fd; |
80 | #if defined(HAVE_MMAP) | 75 | #if defined(HAVE_MMAP) |
81 | void *fdm; | 76 | void *fdm; |
82 | #endif | 77 | #endif |
83 | unsigned long fileLength; | 78 | unsigned long fileLength; |
84 | unsigned char *data; | 79 | unsigned char *data; |
85 | unsigned long length; | 80 | unsigned long length; |
86 | int eof; | 81 | int eof; |
87 | }; | 82 | }; |
88 | 83 | ||
89 | 84 | ||
90 | class Output { | 85 | class Output { |
91 | public: | 86 | public: |
92 | mad_fixed_t attenuate; | 87 | mad_fixed_t attenuate; |
93 | struct filter *filters; | 88 | struct filter *filters; |
94 | unsigned int channels_in; | 89 | unsigned int channels_in; |
95 | unsigned int channels_out; | 90 | unsigned int channels_out; |
96 | unsigned int speed_in; | 91 | unsigned int speed_in; |
97 | unsigned int speed_out; | 92 | unsigned int speed_out; |
98 | const char *path; | 93 | const char *path; |
99 | }; | 94 | }; |
100 | 95 | ||
101 | 96 | ||
102 | # if defined(HAVE_MMAP) | 97 | # if defined(HAVE_MMAP) |
103 | static void *map_file(int fd, unsigned long *length) | 98 | static void *map_file(int fd, unsigned long *length) |
104 | { | 99 | { |
105 | void *fdm; | 100 | void *fdm; |
106 | 101 | ||
107 | *length += MAD_BUFFER_GUARD; | 102 | *length += MAD_BUFFER_GUARD; |
108 | 103 | ||
109 | fdm = mmap(0, *length, PROT_READ, MAP_SHARED, fd, 0); | 104 | fdm = mmap(0, *length, PROT_READ, MAP_SHARED, fd, 0); |
110 | if (fdm == MAP_FAILED) | 105 | if (fdm == MAP_FAILED) |
111 | return 0; | 106 | return 0; |
112 | 107 | ||
113 | # if defined(HAVE_MADVISE) | 108 | # if defined(HAVE_MADVISE) |
114 | madvise(fdm, *length, MADV_SEQUENTIAL); | 109 | madvise(fdm, *length, MADV_SEQUENTIAL); |
115 | # endif | 110 | # endif |
116 | 111 | ||
117 | return fdm; | 112 | return fdm; |
118 | } | 113 | } |
119 | 114 | ||
120 | 115 | ||
121 | static int unmap_file(void *fdm, unsigned long length) | 116 | static int unmap_file(void *fdm, unsigned long length) |
122 | { | 117 | { |
123 | if (munmap(fdm, length) == -1) | 118 | if (munmap(fdm, length) == -1) |
124 | return -1; | 119 | return -1; |
125 | 120 | ||
126 | return 0; | 121 | return 0; |
127 | } | 122 | } |
128 | # endif | 123 | # endif |
129 | 124 | ||
130 | 125 | ||
131 | static inline QString tr( const char *str ) { | 126 | static inline QString tr( const char *str ) { |
132 | // Apparently this is okay from a plugin as it runs in the process space of the owner of the plugin | 127 | // Apparently this is okay from a plugin as it runs in the process space of the owner of the plugin |
133 | return qApp->translate( "OpiePlayer", str, "libmad strings for mp3 file info" ); | 128 | return qApp->translate( "OpiePlayer", str, "libmad strings for mp3 file info" ); |
134 | } | 129 | } |
135 | 130 | ||
136 | 131 | ||
137 | class LibMadPluginData { | 132 | class LibMadPluginData { |
138 | public: | 133 | public: |
139 | Input input; | 134 | Input input; |
140 | Output output; | 135 | Output output; |
141 | int bad_last_frame; | 136 | int bad_last_frame; |
142 | struct mad_stream stream; | 137 | struct mad_stream stream; |
143 | struct mad_frame frame; | 138 | struct mad_frame frame; |
144 | struct mad_synth synth; | 139 | struct mad_synth synth; |
145 | bool flush; | 140 | bool flush; |
146 | }; | 141 | }; |
147 | 142 | ||
148 | 143 | ||
149 | LibMadPlugin::LibMadPlugin() { | 144 | LibMadPlugin::LibMadPlugin() { |
150 | d = new LibMadPluginData; | 145 | d = new LibMadPluginData; |
151 | d->input.fd = 0; | 146 | d->input.fd = 0; |
152 | #if defined(HAVE_MMAP) | 147 | #if defined(HAVE_MMAP) |
153 | d->input.fdm = 0; | 148 | d->input.fdm = 0; |
154 | #endif | 149 | #endif |
155 | d->input.data = 0; | 150 | d->input.data = 0; |
156 | d->flush = TRUE; | 151 | d->flush = TRUE; |
157 | info = tr( "No Song Open" ); | 152 | info = tr( "No Song Open" ); |
158 | } | 153 | } |
159 | 154 | ||
160 | 155 | ||
161 | LibMadPlugin::~LibMadPlugin() { | 156 | LibMadPlugin::~LibMadPlugin() { |
162 | close(); | 157 | close(); |
163 | delete d; | 158 | delete d; |
164 | } | 159 | } |
165 | 160 | ||
166 | 161 | ||
167 | bool LibMadPlugin::isFileSupported( const QString& path ) { | 162 | bool LibMadPlugin::isFileSupported( const QString& path ) { |
168 | debugMsg( "LibMadPlugin::isFileSupported" ); | 163 | debugMsg( "LibMadPlugin::isFileSupported" ); |
169 | 164 | ||
170 | // Mpeg file extensions | 165 | // Mpeg file extensions |
171 | // "mp2","mp3","m1v","m2v","m2s","mpg","vob","mpeg","ac3" | 166 | // "mp2","mp3","m1v","m2v","m2s","mpg","vob","mpeg","ac3" |
172 | // Other media extensions | 167 | // Other media extensions |
173 | // "wav","mid","mod","s3m","ogg","avi","mov","sid" | 168 | // "wav","mid","mod","s3m","ogg","avi","mov","sid" |
174 | 169 | ||
175 | char *ext = strrchr( path.latin1(), '.' ); | 170 | char *ext = strrchr( path.latin1(), '.' ); |
176 | 171 | ||
177 | // Test file extension | 172 | // Test file extension |
178 | if ( ext ) { | 173 | if ( ext ) { |
179 | if ( strncasecmp(ext, ".mp2", 4) == 0 ) | 174 | if ( strncasecmp(ext, ".mp2", 4) == 0 ) |
180 | return TRUE; | 175 | return TRUE; |
181 | if ( strncasecmp(ext, ".mp3", 4) == 0 ) | 176 | if ( strncasecmp(ext, ".mp3", 4) == 0 ) |
182 | return TRUE; | 177 | return TRUE; |
183 | } | 178 | } |
184 | 179 | ||
185 | // UGLY - just for fast testing | 180 | // UGLY - just for fast testing |
186 | if ( path.left(4) == "http") { | 181 | if ( path.left(4) == "http") { |
187 | return TRUE; | 182 | return TRUE; |
188 | } | 183 | } |
189 | 184 | ||
190 | return FALSE; | 185 | return FALSE; |
@@ -262,612 +257,613 @@ int LibMadPlugin::tcp_open(char *address, int port) { | |||
262 | struct linger l; | 257 | struct linger l; |
263 | 258 | ||
264 | memset(&stAddr, 0, sizeof(stAddr)); | 259 | memset(&stAddr, 0, sizeof(stAddr)); |
265 | stAddr.sin_family = AF_INET; | 260 | stAddr.sin_family = AF_INET; |
266 | stAddr.sin_port = htons(port); | 261 | stAddr.sin_port = htons(port); |
267 | 262 | ||
268 | if ((host = gethostbyname(address)) == NULL) { | 263 | if ((host = gethostbyname(address)) == NULL) { |
269 | return (0); | 264 | return (0); |
270 | } | 265 | } |
271 | 266 | ||
272 | stAddr.sin_addr = *((struct in_addr *)host->h_addr_list[0]); | 267 | stAddr.sin_addr = *((struct in_addr *)host->h_addr_list[0]); |
273 | 268 | ||
274 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { | 269 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { |
275 | return (0); | 270 | return (0); |
276 | } | 271 | } |
277 | 272 | ||
278 | l.l_onoff = 1; | 273 | l.l_onoff = 1; |
279 | l.l_linger = 5; | 274 | l.l_linger = 5; |
280 | if (setsockopt(sock, SOL_SOCKET, SO_LINGER, (char *)&l, sizeof(l)) < 0) { | 275 | if (setsockopt(sock, SOL_SOCKET, SO_LINGER, (char *)&l, sizeof(l)) < 0) { |
281 | return (0); | 276 | return (0); |
282 | } | 277 | } |
283 | 278 | ||
284 | if (connect(sock, (struct sockaddr *)&stAddr, sizeof(stAddr)) < 0) { | 279 | if (connect(sock, (struct sockaddr *)&stAddr, sizeof(stAddr)) < 0) { |
285 | return (0); | 280 | return (0); |
286 | } | 281 | } |
287 | 282 | ||
288 | return (sock); | 283 | return (sock); |
289 | } | 284 | } |
290 | 285 | ||
291 | 286 | ||
292 | /** | 287 | /** |
293 | * Read a http line header. | 288 | * Read a http line header. |
294 | * This function read character by character. | 289 | * This function read character by character. |
295 | * @param tcp_sock the socket use to read the stream | 290 | * @param tcp_sock the socket use to read the stream |
296 | * @param buf a buffer to receive the data | 291 | * @param buf a buffer to receive the data |
297 | * @param size size of the buffer | 292 | * @param size size of the buffer |
298 | * @return the size of the stream read or -1 if an error occured | 293 | * @return the size of the stream read or -1 if an error occured |
299 | */ | 294 | */ |
300 | int LibMadPlugin::http_read_line(int tcp_sock, char *buf, int size) { | 295 | int LibMadPlugin::http_read_line(int tcp_sock, char *buf, int size) { |
301 | int offset = 0; | 296 | int offset = 0; |
302 | 297 | ||
303 | do { | 298 | do { |
304 | if (::read(tcp_sock, buf + offset, 1) < 0) | 299 | if (::read(tcp_sock, buf + offset, 1) < 0) |
305 | return -1; | 300 | return -1; |
306 | if (buf[offset] != '\r') /* Strip \r from answer */ | 301 | if (buf[offset] != '\r') /* Strip \r from answer */ |
307 | offset++; | 302 | offset++; |
308 | } while (offset < size - 1 && buf[offset - 1] != '\n'); | 303 | } while (offset < size - 1 && buf[offset - 1] != '\n'); |
309 | 304 | ||
310 | buf[offset] = 0; | 305 | buf[offset] = 0; |
311 | return offset; | 306 | return offset; |
312 | } | 307 | } |
313 | 308 | ||
314 | int LibMadPlugin::http_open(const QString& path ) { | 309 | int LibMadPlugin::http_open(const QString& path ) { |
315 | char *host; | 310 | char *host; |
316 | int port; | 311 | int port; |
317 | char *request; | 312 | char *request; |
318 | int tcp_sock; | 313 | int tcp_sock; |
319 | char http_request[PATH_MAX]; | 314 | char http_request[PATH_MAX]; |
320 | char filename[PATH_MAX]; | 315 | char filename[PATH_MAX]; |
321 | //char c; | 316 | //char c; |
322 | char *arg =strdup(path.latin1()); | 317 | char *arg =strdup(path.latin1()); |
323 | 318 | ||
324 | /* Check for URL syntax */ | 319 | /* Check for URL syntax */ |
325 | if (strncmp(arg, "http://", strlen("http://"))) { | 320 | if (strncmp(arg, "http://", strlen("http://"))) { |
326 | return (0); | 321 | return (0); |
327 | } | 322 | } |
328 | 323 | ||
329 | /* Parse URL */ | 324 | /* Parse URL */ |
330 | port = 80; | 325 | port = 80; |
331 | host = arg + strlen("http://"); | 326 | host = arg + strlen("http://"); |
332 | if ((request = strchr(host, '/')) == NULL) { | 327 | if ((request = strchr(host, '/')) == NULL) { |
333 | return (0); | 328 | return (0); |
334 | } | 329 | } |
335 | 330 | ||
336 | *request++ = 0; | 331 | *request++ = 0; |
337 | 332 | ||
338 | if (strchr(host, ':') != NULL) { /* port is specified */ | 333 | if (strchr(host, ':') != NULL) { /* port is specified */ |
339 | port = atoi(strchr(host, ':') + 1); | 334 | port = atoi(strchr(host, ':') + 1); |
340 | *strchr(host, ':') = 0; | 335 | *strchr(host, ':') = 0; |
341 | } | 336 | } |
342 | 337 | ||
343 | /* Open a TCP socket */ | 338 | /* Open a TCP socket */ |
344 | if (!(tcp_sock = tcp_open(host, port))) { | 339 | if (!(tcp_sock = tcp_open(host, port))) { |
345 | perror("http_open"); | 340 | perror("http_open"); |
346 | return (0); | 341 | return (0); |
347 | } | 342 | } |
348 | 343 | ||
349 | snprintf(filename, sizeof(filename) - strlen(host) - 75, "%s", request); | 344 | snprintf(filename, sizeof(filename) - strlen(host) - 75, "%s", request); |
350 | 345 | ||
351 | /* Send HTTP GET request */ | 346 | /* Send HTTP GET request */ |
352 | /* Please don't use a Agent know by shoutcast (Lynx, Mozilla) seems to be reconized and print | 347 | /* Please don't use a Agent know by shoutcast (Lynx, Mozilla) seems to be reconized and print |
353 | * a html page and not the stream */ | 348 | * a html page and not the stream */ |
354 | snprintf(http_request, sizeof(http_request), "GET /%s HTTP/1.0\r\n" | 349 | snprintf(http_request, sizeof(http_request), "GET /%s HTTP/1.0\r\n" |
355 | /* "User-Agent: Mozilla/2.0 (Win95; I)\r\n" */ | 350 | /* "User-Agent: Mozilla/2.0 (Win95; I)\r\n" */ |
356 | "Pragma: no-cache\r\n" "Host: %s\r\n" "Accept: */*\r\n" "\r\n", filename, host); | 351 | "Pragma: no-cache\r\n" "Host: %s\r\n" "Accept: */*\r\n" "\r\n", filename, host); |
357 | 352 | ||
358 | send(tcp_sock, http_request, strlen(http_request), 0); | 353 | send(tcp_sock, http_request, strlen(http_request), 0); |
359 | 354 | ||
360 | /* Parse server reply */ | 355 | /* Parse server reply */ |
361 | #if 0 | 356 | #if 0 |
362 | do | 357 | do |
363 | read(tcp_sock, &c, sizeof(char)); | 358 | read(tcp_sock, &c, sizeof(char)); |
364 | while (c != ' '); | 359 | while (c != ' '); |
365 | read(tcp_sock, http_request, 4 * sizeof(char)); | 360 | read(tcp_sock, http_request, 4 * sizeof(char)); |
366 | http_request[4] = 0; | 361 | http_request[4] = 0; |
367 | if (strcmp(http_request, "200 ")) { | 362 | if (strcmp(http_request, "200 ")) { |
368 | fprintf(stderr, "http_open: "); | 363 | fprintf(stderr, "http_open: "); |
369 | do { | 364 | do { |
370 | read(tcp_sock, &c, sizeof(char)); | 365 | read(tcp_sock, &c, sizeof(char)); |
371 | fprintf(stderr, "%c", c); | 366 | fprintf(stderr, "%c", c); |
372 | } while (c != '\r'); | 367 | } while (c != '\r'); |
373 | fprintf(stderr, "\n"); | 368 | fprintf(stderr, "\n"); |
374 | return (0); | 369 | return (0); |
375 | } | 370 | } |
376 | #endif | 371 | #endif |
377 | 372 | ||
378 | QString name; | 373 | QString name; |
379 | QString genre; | 374 | QString genre; |
380 | QString bitrate; | 375 | QString bitrate; |
381 | QString url; | 376 | QString url; |
382 | QString message = tr("Info: "); | 377 | QString message = tr("Info: "); |
383 | do { | 378 | do { |
384 | 379 | ||
385 | int len; | 380 | int len; |
386 | 381 | ||
387 | len = http_read_line(tcp_sock, http_request, sizeof(http_request)); | 382 | len = http_read_line(tcp_sock, http_request, sizeof(http_request)); |
388 | 383 | ||
389 | if (len == -1) { | 384 | if (len == -1) { |
390 | // odebug << "http_open: "+ QString(strerror(errno)) +"\n" << oendl; | 385 | // qDebug( "http_open: "+ QString(strerror(errno)) +"\n"); |
391 | return 0; | 386 | return 0; |
392 | } | 387 | } |
393 | 388 | ||
394 | if (QString(http_request).left(9) == "Location:") { | 389 | if (QString(http_request).left(9) == "Location:") { |
395 | /* redirect */ | 390 | /* redirect */ |
396 | ::close(tcp_sock); | 391 | ::close(tcp_sock); |
397 | http_request[strlen(http_request) - 1] = '\0'; | 392 | http_request[strlen(http_request) - 1] = '\0'; |
398 | return http_open(&http_request[10]); | 393 | return http_open(&http_request[10]); |
399 | } | 394 | } |
400 | 395 | ||
401 | if (QString(http_request).left(4) == "ICY ") { | 396 | if (QString(http_request).left(4) == "ICY ") { |
402 | /* This is shoutcast/icecast streaming */ | 397 | /* This is shoutcast/icecast streaming */ |
403 | if (strncmp(http_request + 4, "200 ", 4)) { | 398 | if (strncmp(http_request + 4, "200 ", 4)) { |
404 | // odebug << "http_open: " + QString(http_request) + "\n" << oendl; | 399 | // qDebug("http_open: " + QString(http_request) + "\n"); |
405 | return 0; | 400 | return 0; |
406 | } | 401 | } |
407 | } else if (QString(http_request).left(4) == "icy-") { | 402 | } else if (QString(http_request).left(4) == "icy-") { |
408 | /* we can have: icy-noticeX, icy-name, icy-genre, icy-url, icy-pub, icy-metaint, icy-br */ | 403 | /* we can have: icy-noticeX, icy-name, icy-genre, icy-url, icy-pub, icy-metaint, icy-br */ |
409 | if ( QString( http_request ).left( 8 ) == "icy-name" ) { | 404 | if ( QString( http_request ).left( 8 ) == "icy-name" ) { |
410 | name = tr("Name: ") + QString(http_request).mid(9, (QString(http_request).length())- 9 ); | 405 | name = tr("Name: ") + QString(http_request).mid(9, (QString(http_request).length())- 9 ); |
411 | } else if ( QString( http_request ).left( 9 ) == "icy-genre" ) { | 406 | } else if ( QString( http_request ).left( 9 ) == "icy-genre" ) { |
412 | genre = tr("Genre: ") + QString(http_request).mid(10, (QString(http_request).length())-10 ); | 407 | genre = tr("Genre: ") + QString(http_request).mid(10, (QString(http_request).length())-10 ); |
413 | } else if ( QString( http_request ).left( 6 ) == "icy-br" ) { | 408 | } else if ( QString( http_request ).left( 6 ) == "icy-br" ) { |
414 | bitrate = tr("Bitrate: ") + QString(http_request).mid(7, (QString(http_request).length())- 7 ); | 409 | bitrate = tr("Bitrate: ") + QString(http_request).mid(7, (QString(http_request).length())- 7 ); |
415 | } else if ( QString( http_request ).left( 7 ) == "icy-url" ) { | 410 | } else if ( QString( http_request ).left( 7 ) == "icy-url" ) { |
416 | url = tr("URL: ") + QString(http_request).mid(8, (QString(http_request).length())- 8 ); | 411 | url = tr("URL: ") + QString(http_request).mid(8, (QString(http_request).length())- 8 ); |
417 | } else if ( QString( http_request ).left( 10 ) == "icy-notice" ) { | 412 | } else if ( QString( http_request ).left( 10 ) == "icy-notice" ) { |
418 | message += QString(http_request).mid(11, QString(http_request).length()-11 ) ; | 413 | message += QString(http_request).mid(11, QString(http_request).length()-11 ) ; |
419 | } | 414 | } |
420 | } | 415 | } |
421 | } while (strcmp(http_request, "\n") != 0); | 416 | } while (strcmp(http_request, "\n") != 0); |
422 | 417 | ||
423 | info = QString(name + genre + url + bitrate + message).replace( QRegExp("\n"), " : " ); | 418 | info = QString(name + genre + url + bitrate + message).replace( QRegExp("\n"), " : " ); |
424 | 419 | ||
425 | // odebug << "Stream info: " + info << oendl; | 420 | // qDebug("Stream info: " + info); |
426 | 421 | ||
427 | return (tcp_sock); | 422 | return (tcp_sock); |
428 | } | 423 | } |
429 | 424 | ||
430 | 425 | ||
431 | 426 | ||
432 | bool LibMadPlugin::open( const QString& path ) { | 427 | bool LibMadPlugin::open( const QString& path ) { |
433 | debugMsg( "LibMadPlugin::open" ); | 428 | debugMsg( "LibMadPlugin::open" ); |
434 | Config cfg("OpiePlayer"); | 429 | Config cfg("OpiePlayer"); |
435 | cfg.setGroup("Options"); | 430 | cfg.setGroup("Options"); |
436 | bufferSize = cfg.readNumEntry("MPeg_BufferSize",MPEG_BUFFER_SIZE); | 431 | bufferSize = cfg.readNumEntry("MPeg_BufferSize",MPEG_BUFFER_SIZE); |
437 | // odebug << "buffer size is " << bufferSize << "" << oendl; | 432 | // qDebug("buffer size is %d", bufferSize); |
438 | d->bad_last_frame = 0; | 433 | d->bad_last_frame = 0; |
439 | d->flush = TRUE; | 434 | d->flush = TRUE; |
440 | info = QString( "" ); | 435 | info = QString( "" ); |
441 | 436 | ||
442 | //odebug << "Opening " << path << "" << oendl; | 437 | //qDebug( "Opening %s", path.latin1() ); |
443 | 438 | ||
444 | if (path.left( 4 ) == "http" ) { | 439 | if (path.left( 4 ) == "http" ) { |
445 | // in case of any error we get 0 here | 440 | // in case of any error we get 0 here |
446 | if ( !(http_open(path) == 0) ) { | 441 | if ( !(http_open(path) == 0) ) { |
447 | d->input.fd = http_open(path); | 442 | d->input.fd = http_open(path); |
448 | } else { | 443 | } else { |
449 | return FALSE; | 444 | return FALSE; |
450 | } | 445 | } |
451 | } else { | 446 | } else { |
452 | d->input.path = path.latin1(); | 447 | d->input.path = path.latin1(); |
453 | d->input.fd = ::open( d->input.path, O_RDONLY ); | 448 | d->input.fd = ::open( d->input.path, O_RDONLY ); |
454 | // thats a better place, since it should only seek for ID3 tags on mp3 files, not streams | 449 | // thats a better place, since it should only seek for ID3 tags on mp3 files, not streams |
455 | printID3Tags(); | 450 | printID3Tags(); |
456 | } | 451 | } |
457 | if (d->input.fd == -1) { | 452 | if (d->input.fd == -1) { |
458 | // odebug << "error opening " << d->input.path << "" << oendl; | 453 | // qDebug("error opening %s", d->input.path ); |
459 | return FALSE; | 454 | return FALSE; |
460 | } | 455 | } |
461 | 456 | ||
462 | struct stat stat; | 457 | struct stat stat; |
463 | if (fstat(d->input.fd, &stat) == -1) { | 458 | if (fstat(d->input.fd, &stat) == -1) { |
464 | // odebug << "error calling fstat" << oendl; return FALSE; | 459 | // qDebug("error calling fstat"); return FALSE; |
465 | } | 460 | } |
466 | if (S_ISREG(stat.st_mode) && stat.st_size > 0) | 461 | if (S_ISREG(stat.st_mode) && stat.st_size > 0) |
467 | d->input.fileLength = stat.st_size; | 462 | d->input.fileLength = stat.st_size; |
468 | else | 463 | else |
469 | d->input.fileLength = 0; | 464 | d->input.fileLength = 0; |
470 | 465 | ||
471 | #if defined(HAVE_MMAP) | 466 | #if defined(HAVE_MMAP) |
472 | if (S_ISREG(stat.st_mode) && stat.st_size > 0) { | 467 | if (S_ISREG(stat.st_mode) && stat.st_size > 0) { |
473 | d->input.length = stat.st_size; | 468 | d->input.length = stat.st_size; |
474 | d->input.fdm = map_file(d->input.fd, &d->input.length); | 469 | d->input.fdm = map_file(d->input.fd, &d->input.length); |
475 | if (d->input.fdm == 0) { | 470 | if (d->input.fdm == 0) { |
476 | // odebug << "error mmapping file" << oendl; return FALSE; | 471 | // qDebug("error mmapping file"); return FALSE; |
477 | } | 472 | } |
478 | d->input.data = (unsigned char *)d->input.fdm; | 473 | d->input.data = (unsigned char *)d->input.fdm; |
479 | } | 474 | } |
480 | #endif | 475 | #endif |
481 | 476 | ||
482 | if (d->input.data == 0) { | 477 | if (d->input.data == 0) { |
483 | d->input.data = (unsigned char *)malloc( bufferSize /*MPEG_BUFFER_SIZE*/); | 478 | d->input.data = (unsigned char *)malloc( bufferSize /*MPEG_BUFFER_SIZE*/); |
484 | if (d->input.data == 0) { | 479 | if (d->input.data == 0) { |
485 | // odebug << "error allocating input buffer" << oendl; | 480 | // qDebug("error allocating input buffer"); |
486 | return FALSE; | 481 | return FALSE; |
487 | } | 482 | } |
488 | d->input.length = 0; | 483 | d->input.length = 0; |
489 | } | 484 | } |
490 | 485 | ||
491 | d->input.eof = 0; | 486 | d->input.eof = 0; |
492 | 487 | ||
493 | mad_stream_init(&d->stream); | 488 | mad_stream_init(&d->stream); |
494 | mad_frame_init(&d->frame); | 489 | mad_frame_init(&d->frame); |
495 | mad_synth_init(&d->synth); | 490 | mad_synth_init(&d->synth); |
496 | 491 | ||
497 | return TRUE; | 492 | return TRUE; |
498 | } | 493 | } |
499 | 494 | ||
500 | 495 | ||
501 | bool LibMadPlugin::close() { | 496 | bool LibMadPlugin::close() { |
502 | debugMsg( "LibMadPlugin::close" ); | 497 | debugMsg( "LibMadPlugin::close" ); |
503 | 498 | ||
504 | int result = TRUE; | 499 | int result = TRUE; |
505 | 500 | ||
506 | mad_synth_finish(&d->synth); | 501 | mad_synth_finish(&d->synth); |
507 | mad_frame_finish(&d->frame); | 502 | mad_frame_finish(&d->frame); |
508 | mad_stream_finish(&d->stream); | 503 | mad_stream_finish(&d->stream); |
509 | 504 | ||
510 | #if defined(HAVE_MMAP) | 505 | #if defined(HAVE_MMAP) |
511 | if (d->input.fdm) { | 506 | if (d->input.fdm) { |
512 | if (unmap_file(d->input.fdm, d->input.length) == -1) { | 507 | if (unmap_file(d->input.fdm, d->input.length) == -1) { |
513 | // odebug << "error munmapping file" << oendl; | 508 | // qDebug("error munmapping file"); |
514 | result = FALSE; | 509 | result = FALSE; |
515 | } | 510 | } |
516 | d->input.fdm = 0; | 511 | d->input.fdm = 0; |
517 | d->input.data = 0; | 512 | d->input.data = 0; |
518 | } | 513 | } |
519 | #endif | 514 | #endif |
520 | 515 | ||
521 | if (d->input.data) { | 516 | if (d->input.data) { |
522 | free(d->input.data); | 517 | free(d->input.data); |
523 | d->input.data = 0; | 518 | d->input.data = 0; |
524 | } | 519 | } |
525 | 520 | ||
526 | if (::close(d->input.fd) == -1) { | 521 | if (::close(d->input.fd) == -1) { |
527 | // odebug << "error closing file " << d->input.path << "" << oendl; | 522 | // qDebug("error closing file %s", d->input.path); |
528 | result = FALSE; | 523 | result = FALSE; |
529 | } | 524 | } |
530 | 525 | ||
531 | d->input.fd = 0; | 526 | d->input.fd = 0; |
532 | 527 | ||
533 | return result; | 528 | return result; |
534 | } | 529 | } |
535 | 530 | ||
536 | 531 | ||
537 | bool LibMadPlugin::isOpen() { | 532 | bool LibMadPlugin::isOpen() { |
538 | debugMsg( "LibMadPlugin::isOpen" ); | 533 | debugMsg( "LibMadPlugin::isOpen" ); |
539 | return ( d->input.fd != 0 ); | 534 | return ( d->input.fd != 0 ); |
540 | } | 535 | } |
541 | 536 | ||
542 | 537 | ||
543 | int LibMadPlugin::audioStreams() { | 538 | int LibMadPlugin::audioStreams() { |
544 | debugMsg( "LibMadPlugin::audioStreams" ); | 539 | debugMsg( "LibMadPlugin::audioStreams" ); |
545 | return 1; | 540 | return 1; |
546 | } | 541 | } |
547 | 542 | ||
548 | 543 | ||
549 | int LibMadPlugin::audioChannels( int ) { | 544 | int LibMadPlugin::audioChannels( int ) { |
550 | debugMsg( "LibMadPlugin::audioChannels" ); | 545 | debugMsg( "LibMadPlugin::audioChannels" ); |
551 | /* | 546 | /* |
552 | long t; short t1[5]; audioReadSamples( t1, 2, 1, t, 0 ); | 547 | long t; short t1[5]; audioReadSamples( t1, 2, 1, t, 0 ); |
553 | odebug << "LibMadPlugin::audioChannels: " << d->frame.header.mode > 0 ? 2 : 1 << "" << oendl; | 548 | qDebug( "LibMadPlugin::audioChannels: %i", d->frame.header.mode > 0 ? 2 : 1 ); |
554 | return d->frame.header.mode > 0 ? 2 : 1; | 549 | return d->frame.header.mode > 0 ? 2 : 1; |
555 | */ | 550 | */ |
556 | return 2; | 551 | return 2; |
557 | } | 552 | } |
558 | 553 | ||
559 | 554 | ||
560 | int LibMadPlugin::audioFrequency( int ) { | 555 | int LibMadPlugin::audioFrequency( int ) { |
561 | debugMsg( "LibMadPlugin::audioFrequency" ); | 556 | debugMsg( "LibMadPlugin::audioFrequency" ); |
562 | long t; short t1[5]; audioReadSamples( t1, 2, 1, t, 0 ); | 557 | long t; short t1[5]; audioReadSamples( t1, 2, 1, t, 0 ); |
563 | // odebug << "LibMadPlugin::audioFrequency: " << d->frame.header.samplerate << "" << oendl; | 558 | // qDebug( "LibMadPlugin::audioFrequency: %i", d->frame.header.samplerate ); |
564 | return d->frame.header.samplerate; | 559 | return d->frame.header.samplerate; |
565 | } | 560 | } |
566 | 561 | ||
567 | 562 | ||
568 | int LibMadPlugin::audioSamples( int ) { | 563 | int LibMadPlugin::audioSamples( int ) { |
569 | debugMsg( "LibMadPlugin::audioSamples" ); | 564 | debugMsg( "LibMadPlugin::audioSamples" ); |
570 | 565 | ||
571 | long t; short t1[5]; audioReadSamples( t1, 2, 1, t, 0 ); | 566 | long t; short t1[5]; audioReadSamples( t1, 2, 1, t, 0 ); |
572 | mad_header_decode( (struct mad_header *)&d->frame.header, &d->stream ); | 567 | mad_header_decode( (struct mad_header *)&d->frame.header, &d->stream ); |
573 | /* | 568 | /* |
574 | odebug << "LibMadPlugin::audioSamples: " << d->frame.header.duration.seconds << "*" << d->frame.header.samplerate << oendl; | 569 | qDebug( "LibMadPlugin::audioSamples: %i*%i", d->frame.header.duration.seconds, |
570 | d->frame.header.samplerate ); | ||
575 | return d->frame.header.duration.seconds * d->frame.header.samplerate; | 571 | return d->frame.header.duration.seconds * d->frame.header.samplerate; |
576 | */ | 572 | */ |
577 | if ( d->frame.header.bitrate == 0 ) | 573 | if ( d->frame.header.bitrate == 0 ) |
578 | return 0; | 574 | return 0; |
579 | int samples = (d->input.fileLength / (d->frame.header.bitrate/8)) * d->frame.header.samplerate; | 575 | int samples = (d->input.fileLength / (d->frame.header.bitrate/8)) * d->frame.header.samplerate; |
580 | 576 | ||
581 | // odebug << "LibMadPlugin::audioSamples: " << (int)d->input.fileLength | 577 | // qDebug( "LibMadPlugin::audioSamples: %i * %i * 8 / %i", (int)d->input.fileLength, |
582 | // << " * " << (int)d->frame.header.samplerate << " * 8 / " << (int)d->frame.header.bitrate << oendl; | 578 | // (int)d->frame.header.samplerate, (int)d->frame.header.bitrate ); |
583 | // odebug << "LibMadPlugin::audioSamples: " << samples << "" << oendl; | 579 | // qDebug( "LibMadPlugin::audioSamples: %i", samples ); |
584 | 580 | ||
585 | return samples; | 581 | return samples; |
586 | 582 | ||
587 | // return 10000000; | 583 | // return 10000000; |
588 | } | 584 | } |
589 | 585 | ||
590 | 586 | ||
591 | bool LibMadPlugin::audioSetSample( long, int ) { | 587 | bool LibMadPlugin::audioSetSample( long, int ) { |
592 | debugMsg( "LibMadPlugin::audioSetSample" ); | 588 | debugMsg( "LibMadPlugin::audioSetSample" ); |
593 | 589 | ||
594 | // long totalSamples = audioSamples(0); | 590 | // long totalSamples = audioSamples(0); |
595 | // if ( totalSamples <= 1 ) | 591 | // if ( totalSamples <= 1 ) |
596 | // return FALSE; | 592 | // return FALSE; |
597 | 593 | ||
598 | // // Seek to requested position | 594 | // // Seek to requested position |
599 | // odebug << "seek pos: " << (int)((double)pos * d->input.fileLength / totalSamples) << "" << oendl; | 595 | // qDebug( "seek pos: %i", (int)((double)pos * d->input.fileLength / totalSamples) ); |
600 | // ::lseek( d->input.fd, (long)((double)pos * d->input.fileLength / totalSamples), SEEK_SET ); | 596 | // ::lseek( d->input.fd, (long)((double)pos * d->input.fileLength / totalSamples), SEEK_SET ); |
601 | // mad_stream_sync(&d->stream); | 597 | // mad_stream_sync(&d->stream); |
602 | 598 | ||
603 | // mad_stream_init(&d->stream); | 599 | // mad_stream_init(&d->stream); |
604 | // mad_frame_init(&d->frame); | 600 | // mad_frame_init(&d->frame); |
605 | // mad_synth_init(&d->synth); | 601 | // mad_synth_init(&d->synth); |
606 | 602 | ||
607 | // return TRUE; | 603 | // return TRUE; |
608 | debugMsg( "LibMadPlugin::audioSetSample" ); | 604 | debugMsg( "LibMadPlugin::audioSetSample" ); |
609 | return FALSE; | 605 | return FALSE; |
610 | } | 606 | } |
611 | 607 | ||
612 | 608 | ||
613 | long LibMadPlugin::audioGetSample( int ) { | 609 | long LibMadPlugin::audioGetSample( int ) { |
614 | debugMsg( "LibMadPlugin::audioGetSample" ); | 610 | debugMsg( "LibMadPlugin::audioGetSample" ); |
615 | return 0; | 611 | return 0; |
616 | } | 612 | } |
617 | 613 | ||
618 | /* | 614 | /* |
619 | bool LibMadPlugin::audioReadSamples( short *, int, long, int ) { | 615 | bool LibMadPlugin::audioReadSamples( short *, int, long, int ) { |
620 | debugMsg( "LibMadPlugin::audioReadSamples" ); | 616 | debugMsg( "LibMadPlugin::audioReadSamples" ); |
621 | return FALSE; | 617 | return FALSE; |
622 | } | 618 | } |
623 | 619 | ||
624 | 620 | ||
625 | bool LibMadPlugin::audioReReadSamples( short *, int, long, int ) { | 621 | bool LibMadPlugin::audioReReadSamples( short *, int, long, int ) { |
626 | debugMsg( "LibMadPlugin::audioReReadSamples" ); | 622 | debugMsg( "LibMadPlugin::audioReReadSamples" ); |
627 | return FALSE; | 623 | return FALSE; |
628 | } | 624 | } |
629 | */ | 625 | */ |
630 | 626 | ||
631 | bool LibMadPlugin::read() { | 627 | bool LibMadPlugin::read() { |
632 | debugMsg( "LibMadPlugin::read" ); | 628 | debugMsg( "LibMadPlugin::read" ); |
633 | int len; | 629 | int len; |
634 | 630 | ||
635 | if (d->input.eof) | 631 | if (d->input.eof) |
636 | return FALSE; | 632 | return FALSE; |
637 | 633 | ||
638 | #if defined(HAVE_MMAP) | 634 | #if defined(HAVE_MMAP) |
639 | if (d->input.fdm) { | 635 | if (d->input.fdm) { |
640 | unsigned long skip = 0; | 636 | unsigned long skip = 0; |
641 | 637 | ||
642 | if (d->stream.next_frame) { | 638 | if (d->stream.next_frame) { |
643 | struct stat stat; | 639 | struct stat stat; |
644 | 640 | ||
645 | if (fstat(d->input.fd, &stat) == -1) | 641 | if (fstat(d->input.fd, &stat) == -1) |
646 | return FALSE; | 642 | return FALSE; |
647 | 643 | ||
648 | if (stat.st_size + MAD_BUFFER_GUARD <= (signed)d->input.length) | 644 | if (stat.st_size + MAD_BUFFER_GUARD <= (signed)d->input.length) |
649 | return FALSE; | 645 | return FALSE; |
650 | 646 | ||
651 | // file size changed; update memory map | 647 | // file size changed; update memory map |
652 | skip = d->stream.next_frame - d->input.data; | 648 | skip = d->stream.next_frame - d->input.data; |
653 | 649 | ||
654 | if (unmap_file(d->input.fdm, d->input.length) == -1) { | 650 | if (unmap_file(d->input.fdm, d->input.length) == -1) { |
655 | d->input.fdm = 0; | 651 | d->input.fdm = 0; |
656 | d->input.data = 0; | 652 | d->input.data = 0; |
657 | return FALSE; | 653 | return FALSE; |
658 | } | 654 | } |
659 | 655 | ||
660 | d->input.length = stat.st_size; | 656 | d->input.length = stat.st_size; |
661 | 657 | ||
662 | d->input.fdm = map_file(d->input.fd, &d->input.length); | 658 | d->input.fdm = map_file(d->input.fd, &d->input.length); |
663 | if (d->input.fdm == 0) { | 659 | if (d->input.fdm == 0) { |
664 | d->input.data = 0; | 660 | d->input.data = 0; |
665 | return FALSE; | 661 | return FALSE; |
666 | } | 662 | } |
667 | 663 | ||
668 | d->input.data = (unsigned char *)d->input.fdm; | 664 | d->input.data = (unsigned char *)d->input.fdm; |
669 | } | 665 | } |
670 | 666 | ||
671 | mad_stream_buffer(&d->stream, d->input.data + skip, d->input.length - skip); | 667 | mad_stream_buffer(&d->stream, d->input.data + skip, d->input.length - skip); |
672 | 668 | ||
673 | } else | 669 | } else |
674 | #endif | 670 | #endif |
675 | { | 671 | { |
676 | if (d->stream.next_frame) { | 672 | if (d->stream.next_frame) { |
677 | memmove(d->input.data, d->stream.next_frame, | 673 | memmove(d->input.data, d->stream.next_frame, |
678 | d->input.length = &d->input.data[d->input.length] - d->stream.next_frame); | 674 | d->input.length = &d->input.data[d->input.length] - d->stream.next_frame); |
679 | } | 675 | } |
680 | 676 | ||
681 | do { | 677 | do { |
682 | len = ::read(d->input.fd, d->input.data + d->input.length, bufferSize /* MPEG_BUFFER_SIZE*/ - d->input.length); | 678 | len = ::read(d->input.fd, d->input.data + d->input.length, bufferSize /* MPEG_BUFFER_SIZE*/ - d->input.length); |
683 | } | 679 | } |
684 | while (len == -1 && errno == EINTR); | 680 | while (len == -1 && errno == EINTR); |
685 | 681 | ||
686 | if (len == -1) { | 682 | if (len == -1) { |
687 | // odebug << "error reading audio" << oendl; | 683 | // qDebug("error reading audio"); |
688 | return FALSE; | 684 | return FALSE; |
689 | } | 685 | } |
690 | else if (len == 0) { | 686 | else if (len == 0) { |
691 | d->input.eof = 1; | 687 | d->input.eof = 1; |
692 | 688 | ||
693 | assert(bufferSize /*MPEG_BUFFER_SIZE*/ - d->input.length >= MAD_BUFFER_GUARD); | 689 | assert(bufferSize /*MPEG_BUFFER_SIZE*/ - d->input.length >= MAD_BUFFER_GUARD); |
694 | 690 | ||
695 | while (len < MAD_BUFFER_GUARD) | 691 | while (len < MAD_BUFFER_GUARD) |
696 | d->input.data[d->input.length + len++] = 0; | 692 | d->input.data[d->input.length + len++] = 0; |
697 | } | 693 | } |
698 | 694 | ||
699 | mad_stream_buffer(&d->stream, d->input.data, d->input.length += len); | 695 | mad_stream_buffer(&d->stream, d->input.data, d->input.length += len); |
700 | } | 696 | } |
701 | 697 | ||
702 | return TRUE; | 698 | return TRUE; |
703 | } | 699 | } |
704 | 700 | ||
705 | 701 | ||
706 | static mad_fixed_t left_err, right_err; | 702 | static mad_fixed_t left_err, right_err; |
707 | static const int bits = 16; | 703 | static const int bits = 16; |
708 | static const int shift = MAD_F_FRACBITS + 1 - bits; | 704 | static const int shift = MAD_F_FRACBITS + 1 - bits; |
709 | 705 | ||
710 | 706 | ||
711 | inline long audio_linear_dither( mad_fixed_t sample, mad_fixed_t& error ) { | 707 | inline long audio_linear_dither( mad_fixed_t sample, mad_fixed_t& error ) { |
712 | sample += error; | 708 | sample += error; |
713 | mad_fixed_t quantized = (sample >= MAD_F_ONE) ? MAD_F_ONE - 1 : ( (sample < -MAD_F_ONE) ? -MAD_F_ONE : sample ); | 709 | mad_fixed_t quantized = (sample >= MAD_F_ONE) ? MAD_F_ONE - 1 : ( (sample < -MAD_F_ONE) ? -MAD_F_ONE : sample ); |
714 | quantized &= ~((1L << shift) - 1); | 710 | quantized &= ~((1L << shift) - 1); |
715 | error = sample - quantized; | 711 | error = sample - quantized; |
716 | return quantized >> shift; | 712 | return quantized >> shift; |
717 | } | 713 | } |
718 | 714 | ||
719 | 715 | ||
720 | inline void audio_pcm( short *data, unsigned int nsamples, mad_fixed_t *left, mad_fixed_t *right ) { | 716 | inline void audio_pcm( short *data, unsigned int nsamples, mad_fixed_t *left, mad_fixed_t *right ) { |
721 | if ( right ) { | 717 | if ( right ) { |
722 | while (nsamples--) { | 718 | while (nsamples--) { |
723 | data[0] = audio_linear_dither( *left++, left_err ); | 719 | data[0] = audio_linear_dither( *left++, left_err ); |
724 | data[1] = audio_linear_dither( *right++, right_err ); | 720 | data[1] = audio_linear_dither( *right++, right_err ); |
725 | data += 2; | 721 | data += 2; |
726 | } | 722 | } |
727 | } else { | 723 | } else { |
728 | while (nsamples--) { | 724 | while (nsamples--) { |
729 | data[0] = data[1] = audio_linear_dither( *left++, left_err ); | 725 | data[0] = data[1] = audio_linear_dither( *left++, left_err ); |
730 | data += 2; | 726 | data += 2; |
731 | } | 727 | } |
732 | } | 728 | } |
733 | } | 729 | } |
734 | 730 | ||
735 | 731 | ||
736 | bool LibMadPlugin::decode( short *output, long samples, long& samplesMade ) { | 732 | bool LibMadPlugin::decode( short *output, long samples, long& samplesMade ) { |
737 | debugMsg( "LibMadPlugin::decode" ); | 733 | debugMsg( "LibMadPlugin::decode" ); |
738 | 734 | ||
739 | static int buffered = 0; | 735 | static int buffered = 0; |
740 | static mad_fixed_t buffer[2][65536 * 2]; | 736 | static mad_fixed_t buffer[2][65536 * 2]; |
741 | int offset = buffered; | 737 | int offset = buffered; |
742 | samplesMade = 0; | 738 | samplesMade = 0; |
743 | 739 | ||
744 | static int maxBuffered = 8000; // 65536; | 740 | static int maxBuffered = 8000; // 65536; |
745 | 741 | ||
746 | if ( samples > maxBuffered ) { | 742 | if ( samples > maxBuffered ) { |
747 | samples = maxBuffered; | 743 | samples = maxBuffered; |
748 | } | 744 | } |
749 | 745 | ||
750 | if ( d->flush ) { | 746 | if ( d->flush ) { |
751 | buffered = 0; | 747 | buffered = 0; |
752 | offset = 0; | 748 | offset = 0; |
753 | d->flush = FALSE; | 749 | d->flush = FALSE; |
754 | } | 750 | } |
755 | 751 | ||
756 | while ( buffered < maxBuffered ) { | 752 | while ( buffered < maxBuffered ) { |
757 | 753 | ||
758 | while (mad_frame_decode(&d->frame, &d->stream) == -1) { | 754 | while (mad_frame_decode(&d->frame, &d->stream) == -1) { |
759 | if (!MAD_RECOVERABLE(d->stream.error)) { | 755 | if (!MAD_RECOVERABLE(d->stream.error)) { |
760 | debugMsg( "feed me" ); | 756 | debugMsg( "feed me" ); |
761 | return FALSE; // Feed me | 757 | return FALSE; // Feed me |
762 | } | 758 | } |
763 | if ( d->stream.error == MAD_ERROR_BADCRC ) { | 759 | if ( d->stream.error == MAD_ERROR_BADCRC ) { |
764 | mad_frame_mute(&d->frame); | 760 | mad_frame_mute(&d->frame); |
765 | // odebug << "error decoding, bad crc" << oendl; | 761 | // qDebug( "error decoding, bad crc" ); |
766 | } | 762 | } |
767 | } | 763 | } |
768 | 764 | ||
769 | mad_synth_frame(&d->synth, &d->frame); | 765 | mad_synth_frame(&d->synth, &d->frame); |
770 | int decodedSamples = d->synth.pcm.length; | 766 | int decodedSamples = d->synth.pcm.length; |
771 | memcpy( &(buffer[0][offset]), d->synth.pcm.samples[0], decodedSamples * sizeof(mad_fixed_t) ); | 767 | memcpy( &(buffer[0][offset]), d->synth.pcm.samples[0], decodedSamples * sizeof(mad_fixed_t) ); |
772 | if ( d->synth.pcm.channels == 2 ) | 768 | if ( d->synth.pcm.channels == 2 ) |
773 | memcpy( &(buffer[1][offset]), d->synth.pcm.samples[1], decodedSamples * sizeof(mad_fixed_t) ); | 769 | memcpy( &(buffer[1][offset]), d->synth.pcm.samples[1], decodedSamples * sizeof(mad_fixed_t) ); |
774 | offset += decodedSamples; | 770 | offset += decodedSamples; |
775 | buffered += decodedSamples; | 771 | buffered += decodedSamples; |
776 | } | 772 | } |
777 | 773 | ||
778 | //qApp->processEvents(); | 774 | //qApp->processEvents(); |
779 | audio_pcm( output, samples, buffer[0], (d->synth.pcm.channels == 2) ? buffer[1] : 0 ); | 775 | audio_pcm( output, samples, buffer[0], (d->synth.pcm.channels == 2) ? buffer[1] : 0 ); |
780 | // audio_pcm( output, samples, buffer[1], buffer[0] ); | 776 | // audio_pcm( output, samples, buffer[1], buffer[0] ); |
781 | // audio_pcm( output, samples, buffer[0], buffer[1] ); | 777 | // audio_pcm( output, samples, buffer[0], buffer[1] ); |
782 | samplesMade = samples; | 778 | samplesMade = samples; |
783 | memmove( buffer[0], &(buffer[0][samples]), (buffered - samples) * sizeof(mad_fixed_t) ); | 779 | memmove( buffer[0], &(buffer[0][samples]), (buffered - samples) * sizeof(mad_fixed_t) ); |
784 | if ( d->synth.pcm.channels == 2 ) { | 780 | if ( d->synth.pcm.channels == 2 ) { |
785 | memmove( buffer[1], &(buffer[1][samples]), (buffered - samples) * sizeof(mad_fixed_t) ); | 781 | memmove( buffer[1], &(buffer[1][samples]), (buffered - samples) * sizeof(mad_fixed_t) ); |
786 | } | 782 | } |
787 | buffered -= samples; | 783 | buffered -= samples; |
788 | 784 | ||
789 | return TRUE; | 785 | return TRUE; |
790 | } | 786 | } |
791 | 787 | ||
792 | /*bool LibMadPlugin::audioReadStereoSamples( short *output, long samples, long& samplesMade, int ) { | 788 | /*bool LibMadPlugin::audioReadStereoSamples( short *output, long samples, long& samplesMade, int ) { |
793 | */ | 789 | */ |
794 | bool LibMadPlugin::audioReadSamples( short *output, int /*channels*/, long samples, long& samplesMade, int ) { | 790 | bool LibMadPlugin::audioReadSamples( short *output, int /*channels*/, long samples, long& samplesMade, int ) { |
795 | debugMsg( "LibMadPlugin::audioReadStereoSamples" ); | 791 | debugMsg( "LibMadPlugin::audioReadStereoSamples" ); |
796 | 792 | ||
797 | static bool needInput = TRUE; | 793 | static bool needInput = TRUE; |
798 | 794 | ||
799 | if ( samples == 0 ) | 795 | if ( samples == 0 ) |
800 | return FALSE; | 796 | return FALSE; |
801 | 797 | ||
802 | do { | 798 | do { |
803 | if ( needInput ) | 799 | if ( needInput ) |
804 | if ( !read() ) { | 800 | if ( !read() ) { |
805 | return FALSE; | 801 | return FALSE; |
806 | } | 802 | } |
807 | 803 | ||
808 | needInput = FALSE; | 804 | needInput = FALSE; |
809 | 805 | ||
810 | if ( decode( output, samples, samplesMade ) ) | 806 | if ( decode( output, samples, samplesMade ) ) |
811 | return TRUE; | 807 | return TRUE; |
812 | else | 808 | else |
813 | needInput = TRUE; | 809 | needInput = TRUE; |
814 | } | 810 | } |
815 | while ( ( samplesMade < samples ) && ( !d->input.eof ) ); | 811 | while ( ( samplesMade < samples ) && ( !d->input.eof ) ); |
816 | 812 | ||
817 | return FALSE; | 813 | return FALSE; |
818 | } | 814 | } |
819 | 815 | ||
820 | 816 | ||
821 | double LibMadPlugin::getTime() { | 817 | double LibMadPlugin::getTime() { |
822 | debugMsg( "LibMadPlugin::getTime" ); | 818 | debugMsg( "LibMadPlugin::getTime" ); |
823 | return 0.0; | 819 | return 0.0; |
824 | } | 820 | } |
825 | 821 | ||
826 | 822 | ||
827 | void LibMadPlugin::printID3Tags() { | 823 | void LibMadPlugin::printID3Tags() { |
828 | // odebug << "LibMadPlugin::printID3Tags" << oendl; | 824 | // qDebug( "LibMadPlugin::printID3Tags" ); |
829 | 825 | ||
830 | char id3v1[128 + 1]; | 826 | char id3v1[128 + 1]; |
831 | 827 | ||
832 | if ( ::lseek( d->input.fd, -128, SEEK_END ) == -1 ) { | 828 | if ( ::lseek( d->input.fd, -128, SEEK_END ) == -1 ) { |
833 | // odebug << "error seeking to id3 tags" << oendl; | 829 | // qDebug( "error seeking to id3 tags" ); |
834 | return; | 830 | return; |
835 | } | 831 | } |
836 | 832 | ||
837 | if ( ::read( d->input.fd, id3v1, 128 ) != 128 ) { | 833 | if ( ::read( d->input.fd, id3v1, 128 ) != 128 ) { |
838 | // odebug << "error reading in id3 tags" << oendl; | 834 | // qDebug( "error reading in id3 tags" ); |
839 | return; | 835 | return; |
840 | } | 836 | } |
841 | 837 | ||
842 | if ( ::strncmp( (const char *)id3v1, "TAG", 3 ) != 0 ) { | 838 | if ( ::strncmp( (const char *)id3v1, "TAG", 3 ) != 0 ) { |
843 | debugMsg( "sorry, no id3 tags" ); | 839 | debugMsg( "sorry, no id3 tags" ); |
844 | } else { | 840 | } else { |
845 | int len[5] = { 30, 30, 30, 4, 30 }; | 841 | int len[5] = { 30, 30, 30, 4, 30 }; |
846 | QString label[5] = { tr( "Title" ), tr( "Artist" ), tr( "Album" ), tr( "Year" ), tr( "Comment" ) }; | 842 | QString label[5] = { tr( "Title" ), tr( "Artist" ), tr( "Album" ), tr( "Year" ), tr( "Comment" ) }; |
847 | char *ptr = id3v1 + 3, *ptr2 = ptr + len[0]; | 843 | char *ptr = id3v1 + 3, *ptr2 = ptr + len[0]; |
848 | // odebug << "ID3 tags in file:" << oendl; | 844 | // qDebug( "ID3 tags in file:" ); |
849 | info = ""; | 845 | info = ""; |
850 | for ( int i = 0; i < 5; ptr += len[i], i++, ptr2 += len[i] ) { | 846 | for ( int i = 0; i < 5; ptr += len[i], i++, ptr2 += len[i] ) { |
851 | char push = *ptr2; | 847 | char push = *ptr2; |
852 | *ptr2 = '\0'; | 848 | *ptr2 = '\0'; |
853 | char *ptr3 = ptr2; | 849 | char *ptr3 = ptr2; |
854 | while ( ptr3-1 >= ptr && isspace(ptr3[-1]) ) ptr3--; | 850 | while ( ptr3-1 >= ptr && isspace(ptr3[-1]) ) ptr3--; |
855 | char push2 = *ptr3; *ptr3 = '\0'; | 851 | char push2 = *ptr3; *ptr3 = '\0'; |
856 | if ( strcmp( ptr, "" ) ) { | 852 | if ( strcmp( ptr, "" ) ) { |
857 | if( ((QString)ptr).find(" ") == -1) // don't add anything that has blanks | 853 | if( ((QString)ptr).find(" ") == -1) // don't add anything that has blanks |
858 | info += ( i != 0 ? ", " : "" ) + label[i] + ": " + ptr; | 854 | info += ( i != 0 ? ", " : "" ) + label[i] + ": " + ptr; |
859 | } | 855 | } |
860 | // odebug << info.latin1() << oendl; | 856 | // qDebug( info.latin1() ); |
861 | *ptr3 = push2; | 857 | *ptr3 = push2; |
862 | *ptr2 = push; | 858 | *ptr2 = push; |
863 | } | 859 | } |
864 | if (id3v1[126] == 0 && id3v1[127] != 0) | 860 | if (id3v1[126] == 0 && id3v1[127] != 0) |
865 | info += tr( ", Track: " ) + id3v1[127]; | 861 | info += tr( ", Track: " ) + id3v1[127]; |
866 | } | 862 | } |
867 | 863 | ||
868 | if ( ::lseek(d->input.fd, 0, SEEK_SET) == -1 ) { | 864 | if ( ::lseek(d->input.fd, 0, SEEK_SET) == -1 ) { |
869 | // odebug << "error seeking back to beginning" << oendl; | 865 | // qDebug( "error seeking back to beginning" ); |
870 | return; | 866 | return; |
871 | } | 867 | } |
872 | } | 868 | } |
873 | 869 | ||
diff --git a/core/multimedia/opieplayer/libmad/libmadpluginimpl.cpp b/core/multimedia/opieplayer/libmad/libmadpluginimpl.cpp index b3e01e5..67779e8 100644 --- a/core/multimedia/opieplayer/libmad/libmadpluginimpl.cpp +++ b/core/multimedia/opieplayer/libmad/libmadpluginimpl.cpp | |||
@@ -1,72 +1,70 @@ | |||
1 | /********************************************************************** | 1 | /********************************************************************** |
2 | ** Copyright (C) 2000 Trolltech AS. All rights reserved. | 2 | ** Copyright (C) 2000 Trolltech AS. All rights reserved. |
3 | ** | 3 | ** |
4 | ** This file is part of Qtopia Environment. | 4 | ** This file is part of Qtopia Environment. |
5 | ** | 5 | ** |
6 | ** This file may be distributed and/or modified under the terms of the | 6 | ** This file may be distributed and/or modified under the terms of the |
7 | ** GNU General Public License version 2 as published by the Free Software | 7 | ** GNU General Public License version 2 as published by the Free Software |
8 | ** Foundation and appearing in the file LICENSE.GPL included in the | 8 | ** Foundation and appearing in the file LICENSE.GPL included in the |
9 | ** packaging of this file. | 9 | ** packaging of this file. |
10 | ** | 10 | ** |
11 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE | 11 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE |
12 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. | 12 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. |
13 | ** | 13 | ** |
14 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | 14 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. |
15 | ** | 15 | ** |
16 | ** Contact info@trolltech.com if any conditions of this licensing are | 16 | ** Contact info@trolltech.com if any conditions of this licensing are |
17 | ** not clear to you. | 17 | ** not clear to you. |
18 | ** | 18 | ** |
19 | **********************************************************************/ | 19 | **********************************************************************/ |
20 | #include "libmadplugin.h" | 20 | #include "libmadplugin.h" |
21 | #include "libmadpluginimpl.h" | 21 | #include "libmadpluginimpl.h" |
22 | 22 | ||
23 | 23 | ||
24 | LibMadPluginImpl::LibMadPluginImpl() | 24 | LibMadPluginImpl::LibMadPluginImpl() |
25 | : libmadplugin(0), ref(0) | 25 | : libmadplugin(0), ref(0) |
26 | { | 26 | { |
27 | } | 27 | } |
28 | 28 | ||
29 | 29 | ||
30 | LibMadPluginImpl::~LibMadPluginImpl() | 30 | LibMadPluginImpl::~LibMadPluginImpl() |
31 | { | 31 | { |
32 | if ( libmadplugin ) | 32 | if ( libmadplugin ) |
33 | delete libmadplugin; | 33 | delete libmadplugin; |
34 | } | 34 | } |
35 | 35 | ||
36 | 36 | ||
37 | MediaPlayerDecoder *LibMadPluginImpl::decoder() | 37 | MediaPlayerDecoder *LibMadPluginImpl::decoder() |
38 | { | 38 | { |
39 | if ( !libmadplugin ) | 39 | if ( !libmadplugin ) |
40 | libmadplugin = new LibMadPlugin; | 40 | libmadplugin = new LibMadPlugin; |
41 | return libmadplugin; | 41 | return libmadplugin; |
42 | } | 42 | } |
43 | 43 | ||
44 | 44 | ||
45 | MediaPlayerEncoder *LibMadPluginImpl::encoder() | 45 | MediaPlayerEncoder *LibMadPluginImpl::encoder() |
46 | { | 46 | { |
47 | return NULL; | 47 | return NULL; |
48 | } | 48 | } |
49 | 49 | ||
50 | 50 | ||
51 | #ifndef QT_NO_COMPONENT | 51 | #ifndef QT_NO_COMPONENT |
52 | 52 | ||
53 | 53 | ||
54 | QRESULT LibMadPluginImpl::queryInterface( const QUuid &uuid, QUnknownInterface **iface ) | 54 | QRESULT LibMadPluginImpl::queryInterface( const QUuid &uuid, QUnknownInterface **iface ) |
55 | { | 55 | { |
56 | *iface = 0; | 56 | *iface = 0; |
57 | if ( ( uuid == IID_QUnknown ) || ( uuid == IID_MediaPlayerPlugin ) ) | 57 | if ( ( uuid == IID_QUnknown ) || ( uuid == IID_MediaPlayerPlugin ) ) |
58 | *iface = this, (*iface)->addRef(); | 58 | *iface = this, (*iface)->addRef(); |
59 | else | ||
60 | return QS_FALSE; | ||
61 | return QS_OK; | 59 | return QS_OK; |
62 | } | 60 | } |
63 | 61 | ||
64 | 62 | ||
65 | Q_EXPORT_INTERFACE() | 63 | Q_EXPORT_INTERFACE() |
66 | { | 64 | { |
67 | Q_CREATE_INSTANCE( LibMadPluginImpl ) | 65 | Q_CREATE_INSTANCE( LibMadPluginImpl ) |
68 | } | 66 | } |
69 | 67 | ||
70 | 68 | ||
71 | #endif | 69 | #endif |
72 | 70 | ||
diff --git a/core/multimedia/opieplayer/libmad/mad.h b/core/multimedia/opieplayer/libmad/mad.h index 9db9da3..9ef6cc8 100644 --- a/core/multimedia/opieplayer/libmad/mad.h +++ b/core/multimedia/opieplayer/libmad/mad.h | |||
@@ -1,830 +1,964 @@ | |||
1 | /* | 1 | /* |
2 | * mad - MPEG audio decoder | 2 | * libmad - MPEG audio decoder library |
3 | * Copyright (C) 2000-2001 Robert Leslie | 3 | * Copyright (C) 2000-2004 Underbit Technologies, Inc. |
4 | * | 4 | * |
5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
7 | * the Free Software Foundation; either version 2 of the License, or | 7 | * the Free Software Foundation; either version 2 of the License, or |
8 | * (at your option) any later version. | 8 | * (at your option) any later version. |
9 | * | 9 | * |
10 | * This program is distributed in the hope that it will be useful, | 10 | * This program is distributed in the hope that it will be useful, |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | * GNU General Public License for more details. | 13 | * GNU General Public License for more details. |
14 | * | 14 | * |
15 | * You should have received a copy of the GNU General Public License | 15 | * You should have received a copy of the GNU General Public License |
16 | * along with this program; if not, write to the Free Software | 16 | * along with this program; if not, write to the Free Software |
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
18 | * | 18 | * |
19 | * If you would like to negotiate alternate licensing terms, you may do | 19 | * If you would like to negotiate alternate licensing terms, you may do |
20 | * so by contacting the author: Robert Leslie <rob@mars.org> | 20 | * so by contacting: Underbit Technologies, Inc. <info@underbit.com> |
21 | */ | 21 | */ |
22 | 22 | ||
23 | # ifdef __cplusplus | ||
24 | extern "C" { | ||
25 | # endif | ||
26 | |||
27 | # define FPM_INTEL | ||
28 | |||
29 | |||
30 | |||
23 | # define SIZEOF_INT 4 | 31 | # define SIZEOF_INT 4 |
24 | # define SIZEOF_LONG 4 | 32 | # define SIZEOF_LONG 4 |
25 | # define SIZEOF_LONG_LONG 8 | 33 | # define SIZEOF_LONG_LONG 8 |
26 | 34 | ||
27 | /* Id: version.h,v 1.16 2001/04/05 04:57:11 rob Exp */ | 35 | |
36 | /* Id: version.h,v 1.26 2004/01/23 09:41:33 rob Exp */ | ||
28 | 37 | ||
29 | # ifndef LIBMAD_VERSION_H | 38 | # ifndef LIBMAD_VERSION_H |
30 | # define LIBMAD_VERSION_H | 39 | # define LIBMAD_VERSION_H |
31 | 40 | ||
32 | # define MAD_VERSION_MAJOR0 | 41 | # define MAD_VERSION_MAJOR0 |
33 | # define MAD_VERSION_MINOR13 | 42 | # define MAD_VERSION_MINOR15 |
34 | # define MAD_VERSION_PATCH0 | 43 | # define MAD_VERSION_PATCH1 |
35 | # define MAD_VERSION_EXTRA" (beta)" | 44 | # define MAD_VERSION_EXTRA" (beta)" |
36 | 45 | ||
37 | # define MAD_VERSION_STRINGIZE(str)#str | 46 | # define MAD_VERSION_STRINGIZE(str)#str |
38 | # define MAD_VERSION_STRING(num)MAD_VERSION_STRINGIZE(num) | 47 | # define MAD_VERSION_STRING(num)MAD_VERSION_STRINGIZE(num) |
39 | 48 | ||
40 | # define MAD_VERSION MAD_VERSION_STRING(MAD_VERSION_MAJOR) "." \ | 49 | # define MAD_VERSION MAD_VERSION_STRING(MAD_VERSION_MAJOR) "." \ |
41 | MAD_VERSION_STRING(MAD_VERSION_MINOR) "." \ | 50 | MAD_VERSION_STRING(MAD_VERSION_MINOR) "." \ |
42 | MAD_VERSION_STRING(MAD_VERSION_PATCH) \ | 51 | MAD_VERSION_STRING(MAD_VERSION_PATCH) \ |
43 | MAD_VERSION_EXTRA | 52 | MAD_VERSION_EXTRA |
44 | 53 | ||
45 | # define MAD_PUBLISHYEAR"2000-2001" | 54 | # define MAD_PUBLISHYEAR"2000-2004" |
46 | # define MAD_AUTHOR "Robert Leslie" | 55 | # define MAD_AUTHOR "Underbit Technologies, Inc." |
47 | # define MAD_EMAIL "rob@mars.org" | 56 | # define MAD_EMAIL "info@underbit.com" |
48 | 57 | ||
49 | extern char const mad_version[]; | 58 | extern char const mad_version[]; |
50 | extern char const mad_copyright[]; | 59 | extern char const mad_copyright[]; |
51 | extern char const mad_author[]; | 60 | extern char const mad_author[]; |
52 | extern char const mad_build[]; | 61 | extern char const mad_build[]; |
53 | 62 | ||
54 | # endif | 63 | # endif |
55 | 64 | ||
56 | /* Id: fixed.h,v 1.23 2001/04/05 04:57:11 rob Exp */ | 65 | /* Id: fixed.h,v 1.38 2004/02/17 02:02:03 rob Exp */ |
57 | 66 | ||
58 | # ifndef LIBMAD_FIXED_H | 67 | # ifndef LIBMAD_FIXED_H |
59 | # define LIBMAD_FIXED_H | 68 | # define LIBMAD_FIXED_H |
60 | 69 | ||
61 | # if SIZEOF_INT >= 4 | 70 | # if SIZEOF_INT >= 4 |
62 | typedef signed int mad_fixed_t; | 71 | typedef signed int mad_fixed_t; |
63 | 72 | ||
64 | typedef signed int mad_fixed64hi_t; | 73 | typedef signed int mad_fixed64hi_t; |
65 | typedef unsigned int mad_fixed64lo_t; | 74 | typedef unsigned int mad_fixed64lo_t; |
66 | # else | 75 | # else |
67 | typedef signed long mad_fixed_t; | 76 | typedef signed long mad_fixed_t; |
68 | 77 | ||
69 | typedef signed long mad_fixed64hi_t; | 78 | typedef signed long mad_fixed64hi_t; |
70 | typedef unsigned long mad_fixed64lo_t; | 79 | typedef unsigned long mad_fixed64lo_t; |
71 | # endif | 80 | # endif |
72 | 81 | ||
82 | # if defined(_MSC_VER) | ||
83 | # define mad_fixed64_t signed __int64 | ||
84 | # elif 1 || defined(__GNUC__) | ||
85 | # define mad_fixed64_t signed long long | ||
86 | # endif | ||
87 | |||
88 | # if defined(FPM_FLOAT) | ||
89 | typedef double mad_sample_t; | ||
90 | # else | ||
91 | typedef mad_fixed_t mad_sample_t; | ||
92 | # endif | ||
93 | |||
73 | /* | 94 | /* |
74 | * Fixed-point format: 0xABBBBBBB | 95 | * Fixed-point format: 0xABBBBBBB |
75 | * A == whole part (sign + 3 bits) | 96 | * A == whole part (sign + 3 bits) |
76 | * B == fractional part (28 bits) | 97 | * B == fractional part (28 bits) |
77 | * | 98 | * |
78 | * Values are signed two's complement, so the effective range is: | 99 | * Values are signed two's complement, so the effective range is: |
79 | * 0x80000000 to 0x7fffffff | 100 | * 0x80000000 to 0x7fffffff |
80 | * -8.0 to +7.9999999962747097015380859375 | 101 | * -8.0 to +7.9999999962747097015380859375 |
81 | * | 102 | * |
82 | * The smallest representable value is: | 103 | * The smallest representable value is: |
83 | * 0x00000001 == 0.0000000037252902984619140625 (i.e. about 3.725e-9) | 104 | * 0x00000001 == 0.0000000037252902984619140625 (i.e. about 3.725e-9) |
84 | * | 105 | * |
85 | * 28 bits of fractional accuracy represent about | 106 | * 28 bits of fractional accuracy represent about |
86 | * 8.6 digits of decimal accuracy. | 107 | * 8.6 digits of decimal accuracy. |
87 | * | 108 | * |
88 | * Fixed-point numbers can be added or subtracted as normal | 109 | * Fixed-point numbers can be added or subtracted as normal |
89 | * integers, but multiplication requires shifting the 64-bit result | 110 | * integers, but multiplication requires shifting the 64-bit result |
90 | * from 56 fractional bits back to 28 (and rounding.) | 111 | * from 56 fractional bits back to 28 (and rounding.) |
91 | * | 112 | * |
92 | * Changing the definition of MAD_F_FRACBITS is only partially | 113 | * Changing the definition of MAD_F_FRACBITS is only partially |
93 | * supported, and must be done with care. | 114 | * supported, and must be done with care. |
94 | */ | 115 | */ |
95 | 116 | ||
96 | # define MAD_F_FRACBITS 28 | 117 | # define MAD_F_FRACBITS 28 |
97 | 118 | ||
98 | # if MAD_F_FRACBITS == 28 | 119 | # if MAD_F_FRACBITS == 28 |
99 | # define MAD_F(x) ((mad_fixed_t) (x##L)) | 120 | # define MAD_F(x) ((mad_fixed_t) (x##L)) |
100 | # else | 121 | # else |
101 | # if MAD_F_FRACBITS < 28 | 122 | # if MAD_F_FRACBITS < 28 |
102 | # warning "MAD_F_FRACBITS < 28" | 123 | # warning "MAD_F_FRACBITS < 28" |
103 | # define MAD_F(x) ((mad_fixed_t) \ | 124 | # define MAD_F(x) ((mad_fixed_t) \ |
104 | (((x##L) + \ | 125 | (((x##L) + \ |
105 | (1L << (28 - MAD_F_FRACBITS - 1))) >> \ | 126 | (1L << (28 - MAD_F_FRACBITS - 1))) >> \ |
106 | (28 - MAD_F_FRACBITS))) | 127 | (28 - MAD_F_FRACBITS))) |
107 | # elif MAD_F_FRACBITS > 28 | 128 | # elif MAD_F_FRACBITS > 28 |
108 | # error "MAD_F_FRACBITS > 28 not currently supported" | 129 | # error "MAD_F_FRACBITS > 28 not currently supported" |
109 | # define MAD_F(x) ((mad_fixed_t) \ | 130 | # define MAD_F(x) ((mad_fixed_t) \ |
110 | ((x##L) << (MAD_F_FRACBITS - 28))) | 131 | ((x##L) << (MAD_F_FRACBITS - 28))) |
111 | # endif | 132 | # endif |
112 | # endif | 133 | # endif |
113 | 134 | ||
114 | # define MAD_F_MIN ((mad_fixed_t) -0x80000000L) | 135 | # define MAD_F_MIN ((mad_fixed_t) -0x80000000L) |
115 | # define MAD_F_MAX ((mad_fixed_t) +0x7fffffffL) | 136 | # define MAD_F_MAX ((mad_fixed_t) +0x7fffffffL) |
116 | 137 | ||
117 | # define MAD_F_ONE MAD_F(0x10000000) | 138 | # define MAD_F_ONE MAD_F(0x10000000) |
118 | 139 | ||
119 | # define mad_f_tofixed(x)((mad_fixed_t) \ | 140 | # define mad_f_tofixed(x)((mad_fixed_t) \ |
120 | ((x) * (double) (1L << MAD_F_FRACBITS) + 0.5)) | 141 | ((x) * (double) (1L << MAD_F_FRACBITS) + 0.5)) |
121 | # define mad_f_todouble(x)((double) \ | 142 | # define mad_f_todouble(x)((double) \ |
122 | ((x) / (double) (1L << MAD_F_FRACBITS))) | 143 | ((x) / (double) (1L << MAD_F_FRACBITS))) |
123 | 144 | ||
124 | # define mad_f_intpart(x)((x) >> MAD_F_FRACBITS) | 145 | # define mad_f_intpart(x)((x) >> MAD_F_FRACBITS) |
125 | # define mad_f_fracpart(x)((x) & ((1L << MAD_F_FRACBITS) - 1)) | 146 | # define mad_f_fracpart(x)((x) & ((1L << MAD_F_FRACBITS) - 1)) |
126 | /* (x should be positive) */ | 147 | /* (x should be positive) */ |
127 | 148 | ||
128 | # define mad_f_fromint(x)((x) << MAD_F_FRACBITS) | 149 | # define mad_f_fromint(x)((x) << MAD_F_FRACBITS) |
129 | 150 | ||
130 | # define mad_f_add(x, y)((x) + (y)) | 151 | # define mad_f_add(x, y)((x) + (y)) |
131 | # define mad_f_sub(x, y)((x) - (y)) | 152 | # define mad_f_sub(x, y)((x) - (y)) |
132 | 153 | ||
133 | # if defined(FPM_64BIT) | 154 | # if defined(FPM_FLOAT) |
155 | # error "FPM_FLOAT not yet supported" | ||
156 | |||
157 | # undef MAD_F | ||
158 | # define MAD_F(x) mad_f_todouble(x) | ||
159 | |||
160 | # define mad_f_mul(x, y)((x) * (y)) | ||
161 | # define mad_f_scale64 | ||
162 | |||
163 | # undef ASO_ZEROCHECK | ||
164 | |||
165 | # elif defined(FPM_64BIT) | ||
134 | 166 | ||
135 | /* | 167 | /* |
136 | * This version should be the most accurate if 64-bit (long long) types are | 168 | * This version should be the most accurate if 64-bit types are supported by |
137 | * supported by the compiler, although it may not be the most efficient. | 169 | * the compiler, although it may not be the most efficient. |
138 | */ | 170 | */ |
139 | # if defined(OPT_ACCURACY) | 171 | # if defined(OPT_ACCURACY) |
140 | # define mad_f_mul(x, y) \ | 172 | # define mad_f_mul(x, y) \ |
141 | ((mad_fixed_t) \ | 173 | ((mad_fixed_t) \ |
142 | ((((signed long long) (x) * (y)) + \ | 174 | ((((mad_fixed64_t) (x) * (y)) + \ |
143 | (1L << (MAD_F_SCALEBITS - 1))) >> MAD_F_SCALEBITS)) | 175 | (1L << (MAD_F_SCALEBITS - 1))) >> MAD_F_SCALEBITS)) |
144 | # else | 176 | # else |
145 | # define mad_f_mul(x, y) \ | 177 | # define mad_f_mul(x, y) \ |
146 | ((mad_fixed_t) (((signed long long) (x) * (y)) >> MAD_F_SCALEBITS)) | 178 | ((mad_fixed_t) (((mad_fixed64_t) (x) * (y)) >> MAD_F_SCALEBITS)) |
147 | # endif | 179 | # endif |
148 | 180 | ||
149 | # define MAD_F_SCALEBITS MAD_F_FRACBITS | 181 | # define MAD_F_SCALEBITS MAD_F_FRACBITS |
150 | 182 | ||
151 | /* --- Intel --------------------------------------------------------------- */ | 183 | /* --- Intel --------------------------------------------------------------- */ |
152 | 184 | ||
153 | # elif defined(FPM_INTEL) | 185 | # elif defined(FPM_INTEL) |
154 | 186 | ||
187 | # if defined(_MSC_VER) | ||
188 | # pragma warning(push) | ||
189 | # pragma warning(disable: 4035) /* no return value */ | ||
190 | static __forceinline | ||
191 | mad_fixed_t mad_f_mul_inline(mad_fixed_t x, mad_fixed_t y) | ||
192 | { | ||
193 | enum { | ||
194 | fracbits = MAD_F_FRACBITS | ||
195 | }; | ||
196 | |||
197 | __asm { | ||
198 | mov eax, x | ||
199 | imul y | ||
200 | shrd eax, edx, fracbits | ||
201 | } | ||
202 | |||
203 | /* implicit return of eax */ | ||
204 | } | ||
205 | # pragma warning(pop) | ||
206 | |||
207 | # define mad_f_mul mad_f_mul_inline | ||
208 | # define mad_f_scale64 | ||
209 | # else | ||
155 | /* | 210 | /* |
156 | * This Intel version is fast and accurate; the disposition of the least | 211 | * This Intel version is fast and accurate; the disposition of the least |
157 | * significant bit depends on OPT_ACCURACY via mad_f_scale64(). | 212 | * significant bit depends on OPT_ACCURACY via mad_f_scale64(). |
158 | */ | 213 | */ |
159 | # define MAD_F_MLX(hi, lo, x, y) \ | 214 | # define MAD_F_MLX(hi, lo, x, y) \ |
160 | asm ("imull %3" \ | 215 | asm ("imull %3" \ |
161 | : "=a" (lo), "=d" (hi) \ | 216 | : "=a" (lo), "=d" (hi) \ |
162 | : "%a" (x), "rm" (y) \ | 217 | : "%a" (x), "rm" (y) \ |
163 | : "cc") | 218 | : "cc") |
164 | 219 | ||
165 | # if defined(OPT_ACCURACY) | 220 | # if defined(OPT_ACCURACY) |
166 | /* | 221 | /* |
167 | * This gives best accuracy but is not very fast. | 222 | * This gives best accuracy but is not very fast. |
168 | */ | 223 | */ |
169 | # define MAD_F_MLA(hi, lo, x, y) \ | 224 | # define MAD_F_MLA(hi, lo, x, y) \ |
170 | ({ mad_fixed64hi_t __hi; \ | 225 | ({ mad_fixed64hi_t __hi; \ |
171 | mad_fixed64lo_t __lo; \ | 226 | mad_fixed64lo_t __lo; \ |
172 | MAD_F_MLX(__hi, __lo, (x), (y)); \ | 227 | MAD_F_MLX(__hi, __lo, (x), (y)); \ |
173 | asm ("addl %2,%0\n\t" \ | 228 | asm ("addl %2,%0\n\t" \ |
174 | "adcl %3,%1" \ | 229 | "adcl %3,%1" \ |
175 | : "=rm" (lo), "=rm" (hi) \ | 230 | : "=rm" (lo), "=rm" (hi) \ |
176 | : "r" (__lo), "r" (__hi), "0" (lo), "1" (hi) \ | 231 | : "r" (__lo), "r" (__hi), "0" (lo), "1" (hi) \ |
177 | : "cc"); \ | 232 | : "cc"); \ |
178 | }) | 233 | }) |
179 | # endif /* OPT_ACCURACY */ | 234 | # endif /* OPT_ACCURACY */ |
180 | 235 | ||
181 | # if defined(OPT_ACCURACY) | 236 | # if defined(OPT_ACCURACY) |
182 | /* | 237 | /* |
183 | * Surprisingly, this is faster than SHRD followed by ADC. | 238 | * Surprisingly, this is faster than SHRD followed by ADC. |
184 | */ | 239 | */ |
185 | # define mad_f_scale64(hi, lo) \ | 240 | # define mad_f_scale64(hi, lo) \ |
186 | ({ mad_fixed64hi_t __hi_; \ | 241 | ({ mad_fixed64hi_t __hi_; \ |
187 | mad_fixed64lo_t __lo_; \ | 242 | mad_fixed64lo_t __lo_; \ |
188 | mad_fixed_t __result; \ | 243 | mad_fixed_t __result; \ |
189 | asm ("addl %4,%2\n\t" \ | 244 | asm ("addl %4,%2\n\t" \ |
190 | "adcl %5,%3" \ | 245 | "adcl %5,%3" \ |
191 | : "=rm" (__lo_), "=rm" (__hi_) \ | 246 | : "=rm" (__lo_), "=rm" (__hi_) \ |
192 | : "0" (lo), "1" (hi), \ | 247 | : "0" (lo), "1" (hi), \ |
193 | "ir" (1L << (MAD_F_SCALEBITS - 1)), "ir" (0) \ | 248 | "ir" (1L << (MAD_F_SCALEBITS - 1)), "ir" (0) \ |
194 | : "cc"); \ | 249 | : "cc"); \ |
195 | asm ("shrdl %3,%2,%1" \ | 250 | asm ("shrdl %3,%2,%1" \ |
196 | : "=rm" (__result) \ | 251 | : "=rm" (__result) \ |
197 | : "0" (__lo_), "r" (__hi_), "I" (MAD_F_SCALEBITS) \ | 252 | : "0" (__lo_), "r" (__hi_), "I" (MAD_F_SCALEBITS) \ |
198 | : "cc"); \ | 253 | : "cc"); \ |
199 | __result; \ | 254 | __result; \ |
200 | }) | 255 | }) |
201 | # else | 256 | # elif defined(OPT_INTEL) |
202 | # define mad_f_scale64(hi, lo) \ | 257 | /* |
258 | * Alternate Intel scaling that may or may not perform better. | ||
259 | */ | ||
260 | # define mad_f_scale64(hi, lo) \ | ||
261 | ({ mad_fixed_t __result; \ | ||
262 | asm ("shrl %3,%1\n\t" \ | ||
263 | "shll %4,%2\n\t" \ | ||
264 | "orl %2,%1" \ | ||
265 | : "=rm" (__result) \ | ||
266 | : "0" (lo), "r" (hi), \ | ||
267 | "I" (MAD_F_SCALEBITS), "I" (32 - MAD_F_SCALEBITS) \ | ||
268 | : "cc"); \ | ||
269 | __result; \ | ||
270 | }) | ||
271 | # else | ||
272 | # define mad_f_scale64(hi, lo) \ | ||
203 | ({ mad_fixed_t __result; \ | 273 | ({ mad_fixed_t __result; \ |
204 | asm ("shrdl %3,%2,%1" \ | 274 | asm ("shrdl %3,%2,%1" \ |
205 | : "=rm" (__result) \ | 275 | : "=rm" (__result) \ |
206 | : "0" (lo), "r" (hi), "I" (MAD_F_SCALEBITS) \ | 276 | : "0" (lo), "r" (hi), "I" (MAD_F_SCALEBITS) \ |
207 | : "cc"); \ | 277 | : "cc"); \ |
208 | __result; \ | 278 | __result; \ |
209 | }) | 279 | }) |
210 | # endif /* OPT_ACCURACY */ | 280 | # endif /* OPT_ACCURACY */ |
211 | 281 | ||
212 | # define MAD_F_SCALEBITS MAD_F_FRACBITS | 282 | # define MAD_F_SCALEBITS MAD_F_FRACBITS |
283 | # endif | ||
213 | 284 | ||
214 | /* --- ARM ----------------------------------------------------------------- */ | 285 | /* --- ARM ----------------------------------------------------------------- */ |
215 | 286 | ||
216 | # elif defined(FPM_ARM) | 287 | # elif defined(FPM_ARM) |
217 | 288 | ||
218 | /* | 289 | /* |
219 | * This ARM V4 version is as accurate as FPM_64BIT but much faster. The | 290 | * This ARM V4 version is as accurate as FPM_64BIT but much faster. The |
220 | * least significant bit is properly rounded at no CPU cycle cost! | 291 | * least significant bit is properly rounded at no CPU cycle cost! |
221 | */ | 292 | */ |
222 | # if 1 | 293 | # if 1 |
223 | /* | 294 | /* |
224 | * There's a bug somewhere, possibly in the compiler, that sometimes makes | 295 | * This is faster than the default implementation via MAD_F_MLX() and |
225 | * this necessary instead of the default implementation via MAD_F_MLX and | 296 | * mad_f_scale64(). |
226 | * mad_f_scale64. It may be related to the use (or lack) of | ||
227 | * -finline-functions and/or -fstrength-reduce. | ||
228 | * | ||
229 | * This is also apparently faster than MAD_F_MLX/mad_f_scale64. | ||
230 | */ | 297 | */ |
231 | # define mad_f_mul(x, y) \ | 298 | # define mad_f_mul(x, y) \ |
232 | ({ mad_fixed64hi_t __hi; \ | 299 | ({ mad_fixed64hi_t __hi; \ |
233 | mad_fixed64lo_t __lo; \ | 300 | mad_fixed64lo_t __lo; \ |
234 | mad_fixed_t __result; \ | 301 | mad_fixed_t __result; \ |
235 | asm ("smull%0, %1, %3, %4\n\t" \ | 302 | asm ("smull%0, %1, %3, %4\n\t" \ |
236 | "movs%0, %0, lsr %5\n\t" \ | 303 | "movs%0, %0, lsr %5\n\t" \ |
237 | "adc%2, %0, %1, lsl %6" \ | 304 | "adc%2, %0, %1, lsl %6" \ |
238 | : "=&r" (__lo), "=&r" (__hi), "=r" (__result) \ | 305 | : "=&r" (__lo), "=&r" (__hi), "=r" (__result) \ |
239 | : "%r" (x), "r" (y), \ | 306 | : "%r" (x), "r" (y), \ |
240 | "M" (MAD_F_SCALEBITS), "M" (32 - MAD_F_SCALEBITS) \ | 307 | "M" (MAD_F_SCALEBITS), "M" (32 - MAD_F_SCALEBITS) \ |
241 | : "cc"); \ | 308 | : "cc"); \ |
242 | __result; \ | 309 | __result; \ |
243 | }) | 310 | }) |
244 | # endif | 311 | # endif |
245 | 312 | ||
246 | # define MAD_F_MLX(hi, lo, x, y) \ | 313 | # define MAD_F_MLX(hi, lo, x, y) \ |
247 | asm ("smull%0, %1, %2, %3" \ | 314 | asm ("smull%0, %1, %2, %3" \ |
248 | : "=&r" (lo), "=&r" (hi) \ | 315 | : "=&r" (lo), "=&r" (hi) \ |
249 | : "%r" (x), "r" (y)) | 316 | : "%r" (x), "r" (y)) |
250 | 317 | ||
251 | # define MAD_F_MLA(hi, lo, x, y) \ | 318 | # define MAD_F_MLA(hi, lo, x, y) \ |
252 | asm ("smlal%0, %1, %2, %3" \ | 319 | asm ("smlal%0, %1, %2, %3" \ |
253 | : "+r" (lo), "+r" (hi) \ | 320 | : "+r" (lo), "+r" (hi) \ |
254 | : "%r" (x), "r" (y)) | 321 | : "%r" (x), "r" (y)) |
255 | 322 | ||
323 | # define MAD_F_MLN(hi, lo) \ | ||
324 | asm ("rsbs%0, %2, #0\n\t" \ | ||
325 | "rsc%1, %3, #0" \ | ||
326 | : "=r" (lo), "=r" (hi) \ | ||
327 | : "0" (lo), "1" (hi) \ | ||
328 | : "cc") | ||
329 | |||
256 | # define mad_f_scale64(hi, lo) \ | 330 | # define mad_f_scale64(hi, lo) \ |
257 | ({ mad_fixed_t __result; \ | 331 | ({ mad_fixed_t __result; \ |
258 | asm ("movs%0, %1, lsr %3\n\t" \ | 332 | asm ("movs%0, %1, lsr %3\n\t" \ |
259 | "adc%0, %0, %2, lsl %4" \ | 333 | "adc%0, %0, %2, lsl %4" \ |
260 | : "=r" (__result) \ | 334 | : "=&r" (__result) \ |
261 | : "r" (lo), "r" (hi), \ | 335 | : "r" (lo), "r" (hi), \ |
262 | "M" (MAD_F_SCALEBITS), "M" (32 - MAD_F_SCALEBITS) \ | 336 | "M" (MAD_F_SCALEBITS), "M" (32 - MAD_F_SCALEBITS) \ |
263 | : "cc"); \ | 337 | : "cc"); \ |
264 | __result; \ | 338 | __result; \ |
265 | }) | 339 | }) |
266 | 340 | ||
267 | # define MAD_F_SCALEBITS MAD_F_FRACBITS | 341 | # define MAD_F_SCALEBITS MAD_F_FRACBITS |
268 | 342 | ||
269 | /* --- MIPS ---------------------------------------------------------------- */ | 343 | /* --- MIPS ---------------------------------------------------------------- */ |
270 | 344 | ||
271 | # elif defined(FPM_MIPS) | 345 | # elif defined(FPM_MIPS) |
272 | 346 | ||
273 | /* | 347 | /* |
274 | * This MIPS version is fast and accurate; the disposition of the least | 348 | * This MIPS version is fast and accurate; the disposition of the least |
275 | * significant bit depends on OPT_ACCURACY via mad_f_scale64(). | 349 | * significant bit depends on OPT_ACCURACY via mad_f_scale64(). |
276 | */ | 350 | */ |
277 | # define MAD_F_MLX(hi, lo, x, y) \ | 351 | # define MAD_F_MLX(hi, lo, x, y) \ |
278 | asm ("mult%2,%3" \ | 352 | asm ("mult%2,%3" \ |
279 | : "=l" (lo), "=h" (hi) \ | 353 | : "=l" (lo), "=h" (hi) \ |
280 | : "%r" (x), "r" (y)) | 354 | : "%r" (x), "r" (y)) |
281 | 355 | ||
282 | # if defined(HAVE_MADD_ASM) | 356 | # if defined(HAVE_MADD_ASM) |
283 | # define MAD_F_MLA(hi, lo, x, y) \ | 357 | # define MAD_F_MLA(hi, lo, x, y) \ |
284 | asm ("madd%2,%3" \ | 358 | asm ("madd%2,%3" \ |
285 | : "+l" (lo), "+h" (hi) \ | 359 | : "+l" (lo), "+h" (hi) \ |
286 | : "%r" (x), "r" (y)) | 360 | : "%r" (x), "r" (y)) |
287 | # elif defined(HAVE_MADD16_ASM) | 361 | # elif defined(HAVE_MADD16_ASM) |
288 | /* | 362 | /* |
289 | * This loses significant accuracy due to the 16-bit integer limit in the | 363 | * This loses significant accuracy due to the 16-bit integer limit in the |
290 | * multiply/accumulate instruction. | 364 | * multiply/accumulate instruction. |
291 | */ | 365 | */ |
292 | # define MAD_F_ML0(hi, lo, x, y) \ | 366 | # define MAD_F_ML0(hi, lo, x, y) \ |
293 | asm ("mult%2,%3" \ | 367 | asm ("mult%2,%3" \ |
294 | : "=l" (lo), "=h" (hi) \ | 368 | : "=l" (lo), "=h" (hi) \ |
295 | : "%r" ((x) >> 12), "r" ((y) >> 16)) | 369 | : "%r" ((x) >> 12), "r" ((y) >> 16)) |
296 | # define MAD_F_MLA(hi, lo, x, y) \ | 370 | # define MAD_F_MLA(hi, lo, x, y) \ |
297 | asm ("madd16%2,%3" \ | 371 | asm ("madd16%2,%3" \ |
298 | : "+l" (lo), "+h" (hi) \ | 372 | : "+l" (lo), "+h" (hi) \ |
299 | : "%r" ((x) >> 12), "r" ((y) >> 16)) | 373 | : "%r" ((x) >> 12), "r" ((y) >> 16)) |
300 | # define MAD_F_MLZ(hi, lo) ((mad_fixed_t) (lo)) | 374 | # define MAD_F_MLZ(hi, lo) ((mad_fixed_t) (lo)) |
301 | # endif | 375 | # endif |
302 | 376 | ||
303 | # if defined(OPT_SPEED) | 377 | # if defined(OPT_SPEED) |
304 | # define mad_f_scale64(hi, lo) \ | 378 | # define mad_f_scale64(hi, lo) \ |
305 | ((mad_fixed_t) ((hi) << (32 - MAD_F_SCALEBITS))) | 379 | ((mad_fixed_t) ((hi) << (32 - MAD_F_SCALEBITS))) |
306 | # define MAD_F_SCALEBITS MAD_F_FRACBITS | 380 | # define MAD_F_SCALEBITS MAD_F_FRACBITS |
307 | # endif | 381 | # endif |
308 | 382 | ||
309 | /* --- SPARC --------------------------------------------------------------- */ | 383 | /* --- SPARC --------------------------------------------------------------- */ |
310 | 384 | ||
311 | # elif defined(FPM_SPARC) | 385 | # elif defined(FPM_SPARC) |
312 | 386 | ||
313 | /* | 387 | /* |
314 | * This SPARC V8 version is fast and accurate; the disposition of the least | 388 | * This SPARC V8 version is fast and accurate; the disposition of the least |
315 | * significant bit depends on OPT_ACCURACY via mad_f_scale64(). | 389 | * significant bit depends on OPT_ACCURACY via mad_f_scale64(). |
316 | */ | 390 | */ |
317 | # define MAD_F_MLX(hi, lo, x, y) \ | 391 | # define MAD_F_MLX(hi, lo, x, y) \ |
318 | asm ("smul %2, %3, %0\n\t" \ | 392 | asm ("smul %2, %3, %0\n\t" \ |
319 | "rd %%y, %1" \ | 393 | "rd %%y, %1" \ |
320 | : "=r" (lo), "=r" (hi) \ | 394 | : "=r" (lo), "=r" (hi) \ |
321 | : "%r" (x), "rI" (y)) | 395 | : "%r" (x), "rI" (y)) |
322 | 396 | ||
323 | /* --- PowerPC ------------------------------------------------------------- */ | 397 | /* --- PowerPC ------------------------------------------------------------- */ |
324 | 398 | ||
325 | # elif defined(FPM_PPC) | 399 | # elif defined(FPM_PPC) |
326 | 400 | ||
327 | /* | 401 | /* |
328 | * This PowerPC version is tuned for the 4xx embedded processors. It is | 402 | * This PowerPC version is fast and accurate; the disposition of the least |
329 | * effectively a tuned version of FPM_64BIT. It is a little faster and just | 403 | * significant bit depends on OPT_ACCURACY via mad_f_scale64(). |
330 | * as accurate. The disposition of the least significant bit depends on | ||
331 | * OPT_ACCURACY via mad_f_scale64(). | ||
332 | */ | 404 | */ |
333 | # define MAD_F_MLX(hi, lo, x, y) \ | 405 | # define MAD_F_MLX(hi, lo, x, y) \ |
334 | asm ("mulhw %1, %2, %3\n\t" \ | 406 | do { \ |
335 | "mullw %0, %2, %3" \ | 407 | asm ("mullw %0,%1,%2" \ |
336 | : "=&r" (lo), "=&r" (hi) \ | 408 | : "=r" (lo) \ |
337 | : "%r" (x), "r" (y)) | 409 | : "%r" (x), "r" (y)); \ |
410 | asm ("mulhw %0,%1,%2" \ | ||
411 | : "=r" (hi) \ | ||
412 | : "%r" (x), "r" (y)); \ | ||
413 | } \ | ||
414 | while (0) | ||
338 | 415 | ||
339 | # define MAD_F_MLA(hi, lo, x, y) \ | 416 | # if defined(OPT_ACCURACY) |
417 | /* | ||
418 | * This gives best accuracy but is not very fast. | ||
419 | */ | ||
420 | # define MAD_F_MLA(hi, lo, x, y) \ | ||
340 | ({ mad_fixed64hi_t __hi; \ | 421 | ({ mad_fixed64hi_t __hi; \ |
341 | mad_fixed64lo_t __lo; \ | 422 | mad_fixed64lo_t __lo; \ |
342 | MAD_F_MLX(__hi, __lo, (x), (y)); \ | 423 | MAD_F_MLX(__hi, __lo, (x), (y)); \ |
343 | asm ("addc %0, %2, %3\n\t" \ | 424 | asm ("addc %0,%2,%3\n\t" \ |
344 | "adde %1, %4, %5" \ | 425 | "adde %1,%4,%5" \ |
345 | : "=r" (lo), "=r" (hi) \ | 426 | : "=r" (lo), "=r" (hi) \ |
346 | : "%r" (__lo), "0" (lo), "%r" (__hi), "1" (hi)); \ | 427 | : "%r" (lo), "r" (__lo), \ |
428 | "%r" (hi), "r" (__hi) \ | ||
429 | : "xer"); \ | ||
347 | }) | 430 | }) |
431 | # endif | ||
348 | 432 | ||
349 | # if defined(OPT_ACCURACY) | 433 | # if defined(OPT_ACCURACY) |
350 | /* | 434 | /* |
351 | * This is accurate and ~2 - 2.5 times slower than the unrounded version. | 435 | * This is slower than the truncating version below it. |
352 | * | ||
353 | * The __volatile__ improves the generated code by another 5% (fewer spills | ||
354 | * to memory); eventually they should be removed. | ||
355 | */ | 436 | */ |
356 | # define mad_f_scale64(hi, lo) \ | 437 | # define mad_f_scale64(hi, lo) \ |
357 | ({ mad_fixed_t __result; \ | 438 | ({ mad_fixed_t __result, __round; \ |
358 | mad_fixed64hi_t __hi_; \ | 439 | asm ("rotrwi %0,%1,%2" \ |
359 | mad_fixed64lo_t __lo_; \ | 440 | : "=r" (__result) \ |
360 | asm __volatile__ ("addc %0, %2, %4\n\t" \ | 441 | : "r" (lo), "i" (MAD_F_SCALEBITS)); \ |
361 | "addze %1, %3" \ | 442 | asm ("extrwi %0,%1,1,0" \ |
362 | : "=r" (__lo_), "=r" (__hi_) \ | 443 | : "=r" (__round) \ |
363 | : "r" (lo), "r" (hi), "r" (1 << (MAD_F_SCALEBITS - 1))); \ | 444 | : "r" (__result)); \ |
364 | asm __volatile__ ("rlwinm %0, %2,32-%3,0,%3-1\n\t" \ | 445 | asm ("insrwi %0,%1,%2,0" \ |
365 | "rlwimi %0, %1,32-%3,%3,31" \ | 446 | : "+r" (__result) \ |
366 | : "=&r" (__result) \ | 447 | : "r" (hi), "i" (MAD_F_SCALEBITS)); \ |
367 | : "r" (__lo_), "r" (__hi_), "I" (MAD_F_SCALEBITS)); \ | 448 | asm ("add %0,%1,%2" \ |
368 | __result; \ | 449 | : "=r" (__result) \ |
450 | : "%r" (__result), "r" (__round)); \ | ||
451 | __result; \ | ||
369 | }) | 452 | }) |
370 | # else | 453 | # else |
371 | # define mad_f_scale64(hi, lo) \ | 454 | # define mad_f_scale64(hi, lo) \ |
372 | ({ mad_fixed_t __result; \ | 455 | ({ mad_fixed_t __result; \ |
373 | asm ("rlwinm %0, %2,32-%3,0,%3-1\n\t" \ | 456 | asm ("rotrwi %0,%1,%2" \ |
374 | "rlwimi %0, %1,32-%3,%3,31" \ | ||
375 | : "=r" (__result) \ | 457 | : "=r" (__result) \ |
376 | : "r" (lo), "r" (hi), "I" (MAD_F_SCALEBITS)); \ | 458 | : "r" (lo), "i" (MAD_F_SCALEBITS)); \ |
377 | __result; \ | 459 | asm ("insrwi %0,%1,%2,0" \ |
460 | : "+r" (__result) \ | ||
461 | : "r" (hi), "i" (MAD_F_SCALEBITS)); \ | ||
462 | __result; \ | ||
378 | }) | 463 | }) |
379 | # endif /* OPT_ACCURACY */ | 464 | # endif |
380 | 465 | ||
381 | # define MAD_F_SCALEBITS MAD_F_FRACBITS | 466 | # define MAD_F_SCALEBITS MAD_F_FRACBITS |
382 | 467 | ||
383 | /* --- Default ------------------------------------------------------------- */ | 468 | /* --- Default ------------------------------------------------------------- */ |
384 | 469 | ||
385 | # elif defined(FPM_DEFAULT) | 470 | # elif defined(FPM_DEFAULT) |
386 | 471 | ||
387 | /* | 472 | /* |
388 | * This version is the most portable but it loses significant accuracy. | 473 | * This version is the most portable but it loses significant accuracy. |
389 | * Furthermore, accuracy is biased against the second argument, so care | 474 | * Furthermore, accuracy is biased against the second argument, so care |
390 | * should be taken when ordering operands. | 475 | * should be taken when ordering operands. |
391 | * | 476 | * |
392 | * The scale factors are constant as this is not used with SSO. | 477 | * The scale factors are constant as this is not used with SSO. |
393 | * | 478 | * |
394 | * Pre-rounding is required to stay within the limits of compliance. | 479 | * Pre-rounding is required to stay within the limits of compliance. |
395 | */ | 480 | */ |
396 | # define mad_f_mul(x, y)((((x) + (1L << 11)) >> 12) * \ | 481 | # if defined(OPT_SPEED) |
482 | # define mad_f_mul(x, y)(((x) >> 12) * ((y) >> 16)) | ||
483 | # else | ||
484 | # define mad_f_mul(x, y)((((x) + (1L << 11)) >> 12) * \ | ||
397 | (((y) + (1L << 15)) >> 16)) | 485 | (((y) + (1L << 15)) >> 16)) |
486 | # endif | ||
398 | 487 | ||
399 | /* ------------------------------------------------------------------------- */ | 488 | /* ------------------------------------------------------------------------- */ |
400 | 489 | ||
401 | # else | 490 | # else |
402 | # error "no FPM selected" | 491 | # error "no FPM selected" |
403 | # endif | 492 | # endif |
404 | 493 | ||
405 | /* default implementations */ | 494 | /* default implementations */ |
406 | 495 | ||
407 | # if !defined(mad_f_mul) | 496 | # if !defined(mad_f_mul) |
408 | # define mad_f_mul(x, y) \ | 497 | # define mad_f_mul(x, y) \ |
409 | ({ mad_fixed64hi_t __hi; \ | 498 | ({ register mad_fixed64hi_t __hi; \ |
410 | mad_fixed64lo_t __lo; \ | 499 | register mad_fixed64lo_t __lo; \ |
411 | MAD_F_MLX(__hi, __lo, (x), (y)); \ | 500 | MAD_F_MLX(__hi, __lo, (x), (y)); \ |
412 | mad_f_scale64(__hi, __lo); \ | 501 | mad_f_scale64(__hi, __lo); \ |
413 | }) | 502 | }) |
414 | # endif | 503 | # endif |
415 | 504 | ||
416 | # if !defined(MAD_F_MLA) | 505 | # if !defined(MAD_F_MLA) |
417 | # define MAD_F_ML0(hi, lo, x, y)((lo) = mad_f_mul((x), (y))) | 506 | # define MAD_F_ML0(hi, lo, x, y)((lo) = mad_f_mul((x), (y))) |
418 | # define MAD_F_MLA(hi, lo, x, y)((lo) += mad_f_mul((x), (y))) | 507 | # define MAD_F_MLA(hi, lo, x, y)((lo) += mad_f_mul((x), (y))) |
508 | # define MAD_F_MLN(hi, lo) ((lo) = -(lo)) | ||
419 | # define MAD_F_MLZ(hi, lo) ((void) (hi), (mad_fixed_t) (lo)) | 509 | # define MAD_F_MLZ(hi, lo) ((void) (hi), (mad_fixed_t) (lo)) |
420 | # endif | 510 | # endif |
421 | 511 | ||
422 | # if !defined(MAD_F_ML0) | 512 | # if !defined(MAD_F_ML0) |
423 | # define MAD_F_ML0(hi, lo, x, y)MAD_F_MLX((hi), (lo), (x), (y)) | 513 | # define MAD_F_ML0(hi, lo, x, y)MAD_F_MLX((hi), (lo), (x), (y)) |
424 | # endif | 514 | # endif |
425 | 515 | ||
516 | # if !defined(MAD_F_MLN) | ||
517 | # define MAD_F_MLN(hi, lo) ((hi) = ((lo) = -(lo)) ? ~(hi) : -(hi)) | ||
518 | # endif | ||
519 | |||
426 | # if !defined(MAD_F_MLZ) | 520 | # if !defined(MAD_F_MLZ) |
427 | # define MAD_F_MLZ(hi, lo) mad_f_scale64((hi), (lo)) | 521 | # define MAD_F_MLZ(hi, lo) mad_f_scale64((hi), (lo)) |
428 | # endif | 522 | # endif |
429 | 523 | ||
430 | # if !defined(mad_f_scale64) | 524 | # if !defined(mad_f_scale64) |
431 | # if defined(OPT_ACCURACY) | 525 | # if defined(OPT_ACCURACY) |
432 | # define mad_f_scale64(hi, lo) \ | 526 | # define mad_f_scale64(hi, lo) \ |
433 | ((((mad_fixed_t) \ | 527 | ((((mad_fixed_t) \ |
434 | (((hi) << (32 - (MAD_F_SCALEBITS - 1))) | \ | 528 | (((hi) << (32 - (MAD_F_SCALEBITS - 1))) | \ |
435 | ((lo) >> (MAD_F_SCALEBITS - 1)))) + 1) >> 1) | 529 | ((lo) >> (MAD_F_SCALEBITS - 1)))) + 1) >> 1) |
436 | # else | 530 | # else |
437 | # define mad_f_scale64(hi, lo) \ | 531 | # define mad_f_scale64(hi, lo) \ |
438 | ((mad_fixed_t) \ | 532 | ((mad_fixed_t) \ |
439 | (((hi) << (32 - MAD_F_SCALEBITS)) | \ | 533 | (((hi) << (32 - MAD_F_SCALEBITS)) | \ |
440 | ((lo) >> MAD_F_SCALEBITS))) | 534 | ((lo) >> MAD_F_SCALEBITS))) |
441 | # endif | 535 | # endif |
442 | # define MAD_F_SCALEBITS MAD_F_FRACBITS | 536 | # define MAD_F_SCALEBITS MAD_F_FRACBITS |
443 | # endif | 537 | # endif |
444 | 538 | ||
445 | /* miscellaneous C routines */ | 539 | /* C routines */ |
446 | 540 | ||
447 | mad_fixed_t mad_f_abs(mad_fixed_t); | 541 | mad_fixed_t mad_f_abs(mad_fixed_t); |
542 | mad_fixed_t mad_f_div(mad_fixed_t, mad_fixed_t); | ||
448 | 543 | ||
449 | # endif | 544 | # endif |
450 | 545 | ||
451 | /* Id: bit.h,v 1.7 2001/04/05 04:57:11 rob Exp */ | 546 | /* Id: bit.h,v 1.12 2004/01/23 09:41:32 rob Exp */ |
452 | 547 | ||
453 | # ifndef LIBMAD_BIT_H | 548 | # ifndef LIBMAD_BIT_H |
454 | # define LIBMAD_BIT_H | 549 | # define LIBMAD_BIT_H |
455 | 550 | ||
456 | struct mad_bitptr { | 551 | struct mad_bitptr { |
457 | unsigned char const *byte; | 552 | unsigned char const *byte; |
458 | unsigned short cache; | 553 | unsigned short cache; |
459 | unsigned short left; | 554 | unsigned short left; |
460 | }; | 555 | }; |
461 | 556 | ||
462 | void mad_bit_init(struct mad_bitptr *, unsigned char const *); | 557 | void mad_bit_init(struct mad_bitptr *, unsigned char const *); |
463 | 558 | ||
464 | # define mad_bit_finish(bitptr) /* nothing */ | 559 | # define mad_bit_finish(bitptr) /* nothing */ |
465 | 560 | ||
466 | unsigned int mad_bit_length(struct mad_bitptr const *, | 561 | unsigned int mad_bit_length(struct mad_bitptr const *, |
467 | struct mad_bitptr const *); | 562 | struct mad_bitptr const *); |
468 | 563 | ||
469 | # define mad_bit_bitsleft(bitptr) ((bitptr)->left) | 564 | # define mad_bit_bitsleft(bitptr) ((bitptr)->left) |
470 | unsigned char const *mad_bit_nextbyte(struct mad_bitptr const *); | 565 | unsigned char const *mad_bit_nextbyte(struct mad_bitptr const *); |
471 | 566 | ||
472 | void mad_bit_skip(struct mad_bitptr *, unsigned int); | 567 | void mad_bit_skip(struct mad_bitptr *, unsigned int); |
473 | unsigned long mad_bit_read(struct mad_bitptr *, unsigned int); | 568 | unsigned long mad_bit_read(struct mad_bitptr *, unsigned int); |
474 | void mad_bit_write(struct mad_bitptr *, unsigned int, unsigned long); | 569 | void mad_bit_write(struct mad_bitptr *, unsigned int, unsigned long); |
475 | 570 | ||
476 | unsigned short mad_bit_crc(struct mad_bitptr, unsigned int, unsigned short); | 571 | unsigned short mad_bit_crc(struct mad_bitptr, unsigned int, unsigned short); |
477 | 572 | ||
478 | # endif | 573 | # endif |
479 | 574 | ||
480 | /* Id: timer.h,v 1.10 2001/04/05 04:57:11 rob Exp */ | 575 | /* Id: timer.h,v 1.16 2004/01/23 09:41:33 rob Exp */ |
481 | 576 | ||
482 | # ifndef LIBMAD_TIMER_H | 577 | # ifndef LIBMAD_TIMER_H |
483 | # define LIBMAD_TIMER_H | 578 | # define LIBMAD_TIMER_H |
484 | 579 | ||
485 | typedef struct { | 580 | typedef struct { |
486 | signed long seconds; /* whole seconds */ | 581 | signed long seconds; /* whole seconds */ |
487 | unsigned long fraction;/* 1/MAD_TIMER_RESOLUTION seconds */ | 582 | unsigned long fraction;/* 1/MAD_TIMER_RESOLUTION seconds */ |
488 | } mad_timer_t; | 583 | } mad_timer_t; |
489 | 584 | ||
490 | extern mad_timer_t const mad_timer_zero; | 585 | extern mad_timer_t const mad_timer_zero; |
491 | 586 | ||
492 | # define MAD_TIMER_RESOLUTION352800000UL | 587 | # define MAD_TIMER_RESOLUTION352800000UL |
493 | 588 | ||
494 | enum mad_units { | 589 | enum mad_units { |
495 | MAD_UNITS_HOURS = -2, | 590 | MAD_UNITS_HOURS = -2, |
496 | MAD_UNITS_MINUTES = -1, | 591 | MAD_UNITS_MINUTES = -1, |
497 | MAD_UNITS_SECONDS = 0, | 592 | MAD_UNITS_SECONDS = 0, |
498 | 593 | ||
499 | /* metric units */ | 594 | /* metric units */ |
500 | 595 | ||
501 | MAD_UNITS_DECISECONDS = 10, | 596 | MAD_UNITS_DECISECONDS = 10, |
502 | MAD_UNITS_CENTISECONDS = 100, | 597 | MAD_UNITS_CENTISECONDS = 100, |
503 | MAD_UNITS_MILLISECONDS = 1000, | 598 | MAD_UNITS_MILLISECONDS = 1000, |
504 | 599 | ||
505 | /* audio sample units */ | 600 | /* audio sample units */ |
506 | 601 | ||
507 | MAD_UNITS_8000_HZ = 8000, | 602 | MAD_UNITS_8000_HZ = 8000, |
508 | MAD_UNITS_11025_HZ = 11025, | 603 | MAD_UNITS_11025_HZ = 11025, |
509 | MAD_UNITS_12000_HZ = 12000, | 604 | MAD_UNITS_12000_HZ = 12000, |
510 | 605 | ||
511 | MAD_UNITS_16000_HZ = 16000, | 606 | MAD_UNITS_16000_HZ = 16000, |
512 | MAD_UNITS_22050_HZ = 22050, | 607 | MAD_UNITS_22050_HZ = 22050, |
513 | MAD_UNITS_24000_HZ = 24000, | 608 | MAD_UNITS_24000_HZ = 24000, |
514 | 609 | ||
515 | MAD_UNITS_32000_HZ = 32000, | 610 | MAD_UNITS_32000_HZ = 32000, |
516 | MAD_UNITS_44100_HZ = 44100, | 611 | MAD_UNITS_44100_HZ = 44100, |
517 | MAD_UNITS_48000_HZ = 48000, | 612 | MAD_UNITS_48000_HZ = 48000, |
518 | 613 | ||
519 | /* video frame/field units */ | 614 | /* video frame/field units */ |
520 | 615 | ||
521 | MAD_UNITS_24_FPS = 24, | 616 | MAD_UNITS_24_FPS = 24, |
522 | MAD_UNITS_25_FPS = 25, | 617 | MAD_UNITS_25_FPS = 25, |
523 | MAD_UNITS_30_FPS = 30, | 618 | MAD_UNITS_30_FPS = 30, |
524 | MAD_UNITS_48_FPS = 48, | 619 | MAD_UNITS_48_FPS = 48, |
525 | MAD_UNITS_50_FPS = 50, | 620 | MAD_UNITS_50_FPS = 50, |
526 | MAD_UNITS_60_FPS = 60, | 621 | MAD_UNITS_60_FPS = 60, |
527 | 622 | ||
528 | /* CD audio frames */ | 623 | /* CD audio frames */ |
529 | 624 | ||
530 | MAD_UNITS_75_FPS = 75, | 625 | MAD_UNITS_75_FPS = 75, |
531 | 626 | ||
532 | /* video drop-frame units */ | 627 | /* video drop-frame units */ |
533 | 628 | ||
534 | MAD_UNITS_23_976_FPS = -24, | 629 | MAD_UNITS_23_976_FPS = -24, |
535 | MAD_UNITS_24_975_FPS = -25, | 630 | MAD_UNITS_24_975_FPS = -25, |
536 | MAD_UNITS_29_97_FPS = -30, | 631 | MAD_UNITS_29_97_FPS = -30, |
537 | MAD_UNITS_47_952_FPS = -48, | 632 | MAD_UNITS_47_952_FPS = -48, |
538 | MAD_UNITS_49_95_FPS = -50, | 633 | MAD_UNITS_49_95_FPS = -50, |
539 | MAD_UNITS_59_94_FPS = -60 | 634 | MAD_UNITS_59_94_FPS = -60 |
540 | }; | 635 | }; |
541 | 636 | ||
542 | # define mad_timer_reset(timer)(*(timer) = mad_timer_zero) | 637 | # define mad_timer_reset(timer)((void) (*(timer) = mad_timer_zero)) |
543 | 638 | ||
544 | int mad_timer_compare(mad_timer_t, mad_timer_t); | 639 | int mad_timer_compare(mad_timer_t, mad_timer_t); |
545 | 640 | ||
546 | # define mad_timer_sign(timer)mad_timer_compare((timer), mad_timer_zero) | 641 | # define mad_timer_sign(timer)mad_timer_compare((timer), mad_timer_zero) |
547 | 642 | ||
548 | void mad_timer_negate(mad_timer_t *); | 643 | void mad_timer_negate(mad_timer_t *); |
549 | mad_timer_t mad_timer_abs(mad_timer_t); | 644 | mad_timer_t mad_timer_abs(mad_timer_t); |
550 | 645 | ||
551 | void mad_timer_set(mad_timer_t *, unsigned long, unsigned long, unsigned long); | 646 | void mad_timer_set(mad_timer_t *, unsigned long, unsigned long, unsigned long); |
552 | void mad_timer_add(mad_timer_t *, mad_timer_t); | 647 | void mad_timer_add(mad_timer_t *, mad_timer_t); |
553 | void mad_timer_multiply(mad_timer_t *, signed long); | 648 | void mad_timer_multiply(mad_timer_t *, signed long); |
554 | 649 | ||
555 | signed long mad_timer_count(mad_timer_t, enum mad_units); | 650 | signed long mad_timer_count(mad_timer_t, enum mad_units); |
556 | unsigned long mad_timer_fraction(mad_timer_t, unsigned long); | 651 | unsigned long mad_timer_fraction(mad_timer_t, unsigned long); |
557 | void mad_timer_string(mad_timer_t, char *, char const *, | 652 | void mad_timer_string(mad_timer_t, char *, char const *, |
558 | enum mad_units, enum mad_units, unsigned long); | 653 | enum mad_units, enum mad_units, unsigned long); |
559 | 654 | ||
560 | # endif | 655 | # endif |
561 | 656 | ||
562 | /* Id: stream.h,v 1.12 2001/04/10 05:18:21 rob Exp */ | 657 | /* Id: stream.h,v 1.20 2004/02/05 09:02:39 rob Exp */ |
563 | 658 | ||
564 | # ifndef LIBMAD_STREAM_H | 659 | # ifndef LIBMAD_STREAM_H |
565 | # define LIBMAD_STREAM_H | 660 | # define LIBMAD_STREAM_H |
566 | 661 | ||
662 | |||
567 | # define MAD_BUFFER_GUARD8 | 663 | # define MAD_BUFFER_GUARD8 |
568 | # define MAD_BUFFER_MDLEN(511 + 2048 + MAD_BUFFER_GUARD) | 664 | # define MAD_BUFFER_MDLEN(511 + 2048 + MAD_BUFFER_GUARD) |
569 | 665 | ||
570 | enum mad_error { | 666 | enum mad_error { |
667 | MAD_ERROR_NONE = 0x0000,/* no error */ | ||
668 | |||
571 | MAD_ERROR_BUFLEN = 0x0001,/* input buffer too small (or EOF) */ | 669 | MAD_ERROR_BUFLEN = 0x0001,/* input buffer too small (or EOF) */ |
572 | MAD_ERROR_BUFPTR = 0x0002,/* invalid (null) buffer pointer */ | 670 | MAD_ERROR_BUFPTR = 0x0002,/* invalid (null) buffer pointer */ |
573 | 671 | ||
574 | MAD_ERROR_NOMEM = 0x0031,/* not enough memory */ | 672 | MAD_ERROR_NOMEM = 0x0031,/* not enough memory */ |
575 | 673 | ||
576 | MAD_ERROR_LOSTSYNC = 0x0101,/* lost synchronization */ | 674 | MAD_ERROR_LOSTSYNC = 0x0101,/* lost synchronization */ |
577 | MAD_ERROR_BADLAYER = 0x0102,/* reserved header layer value */ | 675 | MAD_ERROR_BADLAYER = 0x0102,/* reserved header layer value */ |
578 | MAD_ERROR_BADBITRATE = 0x0103,/* forbidden bitrate value */ | 676 | MAD_ERROR_BADBITRATE = 0x0103,/* forbidden bitrate value */ |
579 | MAD_ERROR_BADSAMPLERATE = 0x0104,/* reserved sample frequency value */ | 677 | MAD_ERROR_BADSAMPLERATE = 0x0104,/* reserved sample frequency value */ |
580 | MAD_ERROR_BADEMPHASIS = 0x0105,/* reserved emphasis value */ | 678 | MAD_ERROR_BADEMPHASIS = 0x0105,/* reserved emphasis value */ |
581 | 679 | ||
582 | MAD_ERROR_BADCRC = 0x0201,/* CRC check failed */ | 680 | MAD_ERROR_BADCRC = 0x0201,/* CRC check failed */ |
583 | MAD_ERROR_BADBITALLOC = 0x0211,/* forbidden bit allocation value */ | 681 | MAD_ERROR_BADBITALLOC = 0x0211,/* forbidden bit allocation value */ |
584 | MAD_ERROR_BADSCALEFACTOR = 0x0221,/* bad scalefactor index */ | 682 | MAD_ERROR_BADSCALEFACTOR = 0x0221,/* bad scalefactor index */ |
683 | MAD_ERROR_BADMODE = 0x0222,/* bad bitrate/mode combination */ | ||
585 | MAD_ERROR_BADFRAMELEN = 0x0231,/* bad frame length */ | 684 | MAD_ERROR_BADFRAMELEN = 0x0231,/* bad frame length */ |
586 | MAD_ERROR_BADBIGVALUES = 0x0232,/* bad big_values count */ | 685 | MAD_ERROR_BADBIGVALUES = 0x0232,/* bad big_values count */ |
587 | MAD_ERROR_BADBLOCKTYPE = 0x0233,/* reserved block_type */ | 686 | MAD_ERROR_BADBLOCKTYPE = 0x0233,/* reserved block_type */ |
588 | MAD_ERROR_BADSCFSI = 0x0234,/* bad scalefactor selection info */ | 687 | MAD_ERROR_BADSCFSI = 0x0234,/* bad scalefactor selection info */ |
589 | MAD_ERROR_BADDATAPTR = 0x0235,/* bad main_data_begin pointer */ | 688 | MAD_ERROR_BADDATAPTR = 0x0235,/* bad main_data_begin pointer */ |
590 | MAD_ERROR_BADPART3LEN = 0x0236,/* bad audio data length */ | 689 | MAD_ERROR_BADPART3LEN = 0x0236,/* bad audio data length */ |
591 | MAD_ERROR_BADHUFFTABLE = 0x0237,/* bad Huffman table select */ | 690 | MAD_ERROR_BADHUFFTABLE = 0x0237,/* bad Huffman table select */ |
592 | MAD_ERROR_BADHUFFDATA = 0x0238,/* Huffman data overrun */ | 691 | MAD_ERROR_BADHUFFDATA = 0x0238,/* Huffman data overrun */ |
593 | MAD_ERROR_BADSTEREO = 0x0239/* incompatible block_type for JS */ | 692 | MAD_ERROR_BADSTEREO = 0x0239/* incompatible block_type for JS */ |
594 | }; | 693 | }; |
595 | 694 | ||
596 | # define MAD_RECOVERABLE(error)((error) & 0xff00) | 695 | # define MAD_RECOVERABLE(error)((error) & 0xff00) |
597 | 696 | ||
598 | struct mad_stream { | 697 | struct mad_stream { |
599 | unsigned char const *buffer; /* input bitstream buffer */ | 698 | unsigned char const *buffer; /* input bitstream buffer */ |
600 | unsigned char const *bufend; /* end of buffer */ | 699 | unsigned char const *bufend; /* end of buffer */ |
601 | unsigned long skiplen; /* bytes to skip before next frame */ | 700 | unsigned long skiplen; /* bytes to skip before next frame */ |
602 | 701 | ||
603 | int sync; /* stream sync found */ | 702 | int sync; /* stream sync found */ |
604 | unsigned long freerate; /* free bitrate (fixed) */ | 703 | unsigned long freerate; /* free bitrate (fixed) */ |
605 | 704 | ||
606 | unsigned char const *this_frame;/* start of current frame */ | 705 | unsigned char const *this_frame;/* start of current frame */ |
607 | unsigned char const *next_frame;/* start of next frame */ | 706 | unsigned char const *next_frame;/* start of next frame */ |
608 | struct mad_bitptr ptr; /* current processing bit pointer */ | 707 | struct mad_bitptr ptr; /* current processing bit pointer */ |
609 | 708 | ||
610 | struct mad_bitptr anc_ptr; /* ancillary bits pointer */ | 709 | struct mad_bitptr anc_ptr; /* ancillary bits pointer */ |
611 | unsigned int anc_bitlen; /* number of ancillary bits */ | 710 | unsigned int anc_bitlen; /* number of ancillary bits */ |
612 | 711 | ||
613 | unsigned char (*main_data)[MAD_BUFFER_MDLEN]; | 712 | unsigned char (*main_data)[MAD_BUFFER_MDLEN]; |
614 | /* Layer III main_data() */ | 713 | /* Layer III main_data() */ |
615 | unsigned int md_len; /* bytes in main_data */ | 714 | unsigned int md_len; /* bytes in main_data */ |
616 | 715 | ||
617 | int options; /* decoding options (see below) */ | 716 | int options; /* decoding options (see below) */ |
618 | enum mad_error error; /* error code (see above) */ | 717 | enum mad_error error; /* error code (see above) */ |
619 | }; | 718 | }; |
620 | 719 | ||
621 | enum { | 720 | enum { |
622 | MAD_OPTION_IGNORECRC = 0x0001,/* ignore CRC errors */ | 721 | MAD_OPTION_IGNORECRC = 0x0001,/* ignore CRC errors */ |
623 | MAD_OPTION_HALFSAMPLERATE = 0x0002,/* generate PCM at 1/2 sample rate */ | 722 | MAD_OPTION_HALFSAMPLERATE = 0x0002/* generate PCM at 1/2 sample rate */ |
624 | # if 0 /* not yet implemented */ | 723 | # if 0 /* not yet implemented */ |
625 | MAD_OPTION_LEFTCHANNEL = 0x0010,/* decode left channel only */ | 724 | MAD_OPTION_LEFTCHANNEL = 0x0010,/* decode left channel only */ |
626 | MAD_OPTION_RIGHTCHANNEL = 0x0020,/* decode right channel only */ | 725 | MAD_OPTION_RIGHTCHANNEL = 0x0020,/* decode right channel only */ |
627 | MAD_OPTION_SINGLECHANNEL = 0x0030,/* combine channels */ | 726 | MAD_OPTION_SINGLECHANNEL = 0x0030/* combine channels */ |
628 | # endif | 727 | # endif |
629 | }; | 728 | }; |
630 | 729 | ||
631 | void mad_stream_init(struct mad_stream *); | 730 | void mad_stream_init(struct mad_stream *); |
632 | void mad_stream_finish(struct mad_stream *); | 731 | void mad_stream_finish(struct mad_stream *); |
633 | 732 | ||
634 | # define mad_stream_options(stream, opts) ((stream)->options = (opts)) | 733 | # define mad_stream_options(stream, opts) \ |
734 | ((void) ((stream)->options = (opts))) | ||
635 | 735 | ||
636 | void mad_stream_buffer(struct mad_stream *, | 736 | void mad_stream_buffer(struct mad_stream *, |
637 | unsigned char const *, unsigned long); | 737 | unsigned char const *, unsigned long); |
638 | void mad_stream_skip(struct mad_stream *, unsigned long); | 738 | void mad_stream_skip(struct mad_stream *, unsigned long); |
639 | 739 | ||
640 | int mad_stream_sync(struct mad_stream *); | 740 | int mad_stream_sync(struct mad_stream *); |
641 | 741 | ||
742 | char const *mad_stream_errorstr(struct mad_stream const *); | ||
743 | |||
642 | # endif | 744 | # endif |
643 | 745 | ||
644 | /* Id: frame.h,v 1.13 2001/04/05 04:57:11 rob Exp */ | 746 | /* Id: frame.h,v 1.20 2004/01/23 09:41:32 rob Exp */ |
645 | 747 | ||
646 | # ifndef LIBMAD_FRAME_H | 748 | # ifndef LIBMAD_FRAME_H |
647 | # define LIBMAD_FRAME_H | 749 | # define LIBMAD_FRAME_H |
648 | 750 | ||
751 | |||
649 | enum mad_layer { | 752 | enum mad_layer { |
650 | MAD_LAYER_I = 1, /* Layer I */ | 753 | MAD_LAYER_I = 1, /* Layer I */ |
651 | MAD_LAYER_II = 2, /* Layer II */ | 754 | MAD_LAYER_II = 2, /* Layer II */ |
652 | MAD_LAYER_III = 3 /* Layer III */ | 755 | MAD_LAYER_III = 3 /* Layer III */ |
653 | }; | 756 | }; |
654 | 757 | ||
655 | enum mad_mode { | 758 | enum mad_mode { |
656 | MAD_MODE_SINGLE_CHANNEL = 0, /* single channel */ | 759 | MAD_MODE_SINGLE_CHANNEL = 0, /* single channel */ |
657 | MAD_MODE_DUAL_CHANNEL = 1, /* dual channel */ | 760 | MAD_MODE_DUAL_CHANNEL = 1, /* dual channel */ |
658 | MAD_MODE_JOINT_STEREO = 2, /* joint (MS/intensity) stereo */ | 761 | MAD_MODE_JOINT_STEREO = 2, /* joint (MS/intensity) stereo */ |
659 | MAD_MODE_STEREO = 3 /* normal LR stereo */ | 762 | MAD_MODE_STEREO = 3 /* normal LR stereo */ |
660 | }; | 763 | }; |
661 | 764 | ||
662 | enum mad_emphasis { | 765 | enum mad_emphasis { |
663 | MAD_EMPHASIS_NONE = 0, /* no emphasis */ | 766 | MAD_EMPHASIS_NONE = 0, /* no emphasis */ |
664 | MAD_EMPHASIS_50_15_US = 1, /* 50/15 microseconds emphasis */ | 767 | MAD_EMPHASIS_50_15_US = 1, /* 50/15 microseconds emphasis */ |
665 | MAD_EMPHASIS_CCITT_J_17 = 3 /* CCITT J.17 emphasis */ | 768 | MAD_EMPHASIS_CCITT_J_17 = 3, /* CCITT J.17 emphasis */ |
769 | MAD_EMPHASIS_RESERVED = 2 /* unknown emphasis */ | ||
666 | }; | 770 | }; |
667 | 771 | ||
668 | struct mad_frame { | 772 | struct mad_header { |
669 | struct mad_header { | 773 | enum mad_layer layer; /* audio layer (1, 2, or 3) */ |
670 | enum mad_layer layer; /* audio layer (1, 2, or 3) */ | 774 | enum mad_mode mode; /* channel mode (see above) */ |
671 | enum mad_mode mode; /* channel mode (see above) */ | 775 | int mode_extension; /* additional mode info */ |
672 | int mode_extension; /* additional mode info */ | 776 | enum mad_emphasis emphasis; /* de-emphasis to use (see above) */ |
673 | enum mad_emphasis emphasis; /* de-emphasis to use (see above) */ | 777 | |
778 | unsigned long bitrate; /* stream bitrate (bps) */ | ||
779 | unsigned int samplerate; /* sampling frequency (Hz) */ | ||
674 | 780 | ||
675 | unsigned long bitrate; /* stream bitrate (bps) */ | 781 | unsigned short crc_check; /* frame CRC accumulator */ |
676 | unsigned int samplerate; /* sampling frequency (Hz) */ | 782 | unsigned short crc_target; /* final target CRC checksum */ |
677 | 783 | ||
678 | unsigned short crc_check; /* frame CRC accumulator */ | 784 | int flags; /* flags (see below) */ |
679 | unsigned short crc_target; /* final target CRC checksum */ | 785 | int private_bits; /* private bits (see below) */ |
680 | 786 | ||
681 | int flags; /* flags (see below) */ | 787 | mad_timer_t duration; /* audio playing time of frame */ |
682 | int private_bits; /* private bits (see below) */ | 788 | }; |
683 | 789 | ||
684 | mad_timer_t duration; /* audio playing time of frame */ | 790 | struct mad_frame { |
685 | } header; | 791 | struct mad_header header; /* MPEG audio header */ |
686 | 792 | ||
687 | int options; /* decoding options (from stream) */ | 793 | int options; /* decoding options (from stream) */ |
688 | 794 | ||
689 | mad_fixed_t sbsample[2][36][32];/* synthesis subband filter samples */ | 795 | mad_fixed_t sbsample[2][36][32];/* synthesis subband filter samples */ |
690 | mad_fixed_t (*overlap)[2][32][18];/* Layer III block overlap data */ | 796 | mad_fixed_t (*overlap)[2][32][18];/* Layer III block overlap data */ |
691 | }; | 797 | }; |
692 | 798 | ||
693 | # define MAD_NCHANNELS(header) ((header)->mode ? 2 : 1) | 799 | # define MAD_NCHANNELS(header) ((header)->mode ? 2 : 1) |
694 | # define MAD_NSBSAMPLES(header) \ | 800 | # define MAD_NSBSAMPLES(header) \ |
695 | ((header)->layer == MAD_LAYER_I ? 12 : \ | 801 | ((header)->layer == MAD_LAYER_I ? 12 : \ |
696 | (((header)->layer == MAD_LAYER_III && \ | 802 | (((header)->layer == MAD_LAYER_III && \ |
697 | ((header)->flags & MAD_FLAG_LSF_EXT)) ? 18 : 36)) | 803 | ((header)->flags & MAD_FLAG_LSF_EXT)) ? 18 : 36)) |
698 | 804 | ||
699 | enum { | 805 | enum { |
700 | MAD_FLAG_NPRIVATE_III = 0x0007,/* number of Layer III private bits */ | 806 | MAD_FLAG_NPRIVATE_III = 0x0007,/* number of Layer III private bits */ |
701 | MAD_FLAG_INCOMPLETE = 0x0008,/* header but not data is decoded */ | 807 | MAD_FLAG_INCOMPLETE = 0x0008,/* header but not data is decoded */ |
702 | 808 | ||
703 | MAD_FLAG_PROTECTION = 0x0010,/* frame has CRC protection */ | 809 | MAD_FLAG_PROTECTION = 0x0010,/* frame has CRC protection */ |
704 | MAD_FLAG_COPYRIGHT = 0x0020,/* frame is copyright */ | 810 | MAD_FLAG_COPYRIGHT = 0x0020,/* frame is copyright */ |
705 | MAD_FLAG_ORIGINAL = 0x0040,/* frame is original (else copy) */ | 811 | MAD_FLAG_ORIGINAL = 0x0040,/* frame is original (else copy) */ |
706 | MAD_FLAG_PADDING = 0x0080,/* frame has additional slot */ | 812 | MAD_FLAG_PADDING = 0x0080,/* frame has additional slot */ |
707 | 813 | ||
708 | MAD_FLAG_I_STEREO = 0x0100,/* uses intensity joint stereo */ | 814 | MAD_FLAG_I_STEREO = 0x0100,/* uses intensity joint stereo */ |
709 | MAD_FLAG_MS_STEREO = 0x0200,/* uses middle/side joint stereo */ | 815 | MAD_FLAG_MS_STEREO = 0x0200,/* uses middle/side joint stereo */ |
710 | MAD_FLAG_FREEFORMAT = 0x0400,/* uses free format bitrate */ | 816 | MAD_FLAG_FREEFORMAT = 0x0400,/* uses free format bitrate */ |
711 | 817 | ||
712 | MAD_FLAG_LSF_EXT = 0x1000,/* lower sampling freq. extension */ | 818 | MAD_FLAG_LSF_EXT = 0x1000,/* lower sampling freq. extension */ |
713 | MAD_FLAG_MC_EXT = 0x2000,/* multichannel audio extension */ | 819 | MAD_FLAG_MC_EXT = 0x2000,/* multichannel audio extension */ |
714 | MAD_FLAG_MPEG_2_5_EXT = 0x4000/* MPEG 2.5 (unofficial) extension */ | 820 | MAD_FLAG_MPEG_2_5_EXT = 0x4000/* MPEG 2.5 (unofficial) extension */ |
715 | }; | 821 | }; |
716 | 822 | ||
717 | enum { | 823 | enum { |
718 | MAD_PRIVATE_HEADER = 0x0100,/* header private bit */ | 824 | MAD_PRIVATE_HEADER = 0x0100,/* header private bit */ |
719 | MAD_PRIVATE_III = 0x001f/* Layer III private bits (up to 5) */ | 825 | MAD_PRIVATE_III = 0x001f/* Layer III private bits (up to 5) */ |
720 | }; | 826 | }; |
721 | 827 | ||
722 | void mad_header_init(struct mad_header *); | 828 | void mad_header_init(struct mad_header *); |
723 | 829 | ||
724 | # define mad_header_finish(header) /* nothing */ | 830 | # define mad_header_finish(header) /* nothing */ |
725 | 831 | ||
726 | int mad_header_decode(struct mad_header *, struct mad_stream *); | 832 | int mad_header_decode(struct mad_header *, struct mad_stream *); |
727 | 833 | ||
728 | void mad_frame_init(struct mad_frame *); | 834 | void mad_frame_init(struct mad_frame *); |
729 | void mad_frame_finish(struct mad_frame *); | 835 | void mad_frame_finish(struct mad_frame *); |
730 | 836 | ||
731 | int mad_frame_decode(struct mad_frame *, struct mad_stream *); | 837 | int mad_frame_decode(struct mad_frame *, struct mad_stream *); |
732 | 838 | ||
733 | void mad_frame_mute(struct mad_frame *); | 839 | void mad_frame_mute(struct mad_frame *); |
734 | 840 | ||
735 | # endif | 841 | # endif |
736 | 842 | ||
737 | /* Id: synth.h,v 1.8 2001/04/05 04:57:11 rob Exp */ | 843 | /* Id: synth.h,v 1.15 2004/01/23 09:41:33 rob Exp */ |
738 | 844 | ||
739 | # ifndef LIBMAD_SYNTH_H | 845 | # ifndef LIBMAD_SYNTH_H |
740 | # define LIBMAD_SYNTH_H | 846 | # define LIBMAD_SYNTH_H |
741 | 847 | ||
848 | |||
849 | struct mad_pcm { | ||
850 | unsigned int samplerate; /* sampling frequency (Hz) */ | ||
851 | unsigned short channels; /* number of channels */ | ||
852 | unsigned short length; /* number of samples per channel */ | ||
853 | mad_fixed_t samples[2][1152]; /* PCM output samples [ch][sample] */ | ||
854 | }; | ||
855 | |||
742 | struct mad_synth { | 856 | struct mad_synth { |
743 | mad_fixed_t filter[2][2][2][16][8];/* polyphase filterbank outputs */ | 857 | mad_fixed_t filter[2][2][2][16][8];/* polyphase filterbank outputs */ |
744 | /* [ch][eo][peo][s][v] */ | 858 | /* [ch][eo][peo][s][v] */ |
745 | 859 | ||
746 | unsigned int phase; /* current processing phase */ | 860 | unsigned int phase; /* current processing phase */ |
747 | 861 | ||
748 | struct mad_pcm { | 862 | struct mad_pcm pcm; /* PCM output */ |
749 | unsigned int samplerate; /* sampling frequency (Hz) */ | 863 | }; |
750 | unsigned short channels; /* number of channels */ | 864 | |
751 | unsigned short length; /* number of samples per channel */ | 865 | /* single channel PCM selector */ |
752 | mad_fixed_t samples[2][1152];/* PCM output samples */ | 866 | enum { |
753 | } pcm; | 867 | MAD_PCM_CHANNEL_SINGLE = 0 |
868 | }; | ||
869 | |||
870 | /* dual channel PCM selector */ | ||
871 | enum { | ||
872 | MAD_PCM_CHANNEL_DUAL_1 = 0, | ||
873 | MAD_PCM_CHANNEL_DUAL_2 = 1 | ||
874 | }; | ||
875 | |||
876 | /* stereo PCM selector */ | ||
877 | enum { | ||
878 | MAD_PCM_CHANNEL_STEREO_LEFT = 0, | ||
879 | MAD_PCM_CHANNEL_STEREO_RIGHT = 1 | ||
754 | }; | 880 | }; |
755 | 881 | ||
756 | void mad_synth_init(struct mad_synth *); | 882 | void mad_synth_init(struct mad_synth *); |
757 | 883 | ||
758 | # define mad_synth_finish(synth) /* nothing */ | 884 | # define mad_synth_finish(synth) /* nothing */ |
759 | 885 | ||
760 | void mad_synth_mute(struct mad_synth *); | 886 | void mad_synth_mute(struct mad_synth *); |
761 | 887 | ||
762 | void mad_synth_frame(struct mad_synth *, struct mad_frame const *); | 888 | void mad_synth_frame(struct mad_synth *, struct mad_frame const *); |
763 | 889 | ||
764 | # endif | 890 | # endif |
765 | 891 | ||
766 | /* Id: decoder.h,v 1.9 2001/04/05 04:57:11 rob Exp */ | 892 | /* Id: decoder.h,v 1.17 2004/01/23 09:41:32 rob Exp */ |
767 | 893 | ||
768 | # ifndef LIBMAD_DECODER_H | 894 | # ifndef LIBMAD_DECODER_H |
769 | # define LIBMAD_DECODER_H | 895 | # define LIBMAD_DECODER_H |
770 | 896 | ||
897 | |||
771 | enum mad_decoder_mode { | 898 | enum mad_decoder_mode { |
772 | MAD_DECODER_MODE_SYNC = 0, | 899 | MAD_DECODER_MODE_SYNC = 0, |
773 | MAD_DECODER_MODE_ASYNC | 900 | MAD_DECODER_MODE_ASYNC |
774 | }; | 901 | }; |
775 | 902 | ||
776 | enum mad_flow { | 903 | enum mad_flow { |
777 | MAD_FLOW_CONTINUE = 0x0000, | 904 | MAD_FLOW_CONTINUE = 0x0000,/* continue normally */ |
778 | MAD_FLOW_STOP = 0x0010, | 905 | MAD_FLOW_STOP = 0x0010,/* stop decoding normally */ |
779 | MAD_FLOW_BREAK = 0x0011, | 906 | MAD_FLOW_BREAK = 0x0011,/* stop decoding and signal an error */ |
780 | MAD_FLOW_IGNORE = 0x0020 | 907 | MAD_FLOW_IGNORE = 0x0020/* ignore the current frame */ |
781 | }; | 908 | }; |
782 | 909 | ||
783 | struct mad_decoder { | 910 | struct mad_decoder { |
784 | enum mad_decoder_mode mode; | 911 | enum mad_decoder_mode mode; |
785 | 912 | ||
786 | int options; | 913 | int options; |
787 | 914 | ||
788 | struct { | 915 | struct { |
789 | long pid; | 916 | long pid; |
790 | int in; | 917 | int in; |
791 | int out; | 918 | int out; |
792 | } async; | 919 | } async; |
793 | 920 | ||
794 | struct { | 921 | struct { |
795 | struct mad_stream stream; | 922 | struct mad_stream stream; |
796 | struct mad_frame frame; | 923 | struct mad_frame frame; |
797 | struct mad_synth synth; | 924 | struct mad_synth synth; |
798 | } *sync; | 925 | } *sync; |
799 | 926 | ||
800 | void *cb_data; | 927 | void *cb_data; |
801 | 928 | ||
802 | enum mad_flow (*input_func)(void *, struct mad_stream *); | 929 | enum mad_flow (*input_func)(void *, struct mad_stream *); |
803 | enum mad_flow (*header_func)(void *, struct mad_header const *); | 930 | enum mad_flow (*header_func)(void *, struct mad_header const *); |
804 | enum mad_flow (*filter_func)(void *, struct mad_frame *); | 931 | enum mad_flow (*filter_func)(void *, |
932 | struct mad_stream const *, struct mad_frame *); | ||
805 | enum mad_flow (*output_func)(void *, | 933 | enum mad_flow (*output_func)(void *, |
806 | struct mad_header const *, struct mad_pcm *); | 934 | struct mad_header const *, struct mad_pcm *); |
807 | enum mad_flow (*error_func)(void *, struct mad_stream *, struct mad_frame *); | 935 | enum mad_flow (*error_func)(void *, struct mad_stream *, struct mad_frame *); |
808 | enum mad_flow (*message_func)(void *, void *, unsigned int *); | 936 | enum mad_flow (*message_func)(void *, void *, unsigned int *); |
809 | }; | 937 | }; |
810 | 938 | ||
811 | void mad_decoder_init(struct mad_decoder *, void *, | 939 | void mad_decoder_init(struct mad_decoder *, void *, |
812 | enum mad_flow (*)(void *, struct mad_stream *), | 940 | enum mad_flow (*)(void *, struct mad_stream *), |
813 | enum mad_flow (*)(void *, struct mad_header const *), | 941 | enum mad_flow (*)(void *, struct mad_header const *), |
814 | enum mad_flow (*)(void *, struct mad_frame *), | 942 | enum mad_flow (*)(void *, |
943 | struct mad_stream const *, | ||
944 | struct mad_frame *), | ||
815 | enum mad_flow (*)(void *, | 945 | enum mad_flow (*)(void *, |
816 | struct mad_header const *, | 946 | struct mad_header const *, |
817 | struct mad_pcm *), | 947 | struct mad_pcm *), |
818 | enum mad_flow (*)(void *, | 948 | enum mad_flow (*)(void *, |
819 | struct mad_stream *, | 949 | struct mad_stream *, |
820 | struct mad_frame *), | 950 | struct mad_frame *), |
821 | enum mad_flow (*)(void *, void *, unsigned int *)); | 951 | enum mad_flow (*)(void *, void *, unsigned int *)); |
822 | int mad_decoder_finish(struct mad_decoder *); | 952 | int mad_decoder_finish(struct mad_decoder *); |
823 | 953 | ||
824 | # define mad_decoder_options(decoder, opts) ((decoder)->options = (opts)) | 954 | # define mad_decoder_options(decoder, opts) \ |
955 | ((void) ((decoder)->options = (opts))) | ||
825 | 956 | ||
826 | int mad_decoder_run(struct mad_decoder *, enum mad_decoder_mode); | 957 | int mad_decoder_run(struct mad_decoder *, enum mad_decoder_mode); |
827 | int mad_decoder_message(struct mad_decoder *, void *, unsigned int *); | 958 | int mad_decoder_message(struct mad_decoder *, void *, unsigned int *); |
828 | 959 | ||
829 | # endif | 960 | # endif |
830 | 961 | ||
962 | # ifdef __cplusplus | ||
963 | } | ||
964 | # endif | ||
diff --git a/core/multimedia/opieplayer/libmad/opie-libmadplugin.control b/core/multimedia/opieplayer/libmad/opie-libmadplugin.control index 8de5976..15c083f 100644 --- a/core/multimedia/opieplayer/libmad/opie-libmadplugin.control +++ b/core/multimedia/opieplayer/libmad/opie-libmadplugin.control | |||
@@ -1,11 +1,11 @@ | |||
1 | Package: opie-libmadplugin | 1 | Package: opie-libmadplugin |
2 | Files: plugins/codecs/libmadplugin.so.1.0.0 plugins/codecs/libmadplugin.so.1.0 plugins/codecs/libmadplugin.so.1 plugins/codecs/libmadplugin.so | 2 | Files: plugins/codecs/libmadplugin.so.1.0.0 plugins/codecs/libmadplugin.so.1.0 plugins/codecs/libmadplugin.so.1 plugins/codecs/libmadplugin.so |
3 | Priority: optional | 3 | Priority: optional |
4 | Section: libs | 4 | Section: opie/plugins |
5 | Maintainer: Maximilian Reiss <max.reiss@gmx.de>, L.J. Potter <lpotter@trolltech.com> | 5 | Maintainer: Maximilian Reiss <max.reiss@gmx.de> |
6 | Architecture: arm | 6 | Architecture: arm |
7 | Depends: task-opie-minimal | 7 | Depends: task-opie-minimal |
8 | Description: MP3 file plugin using libmad | 8 | Description: MP3 file plugin using libmad |
9 | Plugin to play MP3 files with the mediaplayer in the Opie environment. | 9 | Plugin to play MP3 files with the mediaplayer in the Opie environment. |
10 | It also has streaming support (Shoutcast/Icecast). | 10 | It also hast streaming support (Shoutcast/Icecast). |
11 | Version: $QPE_VERSION$EXTRAVERSION | 11 | Version: $QPE_VERSION$EXTRAVERSION |
diff --git a/core/multimedia/opieplayer/libmad/qc_table.dat b/core/multimedia/opieplayer/libmad/qc_table.dat index 5d9ca96..d28a207 100644 --- a/core/multimedia/opieplayer/libmad/qc_table.dat +++ b/core/multimedia/opieplayer/libmad/qc_table.dat | |||
@@ -1,77 +1,77 @@ | |||
1 | /* | 1 | /* |
2 | * libmad - MPEG audio decoder library | 2 | * libmad - MPEG audio decoder library |
3 | * Copyright (C) 2000-2001 Robert Leslie | 3 | * Copyright (C) 2000-2004 Underbit Technologies, Inc. |
4 | * | 4 | * |
5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
7 | * the Free Software Foundation; either version 2 of the License, or | 7 | * the Free Software Foundation; either version 2 of the License, or |
8 | * (at your option) any later version. | 8 | * (at your option) any later version. |
9 | * | 9 | * |
10 | * This program is distributed in the hope that it will be useful, | 10 | * This program is distributed in the hope that it will be useful, |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | * GNU General Public License for more details. | 13 | * GNU General Public License for more details. |
14 | * | 14 | * |
15 | * You should have received a copy of the GNU General Public License | 15 | * You should have received a copy of the GNU General Public License |
16 | * along with this program; if not, write to the Free Software | 16 | * along with this program; if not, write to the Free Software |
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
18 | * | 18 | * |
19 | * $Id$ | 19 | * $Id$ |
20 | */ | 20 | */ |
21 | 21 | ||
22 | /* | 22 | /* |
23 | * These are the Layer II classes of quantization. | 23 | * These are the Layer II classes of quantization. |
24 | * The table is derived from Table B.4 of ISO/IEC 11172-3. | 24 | * The table is derived from Table B.4 of ISO/IEC 11172-3. |
25 | */ | 25 | */ |
26 | 26 | ||
27 | { 3, 2, 5, | 27 | { 3, 2, 5, |
28 | MAD_F(0x15555555) /* 1.33333333333 => 1.33333333209, e 0.00000000124 */, | 28 | MAD_F(0x15555555) /* 1.33333333333 => 1.33333333209, e 0.00000000124 */, |
29 | MAD_F(0x08000000) /* 0.50000000000 => 0.50000000000, e 0.00000000000 */ }, | 29 | MAD_F(0x08000000) /* 0.50000000000 => 0.50000000000, e 0.00000000000 */ }, |
30 | { 5, 3, 7, | 30 | { 5, 3, 7, |
31 | MAD_F(0x1999999a) /* 1.60000000000 => 1.60000000149, e -0.00000000149 */, | 31 | MAD_F(0x1999999a) /* 1.60000000000 => 1.60000000149, e -0.00000000149 */, |
32 | MAD_F(0x08000000) /* 0.50000000000 => 0.50000000000, e 0.00000000000 */ }, | 32 | MAD_F(0x08000000) /* 0.50000000000 => 0.50000000000, e 0.00000000000 */ }, |
33 | { 7, 0, 3, | 33 | { 7, 0, 3, |
34 | MAD_F(0x12492492) /* 1.14285714286 => 1.14285714179, e 0.00000000107 */, | 34 | MAD_F(0x12492492) /* 1.14285714286 => 1.14285714179, e 0.00000000107 */, |
35 | MAD_F(0x04000000) /* 0.25000000000 => 0.25000000000, e 0.00000000000 */ }, | 35 | MAD_F(0x04000000) /* 0.25000000000 => 0.25000000000, e 0.00000000000 */ }, |
36 | { 9, 4, 10, | 36 | { 9, 4, 10, |
37 | MAD_F(0x1c71c71c) /* 1.77777777777 => 1.77777777612, e 0.00000000165 */, | 37 | MAD_F(0x1c71c71c) /* 1.77777777777 => 1.77777777612, e 0.00000000165 */, |
38 | MAD_F(0x08000000) /* 0.50000000000 => 0.50000000000, e 0.00000000000 */ }, | 38 | MAD_F(0x08000000) /* 0.50000000000 => 0.50000000000, e 0.00000000000 */ }, |
39 | { 15, 0, 4, | 39 | { 15, 0, 4, |
40 | MAD_F(0x11111111) /* 1.06666666666 => 1.06666666642, e 0.00000000024 */, | 40 | MAD_F(0x11111111) /* 1.06666666666 => 1.06666666642, e 0.00000000024 */, |
41 | MAD_F(0x02000000) /* 0.12500000000 => 0.12500000000, e 0.00000000000 */ }, | 41 | MAD_F(0x02000000) /* 0.12500000000 => 0.12500000000, e 0.00000000000 */ }, |
42 | { 31, 0, 5, | 42 | { 31, 0, 5, |
43 | MAD_F(0x10842108) /* 1.03225806452 => 1.03225806355, e 0.00000000097 */, | 43 | MAD_F(0x10842108) /* 1.03225806452 => 1.03225806355, e 0.00000000097 */, |
44 | MAD_F(0x01000000) /* 0.06250000000 => 0.06250000000, e 0.00000000000 */ }, | 44 | MAD_F(0x01000000) /* 0.06250000000 => 0.06250000000, e 0.00000000000 */ }, |
45 | { 63, 0, 6, | 45 | { 63, 0, 6, |
46 | MAD_F(0x10410410) /* 1.01587301587 => 1.01587301493, e 0.00000000094 */, | 46 | MAD_F(0x10410410) /* 1.01587301587 => 1.01587301493, e 0.00000000094 */, |
47 | MAD_F(0x00800000) /* 0.03125000000 => 0.03125000000, e 0.00000000000 */ }, | 47 | MAD_F(0x00800000) /* 0.03125000000 => 0.03125000000, e 0.00000000000 */ }, |
48 | { 127, 0, 7, | 48 | { 127, 0, 7, |
49 | MAD_F(0x10204081) /* 1.00787401575 => 1.00787401572, e 0.00000000003 */, | 49 | MAD_F(0x10204081) /* 1.00787401575 => 1.00787401572, e 0.00000000003 */, |
50 | MAD_F(0x00400000) /* 0.01562500000 => 0.01562500000, e 0.00000000000 */ }, | 50 | MAD_F(0x00400000) /* 0.01562500000 => 0.01562500000, e 0.00000000000 */ }, |
51 | { 255, 0, 8, | 51 | { 255, 0, 8, |
52 | MAD_F(0x10101010) /* 1.00392156863 => 1.00392156839, e 0.00000000024 */, | 52 | MAD_F(0x10101010) /* 1.00392156863 => 1.00392156839, e 0.00000000024 */, |
53 | MAD_F(0x00200000) /* 0.00781250000 => 0.00781250000, e 0.00000000000 */ }, | 53 | MAD_F(0x00200000) /* 0.00781250000 => 0.00781250000, e 0.00000000000 */ }, |
54 | { 511, 0, 9, | 54 | { 511, 0, 9, |
55 | MAD_F(0x10080402) /* 1.00195694716 => 1.00195694715, e 0.00000000001 */, | 55 | MAD_F(0x10080402) /* 1.00195694716 => 1.00195694715, e 0.00000000001 */, |
56 | MAD_F(0x00100000) /* 0.00390625000 => 0.00390625000, e 0.00000000000 */ }, | 56 | MAD_F(0x00100000) /* 0.00390625000 => 0.00390625000, e 0.00000000000 */ }, |
57 | { 1023, 0, 10, | 57 | { 1023, 0, 10, |
58 | MAD_F(0x10040100) /* 1.00097751711 => 1.00097751617, e 0.00000000094 */, | 58 | MAD_F(0x10040100) /* 1.00097751711 => 1.00097751617, e 0.00000000094 */, |
59 | MAD_F(0x00080000) /* 0.00195312500 => 0.00195312500, e 0.00000000000 */ }, | 59 | MAD_F(0x00080000) /* 0.00195312500 => 0.00195312500, e 0.00000000000 */ }, |
60 | { 2047, 0, 11, | 60 | { 2047, 0, 11, |
61 | MAD_F(0x10020040) /* 1.00048851979 => 1.00048851967, e 0.00000000012 */, | 61 | MAD_F(0x10020040) /* 1.00048851979 => 1.00048851967, e 0.00000000012 */, |
62 | MAD_F(0x00040000) /* 0.00097656250 => 0.00097656250, e 0.00000000000 */ }, | 62 | MAD_F(0x00040000) /* 0.00097656250 => 0.00097656250, e 0.00000000000 */ }, |
63 | { 4095, 0, 12, | 63 | { 4095, 0, 12, |
64 | MAD_F(0x10010010) /* 1.00024420024 => 1.00024420023, e 0.00000000001 */, | 64 | MAD_F(0x10010010) /* 1.00024420024 => 1.00024420023, e 0.00000000001 */, |
65 | MAD_F(0x00020000) /* 0.00048828125 => 0.00048828125, e 0.00000000000 */ }, | 65 | MAD_F(0x00020000) /* 0.00048828125 => 0.00048828125, e 0.00000000000 */ }, |
66 | { 8191, 0, 13, | 66 | { 8191, 0, 13, |
67 | MAD_F(0x10008004) /* 1.00012208522 => 1.00012208521, e 0.00000000001 */, | 67 | MAD_F(0x10008004) /* 1.00012208522 => 1.00012208521, e 0.00000000001 */, |
68 | MAD_F(0x00010000) /* 0.00024414063 => 0.00024414062, e 0.00000000000 */ }, | 68 | MAD_F(0x00010000) /* 0.00024414063 => 0.00024414062, e 0.00000000000 */ }, |
69 | { 16383, 0, 14, | 69 | { 16383, 0, 14, |
70 | MAD_F(0x10004001) /* 1.00006103888 => 1.00006103888, e -0.00000000000 */, | 70 | MAD_F(0x10004001) /* 1.00006103888 => 1.00006103888, e -0.00000000000 */, |
71 | MAD_F(0x00008000) /* 0.00012207031 => 0.00012207031, e -0.00000000000 */ }, | 71 | MAD_F(0x00008000) /* 0.00012207031 => 0.00012207031, e -0.00000000000 */ }, |
72 | { 32767, 0, 15, | 72 | { 32767, 0, 15, |
73 | MAD_F(0x10002000) /* 1.00003051851 => 1.00003051758, e 0.00000000093 */, | 73 | MAD_F(0x10002000) /* 1.00003051851 => 1.00003051758, e 0.00000000093 */, |
74 | MAD_F(0x00004000) /* 0.00006103516 => 0.00006103516, e 0.00000000000 */ }, | 74 | MAD_F(0x00004000) /* 0.00006103516 => 0.00006103516, e 0.00000000000 */ }, |
75 | { 65535, 0, 16, | 75 | { 65535, 0, 16, |
76 | MAD_F(0x10001000) /* 1.00001525902 => 1.00001525879, e 0.00000000023 */, | 76 | MAD_F(0x10001000) /* 1.00001525902 => 1.00001525879, e 0.00000000023 */, |
77 | MAD_F(0x00002000) /* 0.00003051758 => 0.00003051758, e 0.00000000000 */ } | 77 | MAD_F(0x00002000) /* 0.00003051758 => 0.00003051758, e 0.00000000000 */ } |
diff --git a/core/multimedia/opieplayer/libmad/rq_table.dat b/core/multimedia/opieplayer/libmad/rq_table.dat index 803cf04..518a391 100644 --- a/core/multimedia/opieplayer/libmad/rq_table.dat +++ b/core/multimedia/opieplayer/libmad/rq_table.dat | |||
@@ -1,131 +1,131 @@ | |||
1 | /* | 1 | /* |
2 | * libmad - MPEG audio decoder library | 2 | * libmad - MPEG audio decoder library |
3 | * Copyright (C) 2000-2001 Robert Leslie | 3 | * Copyright (C) 2000-2004 Underbit Technologies, Inc. |
4 | * | 4 | * |
5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
7 | * the Free Software Foundation; either version 2 of the License, or | 7 | * the Free Software Foundation; either version 2 of the License, or |
8 | * (at your option) any later version. | 8 | * (at your option) any later version. |
9 | * | 9 | * |
10 | * This program is distributed in the hope that it will be useful, | 10 | * This program is distributed in the hope that it will be useful, |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | * GNU General Public License for more details. | 13 | * GNU General Public License for more details. |
14 | * | 14 | * |
15 | * You should have received a copy of the GNU General Public License | 15 | * You should have received a copy of the GNU General Public License |
16 | * along with this program; if not, write to the Free Software | 16 | * along with this program; if not, write to the Free Software |
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
18 | * | 18 | * |
19 | * $Id$ | 19 | * $Id$ |
20 | */ | 20 | */ |
21 | 21 | ||
22 | /* | 22 | /* |
23 | * This is the lookup table used to compute x^(4/3) for Layer III | 23 | * This is the lookup table used to compute x^(4/3) for Layer III |
24 | * requantization. To maintain the best possible accuracy, the value is | 24 | * requantization. To maintain the best possible accuracy, the value is |
25 | * stored as a normalized mantissa with exponent. The requantization | 25 | * stored as a normalized mantissa with exponent. The requantization |
26 | * algorithm recombines these parts with appropriate scaling. | 26 | * algorithm recombines these parts with appropriate scaling. |
27 | */ | 27 | */ |
28 | 28 | ||
29 | /* 0 */ { MAD_F(0x00000000) /* 0.000000000 */, 0 }, | 29 | /* 0 */ { MAD_F(0x00000000) /* 0.000000000 */, 0 }, |
30 | /* 1 */ { MAD_F(0x04000000) /* 0.250000000 */, 2 }, | 30 | /* 1 */ { MAD_F(0x04000000) /* 0.250000000 */, 2 }, |
31 | /* 2 */ { MAD_F(0x050a28be) /* 0.314980262 */, 3 }, | 31 | /* 2 */ { MAD_F(0x050a28be) /* 0.314980262 */, 3 }, |
32 | /* 3 */ { MAD_F(0x0453a5cd) /* 0.270421794 */, 4 }, | 32 | /* 3 */ { MAD_F(0x0453a5cd) /* 0.270421794 */, 4 }, |
33 | /* 4 */ { MAD_F(0x06597fa9) /* 0.396850263 */, 4 }, | 33 | /* 4 */ { MAD_F(0x06597fa9) /* 0.396850263 */, 4 }, |
34 | /* 5 */ { MAD_F(0x04466275) /* 0.267183742 */, 5 }, | 34 | /* 5 */ { MAD_F(0x04466275) /* 0.267183742 */, 5 }, |
35 | /* 6 */ { MAD_F(0x05738c72) /* 0.340710111 */, 5 }, | 35 | /* 6 */ { MAD_F(0x05738c72) /* 0.340710111 */, 5 }, |
36 | /* 7 */ { MAD_F(0x06b1fc81) /* 0.418453696 */, 5 }, | 36 | /* 7 */ { MAD_F(0x06b1fc81) /* 0.418453696 */, 5 }, |
37 | /* 8 */ { MAD_F(0x04000000) /* 0.250000000 */, 6 }, | 37 | /* 8 */ { MAD_F(0x04000000) /* 0.250000000 */, 6 }, |
38 | /* 9 */ { MAD_F(0x04ae20d7) /* 0.292511788 */, 6 }, | 38 | /* 9 */ { MAD_F(0x04ae20d7) /* 0.292511788 */, 6 }, |
39 | /* 10 */ { MAD_F(0x0562d694) /* 0.336630420 */, 6 }, | 39 | /* 10 */ { MAD_F(0x0562d694) /* 0.336630420 */, 6 }, |
40 | /* 11 */ { MAD_F(0x061dae96) /* 0.382246578 */, 6 }, | 40 | /* 11 */ { MAD_F(0x061dae96) /* 0.382246578 */, 6 }, |
41 | /* 12 */ { MAD_F(0x06de47f4) /* 0.429267841 */, 6 }, | 41 | /* 12 */ { MAD_F(0x06de47f4) /* 0.429267841 */, 6 }, |
42 | /* 13 */ { MAD_F(0x07a44f7a) /* 0.477614858 */, 6 }, | 42 | /* 13 */ { MAD_F(0x07a44f7a) /* 0.477614858 */, 6 }, |
43 | /* 14 */ { MAD_F(0x0437be65) /* 0.263609310 */, 7 }, | 43 | /* 14 */ { MAD_F(0x0437be65) /* 0.263609310 */, 7 }, |
44 | /* 15 */ { MAD_F(0x049fc824) /* 0.289009227 */, 7 }, | 44 | /* 15 */ { MAD_F(0x049fc824) /* 0.289009227 */, 7 }, |
45 | 45 | ||
46 | /* 16 */ { MAD_F(0x050a28be) /* 0.314980262 */, 7 }, | 46 | /* 16 */ { MAD_F(0x050a28be) /* 0.314980262 */, 7 }, |
47 | /* 17 */ { MAD_F(0x0576c6f5) /* 0.341498336 */, 7 }, | 47 | /* 17 */ { MAD_F(0x0576c6f5) /* 0.341498336 */, 7 }, |
48 | /* 18 */ { MAD_F(0x05e58c0b) /* 0.368541759 */, 7 }, | 48 | /* 18 */ { MAD_F(0x05e58c0b) /* 0.368541759 */, 7 }, |
49 | /* 19 */ { MAD_F(0x06566361) /* 0.396090870 */, 7 }, | 49 | /* 19 */ { MAD_F(0x06566361) /* 0.396090870 */, 7 }, |
50 | /* 20 */ { MAD_F(0x06c93a2e) /* 0.424127753 */, 7 }, | 50 | /* 20 */ { MAD_F(0x06c93a2e) /* 0.424127753 */, 7 }, |
51 | /* 21 */ { MAD_F(0x073dff3e) /* 0.452635998 */, 7 }, | 51 | /* 21 */ { MAD_F(0x073dff3e) /* 0.452635998 */, 7 }, |
52 | /* 22 */ { MAD_F(0x07b4a2bc) /* 0.481600510 */, 7 }, | 52 | /* 22 */ { MAD_F(0x07b4a2bc) /* 0.481600510 */, 7 }, |
53 | /* 23 */ { MAD_F(0x04168b05) /* 0.255503674 */, 8 }, | 53 | /* 23 */ { MAD_F(0x04168b05) /* 0.255503674 */, 8 }, |
54 | /* 24 */ { MAD_F(0x0453a5cd) /* 0.270421794 */, 8 }, | 54 | /* 24 */ { MAD_F(0x0453a5cd) /* 0.270421794 */, 8 }, |
55 | /* 25 */ { MAD_F(0x04919b6a) /* 0.285548607 */, 8 }, | 55 | /* 25 */ { MAD_F(0x04919b6a) /* 0.285548607 */, 8 }, |
56 | /* 26 */ { MAD_F(0x04d065fb) /* 0.300878507 */, 8 }, | 56 | /* 26 */ { MAD_F(0x04d065fb) /* 0.300878507 */, 8 }, |
57 | /* 27 */ { MAD_F(0x05100000) /* 0.316406250 */, 8 }, | 57 | /* 27 */ { MAD_F(0x05100000) /* 0.316406250 */, 8 }, |
58 | /* 28 */ { MAD_F(0x05506451) /* 0.332126919 */, 8 }, | 58 | /* 28 */ { MAD_F(0x05506451) /* 0.332126919 */, 8 }, |
59 | /* 29 */ { MAD_F(0x05918e15) /* 0.348035890 */, 8 }, | 59 | /* 29 */ { MAD_F(0x05918e15) /* 0.348035890 */, 8 }, |
60 | /* 30 */ { MAD_F(0x05d378bb) /* 0.364128809 */, 8 }, | 60 | /* 30 */ { MAD_F(0x05d378bb) /* 0.364128809 */, 8 }, |
61 | /* 31 */ { MAD_F(0x06161ff3) /* 0.380401563 */, 8 }, | 61 | /* 31 */ { MAD_F(0x06161ff3) /* 0.380401563 */, 8 }, |
62 | 62 | ||
63 | /* 32 */ { MAD_F(0x06597fa9) /* 0.396850263 */, 8 }, | 63 | /* 32 */ { MAD_F(0x06597fa9) /* 0.396850263 */, 8 }, |
64 | /* 33 */ { MAD_F(0x069d9400) /* 0.413471222 */, 8 }, | 64 | /* 33 */ { MAD_F(0x069d9400) /* 0.413471222 */, 8 }, |
65 | /* 34 */ { MAD_F(0x06e2594c) /* 0.430260942 */, 8 }, | 65 | /* 34 */ { MAD_F(0x06e2594c) /* 0.430260942 */, 8 }, |
66 | /* 35 */ { MAD_F(0x0727cc11) /* 0.447216097 */, 8 }, | 66 | /* 35 */ { MAD_F(0x0727cc11) /* 0.447216097 */, 8 }, |
67 | /* 36 */ { MAD_F(0x076de8fc) /* 0.464333519 */, 8 }, | 67 | /* 36 */ { MAD_F(0x076de8fc) /* 0.464333519 */, 8 }, |
68 | /* 37 */ { MAD_F(0x07b4ace3) /* 0.481610189 */, 8 }, | 68 | /* 37 */ { MAD_F(0x07b4ace3) /* 0.481610189 */, 8 }, |
69 | /* 38 */ { MAD_F(0x07fc14bf) /* 0.499043224 */, 8 }, | 69 | /* 38 */ { MAD_F(0x07fc14bf) /* 0.499043224 */, 8 }, |
70 | /* 39 */ { MAD_F(0x04220ed7) /* 0.258314934 */, 9 }, | 70 | /* 39 */ { MAD_F(0x04220ed7) /* 0.258314934 */, 9 }, |
71 | /* 40 */ { MAD_F(0x04466275) /* 0.267183742 */, 9 }, | 71 | /* 40 */ { MAD_F(0x04466275) /* 0.267183742 */, 9 }, |
72 | /* 41 */ { MAD_F(0x046b03e7) /* 0.276126771 */, 9 }, | 72 | /* 41 */ { MAD_F(0x046b03e7) /* 0.276126771 */, 9 }, |
73 | /* 42 */ { MAD_F(0x048ff1e8) /* 0.285142811 */, 9 }, | 73 | /* 42 */ { MAD_F(0x048ff1e8) /* 0.285142811 */, 9 }, |
74 | /* 43 */ { MAD_F(0x04b52b3f) /* 0.294230696 */, 9 }, | 74 | /* 43 */ { MAD_F(0x04b52b3f) /* 0.294230696 */, 9 }, |
75 | /* 44 */ { MAD_F(0x04daaec0) /* 0.303389310 */, 9 }, | 75 | /* 44 */ { MAD_F(0x04daaec0) /* 0.303389310 */, 9 }, |
76 | /* 45 */ { MAD_F(0x05007b49) /* 0.312617576 */, 9 }, | 76 | /* 45 */ { MAD_F(0x05007b49) /* 0.312617576 */, 9 }, |
77 | /* 46 */ { MAD_F(0x05268fc6) /* 0.321914457 */, 9 }, | 77 | /* 46 */ { MAD_F(0x05268fc6) /* 0.321914457 */, 9 }, |
78 | /* 47 */ { MAD_F(0x054ceb2a) /* 0.331278957 */, 9 }, | 78 | /* 47 */ { MAD_F(0x054ceb2a) /* 0.331278957 */, 9 }, |
79 | 79 | ||
80 | /* 48 */ { MAD_F(0x05738c72) /* 0.340710111 */, 9 }, | 80 | /* 48 */ { MAD_F(0x05738c72) /* 0.340710111 */, 9 }, |
81 | /* 49 */ { MAD_F(0x059a72a5) /* 0.350206992 */, 9 }, | 81 | /* 49 */ { MAD_F(0x059a72a5) /* 0.350206992 */, 9 }, |
82 | /* 50 */ { MAD_F(0x05c19cd3) /* 0.359768701 */, 9 }, | 82 | /* 50 */ { MAD_F(0x05c19cd3) /* 0.359768701 */, 9 }, |
83 | /* 51 */ { MAD_F(0x05e90a12) /* 0.369394372 */, 9 }, | 83 | /* 51 */ { MAD_F(0x05e90a12) /* 0.369394372 */, 9 }, |
84 | /* 52 */ { MAD_F(0x0610b982) /* 0.379083164 */, 9 }, | 84 | /* 52 */ { MAD_F(0x0610b982) /* 0.379083164 */, 9 }, |
85 | /* 53 */ { MAD_F(0x0638aa48) /* 0.388834268 */, 9 }, | 85 | /* 53 */ { MAD_F(0x0638aa48) /* 0.388834268 */, 9 }, |
86 | /* 54 */ { MAD_F(0x0660db91) /* 0.398646895 */, 9 }, | 86 | /* 54 */ { MAD_F(0x0660db91) /* 0.398646895 */, 9 }, |
87 | /* 55 */ { MAD_F(0x06894c90) /* 0.408520284 */, 9 }, | 87 | /* 55 */ { MAD_F(0x06894c90) /* 0.408520284 */, 9 }, |
88 | /* 56 */ { MAD_F(0x06b1fc81) /* 0.418453696 */, 9 }, | 88 | /* 56 */ { MAD_F(0x06b1fc81) /* 0.418453696 */, 9 }, |
89 | /* 57 */ { MAD_F(0x06daeaa1) /* 0.428446415 */, 9 }, | 89 | /* 57 */ { MAD_F(0x06daeaa1) /* 0.428446415 */, 9 }, |
90 | /* 58 */ { MAD_F(0x07041636) /* 0.438497744 */, 9 }, | 90 | /* 58 */ { MAD_F(0x07041636) /* 0.438497744 */, 9 }, |
91 | /* 59 */ { MAD_F(0x072d7e8b) /* 0.448607009 */, 9 }, | 91 | /* 59 */ { MAD_F(0x072d7e8b) /* 0.448607009 */, 9 }, |
92 | /* 60 */ { MAD_F(0x075722ef) /* 0.458773552 */, 9 }, | 92 | /* 60 */ { MAD_F(0x075722ef) /* 0.458773552 */, 9 }, |
93 | /* 61 */ { MAD_F(0x078102b8) /* 0.468996735 */, 9 }, | 93 | /* 61 */ { MAD_F(0x078102b8) /* 0.468996735 */, 9 }, |
94 | /* 62 */ { MAD_F(0x07ab1d3e) /* 0.479275937 */, 9 }, | 94 | /* 62 */ { MAD_F(0x07ab1d3e) /* 0.479275937 */, 9 }, |
95 | /* 63 */ { MAD_F(0x07d571e0) /* 0.489610555 */, 9 }, | 95 | /* 63 */ { MAD_F(0x07d571e0) /* 0.489610555 */, 9 }, |
96 | 96 | ||
97 | /* 64 */ { MAD_F(0x04000000) /* 0.250000000 */, 10 }, | 97 | /* 64 */ { MAD_F(0x04000000) /* 0.250000000 */, 10 }, |
98 | /* 65 */ { MAD_F(0x04156381) /* 0.255221850 */, 10 }, | 98 | /* 65 */ { MAD_F(0x04156381) /* 0.255221850 */, 10 }, |
99 | /* 66 */ { MAD_F(0x042ae32a) /* 0.260470548 */, 10 }, | 99 | /* 66 */ { MAD_F(0x042ae32a) /* 0.260470548 */, 10 }, |
100 | /* 67 */ { MAD_F(0x04407eb1) /* 0.265745823 */, 10 }, | 100 | /* 67 */ { MAD_F(0x04407eb1) /* 0.265745823 */, 10 }, |
101 | /* 68 */ { MAD_F(0x045635cf) /* 0.271047409 */, 10 }, | 101 | /* 68 */ { MAD_F(0x045635cf) /* 0.271047409 */, 10 }, |
102 | /* 69 */ { MAD_F(0x046c083e) /* 0.276375048 */, 10 }, | 102 | /* 69 */ { MAD_F(0x046c083e) /* 0.276375048 */, 10 }, |
103 | /* 70 */ { MAD_F(0x0481f5bb) /* 0.281728487 */, 10 }, | 103 | /* 70 */ { MAD_F(0x0481f5bb) /* 0.281728487 */, 10 }, |
104 | /* 71 */ { MAD_F(0x0497fe03) /* 0.287107481 */, 10 }, | 104 | /* 71 */ { MAD_F(0x0497fe03) /* 0.287107481 */, 10 }, |
105 | /* 72 */ { MAD_F(0x04ae20d7) /* 0.292511788 */, 10 }, | 105 | /* 72 */ { MAD_F(0x04ae20d7) /* 0.292511788 */, 10 }, |
106 | /* 73 */ { MAD_F(0x04c45df6) /* 0.297941173 */, 10 }, | 106 | /* 73 */ { MAD_F(0x04c45df6) /* 0.297941173 */, 10 }, |
107 | /* 74 */ { MAD_F(0x04dab524) /* 0.303395408 */, 10 }, | 107 | /* 74 */ { MAD_F(0x04dab524) /* 0.303395408 */, 10 }, |
108 | /* 75 */ { MAD_F(0x04f12624) /* 0.308874267 */, 10 }, | 108 | /* 75 */ { MAD_F(0x04f12624) /* 0.308874267 */, 10 }, |
109 | /* 76 */ { MAD_F(0x0507b0bc) /* 0.314377532 */, 10 }, | 109 | /* 76 */ { MAD_F(0x0507b0bc) /* 0.314377532 */, 10 }, |
110 | /* 77 */ { MAD_F(0x051e54b1) /* 0.319904987 */, 10 }, | 110 | /* 77 */ { MAD_F(0x051e54b1) /* 0.319904987 */, 10 }, |
111 | /* 78 */ { MAD_F(0x053511cb) /* 0.325456423 */, 10 }, | 111 | /* 78 */ { MAD_F(0x053511cb) /* 0.325456423 */, 10 }, |
112 | /* 79 */ { MAD_F(0x054be7d4) /* 0.331031635 */, 10 }, | 112 | /* 79 */ { MAD_F(0x054be7d4) /* 0.331031635 */, 10 }, |
113 | 113 | ||
114 | /* 80 */ { MAD_F(0x0562d694) /* 0.336630420 */, 10 }, | 114 | /* 80 */ { MAD_F(0x0562d694) /* 0.336630420 */, 10 }, |
115 | /* 81 */ { MAD_F(0x0579ddd8) /* 0.342252584 */, 10 }, | 115 | /* 81 */ { MAD_F(0x0579ddd8) /* 0.342252584 */, 10 }, |
116 | /* 82 */ { MAD_F(0x0590fd6c) /* 0.347897931 */, 10 }, | 116 | /* 82 */ { MAD_F(0x0590fd6c) /* 0.347897931 */, 10 }, |
117 | /* 83 */ { MAD_F(0x05a8351c) /* 0.353566275 */, 10 }, | 117 | /* 83 */ { MAD_F(0x05a8351c) /* 0.353566275 */, 10 }, |
118 | /* 84 */ { MAD_F(0x05bf84b8) /* 0.359257429 */, 10 }, | 118 | /* 84 */ { MAD_F(0x05bf84b8) /* 0.359257429 */, 10 }, |
119 | /* 85 */ { MAD_F(0x05d6ec0e) /* 0.364971213 */, 10 }, | 119 | /* 85 */ { MAD_F(0x05d6ec0e) /* 0.364971213 */, 10 }, |
120 | /* 86 */ { MAD_F(0x05ee6aef) /* 0.370707448 */, 10 }, | 120 | /* 86 */ { MAD_F(0x05ee6aef) /* 0.370707448 */, 10 }, |
121 | /* 87 */ { MAD_F(0x0606012b) /* 0.376465960 */, 10 }, | 121 | /* 87 */ { MAD_F(0x0606012b) /* 0.376465960 */, 10 }, |
122 | /* 88 */ { MAD_F(0x061dae96) /* 0.382246578 */, 10 }, | 122 | /* 88 */ { MAD_F(0x061dae96) /* 0.382246578 */, 10 }, |
123 | /* 89 */ { MAD_F(0x06357302) /* 0.388049134 */, 10 }, | 123 | /* 89 */ { MAD_F(0x06357302) /* 0.388049134 */, 10 }, |
124 | /* 90 */ { MAD_F(0x064d4e43) /* 0.393873464 */, 10 }, | 124 | /* 90 */ { MAD_F(0x064d4e43) /* 0.393873464 */, 10 }, |
125 | /* 91 */ { MAD_F(0x0665402d) /* 0.399719406 */, 10 }, | 125 | /* 91 */ { MAD_F(0x0665402d) /* 0.399719406 */, 10 }, |
126 | /* 92 */ { MAD_F(0x067d4896) /* 0.405586801 */, 10 }, | 126 | /* 92 */ { MAD_F(0x067d4896) /* 0.405586801 */, 10 }, |
127 | /* 93 */ { MAD_F(0x06956753) /* 0.411475493 */, 10 }, | 127 | /* 93 */ { MAD_F(0x06956753) /* 0.411475493 */, 10 }, |
128 | /* 94 */ { MAD_F(0x06ad9c3d) /* 0.417385331 */, 10 }, | 128 | /* 94 */ { MAD_F(0x06ad9c3d) /* 0.417385331 */, 10 }, |
129 | /* 95 */ { MAD_F(0x06c5e72b) /* 0.423316162 */, 10 }, | 129 | /* 95 */ { MAD_F(0x06c5e72b) /* 0.423316162 */, 10 }, |
130 | 130 | ||
131 | /* 96 */ { MAD_F(0x06de47f4) /* 0.429267841 */, 10 }, | 131 | /* 96 */ { MAD_F(0x06de47f4) /* 0.429267841 */, 10 }, |
diff --git a/core/multimedia/opieplayer/libmad/sf_table.dat b/core/multimedia/opieplayer/libmad/sf_table.dat index bc368af..de084d9 100644 --- a/core/multimedia/opieplayer/libmad/sf_table.dat +++ b/core/multimedia/opieplayer/libmad/sf_table.dat | |||
@@ -1,100 +1,106 @@ | |||
1 | /* | 1 | /* |
2 | * libmad - MPEG audio decoder library | 2 | * libmad - MPEG audio decoder library |
3 | * Copyright (C) 2000-2001 Robert Leslie | 3 | * Copyright (C) 2000-2004 Underbit Technologies, Inc. |
4 | * | 4 | * |
5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
7 | * the Free Software Foundation; either version 2 of the License, or | 7 | * the Free Software Foundation; either version 2 of the License, or |
8 | * (at your option) any later version. | 8 | * (at your option) any later version. |
9 | * | 9 | * |
10 | * This program is distributed in the hope that it will be useful, | 10 | * This program is distributed in the hope that it will be useful, |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | * GNU General Public License for more details. | 13 | * GNU General Public License for more details. |
14 | * | 14 | * |
15 | * You should have received a copy of the GNU General Public License | 15 | * You should have received a copy of the GNU General Public License |
16 | * along with this program; if not, write to the Free Software | 16 | * along with this program; if not, write to the Free Software |
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
18 | * | 18 | * |
19 | * $Id$ | 19 | * $Id$ |
20 | */ | 20 | */ |
21 | 21 | ||
22 | /* | 22 | /* |
23 | * These are the scalefactor values for Layer I and Layer II. | 23 | * These are the scalefactor values for Layer I and Layer II. |
24 | * The values are from Table B.1 of ISO/IEC 11172-3. | 24 | * The values are from Table B.1 of ISO/IEC 11172-3. |
25 | * | 25 | * |
26 | * There is some error introduced by the 32-bit fixed-point representation; | 26 | * There is some error introduced by the 32-bit fixed-point representation; |
27 | * the amount of error is shown. For 16-bit PCM output, this shouldn't be | 27 | * the amount of error is shown. For 16-bit PCM output, this shouldn't be |
28 | * too much of a problem. | 28 | * too much of a problem. |
29 | * | ||
30 | * Strictly speaking, Table B.1 has only 63 entries (0-62), thus a strict | ||
31 | * interpretation of ISO/IEC 11172-3 would suggest that a scalefactor index of | ||
32 | * 63 is invalid. However, for better compatibility with current practices, we | ||
33 | * add a 64th entry. | ||
29 | */ | 34 | */ |
30 | 35 | ||
31 | MAD_F(0x20000000), /* 2.000000000000 => 2.000000000000, e 0.000000000000 */ | 36 | MAD_F(0x20000000), /* 2.000000000000 => 2.000000000000, e 0.000000000000 */ |
32 | MAD_F(0x1965fea5), /* 1.587401051968 => 1.587401051074, e 0.000000000894 */ | 37 | MAD_F(0x1965fea5), /* 1.587401051968 => 1.587401051074, e 0.000000000894 */ |
33 | MAD_F(0x1428a2fa), /* 1.259921049895 => 1.259921051562, e -0.000000001667 */ | 38 | MAD_F(0x1428a2fa), /* 1.259921049895 => 1.259921051562, e -0.000000001667 */ |
34 | MAD_F(0x10000000), /* 1.000000000000 => 1.000000000000, e 0.000000000000 */ | 39 | MAD_F(0x10000000), /* 1.000000000000 => 1.000000000000, e 0.000000000000 */ |
35 | MAD_F(0x0cb2ff53), /* 0.793700525984 => 0.793700527400, e -0.000000001416 */ | 40 | MAD_F(0x0cb2ff53), /* 0.793700525984 => 0.793700527400, e -0.000000001416 */ |
36 | MAD_F(0x0a14517d), /* 0.629960524947 => 0.629960525781, e -0.000000000833 */ | 41 | MAD_F(0x0a14517d), /* 0.629960524947 => 0.629960525781, e -0.000000000833 */ |
37 | MAD_F(0x08000000), /* 0.500000000000 => 0.500000000000, e 0.000000000000 */ | 42 | MAD_F(0x08000000), /* 0.500000000000 => 0.500000000000, e 0.000000000000 */ |
38 | MAD_F(0x06597fa9), /* 0.396850262992 => 0.396850261837, e 0.000000001155 */ | 43 | MAD_F(0x06597fa9), /* 0.396850262992 => 0.396850261837, e 0.000000001155 */ |
39 | 44 | ||
40 | MAD_F(0x050a28be), /* 0.314980262474 => 0.314980261028, e 0.000000001446 */ | 45 | MAD_F(0x050a28be), /* 0.314980262474 => 0.314980261028, e 0.000000001446 */ |
41 | MAD_F(0x04000000), /* 0.250000000000 => 0.250000000000, e 0.000000000000 */ | 46 | MAD_F(0x04000000), /* 0.250000000000 => 0.250000000000, e 0.000000000000 */ |
42 | MAD_F(0x032cbfd5), /* 0.198425131496 => 0.198425132781, e -0.000000001285 */ | 47 | MAD_F(0x032cbfd5), /* 0.198425131496 => 0.198425132781, e -0.000000001285 */ |
43 | MAD_F(0x0285145f), /* 0.157490131237 => 0.157490130514, e 0.000000000723 */ | 48 | MAD_F(0x0285145f), /* 0.157490131237 => 0.157490130514, e 0.000000000723 */ |
44 | MAD_F(0x02000000), /* 0.125000000000 => 0.125000000000, e 0.000000000000 */ | 49 | MAD_F(0x02000000), /* 0.125000000000 => 0.125000000000, e 0.000000000000 */ |
45 | MAD_F(0x01965fea), /* 0.099212565748 => 0.099212564528, e 0.000000001220 */ | 50 | MAD_F(0x01965fea), /* 0.099212565748 => 0.099212564528, e 0.000000001220 */ |
46 | MAD_F(0x01428a30), /* 0.078745065618 => 0.078745067120, e -0.000000001501 */ | 51 | MAD_F(0x01428a30), /* 0.078745065618 => 0.078745067120, e -0.000000001501 */ |
47 | MAD_F(0x01000000), /* 0.062500000000 => 0.062500000000, e 0.000000000000 */ | 52 | MAD_F(0x01000000), /* 0.062500000000 => 0.062500000000, e 0.000000000000 */ |
48 | 53 | ||
49 | MAD_F(0x00cb2ff5), /* 0.049606282874 => 0.049606282264, e 0.000000000610 */ | 54 | MAD_F(0x00cb2ff5), /* 0.049606282874 => 0.049606282264, e 0.000000000610 */ |
50 | MAD_F(0x00a14518), /* 0.039372532809 => 0.039372533560, e -0.000000000751 */ | 55 | MAD_F(0x00a14518), /* 0.039372532809 => 0.039372533560, e -0.000000000751 */ |
51 | MAD_F(0x00800000), /* 0.031250000000 => 0.031250000000, e 0.000000000000 */ | 56 | MAD_F(0x00800000), /* 0.031250000000 => 0.031250000000, e 0.000000000000 */ |
52 | MAD_F(0x006597fb), /* 0.024803141437 => 0.024803142995, e -0.000000001558 */ | 57 | MAD_F(0x006597fb), /* 0.024803141437 => 0.024803142995, e -0.000000001558 */ |
53 | MAD_F(0x0050a28c), /* 0.019686266405 => 0.019686266780, e -0.000000000375 */ | 58 | MAD_F(0x0050a28c), /* 0.019686266405 => 0.019686266780, e -0.000000000375 */ |
54 | MAD_F(0x00400000), /* 0.015625000000 => 0.015625000000, e 0.000000000000 */ | 59 | MAD_F(0x00400000), /* 0.015625000000 => 0.015625000000, e 0.000000000000 */ |
55 | MAD_F(0x0032cbfd), /* 0.012401570719 => 0.012401569635, e 0.000000001084 */ | 60 | MAD_F(0x0032cbfd), /* 0.012401570719 => 0.012401569635, e 0.000000001084 */ |
56 | MAD_F(0x00285146), /* 0.009843133202 => 0.009843133390, e -0.000000000188 */ | 61 | MAD_F(0x00285146), /* 0.009843133202 => 0.009843133390, e -0.000000000188 */ |
57 | 62 | ||
58 | MAD_F(0x00200000), /* 0.007812500000 => 0.007812500000, e 0.000000000000 */ | 63 | MAD_F(0x00200000), /* 0.007812500000 => 0.007812500000, e 0.000000000000 */ |
59 | MAD_F(0x001965ff), /* 0.006200785359 => 0.006200786680, e -0.000000001321 */ | 64 | MAD_F(0x001965ff), /* 0.006200785359 => 0.006200786680, e -0.000000001321 */ |
60 | MAD_F(0x001428a3), /* 0.004921566601 => 0.004921566695, e -0.000000000094 */ | 65 | MAD_F(0x001428a3), /* 0.004921566601 => 0.004921566695, e -0.000000000094 */ |
61 | MAD_F(0x00100000), /* 0.003906250000 => 0.003906250000, e 0.000000000000 */ | 66 | MAD_F(0x00100000), /* 0.003906250000 => 0.003906250000, e 0.000000000000 */ |
62 | MAD_F(0x000cb2ff), /* 0.003100392680 => 0.003100391477, e 0.000000001202 */ | 67 | MAD_F(0x000cb2ff), /* 0.003100392680 => 0.003100391477, e 0.000000001202 */ |
63 | MAD_F(0x000a1451), /* 0.002460783301 => 0.002460781485, e 0.000000001816 */ | 68 | MAD_F(0x000a1451), /* 0.002460783301 => 0.002460781485, e 0.000000001816 */ |
64 | MAD_F(0x00080000), /* 0.001953125000 => 0.001953125000, e 0.000000000000 */ | 69 | MAD_F(0x00080000), /* 0.001953125000 => 0.001953125000, e 0.000000000000 */ |
65 | MAD_F(0x00065980), /* 0.001550196340 => 0.001550197601, e -0.000000001262 */ | 70 | MAD_F(0x00065980), /* 0.001550196340 => 0.001550197601, e -0.000000001262 */ |
66 | 71 | ||
67 | MAD_F(0x00050a29), /* 0.001230391650 => 0.001230392605, e -0.000000000955 */ | 72 | MAD_F(0x00050a29), /* 0.001230391650 => 0.001230392605, e -0.000000000955 */ |
68 | MAD_F(0x00040000), /* 0.000976562500 => 0.000976562500, e 0.000000000000 */ | 73 | MAD_F(0x00040000), /* 0.000976562500 => 0.000976562500, e 0.000000000000 */ |
69 | MAD_F(0x00032cc0), /* 0.000775098170 => 0.000775098801, e -0.000000000631 */ | 74 | MAD_F(0x00032cc0), /* 0.000775098170 => 0.000775098801, e -0.000000000631 */ |
70 | MAD_F(0x00028514), /* 0.000615195825 => 0.000615194440, e 0.000000001385 */ | 75 | MAD_F(0x00028514), /* 0.000615195825 => 0.000615194440, e 0.000000001385 */ |
71 | MAD_F(0x00020000), /* 0.000488281250 => 0.000488281250, e 0.000000000000 */ | 76 | MAD_F(0x00020000), /* 0.000488281250 => 0.000488281250, e 0.000000000000 */ |
72 | MAD_F(0x00019660), /* 0.000387549085 => 0.000387549400, e -0.000000000315 */ | 77 | MAD_F(0x00019660), /* 0.000387549085 => 0.000387549400, e -0.000000000315 */ |
73 | MAD_F(0x0001428a), /* 0.000307597913 => 0.000307597220, e 0.000000000693 */ | 78 | MAD_F(0x0001428a), /* 0.000307597913 => 0.000307597220, e 0.000000000693 */ |
74 | MAD_F(0x00010000), /* 0.000244140625 => 0.000244140625, e 0.000000000000 */ | 79 | MAD_F(0x00010000), /* 0.000244140625 => 0.000244140625, e 0.000000000000 */ |
75 | 80 | ||
76 | MAD_F(0x0000cb30), /* 0.000193774542 => 0.000193774700, e -0.000000000158 */ | 81 | MAD_F(0x0000cb30), /* 0.000193774542 => 0.000193774700, e -0.000000000158 */ |
77 | MAD_F(0x0000a145), /* 0.000153798956 => 0.000153798610, e 0.000000000346 */ | 82 | MAD_F(0x0000a145), /* 0.000153798956 => 0.000153798610, e 0.000000000346 */ |
78 | MAD_F(0x00008000), /* 0.000122070313 => 0.000122070313, e 0.000000000000 */ | 83 | MAD_F(0x00008000), /* 0.000122070313 => 0.000122070313, e 0.000000000000 */ |
79 | MAD_F(0x00006598), /* 0.000096887271 => 0.000096887350, e -0.000000000079 */ | 84 | MAD_F(0x00006598), /* 0.000096887271 => 0.000096887350, e -0.000000000079 */ |
80 | MAD_F(0x000050a3), /* 0.000076899478 => 0.000076901168, e -0.000000001689 */ | 85 | MAD_F(0x000050a3), /* 0.000076899478 => 0.000076901168, e -0.000000001689 */ |
81 | MAD_F(0x00004000), /* 0.000061035156 => 0.000061035156, e 0.000000000000 */ | 86 | MAD_F(0x00004000), /* 0.000061035156 => 0.000061035156, e 0.000000000000 */ |
82 | MAD_F(0x000032cc), /* 0.000048443636 => 0.000048443675, e -0.000000000039 */ | 87 | MAD_F(0x000032cc), /* 0.000048443636 => 0.000048443675, e -0.000000000039 */ |
83 | MAD_F(0x00002851), /* 0.000038449739 => 0.000038448721, e 0.000000001018 */ | 88 | MAD_F(0x00002851), /* 0.000038449739 => 0.000038448721, e 0.000000001018 */ |
84 | 89 | ||
85 | MAD_F(0x00002000), /* 0.000030517578 => 0.000030517578, e 0.000000000000 */ | 90 | MAD_F(0x00002000), /* 0.000030517578 => 0.000030517578, e 0.000000000000 */ |
86 | MAD_F(0x00001966), /* 0.000024221818 => 0.000024221838, e -0.000000000020 */ | 91 | MAD_F(0x00001966), /* 0.000024221818 => 0.000024221838, e -0.000000000020 */ |
87 | MAD_F(0x00001429), /* 0.000019224870 => 0.000019226223, e -0.000000001354 */ | 92 | MAD_F(0x00001429), /* 0.000019224870 => 0.000019226223, e -0.000000001354 */ |
88 | MAD_F(0x00001000), /* 0.000015258789 => 0.000015258789, e -0.000000000000 */ | 93 | MAD_F(0x00001000), /* 0.000015258789 => 0.000015258789, e -0.000000000000 */ |
89 | MAD_F(0x00000cb3), /* 0.000012110909 => 0.000012110919, e -0.000000000010 */ | 94 | MAD_F(0x00000cb3), /* 0.000012110909 => 0.000012110919, e -0.000000000010 */ |
90 | MAD_F(0x00000a14), /* 0.000009612435 => 0.000009611249, e 0.000000001186 */ | 95 | MAD_F(0x00000a14), /* 0.000009612435 => 0.000009611249, e 0.000000001186 */ |
91 | MAD_F(0x00000800), /* 0.000007629395 => 0.000007629395, e -0.000000000000 */ | 96 | MAD_F(0x00000800), /* 0.000007629395 => 0.000007629395, e -0.000000000000 */ |
92 | MAD_F(0x00000659), /* 0.000006055454 => 0.000006053597, e 0.000000001858 */ | 97 | MAD_F(0x00000659), /* 0.000006055454 => 0.000006053597, e 0.000000001858 */ |
93 | 98 | ||
94 | MAD_F(0x0000050a), /* 0.000004806217 => 0.000004805624, e 0.000000000593 */ | 99 | MAD_F(0x0000050a), /* 0.000004806217 => 0.000004805624, e 0.000000000593 */ |
95 | MAD_F(0x00000400), /* 0.000003814697 => 0.000003814697, e 0.000000000000 */ | 100 | MAD_F(0x00000400), /* 0.000003814697 => 0.000003814697, e 0.000000000000 */ |
96 | MAD_F(0x0000032d), /* 0.000003027727 => 0.000003028661, e -0.000000000934 */ | 101 | MAD_F(0x0000032d), /* 0.000003027727 => 0.000003028661, e -0.000000000934 */ |
97 | MAD_F(0x00000285), /* 0.000002403109 => 0.000002402812, e 0.000000000296 */ | 102 | MAD_F(0x00000285), /* 0.000002403109 => 0.000002402812, e 0.000000000296 */ |
98 | MAD_F(0x00000200), /* 0.000001907349 => 0.000001907349, e -0.000000000000 */ | 103 | MAD_F(0x00000200), /* 0.000001907349 => 0.000001907349, e -0.000000000000 */ |
99 | MAD_F(0x00000196), /* 0.000001513864 => 0.000001512468, e 0.000000001396 */ | 104 | MAD_F(0x00000196), /* 0.000001513864 => 0.000001512468, e 0.000000001396 */ |
100 | MAD_F(0x00000143) /* 0.000001201554 => 0.000001203269, e -0.000000001714 */ | 105 | MAD_F(0x00000143), /* 0.000001201554 => 0.000001203269, e -0.000000001714 */ |
106 | MAD_F(0x00000000) /* this compatibility entry is not part of Table B.1 */ | ||
diff --git a/core/multimedia/opieplayer/libmad/stream.c b/core/multimedia/opieplayer/libmad/stream.c index 4374de7..a63d67b 100644 --- a/core/multimedia/opieplayer/libmad/stream.c +++ b/core/multimedia/opieplayer/libmad/stream.c | |||
@@ -1,160 +1,161 @@ | |||
1 | /* | 1 | /* |
2 | * libmad - MPEG audio decoder library | 2 | * libmad - MPEG audio decoder library |
3 | * Copyright (C) 2000-2001 Robert Leslie | 3 | * Copyright (C) 2000-2004 Underbit Technologies, Inc. |
4 | * | 4 | * |
5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
7 | * the Free Software Foundation; either version 2 of the License, or | 7 | * the Free Software Foundation; either version 2 of the License, or |
8 | * (at your option) any later version. | 8 | * (at your option) any later version. |
9 | * | 9 | * |
10 | * This program is distributed in the hope that it will be useful, | 10 | * This program is distributed in the hope that it will be useful, |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | * GNU General Public License for more details. | 13 | * GNU General Public License for more details. |
14 | * | 14 | * |
15 | * You should have received a copy of the GNU General Public License | 15 | * You should have received a copy of the GNU General Public License |
16 | * along with this program; if not, write to the Free Software | 16 | * along with this program; if not, write to the Free Software |
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
18 | * | 18 | * |
19 | * $Id$ | 19 | * $Id$ |
20 | */ | 20 | */ |
21 | 21 | ||
22 | # ifdef HAVE_CONFIG_H | 22 | # ifdef HAVE_CONFIG_H |
23 | # include "libmad_config.h" | 23 | # include "libmad_config.h" |
24 | # endif | 24 | # endif |
25 | 25 | ||
26 | # include "libmad_global.h" | 26 | # include "libmad_global.h" |
27 | 27 | ||
28 | # include <stdlib.h> | 28 | # include <stdlib.h> |
29 | 29 | ||
30 | # include "bit.h" | 30 | # include "bit.h" |
31 | # include "stream.h" | 31 | # include "stream.h" |
32 | 32 | ||
33 | /* | 33 | /* |
34 | * NAME:stream->init() | 34 | * NAME:stream->init() |
35 | * DESCRIPTION:initialize stream struct | 35 | * DESCRIPTION:initialize stream struct |
36 | */ | 36 | */ |
37 | void mad_stream_init(struct mad_stream *stream) | 37 | void mad_stream_init(struct mad_stream *stream) |
38 | { | 38 | { |
39 | stream->buffer = 0; | 39 | stream->buffer = 0; |
40 | stream->bufend = 0; | 40 | stream->bufend = 0; |
41 | stream->skiplen = 0; | 41 | stream->skiplen = 0; |
42 | 42 | ||
43 | stream->sync = 0; | 43 | stream->sync = 0; |
44 | stream->freerate = 0; | 44 | stream->freerate = 0; |
45 | 45 | ||
46 | stream->this_frame = 0; | 46 | stream->this_frame = 0; |
47 | stream->next_frame = 0; | 47 | stream->next_frame = 0; |
48 | mad_bit_init(&stream->ptr, 0); | 48 | mad_bit_init(&stream->ptr, 0); |
49 | 49 | ||
50 | mad_bit_init(&stream->anc_ptr, 0); | 50 | mad_bit_init(&stream->anc_ptr, 0); |
51 | stream->anc_bitlen = 0; | 51 | stream->anc_bitlen = 0; |
52 | 52 | ||
53 | stream->main_data = 0; | 53 | stream->main_data = 0; |
54 | stream->md_len = 0; | 54 | stream->md_len = 0; |
55 | 55 | ||
56 | stream->options = 0; | 56 | stream->options = 0; |
57 | stream->error = MAD_ERROR_NONE; | 57 | stream->error = MAD_ERROR_NONE; |
58 | } | 58 | } |
59 | 59 | ||
60 | /* | 60 | /* |
61 | * NAME:stream->finish() | 61 | * NAME:stream->finish() |
62 | * DESCRIPTION:deallocate any dynamic memory associated with stream | 62 | * DESCRIPTION:deallocate any dynamic memory associated with stream |
63 | */ | 63 | */ |
64 | void mad_stream_finish(struct mad_stream *stream) | 64 | void mad_stream_finish(struct mad_stream *stream) |
65 | { | 65 | { |
66 | if (stream->main_data) { | 66 | if (stream->main_data) { |
67 | free(stream->main_data); | 67 | free(stream->main_data); |
68 | stream->main_data = 0; | 68 | stream->main_data = 0; |
69 | } | 69 | } |
70 | 70 | ||
71 | mad_bit_finish(&stream->anc_ptr); | 71 | mad_bit_finish(&stream->anc_ptr); |
72 | mad_bit_finish(&stream->ptr); | 72 | mad_bit_finish(&stream->ptr); |
73 | } | 73 | } |
74 | 74 | ||
75 | /* | 75 | /* |
76 | * NAME:stream->buffer() | 76 | * NAME:stream->buffer() |
77 | * DESCRIPTION:set stream buffer pointers | 77 | * DESCRIPTION:set stream buffer pointers |
78 | */ | 78 | */ |
79 | void mad_stream_buffer(struct mad_stream *stream, | 79 | void mad_stream_buffer(struct mad_stream *stream, |
80 | unsigned char const *buffer, unsigned long length) | 80 | unsigned char const *buffer, unsigned long length) |
81 | { | 81 | { |
82 | stream->buffer = buffer; | 82 | stream->buffer = buffer; |
83 | stream->bufend = buffer + length; | 83 | stream->bufend = buffer + length; |
84 | 84 | ||
85 | stream->this_frame = buffer; | 85 | stream->this_frame = buffer; |
86 | stream->next_frame = buffer; | 86 | stream->next_frame = buffer; |
87 | 87 | ||
88 | stream->sync = 1; | 88 | stream->sync = 1; |
89 | 89 | ||
90 | mad_bit_init(&stream->ptr, buffer); | 90 | mad_bit_init(&stream->ptr, buffer); |
91 | } | 91 | } |
92 | 92 | ||
93 | /* | 93 | /* |
94 | * NAME:stream->skip() | 94 | * NAME:stream->skip() |
95 | * DESCRIPTION:arrange to skip bytes before the next frame | 95 | * DESCRIPTION:arrange to skip bytes before the next frame |
96 | */ | 96 | */ |
97 | void mad_stream_skip(struct mad_stream *stream, unsigned long length) | 97 | void mad_stream_skip(struct mad_stream *stream, unsigned long length) |
98 | { | 98 | { |
99 | stream->skiplen += length; | 99 | stream->skiplen += length; |
100 | } | 100 | } |
101 | 101 | ||
102 | /* | 102 | /* |
103 | * NAME:stream->sync() | 103 | * NAME:stream->sync() |
104 | * DESCRIPTION:locate the next stream sync word | 104 | * DESCRIPTION:locate the next stream sync word |
105 | */ | 105 | */ |
106 | int mad_stream_sync(struct mad_stream *stream) | 106 | int mad_stream_sync(struct mad_stream *stream) |
107 | { | 107 | { |
108 | register unsigned char const *ptr, *end; | 108 | register unsigned char const *ptr, *end; |
109 | 109 | ||
110 | ptr = mad_bit_nextbyte(&stream->ptr); | 110 | ptr = mad_bit_nextbyte(&stream->ptr); |
111 | end = stream->bufend; | 111 | end = stream->bufend; |
112 | 112 | ||
113 | while (ptr < end - 1 && | 113 | while (ptr < end - 1 && |
114 | !(ptr[0] == 0xff && (ptr[1] & 0xe0) == 0xe0)) | 114 | !(ptr[0] == 0xff && (ptr[1] & 0xe0) == 0xe0)) |
115 | ++ptr; | 115 | ++ptr; |
116 | 116 | ||
117 | if (end - ptr < MAD_BUFFER_GUARD) | 117 | if (end - ptr < MAD_BUFFER_GUARD) |
118 | return -1; | 118 | return -1; |
119 | 119 | ||
120 | mad_bit_init(&stream->ptr, ptr); | 120 | mad_bit_init(&stream->ptr, ptr); |
121 | 121 | ||
122 | return 0; | 122 | return 0; |
123 | } | 123 | } |
124 | 124 | ||
125 | /* | 125 | /* |
126 | * NAME:stream->errorstr() | 126 | * NAME:stream->errorstr() |
127 | * DESCRIPTION:return a string description of the current error condition | 127 | * DESCRIPTION:return a string description of the current error condition |
128 | */ | 128 | */ |
129 | char const *mad_stream_errorstr(struct mad_stream const *stream) | 129 | char const *mad_stream_errorstr(struct mad_stream const *stream) |
130 | { | 130 | { |
131 | switch (stream->error) { | 131 | switch (stream->error) { |
132 | case MAD_ERROR_NONE: return "no error"; | 132 | case MAD_ERROR_NONE: return "no error"; |
133 | 133 | ||
134 | case MAD_ERROR_BUFLEN: return "input buffer too small (or EOF)"; | 134 | case MAD_ERROR_BUFLEN: return "input buffer too small (or EOF)"; |
135 | case MAD_ERROR_BUFPTR: return "invalid (null) buffer pointer"; | 135 | case MAD_ERROR_BUFPTR: return "invalid (null) buffer pointer"; |
136 | 136 | ||
137 | case MAD_ERROR_NOMEM: return "not enough memory"; | 137 | case MAD_ERROR_NOMEM: return "not enough memory"; |
138 | 138 | ||
139 | case MAD_ERROR_LOSTSYNC: return "lost synchronization"; | 139 | case MAD_ERROR_LOSTSYNC: return "lost synchronization"; |
140 | case MAD_ERROR_BADLAYER: return "reserved header layer value"; | 140 | case MAD_ERROR_BADLAYER: return "reserved header layer value"; |
141 | case MAD_ERROR_BADBITRATE: return "forbidden bitrate value"; | 141 | case MAD_ERROR_BADBITRATE: return "forbidden bitrate value"; |
142 | case MAD_ERROR_BADSAMPLERATE: return "reserved sample frequency value"; | 142 | case MAD_ERROR_BADSAMPLERATE: return "reserved sample frequency value"; |
143 | case MAD_ERROR_BADEMPHASIS: return "reserved emphasis value"; | 143 | case MAD_ERROR_BADEMPHASIS: return "reserved emphasis value"; |
144 | 144 | ||
145 | case MAD_ERROR_BADCRC: return "CRC check failed"; | 145 | case MAD_ERROR_BADCRC: return "CRC check failed"; |
146 | case MAD_ERROR_BADBITALLOC: return "forbidden bit allocation value"; | 146 | case MAD_ERROR_BADBITALLOC: return "forbidden bit allocation value"; |
147 | case MAD_ERROR_BADSCALEFACTOR: return "bad scalefactor index"; | 147 | case MAD_ERROR_BADSCALEFACTOR: return "bad scalefactor index"; |
148 | case MAD_ERROR_BADMODE: return "bad bitrate/mode combination"; | ||
148 | case MAD_ERROR_BADFRAMELEN: return "bad frame length"; | 149 | case MAD_ERROR_BADFRAMELEN: return "bad frame length"; |
149 | case MAD_ERROR_BADBIGVALUES: return "bad big_values count"; | 150 | case MAD_ERROR_BADBIGVALUES: return "bad big_values count"; |
150 | case MAD_ERROR_BADBLOCKTYPE: return "reserved block_type"; | 151 | case MAD_ERROR_BADBLOCKTYPE: return "reserved block_type"; |
151 | case MAD_ERROR_BADSCFSI: return "bad scalefactor selection info"; | 152 | case MAD_ERROR_BADSCFSI: return "bad scalefactor selection info"; |
152 | case MAD_ERROR_BADDATAPTR: return "bad main_data_begin pointer"; | 153 | case MAD_ERROR_BADDATAPTR: return "bad main_data_begin pointer"; |
153 | case MAD_ERROR_BADPART3LEN: return "bad audio data length"; | 154 | case MAD_ERROR_BADPART3LEN: return "bad audio data length"; |
154 | case MAD_ERROR_BADHUFFTABLE: return "bad Huffman table select"; | 155 | case MAD_ERROR_BADHUFFTABLE: return "bad Huffman table select"; |
155 | case MAD_ERROR_BADHUFFDATA: return "Huffman data overrun"; | 156 | case MAD_ERROR_BADHUFFDATA: return "Huffman data overrun"; |
156 | case MAD_ERROR_BADSTEREO: return "incompatible block_type for JS"; | 157 | case MAD_ERROR_BADSTEREO: return "incompatible block_type for JS"; |
157 | } | 158 | } |
158 | 159 | ||
159 | return 0; | 160 | return 0; |
160 | } | 161 | } |
diff --git a/core/multimedia/opieplayer/libmad/stream.h b/core/multimedia/opieplayer/libmad/stream.h index 08e6dc5..5fca48f 100644 --- a/core/multimedia/opieplayer/libmad/stream.h +++ b/core/multimedia/opieplayer/libmad/stream.h | |||
@@ -1,107 +1,108 @@ | |||
1 | /* | 1 | /* |
2 | * libmad - MPEG audio decoder library | 2 | * libmad - MPEG audio decoder library |
3 | * Copyright (C) 2000-2001 Robert Leslie | 3 | * Copyright (C) 2000-2004 Underbit Technologies, Inc. |
4 | * | 4 | * |
5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
7 | * the Free Software Foundation; either version 2 of the License, or | 7 | * the Free Software Foundation; either version 2 of the License, or |
8 | * (at your option) any later version. | 8 | * (at your option) any later version. |
9 | * | 9 | * |
10 | * This program is distributed in the hope that it will be useful, | 10 | * This program is distributed in the hope that it will be useful, |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | * GNU General Public License for more details. | 13 | * GNU General Public License for more details. |
14 | * | 14 | * |
15 | * You should have received a copy of the GNU General Public License | 15 | * You should have received a copy of the GNU General Public License |
16 | * along with this program; if not, write to the Free Software | 16 | * along with this program; if not, write to the Free Software |
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
18 | * | 18 | * |
19 | * $Id$ | 19 | * $Id$ |
20 | */ | 20 | */ |
21 | 21 | ||
22 | # ifndef LIBMAD_STREAM_H | 22 | # ifndef LIBMAD_STREAM_H |
23 | # define LIBMAD_STREAM_H | 23 | # define LIBMAD_STREAM_H |
24 | 24 | ||
25 | # include "bit.h" | 25 | # include "bit.h" |
26 | 26 | ||
27 | # define MAD_BUFFER_GUARD8 | 27 | # define MAD_BUFFER_GUARD8 |
28 | # define MAD_BUFFER_MDLEN(511 + 2048 + MAD_BUFFER_GUARD) | 28 | # define MAD_BUFFER_MDLEN(511 + 2048 + MAD_BUFFER_GUARD) |
29 | 29 | ||
30 | enum mad_error { | 30 | enum mad_error { |
31 | MAD_ERROR_NONE = 0x0000,/* no error */ | 31 | MAD_ERROR_NONE = 0x0000,/* no error */ |
32 | 32 | ||
33 | MAD_ERROR_BUFLEN = 0x0001,/* input buffer too small (or EOF) */ | 33 | MAD_ERROR_BUFLEN = 0x0001,/* input buffer too small (or EOF) */ |
34 | MAD_ERROR_BUFPTR = 0x0002,/* invalid (null) buffer pointer */ | 34 | MAD_ERROR_BUFPTR = 0x0002,/* invalid (null) buffer pointer */ |
35 | 35 | ||
36 | MAD_ERROR_NOMEM = 0x0031,/* not enough memory */ | 36 | MAD_ERROR_NOMEM = 0x0031,/* not enough memory */ |
37 | 37 | ||
38 | MAD_ERROR_LOSTSYNC = 0x0101,/* lost synchronization */ | 38 | MAD_ERROR_LOSTSYNC = 0x0101,/* lost synchronization */ |
39 | MAD_ERROR_BADLAYER = 0x0102,/* reserved header layer value */ | 39 | MAD_ERROR_BADLAYER = 0x0102,/* reserved header layer value */ |
40 | MAD_ERROR_BADBITRATE = 0x0103,/* forbidden bitrate value */ | 40 | MAD_ERROR_BADBITRATE = 0x0103,/* forbidden bitrate value */ |
41 | MAD_ERROR_BADSAMPLERATE = 0x0104,/* reserved sample frequency value */ | 41 | MAD_ERROR_BADSAMPLERATE = 0x0104,/* reserved sample frequency value */ |
42 | MAD_ERROR_BADEMPHASIS = 0x0105,/* reserved emphasis value */ | 42 | MAD_ERROR_BADEMPHASIS = 0x0105,/* reserved emphasis value */ |
43 | 43 | ||
44 | MAD_ERROR_BADCRC = 0x0201,/* CRC check failed */ | 44 | MAD_ERROR_BADCRC = 0x0201,/* CRC check failed */ |
45 | MAD_ERROR_BADBITALLOC = 0x0211,/* forbidden bit allocation value */ | 45 | MAD_ERROR_BADBITALLOC = 0x0211,/* forbidden bit allocation value */ |
46 | MAD_ERROR_BADSCALEFACTOR = 0x0221,/* bad scalefactor index */ | 46 | MAD_ERROR_BADSCALEFACTOR = 0x0221,/* bad scalefactor index */ |
47 | MAD_ERROR_BADMODE = 0x0222,/* bad bitrate/mode combination */ | ||
47 | MAD_ERROR_BADFRAMELEN = 0x0231,/* bad frame length */ | 48 | MAD_ERROR_BADFRAMELEN = 0x0231,/* bad frame length */ |
48 | MAD_ERROR_BADBIGVALUES = 0x0232,/* bad big_values count */ | 49 | MAD_ERROR_BADBIGVALUES = 0x0232,/* bad big_values count */ |
49 | MAD_ERROR_BADBLOCKTYPE = 0x0233,/* reserved block_type */ | 50 | MAD_ERROR_BADBLOCKTYPE = 0x0233,/* reserved block_type */ |
50 | MAD_ERROR_BADSCFSI = 0x0234,/* bad scalefactor selection info */ | 51 | MAD_ERROR_BADSCFSI = 0x0234,/* bad scalefactor selection info */ |
51 | MAD_ERROR_BADDATAPTR = 0x0235,/* bad main_data_begin pointer */ | 52 | MAD_ERROR_BADDATAPTR = 0x0235,/* bad main_data_begin pointer */ |
52 | MAD_ERROR_BADPART3LEN = 0x0236,/* bad audio data length */ | 53 | MAD_ERROR_BADPART3LEN = 0x0236,/* bad audio data length */ |
53 | MAD_ERROR_BADHUFFTABLE = 0x0237,/* bad Huffman table select */ | 54 | MAD_ERROR_BADHUFFTABLE = 0x0237,/* bad Huffman table select */ |
54 | MAD_ERROR_BADHUFFDATA = 0x0238,/* Huffman data overrun */ | 55 | MAD_ERROR_BADHUFFDATA = 0x0238,/* Huffman data overrun */ |
55 | MAD_ERROR_BADSTEREO = 0x0239/* incompatible block_type for JS */ | 56 | MAD_ERROR_BADSTEREO = 0x0239/* incompatible block_type for JS */ |
56 | }; | 57 | }; |
57 | 58 | ||
58 | # define MAD_RECOVERABLE(error)((error) & 0xff00) | 59 | # define MAD_RECOVERABLE(error)((error) & 0xff00) |
59 | 60 | ||
60 | struct mad_stream { | 61 | struct mad_stream { |
61 | unsigned char const *buffer; /* input bitstream buffer */ | 62 | unsigned char const *buffer; /* input bitstream buffer */ |
62 | unsigned char const *bufend; /* end of buffer */ | 63 | unsigned char const *bufend; /* end of buffer */ |
63 | unsigned long skiplen; /* bytes to skip before next frame */ | 64 | unsigned long skiplen; /* bytes to skip before next frame */ |
64 | 65 | ||
65 | int sync; /* stream sync found */ | 66 | int sync; /* stream sync found */ |
66 | unsigned long freerate; /* free bitrate (fixed) */ | 67 | unsigned long freerate; /* free bitrate (fixed) */ |
67 | 68 | ||
68 | unsigned char const *this_frame;/* start of current frame */ | 69 | unsigned char const *this_frame;/* start of current frame */ |
69 | unsigned char const *next_frame;/* start of next frame */ | 70 | unsigned char const *next_frame;/* start of next frame */ |
70 | struct mad_bitptr ptr; /* current processing bit pointer */ | 71 | struct mad_bitptr ptr; /* current processing bit pointer */ |
71 | 72 | ||
72 | struct mad_bitptr anc_ptr; /* ancillary bits pointer */ | 73 | struct mad_bitptr anc_ptr; /* ancillary bits pointer */ |
73 | unsigned int anc_bitlen; /* number of ancillary bits */ | 74 | unsigned int anc_bitlen; /* number of ancillary bits */ |
74 | 75 | ||
75 | unsigned char (*main_data)[MAD_BUFFER_MDLEN]; | 76 | unsigned char (*main_data)[MAD_BUFFER_MDLEN]; |
76 | /* Layer III main_data() */ | 77 | /* Layer III main_data() */ |
77 | unsigned int md_len; /* bytes in main_data */ | 78 | unsigned int md_len; /* bytes in main_data */ |
78 | 79 | ||
79 | int options; /* decoding options (see below) */ | 80 | int options; /* decoding options (see below) */ |
80 | enum mad_error error; /* error code (see above) */ | 81 | enum mad_error error; /* error code (see above) */ |
81 | }; | 82 | }; |
82 | 83 | ||
83 | enum { | 84 | enum { |
84 | MAD_OPTION_IGNORECRC = 0x0001,/* ignore CRC errors */ | 85 | MAD_OPTION_IGNORECRC = 0x0001,/* ignore CRC errors */ |
85 | MAD_OPTION_HALFSAMPLERATE = 0x0002/* generate PCM at 1/2 sample rate */ | 86 | MAD_OPTION_HALFSAMPLERATE = 0x0002/* generate PCM at 1/2 sample rate */ |
86 | # if 0 /* not yet implemented */ | 87 | # if 0 /* not yet implemented */ |
87 | MAD_OPTION_LEFTCHANNEL = 0x0010,/* decode left channel only */ | 88 | MAD_OPTION_LEFTCHANNEL = 0x0010,/* decode left channel only */ |
88 | MAD_OPTION_RIGHTCHANNEL = 0x0020,/* decode right channel only */ | 89 | MAD_OPTION_RIGHTCHANNEL = 0x0020,/* decode right channel only */ |
89 | MAD_OPTION_SINGLECHANNEL = 0x0030/* combine channels */ | 90 | MAD_OPTION_SINGLECHANNEL = 0x0030/* combine channels */ |
90 | # endif | 91 | # endif |
91 | }; | 92 | }; |
92 | 93 | ||
93 | void mad_stream_init(struct mad_stream *); | 94 | void mad_stream_init(struct mad_stream *); |
94 | void mad_stream_finish(struct mad_stream *); | 95 | void mad_stream_finish(struct mad_stream *); |
95 | 96 | ||
96 | # define mad_stream_options(stream, opts) \ | 97 | # define mad_stream_options(stream, opts) \ |
97 | ((void) ((stream)->options = (opts))) | 98 | ((void) ((stream)->options = (opts))) |
98 | 99 | ||
99 | void mad_stream_buffer(struct mad_stream *, | 100 | void mad_stream_buffer(struct mad_stream *, |
100 | unsigned char const *, unsigned long); | 101 | unsigned char const *, unsigned long); |
101 | void mad_stream_skip(struct mad_stream *, unsigned long); | 102 | void mad_stream_skip(struct mad_stream *, unsigned long); |
102 | 103 | ||
103 | int mad_stream_sync(struct mad_stream *); | 104 | int mad_stream_sync(struct mad_stream *); |
104 | 105 | ||
105 | char const *mad_stream_errorstr(struct mad_stream const *); | 106 | char const *mad_stream_errorstr(struct mad_stream const *); |
106 | 107 | ||
107 | # endif | 108 | # endif |
diff --git a/core/multimedia/opieplayer/libmad/synth.c b/core/multimedia/opieplayer/libmad/synth.c index cf3c1d5..881f85a 100644 --- a/core/multimedia/opieplayer/libmad/synth.c +++ b/core/multimedia/opieplayer/libmad/synth.c | |||
@@ -1,131 +1,131 @@ | |||
1 | /* | 1 | /* |
2 | * libmad - MPEG audio decoder library | 2 | * libmad - MPEG audio decoder library |
3 | * Copyright (C) 2000-2001 Robert Leslie | 3 | * Copyright (C) 2000-2004 Underbit Technologies, Inc. |
4 | * | 4 | * |
5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
7 | * the Free Software Foundation; either version 2 of the License, or | 7 | * the Free Software Foundation; either version 2 of the License, or |
8 | * (at your option) any later version. | 8 | * (at your option) any later version. |
9 | * | 9 | * |
10 | * This program is distributed in the hope that it will be useful, | 10 | * This program is distributed in the hope that it will be useful, |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | * GNU General Public License for more details. | 13 | * GNU General Public License for more details. |
14 | * | 14 | * |
15 | * You should have received a copy of the GNU General Public License | 15 | * You should have received a copy of the GNU General Public License |
16 | * along with this program; if not, write to the Free Software | 16 | * along with this program; if not, write to the Free Software |
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
18 | * | 18 | * |
19 | * $Id$ | 19 | * $Id$ |
20 | */ | 20 | */ |
21 | 21 | ||
22 | # ifdef HAVE_CONFIG_H | 22 | # ifdef HAVE_CONFIG_H |
23 | # include "libmad_config.h" | 23 | # include "libmad_config.h" |
24 | # endif | 24 | # endif |
25 | 25 | ||
26 | # include "libmad_global.h" | 26 | # include "libmad_global.h" |
27 | 27 | ||
28 | # include "fixed.h" | 28 | # include "fixed.h" |
29 | # include "frame.h" | 29 | # include "frame.h" |
30 | # include "synth.h" | 30 | # include "synth.h" |
31 | 31 | ||
32 | /* | 32 | /* |
33 | * NAME:synth->init() | 33 | * NAME:synth->init() |
34 | * DESCRIPTION:initialize synth struct | 34 | * DESCRIPTION:initialize synth struct |
35 | */ | 35 | */ |
36 | void mad_synth_init(struct mad_synth *synth) | 36 | void mad_synth_init(struct mad_synth *synth) |
37 | { | 37 | { |
38 | mad_synth_mute(synth); | 38 | mad_synth_mute(synth); |
39 | 39 | ||
40 | synth->phase = 0; | 40 | synth->phase = 0; |
41 | 41 | ||
42 | synth->pcm.samplerate = 0; | 42 | synth->pcm.samplerate = 0; |
43 | synth->pcm.channels = 0; | 43 | synth->pcm.channels = 0; |
44 | synth->pcm.length = 0; | 44 | synth->pcm.length = 0; |
45 | } | 45 | } |
46 | 46 | ||
47 | /* | 47 | /* |
48 | * NAME:synth->mute() | 48 | * NAME:synth->mute() |
49 | * DESCRIPTION:zero all polyphase filterbank values, resetting synthesis | 49 | * DESCRIPTION:zero all polyphase filterbank values, resetting synthesis |
50 | */ | 50 | */ |
51 | void mad_synth_mute(struct mad_synth *synth) | 51 | void mad_synth_mute(struct mad_synth *synth) |
52 | { | 52 | { |
53 | unsigned int ch, s, v; | 53 | unsigned int ch, s, v; |
54 | 54 | ||
55 | for (ch = 0; ch < 2; ++ch) { | 55 | for (ch = 0; ch < 2; ++ch) { |
56 | for (s = 0; s < 16; ++s) { | 56 | for (s = 0; s < 16; ++s) { |
57 | for (v = 0; v < 8; ++v) { | 57 | for (v = 0; v < 8; ++v) { |
58 | synth->filter[ch][0][0][s][v] = synth->filter[ch][0][1][s][v] = | 58 | synth->filter[ch][0][0][s][v] = synth->filter[ch][0][1][s][v] = |
59 | synth->filter[ch][1][0][s][v] = synth->filter[ch][1][1][s][v] = 0; | 59 | synth->filter[ch][1][0][s][v] = synth->filter[ch][1][1][s][v] = 0; |
60 | } | 60 | } |
61 | } | 61 | } |
62 | } | 62 | } |
63 | } | 63 | } |
64 | 64 | ||
65 | /* | 65 | /* |
66 | * An optional optimization called here the Subband Synthesis Optimization | 66 | * An optional optimization called here the Subband Synthesis Optimization |
67 | * (SSO) improves the performance of subband synthesis at the expense of | 67 | * (SSO) improves the performance of subband synthesis at the expense of |
68 | * accuracy. | 68 | * accuracy. |
69 | * | 69 | * |
70 | * The idea is to simplify 32x32->64-bit multiplication to 32x32->32 such | 70 | * The idea is to simplify 32x32->64-bit multiplication to 32x32->32 such |
71 | * that extra scaling and rounding are not necessary. This often allows the | 71 | * that extra scaling and rounding are not necessary. This often allows the |
72 | * compiler to use faster 32-bit multiply-accumulate instructions instead of | 72 | * compiler to use faster 32-bit multiply-accumulate instructions instead of |
73 | * explicit 64-bit multiply, shift, and add instructions. | 73 | * explicit 64-bit multiply, shift, and add instructions. |
74 | * | 74 | * |
75 | * SSO works like this: a full 32x32->64-bit multiply of two mad_fixed_t | 75 | * SSO works like this: a full 32x32->64-bit multiply of two mad_fixed_t |
76 | * values requires the result to be right-shifted 28 bits to be properly | 76 | * values requires the result to be right-shifted 28 bits to be properly |
77 | * scaled to the same fixed-point format. Right shifts can be applied at any | 77 | * scaled to the same fixed-point format. Right shifts can be applied at any |
78 | * time to either operand or to the result, so the optimization involves | 78 | * time to either operand or to the result, so the optimization involves |
79 | * careful placement of these shifts to minimize the loss of accuracy. | 79 | * careful placement of these shifts to minimize the loss of accuracy. |
80 | * | 80 | * |
81 | * First, a 14-bit shift is applied with rounding at compile-time to the D[] | 81 | * First, a 14-bit shift is applied with rounding at compile-time to the D[] |
82 | * table of coefficients for the subband synthesis window. This only loses 2 | 82 | * table of coefficients for the subband synthesis window. This only loses 2 |
83 | * bits of accuracy because the lower 12 bits are always zero. A second | 83 | * bits of accuracy because the lower 12 bits are always zero. A second |
84 | * 12-bit shift occurs after the DCT calculation. This loses 12 bits of | 84 | * 12-bit shift occurs after the DCT calculation. This loses 12 bits of |
85 | * accuracy. Finally, a third 2-bit shift occurs just before the sample is | 85 | * accuracy. Finally, a third 2-bit shift occurs just before the sample is |
86 | * saved in the PCM buffer. 14 + 12 + 2 == 28 bits. | 86 | * saved in the PCM buffer. 14 + 12 + 2 == 28 bits. |
87 | */ | 87 | */ |
88 | 88 | ||
89 | /* FPM_DEFAULT without OPT_SSO will actually lose accuracy and performance */ | 89 | /* FPM_DEFAULT without OPT_SSO will actually lose accuracy and performance */ |
90 | 90 | ||
91 | # if defined(FPM_DEFAULT) && !defined(OPT_SSO) | 91 | # if defined(FPM_DEFAULT) && !defined(OPT_SSO) |
92 | # define OPT_SSO | 92 | # define OPT_SSO |
93 | # endif | 93 | # endif |
94 | 94 | ||
95 | /* second SSO shift, with rounding */ | 95 | /* second SSO shift, with rounding */ |
96 | 96 | ||
97 | # if defined(OPT_SSO) | 97 | # if defined(OPT_SSO) |
98 | # define SHIFT(x) (((x) + (1L << 11)) >> 12) | 98 | # define SHIFT(x) (((x) + (1L << 11)) >> 12) |
99 | # else | 99 | # else |
100 | # define SHIFT(x) (x) | 100 | # define SHIFT(x) (x) |
101 | # endif | 101 | # endif |
102 | 102 | ||
103 | /* possible DCT speed optimization */ | 103 | /* possible DCT speed optimization */ |
104 | 104 | ||
105 | # if defined(OPT_SPEED) && defined(MAD_F_MLX) | 105 | # if defined(OPT_SPEED) && defined(MAD_F_MLX) |
106 | # define OPT_DCTO | 106 | # define OPT_DCTO |
107 | # define MUL(x, y) \ | 107 | # define MUL(x, y) \ |
108 | ({ mad_fixed64hi_t hi; \ | 108 | ({ mad_fixed64hi_t hi; \ |
109 | mad_fixed64lo_t lo; \ | 109 | mad_fixed64lo_t lo; \ |
110 | MAD_F_MLX(hi, lo, (x), (y)); \ | 110 | MAD_F_MLX(hi, lo, (x), (y)); \ |
111 | hi << (32 - MAD_F_SCALEBITS - 3); \ | 111 | hi << (32 - MAD_F_SCALEBITS - 3); \ |
112 | }) | 112 | }) |
113 | # else | 113 | # else |
114 | # undef OPT_DCTO | 114 | # undef OPT_DCTO |
115 | # define MUL(x, y) mad_f_mul((x), (y)) | 115 | # define MUL(x, y) mad_f_mul((x), (y)) |
116 | # endif | 116 | # endif |
117 | 117 | ||
118 | /* | 118 | /* |
119 | * NAME:dct32() | 119 | * NAME:dct32() |
120 | * DESCRIPTION:perform fast in[32]->out[32] DCT | 120 | * DESCRIPTION:perform fast in[32]->out[32] DCT |
121 | */ | 121 | */ |
122 | static | 122 | static |
123 | void dct32(mad_fixed_t const in[32], unsigned int slot, | 123 | void dct32(mad_fixed_t const in[32], unsigned int slot, |
124 | mad_fixed_t lo[16][8], mad_fixed_t hi[16][8]) | 124 | mad_fixed_t lo[16][8], mad_fixed_t hi[16][8]) |
125 | { | 125 | { |
126 | mad_fixed_t t0, t1, t2, t3, t4, t5, t6, t7; | 126 | mad_fixed_t t0, t1, t2, t3, t4, t5, t6, t7; |
127 | mad_fixed_t t8, t9, t10, t11, t12, t13, t14, t15; | 127 | mad_fixed_t t8, t9, t10, t11, t12, t13, t14, t15; |
128 | mad_fixed_t t16, t17, t18, t19, t20, t21, t22, t23; | 128 | mad_fixed_t t16, t17, t18, t19, t20, t21, t22, t23; |
129 | mad_fixed_t t24, t25, t26, t27, t28, t29, t30, t31; | 129 | mad_fixed_t t24, t25, t26, t27, t28, t29, t30, t31; |
130 | mad_fixed_t t32, t33, t34, t35, t36, t37, t38, t39; | 130 | mad_fixed_t t32, t33, t34, t35, t36, t37, t38, t39; |
131 | mad_fixed_t t40, t41, t42, t43, t44, t45, t46, t47; | 131 | mad_fixed_t t40, t41, t42, t43, t44, t45, t46, t47; |
diff --git a/core/multimedia/opieplayer/libmad/synth.h b/core/multimedia/opieplayer/libmad/synth.h index 2c9d5c8..d284d01 100644 --- a/core/multimedia/opieplayer/libmad/synth.h +++ b/core/multimedia/opieplayer/libmad/synth.h | |||
@@ -1,69 +1,69 @@ | |||
1 | /* | 1 | /* |
2 | * libmad - MPEG audio decoder library | 2 | * libmad - MPEG audio decoder library |
3 | * Copyright (C) 2000-2001 Robert Leslie | 3 | * Copyright (C) 2000-2004 Underbit Technologies, Inc. |
4 | * | 4 | * |
5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
7 | * the Free Software Foundation; either version 2 of the License, or | 7 | * the Free Software Foundation; either version 2 of the License, or |
8 | * (at your option) any later version. | 8 | * (at your option) any later version. |
9 | * | 9 | * |
10 | * This program is distributed in the hope that it will be useful, | 10 | * This program is distributed in the hope that it will be useful, |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | * GNU General Public License for more details. | 13 | * GNU General Public License for more details. |
14 | * | 14 | * |
15 | * You should have received a copy of the GNU General Public License | 15 | * You should have received a copy of the GNU General Public License |
16 | * along with this program; if not, write to the Free Software | 16 | * along with this program; if not, write to the Free Software |
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
18 | * | 18 | * |
19 | * $Id$ | 19 | * $Id$ |
20 | */ | 20 | */ |
21 | 21 | ||
22 | # ifndef LIBMAD_SYNTH_H | 22 | # ifndef LIBMAD_SYNTH_H |
23 | # define LIBMAD_SYNTH_H | 23 | # define LIBMAD_SYNTH_H |
24 | 24 | ||
25 | # include "fixed.h" | 25 | # include "fixed.h" |
26 | # include "frame.h" | 26 | # include "frame.h" |
27 | 27 | ||
28 | struct mad_pcm { | 28 | struct mad_pcm { |
29 | unsigned int samplerate; /* sampling frequency (Hz) */ | 29 | unsigned int samplerate; /* sampling frequency (Hz) */ |
30 | unsigned short channels; /* number of channels */ | 30 | unsigned short channels; /* number of channels */ |
31 | unsigned short length; /* number of samples per channel */ | 31 | unsigned short length; /* number of samples per channel */ |
32 | mad_fixed_t samples[2][1152]; /* PCM output samples [ch][sample] */ | 32 | mad_fixed_t samples[2][1152]; /* PCM output samples [ch][sample] */ |
33 | }; | 33 | }; |
34 | 34 | ||
35 | struct mad_synth { | 35 | struct mad_synth { |
36 | mad_fixed_t filter[2][2][2][16][8];/* polyphase filterbank outputs */ | 36 | mad_fixed_t filter[2][2][2][16][8];/* polyphase filterbank outputs */ |
37 | /* [ch][eo][peo][s][v] */ | 37 | /* [ch][eo][peo][s][v] */ |
38 | 38 | ||
39 | unsigned int phase; /* current processing phase */ | 39 | unsigned int phase; /* current processing phase */ |
40 | 40 | ||
41 | struct mad_pcm pcm; /* PCM output */ | 41 | struct mad_pcm pcm; /* PCM output */ |
42 | }; | 42 | }; |
43 | 43 | ||
44 | /* single channel PCM selector */ | 44 | /* single channel PCM selector */ |
45 | enum { | 45 | enum { |
46 | MAD_PCM_CHANNEL_SINGLE = 0 | 46 | MAD_PCM_CHANNEL_SINGLE = 0 |
47 | }; | 47 | }; |
48 | 48 | ||
49 | /* dual channel PCM selector */ | 49 | /* dual channel PCM selector */ |
50 | enum { | 50 | enum { |
51 | MAD_PCM_CHANNEL_DUAL_1 = 0, | 51 | MAD_PCM_CHANNEL_DUAL_1 = 0, |
52 | MAD_PCM_CHANNEL_DUAL_2 = 1 | 52 | MAD_PCM_CHANNEL_DUAL_2 = 1 |
53 | }; | 53 | }; |
54 | 54 | ||
55 | /* stereo PCM selector */ | 55 | /* stereo PCM selector */ |
56 | enum { | 56 | enum { |
57 | MAD_PCM_CHANNEL_STEREO_LEFT = 0, | 57 | MAD_PCM_CHANNEL_STEREO_LEFT = 0, |
58 | MAD_PCM_CHANNEL_STEREO_RIGHT = 1 | 58 | MAD_PCM_CHANNEL_STEREO_RIGHT = 1 |
59 | }; | 59 | }; |
60 | 60 | ||
61 | void mad_synth_init(struct mad_synth *); | 61 | void mad_synth_init(struct mad_synth *); |
62 | 62 | ||
63 | # define mad_synth_finish(synth) /* nothing */ | 63 | # define mad_synth_finish(synth) /* nothing */ |
64 | 64 | ||
65 | void mad_synth_mute(struct mad_synth *); | 65 | void mad_synth_mute(struct mad_synth *); |
66 | 66 | ||
67 | void mad_synth_frame(struct mad_synth *, struct mad_frame const *); | 67 | void mad_synth_frame(struct mad_synth *, struct mad_frame const *); |
68 | 68 | ||
69 | # endif | 69 | # endif |
diff --git a/core/multimedia/opieplayer/libmad/timer.c b/core/multimedia/opieplayer/libmad/timer.c index 299fe0b..fa377d0 100644 --- a/core/multimedia/opieplayer/libmad/timer.c +++ b/core/multimedia/opieplayer/libmad/timer.c | |||
@@ -1,458 +1,459 @@ | |||
1 | /* | 1 | /* |
2 | * libmad - MPEG audio decoder library | 2 | * libmad - MPEG audio decoder library |
3 | * Copyright (C) 2000-2001 Robert Leslie | 3 | * Copyright (C) 2000-2004 Underbit Technologies, Inc. |
4 | * | 4 | * |
5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
7 | * the Free Software Foundation; either version 2 of the License, or | 7 | * the Free Software Foundation; either version 2 of the License, or |
8 | * (at your option) any later version. | 8 | * (at your option) any later version. |
9 | * | 9 | * |
10 | * This program is distributed in the hope that it will be useful, | 10 | * This program is distributed in the hope that it will be useful, |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | * GNU General Public License for more details. | 13 | * GNU General Public License for more details. |
14 | * | 14 | * |
15 | * You should have received a copy of the GNU General Public License | 15 | * You should have received a copy of the GNU General Public License |
16 | * along with this program; if not, write to the Free Software | 16 | * along with this program; if not, write to the Free Software |
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
18 | * | 18 | * |
19 | * $Id$ | 19 | * $Id$ |
20 | */ | 20 | */ |
21 | 21 | ||
22 | # ifdef HAVE_CONFIG_H | 22 | # ifdef HAVE_CONFIG_H |
23 | # include "libmad_config.h" | 23 | # include "libmad_config.h" |
24 | # endif | 24 | # endif |
25 | 25 | ||
26 | # include "libmad_global.h" | 26 | # include "libmad_global.h" |
27 | 27 | ||
28 | # include <stdio.h> | 28 | # include <stdio.h> |
29 | 29 | ||
30 | # ifdef HAVE_ASSERT_H | 30 | # ifdef HAVE_ASSERT_H |
31 | # include <assert.h> | 31 | # include <assert.h> |
32 | # endif | 32 | # endif |
33 | 33 | ||
34 | # include "timer.h" | 34 | # include "timer.h" |
35 | 35 | ||
36 | mad_timer_t const mad_timer_zero = { 0, 0 }; | 36 | mad_timer_t const mad_timer_zero = { 0, 0 }; |
37 | 37 | ||
38 | /* | 38 | /* |
39 | * NAME:timer->compare() | 39 | * NAME:timer->compare() |
40 | * DESCRIPTION:indicate relative order of two timers | 40 | * DESCRIPTION:indicate relative order of two timers |
41 | */ | 41 | */ |
42 | int mad_timer_compare(mad_timer_t timer1, mad_timer_t timer2) | 42 | int mad_timer_compare(mad_timer_t timer1, mad_timer_t timer2) |
43 | { | 43 | { |
44 | signed long diff; | 44 | signed long diff; |
45 | 45 | ||
46 | diff = timer1.seconds - timer2.seconds; | 46 | diff = timer1.seconds - timer2.seconds; |
47 | if (diff < 0) | 47 | if (diff < 0) |
48 | return -1; | 48 | return -1; |
49 | else if (diff > 0) | 49 | else if (diff > 0) |
50 | return +1; | 50 | return +1; |
51 | 51 | ||
52 | diff = timer1.fraction - timer2.fraction; | 52 | diff = timer1.fraction - timer2.fraction; |
53 | if (diff < 0) | 53 | if (diff < 0) |
54 | return -1; | 54 | return -1; |
55 | else if (diff > 0) | 55 | else if (diff > 0) |
56 | return +1; | 56 | return +1; |
57 | 57 | ||
58 | return 0; | 58 | return 0; |
59 | } | 59 | } |
60 | 60 | ||
61 | /* | 61 | /* |
62 | * NAME:timer->negate() | 62 | * NAME:timer->negate() |
63 | * DESCRIPTION:invert the sign of a timer | 63 | * DESCRIPTION:invert the sign of a timer |
64 | */ | 64 | */ |
65 | void mad_timer_negate(mad_timer_t *timer) | 65 | void mad_timer_negate(mad_timer_t *timer) |
66 | { | 66 | { |
67 | timer->seconds = -timer->seconds; | 67 | timer->seconds = -timer->seconds; |
68 | 68 | ||
69 | if (timer->fraction) { | 69 | if (timer->fraction) { |
70 | timer->seconds -= 1; | 70 | timer->seconds -= 1; |
71 | timer->fraction = MAD_TIMER_RESOLUTION - timer->fraction; | 71 | timer->fraction = MAD_TIMER_RESOLUTION - timer->fraction; |
72 | } | 72 | } |
73 | } | 73 | } |
74 | 74 | ||
75 | /* | 75 | /* |
76 | * NAME:timer->abs() | 76 | * NAME:timer->abs() |
77 | * DESCRIPTION:return the absolute value of a timer | 77 | * DESCRIPTION:return the absolute value of a timer |
78 | */ | 78 | */ |
79 | mad_timer_t mad_timer_abs(mad_timer_t timer) | 79 | mad_timer_t mad_timer_abs(mad_timer_t timer) |
80 | { | 80 | { |
81 | if (mad_timer_sign(timer) < 0) | 81 | if (timer.seconds < 0) |
82 | mad_timer_negate(&timer); | 82 | mad_timer_negate(&timer); |
83 | 83 | ||
84 | return timer; | 84 | return timer; |
85 | } | 85 | } |
86 | 86 | ||
87 | /* | 87 | /* |
88 | * NAME:reduce_timer() | 88 | * NAME:reduce_timer() |
89 | * DESCRIPTION:carry timer fraction into seconds | 89 | * DESCRIPTION:carry timer fraction into seconds |
90 | */ | 90 | */ |
91 | static | 91 | static |
92 | void reduce_timer(mad_timer_t *timer) | 92 | void reduce_timer(mad_timer_t *timer) |
93 | { | 93 | { |
94 | timer->seconds += timer->fraction / MAD_TIMER_RESOLUTION; | 94 | timer->seconds += timer->fraction / MAD_TIMER_RESOLUTION; |
95 | timer->fraction %= MAD_TIMER_RESOLUTION; | 95 | timer->fraction %= MAD_TIMER_RESOLUTION; |
96 | } | 96 | } |
97 | 97 | ||
98 | /* | 98 | /* |
99 | * NAME:gcd() | 99 | * NAME:gcd() |
100 | * DESCRIPTION:compute greatest common denominator | 100 | * DESCRIPTION:compute greatest common denominator |
101 | */ | 101 | */ |
102 | static | 102 | static |
103 | unsigned long gcd(unsigned long num1, unsigned long num2) | 103 | unsigned long gcd(unsigned long num1, unsigned long num2) |
104 | { | 104 | { |
105 | unsigned long tmp; | 105 | unsigned long tmp; |
106 | 106 | ||
107 | while (num2) { | 107 | while (num2) { |
108 | tmp = num2; | 108 | tmp = num2; |
109 | num2 = num1 % num2; | 109 | num2 = num1 % num2; |
110 | num1 = tmp; | 110 | num1 = tmp; |
111 | } | 111 | } |
112 | 112 | ||
113 | return num1; | 113 | return num1; |
114 | } | 114 | } |
115 | 115 | ||
116 | /* | 116 | /* |
117 | * NAME:reduce_rational() | 117 | * NAME:reduce_rational() |
118 | * DESCRIPTION:convert rational expression to lowest terms | 118 | * DESCRIPTION:convert rational expression to lowest terms |
119 | */ | 119 | */ |
120 | static | 120 | static |
121 | void reduce_rational(unsigned long *numer, unsigned long *denom) | 121 | void reduce_rational(unsigned long *numer, unsigned long *denom) |
122 | { | 122 | { |
123 | unsigned long factor; | 123 | unsigned long factor; |
124 | 124 | ||
125 | factor = gcd(*numer, *denom); | 125 | factor = gcd(*numer, *denom); |
126 | 126 | ||
127 | assert(factor != 0); | 127 | assert(factor != 0); |
128 | 128 | ||
129 | *numer /= factor; | 129 | *numer /= factor; |
130 | *denom /= factor; | 130 | *denom /= factor; |
131 | } | 131 | } |
132 | 132 | ||
133 | /* | 133 | /* |
134 | * NAME:scale_rational() | 134 | * NAME:scale_rational() |
135 | * DESCRIPTION:solve numer/denom == ?/scale avoiding overflowing | 135 | * DESCRIPTION:solve numer/denom == ?/scale avoiding overflowing |
136 | */ | 136 | */ |
137 | static | 137 | static |
138 | unsigned long scale_rational(unsigned long numer, unsigned long denom, | 138 | unsigned long scale_rational(unsigned long numer, unsigned long denom, |
139 | unsigned long scale) | 139 | unsigned long scale) |
140 | { | 140 | { |
141 | reduce_rational(&numer, &denom); | 141 | reduce_rational(&numer, &denom); |
142 | reduce_rational(&scale, &denom); | 142 | reduce_rational(&scale, &denom); |
143 | 143 | ||
144 | assert(denom != 0); | 144 | assert(denom != 0); |
145 | 145 | ||
146 | if (denom < scale) | 146 | if (denom < scale) |
147 | return numer * (scale / denom) + numer * (scale % denom) / denom; | 147 | return numer * (scale / denom) + numer * (scale % denom) / denom; |
148 | if (denom < numer) | 148 | if (denom < numer) |
149 | return scale * (numer / denom) + scale * (numer % denom) / denom; | 149 | return scale * (numer / denom) + scale * (numer % denom) / denom; |
150 | 150 | ||
151 | return numer * scale / denom; | 151 | return numer * scale / denom; |
152 | } | 152 | } |
153 | 153 | ||
154 | /* | 154 | /* |
155 | * NAME:timer->set() | 155 | * NAME:timer->set() |
156 | * DESCRIPTION:set timer to specific (positive) value | 156 | * DESCRIPTION:set timer to specific (positive) value |
157 | */ | 157 | */ |
158 | void mad_timer_set(mad_timer_t *timer, unsigned long seconds, | 158 | void mad_timer_set(mad_timer_t *timer, unsigned long seconds, |
159 | unsigned long numer, unsigned long denom) | 159 | unsigned long numer, unsigned long denom) |
160 | { | 160 | { |
161 | timer->seconds = seconds; | 161 | timer->seconds = seconds; |
162 | if (numer >= denom && denom > 0) { | 162 | if (numer >= denom && denom > 0) { |
163 | timer->seconds += numer / denom; | 163 | timer->seconds += numer / denom; |
164 | numer %= denom; | 164 | numer %= denom; |
165 | } | 165 | } |
166 | 166 | ||
167 | switch (denom) { | 167 | switch (denom) { |
168 | case 0: | 168 | case 0: |
169 | case 1: | 169 | case 1: |
170 | timer->fraction = 0; | 170 | timer->fraction = 0; |
171 | break; | 171 | break; |
172 | 172 | ||
173 | case MAD_TIMER_RESOLUTION: | 173 | case MAD_TIMER_RESOLUTION: |
174 | timer->fraction = numer; | 174 | timer->fraction = numer; |
175 | break; | 175 | break; |
176 | 176 | ||
177 | case 1000: | 177 | case 1000: |
178 | timer->fraction = numer * (MAD_TIMER_RESOLUTION / 1000); | 178 | timer->fraction = numer * (MAD_TIMER_RESOLUTION / 1000); |
179 | break; | 179 | break; |
180 | 180 | ||
181 | case 8000: | 181 | case 8000: |
182 | timer->fraction = numer * (MAD_TIMER_RESOLUTION / 8000); | 182 | timer->fraction = numer * (MAD_TIMER_RESOLUTION / 8000); |
183 | break; | 183 | break; |
184 | 184 | ||
185 | case 11025: | 185 | case 11025: |
186 | timer->fraction = numer * (MAD_TIMER_RESOLUTION / 11025); | 186 | timer->fraction = numer * (MAD_TIMER_RESOLUTION / 11025); |
187 | break; | 187 | break; |
188 | 188 | ||
189 | case 12000: | 189 | case 12000: |
190 | timer->fraction = numer * (MAD_TIMER_RESOLUTION / 12000); | 190 | timer->fraction = numer * (MAD_TIMER_RESOLUTION / 12000); |
191 | break; | 191 | break; |
192 | 192 | ||
193 | case 16000: | 193 | case 16000: |
194 | timer->fraction = numer * (MAD_TIMER_RESOLUTION / 16000); | 194 | timer->fraction = numer * (MAD_TIMER_RESOLUTION / 16000); |
195 | break; | 195 | break; |
196 | 196 | ||
197 | case 22050: | 197 | case 22050: |
198 | timer->fraction = numer * (MAD_TIMER_RESOLUTION / 22050); | 198 | timer->fraction = numer * (MAD_TIMER_RESOLUTION / 22050); |
199 | break; | 199 | break; |
200 | 200 | ||
201 | case 24000: | 201 | case 24000: |
202 | timer->fraction = numer * (MAD_TIMER_RESOLUTION / 24000); | 202 | timer->fraction = numer * (MAD_TIMER_RESOLUTION / 24000); |
203 | break; | 203 | break; |
204 | 204 | ||
205 | case 32000: | 205 | case 32000: |
206 | timer->fraction = numer * (MAD_TIMER_RESOLUTION / 32000); | 206 | timer->fraction = numer * (MAD_TIMER_RESOLUTION / 32000); |
207 | break; | 207 | break; |
208 | 208 | ||
209 | case 44100: | 209 | case 44100: |
210 | timer->fraction = numer * (MAD_TIMER_RESOLUTION / 44100); | 210 | timer->fraction = numer * (MAD_TIMER_RESOLUTION / 44100); |
211 | break; | 211 | break; |
212 | 212 | ||
213 | case 48000: | 213 | case 48000: |
214 | timer->fraction = numer * (MAD_TIMER_RESOLUTION / 48000); | 214 | timer->fraction = numer * (MAD_TIMER_RESOLUTION / 48000); |
215 | break; | 215 | break; |
216 | 216 | ||
217 | default: | 217 | default: |
218 | timer->fraction = scale_rational(numer, denom, MAD_TIMER_RESOLUTION); | 218 | timer->fraction = scale_rational(numer, denom, MAD_TIMER_RESOLUTION); |
219 | break; | 219 | break; |
220 | } | 220 | } |
221 | 221 | ||
222 | if (timer->fraction >= MAD_TIMER_RESOLUTION) | 222 | if (timer->fraction >= MAD_TIMER_RESOLUTION) |
223 | reduce_timer(timer); | 223 | reduce_timer(timer); |
224 | } | 224 | } |
225 | 225 | ||
226 | /* | 226 | /* |
227 | * NAME:timer->add() | 227 | * NAME:timer->add() |
228 | * DESCRIPTION:add one timer to another | 228 | * DESCRIPTION:add one timer to another |
229 | */ | 229 | */ |
230 | void mad_timer_add(mad_timer_t *timer, mad_timer_t incr) | 230 | void mad_timer_add(mad_timer_t *timer, mad_timer_t incr) |
231 | { | 231 | { |
232 | timer->seconds += incr.seconds; | 232 | timer->seconds += incr.seconds; |
233 | timer->fraction += incr.fraction; | 233 | timer->fraction += incr.fraction; |
234 | 234 | ||
235 | if (timer->fraction >= MAD_TIMER_RESOLUTION) | 235 | if (timer->fraction >= MAD_TIMER_RESOLUTION) |
236 | reduce_timer(timer); | 236 | reduce_timer(timer); |
237 | } | 237 | } |
238 | 238 | ||
239 | /* | 239 | /* |
240 | * NAME:timer->multiply() | 240 | * NAME:timer->multiply() |
241 | * DESCRIPTION:multiply a timer by a scalar value | 241 | * DESCRIPTION:multiply a timer by a scalar value |
242 | */ | 242 | */ |
243 | void mad_timer_multiply(mad_timer_t *timer, signed long scalar) | 243 | void mad_timer_multiply(mad_timer_t *timer, signed long scalar) |
244 | { | 244 | { |
245 | mad_timer_t addend; | 245 | mad_timer_t addend; |
246 | unsigned long factor; | 246 | unsigned long factor; |
247 | 247 | ||
248 | factor = scalar; | 248 | factor = scalar; |
249 | if (scalar < 0) { | 249 | if (scalar < 0) { |
250 | factor = -scalar; | 250 | factor = -scalar; |
251 | mad_timer_negate(timer); | 251 | mad_timer_negate(timer); |
252 | } | 252 | } |
253 | 253 | ||
254 | addend = *timer; | 254 | addend = *timer; |
255 | *timer = mad_timer_zero; | 255 | *timer = mad_timer_zero; |
256 | 256 | ||
257 | while (factor) { | 257 | while (factor) { |
258 | if (factor & 1) | 258 | if (factor & 1) |
259 | mad_timer_add(timer, addend); | 259 | mad_timer_add(timer, addend); |
260 | 260 | ||
261 | mad_timer_add(&addend, addend); | 261 | mad_timer_add(&addend, addend); |
262 | factor >>= 1; | 262 | factor >>= 1; |
263 | } | 263 | } |
264 | } | 264 | } |
265 | 265 | ||
266 | /* | 266 | /* |
267 | * NAME:timer->count() | 267 | * NAME:timer->count() |
268 | * DESCRIPTION:return timer value in selected units | 268 | * DESCRIPTION:return timer value in selected units |
269 | */ | 269 | */ |
270 | signed long mad_timer_count(mad_timer_t timer, enum mad_units units) | 270 | signed long mad_timer_count(mad_timer_t timer, enum mad_units units) |
271 | { | 271 | { |
272 | switch (units) { | 272 | switch (units) { |
273 | case MAD_UNITS_HOURS: | 273 | case MAD_UNITS_HOURS: |
274 | return timer.seconds / 60 / 60; | 274 | return timer.seconds / 60 / 60; |
275 | 275 | ||
276 | case MAD_UNITS_MINUTES: | 276 | case MAD_UNITS_MINUTES: |
277 | return timer.seconds / 60; | 277 | return timer.seconds / 60; |
278 | 278 | ||
279 | case MAD_UNITS_SECONDS: | 279 | case MAD_UNITS_SECONDS: |
280 | return timer.seconds; | 280 | return timer.seconds; |
281 | 281 | ||
282 | case MAD_UNITS_DECISECONDS: | 282 | case MAD_UNITS_DECISECONDS: |
283 | case MAD_UNITS_CENTISECONDS: | 283 | case MAD_UNITS_CENTISECONDS: |
284 | case MAD_UNITS_MILLISECONDS: | 284 | case MAD_UNITS_MILLISECONDS: |
285 | 285 | ||
286 | case MAD_UNITS_8000_HZ: | 286 | case MAD_UNITS_8000_HZ: |
287 | case MAD_UNITS_11025_HZ: | 287 | case MAD_UNITS_11025_HZ: |
288 | case MAD_UNITS_12000_HZ: | 288 | case MAD_UNITS_12000_HZ: |
289 | case MAD_UNITS_16000_HZ: | 289 | case MAD_UNITS_16000_HZ: |
290 | case MAD_UNITS_22050_HZ: | 290 | case MAD_UNITS_22050_HZ: |
291 | case MAD_UNITS_24000_HZ: | 291 | case MAD_UNITS_24000_HZ: |
292 | case MAD_UNITS_32000_HZ: | 292 | case MAD_UNITS_32000_HZ: |
293 | case MAD_UNITS_44100_HZ: | 293 | case MAD_UNITS_44100_HZ: |
294 | case MAD_UNITS_48000_HZ: | 294 | case MAD_UNITS_48000_HZ: |
295 | 295 | ||
296 | case MAD_UNITS_24_FPS: | 296 | case MAD_UNITS_24_FPS: |
297 | case MAD_UNITS_25_FPS: | 297 | case MAD_UNITS_25_FPS: |
298 | case MAD_UNITS_30_FPS: | 298 | case MAD_UNITS_30_FPS: |
299 | case MAD_UNITS_48_FPS: | 299 | case MAD_UNITS_48_FPS: |
300 | case MAD_UNITS_50_FPS: | 300 | case MAD_UNITS_50_FPS: |
301 | case MAD_UNITS_60_FPS: | 301 | case MAD_UNITS_60_FPS: |
302 | case MAD_UNITS_75_FPS: | 302 | case MAD_UNITS_75_FPS: |
303 | return timer.seconds * (signed long) units + | 303 | return timer.seconds * (signed long) units + |
304 | (signed long) scale_rational(timer.fraction, MAD_TIMER_RESOLUTION, | 304 | (signed long) scale_rational(timer.fraction, MAD_TIMER_RESOLUTION, |
305 | units); | 305 | units); |
306 | 306 | ||
307 | case MAD_UNITS_23_976_FPS: | 307 | case MAD_UNITS_23_976_FPS: |
308 | case MAD_UNITS_24_975_FPS: | 308 | case MAD_UNITS_24_975_FPS: |
309 | case MAD_UNITS_29_97_FPS: | 309 | case MAD_UNITS_29_97_FPS: |
310 | case MAD_UNITS_47_952_FPS: | 310 | case MAD_UNITS_47_952_FPS: |
311 | case MAD_UNITS_49_95_FPS: | 311 | case MAD_UNITS_49_95_FPS: |
312 | case MAD_UNITS_59_94_FPS: | 312 | case MAD_UNITS_59_94_FPS: |
313 | return (mad_timer_count(timer, -units) + 1) * 1000 / 1001; | 313 | return (mad_timer_count(timer, -units) + 1) * 1000 / 1001; |
314 | } | 314 | } |
315 | 315 | ||
316 | /* unsupported units */ | 316 | /* unsupported units */ |
317 | return 0; | 317 | return 0; |
318 | } | 318 | } |
319 | 319 | ||
320 | /* | 320 | /* |
321 | * NAME:timer->fraction() | 321 | * NAME:timer->fraction() |
322 | * DESCRIPTION:return fractional part of timer in arbitrary terms | 322 | * DESCRIPTION:return fractional part of timer in arbitrary terms |
323 | */ | 323 | */ |
324 | unsigned long mad_timer_fraction(mad_timer_t timer, unsigned long denom) | 324 | unsigned long mad_timer_fraction(mad_timer_t timer, unsigned long denom) |
325 | { | 325 | { |
326 | timer = mad_timer_abs(timer); | 326 | timer = mad_timer_abs(timer); |
327 | 327 | ||
328 | switch (denom) { | 328 | switch (denom) { |
329 | case 0: | 329 | case 0: |
330 | return MAD_TIMER_RESOLUTION / timer.fraction; | 330 | return timer.fraction ? |
331 | MAD_TIMER_RESOLUTION / timer.fraction : MAD_TIMER_RESOLUTION + 1; | ||
331 | 332 | ||
332 | case MAD_TIMER_RESOLUTION: | 333 | case MAD_TIMER_RESOLUTION: |
333 | return timer.fraction; | 334 | return timer.fraction; |
334 | 335 | ||
335 | default: | 336 | default: |
336 | return scale_rational(timer.fraction, MAD_TIMER_RESOLUTION, denom); | 337 | return scale_rational(timer.fraction, MAD_TIMER_RESOLUTION, denom); |
337 | } | 338 | } |
338 | } | 339 | } |
339 | 340 | ||
340 | /* | 341 | /* |
341 | * NAME:timer->string() | 342 | * NAME:timer->string() |
342 | * DESCRIPTION:write a string representation of a timer using a template | 343 | * DESCRIPTION:write a string representation of a timer using a template |
343 | */ | 344 | */ |
344 | void mad_timer_string(mad_timer_t timer, | 345 | void mad_timer_string(mad_timer_t timer, |
345 | char *dest, char const *format, enum mad_units units, | 346 | char *dest, char const *format, enum mad_units units, |
346 | enum mad_units fracunits, unsigned long subparts) | 347 | enum mad_units fracunits, unsigned long subparts) |
347 | { | 348 | { |
348 | unsigned long hours, minutes, seconds, sub; | 349 | unsigned long hours, minutes, seconds, sub; |
349 | unsigned int frac; | 350 | unsigned int frac; |
350 | 351 | ||
351 | timer = mad_timer_abs(timer); | 352 | timer = mad_timer_abs(timer); |
352 | 353 | ||
353 | seconds = timer.seconds; | 354 | seconds = timer.seconds; |
354 | frac = sub = 0; | 355 | frac = sub = 0; |
355 | 356 | ||
356 | switch (fracunits) { | 357 | switch (fracunits) { |
357 | case MAD_UNITS_HOURS: | 358 | case MAD_UNITS_HOURS: |
358 | case MAD_UNITS_MINUTES: | 359 | case MAD_UNITS_MINUTES: |
359 | case MAD_UNITS_SECONDS: | 360 | case MAD_UNITS_SECONDS: |
360 | break; | 361 | break; |
361 | 362 | ||
362 | case MAD_UNITS_DECISECONDS: | 363 | case MAD_UNITS_DECISECONDS: |
363 | case MAD_UNITS_CENTISECONDS: | 364 | case MAD_UNITS_CENTISECONDS: |
364 | case MAD_UNITS_MILLISECONDS: | 365 | case MAD_UNITS_MILLISECONDS: |
365 | 366 | ||
366 | case MAD_UNITS_8000_HZ: | 367 | case MAD_UNITS_8000_HZ: |
367 | case MAD_UNITS_11025_HZ: | 368 | case MAD_UNITS_11025_HZ: |
368 | case MAD_UNITS_12000_HZ: | 369 | case MAD_UNITS_12000_HZ: |
369 | case MAD_UNITS_16000_HZ: | 370 | case MAD_UNITS_16000_HZ: |
370 | case MAD_UNITS_22050_HZ: | 371 | case MAD_UNITS_22050_HZ: |
371 | case MAD_UNITS_24000_HZ: | 372 | case MAD_UNITS_24000_HZ: |
372 | case MAD_UNITS_32000_HZ: | 373 | case MAD_UNITS_32000_HZ: |
373 | case MAD_UNITS_44100_HZ: | 374 | case MAD_UNITS_44100_HZ: |
374 | case MAD_UNITS_48000_HZ: | 375 | case MAD_UNITS_48000_HZ: |
375 | 376 | ||
376 | case MAD_UNITS_24_FPS: | 377 | case MAD_UNITS_24_FPS: |
377 | case MAD_UNITS_25_FPS: | 378 | case MAD_UNITS_25_FPS: |
378 | case MAD_UNITS_30_FPS: | 379 | case MAD_UNITS_30_FPS: |
379 | case MAD_UNITS_48_FPS: | 380 | case MAD_UNITS_48_FPS: |
380 | case MAD_UNITS_50_FPS: | 381 | case MAD_UNITS_50_FPS: |
381 | case MAD_UNITS_60_FPS: | 382 | case MAD_UNITS_60_FPS: |
382 | case MAD_UNITS_75_FPS: | 383 | case MAD_UNITS_75_FPS: |
383 | { | 384 | { |
384 | unsigned long denom; | 385 | unsigned long denom; |
385 | 386 | ||
386 | denom = MAD_TIMER_RESOLUTION / fracunits; | 387 | denom = MAD_TIMER_RESOLUTION / fracunits; |
387 | 388 | ||
388 | frac = timer.fraction / denom; | 389 | frac = timer.fraction / denom; |
389 | sub = scale_rational(timer.fraction % denom, denom, subparts); | 390 | sub = scale_rational(timer.fraction % denom, denom, subparts); |
390 | } | 391 | } |
391 | break; | 392 | break; |
392 | 393 | ||
393 | case MAD_UNITS_23_976_FPS: | 394 | case MAD_UNITS_23_976_FPS: |
394 | case MAD_UNITS_24_975_FPS: | 395 | case MAD_UNITS_24_975_FPS: |
395 | case MAD_UNITS_29_97_FPS: | 396 | case MAD_UNITS_29_97_FPS: |
396 | case MAD_UNITS_47_952_FPS: | 397 | case MAD_UNITS_47_952_FPS: |
397 | case MAD_UNITS_49_95_FPS: | 398 | case MAD_UNITS_49_95_FPS: |
398 | case MAD_UNITS_59_94_FPS: | 399 | case MAD_UNITS_59_94_FPS: |
399 | /* drop-frame encoding */ | 400 | /* drop-frame encoding */ |
400 | /* N.B. this is only well-defined for MAD_UNITS_29_97_FPS */ | 401 | /* N.B. this is only well-defined for MAD_UNITS_29_97_FPS */ |
401 | { | 402 | { |
402 | unsigned long frame, cycle, d, m; | 403 | unsigned long frame, cycle, d, m; |
403 | 404 | ||
404 | frame = mad_timer_count(timer, fracunits); | 405 | frame = mad_timer_count(timer, fracunits); |
405 | 406 | ||
406 | cycle = -fracunits * 60 * 10 - (10 - 1) * 2; | 407 | cycle = -fracunits * 60 * 10 - (10 - 1) * 2; |
407 | 408 | ||
408 | d = frame / cycle; | 409 | d = frame / cycle; |
409 | m = frame % cycle; | 410 | m = frame % cycle; |
410 | frame += (10 - 1) * 2 * d; | 411 | frame += (10 - 1) * 2 * d; |
411 | if (m > 2) | 412 | if (m > 2) |
412 | frame += 2 * ((m - 2) / (cycle / 10)); | 413 | frame += 2 * ((m - 2) / (cycle / 10)); |
413 | 414 | ||
414 | frac = frame % -fracunits; | 415 | frac = frame % -fracunits; |
415 | seconds = frame / -fracunits; | 416 | seconds = frame / -fracunits; |
416 | } | 417 | } |
417 | break; | 418 | break; |
418 | } | 419 | } |
419 | 420 | ||
420 | switch (units) { | 421 | switch (units) { |
421 | case MAD_UNITS_HOURS: | 422 | case MAD_UNITS_HOURS: |
422 | minutes = seconds / 60; | 423 | minutes = seconds / 60; |
423 | hours = minutes / 60; | 424 | hours = minutes / 60; |
424 | 425 | ||
425 | sprintf(dest, format, | 426 | sprintf(dest, format, |
426 | hours, | 427 | hours, |
427 | (unsigned int) (minutes % 60), | 428 | (unsigned int) (minutes % 60), |
428 | (unsigned int) (seconds % 60), | 429 | (unsigned int) (seconds % 60), |
429 | frac, sub); | 430 | frac, sub); |
430 | break; | 431 | break; |
431 | 432 | ||
432 | case MAD_UNITS_MINUTES: | 433 | case MAD_UNITS_MINUTES: |
433 | minutes = seconds / 60; | 434 | minutes = seconds / 60; |
434 | 435 | ||
435 | sprintf(dest, format, | 436 | sprintf(dest, format, |
436 | minutes, | 437 | minutes, |
437 | (unsigned int) (seconds % 60), | 438 | (unsigned int) (seconds % 60), |
438 | frac, sub); | 439 | frac, sub); |
439 | break; | 440 | break; |
440 | 441 | ||
441 | case MAD_UNITS_SECONDS: | 442 | case MAD_UNITS_SECONDS: |
442 | sprintf(dest, format, | 443 | sprintf(dest, format, |
443 | seconds, | 444 | seconds, |
444 | frac, sub); | 445 | frac, sub); |
445 | break; | 446 | break; |
446 | 447 | ||
447 | case MAD_UNITS_23_976_FPS: | 448 | case MAD_UNITS_23_976_FPS: |
448 | case MAD_UNITS_24_975_FPS: | 449 | case MAD_UNITS_24_975_FPS: |
449 | case MAD_UNITS_29_97_FPS: | 450 | case MAD_UNITS_29_97_FPS: |
450 | case MAD_UNITS_47_952_FPS: | 451 | case MAD_UNITS_47_952_FPS: |
451 | case MAD_UNITS_49_95_FPS: | 452 | case MAD_UNITS_49_95_FPS: |
452 | case MAD_UNITS_59_94_FPS: | 453 | case MAD_UNITS_59_94_FPS: |
453 | if (fracunits < 0) { | 454 | if (fracunits < 0) { |
454 | /* not yet implemented */ | 455 | /* not yet implemented */ |
455 | sub = 0; | 456 | sub = 0; |
456 | } | 457 | } |
457 | 458 | ||
458 | /* fall through */ | 459 | /* fall through */ |
diff --git a/core/multimedia/opieplayer/libmad/timer.h b/core/multimedia/opieplayer/libmad/timer.h index f8afb8e..4f2be57 100644 --- a/core/multimedia/opieplayer/libmad/timer.h +++ b/core/multimedia/opieplayer/libmad/timer.h | |||
@@ -1,100 +1,100 @@ | |||
1 | /* | 1 | /* |
2 | * libmad - MPEG audio decoder library | 2 | * libmad - MPEG audio decoder library |
3 | * Copyright (C) 2000-2001 Robert Leslie | 3 | * Copyright (C) 2000-2004 Underbit Technologies, Inc. |
4 | * | 4 | * |
5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
7 | * the Free Software Foundation; either version 2 of the License, or | 7 | * the Free Software Foundation; either version 2 of the License, or |
8 | * (at your option) any later version. | 8 | * (at your option) any later version. |
9 | * | 9 | * |
10 | * This program is distributed in the hope that it will be useful, | 10 | * This program is distributed in the hope that it will be useful, |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | * GNU General Public License for more details. | 13 | * GNU General Public License for more details. |
14 | * | 14 | * |
15 | * You should have received a copy of the GNU General Public License | 15 | * You should have received a copy of the GNU General Public License |
16 | * along with this program; if not, write to the Free Software | 16 | * along with this program; if not, write to the Free Software |
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
18 | * | 18 | * |
19 | * $Id$ | 19 | * $Id$ |
20 | */ | 20 | */ |
21 | 21 | ||
22 | # ifndef LIBMAD_TIMER_H | 22 | # ifndef LIBMAD_TIMER_H |
23 | # define LIBMAD_TIMER_H | 23 | # define LIBMAD_TIMER_H |
24 | 24 | ||
25 | typedef struct { | 25 | typedef struct { |
26 | signed long seconds; /* whole seconds */ | 26 | signed long seconds; /* whole seconds */ |
27 | unsigned long fraction;/* 1/MAD_TIMER_RESOLUTION seconds */ | 27 | unsigned long fraction;/* 1/MAD_TIMER_RESOLUTION seconds */ |
28 | } mad_timer_t; | 28 | } mad_timer_t; |
29 | 29 | ||
30 | extern mad_timer_t const mad_timer_zero; | 30 | extern mad_timer_t const mad_timer_zero; |
31 | 31 | ||
32 | # define MAD_TIMER_RESOLUTION352800000UL | 32 | # define MAD_TIMER_RESOLUTION352800000UL |
33 | 33 | ||
34 | enum mad_units { | 34 | enum mad_units { |
35 | MAD_UNITS_HOURS = -2, | 35 | MAD_UNITS_HOURS = -2, |
36 | MAD_UNITS_MINUTES = -1, | 36 | MAD_UNITS_MINUTES = -1, |
37 | MAD_UNITS_SECONDS = 0, | 37 | MAD_UNITS_SECONDS = 0, |
38 | 38 | ||
39 | /* metric units */ | 39 | /* metric units */ |
40 | 40 | ||
41 | MAD_UNITS_DECISECONDS = 10, | 41 | MAD_UNITS_DECISECONDS = 10, |
42 | MAD_UNITS_CENTISECONDS = 100, | 42 | MAD_UNITS_CENTISECONDS = 100, |
43 | MAD_UNITS_MILLISECONDS = 1000, | 43 | MAD_UNITS_MILLISECONDS = 1000, |
44 | 44 | ||
45 | /* audio sample units */ | 45 | /* audio sample units */ |
46 | 46 | ||
47 | MAD_UNITS_8000_HZ = 8000, | 47 | MAD_UNITS_8000_HZ = 8000, |
48 | MAD_UNITS_11025_HZ = 11025, | 48 | MAD_UNITS_11025_HZ = 11025, |
49 | MAD_UNITS_12000_HZ = 12000, | 49 | MAD_UNITS_12000_HZ = 12000, |
50 | 50 | ||
51 | MAD_UNITS_16000_HZ = 16000, | 51 | MAD_UNITS_16000_HZ = 16000, |
52 | MAD_UNITS_22050_HZ = 22050, | 52 | MAD_UNITS_22050_HZ = 22050, |
53 | MAD_UNITS_24000_HZ = 24000, | 53 | MAD_UNITS_24000_HZ = 24000, |
54 | 54 | ||
55 | MAD_UNITS_32000_HZ = 32000, | 55 | MAD_UNITS_32000_HZ = 32000, |
56 | MAD_UNITS_44100_HZ = 44100, | 56 | MAD_UNITS_44100_HZ = 44100, |
57 | MAD_UNITS_48000_HZ = 48000, | 57 | MAD_UNITS_48000_HZ = 48000, |
58 | 58 | ||
59 | /* video frame/field units */ | 59 | /* video frame/field units */ |
60 | 60 | ||
61 | MAD_UNITS_24_FPS = 24, | 61 | MAD_UNITS_24_FPS = 24, |
62 | MAD_UNITS_25_FPS = 25, | 62 | MAD_UNITS_25_FPS = 25, |
63 | MAD_UNITS_30_FPS = 30, | 63 | MAD_UNITS_30_FPS = 30, |
64 | MAD_UNITS_48_FPS = 48, | 64 | MAD_UNITS_48_FPS = 48, |
65 | MAD_UNITS_50_FPS = 50, | 65 | MAD_UNITS_50_FPS = 50, |
66 | MAD_UNITS_60_FPS = 60, | 66 | MAD_UNITS_60_FPS = 60, |
67 | 67 | ||
68 | /* CD audio frames */ | 68 | /* CD audio frames */ |
69 | 69 | ||
70 | MAD_UNITS_75_FPS = 75, | 70 | MAD_UNITS_75_FPS = 75, |
71 | 71 | ||
72 | /* video drop-frame units */ | 72 | /* video drop-frame units */ |
73 | 73 | ||
74 | MAD_UNITS_23_976_FPS = -24, | 74 | MAD_UNITS_23_976_FPS = -24, |
75 | MAD_UNITS_24_975_FPS = -25, | 75 | MAD_UNITS_24_975_FPS = -25, |
76 | MAD_UNITS_29_97_FPS = -30, | 76 | MAD_UNITS_29_97_FPS = -30, |
77 | MAD_UNITS_47_952_FPS = -48, | 77 | MAD_UNITS_47_952_FPS = -48, |
78 | MAD_UNITS_49_95_FPS = -50, | 78 | MAD_UNITS_49_95_FPS = -50, |
79 | MAD_UNITS_59_94_FPS = -60 | 79 | MAD_UNITS_59_94_FPS = -60 |
80 | }; | 80 | }; |
81 | 81 | ||
82 | # define mad_timer_reset(timer)((void) (*(timer) = mad_timer_zero)) | 82 | # define mad_timer_reset(timer)((void) (*(timer) = mad_timer_zero)) |
83 | 83 | ||
84 | int mad_timer_compare(mad_timer_t, mad_timer_t); | 84 | int mad_timer_compare(mad_timer_t, mad_timer_t); |
85 | 85 | ||
86 | # define mad_timer_sign(timer)mad_timer_compare((timer), mad_timer_zero) | 86 | # define mad_timer_sign(timer)mad_timer_compare((timer), mad_timer_zero) |
87 | 87 | ||
88 | void mad_timer_negate(mad_timer_t *); | 88 | void mad_timer_negate(mad_timer_t *); |
89 | mad_timer_t mad_timer_abs(mad_timer_t); | 89 | mad_timer_t mad_timer_abs(mad_timer_t); |
90 | 90 | ||
91 | void mad_timer_set(mad_timer_t *, unsigned long, unsigned long, unsigned long); | 91 | void mad_timer_set(mad_timer_t *, unsigned long, unsigned long, unsigned long); |
92 | void mad_timer_add(mad_timer_t *, mad_timer_t); | 92 | void mad_timer_add(mad_timer_t *, mad_timer_t); |
93 | void mad_timer_multiply(mad_timer_t *, signed long); | 93 | void mad_timer_multiply(mad_timer_t *, signed long); |
94 | 94 | ||
95 | signed long mad_timer_count(mad_timer_t, enum mad_units); | 95 | signed long mad_timer_count(mad_timer_t, enum mad_units); |
96 | unsigned long mad_timer_fraction(mad_timer_t, unsigned long); | 96 | unsigned long mad_timer_fraction(mad_timer_t, unsigned long); |
97 | void mad_timer_string(mad_timer_t, char *, char const *, | 97 | void mad_timer_string(mad_timer_t, char *, char const *, |
98 | enum mad_units, enum mad_units, unsigned long); | 98 | enum mad_units, enum mad_units, unsigned long); |
99 | 99 | ||
100 | # endif | 100 | # endif |
diff --git a/core/multimedia/opieplayer/libmad/version.c b/core/multimedia/opieplayer/libmad/version.c index fb126f4..4fbef23 100644 --- a/core/multimedia/opieplayer/libmad/version.c +++ b/core/multimedia/opieplayer/libmad/version.c | |||
@@ -1,91 +1,91 @@ | |||
1 | /* | 1 | /* |
2 | * libmad - MPEG audio decoder library | 2 | * libmad - MPEG audio decoder library |
3 | * Copyright (C) 2000-2001 Robert Leslie | 3 | * Copyright (C) 2000-2004 Underbit Technologies, Inc. |
4 | * | 4 | * |
5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
6 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
7 | * the Free Software Foundation; either version 2 of the License, or | 7 | * the Free Software Foundation; either version 2 of the License, or |
8 | * (at your option) any later version. | 8 | * (at your option) any later version. |
9 | * | 9 | * |
10 | * This program is distributed in the hope that it will be useful, | 10 | * This program is distributed in the hope that it will be useful, |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 | * GNU General Public License for more details. | 13 | * GNU General Public License for more details. |
14 | * | 14 | * |
15 | * You should have received a copy of the GNU General Public License | 15 | * You should have received a copy of the GNU General Public License |
16 | * along with this program; if not, write to the Free Software | 16 | * along with this program; if not, write to the Free Software |
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
18 | * | 18 | * |
19 | * $Id$ | 19 | * $Id$ |
20 | */ | 20 | */ |
21 | 21 | ||
22 | # ifdef HAVE_CONFIG_H | 22 | # ifdef HAVE_CONFIG_H |
23 | # include "libmad_config.h" | 23 | # include "libmad_config.h" |
24 | # endif | 24 | # endif |
25 | 25 | ||
26 | # include "libmad_global.h" | 26 | # include "libmad_global.h" |
27 | 27 | ||
28 | # include "libmad_version.h" | 28 | # include "libmad_version.h" |
29 | 29 | ||
30 | char const mad_version[] = "MPEG Audio Decoder " MAD_VERSION; | 30 | char const mad_version[] = "MPEG Audio Decoder " MAD_VERSION; |
31 | char const mad_copyright[] = "Copyright (C) " MAD_PUBLISHYEAR " " MAD_AUTHOR; | 31 | char const mad_copyright[] = "Copyright (C) " MAD_PUBLISHYEAR " " MAD_AUTHOR; |
32 | char const mad_author[] = MAD_AUTHOR " <" MAD_EMAIL ">"; | 32 | char const mad_author[] = MAD_AUTHOR " <" MAD_EMAIL ">"; |
33 | 33 | ||
34 | char const mad_build[] = "" | 34 | char const mad_build[] = "" |
35 | # if defined(DEBUG) | ||
36 | "DEBUG " | ||
37 | # elif defined(NDEBUG) | ||
38 | "NDEBUG " | ||
39 | # endif | ||
40 | |||
41 | # if defined(EXPERIMENTAL) | ||
42 | "EXPERIMENTAL " | ||
43 | # endif | ||
44 | |||
35 | # if defined(FPM_64BIT) | 45 | # if defined(FPM_64BIT) |
36 | "FPM_64BIT " | 46 | "FPM_64BIT " |
37 | # elif defined(FPM_INTEL) | 47 | # elif defined(FPM_INTEL) |
38 | "FPM_INTEL " | 48 | "FPM_INTEL " |
39 | # elif defined(FPM_ARM) | 49 | # elif defined(FPM_ARM) |
40 | "FPM_ARM " | 50 | "FPM_ARM " |
41 | # elif defined(FPM_MIPS) | 51 | # elif defined(FPM_MIPS) |
42 | "FPM_MIPS " | 52 | "FPM_MIPS " |
43 | # elif defined(FPM_SPARC) | 53 | # elif defined(FPM_SPARC) |
44 | "FPM_SPARC " | 54 | "FPM_SPARC " |
45 | # elif defined(FPM_PPC) | 55 | # elif defined(FPM_PPC) |
46 | "FPM_PPC " | 56 | "FPM_PPC " |
47 | # elif defined(FPM_DEFAULT) | 57 | # elif defined(FPM_DEFAULT) |
48 | "FPM_DEFAULT " | 58 | "FPM_DEFAULT " |
49 | # endif | 59 | # endif |
50 | 60 | ||
51 | # if defined(ASO_IMDCT) | 61 | # if defined(ASO_IMDCT) |
52 | "ASO_IMDCT " | 62 | "ASO_IMDCT " |
53 | # endif | 63 | # endif |
54 | # if defined(ASO_INTERLEAVE1) | 64 | # if defined(ASO_INTERLEAVE1) |
55 | "ASO_INTERLEAVE1 " | 65 | "ASO_INTERLEAVE1 " |
56 | # endif | 66 | # endif |
57 | # if defined(ASO_INTERLEAVE2) | 67 | # if defined(ASO_INTERLEAVE2) |
58 | "ASO_INTERLEAVE2 " | 68 | "ASO_INTERLEAVE2 " |
59 | # endif | 69 | # endif |
60 | # if defined(ASO_ZEROCHECK) | 70 | # if defined(ASO_ZEROCHECK) |
61 | "ASO_ZEROCHECK " | 71 | "ASO_ZEROCHECK " |
62 | # endif | 72 | # endif |
63 | 73 | ||
64 | # if defined(OPT_SPEED) | 74 | # if defined(OPT_SPEED) |
65 | "OPT_SPEED " | 75 | "OPT_SPEED " |
66 | # elif defined(OPT_ACCURACY) | 76 | # elif defined(OPT_ACCURACY) |
67 | "OPT_ACCURACY " | 77 | "OPT_ACCURACY " |
68 | # endif | 78 | # endif |
69 | 79 | ||
70 | # if defined(OPT_SSO) | 80 | # if defined(OPT_SSO) |
71 | "OPT_SSO " | 81 | "OPT_SSO " |
72 | # endif | 82 | # endif |
73 | 83 | ||
74 | # if defined(OPT_DCTO) /* never defined here */ | 84 | # if defined(OPT_DCTO) /* never defined here */ |
75 | "OPT_DCTO " | 85 | "OPT_DCTO " |
76 | # endif | 86 | # endif |
77 | 87 | ||
78 | # if defined(OPT_STRICT) | 88 | # if defined(OPT_STRICT) |
79 | "OPT_STRICT " | 89 | "OPT_STRICT " |
80 | # endif | 90 | # endif |
81 | |||
82 | # if defined(EXPERIMENTAL) | ||
83 | "EXPERIMENTAL " | ||
84 | # endif | ||
85 | |||
86 | # if defined(DEBUG) | ||
87 | "DEBUG " | ||
88 | # elif defined(NDEBUG) | ||
89 | "NDEBUG " | ||
90 | # endif | ||
91 | ; | 91 | ; |