package org.jcodec.codecs.h264;
import static org.junit.Assert.assertArrayEquals;
import org.jcodec.codecs.h264.decode.CoeffTransformer;
import org.junit.Test;
public class CoeffTransformerTest {
@Test
public void testDCT() {
int[] coeffs = { 2560, -4160, -2816, -1920, 960, -1200, 320, 0, 768, -640, -512, 320, 0, 0, 0, 0 };
int[] expected = { -86, 92, 136, 126, -80, 72, 66, 84, -81, 71, 47, 45, -89, 91, 97, 49 };
CoeffTransformer.idct4x4(coeffs);
assertArrayEquals(expected, coeffs);
}
@Test
public void testHadamard() {
int[] coeffs = { 61, -11, -13, -14, 9, -4, -2, 2, -12, 6, 6, 4, 8, 1, -2, 2 };
int[] expected = { 41, 75, 79, 69, 15, 89, 97, 95, 23, 97, 85, 83, 13, 47, 23, 45 };
CoeffTransformer.invDC4x4(coeffs);
assertArrayEquals(expected, coeffs);
}
@Test
public void testRescaleAfterIHadamard4x4() {
int[] coeffs = { 41, 75, 79, 69, 15, 89, 97, 95, 23, 97, 85, 83, 13, 47, 23, 45 };
int[] expected = { 2624, 4800, 5056, 4416, 960, 5696, 6208, 6080, 1472, 6208, 5440, 5312, 832, 3008, 1472, 2880 };
CoeffTransformer.dequantizeDC4x4(coeffs, 28);
assertArrayEquals(expected, coeffs);
}
@Test
public void testRescaleBeforeIDCT4x4() throws Exception {
int[] coeffs = { 10, -13, -11, -6, 3, -3, 1, 0, 3, -2, -2, 1, 0, 0, 0, 0 };
int[] expected = { 2560, -4160, -2816, -1920, 960, -1200, 320, 0, 768, -640, -512, 320, 0, 0, 0, 0 };
CoeffTransformer.dequantizeAC(coeffs, 28);
assertArrayEquals(expected, coeffs);
}
@Test
public void testReorder() {
int[] coeffs = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
int[] expected = { 0, 1, 5, 6, 2, 4, 7, 12, 3, 8, 11, 13, 9, 10, 14, 15 };
int[] reordered = CoeffTransformer.unzigzagAC(coeffs);
assertArrayEquals(expected, reordered);
}
@Test
public void testQuantizeDC4x4() {
int[] dc = { 1765, -3340, 1340, -3432, 1435, -4056, 6743, -2454, 3432, -1234, 7643, -1432, 1654, -5643, 2345,
-1786 };
int[] expected = { 11, -21, 8, -21, 9, -25, 42, -15, 21, -8, 48, -9, 10, -35, 14, -11 };
CoeffTransformer.quantizeDC4x4(dc, 30);
assertArrayEquals(expected, dc);
}
@Test
public void testQuantizeAC() {
int[] dc = { 0, 573, 232, 123, 402, 123, 754, 74 , 12, 15, 13, 12 , 14, 15, 43, 57 };
int[] expected = { 0, 4, 3, 1, 3, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
CoeffTransformer.quantizeAC(dc, 30);
assertArrayEquals(expected, dc);
}
@Test
public void testQuantizeDC2x2() {
int[] dc = { 1765, -3340, 1435, -4056 };
int[] expected = { 11, -21, 9, -25 };
CoeffTransformer.quantizeDC2x2(dc, 30);
assertArrayEquals(expected, dc);
}
}