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 }