Coverage Report

Created: 2025-07-01 06:27

/src/libjpeg-turbo.3.0.x/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
5.15M
#define DC_STAT_BINS  64
70
8.03M
#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
44.3M
#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
283M
{
125
283M
  struct jpeg_destination_mgr *dest = cinfo->dest;
126
127
283M
  *dest->next_output_byte++ = (JOCTET)val;
128
283M
  if (--dest->free_in_buffer == 0)
129
6.75k
    if (!(*dest->empty_output_buffer) (cinfo))
130
0
      ERREXIT(cinfo, JERR_CANT_SUSPEND);
131
283M
}
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
6.23M
{
141
6.23M
  arith_entropy_ptr e = (arith_entropy_ptr)cinfo->entropy;
142
6.23M
  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
6.23M
  if ((temp = (e->a - 1 + e->c) & 0xFFFF0000UL) < e->c)
149
1.32M
    e->c = temp + 0x8000L;
150
4.90M
  else
151
4.90M
    e->c = temp;
152
  /* Send remaining bytes to output */
153
6.23M
  e->c <<= e->ct;
154
6.23M
  if (e->c & 0xF8000000UL) {
155
    /* One final overflow has to be handled */
156
207k
    if (e->buffer >= 0) {
157
207k
      if (e->zc)
158
13.0k
        do emit_byte(0x00, cinfo);
159
13.0k
        while (--e->zc);
160
207k
      emit_byte(e->buffer + 1, cinfo);
161
207k
      if (e->buffer + 1 == 0xFF)
162
2.71k
        emit_byte(0x00, cinfo);
163
207k
    }
164
207k
    e->zc += e->sc;  /* carry-over converts stacked 0xFF bytes to 0x00 */
165
207k
    e->sc = 0;
166
6.02M
  } else {
167
6.02M
    if (e->buffer == 0)
168
44.8k
      ++e->zc;
169
5.98M
    else if (e->buffer >= 0) {
170
3.38M
      if (e->zc)
171
48.0k
        do emit_byte(0x00, cinfo);
172
48.0k
        while (--e->zc);
173
3.38M
      emit_byte(e->buffer, cinfo);
174
3.38M
    }
175
6.02M
    if (e->sc) {
176
39.7k
      if (e->zc)
177
2.85k
        do emit_byte(0x00, cinfo);
178
2.85k
        while (--e->zc);
179
44.9k
      do {
180
44.9k
        emit_byte(0xFF, cinfo);
181
44.9k
        emit_byte(0x00, cinfo);
182
44.9k
      } while (--e->sc);
183
39.7k
    }
184
6.02M
  }
185
  /* Output final bytes only if they are not 0x00 */
186
6.23M
  if (e->c & 0x7FFF800L) {
187
5.92M
    if (e->zc)  /* output final pending zero bytes */
188
75.4k
      do emit_byte(0x00, cinfo);
189
75.4k
      while (--e->zc);
190
5.92M
    emit_byte((e->c >> 19) & 0xFF, cinfo);
191
5.92M
    if (((e->c >> 19) & 0xFF) == 0xFF)
192
27.2k
      emit_byte(0x00, cinfo);
193
5.92M
    if (e->c & 0x7F800L) {
194
749k
      emit_byte((e->c >> 11) & 0xFF, cinfo);
195
749k
      if (((e->c >> 11) & 0xFF) == 0xFF)
196
0
        emit_byte(0x00, cinfo);
197
749k
    }
198
5.92M
  }
199
6.23M
}
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
3.50G
{
227
3.50G
  register arith_entropy_ptr e = (arith_entropy_ptr)cinfo->entropy;
228
3.50G
  register unsigned char nl, nm;
229
3.50G
  register JLONG qe, temp;
230
3.50G
  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
3.50G
  sv = *st;
236
3.50G
  qe = jpeg_aritab[sv & 0x7F];  /* => Qe_Value */
237
3.50G
  nl = qe & 0xFF;  qe >>= 8;    /* Next_Index_LPS + Switch_MPS */
238
3.50G
  nm = qe & 0xFF;  qe >>= 8;    /* Next_Index_MPS */
239
240
  /* Encode & estimation procedures per sections D.1.4 & D.1.5 */
241
3.50G
  e->a -= qe;
242
3.50G
  if (val != (sv >> 7)) {
243
    /* Encode the less probable symbol */
244
821M
    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
608M
      e->c += e->a;
250
608M
      e->a = qe;
251
608M
    }
252
821M
    *st = (sv & 0x80) ^ nl;     /* Estimate_after_LPS */
253
2.68G
  } else {
254
    /* Encode the more probable symbol */
255
2.68G
    if (e->a >= 0x8000L)
256
1.82G
      return;  /* A >= 0x8000 -> ready, no renormalization required */
257
857M
    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
234M
      e->c += e->a;
262
234M
      e->a = qe;
263
234M
    }
