jdmaster.c revision cc66ecf44d1407039b05ffd7b3342389f95c17b7
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