private static VLC readHuffmanTable(MemoryStream data) { VLCBuilder builder = new VLCBuilder(); byte[] levelSizes = StreamExtensions.toArray(StreamExtensions.read(data, 16)); int levelStart = 0; for (int i = 0; i < 16; i++) { int length = levelSizes[i] & 0xff; for (int c = 0; c < length; c++) { int val = data.get() & 0xff; int code = levelStart++; builder.set(code, i + 1, val); } levelStart <<= 1; } return(builder.getVLC()); }
static MPEGConst() { vlcAddressIncrement = new VLC("1", "011", "010", "0011", "0010", "00011", "00010", "0000111", "0000110", "00001011", "00001010", "00001001", "00001000", "00000111", "00000110", "0000010111", "0000010110", "0000010101", "0000010100", "0000010011", "0000010010", "00000100011", "00000100010", "00000100001", "00000100000", "00000011111", "00000011110", "00000011101", "00000011100", "00000011011", "00000011010", "00000011001", "00000011000"); vlcMBTypeI = new VLC("1", "01"); mbTypeValI = new MBType[] { new MBType(0, 0, 0, 0, 1, 0, 0), new MBType(1, 0, 0, 0, 1, 0, 0) }; vlcMBTypeP = new VLC("1", "01", "001", "00011", "00010", "00001", "000001"); mbTypeValP = new MBType[] { new MBType(0, 1, 0, 1, 0, 0, 0), new MBType(0, 0, 0, 1, 0, 0, 0), new MBType(0, 1, 0, 0, 0, 0, 0), new MBType(0, 0, 0, 0, 1, 0, 0), new MBType(1, 1, 0, 1, 0, 0, 0), new MBType(1, 0, 0, 1, 0, 0, 0), new MBType(1, 0, 0, 0, 1, 0, 0) }; vlcMBTypeB = new VLC("10", "11", "010", "011", "0010", "0011", "00011", "00010", "000011", "000010", "000001"); mbTypeValB = new MBType[] { new MBType(0, 1, 1, 0, 0, 0, 0), new MBType(0, 1, 1, 1, 0, 0, 0), new MBType(0, 0, 1, 0, 0, 0, 0), new MBType(0, 0, 1, 1, 0, 0, 0), new MBType(0, 1, 0, 0, 0, 0, 0), new MBType(0, 1, 0, 1, 0, 0, 0), new MBType(0, 0, 0, 0, 1, 0, 0), new MBType(1, 1, 1, 1, 0, 0, 0), new MBType(1, 1, 0, 1, 0, 0, 0), new MBType(1, 0, 1, 1, 0, 0, 0), new MBType(1, 0, 0, 0, 1, 0, 0) }; vlcMBTypeISpat = new VLC("1", "01", "0011", "0010", "0001"); mbTypeValISpat = new MBType[] { new MBType(0, 0, 0, 0, 1, 0, 0), new MBType(1, 0, 0, 0, 1, 0, 0), new MBType(0, 0, 0, 0, 1, 0, 0), new MBType(1, 0, 0, 0, 1, 0, 0), new MBType(0, 0, 0, 0, 0, 0, 0) }; vlcMBTypePSpat = new VLC("10", "011", "0000100", "000111", "0010", "0000111", "0011", "010", "000100", "0000110", "11", "000101", "000110", "0000101", "0000010", "0000011"); mbTypeValPSpat = new MBType[] { new MBType(0, 1, 0, 1, 0, 0, 0), new MBType(0, 1, 0, 1, 0, 1, 0), new MBType(0, 0, 0, 1, 0, 0, 0), new MBType(0, 0, 0, 1, 0, 1, 0), new MBType(0, 1, 0, 0, 0, 0, 0), new MBType(0, 0, 0, 0, 1, 0, 0), new MBType(0, 1, 0, 0, 0, 1, 0), new MBType(1, 1, 0, 1, 0, 0, 0), new MBType(1, 0, 0, 1, 0, 0, 0), new MBType(1, 0, 0, 0, 1, 0, 0), new MBType(1, 1, 0, 1, 0, 1, 0), new MBType(1, 0, 0, 1, 0, 1, 0), new MBType(0, 0, 0, 0, 0, 1, 0), new MBType(0, 0, 0, 1, 0, 0, 0), new MBType(1, 0, 0, 1, 0, 0, 0), new MBType(0, 0, 0, 0, 0, 0, 0) }; vlcMBTypeBSpat = new VLC("10", "11", "010", "011", "0010", "0011", "000110", "000111", "000100", "000101", "0000110", "0000111", "0000100", "0000101", "00000100", "00000101", "000001100", "000001110", "000001101", "000001111"); mbTypeValBSpat = new MBType[] { new MBType(0, 1, 1, 0, 0, 0, 0), new MBType(0, 1, 1, 1, 0, 0, 0), new MBType(0, 0, 1, 0, 0, 0, 0), new MBType(0, 0, 1, 1, 0, 0, 0), new MBType(0, 1, 0, 0, 0, 0, 0), new MBType(0, 1, 0, 1, 0, 0, 0), new MBType(0, 0, 1, 0, 0, 1, 0), new MBType(0, 0, 1, 1, 0, 1, 0), new MBType(0, 1, 0, 0, 0, 1, 0), new MBType(0, 1, 0, 1, 0, 1, 0), new MBType(0, 0, 0, 0, 1, 0, 0), new MBType(1, 1, 1, 1, 0, 0, 0), new MBType(1, 1, 0, 1, 0, 0, 0), new MBType(1, 0, 1, 1, 0, 0, 0), new MBType(1, 0, 0, 0, 1, 0, 0), new MBType(1, 1, 0, 1, 0, 1, 0), new MBType(1, 0, 1, 1, 0, 1, 0), new MBType(0, 0, 0, 0, 0, 0, 0), new MBType(1, 0, 0, 1, 0, 0, 0), new MBType(0, 0, 0, 1, 0, 0, 0) }; vlcMBTypeSNR = new VLC("1", "01", "001"); mbTypeValSNR = new MBType[] { new MBType(0, 0, 0, 1, 0, 0, 0), new MBType(1, 0, 0, 1, 0, 0, 0), new MBType(0, 0, 0, 0, 0, 0, 0) }; vlcCBP = new VLC("000000001", "01011", "01001", "001101", "1101", "0010111", "0010011", "00011111", "1100", "0010110", "0010010", "00011110", "10011", "00011011", "00010111", "00010011", "1011", "0010101", "0010001", "00011101", "10001", "00011001", "00010101", "00010001", "001111", "00001111", "00001101", "000000011", "01111", "00001011", "00000111", "000000111", "1010", "0010100", "0010000", "00011100", "001110", "00001110", "00001100", "000000010", "10000", "00011000", "00010100", "00010000", "01110", "00001010", "00000110", "000000110", "10010", "00011010", "00010110", "00010010", "01101", "00001001", "00000101", "000000101", "01100", "00001000", "00000100", "000000100", "111", "01010", "01000", "001100"); vlcMotionCode = new VLC("1", "01", "001", "0001", "000011", "0000101", "0000100", "0000011", "000001011", "000001010", "000001001", "0000010001", "0000010000", "0000001111", "0000001110", "0000001101", "0000001100"); vlcDualPrime = new VLC("11", "0", "10"); vlcDCSizeLuma = new VLC("100", "00", "01", "101", "110", "1110", "11110", "111110", "1111110", "11111110", "111111110", "111111111"); vlcDCSizeChroma = new VLC("00", "01", "10", "110", "1110", "11110", "111110", "1111110", "11111110", "111111110", "1111111110", "1111111111"); VLCBuilder vlcCoeffBldr = new VLCBuilder(); vlcCoeffBldr.set(CODE_ESCAPE, "000001"); vlcCoeffBldr.set(CODE_END, "10"); vlcCoeffBldr.set((0 << 6) | 1, "11"); vlcCoeffBldr.set((1 << 6) | 1, "011"); vlcCoeffBldr.set((0 << 6) | 2, "0100"); vlcCoeffBldr.set((2 << 6) | 1, "0101"); vlcCoeffBldr.set((0 << 6) | 3, "00101"); vlcCoeffBldr.set((3 << 6) | 1, "00111"); vlcCoeffBldr.set((4 << 6) | 1, "00110"); vlcCoeffBldr.set((1 << 6) | 2, "000110"); vlcCoeffBldr.set((5 << 6) | 1, "000111"); vlcCoeffBldr.set((6 << 6) | 1, "000101"); vlcCoeffBldr.set((7 << 6) | 1, "000100"); vlcCoeffBldr.set((0 << 6) | 4, "0000110"); vlcCoeffBldr.set((2 << 6) | 2, "0000100"); vlcCoeffBldr.set((8 << 6) | 1, "0000111"); vlcCoeffBldr.set((9 << 6) | 1, "0000101"); vlcCoeffBldr.set((0 << 6) | 5, "00100110"); vlcCoeffBldr.set((0 << 6) | 6, "00100001"); vlcCoeffBldr.set((1 << 6) | 3, "00100101"); vlcCoeffBldr.set((3 << 6) | 2, "00100100"); vlcCoeffBldr.set((10 << 6) | 1, "00100111"); vlcCoeffBldr.set((11 << 6) | 1, "00100011"); vlcCoeffBldr.set((12 << 6) | 1, "00100010"); vlcCoeffBldr.set((13 << 6) | 1, "00100000"); vlcCoeffBldr.set((0 << 6) | 7, "0000001010"); vlcCoeffBldr.set((1 << 6) | 4, "0000001100"); vlcCoeffBldr.set((2 << 6) | 3, "0000001011"); vlcCoeffBldr.set((4 << 6) | 2, "0000001111"); vlcCoeffBldr.set((5 << 6) | 2, "0000001001"); vlcCoeffBldr.set((14 << 6) | 1, "0000001110"); vlcCoeffBldr.set((15 << 6) | 1, "0000001101"); vlcCoeffBldr.set((16 << 6) | 1, "0000001000"); vlcCoeffBldr.set((0 << 6) | 8, "000000011101"); vlcCoeffBldr.set((0 << 6) | 9, "000000011000"); vlcCoeffBldr.set((0 << 6) | 10, "000000010011"); vlcCoeffBldr.set((0 << 6) | 11, "000000010000"); vlcCoeffBldr.set((1 << 6) | 5, "000000011011"); vlcCoeffBldr.set((2 << 6) | 4, "000000010100"); vlcCoeffBldr.set((3 << 6) | 3, "000000011100"); vlcCoeffBldr.set((4 << 6) | 3, "000000010010"); vlcCoeffBldr.set((6 << 6) | 2, "000000011110"); vlcCoeffBldr.set((7 << 6) | 2, "000000010101"); vlcCoeffBldr.set((8 << 6) | 2, "000000010001"); vlcCoeffBldr.set((17 << 6) | 1, "000000011111"); vlcCoeffBldr.set((18 << 6) | 1, "000000011010"); vlcCoeffBldr.set((19 << 6) | 1, "000000011001"); vlcCoeffBldr.set((20 << 6) | 1, "000000010111"); vlcCoeffBldr.set((21 << 6) | 1, "000000010110"); vlcCoeffBldr.set((0 << 6) | 12, "0000000011010"); vlcCoeffBldr.set((0 << 6) | 13, "0000000011001"); vlcCoeffBldr.set((0 << 6) | 14, "0000000011000"); vlcCoeffBldr.set((0 << 6) | 15, "0000000010111"); vlcCoeffBldr.set((1 << 6) | 6, "0000000010110"); vlcCoeffBldr.set((1 << 6) | 7, "0000000010101"); vlcCoeffBldr.set((2 << 6) | 5, "0000000010100"); vlcCoeffBldr.set((3 << 6) | 4, "0000000010011"); vlcCoeffBldr.set((5 << 6) | 3, "0000000010010"); vlcCoeffBldr.set((9 << 6) | 2, "0000000010001"); vlcCoeffBldr.set((10 << 6) | 2, "0000000010000"); vlcCoeffBldr.set((22 << 6) | 1, "0000000011111"); vlcCoeffBldr.set((23 << 6) | 1, "0000000011110"); vlcCoeffBldr.set((24 << 6) | 1, "0000000011101"); vlcCoeffBldr.set((25 << 6) | 1, "0000000011100"); vlcCoeffBldr.set((26 << 6) | 1, "0000000011011"); vlcCoeffBldr.set((0 << 6) | 16, "00000000011111"); vlcCoeffBldr.set((0 << 6) | 17, "00000000011110"); vlcCoeffBldr.set((0 << 6) | 18, "00000000011101"); vlcCoeffBldr.set((0 << 6) | 19, "00000000011100"); vlcCoeffBldr.set((0 << 6) | 20, "00000000011011"); vlcCoeffBldr.set((0 << 6) | 21, "00000000011010"); vlcCoeffBldr.set((0 << 6) | 22, "00000000011001"); vlcCoeffBldr.set((0 << 6) | 23, "00000000011000"); vlcCoeffBldr.set((0 << 6) | 24, "00000000010111"); vlcCoeffBldr.set((0 << 6) | 25, "00000000010110"); vlcCoeffBldr.set((0 << 6) | 26, "00000000010101"); vlcCoeffBldr.set((0 << 6) | 27, "00000000010100"); vlcCoeffBldr.set((0 << 6) | 28, "00000000010011"); vlcCoeffBldr.set((0 << 6) | 29, "00000000010010"); vlcCoeffBldr.set((0 << 6) | 30, "00000000010001"); vlcCoeffBldr.set((0 << 6) | 31, "00000000010000"); vlcCoeffBldr.set((0 << 6) | 32, "000000000011000"); vlcCoeffBldr.set((0 << 6) | 33, "000000000010111"); vlcCoeffBldr.set((0 << 6) | 34, "000000000010110"); vlcCoeffBldr.set((0 << 6) | 35, "000000000010101"); vlcCoeffBldr.set((0 << 6) | 36, "000000000010100"); vlcCoeffBldr.set((0 << 6) | 37, "000000000010011"); vlcCoeffBldr.set((0 << 6) | 38, "000000000010010"); vlcCoeffBldr.set((0 << 6) | 39, "000000000010001"); vlcCoeffBldr.set((0 << 6) | 40, "000000000010000"); vlcCoeffBldr.set((1 << 6) | 8, "000000000011111"); vlcCoeffBldr.set((1 << 6) | 9, "000000000011110"); vlcCoeffBldr.set((1 << 6) | 10, "000000000011101"); vlcCoeffBldr.set((1 << 6) | 11, "000000000011100"); vlcCoeffBldr.set((1 << 6) | 12, "000000000011011"); vlcCoeffBldr.set((1 << 6) | 13, "000000000011010"); vlcCoeffBldr.set((1 << 6) | 14, "000000000011001"); vlcCoeffBldr.set((1 << 6) | 15, "0000000000010011"); vlcCoeffBldr.set((1 << 6) | 16, "0000000000010010"); vlcCoeffBldr.set((1 << 6) | 17, "0000000000010001"); vlcCoeffBldr.set((1 << 6) | 18, "0000000000010000"); vlcCoeffBldr.set((6 << 6) | 3, "0000000000010100"); vlcCoeffBldr.set((11 << 6) | 2, "0000000000011010"); vlcCoeffBldr.set((12 << 6) | 2, "0000000000011001"); vlcCoeffBldr.set((13 << 6) | 2, "0000000000011000"); vlcCoeffBldr.set((14 << 6) | 2, "0000000000010111"); vlcCoeffBldr.set((15 << 6) | 2, "0000000000010110"); vlcCoeffBldr.set((16 << 6) | 2, "0000000000010101"); vlcCoeffBldr.set((27 << 6) | 1, "0000000000011111"); vlcCoeffBldr.set((28 << 6) | 1, "0000000000011110"); vlcCoeffBldr.set((29 << 6) | 1, "0000000000011101"); vlcCoeffBldr.set((30 << 6) | 1, "0000000000011100"); vlcCoeffBldr.set((31 << 6) | 1, "0000000000011011"); vlcCoeff0 = vlcCoeffBldr.getVLC(); vlcCoeffBldr = new VLCBuilder(); vlcCoeffBldr.set(CODE_ESCAPE, "000001"); vlcCoeffBldr.set(CODE_END, "0110"); vlcCoeffBldr.set((0 << 6) | 1, "10"); vlcCoeffBldr.set((1 << 6) | 1, "010"); vlcCoeffBldr.set((0 << 6) | 2, "110"); vlcCoeffBldr.set((2 << 6) | 1, "00101"); vlcCoeffBldr.set((0 << 6) | 3, "0111"); vlcCoeffBldr.set((3 << 6) | 1, "00111"); vlcCoeffBldr.set((4 << 6) | 1, "000110"); vlcCoeffBldr.set((1 << 6) | 2, "00110"); vlcCoeffBldr.set((5 << 6) | 1, "000111"); vlcCoeffBldr.set((6 << 6) | 1, "0000110"); vlcCoeffBldr.set((7 << 6) | 1, "0000100"); vlcCoeffBldr.set((0 << 6) | 4, "11100"); vlcCoeffBldr.set((2 << 6) | 2, "0000111"); vlcCoeffBldr.set((8 << 6) | 1, "0000101"); vlcCoeffBldr.set((9 << 6) | 1, "1111000"); vlcCoeffBldr.set((0 << 6) | 5, "11101"); vlcCoeffBldr.set((0 << 6) | 6, "000101"); vlcCoeffBldr.set((1 << 6) | 3, "1111001"); vlcCoeffBldr.set((3 << 6) | 2, "00100110"); vlcCoeffBldr.set((10 << 6) | 1, "1111010"); vlcCoeffBldr.set((11 << 6) | 1, "00100001"); vlcCoeffBldr.set((12 << 6) | 1, "00100101"); vlcCoeffBldr.set((13 << 6) | 1, "00100100"); vlcCoeffBldr.set((0 << 6) | 7, "000100"); vlcCoeffBldr.set((1 << 6) | 4, "00100111"); vlcCoeffBldr.set((2 << 6) | 3, "11111100"); vlcCoeffBldr.set((4 << 6) | 2, "11111101"); vlcCoeffBldr.set((5 << 6) | 2, "000000100"); vlcCoeffBldr.set((14 << 6) | 1, "000000101"); vlcCoeffBldr.set((15 << 6) | 1, "000000111"); vlcCoeffBldr.set((16 << 6) | 1, "0000001101"); vlcCoeffBldr.set((0 << 6) | 8, "1111011"); vlcCoeffBldr.set((0 << 6) | 9, "1111100"); vlcCoeffBldr.set((0 << 6) | 10, "00100011"); vlcCoeffBldr.set((0 << 6) | 11, "00100010"); vlcCoeffBldr.set((1 << 6) | 5, "00100000"); vlcCoeffBldr.set((2 << 6) | 4, "0000001100"); vlcCoeffBldr.set((3 << 6) | 3, "000000011100"); vlcCoeffBldr.set((4 << 6) | 3, "000000010010"); vlcCoeffBldr.set((6 << 6) | 2, "000000011110"); vlcCoeffBldr.set((7 << 6) | 2, "000000010101"); vlcCoeffBldr.set((8 << 6) | 2, "000000010001"); vlcCoeffBldr.set((17 << 6) | 1, "000000011111"); vlcCoeffBldr.set((18 << 6) | 1, "000000011010"); vlcCoeffBldr.set((19 << 6) | 1, "000000011001"); vlcCoeffBldr.set((20 << 6) | 1, "000000010111"); vlcCoeffBldr.set((21 << 6) | 1, "000000010110"); vlcCoeffBldr.set((0 << 6) | 12, "11111010"); vlcCoeffBldr.set((0 << 6) | 13, "11111011"); vlcCoeffBldr.set((0 << 6) | 14, "11111110"); vlcCoeffBldr.set((0 << 6) | 15, "11111111"); vlcCoeffBldr.set((1 << 6) | 6, "0000000010110"); vlcCoeffBldr.set((1 << 6) | 7, "0000000010101"); vlcCoeffBldr.set((2 << 6) | 5, "0000000010100"); vlcCoeffBldr.set((3 << 6) | 4, "0000000010011"); vlcCoeffBldr.set((5 << 6) | 3, "0000000010010"); vlcCoeffBldr.set((9 << 6) | 2, "0000000010001"); vlcCoeffBldr.set((10 << 6) | 2, "0000000010000"); vlcCoeffBldr.set((22 << 6) | 1, "0000000011111"); vlcCoeffBldr.set((23 << 6) | 1, "0000000011110"); vlcCoeffBldr.set((24 << 6) | 1, "0000000011101"); vlcCoeffBldr.set((25 << 6) | 1, "0000000011100"); vlcCoeffBldr.set((26 << 6) | 1, "0000000011011"); vlcCoeffBldr.set((0 << 6) | 16, "00000000011111"); vlcCoeffBldr.set((0 << 6) | 17, "00000000011110"); vlcCoeffBldr.set((0 << 6) | 18, "00000000011101"); vlcCoeffBldr.set((0 << 6) | 19, "00000000011100"); vlcCoeffBldr.set((0 << 6) | 20, "00000000011011"); vlcCoeffBldr.set((0 << 6) | 21, "00000000011010"); vlcCoeffBldr.set((0 << 6) | 22, "00000000011001"); vlcCoeffBldr.set((0 << 6) | 23, "00000000011000"); vlcCoeffBldr.set((0 << 6) | 24, "00000000010111"); vlcCoeffBldr.set((0 << 6) | 25, "00000000010110"); vlcCoeffBldr.set((0 << 6) | 26, "00000000010101"); vlcCoeffBldr.set((0 << 6) | 27, "00000000010100"); vlcCoeffBldr.set((0 << 6) | 28, "00000000010011"); vlcCoeffBldr.set((0 << 6) | 29, "00000000010010"); vlcCoeffBldr.set((0 << 6) | 30, "00000000010001"); vlcCoeffBldr.set((0 << 6) | 31, "00000000010000"); vlcCoeffBldr.set((0 << 6) | 32, "000000000011000"); vlcCoeffBldr.set((0 << 6) | 33, "000000000010111"); vlcCoeffBldr.set((0 << 6) | 34, "000000000010110"); vlcCoeffBldr.set((0 << 6) | 35, "000000000010101"); vlcCoeffBldr.set((0 << 6) | 36, "000000000010100"); vlcCoeffBldr.set((0 << 6) | 37, "000000000010011"); vlcCoeffBldr.set((0 << 6) | 38, "000000000010010"); vlcCoeffBldr.set((0 << 6) | 39, "000000000010001"); vlcCoeffBldr.set((0 << 6) | 40, "000000000010000"); vlcCoeffBldr.set((1 << 6) | 8, "000000000011111"); vlcCoeffBldr.set((1 << 6) | 9, "000000000011110"); vlcCoeffBldr.set((1 << 6) | 10, "000000000011101"); vlcCoeffBldr.set((1 << 6) | 11, "000000000011100"); vlcCoeffBldr.set((1 << 6) | 12, "000000000011011"); vlcCoeffBldr.set((1 << 6) | 13, "000000000011010"); vlcCoeffBldr.set((1 << 6) | 14, "000000000011001"); vlcCoeffBldr.set((1 << 6) | 15, "0000000000010011"); vlcCoeffBldr.set((1 << 6) | 16, "0000000000010010"); vlcCoeffBldr.set((1 << 6) | 17, "0000000000010001"); vlcCoeffBldr.set((1 << 6) | 18, "0000000000010000"); vlcCoeffBldr.set((6 << 6) | 3, "0000000000010100"); vlcCoeffBldr.set((11 << 6) | 2, "0000000000011010"); vlcCoeffBldr.set((12 << 6) | 2, "0000000000011001"); vlcCoeffBldr.set((13 << 6) | 2, "0000000000011000"); vlcCoeffBldr.set((14 << 6) | 2, "0000000000010111"); vlcCoeffBldr.set((15 << 6) | 2, "0000000000010110"); vlcCoeffBldr.set((16 << 6) | 2, "0000000000010101"); vlcCoeffBldr.set((27 << 6) | 1, "0000000000011111"); vlcCoeffBldr.set((28 << 6) | 1, "0000000000011110"); vlcCoeffBldr.set((29 << 6) | 1, "0000000000011101"); vlcCoeffBldr.set((30 << 6) | 1, "0000000000011100"); vlcCoeffBldr.set((31 << 6) | 1, "0000000000011011"); vlcCoeff1 = vlcCoeffBldr.getVLC(); }