1f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 2f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * jdapistd.c 3f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 43395bcc26e390d2960d15020d4a4d27ae0c122fenoel@chromium.org * This file was part of the Independent JPEG Group's software: 5f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Copyright (C) 1994-1996, Thomas G. Lane. 63395bcc26e390d2960d15020d4a4d27ae0c122fenoel@chromium.org * libjpeg-turbo Modifications: 79862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * Copyright (C) 2010, D. R. Commander. 8f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * For conditions of distribution and use, see the accompanying README file. 9f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 10f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * This file contains application interface code for the decompression half 11f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * of the JPEG library. These are the "standard" API routines that are 12f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * used in the normal full-decompression case. They are not used by a 13f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * transcoding-only application. Note that if an application links in 14f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * jpeg_start_decompress, it will end up linking in the entire decompressor. 15f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * We thus must separate this file from jdapimin.c to avoid linking the 16f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * whole decompression library into a transcoder. 17f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 18f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 19f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#define JPEG_INTERNALS 20f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#include "jinclude.h" 21f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#include "jpeglib.h" 229862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org#include "jpegcomp.h" 23f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 24f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 25f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Forward declarations */ 26f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgLOCAL(boolean) output_pass_setup JPP((j_decompress_ptr cinfo)); 27f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 28f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 29f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 30f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Decompression initialization. 31f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * jpeg_read_header must be completed before calling this. 32f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 33f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * If a multipass operating mode was selected, this will do all but the 34f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * last pass, and thus may take a great deal of time. 35f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 36f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Returns FALSE if suspended. The return value need be inspected only if 37f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * a suspending data source is used. 38f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 39f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 40f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgGLOBAL(boolean) 41f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgjpeg_start_decompress (j_decompress_ptr cinfo) 42f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 43f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->global_state == DSTATE_READY) { 44f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* First call: initialize master control, select active modules */ 45f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org jinit_master_decompress(cinfo); 46f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->buffered_image) { 47f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* No more work here; expecting jpeg_start_output next */ 48f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->global_state = DSTATE_BUFIMAGE; 49f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return TRUE; 50f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 51f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->global_state = DSTATE_PRELOAD; 52f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 53f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->global_state == DSTATE_PRELOAD) { 54f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* If file has multiple scans, absorb them all into the coef buffer */ 55f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->inputctl->has_multiple_scans) { 56f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#ifdef D_MULTISCAN_FILES_SUPPORTED 57f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (;;) { 58f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int retcode; 59f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Call progress monitor hook if present */ 60f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->progress != NULL) 61f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); 62f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Absorb some more input */ 63f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org retcode = (*cinfo->inputctl->consume_input) (cinfo); 64f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (retcode == JPEG_SUSPENDED) 65f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return FALSE; 66f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (retcode == JPEG_REACHED_EOI) 67f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; 68f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Advance progress counter if appropriate */ 69f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->progress != NULL && 70f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) { 71f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) { 72f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* jdmaster underestimated number of scans; ratchet up one scan */ 73f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows; 74f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 75f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 76f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 77f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#else 78f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT(cinfo, JERR_NOT_COMPILED); 79f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#endif /* D_MULTISCAN_FILES_SUPPORTED */ 80f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 81f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->output_scan_number = cinfo->input_scan_number; 82f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } else if (cinfo->global_state != DSTATE_PRESCAN) 83f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); 84f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Perform any dummy output passes, and set up for the final pass */ 85f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return output_pass_setup(cinfo); 86f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 87f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 88f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 89f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 90f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Set up for an output pass, and perform any dummy pass(es) needed. 91f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Common subroutine for jpeg_start_decompress and jpeg_start_output. 92f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Entry: global_state = DSTATE_PRESCAN only if previously suspended. 93f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Exit: If done, returns TRUE and sets global_state for proper output mode. 94f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * If suspended, returns FALSE and sets global_state = DSTATE_PRESCAN. 95f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 96f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 97f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgLOCAL(boolean) 98f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgoutput_pass_setup (j_decompress_ptr cinfo) 99f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 100f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->global_state != DSTATE_PRESCAN) { 101f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* First call: do pass setup */ 102f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*cinfo->master->prepare_for_output_pass) (cinfo); 103f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->output_scanline = 0; 104f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->global_state = DSTATE_PRESCAN; 105f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 106f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Loop over any required dummy passes */ 107f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org while (cinfo->master->is_dummy_pass) { 108f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#ifdef QUANT_2PASS_SUPPORTED 109f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Crank through the dummy pass */ 110f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org while (cinfo->output_scanline < cinfo->output_height) { 111f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org JDIMENSION last_scanline; 112f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Call progress monitor hook if present */ 113f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->progress != NULL) { 114f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->progress->pass_counter = (long) cinfo->output_scanline; 115f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->progress->pass_limit = (long) cinfo->output_height; 116f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); 117f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 118f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Process some data */ 119f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org last_scanline = cinfo->output_scanline; 120f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*cinfo->main->process_data) (cinfo, (JSAMPARRAY) NULL, 121f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org &cinfo->output_scanline, (JDIMENSION) 0); 122f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->output_scanline == last_scanline) 123f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return FALSE; /* No progress made, must suspend */ 124f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 125f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Finish up dummy pass, and set up for another one */ 126f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*cinfo->master->finish_output_pass) (cinfo); 127f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*cinfo->master->prepare_for_output_pass) (cinfo); 128f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->output_scanline = 0; 129f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#else 130f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT(cinfo, JERR_NOT_COMPILED); 131f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#endif /* QUANT_2PASS_SUPPORTED */ 132f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 133f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Ready for application to drive output pass through 134f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * jpeg_read_scanlines or jpeg_read_raw_data. 135f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 136f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->global_state = cinfo->raw_data_out ? DSTATE_RAW_OK : DSTATE_SCANNING; 137f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return TRUE; 138f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 139f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 140f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 141f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 142f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Read some scanlines of data from the JPEG decompressor. 143f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 144f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * The return value will be the number of lines actually read. 145f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * This may be less than the number requested in several cases, 146f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * including bottom of image, data source suspension, and operating 147f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * modes that emit multiple scanlines at a time. 148f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 149f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Note: we warn about excess calls to jpeg_read_scanlines() since 150f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * this likely signals an application programmer error. However, 151f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * an oversize buffer (max_lines > scanlines remaining) is not an error. 152f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 153f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 154f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgGLOBAL(JDIMENSION) 155f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgjpeg_read_scanlines (j_decompress_ptr cinfo, JSAMPARRAY scanlines, 156f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org JDIMENSION max_lines) 157f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 158f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org JDIMENSION row_ctr; 159f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 160f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->global_state != DSTATE_SCANNING) 161f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); 162f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->output_scanline >= cinfo->output_height) { 163f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org WARNMS(cinfo, JWRN_TOO_MUCH_DATA); 164f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return 0; 165f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 166f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 167f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Call progress monitor hook if present */ 168f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->progress != NULL) { 169f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->progress->pass_counter = (long) cinfo->output_scanline; 170f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->progress->pass_limit = (long) cinfo->output_height; 171f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); 172f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 173f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 174f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Process some data */ 175f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org row_ctr = 0; 176f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*cinfo->main->process_data) (cinfo, scanlines, &row_ctr, max_lines); 177f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->output_scanline += row_ctr; 178f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return row_ctr; 179f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 180f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 181f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 182f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 183f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Alternate entry point to read raw data. 184f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Processes exactly one iMCU row per call, unless suspended. 185f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 186f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 187f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgGLOBAL(JDIMENSION) 188f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgjpeg_read_raw_data (j_decompress_ptr cinfo, JSAMPIMAGE data, 189f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org JDIMENSION max_lines) 190f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 191f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org JDIMENSION lines_per_iMCU_row; 192f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 193f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->global_state != DSTATE_RAW_OK) 194f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); 195f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->output_scanline >= cinfo->output_height) { 196f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org WARNMS(cinfo, JWRN_TOO_MUCH_DATA); 197f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return 0; 198f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 199f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 200f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Call progress monitor hook if present */ 201f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->progress != NULL) { 202f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->progress->pass_counter = (long) cinfo->output_scanline; 203f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->progress->pass_limit = (long) cinfo->output_height; 204f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); 205f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 206f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 207f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Verify that at least one iMCU row can be returned. */ 2089862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org lines_per_iMCU_row = cinfo->max_v_samp_factor * cinfo->_min_DCT_scaled_size; 209f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (max_lines < lines_per_iMCU_row) 210f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT(cinfo, JERR_BUFFER_SIZE); 211f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 212f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Decompress directly into user's buffer. */ 213f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (! (*cinfo->coef->decompress_data) (cinfo, data)) 214f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return 0; /* suspension forced, can do nothing more */ 215f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 216f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* OK, we processed one iMCU row. */ 217f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->output_scanline += lines_per_iMCU_row; 218f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return lines_per_iMCU_row; 219f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 220f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 221f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 222f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Additional entry points for buffered-image mode. */ 223f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 224f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#ifdef D_MULTISCAN_FILES_SUPPORTED 225f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 226f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 227f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Initialize for an output pass in buffered-image mode. 228f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 229f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 230f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgGLOBAL(boolean) 231f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgjpeg_start_output (j_decompress_ptr cinfo, int scan_number) 232f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 233f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->global_state != DSTATE_BUFIMAGE && 234f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->global_state != DSTATE_PRESCAN) 235f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); 236f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Limit scan number to valid range */ 237f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (scan_number <= 0) 238f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scan_number = 1; 239f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->inputctl->eoi_reached && 240f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scan_number > cinfo->input_scan_number) 241f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org scan_number = cinfo->input_scan_number; 242f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->output_scan_number = scan_number; 243f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Perform any dummy output passes, and set up for the real pass */ 244f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return output_pass_setup(cinfo); 245f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 246f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 247f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 248f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 249f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Finish up after an output pass in buffered-image mode. 250f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 251f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Returns FALSE if suspended. The return value need be inspected only if 252f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * a suspending data source is used. 253f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 254f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 255f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgGLOBAL(boolean) 256f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgjpeg_finish_output (j_decompress_ptr cinfo) 257f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 258f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if ((cinfo->global_state == DSTATE_SCANNING || 259f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->global_state == DSTATE_RAW_OK) && cinfo->buffered_image) { 260f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Terminate this pass. */ 261f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* We do not require the whole pass to have been completed. */ 262f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*cinfo->master->finish_output_pass) (cinfo); 263f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->global_state = DSTATE_BUFPOST; 264f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } else if (cinfo->global_state != DSTATE_BUFPOST) { 265f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* BUFPOST = repeat call after a suspension, anything else is error */ 266f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); 267f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 268f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Read markers looking for SOS or EOI */ 269f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org while (cinfo->input_scan_number <= cinfo->output_scan_number && 270f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ! cinfo->inputctl->eoi_reached) { 271f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED) 272f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return FALSE; /* Suspend, come back later */ 273f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 274f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->global_state = DSTATE_BUFIMAGE; 275f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return TRUE; 276f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 277f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 278f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#endif /* D_MULTISCAN_FILES_SUPPORTED */ 279