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

📄 hal_jpeg.c

📁 一款SmartPhone的驱动代码
💻 C
📖 第 1 页 / 共 4 页
字号:
{
	unsigned char msb = (unsigned char)halReadReg16( REG100E_VERTICAL_PIXEL_SIZE0 );
	unsigned char lsb = (unsigned char)halReadReg16( REG1010_VERTICAL_PIXEL_SIZE1 );
	unsigned short verticalPixelSize = (unsigned short)((msb << 8) | lsb);
	return ( verticalPixelSize );
}

/*************************************************************************************
; Function:	set horizontal pixel size (encode only)
; Input:	horizontalPixelSize
; Output:	n/a
; Format:	void JpegHorizPixelSizeSet( unsigned short horizontalPixelSize )
;*************************************************************************************/
void JpegHorizPixelSizeSet( unsigned short horizontalPixelSize )
{
	unsigned char lsb = (unsigned char)(horizontalPixelSize & 0xFF);
	unsigned char msb = (unsigned char)(horizontalPixelSize >> 8);
	halWriteReg16( REG1012_HORIZ_PIXEL_SIZE0, (unsigned short)msb );
	halWriteReg16( REG1014_HORIZ_PIXEL_SIZE1, (unsigned short)lsb );
}

/*************************************************************************************
; Function:	get horizontal pixel size
; Input:	n/a
; Output:	horizontal pixel size
; Format:	unsigned short JpegHorizPixelSizeGet( void )	
;*************************************************************************************/
unsigned short JpegHorizPixelSizeGet( void )
{
	unsigned char msb = (unsigned char)halReadReg16( REG1012_HORIZ_PIXEL_SIZE0 );
	unsigned char lsb = (unsigned char)halReadReg16( REG1014_HORIZ_PIXEL_SIZE1 );
	unsigned short size = (unsigned short)((msb << 8) + lsb);
	return ( size );
}

/*************************************************************************************
; Function:	retrieves Minimum Coded Unit
; Input:	n/a
; Output:	dnlValueSetting
; Format:	unsigned short JpegDNLValueSettingGet( void )
;*************************************************************************************/
unsigned short JpegDNLValueSettingGet( void )
{
	unsigned char msb = (unsigned char )halReadReg16( REG1016_DNL_VALUE_SETTING0 );
	unsigned char lsb = (unsigned char )halReadReg16( REG1018_DNL_VALUE_SETTING1 );
	unsigned short dnlValueSetting = (unsigned short)((msb << 8) | lsb);
	return ( dnlValueSetting );
}

/*************************************************************************************
; Function:	RST Marker processing method
; Input:	rstMarkerOpSel
; Output:	n/a
; Format:	void JpegRSTMarkerOpSelSet( JpegRSTMarkerOpSel rstMarkerOpSel )
;*************************************************************************************/
void JpegRSTMarkerOpSelSet( JpegRSTMarkerOpSel rstMarkerOpSel )
{
	rstMarkerOpSel &= (JpegRSTMarkerOpSel)0x0003;
	halWriteReg16( REG101C_RST_MARKER_OP_SETTING, (unsigned short)rstMarkerOpSel );
}

/*************************************************************************************
; Function:	RST Marker processing method
; Input:	n/a
; Output:	rstMarkerOpSel
; Format:	JpegRSTMarkerOpSel JpegRSTMarkerOpSelGet( void )
;*************************************************************************************/
JpegRSTMarkerOpSel JpegRSTMarkerOpSelGet( void )
{
	JpegRSTMarkerOpSel rstMarkerOpSel = (JpegRSTMarkerOpSel)halReadReg16( REG101C_RST_MARKER_OP_SETTING) & 0x0003;
	return ( rstMarkerOpSel );
}

/*************************************************************************************
; Function:	Get RST Marker Op Status
; Input:	n/a
; Output:	JpegErrorStatus
; Format:	JpegErrorStatus JpegErrorStatusGet( void )
;*************************************************************************************/
JpegErrorStatus JpegErrorStatusGet( void )
{
	unsigned short rstMarkerOperationStatus = halReadReg16( REG101E_RST_MARKER_OP_STATUS );
	JpegErrorStatus jpegErrorStatus = (JpegErrorStatus)(rstMarkerOperationStatus & 0x0078);
	return ( jpegErrorStatus );
}

/*************************************************************************************
; Function:	Revise Code operation enable Set
; Input:	enable / disable
; Output:	none
; Format:	void JpegReviseCodeEnSet(BOOL start)
;*************************************************************************************/
void JpegReviseCodeEnSet(BOOL start)
{
	unsigned short enable = halReadReg16( REG101E_RST_MARKER_OP_STATUS);
	enable &= (~TRUE);
	enable |= (unsigned short)start;
	halWriteReg16( REG101E_RST_MARKER_OP_STATUS, enable );	
}

