changes.
[IRC.git] / Robust / src / Tests / ssJava / mp3decoder / huffcodetab.java
index caf5ca25d81337dec848f1bd9a0b9f497e569baf..7aec4ccc4042be457c8e686d7680605a112d01d3 100644 (file)
@@ -500,6 +500,121 @@ final class huffcodetab {
     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
@@ -623,7 +738,7 @@ final class huffcodetab {
     return data;\r
 //    return error;\r
   }\r
-\r
+  \r
   public static void inithuff() {\r
 \r
     if (ht != null)\r