BitMiracle.LibJpeg.Classic.Internal.jpeg_input_controller.consume_markers C# (CSharp) Method

consume_markers() private method

Read JPEG markers before, between, or after compressed-data scans. Change state as necessary when a new scan is reached. Return value is JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI. The consume_input method pointer points either here or to the coefficient controller's consume_data routine, depending on whether we are reading a compressed data segment or inter-segment markers. Note: This function should NOT return a pseudo SOS marker(with zero component number) to the caller.A pseudo marker received by read_markers is processed and then skipped for other markers.
private consume_markers ( ) : ReadResult
return ReadResult
        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;
                }
            }
        }