//-----------------------------------------------------------------------------
//	JpegLoadHuffmanTables - loads Huffman table registers with default values
//
//	Input:	n/a
//
//	Output:	n/a
//
//-----------------------------------------------------------------------------
void JpegLoadHuffmanTables( void )
{
	static unsigned short aDCHuffmanTable0[] = 
	{
		0x0000,0x0001,0x0005,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
		0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000a,0x000b
	};
	static unsigned short aACHuffmanTable0[] = 
	{
		0x0000,0x0002,0x0001,0x0003,0x0003,0x0002,0x0004,0x0003,0x0005,0x0005,0x0004,0x0004,0x0000,0x0000,0x0001,0x007d,
		0x0001,0x0002,0x0003,0x0000,0x0004,0x0011,0x0005,0x0012,0x0021,0x0031,0x0041,0x0006,0x0013,0x0051,0x0061,0x0007,
		0x0022,0x0071,0x0014,0x0032,0x0081,0x0091,0x00a1,0x0008,0x0023,0x0042,0x00b1,0x00c1,0x0015,0x0052,0x00d1,0x00f0,
		0x0024,0x0033,0x0062,0x0072,0x0082,0x0009,0x000a,0x0016,0x0017,0x0018,0x0019,0x001a,0x0025,0x0026,0x0027,0x0028,
		0x0029,0x002a,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,0x0049,
		0x004a,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,
		0x006a,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,
		0x008a,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009a,0x00a2,0x00a3,0x00a4,0x00a5,0x00a6,0x00a7,
		0x00a8,0x00a9,0x00aa,0x00b2,0x00b3,0x00b4,0x00b5,0x00b6,0x00b7,0x00b8,0x00b9,0x00ba,0x00c2,0x00c3,0x00c4,0x00c5,
		0x00c6,0x00c7,0x00c8,0x00c9,0x00ca,0x00d2,0x00d3,0x00d4,0x00d5,0x00d6,0x00d7,0x00d8,0x00d9,0x00da,0x00e1,0x00e2,
		0x00e3,0x00e4,0x00e5,0x00e6,0x00e7,0x00e8,0x00e9,0x00ea,0x00f1,0x00f2,0x00f3,0x00f4,0x00f5,0x00f6,0x00f7,0x00f8,
		0x00f9,0x00fa
	};
	static unsigned short aDCHuffmanTable1[] = 
	{
		0x0000,0x0003,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0001,0x0000,0x0000,0x0000,0x0000,0x0000,
		0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000a,0x000b
	};
	static unsigned short aACHuffmanTable1[] = 
	{
		0x0000,0x0002,0x0001,0x0002,0x0004,0x0004,0x0003,0x0004,0x0007,0x0005,0x0004,0x0004,0x0000,0x0001,0x0002,0x0077,
		0x0000,0x0001,0x0002,0x0003,0x0011,0x0004,0x0005,0x0021,0x0031,0x0006,0x0012,0x0041,0x0051,0x0007,0x0061,0x0071,
		0x0013,0x0022,0x0032,0x0081,0x0008,0x0014,0x0042,0x0091,0x00a1,0x00b1,0x00c1,0x0009,0x0023,0x0033,0x0052,0x00f0,
		0x0015,0x0062,0x0072,0x00d1,0x000a,0x0016,0x0024,0x0034,0x00e1,0x0025,0x00f1,0x0017,0x0018,0x0019,0x001a,0x0026,
		0x0027,0x0028,0x0029,0x002a,0x0035,0x0036,0x0037,0x0038,0x0039,0x003a,0x0043,0x0044,0x0045,0x0046,0x0047,0x0048,
		0x0049,0x004a,0x0053,0x0054,0x0055,0x0056,0x0057,0x0058,0x0059,0x005a,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,
		0x0069,0x006a,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007a,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,
		0x0088,0x0089,0x008a,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009a,0x00a2,0x00a3,0x00a4,0x00a5,
		0x00a6,0x00a7,0x00a8,0x00a9,0x00aa,0x00b2,0x00b3,0x00b4,0x00b5,0x00b6,0x00b7,0x00b8,0x00b9,0x00ba,0x00c2,0x00c3,
		0x00c4,0x00c5,0x00c6,0x00c7,0x00c8,0x00c9,0x00ca,0x00d2,0x00d3,0x00d4,0x00d5,0x00d6,0x00d7,0x00d8,0x00d9,0x00da,
		0x00e2,0x00e3,0x00e4,0x00e5,0x00e6,0x00e7,0x00e8,0x00e9,0x00ea,0x00f2,0x00f3,0x00f4,0x00f5,0x00f6,0x00f7,0x00f8,
		0x00f9,0x00fa
	};

	LoadTable( 0x1400, aDCHuffmanTable0, sizeof( aDCHuffmanTable0 ) / sizeof( unsigned short ) );
	LoadTable( 0x1440, aACHuffmanTable0, sizeof( aACHuffmanTable0 ) / sizeof( unsigned short ) );
	LoadTable( 0x1600, aDCHuffmanTable1, sizeof( aDCHuffmanTable1 ) / sizeof( unsigned short ) );
	LoadTable( 0x1640, aACHuffmanTable1, sizeof( aACHuffmanTable1 ) / sizeof( unsigned short ) );
}

