VAL = null;\r
treelen = TREELEN;\r
}\r
+ \r
+ /**\r
+ * Do the huffman-decoding.\r
+ * note! for counta,countb -the 4 bit value is returned in y,\r
+ * discard x.\r
+ */\r
+ public static int huffman_decoder(huffcodetab h, int[] x, int[] y, int[] v, int[] w, BitReserve br)\r
+ {\r
+ // array of all huffcodtable headers\r
+ // 0..31 Huffman code table 0..31\r
+ // 32,33 count1-tables\r
+\r
+ int dmask = 1 << ((4 * 8) - 1);\r
+ int hs = 4 * 8;\r
+ int level;\r
+ int point = 0;\r
+ int error = 1;\r
+ level = dmask;\r
+\r
+ if (h.val == null) return 2;\r
+\r
+ /* table 0 needs no bits */\r
+ if ( h.treelen == 0)\r
+ { \r
+ x[0] = y[0] = 0;\r
+ return 0;\r
+ }\r
+\r
+ /* Lookup in Huffman table. */\r
+\r
+ /*int bitsAvailable = 0; \r
+ int bitIndex = 0;\r
+ \r
+ int bits[] = bitbuf;*/\r
+ do \r
+ {\r
+ if (h.val[point][0]==0)\r
+ { /*end of tree*/\r
+ x[0] = h.val[point][1] >>> 4;\r
+ y[0] = h.val[point][1] & 0xf;\r
+ error = 0;\r
+ break;\r
+ }\r
+ \r
+ // hget1bit() is called thousands of times, and so needs to be\r
+ // ultra fast. \r
+ /*\r
+ if (bitIndex==bitsAvailable)\r
+ {\r
+ bitsAvailable = br.readBits(bits, 32); \r
+ bitIndex = 0;\r
+ }\r
+ */\r
+ //if (bits[bitIndex++]!=0)\r
+ if (br.hget1bit()!=0)\r
+ {\r
+ while (h.val[point][1] >= MXOFF) point += h.val[point][1];\r
+ point += h.val[point][1];\r
+ }\r
+ else\r
+ {\r
+ while (h.val[point][0] >= MXOFF) point += h.val[point][0];\r
+ point += h.val[point][0];\r
+ }\r
+ level >>>= 1;\r
+ // MDM: ht[0] is always 0;\r
+ } while ((level !=0 ) || (point < 0 /*ht[0].treelen*/) );\r
+ \r
+ // put back any bits not consumed\r
+ /* \r
+ int unread = (bitsAvailable-bitIndex);\r
+ if (unread>0)\r
+ br.rewindNbits(unread);\r
+ */\r
+ /* Process sign encodings for quadruples tables. */\r
+ // System.out.println(h.tablename);\r
+ if (h.tablename0 == '3' && (h.tablename1 == '2' || h.tablename1 == '3'))\r
+ {\r
+ v[0] = (y[0]>>3) & 1;\r
+ w[0] = (y[0]>>2) & 1;\r
+ x[0] = (y[0]>>1) & 1;\r
+ y[0] = y[0] & 1;\r
+\r
+ /* v, w, x and y are reversed in the bitstream.\r
+ switch them around to make test bistream work. */\r
+\r
+ if (v[0]!=0)\r
+ if (br.hget1bit() != 0) v[0] = -v[0];\r
+ if (w[0]!=0)\r
+ if (br.hget1bit() != 0) w[0] = -w[0];\r
+ if (x[0]!=0)\r
+ if (br.hget1bit() != 0) x[0] = -x[0];\r
+ if (y[0]!=0)\r
+ if (br.hget1bit() != 0) y[0] = -y[0];\r
+ }\r
+ else\r
+ {\r
+ // Process sign and escape encodings for dual tables.\r
+ // x and y are reversed in the test bitstream.\r
+ // Reverse x and y here to make test bitstream work.\r
+\r
+ if (h.linbits != 0)\r
+ if ((h.xlen-1) == x[0])\r
+ x[0] += br.hgetbits(h.linbits);\r
+ if (x[0] != 0)\r
+ if (br.hget1bit() != 0) x[0] = -x[0];\r
+ if (h.linbits != 0)\r
+ if ((h.ylen-1) == y[0])\r
+ y[0] += br.hgetbits(h.linbits);\r
+ if (y[0] != 0)\r
+ if (br.hget1bit() != 0) y[0] = -y[0];\r
+ }\r
+ return error;\r
+ }\r
+ \r
\r
/**\r
* Do the huffman-decoding. note! for counta,countb -the 4 bit value is\r
return data;\r
// return error;\r
}\r
-\r
+ \r
public static void inithuff() {\r
\r
if (ht != null)\r