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