package org.jcodec.codecs.vpx;
/**
* This class is part of JCodec ( www.jcodec.org ) This software is distributed
* under FreeBSD License
*
* @author The JCodec project
*
*/
public class VPXDCT {
public static void fdct4x4(int[] coef) {
for (int i = 0; i < 16; i += 4) {
int a1 = ((coef[i] + coef[i + 3]) << 3);
int b1 = ((coef[i + 1] + coef[i + 2]) << 3);
int c1 = ((coef[i + 1] - coef[i + 2]) << 3);
int d1 = ((coef[i] - coef[i + 3]) << 3);
coef[i] = a1 + b1;
coef[i + 2] = a1 - b1;
coef[i + 1] = (c1 * 2217 + d1 * 5352 + 14500) >> 12;
coef[i + 3] = (d1 * 2217 - c1 * 5352 + 7500) >> 12;
}
for (int i = 0; i < 4; i++) {
int a1 = coef[i] + coef[i + 12];
int b1 = coef[i + 4] + coef[i + 8];
int c1 = coef[i + 4] - coef[i + 8];
int d1 = coef[i] - coef[i + 12];
coef[i] = (a1 + b1 + 7) >> 4;
coef[i + 8] = (a1 - b1 + 7) >> 4;
coef[i + 4] = ((c1 * 2217 + d1 * 5352 + 12000) >> 16) + (d1 != 0 ? 1 : 0);
coef[i + 12] = (d1 * 2217 - c1 * 5352 + 51000) >> 16;
}
}
public static void walsh4x4(int[] coef) {
for (int i = 0; i < 16; i += 4) {
int a1 = ((coef[i] + coef[i + 2]) << 2);
int d1 = ((coef[i + 1] + coef[i + 3]) << 2);
int c1 = ((coef[i + 1] - coef[i + 3]) << 2);
int b1 = ((coef[i] - coef[i + 2]) << 2);
coef[i] = a1 + d1 + (a1 != 0 ? 1 : 0);
coef[i + 1] = b1 + c1;
coef[i + 2] = b1 - c1;
coef[i + 3] = a1 - d1;
}
for (int i = 0; i < 4; i++) {
int a1 = coef[i] + coef[i + 8];
int d1 = coef[i + 4] + coef[i + 12];
int c1 = coef[i + 4] - coef[i + 12];
int b1 = coef[i] - coef[i + 8];
int a2 = a1 + d1;
int b2 = b1 + c1;
int c2 = b1 - c1;
int d2 = a1 - d1;
a2 += a2 < 0 ? 1 : 0;
b2 += b2 < 0 ? 1 : 0;
c2 += c2 < 0 ? 1 : 0;
d2 += d2 < 0 ? 1 : 0;
coef[i] = (a2 + 3) >> 3;
coef[i + 4] = (b2 + 3) >> 3;
coef[i + 8] = (c2 + 3) >> 3;
coef[i + 12] = (d2 + 3) >> 3;
}
}
public static int cospi8sqrt2minus1 = 20091;
public static int sinpi8sqrt2 = 35468;
public static void idct4x4(int[] coef) {
for (int i = 0; i < 4; i++) {
int a1 = coef[i] + coef[i + 8];
int b1 = coef[i] - coef[i + 8];
int temp1 = (coef[i + 4] * sinpi8sqrt2) >> 16;
int temp2 = coef[i + 12] + ((coef[i + 12] * cospi8sqrt2minus1) >> 16);
int c1 = temp1 - temp2;
temp1 = coef[i + 4] + ((coef[i + 4] * cospi8sqrt2minus1) >> 16);
temp2 = (coef[i + 12] * sinpi8sqrt2) >> 16;
int d1 = temp1 + temp2;
coef[i] = a1 + d1;
coef[i + 12] = a1 - d1;
coef[i + 4] = b1 + c1;
coef[i + 8] = b1 - c1;
}
for (int i = 0; i < 16; i += 4) {
int a1 = coef[i] + coef[i + 2];
int b1 = coef[i] - coef[i + 2];
int temp1 = (coef[i + 1] * sinpi8sqrt2) >> 16;
int temp2 = coef[i + 3] + ((coef[i + 3] * cospi8sqrt2minus1) >> 16);
int c1 = temp1 - temp2;
temp1 = coef[i + 1] + ((coef[i + 1] * cospi8sqrt2minus1) >> 16);
temp2 = (coef[i + 3] * sinpi8sqrt2) >> 16;
int d1 = temp1 + temp2;
coef[i] = (a1 + d1 + 4) >> 3;
coef[i + 3] = (a1 - d1 + 4) >> 3;
coef[i + 1] = (b1 + c1 + 4) >> 3;
coef[i + 2] = (b1 - c1 + 4) >> 3;
}
}
public static void iwalsh4x4(int[] coef) {
for (int i = 0; i < 4; i++) {
int a1 = coef[i] + coef[i + 12];
int b1 = coef[i + 4] + coef[i + 8];
int c1 = coef[i + 4] - coef[i + 8];
int d1 = coef[i] - coef[i + 12];
coef[i] = a1 + b1;
coef[i + 4] = c1 + d1;
coef[i + 8] = a1 - b1;
coef[i + 12] = d1 - c1;
}
for (int i = 0; i < 16; i += 4) {
int a1 = coef[i] + coef[i + 3];
int b1 = coef[i + 1] + coef[i + 2];
int c1 = coef[i + 1] - coef[i + 2];
int d1 = coef[i] - coef[i + 3];
int a2 = a1 + b1;
int b2 = c1 + d1;
int c2 = a1 - b1;
int d2 = d1 - c1;
coef[i] = (a2 + 3) >> 3;
coef[i + 1] = (b2 + 3) >> 3;
coef[i + 2] = (c2 + 3) >> 3;
coef[i + 3] = (d2 + 3) >> 3;
}
}
}