JDMASTER.C
上传用户:wep9318
上传日期:2007-01-07
资源大小:893k
文件大小:23k
源码类别:

图片显示

开发平台:

Visual C++

  1. /*
  2.  * jdmaster.c
  3.  *
  4.  * Copyright (C) 1991-1994, Thomas G. Lane.
  5.  * This file is part of the Independent JPEG Group's software.
  6.  * For conditions of distribution and use, see the accompanying README file.
  7.  *
  8.  * This file contains master control logic for the JPEG decompressor.
  9.  * These routines are concerned with selecting the modules to be executed
  10.  * and with determining the number of passes and the work to be done in each
  11.  * pass.
  12.  */
  13. #define JPEG_INTERNALS
  14. #include "jinclude.h"
  15. #include "jpeglib.h"
  16. /* Private state */
  17. typedef enum {
  18. main_pass, /* read and process a single-scan file */
  19. preread_pass, /* read one scan of a multi-scan file */
  20. output_pass, /* primary processing pass for multi-scan */
  21. post_pass /* optional post-pass for 2-pass quant. */
  22. } D_PASS_TYPE;
  23. typedef struct {
  24.   struct jpeg_decomp_master pub; /* public fields */
  25.   boolean using_merged_upsample; /* TRUE if using merged upsample/cconvert */
  26.   D_PASS_TYPE pass_type; /* the type of the current pass */
  27.   int pass_number; /* # of passes completed */
  28.   int total_passes; /* estimated total # of passes needed */
  29.   boolean need_post_pass; /* are we using full two-pass quantization? */
  30. } my_decomp_master;
  31. typedef my_decomp_master * my_master_ptr;
  32. /*
  33.  * Determine whether merged upsample/color conversion should be used.
  34.  * CRUCIAL: this must match the actual capabilities of jdmerge.c!
  35.  */
  36. LOCAL boolean
  37. use_merged_upsample (j_decompress_ptr cinfo)
  38. {
  39. #ifdef UPSAMPLE_MERGING_SUPPORTED
  40.   /* Merging is the equivalent of plain box-filter upsampling */
  41.   if (cinfo->do_fancy_upsampling || cinfo->CCIR601_sampling)
  42.     return FALSE;
  43.   /* jdmerge.c only supports YCC=>RGB color conversion */
  44.   if (cinfo->jpeg_color_space != JCS_YCbCr || cinfo->num_components != 3 ||
  45.       cinfo->out_color_space != JCS_RGB ||
  46.       cinfo->out_color_components != RGB_PIXELSIZE)
  47.     return FALSE;
  48.   /* and it only handles 2h1v or 2h2v sampling ratios */
  49.   if (cinfo->comp_info[0].h_samp_factor != 2 ||
  50.       cinfo->comp_info[1].h_samp_factor != 1 ||
  51.       cinfo->comp_info[2].h_samp_factor != 1 ||
  52.       cinfo->comp_info[0].v_samp_factor >  2 ||
  53.       cinfo->comp_info[1].v_samp_factor != 1 ||
  54.       cinfo->comp_info[2].v_samp_factor != 1)
  55.     return FALSE;
  56.   /* furthermore, it doesn't work if we've scaled the IDCTs differently */
  57.   if (cinfo->comp_info[0].DCT_scaled_size != cinfo->min_DCT_scaled_size ||
  58.       cinfo->comp_info[1].DCT_scaled_size != cinfo->min_DCT_scaled_size ||
  59.       cinfo->comp_info[2].DCT_scaled_size != cinfo->min_DCT_scaled_size)
  60.     return FALSE;
  61.   /* ??? also need to test for upsample-time rescaling, when & if supported */
  62.   /* by golly, it'll work... */
  63.   return TRUE;
  64. #else
  65.   return FALSE;
  66. #endif
  67. }
  68. /*
  69.  * Support routines that do various essential calculations.
  70.  *
  71.  * jpeg_calc_output_dimensions is exported for possible use by application.
  72.  * Hence it mustn't do anything that can't be done twice.
  73.  */
  74. GLOBAL void
  75. jpeg_calc_output_dimensions (j_decompress_ptr cinfo)
  76. /* Do computations that are needed before master selection phase */
  77. {
  78.   int ci;
  79.   jpeg_component_info *compptr;
  80.   /* Compute maximum sampling factors; check factor validity */
  81.   cinfo->max_h_samp_factor = 1;
  82.   cinfo->max_v_samp_factor = 1;
  83.   for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
  84.        ci++, compptr++) {
  85.     if (compptr->h_samp_factor<=0 || compptr->h_samp_factor>MAX_SAMP_FACTOR ||
  86. compptr->v_samp_factor<=0 || compptr->v_samp_factor>MAX_SAMP_FACTOR)
  87.       ERREXIT(cinfo, JERR_BAD_SAMPLING);
  88.     cinfo->max_h_samp_factor = MAX(cinfo->max_h_samp_factor,
  89.    compptr->h_samp_factor);
  90.     cinfo->max_v_samp_factor = MAX(cinfo->max_v_samp_factor,
  91.    compptr->v_samp_factor);
  92.   }
  93.   /* Compute actual output image dimensions and DCT scaling choices. */
  94. #ifdef IDCT_SCALING_SUPPORTED
  95.   if (cinfo->scale_num * 8 <= cinfo->scale_denom) {
  96.     /* Provide 1/8 scaling */
  97.     cinfo->output_width = (JDIMENSION)
  98.       jdiv_round_up((long) cinfo->image_width, 8L);
  99.     cinfo->output_height = (JDIMENSION)
  100.       jdiv_round_up((long) cinfo->image_height, 8L);
  101.     cinfo->min_DCT_scaled_size = 1;
  102.   } else if (cinfo->scale_num * 4 <= cinfo->scale_denom) {
  103.     /* Provide 1/4 scaling */
  104.     cinfo->output_width = (JDIMENSION)
  105.       jdiv_round_up((long) cinfo->image_width, 4L);
  106.     cinfo->output_height = (JDIMENSION)
  107.       jdiv_round_up((long) cinfo->image_height, 4L);
  108.     cinfo->min_DCT_scaled_size = 2;
  109.   } else if (cinfo->scale_num * 2 <= cinfo->scale_denom) {
  110.     /* Provide 1/2 scaling */
  111.     cinfo->output_width = (JDIMENSION)
  112.       jdiv_round_up((long) cinfo->image_width, 2L);
  113.     cinfo->output_height = (JDIMENSION)
  114.       jdiv_round_up((long) cinfo->image_height, 2L);
  115.     cinfo->min_DCT_scaled_size = 4;
  116.   } else {
  117.     /* Provide 1/1 scaling */
  118.     cinfo->output_width = cinfo->image_width;
  119.     cinfo->output_height = cinfo->image_height;
  120.     cinfo->min_DCT_scaled_size = DCTSIZE;
  121.   }
  122.   /* In selecting the actual DCT scaling for each component, we try to
  123.    * scale up the chroma components via IDCT scaling rather than upsampling.
  124.    * This saves time if the upsampler gets to use 1:1 scaling.
  125.    * Note this code assumes that the supported DCT scalings are powers of 2.
  126.    */
  127.   for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
  128.        ci++, compptr++) {
  129.     int ssize = cinfo->min_DCT_scaled_size;
  130.     while (ssize < DCTSIZE &&
  131.    (compptr->h_samp_factor * ssize * 2 <=
  132.     cinfo->max_h_samp_factor * cinfo->min_DCT_scaled_size) &&
  133.    (compptr->v_samp_factor * ssize * 2 <=
  134.     cinfo->max_v_samp_factor * cinfo->min_DCT_scaled_size)) {
  135.       ssize = ssize * 2;
  136.     }
  137.     compptr->DCT_scaled_size = ssize;
  138.   }
  139. #else /* !IDCT_SCALING_SUPPORTED */
  140.   /* Hardwire it to "no scaling" */
  141.   cinfo->output_width = cinfo->image_width;
  142.   cinfo->output_height = cinfo->image_height;
  143.   cinfo->min_DCT_scaled_size = DCTSIZE;
  144.   for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
  145.        ci++, compptr++) {
  146.     compptr->DCT_scaled_size = DCTSIZE;
  147.   }
  148. #endif /* IDCT_SCALING_SUPPORTED */
  149.   /* Report number of components in selected colorspace. */
  150.   /* Probably this should be in the color conversion module... */
  151.   switch (cinfo->out_color_space) {
  152.   case JCS_GRAYSCALE:
  153.     cinfo->out_color_components = 1;
  154.     break;
  155.   case JCS_RGB:
  156. #if RGB_PIXELSIZE != 3
  157.     cinfo->out_color_components = RGB_PIXELSIZE;
  158.     break;
  159. #endif /* else share code with YCbCr */
  160.   case JCS_YCbCr:
  161.     cinfo->out_color_components = 3;
  162.     break;
  163.   case JCS_CMYK:
  164.   case JCS_YCCK:
  165.     cinfo->out_color_components = 4;
  166.     break;
  167.   default: /* else must be same colorspace as in file */
  168.     cinfo->out_color_components = cinfo->num_components;
  169.     break;
  170.   }
  171.   cinfo->output_components = (cinfo->quantize_colors ? 1 :
  172.       cinfo->out_color_components);
  173.   /* See if upsampler will want to emit more than one row at a time */
  174.   if (use_merged_upsample(cinfo))
  175.     cinfo->rec_outbuf_height = cinfo->max_v_samp_factor;
  176.   else
  177.     cinfo->rec_outbuf_height = 1;
  178.   /* Compute various sampling-related dimensions.
  179.    * Some of these are of interest to the application if it is dealing with
  180.    * "raw" (not upsampled) output, so we do the calculations here.
  181.    */
  182.   /* Compute dimensions of components */
  183.   for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
  184.        ci++, compptr++) {
  185.     /* Size in DCT blocks */
  186.     compptr->width_in_blocks = (JDIMENSION)
  187.       jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor,
  188.     (long) (cinfo->max_h_samp_factor * DCTSIZE));
  189.     compptr->height_in_blocks = (JDIMENSION)
  190.       jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor,
  191.     (long) (cinfo->max_v_samp_factor * DCTSIZE));
  192.     /* Size in samples, after IDCT scaling */
  193.     compptr->downsampled_width = (JDIMENSION)
  194.       jdiv_round_up((long) cinfo->image_width *
  195.     (long) (compptr->h_samp_factor * compptr->DCT_scaled_size),
  196.     (long) (cinfo->max_h_samp_factor * DCTSIZE));
  197.     compptr->downsampled_height = (JDIMENSION)
  198.       jdiv_round_up((long) cinfo->image_height *
  199.     (long) (compptr->v_samp_factor * compptr->DCT_scaled_size),
  200.     (long) (cinfo->max_v_samp_factor * DCTSIZE));
  201.     /* Mark component needed, until color conversion says otherwise */
  202.     compptr->component_needed = TRUE;
  203.   }
  204.   /* Compute number of fully interleaved MCU rows (number of times that
  205.    * main controller will call coefficient controller).
  206.    */
  207.   cinfo->total_iMCU_rows = (JDIMENSION)
  208.     jdiv_round_up((long) cinfo->image_height,
  209.   (long) (cinfo->max_v_samp_factor*DCTSIZE));
  210. }
  211. LOCAL void
  212. per_scan_setup (j_decompress_ptr cinfo)
  213. /* Do computations that are needed before processing a JPEG scan */
  214. /* cinfo->comps_in_scan and cinfo->cur_comp_info[] were set from SOS marker */
  215. {
  216.   int ci, mcublks, tmp;
  217.   jpeg_component_info *compptr;
  218.   
  219.   if (cinfo->comps_in_scan == 1) {
  220.     
  221.     /* Noninterleaved (single-component) scan */
  222.     compptr = cinfo->cur_comp_info[0];
  223.     
  224.     /* Overall image size in MCUs */
  225.     cinfo->MCUs_per_row = compptr->width_in_blocks;
  226.     cinfo->MCU_rows_in_scan = compptr->height_in_blocks;
  227.     
  228.     /* For noninterleaved scan, always one block per MCU */
  229.     compptr->MCU_width = 1;
  230.     compptr->MCU_height = 1;
  231.     compptr->MCU_blocks = 1;
  232.     compptr->MCU_sample_width = compptr->DCT_scaled_size;
  233.     compptr->last_col_width = 1;
  234.     compptr->last_row_height = 1;
  235.     
  236.     /* Prepare array describing MCU composition */
  237.     cinfo->blocks_in_MCU = 1;
  238.     cinfo->MCU_membership[0] = 0;
  239.     
  240.   } else {
  241.     
  242.     /* Interleaved (multi-component) scan */
  243.     if (cinfo->comps_in_scan <= 0 || cinfo->comps_in_scan > MAX_COMPS_IN_SCAN)
  244.       ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->comps_in_scan,
  245.        MAX_COMPS_IN_SCAN);
  246.     
  247.     /* Overall image size in MCUs */
  248.     cinfo->MCUs_per_row = (JDIMENSION)
  249.       jdiv_round_up((long) cinfo->image_width,
  250.     (long) (cinfo->max_h_samp_factor*DCTSIZE));
  251.     cinfo->MCU_rows_in_scan = (JDIMENSION)
  252.       jdiv_round_up((long) cinfo->image_height,
  253.     (long) (cinfo->max_v_samp_factor*DCTSIZE));
  254.     
  255.     cinfo->blocks_in_MCU = 0;
  256.     
  257.     for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
  258.       compptr = cinfo->cur_comp_info[ci];
  259.       /* Sampling factors give # of blocks of component in each MCU */
  260.       compptr->MCU_width = compptr->h_samp_factor;
  261.       compptr->MCU_height = compptr->v_samp_factor;
  262.       compptr->MCU_blocks = compptr->MCU_width * compptr->MCU_height;
  263.       compptr->MCU_sample_width = compptr->MCU_width * compptr->DCT_scaled_size;
  264.       /* Figure number of non-dummy blocks in last MCU column & row */
  265.       tmp = (int) (compptr->width_in_blocks % compptr->MCU_width);
  266.       if (tmp == 0) tmp = compptr->MCU_width;
  267.       compptr->last_col_width = tmp;
  268.       tmp = (int) (compptr->height_in_blocks % compptr->MCU_height);
  269.       if (tmp == 0) tmp = compptr->MCU_height;
  270.       compptr->last_row_height = tmp;
  271.       /* Prepare array describing MCU composition */
  272.       mcublks = compptr->MCU_blocks;
  273.       if (cinfo->blocks_in_MCU + mcublks > MAX_BLOCKS_IN_MCU)
  274. ERREXIT(cinfo, JERR_BAD_MCU_SIZE);
  275.       while (mcublks-- > 0) {
  276. cinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci;
  277.       }
  278.     }
  279.     
  280.   }
  281. }
  282. /*
  283.  * Several decompression processes need to range-limit values to the range
  284.  * 0..MAXJSAMPLE; the input value may fall somewhat outside this range
  285.  * due to noise introduced by quantization, roundoff error, etc.  These
  286.  * processes are inner loops and need to be as fast as possible.  On most
  287.  * machines, particularly CPUs with pipelines or instruction prefetch,
  288.  * a (subscript-check-less) C table lookup
  289.  * x = sample_range_limit[x];
  290.  * is faster than explicit tests
  291.  * if (x < 0)  x = 0;
  292.  * else if (x > MAXJSAMPLE)  x = MAXJSAMPLE;
  293.  * These processes all use a common table prepared by the routine below.
  294.  *
  295.  * For most steps we can mathematically guarantee that the initial value
  296.  * of x is within MAXJSAMPLE+1 of the legal range, so a table running from
  297.  * -(MAXJSAMPLE+1) to 2*MAXJSAMPLE+1 is sufficient.  But for the initial
  298.  * limiting step (just after the IDCT), a wildly out-of-range value is 
  299.  * possible if the input data is corrupt.  To avoid any chance of indexing
  300.  * off the end of memory and getting a bad-pointer trap, we perform the
  301.  * post-IDCT limiting thus:
  302.  * x = range_limit[x & MASK];
  303.  * where MASK is 2 bits wider than legal sample data, ie 10 bits for 8-bit
  304.  * samples.  Under normal circumstances this is more than enough range and
  305.  * a correct output will be generated; with bogus input data the mask will
  306.  * cause wraparound, and we will safely generate a bogus-but-in-range output.
  307.  * For the post-IDCT step, we want to convert the data from signed to unsigned
  308.  * representation by adding CENTERJSAMPLE at the same time that we limit it.
  309.  * So the post-IDCT limiting table ends up looking like this:
  310.  *   CENTERJSAMPLE,CENTERJSAMPLE+1,...,MAXJSAMPLE,
  311.  *   MAXJSAMPLE (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times),
  312.  *   0          (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times),
  313.  *   0,1,...,CENTERJSAMPLE-1
  314.  * Negative inputs select values from the upper half of the table after
  315.  * masking.
  316.  *
  317.  * We can save some space by overlapping the start of the post-IDCT table
  318.  * with the simpler range limiting table.  The post-IDCT table begins at
  319.  * sample_range_limit + CENTERJSAMPLE.
  320.  *
  321.  * Note that the table is allocated in near data space on PCs; it's small
  322.  * enough and used often enough to justify this.
  323.  */
  324. LOCAL void
  325. prepare_range_limit_table (j_decompress_ptr cinfo)
  326. /* Allocate and fill in the sample_range_limit table */
  327. {
  328.   JSAMPLE * table;
  329.   int i;
  330.   table = (JSAMPLE *)
  331.     (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
  332. (5 * (MAXJSAMPLE+1) + CENTERJSAMPLE) * SIZEOF(JSAMPLE));
  333.   table += (MAXJSAMPLE+1); /* allow negative subscripts of simple table */
  334.   cinfo->sample_range_limit = table;
  335.   /* First segment of "simple" table: limit[x] = 0 for x < 0 */
  336.   MEMZERO(table - (MAXJSAMPLE+1), (MAXJSAMPLE+1) * SIZEOF(JSAMPLE));
  337.   /* Main part of "simple" table: limit[x] = x */
  338.   for (i = 0; i <= MAXJSAMPLE; i++)
  339.     table[i] = (JSAMPLE) i;
  340.   table += CENTERJSAMPLE; /* Point to where post-IDCT table starts */
  341.   /* End of simple table, rest of first half of post-IDCT table */
  342.   for (i = CENTERJSAMPLE; i < 2*(MAXJSAMPLE+1); i++)
  343.     table[i] = MAXJSAMPLE;
  344.   /* Second half of post-IDCT table */
  345.   MEMZERO(table + (2 * (MAXJSAMPLE+1)),
  346.   (2 * (MAXJSAMPLE+1) - CENTERJSAMPLE) * SIZEOF(JSAMPLE));
  347.   MEMCOPY(table + (4 * (MAXJSAMPLE+1) - CENTERJSAMPLE),
  348.   cinfo->sample_range_limit, CENTERJSAMPLE * SIZEOF(JSAMPLE));
  349. }
  350. /*
  351.  * Master selection of decompression modules.
  352.  * This is done once at the start of processing an image.  We determine
  353.  * which modules will be used and give them appropriate initialization calls.
  354.  *
  355.  * Note that this is called only after jpeg_read_header has finished.
  356.  * We therefore know what is in the SOF and (first) SOS markers.
  357.  */
  358. LOCAL void
  359. master_selection (j_decompress_ptr cinfo)
  360. {
  361.   my_master_ptr master = (my_master_ptr) cinfo->master;
  362.   long samplesperrow;
  363.   JDIMENSION jd_samplesperrow;
  364.   /* Initialize dimensions and other stuff */
  365.   jpeg_calc_output_dimensions(cinfo);
  366.   prepare_range_limit_table(cinfo);
  367.   /* Width of an output scanline must be representable as JDIMENSION. */
  368.   samplesperrow = (long) cinfo->output_width * (long) cinfo->out_color_components;
  369.   jd_samplesperrow = (JDIMENSION) samplesperrow;
  370.   if ((long) jd_samplesperrow != samplesperrow)
  371.     ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
  372.   /* Initialize my private state */
  373.   master->pub.eoi_processed = FALSE;
  374.   master->pass_number = 0;
  375.   master->need_post_pass = FALSE;
  376.   if (cinfo->comps_in_scan == cinfo->num_components) {
  377.     master->pass_type = main_pass;
  378.     master->total_passes = 1;
  379.   } else {
  380. #ifdef D_MULTISCAN_FILES_SUPPORTED
  381.     master->pass_type = preread_pass;
  382.     /* Assume there is a separate scan for each component; */
  383.     /* if partially interleaved, we'll increment pass_number appropriately */
  384.     master->total_passes = cinfo->num_components + 1;
  385. #else
  386.     ERREXIT(cinfo, JERR_NOT_COMPILED);
  387. #endif
  388.   }
  389.   master->using_merged_upsample = use_merged_upsample(cinfo);
  390.   /* There's not a lot of smarts here right now, but it'll get more
  391.    * complicated when we have multiple implementations available...
  392.    */
  393.   /* Color quantizer selection */
  394.   if (cinfo->quantize_colors) {
  395.     if (cinfo->raw_data_out)
  396.       ERREXIT(cinfo, JERR_NOTIMPL);
  397. #ifdef QUANT_2PASS_SUPPORTED
  398.     /* 2-pass quantizer only works in 3-component color space.
  399.      * We use the "2-pass" code in a single pass if a colormap is given.
  400.      */
  401.     if (cinfo->out_color_components != 3)
  402.       cinfo->two_pass_quantize = FALSE;
  403.     else if (cinfo->colormap != NULL)
  404.       cinfo->two_pass_quantize = TRUE;
  405. #else
  406.     /* Force 1-pass quantize if we don't have 2-pass code compiled. */
  407.     cinfo->two_pass_quantize = FALSE;
  408. #endif
  409.     if (cinfo->two_pass_quantize) {
  410. #ifdef QUANT_2PASS_SUPPORTED
  411.       if (cinfo->colormap == NULL) {
  412. master->need_post_pass = TRUE;
  413. master->total_passes++;
  414.       }
  415.       jinit_2pass_quantizer(cinfo);
  416. #else
  417.       ERREXIT(cinfo, JERR_NOT_COMPILED);
  418. #endif
  419.     } else {
  420. #ifdef QUANT_1PASS_SUPPORTED
  421.       jinit_1pass_quantizer(cinfo);
  422. #else
  423.       ERREXIT(cinfo, JERR_NOT_COMPILED);
  424. #endif
  425.     }
  426.   }
  427.   /* Post-processing: in particular, color conversion first */
  428.   if (! cinfo->raw_data_out) {
  429.     if (master->using_merged_upsample) {
  430. #ifdef UPSAMPLE_MERGING_SUPPORTED
  431.       jinit_merged_upsampler(cinfo); /* does color conversion too */
  432. #else
  433.       ERREXIT(cinfo, JERR_NOT_COMPILED);
  434. #endif
  435.     } else {
  436.       jinit_color_deconverter(cinfo);
  437.       jinit_upsampler(cinfo);
  438.     }
  439.     jinit_d_post_controller(cinfo, master->need_post_pass);
  440.   }
  441.   /* Inverse DCT */
  442.   jinit_inverse_dct(cinfo);
  443.   /* Entropy decoding: either Huffman or arithmetic coding. */
  444.   if (cinfo->arith_code) {
  445. #ifdef D_ARITH_CODING_SUPPORTED
  446.     jinit_arith_decoder(cinfo);
  447. #else
  448.     ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
  449. #endif
  450.   } else
  451.     jinit_huff_decoder(cinfo);
  452.   jinit_d_coef_controller(cinfo, (master->pass_type == preread_pass));
  453.   jinit_d_main_controller(cinfo, FALSE /* never need full buffer here */);
  454.   /* Note that main controller is initialized even in raw-data mode. */
  455.   /* We can now tell the memory manager to allocate virtual arrays. */
  456.   (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);
  457. }
  458. /*
  459.  * Per-pass setup.
  460.  * This is called at the beginning of each pass.  We determine which modules
  461.  * will be active during this pass and give them appropriate start_pass calls.
  462.  * We also set is_last_pass to indicate whether any more passes will be
  463.  * required.
  464.  */
  465. METHODDEF void
  466. prepare_for_pass (j_decompress_ptr cinfo)
  467. {
  468.   my_master_ptr master = (my_master_ptr) cinfo->master;
  469.   switch (master->pass_type) {
  470.   case main_pass:
  471.     /* Set up to read and decompress single-scan file in one pass */
  472.     per_scan_setup(cinfo);
  473.     master->pub.is_last_pass = ! master->need_post_pass;
  474.     if (! cinfo->raw_data_out) {
  475.       if (! master->using_merged_upsample)
  476. (*cinfo->cconvert->start_pass) (cinfo);
  477.       (*cinfo->upsample->start_pass) (cinfo);
  478.       if (cinfo->quantize_colors)
  479. (*cinfo->cquantize->start_pass) (cinfo, master->need_post_pass);
  480.       (*cinfo->post->start_pass) (cinfo,
  481.     (master->need_post_pass ? JBUF_SAVE_AND_PASS : JBUF_PASS_THRU));
  482.     }
  483.     (*cinfo->idct->start_input_pass) (cinfo);
  484.     (*cinfo->idct->start_output_pass) (cinfo);
  485.     (*cinfo->entropy->start_pass) (cinfo);
  486.     (*cinfo->coef->start_pass) (cinfo, JBUF_PASS_THRU);
  487.     (*cinfo->main->start_pass) (cinfo, JBUF_PASS_THRU);
  488.     break;
  489. #ifdef D_MULTISCAN_FILES_SUPPORTED
  490.   case preread_pass:
  491.     /* Read (another) scan of a multi-scan file */
  492.     per_scan_setup(cinfo);
  493.     master->pub.is_last_pass = FALSE;
  494.     (*cinfo->idct->start_input_pass) (cinfo);
  495.     (*cinfo->entropy->start_pass) (cinfo);
  496.     (*cinfo->coef->start_pass) (cinfo, JBUF_SAVE_SOURCE);
  497.     (*cinfo->main->start_pass) (cinfo, JBUF_CRANK_SOURCE);
  498.     break;
  499.   case output_pass:
  500.     /* All scans read, now do the IDCT and subsequent processing */
  501.     master->pub.is_last_pass = ! master->need_post_pass;
  502.     if (! cinfo->raw_data_out) {
  503.       if (! master->using_merged_upsample)
  504. (*cinfo->cconvert->start_pass) (cinfo);
  505.       (*cinfo->upsample->start_pass) (cinfo);
  506.       if (cinfo->quantize_colors)
  507. (*cinfo->cquantize->start_pass) (cinfo, master->need_post_pass);
  508.       (*cinfo->post->start_pass) (cinfo,
  509.     (master->need_post_pass ? JBUF_SAVE_AND_PASS : JBUF_PASS_THRU));
  510.     }
  511.     (*cinfo->idct->start_output_pass) (cinfo);
  512.     (*cinfo->coef->start_pass) (cinfo, JBUF_CRANK_DEST);
  513.     (*cinfo->main->start_pass) (cinfo, JBUF_PASS_THRU);
  514.     break;
  515. #endif /* D_MULTISCAN_FILES_SUPPORTED */
  516. #ifdef QUANT_2PASS_SUPPORTED
  517.   case post_pass:
  518.     /* Final pass of 2-pass quantization */
  519.     master->pub.is_last_pass = TRUE;
  520.     (*cinfo->cquantize->start_pass) (cinfo, FALSE);
  521.     (*cinfo->post->start_pass) (cinfo, JBUF_CRANK_DEST);
  522.     (*cinfo->main->start_pass) (cinfo, JBUF_CRANK_DEST);
  523.     break;
  524. #endif /* QUANT_2PASS_SUPPORTED */
  525.   default:
  526.     ERREXIT(cinfo, JERR_NOT_COMPILED);
  527.   }
  528.   /* Set up progress monitor's pass info if present */
  529.   if (cinfo->progress != NULL) {
  530.     cinfo->progress->completed_passes = master->pass_number;
  531.     cinfo->progress->total_passes = master->total_passes;
  532.   }
  533. }
  534. /*
  535.  * Finish up at end of pass.
  536.  * In multi-scan mode, we must read next scan header and set the next
  537.  * pass_type correctly for prepare_for_pass.
  538.  */
  539. METHODDEF void
  540. finish_pass_master (j_decompress_ptr cinfo)
  541. {
  542.   my_master_ptr master = (my_master_ptr) cinfo->master;
  543.   switch (master->pass_type) {
  544.   case main_pass:
  545.   case output_pass:
  546.     if (cinfo->quantize_colors)
  547.       (*cinfo->cquantize->finish_pass) (cinfo);
  548.     master->pass_number++;
  549.     master->pass_type = post_pass; /* in case need_post_pass is true */
  550.     break;
  551. #ifdef D_MULTISCAN_FILES_SUPPORTED
  552.   case preread_pass:
  553.     /* Count one pass done for each component in this scan */
  554.     master->pass_number += cinfo->comps_in_scan;
  555.     switch ((*cinfo->marker->read_markers) (cinfo)) {
  556.     case JPEG_HEADER_OK: /* Found SOS, do another preread pass */
  557.       break;
  558.     case JPEG_HEADER_TABLES_ONLY: /* Found EOI, no more preread passes */
  559.       master->pub.eoi_processed = TRUE;
  560.       master->pass_type = output_pass;
  561.       break;
  562.     case JPEG_SUSPENDED:
  563.       ERREXIT(cinfo, JERR_CANT_SUSPEND);
  564.     }
  565.     break;
  566. #endif /* D_MULTISCAN_FILES_SUPPORTED */
  567. #ifdef QUANT_2PASS_SUPPORTED
  568.   case post_pass:
  569.     (*cinfo->cquantize->finish_pass) (cinfo);
  570.     /* there will be no more passes, don't bother to change state */
  571.     break;
  572. #endif /* QUANT_2PASS_SUPPORTED */
  573.   default:
  574.     ERREXIT(cinfo, JERR_NOT_COMPILED);
  575.   }
  576. }
  577. /*
  578.  * Initialize master decompression control.
  579.  * This creates my own subrecord and also performs the master selection phase,
  580.  * which causes other modules to create their subrecords.
  581.  */
  582. GLOBAL void
  583. jinit_master_decompress (j_decompress_ptr cinfo)
  584. {
  585.   my_master_ptr master;
  586.   master = (my_master_ptr)
  587.       (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
  588.   SIZEOF(my_decomp_master));
  589.   cinfo->master = (struct jpeg_decomp_master *) master;
  590.   master->pub.prepare_for_pass = prepare_for_pass;
  591.   master->pub.finish_pass = finish_pass_master;
  592.   master_selection(cinfo);
  593. }