/** * MediaFrame is an Open Source streaming media platform in Java * which provides a fast, easy to implement and extremely small applet * that enables to view your audio/video content without having * to rely on external player applications or bulky plug-ins. * * Copyright (C) 2004/5 MediaFrame (http://www.mediaframe.org). * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ package mediaframe.mpeg4.video; import java.io.IOException; /** * Huffman */ public final class Huffman { // /** The length of max bitstring for the VLC table for MVD. */ // public final static int MVD_TAB_LENGTH = 13; /** The VLC table for MVD. */ public final static int[][] MVD_TAB = { { 2, 1, 0 }, // 0 { -1, -1, 0 }, // 1 1 { 6, 3, 0 }, // 2 0 { 5, 4, 0 }, // 3 01 { -1, -1, -1 }, // 4 011 { -1, -1, 1 }, // 5 010 { 10, 7, 0 }, // 6 00 { 9, 8, 0 }, // 7 001 { -1, -1, -2 }, // 8 0011 { -1, -1, 2 }, // 9 0010 { 14, 11, 0 }, // 10 000 { 13, 12, 0 }, // 11 0001 { -1, -1, -3 }, // 12 00011 { -1, -1, 3 }, // 13 00010 { 26, 15, 0 }, // 14 0000 { 19, 16, 0 }, // 15 00001 { 18, 17, 0 }, // 16 000011 { -1, -1, -4 }, // 17 0000111 { -1, -1, 4 }, // 18 0000110 { 23, 20, 0 }, // 19 000010 { 22, 21, 0 }, // 20 0000101 { -1, -1, -5 }, // 21 00001011 { -1, -1, 5 }, // 22 00001010 { 25, 24, 0 }, // 23 0000100 { -1, -1, -6 }, // 24 00001001 { -1, -1, 6 }, // 25 00001000 { 50, 27, 0 }, // 26 00000 { 31, 28, 0 }, // 27 000001 { 30, 29, 0 }, // 28 0000011 { -1, -1, -7 }, // 29 00000111 { -1, -1, 7 }, // 30 00000110 { 39, 32, 0 }, // 31 0000010 { 36, 33, 0 }, // 32 00000101 { 35, 34, 0 }, // 33 000001011 { -1, -1, -8 }, // 34 0000010111 { -1, -1, 8 }, // 35 0000010110 { 38, 37, 0 }, // 36 000001010 { -1, -1, -9 }, // 37 0000010101 { -1, -1, 9 }, // 38 0000010100 { 43, 40, 0 }, // 39 00000100 { 42, 41, 0 }, // 40 000001001 { -1, -1, -10 }, // 41 0000010011 { -1, -1, 10 }, // 42 0000010010 { 47, 44, 0 }, // 43 000001000 { 46, 45, 0 }, // 44 0000010001 { -1, -1, -11 }, // 45 00000100011 { -1, -1, 11 }, // 46 00000100010 { 49, 48, 0 }, // 47 0000010000 { -1, -1, -12 }, // 48 00000100001 { -1, -1, 12 }, // 49 00000100000 { 82, 51, 0 }, // 50 000000 { 67, 52, 0 }, // 51 0000001 { 60, 53, 0 }, // 52 00000011 { 57, 54, 0 }, // 53 000000111 { 56, 55, 0 }, // 54 0000001111 { -1, -1, -13 }, // 55 00000011111 { -1, -1, 13 }, // 56 00000011110 { 59, 58, 0 }, // 57 0000001110 { -1, -1, -14 }, // 58 00000011101 { -1, -1, 14 }, // 59 00000011100 { 64, 61, 0 }, // 60 000000110 { 63, 62, 0 }, // 61 0000001101 { -1, -1, -15 }, // 62 00000011011 { -1, -1, 15 }, // 63 00000011010 { 66, 65, 0 }, // 64 0000001100 { -1, -1, -16 }, // 65 00000011001 { -1, -1, 16 }, // 66 00000011000 { 75, 68, 0 }, // 67 00000010 { 72, 69, 0 }, // 68 000000101 { 71, 70, 0 }, // 69 0000001011 { -1, -1, -17 }, // 70 00000010111 { -1, -1, 17 }, // 71 00000010110 { 74, 73, 0 }, // 72 0000001010 { -1, -1, -18 }, // 73 00000010101 { -1, -1, 18 }, // 74 00000010100 { 79, 76, 0 }, // 75 000000100 { 78, 77, 0 }, // 76 0000001001 { -1, -1, -19 }, // 77 00000010011 { -1, -1, 19 }, // 78 00000010010 { 81, 80, 0 }, // 79 0000001000 { -1, -1, -20 }, // 80 00000010001 { -1, -1, 20 }, // 81 00000010000 { 98, 83, 0 }, // 82 0000000 { 91, 84, 0 }, // 83 00000001 { 88, 85, 0 }, // 84 000000011 { 87, 86, 0 }, // 85 0000000111 { -1, -1, -21 }, // 86 00000001111 { -1, -1, 21 }, // 87 00000001110 { 90, 89, 0 }, // 88 0000000110 { -1, -1, -22 }, // 89 00000001101 { -1, -1, 22 }, // 90 00000001100 { 95, 92, 0 }, // 91 000000010 { 94, 93, 0 }, // 92 0000000101 { -1, -1, -23 }, // 93 00000001011 { -1, -1, 23 }, // 94 00000001010 { 97, 96, 0 }, // 95 0000000100 { -1, -1, -24 }, // 96 00000001001 { -1, -1, 24 }, // 97 00000001000 { 114, 99, 0 }, // 98 00000000 { 107, 100, 0 }, // 99 000000001 { 104, 101, 0 }, // 100 0000000011 { 103, 102, 0 }, // 101 00000000111 { -1, -1, -25 }, // 102 000000001111 { -1, -1, 25 }, // 103 000000001110 { 106, 105, 0 }, // 104 00000000110 { -1, -1, -26 }, // 105 000000001101 { -1, -1, 26 }, // 106 000000001100 { 111, 108, 0 }, // 107 0000000010 { 110, 109, 0 }, // 108 00000000101 { -1, -1, -27 }, // 109 000000001011 { -1, -1, 27 }, // 110 000000001010 { 113, 112, 0 }, // 111 00000000100 { -1, -1, -28 }, // 112 000000001001 { -1, -1, 28 }, // 113 000000001000 { 122, 115, 0 }, // 114 000000000 { 119, 116, 0 }, // 115 0000000001 { 118, 117, 0 }, // 116 00000000011 { -1, -1, -29 }, // 117 000000000111 { -1, -1, 29 }, // 118 000000000110 { 121, 120, 0 }, // 119 00000000010 { -1, -1, -30 }, // 120 000000000101 { -1, -1, 30 }, // 121 000000000100 { -1, 123, 0 }, // 122 0000000000 { 127, 124, 0 }, // 123 00000000001 { 126, 125, 0 }, // 124 000000000011 { -1, -1, -31 }, // 125 0000000000111 { -1, -1, 31 }, // 126 0000000000110 { 129, 128, 0 }, // 127 000000000010 { -1, -1, -32 }, // 128 0000000000101 { -1, -1, 32 } // 129 0000000000100 }; // /** The length of max bitstring for the VLC table for TCOEFF. */ // public final static int TCOEF_TAB_LENGTH = 12; /** The ESCAPE code for TCOEFF. */ public final static int TCOEF_ESCAPE = 2; /** The VLC table for intra TCOEFF. */ public final static int[][] INTRA_TCOEF_TAB = { { 8, 1, 0 }, // 0 { 7, 2, 0 }, // 1 1 { 6, 3, 0 }, // 2 11 { 5, 4, 0 }, // 3 111 { -1, -1, 0, 0, 3 }, // 4 1111 { -1, -1, 0, 1, 1 }, // 5 1110 { -1, -1, 0, 0, 2 }, // 6 110 { -1, -1, 0, 0, 1 }, // 7 10 { 28, 9, 0 }, // 8 0 { 15, 10, 0 }, // 9 01 { 12, 11, 0 }, // 10 011 { -1, -1, 1, 0, 1 }, // 11 0111 { 14, 13, 0 }, // 12 0110 { -1, -1, 0, 0, 4 }, // 13 01101 { -1, -1, 0, 0, 5 }, // 14 01100 { 21, 16, 0 }, // 15 010 { 18, 17, 0 }, // 16 0101 { -1, -1, 0, 2, 1 }, // 17 01011 { 20, 19, 0 }, // 18 01010 { -1, -1, 0, 0, 6 }, // 19 010101 { -1, -1, 0, 1, 2 }, // 20 010100 { 25, 22, 0 }, // 21 0100 { 24, 23, 0 }, // 22 01001 { -1, -1, 0, 0, 7 }, // 23 010011 { -1, -1, 0, 0, 8 }, // 24 010010 { 27, 26, 0 }, // 25 01000 { -1, -1, 0, 3, 1 }, // 26 010001 { -1, -1, 0, 4, 1 }, // 27 010000 { 52, 29, 0 }, // 28 00 { 37, 30, 0 }, // 29 001 { 34, 31, 0 }, // 30 0011 { 33, 32, 0 }, // 31 00111 { -1, -1, 1, 1, 1 }, // 32 001111 { -1, -1, 1, 2, 1 }, // 33 001110 { 36, 35, 0 }, // 34 00110 { -1, -1, 0, 5, 1 }, // 35 001101 { -1, -1, 1, 0, 2 }, // 36 001100 { 45, 38, 0 }, // 37 0010 { 42, 39, 0 }, // 38 00101 { 41, 40, 0 }, // 39 001011 { -1, -1, 0, 0, 9 }, // 40 0010111 { -1, -1, 0, 1, 3 }, // 41 0010110 { 44, 43, 0 }, // 42 001010 { -1, -1, 0, 2, 2 }, // 43 0010101 { -1, -1, 0, 7, 1 }, // 44 0010100 { 49, 46, 0 }, // 45 00100 { 48, 47, 0 }, // 46 001001 { -1, -1, 1, 5, 1 }, // 47 0010011 { -1, -1, 0, 6, 1 }, // 48 0010010 { 51, 50, 0 }, // 49 001000 { -1, -1, 1, 3, 1 }, // 50 0010001 { -1, -1, 1, 4, 1 }, // 51 0010000 { 90, 53, 0 }, // 52 000 { 69, 54, 0 }, // 53 0001 { 62, 55, 0 }, // 54 00011 { 59, 56, 0 }, // 55 000111 { 58, 57, 0 }, // 56 0001111 { -1, -1, 0, 0, 10 }, // 57 00011111 { -1, -1, 0, 0, 11 }, // 58 00011110 { 61, 60, 0 }, // 59 0001110 { -1, -1, 0, 0, 12 }, // 60 00011101 { -1, -1, 0, 1, 4 }, // 61 00011100 { 66, 63, 0 }, // 62 000110 { 65, 64, 0 }, // 63 0001101 { -1, -1, 0, 3, 2 }, // 64 00011011 { -1, -1, 1, 9, 1 }, // 65 00011010 { 68, 67, 0 }, // 66 0001100 { -1, -1, 0, 8, 1 }, // 67 00011001 { -1, -1, 0, 9, 1 }, // 68 00011000 { 77, 70, 0 }, // 69 00010 { 74, 71, 0 }, // 70 000101 { 73, 72, 0 }, // 71 0001011 { -1, -1, 0, 10, 1 }, // 72 00010111 { -1, -1, 1, 0, 3 }, // 73 00010110 { 76, 75, 0 }, // 74 0001010 { -1, -1, 1, 6, 1 }, // 75 00010101 { -1, -1, 1, 7, 1 }, // 76 00010100 { 83, 78, 0 }, // 77 000100 { 80, 79, 0 }, // 78 0001001 { -1, -1, 1, 8, 1 }, // 79 00010011 { 82, 81, 0 }, // 80 00010010 { -1, -1, 0, 0, 13 }, // 81 000100101 { -1, -1, 0, 0, 14 }, // 82 000100100 { 87, 84, 0 }, // 83 0001000 { 86, 85, 0 }, // 84 00010001 { -1, -1, 0, 0, 15 }, // 85 000100011 { -1, -1, 0, 4, 2 }, // 86 000100010 { 89, 88, 0 }, // 87 00010000 { -1, -1, 0, 0, 16 }, // 88 000100001 { -1, -1, 0, 1, 5 }, // 89 000100000 { 124, 91, 0 }, // 90 0000 { 107, 92, 0 }, // 91 00001 { 100, 93, 0 }, // 92 000011 { 97, 94, 0 }, // 93 0000111 { 96, 95, 0 }, // 94 00001111 { -1, -1, 0, 1, 6 }, // 95 000011111 { -1, -1, 0, 2, 3 }, // 96 000011110 { 99, 98, 0 }, // 97 00001110 { -1, -1, 0, 3, 3 }, // 98 000011101 { -1, -1, 0, 5, 2 }, // 99 000011100 { 104, 101, 0 }, // 100 0000110 { 103, 102, 0 }, // 101 00001101 { -1, -1, 0, 6, 2 }, // 102 000011011 { -1, -1, 0, 7, 2 }, // 103 000011010 { 106, 105, 0 }, // 104 00001100 { -1, -1, 0, 11, 1 }, // 105 000011001 { -1, -1, 0, 12, 1 }, // 106 000011000 { 115, 108, 0 }, // 107 000010 { 112, 109, 0 }, // 108 0000101 { 111, 110, 0 }, // 109 00001011 { -1, -1, 1, 0, 4 }, // 110 000010111 { -1, -1, 1, 1, 2 }, // 111 000010110 { 114, 113, 0 }, // 112 00001010 { -1, -1, 1, 10, 1 }, // 113 000010101 { -1, -1, 1, 11, 1 }, // 114 000010100 { 119, 116, 0 }, // 115 0000100 { 118, 117, 0 }, // 116 00001001 { -1, -1, 1, 12, 1 }, // 117 000010011 { -1, -1, 1, 13, 1 }, // 118 000010010 { 121, 120, 0 }, // 119 00001000 { -1, -1, 1, 14, 1 }, // 120 000010001 { 123, 122, 0 }, // 121 000010000 { -1, -1, 0, 0, 17 }, // 122 0000100001 { -1, -1, 0, 0, 18 }, // 123 0000100000 { 174, 125, 0 }, // 124 00000 { 127, 126, 0 }, // 125 000001 { -1, -1, 2, 0, 0 }, // 126 0000011 { 159, 128, 0 }, // 127 0000010 { 144, 129, 0 }, // 128 00000101 { 137, 130, 0 }, // 129 000001011 { 134, 131, 0 }, // 130 0000010111 { 133, 132, 0 }, // 131 00000101111 { -1, -1, 1, 20, 1 }, // 132 000001011111 { -1, -1, 1, 19, 1 }, // 133 000001011110 { 136, 135, 0 }, // 134 00000101110 { -1, -1, 1, 18, 1 }, // 135 000001011101 { -1, -1, 1, 17, 1 }, // 136 000001011100 { 141, 138, 0 }, // 137 0000010110 { 140, 139, 0 }, // 138 00000101101 { -1, -1, 1, 6, 2 }, // 139 000001011011 { -1, -1, 1, 5, 2 }, // 140 000001011010 { 143, 142, 0 }, // 141 00000101100 { -1, -1, 1, 0, 8 }, // 142 000001011001 { -1, -1, 0, 14, 1 }, // 143 000001011000 { 152, 145, 0 }, // 144 000001010 { 149, 146, 0 }, // 145 0000010101 { 148, 147, 0 }, // 146 00000101011 { -1, -1, 0, 7, 3 }, // 147 000001010111 { -1, -1, 0, 2, 5 }, // 148 000001010110 { 151, 150, 0 }, // 149 00000101010 { -1, -1, 0, 1, 10 }, // 150 000001010101 { -1, -1, 0, 6, 3 }, // 151 000001010100 { 156, 153, 0 }, // 152 0000010100 { 155, 154, 0 }, // 153 00000101001 { -1, -1, 0, 1, 9 }, // 154 000001010011 { -1, -1, 0, 0, 27 }, // 155 000001010010 { 158, 157, 0 }, // 156 00000101000 { -1, -1, 0, 0, 26 }, // 157 000001010001 { -1, -1, 0, 0, 25 }, // 158 000001010000 { 167, 160, 0 }, // 159 00000100 { 164, 161, 0 }, // 160 000001001 { 163, 162, 0 }, // 161 0000010011 { -1, -1, 1, 16, 1 }, // 162 00000100111 { -1, -1, 1, 15, 1 }, // 163 00000100110 { 166, 165, 0 }, // 164 0000010010 { -1, -1, 1, 4, 2 }, // 165 00000100101 { -1, -1, 1, 3, 2 }, // 166 00000100100 { 171, 168, 0 }, // 167 000001000 { 170, 169, 0 }, // 168 0000010001 { -1, -1, 0, 9, 2 }, // 169 00000100011 { -1, -1, 0, 1, 8 }, // 170 00000100010 { 173, 172, 0 }, // 171 0000010000 { -1, -1, 0, 0, 24 }, // 172 00000100001 { -1, -1, 0, 0, 23 }, // 173 00000100000 { 190, 175, 0 }, // 174 000000 { 183, 176, 0 }, // 175 0000001 { 180, 177, 0 }, // 176 00000011 { 179, 178, 0 }, // 177 000000111 { -1, -1, 0, 0, 19 }, // 178 0000001111 { -1, -1, 0, 0, 20 }, // 179 0000001110 { 182, 181, 0 }, // 180 000000110 { -1, -1, 0, 1, 7 }, // 181 0000001101 { -1, -1, 0, 2, 4 }, // 182 0000001100 { 187, 184, 0 }, // 183 00000010 { 186, 185, 0 }, // 184 000000101 { -1, -1, 0, 3, 4 }, // 185 0000001011 { -1, -1, 0, 4, 3 }, // 186 0000001010 { 189, 188, 0 }, // 187 000000100 { -1, -1, 0, 8, 2 }, // 188 0000001001 { -1, -1, 0, 5, 3 }, // 189 0000001000 { 198, 191, 0 }, // 190 0000000 { 195, 192, 0 }, // 191 00000001 { 194, 193, 0 }, // 192 000000011 { -1, -1, 0, 13, 1 }, // 193 0000000111 { -1, -1, 1, 0, 5 }, // 194 0000000110 { 197, 196, 0 }, // 195 000000010 { -1, -1, 1, 1, 3 }, // 196 0000000101 { -1, -1, 1, 2, 2 }, // 197 0000000100 { -1, 199, 0 }, // 198 00000000 { 203, 200, 0 }, // 199 000000001 { 202, 201, 0 }, // 200 0000000011 { -1, -1, 0, 0, 21 }, // 201 00000000111 { -1, -1, 0, 0, 22 }, // 202 00000000110 { 205, 204, 0 }, // 203 0000000010 { -1, -1, 1, 0, 6 }, // 204 00000000101 { -1, -1, 1, 0, 7 }, // 205 00000000100 }; /** The VLC table for inter TCOEFF. */ public final static int[][] INTER_TCOEF_TAB = { { 8, 1, 0 }, // 0 { 7, 2, 0 }, // 1 1 { 6, 3, 0 }, // 2 11 { 5, 4, 0 }, // 3 111 { -1, -1, 0, 0, 2 }, // 4 1111 { -1, -1, 0, 2, 1 }, // 5 1110 { -1, -1, 0, 1, 1 }, // 6 110 { -1, -1, 0, 0, 1 }, // 7 10 { 28, 9, 0 }, // 8 0 { 15, 10, 0 }, // 9 01 { 12, 11, 0 }, // 10 011 { -1, -1, 1, 0, 1 }, // 11 0111 { 14, 13, 0 }, // 12 0110 { -1, -1, 0, 3, 1 }, // 13 01101 { -1, -1, 0, 4, 1 }, // 14 01100 { 21, 16, 0 }, // 15 010 { 18, 17, 0 }, // 16 0101 { -1, -1, 0, 5, 1 }, // 17 01011 { 20, 19, 0 }, // 18 01010 { -1, -1, 0, 0, 3 }, // 19 010101 { -1, -1, 0, 1, 2 }, // 20 010100 { 25, 22, 0 }, // 21 0100 { 24, 23, 0 }, // 22 01001 { -1, -1, 0, 6, 1 }, // 23 010011 { -1, -1, 0, 7, 1 }, // 24 010010 { 27, 26, 0 }, // 25 01000 { -1, -1, 0, 8, 1 }, // 26 010001 { -1, -1, 0, 9, 1 }, // 27 010000 { 52, 29, 0 }, // 28 00 { 37, 30, 0 }, // 29 001 { 34, 31, 0 }, // 30 0011 { 33, 32, 0 }, // 31 00111 { -1, -1, 1, 1, 1 }, // 32 001111 { -1, -1, 1, 2, 1 }, // 33 001110 { 36, 35, 0 }, // 34 00110 { -1, -1, 1, 3, 1 }, // 35 001101 { -1, -1, 1, 4, 1 }, // 36 001100 { 45, 38, 0 }, // 37 0010 { 42, 39, 0 }, // 38 00101 { 41, 40, 0 }, // 39 001011 { -1, -1, 0, 0, 4 }, // 40 0010111 { -1, -1, 0, 10, 1 }, // 41 0010110 { 44, 43, 0 }, // 42 001010 { -1, -1, 0, 11, 1 }, // 43 0010101 { -1, -1, 0, 12, 1 }, // 44 0010100 { 49, 46, 0 }, // 45 00100 { 48, 47, 0 }, // 46 001001 { -1, -1, 1, 5, 1 }, // 47 0010011 { -1, -1, 1, 6, 1 }, // 48 0010010 { 51, 50, 0 }, // 49 001000 { -1, -1, 1, 7, 1 }, // 50 0010001 { -1, -1, 1, 8, 1 }, // 51 0010000 { 90, 53, 0 }, // 52 000 { 69, 54, 0 }, // 53 0001 { 62, 55, 0 }, // 54 00011 { 59, 56, 0 }, // 55 000111 { 58, 57, 0 }, // 56 0001111 { -1, -1, 0, 0, 5 }, // 57 00011111 { -1, -1, 0, 1, 3 }, // 58 00011110 { 61, 60, 0 }, // 59 0001110 { -1, -1, 0, 2, 2 }, // 60 00011101 { -1, -1, 0, 13, 1 }, // 61 00011100 { 66, 63, 0 }, // 62 000110 { 65, 64, 0 }, // 63 0001101 { -1, -1, 0, 14, 1 }, // 64 00011011 { -1, -1, 1, 9, 1 }, // 65 00011010 { 68, 67, 0 }, // 66 0001100 { -1, -1, 1, 10, 1 }, // 67 00011001 { -1, -1, 1, 11, 1 }, // 68 00011000 { 77, 70, 0 }, // 69 00010 { 74, 71, 0 }, // 70 000101 { 73, 72, 0 }, // 71 0001011 { -1, -1, 1, 12, 1 }, // 72 00010111 { -1, -1, 1, 13, 1 }, // 73 00010110 { 76, 75, 0 }, // 74 0001010 { -1, -1, 1, 14, 1 }, // 75 00010101 { -1, -1, 1, 15, 1 }, // 76 00010100 { 83, 78, 0 }, // 77 000100 { 80, 79, 0 }, // 78 0001001 { -1, -1, 1, 16, 1 }, // 79 00010011 { 82, 81, 0 }, // 80 00010010 { -1, -1, 0, 0, 6 }, // 81 000100101 { -1, -1, 0, 0, 7 }, // 82 000100100 { 87, 84, 0 }, // 83 0001000 { 86, 85, 0 }, // 84 00010001 { -1, -1, 0, 3, 2 }, // 85 000100011 { -1, -1, 0, 4, 2 }, // 86 000100010 { 89, 88, 0 }, // 87 00010000 { -1, -1, 0, 15, 1 }, // 88 000100001 { -1, -1, 0, 16, 1 }, // 89 000100000 { 124, 91, 0 }, // 90 0000 { 107, 92, 0 }, // 91 00001 { 100, 93, 0 }, // 92 000011 { 97, 94, 0 }, // 93 0000111 { 96, 95, 0 }, // 94 00001111 { -1, -1, 0, 17, 1 }, // 95 000011111 { -1, -1, 0, 18, 1 }, // 96 000011110 { 99, 98, 0 }, // 97 00001110 { -1, -1, 0, 19, 1 }, // 98 000011101 { -1, -1, 0, 20, 1 }, // 99 000011100 { 104, 101, 0 }, // 100 0000110 { 103, 102, 0 }, // 101 00001101 { -1, -1, 0, 21, 1 }, // 102 000011011 { -1, -1, 0, 22, 1 }, // 103 000011010 { 106, 105, 0 }, // 104 00001100 { -1, -1, 1, 0, 2 }, // 105 000011001 { -1, -1, 1, 17, 1 }, // 106 000011000 { 115, 108, 0 }, // 107 000010 { 112, 109, 0 }, // 108 0000101 { 111, 110, 0 }, // 109 00001011 { -1, -1, 1, 18, 1 }, // 110 000010111 { -1, -1, 1, 19, 1 }, // 111 000010110 { 114, 113, 0 }, // 112 00001010 { -1, -1, 1, 20, 1 }, // 113 000010101 { -1, -1, 1, 21, 1 }, // 114 000010100 { 119, 116, 0 }, // 115 0000100 { 118, 117, 0 }, // 116 00001001 { -1, -1, 1, 22, 1 }, // 117 000010011 { -1, -1, 1, 23, 1 }, // 118 000010010 { 121, 120, 0 }, // 119 00001000 { -1, -1, 1, 24, 1 }, // 120 000010001 { 123, 122, 0 }, // 121 000010000 { -1, -1, 0, 0, 8 }, // 122 0000100001 { -1, -1, 0, 0, 9 }, // 123 0000100000 { 174, 125, 0 }, // 124 00000 { 127, 126, 0 }, // 125 000001 { -1, -1, 2, 0, 0 }, // 126 0000011 { 159, 128, 0 }, // 127 0000010 { 144, 129, 0 }, // 128 00000101 { 137, 130, 0 }, // 129 000001011 { 134, 131, 0 }, // 130 0000010111 { 133, 132, 0 }, // 131 00000101111 { -1, -1, 1, 40, 1 }, // 132 000001011111 { -1, -1, 1, 39, 1 }, // 133 000001011110 { 136, 135, 0 }, // 134 00000101110 { -1, -1, 1, 38, 1 }, // 135 000001011101 { -1, -1, 1, 37, 1 }, // 136 000001011100 { 141, 138, 0 }, // 137 0000010110 { 140, 139, 0 }, // 138 00000101101 { -1, -1, 1, 36, 1 }, // 139 000001011011 { -1, -1, 1, 35, 1 }, // 140 000001011010 { 143, 142, 0 }, // 141 00000101100 { -1, -1, 1, 34, 1 }, // 142 000001011001 { -1, -1, 1, 33, 1 }, // 143 000001011000 { 152, 145, 0 }, // 144 000001010 { 149, 146, 0 }, // 145 0000010101 { 148, 147, 0 }, // 146 00000101011 { -1, -1, 0, 26, 1 }, // 147 000001010111 { -1, -1, 0, 25, 1 }, // 148 000001010110 { 151, 150, 0 }, // 149 00000101010 { -1, -1, 0, 10, 2 }, // 150 000001010101 { -1, -1, 0, 6, 3 }, // 151 000001010100 { 156, 153, 0 }, // 152 0000010100 { 155, 154, 0 }, // 153 00000101001 { -1, -1, 0, 5, 3 }, // 154 000001010011 { -1, -1, 0, 4, 3 }, // 155 000001010010 { 158, 157, 0 }, // 156 00000101000 { -1, -1, 0, 2, 4 }, // 157 000001010001 { -1, -1, 0, 1, 6 }, // 158 000001010000 { 167, 160, 0 }, // 159 00000100 { 164, 161, 0 }, // 160 000001001 { 163, 162, 0 }, // 161 0000010011 { -1, -1, 1, 32, 1 }, // 162 00000100111 { -1, -1, 1, 31, 1 }, // 163 00000100110 { 166, 165, 0 }, // 164 0000010010 { -1, -1, 1, 30, 1 }, // 165 00000100101 { -1, -1, 1, 29, 1 }, // 166 00000100100 { 171, 168, 0 }, // 167 000001000 { 170, 169, 0 }, // 168 0000010001 { -1, -1, 0, 24, 1 }, // 169 00000100011 { -1, -1, 0, 23, 1 }, // 170 00000100010 { 173, 172, 0 }, // 171 0000010000 { -1, -1, 0, 1, 5 }, // 172 00000100001 { -1, -1, 0, 0, 12 }, // 173 00000100000 { 190, 175, 0 }, // 174 000000 { 183, 176, 0 }, // 175 0000001 { 180, 177, 0 }, // 176 00000011 { 179, 178, 0 }, // 177 000000111 { -1, -1, 0, 1, 4 }, // 178 0000001111 { -1, -1, 0, 2, 3 }, // 179 0000001110 { 182, 181, 0 }, // 180 000000110 { -1, -1, 0, 3, 3 }, // 181 0000001101 { -1, -1, 0, 5, 2 }, // 182 0000001100 { 187, 184, 0 }, // 183 00000010 { 186, 185, 0 }, // 184 000000101 { -1, -1, 0, 6, 2 }, // 185 0000001011 { -1, -1, 0, 7, 2 }, // 186 0000001010 { 189, 188, 0 }, // 187 000000100 { -1, -1, 0, 8, 2 }, // 188 0000001001 { -1, -1, 0, 9, 2 }, // 189 0000001000 { 198, 191, 0 }, // 190 0000000 { 195, 192, 0 }, // 191 00000001 { 194, 193, 0 }, // 192 000000011 { -1, -1, 1, 25, 1 }, // 193 0000000111 { -1, -1, 1, 26, 1 }, // 194 0000000110 { 197, 196, 0 }, // 195 000000010 { -1, -1, 1, 27, 1 }, // 196 0000000101 { -1, -1, 1, 28, 1 }, // 197 0000000100 { -1, 199, 0 }, // 198 00000000 { 203, 200, 0 }, // 199 000000001 { 202, 201, 0 }, // 200 0000000011 { -1, -1, 0, 0, 10 }, // 201 00000000111 { -1, -1, 0, 0, 11 }, // 202 00000000110 { 205, 204, 0 }, // 203 0000000010 { -1, -1, 1, 0, 3 }, // 204 00000000101 { -1, -1, 1, 1, 2 }, // 205 00000000100 }; /** The VLC table for dct_dc_size_luminance. */ public final static int[][] DCT_DC_SIZE_LUMINANCE_TAB = { /* * 10 2 11 1 010 3 011 0 001 4 0001 5 0000 1 6 0000 01 7 0000 001 8 0000 * 0001 9 0000 0000 1 10 0000 0000 01 11 0000 0000 001 12 */ { 4, 1, 0 }, { 2, 3, 0 }, // 1 - 1 { -1, -1, 2 }, // 2 - 10 { -1, -1, 1 }, // 3 - 11 { 8, 5, 0 }, // 4 - 0 { 6, 7, 0 }, // 5 - 01 { -1, -1, 3 }, // 6 - 010 { -1, -1, 0 }, // 7 - 011 { 10, 9, 0 }, // 8 - 00 { -1, -1, 4 }, // 9 - 001 { 12, 11, 0 }, // 10 - 000 { -1, -1, 5 }, // 11 - 0001 { 14, 13, 0 }, // 12 - 0000 { -1, -1, 6 }, // 13 - 0000 1 { 16, 15, 0 }, // 14 - 0000 0 { -1, -1, 7 }, // 15 - 0000 01 { 18, 17, 0 }, // 16 - 0000 00 { -1, -1, 8 }, // 17 - 0000 001 { 20, 19, 0 }, // 18 - 0000 000 { -1, -1, 9 }, // 19 - 0000 0001 { 22, 21, 0 }, // 20 - 0000 0000 { -1, -1, 10 }, // 21 - 0000 0000 1 { 24, 23, 0 }, // 22 - 0000 0000 0 { -1, -1, 11 }, // 23 - 0000 0000 01 { -1, 25, 0 }, // 24 - 0000 0000 00 { -1, -1, 12 } // 25 - 0000 0000 001 }; /** The VLC table for dct_dc_size_chrominance. */ public final static int[][] DCT_DC_SIZE_CHROMINANCE_TAB = { /* * 11 0 10 1 01 2 001 3 0001 4 0000 1 5 0000 01 6 0000 001 7 0000 0001 8 * 0000 0000 1 9 0000 0000 01 10 0000 0000 001 11 0000 0000 0001 12 */ { 4, 1, 0 }, { 2, 3, 0 }, // 1 - 1 { -1, -1, 1 }, // 2 - 10 { -1, -1, 0 }, // 3 - 11 { 6, 5, 0 }, // 4 - 0 { -1, -1, 2 }, // 5 - 01 { 8, 7, 0 }, // 6 - 00 { -1, -1, 3 }, // 7 - 001 { 10, 9, 0 }, // 8 - 000 { -1, -1, 4 }, // 9 - 0001 { 12, 11, 0 }, // 10 - 0000 { -1, -1, 5 }, // 11 - 0000 1 { 14, 13, 0 }, // 12 - 0000 0 { -1, -1, 6 }, // 13 - 0000 01 { 16, 15, 0 }, // 14 - 0000 00 { -1, -1, 7 }, // 15 - 0000 001 { 18, 17, 0 }, // 16 - 0000 000 { -1, -1, 8 }, // 17 - 0000 0001 { 20, 19, 0 }, // 18 - 0000 0000 { -1, -1, 9 }, // 19 - 0000 0000 1 { 22, 21, 0 }, // 20 - 0000 0000 0 { -1, -1, 10 }, // 21 - 0000 0000 01 { 24, 23, 0 }, // 22 - 0000 0000 00 { -1, -1, 11 }, // 23 - 0000 0000 001 { -1, 25, 0 }, // 24 - 0000 0000 0000 { -1, -1, 12 } // 25 - 0000 0000 0001 }; /** The stuffing value for the mcbpc VLC code. */ public final static int MCBPC_STUFFING = 5; /** The VLC table for mcbpc (I_VOP frames). */ public final static int[][] MCBPC_1_TAB = { { 2, 1, 0 }, { -1, -1, 3, 0 }, // 1 // - // 1 { 3, 4, 0 }, // 2 - 0 { 8, 5, 0 }, // 3 - 00 { 6, 7, 0 }, // 4 - 01 { -1, -1, 3, 1 }, // 5 - 001 { -1, -1, 3, 2 }, // 6 - 010 { -1, -1, 3, 3 }, // 7 - 011 { 10, 9, 0 }, // 8 - 000 { -1, -1, 4, 0 }, // 9 - 0001 { 11, 12, 0 }, // 10 - 0000 { 16, 13, 0 }, // 11 - 00000 { 14, 15, 0 }, // 12 - 00001 { -1, -1, 4, 1 }, // 13 - 000001 { -1, -1, 4, 2 }, // 14 - 000010 { -1, -1, 4, 3 }, // 15 - 000011 { 17, -1, 0 }, // 16 - 0000 00 { 18, -1, 0 }, // 17 - 0000 000 { -1, 19, 0 }, // 18 - 0000 0000 { -1, -1, 5, 0 } // 19 - 0000 00001 }; /** The VLC table for mcbpc (P_VOP frames). */ public final static int[][] MCBPC_2_TAB = { { 2, 1, 0 }, // 0 { -1, -1, 0, 0 }, // 1 1 { 6, 3, 0 }, // 2 0 { 5, 4, 0 }, // 3 01 { -1, -1, 1, 0 }, // 4 011 { -1, -1, 2, 0 }, // 5 010 { 10, 7, 0 }, // 6 00 { 9, 8, 0 }, // 7 001 { -1, -1, 0, 1 }, // 8 0011 { -1, -1, 0, 2 }, // 9 0010 { 16, 11, 0 }, // 10 000 { 13, 12, 0 }, // 11 0001 { -1, -1, 3, 0 }, // 12 00011 { 15, 14, 0 }, // 13 00010 { -1, -1, 0, 3 }, // 14 000101 { -1, -1, 4, 0 }, // 15 000100 { 24, 17, 0 }, // 16 0000 { 21, 18, 0 }, // 17 00001 { 20, 19, 0 }, // 18 000011 { -1, -1, 1, 1 }, // 19 0000111 { -1, -1, 1, 2 }, // 20 0000110 { 23, 22, 0 }, // 21 000010 { -1, -1, 2, 1 }, // 22 0000101 { -1, -1, 2, 2 }, // 23 0000100 { 30, 25, 0 }, // 24 00000 { 27, 26, 0 }, // 25 000001 { -1, -1, 3, 3 }, // 26 0000011 { 29, 28, 0 }, // 27 0000010 { -1, -1, 2, 3 }, // 28 00000101 { -1, -1, 3, 1 }, // 29 00000100 { 36, 31, 0 }, // 30 000000 { 33, 32, 0 }, // 31 0000001 { -1, -1, 3, 2 }, // 32 00000011 { 35, 34, 0 }, // 33 00000010 { -1, -1, 1, 3 }, // 34 000000101 { -1, -1, 4, 1 }, // 35 000000100 { 40, 37, 0 }, // 36 0000000 { 39, 38, 0 }, // 37 00000001 { -1, -1, 4, 2 }, // 38 000000011 { -1, -1, 4, 3 }, // 39 000000010 { -1, 41, 0 }, // 40 00000000 { -1, -1, 5, 0 }, // 41 000000001 }; /** The VLC table for cbpy in the case of four non-transparent blocks. */ public final static int[][] CBPY_4_TAB = { { 10, 1, 0 }, // 0 { 3, 2, 0 }, // 1 1 { -1, -1, 15, 0 }, // 2 11 { 7, 4, 0 }, // 3 10 { 6, 5, 0 }, // 4 101 { -1, -1, 7, 8 }, // 5 1011 { -1, -1, 11, 4 }, // 6 1010 { 9, 8, 0 }, // 7 100 { -1, -1, 3, 12 }, // 8 1001 { -1, -1, 13, 2 }, // 9 1000 { 18, 11, 0 }, // 10 0 { 15, 12, 0 }, // 11 01 { 14, 13, 0 }, // 12 011 { -1, -1, 5, 10 }, // 13 0111 { -1, -1, 14, 1 }, // 14 0110 { 17, 16, 0 }, // 15 010 { -1, -1, 10, 5 }, // 16 0101 { -1, -1, 12, 3 }, // 17 0100 { 24, 19, 0 }, // 18 00 { 21, 20, 0 }, // 19 001 { -1, -1, 0, 15 }, // 20 0011 { 23, 22, 0 }, // 21 0010 { -1, -1, 1, 14 }, // 22 00101 { -1, -1, 2, 13 }, // 23 00100 { 28, 25, 0 }, // 24 000 { 27, 26, 0 }, // 25 0001 { -1, -1, 4, 11 }, // 26 00011 { -1, -1, 8, 7 }, // 27 00010 { -1, 29, 0 }, // 28 0000 { 31, 30, 0 }, // 29 00001 { -1, -1, 9, 6 }, // 30 000011 { -1, -1, 6, 9 }, // 31 000010 }; /** The VLC table for cbpy in the case of three non-transparent blocks. */ public final static int[][] CBPY_3_TAB = { /* * 1 111 000 7 0 010 011 100 3 4 011 000 111 0 7 001 110 001 6 1 00010 100 * 011 4 3 00011 101 010 5 2 00001 010 101 2 5 000001 001 110 1 6 */ { 2, 1, 0 }, { -1, -1, 7, 0 }, // 1 - 1 { 8, 3, 0 }, // 2 - 0 { 4, 5, 0 }, // 3 - 01 { -1, -1, 3, 4 }, // 6 - 010 { -1, -1, 0, 7 }, // 7 - 011 { 10, 9, 0 }, // 8 - 00 { -1, -1, 6, 1 }, // 9 - 001 { 14, 11, 0 }, // 10 - 000 { 12, 13, 0 }, // 11 - 0001 { -1, -1, 4, 3 }, // 12 - 00010 { -1, -1, 5, 2 }, // 13 - 00011 { 16, 15, 0 }, // 14 - 0000 { -1, -1, 2, 5 }, // 15 - 00001 { -1, 17, 0 }, // 16 - 00000 { -1, -1, 1, 6 }, // 17 - 000001 }; /** The VLC table for cbpy in the case of two non-transparent blocks. */ public final static int[][] CBPY_2_TAB = { /* * 1 11 00 3 0 01 10 01 2 1 001 01 10 1 2 0001 00 11 0 3 */ { 2, 1, 0 }, { -1, -1, 3, 0 }, // 1 - 1 { 4, 3, 0 }, // 2 - 0 { -1, -1, 2, 1 }, // 3 - 01 { 6, 5, 0 }, // 4 - 00 { -1, -1, 1, 2 }, // 5 - 001 { -1, 7, 0 }, // 6 - 000 { -1, -1, 0, 3 } // 7 - 0001 }; /** The VLC table for cbpy in the case of one non-transparent blocks. */ public final static int[][] CBPY_1_TAB = { /* * 1 1 0 1 0 01 0 1 0 1 */ { 2, 1, 0 }, { -1, -1, 1, 0 }, // 1 - 1 { -1, 3, 0 }, // 2 - 0 { -1, -1, 0, 1 } // 3 - 01 }; /** The input MPEG4 video bitstream. */ private BitStream bitstream; /** * Constructs an <code>Huffman</code> object using the specified bitstream * object. * * @param bitstream * the input video bitstream. */ public Huffman(BitStream bitstream) { this.bitstream = bitstream; } /** * Decodes the VLC code using the table specified by the <code>tab</code> * parameter from the input bitstream. * * @param max_length * the maximum length of the input VLC code. * @param tab * the VLC (Huffman) table for the decoded value(s). * @return the decoded value(s). * @throws IOException * raises if an error occurs. */ public int[] decode(int max_length, int tab[][]) throws IOException { int idx1 = 0, idx = 0; max_length++; int maske = (1 << max_length); long bits = bitstream.next_bits(max_length); while (idx != -1) { maske >>>= 1; idx1 = idx; idx = ((bits & maske) != 0) ? tab[idx][1] : tab[idx][0]; max_length--; } bitstream.unget_bits(max_length + 1); return (tab[idx1]); } }