⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dehuffman.c

📁 JPEG解压软件,包含PC端的测试程序,程序结构比较清晰
💻 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 + -