Coverage Report

Created: 2026-01-20 07:37

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/jasper/src/libjasper/jpc/jpc_t1cod.c
Line
Count
Source
1
/*
2
 * Copyright (c) 1999-2000 Image Power, Inc. and the University of
3
 *   British Columbia.
4
 * Copyright (c) 2001-2003 Michael David Adams.
5
 * All rights reserved.
6
 */
7
8
/* __START_OF_JASPER_LICENSE__
9
 * 
10
 * JasPer License Version 2.0
11
 * 
12
 * Copyright (c) 2001-2006 Michael David Adams
13
 * Copyright (c) 1999-2000 Image Power, Inc.
14
 * Copyright (c) 1999-2000 The University of British Columbia
15
 * 
16
 * All rights reserved.
17
 * 
18
 * Permission is hereby granted, free of charge, to any person (the
19
 * "User") obtaining a copy of this software and associated documentation
20
 * files (the "Software"), to deal in the Software without restriction,
21
 * including without limitation the rights to use, copy, modify, merge,
22
 * publish, distribute, and/or sell copies of the Software, and to permit
23
 * persons to whom the Software is furnished to do so, subject to the
24
 * following conditions:
25
 * 
26
 * 1.  The above copyright notices and this permission notice (which
27
 * includes the disclaimer below) shall be included in all copies or
28
 * substantial portions of the Software.
29
 * 
30
 * 2.  The name of a copyright holder shall not be used to endorse or
31
 * promote products derived from the Software without specific prior
32
 * written permission.
33
 * 
34
 * THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS
35
 * LICENSE.  NO USE OF THE SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER
36
 * THIS DISCLAIMER.  THE SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS
37
 * "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
38
 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
39
 * PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.  IN NO
40
 * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
41
 * INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
42
 * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
43
 * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
44
 * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.  NO ASSURANCES ARE
45
 * PROVIDED BY THE COPYRIGHT HOLDERS THAT THE SOFTWARE DOES NOT INFRINGE
46
 * THE PATENT OR OTHER INTELLECTUAL PROPERTY RIGHTS OF ANY OTHER ENTITY.
47
 * EACH COPYRIGHT HOLDER DISCLAIMS ANY LIABILITY TO THE USER FOR CLAIMS
48
 * BROUGHT BY ANY OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL
49
 * PROPERTY RIGHTS OR OTHERWISE.  AS A CONDITION TO EXERCISING THE RIGHTS
50
 * GRANTED HEREUNDER, EACH USER HEREBY ASSUMES SOLE RESPONSIBILITY TO SECURE
51
 * ANY OTHER INTELLECTUAL PROPERTY RIGHTS NEEDED, IF ANY.  THE SOFTWARE
52
 * IS NOT FAULT-TOLERANT AND IS NOT INTENDED FOR USE IN MISSION-CRITICAL
53
 * SYSTEMS, SUCH AS THOSE USED IN THE OPERATION OF NUCLEAR FACILITIES,
54
 * AIRCRAFT NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL
55
 * SYSTEMS, DIRECT LIFE SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH
56
 * THE FAILURE OF THE SOFTWARE OR SYSTEM COULD LEAD DIRECTLY TO DEATH,
57
 * PERSONAL INJURY, OR SEVERE PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH
58
 * RISK ACTIVITIES").  THE COPYRIGHT HOLDERS SPECIFICALLY DISCLAIM ANY
59
 * EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR HIGH RISK ACTIVITIES.
60
 * 
61
 * __END_OF_JASPER_LICENSE__
62
 */
63
64
/*
65
 * $Id$
66
 */
