| /* |
| * jcmaster.c |
| * |
| * Copyright (C) 1991, 1992, 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) |
| { |
| /* Init pass counts to 0 --- total_passes is adjusted in method selection */ |
| cinfo->total_passes = 0; |
| cinfo->completed_passes = 0; |
| |
| /* 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); |
| |
| (*cinfo->emethods->free_all) (); |
| |
| /* My, that was easy, wasn't it? */ |
| } |