Doxygen Source Code Documentation
        
Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals   Search   
jctrans.c
Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 #define JPEG_INTERNALS
00014 #include "jinclude.h"
00015 #include "jpeglib.h"
00016 
00017 
00018 
00019 LOCAL(void) transencode_master_selection
00020         JPP((j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays));
00021 LOCAL(void) transencode_coef_controller
00022         JPP((j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays));
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 GLOBAL(void)
00038 jpeg_write_coefficients (j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays)
00039 {
00040   if (cinfo->global_state != CSTATE_START)
00041     ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
00042   
00043   jpeg_suppress_tables(cinfo, FALSE);
00044   
00045   (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);
00046   (*cinfo->dest->init_destination) (cinfo);
00047   
00048   transencode_master_selection(cinfo, coef_arrays);
00049   
00050   cinfo->next_scanline = 0;     
00051   cinfo->global_state = CSTATE_WRCOEFS;
00052 }
00053 
00054 
00055 
00056 
00057 
00058 
00059 
00060 
00061 
00062 GLOBAL(void)
00063 jpeg_copy_critical_parameters (j_decompress_ptr srcinfo,
00064                                j_compress_ptr dstinfo)
00065 {
00066   JQUANT_TBL ** qtblptr;
00067   jpeg_component_info *incomp, *outcomp;
00068   JQUANT_TBL *c_quant, *slot_quant;
00069   int tblno, ci, coefi;
00070 
00071   
00072   if (dstinfo->global_state != CSTATE_START)
00073     ERREXIT1(dstinfo, JERR_BAD_STATE, dstinfo->global_state);
00074   
00075   dstinfo->image_width = srcinfo->image_width;
00076   dstinfo->image_height = srcinfo->image_height;
00077   dstinfo->input_components = srcinfo->num_components;
00078   dstinfo->in_color_space = srcinfo->jpeg_color_space;
00079   
00080   jpeg_set_defaults(dstinfo);
00081   
00082 
00083 
00084   jpeg_set_colorspace(dstinfo, srcinfo->jpeg_color_space);
00085   dstinfo->data_precision = srcinfo->data_precision;
00086   dstinfo->CCIR601_sampling = srcinfo->CCIR601_sampling;
00087   
00088   for (tblno = 0; tblno < NUM_QUANT_TBLS; tblno++) {
00089     if (srcinfo->quant_tbl_ptrs[tblno] != NULL) {
00090       qtblptr = & dstinfo->quant_tbl_ptrs[tblno];
00091       if (*qtblptr == NULL)
00092         *qtblptr = jpeg_alloc_quant_table((j_common_ptr) dstinfo);
00093       MEMCOPY((*qtblptr)->quantval,
00094               srcinfo->quant_tbl_ptrs[tblno]->quantval,
00095               SIZEOF((*qtblptr)->quantval));
00096       (*qtblptr)->sent_table = FALSE;
00097     }
00098   }
00099   
00100 
00101 
00102   dstinfo->num_components = srcinfo->num_components;
00103   if (dstinfo->num_components < 1 || dstinfo->num_components > MAX_COMPONENTS)
00104     ERREXIT2(dstinfo, JERR_COMPONENT_COUNT, dstinfo->num_components,
00105              MAX_COMPONENTS);
00106   for (ci = 0, incomp = srcinfo->comp_info, outcomp = dstinfo->comp_info;
00107        ci < dstinfo->num_components; ci++, incomp++, outcomp++) {
00108     outcomp->component_id = incomp->component_id;
00109     outcomp->h_samp_factor = incomp->h_samp_factor;
00110     outcomp->v_samp_factor = incomp->v_samp_factor;
00111     outcomp->quant_tbl_no = incomp->quant_tbl_no;
00112     
00113 
00114 
00115 
00116     tblno = outcomp->quant_tbl_no;
00117     if (tblno < 0 || tblno >= NUM_QUANT_TBLS ||
00118         srcinfo->quant_tbl_ptrs[tblno] == NULL)
00119       ERREXIT1(dstinfo, JERR_NO_QUANT_TABLE, tblno);
00120     slot_quant = srcinfo->quant_tbl_ptrs[tblno];
00121     c_quant = incomp->quant_table;
00122     if (c_quant != NULL) {
00123       for (coefi = 0; coefi < DCTSIZE2; coefi++) {
00124         if (c_quant->quantval[coefi] != slot_quant->quantval[coefi])
00125           ERREXIT1(dstinfo, JERR_MISMATCHED_QUANT_TABLE, tblno);
00126       }
00127     }
00128     
00129 
00130 
00131   }
00132   
00133 
00134 
00135 
00136 
00137 
00138 
00139 
00140   if (srcinfo->saw_JFIF_marker) {
00141     if (srcinfo->JFIF_major_version == 1) {
00142       dstinfo->JFIF_major_version = srcinfo->JFIF_major_version;
00143       dstinfo->JFIF_minor_version = srcinfo->JFIF_minor_version;
00144     }
00145     dstinfo->density_unit = srcinfo->density_unit;
00146     dstinfo->X_density = srcinfo->X_density;
00147     dstinfo->Y_density = srcinfo->Y_density;
00148   }
00149 }
00150 
00151 
00152 
00153 
00154 
00155 
00156 
00157 LOCAL(void)
00158 transencode_master_selection (j_compress_ptr cinfo,
00159                               jvirt_barray_ptr * coef_arrays)
00160 {
00161   
00162 
00163 
00164   cinfo->input_components = 1;
00165   
00166   jinit_c_master_control(cinfo, TRUE );
00167 
00168   
00169   if (cinfo->arith_code) {
00170     ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
00171   } else {
00172     if (cinfo->progressive_mode) {
00173 #ifdef C_PROGRESSIVE_SUPPORTED
00174       jinit_phuff_encoder(cinfo);
00175 #else
00176       ERREXIT(cinfo, JERR_NOT_COMPILED);
00177 #endif
00178     } else
00179       jinit_huff_encoder(cinfo);
00180   }
00181 
00182   
00183   transencode_coef_controller(cinfo, coef_arrays);
00184 
00185   jinit_marker_writer(cinfo);
00186 
00187   
00188   (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);
00189 
00190   
00191 
00192 
00193 
00194   (*cinfo->marker->write_file_header) (cinfo);
00195 }
00196 
00197 
00198 
00199 
00200 
00201 
00202 
00203 
00204 
00205 
00206 
00207 
00208 typedef struct {
00209   struct jpeg_c_coef_controller pub; 
00210 
00211   JDIMENSION iMCU_row_num;      
00212   JDIMENSION mcu_ctr;           
00213   int MCU_vert_offset;          
00214   int MCU_rows_per_iMCU_row;    
00215 
00216   
00217   jvirt_barray_ptr * whole_image;
00218 
00219   
00220   JBLOCKROW dummy_buffer[C_MAX_BLOCKS_IN_MCU];
00221 } my_coef_controller;
00222 
00223 typedef my_coef_controller * my_coef_ptr;
00224 
00225 
00226 LOCAL(void)
00227 start_iMCU_row (j_compress_ptr cinfo)
00228 
00229 {
00230   my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
00231 
00232   
00233 
00234 
00235 
00236   if (cinfo->comps_in_scan > 1) {
00237     coef->MCU_rows_per_iMCU_row = 1;
00238   } else {
00239     if (coef->iMCU_row_num < (cinfo->total_iMCU_rows-1))
00240       coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor;
00241     else
00242       coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height;
00243   }
00244 
00245   coef->mcu_ctr = 0;
00246   coef->MCU_vert_offset = 0;
00247 }
00248 
00249 
00250 
00251 
00252 
00253 
00254 METHODDEF(void)
00255 start_pass_coef (j_compress_ptr cinfo, J_BUF_MODE pass_mode)
00256 {
00257   my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
00258 
00259   if (pass_mode != JBUF_CRANK_DEST)
00260     ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
00261 
00262   coef->iMCU_row_num = 0;
00263   start_iMCU_row(cinfo);
00264 }
00265 
00266 
00267 
00268 
00269 
00270 
00271 
00272 
00273 
00274 
00275 
00276 
00277 METHODDEF(boolean)
00278 compress_output (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
00279 {
00280   my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
00281   JDIMENSION MCU_col_num;       
00282   JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
00283   JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
00284   int blkn, ci, xindex, yindex, yoffset, blockcnt;
00285   JDIMENSION start_col;
00286   JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
00287   JBLOCKROW MCU_buffer[C_MAX_BLOCKS_IN_MCU];
00288   JBLOCKROW buffer_ptr;
00289   jpeg_component_info *compptr;
00290 
00291   
00292   for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
00293     compptr = cinfo->cur_comp_info[ci];
00294     buffer[ci] = (*cinfo->mem->access_virt_barray)
00295       ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index],
00296        coef->iMCU_row_num * compptr->v_samp_factor,
00297        (JDIMENSION) compptr->v_samp_factor, FALSE);
00298   }
00299 
00300   
00301   for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
00302        yoffset++) {
00303     for (MCU_col_num = coef->mcu_ctr; MCU_col_num < cinfo->MCUs_per_row;
00304          MCU_col_num++) {
00305       
00306       blkn = 0;                 
00307       for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
00308         compptr = cinfo->cur_comp_info[ci];
00309         start_col = MCU_col_num * compptr->MCU_width;
00310         blockcnt = (MCU_col_num < last_MCU_col) ? compptr->MCU_width
00311                                                 : compptr->last_col_width;
00312         for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
00313           if (coef->iMCU_row_num < last_iMCU_row ||
00314               yindex+yoffset < compptr->last_row_height) {
00315             
00316             buffer_ptr = buffer[ci][yindex+yoffset] + start_col;
00317             for (xindex = 0; xindex < blockcnt; xindex++)
00318               MCU_buffer[blkn++] = buffer_ptr++;
00319           } else {
00320             
00321             xindex = 0;
00322           }
00323           
00324 
00325 
00326 
00327 
00328 
00329           for (; xindex < compptr->MCU_width; xindex++) {
00330             MCU_buffer[blkn] = coef->dummy_buffer[blkn];
00331             MCU_buffer[blkn][0][0] = MCU_buffer[blkn-1][0][0];
00332             blkn++;
00333           }
00334         }
00335       }
00336       
00337       if (! (*cinfo->entropy->encode_mcu) (cinfo, MCU_buffer)) {
00338         
00339         coef->MCU_vert_offset = yoffset;
00340         coef->mcu_ctr = MCU_col_num;
00341         return FALSE;
00342       }
00343     }
00344     
00345     coef->mcu_ctr = 0;
00346   }
00347   
00348   coef->iMCU_row_num++;
00349   start_iMCU_row(cinfo);
00350   return TRUE;
00351 }
00352 
00353 
00354 
00355 
00356 
00357 
00358 
00359 
00360 
00361 
00362 LOCAL(void)
00363 transencode_coef_controller (j_compress_ptr cinfo,
00364                              jvirt_barray_ptr * coef_arrays)
00365 {
00366   my_coef_ptr coef;
00367   JBLOCKROW buffer;
00368   int i;
00369 
00370   coef = (my_coef_ptr)
00371     (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
00372                                 SIZEOF(my_coef_controller));
00373   cinfo->coef = (struct jpeg_c_coef_controller *) coef;
00374   coef->pub.start_pass = start_pass_coef;
00375   coef->pub.compress_data = compress_output;
00376 
00377   
00378   coef->whole_image = coef_arrays;
00379 
00380   
00381   buffer = (JBLOCKROW)
00382     (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
00383                                 C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));
00384   jzero_far((void FAR *) buffer, C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));
00385   for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) {
00386     coef->dummy_buffer[i] = buffer + i;
00387   }
00388 }