Doxygen Source Code Documentation
Main Page Alphabetical List Data Structures File List Data Fields Globals Search
jcmainct.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
00020
00021
00022
00023 #undef FULL_MAIN_BUFFER_SUPPORTED
00024
00025
00026
00027
00028 typedef struct {
00029 struct jpeg_c_main_controller pub;
00030
00031 JDIMENSION cur_iMCU_row;
00032 JDIMENSION rowgroup_ctr;
00033 boolean suspended;
00034 J_BUF_MODE pass_mode;
00035
00036
00037
00038
00039
00040 JSAMPARRAY buffer[MAX_COMPONENTS];
00041
00042 #ifdef FULL_MAIN_BUFFER_SUPPORTED
00043
00044
00045
00046 jvirt_sarray_ptr whole_image[MAX_COMPONENTS];
00047 #endif
00048 } my_main_controller;
00049
00050 typedef my_main_controller * my_main_ptr;
00051
00052
00053
00054 METHODDEF(void) process_data_simple_main
00055 JPP((j_compress_ptr cinfo, JSAMPARRAY input_buf,
00056 JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail));
00057 #ifdef FULL_MAIN_BUFFER_SUPPORTED
00058 METHODDEF(void) process_data_buffer_main
00059 JPP((j_compress_ptr cinfo, JSAMPARRAY input_buf,
00060 JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail));
00061 #endif
00062
00063
00064
00065
00066
00067
00068 METHODDEF(void)
00069 start_pass_main (j_compress_ptr cinfo, J_BUF_MODE pass_mode)
00070 {
00071 my_main_ptr main = (my_main_ptr) cinfo->main;
00072
00073
00074 if (cinfo->raw_data_in)
00075 return;
00076
00077 main->cur_iMCU_row = 0;
00078 main->rowgroup_ctr = 0;
00079 main->suspended = FALSE;
00080 main->pass_mode = pass_mode;
00081
00082 switch (pass_mode) {
00083 case JBUF_PASS_THRU:
00084 #ifdef FULL_MAIN_BUFFER_SUPPORTED
00085 if (main->whole_image[0] != NULL)
00086 ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
00087 #endif
00088 main->pub.process_data = process_data_simple_main;
00089 break;
00090 #ifdef FULL_MAIN_BUFFER_SUPPORTED
00091 case JBUF_SAVE_SOURCE:
00092 case JBUF_CRANK_DEST:
00093 case JBUF_SAVE_AND_PASS:
00094 if (main->whole_image[0] == NULL)
00095 ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
00096 main->pub.process_data = process_data_buffer_main;
00097 break;
00098 #endif
00099 default:
00100 ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
00101 break;
00102 }
00103 }
00104
00105
00106
00107
00108
00109
00110
00111
00112 METHODDEF(void)
00113 process_data_simple_main (j_compress_ptr cinfo,
00114 JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
00115 JDIMENSION in_rows_avail)
00116 {
00117 my_main_ptr main = (my_main_ptr) cinfo->main;
00118
00119 while (main->cur_iMCU_row < cinfo->total_iMCU_rows) {
00120
00121 if (main->rowgroup_ctr < DCTSIZE)
00122 (*cinfo->prep->pre_process_data) (cinfo,
00123 input_buf, in_row_ctr, in_rows_avail,
00124 main->buffer, &main->rowgroup_ctr,
00125 (JDIMENSION) DCTSIZE);
00126
00127
00128
00129
00130
00131 if (main->rowgroup_ctr != DCTSIZE)
00132 return;
00133
00134
00135 if (! (*cinfo->coef->compress_data) (cinfo, main->buffer)) {
00136
00137
00138
00139
00140
00141
00142 if (! main->suspended) {
00143 (*in_row_ctr)--;
00144 main->suspended = TRUE;
00145 }
00146 return;
00147 }
00148
00149
00150
00151 if (main->suspended) {
00152 (*in_row_ctr)++;
00153 main->suspended = FALSE;
00154 }
00155 main->rowgroup_ctr = 0;
00156 main->cur_iMCU_row++;
00157 }
00158 }
00159
00160
00161 #ifdef FULL_MAIN_BUFFER_SUPPORTED
00162
00163
00164
00165
00166
00167
00168 METHODDEF(void)
00169 process_data_buffer_main (j_compress_ptr cinfo,
00170 JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
00171 JDIMENSION in_rows_avail)
00172 {
00173 my_main_ptr main = (my_main_ptr) cinfo->main;
00174 int ci;
00175 jpeg_component_info *compptr;
00176 boolean writing = (main->pass_mode != JBUF_CRANK_DEST);
00177
00178 while (main->cur_iMCU_row < cinfo->total_iMCU_rows) {
00179
00180 if (main->rowgroup_ctr == 0) {
00181 for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
00182 ci++, compptr++) {
00183 main->buffer[ci] = (*cinfo->mem->access_virt_sarray)
00184 ((j_common_ptr) cinfo, main->whole_image[ci],
00185 main->cur_iMCU_row * (compptr->v_samp_factor * DCTSIZE),
00186 (JDIMENSION) (compptr->v_samp_factor * DCTSIZE), writing);
00187 }
00188
00189 if (! writing) {
00190 *in_row_ctr += cinfo->max_v_samp_factor * DCTSIZE;
00191 main->rowgroup_ctr = DCTSIZE;
00192 }
00193 }
00194
00195
00196
00197 if (writing) {
00198 (*cinfo->prep->pre_process_data) (cinfo,
00199 input_buf, in_row_ctr, in_rows_avail,
00200 main->buffer, &main->rowgroup_ctr,
00201 (JDIMENSION) DCTSIZE);
00202
00203 if (main->rowgroup_ctr < DCTSIZE)
00204 return;
00205 }
00206
00207
00208 if (main->pass_mode != JBUF_SAVE_SOURCE) {
00209 if (! (*cinfo->coef->compress_data) (cinfo, main->buffer)) {
00210
00211
00212
00213
00214
00215
00216 if (! main->suspended) {
00217 (*in_row_ctr)--;
00218 main->suspended = TRUE;
00219 }
00220 return;
00221 }
00222
00223
00224
00225 if (main->suspended) {
00226 (*in_row_ctr)++;
00227 main->suspended = FALSE;
00228 }
00229 }
00230
00231
00232 main->rowgroup_ctr = 0;
00233 main->cur_iMCU_row++;
00234 }
00235 }
00236
00237 #endif
00238
00239
00240
00241
00242
00243
00244 GLOBAL(void)
00245 jinit_c_main_controller (j_compress_ptr cinfo, boolean need_full_buffer)
00246 {
00247 my_main_ptr main;
00248 int ci;
00249 jpeg_component_info *compptr;
00250
00251 main = (my_main_ptr)
00252 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
00253 SIZEOF(my_main_controller));
00254 cinfo->main = (struct jpeg_c_main_controller *) main;
00255 main->pub.start_pass = start_pass_main;
00256
00257
00258 if (cinfo->raw_data_in)
00259 return;
00260
00261
00262
00263
00264 if (need_full_buffer) {
00265 #ifdef FULL_MAIN_BUFFER_SUPPORTED
00266
00267
00268 for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
00269 ci++, compptr++) {
00270 main->whole_image[ci] = (*cinfo->mem->request_virt_sarray)
00271 ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,
00272 compptr->width_in_blocks * DCTSIZE,
00273 (JDIMENSION) jround_up((long) compptr->height_in_blocks,
00274 (long) compptr->v_samp_factor) * DCTSIZE,
00275 (JDIMENSION) (compptr->v_samp_factor * DCTSIZE));
00276 }
00277 #else
00278 ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
00279 #endif
00280 } else {
00281 #ifdef FULL_MAIN_BUFFER_SUPPORTED
00282 main->whole_image[0] = NULL;
00283 #endif
00284
00285 for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
00286 ci++, compptr++) {
00287 main->buffer[ci] = (*cinfo->mem->alloc_sarray)
00288 ((j_common_ptr) cinfo, JPOOL_IMAGE,
00289 compptr->width_in_blocks * DCTSIZE,
00290 (JDIMENSION) (compptr->v_samp_factor * DCTSIZE));
00291 }
00292 }
00293 }