264
857M
    *st = (sv & 0x80) ^ nm;     /* Estimate_after_MPS */
265
857M
  }
266
267
  /* Renormalization & data output per section D.1.6 */
268
2.12G
  do {
269
2.12G
    e->a <<= 1;
270
2.12G
    e->c <<= 1;
271
2.12G
    if (--e->ct == 0) {
272
      /* Another byte is ready for output */
273
262M
      temp = e->c >> 19;
274
262M
      if (temp > 0xFF) {
275
        /* Handle overflow over all stacked 0xFF bytes */
276
10.5M
        if (e->buffer >= 0) {
277
10.5M
          if (e->zc)
278
76.8k
            do emit_byte(0x00, cinfo);
279
76.8k
            while (--e->zc);
280
10.5M
          emit_byte(e->buffer + 1, cinfo);
281
10.5M
          if (e->buffer + 1 == 0xFF)
282
47.6k
            emit_byte(0x00, cinfo);
283
10.5M
        }
284
10.5M
        e->zc += e->sc;  /* carry-over converts stacked 0xFF bytes to 0x00 */
285
10.5M
        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
10.5M
        e->buffer = temp & 0xFF;  /* new output byte, might overflow later */
290
251M
      } else if (temp == 0xFF) {
291
2.61M
        ++e->sc;  /* stack 0xFF byte (which might overflow later) */
292
249M
      } else {
293
        /* Output all stacked 0xFF bytes, they will not overflow any more */
294
249M
        if (e->buffer == 0)
295
3.18M
          ++e->zc;
296
246M
        else if (e->buffer >= 0) {
297
242M
          if (e->zc)
298
3.03M
            do emit_byte(0x00, cinfo);
299
3.03M
            while (--e->zc);
300
242M
          emit_byte(e->buffer, cinfo);
301
242M
        }
302
249M
        if (e->sc) {
303
2.32M
          if (e->zc)
304
14.6k
            do emit_byte(0x00, cinfo);
305
14.6k
            while (--e->zc);
306
2.45M
          do {
307
2.45M
            emit_byte(0xFF, cinfo);
308
2.45M
            emit_byte(0x00, cinfo);
309
2.45M
          } while (--e->sc);
310
2.32M
        }
311
249M
        e->buffer = temp & 0xFF;  /* new output byte (can still overflow) */
312
249M
      }
313
262M
      e->c &= 0x7FFFFL;
314
262M
      e->ct += 8;
315
262M
    }
316
2.12G
  } while (e->a < 0x8000L);
317
1.67G
}
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
6.06M
{
327
6.06M
  arith_entropy_ptr entropy = (arith_entropy_ptr)cinfo->entropy;
328
6.06M
  int ci;
329
6.06M
  jpeg_component_info *compptr;
330
331
6.06M
  finish_pass(cinfo);
332
333
6.06M
  emit_byte(0xFF, cinfo);
334
6.06M
  emit_byte(JPEG_RST0 + restart_num, cinfo);
335
336
  /* Re-initialize statistics areas */
337
16.2M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
338
10.1M
    compptr = cinfo->cur_comp_info[ci];
339
    /* DC needs no table for refinement scan */
340
10.1M
    if (cinfo->progressive_mode == 0 || (cinfo->Ss == 0 && cinfo->Ah == 0)) {
341
4.98M
      memset(entropy->dc_stats[compptr->dc_tbl_no], 0, DC_STAT_BINS);
342
      /* Reset DC predictions to 0 */
343
4.98M
      entropy->last_dc_val[ci] = 0;
344
4.98M
      entropy->dc_context[ci] = 0;
345
4.98M
    }
346
    /* AC needs no table when not present */
347
10.1M
    if (cinfo->progressive_mode == 0 || cinfo->Se) {
348
7.79M
      memset(entropy->ac_stats[compptr->ac_tbl_no], 0, AC_STAT_BINS);
349
7.79M
    }
350
10.1M
  }
