181 cFlagBoxChromaFiltering = 1,
196 int begin_decoding();
204 int decode(
const void** pScan_line, uint* pScan_line_len);
206 inline jpgd_status get_error_code()
const {
return m_error_code; }
208 inline int get_width()
const {
return m_image_x_size; }
209 inline int get_height()
const {
return m_image_y_size; }
211 inline int get_num_components()
const {
return m_comps_in_frame; }
213 inline int get_bytes_per_pixel()
const {
return m_dest_bytes_per_pixel; }
214 inline int get_bytes_per_scan_line()
const {
return m_image_x_size * get_bytes_per_pixel(); }
218 inline int get_total_bytes_read()
const {
return m_total_bytes_read; }
223 typedef void (*pDecode_block_func)(
jpeg_decoder*, int, int, int);
230 uint8 code_size[JPGD_HUFF_CODE_SIZE_MAX_LENGTH];
231 uint tree[JPGD_HUFF_TREE_MAX_LENGTH];
237 int block_num_x, block_num_y;
238 int block_len_x, block_len_y;
252 mem_block* m_pMem_blocks;
257 int m_progressive_flag;
259 uint8 m_huff_ac[JPGD_MAX_HUFF_TABLES];
260 uint8* m_huff_num[JPGD_MAX_HUFF_TABLES];
261 uint8* m_huff_val[JPGD_MAX_HUFF_TABLES];
262 jpgd_quant_t* m_quant[JPGD_MAX_QUANT_TABLES];
264 int m_comps_in_frame;
265 int m_comp_h_samp[JPGD_MAX_COMPONENTS];
266 int m_comp_v_samp[JPGD_MAX_COMPONENTS];
267 int m_comp_quant[JPGD_MAX_COMPONENTS];
268 int m_comp_ident[JPGD_MAX_COMPONENTS];
269 int m_comp_h_blocks[JPGD_MAX_COMPONENTS];
270 int m_comp_v_blocks[JPGD_MAX_COMPONENTS];
272 int m_comp_list[JPGD_MAX_COMPS_IN_SCAN];
273 int m_comp_dc_tab[JPGD_MAX_COMPONENTS];
274 int m_comp_ac_tab[JPGD_MAX_COMPONENTS];
275 int m_spectral_start;
277 int m_successive_low;
278 int m_successive_high;
279 int m_max_mcu_x_size;
280 int m_max_mcu_y_size;
281 int m_blocks_per_mcu;
282 int m_max_blocks_per_row;
283 int m_mcus_per_row, m_mcus_per_col;
284 int m_mcu_org[JPGD_MAX_BLOCKS_PER_MCU];
285 int m_total_lines_left;
286 int m_mcu_lines_left;
287 int m_num_buffered_scanlines;
288 int m_real_dest_bytes_per_scan_line;
289 int m_dest_bytes_per_scan_line;
290 int m_dest_bytes_per_pixel;
291 huff_tables* m_pHuff_tabs[JPGD_MAX_HUFF_TABLES];
292 coeff_buf* m_dc_coeffs[JPGD_MAX_COMPONENTS];
293 coeff_buf* m_ac_coeffs[JPGD_MAX_COMPONENTS];
295 int m_block_y_mcu[JPGD_MAX_COMPONENTS];
296 uint8* m_pIn_buf_ofs;
300 uint8 m_in_buf_pad_start[64];
301 uint8 m_in_buf[JPGD_IN_BUF_SIZE + 128];
302 uint8 m_in_buf_pad_end[64];
306 int m_restart_interval;
308 int m_next_restart_num;
309 int m_max_mcus_per_row;
310 int m_max_blocks_per_mcu;
312 int m_max_mcus_per_col;
313 uint m_last_dc_val[JPGD_MAX_COMPONENTS];
314 jpgd_block_coeff_t* m_pMCU_coefficients;
315 int m_mcu_block_max_zag[JPGD_MAX_BLOCKS_PER_MCU];
316 uint8* m_pSample_buf;
317 uint8* m_pSample_buf_prev;
322 uint8* m_pScan_line_0;
323 uint8* m_pScan_line_1;
324 jpgd_status m_error_code;
325 int m_total_bytes_read;
329 bool m_sample_buf_prev_valid;
332 inline int check_sample_buf_ofs(
int ofs)
const
335 assert(ofs < m_max_blocks_per_row * 64);
338 void free_all_blocks();
339 JPGD_NORETURN
void stop_decoding(jpgd_status status);
340 void* alloc(
size_t n,
bool zero =
false);
341 void* alloc_aligned(
size_t nSize, uint32_t align = 16,
bool zero =
false);
342 void word_clear(
void* p, uint16 c, uint n);
343 void prep_in_buffer();
344 void read_dht_marker();
345 void read_dqt_marker();
346 void read_sof_marker();
347 void skip_variable_marker();
348 void read_dri_marker();
349 void read_sos_marker();
351 int process_markers();
352 void locate_soi_marker();
353 void locate_sof_marker();
354 int locate_sos_marker();
356 void create_look_ups();
357 void fix_in_buffer();
358 void transform_mcu(
int mcu_row);
359 coeff_buf* coeff_buf_open(
int block_num_x,
int block_num_y,
int block_len_x,
int block_len_y);
360 inline jpgd_block_coeff_t* coeff_buf_getp(coeff_buf* cb,
int block_x,
int block_y);
361 void load_next_row();
362 void decode_next_row();
363 void make_huff_table(
int index, huff_tables* pH);
364 void check_quant_tables();
365 void check_huff_tables();
366 bool calc_mcu_block_order();
369 void process_restart();
370 void decode_scan(pDecode_block_func decode_block_func);
371 void init_progressive();
372 void init_sequential();
376 uint32_t H2V2ConvertFiltered();
378 void H2V1ConvertFiltered();
380 void H1V2ConvertFiltered();
384 inline uint get_char();
385 inline uint get_char(
bool* pPadding_flag);
386 inline void stuff_char(uint8 q);
387 inline uint8 get_octet();
388 inline uint get_bits(
int num_bits);
389 inline uint get_bits_no_markers(
int numbits);
390 inline int huff_decode(huff_tables* pH);
391 inline int huff_decode(huff_tables* pH,
int& extrabits);
394 static inline uint8 clamp(
int i)
396 if(
static_cast<uint
>(i) > 255)
397 i = (((~i) >> 31) & 0xFF);
398 return static_cast<uint8
>(i);
400 int decode_next_mcu_row();
402 static void decode_block_dc_first(
jpeg_decoder* pD,
int component_id,
int block_x,
int block_y);
403 static void decode_block_dc_refine(
jpeg_decoder* pD,
int component_id,
int block_x,
405 static void decode_block_ac_first(
jpeg_decoder* pD,
int component_id,
int block_x,
int block_y);
406 static void decode_block_ac_refine(
jpeg_decoder* pD,
int component_id,
int block_x,