129 cFlagBoxChromaFiltering = 1,
142 int begin_decoding();
150 int decode(
const void** pScan_line, uint* pScan_line_len);
152 inline jpgd_status get_error_code()
const {
return m_error_code; }
154 inline int get_width()
const {
return m_image_x_size; }
155 inline int get_height()
const {
return m_image_y_size; }
157 inline int get_num_components()
const {
return m_comps_in_frame; }
159 inline int get_bytes_per_pixel()
const {
return m_dest_bytes_per_pixel; }
160 inline int get_bytes_per_scan_line()
const {
return m_image_x_size * get_bytes_per_pixel(); }
163 inline int get_total_bytes_read()
const {
return m_total_bytes_read; }
169 typedef void (*pDecode_block_func)(
jpeg_decoder*, int, int, int);
176 uint8 code_size[JPGD_HUFF_CODE_SIZE_MAX_LENGTH];
177 uint tree[JPGD_HUFF_TREE_MAX_LENGTH];
183 int block_num_x, block_num_y;
184 int block_len_x, block_len_y;
198 mem_block* m_pMem_blocks;
203 int m_progressive_flag;
205 uint8 m_huff_ac[JPGD_MAX_HUFF_TABLES];
206 uint8* m_huff_num[JPGD_MAX_HUFF_TABLES];
207 uint8* m_huff_val[JPGD_MAX_HUFF_TABLES];
208 jpgd_quant_t* m_quant[JPGD_MAX_QUANT_TABLES];
210 int m_comps_in_frame;
211 int m_comp_h_samp[JPGD_MAX_COMPONENTS];
212 int m_comp_v_samp[JPGD_MAX_COMPONENTS];
213 int m_comp_quant[JPGD_MAX_COMPONENTS];
214 int m_comp_ident[JPGD_MAX_COMPONENTS];
215 int m_comp_h_blocks[JPGD_MAX_COMPONENTS];
216 int m_comp_v_blocks[JPGD_MAX_COMPONENTS];
218 int m_comp_list[JPGD_MAX_COMPS_IN_SCAN];
219 int m_comp_dc_tab[JPGD_MAX_COMPONENTS];
220 int m_comp_ac_tab[JPGD_MAX_COMPONENTS];
221 int m_spectral_start;
223 int m_successive_low;
224 int m_successive_high;
225 int m_max_mcu_x_size;
226 int m_max_mcu_y_size;
227 int m_blocks_per_mcu;
228 int m_max_blocks_per_row;
229 int m_mcus_per_row, m_mcus_per_col;
230 int m_mcu_org[JPGD_MAX_BLOCKS_PER_MCU];
231 int m_total_lines_left;
232 int m_mcu_lines_left;
233 int m_num_buffered_scanlines;
234 int m_real_dest_bytes_per_scan_line;
235 int m_dest_bytes_per_scan_line;
236 int m_dest_bytes_per_pixel;
237 huff_tables* m_pHuff_tabs[JPGD_MAX_HUFF_TABLES];
238 coeff_buf* m_dc_coeffs[JPGD_MAX_COMPONENTS];
239 coeff_buf* m_ac_coeffs[JPGD_MAX_COMPONENTS];
241 int m_block_y_mcu[JPGD_MAX_COMPONENTS];
242 uint8* m_pIn_buf_ofs;
246 uint8 m_in_buf_pad_start[64];
247 uint8 m_in_buf[JPGD_IN_BUF_SIZE + 128];
248 uint8 m_in_buf_pad_end[64];
252 int m_restart_interval;
254 int m_next_restart_num;
255 int m_max_mcus_per_row;
256 int m_max_blocks_per_mcu;
258 int m_max_mcus_per_col;
259 uint m_last_dc_val[JPGD_MAX_COMPONENTS];
260 jpgd_block_coeff_t* m_pMCU_coefficients;
261 int m_mcu_block_max_zag[JPGD_MAX_BLOCKS_PER_MCU];
262 uint8* m_pSample_buf;
263 uint8* m_pSample_buf_prev;
268 uint8* m_pScan_line_0;
269 uint8* m_pScan_line_1;
270 jpgd_status m_error_code;
271 int m_total_bytes_read;
275 bool m_sample_buf_prev_valid;
278 inline int check_sample_buf_ofs(
int ofs)
const { assert(ofs >= 0); assert(ofs < m_max_blocks_per_row * 64);
return ofs; }
279 void free_all_blocks();
280 JPGD_NORETURN
void stop_decoding(jpgd_status status);
281 void* alloc(
size_t n,
bool zero =
false);
282 void* alloc_aligned(
size_t nSize, uint32_t align = 16,
bool zero =
false);
283 void word_clear(
void* p, uint16 c, uint n);
284 void prep_in_buffer();
285 void read_dht_marker();
286 void read_dqt_marker();
287 void read_sof_marker();
288 void skip_variable_marker();
289 void read_dri_marker();
290 void read_sos_marker();
292 int process_markers();
293 void locate_soi_marker();
294 void locate_sof_marker();
295 int locate_sos_marker();
297 void create_look_ups();
298 void fix_in_buffer();
299 void transform_mcu(
int mcu_row);
300 coeff_buf* coeff_buf_open(
int block_num_x,
int block_num_y,
int block_len_x,
int block_len_y);
301 inline jpgd_block_coeff_t* coeff_buf_getp(coeff_buf* cb,
int block_x,
int block_y);
302 void load_next_row();
303 void decode_next_row();
304 void make_huff_table(
int index, huff_tables* pH);
305 void check_quant_tables();
306 void check_huff_tables();
307 bool calc_mcu_block_order();
310 void process_restart();
311 void decode_scan(pDecode_block_func decode_block_func);
312 void init_progressive();
313 void init_sequential();
317 uint32_t H2V2ConvertFiltered();
319 void H2V1ConvertFiltered();
321 void H1V2ConvertFiltered();
325 inline uint get_char();
326 inline uint get_char(
bool* pPadding_flag);
327 inline void stuff_char(uint8 q);
328 inline uint8 get_octet();
329 inline uint get_bits(
int num_bits);
330 inline uint get_bits_no_markers(
int numbits);
331 inline int huff_decode(huff_tables* pH);
332 inline int huff_decode(huff_tables* pH,
int& extrabits);
335 static inline uint8 clamp(
int i)
337 if (
static_cast<uint
>(i) > 255)
338 i = (((~i) >> 31) & 0xFF);
339 return static_cast<uint8
>(i);
341 int decode_next_mcu_row();
343 static void decode_block_dc_first(
jpeg_decoder* pD,
int component_id,
int block_x,
int block_y);
344 static void decode_block_dc_refine(
jpeg_decoder* pD,
int component_id,
int block_x,
int block_y);
345 static void decode_block_ac_first(
jpeg_decoder* pD,
int component_id,
int block_x,
int block_y);
346 static void decode_block_ac_refine(
jpeg_decoder* pD,
int component_id,
int block_x,
int block_y);