3 package com.pixelmed.codec.jpeg;
12 private static final String identString =
"@(#) $Header: /userland/cvs/codec/com/pixelmed/codec/jpeg/HuffmanTable.java,v 1.4 2014/03/23 11:41:54 dclunie Exp $";
14 private int TableClass;
15 private int HuffmanTableIdentifier;
16 private int[] nHuffmanCodesOfLengthI;
17 private int[][] ValueOfHuffmanCodeIJ;
19 public HuffmanTable(
int TableClass,
int HuffmanTableIdentifier,
int[] nHuffmanCodesOfLengthI,
int[][] ValueOfHuffmanCodeIJ) {
20 this.TableClass = TableClass;
21 this.HuffmanTableIdentifier = HuffmanTableIdentifier;
22 this.nHuffmanCodesOfLengthI = nHuffmanCodesOfLengthI;
23 this.ValueOfHuffmanCodeIJ = ValueOfHuffmanCodeIJ;
27 private int countNumberOfCodes() {
29 for (
int i=0; i<nHuffmanCodesOfLengthI.length; ++i) {
30 count += nHuffmanCodesOfLengthI[i];
37 private int[] BITS =
new int[17];
39 private int[] HUFFVAL;
40 private int[] HUFFSIZE;
41 private int[] HUFFCODE;
43 private int[] MINCODE =
new int[17];
44 private int[] MAXCODE =
new int[17];
45 private int[] VALPTR =
new int[17];
54 private int EOBCodeLength;
60 private void expand() {
64 for (
int I=1; I<=16; ++I) {
66 BITS[I] = nHuffmanCodesOfLengthI[I-1];
69 int nCodes = countNumberOfCodes();
72 HUFFVAL =
new int[nCodes+1];
74 for (
int i=0; i<nHuffmanCodesOfLengthI.length; ++i) {
75 int nCodesThisLength = nHuffmanCodesOfLengthI[i];
76 if (nCodesThisLength > 0) {
77 for (
int j=0; j<nCodesThisLength; ++j) {
78 HUFFVAL[J] = ValueOfHuffmanCodeIJ[i][j];
88 HUFFSIZE =
new int[nCodes+1];
113 HUFFCODE =
new int[nCodes+1];
117 int SI = HUFFSIZE[0];
122 if (SI != HUFFSIZE[K]) {
123 if (HUFFSIZE[K] == 0)
break;
127 }
while (SI != HUFFSIZE[K]);
145 MINCODE[I] = HUFFCODE[J];
147 MAXCODE[I] = HUFFCODE[J];
155 for (
int I=1; I<=16; ++I) {
156 for (
int J = VALPTR[I]; J < VALPTR[I] + BITS[I]; ++J) {
157 if (HUFFVAL[J] == 0) {
158 EOBCode = HUFFCODE[J];
167 StringBuffer buf =
new StringBuffer();
168 buf.append(
"Huffman Table:\n");
169 buf.append(
"\t TableClass = " +TableClass+
"\n");
170 buf.append(
"\t HuffmanTableIdentifier = "+HuffmanTableIdentifier+
"\n");
171 for (
int i=0; i<16; ++i) {
172 buf.append(
"\t\t nHuffmanCodesOfLength "+i+
" = "+nHuffmanCodesOfLengthI[i]+
"\n");
173 for (
int j=0; j<nHuffmanCodesOfLengthI[i];++j) {
174 buf.append(
"\t\t\t ValueOfHuffmanCode "+j+
" = "+ValueOfHuffmanCodeIJ[i][j]+
"\n");
177 buf.append(
"\t Expanded:\n");
178 for (
int I=1; I<=16; ++I) {
179 buf.append(
"\t\t["+I+
"] MINCODE="+Integer.toBinaryString(MINCODE[I])+
" MAXCODE="+Integer.toBinaryString(MAXCODE[I])+
""+
" VALPTR="+VALPTR[I]+
"\n");
181 for (
int J=0; J<HUFFVAL.length; ++J) {
182 buf.append(
"\t\t["+J+
"] HUFFVAL=0x"+Integer.toHexString(HUFFVAL[J])+
"\n");
184 buf.append(
"\t\tEOBCode="+Integer.toBinaryString(EOBCode)+
" 0x"+Integer.toHexString(EOBCode)+
" (length "+EOBCodeLength+
" dec)\n");
185 return buf.toString();
HuffmanTable(int TableClass, int HuffmanTableIdentifier, int[] nHuffmanCodesOfLengthI, int[][] ValueOfHuffmanCodeIJ)