4  * Copyright (C) 1995-1997, Thomas G. Lane. 
   5  * This file is part of the Independent JPEG Group's software. 
   6  * For conditions of distribution and use, see the accompanying README file. 
   8  * This file contains library routines for transcoding decompression, 
   9  * that is, reading raw DCT coefficient arrays from an input JPEG file. 
  10  * The routines in jdapimin.c will also be needed by a transcoder. 
  13 #define JPEG_INTERNALS 
  18 /* Forward declarations */ 
  19 LOCAL(void) transdecode_master_selection 
JPP((j_decompress_ptr cinfo
)); 
  23  * Read the coefficient arrays from a JPEG file. 
  24  * jpeg_read_header must be completed before calling this. 
  26  * The entire image is read into a set of virtual coefficient-block arrays, 
  27  * one per component.  The return value is a pointer to the array of 
  28  * virtual-array descriptors.  These can be manipulated directly via the 
  29  * JPEG memory manager, or handed off to jpeg_write_coefficients(). 
  30  * To release the memory occupied by the virtual arrays, call 
  31  * jpeg_finish_decompress() when done with the data. 
  33  * An alternative usage is to simply obtain access to the coefficient arrays 
  34  * during a buffered-image-mode decompression operation.  This is allowed 
  35  * after any jpeg_finish_output() call.  The arrays can be accessed until 
  36  * jpeg_finish_decompress() is called.  (Note that any call to the library 
  37  * may reposition the arrays, so don't rely on access_virt_barray() results 
  38  * to stay valid across library calls.) 
  40  * Returns NULL if suspended.  This case need be checked only if 
  41  * a suspending data source is used. 
  44 GLOBAL(jvirt_barray_ptr 
*) 
  45 jpeg_read_coefficients (j_decompress_ptr cinfo
) 
  47   if (cinfo
->global_state 
== DSTATE_READY
) { 
  48     /* First call: initialize active modules */ 
  49     transdecode_master_selection(cinfo
); 
  50     cinfo
->global_state 
= DSTATE_RDCOEFS
; 
  52   if (cinfo
->global_state 
== DSTATE_RDCOEFS
) { 
  53     /* Absorb whole file into the coef buffer */ 
  56       /* Call progress monitor hook if present */ 
  57       if (cinfo
->progress 
!= NULL
) 
  58         (*cinfo
->progress
->progress_monitor
) ((j_common_ptr
) cinfo
); 
  59       /* Absorb some more input */ 
  60       retcode 
= (*cinfo
->inputctl
->consume_input
) (cinfo
); 
  61       if (retcode 
== JPEG_SUSPENDED
) 
  63       if (retcode 
== JPEG_REACHED_EOI
) 
  65       /* Advance progress counter if appropriate */ 
  66       if (cinfo
->progress 
!= NULL 
&& 
  67           (retcode 
== JPEG_ROW_COMPLETED 
|| retcode 
== JPEG_REACHED_SOS
)) { 
  68         if (++cinfo
->progress
->pass_counter 
>= cinfo
->progress
->pass_limit
) { 
  69           /* startup underestimated number of scans; ratchet up one scan */ 
  70           cinfo
->progress
->pass_limit 
+= (long) cinfo
->total_iMCU_rows
; 
  74     /* Set state so that jpeg_finish_decompress does the right thing */ 
  75     cinfo
->global_state 
= DSTATE_STOPPING
; 
  77   /* At this point we should be in state DSTATE_STOPPING if being used 
  78    * standalone, or in state DSTATE_BUFIMAGE if being invoked to get access 
  79    * to the coefficients during a full buffered-image-mode decompression. 
  81   if ((cinfo
->global_state 
== DSTATE_STOPPING 
|| 
  82        cinfo
->global_state 
== DSTATE_BUFIMAGE
) && cinfo
->buffered_image
) { 
  83     return cinfo
->coef
->coef_arrays
; 
  85   /* Oops, improper usage */ 
  86   ERREXIT1(cinfo
, JERR_BAD_STATE
, cinfo
->global_state
); 
  87   return NULL
;                  /* keep compiler happy */ 
  92  * Master selection of decompression modules for transcoding. 
  93  * This substitutes for jdmaster.c's initialization of the full decompressor. 
  97 transdecode_master_selection (j_decompress_ptr cinfo
) 
  99   /* This is effectively a buffered-image operation. */ 
 100   cinfo
->buffered_image 
= TRUE
; 
 102   /* Entropy decoding: either Huffman or arithmetic coding. */ 
 103   if (cinfo
->arith_code
) { 
 104     ERREXIT(cinfo
, JERR_ARITH_NOTIMPL
); 
 106     if (cinfo
->progressive_mode
) { 
 107 #ifdef D_PROGRESSIVE_SUPPORTED 
 108       jinit_phuff_decoder(cinfo
); 
 110       ERREXIT(cinfo
, JERR_NOT_COMPILED
); 
 113       jinit_huff_decoder(cinfo
); 
 116   /* Always get a full-image coefficient buffer. */ 
 117   jinit_d_coef_controller(cinfo
, TRUE
); 
 119   /* We can now tell the memory manager to allocate virtual arrays. */ 
 120   (*cinfo
->mem
->realize_virt_arrays
) ((j_common_ptr
) cinfo
); 
 122   /* Initialize input side of decompressor to consume first scan. */ 
 123   (*cinfo
->inputctl
->start_input_pass
) (cinfo
); 
 124   /* Initialize progress monitoring. */ 
 125   if (cinfo
->progress 
!= NULL
) { 
 127     /* Estimate number of scans to set pass_limit. */ 
 128     if (cinfo
->progressive_mode
) { 
 129       /* Arbitrarily estimate 2 interleaved DC scans + 3 AC scans/component. */ 
 130       nscans 
= 2 + 3 * cinfo
->num_components
; 
 131     } else if (cinfo
->inputctl
->has_multiple_scans
) { 
 132       /* For a nonprogressive multiscan file, estimate 1 scan per component. */ 
 133       nscans 
= cinfo
->num_components
; 
 137     cinfo
->progress
->pass_counter 
= 0L; 
 138     cinfo
->progress
->pass_limit 
= (long) cinfo
->total_iMCU_rows 
* nscans
; 
 139     cinfo
->progress
->completed_passes 
= 0; 
 140     cinfo
->progress
->total_passes 
= 1;