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

📄 jpegdecoder.h

📁 JPEG解压软件,包含PC端的测试程序,程序结构比较清晰
💻 H
字号:

#ifndef _JPEG_DECODER_H
#define _JPEG_DECODER_H

#include "AMComDef.h"
#include "AMStream.h"
#include "AMMem.h"

#include "jpeg.h"

#define DECODE_JPEG_OK				ERROR_FREE
#define READ_JPEG_OK				ERROR_FREE

#define READ_JPEG_END				1
#define DECODE_JPEG_SCAN_BEGIN		2
#define DECODE_JPEG_END				3

#define READ_JPEG_ERROR				-40
#define READ_JPEG_DQT_ERROR			-41
#define READ_JPEG_SOF0_ERROR		-42
#define READ_JPEG_DRI_ERROR			-43
#define READ_JPEG_DHT_ERROR			-44
#define READ_JPEG_SOS_ERROR			-45
#define READ_JPEG_NO_IMAGE_ERROR	-46
#define READ_JPEG_UNKNOW_ERROR		-47

///////////////////////////////////////////
#define DECODING_JPEG				MTrue
#define DECODING_THUMBNAIL			MFalse

#define JPEG_TYPE_NORMAL			0
#define JPEG_TYPE_JFIF				1
#define JPEG_TYPE_EXIF				2
#define JPEG_TYPE_BITMAP			3		//just thumbnail used

#define JPEG_COLOR_1_BYTE			0x01
#define JPEG_COLOR_3_BYTES			0x02

#define THUMBNAIL_STATUS_JPEG		0x10
#define THUMBNAIL_STATUS_1_BYTE		0x11
#define THUMBNAIL_STATUS_3_BYTES	0x13


#define INDEX_COLOR_TABLE				128

#define JPEG_QUANTIZE_COE_REM_BITS		5

#define DECODE_BUFFER_LEN				512

#define JPEG_MIN_BUFFER_LEN				( 2 * 1024 )
#define JPEG_BUFFER_LEN					( JPEG_MIN_BUFFER_LEN + 2*1024 - 1)


//////////////////////////////////////////

typedef struct tagHuffmanQtDecoderInfo {
	int		*	Qtab[4] ;
	int		*	WideSamp ;
	int		*	HighSamp ;

	int		*	HufDcTail[4] ;
	int		*	HufAcTail[4] ;

	int		*	HufDcOffset[4] ;
	int		*	HufAcOffset[4] ;
	int		*	HufTabDc[4] ;
	int		*	HufTabAc[4] ;

	int			minDcBits[4] ;
	int			minAcBits[4] ;

	int			HuffTabNum ;

	MLong		dataPos ;
	int			bitPos ;
	MLong		CurrentData ;
	
} HUFFMAN_QT_DECODER_INFO;


typedef struct tagJpegDecoderInfo
{
	int			Qtab[4][64] ;
	int			WideSamp[4] ;
	int			HighSamp[4] ;
	int			qtID[4] ;

	int			HufDcTail[4][17] ;
	int			HufAcTail[4][17] ;

	int			HufDcOffset[4][16] ;
	int			HufAcOffset[4][16] ;
	int			HufTabDc[4][16] ;
	int			HufTabAc[4][180] ;
	int			hufAcID[4] ;
	int			hufDcID[4] ;

	int			minDcBits[4] ;
	int			minAcBits[4] ;

	int	 		Width ;
	int			Height ;

	int			HuffTabNum ;
	int			ResetLen ;

	int			type ;	
	int			colorBits ;

	MLong		dataLen ;
	MLong		dataPos ;

	int			bitPos ;
	MLong		CurrentData ;

} JPEG_DECODER_INFO;


typedef struct tagJpegHandle
{
	//relation with the file operation
	HMSTREAM			pStream ;
	MLong				fileSize ;
	MLong				PosPtr ;
	MLong				restBlock ;

	//relation with the buffer read from file.
	MByte	*			buffer ;
	MLong				bufferLen ;
	MLong				bufferPos ;

	//relation with decode JPEG
	JPEG_DECODER_INFO*	pJpegInfo ;
	MLong				jpegBeginPos ;

	//relation with decode thumbnail
	MBool				thumbnailStatus;
	JPEG_DECODER_INFO*	pThumbnailInfo ;
	MLong				thumbnailBeginPos ;
	int	 				thumbWidth ;
	int					thumbHeight ;
	int					thumbBitsStatus;

	//recode the state of decoding JPEG or decoding thumbnail.
	MBool				decodeStatus ;			// =true,decode JPEG, =false, decode thumbnail.
	//recode the pointer of decoding JPEG or decoding thumbnail.
	JPEG_DECODER_INFO*	pInfo ;

	//record the number id now decoding, this id pointer to which table of huffman and quantize used.
	int					num ;

	//record the DC value of huffman decode.
	int					Dc0[4] ;

	int					data[6*64] ;

	//save the thumbnail data from decode finished, if no thumbnail, ==NULL.
	MByte	*			thumbnailData ;

	//save the JPEG data for decode finished.
	MByte	*			jpegData ;

	//save the mid-data for decode.  == scanLine * 8 * HighSamp[].
	MByte	*			convertBuffer ;

	//the table for color change from YCbCr to RGB.
	MByte	*			ColorLimitTable ;

	MShort  *			resamleAddrH ;
	MShort  *			resamleAddrW ;
	MShort  *			newHBegin ;
	MShort  *			newHEnd ;
	MShort  *			resamleAddrH2 ;
	MShort  *			resamleAddrW2 ;
	MShort  *			newH2Begin ;
	MShort  *			newH2End ;

	int					shiftN[16] ;
	int					huffMaskOffset[16] ;
	int					huffBitOffset[16] ;
	MByte				zigNum[ 64 + 16 ] ;

} JPEG_HANDLE;



/////////////////////////////////////////////////
int readFile(JPEG_HANDLE * hJpeg, int restLen, MByte *pBufStart, MByte *pBufNow ) ;

int JPG_ReadHead( JPEG_HANDLE * hJpeg ) ;
int JPG_ReadQTable( JPEG_HANDLE * hJpeg ) ;
int JPG_ReadSOf0( JPEG_HANDLE * hJpeg ) ;
int JPG_ReadDri( JPEG_HANDLE * hJpeg ) ;
int JPG_ReadHTable( JPEG_HANDLE * hJpeg ) ;
int JPG_ReadSos( JPEG_HANDLE * hJpeg ) ;

MVoid JPG_ReadJfifHead( JPEG_HANDLE * hJpeg ) ;
MVoid JPG_ReadExifHead( JPEG_HANDLE * hJpeg ) ;
MBool JPG_GetJfifThumbnail( JPEG_HANDLE * hJpeg ) ;
MBool JPG_GetExifThumbnail( JPEG_HANDLE * hJpeg ) ;

MVoid releaseJpegHandle( JPEG_HANDLE * hJpeg ) ;

MVoid JpegMemFree(MVoid *pMem);


#endif /* _JPEG_DECODER_H */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -