/// <summary>
        /// Finish up at the end of a Huffman-compressed scan.
        /// </summary>
        private void finish_pass_huff()
        {
            if (m_cinfo.m_progressive_mode)
            {
                /* Flush out any buffered data */
                emit_eobrun();
                flush_bits_e();
            }
            else
            {
                /* Load up working state ... flush_bits needs it */
                savable_state state = new savable_state();
                state.ASSIGN_STATE(m_saved);

                /* Flush out the last data */
                if (!flush_bits_s(state))
                    m_cinfo.ERREXIT(J_MESSAGE_CODE.JERR_CANT_SUSPEND);

                /* Update state */
                m_saved.ASSIGN_STATE(state);
            }
        }
        /// <summary>
        /// Encode and output one MCU's worth of Huffman-compressed coefficients.
        /// </summary>
        private bool encode_mcu_huff(JBLOCK[][] MCU_data)
        {
            /* Load up working state */
            savable_state state = new savable_state();
            state.ASSIGN_STATE(m_saved);

            /* Emit restart marker if needed */
            if (m_cinfo.m_restart_interval != 0)
            {
                if (m_restarts_to_go == 0)
                {
                    if (!emit_restart_s(state, m_next_restart_num))
                        return false;
                }
            }

            /* Encode the MCU data blocks */
            for (int blkn = 0; blkn < m_cinfo.m_blocks_in_MCU; blkn++)
            {
                int ci = m_cinfo.m_MCU_membership[blkn];
                jpeg_component_info compptr = m_cinfo.Component_info[m_cinfo.m_cur_comp_info[ci]];
                if (!encode_one_block(state, MCU_data[blkn][0].data, state.last_dc_val[ci],
                    m_dc_derived_tbls[compptr.Dc_tbl_no],
                    m_ac_derived_tbls[compptr.Ac_tbl_no]))
                {
                    return false;
                }

                /* Update last_dc_val */
                state.last_dc_val[ci] = MCU_data[blkn][0][0];
            }

            /* Completed MCU, so update state */
            m_saved.ASSIGN_STATE(state);

            /* Update restart-interval state too */
            if (m_cinfo.m_restart_interval != 0)
            {
                if (m_restarts_to_go == 0)
                {
                    m_restarts_to_go = m_cinfo.m_restart_interval;
                    m_next_restart_num++;
                    m_next_restart_num &= 7;
                }

                m_restarts_to_go--;
            }

            return true;
        }