17 enum subsampling_t { Y_ONLY = 0, H1V1 = 1, H2V1 = 2, H2V2 = 3 };
22 inline params() : m_quality(85), m_subsampling(H2V2), m_no_chroma_discrim_flag(
false), m_two_pass_flag(
false), m_use_std_tables(
false) { }
24 inline bool check()
const
26 if ((m_quality < 1) || (m_quality > 100))
return false;
27 if ((uint)m_subsampling > (uint)H2V2)
return false;
39 subsampling_t m_subsampling;
43 bool m_no_chroma_discrim_flag;
49 bool m_use_std_tables;
86 const params& get_params()
const {
return m_params; }
91 uint get_total_passes()
const {
return m_params.m_two_pass_flag ? 2 : 1; }
92 inline uint get_cur_pass() {
return m_pass_num; }
98 bool process_scanline(
const void* pScanline);
104 typedef int32 sample_array_t;
108 uint8 m_num_components;
109 uint8 m_comp_h_samp[3], m_comp_v_samp[3];
110 int m_image_x, m_image_y, m_image_bpp, m_image_bpl;
111 int m_image_x_mcu, m_image_y_mcu;
112 int m_image_bpl_xlt, m_image_bpl_mcu;
114 int m_mcu_x, m_mcu_y;
115 uint8* m_mcu_lines[16];
117 sample_array_t m_sample_array[64];
118 int16 m_coefficient_array[64];
119 int32 m_quantization_tables[2][64];
120 uint m_huff_codes[4][256];
121 uint8 m_huff_code_sizes[4][256];
122 uint8 m_huff_bits[4][17];
123 uint8 m_huff_val[4][256];
124 uint32 m_huff_count[4][256];
125 int m_last_dc_val[3];
126 enum { JPGE_OUT_BUF_SIZE = 2048 };
127 uint8 m_out_buf[JPGE_OUT_BUF_SIZE];
133 bool m_all_stream_writes_succeeded;
135 void optimize_huffman_table(
int table_num,
int table_len);
136 void emit_byte(uint8 i);
137 void emit_word(uint i);
138 void emit_marker(
int marker);
139 void emit_jfif_app0();
142 void emit_dht(uint8* bits, uint8* val,
int index,
bool ac_flag);
146 void compute_huffman_table(uint* codes, uint8* code_sizes, uint8* bits, uint8* val);
147 void compute_quant_table(int32* dst, int16* src);
148 void adjust_quant_table(int32* dst, int32* src);
149 void first_pass_init();
150 bool second_pass_init();
151 bool jpg_open(
int p_x_res,
int p_y_res,
int src_channels);
152 void load_block_8_8_grey(
int x);
153 void load_block_8_8(
int x,
int y,
int c);
154 void load_block_16_8(
int x,
int c);
155 void load_block_16_8_8(
int x,
int c);
156 void load_quantized_coefficients(
int component_num);
157 void flush_output_buffer();
158 void put_bits(uint bits, uint len);
159 void code_coefficients_pass_one(
int component_num);
160 void code_coefficients_pass_two(
int component_num);
161 void code_block(
int component_num);
162 void process_mcu_row();
163 bool terminate_pass_one();
164 bool terminate_pass_two();
165 bool process_end_of_image();
166 void load_mcu(
const void* src);