/* * jdmaster.c * * Copyright (C) 1991, Thomas G. Lane. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * * This file contains the main control for the JPEG decompressor. * The system-dependent (user interface) code should call jpeg_decompress() * after doing appropriate setup of the decompress_info_struct parameter. */ #include "jinclude.h" METHODDEF void d_per_scan_method_selection (decompress_info_ptr cinfo) /* Central point for per-scan method selection */ { /* MCU disassembly */ jseldmcu(cinfo); /* Un-subsampling of pixels */ jselunsubsample(cinfo); } LOCAL void d_initial_method_selection (decompress_info_ptr cinfo) /* Central point for initial method selection (after reading file header) */ { /* JPEG file scanning method selection is already done. */ /* So is output file format selection (both are done by user interface). */ /* Entropy decoding: either Huffman or arithmetic coding. */ #ifdef ARITH_CODING_SUPPORTED jseldarithmetic(cinfo); #else if (cinfo->arith_code) { ERREXIT(cinfo->emethods, "Arithmetic coding not supported"); } #endif jseldhuffman(cinfo); /* Cross-block smoothing */ #ifdef BLOCK_SMOOTHING_SUPPORTED jselbsmooth(cinfo); #else cinfo->do_block_smoothing = FALSE; #endif /* Gamma and color space conversion */ jseldcolor(cinfo); /* Color quantization */ #ifdef QUANT_1PASS_SUPPORTED #ifndef QUANT_2PASS_SUPPORTED cinfo->two_pass_quantize = FALSE; /* only have 1-pass */ #endif #else /* not QUANT_1PASS_SUPPORTED */ #ifdef QUANT_2PASS_SUPPORTED cinfo->two_pass_quantize = TRUE; /* only have 2-pass */ #else /* not QUANT_2PASS_SUPPORTED */ if (cinfo->quantize_colors) { ERREXIT(cinfo->emethods, "Color quantization was not compiled"); } #endif #endif #ifdef QUANT_1PASS_SUPPORTED jsel1quantize(cinfo); #endif #ifdef QUANT_2PASS_SUPPORTED jsel2quantize(cinfo); #endif /* Pipeline control */ jseldpipeline(cinfo); /* Overall control (that's me!) */ cinfo->methods->d_per_scan_method_selection = d_per_scan_method_selection; } LOCAL void initial_setup (decompress_info_ptr cinfo) /* Do computations that are needed before initial method selection */ { short ci; jpeg_component_info *compptr; /* Compute maximum sampling factors; check factor validity */ cinfo->max_h_samp_factor = 1; cinfo->max_v_samp_factor = 1; for (ci = 0; ci < cinfo->num_components; ci++) { compptr = &cinfo->comp_info[ci]; if (compptr->h_samp_factor<=0 || compptr->h_samp_factor>MAX_SAMP_FACTOR || compptr->v_samp_factor<=0 || compptr->v_samp_factor>MAX_SAMP_FACTOR) ERREXIT(cinfo->emethods, "Bogus sampling factors"); cinfo->max_h_samp_factor = MAX(cinfo->max_h_samp_factor, compptr->h_samp_factor); cinfo->max_v_samp_factor = MAX(cinfo->max_v_samp_factor, compptr->v_samp_factor); } /* Compute logical subsampled dimensions of components */ for (ci = 0; ci < cinfo->num_components; ci++) { compptr = &cinfo->comp_info[ci]; compptr->true_comp_width = (cinfo->image_width * compptr->h_samp_factor + cinfo->max_h_samp_factor - 1) / cinfo->max_h_samp_factor; compptr->true_comp_height = (cinfo->image_height * compptr->v_samp_factor + cinfo->max_v_samp_factor - 1) / cinfo->max_v_samp_factor; } } /* * This is the main entry point to the JPEG decompressor. */ GLOBAL void jpeg_decompress (decompress_info_ptr cinfo) { short i; /* Initialize pointers as needed to mark stuff unallocated. */ cinfo->comp_info = NULL; for (i = 0; i < NUM_QUANT_TBLS; i++) cinfo->quant_tbl_ptrs[i] = NULL; for (i = 0; i < NUM_HUFF_TBLS; i++) { cinfo->dc_huff_tbl_ptrs[i] = NULL; cinfo->ac_huff_tbl_ptrs[i] = NULL; } /* Read the JPEG file header markers; everything up through the first SOS * marker is read now. NOTE: the user interface must have initialized the * read_file_header method pointer (eg, by calling jselrjfif or jselrtiff). * The other file reading methods (read_scan_header etc.) were probably * set at the same time, but could be set up by read_file_header itself. */ (*cinfo->methods->read_file_header) (cinfo); if (! ((*cinfo->methods->read_scan_header) (cinfo))) ERREXIT(cinfo->emethods, "Empty JPEG file"); /* Give UI a chance to adjust decompression parameters and select */ /* output file format based on info from file header. */ (*cinfo->methods->d_ui_method_selection) (cinfo); /* Now select methods for decompression steps. */ initial_setup(cinfo); d_initial_method_selection(cinfo); /* Initialize the output file & other modules as needed */ /* (color_quant and entropy_decoder are inited by pipeline controller) */ (*cinfo->methods->output_init) (cinfo); (*cinfo->methods->colorout_init) (cinfo); /* And let the pipeline controller do the rest. */ (*cinfo->methods->d_pipeline_controller) (cinfo); /* Finish output file, release working storage, etc */ (*cinfo->methods->colorout_term) (cinfo); (*cinfo->methods->output_term) (cinfo); (*cinfo->methods->read_file_trailer) (cinfo); /* Release allocated storage for tables */ #define FREE(ptr) if ((ptr) != NULL) \ (*cinfo->emethods->free_small) ((void *) ptr) FREE(cinfo->comp_info); for (i = 0; i < NUM_QUANT_TBLS; i++) FREE(cinfo->quant_tbl_ptrs[i]); for (i = 0; i < NUM_HUFF_TBLS; i++) { FREE(cinfo->dc_huff_tbl_ptrs[i]); FREE(cinfo->ac_huff_tbl_ptrs[i]); } /* My, that was easy, wasn't it? */ }