package org.jcodec.common.dct; import static java.lang.Math.PI; import static java.lang.Math.cos; import static java.lang.Math.sqrt; /** * This class is part of JCodec ( www.jcodec.org ) This software is distributed * under FreeBSD License * * @author The JCodec project * */ public class DCTRef { static double[] coefficients = new double[64]; static { for (int j = 0; j < 8; ++j) { coefficients[j] = sqrt(0.125); for (int i = 8; i < 64; i += 8) { coefficients[i + j] = 0.5 * cos(i * (j + 0.5) * PI / 64.0); } } } public static void fdct(int[] block, int off) { int i, j, k; double[] out = new double[8 * 8]; for (i = 0; i < 64; i += 8) { for (j = 0; j < 8; ++j) { double tmp = 0; for (k = 0; k < 8; ++k) { tmp += coefficients[i + k] * block[k * 8 + j + off]; } out[i + j] = tmp * 4; } } for (j = 0; j < 8; ++j) { for (i = 0; i < 64; i += 8) { double tmp = 0; for (k = 0; k < 8; ++k) { tmp += out[i + k] * coefficients[j * 8 + k]; } block[i + j + off] = (int) (tmp + 0.499999999999); } } } public static void idct(int[] block, int off) { int i, j, k; double[] out = new double[8 * 8]; /* out = block * coefficients */ for (i = 0; i < 64; i += 8) { for (j = 0; j < 8; ++j) { double tmp = 0; for (k = 0; k < 8; ++k) { tmp += block[i + k] * coefficients[k * 8 + j]; } out[i + j] = tmp; } } /* block = (coefficients') * out */ for (i = 0; i < 8; ++i) { for (j = 0; j < 8; ++j) { double tmp = 0; for (k = 0; k < 64; k += 8) { tmp += coefficients[k + i] * out[k + j]; } block[i * 8 + j] = (int) (tmp + 0.5); } } } }