📄 tonyjpegdecoder.cpp
字号:
case M_RST2:
case M_RST3:
case M_RST4:
case M_RST5:
case M_RST6:
case M_RST7:
case M_TEM:
// TRACEMS1(cinfo, 1, JTRC_PARMLESS_MARKER, cinfo->unread_marker);
break;
case M_DNL: //* Ignore DNL ... perhaps the wrong thing
if (! skip_variable(cinfo))
return -1;//JPEG_SUSPENDED;
break;
*/
default:
/* must be DHP, EXP, JPGn, or RESn */
/* For now, we treat the reserved markers as fatal errors since they are
* likely to be used to signal incompatible JPEG Part 3 extensions.
* Once the JPEG 3 version-number marker is well defined, this code
* ought to change!
*/
return -1;// ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker);
break;
}
/* Successfully processed marker, so reset state variable */
unread_marker = 0;
}
}
///////////////////////////////////////////////////////////////////////////////
void CTonyJpegDecoder::read_restart_marker (void)
{
/* Obtain a marker unless we already did. */
/* Note that next_marker will complain if it skips any data. */
if (unread_marker == 0)
{
unread_marker = ReadOneMarker();
}
if (unread_marker == ((int) M_RST0 + next_restart_num))
{
/* Normal case --- swallow the marker and let entropy decoder continue */
unread_marker = 0;
}
else {
/* Uh-oh, the restart markers have been messed up. */
/* Let the data source manager determine how to resync. */
//lin changed:
/*
if (! (*cinfo->src->resync_to_restart) (cinfo,
cinfo->marker->next_restart_num))
return FALSE;
*/
}
/* Update next-restart state */
next_restart_num = (next_restart_num + 1) & 7;
return;
}
////////////////////////////////////////////////////////////////////////////////
// Prepare for all the tables needed,
// eg. quantization tables, huff tables, color convert tables
// 1 <= nQuality <= 100, is used for quantization scaling
// Computing once, and reuse them again and again !!!!!!!
void CTonyJpegDecoder::InitDecoder( void )
{
m_nGetBits = 0;
m_nGetBuff = 0;
m_dcY = m_dcCb = m_dcCr = 0;
// prepare range limiting table to limit idct outputs
SetRangeTable( );
// prepare color convert table, from bgr to ycbcr
InitColorTable( );
// prepare two quant tables, one for Y, and another for CbCr
InitQuantTable( );
// prepare four huffman tables:
InitHuffmanTable( );
}
////////////////////////////////////////////////////////////////////////////////
// prepare_range_limit_table(): Set m_tblRange[5*256+128 = 1408]
// range table is used for range limiting of idct results
/* On most machines, particularly CPUs with pipelines or instruction prefetch,
* a (subscript-check-less) C table lookup
* x = sample_range_limit[x];
* is faster than explicit tests
* if (x < 0) x = 0;
* else if (x > MAXJSAMPLE) x = MAXJSAMPLE;
*/
void CTonyJpegDecoder::SetRangeTable( void )
{
unsigned char *tbl;
// m_tblRange[0, ..., 255], limit[x] = 0 for x < 0
memset( m_tblRange, 0, 256 );
// m_tblRange[256, ..., 511], limit[x] = x
tbl = m_tblRange + 256;
for( int i=0; i<256; i++ )
*(tbl++) = (unsigned char) i;
// m_tblRange[512, ..., 895]: first half of post-IDCT table
tbl = m_tblRange + 512;
for (i = 128; i < 512; i++)
*(tbl++) = 255;
// m_tblRange[896, ..., 1280]: Second half of post-IDCT table
memset( m_tblRange + 896, 0, 384);
// [1280, 1407] = [256, 384]
memcpy( m_tblRange + 1280, m_tblRange + 256, 128);
}
////////////////////////////////////////////////////////////////////////////////
/**************** YCbCr -> RGB conversion: most common case **************/
/*
* YCbCr is defined per CCIR 601-1, except that Cb and Cr are
* normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5.
* The conversion equations to be implemented are therefore
* R = Y + 1.40200 * Cr
* G = Y - 0.34414 * Cb - 0.71414 * Cr
* B = Y + 1.77200 * Cb
* where Cb and Cr represent the incoming values less CENTERJSAMPLE.
* (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.)
*
* To avoid floating-point arithmetic, we represent the fractional constants
* as integers scaled up by 2^16 (about 4 digits precision); we have to divide
* the products by 2^16, with appropriate rounding, to get the correct answer.
* Notice that Y, being an integral input, does not contribute any fraction
* so it need not participate in the rounding.
*
* For even more speed, we avoid doing any multiplications in the inner loop
* by precalculating the constants times Cb and Cr for all possible values.
* For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table);
* for 12-bit samples it is still acceptable. It's not very reasonable for
* 16-bit samples, but if you want lossless storage you shouldn't be changing
* colorspace anyway.
* The Cr=>R and Cb=>B values can be rounded to integers in advance; the
* values for the G calculation are left scaled up, since we must add them
* together before rounding.
*/
void CTonyJpegDecoder::InitColorTable( void )
{
int i, x;
int nScale = 1L << 16; //equal to power(2,16)
int nHalf = nScale >> 1;
#define FIX(x) ((int) ((x) * nScale + 0.5))
/* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
/* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
/* Cr=>R value is nearest int to 1.40200 * x */
/* Cb=>B value is nearest int to 1.77200 * x */
/* Cr=>G value is scaled-up -0.71414 * x */
/* Cb=>G value is scaled-up -0.34414 * x */
/* We also add in ONE_HALF so that need not do it in inner loop */
for (i = 0, x = -128; i < 256; i++, x++)
{
m_CrToR[i] = (int) ( FIX(1.40200) * x + nHalf ) >> 16;
m_CbToB[i] = (int) ( FIX(1.77200) * x + nHalf ) >> 16;
m_CrToG[i] = (int) (- FIX(0.71414) * x );
m_CbToG[i] = (int) (- FIX(0.34414) * x + nHalf );
}
}
////////////////////////////////////////////////////////////////////////////////
// InitQuantTable will produce customized quantization table into:
// m_tblYQuant[0..63] and m_tblCbCrQuant[0..63]
void CTonyJpegDecoder::InitQuantTable( void )
{
// These are the sample quantization tables given in JPEG spec section K.1.
// The spec says that the values given produce "good" quality, and
// when divided by 2, "very good" quality.
static unsigned short std_luminance_quant_tbl[64] =
{
16, 11, 10, 16, 24, 40, 51, 61,
12, 12, 14, 19, 26, 58, 60, 55,
14, 13, 16, 24, 40, 57, 69, 56,
14, 17, 22, 29, 51, 87, 80, 62,
18, 22, 37, 56, 68, 109, 103, 77,
24, 35, 55, 64, 81, 104, 113, 92,
49, 64, 78, 87, 103, 121, 120, 101,
72, 92, 95, 98, 112, 100, 103, 99
};
static unsigned short std_chrominance_quant_tbl[64] =
{
17, 18, 24, 47, 99, 99, 99, 99,
18, 21, 26, 66, 99, 99, 99, 99,
24, 26, 56, 99, 99, 99, 99, 99,
47, 66, 99, 99, 99, 99, 99, 99,
99, 99, 99, 99, 99, 99, 99, 99,
99, 99, 99, 99, 99, 99, 99, 99,
99, 99, 99, 99, 99, 99, 99, 99,
99, 99, 99, 99, 99, 99, 99, 99
};
/* For AA&N IDCT method, divisors are equal to quantization
* coefficients scaled by scalefactor[row]*scalefactor[col], where
* scalefactor[0] = 1
* scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7
* We apply a further scale factor of 8.
*/
static unsigned short aanscales[64] = {
/* precomputed values scaled up by 14 bits */
16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270,
21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906,
19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315,
16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552,
8867, 12299, 11585, 10426, 8867, 6967, 4799, 2446,
4520, 6270, 5906, 5315, 4520, 3552, 2446, 1247
};
// Scale the Y and CbCr quant table, respectively
ScaleQuantTable( m_qtblY, m_qtblY, aanscales );
ScaleQuantTable( m_qtblCbCr, m_qtblCbCr, aanscales );
// If no qtb got from jpg file header, then use std quant tbl
// ScaleQuantTable( m_qtblY, std_luminance_quant_tbl, aanscales );
// ScaleQuantTable( m_qtblCbCr, std_chrominance_quant_tbl, aanscales );
}
////////////////////////////////////////////////////////////////////////////////
void CTonyJpegDecoder::ScaleQuantTable(
unsigned short* tblRst, //result quant table
unsigned short* tblStd, //standard quant table
unsigned short* tblAan //scale factor for AAN dct
)
{
int i, half = 1<<11;
for (i = 0; i < 64; i++)
{
// scaling needed for AA&N algorithm
tblRst[i] = (unsigned short)(( tblStd[i] * tblAan[i] + half ) >> 12 );
}
}
////////////////////////////////////////////////////////////////////////////////
// Prepare four Huffman tables:
// HUFFMAN_TABLE m_htblYDC, m_htblYAC, m_htblCbCrDC, m_htblCbCrAC;
void CTonyJpegDecoder::InitHuffmanTable( void )
{
// Y dc component
static unsigned char bitsYDC[17] =
{ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };
static unsigned char valYDC[] =
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
// CbCr dc
static unsigned char bitsCbCrDC[17] =
{ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };
static unsigned char valCbCrDC[] =
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
// Y ac component
static unsigned char bitsYAC[17] =
{ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d };
static unsigned char valYAC[] =
{ 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
0xf9, 0xfa };
// CbCr ac
static unsigned char bitsCbCrAC[17] =
{ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 };
static unsigned char valCbCrAC[] =
{ 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
0xf9, 0xfa };
// Using default dht
// Compute four derived Huffman tables
/*
ComputeHuffmanTable( bitsYDC, valYDC, &m_htblYDC );
ComputeHuffmanTable( bitsYAC, valYAC, &m_htblYAC );
ComputeHuffmanTable( bitsCbCrDC, valCbCrDC, &m_htblCbCrDC );
ComputeHuffmanTable( bitsCbCrAC, valCbCrAC, &m_htblCbCrAC );
*/
// Using dht got from jpeg file header
ComputeHuffmanTable( &m_htblYDC );
ComputeHuffmanTable( &m_htblYAC );
ComputeHuffmanTable( &m_htblCbCrDC );
ComputeHuffmanTable( &m_htblCbCrAC );
}
////////////////////////////////////////////////////////////////////////////////
// Compute the derived values for a Huffman table.
void CTonyJpegDecoder::ComputeHuffmanTable(HUFFTABLE * dtbl )
{
int p, i, l, si;
int lookbits, ctr;
char huffsize[257];
unsigned int huffcode[257];
unsigned int code;
unsigned char *pBits = dtbl->bits;
unsigned char *pVal = dtbl->huffval;
/* Figure C.1: make table of Huffman code length for each symbol */
/* Note that this is in code-length order. */
p = 0;
for (l = 1; l <= 16; l++) {
for (i = 1; i <= (int) pBits[l]; i++)
huffsize[p++] = (char) l;
}
huffsize[p] = 0;
/* Figure C.2: generate the codes themselves */
/* Note that this is in code-length order. */
code = 0;
si = huffsize[0];
p = 0;
while (huffsize[p]) {
while (((int) huffsize[p]) == si) {
huffcode[p++] = code;
code++;
}
code <<= 1;
si++;
}
/* Figure F.15: generate decoding tables for bit-sequential decoding */
p = 0;
for (l = 1; l <= 16; l++) {
if (pBits[l]) {
dtbl->valptr[l] = p; /* huffval[] index of 1st symbol of code length l */
dtbl->mincode[l] = huffcode[p]; /* minimum code of length l */
p += pBits[l];
dtbl->maxcode[l] = huffcode[p-1]; /* maximum code of length l */
} else {
dtbl->maxcode[l] = -1; /* -1 if no codes of this length */
}
}
dtbl->maxcode[17] = 0xFFFFFL; /* ensures jpeg_huff_decode terminates */
/* Compute lookahead tables to speed up decoding.
* First we set all the table entries to 0, indicating "too long";
* then we iterate through the Huffman codes that are short enough and
* fill in all the entries that correspond to bit sequences starting
* with that code. */
memset( dtbl->look_nbits, 0, sizeof(int)*256 );
int HUFF_LOOKAHEAD = 8;
p = 0;
for (l = 1; l <= HUFF_LOOKAHEAD; l++)
{
for (i = 1; i <= (int) pBits[l]; i++, p++)
{
/* l = current code's length,
p = its index in huffcode[] & huffval[]. Generate left-justified
code followed by all possible bit sequences */
lookbits = huffcode[p] << (HUFF_LOOKAHEAD-l);
for (ctr = 1 << (HUFF_LOOKAHEAD-l); ctr > 0; ctr--)
{
dtbl->look_nbits[lookbits] = l;
dtbl->look_sym[lookbits] = pVal[p];
lookbits++;
}
}
}
}
////////////////////////////////////////////////////////////////////////////////
// CTonyJpegDecoder::DecompressImage(), the main function in this class !!
// IMPORTANT: You should call GetImageInfo() to get image width and height,
// Then allocate (m_nWidth * m_nHeight * 3) bytes for pOutBuf
bool CTonyJpegDecoder::DecompressImage(
unsigned char *pInBuf, //in, source data, in jpg format
unsigned char *pOutBuf //out, bmp bgr format, bottom_up
)
{
// Error handling
if(( pInBuf == 0 )||( pOutBuf == 0 ))
return false;
// declares
int xPixel, yPixel, xTile, yTile, cxTile, cyTile;
int y, nTrueRows, nTrueCols, nRowBytes;
unsigned char byTile[768], *pTileRow;
// horizontal and vertical count of tile, macroblocks,
// MCU(Minimum Coded Unit),
// case 1: maybe is 16*16 pixels, 6 blocks
// case 2: may be 8*8 pixels, only 3 blocks
cxTile = (m_nWidth + m_nMcuSize - 1) / m_nMcuSize;
cyTile = (m_nHeight + m_nMcuSize - 1) / m_nMcuSize;
// BMP row width, must be divided by 4
nRowBytes = (m_nWidth * 3 + 3) / 4 * 4;
// source ptr
m_pData = pInBuf;
// Decompress all the tiles, or macroblocks, or MCUs
for( yTile = 0; yTile < cyTile; yTile++ )
{
for( xTile = 0; xTile < cxTile; xTile++ )
{
// Decompress one macroblock started from m_pData;
// This function will push m_pData ahead
// Result is storing in byTile
if( ! DecompressOneTile( byTile ))
return false;
// Get tile starting pixel position
xPixel = xTile * m_nMcuSize;
yPixel = yTile * m_nMcuSize;
// Get the true number of tile columns and rows
nTrueRows = m_nMcuSize;
nTrueCols = m_nMcuSize;
if( yPixel + nTrueRows > m_nHeight )
nTrueRows = m_nHeight - yPixel;
if( xPixel + nTrueCols > m_nWidth )
nTrueCols = m_nWidth - xPixel;
// Invert output, to bmp format; row 0=>row (m_nHeight-1)
pTileRow = pOutBuf + (m_nHeight - 1 - yPixel) * nRowBytes + xPixel * 3;
for( y = 0; y < nTrueRows; y ++ )
{
memcpy( pTileRow, byTile + y * m_nMcuSize * 3, nTrueCols * 3 );
pTileRow -= nRowBytes;
}
}
}
return true;
}
////////////////////////////////////////////////////////////////////////////////
// function Purpose: decompress one 16*16 pixels
// source is m_pData;
// This function will push m_pData ahead for next tile
bool CTonyJpegDecoder::DecompressOneTile(
unsigned char * pBgr //out, in BGR format, 16*16*3
)
{
// Process restart marker if needed; may have to suspend
if (restart_interval)
{
if (restarts_to_go == 0)
{
m_nGetBits = 0;
read_restart_marker();
m_dcY = m_dcCb = m_dcCr = 0;
restarts_to_go = restart_interval;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -