Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/thirdparty/libjpeg-turbo/src/jcarith.c
9904 views
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
#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
memset(entropy->dc_stats[compptr->dc_tbl_no], 0, 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
memset(entropy->ac_stats[compptr->ac_tbl_no], 0, 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_NOTIMPL);
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
memset(entropy->dc_stats[tbl], 0, 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
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
}
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
}
933
934