/src/libjpeg-turbo.main/jdphuff.c
| Line | Count | Source (jump to first uncovered line) | 
| 1 |  | /* | 
| 2 |  |  * jdphuff.c | 
| 3 |  |  * | 
| 4 |  |  * This file was part of the Independent JPEG Group's software: | 
| 5 |  |  * Copyright (C) 1995-1997, Thomas G. Lane. | 
| 6 |  |  * Lossless JPEG Modifications: | 
| 7 |  |  * Copyright (C) 1999, Ken Murchison. | 
| 8 |  |  * libjpeg-turbo Modifications: | 
| 9 |  |  * Copyright (C) 2015-2016, 2018-2022, D. R. Commander. | 
| 10 |  |  * For conditions of distribution and use, see the accompanying README.ijg | 
| 11 |  |  * file. | 
| 12 |  |  * | 
| 13 |  |  * This file contains Huffman entropy decoding routines for progressive JPEG. | 
| 14 |  |  * | 
| 15 |  |  * Much of the complexity here has to do with supporting input suspension. | 
| 16 |  |  * If the data source module demands suspension, we want to be able to back | 
| 17 |  |  * up to the start of the current MCU.  To do this, we copy state variables | 
| 18 |  |  * into local working storage, and update them back to the permanent | 
| 19 |  |  * storage only upon successful completion of an MCU. | 
| 20 |  |  * | 
| 21 |  |  * NOTE: All referenced figures are from | 
| 22 |  |  * Recommendation ITU-T T.81 (1992) | ISO/IEC 10918-1:1994. | 
| 23 |  |  */ | 
| 24 |  |  | 
| 25 |  | #define JPEG_INTERNALS | 
| 26 |  | #include "jinclude.h" | 
| 27 |  | #include "jpeglib.h" | 
| 28 |  | #include "jdhuff.h"             /* Declarations shared with jd*huff.c */ | 
| 29 |  | #include <limits.h> | 
| 30 |  |  | 
| 31 |  |  | 
| 32 |  | #ifdef D_PROGRESSIVE_SUPPORTED | 
| 33 |  |  | 
| 34 |  | /* | 
| 35 |  |  * Expanded entropy decoder object for progressive Huffman decoding. | 
| 36 |  |  * | 
| 37 |  |  * The savable_state subrecord contains fields that change within an MCU, | 
| 38 |  |  * but must not be updated permanently until we complete the MCU. | 
| 39 |  |  */ | 
| 40 |  |  | 
| 41 |  | typedef struct { | 
| 42 |  |   unsigned int EOBRUN;                  /* remaining EOBs in EOBRUN */ | 
| 43 |  |   int last_dc_val[MAX_COMPS_IN_SCAN];   /* last DC coef for each component */ | 
| 44 |  | } savable_state; | 
| 45 |  |  | 
| 46 |  | typedef struct { | 
| 47 |  |   struct jpeg_entropy_decoder pub; /* public fields */ | 
| 48 |  |  | 
| 49 |  |   /* These fields are loaded into local variables at start of each MCU. | 
| 50 |  |    * In case of suspension, we exit WITHOUT updating them. | 
| 51 |  |    */ | 
| 52 |  |   bitread_perm_state bitstate;  /* Bit buffer at start of MCU */ | 
| 53 |  |   savable_state saved;          /* Other state at start of MCU */ | 
| 54 |  |  | 
| 55 |  |   /* These fields are NOT loaded into local working state. */ | 
| 56 |  |   unsigned int restarts_to_go;  /* MCUs left in this restart interval */ | 
| 57 |  |  | 
| 58 |  |   /* Pointers to derived tables (these workspaces have image lifespan) */ | 
| 59 |  |   d_derived_tbl *derived_tbls[NUM_HUFF_TBLS]; | 
| 60 |  |  | 
| 61 |  |   d_derived_tbl *ac_derived_tbl; /* active table during an AC scan */ | 
| 62 |  | } phuff_entropy_decoder; | 
| 63 |  |  | 
| 64 |  | typedef phuff_entropy_decoder *phuff_entropy_ptr; | 
| 65 |  |  | 
| 66 |  | /* Forward declarations */ | 
| 67 |  | METHODDEF(boolean) decode_mcu_DC_first(j_decompress_ptr cinfo, | 
| 68 |  |                                        JBLOCKROW *MCU_data); | 
| 69 |  | METHODDEF(boolean) decode_mcu_AC_first(j_decompress_ptr cinfo, | 
| 70 |  |                                        JBLOCKROW *MCU_data); | 
| 71 |  | METHODDEF(boolean) decode_mcu_DC_refine(j_decompress_ptr cinfo, | 
| 72 |  |                                         JBLOCKROW *MCU_data); | 
| 73 |  | METHODDEF(boolean) decode_mcu_AC_refine(j_decompress_ptr cinfo, | 
| 74 |  |                                         JBLOCKROW *MCU_data); | 
| 75 |  |  | 
| 76 |  |  | 
| 77 |  | /* | 
| 78 |  |  * Initialize for a Huffman-compressed scan. | 
| 79 |  |  */ | 
| 80 |  |  | 
| 81 |  | METHODDEF(void) | 
| 82 |  | start_pass_phuff_decoder(j_decompress_ptr cinfo) | 
| 83 | 4.38k | { | 
| 84 | 4.38k |   phuff_entropy_ptr entropy = (phuff_entropy_ptr)cinfo->entropy; | 
| 85 | 4.38k |   boolean is_DC_band, bad; | 
| 86 | 4.38k |   int ci, coefi, tbl; | 
| 87 | 4.38k |   d_derived_tbl **pdtbl; | 
| 88 | 4.38k |   int *coef_bit_ptr, *prev_coef_bit_ptr; | 
| 89 | 4.38k |   jpeg_component_info *compptr; | 
| 90 |  |  | 
| 91 | 4.38k |   is_DC_band = (cinfo->Ss == 0); | 
| 92 |  |  | 
| 93 |  |   /* Validate scan parameters */ | 
| 94 | 4.38k |   bad = FALSE; | 
| 95 | 4.38k |   if (is_DC_band) { | 
| 96 | 1.83k |     if (cinfo->Se != 0) | 
| 97 | 4 |       bad = TRUE; | 
| 98 | 2.54k |   } else { | 
| 99 |  |     /* need not check Ss/Se < 0 since they came from unsigned bytes */ | 
| 100 | 2.54k |     if (cinfo->Ss > cinfo->Se || cinfo->Se >= DCTSIZE2) | 
| 101 | 23 |       bad = TRUE; | 
| 102 |  |     /* AC scans may have only one component */ | 
| 103 | 2.54k |     if (cinfo->comps_in_scan != 1) | 
| 104 | 1 |       bad = TRUE; | 
| 105 | 2.54k |   } | 
| 106 | 4.38k |   if (cinfo->Ah != 0) { | 
| 107 |  |     /* Successive approximation refinement scan: must have Al = Ah-1. */ | 
| 108 | 2.51k |     if (cinfo->Al != cinfo->Ah - 1) | 
| 109 | 18 |       bad = TRUE; | 
| 110 | 2.51k |   } | 
| 111 | 4.38k |   if (cinfo->Al > 13)           /* need not check for < 0 */ | 
| 112 | 7 |     bad = TRUE; | 
| 113 |  |   /* Arguably the maximum Al value should be less than 13 for 8-bit precision, | 
| 114 |  |    * but the spec doesn't say so, and we try to be liberal about what we | 
| 115 |  |    * accept.  Note: large Al values could result in out-of-range DC | 
| 116 |  |    * coefficients during early scans, leading to bizarre displays due to | 
| 117 |  |    * overflows in the IDCT math.  But we won't crash. | 
| 118 |  |    */ | 
| 119 | 4.38k |   if (bad) | 
| 120 | 33 |     ERREXIT4(cinfo, JERR_BAD_PROGRESSION, | 
| 121 | 4.38k |              cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al); | 
| 122 |  |   /* Update progression status, and verify that scan order is legal. | 
| 123 |  |    * Note that inter-scan inconsistencies are treated as warnings | 
| 124 |  |    * not fatal errors ... not clear if this is right way to behave. | 
| 125 |  |    */ | 
| 126 | 10.5k |   for (ci = 0; ci < cinfo->comps_in_scan; ci++) { | 
| 127 | 6.21k |     int cindex = cinfo->cur_comp_info[ci]->component_index; | 
| 128 | 6.21k |     coef_bit_ptr = &cinfo->coef_bits[cindex][0]; | 
| 129 | 6.21k |     prev_coef_bit_ptr = &cinfo->coef_bits[cindex + cinfo->num_components][0]; | 
| 130 | 6.21k |     if (!is_DC_band && coef_bit_ptr[0] < 0) /* AC without prior DC scan */ | 
| 131 | 1.01k |       WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, 0); | 
| 132 | 164k |     for (coefi = MIN(cinfo->Ss, 1); coefi <= MAX(cinfo->Se, 9); coefi++) { | 
| 133 | 157k |       if (cinfo->input_scan_number > 1) | 
| 134 | 130k |         prev_coef_bit_ptr[coefi] = coef_bit_ptr[coefi]; | 
| 135 | 26.8k |       else | 
| 136 | 26.8k |         prev_coef_bit_ptr[coefi] = 0; | 
| 137 | 157k |     } | 
| 138 | 87.0k |     for (coefi = cinfo->Ss; coefi <= cinfo->Se; coefi++) { | 
| 139 | 80.8k |       int expected = (coef_bit_ptr[coefi] < 0) ? 0 : coef_bit_ptr[coefi]; | 
| 140 | 80.8k |       if (cinfo->Ah != expected) | 
| 141 | 63.4k |         WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, coefi); | 
| 142 | 80.8k |       coef_bit_ptr[coefi] = cinfo->Al; | 
| 143 | 80.8k |     } | 
| 144 | 6.21k |   } | 
| 145 |  |  | 
| 146 |  |   /* Select MCU decoding routine */ | 
| 147 | 4.38k |   if (cinfo->Ah == 0) { | 
| 148 | 1.85k |     if (is_DC_band) | 
| 149 | 1.14k |       entropy->pub.decode_mcu = decode_mcu_DC_first; | 
| 150 | 712 |     else | 
| 151 | 712 |       entropy->pub.decode_mcu = decode_mcu_AC_first; | 
| 152 | 2.52k |   } else { | 
| 153 | 2.52k |     if (is_DC_band) | 
| 154 | 684 |       entropy->pub.decode_mcu = decode_mcu_DC_refine; | 
| 155 | 1.83k |     else | 
| 156 | 1.83k |       entropy->pub.decode_mcu = decode_mcu_AC_refine; | 
| 157 | 2.52k |   } | 
| 158 |  |  | 
| 159 | 10.5k |   for (ci = 0; ci < cinfo->comps_in_scan; ci++) { | 
| 160 | 6.21k |     compptr = cinfo->cur_comp_info[ci]; | 
| 161 |  |     /* Make sure requested tables are present, and compute derived tables. | 
| 162 |  |      * We may build same derived table more than once, but it's not expensive. | 
| 163 |  |      */ | 
| 164 | 6.21k |     if (is_DC_band) { | 
| 165 | 3.69k |       if (cinfo->Ah == 0) {     /* DC refinement needs no table */ | 
| 166 | 2.59k |         tbl = compptr->dc_tbl_no; | 
| 167 | 2.59k |         pdtbl = (d_derived_tbl **)(entropy->derived_tbls) + tbl; | 
| 168 | 2.59k |         jpeg_make_d_derived_tbl(cinfo, TRUE, tbl, pdtbl); | 
| 169 | 2.59k |       } | 
| 170 | 3.69k |     } else { | 
| 171 | 2.51k |       tbl = compptr->ac_tbl_no; | 
| 172 | 2.51k |       pdtbl = (d_derived_tbl **)(entropy->derived_tbls) + tbl; | 
| 173 | 2.51k |       jpeg_make_d_derived_tbl(cinfo, FALSE, tbl, pdtbl); | 
| 174 |  |       /* remember the single active table */ | 
| 175 | 2.51k |       entropy->ac_derived_tbl = entropy->derived_tbls[tbl]; | 
| 176 | 2.51k |     } | 
| 177 |  |     /* Initialize DC predictions to 0 */ | 
| 178 | 6.21k |     entropy->saved.last_dc_val[ci] = 0; | 
| 179 | 6.21k |   } | 
| 180 |  |  | 
| 181 |  |   /* Initialize bitread state variables */ | 
| 182 | 4.38k |   entropy->bitstate.bits_left = 0; | 
| 183 | 4.38k |   entropy->bitstate.get_buffer = 0; /* unnecessary, but keeps Purify quiet */ | 
| 184 | 4.38k |   entropy->pub.insufficient_data = FALSE; | 
| 185 |  |  | 
| 186 |  |   /* Initialize private state variables */ | 
| 187 | 4.38k |   entropy->saved.EOBRUN = 0; | 
| 188 |  |  | 
| 189 |  |   /* Initialize restart counter */ | 
| 190 | 4.38k |   entropy->restarts_to_go = cinfo->restart_interval; | 
| 191 | 4.38k | } | 
| 192 |  |  | 
| 193 |  |  | 
| 194 |  | /* | 
| 195 |  |  * Figure F.12: extend sign bit. | 
| 196 |  |  * On some machines, a shift and add will be faster than a table lookup. | 
| 197 |  |  */ | 
| 198 |  |  | 
| 199 |  | #define AVOID_TABLES | 
| 200 |  | #ifdef AVOID_TABLES | 
| 201 |  |  | 
| 202 | 5.15M | #define NEG_1  ((unsigned)-1) | 
| 203 |  | #define HUFF_EXTEND(x, s) \ | 
| 204 | 32.5k |   ((x) < (1 << ((s) - 1)) ? (x) + (((NEG_1) << (s)) + 1) : (x)) | 
| 205 |  |  | 
| 206 |  | #else | 
| 207 |  |  | 
| 208 |  | #define HUFF_EXTEND(x, s) \ | 
| 209 |  |   ((x) < extend_test[s] ? (x) + extend_offset[s] : (x)) | 
| 210 |  |  | 
| 211 |  | static const int extend_test[16] = {   /* entry n is 2**(n-1) */ | 
| 212 |  |   0, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, | 
| 213 |  |   0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000 | 
| 214 |  | }; | 
| 215 |  |  | 
| 216 |  | static const int extend_offset[16] = { /* entry n is (-1 << n) + 1 */ | 
| 217 |  |   0, ((-1) << 1) + 1, ((-1) << 2) + 1, ((-1) << 3) + 1, ((-1) << 4) + 1, | 
| 218 |  |   ((-1) << 5) + 1, ((-1) << 6) + 1, ((-1) << 7) + 1, ((-1) << 8) + 1, | 
| 219 |  |   ((-1) << 9) + 1, ((-1) << 10) + 1, ((-1) << 11) + 1, ((-1) << 12) + 1, | 
| 220 |  |   ((-1) << 13) + 1, ((-1) << 14) + 1, ((-1) << 15) + 1 | 
| 221 |  | }; | 
| 222 |  |  | 
| 223 |  | #endif /* AVOID_TABLES */ | 
| 224 |  |  | 
| 225 |  |  | 
| 226 |  | /* | 
| 227 |  |  * Check for a restart marker & resynchronize decoder. | 
| 228 |  |  * Returns FALSE if must suspend. | 
| 229 |  |  */ | 
| 230 |  |  | 
| 231 |  | LOCAL(boolean) | 
| 232 |  | process_restart(j_decompress_ptr cinfo) | 
| 233 | 122k | { | 
| 234 | 122k |   phuff_entropy_ptr entropy = (phuff_entropy_ptr)cinfo->entropy; | 
| 235 | 122k |   int ci; | 
| 236 |  |  | 
| 237 |  |   /* Throw away any unused bits remaining in bit buffer; */ | 
| 238 |  |   /* include any full bytes in next_marker's count of discarded bytes */ | 
| 239 | 122k |   cinfo->marker->discarded_bytes += entropy->bitstate.bits_left / 8; | 
| 240 | 122k |   entropy->bitstate.bits_left = 0; | 
| 241 |  |  | 
| 242 |  |   /* Advance past the RSTn marker */ | 
| 243 | 122k |   if (!(*cinfo->marker->read_restart_marker) (cinfo)) | 
| 244 | 0 |     return FALSE; | 
| 245 |  |  | 
| 246 |  |   /* Re-initialize DC predictions to 0 */ | 
| 247 | 245k |   for (ci = 0; ci < cinfo->comps_in_scan; ci++) | 
| 248 | 123k |     entropy->saved.last_dc_val[ci] = 0; | 
| 249 |  |   /* Re-init EOB run count, too */ | 
| 250 | 122k |   entropy->saved.EOBRUN = 0; | 
| 251 |  |  | 
| 252 |  |   /* Reset restart counter */ | 
| 253 | 122k |   entropy->restarts_to_go = cinfo->restart_interval; | 
| 254 |  |  | 
| 255 |  |   /* Reset out-of-data flag, unless read_restart_marker left us smack up | 
| 256 |  |    * against a marker.  In that case we will end up treating the next data | 
| 257 |  |    * segment as empty, and we can avoid producing bogus output pixels by | 
| 258 |  |    * leaving the flag set. | 
| 259 |  |    */ | 
| 260 | 122k |   if (cinfo->unread_marker == 0) | 
| 261 | 2.71k |     entropy->pub.insufficient_data = FALSE; | 
| 262 |  |  | 
| 263 | 122k |   return TRUE; | 
| 264 | 122k | } | 
| 265 |  |  | 
| 266 |  |  | 
| 267 |  | /* | 
| 268 |  |  * Huffman MCU decoding. | 
| 269 |  |  * Each of these routines decodes and returns one MCU's worth of | 
| 270 |  |  * Huffman-compressed coefficients. | 
| 271 |  |  * The coefficients are reordered from zigzag order into natural array order, | 
| 272 |  |  * but are not dequantized. | 
| 273 |  |  * | 
| 274 |  |  * The i'th block of the MCU is stored into the block pointed to by | 
| 275 |  |  * MCU_data[i].  WE ASSUME THIS AREA IS INITIALLY ZEROED BY THE CALLER. | 
| 276 |  |  * | 
| 277 |  |  * We return FALSE if data source requested suspension.  In that case no | 
| 278 |  |  * changes have been made to permanent state.  (Exception: some output | 
| 279 |  |  * coefficients may already have been assigned.  This is harmless for | 
| 280 |  |  * spectral selection, since we'll just re-assign them on the next call. | 
| 281 |  |  * Successive approximation AC refinement has to be more careful, however.) | 
| 282 |  |  */ | 
| 283 |  |  | 
| 284 |  | /* | 
| 285 |  |  * MCU decoding for DC initial scan (either spectral selection, | 
| 286 |  |  * or first pass of successive approximation). | 
| 287 |  |  */ | 
| 288 |  |  | 
| 289 |  | METHODDEF(boolean) | 
| 290 |  | decode_mcu_DC_first(j_decompress_ptr cinfo, JBLOCKROW *MCU_data) | 
| 291 | 1.39M | { | 
| 292 | 1.39M |   phuff_entropy_ptr entropy = (phuff_entropy_ptr)cinfo->entropy; | 
| 293 | 1.39M |   int Al = cinfo->Al; | 
| 294 | 1.39M |   register int s, r; | 
| 295 | 1.39M |   int blkn, ci; | 
| 296 | 1.39M |   JBLOCKROW block; | 
| 297 | 1.39M |   BITREAD_STATE_VARS; | 
| 298 | 1.39M |   savable_state state; | 
| 299 | 1.39M |   d_derived_tbl *tbl; | 
| 300 | 1.39M |   jpeg_component_info *compptr; | 
| 301 |  |  | 
| 302 |  |   /* Process restart marker if needed; may have to suspend */ | 
| 303 | 1.39M |   if (cinfo->restart_interval) { | 
| 304 | 348k |     if (entropy->restarts_to_go == 0) | 
| 305 | 14.0k |       if (!process_restart(cinfo)) | 
| 306 | 0 |         return FALSE; | 
| 307 | 348k |   } | 
| 308 |  |  | 
| 309 |  |   /* If we've run out of data, just leave the MCU set to zeroes. | 
| 310 |  |    * This way, we return uniform gray for the remainder of the segment. | 
| 311 |  |    */ | 
| 312 | 1.39M |   if (!entropy->pub.insufficient_data) { | 
| 313 |  |  | 
| 314 |  |     /* Load up working state */ | 
| 315 | 24.3k |     BITREAD_LOAD_STATE(cinfo, entropy->bitstate); | 
| 316 | 24.3k |     state = entropy->saved; | 
| 317 |  |  | 
| 318 |  |     /* Outer loop handles each block in the MCU */ | 
| 319 |  |  | 
| 320 | 63.8k |     for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { | 
| 321 | 39.5k |       block = MCU_data[blkn]; | 
| 322 | 39.5k |       ci = cinfo->MCU_membership[blkn]; | 
| 323 | 39.5k |       compptr = cinfo->cur_comp_info[ci]; | 
| 324 | 39.5k |       tbl = entropy->derived_tbls[compptr->dc_tbl_no]; | 
| 325 |  |  | 
| 326 |  |       /* Decode a single block's worth of coefficients */ | 
| 327 |  |  | 
| 328 |  |       /* Section F.2.2.1: decode the DC coefficient difference */ | 
| 329 | 39.5k |       HUFF_DECODE(s, br_state, tbl, return FALSE, label1); | 
| 330 | 39.5k |       if (s) { | 
| 331 | 23.3k |         CHECK_BIT_BUFFER(br_state, s, return FALSE); | 
| 332 | 23.3k |         r = GET_BITS(s); | 
| 333 | 23.3k |         s = HUFF_EXTEND(r, s); | 
| 334 | 23.3k |       } | 
| 335 |  |  | 
| 336 |  |       /* Convert DC difference to actual value, update last_dc_val */ | 
| 337 | 39.5k |       if ((state.last_dc_val[ci] >= 0 && | 
| 338 | 39.5k |            s > INT_MAX - state.last_dc_val[ci]) || | 
| 339 | 39.5k |           (state.last_dc_val[ci] < 0 && s < INT_MIN - state.last_dc_val[ci])) | 
| 340 | 0 |         ERREXIT(cinfo, JERR_BAD_DCT_COEF); | 
| 341 | 39.5k |       s += state.last_dc_val[ci]; | 
| 342 | 39.5k |       state.last_dc_val[ci] = s; | 
| 343 |  |       /* Scale and output the coefficient (assumes jpeg_natural_order[0]=0) */ | 
| 344 | 39.5k |       (*block)[0] = (JCOEF)LEFT_SHIFT(s, Al); | 
| 345 | 39.5k |     } | 
| 346 |  |  | 
| 347 |  |     /* Completed MCU, so update state */ | 
| 348 | 24.3k |     BITREAD_SAVE_STATE(cinfo, entropy->bitstate); | 
| 349 | 24.3k |     entropy->saved = state; | 
| 350 | 24.3k |   } | 
| 351 |  |  | 
| 352 |  |   /* Account for restart interval (no-op if not using restarts) */ | 
| 353 | 1.39M |   if (cinfo->restart_interval) | 
| 354 | 348k |     entropy->restarts_to_go--; | 
| 355 |  |  | 
| 356 | 1.39M |   return TRUE; | 
| 357 | 1.39M | } | 
| 358 |  |  | 
| 359 |  |  | 
| 360 |  | /* | 
| 361 |  |  * MCU decoding for AC initial scan (either spectral selection, | 
| 362 |  |  * or first pass of successive approximation). | 
| 363 |  |  */ | 
| 364 |  |  | 
| 365 |  | METHODDEF(boolean) | 
| 366 |  | decode_mcu_AC_first(j_decompress_ptr cinfo, JBLOCKROW *MCU_data) | 
| 367 | 6.57M | { | 
| 368 | 6.57M |   phuff_entropy_ptr entropy = (phuff_entropy_ptr)cinfo->entropy; | 
| 369 | 6.57M |   int Se = cinfo->Se; | 
| 370 | 6.57M |   int Al = cinfo->Al; | 
| 371 | 6.57M |   register int s, k, r; | 
| 372 | 6.57M |   unsigned int EOBRUN; | 
| 373 | 6.57M |   JBLOCKROW block; | 
| 374 | 6.57M |   BITREAD_STATE_VARS; | 
| 375 | 6.57M |   d_derived_tbl *tbl; | 
| 376 |  |  | 
| 377 |  |   /* Process restart marker if needed; may have to suspend */ | 
| 378 | 6.57M |   if (cinfo->restart_interval) { | 
| 379 | 433k |     if (entropy->restarts_to_go == 0) | 
| 380 | 13.1k |       if (!process_restart(cinfo)) | 
| 381 | 0 |         return FALSE; | 
| 382 | 433k |   } | 
| 383 |  |  | 
| 384 |  |   /* If we've run out of data, just leave the MCU set to zeroes. | 
| 385 |  |    * This way, we return uniform gray for the remainder of the segment. | 
| 386 |  |    */ | 
| 387 | 6.57M |   if (!entropy->pub.insufficient_data) { | 
| 388 |  |  | 
| 389 |  |     /* Load up working state. | 
| 390 |  |      * We can avoid loading/saving bitread state if in an EOB run. | 
| 391 |  |      */ | 
| 392 | 6.39k |     EOBRUN = entropy->saved.EOBRUN;     /* only part of saved state we need */ | 
| 393 |  |  | 
| 394 |  |     /* There is always only one block per MCU */ | 
| 395 |  |  | 
| 396 | 6.39k |     if (EOBRUN > 0)             /* if it's a band of zeroes... */ | 
| 397 | 3.40k |       EOBRUN--;                 /* ...process it now (we do nothing) */ | 
| 398 | 2.99k |     else { | 
| 399 | 2.99k |       BITREAD_LOAD_STATE(cinfo, entropy->bitstate); | 
| 400 | 2.99k |       block = MCU_data[0]; | 
| 401 | 2.99k |       tbl = entropy->ac_derived_tbl; | 
| 402 |  |  | 
| 403 | 12.4k |       for (k = cinfo->Ss; k <= Se; k++) { | 
| 404 | 10.8k |         HUFF_DECODE(s, br_state, tbl, return FALSE, label2); | 
| 405 | 10.8k |         r = s >> 4; | 
| 406 | 10.8k |         s &= 15; | 
| 407 | 10.8k |         if (s) { | 
| 408 | 9.16k |           k += r; | 
| 409 | 9.16k |           CHECK_BIT_BUFFER(br_state, s, return FALSE); | 
| 410 | 9.16k |           r = GET_BITS(s); | 
| 411 | 9.16k |           s = HUFF_EXTEND(r, s); | 
| 412 |  |           /* Scale and output coefficient in natural (dezigzagged) order */ | 
| 413 | 9.16k |           (*block)[jpeg_natural_order[k]] = (JCOEF)LEFT_SHIFT(s, Al); | 
| 414 | 9.16k |         } else { | 
| 415 | 1.63k |           if (r == 15) {        /* ZRL */ | 
| 416 | 250 |             k += 15;            /* skip 15 zeroes in band */ | 
| 417 | 1.38k |           } else {              /* EOBr, run length is 2^r + appended bits */ | 
| 418 | 1.38k |             EOBRUN = 1 << r; | 
| 419 | 1.38k |             if (r) {            /* EOBr, r > 0 */ | 
| 420 | 585 |               CHECK_BIT_BUFFER(br_state, r, return FALSE); | 
| 421 | 585 |               r = GET_BITS(r); | 
| 422 | 585 |               EOBRUN += r; | 
| 423 | 585 |             } | 
| 424 | 1.38k |             EOBRUN--;           /* this band is processed at this moment */ | 
| 425 | 1.38k |             break;              /* force end-of-band */ | 
| 426 | 1.38k |           } | 
| 427 | 1.63k |         } | 
| 428 | 10.8k |       } | 
| 429 |  |  | 
| 430 | 2.99k |       BITREAD_SAVE_STATE(cinfo, entropy->bitstate); | 
| 431 | 2.99k |     } | 
| 432 |  |  | 
| 433 |  |     /* Completed MCU, so update state */ | 
| 434 | 6.39k |     entropy->saved.EOBRUN = EOBRUN;     /* only part of saved state we need */ | 
| 435 | 6.39k |   } | 
| 436 |  |  | 
| 437 |  |   /* Account for restart interval (no-op if not using restarts) */ | 
| 438 | 6.57M |   if (cinfo->restart_interval) | 
| 439 | 433k |     entropy->restarts_to_go--; | 
| 440 |  |  | 
| 441 | 6.57M |   return TRUE; | 
| 442 | 6.57M | } | 
| 443 |  |  | 
| 444 |  |  | 
| 445 |  | /* | 
| 446 |  |  * MCU decoding for DC successive approximation refinement scan. | 
| 447 |  |  * Note: we assume such scans can be multi-component, although the spec | 
| 448 |  |  * is not very clear on the point. | 
| 449 |  |  */ | 
| 450 |  |  | 
| 451 |  | METHODDEF(boolean) | 
| 452 |  | decode_mcu_DC_refine(j_decompress_ptr cinfo, JBLOCKROW *MCU_data) | 
| 453 | 4.59M | { | 
| 454 | 4.59M |   phuff_entropy_ptr entropy = (phuff_entropy_ptr)cinfo->entropy; | 
| 455 | 4.59M |   int p1 = 1 << cinfo->Al;      /* 1 in the bit position being coded */ | 
| 456 | 4.59M |   int blkn; | 
| 457 | 4.59M |   JBLOCKROW block; | 
| 458 | 4.59M |   BITREAD_STATE_VARS; | 
| 459 |  |  | 
| 460 |  |   /* Process restart marker if needed; may have to suspend */ | 
| 461 | 4.59M |   if (cinfo->restart_interval) { | 
| 462 | 2.23M |     if (entropy->restarts_to_go == 0) | 
| 463 | 42.8k |       if (!process_restart(cinfo)) | 
| 464 | 0 |         return FALSE; | 
| 465 | 2.23M |   } | 
| 466 |  |  | 
| 467 |  |   /* Not worth the cycles to check insufficient_data here, | 
| 468 |  |    * since we will not change the data anyway if we read zeroes. | 
| 469 |  |    */ | 
| 470 |  |  | 
| 471 |  |   /* Load up working state */ | 
| 472 | 4.59M |   BITREAD_LOAD_STATE(cinfo, entropy->bitstate); | 
| 473 |  |  | 
| 474 |  |   /* Outer loop handles each block in the MCU */ | 
| 475 |  |  | 
| 476 | 10.1M |   for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { | 
| 477 | 5.55M |     block = MCU_data[blkn]; | 
| 478 |  |  | 
| 479 |  |     /* Encoded data is simply the next bit of the two's-complement DC value */ | 
| 480 | 5.55M |     CHECK_BIT_BUFFER(br_state, 1, return FALSE); | 
| 481 | 5.55M |     if (GET_BITS(1)) | 
| 482 | 7.18k |       (*block)[0] |= p1; | 
| 483 |  |     /* Note: since we use |=, repeating the assignment later is safe */ | 
| 484 | 5.55M |   } | 
| 485 |  |  | 
| 486 |  |   /* Completed MCU, so update state */ | 
| 487 | 4.59M |   BITREAD_SAVE_STATE(cinfo, entropy->bitstate); | 
| 488 |  |  | 
| 489 |  |   /* Account for restart interval (no-op if not using restarts) */ | 
| 490 | 4.59M |   if (cinfo->restart_interval) | 
| 491 | 2.23M |     entropy->restarts_to_go--; | 
| 492 |  |  | 
| 493 | 4.59M |   return TRUE; | 
| 494 | 4.59M | } | 
| 495 |  |  | 
| 496 |  |  | 
| 497 |  | /* | 
| 498 |  |  * MCU decoding for AC successive approximation refinement scan. | 
| 499 |  |  */ | 
| 500 |  |  | 
| 501 |  | METHODDEF(boolean) | 
| 502 |  | decode_mcu_AC_refine(j_decompress_ptr cinfo, JBLOCKROW *MCU_data) | 
| 503 | 5.12M | { | 
| 504 | 5.12M |   phuff_entropy_ptr entropy = (phuff_entropy_ptr)cinfo->entropy; | 
| 505 | 5.12M |   int Se = cinfo->Se; | 
| 506 | 5.12M |   int p1 = 1 << cinfo->Al;        /* 1 in the bit position being coded */ | 
| 507 | 5.12M |   int m1 = (NEG_1) << cinfo->Al;  /* -1 in the bit position being coded */ | 
| 508 | 5.12M |   register int s, k, r; | 
| 509 | 5.12M |   unsigned int EOBRUN; | 
| 510 | 5.12M |   JBLOCKROW block; | 
| 511 | 5.12M |   JCOEFPTR thiscoef; | 
| 512 | 5.12M |   BITREAD_STATE_VARS; | 
| 513 | 5.12M |   d_derived_tbl *tbl; | 
| 514 | 5.12M |   int num_newnz; | 
| 515 | 5.12M |   int newnz_pos[DCTSIZE2]; | 
| 516 |  |  | 
| 517 |  |   /* Process restart marker if needed; may have to suspend */ | 
| 518 | 5.12M |   if (cinfo->restart_interval) { | 
| 519 | 2.20M |     if (entropy->restarts_to_go == 0) | 
| 520 | 52.2k |       if (!process_restart(cinfo)) | 
| 521 | 0 |         return FALSE; | 
| 522 | 2.20M |   } | 
| 523 |  |  | 
| 524 |  |   /* If we've run out of data, don't modify the MCU. | 
| 525 |  |    */ | 
| 526 | 5.12M |   if (!entropy->pub.insufficient_data) { | 
| 527 |  |  | 
| 528 |  |     /* Load up working state */ | 
| 529 | 210k |     BITREAD_LOAD_STATE(cinfo, entropy->bitstate); | 
| 530 | 210k |     EOBRUN = entropy->saved.EOBRUN; /* only part of saved state we need */ | 
| 531 |  |  | 
| 532 |  |     /* There is always only one block per MCU */ | 
| 533 | 210k |     block = MCU_data[0]; | 
| 534 | 210k |     tbl = entropy->ac_derived_tbl; | 
| 535 |  |  | 
| 536 |  |     /* If we are forced to suspend, we must undo the assignments to any newly | 
| 537 |  |      * nonzero coefficients in the block, because otherwise we'd get confused | 
| 538 |  |      * next time about which coefficients were already nonzero. | 
| 539 |  |      * But we need not undo addition of bits to already-nonzero coefficients; | 
| 540 |  |      * instead, we can test the current bit to see if we already did it. | 
| 541 |  |      */ | 
| 542 | 210k |     num_newnz = 0; | 
| 543 |  |  | 
| 544 |  |     /* initialize coefficient loop counter to start of band */ | 
| 545 | 210k |     k = cinfo->Ss; | 
| 546 |  |  | 
| 547 | 210k |     if (EOBRUN == 0) { | 
| 548 | 151k |       for (; k <= Se; k++) { | 
| 549 | 95.2k |         HUFF_DECODE(s, br_state, tbl, goto undoit, label3); | 
| 550 | 95.2k |         r = s >> 4; | 
| 551 | 95.2k |         s &= 15; | 
| 552 | 95.2k |         if (s) { | 
| 553 | 89.1k |           if (s != 1)           /* size of new coef should always be 1 */ | 
| 554 | 74.4k |             WARNMS(cinfo, JWRN_HUFF_BAD_CODE); | 
| 555 | 89.1k |           CHECK_BIT_BUFFER(br_state, 1, goto undoit); | 
| 556 | 89.1k |           if (GET_BITS(1)) | 
| 557 | 41.1k |             s = p1;             /* newly nonzero coef is positive */ | 
| 558 | 48.0k |           else | 
| 559 | 48.0k |             s = m1;             /* newly nonzero coef is negative */ | 
| 560 | 89.1k |         } else { | 
| 561 | 6.06k |           if (r != 15) { | 
| 562 | 5.85k |             EOBRUN = 1 << r;    /* EOBr, run length is 2^r + appended bits */ | 
| 563 | 5.85k |             if (r) { | 
| 564 | 582 |               CHECK_BIT_BUFFER(br_state, r, goto undoit); | 
| 565 | 582 |               r = GET_BITS(r); | 
| 566 | 582 |               EOBRUN += r; | 
| 567 | 582 |             } | 
| 568 | 5.85k |             break;              /* rest of block is handled by EOB logic */ | 
| 569 | 5.85k |           } | 
| 570 |  |           /* note s = 0 for processing ZRL */ | 
| 571 | 6.06k |         } | 
| 572 |  |         /* Advance over already-nonzero coefs and r still-zero coefs, | 
| 573 |  |          * appending correction bits to the nonzeroes.  A correction bit is 1 | 
| 574 |  |          * if the absolute value of the coefficient must be increased. | 
| 575 |  |          */ | 
| 576 | 1.61M |         do { | 
| 577 | 1.61M |           thiscoef = *block + jpeg_natural_order[k]; | 
| 578 | 1.61M |           if (*thiscoef != 0) { | 
| 579 | 1.56M |             CHECK_BIT_BUFFER(br_state, 1, goto undoit); | 
| 580 | 1.56M |             if (GET_BITS(1)) { | 
| 581 | 771k |               if ((*thiscoef & p1) == 0) { /* do nothing if already set it */ | 
| 582 | 7.46k |                 if (*thiscoef >= 0) | 
| 583 | 3.72k |                   *thiscoef += (JCOEF)p1; | 
| 584 | 3.73k |                 else | 
| 585 | 3.73k |                   *thiscoef += (JCOEF)m1; | 
| 586 | 7.46k |               } | 
| 587 | 771k |             } | 
| 588 | 1.56M |           } else { | 
| 589 | 57.3k |             if (--r < 0) | 
| 590 | 34.4k |               break;            /* reached target zero coefficient */ | 
| 591 | 57.3k |           } | 
| 592 | 1.58M |           k++; | 
| 593 | 1.58M |         } while (k <= Se); | 
| 594 | 89.3k |         if (s) { | 
| 595 | 89.1k |           int pos = jpeg_natural_order[k]; | 
| 596 |  |           /* Output newly nonzero coefficient */ | 
| 597 | 89.1k |           (*block)[pos] = (JCOEF)s; | 
| 598 |  |           /* Remember its position in case we have to suspend */ | 
| 599 | 89.1k |           newnz_pos[num_newnz++] = pos; | 
| 600 | 89.1k |         } | 
| 601 | 89.3k |       } | 
| 602 | 62.4k |     } | 
| 603 |  |  | 
| 604 | 210k |     if (EOBRUN > 0) { | 
| 605 |  |       /* Scan any remaining coefficient positions after the end-of-band | 
| 606 |  |        * (the last newly nonzero coefficient, if any).  Append a correction | 
| 607 |  |        * bit to each already-nonzero coefficient.  A correction bit is 1 | 
| 608 |  |        * if the absolute value of the coefficient must be increased. | 
| 609 |  |        */ | 
| 610 | 1.67M |       for (; k <= Se; k++) { | 
| 611 | 1.52M |         thiscoef = *block + jpeg_natural_order[k]; | 
| 612 | 1.52M |         if (*thiscoef != 0) { | 
| 613 | 94.7k |           CHECK_BIT_BUFFER(br_state, 1, goto undoit); | 
| 614 | 94.7k |           if (GET_BITS(1)) { | 
| 615 | 41.4k |             if ((*thiscoef & p1) == 0) { /* do nothing if already changed it */ | 
| 616 | 1.86k |               if (*thiscoef >= 0) | 
| 617 | 1.24k |                 *thiscoef += (JCOEF)p1; | 
| 618 | 625 |               else | 
| 619 | 625 |                 *thiscoef += (JCOEF)m1; | 
| 620 | 1.86k |             } | 
| 621 | 41.4k |           } | 
| 622 | 94.7k |         } | 
| 623 | 1.52M |       } | 
| 624 |  |       /* Count one block completed in EOB run */ | 
| 625 | 153k |       EOBRUN--; | 
| 626 | 153k |     } | 
| 627 |  |  | 
| 628 |  |     /* Completed MCU, so update state */ | 
| 629 | 210k |     BITREAD_SAVE_STATE(cinfo, entropy->bitstate); | 
| 630 | 210k |     entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */ | 
| 631 | 210k |   } | 
| 632 |  |  | 
| 633 |  |   /* Account for restart interval (no-op if not using restarts) */ | 
| 634 | 5.12M |   if (cinfo->restart_interval) | 
| 635 | 2.20M |     entropy->restarts_to_go--; | 
| 636 |  |  | 
| 637 | 5.12M |   return TRUE; | 
| 638 |  |  | 
| 639 | 0 | undoit: | 
| 640 |  |   /* Re-zero any output coefficients that we made newly nonzero */ | 
| 641 | 0 |   while (num_newnz > 0) | 
| 642 | 0 |     (*block)[newnz_pos[--num_newnz]] = 0; | 
| 643 |  | 
 | 
| 644 | 0 |   return FALSE; | 
| 645 | 5.12M | } | 
| 646 |  |  | 
| 647 |  |  | 
| 648 |  | /* | 
| 649 |  |  * Module initialization routine for progressive Huffman entropy decoding. | 
| 650 |  |  */ | 
| 651 |  |  | 
| 652 |  | GLOBAL(void) | 
| 653 |  | jinit_phuff_decoder(j_decompress_ptr cinfo) | 
| 654 | 816 | { | 
| 655 | 816 |   phuff_entropy_ptr entropy; | 
| 656 | 816 |   int *coef_bit_ptr; | 
| 657 | 816 |   int ci, i; | 
| 658 |  |  | 
| 659 | 816 |   entropy = (phuff_entropy_ptr) | 
| 660 | 816 |     (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE, | 
| 661 | 816 |                                 sizeof(phuff_entropy_decoder)); | 
| 662 | 816 |   cinfo->entropy = (struct jpeg_entropy_decoder *)entropy; | 
| 663 | 816 |   entropy->pub.start_pass = start_pass_phuff_decoder; | 
| 664 |  |  | 
| 665 |  |   /* Mark derived tables unallocated */ | 
| 666 | 4.08k |   for (i = 0; i < NUM_HUFF_TBLS; i++) { | 
| 667 | 3.26k |     entropy->derived_tbls[i] = NULL; | 
| 668 | 3.26k |   } | 
| 669 |  |  | 
| 670 |  |   /* Create progression status table */ | 
| 671 | 816 |   cinfo->coef_bits = (int (*)[DCTSIZE2]) | 
| 672 | 816 |     (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE, | 
| 673 | 816 |                                 cinfo->num_components * 2 * DCTSIZE2 * | 
| 674 | 816 |                                 sizeof(int)); | 
| 675 | 816 |   coef_bit_ptr = &cinfo->coef_bits[0][0]; | 
| 676 | 2.06k |   for (ci = 0; ci < cinfo->num_components; ci++) | 
| 677 | 80.9k |     for (i = 0; i < DCTSIZE2; i++) | 
| 678 | 79.7k |       *coef_bit_ptr++ = -1; | 
| 679 | 816 | } | 
| 680 |  |  | 
| 681 |  | #endif /* D_PROGRESSIVE_SUPPORTED */ |