image_intensities 1.0.3 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. checksums.yaml +4 -4
  2. data/ext/image_intensities/Makefile +73 -4
  3. data/ext/image_intensities/turbojpeg/cderror.h +137 -0
  4. data/ext/image_intensities/turbojpeg/cdjpeg.h +157 -0
  5. data/ext/image_intensities/turbojpeg/cmyk.h +61 -0
  6. data/ext/image_intensities/turbojpeg/jaricom.c +157 -0
  7. data/ext/image_intensities/turbojpeg/jcapimin.c +295 -0
  8. data/ext/image_intensities/turbojpeg/jcapistd.c +162 -0
  9. data/ext/image_intensities/turbojpeg/jcarith.c +932 -0
  10. data/ext/image_intensities/turbojpeg/jccoefct.c +449 -0
  11. data/ext/image_intensities/turbojpeg/jccolext.c +144 -0
  12. data/ext/image_intensities/turbojpeg/jccolor.c +710 -0
  13. data/ext/image_intensities/turbojpeg/jcdctmgr.c +721 -0
  14. data/ext/image_intensities/turbojpeg/jchuff.c +1096 -0
  15. data/ext/image_intensities/turbojpeg/jchuff.h +42 -0
  16. data/ext/image_intensities/turbojpeg/jcicc.c +105 -0
  17. data/ext/image_intensities/turbojpeg/jcinit.c +77 -0
  18. data/ext/image_intensities/turbojpeg/jcmainct.c +162 -0
  19. data/ext/image_intensities/turbojpeg/jcmarker.c +664 -0
  20. data/ext/image_intensities/turbojpeg/jcmaster.c +640 -0
  21. data/ext/image_intensities/turbojpeg/jcomapi.c +109 -0
  22. data/ext/image_intensities/turbojpeg/jconfig.h +73 -0
  23. data/ext/image_intensities/turbojpeg/jconfigint.h +31 -0
  24. data/ext/image_intensities/turbojpeg/jcparam.c +541 -0
  25. data/ext/image_intensities/turbojpeg/jcphuff.c +1105 -0
  26. data/ext/image_intensities/turbojpeg/jcprepct.c +351 -0
  27. data/ext/image_intensities/turbojpeg/jcsample.c +539 -0
  28. data/ext/image_intensities/turbojpeg/jctrans.c +400 -0
  29. data/ext/image_intensities/turbojpeg/jdapimin.c +407 -0
  30. data/ext/image_intensities/turbojpeg/jdapistd.c +639 -0
  31. data/ext/image_intensities/turbojpeg/jdarith.c +773 -0
  32. data/ext/image_intensities/turbojpeg/jdatadst-tj.c +203 -0
  33. data/ext/image_intensities/turbojpeg/jdatadst.c +293 -0
  34. data/ext/image_intensities/turbojpeg/jdatasrc-tj.c +194 -0
  35. data/ext/image_intensities/turbojpeg/jdatasrc.c +295 -0
  36. data/ext/image_intensities/turbojpeg/jdcoefct.c +692 -0
  37. data/ext/image_intensities/turbojpeg/jdcoefct.h +82 -0
  38. data/ext/image_intensities/turbojpeg/jdcol565.c +384 -0
  39. data/ext/image_intensities/turbojpeg/jdcolext.c +143 -0
  40. data/ext/image_intensities/turbojpeg/jdcolor.c +883 -0
  41. data/ext/image_intensities/turbojpeg/jdct.h +208 -0
  42. data/ext/image_intensities/turbojpeg/jddctmgr.c +352 -0
  43. data/ext/image_intensities/turbojpeg/jdhuff.c +831 -0
  44. data/ext/image_intensities/turbojpeg/jdhuff.h +238 -0
  45. data/ext/image_intensities/turbojpeg/jdicc.c +171 -0
  46. data/ext/image_intensities/turbojpeg/jdinput.c +408 -0
  47. data/ext/image_intensities/turbojpeg/jdmainct.c +460 -0
  48. data/ext/image_intensities/turbojpeg/jdmainct.h +71 -0
  49. data/ext/image_intensities/turbojpeg/jdmarker.c +1377 -0
  50. data/ext/image_intensities/turbojpeg/jdmaster.c +737 -0
  51. data/ext/image_intensities/turbojpeg/jdmaster.h +28 -0
  52. data/ext/image_intensities/turbojpeg/jdmerge.c +617 -0
  53. data/ext/image_intensities/turbojpeg/jdmrg565.c +354 -0
  54. data/ext/image_intensities/turbojpeg/jdmrgext.c +184 -0
  55. data/ext/image_intensities/turbojpeg/jdphuff.c +687 -0
  56. data/ext/image_intensities/turbojpeg/jdpostct.c +294 -0
  57. data/ext/image_intensities/turbojpeg/jdsample.c +518 -0
  58. data/ext/image_intensities/turbojpeg/jdsample.h +50 -0
  59. data/ext/image_intensities/turbojpeg/jdtrans.c +155 -0
  60. data/ext/image_intensities/turbojpeg/jerror.c +251 -0
  61. data/ext/image_intensities/turbojpeg/jfdctflt.c +169 -0
  62. data/ext/image_intensities/turbojpeg/jfdctfst.c +227 -0
  63. data/ext/image_intensities/turbojpeg/jfdctint.c +288 -0
  64. data/ext/image_intensities/turbojpeg/jidctflt.c +240 -0
  65. data/ext/image_intensities/turbojpeg/jidctfst.c +371 -0
  66. data/ext/image_intensities/turbojpeg/jidctint.c +2627 -0
  67. data/ext/image_intensities/turbojpeg/jidctred.c +409 -0
  68. data/ext/image_intensities/turbojpeg/jinclude.h +88 -0
  69. data/ext/image_intensities/turbojpeg/jmemmgr.c +1179 -0
  70. data/ext/image_intensities/turbojpeg/jmemnobs.c +115 -0
  71. data/ext/image_intensities/turbojpeg/jmemsys.h +178 -0
  72. data/ext/image_intensities/turbojpeg/jpeg_nbits_table.h +4098 -0
  73. data/ext/image_intensities/turbojpeg/jpegcomp.h +31 -0
  74. data/ext/image_intensities/turbojpeg/jquant1.c +859 -0
  75. data/ext/image_intensities/turbojpeg/jquant2.c +1285 -0
  76. data/ext/image_intensities/turbojpeg/jsimd.h +117 -0
  77. data/ext/image_intensities/turbojpeg/jsimd_none.c +418 -0
  78. data/ext/image_intensities/turbojpeg/jsimddct.h +70 -0
  79. data/ext/image_intensities/turbojpeg/jstdhuff.c +143 -0
  80. data/ext/image_intensities/turbojpeg/jutils.c +133 -0
  81. data/ext/image_intensities/turbojpeg/jversion.h +52 -0
  82. data/ext/image_intensities/turbojpeg/libturbojpeg.a +0 -0
  83. data/ext/image_intensities/turbojpeg/rdbmp.c +689 -0
  84. data/ext/image_intensities/turbojpeg/rdppm.c +766 -0
  85. data/ext/image_intensities/turbojpeg/tjutil.h +47 -0
  86. data/ext/image_intensities/turbojpeg/transupp.c +1628 -0
  87. data/ext/image_intensities/turbojpeg/transupp.h +210 -0
  88. data/ext/image_intensities/turbojpeg/turbojpeg.c +2150 -0
  89. data/ext/image_intensities/turbojpeg/wrbmp.c +558 -0
  90. data/ext/image_intensities/turbojpeg/wrppm.c +365 -0
  91. data/image_intensities.gemspec +1 -1
  92. data/lib/image_intensities/version.rb +1 -1
  93. metadata +91 -3
