vrshoot
diff libs/libjpeg/jdtrans.c @ 0:b2f14e535253
initial commit
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Sat, 01 Feb 2014 19:58:19 +0200 |
parents | |
children |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/libs/libjpeg/jdtrans.c Sat Feb 01 19:58:19 2014 +0200 1.3 @@ -0,0 +1,143 @@ 1.4 +/* 1.5 + * jdtrans.c 1.6 + * 1.7 + * Copyright (C) 1995-1997, Thomas G. Lane. 1.8 + * This file is part of the Independent JPEG Group's software. 1.9 + * For conditions of distribution and use, see the accompanying README file. 1.10 + * 1.11 + * This file contains library routines for transcoding decompression, 1.12 + * that is, reading raw DCT coefficient arrays from an input JPEG file. 1.13 + * The routines in jdapimin.c will also be needed by a transcoder. 1.14 + */ 1.15 + 1.16 +#define JPEG_INTERNALS 1.17 +#include "jinclude.h" 1.18 +#include "jpeglib.h" 1.19 + 1.20 + 1.21 +/* Forward declarations */ 1.22 +LOCAL(void) transdecode_master_selection JPP((j_decompress_ptr cinfo)); 1.23 + 1.24 + 1.25 +/* 1.26 + * Read the coefficient arrays from a JPEG file. 1.27 + * jpeg_read_header must be completed before calling this. 1.28 + * 1.29 + * The entire image is read into a set of virtual coefficient-block arrays, 1.30 + * one per component. The return value is a pointer to the array of 1.31 + * virtual-array descriptors. These can be manipulated directly via the 1.32 + * JPEG memory manager, or handed off to jpeg_write_coefficients(). 1.33 + * To release the memory occupied by the virtual arrays, call 1.34 + * jpeg_finish_decompress() when done with the data. 1.35 + * 1.36 + * An alternative usage is to simply obtain access to the coefficient arrays 1.37 + * during a buffered-image-mode decompression operation. This is allowed 1.38 + * after any jpeg_finish_output() call. The arrays can be accessed until 1.39 + * jpeg_finish_decompress() is called. (Note that any call to the library 1.40 + * may reposition the arrays, so don't rely on access_virt_barray() results 1.41 + * to stay valid across library calls.) 1.42 + * 1.43 + * Returns NULL if suspended. This case need be checked only if 1.44 + * a suspending data source is used. 1.45 + */ 1.46 + 1.47 +GLOBAL(jvirt_barray_ptr *) 1.48 +jpeg_read_coefficients (j_decompress_ptr cinfo) 1.49 +{ 1.50 + if (cinfo->global_state == DSTATE_READY) { 1.51 + /* First call: initialize active modules */ 1.52 + transdecode_master_selection(cinfo); 1.53 + cinfo->global_state = DSTATE_RDCOEFS; 1.54 + } 1.55 + if (cinfo->global_state == DSTATE_RDCOEFS) { 1.56 + /* Absorb whole file into the coef buffer */ 1.57 + for (;;) { 1.58 + int retcode; 1.59 + /* Call progress monitor hook if present */ 1.60 + if (cinfo->progress != NULL) 1.61 + (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); 1.62 + /* Absorb some more input */ 1.63 + retcode = (*cinfo->inputctl->consume_input) (cinfo); 1.64 + if (retcode == JPEG_SUSPENDED) 1.65 + return NULL; 1.66 + if (retcode == JPEG_REACHED_EOI) 1.67 + break; 1.68 + /* Advance progress counter if appropriate */ 1.69 + if (cinfo->progress != NULL && 1.70 + (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) { 1.71 + if (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) { 1.72 + /* startup underestimated number of scans; ratchet up one scan */ 1.73 + cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows; 1.74 + } 1.75 + } 1.76 + } 1.77 + /* Set state so that jpeg_finish_decompress does the right thing */ 1.78 + cinfo->global_state = DSTATE_STOPPING; 1.79 + } 1.80 + /* At this point we should be in state DSTATE_STOPPING if being used 1.81 + * standalone, or in state DSTATE_BUFIMAGE if being invoked to get access 1.82 + * to the coefficients during a full buffered-image-mode decompression. 1.83 + */ 1.84 + if ((cinfo->global_state == DSTATE_STOPPING || 1.85 + cinfo->global_state == DSTATE_BUFIMAGE) && cinfo->buffered_image) { 1.86 + return cinfo->coef->coef_arrays; 1.87 + } 1.88 + /* Oops, improper usage */ 1.89 + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); 1.90 + return NULL; /* keep compiler happy */ 1.91 +} 1.92 + 1.93 + 1.94 +/* 1.95 + * Master selection of decompression modules for transcoding. 1.96 + * This substitutes for jdmaster.c's initialization of the full decompressor. 1.97 + */ 1.98 + 1.99 +LOCAL(void) 1.100 +transdecode_master_selection (j_decompress_ptr cinfo) 1.101 +{ 1.102 + /* This is effectively a buffered-image operation. */ 1.103 + cinfo->buffered_image = TRUE; 1.104 + 1.105 + /* Entropy decoding: either Huffman or arithmetic coding. */ 1.106 + if (cinfo->arith_code) { 1.107 + ERREXIT(cinfo, JERR_ARITH_NOTIMPL); 1.108 + } else { 1.109 + if (cinfo->progressive_mode) { 1.110 +#ifdef D_PROGRESSIVE_SUPPORTED 1.111 + jinit_phuff_decoder(cinfo); 1.112 +#else 1.113 + ERREXIT(cinfo, JERR_NOT_COMPILED); 1.114 +#endif 1.115 + } else 1.116 + jinit_huff_decoder(cinfo); 1.117 + } 1.118 + 1.119 + /* Always get a full-image coefficient buffer. */ 1.120 + jinit_d_coef_controller(cinfo, TRUE); 1.121 + 1.122 + /* We can now tell the memory manager to allocate virtual arrays. */ 1.123 + (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo); 1.124 + 1.125 + /* Initialize input side of decompressor to consume first scan. */ 1.126 + (*cinfo->inputctl->start_input_pass) (cinfo); 1.127 + 1.128 + /* Initialize progress monitoring. */ 1.129 + if (cinfo->progress != NULL) { 1.130 + int nscans; 1.131 + /* Estimate number of scans to set pass_limit. */ 1.132 + if (cinfo->progressive_mode) { 1.133 + /* Arbitrarily estimate 2 interleaved DC scans + 3 AC scans/component. */ 1.134 + nscans = 2 + 3 * cinfo->num_components; 1.135 + } else if (cinfo->inputctl->has_multiple_scans) { 1.136 + /* For a nonprogressive multiscan file, estimate 1 scan per component. */ 1.137 + nscans = cinfo->num_components; 1.138 + } else { 1.139 + nscans = 1; 1.140 + } 1.141 + cinfo->progress->pass_counter = 0L; 1.142 + cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows * nscans; 1.143 + cinfo->progress->completed_passes = 0; 1.144 + cinfo->progress->total_passes = 1; 1.145 + } 1.146 +}