1 /*
2 Copyright (c) 2005-2009, The Musepack Development Team
3 All rights reserved.
4
5 Redistribution and use in source and binary forms, with or without
6 modification, are permitted provided that the following conditions are
7 met:
8
9 * Redistributions of source code must retain the above copyright
10 notice, this list of conditions and the following disclaimer.
11
12 * Redistributions in binary form must reproduce the above
13 copyright notice, this list of conditions and the following
14 disclaimer in the documentation and/or other materials provided
15 with the distribution.
16
17 * Neither the name of the The Musepack Development Team nor the
18 names of its contributors may be used to endorse or promote
19 products derived from this software without specific prior
20 written permission.
21
22 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
25 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
26 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
27 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
28 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 */
34 /// \file synth_filter.c
35 /// Synthesis functions.
36 /// \todo document me
37 #include <string.h>
38 #include "mpcdec.h"
39 #include "decoder.h"
40 #include "mpcdec_math.h"
41
42 /* C O N S T A N T S */
43 #define MPC_FIXED_POINT_SYNTH_FIX 2
44
45 #undef _
46 #ifdef MPC_FIXED_POINT
47 #define _(value) MPC_MAKE_FRACT_CONST((double)value/(double)(0x40000))
48 #else
49 #define _(value) MAKE_MPC_SAMPLE((double)value/(double)(0x10000))
50 #endif
51
52
53 static const MPC_SAMPLE_FORMAT Di_opt [32] [16] = {
54 { _( 0), _( -29), _( 213), _( -459), _( 2037), _(-5153), _( 6574), _(-37489), _(75038), _(37489), _(6574), _( 5153), _(2037), _( 459), _(213), _(29) },
55 { _( -1), _( -31), _( 218), _( -519), _( 2000), _(-5517), _( 5959), _(-39336), _(74992), _(35640), _(7134), _( 4788), _(2063), _( 401), _(208), _(26) },
56 { _( -1), _( -35), _( 222), _( -581), _( 1952), _(-5879), _( 5288), _(-41176), _(74856), _(33791), _(7640), _( 4425), _(2080), _( 347), _(202), _(24) },
57 { _( -1), _( -38), _( 225), _( -645), _( 1893), _(-6237), _( 4561), _(-43006), _(74630), _(31947), _(8092), _( 4063), _(2087), _( 294), _(196), _(21) },
58 { _( -1), _( -41), _( 227), _( -711), _( 1822), _(-6589), _( 3776), _(-44821), _(74313), _(30112), _(8492), _( 3705), _(2085), _( 244), _(190), _(19) },
59 { _( -1), _( -45), _( 228), _( -779), _( 1739), _(-6935), _( 2935), _(-46617), _(73908), _(28289), _(8840), _( 3351), _(2075), _( 197), _(183), _(17) },
60 { _( -1), _( -49), _( 228), _( -848), _( 1644), _(-7271), _( 2037), _(-48390), _(73415), _(26482), _(9139), _( 3004), _(2057), _( 153), _(176), _(16) },
61 { _( -2), _( -53), _( 227), _( -919), _( 1535), _(-7597), _( 1082), _(-50137), _(72835), _(24694), _(9389), _( 2663), _(2032), _( 111), _(169), _(14) },
62 { _( -2), _( -58), _( 224), _( -991), _( 1414), _(-7910), _( 70), _(-51853), _(72169), _(22929), _(9592), _( 2330), _(2001), _( 72), _(161), _(13) },
63 { _( -2), _( -63), _( 221), _(-1064), _( 1280), _(-8209), _( -998), _(-53534), _(71420), _(21189), _(9750), _( 2006), _(1962), _( 36), _(154), _(11) },
64 { _( -2), _( -68), _( 215), _(-1137), _( 1131), _(-8491), _( -2122), _(-55178), _(70590), _(19478), _(9863), _( 1692), _(1919), _( 2), _(147), _(10) },
65 { _( -3), _( -73), _( 208), _(-1210), _( 970), _(-8755), _( -3300), _(-56778), _(69679), _(17799), _(9935), _( 1388), _(1870), _( -29), _(139), _( 9) },
66 { _( -3), _( -79), _( 200), _(-1283), _( 794), _(-8998), _( -4533), _(-58333), _(68692), _(16155), _(9966), _( 1095), _(1817), _( -57), _(132), _( 8) },
67 { _( -4), _( -85), _( 189), _(-1356), _( 605), _(-9219), _( -5818), _(-59838), _(67629), _(14548), _(9959), _( 814), _(1759), _( -83), _(125), _( 7) },
68 { _( -4), _( -91), _( 177), _(-1428), _( 402), _(-9416), _( -7154), _(-61289), _(66494), _(12980), _(9916), _( 545), _(1698), _(-106), _(117), _( 7) },
69 { _( -5), _( -97), _( 163), _(-1498), _( 185), _(-9585), _( -8540), _(-62684), _(65290), _(11455), _(9838), _( 288), _(1634), _(-127), _(111), _( 6) },
70 { _( -5), _(-104), _( 146), _(-1567), _( -45), _(-9727), _( -9975), _(-64019), _(64019), _( 9975), _(9727), _( 45), _(1567), _(-146), _(104), _( 5) },
71 { _( -6), _(-111), _( 127), _(-1634), _( -288), _(-9838), _(-11455), _(-65290), _(62684), _( 8540), _(9585), _( -185), _(1498), _(-163), _( 97), _( 5) },
72 { _( -7), _(-117), _( 106), _(-1698), _( -545), _(-9916), _(-12980), _(-66494), _(61289), _( 7154), _(9416), _( -402), _(1428), _(-177), _( 91), _( 4) },
73 { _( -7), _(-125), _( 83), _(-1759), _( -814), _(-9959), _(-14548), _(-67629), _(59838), _( 5818), _(9219), _( -605), _(1356), _(-189), _( 85), _( 4) },
74 { _( -8), _(-132), _( 57), _(-1817), _(-1095), _(-9966), _(-16155), _(-68692), _(58333), _( 4533), _(8998), _( -794), _(1283), _(-200), _( 79), _( 3) },
75 { _( -9), _(-139), _( 29), _(-1870), _(-1388), _(-9935), _(-17799), _(-69679), _(56778), _( 3300), _(8755), _( -970), _(1210), _(-208), _( 73), _( 3) },
76 { _(-10), _(-147), _( -2), _(-1919), _(-1692), _(-9863), _(-19478), _(-70590), _(55178), _( 2122), _(8491), _(-1131), _(1137), _(-215), _( 68), _( 2) },
77 { _(-11), _(-154), _( -36), _(-1962), _(-2006), _(-9750), _(-21189), _(-71420), _(53534), _( 998), _(8209), _(-1280), _(1064), _(-221), _( 63), _( 2) },
78 { _(-13), _(-161), _( -72), _(-2001), _(-2330), _(-9592), _(-22929), _(-72169), _(51853), _( -70), _(7910), _(-1414), _( 991), _(-224), _( 58), _( 2) },
79 { _(-14), _(-169), _(-111), _(-2032), _(-2663), _(-9389), _(-24694), _(-72835), _(50137), _(-1082), _(7597), _(-1535), _( 919), _(-227), _( 53), _( 2) },
80 { _(-16), _(-176), _(-153), _(-2057), _(-3004), _(-9139), _(-26482), _(-73415), _(48390), _(-2037), _(7271), _(-1644), _( 848), _(-228), _( 49), _( 1) },
81 { _(-17), _(-183), _(-197), _(-2075), _(-3351), _(-8840), _(-28289), _(-73908), _(46617), _(-2935), _(6935), _(-1739), _( 779), _(-228), _( 45), _( 1) },
82 { _(-19), _(-190), _(-244), _(-2085), _(-3705), _(-8492), _(-30112), _(-74313), _(44821), _(-3776), _(6589), _(-1822), _( 711), _(-227), _( 41), _( 1) },
83 { _(-21), _(-196), _(-294), _(-2087), _(-4063), _(-8092), _(-31947), _(-74630), _(43006), _(-4561), _(6237), _(-1893), _( 645), _(-225), _( 38), _( 1) },
84 { _(-24), _(-202), _(-347), _(-2080), _(-4425), _(-7640), _(-33791), _(-74856), _(41176), _(-5288), _(5879), _(-1952), _( 581), _(-222), _( 35), _( 1) },
85 { _(-26), _(-208), _(-401), _(-2063), _(-4788), _(-7134), _(-35640), _(-74992), _(39336), _(-5959), _(5517), _(-2000), _( 519), _(-218), _( 31), _( 1) }
86 };
87
88 #undef _
89
90 static void
mpc_compute_new_V(const MPC_SAMPLE_FORMAT * p_sample,MPC_SAMPLE_FORMAT * pV)91 mpc_compute_new_V(const MPC_SAMPLE_FORMAT* p_sample, MPC_SAMPLE_FORMAT* pV)
92 {
93 // Calculating new V-buffer values for left channel
94 // calculate new V-values (ISO-11172-3, p. 39)
95 // based upon fast-MDCT algorithm by Byeong Gi Lee
96 MPC_SAMPLE_FORMAT A00, A01, A02, A03, A04, A05, A06, A07, A08, A09, A10, A11, A12, A13, A14, A15;
97 MPC_SAMPLE_FORMAT B00, B01, B02, B03, B04, B05, B06, B07, B08, B09, B10, B11, B12, B13, B14, B15;
98 MPC_SAMPLE_FORMAT tmp;
99
100 A00 = p_sample[ 0] + p_sample[31];
101 A01 = p_sample[ 1] + p_sample[30];
102 A02 = p_sample[ 2] + p_sample[29];
103 A03 = p_sample[ 3] + p_sample[28];
104 A04 = p_sample[ 4] + p_sample[27];
105 A05 = p_sample[ 5] + p_sample[26];
106 A06 = p_sample[ 6] + p_sample[25];
107 A07 = p_sample[ 7] + p_sample[24];
108 A08 = p_sample[ 8] + p_sample[23];
109 A09 = p_sample[ 9] + p_sample[22];
110 A10 = p_sample[10] + p_sample[21];
111 A11 = p_sample[11] + p_sample[20];
112 A12 = p_sample[12] + p_sample[19];
113 A13 = p_sample[13] + p_sample[18];
114 A14 = p_sample[14] + p_sample[17];
115 A15 = p_sample[15] + p_sample[16];
116
117 B00 = A00 + A15;
118 B01 = A01 + A14;
119 B02 = A02 + A13;
120 B03 = A03 + A12;
121 B04 = A04 + A11;
122 B05 = A05 + A10;
123 B06 = A06 + A09;
124 B07 = A07 + A08;;
125 B08 = MPC_SCALE_CONST((A00 - A15) , 0.5024192929f , 31);
126 B09 = MPC_SCALE_CONST((A01 - A14) , 0.5224986076f , 31);
127 B10 = MPC_SCALE_CONST((A02 - A13) , 0.5669440627f , 31);
128 B11 = MPC_SCALE_CONST((A03 - A12) , 0.6468217969f , 31);
129 B12 = MPC_SCALE_CONST((A04 - A11) , 0.7881546021f , 31);
130 B13 = MPC_SCALE_CONST((A05 - A10) , 1.0606776476f , 30);
131 B14 = MPC_SCALE_CONST((A06 - A09) , 1.7224471569f , 30);
132 B15 = MPC_SCALE_CONST((A07 - A08) , 5.1011486053f , 28);
133
134 A00 = B00 + B07;
135 A01 = B01 + B06;
136 A02 = B02 + B05;
137 A03 = B03 + B04;
138 A04 = MPC_SCALE_CONST((B00 - B07) , 0.5097956061f , 31);
139 A05 = MPC_SCALE_CONST((B01 - B06) , 0.6013448834f , 31);
140 A06 = MPC_SCALE_CONST((B02 - B05) , 0.8999761939f , 31);
141 A07 = MPC_SCALE_CONST((B03 - B04) , 2.5629155636f , 29);
142 A08 = B08 + B15;
143 A09 = B09 + B14;
144 A10 = B10 + B13;
145 A11 = B11 + B12;
146 A12 = MPC_SCALE_CONST((B08 - B15) , 0.5097956061f , 31);
147 A13 = MPC_SCALE_CONST((B09 - B14) , 0.6013448834f , 31);
148 A14 = MPC_SCALE_CONST((B10 - B13) , 0.8999761939f , 31);
149 A15 = MPC_SCALE_CONST((B11 - B12) , 2.5629155636f , 29);
150
151 B00 = A00 + A03;
152 B01 = A01 + A02;
153 B02 = MPC_MULTIPLY_FRACT_CONST_FIX((A00 - A03) , 0.5411961079f , 1);
154 B03 = MPC_MULTIPLY_FRACT_CONST_FIX((A01 - A02) , 1.3065630198f , 2);
155 B04 = A04 + A07;
156 B05 = A05 + A06;
157 B06 = MPC_MULTIPLY_FRACT_CONST_FIX((A04 - A07) , 0.5411961079f , 1);
158 B07 = MPC_MULTIPLY_FRACT_CONST_FIX((A05 - A06) , 1.3065630198f , 2);
159 B08 = A08 + A11;
160 B09 = A09 + A10;
161 B10 = MPC_MULTIPLY_FRACT_CONST_FIX((A08 - A11) , 0.5411961079f , 1);
162 B11 = MPC_MULTIPLY_FRACT_CONST_FIX((A09 - A10) , 1.3065630198f , 2);
163 B12 = A12 + A15;
164 B13 = A13 + A14;
165 B14 = MPC_MULTIPLY_FRACT_CONST_FIX((A12 - A15) , 0.5411961079f , 1);
166 B15 = MPC_MULTIPLY_FRACT_CONST_FIX((A13 - A14) , 1.3065630198f , 2);
167
168 A00 = B00 + B01;
169 A01 = MPC_MULTIPLY_FRACT_CONST_FIX((B00 - B01) , 0.7071067691f , 1);
170 A02 = B02 + B03;
171 A03 = MPC_MULTIPLY_FRACT_CONST_FIX((B02 - B03) , 0.7071067691f , 1);
172 A04 = B04 + B05;
173 A05 = MPC_MULTIPLY_FRACT_CONST_FIX((B04 - B05) , 0.7071067691f , 1);
174 A06 = B06 + B07;
175 A07 = MPC_MULTIPLY_FRACT_CONST_FIX((B06 - B07) , 0.7071067691f , 1);
176 A08 = B08 + B09;
177 A09 = MPC_MULTIPLY_FRACT_CONST_FIX((B08 - B09) , 0.7071067691f , 1);
178 A10 = B10 + B11;
179 A11 = MPC_MULTIPLY_FRACT_CONST_FIX((B10 - B11) , 0.7071067691f , 1);
180 A12 = B12 + B13;
181 A13 = MPC_MULTIPLY_FRACT_CONST_FIX((B12 - B13) , 0.7071067691f , 1);
182 A14 = B14 + B15;
183 A15 = MPC_MULTIPLY_FRACT_CONST_FIX((B14 - B15) , 0.7071067691f , 1);
184
185 pV[48] = -A00;
186 pV[ 0] = A01;
187 pV[40] = -A02 - (pV[ 8] = A03);
188 pV[36] = -((pV[ 4] = A05 + (pV[12] = A07)) + A06);
189 pV[44] = - A04 - A06 - A07;
190 pV[ 6] = (pV[10] = A11 + (pV[14] = A15)) + A13;
191 pV[38] = (pV[34] = -(pV[ 2] = A09 + A13 + A15) - A14) + A09 - A10 - A11;
192 pV[46] = (tmp = -(A12 + A14 + A15)) - A08;
193 pV[42] = tmp - A10 - A11;
194
195 A00 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 0] - p_sample[31]) , 0.5006030202f , MPC_FIXED_POINT_SYNTH_FIX);
196 A01 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 1] - p_sample[30]) , 0.5054709315f , MPC_FIXED_POINT_SYNTH_FIX);
197 A02 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 2] - p_sample[29]) , 0.5154473186f , MPC_FIXED_POINT_SYNTH_FIX);
198 A03 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 3] - p_sample[28]) , 0.5310425758f , MPC_FIXED_POINT_SYNTH_FIX);
199 A04 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 4] - p_sample[27]) , 0.5531039238f , MPC_FIXED_POINT_SYNTH_FIX);
200 A05 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 5] - p_sample[26]) , 0.5829349756f , MPC_FIXED_POINT_SYNTH_FIX);
201 A06 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 6] - p_sample[25]) , 0.6225041151f , MPC_FIXED_POINT_SYNTH_FIX);
202 A07 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 7] - p_sample[24]) , 0.6748083234f , MPC_FIXED_POINT_SYNTH_FIX);
203 A08 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 8] - p_sample[23]) , 0.7445362806f , MPC_FIXED_POINT_SYNTH_FIX);
204 A09 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 9] - p_sample[22]) , 0.8393496275f , MPC_FIXED_POINT_SYNTH_FIX);
205 A10 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[10] - p_sample[21]) , 0.9725682139f , MPC_FIXED_POINT_SYNTH_FIX);
206 #if MPC_FIXED_POINT_SYNTH_FIX>=2
207 A11 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[11] - p_sample[20]) , 1.1694399118f , MPC_FIXED_POINT_SYNTH_FIX);
208 A12 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[12] - p_sample[19]) , 1.4841645956f , MPC_FIXED_POINT_SYNTH_FIX);
209 #else
210 A11 = MPC_SCALE_CONST_SHR ((p_sample[11] - p_sample[20]) , 1.1694399118f , 30, MPC_FIXED_POINT_SYNTH_FIX);
211 A12 = MPC_SCALE_CONST_SHR ((p_sample[12] - p_sample[19]) , 1.4841645956f , 30, MPC_FIXED_POINT_SYNTH_FIX);
212 #endif
213 A13 = MPC_SCALE_CONST_SHR ((p_sample[13] - p_sample[18]) , 2.0577809811f , 29, MPC_FIXED_POINT_SYNTH_FIX);
214 A14 = MPC_SCALE_CONST_SHR ((p_sample[14] - p_sample[17]) , 3.4076085091f , 29, MPC_FIXED_POINT_SYNTH_FIX);
215 A15 = MPC_SCALE_CONST_SHR ((p_sample[15] - p_sample[16]) , 10.1900081635f, 27 ,MPC_FIXED_POINT_SYNTH_FIX);
216
217 B00 = A00 + A15;
218 B01 = A01 + A14;
219 B02 = A02 + A13;
220 B03 = A03 + A12;
221 B04 = A04 + A11;
222 B05 = A05 + A10;
223 B06 = A06 + A09;
224 B07 = A07 + A08;
225 B08 = MPC_SCALE_CONST((A00 - A15) , 0.5024192929f , 31);
226 B09 = MPC_SCALE_CONST((A01 - A14) , 0.5224986076f , 31);
227 B10 = MPC_SCALE_CONST((A02 - A13) , 0.5669440627f , 31);
228 B11 = MPC_SCALE_CONST((A03 - A12) , 0.6468217969f , 31);
229 B12 = MPC_SCALE_CONST((A04 - A11) , 0.7881546021f , 31);
230 B13 = MPC_SCALE_CONST((A05 - A10) , 1.0606776476f , 30);
231 B14 = MPC_SCALE_CONST((A06 - A09) , 1.7224471569f , 30);
232 B15 = MPC_SCALE_CONST((A07 - A08) , 5.1011486053f , 28);
233
234 A00 = B00 + B07;
235 A01 = B01 + B06;
236 A02 = B02 + B05;
237 A03 = B03 + B04;
238 A04 = MPC_SCALE_CONST((B00 - B07) , 0.5097956061f , 31);
239 A05 = MPC_SCALE_CONST((B01 - B06) , 0.6013448834f , 31);
240 A06 = MPC_SCALE_CONST((B02 - B05) , 0.8999761939f , 31);
241 A07 = MPC_SCALE_CONST((B03 - B04) , 2.5629155636f , 29);
242 A08 = B08 + B15;
243 A09 = B09 + B14;
244 A10 = B10 + B13;
245 A11 = B11 + B12;
246 A12 = MPC_SCALE_CONST((B08 - B15) , 0.5097956061f , 31);
247 A13 = MPC_SCALE_CONST((B09 - B14) , 0.6013448834f , 31);
248 A14 = MPC_SCALE_CONST((B10 - B13) , 0.8999761939f , 31);
249 A15 = MPC_SCALE_CONST((B11 - B12) , 2.5629155636f , 29);
250
251 B00 = A00 + A03;
252 B01 = A01 + A02;
253 B02 = MPC_SCALE_CONST((A00 - A03) , 0.5411961079f , 31);
254 B03 = MPC_SCALE_CONST((A01 - A02) , 1.3065630198f , 30);
255 B04 = A04 + A07;
256 B05 = A05 + A06;
257 B06 = MPC_SCALE_CONST((A04 - A07) , 0.5411961079f , 31);
258 B07 = MPC_SCALE_CONST((A05 - A06) , 1.3065630198f , 30);
259 B08 = A08 + A11;
260 B09 = A09 + A10;
261 B10 = MPC_SCALE_CONST((A08 - A11) , 0.5411961079f , 31);
262 B11 = MPC_SCALE_CONST((A09 - A10) , 1.3065630198f , 30);
263 B12 = A12 + A15;
264 B13 = A13 + A14;
265 B14 = MPC_SCALE_CONST((A12 - A15) , 0.5411961079f , 31);
266 B15 = MPC_SCALE_CONST((A13 - A14) , 1.3065630198f , 30);
267
268 A00 = MPC_SHL(B00 + B01, MPC_FIXED_POINT_SYNTH_FIX);
269 A01 = MPC_SCALE_CONST_SHL((B00 - B01) , 0.7071067691f , 31, MPC_FIXED_POINT_SYNTH_FIX);
270 A02 = MPC_SHL(B02 + B03, MPC_FIXED_POINT_SYNTH_FIX);
271 A03 = MPC_SCALE_CONST_SHL((B02 - B03) , 0.7071067691f , 31, MPC_FIXED_POINT_SYNTH_FIX);
272 A04 = MPC_SHL(B04 + B05, MPC_FIXED_POINT_SYNTH_FIX);
273 A05 = MPC_SCALE_CONST_SHL((B04 - B05) , 0.7071067691f , 31, MPC_FIXED_POINT_SYNTH_FIX);
274 A06 = MPC_SHL(B06 + B07, MPC_FIXED_POINT_SYNTH_FIX);
275 A07 = MPC_SCALE_CONST_SHL((B06 - B07) , 0.7071067691f , 31, MPC_FIXED_POINT_SYNTH_FIX);
276 A08 = MPC_SHL(B08 + B09, MPC_FIXED_POINT_SYNTH_FIX);
277 A09 = MPC_SCALE_CONST_SHL((B08 - B09) , 0.7071067691f , 31, MPC_FIXED_POINT_SYNTH_FIX);
278 A10 = MPC_SHL(B10 + B11, MPC_FIXED_POINT_SYNTH_FIX);
279 A11 = MPC_SCALE_CONST_SHL((B10 - B11) , 0.7071067691f , 31, MPC_FIXED_POINT_SYNTH_FIX);
280 A12 = MPC_SHL(B12 + B13, MPC_FIXED_POINT_SYNTH_FIX);
281 A13 = MPC_SCALE_CONST_SHL((B12 - B13) , 0.7071067691f , 31, MPC_FIXED_POINT_SYNTH_FIX);
282 A14 = MPC_SHL(B14 + B15, MPC_FIXED_POINT_SYNTH_FIX);
283 A15 = MPC_SCALE_CONST_SHL((B14 - B15) , 0.7071067691f , 31, MPC_FIXED_POINT_SYNTH_FIX);
284
285 // mehrfach verwendete Ausdrcke: A04+A06+A07, A09+A13+A15
286 pV[ 5] = (pV[11] = (pV[13] = A07 + (pV[15] = A15)) + A11) + A05 + A13;
287 pV[ 7] = (pV[ 9] = A03 + A11 + A15) + A13;
288 pV[33] = -(pV[ 1] = A01 + A09 + A13 + A15) - A14;
289 pV[35] = -(pV[ 3] = A05 + A07 + A09 + A13 + A15) - A06 - A14;
290 pV[37] = (tmp = -(A10 + A11 + A13 + A14 + A15)) - A05 - A06 - A07;
291 pV[39] = tmp - A02 - A03; // abh�gig vom Befehl drber
292 pV[41] = (tmp += A13 - A12) - A02 - A03; // abh�gig vom Befehl 2 drber
293 pV[43] = tmp - A04 - A06 - A07; // abh�gig von Befehlen 1 und 3 drber
294 pV[47] = (tmp = -(A08 + A12 + A14 + A15)) - A00;
295 pV[45] = tmp - A04 - A06 - A07; // abh�gig vom Befehl drber
296
297 pV[32] = -pV[ 0];
298 pV[31] = -pV[ 1];
299 pV[30] = -pV[ 2];
300 pV[29] = -pV[ 3];
301 pV[28] = -pV[ 4];
302 pV[27] = -pV[ 5];
303 pV[26] = -pV[ 6];
304 pV[25] = -pV[ 7];
305 pV[24] = -pV[ 8];
306 pV[23] = -pV[ 9];
307 pV[22] = -pV[10];
308 pV[21] = -pV[11];
309 pV[20] = -pV[12];
310 pV[19] = -pV[13];
311 pV[18] = -pV[14];
312 pV[17] = -pV[15];
313
314 pV[63] = pV[33];
315 pV[62] = pV[34];
316 pV[61] = pV[35];
317 pV[60] = pV[36];
318 pV[59] = pV[37];
319 pV[58] = pV[38];
320 pV[57] = pV[39];
321 pV[56] = pV[40];
322 pV[55] = pV[41];
323 pV[54] = pV[42];
324 pV[53] = pV[43];
325 pV[52] = pV[44];
326 pV[51] = pV[45];
327 pV[50] = pV[46];
328 pV[49] = pV[47];
329 }
330
331 static void
mpc_synthese_filter_float_internal(MPC_SAMPLE_FORMAT * p_out,MPC_SAMPLE_FORMAT * pV,const MPC_SAMPLE_FORMAT * pY,mpc_int_t channels)332 mpc_synthese_filter_float_internal(MPC_SAMPLE_FORMAT* p_out, MPC_SAMPLE_FORMAT* pV, const MPC_SAMPLE_FORMAT* pY, mpc_int_t channels)
333 {
334 mpc_uint32_t n;
335 for ( n = 0; n < 36; n++, pY += 32 )
336 {
337 MPC_SAMPLE_FORMAT* pData = p_out;
338 const MPC_SAMPLE_FORMAT* pD = (const MPC_SAMPLE_FORMAT*) &Di_opt;
339 mpc_int32_t k;
340 pV -= 64;
341 mpc_compute_new_V( pY, pV );
342 for ( k = 0; k < 32; k++, pD += 16, pV++ )
343 {
344 *pData = MPC_SHL(
345 MPC_MULTIPLY_FRACT(pV[ 0], pD[ 0]) + MPC_MULTIPLY_FRACT(pV[ 96], pD[ 1]) + MPC_MULTIPLY_FRACT(pV[128], pD[ 2]) + MPC_MULTIPLY_FRACT(pV[224], pD[ 3])
346 + MPC_MULTIPLY_FRACT(pV[256], pD[ 4]) + MPC_MULTIPLY_FRACT(pV[352], pD[ 5]) + MPC_MULTIPLY_FRACT(pV[384], pD[ 6]) + MPC_MULTIPLY_FRACT(pV[480], pD[ 7])
347 + MPC_MULTIPLY_FRACT(pV[512], pD[ 8]) + MPC_MULTIPLY_FRACT(pV[608], pD[ 9]) + MPC_MULTIPLY_FRACT(pV[640], pD[10]) + MPC_MULTIPLY_FRACT(pV[736], pD[11])
348 + MPC_MULTIPLY_FRACT(pV[768], pD[12]) + MPC_MULTIPLY_FRACT(pV[864], pD[13]) + MPC_MULTIPLY_FRACT(pV[896], pD[14]) + MPC_MULTIPLY_FRACT(pV[992], pD[15])
349 , 2);
350 pData += channels;
351 }
352 pV -= 32; //bleh
353 p_out += 32 * channels;
354 }
355 }
356
357 void
mpc_decoder_synthese_filter_float(mpc_decoder * p_dec,MPC_SAMPLE_FORMAT * p_out,mpc_int_t channels)358 mpc_decoder_synthese_filter_float(mpc_decoder* p_dec, MPC_SAMPLE_FORMAT* p_out, mpc_int_t channels)
359 {
360 /********* left channel ********/
361 memmove(&p_dec->V_L[MPC_V_MEM], p_dec->V_L, 960 * sizeof *p_dec->V_L);
362 mpc_synthese_filter_float_internal(p_out, &p_dec->V_L[MPC_V_MEM], p_dec->Y_L[0], channels);
363
364 /******** right channel ********/
365 if (channels > 1) {
366 memmove(&p_dec->V_R[MPC_V_MEM], p_dec->V_R, 960 * sizeof *p_dec->V_R);
367 mpc_synthese_filter_float_internal(p_out + 1, &p_dec->V_R[MPC_V_MEM], p_dec->Y_R[0], channels);
368 }
369 }
370
371 /*******************************************/
372 /* */
373 /* dithered synthesis */
374 /* */
375 /*******************************************/
376
377 static const mpc_uint8_t Parity [256] = { // parity
378 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,
379 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,
380 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,
381 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,
382 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,
383 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,
384 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,
385 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0
386 };
387
388 /*
389 * This is a simple random number generator with good quality for audio purposes.
390 * It consists of two polycounters with opposite rotation direction and different
391 * periods. The periods are coprime, so the total period is the product of both.
392 *
393 * -------------------------------------------------------------------------------------------------
394 * +-> |31:30:29:28:27:26:25:24:23:22:21:20:19:18:17:16:15:14:13:12:11:10: 9: 8: 7: 6: 5: 4: 3: 2: 1: 0|
395 * | -------------------------------------------------------------------------------------------------
396 * | | | | | | |
397 * | +--+--+--+-XOR-+--------+
398 * | |
399 * +--------------------------------------------------------------------------------------+
400 *
401 * -------------------------------------------------------------------------------------------------
402 * |31:30:29:28:27:26:25:24:23:22:21:20:19:18:17:16:15:14:13:12:11:10: 9: 8: 7: 6: 5: 4: 3: 2: 1: 0| <-+
403 * ------------------------------------------------------------------------------------------------- |
404 * | | | | |
405 * +--+----XOR----+--+ |
406 * | |
407 * +----------------------------------------------------------------------------------------+
408 *
409 *
410 * The first has an period of 3*5*17*257*65537, the second of 7*47*73*178481,
411 * which gives a period of 18.410.713.077.675.721.215. The result is the
412 * XORed values of both generators.
413 */
414 mpc_uint32_t
mpc_random_int(mpc_decoder * p_dec)415 mpc_random_int(mpc_decoder* p_dec)
416 {
417 #if 1
418 mpc_uint32_t t1, t2, t3, t4;
419
420 t3 = t1 = p_dec->__r1; t4 = t2 = p_dec->__r2; // Parity calculation is done via table lookup, this is also available
421 t1 &= 0xF5; t2 >>= 25; // on CPUs without parity, can be implemented in C and avoid unpredictable
422 t1 = Parity[t1]; t2 &= 0x63; // jumps and slow rotate through the carry flag operations.
423 t1 <<= 31; t2 = Parity[t2];
424
425 return (p_dec->__r1 = (t3 >> 1) | t1 ) ^ (p_dec->__r2 = (t4 + t4) | t2 );
426 #else
427 return (p_dec->__r1 = (p_dec->__r1 >> 1) | ((mpc_uint32_t) Parity[ p_dec->__r1 & 0xF5] << 31))
428 ^ (p_dec->__r2 = (p_dec->__r2 << 1) | (mpc_uint32_t) Parity[(p_dec->__r2 >> 25) & 0x63]);
429 #endif
430 }
431