@@ -0,0 +1,932 @@
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, 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
+ #define DC_STAT_BINS 64
70
+ #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
+ #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
+ {
125
+ struct jpeg_destination_mgr *dest = cinfo->dest;
126
+
127
+ *dest->next_output_byte++ = (JOCTET)val;
128
+ if (--dest->free_in_buffer == 0)
129
+ if (!(*dest->empty_output_buffer) (cinfo))
130
+ ERREXIT(cinfo, JERR_CANT_SUSPEND);
131
+ }
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
+ {
141
+ arith_entropy_ptr e = (arith_entropy_ptr)cinfo->entropy;
142
+ 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
+ if ((temp = (e->a - 1 + e->c) & 0xFFFF0000UL) < e->c)
149
+ e->c = temp + 0x8000L;
150
+ else
151
+ e->c = temp;
152
+ /* Send remaining bytes to output */
153
+ e->c <<= e->ct;
154
+ if (e->c & 0xF8000000UL) {
155
+ /* One final overflow has to be handled */
156
+ if (e->buffer >= 0) {
157
+ if (e->zc)
158
+ do emit_byte(0x00, cinfo);
159
+ while (--e->zc);
160
+ emit_byte(e->buffer + 1, cinfo);
161
+ if (e->buffer + 1 == 0xFF)
162
+ emit_byte(0x00, cinfo);
163
+ }
164
+ e->zc += e->sc; /* carry-over converts stacked 0xFF bytes to 0x00 */
165
+ e->sc = 0;
166
+ } else {
167
+ if (e->buffer == 0)
168
+ ++e->zc;
169
+ else if (e->buffer >= 0) {
170
+ if (e->zc)
171
+ do emit_byte(0x00, cinfo);
172
+ while (--e->zc);
173
+ emit_byte(e->buffer, cinfo);
174
+ }
175
+ if (e->sc) {
176
+ if (e->zc)
177
+ do emit_byte(0x00, cinfo);
178
+ while (--e->zc);
179
+ do {
180
+ emit_byte(0xFF, cinfo);
181
+ emit_byte(0x00, cinfo);
182
+ } while (--e->sc);
183
+ }
184
+ }
185
+ /* Output final bytes only if they are not 0x00 */
186
+ if (e->c & 0x7FFF800L) {
187
+ if (e->zc) /* output final pending zero bytes */
188
+ do emit_byte(0x00, cinfo);
189
+ while (--e->zc);
190
+ emit_byte((e->c >> 19) & 0xFF, cinfo);
191
+ if (((e->c >> 19) & 0xFF) == 0xFF)
192
+ emit_byte(0x00, cinfo);
193
+ if (e->c & 0x7F800L) {
194
+ emit_byte((e->c >> 11) & 0xFF, cinfo);
195
+ if (((e->c >> 11) & 0xFF) == 0xFF)
196
+ emit_byte(0x00, cinfo);
197
+ }
198
+ }
199
+ }
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
+ {
227
+ register arith_entropy_ptr e = (arith_entropy_ptr)cinfo->entropy;
228
+ register unsigned char nl, nm;
229
+ register JLONG qe, temp;
230
+ 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
+ sv = *st;
236
+ qe = jpeg_aritab[sv & 0x7F]; /* => Qe_Value */
237
+ nl = qe & 0xFF; qe >>= 8; /* Next_Index_LPS + Switch_MPS */
238
+ nm = qe & 0xFF; qe >>= 8; /* Next_Index_MPS */
239
+
240
+ /* Encode & estimation procedures per sections D.1.4 & D.1.5 */
241
+ e->a -= qe;
242
+ if (val != (sv >> 7)) {
243
+ /* Encode the less probable symbol */
244
+ 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
+ e->c += e->a;
250
+ e->a = qe;
251
+ }
252
+ *st = (sv & 0x80) ^ nl; /* Estimate_after_LPS */
253
+ } else {
254
+ /* Encode the more probable symbol */
255
+ if (e->a >= 0x8000L)
256
+ return; /* A >= 0x8000 -> ready, no renormalization required */
257
+ 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
+ e->c += e->a;
262
+ e->a = qe;
263
+ }
264
+ *st = (sv & 0x80) ^ nm; /* Estimate_after_MPS */
265
+ }
266
+
267
+ /* Renormalization & data output per section D.1.6 */
268
+ do {
269
+ e->a <<= 1;
270
+ e->c <<= 1;
271
+ if (--e->ct == 0) {
272
+ /* Another byte is ready for output */
273
+ temp = e->c >> 19;
274
+ if (temp > 0xFF) {
275
+ /* Handle overflow over all stacked 0xFF bytes */
276
+ if (e->buffer >= 0) {
277
+ if (e->zc)
278
+ do emit_byte(0x00, cinfo);
279
+ while (--e->zc);
280
+ emit_byte(e->buffer + 1, cinfo);
281
+ if (e->buffer + 1 == 0xFF)
282
+ emit_byte(0x00, cinfo);
283
+ }
284
+ e->zc += e->sc; /* carry-over converts stacked 0xFF bytes to 0x00 */
285
+ 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
+ e->buffer = temp & 0xFF; /* new output byte, might overflow later */
290
+ } else if (temp == 0xFF) {
291
+ ++e->sc; /* stack 0xFF byte (which might overflow later) */
292
+ } else {
293
+ /* Output all stacked 0xFF bytes, they will not overflow any more */
294
+ if (e->buffer == 0)
295
+ ++e->zc;
296
+ else if (e->buffer >= 0) {
297
+ if (e->zc)
298
+ do emit_byte(0x00, cinfo);
299
+ while (--e->zc);
300
+ emit_byte(e->buffer, cinfo);
301
+ }
302
+ if (e->sc) {
303
+ if (e->zc)
304
+ do emit_byte(0x00, cinfo);
305
+ while (--e->zc);
306
+ do {
307
+ emit_byte(0xFF, cinfo);
308
+ emit_byte(0x00, cinfo);
309
+ } while (--e->sc);
310
+ }
311
+ e->buffer = temp & 0xFF; /* new output byte (can still overflow) */
312
+ }
313
+ e->c &= 0x7FFFFL;
314
+ e->ct += 8;
315
+ }
316
+ } while (e->a < 0x8000L);
317
+ }
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
+ {
327
+ arith_entropy_ptr entropy = (arith_entropy_ptr)cinfo->entropy;
328
+ int ci;
329
+ jpeg_component_info *compptr;
330
+
331
+ finish_pass(cinfo);
332
+
333
+ emit_byte(0xFF, cinfo);
334
+ emit_byte(JPEG_RST0 + restart_num, cinfo);
335
+
336
+ /* Re-initialize statistics areas */
337
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
338
+ compptr = cinfo->cur_comp_info[ci];
339
+ /* DC needs no table for refinement scan */
340
+ if (cinfo->progressive_mode == 0 || (cinfo->Ss == 0 && cinfo->Ah == 0)) {
341
+ MEMZERO(entropy->dc_stats[compptr->dc_tbl_no], DC_STAT_BINS);
342
+ /* Reset DC predictions to 0 */
343
+ entropy->last_dc_val[ci] = 0;
344
+ entropy->dc_context[ci] = 0;
345
+ }
346
+ /* AC needs no table when not present */
347
+ if (cinfo->progressive_mode == 0 || cinfo->Se) {
348
+ MEMZERO(entropy->ac_stats[compptr->ac_tbl_no], AC_STAT_BINS);
349
+ }
350
+ }
351
+
352
+ /* Reset arithmetic encoding variables */
353
+ entropy->c = 0;
354
+ entropy->a = 0x10000L;
355
+ entropy->sc = 0;
356
+ entropy->zc = 0;
357
+ entropy->ct = 11;
358
+ entropy->buffer = -1; /* empty */
359
+ }
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
+ {
370
+ arith_entropy_ptr entropy = (arith_entropy_ptr)cinfo->entropy;
371
+ JBLOCKROW block;
372
+ unsigned char *st;
373
+ int blkn, ci, tbl;
374
+ int v, v2, m;
375
+ ISHIFT_TEMPS
376
+
377
+ /* Emit restart marker if needed */
378
+ if (cinfo->restart_interval) {
379
+ if (entropy->restarts_to_go == 0) {
380
+ emit_restart(cinfo, entropy->next_restart_num);
381
+ entropy->restarts_to_go = cinfo->restart_interval;
382
+ entropy->next_restart_num++;
383
+ entropy->next_restart_num &= 7;
384
+ }
385
+ entropy->restarts_to_go--;
386
+ }
387
+
388
+ /* Encode the MCU data blocks */
389
+ for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
390
+ block = MCU_data[blkn];
391
+ ci = cinfo->MCU_membership[blkn];
392
+ 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
+ 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
+ st = entropy->dc_stats[tbl] + entropy->dc_context[ci];
403
+
404
+ /* Figure F.4: Encode_DC_DIFF */
405
+ if ((v = m - entropy->last_dc_val[ci]) == 0) {
406
+ arith_encode(cinfo, st, 0);
407
+ entropy->dc_context[ci] = 0; /* zero diff category */
408
+ } else {
409
+ entropy->last_dc_val[ci] = m;
410
+ arith_encode(cinfo, st, 1);
411
+ /* Figure F.6: Encoding nonzero value v */
412
+ /* Figure F.7: Encoding the sign of v */
413
+ if (v > 0) {
414
+ arith_encode(cinfo, st + 1, 0); /* Table F.4: SS = S0 + 1 */
415
+ st += 2; /* Table F.4: SP = S0 + 2 */
416
+ entropy->dc_context[ci] = 4; /* small positive diff category */
417
+ } else {
418
+ v = -v;
419
+ arith_encode(cinfo, st + 1, 1); /* Table F.4: SS = S0 + 1 */
420
+ st += 3; /* Table F.4: SN = S0 + 3 */
421
+ entropy->dc_context[ci] = 8; /* small negative diff category */
422
+ }
423
+ /* Figure F.8: Encoding the magnitude category of v */
424
+ m = 0;
425
+ if (v -= 1) {
426
+ arith_encode(cinfo, st, 1);
427
+ m = 1;
428
+ v2 = v;
429
+ st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */
430
+ while (v2 >>= 1) {
431
+ arith_encode(cinfo, st, 1);
432
+ m <<= 1;
433
+ st += 1;
434
+ }
435
+ }
436
+ arith_encode(cinfo, st, 0);
437
+ /* Section F.1.4.4.1.2: Establish dc_context conditioning category */
438
+ if (m < (int)((1L << cinfo->arith_dc_L[tbl]) >> 1))
439
+ entropy->dc_context[ci] = 0; /* zero diff category */
440
+ else if (m > (int)((1L << cinfo->arith_dc_U[tbl]) >> 1))
441
+ entropy->dc_context[ci] += 8; /* large diff category */
442
+ /* Figure F.9: Encoding the magnitude bit pattern of v */
443
+ st += 14;
444
+ while (m >>= 1)
445
+ arith_encode(cinfo, st, (m & v) ? 1 : 0);
446
+ }
447
+ }
448
+
449
+ return TRUE;
450
+ }
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
+ {
461
+ arith_entropy_ptr entropy = (arith_entropy_ptr)cinfo->entropy;
462
+ JBLOCKROW block;
463
+ unsigned char *st;
464
+ int tbl, k, ke;
465
+ int v, v2, m;
466
+
467
+ /* Emit restart marker if needed */
468
+ if (cinfo->restart_interval) {
469
+ if (entropy->restarts_to_go == 0) {
470
+ emit_restart(cinfo, entropy->next_restart_num);
471
+ entropy->restarts_to_go = cinfo->restart_interval;
472
+ entropy->next_restart_num++;
473
+ entropy->next_restart_num &= 7;
474
+ }
475
+ entropy->restarts_to_go--;
476
+ }
477
+
478
+ /* Encode the MCU data block */
479
+ block = MCU_data[0];
480
+ 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
+ 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
+ if ((v = (*block)[jpeg_natural_order[ke]]) >= 0) {
491
+ if (v >>= cinfo->Al) break;
492
+ } else {
493
+ v = -v;
494
+ if (v >>= cinfo->Al) break;
495
+ }
496
+
497
+ /* Figure F.5: Encode_AC_Coefficients */
498
+ for (k = cinfo->Ss; k <= ke; k++) {
499
+ st = entropy->ac_stats[tbl] + 3 * (k - 1);
500
+ arith_encode(cinfo, st, 0); /* EOB decision */
501
+ for (;;) {
502
+ if ((v = (*block)[jpeg_natural_order[k]]) >= 0) {
503
+ if (v >>= cinfo->Al) {
504
+ arith_encode(cinfo, st + 1, 1);
505
+ arith_encode(cinfo, entropy->fixed_bin, 0);
506
+ break;
507
+ }
508
+ } else {
509
+ v = -v;
510
+ if (v >>= cinfo->Al) {
511
+ arith_encode(cinfo, st + 1, 1);
512
+ arith_encode(cinfo, entropy->fixed_bin, 1);
513
+ break;
514
+ }
515
+ }
516
+ arith_encode(cinfo, st + 1, 0); st += 3; k++;
517
+ }
518
+ st += 2;
519
+ /* Figure F.8: Encoding the magnitude category of v */
520
+ m = 0;
521
+ if (v -= 1) {
522
+ arith_encode(cinfo, st, 1);
523
+ m = 1;
524
+ v2 = v;
525
+ if (v2 >>= 1) {
526
+ arith_encode(cinfo, st, 1);
527
+ m <<= 1;
528
+ st = entropy->ac_stats[tbl] +
529
+ (k <= cinfo->arith_ac_K[tbl] ? 189 : 217);
530
+ while (v2 >>= 1) {
531
+ arith_encode(cinfo, st, 1);
532
+ m <<= 1;
533
+ st += 1;
534
+ }
535
+ }
536
+ }
537
+ arith_encode(cinfo, st, 0);
538
+ /* Figure F.9: Encoding the magnitude bit pattern of v */
539
+ st += 14;
540
+ while (m >>= 1)
541
+ arith_encode(cinfo, st, (m & v) ? 1 : 0);
542
+ }
543
+ /* Encode EOB decision only if k <= cinfo->Se */
544
+ if (k <= cinfo->Se) {
545
+ st = entropy->ac_stats[tbl] + 3 * (k - 1);
546
+ arith_encode(cinfo, st, 1);
547
+ }
548
+
549
+ return TRUE;
550
+ }
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
+ {
560
+ arith_entropy_ptr entropy = (arith_entropy_ptr)cinfo->entropy;
561
+ unsigned char *st;
562
+ int Al, blkn;
563
+
564
+ /* Emit restart marker if needed */
565
+ if (cinfo->restart_interval) {
566
+ if (entropy->restarts_to_go == 0) {
567
+ emit_restart(cinfo, entropy->next_restart_num);
568
+ entropy->restarts_to_go = cinfo->restart_interval;
569
+ entropy->next_restart_num++;
570
+ entropy->next_restart_num &= 7;
571
+ }
572
+ entropy->restarts_to_go--;
573
+ }
574
+
575
+ st = entropy->fixed_bin; /* use fixed probability estimation */
576
+ Al = cinfo->Al;
577
+
578
+ /* Encode the MCU data blocks */
579
+ for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
580
+ /* We simply emit the Al'th bit of the DC coefficient value. */
581
+ arith_encode(cinfo, st, (MCU_data[blkn][0][0] >> Al) & 1);
582
+ }
583
+
584
+ return TRUE;
585
+ }
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
+ {
595
+ arith_entropy_ptr entropy = (arith_entropy_ptr)cinfo->entropy;
596
+ JBLOCKROW block;
597
+ unsigned char *st;
598
+ int tbl, k, ke, kex;
599
+ int v;
600
+
601
+ /* Emit restart marker if needed */
602
+ if (cinfo->restart_interval) {
603
+ if (entropy->restarts_to_go == 0) {
604
+ emit_restart(cinfo, entropy->next_restart_num);
605
+ entropy->restarts_to_go = cinfo->restart_interval;
606
+ entropy->next_restart_num++;
607
+ entropy->next_restart_num &= 7;
608
+ }
609
+ entropy->restarts_to_go--;
610
+ }
611
+
612
+ /* Encode the MCU data block */
613
+ block = MCU_data[0];
614
+ 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
+ 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
+ if ((v = (*block)[jpeg_natural_order[ke]]) >= 0) {
625
+ if (v >>= cinfo->Al) break;
626
+ } else {
627
+ v = -v;
628
+ if (v >>= cinfo->Al) break;
629
+ }
630
+
631
+ /* Establish EOBx (previous stage end-of-block) index */
632
+ for (kex = ke; kex > 0; kex--)
633
+ if ((v = (*block)[jpeg_natural_order[kex]]) >= 0) {
634
+ if (v >>= cinfo->Ah) break;
635
+ } else {
636
+ v = -v;
637
+ if (v >>= cinfo->Ah) break;
638
+ }
639
+
640
+ /* Figure G.10: Encode_AC_Coefficients_SA */
641
+ for (k = cinfo->Ss; k <= ke; k++) {
642
+ st = entropy->ac_stats[tbl] + 3 * (k - 1);
643
+ if (k > kex)
644
+ arith_encode(cinfo, st, 0); /* EOB decision */
645
+ for (;;) {
646
+ if ((v = (*block)[jpeg_natural_order[k]]) >= 0) {
647
+ if (v >>= cinfo->Al) {
648
+ if (v >> 1) /* previously nonzero coef */
649
+ arith_encode(cinfo, st + 2, (v & 1));
650
+ else { /* newly nonzero coef */
651
+ arith_encode(cinfo, st + 1, 1);
652
+ arith_encode(cinfo, entropy->fixed_bin, 0);
653
+ }
654
+ break;
655
+ }
656
+ } else {
657
+ v = -v;
658
+ if (v >>= cinfo->Al) {
659
+ if (v >> 1) /* previously nonzero coef */
660
+ arith_encode(cinfo, st + 2, (v & 1));
661
+ else { /* newly nonzero coef */
662
+ arith_encode(cinfo, st + 1, 1);
663
+ arith_encode(cinfo, entropy->fixed_bin, 1);
664
+ }
665
+ break;
666
+ }
667
+ }
668
+ arith_encode(cinfo, st + 1, 0); st += 3; k++;
669
+ }
670
+ }
671
+ /* Encode EOB decision only if k <= cinfo->Se */
672
+ if (k <= cinfo->Se) {
673
+ st = entropy->ac_stats[tbl] + 3 * (k - 1);
674
+ arith_encode(cinfo, st, 1);
675
+ }
676
+
677
+ return TRUE;
678
+ }
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
+ {
688
+ arith_entropy_ptr entropy = (arith_entropy_ptr)cinfo->entropy;
689
+ jpeg_component_info *compptr;
690
+ JBLOCKROW block;
691
+ unsigned char *st;
692
+ int blkn, ci, tbl, k, ke;
693
+ int v, v2, m;
694
+
695
+ /* Emit restart marker if needed */
696
+ if (cinfo->restart_interval) {
697
+ if (entropy->restarts_to_go == 0) {
698
+ emit_restart(cinfo, entropy->next_restart_num);
699
+ entropy->restarts_to_go = cinfo->restart_interval;
700
+ entropy->next_restart_num++;
701
+ entropy->next_restart_num &= 7;
702
+ }
703
+ entropy->restarts_to_go--;
704
+ }
705
+
706
+ /* Encode the MCU data blocks */
707
+ for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
708
+ block = MCU_data[blkn];
709
+ ci = cinfo->MCU_membership[blkn];
710
+ compptr = cinfo->cur_comp_info[ci];
711
+
712
+ /* Sections F.1.4.1 & F.1.4.4.1: Encoding of DC coefficients */
713
+
714
+ tbl = compptr->dc_tbl_no;
715
+
716
+ /* Table F.4: Point to statistics bin S0 for DC coefficient coding */
717
+ st = entropy->dc_stats[tbl] + entropy->dc_context[ci];
718
+
719
+ /* Figure F.4: Encode_DC_DIFF */
720
+ if ((v = (*block)[0] - entropy->last_dc_val[ci]) == 0) {
721
+ arith_encode(cinfo, st, 0);
722
+ entropy->dc_context[ci] = 0; /* zero diff category */
723
+ } else {
724
+ entropy->last_dc_val[ci] = (*block)[0];
725
+ arith_encode(cinfo, st, 1);
726
+ /* Figure F.6: Encoding nonzero value v */
727
+ /* Figure F.7: Encoding the sign of v */
728
+ if (v > 0) {
729
+ arith_encode(cinfo, st + 1, 0); /* Table F.4: SS = S0 + 1 */
730
+ st += 2; /* Table F.4: SP = S0 + 2 */
731
+ entropy->dc_context[ci] = 4; /* small positive diff category */
732
+ } else {
733
+ v = -v;
734
+ arith_encode(cinfo, st + 1, 1); /* Table F.4: SS = S0 + 1 */
735
+ st += 3; /* Table F.4: SN = S0 + 3 */
736
+ entropy->dc_context[ci] = 8; /* small negative diff category */
737
+ }
738
+ /* Figure F.8: Encoding the magnitude category of v */
739
+ m = 0;
740
+ if (v -= 1) {
741
+ arith_encode(cinfo, st, 1);
742
+ m = 1;
743
+ v2 = v;
744
+ st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */
745
+ while (v2 >>= 1) {
746
+ arith_encode(cinfo, st, 1);
747
+ m <<= 1;
748
+ st += 1;
749
+ }
750
+ }
751
+ arith_encode(cinfo, st, 0);
752
+ /* Section F.1.4.4.1.2: Establish dc_context conditioning category */
753
+ if (m < (int)((1L << cinfo->arith_dc_L[tbl]) >> 1))
754
+ entropy->dc_context[ci] = 0; /* zero diff category */
755
+ else if (m > (int)((1L << cinfo->arith_dc_U[tbl]) >> 1))
756
+ entropy->dc_context[ci] += 8; /* large diff category */
757
+ /* Figure F.9: Encoding the magnitude bit pattern of v */
758
+ st += 14;
759
+ while (m >>= 1)
760
+ arith_encode(cinfo, st, (m & v) ? 1 : 0);
761
+ }
762
+
763
+ /* Sections F.1.4.2 & F.1.4.4.2: Encoding of AC coefficients */
764
+
765
+ tbl = compptr->ac_tbl_no;
766
+
767
+ /* Establish EOB (end-of-block) index */
768
+ for (ke = DCTSIZE2 - 1; ke > 0; ke--)
769
+ if ((*block)[jpeg_natural_order[ke]]) break;
770
+
771
+ /* Figure F.5: Encode_AC_Coefficients */
772
+ for (k = 1; k <= ke; k++) {
773
+ st = entropy->ac_stats[tbl] + 3 * (k - 1);
774
+ arith_encode(cinfo, st, 0); /* EOB decision */
775
+ while ((v = (*block)[jpeg_natural_order[k]]) == 0) {
776
+ arith_encode(cinfo, st + 1, 0); st += 3; k++;
777
+ }
778
+ arith_encode(cinfo, st + 1, 1);
779
+ /* Figure F.6: Encoding nonzero value v */
780
+ /* Figure F.7: Encoding the sign of v */
781
+ if (v > 0) {
782
+ arith_encode(cinfo, entropy->fixed_bin, 0);
783
+ } else {
784
+ v = -v;
785
+ arith_encode(cinfo, entropy->fixed_bin, 1);
786
+ }
787
+ st += 2;
788
+ /* Figure F.8: Encoding the magnitude category of v */
789
+ m = 0;
790
+ if (v -= 1) {
791
+ arith_encode(cinfo, st, 1);
792
+ m = 1;
793
+ v2 = v;
794
+ if (v2 >>= 1) {
795
+ arith_encode(cinfo, st, 1);
796
+ m <<= 1;
797
+ st = entropy->ac_stats[tbl] +
798
+ (k <= cinfo->arith_ac_K[tbl] ? 189 : 217);
799
+ while (v2 >>= 1) {
800
+ arith_encode(cinfo, st, 1);
801
+ m <<= 1;
802
+ st += 1;
803
+ }
804
+ }
805
+ }
806
+ arith_encode(cinfo, st, 0);
807
+ /* Figure F.9: Encoding the magnitude bit pattern of v */
808
+ st += 14;
809
+ while (m >>= 1)
810
+ arith_encode(cinfo, st, (m & v) ? 1 : 0);
811
+ }
812
+ /* Encode EOB decision only if k <= DCTSIZE2 - 1 */
813
+ if (k <= DCTSIZE2 - 1) {
814
+ st = entropy->ac_stats[tbl] + 3 * (k - 1);
815
+ arith_encode(cinfo, st, 1);
816
+ }
817
+ }
818
+
819
+ return TRUE;
820
+ }
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
+ {
830
+ arith_entropy_ptr entropy = (arith_entropy_ptr)cinfo->entropy;
831
+ int ci, tbl;
832
+ jpeg_component_info *compptr;
833
+
834
+ 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
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
840
+
841
+ /* We assume jcmaster.c already validated the progressive scan parameters. */
842
+
843
+ /* Select execution routines */
844
+ if (cinfo->progressive_mode) {
845
+ if (cinfo->Ah == 0) {
846
+ if (cinfo->Ss == 0)
847
+ entropy->pub.encode_mcu = encode_mcu_DC_first;
848
+ else
849
+ entropy->pub.encode_mcu = encode_mcu_AC_first;
850
+ } else {
851
+ if (cinfo->Ss == 0)
852
+ entropy->pub.encode_mcu = encode_mcu_DC_refine;
853
+ else
854
+ entropy->pub.encode_mcu = encode_mcu_AC_refine;
855
+ }
856
+ } else
857
+ entropy->pub.encode_mcu = encode_mcu;
858
+
859
+ /* Allocate & initialize requested statistics areas */
860
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
861
+ compptr = cinfo->cur_comp_info[ci];
862
+ /* DC needs no table for refinement scan */
863
+ if (cinfo->progressive_mode == 0 || (cinfo->Ss == 0 && cinfo->Ah == 0)) {
864
+ tbl = compptr->dc_tbl_no;
865
+ if (tbl < 0 || tbl >= NUM_ARITH_TBLS)
866
+ ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl);
867
+ if (entropy->dc_stats[tbl] == NULL)
868
+ entropy->dc_stats[tbl] = (unsigned char *)(*cinfo->mem->alloc_small)
869
+ ((j_common_ptr)cinfo, JPOOL_IMAGE, DC_STAT_BINS);
870
+ MEMZERO(entropy->dc_stats[tbl], DC_STAT_BINS);
871
+ /* Initialize DC predictions to 0 */
872
+ entropy->last_dc_val[ci] = 0;
873
+ entropy->dc_context[ci] = 0;
874
+ }
875
+ /* AC needs no table when not present */
876
+ if (cinfo->progressive_mode == 0 || cinfo->Se) {
877
+ tbl = compptr->ac_tbl_no;
878
+ if (tbl < 0 || tbl >= NUM_ARITH_TBLS)
879
+ ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl);
880
+ if (entropy->ac_stats[tbl] == NULL)
881
+ entropy->ac_stats[tbl] = (unsigned char *)(*cinfo->mem->alloc_small)
882
+ ((j_common_ptr)cinfo, JPOOL_IMAGE, AC_STAT_BINS);
883
+ MEMZERO(entropy->ac_stats[tbl], 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
+ }
891
+ }
892
+
893
+ /* Initialize arithmetic encoding variables */
894
+ entropy->c = 0;
895
+ entropy->a = 0x10000L;
896
+ entropy->sc = 0;
897
+ entropy->zc = 0;
898
+ entropy->ct = 11;
899
+ entropy->buffer = -1; /* empty */
900
+
901
+ /* Initialize restart stuff */
902
+ entropy->restarts_to_go = cinfo->restart_interval;
903
+ entropy->next_restart_num = 0;
904
+ }
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
+ {
914
+ arith_entropy_ptr entropy;
915
+ int i;
916
+
917
+ entropy = (arith_entropy_ptr)
918
+ (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
919
+ sizeof(arith_entropy_encoder));
920
+ cinfo->entropy = (struct jpeg_entropy_encoder *)entropy;
921
+ entropy->pub.start_pass = start_pass;
922
+ entropy->pub.finish_pass = finish_pass;
923
+
924
+ /* Mark tables unallocated */
925
+ for (i = 0; i < NUM_ARITH_TBLS; i++) {
926
+ entropy->dc_stats[i] = NULL;
927
+ entropy->ac_stats[i] = NULL;
928
+ }
929
+
930
+ /* Initialize index for fixed probability estimation */
931
+ entropy->fixed_bin[0] = 113;
932
+ }