351
352
  /* Reset arithmetic encoding variables */
353
6.06M
  entropy->c = 0;
354
6.06M
  entropy->a = 0x10000L;
355
6.06M
  entropy->sc = 0;
356
6.06M
  entropy->zc = 0;
357
6.06M
  entropy->ct = 11;
358
6.06M
  entropy->buffer = -1;  /* empty */
359
6.06M
}
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
7.39M
{
370
7.39M
  arith_entropy_ptr entropy = (arith_entropy_ptr)cinfo->entropy;
371
7.39M
  JBLOCKROW block;
372
7.39M
  unsigned char *st;
373
7.39M
  int blkn, ci, tbl;
374
7.39M
  int v, v2, m;
375
7.39M
  ISHIFT_TEMPS
376
377
  /* Emit restart marker if needed */
378
7.39M
  if (cinfo->restart_interval) {
379
1.59M
    if (entropy->restarts_to_go == 0) {
380
397k
      emit_restart(cinfo, entropy->next_restart_num);
381
397k
      entropy->restarts_to_go = cinfo->restart_interval;
382
397k
      entropy->next_restart_num++;
383
397k
      entropy->next_restart_num &= 7;
384
397k
    }
385
1.59M
    entropy->restarts_to_go--;
386
1.59M
  }
387
388
  /* Encode the MCU data blocks */
389
51.7M
  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
390
44.3M
    block = MCU_data[blkn];
391
44.3M
    ci = cinfo->MCU_membership[blkn];
392
44.3M
    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
44.3M
    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
44.3M
    st = entropy->dc_stats[tbl] + entropy->dc_context[ci];
403
404
    /* Figure F.4: Encode_DC_DIFF */
405
44.3M
    if ((v = m - entropy->last_dc_val[ci]) == 0) {
406
39.0M
      arith_encode(cinfo, st, 0);
407
39.0M
      entropy->dc_context[ci] = 0;      /* zero diff category */
408
39.0M
    } else {
409
5.38M
      entropy->last_dc_val[ci] = m;
410
5.38M
      arith_encode(cinfo, st, 1);
411
      /* Figure F.6: Encoding nonzero value v */
412
      /* Figure F.7: Encoding the sign of v */
413
5.38M
      if (v > 0) {
414
2.59M
        arith_encode(cinfo, st + 1, 0); /* Table F.4: SS = S0 + 1 */
415
2.59M
        st += 2;                        /* Table F.4: SP = S0 + 2 */
416
2.59M
        entropy->dc_context[ci] = 4;    /* small positive diff category */
417
2.79M
      } else {
418
2.79M
        v = -v;
419
2.79M
        arith_encode(cinfo, st + 1, 1); /* Table F.4: SS = S0 + 1 */
420
2.79M
        st += 3;                        /* Table F.4: SN = S0 + 3 */
421
2.79M
        entropy->dc_context[ci] = 8;    /* small negative diff category */
422
2.79M
      }
423
      /* Figure F.8: Encoding the magnitude category of v */
424
5.38M
      m = 0;
425
5.38M
      if (v -= 1) {
426
4.98M
        arith_encode(cinfo, st, 1);
427
4.98M
        m = 1;
428
4.98M
        v2 = v;
429
4.98M
        st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */
430
26.0M
        while (v2 >>= 1) {
431
21.0M
          arith_encode(cinfo, st, 1);
432
21.0M
          m <<= 1;
433
21.0M
          st += 1;
434
21.0M
        }
435
4.98M
      }
436
5.38M
      arith_encode(cinfo, st, 0);
437
      /* Section F.1.4.4.1.2: Establish dc_context conditioning category */
438
5.38M
      if (m < (int)((1L << cinfo->arith_dc_L[tbl]) >> 1))
439
0
        entropy->dc_context[ci] = 0;    /* zero diff category */
440
5.38M
      else if (m > (int)((1L << cinfo->arith_dc_U[tbl]) >> 1))
441
4.68M
        entropy->dc_context[ci] += 8;   /* large diff category */
442
      /* Figure F.9: Encoding the magnitude bit pattern of v */
443
5.38M
      st += 14;
444
26.4M
      while (m >>= 1)
445
21.0M
        arith_encode(cinfo, st, (m & v) ? 1 : 0);
446
5.38M
    }
447
44.3M
  }
