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