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