1793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/* 2793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * jcmaster.c 3793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * 4793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Copyright (C) 1991-1997, Thomas G. Lane. 5793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Modified 2003-2011 by Guido Vollbeding. 6793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * This file is part of the Independent JPEG Group's software. 7793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * For conditions of distribution and use, see the accompanying README file. 8793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * 9793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * This file contains master control logic for the JPEG compressor. 10793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * These routines are concerned with parameter validation, initial setup, 11793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * and inter-pass control (determining the number of passes and the work 12793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * to be done in each pass). 13793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */ 14793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 15793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define JPEG_INTERNALS 16793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "jinclude.h" 17793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "jpeglib.h" 18793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 19793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 20793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/* Private state */ 21793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 22793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef enum { 23793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler main_pass, /* input data, also do first output step */ 24793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler huff_opt_pass, /* Huffman code optimization pass */ 25793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler output_pass /* data output pass */ 26793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} c_pass_type; 27793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 28793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef struct { 29793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler struct jpeg_comp_master pub; /* public fields */ 30793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 31793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler c_pass_type pass_type; /* the type of the current pass */ 32793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 33793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int pass_number; /* # of passes completed */ 34793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int total_passes; /* total # of passes needed */ 35793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 36793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int scan_number; /* current index in scan_info[] */ 37793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} my_comp_master; 38793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 39793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef my_comp_master * my_master_ptr; 40793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 41793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 42793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/* 43793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Support routines that do various essential calculations. 44793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */ 45793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 46793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/* 47793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Compute JPEG image dimensions and related values. 48793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * NOTE: this is exported for possible use by application. 49793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Hence it mustn't do anything that can't be done twice. 50793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */ 51793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 52793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerGLOBAL(void) 53793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerjpeg_calc_jpeg_dimensions (j_compress_ptr cinfo) 54793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/* Do computations that are needed before master selection phase */ 55793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 56793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef DCT_SCALING_SUPPORTED 57793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 58793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Sanity check on input image dimensions to prevent overflow in 59793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * following calculation. 60793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * We do check jpeg_width and jpeg_height in initial_setup below, 61793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * but image_width and image_height can come from arbitrary data, 62793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * and we need some space for multiplication by block_size. 63793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */ 64793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (((long) cinfo->image_width >> 24) || ((long) cinfo->image_height >> 24)) 65793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION); 66793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 67793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Compute actual JPEG image dimensions and DCT scaling choices. */ 68793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (cinfo->scale_num >= cinfo->scale_denom * cinfo->block_size) { 69793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Provide block_size/1 scaling */ 70793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->jpeg_width = cinfo->image_width * cinfo->block_size; 71793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->jpeg_height = cinfo->image_height * cinfo->block_size; 72793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->min_DCT_h_scaled_size = 1; 73793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->min_DCT_v_scaled_size = 1; 74793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } else if (cinfo->scale_num * 2 >= cinfo->scale_denom * cinfo->block_size) { 75793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Provide block_size/2 scaling */ 76793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->jpeg_width = (JDIMENSION) 77793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 2L); 78793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->jpeg_height = (JDIMENSION) 79793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 2L); 80793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->min_DCT_h_scaled_size = 2; 81793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->min_DCT_v_scaled_size = 2; 82793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } else if (cinfo->scale_num * 3 >= cinfo->scale_denom * cinfo->block_size) { 83793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Provide block_size/3 scaling */ 84793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->jpeg_width = (JDIMENSION) 85793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 3L); 86793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->jpeg_height = (JDIMENSION) 87793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 3L); 88793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->min_DCT_h_scaled_size = 3; 89793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->min_DCT_v_scaled_size = 3; 90793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } else if (cinfo->scale_num * 4 >= cinfo->scale_denom * cinfo->block_size) { 91793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Provide block_size/4 scaling */ 92793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->jpeg_width = (JDIMENSION) 93793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 4L); 94793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->jpeg_height = (JDIMENSION) 95793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 4L); 96793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->min_DCT_h_scaled_size = 4; 97793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->min_DCT_v_scaled_size = 4; 98793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } else if (cinfo->scale_num * 5 >= cinfo->scale_denom * cinfo->block_size) { 99793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Provide block_size/5 scaling */ 100793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->jpeg_width = (JDIMENSION) 101793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 5L); 102793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->jpeg_height = (JDIMENSION) 103793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 5L); 104793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->min_DCT_h_scaled_size = 5; 105793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->min_DCT_v_scaled_size = 5; 106793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } else if (cinfo->scale_num * 6 >= cinfo->scale_denom * cinfo->block_size) { 107793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Provide block_size/6 scaling */ 108793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->jpeg_width = (JDIMENSION) 109793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 6L); 110793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->jpeg_height = (JDIMENSION) 111793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 6L); 112793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->min_DCT_h_scaled_size = 6; 113793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->min_DCT_v_scaled_size = 6; 114793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } else if (cinfo->scale_num * 7 >= cinfo->scale_denom * cinfo->block_size) { 115793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Provide block_size/7 scaling */ 116793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->jpeg_width = (JDIMENSION) 117793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 7L); 118793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->jpeg_height = (JDIMENSION) 119793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 7L); 120793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->min_DCT_h_scaled_size = 7; 121793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->min_DCT_v_scaled_size = 7; 122793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } else if (cinfo->scale_num * 8 >= cinfo->scale_denom * cinfo->block_size) { 123793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Provide block_size/8 scaling */ 124793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->jpeg_width = (JDIMENSION) 125793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 8L); 126793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->jpeg_height = (JDIMENSION) 127793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 8L); 128793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->min_DCT_h_scaled_size = 8; 129793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->min_DCT_v_scaled_size = 8; 130793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } else if (cinfo->scale_num * 9 >= cinfo->scale_denom * cinfo->block_size) { 131793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Provide block_size/9 scaling */ 132793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->jpeg_width = (JDIMENSION) 133793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 9L); 134793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->jpeg_height = (JDIMENSION) 135793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 9L); 136793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->min_DCT_h_scaled_size = 9; 137793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->min_DCT_v_scaled_size = 9; 138793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } else if (cinfo->scale_num * 10 >= cinfo->scale_denom * cinfo->block_size) { 139793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Provide block_size/10 scaling */ 140793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->jpeg_width = (JDIMENSION) 141793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 10L); 142793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->jpeg_height = (JDIMENSION) 143793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 10L); 144793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->min_DCT_h_scaled_size = 10; 145793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->min_DCT_v_scaled_size = 10; 146793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } else if (cinfo->scale_num * 11 >= cinfo->scale_denom * cinfo->block_size) { 147793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Provide block_size/11 scaling */ 148793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->jpeg_width = (JDIMENSION) 149793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 11L); 150793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->jpeg_height = (JDIMENSION) 151793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 11L); 152793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->min_DCT_h_scaled_size = 11; 153793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->min_DCT_v_scaled_size = 11; 154793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } else if (cinfo->scale_num * 12 >= cinfo->scale_denom * cinfo->block_size) { 155793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Provide block_size/12 scaling */ 156793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->jpeg_width = (JDIMENSION) 157793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 12L); 158793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->jpeg_height = (JDIMENSION) 159793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 12L); 160793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->min_DCT_h_scaled_size = 12; 161793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->min_DCT_v_scaled_size = 12; 162793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } else if (cinfo->scale_num * 13 >= cinfo->scale_denom * cinfo->block_size) { 163793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Provide block_size/13 scaling */ 164793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->jpeg_width = (JDIMENSION) 165793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 13L); 166793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->jpeg_height = (JDIMENSION) 167793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 13L); 168793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->min_DCT_h_scaled_size = 13; 169793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->min_DCT_v_scaled_size = 13; 170793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } else if (cinfo->scale_num * 14 >= cinfo->scale_denom * cinfo->block_size) { 171793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Provide block_size/14 scaling */ 172793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->jpeg_width = (JDIMENSION) 173793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 14L); 174793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->jpeg_height = (JDIMENSION) 175793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 14L); 176793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->min_DCT_h_scaled_size = 14; 177793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->min_DCT_v_scaled_size = 14; 178793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } else if (cinfo->scale_num * 15 >= cinfo->scale_denom * cinfo->block_size) { 179793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Provide block_size/15 scaling */ 180793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->jpeg_width = (JDIMENSION) 181793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 15L); 182793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->jpeg_height = (JDIMENSION) 183793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 15L); 184793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->min_DCT_h_scaled_size = 15; 185793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->min_DCT_v_scaled_size = 15; 186793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } else { 187793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Provide block_size/16 scaling */ 188793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->jpeg_width = (JDIMENSION) 189793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 16L); 190793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->jpeg_height = (JDIMENSION) 191793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 16L); 192793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->min_DCT_h_scaled_size = 16; 193793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->min_DCT_v_scaled_size = 16; 194793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 195793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 196793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#else /* !DCT_SCALING_SUPPORTED */ 197793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 198793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Hardwire it to "no scaling" */ 199793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->jpeg_width = cinfo->image_width; 200793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->jpeg_height = cinfo->image_height; 201793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->min_DCT_h_scaled_size = DCTSIZE; 202793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->min_DCT_v_scaled_size = DCTSIZE; 203793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 204793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif /* DCT_SCALING_SUPPORTED */ 205793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 206793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 207793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 208793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerLOCAL(void) 209793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerjpeg_calc_trans_dimensions (j_compress_ptr cinfo) 210793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 211793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (cinfo->min_DCT_h_scaled_size != cinfo->min_DCT_v_scaled_size) 212793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ERREXIT2(cinfo, JERR_BAD_DCTSIZE, 213793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->min_DCT_h_scaled_size, cinfo->min_DCT_v_scaled_size); 214793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 215793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->block_size = cinfo->min_DCT_h_scaled_size; 216793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 217793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 218793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 219793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerLOCAL(void) 220793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerinitial_setup (j_compress_ptr cinfo, boolean transcode_only) 221793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/* Do computations that are needed before master selection phase */ 222793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 223793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int ci, ssize; 224793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jpeg_component_info *compptr; 225793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler long samplesperrow; 226793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler JDIMENSION jd_samplesperrow; 227793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 228793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (transcode_only) 229793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jpeg_calc_trans_dimensions(cinfo); 230793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 231793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jpeg_calc_jpeg_dimensions(cinfo); 232793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 233793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Sanity check on block_size */ 234793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (cinfo->block_size < 1 || cinfo->block_size > 16) 235793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ERREXIT2(cinfo, JERR_BAD_DCTSIZE, cinfo->block_size, cinfo->block_size); 236793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 237793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Derive natural_order from block_size */ 238793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler switch (cinfo->block_size) { 239793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case 2: cinfo->natural_order = jpeg_natural_order2; break; 240793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case 3: cinfo->natural_order = jpeg_natural_order3; break; 241793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case 4: cinfo->natural_order = jpeg_natural_order4; break; 242793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case 5: cinfo->natural_order = jpeg_natural_order5; break; 243793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case 6: cinfo->natural_order = jpeg_natural_order6; break; 244793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case 7: cinfo->natural_order = jpeg_natural_order7; break; 245793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler default: cinfo->natural_order = jpeg_natural_order; break; 246793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 247793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 248793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Derive lim_Se from block_size */ 249793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->lim_Se = cinfo->block_size < DCTSIZE ? 250793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->block_size * cinfo->block_size - 1 : DCTSIZE2-1; 251793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 252793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Sanity check on image dimensions */ 253793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (cinfo->jpeg_height <= 0 || cinfo->jpeg_width <= 0 || 254793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->num_components <= 0 || cinfo->input_components <= 0) 255793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ERREXIT(cinfo, JERR_EMPTY_IMAGE); 256793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 257793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Make sure image isn't bigger than I can handle */ 258793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if ((long) cinfo->jpeg_height > (long) JPEG_MAX_DIMENSION || 259793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (long) cinfo->jpeg_width > (long) JPEG_MAX_DIMENSION) 260793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION); 261793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 262793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Width of an input scanline must be representable as JDIMENSION. */ 263793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler samplesperrow = (long) cinfo->image_width * (long) cinfo->input_components; 264793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jd_samplesperrow = (JDIMENSION) samplesperrow; 265793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if ((long) jd_samplesperrow != samplesperrow) 266793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ERREXIT(cinfo, JERR_WIDTH_OVERFLOW); 267793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 268793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* For now, precision must match compiled-in value... */ 269793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (cinfo->data_precision != BITS_IN_JSAMPLE) 270793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision); 271793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 272793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Check that number of components won't exceed internal array sizes */ 273793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (cinfo->num_components > MAX_COMPONENTS) 274793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components, 275793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler MAX_COMPONENTS); 276793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 277793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Compute maximum sampling factors; check factor validity */ 278793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->max_h_samp_factor = 1; 279793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->max_v_samp_factor = 1; 280793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; 281793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ci++, compptr++) { 282793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (compptr->h_samp_factor<=0 || compptr->h_samp_factor>MAX_SAMP_FACTOR || 283793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler compptr->v_samp_factor<=0 || compptr->v_samp_factor>MAX_SAMP_FACTOR) 284793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ERREXIT(cinfo, JERR_BAD_SAMPLING); 285793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->max_h_samp_factor = MAX(cinfo->max_h_samp_factor, 286793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler compptr->h_samp_factor); 287793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->max_v_samp_factor = MAX(cinfo->max_v_samp_factor, 288793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler compptr->v_samp_factor); 289793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 290793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 291793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Compute dimensions of components */ 292793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; 293793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ci++, compptr++) { 294793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Fill in the correct component_index value; don't rely on application */ 295793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler compptr->component_index = ci; 296793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* In selecting the actual DCT scaling for each component, we try to 297793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * scale down the chroma components via DCT scaling rather than downsampling. 298793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * This saves time if the downsampler gets to use 1:1 scaling. 299793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Note this code adapts subsampling ratios which are powers of 2. 300793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */ 301793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ssize = 1; 302793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef DCT_SCALING_SUPPORTED 303793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler while (cinfo->min_DCT_h_scaled_size * ssize <= 304793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (cinfo->do_fancy_downsampling ? DCTSIZE : DCTSIZE / 2) && 305793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (cinfo->max_h_samp_factor % (compptr->h_samp_factor * ssize * 2)) == 0) { 306793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ssize = ssize * 2; 307793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 308793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 309793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler compptr->DCT_h_scaled_size = cinfo->min_DCT_h_scaled_size * ssize; 310793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ssize = 1; 311793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef DCT_SCALING_SUPPORTED 312793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler while (cinfo->min_DCT_v_scaled_size * ssize <= 313793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (cinfo->do_fancy_downsampling ? DCTSIZE : DCTSIZE / 2) && 314793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (cinfo->max_v_samp_factor % (compptr->v_samp_factor * ssize * 2)) == 0) { 315793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ssize = ssize * 2; 316793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 317793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 318793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler compptr->DCT_v_scaled_size = cinfo->min_DCT_v_scaled_size * ssize; 319793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 320793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* We don't support DCT ratios larger than 2. */ 321793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (compptr->DCT_h_scaled_size > compptr->DCT_v_scaled_size * 2) 322793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler compptr->DCT_h_scaled_size = compptr->DCT_v_scaled_size * 2; 323793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else if (compptr->DCT_v_scaled_size > compptr->DCT_h_scaled_size * 2) 324793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler compptr->DCT_v_scaled_size = compptr->DCT_h_scaled_size * 2; 325793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 326793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Size in DCT blocks */ 327793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler compptr->width_in_blocks = (JDIMENSION) 328793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jdiv_round_up((long) cinfo->jpeg_width * (long) compptr->h_samp_factor, 329793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (long) (cinfo->max_h_samp_factor * cinfo->block_size)); 330793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler compptr->height_in_blocks = (JDIMENSION) 331793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jdiv_round_up((long) cinfo->jpeg_height * (long) compptr->v_samp_factor, 332793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (long) (cinfo->max_v_samp_factor * cinfo->block_size)); 333793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Size in samples */ 334793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler compptr->downsampled_width = (JDIMENSION) 335793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jdiv_round_up((long) cinfo->jpeg_width * 336793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (long) (compptr->h_samp_factor * compptr->DCT_h_scaled_size), 337793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (long) (cinfo->max_h_samp_factor * cinfo->block_size)); 338793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler compptr->downsampled_height = (JDIMENSION) 339793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jdiv_round_up((long) cinfo->jpeg_height * 340793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (long) (compptr->v_samp_factor * compptr->DCT_v_scaled_size), 341793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (long) (cinfo->max_v_samp_factor * cinfo->block_size)); 342793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Mark component needed (this flag isn't actually used for compression) */ 343793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler compptr->component_needed = TRUE; 344793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 345793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 346793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Compute number of fully interleaved MCU rows (number of times that 347793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * main controller will call coefficient controller). 348793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */ 349793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->total_iMCU_rows = (JDIMENSION) 350793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jdiv_round_up((long) cinfo->jpeg_height, 351793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (long) (cinfo->max_v_samp_factor * cinfo->block_size)); 352793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 353793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 354793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 355793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef C_MULTISCAN_FILES_SUPPORTED 356793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 357793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerLOCAL(void) 358793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervalidate_script (j_compress_ptr cinfo) 359793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/* Verify that the scan script in cinfo->scan_info[] is valid; also 360793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * determine whether it uses progressive JPEG, and set cinfo->progressive_mode. 361793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */ 362793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 363793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler const jpeg_scan_info * scanptr; 364793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int scanno, ncomps, ci, coefi, thisi; 365793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int Ss, Se, Ah, Al; 366793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler boolean component_sent[MAX_COMPONENTS]; 367793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef C_PROGRESSIVE_SUPPORTED 368793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int * last_bitpos_ptr; 369793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int last_bitpos[MAX_COMPONENTS][DCTSIZE2]; 370793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* -1 until that coefficient has been seen; then last Al for it */ 371793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 372793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 373793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (cinfo->num_scans <= 0) 374793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, 0); 375793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 376793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* For sequential JPEG, all scans must have Ss=0, Se=DCTSIZE2-1; 377793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * for progressive JPEG, no scan can have this. 378793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */ 379793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler scanptr = cinfo->scan_info; 380793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (scanptr->Ss != 0 || scanptr->Se != DCTSIZE2-1) { 381793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef C_PROGRESSIVE_SUPPORTED 382793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->progressive_mode = TRUE; 383793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler last_bitpos_ptr = & last_bitpos[0][0]; 384793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for (ci = 0; ci < cinfo->num_components; ci++) 385793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for (coefi = 0; coefi < DCTSIZE2; coefi++) 386793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *last_bitpos_ptr++ = -1; 387793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#else 388793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ERREXIT(cinfo, JERR_NOT_COMPILED); 389793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 390793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } else { 391793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->progressive_mode = FALSE; 392793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for (ci = 0; ci < cinfo->num_components; ci++) 393793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler component_sent[ci] = FALSE; 394793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 395793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 396793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for (scanno = 1; scanno <= cinfo->num_scans; scanptr++, scanno++) { 397793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Validate component indexes */ 398793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ncomps = scanptr->comps_in_scan; 399793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (ncomps <= 0 || ncomps > MAX_COMPS_IN_SCAN) 400793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ERREXIT2(cinfo, JERR_COMPONENT_COUNT, ncomps, MAX_COMPS_IN_SCAN); 401793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for (ci = 0; ci < ncomps; ci++) { 402793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler thisi = scanptr->component_index[ci]; 403793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (thisi < 0 || thisi >= cinfo->num_components) 404793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno); 405793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Components must appear in SOF order within each scan */ 406793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (ci > 0 && thisi <= scanptr->component_index[ci-1]) 407793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno); 408793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 409793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Validate progression parameters */ 410793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Ss = scanptr->Ss; 411793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Se = scanptr->Se; 412793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Ah = scanptr->Ah; 413793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Al = scanptr->Al; 414793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (cinfo->progressive_mode) { 415793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef C_PROGRESSIVE_SUPPORTED 416793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* The JPEG spec simply gives the ranges 0..13 for Ah and Al, but that 417793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * seems wrong: the upper bound ought to depend on data precision. 418793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Perhaps they really meant 0..N+1 for N-bit precision. 419793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Here we allow 0..10 for 8-bit data; Al larger than 10 results in 420793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * out-of-range reconstructed DC values during the first DC scan, 421793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * which might cause problems for some decoders. 422793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */ 423793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#if BITS_IN_JSAMPLE == 8 424793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define MAX_AH_AL 10 425793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#else 426793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#define MAX_AH_AL 13 427793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 428793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (Ss < 0 || Ss >= DCTSIZE2 || Se < Ss || Se >= DCTSIZE2 || 429793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Ah < 0 || Ah > MAX_AH_AL || Al < 0 || Al > MAX_AH_AL) 430793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); 431793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (Ss == 0) { 432793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (Se != 0) /* DC and AC together not OK */ 433793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); 434793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } else { 435793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (ncomps != 1) /* AC scans must be for only one component */ 436793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); 437793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 438793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for (ci = 0; ci < ncomps; ci++) { 439793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler last_bitpos_ptr = & last_bitpos[scanptr->component_index[ci]][0]; 440793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (Ss != 0 && last_bitpos_ptr[0] < 0) /* AC without prior DC scan */ 441793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); 442793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for (coefi = Ss; coefi <= Se; coefi++) { 443793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (last_bitpos_ptr[coefi] < 0) { 444793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* first scan of this coefficient */ 445793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (Ah != 0) 446793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); 447793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } else { 448793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* not first scan */ 449793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (Ah != last_bitpos_ptr[coefi] || Al != Ah-1) 450793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); 451793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 452793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler last_bitpos_ptr[coefi] = Al; 453793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 454793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 455793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 456793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } else { 457793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* For sequential JPEG, all progression parameters must be these: */ 458793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (Ss != 0 || Se != DCTSIZE2-1 || Ah != 0 || Al != 0) 459793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); 460793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Make sure components are not sent twice */ 461793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for (ci = 0; ci < ncomps; ci++) { 462793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler thisi = scanptr->component_index[ci]; 463793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (component_sent[thisi]) 464793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno); 465793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler component_sent[thisi] = TRUE; 466793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 467793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 468793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 469793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 470793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Now verify that everything got sent. */ 471793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (cinfo->progressive_mode) { 472793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef C_PROGRESSIVE_SUPPORTED 473793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* For progressive mode, we only check that at least some DC data 474793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * got sent for each component; the spec does not require that all bits 475793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * of all coefficients be transmitted. Would it be wiser to enforce 476793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * transmission of all coefficient bits?? 477793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */ 478793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for (ci = 0; ci < cinfo->num_components; ci++) { 479793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (last_bitpos[ci][0] < 0) 480793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ERREXIT(cinfo, JERR_MISSING_DATA); 481793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 482793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 483793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } else { 484793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for (ci = 0; ci < cinfo->num_components; ci++) { 485793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (! component_sent[ci]) 486793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ERREXIT(cinfo, JERR_MISSING_DATA); 487793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 488793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 489793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 490793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 491793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 492793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerLOCAL(void) 493793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerreduce_script (j_compress_ptr cinfo) 494793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/* Adapt scan script for use with reduced block size; 495793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * assume that script has been validated before. 496793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */ 497793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 498793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jpeg_scan_info * scanptr; 499793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int idxout, idxin; 500793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 501793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Circumvent const declaration for this function */ 502793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler scanptr = (jpeg_scan_info *) cinfo->scan_info; 503793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler idxout = 0; 504793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 505793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for (idxin = 0; idxin < cinfo->num_scans; idxin++) { 506793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* After skipping, idxout becomes smaller than idxin */ 507793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (idxin != idxout) 508793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Copy rest of data; 509793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * note we stay in given chunk of allocated memory. 510793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */ 511793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler scanptr[idxout] = scanptr[idxin]; 512793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (scanptr[idxout].Ss > cinfo->lim_Se) 513793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Entire scan out of range - skip this entry */ 514793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler continue; 515793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (scanptr[idxout].Se > cinfo->lim_Se) 516793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Limit scan to end of block */ 517793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler scanptr[idxout].Se = cinfo->lim_Se; 518793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler idxout++; 519793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 520793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 521793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->num_scans = idxout; 522793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 523793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 524793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif /* C_MULTISCAN_FILES_SUPPORTED */ 525793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 526793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 527793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerLOCAL(void) 528793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerselect_scan_parameters (j_compress_ptr cinfo) 529793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/* Set up the scan parameters for the current scan */ 530793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 531793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int ci; 532793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 533793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef C_MULTISCAN_FILES_SUPPORTED 534793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (cinfo->scan_info != NULL) { 535793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Prepare for current scan --- the script is already validated */ 536793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler my_master_ptr master = (my_master_ptr) cinfo->master; 537793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler const jpeg_scan_info * scanptr = cinfo->scan_info + master->scan_number; 538793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 539793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->comps_in_scan = scanptr->comps_in_scan; 540793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for (ci = 0; ci < scanptr->comps_in_scan; ci++) { 541793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->cur_comp_info[ci] = 542793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler &cinfo->comp_info[scanptr->component_index[ci]]; 543793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 544793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (cinfo->progressive_mode) { 545793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->Ss = scanptr->Ss; 546793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->Se = scanptr->Se; 547793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->Ah = scanptr->Ah; 548793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->Al = scanptr->Al; 549793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 550793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 551793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 552793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 553793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 554793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 555793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Prepare for single sequential-JPEG scan containing all components */ 556793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (cinfo->num_components > MAX_COMPS_IN_SCAN) 557793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components, 558793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler MAX_COMPS_IN_SCAN); 559793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->comps_in_scan = cinfo->num_components; 560793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for (ci = 0; ci < cinfo->num_components; ci++) { 561793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->cur_comp_info[ci] = &cinfo->comp_info[ci]; 562793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 563793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 564793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->Ss = 0; 565793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->Se = cinfo->block_size * cinfo->block_size - 1; 566793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->Ah = 0; 567793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->Al = 0; 568793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 569793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 570793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 571793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerLOCAL(void) 572793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerper_scan_setup (j_compress_ptr cinfo) 573793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/* Do computations that are needed before processing a JPEG scan */ 574793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/* cinfo->comps_in_scan and cinfo->cur_comp_info[] are already set */ 575793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 576793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int ci, mcublks, tmp; 577793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jpeg_component_info *compptr; 578793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 579793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (cinfo->comps_in_scan == 1) { 580793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 581793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Noninterleaved (single-component) scan */ 582793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler compptr = cinfo->cur_comp_info[0]; 583793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 584793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Overall image size in MCUs */ 585793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->MCUs_per_row = compptr->width_in_blocks; 586793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->MCU_rows_in_scan = compptr->height_in_blocks; 587793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 588793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* For noninterleaved scan, always one block per MCU */ 589793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler compptr->MCU_width = 1; 590793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler compptr->MCU_height = 1; 591793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler compptr->MCU_blocks = 1; 592793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler compptr->MCU_sample_width = compptr->DCT_h_scaled_size; 593793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler compptr->last_col_width = 1; 594793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* For noninterleaved scans, it is convenient to define last_row_height 595793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * as the number of block rows present in the last iMCU row. 596793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */ 597793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler tmp = (int) (compptr->height_in_blocks % compptr->v_samp_factor); 598793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (tmp == 0) tmp = compptr->v_samp_factor; 599793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler compptr->last_row_height = tmp; 600793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 601793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Prepare array describing MCU composition */ 602793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->blocks_in_MCU = 1; 603793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->MCU_membership[0] = 0; 604793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 605793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } else { 606793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 607793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Interleaved (multi-component) scan */ 608793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (cinfo->comps_in_scan <= 0 || cinfo->comps_in_scan > MAX_COMPS_IN_SCAN) 609793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->comps_in_scan, 610793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler MAX_COMPS_IN_SCAN); 611793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 612793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Overall image size in MCUs */ 613793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->MCUs_per_row = (JDIMENSION) 614793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jdiv_round_up((long) cinfo->jpeg_width, 615793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (long) (cinfo->max_h_samp_factor * cinfo->block_size)); 616793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->MCU_rows_in_scan = (JDIMENSION) 617793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler jdiv_round_up((long) cinfo->jpeg_height, 618793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (long) (cinfo->max_v_samp_factor * cinfo->block_size)); 619793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 620793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->blocks_in_MCU = 0; 621793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 622793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for (ci = 0; ci < cinfo->comps_in_scan; ci++) { 623793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler compptr = cinfo->cur_comp_info[ci]; 624793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Sampling factors give # of blocks of component in each MCU */ 625793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler compptr->MCU_width = compptr->h_samp_factor; 626793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler compptr->MCU_height = compptr->v_samp_factor; 627793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler compptr->MCU_blocks = compptr->MCU_width * compptr->MCU_height; 628793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler compptr->MCU_sample_width = compptr->MCU_width * compptr->DCT_h_scaled_size; 629793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Figure number of non-dummy blocks in last MCU column & row */ 630793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler tmp = (int) (compptr->width_in_blocks % compptr->MCU_width); 631793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (tmp == 0) tmp = compptr->MCU_width; 632793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler compptr->last_col_width = tmp; 633793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler tmp = (int) (compptr->height_in_blocks % compptr->MCU_height); 634793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (tmp == 0) tmp = compptr->MCU_height; 635793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler compptr->last_row_height = tmp; 636793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Prepare array describing MCU composition */ 637793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler mcublks = compptr->MCU_blocks; 638793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (cinfo->blocks_in_MCU + mcublks > C_MAX_BLOCKS_IN_MCU) 639793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ERREXIT(cinfo, JERR_BAD_MCU_SIZE); 640793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler while (mcublks-- > 0) { 641793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci; 642793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 643793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 644793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 645793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 646793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 647793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Convert restart specified in rows to actual MCU count. */ 648793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Note that count must fit in 16 bits, so we provide limiting. */ 649793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (cinfo->restart_in_rows > 0) { 650793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler long nominal = (long) cinfo->restart_in_rows * (long) cinfo->MCUs_per_row; 651793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->restart_interval = (unsigned int) MIN(nominal, 65535L); 652793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 653793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 654793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 655793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 656793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/* 657793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Per-pass setup. 658793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * This is called at the beginning of each pass. We determine which modules 659793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * will be active during this pass and give them appropriate start_pass calls. 660793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * We also set is_last_pass to indicate whether any more passes will be 661793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * required. 662793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */ 663793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 664793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerMETHODDEF(void) 665793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerprepare_for_pass (j_compress_ptr cinfo) 666793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 667793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler my_master_ptr master = (my_master_ptr) cinfo->master; 668793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 669793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler switch (master->pass_type) { 670793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case main_pass: 671793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Initial pass: will collect input data, and do either Huffman 672793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * optimization or data output for the first scan. 673793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */ 674793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler select_scan_parameters(cinfo); 675793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler per_scan_setup(cinfo); 676793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (! cinfo->raw_data_in) { 677793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (*cinfo->cconvert->start_pass) (cinfo); 678793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (*cinfo->downsample->start_pass) (cinfo); 679793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (*cinfo->prep->start_pass) (cinfo, JBUF_PASS_THRU); 680793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 681793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (*cinfo->fdct->start_pass) (cinfo); 682793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (*cinfo->entropy->start_pass) (cinfo, cinfo->optimize_coding); 683793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (*cinfo->coef->start_pass) (cinfo, 684793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (master->total_passes > 1 ? 685793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler JBUF_SAVE_AND_PASS : JBUF_PASS_THRU)); 686793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (*cinfo->main->start_pass) (cinfo, JBUF_PASS_THRU); 687793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (cinfo->optimize_coding) { 688793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* No immediate data output; postpone writing frame/scan headers */ 689793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler master->pub.call_pass_startup = FALSE; 690793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } else { 691793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Will write frame/scan headers at first jpeg_write_scanlines call */ 692793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler master->pub.call_pass_startup = TRUE; 693793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 694793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler break; 695793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef ENTROPY_OPT_SUPPORTED 696793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case huff_opt_pass: 697793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Do Huffman optimization for a scan after the first one. */ 698793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler select_scan_parameters(cinfo); 699793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler per_scan_setup(cinfo); 700793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (cinfo->Ss != 0 || cinfo->Ah == 0) { 701793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (*cinfo->entropy->start_pass) (cinfo, TRUE); 702793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (*cinfo->coef->start_pass) (cinfo, JBUF_CRANK_DEST); 703793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler master->pub.call_pass_startup = FALSE; 704793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler break; 705793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 706793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Special case: Huffman DC refinement scans need no Huffman table 707793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * and therefore we can skip the optimization pass for them. 708793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */ 709793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler master->pass_type = output_pass; 710793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler master->pass_number++; 711793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /*FALLTHROUGH*/ 712793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 713793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case output_pass: 714793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Do a data-output pass. */ 715793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* We need not repeat per-scan setup if prior optimization pass did it. */ 716793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (! cinfo->optimize_coding) { 717793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler select_scan_parameters(cinfo); 718793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler per_scan_setup(cinfo); 719793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 720793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (*cinfo->entropy->start_pass) (cinfo, FALSE); 721793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (*cinfo->coef->start_pass) (cinfo, JBUF_CRANK_DEST); 722793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* We emit frame/scan headers now */ 723793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (master->scan_number == 0) 724793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (*cinfo->marker->write_frame_header) (cinfo); 725793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (*cinfo->marker->write_scan_header) (cinfo); 726793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler master->pub.call_pass_startup = FALSE; 727793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler break; 728793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler default: 729793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ERREXIT(cinfo, JERR_NOT_COMPILED); 730793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 731793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 732793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler master->pub.is_last_pass = (master->pass_number == master->total_passes-1); 733793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 734793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Set up progress monitor's pass info if present */ 735793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (cinfo->progress != NULL) { 736793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->progress->completed_passes = master->pass_number; 737793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->progress->total_passes = master->total_passes; 738793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 739793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 740793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 741793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 742793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/* 743793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Special start-of-pass hook. 744793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * This is called by jpeg_write_scanlines if call_pass_startup is TRUE. 745793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * In single-pass processing, we need this hook because we don't want to 746793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * write frame/scan headers during jpeg_start_compress; we want to let the 747793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * application write COM markers etc. between jpeg_start_compress and the 748793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * jpeg_write_scanlines loop. 749793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * In multi-pass processing, this routine is not used. 750793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */ 751793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 752793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerMETHODDEF(void) 753793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpass_startup (j_compress_ptr cinfo) 754793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 755793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->master->call_pass_startup = FALSE; /* reset flag so call only once */ 756793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 757793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (*cinfo->marker->write_frame_header) (cinfo); 758793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (*cinfo->marker->write_scan_header) (cinfo); 759793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 760793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 761793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 762793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/* 763793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Finish up at end of pass. 764793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */ 765793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 766793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerMETHODDEF(void) 767793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerfinish_pass_master (j_compress_ptr cinfo) 768793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 769793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler my_master_ptr master = (my_master_ptr) cinfo->master; 770793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 771793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* The entropy coder always needs an end-of-pass call, 772793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * either to analyze statistics or to flush its output buffer. 773793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */ 774793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (*cinfo->entropy->finish_pass) (cinfo); 775793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 776793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Update state for next pass */ 777793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler switch (master->pass_type) { 778793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case main_pass: 779793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* next pass is either output of scan 0 (after optimization) 780793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * or output of scan 1 (if no optimization). 781793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */ 782793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler master->pass_type = output_pass; 783793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (! cinfo->optimize_coding) 784793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler master->scan_number++; 785793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler break; 786793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case huff_opt_pass: 787793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* next pass is always output of current scan */ 788793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler master->pass_type = output_pass; 789793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler break; 790793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler case output_pass: 791793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* next pass is either optimization or output of next scan */ 792793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (cinfo->optimize_coding) 793793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler master->pass_type = huff_opt_pass; 794793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler master->scan_number++; 795793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler break; 796793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 797793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 798793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler master->pass_number++; 799793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 800793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 801793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 802793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/* 803793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Initialize master compression control. 804793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */ 805793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 806793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerGLOBAL(void) 807793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerjinit_c_master_control (j_compress_ptr cinfo, boolean transcode_only) 808793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 809793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler my_master_ptr master; 810793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 811793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler master = (my_master_ptr) 812793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 813793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler SIZEOF(my_comp_master)); 814793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->master = (struct jpeg_comp_master *) master; 815793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler master->pub.prepare_for_pass = prepare_for_pass; 816793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler master->pub.pass_startup = pass_startup; 817793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler master->pub.finish_pass = finish_pass_master; 818793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler master->pub.is_last_pass = FALSE; 819793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 820793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Validate parameters, determine derived values */ 821793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler initial_setup(cinfo, transcode_only); 822793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 823793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (cinfo->scan_info != NULL) { 824793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef C_MULTISCAN_FILES_SUPPORTED 825793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler validate_script(cinfo); 826793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (cinfo->block_size < DCTSIZE) 827793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler reduce_script(cinfo); 828793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#else 829793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ERREXIT(cinfo, JERR_NOT_COMPILED); 830793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 831793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } else { 832793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->progressive_mode = FALSE; 833793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->num_scans = 1; 834793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 835793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 836793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if ((cinfo->progressive_mode || cinfo->block_size < DCTSIZE) && 837793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler !cinfo->arith_code) /* TEMPORARY HACK ??? */ 838793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* assume default tables no good for progressive or downscale mode */ 839793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler cinfo->optimize_coding = TRUE; 840793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 841793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Initialize my private state */ 842793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (transcode_only) { 843793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* no main pass in transcoding */ 844793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (cinfo->optimize_coding) 845793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler master->pass_type = huff_opt_pass; 846793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 847793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler master->pass_type = output_pass; 848793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } else { 849793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* for normal compression, first pass is always this type: */ 850793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler master->pass_type = main_pass; 851793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 852793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler master->scan_number = 0; 853793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler master->pass_number = 0; 854793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (cinfo->optimize_coding) 855793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler master->total_passes = cinfo->num_scans * 2; 856793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 857793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler master->total_passes = cinfo->num_scans; 858793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 859