//-----------------------------------------------------------------------------
//	JpegLoadQuantizationTables - loads quantization tables with default values
//
//	Input:	n/a
//
//	Output:	n/a
//
//-----------------------------------------------------------------------------
void JpegLoadQuantizationTables( void )
{
	static unsigned short aQuantizationTable0[] = 
	{
		0x000c,0x0008,0x0007,0x000c,0x0012,0x001e,0x0026,0x002d,0x0009,0x0009,0x000a,0x000e,0x0013,0x002b,0x002d,0x0029,
		0x000a,0x0009,0x000c,0x0012,0x001e,0x002a,0x0033,0x002a,0x000a,0x000c,0x0010,0x0015,0x0026,0x0041,0x003c,0x002e,
		0x000d,0x0010,0x001b,0x002a,0x0033,0x0051,0x004d,0x0039,0x0012,0x001a,0x0029,0x0030,0x003c,0x004e,0x0054,0x0045,
		0x0024,0x0030,0x003a,0x0041,0x004d,0x005a,0x005a,0x004b,0x0036,0x0045,0x0047,0x0049,0x0054,0x004b,0x004d,0x004a
	};
	static unsigned short aQuantizationTable1[] = 
	{
		0x000c,0x000d,0x0012,0x0023,0x004a,0x004a,0x004a,0x004a,0x000d,0x000f,0x0013,0x0031,0x004a,0x004a,0x004a,0x004a,
		0x0012,0x0013,0x002a,0x004a,0x004a,0x004a,0x004a,0x004a,0x0023,0x0031,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,
		0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,
		0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a
	};

	LoadTable( 0x1200, aQuantizationTable0, sizeof( aQuantizationTable0 ) / sizeof( unsigned short ) );
	LoadTable( 0x1280, aQuantizationTable1, sizeof( aQuantizationTable1 ) / sizeof( unsigned short ) );
}

//-----------------------------------------------------------------------------
//	JPEGQuantQualitySet - programs quantization table according to specified
//							quality
//
//	Input:	quality - as value from 0..100
//
//	Output:	n/a
//			
//-----------------------------------------------------------------------------
void JPEGQuantQualitySet( unsigned char Quality )
{
	#define	QUANTUM_TABLE_SIZE	64
	unsigned char iQuantInfo;
	long ScaleFactor, tmp;

	static unsigned short aQuantizationTable0[] = 
	{
		0x000c,0x0008,0x0007,0x000c,0x0012,0x001e,0x0026,0x002d,0x0009,0x0009,0x000a,0x000e,0x0013,0x002b,0x002d,0x0029,
		0x000a,0x0009,0x000c,0x0012,0x001e,0x002a,0x0033,0x002a,0x000a,0x000c,0x0010,0x0015,0x0026,0x0041,0x003c,0x002e,
		0x000d,0x0010,0x001b,0x002a,0x0033,0x0051,0x004d,0x0039,0x0012,0x001a,0x0029,0x0030,0x003c,0x004e,0x0054,0x0045,
		0x0024,0x0030,0x003a,0x0041,0x004d,0x005a,0x005a,0x004b,0x0036,0x0045,0x0047,0x0049,0x0054,0x004b,0x004d,0x004a
	};
	static unsigned short aQuantizationTable1[] = 
	{
		0x000c,0x000d,0x0012,0x0023,0x004a,0x004a,0x004a,0x004a,0x000d,0x000f,0x0013,0x0031,0x004a,0x004a,0x004a,0x004a,
		0x0012,0x0013,0x002a,0x004a,0x004a,0x004a,0x004a,0x004a,0x0023,0x0031,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,
		0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,
		0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a
	};

	struct QuantInfo
	{
		unsigned short index;
		const unsigned short* pQTable;
	};
	struct QuantInfo aQuantInfo[] =
	{
		{REG1200_QUANTIZATION_TABLE_NO0, aQuantizationTable0},
		{REG1280_QUANTIZATION_TABLE_NO1, aQuantizationTable1},
	};

	if ( Quality > 100 )  
	{
		Quality = 100;
	}
	else if ( Quality < 50 )
	{
		ScaleFactor = 5000 / (long)Quality;
	}
	else
	{
		ScaleFactor = 200 - (long)Quality * 2;
	}

	for ( iQuantInfo = 0; iQuantInfo < sizeof( aQuantInfo ) / sizeof( struct QuantInfo ); ++iQuantInfo )
	{
		unsigned short	RegAdd = aQuantInfo[ iQuantInfo ].index; //=REG1280_QUANTIZATION_TABLE_NO1;
		const unsigned short	*pQTable = aQuantInfo[ iQuantInfo ].pQTable;
		unsigned char	i;

		for ( i = 0; i < QUANTUM_TABLE_SIZE; i++ )
		{
			tmp = ((long)*pQTable * ScaleFactor + 50L) / 100L;
			if ( tmp <= 0L )   
			{
				tmp = 1L;
			}
			else if ( tmp > 255L ) 
			{
				tmp = 255L;
			}
			halWriteReg16( RegAdd, (unsigned short)tmp );
			RegAdd=RegAdd+2;
			pQTable++;
		}
	}
}


//-----------------------------------------------------------------------------
//	LoadTable - loads a given table with a list of values
//
//	Input:	index		starting index for table load (assumed every 2nd registers)
//			pTable		polonger to table values to program in registers
//			size		number of entries in given table
//
//	Output:	n/a
//
//-----------------------------------------------------------------------------
void LoadTable( unsigned short index, unsigned short* pTable, unsigned long size )
{
	unsigned short i = 0;
	for ( ; i < size; index += sizeof( unsigned short), ++i, ++pTable )
	{
		halWriteReg16( index, *pTable );
	}
}


/*************************************************************************************
; Function:	loads a given table with a list of values
; Input:	index		starting index for table load (assumed every 2nd registers)
;			pTable		pointer to table values to program in registers
;			size		number of entries in given table
; Output:	n/a
; Format:	void LoadTable( unsigned short index, unsigned short* pTable, unsigned long size )
;*************************************************************************************/
/*void LoadTable( unsigned short index, unsigned short* pTable, unsigned long size )
{
	unsigned short i = 0;
	for ( ; i < size; index += sizeof( unsigned short), ++i, ++pTable )
	{
		halWriteReg16( index, *pTable );
	}
}
*/
/************************************************************************************
; Function:	loads quantization tables with default values
; Input:	n/a
; Output:	n/a
; Format:	void JpegLoadQuantizationTables( void )
;*************************************************************************************/
/*void JpegLoadQuantizationTables( void )
{
	static unsigned short aQuantizationTable0[] = 
	{
		0x000c,0x0008,0x0007,0x000c,0x0012,0x001e,0x0026,0x002d,0x0009,0x0009,0x000a,0x000e,0x0013,0x002b,0x002d,0x0029,
		0x000a,0x0009,0x000c,0x0012,0x001e,0x002a,0x0033,0x002a,0x000a,0x000c,0x0010,0x0015,0x0026,0x0041,0x003c,0x002e,
		0x000d,0x0010,0x001b,0x002a,0x0033,0x0051,0x004d,0x0039,0x0012,0x001a,0x0029,0x0030,0x003c,0x004e,0x0054,0x0045,
		0x0024,0x0030,0x003a,0x0041,0x004d,0x005a,0x005a,0x004b,0x0036,0x0045,0x0047,0x0049,0x0054,0x004b,0x004d,0x004a
	};
	static unsigned short aQuantizationTable1[] = 
	{
		0x000c,0x000d,0x0012,0x0023,0x004a,0x004a,0x004a,0x004a,0x000d,0x000f,0x0013,0x0031,0x004a,0x004a,0x004a,0x004a,
		0x0012,0x0013,0x002a,0x004a,0x004a,0x004a,0x004a,0x004a,0x0023,0x0031,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,
		0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,
		0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a,0x004a
	};

	LoadTable( REG1200_QUANTIZATION_TABLE_NO0, aQuantizationTable0, sizeof( aQuantizationTable0 ) / sizeof( unsigned short ) );
	LoadTable( REG1280_QUANTIZATION_TABLE_NO1, aQuantizationTable1, sizeof( aQuantizationTable1 ) / sizeof( unsigned short ) );
}
*/

/*************************************************************************************
; Function:	loads Huffman table registers with default values
; Input:	n/a
; Output:	n/a
; Format:	void JpegLoadHuffmanTables( void )

⌨️ 快捷键说明

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