📄 jpegdec.cpp
字号:
return JPEG_ERR_DHT_DATA;
}
m_marker = JM_NONE;
return JPEG_OK;
} // CJPEGDecoder::ParseDHT()
JERRCODE CJPEGDecoder::ParseSOF0(void)
{
int i;
int len;
CJPEGColorComponent* curr_comp;
JERRCODE jerr;
TRC0("-> SOF0");
jerr = m_BitStreamIn.ReadWord(&len);
if(JPEG_OK != jerr)
return jerr;
len -= 2;
jerr = m_BitStreamIn.ReadByte(&m_jpeg_precision);
if(JPEG_OK != jerr)
return jerr;
if(m_jpeg_precision != 8 && m_jpeg_precision != 12)
{
return JPEG_ERR_SOF_DATA;
}
jerr = m_BitStreamIn.ReadWord(&m_jpeg_height);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamIn.ReadWord(&m_jpeg_width);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamIn.ReadByte(&m_jpeg_ncomp);
if(JPEG_OK != jerr)
return jerr;
TRC1(" height - ",m_jpeg_height);
TRC1(" width - ",m_jpeg_width);
TRC1(" nchannels - ",m_jpeg_ncomp);
if(m_jpeg_ncomp < 0 || m_jpeg_ncomp > MAX_COMPS_PER_SCAN)
{
return JPEG_ERR_SOF_DATA;
}
len -= 6;
if(len != m_jpeg_ncomp * 3)
{
return JPEG_ERR_SOF_DATA;
}
for(m_nblock = 0, i = 0; i < m_jpeg_ncomp; i++)
{
curr_comp = &m_ccomp[i];
jerr = m_BitStreamIn.ReadByte(&curr_comp->m_id);
if(JPEG_OK != jerr)
return jerr;
int ss;
jerr = m_BitStreamIn.ReadByte(&ss);
if(JPEG_OK != jerr)
return jerr;
curr_comp->m_hsampling = (ss >> 4) & 0x0f;
curr_comp->m_vsampling = (ss ) & 0x0f;
if(m_jpeg_ncomp == 1)
{
curr_comp->m_hsampling = 1;
curr_comp->m_vsampling = 1;
}
jerr = m_BitStreamIn.ReadByte(&curr_comp->m_q_selector);
if(JPEG_OK != jerr)
return jerr;
if(curr_comp->m_hsampling <= 0 || curr_comp->m_vsampling <= 0)
{
return JPEG_ERR_SOF_DATA;
}
// num of DU block per component
curr_comp->m_nblocks = curr_comp->m_hsampling * curr_comp->m_vsampling;
// num of DU blocks per frame
m_nblock += curr_comp->m_nblocks;
TRC1(" id ",curr_comp->m_id);
TRC1(" hsampling - ",curr_comp->m_hsampling);
TRC1(" vsampling - ",curr_comp->m_vsampling);
TRC1(" qselector - ",curr_comp->m_q_selector);
}
jerr = DetectSampling();
if(JPEG_OK != jerr)
{
return jerr;
}
m_max_hsampling = m_ccomp[0].m_hsampling;
m_max_vsampling = m_ccomp[0].m_vsampling;
for(i = 0; i < m_jpeg_ncomp; i++)
{
curr_comp = &m_ccomp[i];
if(m_max_hsampling < curr_comp->m_hsampling)
m_max_hsampling = curr_comp->m_hsampling;
if(m_max_vsampling < curr_comp->m_vsampling)
m_max_vsampling = curr_comp->m_vsampling;
}
for(i = 0; i < m_jpeg_ncomp; i++)
{
curr_comp = &m_ccomp[i];
curr_comp->m_h_factor = m_max_hsampling / curr_comp->m_hsampling;
curr_comp->m_v_factor = m_max_vsampling / curr_comp->m_vsampling;
}
m_jpeg_mode = JPEG_BASELINE;
m_marker = JM_NONE;
return JPEG_OK;
} // CJPEGDecoder::ParseSOF0()
JERRCODE CJPEGDecoder::ParseSOF1(void)
{
int i;
int len;
CJPEGColorComponent* curr_comp;
JERRCODE jerr;
TRC0("-> SOF0");
jerr = m_BitStreamIn.ReadWord(&len);
if(JPEG_OK != jerr)
return jerr;
len -= 2;
jerr = m_BitStreamIn.ReadByte(&m_jpeg_precision);
if(JPEG_OK != jerr)
return jerr;
if(m_jpeg_precision != 8 && m_jpeg_precision != 12)
{
return JPEG_ERR_SOF_DATA;
}
jerr = m_BitStreamIn.ReadWord(&m_jpeg_height);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamIn.ReadWord(&m_jpeg_width);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamIn.ReadByte(&m_jpeg_ncomp);
if(JPEG_OK != jerr)
return jerr;
TRC1(" height - ",m_jpeg_height);
TRC1(" width - ",m_jpeg_width);
TRC1(" nchannels - ",m_jpeg_ncomp);
if(m_jpeg_ncomp < 0 || m_jpeg_ncomp > MAX_COMPS_PER_SCAN)
{
return JPEG_ERR_SOF_DATA;
}
len -= 6;
if(len != m_jpeg_ncomp * 3)
{
return JPEG_ERR_SOF_DATA;
}
for(i = 0; i < m_jpeg_ncomp; i++)
{
curr_comp = &m_ccomp[i];
jerr = m_BitStreamIn.ReadByte(&curr_comp->m_id);
if(JPEG_OK != jerr)
return jerr;
int ss;
jerr = m_BitStreamIn.ReadByte(&ss);
if(JPEG_OK != jerr)
return jerr;
curr_comp->m_hsampling = (ss >> 4) & 0x0f;
curr_comp->m_vsampling = (ss ) & 0x0f;
if(m_jpeg_ncomp == 1)
{
curr_comp->m_hsampling = 1;
curr_comp->m_vsampling = 1;
}
jerr = m_BitStreamIn.ReadByte(&curr_comp->m_q_selector);
if(JPEG_OK != jerr)
return jerr;
if(curr_comp->m_hsampling <= 0 || curr_comp->m_vsampling <= 0)
{
return JPEG_ERR_SOF_DATA;
}
// num of DU block per component
curr_comp->m_nblocks = curr_comp->m_hsampling * curr_comp->m_vsampling;
// num of DU blocks per frame
m_nblock += curr_comp->m_nblocks;
TRC1(" id ",curr_comp->m_id);
TRC1(" hsampling - ",curr_comp->m_hsampling);
TRC1(" vsampling - ",curr_comp->m_vsampling);
TRC1(" qselector - ",curr_comp->m_q_selector);
}
jerr = DetectSampling();
if(JPEG_OK != jerr)
{
return jerr;
}
m_max_hsampling = m_ccomp[0].m_hsampling;
m_max_vsampling = m_ccomp[0].m_vsampling;
for(i = 0; i < m_jpeg_ncomp; i++)
{
curr_comp = &m_ccomp[i];
if(m_max_hsampling < curr_comp->m_hsampling)
m_max_hsampling = curr_comp->m_hsampling;
if(m_max_vsampling < curr_comp->m_vsampling)
m_max_vsampling = curr_comp->m_vsampling;
}
for(i = 0; i < m_jpeg_ncomp; i++)
{
curr_comp = &m_ccomp[i];
curr_comp->m_h_factor = m_max_hsampling / curr_comp->m_hsampling;
curr_comp->m_v_factor = m_max_vsampling / curr_comp->m_vsampling;
}
m_jpeg_mode = JPEG_EXTENDED;
m_marker = JM_NONE;
return JPEG_OK;
} // CJPEGDecoder::ParseSOF1()
JERRCODE CJPEGDecoder::ParseSOF2(void)
{
int i;
int len;
CJPEGColorComponent* curr_comp;
JERRCODE jerr;
TRC0("-> SOF2");
jerr = m_BitStreamIn.ReadWord(&len);
if(JPEG_OK != jerr)
return jerr;
len -= 2;
jerr = m_BitStreamIn.ReadByte(&m_jpeg_precision);
if(JPEG_OK != jerr)
return jerr;
if(m_jpeg_precision != 8)
{
return JPEG_NOT_IMPLEMENTED;
}
jerr = m_BitStreamIn.ReadWord(&m_jpeg_height);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamIn.ReadWord(&m_jpeg_width);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamIn.ReadByte(&m_jpeg_ncomp);
if(JPEG_OK != jerr)
return jerr;
TRC1(" height - ",m_jpeg_height);
TRC1(" width - ",m_jpeg_width);
TRC1(" nchannels - ",m_jpeg_ncomp);
if(m_jpeg_ncomp < 0 || m_jpeg_ncomp > MAX_COMPS_PER_SCAN)
{
return JPEG_ERR_SOF_DATA;
}
len -= 6;
if(len != m_jpeg_ncomp * 3)
{
return JPEG_ERR_SOF_DATA;
}
for(i = 0; i < m_jpeg_ncomp; i++)
{
curr_comp = &m_ccomp[i];
jerr = m_BitStreamIn.ReadByte(&curr_comp->m_id);
if(JPEG_OK != jerr)
return jerr;
curr_comp->m_comp_no = i;
int ss;
jerr = m_BitStreamIn.ReadByte(&ss);
if(JPEG_OK != jerr)
return jerr;
curr_comp->m_hsampling = (ss >> 4) & 0x0f;
curr_comp->m_vsampling = (ss ) & 0x0f;
if(m_jpeg_ncomp == 1)
{
curr_comp->m_hsampling = 1;
curr_comp->m_vsampling = 1;
}
jerr = m_BitStreamIn.ReadByte(&curr_comp->m_q_selector);
if(JPEG_OK != jerr)
return jerr;
if(curr_comp->m_hsampling <= 0 || curr_comp->m_vsampling <= 0)
{
return JPEG_ERR_SOF_DATA;
}
// num of DU block per component
curr_comp->m_nblocks = curr_comp->m_hsampling * curr_comp->m_vsampling;
// num of DU blocks per frame
m_nblock += curr_comp->m_nblocks;
TRC1(" id ",curr_comp->m_id);
TRC1(" hsampling - ",curr_comp->m_hsampling);
TRC1(" vsampling - ",curr_comp->m_vsampling);
TRC1(" qselector - ",curr_comp->m_q_selector);
}
jerr = DetectSampling();
if(JPEG_OK != jerr)
{
return jerr;
}
m_max_hsampling = m_ccomp[0].m_hsampling;
m_max_vsampling = m_ccomp[0].m_vsampling;
for(i = 0; i < m_jpeg_ncomp; i++)
{
curr_comp = &m_ccomp[i];
if(m_max_hsampling < curr_comp->m_hsampling)
m_max_hsampling = curr_comp->m_hsampling;
if(m_max_vsampling < curr_comp->m_vsampling)
m_max_vsampling = curr_comp->m_vsampling;
}
for(i = 0; i < m_jpeg_ncomp; i++)
{
curr_comp = &m_ccomp[i];
curr_comp->m_h_factor = m_max_hsampling / curr_comp->m_hsampling;
curr_comp->m_v_factor = m_max_vsampling / curr_comp->m_vsampling;
}
m_jpeg_mode = JPEG_PROGRESSIVE;
m_marker = JM_NONE;
return JPEG_OK;
} // CJPEGDecoder::ParseSOF2()
JERRCODE CJPEGDecoder::ParseSOF3(void)
{
int i;
int len;
CJPEGColorComponent* curr_comp;
JERRCODE jerr;
TRC0("-> SOF3");
jerr = m_BitStreamIn.ReadWord(&len);
if(JPEG_OK != jerr)
return jerr;
len -= 2;
jerr = m_BitStreamIn.ReadByte(&m_jpeg_precision);
if(JPEG_OK != jerr)
return jerr;
if(m_jpeg_precision < 2 || m_jpeg_precision > 16)
{
return JPEG_ERR_SOF_DATA;
}
jerr = m_BitStreamIn.ReadWord(&m_jpeg_height);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamIn.ReadWord(&m_jpeg_width);
if(JPEG_OK != jerr)
return jerr;
jerr = m_BitStreamIn.ReadByte(&m_jpeg_ncomp);
if(JPEG_OK != jerr)
return jerr;
TRC1(" height - ",m_jpeg_height);
TRC1(" width - ",m_jpeg_width);
TRC1(" nchannels - ",m_jpeg_ncomp);
len -= 6;
if(len != m_jpeg_ncomp * 3)
{
// too short frame segment
// need to have 3 bytes per component for parameters
return JPEG_ERR_SOF_DATA;
}
for(i = 0; i < m_jpeg_ncomp; i++)
{
curr_comp = &m_ccomp[i];
jerr = m_BitStreamIn.ReadByte(&curr_comp->m_id);
if(JPEG_OK != jerr)
return jerr;
int ss;
jerr = m_BitStreamIn.ReadByte(&ss);
if(JPEG_OK != jerr)
return jerr;
curr_comp->m_hsampling = (ss >> 4) & 0x0f;
curr_comp->m_vsampling = (ss ) & 0x0f;
if(m_jpeg_ncomp == 1)
{
curr_comp->m_hsampling = 1;
curr_comp->m_vsampling = 1;
}
jerr = m_BitStreamIn.ReadByte(&curr_comp->m_q_selector);
if(JPEG_OK != jerr)
return jerr;
if(curr_comp->m_hsampling <= 0 || curr_comp->m_vsampling <= 0)
{
return JPEG_ERR_SOF_DATA;
}
// num of DU block per component
curr_comp->m_nblocks = curr_comp->m_hsampling * curr_comp->m_vsampling;
// num of DU blocks per frame
m_nblock += curr_comp->m_nblocks;
TRC1(" id ",curr_comp->m_id);
TRC1(" hsampling - ",curr_comp->m_hsampling);
TRC1(" vsampling - ",curr_comp->m_vsampling);
TRC1(" qselector - ",curr_comp->m_q_selector);
}
jerr = DetectSampling();
if(JPEG_OK != jerr)
{
return jerr;
}
m_max_hsampling = m_ccomp[0].m_hsampling;
m_max_vsampling = m_ccomp[0].m_vsampling;
for(i = 0; i < m_jpeg_ncomp; i++)
{
curr_comp = &m_ccomp[i];
if(m_max_hsampling < curr_comp->m_hsampling)
m_max_hsampling = curr_comp->m_hsampling;
if(m_max_vsampling < curr_comp->m_vsampling)
m_max_vsampling = curr_comp->m_vsampling;
}
for(i = 0; i < m_jpeg_ncomp; i++)
{
curr_comp = &m_ccomp[i];
curr_comp->m_h_factor = m_max_hsampling / curr_comp->m_hsampling;
curr_comp->m_v_factor = m_max_vsampling / curr_comp->m_vsampling;
}
m_jpeg_mode = JPEG_LOSSLESS;
m_marker = JM_NONE;
return JPEG_OK;
} // CJPEGDecoder::ParseSOF3()
JERRCODE CJPEGDecoder::ParseDRI(void)
{
int len;
JERRCODE jerr;
TRC0("-> DRI");
jerr = m_BitStreamIn.ReadWord(&len);
if(JPEG_OK != jerr)
return jerr;
len -= 2;
if(len != 2)
{
return JPEG_ERR_RST_DATA;
}
jerr = m_BitStreamIn.ReadWord(&m_jpeg_restart_interval);
if(JPEG_OK != jerr)
return jerr;
TRC1(" restart interval - ",m_jpeg_restart_interval);
m_restarts_to_go = m_jpeg_restart_interval;
m_marker = JM_NONE;
return JPEG_OK;
} // CJPEGDecoder::ParseDRI()
JERRCODE CJPEGDecoder::ParseRST(void)
{
JERRCODE jerr;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -