47#define GetMaxbits(x) ((int)( (((unsigned short)(x)) >> 0) & 0x000f))
48#define GetHLen(x) ((int)( (((unsigned short)(x)) >> 12) & 0x000f))
49#define GetCWY(x) ((int)( (((unsigned short)(x)) >> 8) & 0x000f))
50#define GetCWX(x) ((int)( (((unsigned short)(x)) >> 4) & 0x000f))
51#define GetSignBits(x) ((int)( (((unsigned short)(x)) >> 0) & 0x000f))
53#define GetHLenQ(x) ((int)( (((unsigned char)(x)) >> 4) & 0x0f))
54#define GetCWVQ(x) ((int)( (((unsigned char)(x)) >> 3) & 0x01))
55#define GetCWWQ(x) ((int)( (((unsigned char)(x)) >> 2) & 0x01))
56#define GetCWXQ(x) ((int)( (((unsigned char)(x)) >> 1) & 0x01))
57#define GetCWYQ(x) ((int)( (((unsigned char)(x)) >> 0) & 0x01))
60#define ApplySign(x, s) { (x) |= ((s) & 0x80000000); }
83static int DecodeHuffmanPairs(
int *xy,
int nVals,
int tabIdx,
int bitsLeft,
unsigned char *buf,
int bitOffset)
86 int cachedBits, padBits, len, startBits, linBits, maxBits, minBits;
88 unsigned short cw, *tBase, *tCurr;
109 cachedBits = (8 - bitOffset) & 0x07;
111 cache = (
unsigned int)(*buf++) << (32 - cachedBits);
112 bitsLeft -= cachedBits;
116 for (i = 0; i < nVals; i+=2) {
121 }
else if (tabType ==
oneShot) {
128 if (bitsLeft >= 16) {
130 cache |= (
unsigned int)(*buf++) << (24 - cachedBits);
131 cache |= (
unsigned int)(*buf++) << (16 - cachedBits);
136 if (cachedBits + bitsLeft <= 0)
return -1;
137 if (bitsLeft > 0) cache |= (
unsigned int)(*buf++) << (24 - cachedBits);
138 if (bitsLeft > 8) cache |= (
unsigned int)(*buf++) << (16 - cachedBits);
139 cachedBits += bitsLeft;
142 cache &= (
signed int)0x80000000 >> (cachedBits - 1);
144 cachedBits += padBits;
148 while (nVals > 0 && cachedBits >= 11 ) {
149 cw = tBase[cache >> (32 - maxBits)];
158 if (cachedBits < padBits)
166 bitsLeft += (cachedBits - padBits);
167 return (startBits - bitsLeft);
173 if (bitsLeft >= 16) {
175 cache |= (
unsigned int)(*buf++) << (24 - cachedBits);
176 cache |= (
unsigned int)(*buf++) << (16 - cachedBits);
181 if (cachedBits + bitsLeft <= 0)
return -1;
182 if (bitsLeft > 0) cache |= (
unsigned int)(*buf++) << (24 - cachedBits);
183 if (bitsLeft > 8) cache |= (
unsigned int)(*buf++) << (16 - cachedBits);
184 cachedBits += bitsLeft;
187 cache &= (
signed int)0x80000000 >> (cachedBits - 1);
189 cachedBits += padBits;
193 while (nVals > 0 && cachedBits >= 11 ) {
195 cw = tCurr[(cache >> (32 - maxBits)) + 1];
198 cachedBits -= maxBits;
210 minBits = linBits + 1 + (
y ? 1 : 0);
211 if (cachedBits + bitsLeft < minBits)
213 while (cachedBits < minBits) {
214 cache |= (
unsigned int)(*buf++) << (24 - cachedBits);
219 cachedBits += bitsLeft;
221 cache &= (
signed int)0x80000000 >> (cachedBits - 1);
223 x += (int)(cache >> (32 - linBits));
224 cachedBits -= linBits;
227 if (
x) {
ApplySign(
x, cache); cache <<= 1; cachedBits--;}
230 minBits = linBits + 1;
231 if (cachedBits + bitsLeft < minBits)
233 while (cachedBits < minBits) {
234 cache |= (
unsigned int)(*buf++) << (24 - cachedBits);
239 cachedBits += bitsLeft;
241 cache &= (
signed int)0x80000000 >> (cachedBits - 1);
243 y += (int)(cache >> (32 - linBits));
244 cachedBits -= linBits;
247 if (
y) {
ApplySign(
y, cache); cache <<= 1; cachedBits--;}
250 if (cachedBits < padBits)
259 bitsLeft += (cachedBits - padBits);
260 return (startBits - bitsLeft);
287static int DecodeHuffmanQuads(
int *vwxy,
int nVals,
int tabIdx,
int bitsLeft,
unsigned char *buf,
int bitOffset)
290 int len, maxBits, cachedBits, padBits;
292 unsigned char cw, *tBase;
302 cachedBits = (8 - bitOffset) & 0x07;
304 cache = (
unsigned int)(*buf++) << (32 - cachedBits);
305 bitsLeft -= cachedBits;
308 while (i < (nVals - 3)) {
310 if (bitsLeft >= 16) {
312 cache |= (
unsigned int)(*buf++) << (24 - cachedBits);
313 cache |= (
unsigned int)(*buf++) << (16 - cachedBits);
318 if (cachedBits + bitsLeft <= 0)
return i;
319 if (bitsLeft > 0) cache |= (
unsigned int)(*buf++) << (24 - cachedBits);
320 if (bitsLeft > 8) cache |= (
unsigned int)(*buf++) << (16 - cachedBits);
321 cachedBits += bitsLeft;
324 cache &= (
signed int)0x80000000 >> (cachedBits - 1);
326 cachedBits += padBits;
330 while (i < (nVals - 3) && cachedBits >= 10 ) {
331 cw = tBase[cache >> (32 - maxBits)];
342 if (cachedBits < padBits)
382 int r1Start, r2Start, rEnd[4];
383 int i, w, bitsUsed, bitsLeft;
384 unsigned char *startBuf = buf;
397 sis = &si->
sis[gr][ch];
400 if (huffBlockBits < 0)
413 r1Start = fh->
sfBand->
l[6] + 2*w;
424 rEnd[2] =
MIN(r2Start, rEnd[3]);
425 rEnd[1] =
MIN(r1Start, rEnd[3]);
432 bitsLeft = huffBlockBits;
433 for (i = 0; i < 3; i++) {
434 bitsUsed = DecodeHuffmanPairs(hi->
huffDecBuf[ch] + rEnd[i], rEnd[i+1] - rEnd[i], sis->
tableSelect[i], bitsLeft, buf, *bitOffset);
435 if (bitsUsed < 0 || bitsUsed > bitsLeft)
439 buf += (bitsUsed + *bitOffset) >> 3;
440 *bitOffset = (bitsUsed + *bitOffset) & 0x07;
441 bitsLeft -= bitsUsed;
454 buf += (bitsLeft + *bitOffset) >> 3;
455 *bitOffset = (bitsLeft + *bitOffset) & 0x07;
457 return (
int)(buf - startBuf);
enum _HuffTabType HuffTabType
int nonZeroBound[MAX_NCHAN]
int huffDecBuf[MAX_NCHAN][MAX_NSAMP]
SideInfoSub sis[MAX_NGRAN][MAX_NCHAN]