448
449
7.39M
  return TRUE;
450
7.39M
}
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
35.6M
{
461
35.6M
  arith_entropy_ptr entropy = (arith_entropy_ptr)cinfo->entropy;
462
35.6M
  JBLOCKROW block;
463
35.6M
  unsigned char *st;
464
35.6M
  int tbl, k, ke;
465
35.6M
  int v, v2, m;
466
467
  /* Emit restart marker if needed */
468
35.6M
  if (cinfo->restart_interval) {
469
8.03M
    if (entropy->restarts_to_go == 0) {
470
2.00M
      emit_restart(cinfo, entropy->next_restart_num);
471
2.00M
      entropy->restarts_to_go = cinfo->restart_interval;
472
2.00M
      entropy->next_restart_num++;
473
2.00M
      entropy->next_restart_num &= 7;
474
2.00M
    }
475
8.03M
    entropy->restarts_to_go--;
476
8.03M
  }
477
478
  /* Encode the MCU data block */
479
35.6M
  block = MCU_data[0];
480
35.6M
  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
1.48G
  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
1.46G
    if ((v = (*block)[jpeg_natural_order[ke]]) >= 0) {
491
1.44G
      if (v >>= cinfo->Al) break;
492
1.44G
    } else {
493
15.9M
      v = -v;
494
15.9M
      if (v >>= cinfo->Al) break;
495
15.9M
    }
496
497
  /* Figure F.5: Encode_AC_Coefficients */
498
110M
  for (k = cinfo->Ss; k <= ke; k++) {
499
75.2M
    st = entropy->ac_stats[tbl] + 3 * (k - 1);
500
75.2M
    arith_encode(cinfo, st, 0);         /* EOB decision */
501
167M
    for (;;) {
502
167M
      if ((v = (*block)[jpeg_natural_order[k]]) >= 0) {
503
118M
        if (v >>= cinfo->Al) {
504
37.2M
          arith_encode(cinfo, st + 1, 1);
505
37.2M
          arith_encode(cinfo, entropy->fixed_bin, 0);
506
37.2M
          break;
507
37.2M
        }
508
118M
      } else {
509
48.9M
        v = -v;
510
48.9M
        if (v >>= cinfo->Al) {
511
38.0M
          arith_encode(cinfo, st + 1, 1);
512
38.0M
          arith_encode(cinfo, entropy->fixed_bin, 1);
513
38.0M
          break;
514
38.0M
        }
515
48.9M
      }
516
92.3M
      arith_encode(cinfo, st + 1, 0);  st += 3;  k++;
517
92.3M
    }
518
75.2M
    st += 2;
519
    /* Figure F.8: Encoding the magnitude category of v */
520
75.2M
    m = 0;
521
75.2M
    if (v -= 1) {
522
55.5M
      arith_encode(cinfo, st, 1);
523
55.5M
      m = 1;
524
55.5M
      v2 = v;
525
55.5M
      if (v2 >>= 1) {
526
45.0M
        arith_encode(cinfo, st, 1);
527
45.0M
        m <<= 1;
528
45.0M
        st = entropy->ac_stats[tbl] +
529
45.0M
             (k <= cinfo->arith_ac_K[tbl] ? 189 : 217);
530
132M
        while (v2 >>= 1) {
531
86.9M
          arith_encode(cinfo, st, 1);
532
86.9M
          m <<= 1;
533
86.9M
          st += 1;
534
86.9M
        }
535
45.0M
      }
536
55.5M
    }
537
75.2M
    arith_encode(cinfo, st, 0);
538
    /* Figure F.9: Encoding the magnitude bit pattern of v */
539
75.2M
    st += 14;
540
207M
    while (m >>= 1)
541
132M
      arith_encode(cinfo, st, (m & v) ? 1 : 0);
542
75.2M
  }
543
  /* Encode EOB decision only if k <= cinfo->Se */
544
35.6M
  if (k <= cinfo->Se) {
545
33.3M
    st = entropy->ac_stats[tbl] + 3 * (k - 1);
546
33.3M
    arith_encode(cinfo, st, 1);
547
33.3M
  }
548
549
35.6M
  return TRUE;
550
35.6M
}
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
7.39M
{
560
7.39M
  arith_entropy_ptr entropy = (arith_entropy_ptr)cinfo->entropy;
561
7.39M
  unsigned char *st;
562
7.39M
  int Al, blkn;
563
564
  /* Emit restart marker if needed */
565
7.39M
  if (cinfo->restart_interval) {
566
1.59M
    if (entropy->restarts_to_go == 0) {
567
397k
      emit_restart(cinfo, entropy->next_restart_num);
568
397k
      entropy->restarts_to_go = cinfo->restart_interval;
569
397k
      entropy->next_restart_num++;
570
397k
      entropy->next_restart_num &= 7;
571
397k
    }
572
1.59M
    entropy->restarts_to_go--;
573
1.59M
  }
574
575
7.39M
  st = entropy->fixed_bin;      /* use fixed probability estimation */
576
7.39M
  Al = cinfo->Al;
577
578
  /* Encode the MCU data blocks */
579
51.7M
  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
580
    /* We simply emit the Al'th bit of the DC coefficient value. */
581
44.3M
    arith_encode(cinfo, st, (MCU_data[blkn][0][0] >> Al) & 1);
582
44.3M
  }
