• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * jdapistd.c
3  *
4  * This file was part of the Independent JPEG Group's software:
5  * Copyright (C) 1994-1996, Thomas G. Lane.
6  * libjpeg-turbo Modifications:
7  * Copyright (C) 2010, 2015, D. R. Commander.
8  * Copyright (C) 2015, Google, Inc.
9  * For conditions of distribution and use, see the accompanying README file.
10  *
11  * This file contains application interface code for the decompression half
12  * of the JPEG library.  These are the "standard" API routines that are
13  * used in the normal full-decompression case.  They are not used by a
14  * transcoding-only application.  Note that if an application links in
15  * jpeg_start_decompress, it will end up linking in the entire decompressor.
16  * We thus must separate this file from jdapimin.c to avoid linking the
17  * whole decompression library into a transcoder.
18  */
19 
20 #include "jdmainct.h"
21 #include "jdcoefct.h"
22 #include "jdsample.h"
23 #include "jmemsys.h"
24 
25 /* Forward declarations */
26 LOCAL(boolean) output_pass_setup (j_decompress_ptr cinfo);
27 
28 
29 /*
30  * Decompression initialization.
31  * jpeg_read_header must be completed before calling this.
32  *
33  * If a multipass operating mode was selected, this will do all but the
34  * last pass, and thus may take a great deal of time.
35  *
36  * Returns FALSE if suspended.  The return value need be inspected only if
37  * a suspending data source is used.
38  */
39 
40 GLOBAL(boolean)
jpeg_start_decompress(j_decompress_ptr cinfo)41 jpeg_start_decompress (j_decompress_ptr cinfo)
42 {
43   if (cinfo->global_state == DSTATE_READY) {
44     /* First call: initialize master control, select active modules */
45     jinit_master_decompress(cinfo);
46     if (cinfo->buffered_image) {
47       /* No more work here; expecting jpeg_start_output next */
48       cinfo->global_state = DSTATE_BUFIMAGE;
49       return TRUE;
50     }
51     cinfo->global_state = DSTATE_PRELOAD;
52   }
53   if (cinfo->global_state == DSTATE_PRELOAD) {
54     /* If file has multiple scans, absorb them all into the coef buffer */
55     if (cinfo->inputctl->has_multiple_scans) {
56 #ifdef D_MULTISCAN_FILES_SUPPORTED
57       for (;;) {
58         int retcode;
59         /* Call progress monitor hook if present */
60         if (cinfo->progress != NULL)
61           (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
62         /* Absorb some more input */
63         retcode = (*cinfo->inputctl->consume_input) (cinfo);
64         if (retcode == JPEG_SUSPENDED)
65           return FALSE;
66         if (retcode == JPEG_REACHED_EOI)
67           break;
68         /* Advance progress counter if appropriate */
69         if (cinfo->progress != NULL &&
70             (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) {
71           if (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) {
72             /* jdmaster underestimated number of scans; ratchet up one scan */
73             cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows;
74           }
75         }
76       }
77 #else
78       ERREXIT(cinfo, JERR_NOT_COMPILED);
79 #endif /* D_MULTISCAN_FILES_SUPPORTED */
80     }
81     cinfo->output_scan_number = cinfo->input_scan_number;
82   } else if (cinfo->global_state != DSTATE_PRESCAN)
83     ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
84   /* Perform any dummy output passes, and set up for the final pass */
85   return output_pass_setup(cinfo);
86 }
87 
88 
89 /*
90  * Set up for an output pass, and perform any dummy pass(es) needed.
91  * Common subroutine for jpeg_start_decompress and jpeg_start_output.
92  * Entry: global_state = DSTATE_PRESCAN only if previously suspended.
93  * Exit: If done, returns TRUE and sets global_state for proper output mode.
94  *       If suspended, returns FALSE and sets global_state = DSTATE_PRESCAN.
95  */
96 
97 LOCAL(boolean)
output_pass_setup(j_decompress_ptr cinfo)98 output_pass_setup (j_decompress_ptr cinfo)
99 {
100   if (cinfo->global_state != DSTATE_PRESCAN) {
101     /* First call: do pass setup */
102     (*cinfo->master->prepare_for_output_pass) (cinfo);
103     cinfo->output_scanline = 0;
104     cinfo->global_state = DSTATE_PRESCAN;
105   }
106   /* Loop over any required dummy passes */
107   while (cinfo->master->is_dummy_pass) {
108 #ifdef QUANT_2PASS_SUPPORTED
109     /* Crank through the dummy pass */
110     while (cinfo->output_scanline < cinfo->output_height) {
111       JDIMENSION last_scanline;
112       /* Call progress monitor hook if present */
113       if (cinfo->progress != NULL) {
114         cinfo->progress->pass_counter = (long) cinfo->output_scanline;
115         cinfo->progress->pass_limit = (long) cinfo->output_height;
116         (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
117       }
118       /* Process some data */
119       last_scanline = cinfo->output_scanline;
120       (*cinfo->main->process_data) (cinfo, (JSAMPARRAY) NULL,
121                                     &cinfo->output_scanline, (JDIMENSION) 0);
122       if (cinfo->output_scanline == last_scanline)
123         return FALSE;           /* No progress made, must suspend */
124     }
125     /* Finish up dummy pass, and set up for another one */
126     (*cinfo->master->finish_output_pass) (cinfo);
127     (*cinfo->master->prepare_for_output_pass) (cinfo);
128     cinfo->output_scanline = 0;
129 #else
130     ERREXIT(cinfo, JERR_NOT_COMPILED);
131 #endif /* QUANT_2PASS_SUPPORTED */
132   }
133   /* Ready for application to drive output pass through
134    * jpeg_read_scanlines or jpeg_read_raw_data.
135    */
136   cinfo->global_state = cinfo->raw_data_out ? DSTATE_RAW_OK : DSTATE_SCANNING;
137   return TRUE;
138 }
139 
140 
141 /*
142  * Enable partial scanline decompression
143  *
144  * Must be called after jpeg_start_decompress() and before any calls to
145  * jpeg_read_scanlines() or jpeg_skip_scanlines().
146  *
147  * Refer to libjpeg.txt for more information.
148  */
149 
150 GLOBAL(void)
jpeg_crop_scanline(j_decompress_ptr cinfo,JDIMENSION * xoffset,JDIMENSION * width)151 jpeg_crop_scanline (j_decompress_ptr cinfo, JDIMENSION *xoffset,
152                     JDIMENSION *width)
153 {
154   int ci, align, orig_downsampled_width;
155   JDIMENSION input_xoffset;
156   boolean reinit_upsampler = FALSE;
157   jpeg_component_info *compptr;
158 
159   if (cinfo->global_state != DSTATE_SCANNING || cinfo->output_scanline != 0)
160     ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
161 
162   if (!xoffset || !width)
163     ERREXIT(cinfo, JERR_BAD_CROP_SPEC);
164 
165   /* xoffset and width must fall within the output image dimensions. */
166   if (*width == 0 || *xoffset + *width > cinfo->output_width)
167     ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
168 
169   /* No need to do anything if the caller wants the entire width. */
170   if (*width == cinfo->output_width)
171     return;
172 
173   /* Ensuring the proper alignment of xoffset is tricky.  At minimum, it
174    * must align with an MCU boundary, because:
175    *
176    *   (1) The IDCT is performed in blocks, and it is not feasible to modify
177    *       the algorithm so that it can transform partial blocks.
178    *   (2) Because of the SIMD extensions, any input buffer passed to the
179    *       upsampling and color conversion routines must be aligned to the
180    *       SIMD word size (for instance, 128-bit in the case of SSE2.)  The
181    *       easiest way to accomplish this without copying data is to ensure
182    *       that upsampling and color conversion begin at the start of the
183    *       first MCU column that will be inverse transformed.
184    *
185    * In practice, we actually impose a stricter alignment requirement.  We
186    * require that xoffset be a multiple of the maximum MCU column width of all
187    * of the components (the "iMCU column width.")  This is to simplify the
188    * single-pass decompression case, allowing us to use the same MCU column
189    * width for all of the components.
190    */
191   align = cinfo->min_DCT_scaled_size * cinfo->max_h_samp_factor;
192 
193   /* Adjust xoffset to the nearest iMCU boundary <= the requested value */
194   input_xoffset = *xoffset;
195   *xoffset = (input_xoffset / align) * align;
196 
197   /* Adjust the width so that the right edge of the output image is as
198    * requested (only the left edge is altered.)  It is important that calling
199    * programs check this value after this function returns, so that they can
200    * allocate an output buffer with the appropriate size.
201    */
202   *width = *width + input_xoffset - *xoffset;
203   cinfo->output_width = *width;
204 
205   /* Set the first and last iMCU columns that we must decompress.  These values
206    * will be used in single-scan decompressions.
207    */
208   cinfo->master->first_iMCU_col =
209     (JDIMENSION) (long) (*xoffset) / (long) align;
210   cinfo->master->last_iMCU_col =
211     (JDIMENSION) jdiv_round_up((long) (*xoffset + cinfo->output_width),
212                                (long) align) - 1;
213 
214   for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
215        ci++, compptr++) {
216     /* Set downsampled_width to the new output width. */
217     orig_downsampled_width = compptr->downsampled_width;
218     compptr->downsampled_width =
219       (JDIMENSION) jdiv_round_up((long) (cinfo->output_width *
220                                          compptr->h_samp_factor),
221                                  (long) cinfo->max_h_samp_factor);
222     if (compptr->downsampled_width < 2 && orig_downsampled_width >= 2)
223       reinit_upsampler = TRUE;
224 
225     /* Set the first and last iMCU columns that we must decompress.  These
226      * values will be used in multi-scan decompressions.
227      */
228     cinfo->master->first_MCU_col[ci] =
229       (JDIMENSION) (long) (*xoffset * compptr->h_samp_factor) /
230                    (long) align;
231     cinfo->master->last_MCU_col[ci] =
232       (JDIMENSION) jdiv_round_up((long) ((*xoffset + cinfo->output_width) *
233                                          compptr->h_samp_factor),
234                                  (long) align) - 1;
235   }
236 
237   if (reinit_upsampler) {
238     cinfo->master->jinit_upsampler_no_alloc = TRUE;
239     jinit_upsampler(cinfo);
240     cinfo->master->jinit_upsampler_no_alloc = FALSE;
241   }
242 }
243 
244 
245 /*
246  * Read some scanlines of data from the JPEG decompressor.
247  *
248  * The return value will be the number of lines actually read.
249  * This may be less than the number requested in several cases,
250  * including bottom of image, data source suspension, and operating
251  * modes that emit multiple scanlines at a time.
252  *
253  * Note: we warn about excess calls to jpeg_read_scanlines() since
254  * this likely signals an application programmer error.  However,
255  * an oversize buffer (max_lines > scanlines remaining) is not an error.
256  */
257 
258 GLOBAL(JDIMENSION)
jpeg_read_scanlines(j_decompress_ptr cinfo,JSAMPARRAY scanlines,JDIMENSION max_lines)259 jpeg_read_scanlines (j_decompress_ptr cinfo, JSAMPARRAY scanlines,
260                      JDIMENSION max_lines)
261 {
262   JDIMENSION row_ctr;
263 
264   if (cinfo->global_state != DSTATE_SCANNING)
265     ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
266   if (cinfo->output_scanline >= cinfo->output_height) {
267     WARNMS(cinfo, JWRN_TOO_MUCH_DATA);
268     return 0;
269   }
270 
271   /* Call progress monitor hook if present */
272   if (cinfo->progress != NULL) {
273     cinfo->progress->pass_counter = (long) cinfo->output_scanline;
274     cinfo->progress->pass_limit = (long) cinfo->output_height;
275     (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
276   }
277 
278   /* Process some data */
279   row_ctr = 0;
280   (*cinfo->main->process_data) (cinfo, scanlines, &row_ctr, max_lines);
281   cinfo->output_scanline += row_ctr;
282   return row_ctr;
283 }
284 
285 
286 /* Dummy color convert function used by jpeg_skip_scanlines() */
287 LOCAL(void)
noop_convert(j_decompress_ptr cinfo,JSAMPIMAGE input_buf,JDIMENSION input_row,JSAMPARRAY output_buf,int num_rows)288 noop_convert (j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
289               JDIMENSION input_row, JSAMPARRAY output_buf, int num_rows)
290 {
291 }
292 
293 
294 /*
295  * In some cases, it is best to call jpeg_read_scanlines() and discard the
296  * output, rather than skipping the scanlines, because this allows us to
297  * maintain the internal state of the context-based upsampler.  In these cases,
298  * we set up and tear down a dummy color converter in order to avoid valgrind
299  * errors and to achieve the best possible performance.
300  */
301 
302 LOCAL(void)
read_and_discard_scanlines(j_decompress_ptr cinfo,JDIMENSION num_lines)303 read_and_discard_scanlines (j_decompress_ptr cinfo, JDIMENSION num_lines)
304 {
305   JDIMENSION n;
306   void (*color_convert) (j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
307                          JDIMENSION input_row, JSAMPARRAY output_buf,
308                          int num_rows);
309 
310   color_convert = cinfo->cconvert->color_convert;
311   cinfo->cconvert->color_convert = noop_convert;
312 
313   for (n = 0; n < num_lines; n++)
314     jpeg_read_scanlines(cinfo, NULL, 1);
315 
316   cinfo->cconvert->color_convert = color_convert;
317 }
318 
319 
320 /*
321  * Called by jpeg_skip_scanlines().  This partially skips a decompress block by
322  * incrementing the rowgroup counter.
323  */
324 
325 LOCAL(void)
increment_simple_rowgroup_ctr(j_decompress_ptr cinfo,JDIMENSION rows)326 increment_simple_rowgroup_ctr (j_decompress_ptr cinfo, JDIMENSION rows)
327 {
328   JDIMENSION rows_left;
329   my_main_ptr main_ptr = (my_main_ptr) cinfo->main;
330 
331   /* Increment the counter to the next row group after the skipped rows. */
332   main_ptr->rowgroup_ctr += rows / cinfo->max_v_samp_factor;
333 
334   /* Partially skipping a row group would involve modifying the internal state
335    * of the upsampler, so read the remaining rows into a dummy buffer instead.
336    */
337   rows_left = rows % cinfo->max_v_samp_factor;
338   cinfo->output_scanline += rows - rows_left;
339 
340   read_and_discard_scanlines(cinfo, rows_left);
341 }
342 
343 /*
344  * Skips some scanlines of data from the JPEG decompressor.
345  *
346  * The return value will be the number of lines actually skipped.  If skipping
347  * num_lines would move beyond the end of the image, then the actual number of
348  * lines remaining in the image is returned.  Otherwise, the return value will
349  * be equal to num_lines.
350  *
351  * Refer to libjpeg.txt for more information.
352  */
353 
354 GLOBAL(JDIMENSION)
jpeg_skip_scanlines(j_decompress_ptr cinfo,JDIMENSION num_lines)355 jpeg_skip_scanlines (j_decompress_ptr cinfo, JDIMENSION num_lines)
356 {
357   my_main_ptr main_ptr = (my_main_ptr) cinfo->main;
358   my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
359   my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
360   JDIMENSION i, x;
361   int y;
362   JDIMENSION lines_per_iMCU_row, lines_left_in_iMCU_row, lines_after_iMCU_row;
363   JDIMENSION lines_to_skip, lines_to_read;
364 
365   if (cinfo->global_state != DSTATE_SCANNING)
366     ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
367 
368   /* Do not skip past the bottom of the image. */
369   if (cinfo->output_scanline + num_lines >= cinfo->output_height) {
370     cinfo->output_scanline = cinfo->output_height;
371     return cinfo->output_height - cinfo->output_scanline;
372   }
373 
374   if (num_lines == 0)
375     return 0;
376 
377   lines_per_iMCU_row = cinfo->_min_DCT_scaled_size * cinfo->max_v_samp_factor;
378   lines_left_in_iMCU_row =
379     (lines_per_iMCU_row - (cinfo->output_scanline % lines_per_iMCU_row)) %
380     lines_per_iMCU_row;
381   lines_after_iMCU_row = num_lines - lines_left_in_iMCU_row;
382 
383   /* Skip the lines remaining in the current iMCU row.  When upsampling
384    * requires context rows, we need the previous and next rows in order to read
385    * the current row.  This adds some complexity.
386    */
387   if (cinfo->upsample->need_context_rows) {
388     /* If the skipped lines would not move us past the current iMCU row, we
389      * read the lines and ignore them.  There might be a faster way of doing
390      * this, but we are facing increasing complexity for diminishing returns.
391      * The increasing complexity would be a by-product of meddling with the
392      * state machine used to skip context rows.  Near the end of an iMCU row,
393      * the next iMCU row may have already been entropy-decoded.  In this unique
394      * case, we will read the next iMCU row if we cannot skip past it as well.
395      */
396     if ((num_lines < lines_left_in_iMCU_row + 1) ||
397         (lines_left_in_iMCU_row <= 1 && main_ptr->buffer_full &&
398          lines_after_iMCU_row < lines_per_iMCU_row + 1)) {
399       read_and_discard_scanlines(cinfo, num_lines);
400       return num_lines;
401     }
402 
403     /* If the next iMCU row has already been entropy-decoded, make sure that
404      * we do not skip too far.
405      */
406     if (lines_left_in_iMCU_row <= 1 && main_ptr->buffer_full) {
407       cinfo->output_scanline += lines_left_in_iMCU_row + lines_per_iMCU_row;
408       lines_after_iMCU_row -= lines_per_iMCU_row;
409     } else {
410       cinfo->output_scanline += lines_left_in_iMCU_row;
411     }
412 
413     /* If we have just completed the first block, adjust the buffer pointers */
414     if (main_ptr->iMCU_row_ctr == 0 ||
415         (main_ptr->iMCU_row_ctr == 1 && lines_left_in_iMCU_row > 2))
416       set_wraparound_pointers(cinfo);
417     main_ptr->buffer_full = FALSE;
418     main_ptr->rowgroup_ctr = 0;
419     main_ptr->context_state = CTX_PREPARE_FOR_IMCU;
420     upsample->next_row_out = cinfo->max_v_samp_factor;
421     upsample->rows_to_go = cinfo->output_height - cinfo->output_scanline;
422   }
423 
424   /* Skipping is much simpler when context rows are not required. */
425   else {
426     if (num_lines < lines_left_in_iMCU_row) {
427       increment_simple_rowgroup_ctr(cinfo, num_lines);
428       return num_lines;
429     } else {
430       cinfo->output_scanline += lines_left_in_iMCU_row;
431       main_ptr->buffer_full = FALSE;
432       main_ptr->rowgroup_ctr = 0;
433       upsample->next_row_out = cinfo->max_v_samp_factor;
434       upsample->rows_to_go = cinfo->output_height - cinfo->output_scanline;
435     }
436   }
437 
438   /* Calculate how many full iMCU rows we can skip. */
439   if (cinfo->upsample->need_context_rows)
440     lines_to_skip = ((lines_after_iMCU_row - 1) / lines_per_iMCU_row) *
441                     lines_per_iMCU_row;
442   else
443     lines_to_skip = (lines_after_iMCU_row / lines_per_iMCU_row) *
444                     lines_per_iMCU_row;
445   /* Calculate the number of lines that remain to be skipped after skipping all
446    * of the full iMCU rows that we can.  We will not read these lines unless we
447    * have to.
448    */
449   lines_to_read = lines_after_iMCU_row - lines_to_skip;
450 
451   /* For images requiring multiple scans (progressive, non-interleaved, etc.),
452    * all of the entropy decoding occurs in jpeg_start_decompress(), assuming
453    * that the input data source is non-suspending.  This makes skipping easy.
454    */
455   if (cinfo->inputctl->has_multiple_scans) {
456     if (cinfo->upsample->need_context_rows) {
457       cinfo->output_scanline += lines_to_skip;
458       cinfo->output_iMCU_row += lines_to_skip / lines_per_iMCU_row;
459       main_ptr->iMCU_row_ctr += lines_after_iMCU_row / lines_per_iMCU_row;
460       /* It is complex to properly move to the middle of a context block, so
461        * read the remaining lines instead of skipping them.
462        */
463       read_and_discard_scanlines(cinfo, lines_to_read);
464     } else {
465       cinfo->output_scanline += lines_to_skip;
466       cinfo->output_iMCU_row += lines_to_skip / lines_per_iMCU_row;
467       increment_simple_rowgroup_ctr(cinfo, lines_to_read);
468     }
469     upsample->rows_to_go = cinfo->output_height - cinfo->output_scanline;
470     return num_lines;
471   }
472 
473   /* Skip the iMCU rows that we can safely skip. */
474   for (i = 0; i < lines_to_skip; i += lines_per_iMCU_row) {
475     for (y = 0; y < coef->MCU_rows_per_iMCU_row; y++) {
476       for (x = 0; x < cinfo->MCUs_per_row; x++) {
477         /* Calling decode_mcu() with a NULL pointer causes it to discard the
478          * decoded coefficients.  This is ~5% faster for large subsets, but
479          * it's tough to tell a difference for smaller images.
480          */
481         (*cinfo->entropy->decode_mcu) (cinfo, NULL);
482       }
483     }
484     cinfo->input_iMCU_row++;
485     cinfo->output_iMCU_row++;
486     if (cinfo->input_iMCU_row < cinfo->total_iMCU_rows)
487       start_iMCU_row(cinfo);
488     else
489       (*cinfo->inputctl->finish_input_pass) (cinfo);
490   }
491   cinfo->output_scanline += lines_to_skip;
492 
493   if (cinfo->upsample->need_context_rows) {
494     /* Context-based upsampling keeps track of iMCU rows. */
495     main_ptr->iMCU_row_ctr += lines_to_skip / lines_per_iMCU_row;
496 
497     /* It is complex to properly move to the middle of a context block, so
498      * read the remaining lines instead of skipping them.
499      */
500     read_and_discard_scanlines(cinfo, lines_to_read);
501   } else {
502     increment_simple_rowgroup_ctr(cinfo, lines_to_read);
503   }
504 
505   /* Since skipping lines involves skipping the upsampling step, the value of
506    * "rows_to_go" will become invalid unless we set it here.  NOTE: This is a
507    * bit odd, since "rows_to_go" seems to be redundantly keeping track of
508    * output_scanline.
509    */
510   upsample->rows_to_go = cinfo->output_height - cinfo->output_scanline;
511 
512   /* Always skip the requested number of lines. */
513   return num_lines;
514 }
515 
516 /*
517  * Alternate entry point to read raw data.
518  * Processes exactly one iMCU row per call, unless suspended.
519  */
520 
521 GLOBAL(JDIMENSION)
jpeg_read_raw_data(j_decompress_ptr cinfo,JSAMPIMAGE data,JDIMENSION max_lines)522 jpeg_read_raw_data (j_decompress_ptr cinfo, JSAMPIMAGE data,
523                     JDIMENSION max_lines)
524 {
525   JDIMENSION lines_per_iMCU_row;
526 
527   if (cinfo->global_state != DSTATE_RAW_OK)
528     ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
529   if (cinfo->output_scanline >= cinfo->output_height) {
530     WARNMS(cinfo, JWRN_TOO_MUCH_DATA);
531     return 0;
532   }
533 
534   /* Call progress monitor hook if present */
535   if (cinfo->progress != NULL) {
536     cinfo->progress->pass_counter = (long) cinfo->output_scanline;
537     cinfo->progress->pass_limit = (long) cinfo->output_height;
538     (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
539   }
540 
541   /* Verify that at least one iMCU row can be returned. */
542   lines_per_iMCU_row = cinfo->max_v_samp_factor * cinfo->_min_DCT_scaled_size;
543   if (max_lines < lines_per_iMCU_row)
544     ERREXIT(cinfo, JERR_BUFFER_SIZE);
545 
546   /* Decompress directly into user's buffer. */
547   if (! (*cinfo->coef->decompress_data) (cinfo, data))
548     return 0;                   /* suspension forced, can do nothing more */
549 
550   /* OK, we processed one iMCU row. */
551   cinfo->output_scanline += lines_per_iMCU_row;
552   return lines_per_iMCU_row;
553 }
554 
555 
556 /* Additional entry points for buffered-image mode. */
557 
558 #ifdef D_MULTISCAN_FILES_SUPPORTED
559 
560 /*
561  * Initialize for an output pass in buffered-image mode.
562  */
563 
564 GLOBAL(boolean)
jpeg_start_output(j_decompress_ptr cinfo,int scan_number)565 jpeg_start_output (j_decompress_ptr cinfo, int scan_number)
566 {
567   if (cinfo->global_state != DSTATE_BUFIMAGE &&
568       cinfo->global_state != DSTATE_PRESCAN)
569     ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
570   /* Limit scan number to valid range */
571   if (scan_number <= 0)
572     scan_number = 1;
573   if (cinfo->inputctl->eoi_reached &&
574       scan_number > cinfo->input_scan_number)
575     scan_number = cinfo->input_scan_number;
576   cinfo->output_scan_number = scan_number;
577   /* Perform any dummy output passes, and set up for the real pass */
578   return output_pass_setup(cinfo);
579 }
580 
581 
582 /*
583  * Finish up after an output pass in buffered-image mode.
584  *
585  * Returns FALSE if suspended.  The return value need be inspected only if
586  * a suspending data source is used.
587  */
588 
589 GLOBAL(boolean)
jpeg_finish_output(j_decompress_ptr cinfo)590 jpeg_finish_output (j_decompress_ptr cinfo)
591 {
592   if ((cinfo->global_state == DSTATE_SCANNING ||
593        cinfo->global_state == DSTATE_RAW_OK) && cinfo->buffered_image) {
594     /* Terminate this pass. */
595     /* We do not require the whole pass to have been completed. */
596     (*cinfo->master->finish_output_pass) (cinfo);
597     cinfo->global_state = DSTATE_BUFPOST;
598   } else if (cinfo->global_state != DSTATE_BUFPOST) {
599     /* BUFPOST = repeat call after a suspension, anything else is error */
600     ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
601   }
602   /* Read markers looking for SOS or EOI */
603   while (cinfo->input_scan_number <= cinfo->output_scan_number &&
604          ! cinfo->inputctl->eoi_reached) {
605     if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
606       return FALSE;             /* Suspend, come back later */
607   }
608   cinfo->global_state = DSTATE_BUFIMAGE;
609   return TRUE;
610 }
611 
612 #endif /* D_MULTISCAN_FILES_SUPPORTED */
613