67
68
/******************************************************************************\
69
* Includes.
70
\******************************************************************************/
71
72
#include "jpc_t1cod.h"
73
#include "jpc_cod.h"
74
#include "jpc_cs.h"
75
#include "jpc_mqcod.h"
76
#include "jpc_tsfb.h"
77
78
#include "jasper/jas_math.h"
79
80
#include <stdlib.h>
81
#include <assert.h>
82
#include <math.h>
83
84
JAS_ATTRIBUTE_CONST
85
static double jpc_pow2i(int n);
86
87
/******************************************************************************\
88
* Global data.
89
\******************************************************************************/
90
91
uint_least8_t jpc_zcctxnolut[4 * 256];
92
bool jpc_spblut[256];
93
uint_least8_t jpc_scctxnolut[256];
94
uint_least8_t jpc_magctxnolut[4096];
95
96
jpc_fix_t jpc_signmsedec[1 << JPC_NMSEDEC_BITS];
97
jpc_fix_t jpc_refnmsedec[1 << JPC_NMSEDEC_BITS];
98
jpc_fix_t jpc_signmsedec0[1 << JPC_NMSEDEC_BITS];
99
jpc_fix_t jpc_refnmsedec0[1 << JPC_NMSEDEC_BITS];
100
101
jpc_mqctx_t jpc_mqctxs[JPC_NUMCTXS];
102
103
/******************************************************************************\
104
*
105
\******************************************************************************/
106
107
JAS_ATTRIBUTE_CONST
108
static uint_least8_t jpc_getzcctxno(unsigned f, enum jpc_tsfb_orient orient);
109
110
JAS_ATTRIBUTE_CONST
111
static bool jpc_getspb(unsigned f);
112
113
JAS_ATTRIBUTE_CONST
114
static uint_least8_t jpc_getscctxno(unsigned f);
115
116
JAS_ATTRIBUTE_CONST
117
static uint_least8_t jpc_getmagctxno(unsigned f);
118
119
/******************************************************************************\
120
* Code.
121
\******************************************************************************/
122
123
enum jpc_passtype JPC_PASSTYPE(unsigned passno)
124
4.36M
{
125
4.36M
  unsigned passtype;
126
4.36M
  switch (passno % 3) {
127
1.65M
  case 0:
128
1.65M
    passtype = JPC_CLNPASS;
129
1.65M
    break;
130
1.43M
  case 1:
131
1.43M
    passtype = JPC_SIGPASS;
132
1.43M
    break;
133
1.27M
  case 2:
134
1.27M
    passtype = JPC_REFPASS;
135
1.27M
    break;
136
0
  default:
137
0
    assert(0);
138
0
    JAS_UNREACHABLE();
139
4.36M
  }
140
4.36M
  return passtype;
141
4.36M
}
142
143
unsigned JPC_NOMINALGAIN(unsigned qmfbid, unsigned numlvls, unsigned lvlno, enum jpc_tsfb_orient orient)
144
339k
{
145
339k
  JAS_UNUSED(numlvls);
146
147
339k
  if (qmfbid == JPC_COX_INS) {
148
170k
    return 0;
149
170k
  }
150
339k
  assert(qmfbid == JPC_COX_RFT);
151
168k
  if (lvlno == 0) {
152
11.3k
    assert(orient == JPC_TSFB_LL);
153
11.3k
    return 0;
154
157k
  } else {
155
157k
    switch (orient) {
156
52.4k
    case JPC_TSFB_LH:
157
104k
    case JPC_TSFB_HL:
158
104k
      return 1;
159
52.4k
    case JPC_TSFB_HH:
160
52.4k
      return 2;
161
0
    default:
162
0
      assert(false);
163
0
      JAS_UNREACHABLE();
164
157k
    }
165
157k
  }
166
0
  JAS_UNREACHABLE();
167
0
}
168
169
/******************************************************************************\
170
* Coding pass related functions.
171
\******************************************************************************/
172
173
enum jpc_segtype JPC_SEGTYPE(unsigned passno, unsigned firstpassno, bool bypass)
174
3.40M
{
175
3.40M
  if (bypass) {
176
367k
    enum jpc_passtype passtype = JPC_PASSTYPE(passno);
177
367k
    if (passtype == JPC_CLNPASS) {
178
196k
      return JPC_SEG_MQ;
179
196k
    }
180
170k
    return ((passno < firstpassno + 10) ? JPC_SEG_MQ : JPC_SEG_RAW);
181
3.03M
  } else {
182
3.03M
    return JPC_SEG_MQ;
183
3.03M
  }
184
3.40M
}
185
186
unsigned JPC_SEGPASSCNT(unsigned passno, unsigned firstpassno, unsigned numpasses, bool bypass, bool termall)
187
3.55M
{
188
3.55M
  unsigned ret;
189
190
3.55M
  if (termall) {
191
175k
    ret = 1;
192
3.37M
  } else if (bypass) {
193
281k
    if (passno < firstpassno + 10) {
194
87.2k
      ret = 10 - (passno - firstpassno);
195
194k
    } else {
196
194k
      enum jpc_passtype passtype = JPC_PASSTYPE(passno);
197
194k
      switch (passtype) {
198
85.3k
      case JPC_SIGPASS:
199
85.3k
        ret = 2;
200
85.3k
        break;
201
34.7k
      case JPC_REFPASS:
202
34.7k
        ret = 1;
203
34.7k
        break;
204
74.4k
      case JPC_CLNPASS:
205
74.4k
        ret = 1;
206
74.4k
        break;
207
0
      default:
208
0
        assert(0);
209
0
        JAS_UNREACHABLE();
210
194k
      }
211
194k
    }
212
3.09M
  } else {
213
3.09M
    ret = JPC_PREC * 3 - 2;
214
3.09M
  }
215
3.55M
  ret = JAS_MIN(ret, numpasses - passno);
216
3.55M
  return ret;
217
3.55M
}
218
219
bool JPC_ISTERMINATED(unsigned passno, unsigned firstpassno, unsigned numpasses, bool termall,
220
  bool lazy)