583
584
7.39M
  return TRUE;
585
7.39M
}
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
35.6M
{
595
35.6M
  arith_entropy_ptr entropy = (arith_entropy_ptr)cinfo->entropy;
596
35.6M
  JBLOCKROW block;
597
35.6M
  unsigned char *st;
598
35.6M
  int tbl, k, ke, kex;
599
35.6M
  int v;
600
601
  /* Emit restart marker if needed */
602
35.6M
  if (cinfo->restart_interval) {
603
8.03M
    if (entropy->restarts_to_go == 0) {
604
2.00M
      emit_restart(cinfo, entropy->next_restart_num);
605
2.00M
      entropy->restarts_to_go = cinfo->restart_interval;
606
2.00M
      entropy->next_restart_num++;
607
2.00M
      entropy->next_restart_num &= 7;
608
2.00M
    }
609
8.03M
    entropy->restarts_to_go--;
610
8.03M
  }
611
612
  /* Encode the MCU data block */
613
35.6M
  block = MCU_data[0];
614
35.6M
  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
1.87G
  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
1.84G
    if ((v = (*block)[jpeg_natural_order[ke]]) >= 0) {
625
1.83G
      if (v >>= cinfo->Al) break;
626
1.83G
    } else {
627
8.58M
      v = -v;
628
8.58M
      if (v >>= cinfo->Al) break;
629
8.58M
    }
630
631
  /* Establish EOBx (previous stage end-of-block) index */
632
89.2M
  for (kex = ke; kex > 0; kex--)
633
63.6M
    if ((v = (*block)[jpeg_natural_order[kex]]) >= 0) {
634
48.0M
      if (v >>= cinfo->Ah) break;
635
48.0M
    } else {
636
15.6M
      v = -v;
637
15.6M
      if (v >>= cinfo->Ah) break;
638
15.6M
    }
639
640
  /* Figure G.10: Encode_AC_Coefficients_SA */
641
242M
  for (k = cinfo->Ss; k <= ke; k++) {
642
206M
    st = entropy->ac_stats[tbl] + 3 * (k - 1);
643
206M
    if (k > kex)
644
15.4M
      arith_encode(cinfo, st, 0);       /* EOB decision */
645
411M
    for (;;) {
646
411M
      if ((v = (*block)[jpeg_natural_order[k]]) >= 0) {
647
300M
        if (v >>= cinfo->Al) {
648
102M
          if (v >> 1)                   /* previously nonzero coef */
649
80.7M
            arith_encode(cinfo, st + 2, (v & 1));
650
21.9M
          else {                        /* newly nonzero coef */
651
21.9M
            arith_encode(cinfo, st + 1, 1);
652
21.9M
            arith_encode(cinfo, entropy->fixed_bin, 0);
653
21.9M
          }
654
102M
          break;
655
102M
        }
656
300M
      } else {
657
111M
        v = -v;
658
111M
        if (v >>= cinfo->Al) {
659
104M
          if (v >> 1)                   /* previously nonzero coef */
660
82.1M
            arith_encode(cinfo, st + 2, (v & 1));
661
21.8M
          else {                        /* newly nonzero coef */
662
21.8M
            arith_encode(cinfo, st + 1, 1);
663
21.8M
            arith_encode(cinfo, entropy->fixed_bin, 1);
664
21.8M
          }
665
104M
          break;
666
104M
        }
667
111M
      }
668
205M
      arith_encode(cinfo, st + 1, 0);  st += 3;  k++;
669
205M
    }
670
206M
  }
671
  /* Encode EOB decision only if k <= cinfo->Se */
672
35.6M
  if (k <= cinfo->Se) {
673
34.0M
    st = entropy->ac_stats[tbl] + 3 * (k - 1);
674
34.0M
    arith_encode(cinfo, st, 1);
675
34.0M
  }
676
677
35.6M
  return TRUE;
678
35.6M
}
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
25.9M
{
688
25.9M
  arith_entropy_ptr entropy = (arith_entropy_ptr)cinfo->entropy;
689
25.9M
  jpeg_component_info *compptr;
690
25.9M
  JBLOCKROW block;
691
25.9M
  unsigned char *st;
692
25.9M
  int blkn, ci, tbl, k, ke;
693
25.9M
  int v, v2, m;
694
695
  /* Emit restart marker if needed */
696
25.9M
  if (cinfo->restart_interval) {
697
3.80M
    if (entropy->restarts_to_go == 0) {
698
1.26M
      emit_restart(cinfo, entropy->next_restart_num);
699
1.26M
      entropy->restarts_to_go = cinfo->restart_interval;
700
1.26M
      entropy->next_restart_num++;
701
1.26M
      entropy->next_restart_num &= 7;
702
1.26M
    }
703
3.80M
    entropy->restarts_to_go--;
704
3.80M
  }
705
706
  /* Encode the MCU data blocks */
707
87.1M
  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
708
61.2M
    block = MCU_data[blkn];
709
61.2M
    ci = cinfo->MCU_membership[blkn];
710
61.2M
    compptr = cinfo->cur_comp_info[ci];
711
712
    /* Sections F.1.4.1 & F.1.4.4.1: Encoding of DC coefficients */
713
714
61.2M
    tbl = compptr->dc_tbl_no;
715
716
    /* Table F.4: Point to statistics bin S0 for DC coefficient coding */
717
61.2M
    st = entropy->dc_stats[tbl] + entropy->dc_context[ci];
718
719
    /* Figure F.4: Encode_DC_DIFF */
720
61.2M
    if ((v = (*block)[0] - entropy->last_dc_val[ci]) == 0) {
721
44.5M
      arith_encode(cinfo, st, 0);
722
44.5M
      entropy->dc_context[ci] = 0;      /* zero diff category */
723
44.5M
    } else {
724
16.6M
      entropy->last_dc_val[ci] = (*block)[0];
725
16.6M
      arith_encode(cinfo, st, 1);
726
      /* Figure F.6: Encoding nonzero value v */
727
      /* Figure F.7: Encoding the sign of v */
728
16.6M
      if (v > 0) {
729
9.15M
        arith_encode(cinfo, st + 1, 0); /* Table F.4: SS = S0 + 1 */
730
9.15M
        st += 2;                        /* Table F.4: SP = S0 + 2 */
731
9.15M
        entropy->dc_context[ci] = 4;    /* small positive diff category */
732
9.15M
      } else {
733
7.47M
        v = -v;
734
7.47M
        arith_encode(cinfo, st + 1, 1); /* Table F.4: SS = S0 + 1 */
735
7.47M
        st += 3;                        /* Table F.4: SN = S0 + 3 */
736
7.47M
        entropy->dc_context[ci] = 8;    /* small negative diff category */
737
7.47M
      }
738
      /* Figure F.8: Encoding the magnitude category of v */
739
16.6M
      m = 0;
740
16.6M
      if (v -= 1) {
741
15.5M
        arith_encode(cinfo, st, 1);
742
15.5M
        m = 1;
743
15.5M
        v2 = v;
744
15.5M
        st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */
745
117M
        while (v2 >>= 1) {
746
101M
          arith_encode(cinfo, st, 1);
747
101M
          m <<= 1;
748
101M
          st += 1;
749
101M
        }
750
15.5M
      }
751
16.6M
      arith_encode(cinfo, st, 0);
752
      /* Section F.1.4.4.1.2: Establish dc_context conditioning category */
753
16.6M
      if (m < (int)((1L << cinfo->arith_dc_L[tbl]) >> 1))
754
0
        entropy->dc_context[ci] = 0;    /* zero diff category */
755
16.6M
      else if (m > (int)((1L << cinfo->arith_dc_U[tbl]) >> 1))
756
14.8M
        entropy->dc_context[ci] += 8;   /* large diff category */
757
      /* Figure F.9: Encoding the magnitude bit pattern of v */
758
16.6M
      st += 14;
759
118M
      while (m >>= 1)
760
101M
        arith_encode(cinfo, st, (m & v) ? 1 : 0);
761
16.6M
    }
762
763
    /* Sections F.1.4.2 & F.1.4.4.2: Encoding of AC coefficients */
764
765
61.2M
    tbl = compptr->ac_tbl_no;
766
767
    /* Establish EOB (end-of-block) index */
768
3.59G
    for (ke = DCTSIZE2 - 1; ke > 0; ke--)
769
3.53G
      if ((*block)[jpeg_natural_order[ke]]) break;
770
771
    /* Figure F.5: Encode_AC_Coefficients */
772
215M
    for (k = 1; k <= ke; k++) {
773
154M
      st = entropy->ac_stats[tbl] + 3 * (k - 1);
774
154M
      arith_encode(cinfo, st, 0);       /* EOB decision */
775
326M
      while ((v = (*block)[jpeg_natural_order[k]]) == 0) {
776
171M
        arith_encode(cinfo, st + 1, 0);  st += 3;  k++;
777
171M
      }
778
154M
      arith_encode(cinfo, st + 1, 1);
779
      /* Figure F.6: Encoding nonzero value v */
780
      /* Figure F.7: Encoding the sign of v */
781
154M
      if (v > 0) {
782
77.0M
        arith_encode(cinfo, entropy->fixed_bin, 0);
783
77.4M
      } else {
784
77.4M
        v = -v;
785
77.4M
        arith_encode(cinfo, entropy->fixed_bin, 1);
786
77.4M
      }
787
154M
      st += 2;
788
      /* Figure F.8: Encoding the magnitude category of v */
789
154M
      m = 0;
790
154M
      if (v -= 1) {
791
128M
        arith_encode(cinfo, st, 1);
792
128M
        m = 1;
793
128M
        v2 = v;
794
128M
        if (v2 >>= 1) {
795
114M
          arith_encode(cinfo, st, 1);
796
114M
          m <<= 1;
797
114M
          st = entropy->ac_stats[tbl] +
798
114M
               (k <= cinfo->arith_ac_K[tbl] ? 189 : 217);
799
406M
          while (v2 >>= 1) {
800
291M
            arith_encode(cinfo, st, 1);
801
291M
            m <<= 1;
802
291M
            st += 1;
803
291M
          }
804
114M
        }
805
128M
      }
806
154M
      arith_encode(cinfo, st, 0);
807
      /* Figure F.9: Encoding the magnitude bit pattern of v */
808
154M
      st += 14;
809
561M
      while (m >>= 1)
810
406M
        arith_encode(cinfo, st, (m & v) ? 1 : 0);
811
154M
    }
812
    /* Encode EOB decision only if k <= DCTSIZE2 - 1 */
813
61.2M
    if (k <= DCTSIZE2 - 1) {
814
59.9M
      st = entropy->ac_stats[tbl] + 3 * (k - 1);
815
59.9M
      arith_encode(cinfo, st, 1);
816
59.9M
    }
817
61.2M
  }
