The Independent JPEG Group's JPEG software v1
This commit is contained in:
180
jdmaster.c
Normal file
180
jdmaster.c
Normal file
@@ -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? */
|
||||
}
|
||||
Reference in New Issue
Block a user