| 382 | DECLARE_ALIGNED(8, static uint8_t, img_dest1)[64]; |
| 383 | |
| 384 | static void idct248_ref(uint8_t *dest, int linesize, int16_t *block) |
| 385 | { |
| 386 | static int init; |
| 387 | static double c8[8][8]; |
| 388 | static double c4[4][4]; |
| 389 | double block1[64], block2[64], block3[64]; |
| 390 | double s, sum, v; |
| 391 | int i, j, k; |
| 392 | |
| 393 | if (!init) { |
| 394 | init = 1; |
| 395 | |
| 396 | for(i=0;i<8;i++) { |
| 397 | sum = 0; |
| 398 | for(j=0;j<8;j++) { |
| 399 | s = (i==0) ? sqrt(1.0/8.0) : sqrt(1.0/4.0); |
| 400 | c8[i][j] = s * cos(M_PI * i * (j + 0.5) / 8.0); |
| 401 | sum += c8[i][j] * c8[i][j]; |
| 402 | } |
| 403 | } |
| 404 | |
| 405 | for(i=0;i<4;i++) { |
| 406 | sum = 0; |
| 407 | for(j=0;j<4;j++) { |
| 408 | s = (i==0) ? sqrt(1.0/4.0) : sqrt(1.0/2.0); |
| 409 | c4[i][j] = s * cos(M_PI * i * (j + 0.5) / 4.0); |
| 410 | sum += c4[i][j] * c4[i][j]; |
| 411 | } |
| 412 | } |
| 413 | } |
| 414 | |
| 415 | /* butterfly */ |
| 416 | s = 0.5 * sqrt(2.0); |
| 417 | for(i=0;i<4;i++) { |
| 418 | for(j=0;j<8;j++) { |
| 419 | block1[8*(2*i)+j] = (block[8*(2*i)+j] + block[8*(2*i+1)+j]) * s; |
| 420 | block1[8*(2*i+1)+j] = (block[8*(2*i)+j] - block[8*(2*i+1)+j]) * s; |
| 421 | } |
| 422 | } |
| 423 | |
| 424 | /* idct8 on lines */ |
| 425 | for(i=0;i<8;i++) { |
| 426 | for(j=0;j<8;j++) { |
| 427 | sum = 0; |
| 428 | for(k=0;k<8;k++) |
| 429 | sum += c8[k][j] * block1[8*i+k]; |
| 430 | block2[8*i+j] = sum; |
| 431 | } |
| 432 | } |
| 433 | |
| 434 | /* idct4 */ |
| 435 | for(i=0;i<8;i++) { |
| 436 | for(j=0;j<4;j++) { |
| 437 | /* top */ |
| 438 | sum = 0; |
| 439 | for(k=0;k<4;k++) |
| 440 | sum += c4[k][j] * block2[8*(2*k)+i]; |
| 441 | block3[8*(2*j)+i] = sum; |