818
819
25.9M
  return TRUE;
820
25.9M
}
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
175k
{
830
175k
  arith_entropy_ptr entropy = (arith_entropy_ptr)cinfo->entropy;
831
175k
  int ci, tbl;
832
175k
  jpeg_component_info *compptr;
833
834
175k
  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
175k
  if (cinfo->progressive_mode) {
845
155k
    if (cinfo->Ah == 0) {
846
77.7k
      if (cinfo->Ss == 0)
847
15.5k
        entropy->pub.encode_mcu = encode_mcu_DC_first;
848
62.2k
      else
849
62.2k
        entropy->pub.encode_mcu = encode_mcu_AC_first;
850
77.7k
    } else {
851
77.7k
      if (cinfo->Ss == 0)
852
15.5k
        entropy->pub.encode_mcu = encode_mcu_DC_refine;
853
62.2k
      else
854
62.2k
        entropy->pub.encode_mcu = encode_mcu_AC_refine;
855
77.7k
    }
856
155k
  } else
857
19.6k
    entropy->pub.encode_mcu = encode_mcu;
858
859
  /* Allocate & initialize requested statistics areas */
860
445k
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
861
270k
    compptr = cinfo->cur_comp_info[ci];
862
    /* DC needs no table for refinement scan */
863
270k
    if (cinfo->progressive_mode == 0 || (cinfo->Ss == 0 && cinfo->Ah == 0)) {
864
98.8k
      tbl = compptr->dc_tbl_no;
865
98.8k
      if (tbl < 0 || tbl >= NUM_ARITH_TBLS)
866
0
        ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl);
867
98.8k
      if (entropy->dc_stats[tbl] == NULL)
868
66.7k
        entropy->dc_stats[tbl] = (unsigned char *)(*cinfo->mem->alloc_small)
869
66.7k
          ((j_common_ptr)cinfo, JPOOL_IMAGE, DC_STAT_BINS);
870
98.8k
      memset(entropy->dc_stats[tbl], 0, DC_STAT_BINS);
871
      /* Initialize DC predictions to 0 */
872
98.8k
      entropy->last_dc_val[ci] = 0;
873
98.8k
      entropy->dc_context[ci] = 0;
874
98.8k
    }
