/src/libjpeg-turbo.main/jcarith.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * jcarith.c |
3 | | * |
4 | | * This file was part of the Independent JPEG Group's software: |
5 | | * Developed 1997-2009 by Guido Vollbeding. |
6 | | * libjpeg-turbo Modifications: |
7 | | * Copyright (C) 2015, 2018, 2021-2022, D. R. Commander. |
8 | | * For conditions of distribution and use, see the accompanying README.ijg |
9 | | * file. |
10 | | * |
11 | | * This file contains portable arithmetic entropy encoding routines for JPEG |
12 | | * (implementing Recommendation ITU-T T.81 | ISO/IEC 10918-1). |
13 | | * |
14 | | * Both sequential and progressive modes are supported in this single module. |
15 | | * |
16 | | * Suspension is not currently supported in this module. |
17 | | * |
18 | | * NOTE: All referenced figures are from |
19 | | * Recommendation ITU-T T.81 (1992) | ISO/IEC 10918-1:1994. |
20 | | */ |
21 | | |
22 | | #define JPEG_INTERNALS |
23 | | #include "jinclude.h" |
24 | | #include "jpeglib.h" |
25 | | |
26 | | |
27 | | /* Expanded entropy encoder object for arithmetic encoding. */ |
28 | | |
29 | | typedef struct { |
30 | | struct jpeg_entropy_encoder pub; /* public fields */ |
31 | | |
32 | | JLONG c; /* C register, base of coding interval, layout as in sec. D.1.3 */ |
33 | | JLONG a; /* A register, normalized size of coding interval */ |
34 | | JLONG sc; /* counter for stacked 0xFF values which might overflow */ |
35 | | JLONG zc; /* counter for pending 0x00 output values which might * |
36 | | * be discarded at the end ("Pacman" termination) */ |
37 | | int ct; /* bit shift counter, determines when next byte will be written */ |
38 | | int buffer; /* buffer for most recent output byte != 0xFF */ |
39 | | |
40 | | int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */ |
41 | | int dc_context[MAX_COMPS_IN_SCAN]; /* context index for DC conditioning */ |
42 | | |
43 | | unsigned int restarts_to_go; /* MCUs left in this restart interval */ |
44 | | int next_restart_num; /* next restart number to write (0-7) */ |
45 | | |
46 | | /* Pointers to statistics areas (these workspaces have image lifespan) */ |
47 | | unsigned char *dc_stats[NUM_ARITH_TBLS]; |
48 | | unsigned char *ac_stats[NUM_ARITH_TBLS]; |
49 | | |
50 | | /* Statistics bin for coding with fixed probability 0.5 */ |
51 | | unsigned char fixed_bin[4]; |
52 | | } arith_entropy_encoder; |
53 | | |
54 | | typedef arith_entropy_encoder *arith_entropy_ptr; |
55 | | |
56 | | /* The following two definitions specify the allocation chunk size |
57 | | * for the statistics area. |
58 | | * According to sections F.1.4.4.1.3 and F.1.4.4.2, we need at least |
59 | | * 49 statistics bins for DC, and 245 statistics bins for AC coding. |
60 | | * |
61 | | * We use a compact representation with 1 byte per statistics bin, |
62 | | * thus the numbers directly represent byte sizes. |
63 | | * This 1 byte per statistics bin contains the meaning of the MPS |
64 | | * (more probable symbol) in the highest bit (mask 0x80), and the |
65 | | * index into the probability estimation state machine table |
66 | | * in the lower bits (mask 0x7F). |
67 | | */ |
68 | | |
69 | 0 | #define DC_STAT_BINS 64 |
70 | 0 | #define AC_STAT_BINS 256 |
71 | | |
72 | | /* NOTE: Uncomment the following #define if you want to use the |
73 | | * given formula for calculating the AC conditioning parameter Kx |
74 | | * for spectral selection progressive coding in section G.1.3.2 |
75 | | * of the spec (Kx = Kmin + SRL (8 + Se - Kmin) 4). |
76 | | * Although the spec and P&M authors claim that this "has proven |
77 | | * to give good results for 8 bit precision samples", I'm not |
78 | | * convinced yet that this is really beneficial. |
79 | | * Early tests gave only very marginal compression enhancements |
80 | | * (a few - around 5 or so - bytes even for very large files), |
81 | | * which would turn out rather negative if we'd suppress the |
82 | | * DAC (Define Arithmetic Conditioning) marker segments for |
83 | | * the default parameters in the future. |
84 | | * Note that currently the marker writing module emits 12-byte |
85 | | * DAC segments for a full-component scan in a color image. |
86 | | * This is not worth worrying about IMHO. However, since the |
87 | | * spec defines the default values to be used if the tables |
88 | | * are omitted (unlike Huffman tables, which are required |
89 | | * anyway), one might optimize this behaviour in the future, |
90 | | * and then it would be disadvantageous to use custom tables if |
91 | | * they don't provide sufficient gain to exceed the DAC size. |
92 | | * |
93 | | * On the other hand, I'd consider it as a reasonable result |
94 | | * that the conditioning has no significant influence on the |
95 | | * compression performance. This means that the basic |
96 | | * statistical model is already rather stable. |
97 | | * |
98 | | * Thus, at the moment, we use the default conditioning values |
99 | | * anyway, and do not use the custom formula. |
100 | | * |
101 | | #define CALCULATE_SPECTRAL_CONDITIONING |
102 | | */ |
103 | | |
104 | | /* IRIGHT_SHIFT is like RIGHT_SHIFT, but works on int rather than JLONG. |
105 | | * We assume that int right shift is unsigned if JLONG right shift is, |
106 | | * which should be safe. |
107 | | */ |
108 | | |
109 | | #ifdef RIGHT_SHIFT_IS_UNSIGNED |
110 | | #define ISHIFT_TEMPS int ishift_temp; |
111 | | #define IRIGHT_SHIFT(x, shft) \ |
112 | | ((ishift_temp = (x)) < 0 ? \ |
113 | | (ishift_temp >> (shft)) | ((~0) << (16 - (shft))) : \ |
114 | | (ishift_temp >> (shft))) |
115 | | #else |
116 | | #define ISHIFT_TEMPS |
117 | 0 | #define IRIGHT_SHIFT(x, shft) ((x) >> (shft)) |
118 | | #endif |
119 | | |
120 | | |
121 | | LOCAL(void) |
122 | | emit_byte(int val, j_compress_ptr cinfo) |
123 | | /* Write next output byte; we do not support suspension in this module. */ |
124 | 0 | { |
125 | 0 | struct jpeg_destination_mgr *dest = cinfo->dest; |
126 | |
|
127 | 0 | *dest->next_output_byte++ = (JOCTET)val; |
128 | 0 | if (--dest->free_in_buffer == 0) |
129 | 0 | if (!(*dest->empty_output_buffer) (cinfo)) |
130 | 0 | ERREXIT(cinfo, JERR_CANT_SUSPEND); |
131 | 0 | } |
132 | | |
133 | | |
134 | | /* |
135 | | * Finish up at the end of an arithmetic-compressed scan. |
136 | | */ |
137 | | |
138 | | METHODDEF(void) |
139 | | finish_pass(j_compress_ptr cinfo) |
140 | 0 | { |
141 | 0 | arith_entropy_ptr e = (arith_entropy_ptr)cinfo->entropy; |
142 | 0 | JLONG temp; |
143 | | |
144 | | /* Section D.1.8: Termination of encoding */ |
145 | | |
146 | | /* Find the e->c in the coding interval with the largest |
147 | | * number of trailing zero bits */ |
148 | 0 | if ((temp = (e->a - 1 + e->c) & 0xFFFF0000UL) < e->c) |
149 | 0 | e->c = temp + 0x8000L; |
150 | 0 | else |
151 | 0 | e->c = temp; |
152 | | /* Send remaining bytes to output */ |
153 | 0 | e->c <<= e->ct; |
154 | 0 | if (e->c & 0xF8000000UL) { |
155 | | /* One final overflow has to be handled */ |
156 | 0 | if (e->buffer >= 0) { |
157 | 0 | if (e->zc) |
158 | 0 | do emit_byte(0x00, cinfo); |
159 | 0 | while (--e->zc); |
160 | 0 | emit_byte(e->buffer + 1, cinfo); |
161 | 0 | if (e->buffer + 1 == 0xFF) |
162 | 0 | emit_byte(0x00, cinfo); |
163 | 0 | } |
164 | 0 | e->zc += e->sc; /* carry-over converts stacked 0xFF bytes to 0x00 */ |
165 | 0 | e->sc = 0; |
166 | 0 | } else { |
167 | 0 | if (e->buffer == 0) |
168 | 0 | ++e->zc; |
169 | 0 | else if (e->buffer >= 0) { |
170 | 0 | if (e->zc) |
171 | 0 | do emit_byte(0x00, cinfo); |
172 | 0 | while (--e->zc); |
173 | 0 | emit_byte(e->buffer, cinfo); |
174 | 0 | } |
175 | 0 | if (e->sc) { |
176 | 0 | if (e->zc) |
177 | 0 | do emit_byte(0x00, cinfo); |
178 | 0 | while (--e->zc); |
179 | 0 | do { |
180 | 0 | emit_byte(0xFF, cinfo); |
181 | 0 | emit_byte(0x00, cinfo); |
182 | 0 | } while (--e->sc); |
183 | 0 | } |
184 | 0 | } |
185 | | /* Output final bytes only if they are not 0x00 */ |
186 | 0 | if (e->c & 0x7FFF800L) { |
187 | 0 | if (e->zc) /* output final pending zero bytes */ |
188 | 0 | do emit_byte(0x00, cinfo); |
189 | 0 | while (--e->zc); |
190 | 0 | emit_byte((e->c >> 19) & 0xFF, cinfo); |
191 | 0 | if (((e->c >> 19) & 0xFF) == 0xFF) |
192 | 0 | emit_byte(0x00, cinfo); |
193 | 0 | if (e->c & 0x7F800L) { |
194 | 0 | emit_byte((e->c >> 11) & 0xFF, cinfo); |
195 | 0 | if (((e->c >> 11) & 0xFF) == 0xFF) |
196 | 0 | emit_byte(0x00, cinfo); |
197 | 0 | } |
198 | 0 | } |
199 | 0 | } |
200 | | |
201 | | |
202 | | /* |
203 | | * The core arithmetic encoding routine (common in JPEG and JBIG). |
204 | | * This needs to go as fast as possible. |
205 | | * Machine-dependent optimization facilities |
206 | | * are not utilized in this portable implementation. |
207 | | * However, this code should be fairly efficient and |
208 | | * may be a good base for further optimizations anyway. |
209 | | * |
210 | | * Parameter 'val' to be encoded may be 0 or 1 (binary decision). |
211 | | * |
212 | | * Note: I've added full "Pacman" termination support to the |
213 | | * byte output routines, which is equivalent to the optional |
214 | | * Discard_final_zeros procedure (Figure D.15) in the spec. |
215 | | * Thus, we always produce the shortest possible output |
216 | | * stream compliant to the spec (no trailing zero bytes, |
217 | | * except for FF stuffing). |
218 | | * |
219 | | * I've also introduced a new scheme for accessing |
220 | | * the probability estimation state machine table, |
221 | | * derived from Markus Kuhn's JBIG implementation. |
222 | | */ |
223 | | |
224 | | LOCAL(void) |
225 | | arith_encode(j_compress_ptr cinfo, unsigned char *st, int val) |
226 | 0 | { |
227 | 0 | register arith_entropy_ptr e = (arith_entropy_ptr)cinfo->entropy; |
228 | 0 | register unsigned char nl, nm; |
229 | 0 | register JLONG qe, temp; |
230 | 0 | register int sv; |
231 | | |
232 | | /* Fetch values from our compact representation of Table D.2: |
233 | | * Qe values and probability estimation state machine |
234 | | */ |
235 | 0 | sv = *st; |
236 | 0 | qe = jpeg_aritab[sv & 0x7F]; /* => Qe_Value */ |
237 | 0 | nl = qe & 0xFF; qe >>= 8; /* Next_Index_LPS + Switch_MPS */ |
238 | 0 | nm = qe & 0xFF; qe >>= 8; /* Next_Index_MPS */ |
239 | | |
240 | | /* Encode & estimation procedures per sections D.1.4 & D.1.5 */ |
241 | 0 | e->a -= qe; |
242 | 0 | if (val != (sv >> 7)) { |
243 | | /* Encode the less probable symbol */ |
244 | 0 | if (e->a >= qe) { |
245 | | /* If the interval size (qe) for the less probable symbol (LPS) |
246 | | * is larger than the interval size for the MPS, then exchange |
247 | | * the two symbols for coding efficiency, otherwise code the LPS |
248 | | * as usual: */ |
249 | 0 | e->c += e->a; |
250 | 0 | e->a = qe; |
251 | 0 | } |
252 | 0 | *st = (sv & 0x80) ^ nl; /* Estimate_after_LPS */ |
253 | 0 | } else { |
254 | | /* Encode the more probable symbol */ |
255 | 0 | if (e->a >= 0x8000L) |
256 | 0 | return; /* A >= 0x8000 -> ready, no renormalization required */ |
257 | 0 | if (e->a < qe) { |
258 | | /* If the interval size (qe) for the less probable symbol (LPS) |
259 | | * is larger than the interval size for the MPS, then exchange |
260 | | * the two symbols for coding efficiency: */ |
261 | 0 | e->c += e->a; |
262 | 0 | e->a = qe; |
263 | 0 | } |
264 | 0 | *st = (sv & 0x80) ^ nm; /* Estimate_after_MPS */ |
265 | 0 | } |
266 | | |
267 | | /* Renormalization & data output per section D.1.6 */ |
268 | 0 | do { |
269 | 0 | e->a <<= 1; |
270 | 0 | e->c <<= 1; |
271 | 0 | if (--e->ct == 0) { |
272 | | /* Another byte is ready for output */ |
273 | 0 | temp = e->c >> 19; |
274 | 0 | if (temp > 0xFF) { |
275 | | /* Handle overflow over all stacked 0xFF bytes */ |
276 | 0 | if (e->buffer >= 0) { |
277 | 0 | if (e->zc) |
278 | 0 | do emit_byte(0x00, cinfo); |
279 | 0 | while (--e->zc); |
280 | 0 | emit_byte(e->buffer + 1, cinfo); |
281 | 0 | if (e->buffer + 1 == 0xFF) |
282 | 0 | emit_byte(0x00, cinfo); |
283 | 0 | } |
284 | 0 | e->zc += e->sc; /* carry-over converts stacked 0xFF bytes to 0x00 */ |
285 | 0 | e->sc = 0; |
286 | | /* Note: The 3 spacer bits in the C register guarantee |
287 | | * that the new buffer byte can't be 0xFF here |
288 | | * (see page 160 in the P&M JPEG book). */ |
289 | 0 | e->buffer = temp & 0xFF; /* new output byte, might overflow later */ |
290 | 0 | } else if (temp == 0xFF) { |
291 | 0 | ++e->sc; /* stack 0xFF byte (which might overflow later) */ |
292 | 0 | } else { |
293 | | /* Output all stacked 0xFF bytes, they will not overflow any more */ |
294 | 0 | if (e->buffer == 0) |
295 | 0 | ++e->zc; |
296 | 0 | else if (e->buffer >= 0) { |
297 | 0 | if (e->zc) |
298 | 0 | do emit_byte(0x00, cinfo); |
299 | 0 | while (--e->zc); |
300 | 0 | emit_byte(e->buffer, cinfo); |
301 | 0 | } |
302 | 0 | if (e->sc) { |
303 | 0 | if (e->zc) |
304 | 0 | do emit_byte(0x00, cinfo); |
305 | 0 | while (--e->zc); |
306 | 0 | do { |
307 | 0 | emit_byte(0xFF, cinfo); |
308 | 0 | emit_byte(0x00, cinfo); |
309 | 0 | } while (--e->sc); |
310 | 0 | } |
311 | 0 | e->buffer = temp & 0xFF; /* new output byte (can still overflow) */ |
312 | 0 | } |
313 | 0 | e->c &= 0x7FFFFL; |
314 | 0 | e->ct += 8; |
315 | 0 | } |
316 | 0 | } while (e->a < 0x8000L); |
317 | 0 | } |
318 | | |
319 | | |
320 | | /* |
321 | | * Emit a restart marker & resynchronize predictions. |
322 | | */ |
323 | | |
324 | | LOCAL(void) |
325 | | emit_restart(j_compress_ptr cinfo, int restart_num) |
326 | 0 | { |
327 | 0 | arith_entropy_ptr entropy = (arith_entropy_ptr)cinfo->entropy; |
328 | 0 | int ci; |
329 | 0 | jpeg_component_info *compptr; |
330 | |
|
331 | 0 | finish_pass(cinfo); |
332 | |
|
333 | 0 | emit_byte(0xFF, cinfo); |
334 | 0 | emit_byte(JPEG_RST0 + restart_num, cinfo); |
335 | | |
336 | | /* Re-initialize statistics areas */ |
337 | 0 | for (ci = 0; ci < cinfo->comps_in_scan; ci++) { |
338 | 0 | compptr = cinfo->cur_comp_info[ci]; |
339 | | /* DC needs no table for refinement scan */ |
340 | 0 | if (cinfo->progressive_mode == 0 || (cinfo->Ss == 0 && cinfo->Ah == 0)) { |
341 | 0 | memset(entropy->dc_stats[compptr->dc_tbl_no], 0, DC_STAT_BINS); |
342 | | /* Reset DC predictions to 0 */ |
343 | 0 | entropy->last_dc_val[ci] = 0; |
344 | 0 | entropy->dc_context[ci] = 0; |
345 | 0 | } |
346 | | /* AC needs no table when not present */ |
347 | 0 | if (cinfo->progressive_mode == 0 || cinfo->Se) { |
348 | 0 | memset(entropy->ac_stats[compptr->ac_tbl_no], 0, AC_STAT_BINS); |
349 | 0 | } |
350 | 0 | } |
351 | | |
352 | | /* Reset arithmetic encoding variables */ |
353 | 0 | entropy->c = 0; |
354 | 0 | entropy->a = 0x10000L; |
355 | 0 | entropy->sc = 0; |
356 | 0 | entropy->zc = 0; |
357 | 0 | entropy->ct = 11; |
358 | 0 | entropy->buffer = -1; /* empty */ |
359 | 0 | } |
360 | | |
361 | | |
362 | | /* |
363 | | * MCU encoding for DC initial scan (either spectral selection, |
364 | | * or first pass of successive approximation). |
365 | | */ |
366 | | |
367 | | METHODDEF(boolean) |
368 | | encode_mcu_DC_first(j_compress_ptr cinfo, JBLOCKROW *MCU_data) |
369 | 0 | { |
370 | 0 | arith_entropy_ptr entropy = (arith_entropy_ptr)cinfo->entropy; |
371 | 0 | JBLOCKROW block; |
372 | 0 | unsigned char *st; |
373 | 0 | int blkn, ci, tbl; |
374 | 0 | int v, v2, m; |
375 | 0 | ISHIFT_TEMPS |
376 | | |
377 | | /* Emit restart marker if needed */ |
378 | 0 | if (cinfo->restart_interval) { |
379 | 0 | if (entropy->restarts_to_go == 0) { |
380 | 0 | emit_restart(cinfo, entropy->next_restart_num); |
381 | 0 | entropy->restarts_to_go = cinfo->restart_interval; |
382 | 0 | entropy->next_restart_num++; |
383 | 0 | entropy->next_restart_num &= 7; |
384 | 0 | } |
385 | 0 | entropy->restarts_to_go--; |
386 | 0 | } |
387 | | |
388 | | /* Encode the MCU data blocks */ |
389 | 0 | for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { |
390 | 0 | block = MCU_data[blkn]; |
391 | 0 | ci = cinfo->MCU_membership[blkn]; |
392 | 0 | tbl = cinfo->cur_comp_info[ci]->dc_tbl_no; |
393 | | |
394 | | /* Compute the DC value after the required point transform by Al. |
395 | | * This is simply an arithmetic right shift. |
396 | | */ |
397 | 0 | m = IRIGHT_SHIFT((int)((*block)[0]), cinfo->Al); |
398 | | |
399 | | /* Sections F.1.4.1 & F.1.4.4.1: Encoding of DC coefficients */ |
400 | | |
401 | | /* Table F.4: Point to statistics bin S0 for DC coefficient coding */ |
402 | 0 | st = entropy->dc_stats[tbl] + entropy->dc_context[ci]; |
403 | | |
404 | | /* Figure F.4: Encode_DC_DIFF */ |
405 | 0 | if ((v = m - entropy->last_dc_val[ci]) == 0) { |
406 | 0 | arith_encode(cinfo, st, 0); |
407 | 0 | entropy->dc_context[ci] = 0; /* zero diff category */ |
408 | 0 | } else { |
409 | 0 | entropy->last_dc_val[ci] = m; |
410 | 0 | arith_encode(cinfo, st, 1); |
411 | | /* Figure F.6: Encoding nonzero value v */ |
412 | | /* Figure F.7: Encoding the sign of v */ |
413 | 0 | if (v > 0) { |
414 | 0 | arith_encode(cinfo, st + 1, 0); /* Table F.4: SS = S0 + 1 */ |
415 | 0 | st += 2; /* Table F.4: SP = S0 + 2 */ |
416 | 0 | entropy->dc_context[ci] = 4; /* small positive diff category */ |
417 | 0 | } else { |
418 | 0 | v = -v; |
419 | 0 | arith_encode(cinfo, st + 1, 1); /* Table F.4: SS = S0 + 1 */ |
420 | 0 | st += 3; /* Table F.4: SN = S0 + 3 */ |
421 | 0 | entropy->dc_context[ci] = 8; /* small negative diff category */ |
422 | 0 | } |
423 | | /* Figure F.8: Encoding the magnitude category of v */ |
424 | 0 | m = 0; |
425 | 0 | if (v -= 1) { |
426 | 0 | arith_encode(cinfo, st, 1); |
427 | 0 | m = 1; |
428 | 0 | v2 = v; |
429 | 0 | st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */ |
430 | 0 | while (v2 >>= 1) { |
431 | 0 | arith_encode(cinfo, st, 1); |
432 | 0 | m <<= 1; |
433 | 0 | st += 1; |
434 | 0 | } |
435 | 0 | } |
436 | 0 | arith_encode(cinfo, st, 0); |
437 | | /* Section F.1.4.4.1.2: Establish dc_context conditioning category */ |
438 | 0 | if (m < (int)((1L << cinfo->arith_dc_L[tbl]) >> 1)) |
439 | 0 | entropy->dc_context[ci] = 0; /* zero diff category */ |
440 | 0 | else if (m > (int)((1L << cinfo->arith_dc_U[tbl]) >> 1)) |
441 | 0 | entropy->dc_context[ci] += 8; /* large diff category */ |
442 | | /* Figure F.9: Encoding the magnitude bit pattern of v */ |
443 | 0 | st += 14; |
444 | 0 | while (m >>= 1) |
445 | 0 | arith_encode(cinfo, st, (m & v) ? 1 : 0); |
446 | 0 | } |
447 | 0 | } |
448 | |
|
449 | 0 | return TRUE; |
450 | 0 | } |
451 | | |
452 | | |
453 | | /* |
454 | | * MCU encoding for AC initial scan (either spectral selection, |
455 | | * or first pass of successive approximation). |
456 | | */ |
457 | | |
458 | | METHODDEF(boolean) |
459 | | encode_mcu_AC_first(j_compress_ptr cinfo, JBLOCKROW *MCU_data) |
460 | 0 | { |
461 | 0 | arith_entropy_ptr entropy = (arith_entropy_ptr)cinfo->entropy; |
462 | 0 | JBLOCKROW block; |
463 | 0 | unsigned char *st; |
464 | 0 | int tbl, k, ke; |
465 | 0 | int v, v2, m; |
466 | | |
467 | | /* Emit restart marker if needed */ |
468 | 0 | if (cinfo->restart_interval) { |
469 | 0 | if (entropy->restarts_to_go == 0) { |
470 | 0 | emit_restart(cinfo, entropy->next_restart_num); |
471 | 0 | entropy->restarts_to_go = cinfo->restart_interval; |
472 | 0 | entropy->next_restart_num++; |
473 | 0 | entropy->next_restart_num &= 7; |
474 | 0 | } |
475 | 0 | entropy->restarts_to_go--; |
476 | 0 | } |
477 | | |
478 | | /* Encode the MCU data block */ |
479 | 0 | block = MCU_data[0]; |
480 | 0 | tbl = cinfo->cur_comp_info[0]->ac_tbl_no; |
481 | | |
482 | | /* Sections F.1.4.2 & F.1.4.4.2: Encoding of AC coefficients */ |
483 | | |
484 | | /* Establish EOB (end-of-block) index */ |
485 | 0 | for (ke = cinfo->Se; ke > 0; ke--) |
486 | | /* We must apply the point transform by Al. For AC coefficients this |
487 | | * is an integer division with rounding towards 0. To do this portably |
488 | | * in C, we shift after obtaining the absolute value. |
489 | | */ |
490 | 0 | if ((v = (*block)[jpeg_natural_order[ke]]) >= 0) { |
491 | 0 | if (v >>= cinfo->Al) break; |
492 | 0 | } else { |
493 | 0 | v = -v; |
494 | 0 | if (v >>= cinfo->Al) break; |
495 | 0 | } |
496 | | |
497 | | /* Figure F.5: Encode_AC_Coefficients */ |
498 | 0 | for (k = cinfo->Ss; k <= ke; k++) { |
499 | 0 | st = entropy->ac_stats[tbl] + 3 * (k - 1); |
500 | 0 | arith_encode(cinfo, st, 0); /* EOB decision */ |
501 | 0 | for (;;) { |
502 | 0 | if ((v = (*block)[jpeg_natural_order[k]]) >= 0) { |
503 | 0 | if (v >>= cinfo->Al) { |
504 | 0 | arith_encode(cinfo, st + 1, 1); |
505 | 0 | arith_encode(cinfo, entropy->fixed_bin, 0); |
506 | 0 | break; |
507 | 0 | } |
508 | 0 | } else { |
509 | 0 | v = -v; |
510 | 0 | if (v >>= cinfo->Al) { |
511 | 0 | arith_encode(cinfo, st + 1, 1); |
512 | 0 | arith_encode(cinfo, entropy->fixed_bin, 1); |
513 | 0 | break; |
514 | 0 | } |
515 | 0 | } |
516 | 0 | arith_encode(cinfo, st + 1, 0); st += 3; k++; |
517 | 0 | } |
518 | 0 | st += 2; |
519 | | /* Figure F.8: Encoding the magnitude category of v */ |
520 | 0 | m = 0; |
521 | 0 | if (v -= 1) { |
522 | 0 | arith_encode(cinfo, st, 1); |
523 | 0 | m = 1; |
524 | 0 | v2 = v; |
525 | 0 | if (v2 >>= 1) { |
526 | 0 | arith_encode(cinfo, st, 1); |
527 | 0 | m <<= 1; |
528 | 0 | st = entropy->ac_stats[tbl] + |
529 | 0 | (k <= cinfo->arith_ac_K[tbl] ? 189 : 217); |
530 | 0 | while (v2 >>= 1) { |
531 | 0 | arith_encode(cinfo, st, 1); |
532 | 0 | m <<= 1; |
533 | 0 | st += 1; |
534 | 0 | } |
535 | 0 | } |
536 | 0 | } |
537 | 0 | arith_encode(cinfo, st, 0); |
538 | | /* Figure F.9: Encoding the magnitude bit pattern of v */ |
539 | 0 | st += 14; |
540 | 0 | while (m >>= 1) |
541 | 0 | arith_encode(cinfo, st, (m & v) ? 1 : 0); |
542 | 0 | } |
543 | | /* Encode EOB decision only if k <= cinfo->Se */ |
544 | 0 | if (k <= cinfo->Se) { |
545 | 0 | st = entropy->ac_stats[tbl] + 3 * (k - 1); |
546 | 0 | arith_encode(cinfo, st, 1); |
547 | 0 | } |
548 | |
|
549 | 0 | return TRUE; |
550 | 0 | } |
551 | | |
552 | | |
553 | | /* |
554 | | * MCU encoding for DC successive approximation refinement scan. |
555 | | */ |
556 | | |
557 | | METHODDEF(boolean) |
558 | | encode_mcu_DC_refine(j_compress_ptr cinfo, JBLOCKROW *MCU_data) |
559 | 0 | { |
560 | 0 | arith_entropy_ptr entropy = (arith_entropy_ptr)cinfo->entropy; |
561 | 0 | unsigned char *st; |
562 | 0 | int Al, blkn; |
563 | | |
564 | | /* Emit restart marker if needed */ |
565 | 0 | if (cinfo->restart_interval) { |
566 | 0 | if (entropy->restarts_to_go == 0) { |
567 | 0 | emit_restart(cinfo, entropy->next_restart_num); |
568 | 0 | entropy->restarts_to_go = cinfo->restart_interval; |
569 | 0 | entropy->next_restart_num++; |
570 | 0 | entropy->next_restart_num &= 7; |
571 | 0 | } |
572 | 0 | entropy->restarts_to_go--; |
573 | 0 | } |
574 | |
|
575 | 0 | st = entropy->fixed_bin; /* use fixed probability estimation */ |
576 | 0 | Al = cinfo->Al; |
577 | | |
578 | | /* Encode the MCU data blocks */ |
579 | 0 | for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { |
580 | | /* We simply emit the Al'th bit of the DC coefficient value. */ |
581 | 0 | arith_encode(cinfo, st, (MCU_data[blkn][0][0] >> Al) & 1); |
582 | 0 | } |
583 | |
|
584 | 0 | return TRUE; |
585 | 0 | } |
586 | | |
587 | | |
588 | | /* |
589 | | * MCU encoding for AC successive approximation refinement scan. |
590 | | */ |
591 | | |
592 | | METHODDEF(boolean) |
593 | | encode_mcu_AC_refine(j_compress_ptr cinfo, JBLOCKROW *MCU_data) |
594 | 0 | { |
595 | 0 | arith_entropy_ptr entropy = (arith_entropy_ptr)cinfo->entropy; |
596 | 0 | JBLOCKROW block; |
597 | 0 | unsigned char *st; |
598 | 0 | int tbl, k, ke, kex; |
599 | 0 | int v; |
600 | | |
601 | | /* Emit restart marker if needed */ |
602 | 0 | if (cinfo->restart_interval) { |
603 | 0 | if (entropy->restarts_to_go == 0) { |
604 | 0 | emit_restart(cinfo, entropy->next_restart_num); |
605 | 0 | entropy->restarts_to_go = cinfo->restart_interval; |
606 | 0 | entropy->next_restart_num++; |
607 | 0 | entropy->next_restart_num &= 7; |
608 | 0 | } |
609 | 0 | entropy->restarts_to_go--; |
610 | 0 | } |
611 | | |
612 | | /* Encode the MCU data block */ |
613 | 0 | block = MCU_data[0]; |
614 | 0 | tbl = cinfo->cur_comp_info[0]->ac_tbl_no; |
615 | | |
616 | | /* Section G.1.3.3: Encoding of AC coefficients */ |
617 | | |
618 | | /* Establish EOB (end-of-block) index */ |
619 | 0 | for (ke = cinfo->Se; ke > 0; ke--) |
620 | | /* We must apply the point transform by Al. For AC coefficients this |
621 | | * is an integer division with rounding towards 0. To do this portably |
622 | | * in C, we shift after obtaining the absolute value. |
623 | | */ |
624 | 0 | if ((v = (*block)[jpeg_natural_order[ke]]) >= 0) { |
625 | 0 | if (v >>= cinfo->Al) break; |
626 | 0 | } else { |
627 | 0 | v = -v; |
628 | 0 | if (v >>= cinfo->Al) break; |
629 | 0 | } |
630 | | |
631 | | /* Establish EOBx (previous stage end-of-block) index */ |
632 | 0 | for (kex = ke; kex > 0; kex--) |
633 | 0 | if ((v = (*block)[jpeg_natural_order[kex]]) >= 0) { |
634 | 0 | if (v >>= cinfo->Ah) break; |
635 | 0 | } else { |
636 | 0 | v = -v; |
637 | 0 | if (v >>= cinfo->Ah) break; |
638 | 0 | } |
639 | | |
640 | | /* Figure G.10: Encode_AC_Coefficients_SA */ |
641 | 0 | for (k = cinfo->Ss; k <= ke; k++) { |
642 | 0 | st = entropy->ac_stats[tbl] + 3 * (k - 1); |
643 | 0 | if (k > kex) |
644 | 0 | arith_encode(cinfo, st, 0); /* EOB decision */ |
645 | 0 | for (;;) { |
646 | 0 | if ((v = (*block)[jpeg_natural_order[k]]) >= 0) { |
647 | 0 | if (v >>= cinfo->Al) { |
648 | 0 | if (v >> 1) /* previously nonzero coef */ |
649 | 0 | arith_encode(cinfo, st + 2, (v & 1)); |
650 | 0 | else { /* newly nonzero coef */ |
651 | 0 | arith_encode(cinfo, st + 1, 1); |
652 | 0 | arith_encode(cinfo, entropy->fixed_bin, 0); |
653 | 0 | } |
654 | 0 | break; |
655 | 0 | } |
656 | 0 | } else { |
657 | 0 | v = -v; |
658 | 0 | if (v >>= cinfo->Al) { |
659 | 0 | if (v >> 1) /* previously nonzero coef */ |
660 | 0 | arith_encode(cinfo, st + 2, (v & 1)); |
661 | 0 | else { /* newly nonzero coef */ |
662 | 0 | arith_encode(cinfo, st + 1, 1); |
663 | 0 | arith_encode(cinfo, entropy->fixed_bin, 1); |
664 | 0 | } |
665 | 0 | break; |
666 | 0 | } |
667 | 0 | } |
668 | 0 | arith_encode(cinfo, st + 1, 0); st += 3; k++; |
669 | 0 | } |
670 | 0 | } |
671 | | /* Encode EOB decision only if k <= cinfo->Se */ |
672 | 0 | if (k <= cinfo->Se) { |
673 | 0 | st = entropy->ac_stats[tbl] + 3 * (k - 1); |
674 | 0 | arith_encode(cinfo, st, 1); |
675 | 0 | } |
676 | |
|
677 | 0 | return TRUE; |
678 | 0 | } |
679 | | |
680 | | |
681 | | /* |
682 | | * Encode and output one MCU's worth of arithmetic-compressed coefficients. |
683 | | */ |
684 | | |
685 | | METHODDEF(boolean) |
686 | | encode_mcu(j_compress_ptr cinfo, JBLOCKROW *MCU_data) |
687 | 0 | { |
688 | 0 | arith_entropy_ptr entropy = (arith_entropy_ptr)cinfo->entropy; |
689 | 0 | jpeg_component_info *compptr; |
690 | 0 | JBLOCKROW block; |
691 | 0 | unsigned char *st; |
692 | 0 | int blkn, ci, tbl, k, ke; |
693 | 0 | int v, v2, m; |
694 | | |
695 | | /* Emit restart marker if needed */ |
696 | 0 | if (cinfo->restart_interval) { |
697 | 0 | if (entropy->restarts_to_go == 0) { |
698 | 0 | emit_restart(cinfo, entropy->next_restart_num); |
699 | 0 | entropy->restarts_to_go = cinfo->restart_interval; |
700 | 0 | entropy->next_restart_num++; |
701 | 0 | entropy->next_restart_num &= 7; |
702 | 0 | } |
703 | 0 | entropy->restarts_to_go--; |
704 | 0 | } |
705 | | |
706 | | /* Encode the MCU data blocks */ |
707 | 0 | for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { |
708 | 0 | block = MCU_data[blkn]; |
709 | 0 | ci = cinfo->MCU_membership[blkn]; |
710 | 0 | compptr = cinfo->cur_comp_info[ci]; |
711 | | |
712 | | /* Sections F.1.4.1 & F.1.4.4.1: Encoding of DC coefficients */ |
713 | |
|
714 | 0 | tbl = compptr->dc_tbl_no; |
715 | | |
716 | | /* Table F.4: Point to statistics bin S0 for DC coefficient coding */ |
717 | 0 | st = entropy->dc_stats[tbl] + entropy->dc_context[ci]; |
718 | | |
719 | | /* Figure F.4: Encode_DC_DIFF */ |
720 | 0 | if ((v = (*block)[0] - entropy->last_dc_val[ci]) == 0) { |
721 | 0 | arith_encode(cinfo, st, 0); |
722 | 0 | entropy->dc_context[ci] = 0; /* zero diff category */ |
723 | 0 | } else { |
724 | 0 | entropy->last_dc_val[ci] = (*block)[0]; |
725 | 0 | arith_encode(cinfo, st, 1); |
726 | | /* Figure F.6: Encoding nonzero value v */ |
727 | | /* Figure F.7: Encoding the sign of v */ |
728 | 0 | if (v > 0) { |
729 | 0 | arith_encode(cinfo, st + 1, 0); /* Table F.4: SS = S0 + 1 */ |
730 | 0 | st += 2; /* Table F.4: SP = S0 + 2 */ |
731 | 0 | entropy->dc_context[ci] = 4; /* small positive diff category */ |
732 | 0 | } else { |
733 | 0 | v = -v; |
734 | 0 | arith_encode(cinfo, st + 1, 1); /* Table F.4: SS = S0 + 1 */ |
735 | 0 | st += 3; /* Table F.4: SN = S0 + 3 */ |
736 | 0 | entropy->dc_context[ci] = 8; /* small negative diff category */ |
737 | 0 | } |
738 | | /* Figure F.8: Encoding the magnitude category of v */ |
739 | 0 | m = 0; |
740 | 0 | if (v -= 1) { |
741 | 0 | arith_encode(cinfo, st, 1); |
742 | 0 | m = 1; |
743 | 0 | v2 = v; |
744 | 0 | st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */ |
745 | 0 | while (v2 >>= 1) { |
746 | 0 | arith_encode(cinfo, st, 1); |
747 | 0 | m <<= 1; |
748 | 0 | st += 1; |
749 | 0 | } |
750 | 0 | } |
751 | 0 | arith_encode(cinfo, st, 0); |
752 | | /* Section F.1.4.4.1.2: Establish dc_context conditioning category */ |
753 | 0 | if (m < (int)((1L << cinfo->arith_dc_L[tbl]) >> 1)) |
754 | 0 | entropy->dc_context[ci] = 0; /* zero diff category */ |
755 | 0 | else if (m > (int)((1L << cinfo->arith_dc_U[tbl]) >> 1)) |
756 | 0 | entropy->dc_context[ci] += 8; /* large diff category */ |
757 | | /* Figure F.9: Encoding the magnitude bit pattern of v */ |
758 | 0 | st += 14; |
759 | 0 | while (m >>= 1) |
760 | 0 | arith_encode(cinfo, st, (m & v) ? 1 : 0); |
761 | 0 | } |
762 | | |
763 | | /* Sections F.1.4.2 & F.1.4.4.2: Encoding of AC coefficients */ |
764 | |
|
765 | 0 | tbl = compptr->ac_tbl_no; |
766 | | |
767 | | /* Establish EOB (end-of-block) index */ |
768 | 0 | for (ke = DCTSIZE2 - 1; ke > 0; ke--) |
769 | 0 | if ((*block)[jpeg_natural_order[ke]]) break; |
770 | | |
771 | | /* Figure F.5: Encode_AC_Coefficients */ |
772 | 0 | for (k = 1; k <= ke; k++) { |
773 | 0 | st = entropy->ac_stats[tbl] + 3 * (k - 1); |
774 | 0 | arith_encode(cinfo, st, 0); /* EOB decision */ |
775 | 0 | while ((v = (*block)[jpeg_natural_order[k]]) == 0) { |
776 | 0 | arith_encode(cinfo, st + 1, 0); st += 3; k++; |
777 | 0 | } |
778 | 0 | arith_encode(cinfo, st + 1, 1); |
779 | | /* Figure F.6: Encoding nonzero value v */ |
780 | | /* Figure F.7: Encoding the sign of v */ |
781 | 0 | if (v > 0) { |
782 | 0 | arith_encode(cinfo, entropy->fixed_bin, 0); |
783 | 0 | } else { |
784 | 0 | v = -v; |
785 | 0 | arith_encode(cinfo, entropy->fixed_bin, 1); |
786 | 0 | } |
787 | 0 | st += 2; |
788 | | /* Figure F.8: Encoding the magnitude category of v */ |
789 | 0 | m = 0; |
790 | 0 | if (v -= 1) { |
791 | 0 | arith_encode(cinfo, st, 1); |
792 | 0 | m = 1; |
793 | 0 | v2 = v; |
794 | 0 | if (v2 >>= 1) { |
795 | 0 | arith_encode(cinfo, st, 1); |
796 | 0 | m <<= 1; |
797 | 0 | st = entropy->ac_stats[tbl] + |
798 | 0 | (k <= cinfo->arith_ac_K[tbl] ? 189 : 217); |
799 | 0 | while (v2 >>= 1) { |
800 | 0 | arith_encode(cinfo, st, 1); |
801 | 0 | m <<= 1; |
802 | 0 | st += 1; |
803 | 0 | } |
804 | 0 | } |
805 | 0 | } |
806 | 0 | arith_encode(cinfo, st, 0); |
807 | | /* Figure F.9: Encoding the magnitude bit pattern of v */ |
808 | 0 | st += 14; |
809 | 0 | while (m >>= 1) |
810 | 0 | arith_encode(cinfo, st, (m & v) ? 1 : 0); |
811 | 0 | } |
812 | | /* Encode EOB decision only if k <= DCTSIZE2 - 1 */ |
813 | 0 | if (k <= DCTSIZE2 - 1) { |
814 | 0 | st = entropy->ac_stats[tbl] + 3 * (k - 1); |
815 | 0 | arith_encode(cinfo, st, 1); |
816 | 0 | } |
817 | 0 | } |
818 | |
|
819 | 0 | return TRUE; |
820 | 0 | } |
821 | | |
822 | | |
823 | | /* |
824 | | * Initialize for an arithmetic-compressed scan. |
825 | | */ |
826 | | |
827 | | METHODDEF(void) |
828 | | start_pass(j_compress_ptr cinfo, boolean gather_statistics) |
829 | 0 | { |
830 | 0 | arith_entropy_ptr entropy = (arith_entropy_ptr)cinfo->entropy; |
831 | 0 | int ci, tbl; |
832 | 0 | jpeg_component_info *compptr; |
833 | |
|
834 | 0 | if (gather_statistics) |
835 | | /* Make sure to avoid that in the master control logic! |
836 | | * We are fully adaptive here and need no extra |
837 | | * statistics gathering pass! |
838 | | */ |
839 | 0 | ERREXIT(cinfo, JERR_NOTIMPL); |
840 | | |
841 | | /* We assume jcmaster.c already validated the progressive scan parameters. */ |
842 | | |
843 | | /* Select execution routines */ |
844 | 0 | if (cinfo->progressive_mode) { |
845 | 0 | if (cinfo->Ah == 0) { |
846 | 0 | if (cinfo->Ss == 0) |
847 | 0 | entropy->pub.encode_mcu = encode_mcu_DC_first; |
848 | 0 | else |
849 | 0 | entropy->pub.encode_mcu = encode_mcu_AC_first; |
850 | 0 | } else { |
851 | 0 | if (cinfo->Ss == 0) |
852 | 0 | entropy->pub.encode_mcu = encode_mcu_DC_refine; |
853 | 0 | else |
854 | 0 | entropy->pub.encode_mcu = encode_mcu_AC_refine; |
855 | 0 | } |
856 | 0 | } else |
857 | 0 | entropy->pub.encode_mcu = encode_mcu; |
858 | | |
859 | | /* Allocate & initialize requested statistics areas */ |
860 | 0 | for (ci = 0; ci < cinfo->comps_in_scan; ci++) { |
861 | 0 | compptr = cinfo->cur_comp_info[ci]; |
862 | | /* DC needs no table for refinement scan */ |
863 | 0 | if (cinfo->progressive_mode == 0 || (cinfo->Ss == 0 && cinfo->Ah == 0)) { |
864 | 0 | tbl = compptr->dc_tbl_no; |
865 | 0 | if (tbl < 0 || tbl >= NUM_ARITH_TBLS) |
866 | 0 | ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl); |
867 | 0 | if (entropy->dc_stats[tbl] == NULL) |
868 | 0 | entropy->dc_stats[tbl] = (unsigned char *)(*cinfo->mem->alloc_small) |
869 | 0 | ((j_common_ptr)cinfo, JPOOL_IMAGE, DC_STAT_BINS); |
870 | 0 | memset(entropy->dc_stats[tbl], 0, DC_STAT_BINS); |
871 | | /* Initialize DC predictions to 0 */ |
872 | 0 | entropy->last_dc_val[ci] = 0; |
873 | 0 | entropy->dc_context[ci] = 0; |
874 | 0 | } |
875 | | /* AC needs no table when not present */ |
876 | 0 | if (cinfo->progressive_mode == 0 || cinfo->Se) { |
877 | 0 | tbl = compptr->ac_tbl_no; |
878 | 0 | if (tbl < 0 || tbl >= NUM_ARITH_TBLS) |
879 | 0 | ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl); |
880 | 0 | if (entropy->ac_stats[tbl] == NULL) |
881 | 0 | entropy->ac_stats[tbl] = (unsigned char *)(*cinfo->mem->alloc_small) |
882 | 0 | ((j_common_ptr)cinfo, JPOOL_IMAGE, AC_STAT_BINS); |
883 | 0 | memset(entropy->ac_stats[tbl], 0, AC_STAT_BINS); |
884 | | #ifdef CALCULATE_SPECTRAL_CONDITIONING |
885 | | if (cinfo->progressive_mode) |
886 | | /* Section G.1.3.2: Set appropriate arithmetic conditioning value Kx */ |
887 | | cinfo->arith_ac_K[tbl] = cinfo->Ss + |
888 | | ((8 + cinfo->Se - cinfo->Ss) >> 4); |
889 | | #endif |
890 | 0 | } |
891 | 0 | } |
892 | | |
893 | | /* Initialize arithmetic encoding variables */ |
894 | 0 | entropy->c = 0; |
895 | 0 | entropy->a = 0x10000L; |
896 | 0 | entropy->sc = 0; |
897 | 0 | entropy->zc = 0; |
898 | 0 | entropy->ct = 11; |
899 | 0 | entropy->buffer = -1; /* empty */ |
900 | | |
901 | | /* Initialize restart stuff */ |
902 | 0 | entropy->restarts_to_go = cinfo->restart_interval; |
903 | 0 | entropy->next_restart_num = 0; |
904 | 0 | } |
905 | | |
906 | | |
907 | | /* |
908 | | * Module initialization routine for arithmetic entropy encoding. |
909 | | */ |
910 | | |
911 | | GLOBAL(void) |
912 | | jinit_arith_encoder(j_compress_ptr cinfo) |
913 | 0 | { |
914 | 0 | arith_entropy_ptr entropy; |
915 | 0 | int i; |
916 | |
|
917 | 0 | entropy = (arith_entropy_ptr) |
918 | 0 | (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE, |
919 | 0 | sizeof(arith_entropy_encoder)); |
920 | 0 | cinfo->entropy = (struct jpeg_entropy_encoder *)entropy; |
921 | 0 | entropy->pub.start_pass = start_pass; |
922 | 0 | entropy->pub.finish_pass = finish_pass; |
923 | | |
924 | | /* Mark tables unallocated */ |
925 | 0 | for (i = 0; i < NUM_ARITH_TBLS; i++) { |
926 | 0 | entropy->dc_stats[i] = NULL; |
927 | 0 | entropy->ac_stats[i] = NULL; |
928 | 0 | } |
929 | | |
930 | | /* Initialize index for fixed probability estimation */ |
931 | 0 | entropy->fixed_bin[0] = 113; |
932 | 0 | } |