📄 jpegdec.cpp
字号:
jerr = m_BitStreamIn.CheckByte(1,&b1);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamIn.CheckByte(2,&b2);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamIn.CheckByte(3,&b3);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamIn.CheckByte(4,&b4);
if(JPEG_OK != jerr)
return jerr;
if(len >= APP0_JFIF_LENGTH &&
b0 == 0x4a && // J
b1 == 0x46 && // F
b2 == 0x49 && // I
b3 == 0x46 && // F
b4 == 0)
{
// we've found JFIF APP0 marker
len -= 5;
jerr = m_BitStreamIn.Seek(5);
if(JPEG_OK != jerr)
return jerr;
m_jfif_app0_detected = 1;
jerr = m_BitStreamIn.ReadByte(&m_jfif_app0_major);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamIn.ReadByte(&m_jfif_app0_minor);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamIn.ReadByte(&m_jfif_app0_units);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamIn.ReadWord(&m_jfif_app0_xDensity);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamIn.ReadWord(&m_jfif_app0_yDensity);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamIn.ReadByte(&m_jfif_app0_thumb_width);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamIn.ReadByte(&m_jfif_app0_thumb_height);
if(JPEG_OK != jerr)
return jerr;
len -= 9;
}
jerr = m_BitStreamIn.CheckByte(0,&b0);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamIn.CheckByte(1,&b1);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamIn.CheckByte(2,&b2);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamIn.CheckByte(3,&b3);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamIn.CheckByte(4,&b4);
if(JPEG_OK != jerr)
return jerr;
if(len >= APP0_JFXX_LENGTH &&
b0 == 0x4a && // J
b1 == 0x46 && // F
b2 == 0x58 && // X
b3 == 0x58 && // X
b4 == 0)
{
// we've found JFXX APP0 extension marker
len -= 5;
jerr = m_BitStreamIn.Seek(5);
if(JPEG_OK != jerr)
return jerr;
m_jfxx_app0_detected = 1;
jerr = m_BitStreamIn.ReadByte(&m_jfxx_thumbnails_type);
if(JPEG_OK != jerr)
return jerr;
switch(m_jfxx_thumbnails_type)
{
case 0x10: break;
case 0x11: break;
case 0x13: break;
default: break;
}
len -= 1;
}
jerr = m_BitStreamIn.CheckByte(0,&b0);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamIn.CheckByte(1,&b1);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamIn.CheckByte(2,&b2);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamIn.CheckByte(3,&b3);
if(JPEG_OK != jerr)
return jerr;
if(len >= APP0_AVI1_LENGTH &&
b0 == 0x41 && // A
b1 == 0x56 && // V
b2 == 0x49 && // I
b3 == 0x31) // 1
{
// we've found AVI1 APP0 marker
len -= 4;
jerr = m_BitStreamIn.Seek(4);
if(JPEG_OK != jerr)
return jerr;
m_avi1_app0_detected = 1;
jerr = m_BitStreamIn.ReadByte(&m_avi1_app0_polarity);
if(JPEG_OK != jerr)
return jerr;
len -= 1;
if(len == 7) // old MJPEG AVI
len -= 7;
if(len == 9) // ODML MJPEG AVI
{
jerr = m_BitStreamIn.ReadByte(&m_avi1_app0_reserved);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamIn.ReadDword(&m_avi1_app0_field_size);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamIn.ReadDword(&m_avi1_app0_field_size2);
if(JPEG_OK != jerr)
return jerr;
len -= 9;
}
}
jerr = m_BitStreamIn.Seek(len);
if(JPEG_OK != jerr)
return jerr;
m_marker = JM_NONE;
return JPEG_OK;
} // CJPEGDecoder::ParseAPP0()
JERRCODE CJPEGDecoder::ParseAPP1(void)
{
int i;
int b0, b1, b2, b3, b4;
int len;
JERRCODE jerr;
TRC0("-> APP0");
jerr = m_BitStreamIn.ReadWord(&len);
if(JPEG_OK != jerr)
return jerr;
len -= 2;
jerr = m_BitStreamIn.CheckByte(0,&b0);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamIn.CheckByte(1,&b1);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamIn.CheckByte(2,&b2);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamIn.CheckByte(3,&b3);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamIn.CheckByte(4,&b4);
if(JPEG_OK != jerr)
return jerr;
if(b0 == 0x45 && // E
b1 == 0x78 && // x
b2 == 0x69 && // i
b3 == 0x66 && // f
b4 == 0)
{
m_exif_app1_detected = 1;
m_exif_app1_data_size = len;
jerr = m_BitStreamIn.Seek(6);
if(JPEG_OK != jerr)
return jerr;
len -= 6;
if(m_exif_app1_data != 0)
{
ippFree(m_exif_app1_data);
m_exif_app1_data = 0;
}
m_exif_app1_data = (Ipp8u*)ippMalloc(len);
if(0 == m_exif_app1_data)
return JPEG_ERR_ALLOC;
for(i = 0; i < len; i++)
{
jerr = m_BitStreamIn.ReadByte(&b0);
if(JPEG_OK != jerr)
return jerr;
m_exif_app1_data[i] = (Ipp8u)b0;
}
}
else
{
jerr = m_BitStreamIn.Seek(len);
if(JPEG_OK != jerr)
return jerr;
}
m_marker = JM_NONE;
return JPEG_OK;
} // CJPEGDecoder::ParseAPP1()
const int APP14_ADOBE_LENGTH = 12;
JERRCODE CJPEGDecoder::ParseAPP14(void)
{
int b0, b1, b2, b3, b4;
int len;
JERRCODE jerr;
TRC0("-> APP14");
jerr = m_BitStreamIn.ReadWord(&len);
if(JPEG_OK != jerr)
return jerr;
len -= 2;
jerr = m_BitStreamIn.CheckByte(0,&b0);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamIn.CheckByte(1,&b1);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamIn.CheckByte(2,&b2);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamIn.CheckByte(3,&b3);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamIn.CheckByte(4,&b4);
if(JPEG_OK != jerr)
return jerr;
if(len >= APP14_ADOBE_LENGTH &&
b0 == 0x41 && // A
b1 == 0x64 && // d
b2 == 0x6f && // o
b3 == 0x62 && // b
b4 == 0x65) // e
{
// we've found Adobe APP14 marker
len -= 5;
jerr = m_BitStreamIn.Seek(5);
if(JPEG_OK != jerr)
return jerr;
m_adobe_app14_detected = 1;
jerr = m_BitStreamIn.ReadWord(&m_adobe_app14_version);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamIn.ReadWord(&m_adobe_app14_flags0);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamIn.ReadWord(&m_adobe_app14_flags1);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamIn.ReadByte(&m_adobe_app14_transform);
if(JPEG_OK != jerr)
return jerr;
TRC1(" adobe_app14_version - ",m_adobe_app14_version);
TRC1(" adobe_app14_flags0 - ",m_adobe_app14_flags0);
TRC1(" adobe_app14_flags1 - ",m_adobe_app14_flags1);
TRC1(" adobe_app14_transform - ",m_adobe_app14_transform);
len -= 7;
}
jerr = m_BitStreamIn.Seek(len);
if(JPEG_OK != jerr)
return jerr;
m_marker = JM_NONE;
return JPEG_OK;
} // CJPEGDecoder::ParseAPP14()
JERRCODE CJPEGDecoder::ParseCOM(void)
{
int i;
int c;
int len;
JERRCODE jerr;
TRC0("-> COM");
jerr = m_BitStreamIn.ReadWord(&len);
if(JPEG_OK != jerr)
return jerr;
len -= 2;
TRC1(" bytes for comment - ",len);
m_jpeg_comment_detected = 1;
m_jpeg_comment_size = len;
if(m_jpeg_comment != 0)
{
ippFree(m_jpeg_comment);
}
m_jpeg_comment = (Ipp8u*)ippMalloc(len+1);
if(0 == m_jpeg_comment)
return JPEG_ERR_ALLOC;
for(i = 0; i < len; i++)
{
jerr = m_BitStreamIn.ReadByte(&c);
if(JPEG_OK != jerr)
return jerr;
m_jpeg_comment[i] = (Ipp8u)c;
}
m_jpeg_comment[len] = 0;
m_marker = JM_NONE;
return JPEG_OK;
} // CJPEGDecoder::ParseCOM()
JERRCODE CJPEGDecoder::ParseDQT(void)
{
int i;
int id;
int len;
JERRCODE jerr;
TRC0("-> DQT");
jerr = m_BitStreamIn.ReadWord(&len);
if(JPEG_OK != jerr)
return jerr;
len -= 2;
while(len > 0)
{
jerr = m_BitStreamIn.ReadByte(&id);
if(JPEG_OK != jerr)
return jerr;
int precision = (id & 0xf0) >> 4;
TRC1(" id - ",(id & 0x0f));
TRC1(" precision - ",precision);
if((id & 0x0f) > MAX_QUANT_TABLES)
{
return JPEG_ERR_DQT_DATA;
}
int q;
Ipp8u qnt[DCTSIZE2*sizeof(Ipp16s)];
Ipp8u* pq8 = (Ipp8u*) qnt;
Ipp16u* pq16 = (Ipp16u*)qnt;
for(i = 0; i < DCTSIZE2; i++)
{
if(precision)
{
jerr = m_BitStreamIn.ReadWord(&q);
pq16[i] = (Ipp16u)q;
}
else
{
jerr = m_BitStreamIn.ReadByte(&q);
pq8[i] = (Ipp8u)q;
}
if(JPEG_OK != jerr)
return jerr;
}
if(precision == 1)
jerr = m_qntbl[id & 0x0f].Init(id,pq16);
else
jerr = m_qntbl[id & 0x0f].Init(id,pq8);
if(JPEG_OK != jerr)
{
return jerr;
}
len -= DCTSIZE2 + DCTSIZE2*precision + 1;
}
if(len != 0)
{
return JPEG_ERR_DQT_DATA;
}
m_marker = JM_NONE;
return JPEG_OK;
} // CJPEGDecoder::ParseDQT()
JERRCODE CJPEGDecoder::ParseDHT(void)
{
int i;
int len;
int index;
int count;
JERRCODE jerr;
TRC0("-> DHT");
jerr = m_BitStreamIn.ReadWord(&len);
if(JPEG_OK != jerr)
return jerr;
len -= 2;
int v;
Ipp8u bits[MAX_HUFF_BITS];
Ipp8u vals[MAX_HUFF_VALS];
while(len > 16)
{
jerr = m_BitStreamIn.ReadByte(&index);
if(JPEG_OK != jerr)
return jerr;
count = 0;
for(i = 0; i < MAX_HUFF_BITS; i++)
{
jerr = m_BitStreamIn.ReadByte(&v);
if(JPEG_OK != jerr)
return jerr;
bits[i] = (Ipp8u)v;
count += bits[i];
}
len -= 16 + 1;
if(count > MAX_HUFF_VALS || count > len)
{
return JPEG_ERR_DHT_DATA;
}
for(i = 0; i < count; i++)
{
jerr = m_BitStreamIn.ReadByte(&v);
if(JPEG_OK != jerr)
return jerr;
vals[i] = (Ipp8u)v;
}
len -= count;
if(index >> 4)
{
// make AC Huffman table
if(m_actbl[index & 0x0f].IsEmpty())
{
jerr = m_actbl[index & 0x0f].Create();
if(JPEG_OK != jerr)
{
LOG0(" Can't create AC huffman table");
return jerr;
}
}
TRC1(" AC Huffman Table - ",index & 0x0f);
jerr = m_actbl[index & 0x0f].Init(index & 0x0f,index >> 4,bits,vals);
if(JPEG_OK != jerr)
{
LOG0(" Can't build AC huffman table");
return jerr;
}
}
else
{
// make DC Huffman table
if(m_dctbl[index & 0x0f].IsEmpty())
{
jerr = m_dctbl[index & 0x0f].Create();
if(JPEG_OK != jerr)
{
LOG0(" Can't create DC huffman table");
return jerr;
}
}
TRC1(" DC Huffman Table - ",index & 0x0f);
jerr = m_dctbl[index & 0x0f].Init(index & 0x0f,index >> 4,bits,vals);
if(JPEG_OK != jerr)
{
LOG0(" Can't build DC huffman table");
return jerr;
}
}
}
if(len != 0)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -