📄 dehuffman.c
字号:
#include "deHuffman.h"
#define readCode( result ) {\
{\
if ( (CurrentData = * buffer ++) == 0xff ) {\
MByte valueByte ;\
if ( (valueByte = * buffer ++) != 0x00 ) {\
if ( ( valueByte & 0xd8 ) == 0xd0 ){\
pDecoderInfo -> bitPos = 0 ;\
pDecoderInfo -> dataPos = buffer - hJpeg -> buffer - 2;\
return result ;\
} \
else if ( valueByte == 0xd9 ) \
return DECODE_JPEG_END ;\
else\
return DECODE_JPEG_HUFFMAN_ERROR ;\
}\
}\
bitPos += 8 ;\
}\
}
#define readCodex( result ) {\
{\
if ( (CurrentData = * buffer ++) == 0xff ) {\
if ( * buffer ++ != 0x00 ) {\
pDecoderInfo -> bitPos = 0 ;\
pDecoderInfo -> dataPos = buffer - hJpeg -> buffer - 2;\
return result ;\
}\
}\
bitPos = 8 ;\
}\
}
#define readExtentCode( ) {\
{\
if ( ( huffLen = codeLen - bitPos ) <= 0 ) {\
bitPos = - huffLen;\
}\
else {\
MByte valueByte;\
if ( huffLen <= 8 ) {\
bitPos = 8 - huffLen;\
}\
else {\
bitPos = 16 - huffLen;\
CurrentData = (CurrentData << 8) | (valueByte = *buffer++);\
if ( valueByte == 0xff ) {\
if ( *buffer++ != 0x00 ) {\
return DECODE_JPEG_HUFFMAN_ERROR ;\
}\
}\
}\
CurrentData = (CurrentData << 8) | (valueByte = *buffer++);\
if ( valueByte == 0xff ) \
if ( *buffer++ != 0x00 ) \
return DECODE_JPEG_HUFFMAN_ERROR ;\
}\
code = ( CurrentData >> bitPos) & maskOffset[codeLen] ;\
}\
}
#define HUFF_DECODE(minBits,pTail,pOffset,pTable, result ) { \
if ( ( bitPos -= minBits ) <= 0 ) {\
huffLen = bitPos + minBits - 1;\
code = CurrentData & maskOffset[huffLen + 1] ;\
readCodex( result ) ;\
}\
else {\
code = ( CurrentData >> bitPos ) & maskOffset[minBits] ;\
huffLen = minBits - 1 ;\
}\
while ( code > pTail[huffLen ++] ) {\
code = (code << 1) | ( ( CurrentData >> (bitPos -= 1) ) & 1 ) ;\
if ( bitPos <= 0 ) {\
readCode( result ) ;\
}\
}\
if ( huffLen > 16 ) {\
hJpeg -> Dc0[0]=0;\
hJpeg -> Dc0[1]=0;\
hJpeg -> Dc0[2]=0;\
hJpeg -> Dc0[3]=0;\
pDecoderInfo -> dataPos = buffer - hJpeg -> buffer;\
pDecoderInfo -> CurrentData = CurrentData;\
pDecoderInfo -> bitPos = bitPos;\
return DECODE_JPEG_SCAN_BEGIN ;\
}\
codeLen = pTable[code + pOffset[huffLen -= 1]] ;\
}
#define JPG_DeHuffmanDc(num) {\
HUFF_DECODE( minDcBits, pDcTail, pDcOffset, pDcTable, DECODE_JPEG_SCAN_BEGIN ) ; \
if ( codeLen != 0 ) { \
readExtentCode( ) ;\
if ( ( code & huffBitOffset[codeLen] ) == 0 ){\
code += shiftN[codeLen];\
}\
data[0] = hJpeg -> Dc0[num] += code ;\
if ( bitPos <= 0 ) {\
readCode( DECODE_JPEG_SCAN_BEGIN ) ;\
}\
}\
else\
data[0] = hJpeg -> Dc0[num] ;\
}
#define JPG_DeHuffmanAc() {\
while ( len < 64 ) {\
HUFF_DECODE( minAcBits, pAcTail, pAcOffset, pAcTable, DECODE_JPEG_OK ) ; \
huffLen = codeLen >> 4 ;\
if ( ( codeLen &= 0x0f ) > 0 ) {\
len += huffLen ;\
readExtentCode( ) ;\
if ( ( code & huffBitOffset[codeLen] ) == 0 ){\
code += shiftN[codeLen];\
}\
data[zigNum[len ++ ]] = code ;\
if ( bitPos <= 0 ) {\
readCode( DECODE_JPEG_OK ) ;\
}\
}\
else {\
if ( huffLen != 15 )\
break ;\
len += 16 ;\
}\
}\
}
int decode_MCU(JPEG_HANDLE *hJpeg, HUFFMAN_QT_DECODER_INFO *pDecoderInfo ) {
MByte * zigNum = hJpeg -> zigNum ;
int * shiftN = hJpeg -> shiftN ;
int * huffBitOffset = hJpeg -> huffBitOffset ;
register int * maskOffset = hJpeg -> huffMaskOffset ;
register MLong CurrentData= pDecoderInfo -> CurrentData ;
register int bitPos = pDecoderInfo -> bitPos ;
register MByte * buffer = &hJpeg -> buffer[pDecoderInfo -> dataPos] ;
int * data = hJpeg -> data ;
int num ;
for (num = 0; num < pDecoderInfo->HuffTabNum; num ++ ) {
int * pDcOffset= pDecoderInfo->HufDcOffset[num] ;
int * pDcTable = pDecoderInfo->HufTabDc[num] ;
register int * pDcTail = pDecoderInfo->HufDcTail[num] ;
register int * pAcOffset= pDecoderInfo->HufAcOffset[num] ;
register int * pAcTable = pDecoderInfo->HufTabAc[num] ;
register int * pAcTail = pDecoderInfo->HufAcTail[num] ;
int minDcBits= pDecoderInfo->minDcBits[num] ;
int minAcBits= pDecoderInfo->minAcBits[num] ;
int wideBlock= pDecoderInfo->WideSamp[num] * pDecoderInfo->HighSamp[num];
while ( -- wideBlock >= 0 ) {
register int code, huffLen ;
unsigned int codeLen, len = 1 ;
JPG_DeHuffmanDc(num);
JPG_DeHuffmanAc();
data += 64 ;
}
}
pDecoderInfo -> dataPos = buffer - hJpeg -> buffer;
pDecoderInfo -> CurrentData = CurrentData;
pDecoderInfo -> bitPos = bitPos;
return DECODE_JPEG_OK ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -