package org.jcodec.codecs.vpx;
import org.junit.Assert;
import org.junit.Test;
public class TestCoeffEncoder {
public static int[][][][] cloneProb() {
int[][][][] ref = VPXConst.tokenDefaultBinProbs;
int[][][][] result = new int[4][8][3][11];
for (int i = 0; i < ref.length; i++)
for (int j = 0; j < ref[i].length; j++)
for (int k = 0; k < ref[i][j].length; k++)
for (int l = 0; l < ref[i][j][k].length; l++)
result[i][j][k][l] = ref[i][j][k][l];
return result;
}
static int[][][][] binProbs1 = cloneProb();
static int[][][][] binProbs2 = cloneProb();
static int[][][][] binProbs3 = cloneProb();
static {
binProbs1[1][6][2][2] = 1;
binProbs1[1][6][2][3] = 1;
binProbs1[1][6][2][6] = 1;
binProbs1[2][0][0][0] = 1;
binProbs1[2][0][1][3] = 1;
binProbs1[2][1][2][2] = 1;
binProbs1[2][1][2][3] = 1;
binProbs1[2][1][2][6] = 128;
binProbs1[2][2][2][3] = 1;
binProbs1[2][2][2][6] = 128;
binProbs1[2][4][2][1] = 255;
binProbs1[2][5][0][1] = 1;
binProbs1[2][5][0][2] = 1;
binProbs1[2][6][0][2] = 51;
binProbs1[2][6][0][3] = 80;
binProbs1[2][6][1][0] = 1;
binProbs1[2][6][1][2] = 1;
binProbs1[2][6][1][3] = 64;
binProbs1[2][6][2][2] = 1;
binProbs2[2][0][0][0] = 1;
binProbs2[2][1][2][2] = 1;
binProbs2[2][1][2][3] = 32;
binProbs2[2][1][2][6] = 146;
binProbs2[2][2][2][3] = 32;
binProbs2[2][2][2][6] = 110;
binProbs2[2][3][2][2] = 1;
binProbs2[2][3][2][3] = 1;
binProbs2[2][4][2][2] = 1;
binProbs2[2][5][2][0] = 1;
binProbs2[2][5][2][2] = 85;
binProbs2[2][6][0][2] = 96;
binProbs2[2][6][1][0] = 1;
binProbs2[2][6][1][2] = 70;
binProbs2[2][6][1][3] = 160;
binProbs2[2][6][2][0] = 1;
binProbs2[2][6][2][2] = 54;
binProbs2[3][0][2][3] = 1;
binProbs2[3][0][2][6] = 57;
binProbs2[3][1][2][2] = 1;
binProbs2[3][1][2][3] = 51;
binProbs2[3][1][2][6] = 43;
binProbs2[3][1][2][9] = 85;
binProbs2[3][2][2][3] = 39;
binProbs2[3][2][2][6] = 1;
binProbs2[3][2][2][8] = 163;
binProbs2[3][2][2][9] = 110;
binProbs2[3][4][2][3] = 26;
binProbs2[3][4][2][6] = 114;
binProbs2[3][5][0][2] = 1;
binProbs2[3][5][2][2] = 23;
binProbs2[3][5][2][3] = 77;
binProbs2[3][5][2][6] = 146;
binProbs2[3][6][0][2] = 7;
binProbs2[3][6][0][3] = 38;
binProbs2[3][6][0][6] = 132;
binProbs2[3][6][0][7] = 51;
binProbs2[3][6][2][2] = 21;
binProbs2[3][6][2][3] = 68;
binProbs2[3][6][2][6] = 132;
binProbs2[3][6][2][7] = 15;
binProbs2[3][7][0][2] = 102;
binProbs2[3][7][2][0] = 28;
binProbs2[3][7][2][2] = 32;
binProbs3[0][2][2][3] = 1;
binProbs3[0][2][2][6] = 64;
binProbs3[0][3][2][3] = 64;
binProbs3[0][5][2][3] = 64;
binProbs3[0][6][2][0] = 1;
binProbs3[0][6][2][1] = 1;
binProbs3[0][6][2][2] = 1;
binProbs3[0][6][2][3] = 43;
binProbs3[0][7][2][0] = 1;
binProbs3[1][6][2][2] = 1;
binProbs3[1][6][2][3] = 1;
binProbs3[1][6][2][6] = 1;
binProbs3[2][0][0][0] = 1;
binProbs3[2][0][1][3] = 1;
binProbs3[2][1][2][2] = 1;
binProbs3[2][1][2][3] = 1;
binProbs3[2][1][2][6] = 128;
binProbs3[2][2][2][3] = 1;
binProbs3[2][2][2][6] = 128;
binProbs3[2][4][2][1] = 128;
binProbs3[2][4][2][2] = 64;
binProbs3[2][5][0][2] = 1;
binProbs3[2][5][2][2] = 1;
binProbs3[2][6][0][2] = 98;
binProbs3[2][6][0][3] = 128;
binProbs3[2][6][1][0] = 1;
binProbs3[2][6][1][2] = 23;
binProbs3[2][6][1][3] = 102;
binProbs3[2][6][2][2] = 38;
}
@Test
public void testCoeffWHT() {
VPXBitstream bs = new VPXBitstream(binProbs1, 1);
bs.encodeCoeffsWHT(new MockVpxBooleanEncoder(
new int[] { 198, 35, 237, 223, 162, 145, 62, 254, 254, 243, 230, 196, 177, 153, 140, 133, 130, 129,
128, 81, 99, 181, 242, 249, 255, 128, 180, 157, 141, 134, 130, 128, 23, 91, 163, 242, 247, 255,
128, 180, 157, 141, 134, 130, 128, 44, 130, 201, 253, 255, 128, 128, 173, 148, 140, 128, 45,
99, 1, 1, 1, 128, 128, 254, 254, 243, 230, 196, 177, 153, 140, 133, 130, 129, 128, 22, 100,
174, 245, 255, 128, 128, 254, 254, 243, 230, 196, 177, 153, 140, 133, 130, 129, 128, 35, 77,
181, 251, 255, 128, 128, 180, 157, 141, 134, 130, 128, 45, 99, 1, 1, 1, 128, 128, 254, 254,
243, 230, 196, 177, 153, 140, 133, 130, 129, 128, 45, 99, 1, 1, 1, 128, 128, 254, 254, 243,
230, 196, 177, 153, 140, 133, 130, 129, 128, 45, 99, 1, 1, 1, 128, 128, 180, 157, 141, 134,
130, 128, 45, 99, 1, 1, 1, 128, 128, 254, 254, 243, 230, 196, 177, 153, 140, 133, 130, 129,
128, 45, 99, 1, 1, 1, 128, 128, 254, 254, 243, 230, 196, 177, 153, 140, 133, 130, 129, 128, 45,
99, 1, 1, 1, 128, 128, 173, 148, 140, 128, 45, 99, 1, 1, 1, 128, 128, 180, 157, 141, 134, 130,
128, 45, 99, 1, 1, 1, 128, 128, 180, 157, 141, 134, 130, 128, 137, 1, 177, 255, 128, 128, 128,
254, 254, 243, 230, 196, 177, 153, 140, 133, 130, 129, 128 }, new int[] { 1, 1, 1, 1, 1, 1, 1,
0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1,
1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0,
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0,
0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1,
1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1 }), new int[] { 156, -58, 54,
-15, -97, -75, -54, 91, 91, -54, -75, -97, -15, 54, -58, -363 }, 0);
}
@Test
public void testCoeffDCTY15() {
VPXBitstream bs = new VPXBitstream(binProbs3, 1);
bs.encodeCoeffsDCT15(new MockVpxBooleanEncoder(new int[] { 253, 136, 254, 255, 128, 128, 128, 173, 148, 140,
128, 78, 134, 202, 1, 64, 128, 128, 180, 157, 141, 134, 130, 128, 77, 110, 216, 64, 128, 128, 128, 176,
155, 140, 135, 128, 1, 1, 1, 43, 128, 128, 128, 173, 148, 140, 128, 37, 116, 196, 243, 255, 255, 165,
145, 128, 102, 103, 231, 64, 128, 128, 159, 128, 1, 1, 1, 43, 128, 128, 128, 173, 148, 140, 128, 1, 1,
1, 43, 128, 128, 128, 173, 148, 140, 128, 1, 1, 1, 43, 128, 128, 128, 173, 148, 140, 128, 1, 1, 1, 43,
128, 128, 165, 145, 128, 1, 1, 1, 43, 128, 128, 165, 145, 128, 1, 1, 1, 43, 128, 128, 165, 145, 128, 1,
1, 1, 43, 128, 128, 159, 128, 1, 1, 1, 43, 128, 128, 159, 128, 1, 128, 128, 128, 128, 128, 128 },
new int[] { 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0,
1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0,
0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1,
0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1,
1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1 }), new int[] { 0, 13, 38, -29,
-16, 10, 5, -12, 13, 16, -7, 10, -7, 5, -5, -3 }, 0, 0, 0);
}
@Test
public void testCoeffDCTY16() {
VPXBitstream bs = new VPXBitstream(binProbs2, 1);
bs.encodeCoeffsDCT16(new MockVpxBooleanEncoder(new int[] { 202, 24, 213, 235, 220, 240, 255, 254, 254, 243,
230, 196, 177, 153, 140, 133, 130, 129, 128, 39, 77, 1, 51, 43, 255, 85, 176, 155, 140, 135, 128, 24,
71, 130, 39, 1, 163, 110, 176, 155, 140, 135, 128, 28, 108, 121, 7, 38, 132, 128, 128, 176, 155, 140,
135, 128, 20, 95, 222, 1, 255, 128, 128, 165, 145, 128, 42, 80, 121, 121, 7, 38, 132, 51, 165, 145,
128, 42, 80, 21, 68, 132, 15, 165, 145, 128, 42, 80, 121, 7, 38, 132, 51, 165, 145, 128, 42, 80, 121,
1, 102, 128, 128, 128, 128 }, new int[] { 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1,
1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0,
0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0,
1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1 }), new int[] { 83, 21, 21, 0, -19, 0, -9, 0, 0, -9,
8, 0, 8, 0, 0, -3 }, 0, 0, 0);
}
@Test
public void testCoeffDCTU() {
VPXBitstream bs = new VPXBitstream(binProbs1, 1);
bs.encodeCoeffsDCTUV(new MockVpxBooleanEncoder(new int[] { 1, 9, 248, 251, 255, 128, 128, 176, 155, 140, 135,
128, 155, 77, 1, 1, 128, 128, 128, 176, 155, 140, 135, 128, 69, 46, 190, 1, 128, 128, 128, 176, 155,
140, 135, 128, 141, 124, 134, 51, 80, 128, 128, 128, 173, 148, 140, 128, 149, 255, 1, 1, 128, 128, 128,
128, 173, 148, 140, 128, 55, 93, 134, 134, 51, 80, 128, 128, 128, 173, 148, 140, 128, 55, 93, 1, 128,
128, 128, 159, 128, 55, 93, 134, 51, 80, 128, 128, 159, 128, 55, 93, 134, 128, 128, 128, 128, 128 },
new int[] { 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0,
1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0,
0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1,
1, 0, 0, 0 }), new int[] { 19, 34, 34, 0, 16, 0, -14, 0, 0, -11, -5, 0, -6, 0, 0, 2 }, 1, 0, 0,
0);
}
public static class MockVpxBooleanEncoder extends VPXBooleanEncoder {
private int[] probs;
private int[] bits;
private int cur;
public MockVpxBooleanEncoder(int[] probs, int[] bits) {
super(null);
this.probs = probs;
this.bits = bits;
}
public void writeBit(int prob, int bit) {
Assert.assertEquals(probs[cur], prob);
Assert.assertEquals(bits[cur], bit);
cur++;
}
}
// public static void main1(String[] args) {
// int[][][][] ref = VPXConst.tokenDefaultBinProbs;
// int[][][][] comp = binProbs3;
// for (int i = 0; i < ref.length; i++) {
// for (int j = 0; j < ref[i].length; j++) {
// for (int k = 0; k < ref[i][j].length; k++) {
// for (int l = 0; l < ref[i][j][k].length; l++)
// if (ref[i][j][k][l] != comp[i][j][k][l]) {
// System.out.println("binProbs3[" + i + "][" + j + "][" + k + "][" + l +
// "] = "
// + comp[i][j][k][l] + ";");
// }
// }
// }
// }
// }
}