* Transform 8x8 block of data with a double precision forward DCT * This is a reference implementation. * * @param block pointer to 8x8 block of data to transform */
| 57 | * @param block pointer to 8x8 block of data to transform |
| 58 | */ |
| 59 | void ff_ref_fdct(short *block) |
| 60 | { |
| 61 | /* implement the equation: block = coefficients * block * coefficients' */ |
| 62 | |
| 63 | unsigned int i, j, k; |
| 64 | double out[8 * 8]; |
| 65 | |
| 66 | /* out = coefficients * block */ |
| 67 | for (i = 0; i < 64; i += 8) { |
| 68 | for (j = 0; j < 8; ++j) { |
| 69 | double tmp = 0; |
| 70 | for (k = 0; k < 8; ++k) { |
| 71 | tmp += coefficients[i + k] * block[k * 8 + j]; |
| 72 | } |
| 73 | out[i + j] = tmp * 8; |
| 74 | } |
| 75 | } |
| 76 | |
| 77 | /* block = out * (coefficients') */ |
| 78 | for (j = 0; j < 8; ++j) { |
| 79 | for (i = 0; i < 64; i += 8) { |
| 80 | double tmp = 0; |
| 81 | for (k = 0; k < 8; ++k) { |
| 82 | tmp += out[i + k] * coefficients[j * 8 + k]; |
| 83 | } |
| 84 | block[i + j] = floor(tmp + 0.499999999999); |
| 85 | } |
| 86 | } |
| 87 | } |
| 88 | |
| 89 | /** |
| 90 | * Transform 8x8 block of data with a double precision inverse DCT <br> |