123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449 |
- #define JPEG_INTERNALS
- #include "jinclude.h"
- #include "jpeglib.h"
- #ifdef ENTROPY_OPT_SUPPORTED
- #define FULL_COEF_BUFFER_SUPPORTED
- #else
- #ifdef C_MULTISCAN_FILES_SUPPORTED
- #define FULL_COEF_BUFFER_SUPPORTED
- #endif
- #endif
- typedef struct {
- struct jpeg_c_coef_controller pub;
- JDIMENSION iMCU_row_num;
- JDIMENSION mcu_ctr;
- int MCU_vert_offset;
- int MCU_rows_per_iMCU_row;
-
- JBLOCKROW MCU_buffer[C_MAX_BLOCKS_IN_MCU];
-
- jvirt_barray_ptr whole_image[MAX_COMPONENTS];
- } my_coef_controller;
- typedef my_coef_controller *my_coef_ptr;
- METHODDEF(boolean) compress_data(j_compress_ptr cinfo, JSAMPIMAGE input_buf);
- #ifdef FULL_COEF_BUFFER_SUPPORTED
- METHODDEF(boolean) compress_first_pass(j_compress_ptr cinfo,
- JSAMPIMAGE input_buf);
- METHODDEF(boolean) compress_output(j_compress_ptr cinfo, JSAMPIMAGE input_buf);
- #endif
- LOCAL(void)
- start_iMCU_row(j_compress_ptr cinfo)
- {
- my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
-
- if (cinfo->comps_in_scan > 1) {
- coef->MCU_rows_per_iMCU_row = 1;
- } else {
- if (coef->iMCU_row_num < (cinfo->total_iMCU_rows - 1))
- coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor;
- else
- coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height;
- }
- coef->mcu_ctr = 0;
- coef->MCU_vert_offset = 0;
- }
- METHODDEF(void)
- start_pass_coef(j_compress_ptr cinfo, J_BUF_MODE pass_mode)
- {
- my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
- coef->iMCU_row_num = 0;
- start_iMCU_row(cinfo);
- switch (pass_mode) {
- case JBUF_PASS_THRU:
- if (coef->whole_image[0] != NULL)
- ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
- coef->pub.compress_data = compress_data;
- break;
- #ifdef FULL_COEF_BUFFER_SUPPORTED
- case JBUF_SAVE_AND_PASS:
- if (coef->whole_image[0] == NULL)
- ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
- coef->pub.compress_data = compress_first_pass;
- break;
- case JBUF_CRANK_DEST:
- if (coef->whole_image[0] == NULL)
- ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
- coef->pub.compress_data = compress_output;
- break;
- #endif
- default:
- ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
- break;
- }
- }
- METHODDEF(boolean)
- compress_data(j_compress_ptr cinfo, JSAMPIMAGE input_buf)
- {
- my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
- JDIMENSION MCU_col_num;
- JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
- JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
- int blkn, bi, ci, yindex, yoffset, blockcnt;
- JDIMENSION ypos, xpos;
- jpeg_component_info *compptr;
-
- for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
- yoffset++) {
- for (MCU_col_num = coef->mcu_ctr; MCU_col_num <= last_MCU_col;
- MCU_col_num++) {
-
- blkn = 0;
- for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
- compptr = cinfo->cur_comp_info[ci];
- blockcnt = (MCU_col_num < last_MCU_col) ? compptr->MCU_width :
- compptr->last_col_width;
- xpos = MCU_col_num * compptr->MCU_sample_width;
- ypos = yoffset * DCTSIZE;
- for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
- if (coef->iMCU_row_num < last_iMCU_row ||
- yoffset + yindex < compptr->last_row_height) {
- (*cinfo->fdct->forward_DCT) (cinfo, compptr,
- input_buf[compptr->component_index],
- coef->MCU_buffer[blkn],
- ypos, xpos, (JDIMENSION)blockcnt);
- if (blockcnt < compptr->MCU_width) {
-
- jzero_far((void *)coef->MCU_buffer[blkn + blockcnt],
- (compptr->MCU_width - blockcnt) * sizeof(JBLOCK));
- for (bi = blockcnt; bi < compptr->MCU_width; bi++) {
- coef->MCU_buffer[blkn + bi][0][0] =
- coef->MCU_buffer[blkn + bi - 1][0][0];
- }
- }
- } else {
-
- jzero_far((void *)coef->MCU_buffer[blkn],
- compptr->MCU_width * sizeof(JBLOCK));
- for (bi = 0; bi < compptr->MCU_width; bi++) {
- coef->MCU_buffer[blkn + bi][0][0] =
- coef->MCU_buffer[blkn - 1][0][0];
- }
- }
- blkn += compptr->MCU_width;
- ypos += DCTSIZE;
- }
- }
-
- if (!(*cinfo->entropy->encode_mcu) (cinfo, coef->MCU_buffer)) {
-
- coef->MCU_vert_offset = yoffset;
- coef->mcu_ctr = MCU_col_num;
- return FALSE;
- }
- }
-
- coef->mcu_ctr = 0;
- }
-
- coef->iMCU_row_num++;
- start_iMCU_row(cinfo);
- return TRUE;
- }
- #ifdef FULL_COEF_BUFFER_SUPPORTED
- METHODDEF(boolean)
- compress_first_pass(j_compress_ptr cinfo, JSAMPIMAGE input_buf)
- {
- my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
- JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
- JDIMENSION blocks_across, MCUs_across, MCUindex;
- int bi, ci, h_samp_factor, block_row, block_rows, ndummy;
- JCOEF lastDC;
- jpeg_component_info *compptr;
- JBLOCKARRAY buffer;
- JBLOCKROW thisblockrow, lastblockrow;
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
- ci++, compptr++) {
-
- buffer = (*cinfo->mem->access_virt_barray)
- ((j_common_ptr)cinfo, coef->whole_image[ci],
- coef->iMCU_row_num * compptr->v_samp_factor,
- (JDIMENSION)compptr->v_samp_factor, TRUE);
-
- if (coef->iMCU_row_num < last_iMCU_row)
- block_rows = compptr->v_samp_factor;
- else {
-
- block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
- if (block_rows == 0) block_rows = compptr->v_samp_factor;
- }
- blocks_across = compptr->width_in_blocks;
- h_samp_factor = compptr->h_samp_factor;
-
- ndummy = (int)(blocks_across % h_samp_factor);
- if (ndummy > 0)
- ndummy = h_samp_factor - ndummy;
-
- for (block_row = 0; block_row < block_rows; block_row++) {
- thisblockrow = buffer[block_row];
- (*cinfo->fdct->forward_DCT) (cinfo, compptr,
- input_buf[ci], thisblockrow,
- (JDIMENSION)(block_row * DCTSIZE),
- (JDIMENSION)0, blocks_across);
- if (ndummy > 0) {
-
- thisblockrow += blocks_across;
- jzero_far((void *)thisblockrow, ndummy * sizeof(JBLOCK));
- lastDC = thisblockrow[-1][0];
- for (bi = 0; bi < ndummy; bi++) {
- thisblockrow[bi][0] = lastDC;
- }
- }
- }
-
- if (coef->iMCU_row_num == last_iMCU_row) {
- blocks_across += ndummy;
- MCUs_across = blocks_across / h_samp_factor;
- for (block_row = block_rows; block_row < compptr->v_samp_factor;
- block_row++) {
- thisblockrow = buffer[block_row];
- lastblockrow = buffer[block_row - 1];
- jzero_far((void *)thisblockrow,
- (size_t)(blocks_across * sizeof(JBLOCK)));
- for (MCUindex = 0; MCUindex < MCUs_across; MCUindex++) {
- lastDC = lastblockrow[h_samp_factor - 1][0];
- for (bi = 0; bi < h_samp_factor; bi++) {
- thisblockrow[bi][0] = lastDC;
- }
- thisblockrow += h_samp_factor;
- lastblockrow += h_samp_factor;
- }
- }
- }
- }
-
-
- return compress_output(cinfo, input_buf);
- }
- METHODDEF(boolean)
- compress_output(j_compress_ptr cinfo, JSAMPIMAGE input_buf)
- {
- my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
- JDIMENSION MCU_col_num;
- int blkn, ci, xindex, yindex, yoffset;
- JDIMENSION start_col;
- JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
- JBLOCKROW buffer_ptr;
- jpeg_component_info *compptr;
-
- for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
- compptr = cinfo->cur_comp_info[ci];
- buffer[ci] = (*cinfo->mem->access_virt_barray)
- ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
- coef->iMCU_row_num * compptr->v_samp_factor,
- (JDIMENSION)compptr->v_samp_factor, FALSE);
- }
-
- for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
- yoffset++) {
- for (MCU_col_num = coef->mcu_ctr; MCU_col_num < cinfo->MCUs_per_row;
- MCU_col_num++) {
-
- blkn = 0;
- for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
- compptr = cinfo->cur_comp_info[ci];
- start_col = MCU_col_num * compptr->MCU_width;
- for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
- buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
- for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
- coef->MCU_buffer[blkn++] = buffer_ptr++;
- }
- }
- }
-
- if (!(*cinfo->entropy->encode_mcu) (cinfo, coef->MCU_buffer)) {
-
- coef->MCU_vert_offset = yoffset;
- coef->mcu_ctr = MCU_col_num;
- return FALSE;
- }
- }
-
- coef->mcu_ctr = 0;
- }
-
- coef->iMCU_row_num++;
- start_iMCU_row(cinfo);
- return TRUE;
- }
- #endif
- GLOBAL(void)
- jinit_c_coef_controller(j_compress_ptr cinfo, boolean need_full_buffer)
- {
- my_coef_ptr coef;
- coef = (my_coef_ptr)
- (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
- sizeof(my_coef_controller));
- cinfo->coef = (struct jpeg_c_coef_controller *)coef;
- coef->pub.start_pass = start_pass_coef;
-
- if (need_full_buffer) {
- #ifdef FULL_COEF_BUFFER_SUPPORTED
-
-
- int ci;
- jpeg_component_info *compptr;
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
- ci++, compptr++) {
- coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
- ((j_common_ptr)cinfo, JPOOL_IMAGE, FALSE,
- (JDIMENSION)jround_up((long)compptr->width_in_blocks,
- (long)compptr->h_samp_factor),
- (JDIMENSION)jround_up((long)compptr->height_in_blocks,
- (long)compptr->v_samp_factor),
- (JDIMENSION)compptr->v_samp_factor);
- }
- #else
- ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
- #endif
- } else {
-
- JBLOCKROW buffer;
- int i;
- buffer = (JBLOCKROW)
- (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
- C_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
- for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) {
- coef->MCU_buffer[i] = buffer + i;
- }
- coef->whole_image[0] = NULL;
- }
- }
|