diff options
Diffstat (limited to 'jdmaster.c')
-rw-r--r-- | jdmaster.c | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/jdmaster.c b/jdmaster.c new file mode 100644 index 0000000..5693882 --- /dev/null +++ b/jdmaster.c @@ -0,0 +1,180 @@ +/* + * 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? */ +} |