221
2.95M
{
222
2.95M
  if (passno - firstpassno == numpasses - 1) {
223
111k
    return true;
224
2.84M
  } else {
225
2.84M
    unsigned n = JPC_SEGPASSCNT(passno, firstpassno, numpasses, lazy, termall);
226
2.84M
    return n <= 1;
227
2.84M
  }
228
2.95M
}
229
230
/******************************************************************************\
231
* Lookup table code.
232
\******************************************************************************/
233
234
void jpc_initluts()
235
9
{
236
9
  float u;
237
9
  float v;
238
9
  float t;
239
240
45
  for (unsigned orient = 0; orient < 4; ++orient) {
241
9.25k
    for (unsigned i = 0; i < 256; ++i) {
242
9.21k
      jpc_zcctxnolut[(orient << 8) | i] = jpc_getzcctxno(i, orient);
243
9.21k
    }
244
36
  }
245
246
2.31k
  for (unsigned i = 0; i < 256; ++i) {
247
2.30k
    jpc_spblut[i] = jpc_getspb(i << 4);
248
2.30k
  }
249
250
2.31k
  for (unsigned i = 0; i < 256; ++i) {
251
2.30k
    jpc_scctxnolut[i] = jpc_getscctxno(i << 4);
252
2.30k
  }
253
254
27
  for (unsigned refine = 0; refine < 2; ++refine) {
255
36.8k
    for (unsigned i = 0; i < 2048; ++i) {
256
36.8k
      jpc_magctxnolut[(refine << 11) + i] = jpc_getmagctxno((refine ? JPC_REFINE : 0) | i);
257
36.8k
    }
258
18
  }
259
260
1.16k
  for (unsigned i = 0; i < (1 << JPC_NMSEDEC_BITS); ++i) {
261
1.15k
    t = i * jpc_pow2i(-JPC_NMSEDEC_FRACBITS);
262
1.15k
    u = t;
263
1.15k
    v = t - 1.5f;
264
1.15k
    jpc_signmsedec[i] = jpc_dbltofix(floor((u * u - v * v) *
265
1.15k
      jpc_pow2i(JPC_NMSEDEC_FRACBITS) + 0.5) /
266
1.15k
      jpc_pow2i(JPC_NMSEDEC_FRACBITS));
267
/* XXX - this calc is not correct */
268
1.15k
    jpc_signmsedec0[i] = jpc_dbltofix(floor((u * u) *
269
1.15k
      jpc_pow2i(JPC_NMSEDEC_FRACBITS) + 0.5) /
270
1.15k
      jpc_pow2i(JPC_NMSEDEC_FRACBITS));
271
1.15k
    u = t - 1.0f;
272
1.15k
    if (i & (1 << (JPC_NMSEDEC_BITS - 1))) {
273
576
      v = t - 1.5f;
274
576
    } else {
275
576
      v = t - 0.5f;
276
576
    }
277
1.15k
    jpc_refnmsedec[i] = jpc_dbltofix(floor((u * u - v * v) *
278
1.15k
      jpc_pow2i(JPC_NMSEDEC_FRACBITS) + 0.5) /
279
1.15k
      jpc_pow2i(JPC_NMSEDEC_FRACBITS));
280
/* XXX - this calc is not correct */
281
1.15k
    jpc_refnmsedec0[i] = jpc_dbltofix(floor((u * u) *
282
1.15k
      jpc_pow2i(JPC_NMSEDEC_FRACBITS) + 0.5) /
283
1.15k
      jpc_pow2i(JPC_NMSEDEC_FRACBITS));
284
1.15k
  }
285
9
}
286
287
static uint_least8_t jpc_getzcctxno(unsigned f, enum jpc_tsfb_orient orient)
288
9.21k
{
289
9.21k
  assert(orient < 4);
290
291
9.21k
  unsigned n;
292
9.21k
  unsigned t;
293
9.21k
  unsigned hv;
294
295
9.21k
  unsigned h = ((f & JPC_WSIG) != 0) + ((f & JPC_ESIG) != 0);
296
9.21k
  unsigned v = ((f & JPC_NSIG) != 0) + ((f & JPC_SSIG) != 0);
297
9.21k
  const unsigned d = ((f & JPC_NWSIG) != 0) + ((f & JPC_NESIG) != 0) + ((f & JPC_SESIG) != 0) + ((f & JPC_SWSIG) != 0);
298
9.21k
  switch (orient) {
299
2.30k
  case JPC_TSFB_HL:
300
2.30k
    t = h;
301
2.30k
    h = v;
302
2.30k
    v = t;
303
    /* fall through */
304
4.60k
  case JPC_TSFB_LL:
305
6.91k
  case JPC_TSFB_LH:
306
6.91k
    if (!h) {
307
1.72k
      if (!v) {
308
432
        if (!d) {
309
27
          n = 0;
310
405
        } else if (d == 1) {
311
108
          n = 1;
312
297
        } else {
313
297
          n = 2;
314
297
        }
315
1.29k
      } else if (v == 1) {
316
864
        n = 3;
317
864
      } else {
318
432
        n = 4;
319
432
      }
320
5.18k
    } else if (h == 1) {
321
3.45k
      if (!v) {
322
864
        if (!d) {
323
54
          n = 5;
324
810
        } else {
325
810
          n = 6;
326
810
        }
327
2.59k
      } else {
328
2.59k
        n = 7;
329
2.59k
      }
330
3.45k
    } else {
331
1.72k
      n = 8;
332
1.72k
    }
333
6.91k
    break;
334
2.30k
  case JPC_TSFB_HH:
335
2.30k
    hv = h + v;
336
2.30k
    if (!d) {
337
144
      if (!hv) {
338
9
        n = 0;
339
135
      } else if (hv == 1) {
340
36
        n = 1;
341
99
      } else {
342
99
        n = 2;
343
99
      }
344
2.16k
    } else if (d == 1) {
345
576
      if (!hv) {
346
36
        n = 3;
347
540
      } else if (hv == 1) {
348
144
        n = 4;
349
396
      } else {
350
396
        n = 5;
351
396
      }
352
1.58k
    } else if (d == 2) {
353
864
      if (!hv) {
354
54
        n = 6;
355
810
      } else {
356
810
        n = 7;
357
810
      }
358
864
    } else {
359
720
      n = 8;
360
720
    }
361
2.30k
    break;
362
363
0
  default:
364
0
    assert(false);
365
0
    JAS_UNREACHABLE();
366
9.21k
  }
367
9.21k
  assert(n < JPC_NUMZCCTXS);
368
9.21k
  return JPC_ZCCTXNO + n;
369
9.21k
}
370
371
static bool jpc_getspb(unsigned f)
372
2.30k
{
373
2.30k
  int hc;
374
2.30k
  int vc;
375
2.30k
  bool n;
376
377
2.30k
  hc = JAS_MIN(((f & (JPC_ESIG | JPC_ESGN)) == JPC_ESIG) + ((f & (JPC_WSIG | JPC_WSGN)) == JPC_WSIG), 1) -
378
2.30k
    JAS_MIN(((f & (JPC_ESIG | JPC_ESGN)) == (JPC_ESIG | JPC_ESGN)) + ((f & (JPC_WSIG | JPC_WSGN)) == (JPC_WSIG | JPC_WSGN)), 1);
379
2.30k
  vc = JAS_MIN(((f & (JPC_NSIG | JPC_NSGN)) == JPC_NSIG) + ((f & (JPC_SSIG | JPC_SSGN)) == JPC_SSIG), 1) -
380
2.30k
    JAS_MIN(((f & (JPC_NSIG | JPC_NSGN)) == (JPC_NSIG | JPC_NSGN)) + ((f & (JPC_SSIG | JPC_SSGN)) == (JPC_SSIG | JPC_SSGN)), 1);
381
2.30k
  if (!hc && !vc) {
382
324
    n = 0;
383
1.98k
  } else {
384
1.98k
    n = (!(hc > 0 || (!hc && vc > 0)));
385
1.98k
  }
386
2.30k
  return n;
387
2.30k
}
388
389
static uint_least8_t jpc_getscctxno(unsigned f)
390
2.30k
{
391
2.30k
  int hc;
392
2.30k
  int vc;
393
394
2.30k
  hc = JAS_MIN(((f & (JPC_ESIG | JPC_ESGN)) == JPC_ESIG) + ((f & (JPC_WSIG | JPC_WSGN)) == JPC_WSIG),
395
2.30k
    1) - JAS_MIN(((f & (JPC_ESIG | JPC_ESGN)) == (JPC_ESIG | JPC_ESGN)) +
396
2.30k
    ((f & (JPC_WSIG | JPC_WSGN)) == (JPC_WSIG | JPC_WSGN)), 1);
397
2.30k
  vc = JAS_MIN(((f & (JPC_NSIG | JPC_NSGN)) == JPC_NSIG) + ((f & (JPC_SSIG | JPC_SSGN)) == JPC_SSIG),
398
2.30k
    1) - JAS_MIN(((f & (JPC_NSIG | JPC_NSGN)) == (JPC_NSIG | JPC_NSGN)) +
399
2.30k
    ((f & (JPC_SSIG | JPC_SSGN)) == (JPC_SSIG | JPC_SSGN)), 1);
400
2.30k
  assert(hc >= -1 && hc <= 1 && vc >= -1 && vc <= 1);
401
2.30k
  if (hc < 0) {
402
720
    hc = -hc;
403
720
    vc = -vc;
404
720
  }
405
406
2.30k
  unsigned n;
407
2.30k
  if (!hc) {
408
864
    if (vc == -1) {
409
270
      n = 1;
410
594
    } else if (!vc) {
411
324
      n = 0;
412
324
    } else {
413
270
      n = 1;
414
270
    }
415
1.44k
  } else {
416
1.44k
    assert(hc == 1);
417
418
1.44k
    if (vc == -1) {
419
450
      n = 2;
420
990
    } else if (!vc) {
421
540
      n = 3;
422
540
    } else {
423
450
      n = 4;
424
450
    }
425
1.44k
  }
426
2.30k
  assert(n < JPC_NUMSCCTXS);
427
2.30k
  return JPC_SCCTXNO + n;
428
2.30k
}
429
430
static uint_least8_t jpc_getmagctxno(unsigned f)
431
36.8k
{
432
36.8k
  unsigned n;
433
434
36.8k
  if (!(f & JPC_REFINE)) {
435
18.4k
    n = (f & (JPC_OTHSIGMSK)) ? 1 : 0;
436
18.4k
  } else {
437
18.4k
    n = 2;
438
18.4k
  }
439
440
36.8k
  assert(n < JPC_NUMMAGCTXS);
441
36.8k
  return JPC_MAGCTXNO + n;
442
36.8k
}
443
444
static void jpc_initctxs(jpc_mqctx_t *ctxs)
445
9
{
446
9
  jpc_mqctx_t *ctx;
447
448
9
  ctx = ctxs;
449
180
  for (unsigned i = 0; i < JPC_NUMCTXS; ++i) {
450
171
    ctx->mps = 0;
451
171
    switch (i) {
452
9
    case JPC_UCTXNO:
453
9
      ctx->ind = 46;
454
9
      break;
455
9
    case JPC_ZCCTXNO:
456
9
      ctx->ind = 4;
457
9
      break;
458
9
    case JPC_AGGCTXNO:
459
9
      ctx->ind = 3;
460
9
      break;
461
144
    default:
462
144
      ctx->ind = 0;
463
144
      break;
464
171
    }
465
171
    ++ctx;
466
171
  }
467
9
}
468
469
void jpc_initmqctxs()
470
9
{
471
9
  jpc_initctxs(jpc_mqctxs);
472
9
}
473
474
/* Calculate the real quantity exp2(n), where x is an integer. */
475
static double jpc_pow2i(int n)
476
2.30k
{
477
2.30k
  double x;
478
2.30k
  double a;
479
480
2.30k
  x = 1.0;
481
2.30k
  if (n < 0) {
482
1.15k
    a = 0.5;
483
1.15k
    n = -n;
484
1.15k
  } else {
485
1.15k
    a = 2.0;
486
1.15k
  }
487
16.1k
  while (--n >= 0) {
488
13.8k
    x *= a;
489
13.8k
  }
490
2.30k
  return x;
491
2.30k
}