19f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
29f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * jdtrans.c
39f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
49f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Copyright (C) 1995-1997, Thomas G. Lane.
59f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This file is part of the Independent JPEG Group's software.
69f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * For conditions of distribution and use, see the accompanying README file.
79f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
89f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This file contains library routines for transcoding decompression,
99f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * that is, reading raw DCT coefficient arrays from an input JPEG file.
109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * The routines in jdapimin.c will also be needed by a transcoder.
119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define JPEG_INTERNALS
149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include "jinclude.h"
159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include "jpeglib.h"
169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Forward declarations */
19f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph WenLOCAL(void) transdecode_master_selection JPP((j_decompress_ptr cinfo));
209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Read the coefficient arrays from a JPEG file.
249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * jpeg_read_header must be completed before calling this.
259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * The entire image is read into a set of virtual coefficient-block arrays,
279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * one per component.  The return value is a pointer to the array of
289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * virtual-array descriptors.  These can be manipulated directly via the
299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * JPEG memory manager, or handed off to jpeg_write_coefficients().
309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * To release the memory occupied by the virtual arrays, call
319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * jpeg_finish_decompress() when done with the data.
329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * An alternative usage is to simply obtain access to the coefficient arrays
349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * during a buffered-image-mode decompression operation.  This is allowed
359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * after any jpeg_finish_output() call.  The arrays can be accessed until
369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * jpeg_finish_decompress() is called.  (Note that any call to the library
379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * may reposition the arrays, so don't rely on access_virt_barray() results
389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * to stay valid across library calls.)
399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Returns NULL if suspended.  This case need be checked only if
419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * a suspending data source is used.
429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(jvirt_barray_ptr *)
459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjpeg_read_coefficients (j_decompress_ptr cinfo)
469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (cinfo->global_state == DSTATE_READY) {
489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* First call: initialize active modules */
49f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen    transdecode_master_selection(cinfo);
509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    cinfo->global_state = DSTATE_RDCOEFS;
519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (cinfo->global_state == DSTATE_RDCOEFS) {
539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Absorb whole file into the coef buffer */
549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    for (;;) {
559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      int retcode;
569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* Call progress monitor hook if present */
579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      if (cinfo->progress != NULL)
583147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen        (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* Absorb some more input */
609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      retcode = (*cinfo->inputctl->consume_input) (cinfo);
619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      if (retcode == JPEG_SUSPENDED)
623147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen        return NULL;
639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      if (retcode == JPEG_REACHED_EOI)
643147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen        break;
659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* Advance progress counter if appropriate */
669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      if (cinfo->progress != NULL &&
679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	  (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) {
683147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen        if (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) {
699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	  /* startup underestimated number of scans; ratchet up one scan */
703147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen        cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows;
713147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen        }
729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      }
739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Set state so that jpeg_finish_decompress does the right thing */
759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    cinfo->global_state = DSTATE_STOPPING;
769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* At this point we should be in state DSTATE_STOPPING if being used
789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * standalone, or in state DSTATE_BUFIMAGE if being invoked to get access
799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * to the coefficients during a full buffered-image-mode decompression.
809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   */
819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if ((cinfo->global_state == DSTATE_STOPPING ||
829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project       cinfo->global_state == DSTATE_BUFIMAGE) && cinfo->buffered_image) {
839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    return cinfo->coef->coef_arrays;
849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Oops, improper usage */
869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  return NULL;			/* keep compiler happy */
889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
90f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph WenLOCAL(boolean)
91f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wenjpeg_build_huffman_index_progressive(j_decompress_ptr cinfo,
92f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen        huffman_index *index)
93f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen{
94f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen  if (cinfo->global_state == DSTATE_READY) {
95f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen    printf("Progressive Mode\n");
96f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen    /* First call: initialize active modules */
97f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen    transdecode_master_selection(cinfo);
98f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen    cinfo->global_state = DSTATE_RDCOEFS;
99f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen  }
100f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen  if (cinfo->global_state == DSTATE_RDCOEFS) {
101f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen    int mcu, i;
102f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen    cinfo->marker->get_sos_marker_position(cinfo, index);
103f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen
104f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen    /* Absorb whole file into the coef buffer */
105f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen    for (mcu = 0; mcu < cinfo->total_iMCU_rows; mcu++) {
106f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen      int retcode = 0;
107f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen      /* Call progress monitor hook if present */
108f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen      if (cinfo->progress != NULL)
109f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen        (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
110f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen      /* Absorb some more input */
111f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen      jinit_phuff_decoder(cinfo);
112f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen      for (i = 0; i < index->scan_count; i++) {
113f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen        (*cinfo->inputctl->finish_input_pass) (cinfo);
114f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen        jset_input_stream_position(cinfo, index->scan[i].bitstream_offset);
115f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen        cinfo->unread_marker = 0;
116f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen        retcode = (*cinfo->inputctl->consume_input_build_huffman_index)
117f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen                    (cinfo, index, i);
118f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen        if (retcode == JPEG_REACHED_EOI)
119f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen          break;
120f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen        cinfo->input_iMCU_row = mcu;
121f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen        if (mcu != 0)
122f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen          (*cinfo->entropy->configure_huffman_decoder)
123f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen                (cinfo, index->scan[i].prev_MCU_offset);
124f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen        cinfo->input_scan_number = i;
125f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen        retcode = (*cinfo->inputctl->consume_input_build_huffman_index)
126f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen                    (cinfo, index, i);
127f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen      }
128f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen      if (retcode == JPEG_SUSPENDED)
129f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen        return FALSE;
130f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen      if (retcode == JPEG_REACHED_EOI)
131f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen        break;
132f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen      /* Advance progress counter if appropriate */
133f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen      if (cinfo->progress != NULL &&
134f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen	  (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) {
135f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen        if (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) {
136f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen	  /* startup underestimated number of scans; ratchet up one scan */
137f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen          cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows;
138f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen        }
139f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen      }
140f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen    }
141f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen    cinfo->global_state = DSTATE_STOPPING;
142f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen  }
143f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen  /* At this point we should be in state DSTATE_STOPPING if being used
144f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen   * standalone, or in state DSTATE_BUFIMAGE if being invoked to get access
145f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen   * to the coefficients during a full buffered-image-mode decompression.
146f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen   */
147f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen  if ((cinfo->global_state == DSTATE_STOPPING ||
148f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen       cinfo->global_state == DSTATE_BUFIMAGE) && cinfo->buffered_image) {
149f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen    return TRUE;
150f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen  }
151f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen  /* Oops, improper usage */
152f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen  ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
153f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen  return FALSE;			/* keep compiler happy */
154f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen}
155f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen
156f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph WenLOCAL(boolean)
157f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wenjpeg_build_huffman_index_baseline(j_decompress_ptr cinfo, huffman_index *index)
1583147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen{
1593147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen  if (cinfo->global_state == DSTATE_READY) {
160f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen    printf("Baseline Mode\n");
1613147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen    /* First call: initialize active modules */
162f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen    transdecode_master_selection(cinfo);
1633147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen    cinfo->global_state = DSTATE_RDCOEFS;
1643147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen  }
1653147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen  if (cinfo->global_state == DSTATE_RDCOEFS) {
1663147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen    /* Absorb whole file into the coef buffer */
1673147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen    for (;;) {
1683147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen      int retcode;
1693147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen      /* Call progress monitor hook if present */
1703147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen      if (cinfo->progress != NULL)
1713147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen        (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
1723147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen      /* Absorb some more input */
173f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen      retcode = (*cinfo->inputctl->consume_input_build_huffman_index)
174f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen                    (cinfo, index, 0);
1753147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen      if (retcode == JPEG_SUSPENDED)
1763147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen        return FALSE;
1773147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen      if (retcode == JPEG_REACHED_EOI)
1783147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen        break;
1793147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen      if (retcode == JPEG_SCAN_COMPLETED)
1803147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen        break;
1813147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen
1823147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen      /* Advance progress counter if appropriate */
1833147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen      if (cinfo->progress != NULL &&
1843147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen	  (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) {
1853147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen        if (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) {
1863147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen	  /* startup underestimated number of scans; ratchet up one scan */
1873147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen        cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows;
1883147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen        }
1893147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen      }
1903147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen    }
1913147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen    /* Set state so that jpeg_finish_decompress does the right thing */
1923147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen    cinfo->global_state = DSTATE_STOPPING;
1933147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen  }
1943147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen  /* At this point we should be in state DSTATE_STOPPING if being used
1953147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen   * standalone, or in state DSTATE_BUFIMAGE if being invoked to get access
1963147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen   * to the coefficients during a full buffered-image-mode decompression.
1973147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen   */
1983147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen  if ((cinfo->global_state == DSTATE_STOPPING ||
1993147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen       cinfo->global_state == DSTATE_BUFIMAGE) && cinfo->buffered_image) {
2003147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen    return TRUE;
2013147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen  }
2023147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen  /* Oops, improper usage */
2033147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen  ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
2043147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen  return FALSE;			/* keep compiler happy */
2053147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen}
2063147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen
207f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph WenGLOBAL(boolean)
208f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wenjpeg_build_huffman_index(j_decompress_ptr cinfo, huffman_index *index)
209f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen{
210f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen    cinfo->tile_decode = TRUE;
211f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen    if (cinfo->progressive_mode)
212f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen      return jpeg_build_huffman_index_progressive(cinfo, index);
213f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen    else
214f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen      return jpeg_build_huffman_index_baseline(cinfo, index);
215f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen}
2169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
2189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Master selection of decompression modules for transcoding.
2199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This substitutes for jdmaster.c's initialization of the full decompressor.
2209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
2219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(void)
223f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wentransdecode_master_selection (j_decompress_ptr cinfo)
2249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
2259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* This is effectively a buffered-image operation. */
2269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  cinfo->buffered_image = TRUE;
2279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Entropy decoding: either Huffman or arithmetic coding. */
2299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (cinfo->arith_code) {
2309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
2319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  } else {
2329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (cinfo->progressive_mode) {
2339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef D_PROGRESSIVE_SUPPORTED
2349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      jinit_phuff_decoder(cinfo);
2359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#else
2369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      ERREXIT(cinfo, JERR_NOT_COMPILED);
2379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif
2383147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen    } else {
2399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      jinit_huff_decoder(cinfo);
2403147fbe7688fc353e6ae03825a37cf101a4ee01dJoseph Wen    }
2419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
2429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Always get a full-image coefficient buffer. */
244f5b94eebe742df1a9bb3941fc0a0ec0137e936efJoseph Wen  jinit_d_coef_controller(cinfo, TRUE);
2459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* We can now tell the memory manager to allocate virtual arrays. */
2479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);
2489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Initialize input side of decompressor to consume first scan. */
2509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  (*cinfo->inputctl->start_input_pass) (cinfo);
2519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Initialize progress monitoring. */
2539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (cinfo->progress != NULL) {
2549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    int nscans;
2559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Estimate number of scans to set pass_limit. */
2569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (cinfo->progressive_mode) {
2579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* Arbitrarily estimate 2 interleaved DC scans + 3 AC scans/component. */
2589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      nscans = 2 + 3 * cinfo->num_components;
2599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    } else if (cinfo->inputctl->has_multiple_scans) {
2609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* For a nonprogressive multiscan file, estimate 1 scan per component. */
2619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      nscans = cinfo->num_components;
2629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    } else {
2639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      nscans = 1;
2649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
2659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    cinfo->progress->pass_counter = 0L;
2669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows * nscans;
2679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    cinfo->progress->completed_passes = 0;
2689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    cinfo->progress->total_passes = 1;
2699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
2709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
271