diff options
Diffstat (limited to 'apps/codecs/Tremor/mdct.c')
-rw-r--r-- | apps/codecs/Tremor/mdct.c | 72 |
1 files changed, 32 insertions, 40 deletions
diff --git a/apps/codecs/Tremor/mdct.c b/apps/codecs/Tremor/mdct.c index 2d2564f196..53d1ed4f0c 100644 --- a/apps/codecs/Tremor/mdct.c +++ b/apps/codecs/Tremor/mdct.c | |||
@@ -41,7 +41,6 @@ | |||
41 | 41 | ||
42 | /* 8 point butterfly (in place) */ | 42 | /* 8 point butterfly (in place) */ |
43 | STIN void mdct_butterfly_8(DATA_TYPE *x){ | 43 | STIN void mdct_butterfly_8(DATA_TYPE *x){ |
44 | |||
45 | REG_TYPE r0 = x[4] + x[0]; | 44 | REG_TYPE r0 = x[4] + x[0]; |
46 | REG_TYPE r1 = x[4] - x[0]; | 45 | REG_TYPE r1 = x[4] - x[0]; |
47 | REG_TYPE r2 = x[5] + x[1]; | 46 | REG_TYPE r2 = x[5] + x[1]; |
@@ -144,88 +143,81 @@ STIN void mdct_butterfly_32(DATA_TYPE *x){ | |||
144 | mdct_butterfly_16(x+16); | 143 | mdct_butterfly_16(x+16); |
145 | } | 144 | } |
146 | 145 | ||
147 | /* N/stage point generic N stage butterfly (in place, 2 register) */ | 146 | /* N/stage point generic N stage butterfly (in place, 4 register) */ |
148 | STIN void mdct_butterfly_generic(DATA_TYPE *x,int points,int step){ | 147 | void mdct_butterfly_generic(DATA_TYPE *x,int points, int step){ |
149 | |||
150 | LOOKUP_T *T = sincos_lookup0; | 148 | LOOKUP_T *T = sincos_lookup0; |
151 | DATA_TYPE *x1 = x + points - 8; | 149 | DATA_TYPE *x1 = x + points - 8; |
152 | DATA_TYPE *x2 = x + (points>>1) - 8; | 150 | DATA_TYPE *x2 = x + (points>>1) - 8; |
153 | REG_TYPE r0; | 151 | REG_TYPE r0; |
154 | REG_TYPE r1; | 152 | REG_TYPE r1; |
153 | REG_TYPE r2; | ||
154 | REG_TYPE r3; | ||
155 | 155 | ||
156 | do{ | 156 | do{ |
157 | r0 = x1[6] - x2[6]; x1[6] += x2[6]; | 157 | r0 = x1[6] - x2[6]; x1[6] += x2[6]; |
158 | r1 = x2[7] - x1[7]; x1[7] += x2[7]; | 158 | r1 = x2[7] - x1[7]; x1[7] += x2[7]; |
159 | r2 = x1[4] - x2[4]; x1[4] += x2[4]; | ||
160 | r3 = x2[5] - x1[5]; x1[5] += x2[5]; | ||
159 | XPROD31( r1, r0, T[0], T[1], &x2[6], &x2[7] ); T+=step; | 161 | XPROD31( r1, r0, T[0], T[1], &x2[6], &x2[7] ); T+=step; |
160 | 162 | XPROD31( r3, r2, T[0], T[1], &x2[4], &x2[5] ); T+=step; | |
161 | r0 = x1[4] - x2[4]; x1[4] += x2[4]; | 163 | |
162 | r1 = x2[5] - x1[5]; x1[5] += x2[5]; | ||
163 | XPROD31( r1, r0, T[0], T[1], &x2[4], &x2[5] ); T+=step; | ||
164 | |||
165 | r0 = x1[2] - x2[2]; x1[2] += x2[2]; | 164 | r0 = x1[2] - x2[2]; x1[2] += x2[2]; |
166 | r1 = x2[3] - x1[3]; x1[3] += x2[3]; | 165 | r1 = x2[3] - x1[3]; x1[3] += x2[3]; |
166 | r2 = x1[0] - x2[0]; x1[0] += x2[0]; | ||
167 | r3 = x2[1] - x1[1]; x1[1] += x2[1]; | ||
167 | XPROD31( r1, r0, T[0], T[1], &x2[2], &x2[3] ); T+=step; | 168 | XPROD31( r1, r0, T[0], T[1], &x2[2], &x2[3] ); T+=step; |
168 | 169 | XPROD31( r3, r2, T[0], T[1], &x2[0], &x2[1] ); T+=step; | |
169 | r0 = x1[0] - x2[0]; x1[0] += x2[0]; | 170 | |
170 | r1 = x2[1] - x1[1]; x1[1] += x2[1]; | ||
171 | XPROD31( r1, r0, T[0], T[1], &x2[0], &x2[1] ); T+=step; | ||
172 | |||
173 | x1-=8; x2-=8; | 171 | x1-=8; x2-=8; |
174 | }while(T<sincos_lookup0+1024); | 172 | }while(T<sincos_lookup0+1024); |
175 | do{ | 173 | do{ |
176 | r0 = x1[6] - x2[6]; x1[6] += x2[6]; | 174 | r0 = x1[6] - x2[6]; x1[6] += x2[6]; |
177 | r1 = x1[7] - x2[7]; x1[7] += x2[7]; | 175 | r1 = x1[7] - x2[7]; x1[7] += x2[7]; |
176 | r2 = x1[4] - x2[4]; x1[4] += x2[4]; | ||
177 | r3 = x1[5] - x2[5]; x1[5] += x2[5]; | ||
178 | XNPROD31( r0, r1, T[0], T[1], &x2[6], &x2[7] ); T-=step; | 178 | XNPROD31( r0, r1, T[0], T[1], &x2[6], &x2[7] ); T-=step; |
179 | XNPROD31( r2, r3, T[0], T[1], &x2[4], &x2[5] ); T-=step; | ||
179 | 180 | ||
180 | r0 = x1[4] - x2[4]; x1[4] += x2[4]; | ||
181 | r1 = x1[5] - x2[5]; x1[5] += x2[5]; | ||
182 | XNPROD31( r0, r1, T[0], T[1], &x2[4], &x2[5] ); T-=step; | ||
183 | |||
184 | r0 = x1[2] - x2[2]; x1[2] += x2[2]; | 181 | r0 = x1[2] - x2[2]; x1[2] += x2[2]; |
185 | r1 = x1[3] - x2[3]; x1[3] += x2[3]; | 182 | r1 = x1[3] - x2[3]; x1[3] += x2[3]; |
183 | r2 = x1[0] - x2[0]; x1[0] += x2[0]; | ||
184 | r3 = x1[1] - x2[1]; x1[1] += x2[1]; | ||
186 | XNPROD31( r0, r1, T[0], T[1], &x2[2], &x2[3] ); T-=step; | 185 | XNPROD31( r0, r1, T[0], T[1], &x2[2], &x2[3] ); T-=step; |
187 | 186 | XNPROD31( r2, r3, T[0], T[1], &x2[0], &x2[1] ); T-=step; | |
188 | r0 = x1[0] - x2[0]; x1[0] += x2[0]; | ||
189 | r1 = x1[1] - x2[1]; x1[1] += x2[1]; | ||
190 | XNPROD31( r0, r1, T[0], T[1], &x2[0], &x2[1] ); T-=step; | ||
191 | 187 | ||
192 | x1-=8; x2-=8; | 188 | x1-=8; x2-=8; |
193 | }while(T>sincos_lookup0); | 189 | }while(T>sincos_lookup0); |
194 | do{ | 190 | do{ |
195 | r0 = x2[6] - x1[6]; x1[6] += x2[6]; | 191 | r0 = x2[6] - x1[6]; x1[6] += x2[6]; |
196 | r1 = x2[7] - x1[7]; x1[7] += x2[7]; | 192 | r1 = x2[7] - x1[7]; x1[7] += x2[7]; |
193 | r2 = x2[4] - x1[4]; x1[4] += x2[4]; | ||
194 | r3 = x2[5] - x1[5]; x1[5] += x2[5]; | ||
197 | XPROD31( r0, r1, T[0], T[1], &x2[6], &x2[7] ); T+=step; | 195 | XPROD31( r0, r1, T[0], T[1], &x2[6], &x2[7] ); T+=step; |
198 | 196 | XPROD31( r2, r3, T[0], T[1], &x2[4], &x2[5] ); T+=step; | |
199 | r0 = x2[4] - x1[4]; x1[4] += x2[4]; | ||
200 | r1 = x2[5] - x1[5]; x1[5] += x2[5]; | ||
201 | XPROD31( r0, r1, T[0], T[1], &x2[4], &x2[5] ); T+=step; | ||
202 | 197 | ||
203 | r0 = x2[2] - x1[2]; x1[2] += x2[2]; | 198 | r0 = x2[2] - x1[2]; x1[2] += x2[2]; |
204 | r1 = x2[3] - x1[3]; x1[3] += x2[3]; | 199 | r1 = x2[3] - x1[3]; x1[3] += x2[3]; |
200 | r2 = x2[0] - x1[0]; x1[0] += x2[0]; | ||
201 | r3 = x2[1] - x1[1]; x1[1] += x2[1]; | ||
205 | XPROD31( r0, r1, T[0], T[1], &x2[2], &x2[3] ); T+=step; | 202 | XPROD31( r0, r1, T[0], T[1], &x2[2], &x2[3] ); T+=step; |
206 | 203 | XPROD31( r2, r3, T[0], T[1], &x2[0], &x2[1] ); T+=step; | |
207 | r0 = x2[0] - x1[0]; x1[0] += x2[0]; | ||
208 | r1 = x2[1] - x1[1]; x1[1] += x2[1]; | ||
209 | XPROD31( r0, r1, T[0], T[1], &x2[0], &x2[1] ); T+=step; | ||
210 | 204 | ||
211 | x1-=8; x2-=8; | 205 | x1-=8; x2-=8; |
212 | }while(T<sincos_lookup0+1024); | 206 | }while(T<sincos_lookup0+1024); |
213 | do{ | 207 | do{ |
214 | r0 = x1[6] - x2[6]; x1[6] += x2[6]; | 208 | r0 = x1[6] - x2[6]; x1[6] += x2[6]; |
215 | r1 = x2[7] - x1[7]; x1[7] += x2[7]; | 209 | r1 = x2[7] - x1[7]; x1[7] += x2[7]; |
210 | r2 = x1[4] - x2[4]; x1[4] += x2[4]; | ||
211 | r3 = x2[5] - x1[5]; x1[5] += x2[5]; | ||
216 | XNPROD31( r1, r0, T[0], T[1], &x2[6], &x2[7] ); T-=step; | 212 | XNPROD31( r1, r0, T[0], T[1], &x2[6], &x2[7] ); T-=step; |
217 | 213 | XNPROD31( r3, r2, T[0], T[1], &x2[4], &x2[5] ); T-=step; | |
218 | r0 = x1[4] - x2[4]; x1[4] += x2[4]; | ||
219 | r1 = x2[5] - x1[5]; x1[5] += x2[5]; | ||
220 | XNPROD31( r1, r0, T[0], T[1], &x2[4], &x2[5] ); T-=step; | ||
221 | 214 | ||
222 | r0 = x1[2] - x2[2]; x1[2] += x2[2]; | 215 | r0 = x1[2] - x2[2]; x1[2] += x2[2]; |
223 | r1 = x2[3] - x1[3]; x1[3] += x2[3]; | 216 | r1 = x2[3] - x1[3]; x1[3] += x2[3]; |
217 | r2 = x1[0] - x2[0]; x1[0] += x2[0]; | ||
218 | r3 = x2[1] - x1[1]; x1[1] += x2[1]; | ||
224 | XNPROD31( r1, r0, T[0], T[1], &x2[2], &x2[3] ); T-=step; | 219 | XNPROD31( r1, r0, T[0], T[1], &x2[2], &x2[3] ); T-=step; |
225 | 220 | XNPROD31( r3, r2, T[0], T[1], &x2[0], &x2[1] ); T-=step; | |
226 | r0 = x1[0] - x2[0]; x1[0] += x2[0]; | ||
227 | r1 = x2[1] - x1[1]; x1[1] += x2[1]; | ||
228 | XNPROD31( r1, r0, T[0], T[1], &x2[0], &x2[1] ); T-=step; | ||
229 | 221 | ||
230 | x1-=8; x2-=8; | 222 | x1-=8; x2-=8; |
231 | }while(T>sincos_lookup0); | 223 | }while(T>sincos_lookup0); |
@@ -246,8 +238,8 @@ STIN void mdct_butterflies(DATA_TYPE *x,int points,int shift) { | |||
246 | } | 238 | } |
247 | 239 | ||
248 | 240 | ||
249 | static const unsigned char bitrev[16] | 241 | static const unsigned char bitrev[16] IDATA_ATTR = |
250 | IDATA_ATTR = {0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15}; | 242 | {0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15}; |
251 | 243 | ||
252 | STIN int bitrev12(int x){ | 244 | STIN int bitrev12(int x){ |
253 | return bitrev[x>>8]|(bitrev[(x&0x0f0)>>4]<<4)|(((int)bitrev[x&0x00f])<<8); | 245 | return bitrev[x>>8]|(bitrev[(x&0x0f0)>>4]<<4)|(((int)bitrev[x&0x00f])<<8); |