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