/src/libjpeg-turbo.main/jddiffct.c
| Line | Count | Source (jump to first uncovered line) | 
| 1 |  | /* | 
| 2 |  |  * jddiffct.c | 
| 3 |  |  * | 
| 4 |  |  * This file was part of the Independent JPEG Group's software: | 
| 5 |  |  * Copyright (C) 1994-1997, Thomas G. Lane. | 
| 6 |  |  * Lossless JPEG Modifications: | 
| 7 |  |  * Copyright (C) 1999, Ken Murchison. | 
| 8 |  |  * libjpeg-turbo Modifications: | 
| 9 |  |  * Copyright (C) 2022, D. R. Commander. | 
| 10 |  |  * For conditions of distribution and use, see the accompanying README.ijg | 
| 11 |  |  * file. | 
| 12 |  |  * | 
| 13 |  |  * This file contains the [un]difference buffer controller for decompression. | 
| 14 |  |  * This controller is the top level of the lossless JPEG decompressor proper. | 
| 15 |  |  * The difference buffer lies between the entropy decoding and | 
| 16 |  |  * prediction/undifferencing steps.  The undifference buffer lies between the | 
| 17 |  |  * prediction/undifferencing and scaling steps. | 
| 18 |  |  * | 
| 19 |  |  * In buffered-image mode, this controller is the interface between | 
| 20 |  |  * input-oriented processing and output-oriented processing. | 
| 21 |  |  */ | 
| 22 |  |  | 
| 23 |  | #define JPEG_INTERNALS | 
| 24 |  | #include "jinclude.h" | 
| 25 |  | #include "jpeglib.h" | 
| 26 |  | #include "jlossls.h"            /* Private declarations for lossless codec */ | 
| 27 |  |  | 
| 28 |  |  | 
| 29 |  | #ifdef D_LOSSLESS_SUPPORTED | 
| 30 |  |  | 
| 31 |  | /* Private buffer controller object */ | 
| 32 |  |  | 
| 33 |  | typedef struct { | 
| 34 |  |   struct jpeg_d_coef_controller pub; /* public fields */ | 
| 35 |  |  | 
| 36 |  |   /* These variables keep track of the current location of the input side. */ | 
| 37 |  |   /* cinfo->input_iMCU_row is also used for this. */ | 
| 38 |  |   JDIMENSION MCU_ctr;           /* counts MCUs processed in current row */ | 
| 39 |  |   unsigned int restart_rows_to_go;      /* MCU rows left in this restart | 
| 40 |  |                                            interval */ | 
| 41 |  |   unsigned int MCU_vert_offset;         /* counts MCU rows within iMCU row */ | 
| 42 |  |   unsigned int MCU_rows_per_iMCU_row;   /* number of such rows needed */ | 
| 43 |  |  | 
| 44 |  |   /* The output side's location is represented by cinfo->output_iMCU_row. */ | 
| 45 |  |  | 
| 46 |  |   JDIFFARRAY diff_buf[MAX_COMPONENTS];  /* iMCU row of differences */ | 
| 47 |  |   JDIFFARRAY undiff_buf[MAX_COMPONENTS]; /* iMCU row of undiff'd samples */ | 
| 48 |  |  | 
| 49 |  | #ifdef D_MULTISCAN_FILES_SUPPORTED | 
| 50 |  |   /* In multi-pass modes, we need a virtual sample array for each component. */ | 
| 51 |  |   jvirt_sarray_ptr whole_image[MAX_COMPONENTS]; | 
| 52 |  | #endif | 
| 53 |  | } my_diff_controller; | 
| 54 |  |  | 
| 55 |  | typedef my_diff_controller *my_diff_ptr; | 
| 56 |  |  | 
| 57 |  | /* Forward declarations */ | 
| 58 |  | METHODDEF(int) decompress_data(j_decompress_ptr cinfo, _JSAMPIMAGE output_buf); | 
| 59 |  | #ifdef D_MULTISCAN_FILES_SUPPORTED | 
| 60 |  | METHODDEF(int) output_data(j_decompress_ptr cinfo, _JSAMPIMAGE output_buf); | 
| 61 |  | #endif | 
| 62 |  |  | 
| 63 |  |  | 
| 64 |  | LOCAL(void) | 
| 65 |  | start_iMCU_row(j_decompress_ptr cinfo) | 
| 66 |  | /* Reset within-iMCU-row counters for a new row (input side) */ | 
| 67 | 35.3M | { | 
| 68 | 35.3M |   my_diff_ptr diff = (my_diff_ptr)cinfo->coef; | 
| 69 |  |  | 
| 70 |  |   /* In an interleaved scan, an MCU row is the same as an iMCU row. | 
| 71 |  |    * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows. | 
| 72 |  |    * But at the bottom of the image, process only what's left. | 
| 73 |  |    */ | 
| 74 | 35.3M |   if (cinfo->comps_in_scan > 1) { | 
| 75 | 16.8M |     diff->MCU_rows_per_iMCU_row = 1; | 
| 76 | 18.5M |   } else { | 
| 77 | 18.5M |     if (cinfo->input_iMCU_row < (cinfo->total_iMCU_rows-1)) | 
| 78 | 18.5M |       diff->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor; | 
| 79 | 2.39k |     else | 
| 80 | 2.39k |       diff->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height; | 
| 81 | 18.5M |   } | 
| 82 |  |  | 
| 83 | 35.3M |   diff->MCU_ctr = 0; | 
| 84 | 35.3M |   diff->MCU_vert_offset = 0; | 
| 85 | 35.3M | } | 
| 86 |  |  | 
| 87 |  |  | 
| 88 |  | /* | 
| 89 |  |  * Initialize for an input processing pass. | 
| 90 |  |  */ | 
| 91 |  |  | 
| 92 |  | METHODDEF(void) | 
| 93 |  | start_input_pass(j_decompress_ptr cinfo) | 
| 94 | 4.46k | { | 
| 95 | 4.46k |   my_diff_ptr diff = (my_diff_ptr)cinfo->coef; | 
| 96 |  |  | 
| 97 |  |   /* Because it is hitching a ride on the jpeg_inverse_dct struct, | 
| 98 |  |    * start_pass_lossless() will be called at the start of the output pass. | 
| 99 |  |    * This ensures that it will be called at the start of the input pass as | 
| 100 |  |    * well. | 
| 101 |  |    */ | 
| 102 | 4.46k |   (*cinfo->idct->start_pass) (cinfo); | 
| 103 |  |  | 
| 104 |  |   /* Check that the restart interval is an integer multiple of the number | 
| 105 |  |    * of MCUs in an MCU row. | 
| 106 |  |    */ | 
| 107 | 4.46k |   if (cinfo->restart_interval % cinfo->MCUs_per_row != 0) | 
| 108 | 24 |     ERREXIT2(cinfo, JERR_BAD_RESTART, | 
| 109 | 4.46k |              cinfo->restart_interval, cinfo->MCUs_per_row); | 
| 110 |  |  | 
| 111 |  |   /* Initialize restart counter */ | 
| 112 | 4.46k |   diff->restart_rows_to_go = cinfo->restart_interval / cinfo->MCUs_per_row; | 
| 113 |  |  | 
| 114 | 4.46k |   cinfo->input_iMCU_row = 0; | 
| 115 | 4.46k |   start_iMCU_row(cinfo); | 
| 116 | 4.46k | } | 
| 117 |  |  | 
| 118 |  |  | 
| 119 |  | /* | 
| 120 |  |  * Check for a restart marker & resynchronize decoder, undifferencer. | 
| 121 |  |  * Returns FALSE if must suspend. | 
| 122 |  |  */ | 
| 123 |  |  | 
| 124 |  | METHODDEF(boolean) | 
| 125 |  | process_restart(j_decompress_ptr cinfo) | 
| 126 | 112k | { | 
| 127 | 112k |   my_diff_ptr diff = (my_diff_ptr)cinfo->coef; | 
| 128 |  |  | 
| 129 | 112k |   if (!(*cinfo->entropy->process_restart) (cinfo)) | 
| 130 | 0 |     return FALSE; | 
| 131 |  |  | 
| 132 | 112k |   (*cinfo->idct->start_pass) (cinfo); | 
| 133 |  |  | 
| 134 |  |   /* Reset restart counter */ | 
| 135 | 112k |   diff->restart_rows_to_go = cinfo->restart_interval / cinfo->MCUs_per_row; | 
| 136 |  |  | 
| 137 | 112k |   return TRUE; | 
| 138 | 112k | } | 
| 139 |  |  | 
| 140 |  |  | 
| 141 |  | /* | 
| 142 |  |  * Initialize for an output processing pass. | 
| 143 |  |  */ | 
| 144 |  |  | 
| 145 |  | METHODDEF(void) | 
| 146 |  | start_output_pass(j_decompress_ptr cinfo) | 
| 147 | 842 | { | 
| 148 | 842 |   cinfo->output_iMCU_row = 0; | 
| 149 | 842 | } | 
| 150 |  |  | 
| 151 |  |  | 
| 152 |  | /* | 
| 153 |  |  * Decompress and return some data in the supplied buffer. | 
| 154 |  |  * Always attempts to emit one fully interleaved MCU row ("iMCU" row). | 
| 155 |  |  * Input and output must run in lockstep since we have only a one-MCU buffer. | 
| 156 |  |  * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED. | 
| 157 |  |  * | 
| 158 |  |  * NB: output_buf contains a plane for each component in image, | 
| 159 |  |  * which we index according to the component's SOF position. | 
| 160 |  |  */ | 
| 161 |  |  | 
| 162 |  | METHODDEF(int) | 
| 163 |  | decompress_data(j_decompress_ptr cinfo, _JSAMPIMAGE output_buf) | 
| 164 | 35.3M | { | 
| 165 | 35.3M |   my_diff_ptr diff = (my_diff_ptr)cinfo->coef; | 
| 166 | 35.3M |   lossless_decomp_ptr losslessd = (lossless_decomp_ptr)cinfo->idct; | 
| 167 | 35.3M |   JDIMENSION MCU_col_num;       /* index of current MCU within row */ | 
| 168 | 35.3M |   JDIMENSION MCU_count;         /* number of MCUs decoded */ | 
| 169 | 35.3M |   JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; | 
| 170 | 35.3M |   int ci, compi, row, prev_row; | 
| 171 | 35.3M |   unsigned int yoffset; | 
| 172 | 35.3M |   jpeg_component_info *compptr; | 
| 173 |  |  | 
| 174 |  |   /* Loop to process as much as one whole iMCU row */ | 
| 175 | 72.0M |   for (yoffset = diff->MCU_vert_offset; yoffset < diff->MCU_rows_per_iMCU_row; | 
| 176 | 36.7M |        yoffset++) { | 
| 177 |  |  | 
| 178 |  |     /* Process restart marker if needed; may have to suspend */ | 
| 179 | 36.7M |     if (cinfo->restart_interval) { | 
| 180 | 13.9M |       if (diff->restart_rows_to_go == 0) | 
| 181 | 112k |         if (!process_restart(cinfo)) | 
| 182 | 0 |           return JPEG_SUSPENDED; | 
| 183 | 13.9M |     } | 
| 184 |  |  | 
| 185 | 36.7M |     MCU_col_num = diff->MCU_ctr; | 
| 186 |  |     /* Try to fetch an MCU row (or remaining portion of suspended MCU row). */ | 
| 187 | 36.7M |     MCU_count = | 
| 188 | 36.7M |       (*cinfo->entropy->decode_mcus) (cinfo, | 
| 189 | 36.7M |                                       diff->diff_buf, yoffset, MCU_col_num, | 
| 190 | 36.7M |                                       cinfo->MCUs_per_row - MCU_col_num); | 
| 191 | 36.7M |     if (MCU_count != cinfo->MCUs_per_row - MCU_col_num) { | 
| 192 |  |       /* Suspension forced; update state counters and exit */ | 
| 193 | 0 |       diff->MCU_vert_offset = yoffset; | 
| 194 | 0 |       diff->MCU_ctr += MCU_count; | 
| 195 | 0 |       return JPEG_SUSPENDED; | 
| 196 | 0 |     } | 
| 197 |  |  | 
| 198 |  |     /* Account for restart interval (no-op if not using restarts) */ | 
| 199 | 36.7M |     if (cinfo->restart_interval) | 
| 200 | 13.9M |       diff->restart_rows_to_go--; | 
| 201 |  |  | 
| 202 |  |     /* Completed an MCU row, but perhaps not an iMCU row */ | 
| 203 | 36.7M |     diff->MCU_ctr = 0; | 
| 204 | 36.7M |   } | 
| 205 |  |  | 
| 206 |  |   /* | 
| 207 |  |    * Undifference and scale each scanline of the disassembled MCU row | 
| 208 |  |    * separately.  We do not process dummy samples at the end of a scanline | 
| 209 |  |    * or dummy rows at the end of the image. | 
| 210 |  |    */ | 
| 211 | 87.4M |   for (ci = 0; ci < cinfo->comps_in_scan; ci++) { | 
| 212 | 52.1M |     compptr = cinfo->cur_comp_info[ci]; | 
| 213 | 52.1M |     compi = compptr->component_index; | 
| 214 | 52.1M |     for (row = 0, prev_row = compptr->v_samp_factor - 1; | 
| 215 | 113M |          row < (cinfo->input_iMCU_row == last_iMCU_row ? | 
| 216 | 113M |                 compptr->last_row_height : compptr->v_samp_factor); | 
| 217 | 60.9M |          prev_row = row, row++) { | 
| 218 | 60.9M |       (*losslessd->predict_undifference[compi]) | 
| 219 | 60.9M |         (cinfo, compi, diff->diff_buf[compi][row], | 
| 220 | 60.9M |           diff->undiff_buf[compi][prev_row], diff->undiff_buf[compi][row], | 
| 221 | 60.9M |           compptr->width_in_blocks); | 
| 222 | 60.9M |       (*losslessd->scaler_scale) (cinfo, diff->undiff_buf[compi][row], | 
| 223 | 60.9M |                                   output_buf[compi][row], | 
| 224 | 60.9M |                                   compptr->width_in_blocks); | 
| 225 | 60.9M |     } | 
| 226 | 52.1M |   } | 
| 227 |  |  | 
| 228 |  |   /* Completed the iMCU row, advance counters for next one. | 
| 229 |  |    * | 
| 230 |  |    * NB: output_data will increment output_iMCU_row. | 
| 231 |  |    * This counter is not needed for the single-pass case | 
| 232 |  |    * or the input side of the multi-pass case. | 
| 233 |  |    */ | 
| 234 | 35.3M |   if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) { | 
| 235 | 35.3M |     start_iMCU_row(cinfo); | 
| 236 | 35.3M |     return JPEG_ROW_COMPLETED; | 
| 237 | 35.3M |   } | 
| 238 |  |   /* Completed the scan */ | 
| 239 | 4.36k |   (*cinfo->inputctl->finish_input_pass) (cinfo); | 
| 240 | 4.36k |   return JPEG_SCAN_COMPLETED; | 
| 241 | 35.3M | } | 
| 242 |  |  | 
| 243 |  |  | 
| 244 |  | /* | 
| 245 |  |  * Dummy consume-input routine for single-pass operation. | 
| 246 |  |  */ | 
| 247 |  |  | 
| 248 |  | METHODDEF(int) | 
| 249 |  | dummy_consume_data(j_decompress_ptr cinfo) | 
| 250 | 0 | { | 
| 251 | 0 |   return JPEG_SUSPENDED;        /* Always indicate nothing was done */ | 
| 252 | 0 | } | 
| 253 |  |  | 
| 254 |  |  | 
| 255 |  | #ifdef D_MULTISCAN_FILES_SUPPORTED | 
| 256 |  |  | 
| 257 |  | /* | 
| 258 |  |  * Consume input data and store it in the full-image sample buffer. | 
| 259 |  |  * We read as much as one fully interleaved MCU row ("iMCU" row) per call, | 
| 260 |  |  * ie, v_samp_factor rows for each component in the scan. | 
| 261 |  |  * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED. | 
| 262 |  |  */ | 
| 263 |  |  | 
| 264 |  | METHODDEF(int) | 
| 265 |  | consume_data(j_decompress_ptr cinfo) | 
| 266 | 35.3M | { | 
| 267 | 35.3M |   my_diff_ptr diff = (my_diff_ptr)cinfo->coef; | 
| 268 | 35.3M |   int ci, compi; | 
| 269 | 35.3M |   _JSAMPARRAY buffer[MAX_COMPS_IN_SCAN]; | 
| 270 | 35.3M |   jpeg_component_info *compptr; | 
| 271 |  |  | 
| 272 |  |   /* Align the virtual buffers for the components used in this scan. */ | 
| 273 | 87.4M |   for (ci = 0; ci < cinfo->comps_in_scan; ci++) { | 
| 274 | 52.1M |     compptr = cinfo->cur_comp_info[ci]; | 
| 275 | 52.1M |     compi = compptr->component_index; | 
| 276 | 52.1M |     buffer[compi] = (_JSAMPARRAY)(*cinfo->mem->access_virt_sarray) | 
| 277 | 52.1M |       ((j_common_ptr)cinfo, diff->whole_image[compi], | 
| 278 | 52.1M |        cinfo->input_iMCU_row * compptr->v_samp_factor, | 
| 279 | 52.1M |        (JDIMENSION)compptr->v_samp_factor, TRUE); | 
| 280 | 52.1M |   } | 
| 281 |  |  | 
| 282 | 35.3M |   return decompress_data(cinfo, buffer); | 
| 283 | 35.3M | } | 
| 284 |  |  | 
| 285 |  |  | 
| 286 |  | /* | 
| 287 |  |  * Output some data from the full-image sample buffer in the multi-pass case. | 
| 288 |  |  * Always attempts to emit one fully interleaved MCU row ("iMCU" row). | 
| 289 |  |  * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED. | 
| 290 |  |  * | 
| 291 |  |  * NB: output_buf contains a plane for each component in image. | 
| 292 |  |  */ | 
| 293 |  |  | 
| 294 |  | METHODDEF(int) | 
| 295 |  | output_data(j_decompress_ptr cinfo, _JSAMPIMAGE output_buf) | 
| 296 | 0 | { | 
| 297 | 0 |   my_diff_ptr diff = (my_diff_ptr)cinfo->coef; | 
| 298 | 0 |   JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; | 
| 299 | 0 |   int ci, samp_rows, row; | 
| 300 | 0 |   _JSAMPARRAY buffer; | 
| 301 | 0 |   jpeg_component_info *compptr; | 
| 302 |  |  | 
| 303 |  |   /* Force some input to be done if we are getting ahead of the input. */ | 
| 304 | 0 |   while (cinfo->input_scan_number < cinfo->output_scan_number || | 
| 305 | 0 |          (cinfo->input_scan_number == cinfo->output_scan_number && | 
| 306 | 0 |           cinfo->input_iMCU_row <= cinfo->output_iMCU_row)) { | 
| 307 | 0 |     if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED) | 
| 308 | 0 |       return JPEG_SUSPENDED; | 
| 309 | 0 |   } | 
| 310 |  |  | 
| 311 |  |   /* OK, output from the virtual arrays. */ | 
| 312 | 0 |   for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; | 
| 313 | 0 |        ci++, compptr++) { | 
| 314 |  |     /* Align the virtual buffer for this component. */ | 
| 315 | 0 |     buffer = (_JSAMPARRAY)(*cinfo->mem->access_virt_sarray) | 
| 316 | 0 |       ((j_common_ptr)cinfo, diff->whole_image[ci], | 
| 317 | 0 |        cinfo->output_iMCU_row * compptr->v_samp_factor, | 
| 318 | 0 |        (JDIMENSION)compptr->v_samp_factor, FALSE); | 
| 319 |  | 
 | 
| 320 | 0 |     if (cinfo->output_iMCU_row < last_iMCU_row) | 
| 321 | 0 |       samp_rows = compptr->v_samp_factor; | 
| 322 | 0 |     else { | 
| 323 |  |       /* NB: can't use last_row_height here; it is input-side-dependent! */ | 
| 324 | 0 |       samp_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor); | 
| 325 | 0 |       if (samp_rows == 0) samp_rows = compptr->v_samp_factor; | 
| 326 | 0 |     } | 
| 327 |  | 
 | 
