19f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
29f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * jdmaster.c
39f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
49f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Copyright (C) 1991-1997, Thomas G. Lane.
59f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This file is part of the Independent JPEG Group's software.
69f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * For conditions of distribution and use, see the accompanying README file.
79f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
89f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This file contains master control logic for the JPEG decompressor.
99f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * These routines are concerned with selecting the modules to be executed
109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * and with determining the number of passes and the work to be done in each
119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * pass.
129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define JPEG_INTERNALS
159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include "jinclude.h"
169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include "jpeglib.h"
179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Private state */
209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef struct {
229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  struct jpeg_decomp_master pub; /* public fields */
239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int pass_number;		/* # of passes completed */
259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  boolean using_merged_upsample; /* TRUE if using merged upsample/cconvert */
279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Saved references to initialized quantizer modules,
299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * in case we need to switch modes.
309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   */
319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  struct jpeg_color_quantizer * quantizer_1pass;
329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  struct jpeg_color_quantizer * quantizer_2pass;
339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} my_decomp_master;
349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef my_decomp_master * my_master_ptr;
369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Determine whether merged upsample/color conversion should be used.
409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * CRUCIAL: this must match the actual capabilities of jdmerge.c!
419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(boolean)
449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectuse_merged_upsample (j_decompress_ptr cinfo)
459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef UPSAMPLE_MERGING_SUPPORTED
479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Merging is the equivalent of plain box-filter upsampling */
489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (cinfo->do_fancy_upsampling || cinfo->CCIR601_sampling)
499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    return FALSE;
509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef ANDROID_RGB
529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* jdmerge.c only supports YCC=>RGB565 and YCC=>RGB color conversion */
539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (cinfo->jpeg_color_space != JCS_YCbCr ||
549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      cinfo->num_components != 3 ||
559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      cinfo->out_color_components != 3 ||
569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      (cinfo->out_color_space != JCS_RGB_565 &&
579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project         cinfo->out_color_space != JCS_RGB)) {
589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    return FALSE;
599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#else
619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* jdmerge.c only supports YCC=>RGB color conversion */
629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (cinfo->jpeg_color_space != JCS_YCbCr || cinfo->num_components != 3 ||
639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      cinfo->out_color_space != JCS_RGB ||
649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      cinfo->out_color_components != RGB_PIXELSIZE)
659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    return FALSE;
669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif
679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* and it only handles 2h1v or 2h2v sampling ratios */
699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (cinfo->comp_info[0].h_samp_factor != 2 ||
709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      cinfo->comp_info[1].h_samp_factor != 1 ||
719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      cinfo->comp_info[2].h_samp_factor != 1 ||
729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      cinfo->comp_info[0].v_samp_factor >  2 ||
739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      cinfo->comp_info[1].v_samp_factor != 1 ||
749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      cinfo->comp_info[2].v_samp_factor != 1)
759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    return FALSE;
769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* furthermore, it doesn't work if we've scaled the IDCTs differently */
779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (cinfo->comp_info[0].DCT_scaled_size != cinfo->min_DCT_scaled_size ||
789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      cinfo->comp_info[1].DCT_scaled_size != cinfo->min_DCT_scaled_size ||
799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      cinfo->comp_info[2].DCT_scaled_size != cinfo->min_DCT_scaled_size)
809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    return FALSE;
819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* ??? also need to test for upsample-time rescaling, when & if supported */
829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  return TRUE;			/* by golly, it'll work... */
839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#else
849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  return FALSE;
859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif
869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Compute output image dimensions and related values.
919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * NOTE: this is exported for possible use by application.
929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Hence it mustn't do anything that can't be done twice.
939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Also note that it may be called before the master module is initialized!
949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(void)
979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjpeg_calc_output_dimensions (j_decompress_ptr cinfo)
989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Do computations that are needed before master selection phase */
999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
1009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef IDCT_SCALING_SUPPORTED
1019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int ci;
1029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  jpeg_component_info *compptr;
1039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif
1049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Prevent application from calling me at wrong times */
106cc66ecf44d1407039b05ffd7b3342389f95c17b7Joseph Wen#if ANDROID_TILE_BASED_DECODE
107cc66ecf44d1407039b05ffd7b3342389f95c17b7Joseph Wen  // Tile based decoding may call this function several times.
108cc66ecf44d1407039b05ffd7b3342389f95c17b7Joseph Wen  if (!cinfo->tile_decode)
109cc66ecf44d1407039b05ffd7b3342389f95c17b7Joseph Wen#endif
110cc66ecf44d1407039b05ffd7b3342389f95c17b7Joseph Wen    if (cinfo->global_state != DSTATE_READY)
111cc66ecf44d1407039b05ffd7b3342389f95c17b7Joseph Wen      ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
1129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef IDCT_SCALING_SUPPORTED
1149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Compute actual output image dimensions and DCT scaling choices. */
1169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (cinfo->scale_num * 8 <= cinfo->scale_denom) {
1179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Provide 1/8 scaling */
1189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    cinfo->output_width = (JDIMENSION)
1199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      jdiv_round_up((long) cinfo->image_width, 8L);
1209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    cinfo->output_height = (JDIMENSION)
1219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      jdiv_round_up((long) cinfo->image_height, 8L);
1229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    cinfo->min_DCT_scaled_size = 1;
1239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  } else if (cinfo->scale_num * 4 <= cinfo->scale_denom) {
1249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Provide 1/4 scaling */
1259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    cinfo->output_width = (JDIMENSION)
1269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      jdiv_round_up((long) cinfo->image_width, 4L);
1279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    cinfo->output_height = (JDIMENSION)
1289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      jdiv_round_up((long) cinfo->image_height, 4L);
1299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    cinfo->min_DCT_scaled_size = 2;
1309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  } else if (cinfo->scale_num * 2 <= cinfo->scale_denom) {
1319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Provide 1/2 scaling */
1329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    cinfo->output_width = (JDIMENSION)
1339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      jdiv_round_up((long) cinfo->image_width, 2L);
1349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    cinfo->output_height = (JDIMENSION)
1359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      jdiv_round_up((long) cinfo->image_height, 2L);
1369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    cinfo->min_DCT_scaled_size = 4;
1379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  } else {
1389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Provide 1/1 scaling */
1399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    cinfo->output_width = cinfo->image_width;
1409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    cinfo->output_height = cinfo->image_height;
1419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    cinfo->min_DCT_scaled_size = DCTSIZE;
1429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
1439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* In selecting the actual DCT scaling for each component, we try to
1449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * scale up the chroma components via IDCT scaling rather than upsampling.
1459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * This saves time if the upsampler gets to use 1:1 scaling.
1469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * Note this code assumes that the supported DCT scalings are powers of 2.
1479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   */
1489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
1499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project       ci++, compptr++) {
1509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    int ssize = cinfo->min_DCT_scaled_size;
1519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    while (ssize < DCTSIZE &&
1529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	   (compptr->h_samp_factor * ssize * 2 <=
1539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	    cinfo->max_h_samp_factor * cinfo->min_DCT_scaled_size) &&
1549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	   (compptr->v_samp_factor * ssize * 2 <=
1559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	    cinfo->max_v_samp_factor * cinfo->min_DCT_scaled_size)) {
1569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      ssize = ssize * 2;
1579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
1589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    compptr->DCT_scaled_size = ssize;
1599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
1609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Recompute downsampled dimensions of components;
1629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * application needs to know these if using raw downsampled data.
1639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   */
1649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
1659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project       ci++, compptr++) {
1669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Size in samples, after IDCT scaling */
1679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    compptr->downsampled_width = (JDIMENSION)
1689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      jdiv_round_up((long) cinfo->image_width *
1699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project		    (long) (compptr->h_samp_factor * compptr->DCT_scaled_size),
1709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project		    (long) (cinfo->max_h_samp_factor * DCTSIZE));
1719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    compptr->downsampled_height = (JDIMENSION)
1729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      jdiv_round_up((long) cinfo->image_height *
1739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project		    (long) (compptr->v_samp_factor * compptr->DCT_scaled_size),
1749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project		    (long) (cinfo->max_v_samp_factor * DCTSIZE));
1759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
1769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#else /* !IDCT_SCALING_SUPPORTED */
1789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Hardwire it to "no scaling" */
1809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  cinfo->output_width = cinfo->image_width;
1819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  cinfo->output_height = cinfo->image_height;
1829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* jdinput.c has already initialized DCT_scaled_size to DCTSIZE,
1839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * and has computed unscaled downsampled_width and downsampled_height.
1849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   */
1859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif /* IDCT_SCALING_SUPPORTED */
1879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Report number of components in selected colorspace. */
1899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Probably this should be in the color conversion module... */
1909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  switch (cinfo->out_color_space) {
1919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  case JCS_GRAYSCALE:
1929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    cinfo->out_color_components = 1;
1939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    break;
1949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  case JCS_RGB:
1959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#if RGB_PIXELSIZE != 3
1969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    cinfo->out_color_components = RGB_PIXELSIZE;
1979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    break;
1989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif /* else share code with YCbCr */
1999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef ANDROID_RGB
2009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  case JCS_RGB_565:
2019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif
2029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  case JCS_YCbCr:
2039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    cinfo->out_color_components = 3;
2049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    break;
2059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  case JCS_CMYK:
2069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  case JCS_YCCK:
2079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef ANDROID_RGB
2089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  case JCS_RGBA_8888:
2099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif
2109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    cinfo->out_color_components = 4;
2119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    break;
2129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  default:			/* else must be same colorspace as in file */
2139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    cinfo->out_color_components = cinfo->num_components;
2149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    break;
2159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
2169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  cinfo->output_components = (cinfo->quantize_colors ? 1 :
2179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project			      cinfo->out_color_components);
2189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* See if upsampler will want to emit more than one row at a time */
2209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (use_merged_upsample(cinfo))
2219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    cinfo->rec_outbuf_height = cinfo->max_v_samp_factor;
2229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  else
2239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    cinfo->rec_outbuf_height = 1;
2249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
2259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
2289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Several decompression processes need to range-limit values to the range
2299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 0..MAXJSAMPLE; the input value may fall somewhat outside this range
2309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * due to noise introduced by quantization, roundoff error, etc.  These
2319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * processes are inner loops and need to be as fast as possible.  On most
2329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * machines, particularly CPUs with pipelines or instruction prefetch,
2339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * a (subscript-check-less) C table lookup
2349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *		x = sample_range_limit[x];
2359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * is faster than explicit tests
2369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *		if (x < 0)  x = 0;
2379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *		else if (x > MAXJSAMPLE)  x = MAXJSAMPLE;
2389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * These processes all use a common table prepared by the routine below.
2399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
2409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * For most steps we can mathematically guarantee that the initial value
2419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * of x is within MAXJSAMPLE+1 of the legal range, so a table running from
2429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * -(MAXJSAMPLE+1) to 2*MAXJSAMPLE+1 is sufficient.  But for the initial
2439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * limiting step (just after the IDCT), a wildly out-of-range value is
2449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * possible if the input data is corrupt.  To avoid any chance of indexing
2459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * off the end of memory and getting a bad-pointer trap, we perform the
2469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * post-IDCT limiting thus:
2479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *		x = range_limit[x & MASK];
2489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * where MASK is 2 bits wider than legal sample data, ie 10 bits for 8-bit
2499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * samples.  Under normal circumstances this is more than enough range and
2509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * a correct output will be generated; with bogus input data the mask will
2519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * cause wraparound, and we will safely generate a bogus-but-in-range output.
2529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * For the post-IDCT step, we want to convert the data from signed to unsigned
2539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * representation by adding CENTERJSAMPLE at the same time that we limit it.
2549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * So the post-IDCT limiting table ends up looking like this:
2559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *   CENTERJSAMPLE,CENTERJSAMPLE+1,...,MAXJSAMPLE,
2569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *   MAXJSAMPLE (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times),
2579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *   0          (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times),
2589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *   0,1,...,CENTERJSAMPLE-1
2599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Negative inputs select values from the upper half of the table after
2609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * masking.
2619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
2629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * We can save some space by overlapping the start of the post-IDCT table
2639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * with the simpler range limiting table.  The post-IDCT table begins at
2649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * sample_range_limit + CENTERJSAMPLE.
2659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
2669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Note that the table is allocated in near data space on PCs; it's small
2679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * enough and used often enough to justify this.
2689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
2699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(void)
2719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectprepare_range_limit_table (j_decompress_ptr cinfo)
2729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Allocate and fill in the sample_range_limit table */
2739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
2749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  JSAMPLE * table;
2759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int i;
2769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  table = (JSAMPLE *)
2789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
2799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project		(5 * (MAXJSAMPLE+1) + CENTERJSAMPLE) * SIZEOF(JSAMPLE));
2809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  table += (MAXJSAMPLE+1);	/* allow negative subscripts of simple table */
2819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  cinfo->sample_range_limit = table;
2829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* First segment of "simple" table: limit[x] = 0 for x < 0 */
2839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  MEMZERO(table - (MAXJSAMPLE+1), (MAXJSAMPLE+1) * SIZEOF(JSAMPLE));
2849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Main part of "simple" table: limit[x] = x */
2859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (i = 0; i <= MAXJSAMPLE; i++)
2869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    table[i] = (JSAMPLE) i;
2879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  table += CENTERJSAMPLE;	/* Point to where post-IDCT table starts */
2889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* End of simple table, rest of first half of post-IDCT table */
2899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (i = CENTERJSAMPLE; i < 2*(MAXJSAMPLE+1); i++)
2909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    table[i] = MAXJSAMPLE;
2919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Second half of post-IDCT table */
2929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  MEMZERO(table + (2 * (MAXJSAMPLE+1)),
2939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	  (2 * (MAXJSAMPLE+1) - CENTERJSAMPLE) * SIZEOF(JSAMPLE));
2949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  MEMCOPY(table + (4 * (MAXJSAMPLE+1) - CENTERJSAMPLE),
2959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	  cinfo->sample_range_limit, CENTERJSAMPLE * SIZEOF(JSAMPLE));
2969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
2979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
3009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Master selection of decompression modules.
3019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This is done once at jpeg_start_decompress time.  We determine
3029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * which modules will be used and give them appropriate initialization calls.
3039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * We also initialize the decompressor input side to begin consuming data.
3049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
3059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Since jpeg_read_header has finished, we know what is in the SOF
3069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * and (first) SOS markers.  We also have all the application parameter
3079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * settings.
3089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
3099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(void)
3119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectmaster_selection (j_decompress_ptr cinfo)
3129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
3139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  my_master_ptr master = (my_master_ptr) cinfo->master;
3149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  boolean use_c_buffer;
3159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  long samplesperrow;
3169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  JDIMENSION jd_samplesperrow;
3179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Initialize dimensions and other stuff */
3199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  jpeg_calc_output_dimensions(cinfo);
3209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  prepare_range_limit_table(cinfo);
3219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Width of an output scanline must be representable as JDIMENSION. */
3239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  samplesperrow = (long) cinfo->output_width * (long) cinfo->out_color_components;
3249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  jd_samplesperrow = (JDIMENSION) samplesperrow;
3259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if ((long) jd_samplesperrow != samplesperrow)
3269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
3279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Initialize my private state */
3299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  master->pass_number = 0;
3309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  master->using_merged_upsample = use_merged_upsample(cinfo);
3319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Color quantizer selection */
3339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  master->quantizer_1pass = NULL;
3349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  master->quantizer_2pass = NULL;
3359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* No mode changes if not using buffered-image mode. */
3369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (! cinfo->quantize_colors || ! cinfo->buffered_image) {
3379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    cinfo->enable_1pass_quant = FALSE;
3389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    cinfo->enable_external_quant = FALSE;
3399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    cinfo->enable_2pass_quant = FALSE;
3409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
3419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (cinfo->quantize_colors) {
3429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (cinfo->raw_data_out)
3439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      ERREXIT(cinfo, JERR_NOTIMPL);
3449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* 2-pass quantizer only works in 3-component color space. */
3459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (cinfo->out_color_components != 3) {
3469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      cinfo->enable_1pass_quant = TRUE;
3479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      cinfo->enable_external_quant = FALSE;
3489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      cinfo->enable_2pass_quant = FALSE;
3499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      cinfo->colormap = NULL;
3509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    } else if (cinfo->colormap != NULL) {
3519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      cinfo->enable_external_quant = TRUE;
3529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    } else if (cinfo->two_pass_quantize) {
3539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      cinfo->enable_2pass_quant = TRUE;
3549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    } else {
3559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      cinfo->enable_1pass_quant = TRUE;
3569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
3579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (cinfo->enable_1pass_quant) {
3599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef QUANT_1PASS_SUPPORTED
3609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      jinit_1pass_quantizer(cinfo);
3619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      master->quantizer_1pass = cinfo->cquantize;
3629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#else
3639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      ERREXIT(cinfo, JERR_NOT_COMPILED);
3649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif
3659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
3669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* We use the 2-pass code to map to external colormaps. */
3689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (cinfo->enable_2pass_quant || cinfo->enable_external_quant) {
3699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef QUANT_2PASS_SUPPORTED
3709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      jinit_2pass_quantizer(cinfo);
3719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      master->quantizer_2pass = cinfo->cquantize;
3729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#else
3739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      ERREXIT(cinfo, JERR_NOT_COMPILED);
3749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif
3759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
3769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* If both quantizers are initialized, the 2-pass one is left active;
3779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project     * this is necessary for starting with quantization to an external map.
3789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project     */
3799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
3809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Post-processing: in particular, color conversion first */
3829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (! cinfo->raw_data_out) {
3839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (master->using_merged_upsample) {
3849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef UPSAMPLE_MERGING_SUPPORTED
3859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      jinit_merged_upsampler(cinfo); /* does color conversion too */
3869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#else
3879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      ERREXIT(cinfo, JERR_NOT_COMPILED);
3889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif
3899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    } else {
3909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      jinit_color_deconverter(cinfo);
3919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      jinit_upsampler(cinfo);
3929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
3939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    jinit_d_post_controller(cinfo, cinfo->enable_2pass_quant);
3949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
3959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Inverse DCT */
3969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  jinit_inverse_dct(cinfo);
3979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Entropy decoding: either Huffman or arithmetic coding. */
3989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (cinfo->arith_code) {
3999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
4009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  } else {
4019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (cinfo->progressive_mode) {
4029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef D_PROGRESSIVE_SUPPORTED
4039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      jinit_phuff_decoder(cinfo);
4049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#else
4059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      ERREXIT(cinfo, JERR_NOT_COMPILED);
4069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif
4079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    } else
4089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      jinit_huff_decoder(cinfo);
4099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
4109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Initialize principal buffer controllers. */
4129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  use_c_buffer = cinfo->inputctl->has_multiple_scans || cinfo->buffered_image;
4139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  jinit_d_coef_controller(cinfo, use_c_buffer);
4149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (! cinfo->raw_data_out)
4169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    jinit_d_main_controller(cinfo, FALSE /* never need full buffer here */);
4179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* We can now tell the memory manager to allocate virtual arrays. */
4199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);
4209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Initialize input side of decompressor to consume first scan. */
4229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  (*cinfo->inputctl->start_input_pass) (cinfo);
4239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef D_MULTISCAN_FILES_SUPPORTED
4259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* If jpeg_start_decompress will read the whole file, initialize
4269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * progress monitoring appropriately.  The input step is counted
4279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   * as one pass.
4289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   */
4299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (cinfo->progress != NULL && ! cinfo->buffered_image &&
4309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      cinfo->inputctl->has_multiple_scans) {
4319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    int nscans;
4329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Estimate number of scans to set pass_limit. */
4339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (cinfo->progressive_mode) {
4349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* Arbitrarily estimate 2 interleaved DC scans + 3 AC scans/component. */
4359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      nscans = 2 + 3 * cinfo->num_components;
4369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    } else {
4379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* For a nonprogressive multiscan file, estimate 1 scan per component. */
4389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      nscans = cinfo->num_components;
4399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
4409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    cinfo->progress->pass_counter = 0L;
4419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows * nscans;
4429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    cinfo->progress->completed_passes = 0;
4439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    cinfo->progress->total_passes = (cinfo->enable_2pass_quant ? 3 : 2);
4449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Count the input pass as done */
4459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    master->pass_number++;
4469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
4479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif /* D_MULTISCAN_FILES_SUPPORTED */
4489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
4499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
4529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Per-pass setup.
4539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This is called at the beginning of each output pass.  We determine which
4549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * modules will be active during this pass and give them appropriate
4559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * start_pass calls.  We also set is_dummy_pass to indicate whether this
4569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * is a "real" output pass or a dummy pass for color quantization.
4579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * (In the latter case, jdapistd.c will crank the pass to completion.)
4589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
4599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void)
4619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectprepare_for_output_pass (j_decompress_ptr cinfo)
4629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
4639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  my_master_ptr master = (my_master_ptr) cinfo->master;
4649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (master->pub.is_dummy_pass) {
4669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef QUANT_2PASS_SUPPORTED
4679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Final pass of 2-pass quantization */
4689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    master->pub.is_dummy_pass = FALSE;
4699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    (*cinfo->cquantize->start_pass) (cinfo, FALSE);
4709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    (*cinfo->post->start_pass) (cinfo, JBUF_CRANK_DEST);
4719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    (*cinfo->main->start_pass) (cinfo, JBUF_CRANK_DEST);
4729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#else
4739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ERREXIT(cinfo, JERR_NOT_COMPILED);
4749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif /* QUANT_2PASS_SUPPORTED */
4759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  } else {
4769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (cinfo->quantize_colors && cinfo->colormap == NULL) {
4779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      /* Select new quantization method */
4789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      if (cinfo->two_pass_quantize && cinfo->enable_2pass_quant) {
4799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	cinfo->cquantize = master->quantizer_2pass;
4809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	master->pub.is_dummy_pass = TRUE;
4819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      } else if (cinfo->enable_1pass_quant) {
4829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	cinfo->cquantize = master->quantizer_1pass;
4839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      } else {
4849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	ERREXIT(cinfo, JERR_MODE_CHANGE);
4859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      }
4869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
4879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    (*cinfo->idct->start_pass) (cinfo);
4889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    (*cinfo->coef->start_output_pass) (cinfo);
4899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (! cinfo->raw_data_out) {
4909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      if (! master->using_merged_upsample)
4919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	(*cinfo->cconvert->start_pass) (cinfo);
4929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      (*cinfo->upsample->start_pass) (cinfo);
4939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      if (cinfo->quantize_colors)
4949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	(*cinfo->cquantize->start_pass) (cinfo, master->pub.is_dummy_pass);
4959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      (*cinfo->post->start_pass) (cinfo,
4969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	    (master->pub.is_dummy_pass ? JBUF_SAVE_AND_PASS : JBUF_PASS_THRU));
4979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      (*cinfo->main->start_pass) (cinfo, JBUF_PASS_THRU);
4989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
4999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
5009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Set up progress monitor's pass info if present */
5029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (cinfo->progress != NULL) {
5039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    cinfo->progress->completed_passes = master->pass_number;
5049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    cinfo->progress->total_passes = master->pass_number +
5059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project				    (master->pub.is_dummy_pass ? 2 : 1);
5069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* In buffered-image mode, we assume one more output pass if EOI not
5079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project     * yet reached, but no more passes if EOI has been reached.
5089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project     */
5099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (cinfo->buffered_image && ! cinfo->inputctl->eoi_reached) {
5109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      cinfo->progress->total_passes += (cinfo->enable_2pass_quant ? 2 : 1);
5119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
5129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
5139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
5149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
5179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Finish up at end of an output pass.
5189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
5199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void)
5219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectfinish_output_pass (j_decompress_ptr cinfo)
5229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
5239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  my_master_ptr master = (my_master_ptr) cinfo->master;
5249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (cinfo->quantize_colors)
5269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    (*cinfo->cquantize->finish_pass) (cinfo);
5279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  master->pass_number++;
5289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
5299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef D_MULTISCAN_FILES_SUPPORTED
5329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
5349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Switch to a new external colormap between output passes.
5359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
5369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(void)
5389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjpeg_new_colormap (j_decompress_ptr cinfo)
5399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
5409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  my_master_ptr master = (my_master_ptr) cinfo->master;
5419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Prevent application from calling me at wrong times */
5439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (cinfo->global_state != DSTATE_BUFIMAGE)
5449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
5459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (cinfo->quantize_colors && cinfo->enable_external_quant &&
5479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      cinfo->colormap != NULL) {
5489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Select 2-pass quantizer for external colormap use */
5499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    cinfo->cquantize = master->quantizer_2pass;
5509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Notify quantizer of colormap change */
5519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    (*cinfo->cquantize->new_color_map) (cinfo);
5529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    master->pub.is_dummy_pass = FALSE; /* just in case */
5539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  } else
5549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ERREXIT(cinfo, JERR_MODE_CHANGE);
5559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
5569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif /* D_MULTISCAN_FILES_SUPPORTED */
5589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
5619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Initialize master decompression control and select active modules.
5629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This is performed at the start of jpeg_start_decompress.
5639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
5649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(void)
5669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjinit_master_decompress (j_decompress_ptr cinfo)
5679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
5689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  my_master_ptr master;
5699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  master = (my_master_ptr)
5719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
5729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project				  SIZEOF(my_decomp_master));
5739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  cinfo->master = (struct jpeg_decomp_master *) master;
5749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  master->pub.prepare_for_output_pass = prepare_for_output_pass;
5759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  master->pub.finish_output_pass = finish_output_pass;
5769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  master->pub.is_dummy_pass = FALSE;
5789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  master_selection(cinfo);
5809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
581