875
    /* AC needs no table when not present */
876
270k
    if (cinfo->progressive_mode == 0 || cinfo->Se) {
877
176k
      tbl = compptr->ac_tbl_no;
878
176k
      if (tbl < 0 || tbl >= NUM_ARITH_TBLS)
879
0
        ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl);
880
176k
      if (entropy->ac_stats[tbl] == NULL)
881
66.7k
        entropy->ac_stats[tbl] = (unsigned char *)(*cinfo->mem->alloc_small)
882
66.7k
          ((j_common_ptr)cinfo, JPOOL_IMAGE, AC_STAT_BINS);
883
176k
      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
176k
    }
891
270k
  }
892
893
  /* Initialize arithmetic encoding variables */
894
175k
  entropy->c = 0;
895
175k
  entropy->a = 0x10000L;
896
175k
  entropy->sc = 0;
897
175k
  entropy->zc = 0;
898
175k
  entropy->ct = 11;
899
175k
  entropy->buffer = -1;  /* empty */
900
901
  /* Initialize restart stuff */
902
175k
  entropy->restarts_to_go = cinfo->restart_interval;
903
175k
  entropy->next_restart_num = 0;
904
175k
}
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
35.5k
{
914
35.5k
  arith_entropy_ptr entropy;
915
35.5k
  int i;
916
917
35.5k
  entropy = (arith_entropy_ptr)
918
35.5k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
919
35.5k
                                sizeof(arith_entropy_encoder));
920
35.5k
  cinfo->entropy = (struct jpeg_entropy_encoder *)entropy;
921
35.5k
  entropy->pub.start_pass = start_pass;
922
35.5k
  entropy->pub.finish_pass = finish_pass;
923
924
  /* Mark tables unallocated */
925
604k
  for (i = 0; i < NUM_ARITH_TBLS; i++) {
926
569k
    entropy->dc_stats[i] = NULL;
927
569k
    entropy->ac_stats[i] = NULL;
928
569k
  }
929
930
  /* Initialize index for fixed probability estimation */
931
35.5k
  entropy->fixed_bin[0] = 113;
932
35.5k
}