FastLED 3.9.15
Loading...
Searching...
No Matches

◆ FDCT32()

void fl::third_party::FDCT32 ( int32_t * x,
int32_t * d,
int32_t offset,
int32_t oddBlock,
int32_t gb )

Definition at line 151 of file dct32.hpp.

152{
153 int32_t i, s, tmp, es;
154 const int32_t *cptr = dcttab;
155 int32_t a0, a1, a2, a3, a4, a5, a6, a7;
156 int32_t b0, b1, b2, b3, b4, b5, b6, b7;
157 int32_t *d;
158
159 /* scaling - ensure at least 6 guard bits for DCT
160 * (in practice this is already true 99% of time, so this code is
161 * almost never triggered)
162 */
163 es = 0;
164 if (gb < 6) {
165 es = 6 - gb;
166 for (i = 0; i < 32; i++)
167 buf[i] >>= es;
168 }
169
170 /* first pass */
171 D32FP(0, 1, 5, 1);
172 D32FP(1, 1, 3, 1);
173 D32FP(2, 1, 3, 1);
174 D32FP(3, 1, 2, 1);
175 D32FP(4, 1, 2, 1);
176 D32FP(5, 1, 1, 2);
177 D32FP(6, 1, 1, 2);
178 D32FP(7, 1, 1, 4);
179
180 /* second pass */
181 for (i = 4; i > 0; i--) {
182 a0 = buf[0]; a7 = buf[7]; a3 = buf[3]; a4 = buf[4];
183 b0 = a0 + a7; b7 = MULSHIFT32(*cptr++, a0 - a7) * 2L;
184 b3 = a3 + a4; b4 = MULSHIFT32(*cptr++, a3 - a4) * 8L;
185 a0 = b0 + b3; a3 = MULSHIFT32(*cptr, b0 - b3) * 2L;
186 a4 = b4 + b7; a7 = MULSHIFT32(*cptr++, b7 - b4) * 2L;
187
188 a1 = buf[1]; a6 = buf[6]; a2 = buf[2]; a5 = buf[5];
189 b1 = a1 + a6; b6 = MULSHIFT32(*cptr++, a1 - a6) * 2L;
190 b2 = a2 + a5; b5 = MULSHIFT32(*cptr++, a2 - a5) * 2L;
191 a1 = b1 + b2; a2 = MULSHIFT32(*cptr, b1 - b2) * 4L;
192 a5 = b5 + b6; a6 = MULSHIFT32(*cptr++, b6 - b5) * 4L;
193
194 b0 = a0 + a1; b1 = MULSHIFT32(COS4_0, a0 - a1) * 2L;
195 b2 = a2 + a3; b3 = MULSHIFT32(COS4_0, a3 - a2) * 2L;
196 buf[0] = b0; buf[1] = b1;
197 buf[2] = b2 + b3; buf[3] = b3;
198
199 b4 = a4 + a5; b5 = MULSHIFT32(COS4_0, a4 - a5) * 2L;
200 b6 = a6 + a7; b7 = MULSHIFT32(COS4_0, a7 - a6) * 2L;
201 b6 += b7;
202 buf[4] = b4 + b6; buf[5] = b5 + b7;
203 buf[6] = b5 + b6; buf[7] = b7;
204
205 buf += 8;
206 }
207 buf -= 32; /* reset */
208
209 /* sample 0 - always delayed one block */
210 d = dest + 64*16 + ((offset - oddBlock) & 7) + (oddBlock ? 0 : VBUF_LENGTH);
211 s = buf[ 0]; d[0] = d[8] = s;
212
213 /* samples 16 to 31 */
214 d = dest + offset + (oddBlock ? VBUF_LENGTH : 0);
215
216 s = buf[ 1]; d[0] = d[8] = s; d += 64;
217
218 tmp = buf[25] + buf[29];
219 s = buf[17] + tmp; d[0] = d[8] = s; d += 64;
220 s = buf[ 9] + buf[13]; d[0] = d[8] = s; d += 64;
221 s = buf[21] + tmp; d[0] = d[8] = s; d += 64;
222
223 tmp = buf[29] + buf[27];
224 s = buf[ 5]; d[0] = d[8] = s; d += 64;
225 s = buf[21] + tmp; d[0] = d[8] = s; d += 64;
226 s = buf[13] + buf[11]; d[0] = d[8] = s; d += 64;
227 s = buf[19] + tmp; d[0] = d[8] = s; d += 64;
228
229 tmp = buf[27] + buf[31];
230 s = buf[ 3]; d[0] = d[8] = s; d += 64;
231 s = buf[19] + tmp; d[0] = d[8] = s; d += 64;
232 s = buf[11] + buf[15]; d[0] = d[8] = s; d += 64;
233 s = buf[23] + tmp; d[0] = d[8] = s; d += 64;
234
235 tmp = buf[31];
236 s = buf[ 7]; d[0] = d[8] = s; d += 64;
237 s = buf[23] + tmp; d[0] = d[8] = s; d += 64;
238 s = buf[15]; d[0] = d[8] = s; d += 64;
239 s = tmp; d[0] = d[8] = s;
240
241 /* samples 16 to 1 (sample 16 used again) */
242 d = dest + 16 + ((offset - oddBlock) & 7) + (oddBlock ? 0 : VBUF_LENGTH);
243
244 s = buf[ 1]; d[0] = d[8] = s; d += 64;
245
246 tmp = buf[30] + buf[25];
247 s = buf[17] + tmp; d[0] = d[8] = s; d += 64;
248 s = buf[14] + buf[ 9]; d[0] = d[8] = s; d += 64;
249 s = buf[22] + tmp; d[0] = d[8] = s; d += 64;
250 s = buf[ 6]; d[0] = d[8] = s; d += 64;
251
252 tmp = buf[26] + buf[30];
253 s = buf[22] + tmp; d[0] = d[8] = s; d += 64;
254 s = buf[10] + buf[14]; d[0] = d[8] = s; d += 64;
255 s = buf[18] + tmp; d[0] = d[8] = s; d += 64;
256 s = buf[ 2]; d[0] = d[8] = s; d += 64;
257
258 tmp = buf[28] + buf[26];
259 s = buf[18] + tmp; d[0] = d[8] = s; d += 64;
260 s = buf[12] + buf[10]; d[0] = d[8] = s; d += 64;
261 s = buf[20] + tmp; d[0] = d[8] = s; d += 64;
262 s = buf[ 4]; d[0] = d[8] = s; d += 64;
263
264 tmp = buf[24] + buf[28];
265 s = buf[20] + tmp; d[0] = d[8] = s; d += 64;
266 s = buf[ 8] + buf[12]; d[0] = d[8] = s; d += 64;
267 s = buf[16] + tmp; d[0] = d[8] = s;
268
269 /* this is so rarely invoked that it's not worth making two versions of the output
270 * shuffle code (one for no shift, one for clip + variable shift) like in IMDCT
271 * here we just load, clip, shift, and store on the rare instances that es != 0
272 */
273 if (es) {
274 d = dest + 64*16 + ((offset - oddBlock) & 7) + (oddBlock ? 0 : VBUF_LENGTH);
275 s = d[0]; CLIP_2N(s, 31 - es); d[0] = d[8] = (s << es);
276
277 d = dest + offset + (oddBlock ? VBUF_LENGTH : 0);
278 for (i = 16; i <= 31; i++) {
279 s = d[0]; CLIP_2N(s, 31 - es); d[0] = d[8] = (s << es); d += 64;
280 }
281
282 d = dest + 16 + ((offset - oddBlock) & 7) + (oddBlock ? 0 : VBUF_LENGTH);
283 for (i = 15; i >= 0; i--) {
284 s = d[0]; CLIP_2N(s, 31 - es); d[0] = d[8] = (s << es); d += 64;
285 }
286 }
287}
#define VBUF_LENGTH
Definition coder.h:109
#define CLIP_2N(y, n)
Definition coder.h:89
#define COS4_0
Definition dct32.hpp:89
#define D32FP(i, s0, s1, s2)
Definition dct32.hpp:113
fl::UISlider offset("Offset", 0.0f, 0.0f, 1.0f, 0.01f)
__inline int32_t MULSHIFT32(int32_t x, int32_t y) FL_NOEXCEPT
Multiply together two 32-bit numbers and return the top 32-bits of the result.
Definition assembly.h:503
static const int32_t dcttab[48]
Definition dct32.hpp:92
fl::i32 int32_t
Definition coder.h:220

References CLIP_2N, COS4_0, D32FP, dcttab, FL_NOEXCEPT, MULSHIFT32(), offset(), and VBUF_LENGTH.

Referenced by Subband().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: