128 lines
3.9 KiB
C
128 lines
3.9 KiB
C
|
/*
|
||
|
* jcmaster.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 compressor.
|
||
|
* The system-dependent (user interface) code should call jpeg_compress()
|
||
|
* after doing appropriate setup of the compress_info_struct parameter.
|
||
|
*/
|
||
|
|
||
|
#include "jinclude.h"
|
||
|
|
||
|
|
||
|
METHODDEF void
|
||
|
c_per_scan_method_selection (compress_info_ptr cinfo)
|
||
|
/* Central point for per-scan method selection */
|
||
|
{
|
||
|
/* Edge expansion */
|
||
|
jselexpand(cinfo);
|
||
|
/* Subsampling of pixels */
|
||
|
jselsubsample(cinfo);
|
||
|
/* MCU extraction */
|
||
|
jselcmcu(cinfo);
|
||
|
}
|
||
|
|
||
|
|
||
|
LOCAL void
|
||
|
c_initial_method_selection (compress_info_ptr cinfo)
|
||
|
/* Central point for initial method selection */
|
||
|
{
|
||
|
/* Input image reading method selection is already done. */
|
||
|
/* So is output file header formatting (both are done by user interface). */
|
||
|
|
||
|
/* Gamma and color space conversion */
|
||
|
jselccolor(cinfo);
|
||
|
/* Entropy encoding: either Huffman or arithmetic coding. */
|
||
|
#ifdef ARITH_CODING_SUPPORTED
|
||
|
jselcarithmetic(cinfo);
|
||
|
#else
|
||
|
cinfo->arith_code = FALSE; /* force Huffman mode */
|
||
|
#endif
|
||
|
jselchuffman(cinfo);
|
||
|
/* Pipeline control */
|
||
|
jselcpipeline(cinfo);
|
||
|
/* Overall control (that's me!) */
|
||
|
cinfo->methods->c_per_scan_method_selection = c_per_scan_method_selection;
|
||
|
}
|
||
|
|
||
|
|
||
|
LOCAL void
|
||
|
initial_setup (compress_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 compressor.
|
||
|
*/
|
||
|
|
||
|
|
||
|
GLOBAL void
|
||
|
jpeg_compress (compress_info_ptr cinfo)
|
||
|
{
|
||
|
/* Read the input file header: determine image size & component count.
|
||
|
* NOTE: the user interface must have initialized the input_init method
|
||
|
* pointer (eg, by calling jselrppm) before calling me.
|
||
|
* The other file reading methods (get_input_row etc.) were probably
|
||
|
* set at the same time, but could be set up by input_init itself,
|
||
|
* or by c_ui_method_selection.
|
||
|
*/
|
||
|
(*cinfo->methods->input_init) (cinfo);
|
||
|
|
||
|
/* Give UI a chance to adjust compression parameters and select */
|
||
|
/* output file format based on results of input_init. */
|
||
|
(*cinfo->methods->c_ui_method_selection) (cinfo);
|
||
|
|
||
|
/* Now select methods for compression steps. */
|
||
|
initial_setup(cinfo);
|
||
|
c_initial_method_selection(cinfo);
|
||
|
|
||
|
/* Initialize the output file & other modules as needed */
|
||
|
/* (entropy_encoder is inited by pipeline controller) */
|
||
|
|
||
|
(*cinfo->methods->colorin_init) (cinfo);
|
||
|
(*cinfo->methods->write_file_header) (cinfo);
|
||
|
|
||
|
/* And let the pipeline controller do the rest. */
|
||
|
(*cinfo->methods->c_pipeline_controller) (cinfo);
|
||
|
|
||
|
/* Finish output file, release working storage, etc */
|
||
|
(*cinfo->methods->write_file_trailer) (cinfo);
|
||
|
(*cinfo->methods->colorin_term) (cinfo);
|
||
|
(*cinfo->methods->input_term) (cinfo);
|
||
|
|
||
|
/* My, that was easy, wasn't it? */
|
||
|
}
|