package org.jcodec.codecs.h264; import static org.jcodec.codecs.h264.H264Const.PartPred.L0; import org.jcodec.codecs.h264.io.CABAC; import org.jcodec.codecs.h264.io.model.MBType; import org.jcodec.codecs.h264.io.model.SliceType; import org.junit.Assert; import org.junit.Test; public class CABACTest { @Test public void testMBTypeI() { MockMDecoder m = new MockMDecoder(new int[] { 0 }, new int[] { 3 }); Assert.assertEquals(0, new CABAC(1).readMBTypeI(m, null, null, false, false)); MockMEncoder e = new MockMEncoder(new int[] { 0 }, new int[] { 3 }); new CABAC(1).writeMBTypeI(e, null, null, false, false, 0); m = new MockMDecoder(new int[] { 1, 1 }, new int[] { 3, -2 }); Assert.assertEquals(25, new CABAC(1).readMBTypeI(m, null, null, false, false)); e = new MockMEncoder(new int[] { 1, 1 }, new int[] { 3, -2 }); new CABAC(1).writeMBTypeI(e, null, null, false, false, 25); m = new MockMDecoder(new int[] { 0 }, new int[] { 4 }); Assert.assertEquals(0, new CABAC(1).readMBTypeI(m, MBType.I_16x16, null, true, false)); m = new MockMDecoder(new int[] { 0 }, new int[] { 4 }); Assert.assertEquals(0, new CABAC(1).readMBTypeI(m, null, MBType.I_16x16, false, true)); m = new MockMDecoder(new int[] { 0 }, new int[] { 5 }); Assert.assertEquals(0, new CABAC(1).readMBTypeI(m, MBType.I_16x16, MBType.I_16x16, true, true)); m = new MockMDecoder(new int[] { 1, 0, 0, 1, 1, 1, 0 }, new int[] { 3, -2, 6, 7, 8, 9, 10 }); Assert.assertEquals(11, new CABAC(1).readMBTypeI(m, null, null, false, false)); e = new MockMEncoder(new int[] { 1, 0, 0, 1, 1, 1, 0 }, new int[] { 3, -2, 6, 7, 8, 9, 10 }); new CABAC(1).writeMBTypeI(e, null, null, false, false, 11); } @Test public void testMBTypeP() { CABAC cabac = new CABAC(2); MockMDecoder m = new MockMDecoder(new int[] { 0, 0, 1 }, new int[] { 14, 15, 16 }); Assert.assertEquals(3, cabac.readMBTypeP(m)); } @Test public void testReadIntraChromaPredMode() { MockMDecoder m = new MockMDecoder(new int[] { 0 }, new int[] { 64 }); Assert.assertEquals(0, new CABAC(1).readIntraChromaPredMode(m, 0, null, null, false, false)); MockMEncoder e = new MockMEncoder(new int[] { 0 }, new int[] { 64 }); new CABAC(1).writeIntraChromaPredMode(e, 0, null, null, false, false, 0); m = new MockMDecoder(new int[] { 1, 1, 1 }, new int[] { 64, 67, 67 }); Assert.assertEquals(3, new CABAC(1).readIntraChromaPredMode(m, 0, null, null, false, false)); e = new MockMEncoder(new int[] { 1, 1, 1 }, new int[] { 64, 67, 67 }); new CABAC(1).writeIntraChromaPredMode(e, 0, null, null, false, false, 3); } public void testMBQpDelta() { MockMDecoder m = new MockMDecoder(new int[] { 0 }, new int[] { 60 }); Assert.assertEquals(0, new CABAC(1).readMBQpDelta(m, null)); m = new MockMDecoder(new int[] { 1, 1, 1, 1, 1, 1, 0 }, new int[] { 60, 62, 63, 63, 63, 63, 63 }); Assert.assertEquals(6, new CABAC(1).readMBQpDelta(m, null)); MockMEncoder e = new MockMEncoder(new int[] { 0 }, new int[] { 60 }); new CABAC(1).writeMBQpDelta(e, null, 0); e = new MockMEncoder(new int[] { 1, 1, 1, 1, 1, 1, 0 }, new int[] { 60, 62, 63, 63, 63, 63, 63 }); new CABAC(1).writeMBQpDelta(e, null, 6); } @Test public void testRefIdx() { MockMDecoder m = new MockMDecoder(new int[] { 0 }, new int[] { 54 }); Assert.assertEquals(0, new CABAC(40).readRefIdx(m, true, false, null, null, L0, L0, L0, 17, 0, 0, 4, 4, 0)); m = new MockMDecoder(new int[] { 1, 0 }, new int[] { 54, 58 }); Assert.assertEquals(1, new CABAC(40).readRefIdx(m, true, true, MBType.P_16x16, MBType.P_16x16, L0, L0, L0, 23, 0, 0, 4, 2, 0)); m = new MockMDecoder(new int[] { 1, 0, 1, 0 }, new int[] { 54, 58, 55, 58 }); CABAC cabac = new CABAC(40); Assert.assertEquals(1, cabac.readRefIdx(m, true, false, MBType.P_16x16, null, L0, L0, L0, 21, 0, 0, 2, 4, 0)); Assert.assertEquals(1, cabac.readRefIdx(m, true, false, MBType.P_8x16, null, L0, L0, L0, 21, 2, 0, 2, 4, 0)); } @Test public void testMVD() { MockMDecoder m = new MockMDecoder(new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0 }, new int[] { 40, 43, 44, 45, 46, 46, 46, 46, 46, -1, -1, -1, -1, -1, -1, -1 }); CABAC cabac = new CABAC(2); Assert.assertEquals(28, cabac.readMVD(m, 0, false, false, null, null, L0, L0, L0, 0, 0, 0, 2, 1, 0)); m = new MockMDecoder(new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0 }, new int[] { 47, 50, 51, 52, 53, 53, 53, 53, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1 }); Assert.assertEquals(64, cabac.readMVD(m, 1, false, false, null, null, L0, L0, L0, 0, 0, 0, 2, 1, 0)); m = new MockMDecoder(new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0 }, new int[] { 41, 43, 44, 45, 46, 46, 46, 46, 46, -1, -1, -1, -1, -1, -1, -1, -1, -1 }); Assert.assertEquals(40, cabac.readMVD(m, 0, false, true, null, MBType.P_8x8, L0, L0, L0, 0, 0, 1, 2, 1, 0)); m = new MockMDecoder(new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1 }, new int[] { 49, 50, 51, 52, 53, 53, 53, 53, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }); Assert.assertEquals(-89, cabac.readMVD(m, 1, false, true, null, MBType.P_8x8, L0, L0, L0, 0, 0, 1, 2, 1, 0)); m = new MockMDecoder(new int[] { 1, 1, 1, 1, 0, 0 }, new int[] { 41, 43, 44, 45, 46, -1 }); Assert.assertEquals(4, cabac.readMVD(m, 0, true, false, MBType.P_8x8, null, L0, L0, L0, 0, 2, 0, 1, 2, 0)); m = new MockMDecoder(new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1 }, new int[] { 49, 50, 51, 52, 53, 53, 53, 53, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1 }); Assert.assertEquals(-40, cabac.readMVD(m, 1, true, false, MBType.P_8x8, null, L0, L0, L0, 0, 2, 0, 1, 2, 0)); m = new MockMDecoder(new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0 }, new int[] { 41, 43, 44, 45, 46, 46, 46, 46, 46, -1, -1, -1, -1, -1 }); Assert.assertEquals(16, cabac.readMVD(m, 0, true, false, MBType.P_8x8, null, L0, L0, L0, 0, 3, 0, 1, 2, 0)); m = new MockMDecoder(new int[] { 0 }, new int[] { 49 }); Assert.assertEquals(0, cabac.readMVD(m, 1, true, false, MBType.P_8x8, null, L0, L0, L0, 0, 3, 0, 1, 2, 0)); m = new MockMDecoder(new int[] { 0 }, new int[] { 42 }); Assert.assertEquals(0, cabac.readMVD(m, 0, false, true, null, MBType.P_8x8, L0, L0, L0, 0, 0, 2, 2, 2, 0)); m = new MockMDecoder(new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0 }, new int[] { 49, 50, 51, 52, 53, 53, 53, 53, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1 }); Assert.assertEquals(64, cabac.readMVD(m, 1, false, true, null, MBType.P_8x8, L0, L0, L0, 0, 0, 2, 2, 2, 0)); m = new MockMDecoder(new int[] { 0 }, new int[] { 41 }); Assert.assertEquals(0, cabac.readMVD(m, 0, true, true, MBType.P_8x8, MBType.P_8x8, L0, L0, L0, 0, 2, 2, 2, 2, 0)); m = new MockMDecoder(new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0 }, new int[] { 49, 50, 51, 52, 53, 53, 53, 53, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1 }); Assert.assertEquals(40, cabac.readMVD(m, 1, true, true, MBType.P_8x8, MBType.P_8x8, L0, L0, L0, 0, 2, 2, 2, 2, 0)); } @Test public void testMBSkipFlag() { CABAC cabac = new CABAC(2); MockMDecoder m = new MockMDecoder(new int[] { 0 }, new int[] { 11 }); Assert.assertEquals(false, cabac.readMBSkipFlag(m, SliceType.P, false, false, 0)); m = new MockMDecoder(new int[] { 0 }, new int[] { 12 }); Assert.assertEquals(false, cabac.readMBSkipFlag(m, SliceType.P, true, false, 1)); m = new MockMDecoder(new int[] { 0 }, new int[] { 12 }); Assert.assertEquals(false, cabac.readMBSkipFlag(m, SliceType.P, false, true, 0)); m = new MockMDecoder(new int[] { 0 }, new int[] { 13 }); Assert.assertEquals(false, cabac.readMBSkipFlag(m, SliceType.P, true, true, 1)); } @Test public void testSubMbType() { MockMDecoder m = new MockMDecoder(new int[] { 0, 0 }, new int[] { 21, 22 }); Assert.assertEquals(1, new CABAC(1).readSubMbTypeP(m)); m = new MockMDecoder(new int[] { 0, 1, 1 }, new int[] { 21, 22, 23 }); Assert.assertEquals(2, new CABAC(1).readSubMbTypeP(m)); m = new MockMDecoder(new int[] { 1 }, new int[] { 21 }); Assert.assertEquals(0, new CABAC(1).readSubMbTypeP(m)); } }