170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * jdtrans.c
370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *
470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Copyright (C) 1995-1997, Thomas G. Lane.
570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This file is part of the Independent JPEG Group's software.
670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * For conditions of distribution and use, see the accompanying README file.
770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *
870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This file contains library routines for transcoding decompression,
970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * that is, reading raw DCT coefficient arrays from an input JPEG file.
1070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * The routines in jdapimin.c will also be needed by a transcoder.
1170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
1270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
1370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define JPEG_INTERNALS
1470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#include "jinclude.h"
1570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#include "jpeglib.h"
1670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
1770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
1870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Forward declarations */
1970a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineLOCAL(void) transdecode_master_selection JPP((j_decompress_ptr cinfo));
2070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
2170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
2270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
2370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Read the coefficient arrays from a JPEG file.
2470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * jpeg_read_header must be completed before calling this.
2570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *
2670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * The entire image is read into a set of virtual coefficient-block arrays,
2770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * one per component.  The return value is a pointer to the array of
2870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * virtual-array descriptors.  These can be manipulated directly via the
2970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * JPEG memory manager, or handed off to jpeg_write_coefficients().
3070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * To release the memory occupied by the virtual arrays, call
3170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * jpeg_finish_decompress() when done with the data.
3270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *
3370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * An alternative usage is to simply obtain access to the coefficient arrays
3470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * during a buffered-image-mode decompression operation.  This is allowed
3570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * after any jpeg_finish_output() call.  The arrays can be accessed until
3670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * jpeg_finish_decompress() is called.  (Note that any call to the library
3770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * may reposition the arrays, so don't rely on access_virt_barray() results
3870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * to stay valid across library calls.)
3970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *
4070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Returns NULL if suspended.  This case need be checked only if
4170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * a suspending data source is used.
4270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
4370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
4470a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineGLOBAL(jvirt_barray_ptr *)
4570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinejpeg_read_coefficients (j_decompress_ptr cinfo)
4670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
4770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if (cinfo->global_state == DSTATE_READY) {
4870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* First call: initialize active modules */
4970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    transdecode_master_selection(cinfo);
5070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    cinfo->global_state = DSTATE_RDCOEFS;
5170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
5270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if (cinfo->global_state == DSTATE_RDCOEFS) {
5370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* Absorb whole file into the coef buffer */
5470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    for (;;) {
5570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      int retcode;
5670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* Call progress monitor hook if present */
5770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      if (cinfo->progress != NULL)
5870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
5970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* Absorb some more input */
6070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      retcode = (*cinfo->inputctl->consume_input) (cinfo);
6170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      if (retcode == JPEG_SUSPENDED)
6270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        return NULL;
6370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      if (retcode == JPEG_REACHED_EOI)
6470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        break;
6570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* Advance progress counter if appropriate */
6670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      if (cinfo->progress != NULL &&
6770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	  (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) {
6870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        if (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) {
6970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	  /* startup underestimated number of scans; ratchet up one scan */
7070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows;
7170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        }
7270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      }
7370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
7470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* Set state so that jpeg_finish_decompress does the right thing */
7570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    cinfo->global_state = DSTATE_STOPPING;
7670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
7770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* At this point we should be in state DSTATE_STOPPING if being used
7870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine   * standalone, or in state DSTATE_BUFIMAGE if being invoked to get access
7970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine   * to the coefficients during a full buffered-image-mode decompression.
8070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine   */
8170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if ((cinfo->global_state == DSTATE_STOPPING ||
8270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine       cinfo->global_state == DSTATE_BUFIMAGE) && cinfo->buffered_image) {
8370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    return cinfo->coef->coef_arrays;
8470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
8570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Oops, improper usage */
8670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
8770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  return NULL;			/* keep compiler happy */
8870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
8970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
9070a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineLOCAL(boolean)
9170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinejpeg_build_huffman_index_progressive(j_decompress_ptr cinfo,
9270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        huffman_index *index)
9370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
9470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if (cinfo->global_state == DSTATE_READY) {
9570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    printf("Progressive Mode\n");
9670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* First call: initialize active modules */
9770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    transdecode_master_selection(cinfo);
9870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    cinfo->global_state = DSTATE_RDCOEFS;
9970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
10070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if (cinfo->global_state == DSTATE_RDCOEFS) {
10170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    int mcu, i;
10270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    cinfo->marker->get_sos_marker_position(cinfo, index);
10370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
10470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* Absorb whole file into the coef buffer */
10570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    for (mcu = 0; mcu < cinfo->total_iMCU_rows; mcu++) {
10670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      int retcode = 0;
10770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* Call progress monitor hook if present */
10870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      if (cinfo->progress != NULL)
10970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
11070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* Absorb some more input */
11170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      jinit_phuff_decoder(cinfo);
11270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      for (i = 0; i < index->scan_count; i++) {
11370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        (*cinfo->inputctl->finish_input_pass) (cinfo);
11470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        jset_input_stream_position(cinfo, index->scan[i].bitstream_offset);
11570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        cinfo->unread_marker = 0;
11670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        retcode = (*cinfo->inputctl->consume_input_build_huffman_index)
11770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine                    (cinfo, index, i);
11870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        if (retcode == JPEG_REACHED_EOI)
11970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine          break;
12070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        cinfo->input_iMCU_row = mcu;
12170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        if (mcu != 0)
12270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine          (*cinfo->entropy->configure_huffman_decoder)
12370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine                (cinfo, index->scan[i].prev_MCU_offset);
12470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        cinfo->input_scan_number = i;
12570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        retcode = (*cinfo->inputctl->consume_input_build_huffman_index)
12670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine                    (cinfo, index, i);
12770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      }
12870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      if (retcode == JPEG_SUSPENDED)
12970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        return FALSE;
13070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      if (retcode == JPEG_REACHED_EOI)
13170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        break;
13270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* Advance progress counter if appropriate */
13370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      if (cinfo->progress != NULL &&
13470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	  (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) {
13570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        if (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) {
13670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	  /* startup underestimated number of scans; ratchet up one scan */
13770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine          cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows;
13870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        }
13970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      }
14070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
14170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    cinfo->global_state = DSTATE_STOPPING;
14270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
14370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* At this point we should be in state DSTATE_STOPPING if being used
14470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine   * standalone, or in state DSTATE_BUFIMAGE if being invoked to get access
14570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine   * to the coefficients during a full buffered-image-mode decompression.
14670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine   */
14770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if ((cinfo->global_state == DSTATE_STOPPING ||
14870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine       cinfo->global_state == DSTATE_BUFIMAGE) && cinfo->buffered_image) {
14970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    return TRUE;
15070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
15170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Oops, improper usage */
15270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
15370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  return FALSE;			/* keep compiler happy */
15470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
15570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
15670a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineLOCAL(boolean)
15770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinejpeg_build_huffman_index_baseline(j_decompress_ptr cinfo, huffman_index *index)
15870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
15970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if (cinfo->global_state == DSTATE_READY) {
16070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    printf("Baseline Mode\n");
16170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* First call: initialize active modules */
16270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    transdecode_master_selection(cinfo);
16370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    cinfo->global_state = DSTATE_RDCOEFS;
16470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
16570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if (cinfo->global_state == DSTATE_RDCOEFS) {
16670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* Absorb whole file into the coef buffer */
16770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    for (;;) {
16870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      int retcode;
16970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* Call progress monitor hook if present */
17070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      if (cinfo->progress != NULL)
17170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
17270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* Absorb some more input */
17370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      retcode = (*cinfo->inputctl->consume_input_build_huffman_index)
17470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine                    (cinfo, index, 0);
17570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      if (retcode == JPEG_SUSPENDED)
17670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        return FALSE;
17770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      if (retcode == JPEG_REACHED_EOI)
17870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        break;
17970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      if (retcode == JPEG_SCAN_COMPLETED)
18070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        break;
18170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
18270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* Advance progress counter if appropriate */
18370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      if (cinfo->progress != NULL &&
18470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	  (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) {
18570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        if (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) {
18670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	  /* startup underestimated number of scans; ratchet up one scan */
18770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows;
18870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine        }
18970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      }
19070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
19170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* Set state so that jpeg_finish_decompress does the right thing */
19270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    cinfo->global_state = DSTATE_STOPPING;
19370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
19470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* At this point we should be in state DSTATE_STOPPING if being used
19570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine   * standalone, or in state DSTATE_BUFIMAGE if being invoked to get access
19670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine   * to the coefficients during a full buffered-image-mode decompression.
19770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine   */
19870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if ((cinfo->global_state == DSTATE_STOPPING ||
19970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine       cinfo->global_state == DSTATE_BUFIMAGE) && cinfo->buffered_image) {
20070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    return TRUE;
20170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
20270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Oops, improper usage */
20370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
20470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  return FALSE;			/* keep compiler happy */
20570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
20670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
20770a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineGLOBAL(boolean)
20870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinejpeg_build_huffman_index(j_decompress_ptr cinfo, huffman_index *index)
20970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
21070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    cinfo->tile_decode = TRUE;
21170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (cinfo->progressive_mode)
21270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      return jpeg_build_huffman_index_progressive(cinfo, index);
21370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    else
21470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      return jpeg_build_huffman_index_baseline(cinfo, index);
21570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
21670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
21770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
21870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Master selection of decompression modules for transcoding.
21970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This substitutes for jdmaster.c's initialization of the full decompressor.
22070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
22170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
22270a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineLOCAL(void)
22370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinetransdecode_master_selection (j_decompress_ptr cinfo)
22470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
22570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* This is effectively a buffered-image operation. */
22670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  cinfo->buffered_image = TRUE;
22770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
22870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Entropy decoding: either Huffman or arithmetic coding. */
22970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if (cinfo->arith_code) {
23070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
23170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  } else {
23270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (cinfo->progressive_mode) {
23370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef D_PROGRESSIVE_SUPPORTED
23470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      jinit_phuff_decoder(cinfo);
23570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#else
23670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      ERREXIT(cinfo, JERR_NOT_COMPILED);
23770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif
23870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    } else {
23970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      jinit_huff_decoder(cinfo);
24070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
24170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
24270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
24370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Always get a full-image coefficient buffer. */
24470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  jinit_d_coef_controller(cinfo, TRUE);
24570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
24670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* We can now tell the memory manager to allocate virtual arrays. */
24770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);
24870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
24970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Initialize input side of decompressor to consume first scan. */
25070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  (*cinfo->inputctl->start_input_pass) (cinfo);
25170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
25270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* Initialize progress monitoring. */
25370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  if (cinfo->progress != NULL) {
25470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    int nscans;
25570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* Estimate number of scans to set pass_limit. */
25670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (cinfo->progressive_mode) {
25770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* Arbitrarily estimate 2 interleaved DC scans + 3 AC scans/component. */
25870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      nscans = 2 + 3 * cinfo->num_components;
25970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    } else if (cinfo->inputctl->has_multiple_scans) {
26070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      /* For a nonprogressive multiscan file, estimate 1 scan per component. */
26170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      nscans = cinfo->num_components;
26270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    } else {
26370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      nscans = 1;
26470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
26570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    cinfo->progress->pass_counter = 0L;
26670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows * nscans;
26770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    cinfo->progress->completed_passes = 0;
26870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    cinfo->progress->total_passes = 1;
26970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
27070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
271