| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| typedef struct { |
| struct jpeg_c_main_controller pub; |
| |
| JDIMENSION cur_iMCU_row; |
| JDIMENSION rowgroup_ctr; |
| boolean suspended; |
| J_BUF_MODE pass_mode; |
| |
| |
| |
| |
| |
| JSAMPARRAY buffer[MAX_COMPONENTS]; |
| |
| |
| |
| |
| |
| jvirt_sarray_ptr whole_image[MAX_COMPONENTS]; |
| |
| } my_main_controller; |
| |
| typedef my_main_controller * my_main_ptr; |
| |
| |
| |
| METHODDEF(void) process_data_simple_main |
| JPP((j_compress_ptr cinfo, JSAMPARRAY input_buf, |
| JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail)); |
| |
| METHODDEF(void) process_data_buffer_main |
| JPP((j_compress_ptr cinfo, JSAMPARRAY input_buf, |
| JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail)); |
| |
| |
| |
| |
| |
| |
| |
| METHODDEF(void) |
| start_pass_main (j_compress_ptr cinfo, J_BUF_MODE pass_mode) |
| { |
| my_main_ptr mainp = (my_main_ptr) cinfo->main; |
| |
| |
| if (cinfo->raw_data_in) |
| return; |
| |
| mainp->cur_iMCU_row = 0; |
| mainp->rowgroup_ctr = 0; |
| mainp->suspended = FALSE; |
| mainp->pass_mode = pass_mode; |
| |
| switch (pass_mode) { |
| case JBUF_PASS_THRU: |
| |
| if (mainp->whole_image[0] != NULL) |
| ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); |
| |
| mainp->pub.process_data = process_data_simple_main; |
| break; |
| |
| case JBUF_SAVE_SOURCE: |
| case JBUF_CRANK_DEST: |
| case JBUF_SAVE_AND_PASS: |
| if (mainp->whole_image[0] == NULL) |
| ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); |
| mainp->pub.process_data = process_data_buffer_main; |
| break; |
| |
| default: |
| ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); |
| break; |
| } |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| METHODDEF(void) |
| process_data_simple_main (j_compress_ptr cinfo, |
| JSAMPARRAY input_buf, JDIMENSION *in_row_ctr, |
| JDIMENSION in_rows_avail) |
| { |
| my_main_ptr mainp = (my_main_ptr) cinfo->main; |
| |
| while (mainp->cur_iMCU_row < cinfo->total_iMCU_rows) { |
| |
| if (mainp->rowgroup_ctr < (JDIMENSION) cinfo->min_DCT_v_scaled_size) |
| (*cinfo->prep->pre_process_data) (cinfo, |
| input_buf, in_row_ctr, in_rows_avail, |
| mainp->buffer, &mainp->rowgroup_ctr, |
| (JDIMENSION) cinfo->min_DCT_v_scaled_size); |
| |
| |
| |
| |
| |
| if (mainp->rowgroup_ctr != (JDIMENSION) cinfo->min_DCT_v_scaled_size) |
| return; |
| |
| |
| if (! (*cinfo->coef->compress_data) (cinfo, mainp->buffer)) { |
| |
| |
| |
| |
| |
| |
| if (! mainp->suspended) { |
| (*in_row_ctr)--; |
| mainp->suspended = TRUE; |
| } |
| return; |
| } |
| |
| |
| |
| if (mainp->suspended) { |
| (*in_row_ctr)++; |
| mainp->suspended = FALSE; |
| } |
| mainp->rowgroup_ctr = 0; |
| mainp->cur_iMCU_row++; |
| } |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| METHODDEF(void) |
| process_data_buffer_main (j_compress_ptr cinfo, |
| JSAMPARRAY input_buf, JDIMENSION *in_row_ctr, |
| JDIMENSION in_rows_avail) |
| { |
| my_main_ptr mainp = (my_main_ptr) cinfo->main; |
| int ci; |
| jpeg_component_info *compptr; |
| boolean writing = (mainp->pass_mode != JBUF_CRANK_DEST); |
| |
| while (mainp->cur_iMCU_row < cinfo->total_iMCU_rows) { |
| |
| if (mainp->rowgroup_ctr == 0) { |
| for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; |
| ci++, compptr++) { |
| mainp->buffer[ci] = (*cinfo->mem->access_virt_sarray) |
| ((j_common_ptr) cinfo, mainp->whole_image[ci], mainp->cur_iMCU_row * |
| ((JDIMENSION) (compptr->v_samp_factor * cinfo->min_DCT_v_scaled_size)), |
| (JDIMENSION) (compptr->v_samp_factor * cinfo->min_DCT_v_scaled_size), |
| writing); |
| } |
| |
| if (! writing) { |
| *in_row_ctr += (JDIMENSION) |
| (cinfo->max_v_samp_factor * cinfo->min_DCT_v_scaled_size); |
| mainp->rowgroup_ctr = (JDIMENSION) cinfo->min_DCT_v_scaled_size; |
| } |
| } |
| |
| |
| |
| if (writing) { |
| (*cinfo->prep->pre_process_data) (cinfo, |
| input_buf, in_row_ctr, in_rows_avail, |
| mainp->buffer, &mainp->rowgroup_ctr, |
| (JDIMENSION) cinfo->min_DCT_v_scaled_size); |
| |
| if (mainp->rowgroup_ctr < (JDIMENSION) cinfo->min_DCT_v_scaled_size) |
| return; |
| } |
| |
| |
| if (mainp->pass_mode != JBUF_SAVE_SOURCE) { |
| if (! (*cinfo->coef->compress_data) (cinfo, mainp->buffer)) { |
| |
| |
| |
| |
| |
| |
| if (! mainp->suspended) { |
| (*in_row_ctr)--; |
| mainp->suspended = TRUE; |
| } |
| return; |
| } |
| |
| |
| |
| if (mainp->suspended) { |
| (*in_row_ctr)++; |
| mainp->suspended = FALSE; |
| } |
| } |
| |
| |
| mainp->rowgroup_ctr = 0; |
| mainp->cur_iMCU_row++; |
| } |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| GLOBAL(void) |
| jinit_c_main_controller (j_compress_ptr cinfo, boolean need_full_buffer) |
| { |
| my_main_ptr mainp; |
| int ci; |
| jpeg_component_info *compptr; |
| |
| mainp = (my_main_ptr) |
| (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, |
| SIZEOF(my_main_controller)); |
| cinfo->main = &mainp->pub; |
| mainp->pub.start_pass = start_pass_main; |
| |
| |
| if (cinfo->raw_data_in) |
| return; |
| |
| |
| |
| |
| if (need_full_buffer) { |
| |
| |
| |
| for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; |
| ci++, compptr++) { |
| mainp->whole_image[ci] = (*cinfo->mem->request_virt_sarray) |
| ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE, |
| compptr->width_in_blocks * ((JDIMENSION) compptr->DCT_h_scaled_size), |
| ((JDIMENSION) jround_up((long) compptr->height_in_blocks, |
| (long) compptr->v_samp_factor)) * |
| ((JDIMENSION) cinfo->min_DCT_v_scaled_size), |
| (JDIMENSION) (compptr->v_samp_factor * compptr->DCT_v_scaled_size)); |
| } |
| |
| ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); |
| |
| } else { |
| |
| mainp->whole_image[0] = NULL; |
| |
| |
| for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; |
| ci++, compptr++) { |
| mainp->buffer[ci] = (*cinfo->mem->alloc_sarray) |
| ((j_common_ptr) cinfo, JPOOL_IMAGE, |
| compptr->width_in_blocks * ((JDIMENSION) compptr->DCT_h_scaled_size), |
| (JDIMENSION) (compptr->v_samp_factor * compptr->DCT_v_scaled_size)); |
| } |
| } |
| } |