| 328 | 0 |     for (row = 0; row < samp_rows; row++) { | 
| 329 | 0 |       memcpy(output_buf[ci][row], buffer[row], | 
| 330 | 0 |              compptr->width_in_blocks * sizeof(_JSAMPLE)); | 
| 331 | 0 |     } | 
| 332 | 0 |   } | 
| 333 |  | 
 | 
| 334 | 0 |   if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows) | 
| 335 | 0 |     return JPEG_ROW_COMPLETED; | 
| 336 | 0 |   return JPEG_SCAN_COMPLETED; | 
| 337 | 0 | } | 
| 338 |  |  | 
| 339 |  | #endif /* D_MULTISCAN_FILES_SUPPORTED */ | 
| 340 |  |  | 
| 341 |  |  | 
| 342 |  | /* | 
| 343 |  |  * Initialize difference buffer controller. | 
| 344 |  |  */ | 
| 345 |  |  | 
| 346 |  | GLOBAL(void) | 
| 347 |  | _jinit_d_diff_controller(j_decompress_ptr cinfo, boolean need_full_buffer) | 
| 348 | 1.13k | { | 
| 349 | 1.13k |   my_diff_ptr diff; | 
| 350 | 1.13k |   int ci; | 
| 351 | 1.13k |   jpeg_component_info *compptr; | 
| 352 |  |  | 
| 353 | 1.13k |   diff = (my_diff_ptr) | 
| 354 | 1.13k |     (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE, | 
| 355 | 1.13k |                                 sizeof(my_diff_controller)); | 
| 356 | 1.13k |   cinfo->coef = (struct jpeg_d_coef_controller *)diff; | 
| 357 | 1.13k |   diff->pub.start_input_pass = start_input_pass; | 
| 358 | 1.13k |   diff->pub.start_output_pass = start_output_pass; | 
| 359 |  |  | 
| 360 |  |   /* Create the [un]difference buffers. */ | 
| 361 | 4.49k |   for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; | 
| 362 | 3.36k |        ci++, compptr++) { | 
| 363 | 3.36k |     diff->diff_buf[ci] = | 
| 364 | 3.36k |       ALLOC_DARRAY(JPOOL_IMAGE, | 
| 365 | 3.36k |                    (JDIMENSION)jround_up((long)compptr->width_in_blocks, | 
| 366 | 3.36k |                                          (long)compptr->h_samp_factor), | 
| 367 | 3.36k |                    (JDIMENSION)compptr->v_samp_factor); | 
| 368 | 3.36k |     diff->undiff_buf[ci] = | 
| 369 | 3.36k |       ALLOC_DARRAY(JPOOL_IMAGE, | 
| 370 | 3.36k |                    (JDIMENSION)jround_up((long)compptr->width_in_blocks, | 
| 371 | 3.36k |                                          (long)compptr->h_samp_factor), | 
| 372 | 3.36k |                    (JDIMENSION)compptr->v_samp_factor); | 
| 373 | 3.36k |   } | 
| 374 |  |  | 
| 375 | 1.13k |   if (need_full_buffer) { | 
| 376 | 1.10k | #ifdef D_MULTISCAN_FILES_SUPPORTED | 
| 377 |  |     /* Allocate a full-image virtual array for each component. */ | 
| 378 | 1.10k |     int access_rows; | 
| 379 |  |  | 
| 380 | 4.41k |     for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; | 
| 381 | 3.31k |          ci++, compptr++) { | 
| 382 | 3.31k |       access_rows = compptr->v_samp_factor; | 
| 383 | 3.31k |       diff->whole_image[ci] = (*cinfo->mem->request_virt_sarray) | 
| 384 | 3.31k |         ((j_common_ptr)cinfo, JPOOL_IMAGE, FALSE, | 
| 385 | 3.31k |          (JDIMENSION)jround_up((long)compptr->width_in_blocks, | 
| 386 | 3.31k |                                (long)compptr->h_samp_factor), | 
| 387 | 3.31k |          (JDIMENSION)jround_up((long)compptr->height_in_blocks, | 
| 388 | 3.31k |                                (long)compptr->v_samp_factor), | 
| 389 | 3.31k |          (JDIMENSION)access_rows); | 
| 390 | 3.31k |     } | 
| 391 | 1.10k |     diff->pub.consume_data = consume_data; | 
| 392 | 1.10k |     diff->pub._decompress_data = output_data; | 
| 393 |  | #else | 
| 394 |  |     ERREXIT(cinfo, JERR_NOT_COMPILED); | 
| 395 |  | #endif | 
| 396 | 1.10k |   } else { | 
| 397 | 32 |     diff->pub.consume_data = dummy_consume_data; | 
| 398 | 32 |     diff->pub._decompress_data = decompress_data; | 
| 399 | 32 |     diff->whole_image[0] = NULL; /* flag for no virtual arrays */ | 
| 400 | 32 |   } | 
| 401 | 1.13k | } j12init_d_diff_controller| Line | Count | Source |  | 348 | 382 | { |  | 349 | 382 |   my_diff_ptr diff; |  | 350 | 382 |   int ci; |  | 351 | 382 |   jpeg_component_info *compptr; |  | 352 |  |  |  | 353 | 382 |   diff = (my_diff_ptr) |  | 354 | 382 |     (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE, |  | 355 | 382 |                                 sizeof(my_diff_controller)); |  | 356 | 382 |   cinfo->coef = (struct jpeg_d_coef_controller *)diff; |  | 357 | 382 |   diff->pub.start_input_pass = start_input_pass; |  | 358 | 382 |   diff->pub.start_output_pass = start_output_pass; |  | 359 |  |  |  | 360 |  |   /* Create the [un]difference buffers. */ |  | 361 | 1.51k |   for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; |  | 362 | 1.13k |        ci++, compptr++) { |  | 363 | 1.13k |     diff->diff_buf[ci] = |  | 364 | 1.13k |       ALLOC_DARRAY(JPOOL_IMAGE, |  | 365 | 1.13k |                    (JDIMENSION)jround_up((long)compptr->width_in_blocks, |  | 366 | 1.13k |                                          (long)compptr->h_samp_factor), |  | 367 | 1.13k |                    (JDIMENSION)compptr->v_samp_factor); |  | 368 | 1.13k |     diff->undiff_buf[ci] = |  | 369 | 1.13k |       ALLOC_DARRAY(JPOOL_IMAGE, |  | 370 | 1.13k |                    (JDIMENSION)jround_up((long)compptr->width_in_blocks, |  | 371 | 1.13k |                                          (long)compptr->h_samp_factor), |  | 372 | 1.13k |                    (JDIMENSION)compptr->v_samp_factor); |  | 373 | 1.13k |   } |  | 374 |  |  |  | 375 | 382 |   if (need_full_buffer) { |  | 376 | 375 | #ifdef D_MULTISCAN_FILES_SUPPORTED |  | 377 |  |     /* Allocate a full-image virtual array for each component. */ |  | 378 | 375 |     int access_rows; |  | 379 |  |  |  | 380 | 1.50k |     for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; |  | 381 | 1.12k |          ci++, compptr++) { |  | 382 | 1.12k |       access_rows = compptr->v_samp_factor; |  | 383 | 1.12k |       diff->whole_image[ci] = (*cinfo->mem->request_virt_sarray) |  | 384 | 1.12k |         ((j_common_ptr)cinfo, JPOOL_IMAGE, FALSE, |  | 385 | 1.12k |          (JDIMENSION)jround_up((long)compptr->width_in_blocks, |  | 386 | 1.12k |                                (long)compptr->h_samp_factor), |  | 387 | 1.12k |          (JDIMENSION)jround_up((long)compptr->height_in_blocks, |  | 388 | 1.12k |                                (long)compptr->v_samp_factor), |  | 389 | 1.12k |          (JDIMENSION)access_rows); |  | 390 | 1.12k |     } |  | 391 | 375 |     diff->pub.consume_data = consume_data; |  | 392 | 375 |     diff->pub._decompress_data = output_data; |  | 393 |  | #else |  | 394 |  |     ERREXIT(cinfo, JERR_NOT_COMPILED); |  | 395 |  | #endif |  | 396 | 375 |   } else { |  | 397 | 7 |     diff->pub.consume_data = dummy_consume_data; |  | 398 | 7 |     diff->pub._decompress_data = decompress_data; |  | 399 | 7 |     diff->whole_image[0] = NULL; /* flag for no virtual arrays */ |  | 400 | 7 |   } |  | 401 | 382 | } | 
j16init_d_diff_controller| Line | Count | Source |  | 348 | 352 | { |  | 349 | 352 |   my_diff_ptr diff; |  | 350 | 352 |   int ci; |  | 351 | 352 |   jpeg_component_info *compptr; |  | 352 |  |  |  | 353 | 352 |   diff = (my_diff_ptr) |  | 354 | 352 |     (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE, |  | 355 | 352 |                                 sizeof(my_diff_controller)); |  | 356 | 352 |   cinfo->coef = (struct jpeg_d_coef_controller *)diff; |  | 357 | 352 |   diff->pub.start_input_pass = start_input_pass; |  | 358 | 352 |   diff->pub.start_output_pass = start_output_pass; |  | 359 |  |  |  | 360 |  |   /* Create the [un]difference buffers. */ |  | 361 | 1.39k |   for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; |  | 362 | 1.04k |        ci++, compptr++) { |  | 363 | 1.04k |     diff->diff_buf[ci] = |  | 364 | 1.04k |       ALLOC_DARRAY(JPOOL_IMAGE, |  | 365 | 1.04k |                    (JDIMENSION)jround_up((long)compptr->width_in_blocks, |  | 366 | 1.04k |                                          (long)compptr->h_samp_factor), |  | 367 | 1.04k |                    (JDIMENSION)compptr->v_samp_factor); |  | 368 | 1.04k |     diff->undiff_buf[ci] = |  | 369 | 1.04k |       ALLOC_DARRAY(JPOOL_IMAGE, |  | 370 | 1.04k |                    (JDIMENSION)jround_up((long)compptr->width_in_blocks, |  | 371 | 1.04k |                                          (long)compptr->h_samp_factor), |  | 372 | 1.04k |                    (JDIMENSION)compptr->v_samp_factor); |  | 373 | 1.04k |   } |  | 374 |  |  |  | 375 | 352 |   if (need_full_buffer) { |  | 376 | 340 | #ifdef D_MULTISCAN_FILES_SUPPORTED |  | 377 |  |     /* Allocate a full-image virtual array for each component. */ |  | 378 | 340 |     int access_rows; |  | 379 |  |  |  | 380 | 1.36k |     for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; |  | 381 | 1.02k |          ci++, compptr++) { |  | 382 | 1.02k |       access_rows = compptr->v_samp_factor; |  | 383 | 1.02k |       diff->whole_image[ci] = (*cinfo->mem->request_virt_sarray) |  | 384 | 1.02k |         ((j_common_ptr)cinfo, JPOOL_IMAGE, FALSE, |  | 385 | 1.02k |          (JDIMENSION)jround_up((long)compptr->width_in_blocks, |  | 386 | 1.02k |                                (long)compptr->h_samp_factor), |  | 387 | 1.02k |          (JDIMENSION)jround_up((long)compptr->height_in_blocks, |  | 388 | 1.02k |                                (long)compptr->v_samp_factor), |  | 389 | 1.02k |          (JDIMENSION)access_rows); |  | 390 | 1.02k |     } |  | 391 | 340 |     diff->pub.consume_data = consume_data; |  | 392 | 340 |     diff->pub._decompress_data = output_data; |  | 393 |  | #else |  | 394 |  |     ERREXIT(cinfo, JERR_NOT_COMPILED); |  | 395 |  | #endif |  | 396 | 340 |   } else { |  | 397 | 12 |     diff->pub.consume_data = dummy_consume_data; |  | 398 | 12 |     diff->pub._decompress_data = decompress_data; |  | 399 | 12 |     diff->whole_image[0] = NULL; /* flag for no virtual arrays */ |  | 400 | 12 |   } |  | 401 | 352 | } | 
| Line | Count | Source |  | 348 | 402 | { |  | 349 | 402 |   my_diff_ptr diff; |  | 350 | 402 |   int ci; |  | 351 | 402 |   jpeg_component_info *compptr; |  | 352 |  |  |  | 353 | 402 |   diff = (my_diff_ptr) |  | 354 | 402 |     (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE, |  | 355 | 402 |                                 sizeof(my_diff_controller)); |  | 356 | 402 |   cinfo->coef = (struct jpeg_d_coef_controller *)diff; |  | 357 | 402 |   diff->pub.start_input_pass = start_input_pass; |  | 358 | 402 |   diff->pub.start_output_pass = start_output_pass; |  | 359 |  |  |  | 360 |  |   /* Create the [un]difference buffers. */ |  | 361 | 1.58k |   for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; |  | 362 | 1.18k |        ci++, compptr++) { |  | 363 | 1.18k |     diff->diff_buf[ci] = |  | 364 | 1.18k |       ALLOC_DARRAY(JPOOL_IMAGE, |  | 365 | 1.18k |                    (JDIMENSION)jround_up((long)compptr->width_in_blocks, |  | 366 | 1.18k |                                          (long)compptr->h_samp_factor), |  | 367 | 1.18k |                    (JDIMENSION)compptr->v_samp_factor); |  | 368 | 1.18k |     diff->undiff_buf[ci] = |  | 369 | 1.18k |       ALLOC_DARRAY(JPOOL_IMAGE, |  | 370 | 1.18k |                    (JDIMENSION)jround_up((long)compptr->width_in_blocks, |  | 371 | 1.18k |                                          (long)compptr->h_samp_factor), |  | 372 | 1.18k |                    (JDIMENSION)compptr->v_samp_factor); |  | 373 | 1.18k |   } |  | 374 |  |  |  | 375 | 402 |   if (need_full_buffer) { |  | 376 | 389 | #ifdef D_MULTISCAN_FILES_SUPPORTED |  | 377 |  |     /* Allocate a full-image virtual array for each component. */ |  | 378 | 389 |     int access_rows; |  | 379 |  |  |  | 380 | 1.55k |     for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; |  | 381 | 1.16k |          ci++, compptr++) { |  | 382 | 1.16k |       access_rows = compptr->v_samp_factor; |  | 383 | 1.16k |       diff->whole_image[ci] = (*cinfo->mem->request_virt_sarray) |  | 384 | 1.16k |         ((j_common_ptr)cinfo, JPOOL_IMAGE, FALSE, |  | 385 | 1.16k |          (JDIMENSION)jround_up((long)compptr->width_in_blocks, |  | 386 | 1.16k |                                (long)compptr->h_samp_factor), |  | 387 | 1.16k |          (JDIMENSION)jround_up((long)compptr->height_in_blocks, |  | 388 | 1.16k |                                (long)compptr->v_samp_factor), |  | 389 | 1.16k |          (JDIMENSION)access_rows); |  | 390 | 1.16k |     } |  | 391 | 389 |     diff->pub.consume_data = consume_data; |  | 392 | 389 |     diff->pub._decompress_data = output_data; |  | 393 |  | #else |  | 394 |  |     ERREXIT(cinfo, JERR_NOT_COMPILED); |  | 395 |  | #endif |  | 396 | 389 |   } else { |  | 397 | 13 |     diff->pub.consume_data = dummy_consume_data; |  | 398 | 13 |     diff->pub._decompress_data = decompress_data; |  | 399 | 13 |     diff->whole_image[0] = NULL; /* flag for no virtual arrays */ |  | 400 | 13 |   } |  | 401 | 402 | } | 
 | 
| 402 |  |  | 
| 403 |  | #endif /* D_LOSSLESS_SUPPORTED */ |