private ReadResult consume_markers()
{
ReadResult val;
if (m_eoi_reached) /* After hitting EOI, read no further */
return ReadResult.JPEG_REACHED_EOI;
/* Loop to pass pseudo SOS marker */
for (;;)
{
val = m_cinfo.m_marker.read_markers();
switch (val)
{
case ReadResult.JPEG_REACHED_SOS:
/* Found SOS */
if (m_inheaders != 0)
{
/* 1st SOS */
if (m_inheaders == 1)
initial_setup();
if (m_cinfo.m_comps_in_scan == 0)
{
/* pseudo SOS marker */
m_inheaders = 2;
break;
}
m_inheaders = 0;
/* Note: start_input_pass must be called by jpeg_decomp_master
* before any more input can be consumed.
*/
}
else
{
/* 2nd or later SOS marker */
if (!m_has_multiple_scans)
{
/* Oops, I wasn't expecting this! */
m_cinfo.ERREXIT(J_MESSAGE_CODE.JERR_EOI_EXPECTED);
}
if (m_cinfo.m_comps_in_scan == 0)
{
/* unexpected pseudo SOS marker */
break;
}
m_cinfo.m_inputctl.start_input_pass();
}
return val;
case ReadResult.JPEG_REACHED_EOI:
/* Found EOI */
m_eoi_reached = true;
if (m_inheaders != 0)
{
/* Tables-only datastream, apparently */
if (m_cinfo.m_marker.SawSOF())
m_cinfo.ERREXIT(J_MESSAGE_CODE.JERR_SOF_NO_SOS);
}
else
{
/* Prevent infinite loop in coef ctlr's decompress_data routine
* if user set output_scan_number larger than number of scans.
*/
if (m_cinfo.m_output_scan_number > m_cinfo.m_input_scan_number)
m_cinfo.m_output_scan_number = m_cinfo.m_input_scan_number;
}
return val;
case ReadResult.JPEG_SUSPENDED:
default:
return val;
}
}
}