📄 hal_jpeg.c
字号:
{
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 + -