MCPcopy Create free account
hub / github.com/BinomialLLC/basis_universal / idct

Function idct

encoder/jpgd.cpp:268–335  ·  view source on GitHub ↗

Scalar "fast pathing" IDCT.

Source from the content-addressed store, hash-verified

266
267 // Scalar "fast pathing" IDCT.
268 static void idct(const jpgd_block_t* pSrc_ptr, uint8* pDst_ptr, int block_max_zag)
269 {
270 assert(block_max_zag >= 1);
271 assert(block_max_zag <= 64);
272
273 if (block_max_zag <= 1)
274 {
275 int k = ((pSrc_ptr[0] + 4) >> 3) + 128;
276 k = CLAMP(k);
277 k = k | (k << 8);
278 k = k | (k << 16);
279
280 for (int i = 8; i > 0; i--)
281 {
282 *(int*)&pDst_ptr[0] = k;
283 *(int*)&pDst_ptr[4] = k;
284 pDst_ptr += 8;
285 }
286 return;
287 }
288
289 int temp[64];
290
291 const jpgd_block_t* pSrc = pSrc_ptr;
292 int* pTemp = temp;
293
294 const uint8* pRow_tab = &s_idct_row_table[(block_max_zag - 1) * 8];
295 int i;
296 for (i = 8; i > 0; i--, pRow_tab++)
297 {
298 switch (*pRow_tab)
299 {
300 case 0: Row<0>::idct(pTemp, pSrc); break;
301 case 1: Row<1>::idct(pTemp, pSrc); break;
302 case 2: Row<2>::idct(pTemp, pSrc); break;
303 case 3: Row<3>::idct(pTemp, pSrc); break;
304 case 4: Row<4>::idct(pTemp, pSrc); break;
305 case 5: Row<5>::idct(pTemp, pSrc); break;
306 case 6: Row<6>::idct(pTemp, pSrc); break;
307 case 7: Row<7>::idct(pTemp, pSrc); break;
308 case 8: Row<8>::idct(pTemp, pSrc); break;
309 }
310
311 pSrc += 8;
312 pTemp += 8;
313 }
314
315 pTemp = temp;
316
317 const int nonzero_rows = s_idct_col_table[block_max_zag - 1];
318 for (i = 8; i > 0; i--)
319 {
320 switch (nonzero_rows)
321 {
322 case 1: Col<1>::idct(pDst_ptr, pTemp); break;
323 case 2: Col<2>::idct(pDst_ptr, pTemp); break;
324 case 3: Col<3>::idct(pDst_ptr, pTemp); break;
325 case 4: Col<4>::idct(pDst_ptr, pTemp); break;

Callers 1

transform_mcuMethod · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected