summaryrefslogtreecommitdiff
path: root/jdmaster.c
diff options
context:
space:
mode:
Diffstat (limited to 'jdmaster.c')
-rw-r--r--jdmaster.c180
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? */
+}