Coverage Report

Created: 2026-09-14 07:37

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/jasper/src/libjasper/jpc/jpc_t2enc.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
 * Tier 2 Encoder
66
 *
67
 * $Id$
68
 */
69
70
/******************************************************************************\
71
* Includes.
72
\******************************************************************************/
73
74
#include "jpc_t2enc.h"
75
#include "jpc_t2cod.h"
76
#include "jpc_tagtree.h"
77
#include "jpc_enc.h"
78
#include "jpc_math.h"
79
80
#include "jasper/jas_malloc.h"
81
#include "jasper/jas_math.h"
82
#include "jasper/jas_debug.h"
83
84
#include <stdio.h>
85
#include <stdlib.h>
86
#include <assert.h>
87
88
/******************************************************************************\
89
* Code.
90
\******************************************************************************/
91
92
static int jpc_putcommacode(jpc_bitstream_t *out, int n)
93
2.96M
{
94
2.96M
  assert(n >= 0);
95
96
9.74M
  while (--n >= 0) {
97
6.77M
    if (jpc_bitstream_putbit(out, 1) == EOF) {
98
0
      return -1;
99
0
    }
100
6.77M
  }
101
2.96M
  if (jpc_bitstream_putbit(out, 0) == EOF) {
102
0
    return -1;
103
0
  }
104
2.96M
  return 0;
105
2.96M
}
106
107
static int jpc_putnumnewpasses(jpc_bitstream_t *out, int n)
108
2.96M
{
109
2.96M
  int ret;
110
111
2.96M
  if (n <= 0) {
112
0
    return -1;
113
2.96M
  } else if (n == 1) {
114
318k
    ret = jpc_bitstream_putbit(out, 0);
115
2.64M
  } else if (n == 2) {
116
113k
    ret = jpc_bitstream_putbits(out, 2, 2);
117
2.53M
  } else if (n <= 5) {
118
761k
    ret = jpc_bitstream_putbits(out, 4, 0xc | (n - 3));
119
1.77M
  } else if (n <= 36) {
120
1.67M
    ret = jpc_bitstream_putbits(out, 9, 0x1e0 | (n - 6));
121
1.67M
  } else if (n <= 164) {
122
95.9k
    ret = jpc_bitstream_putbits(out, 16, 0xff80 | (n - 37));
123
95.9k
  } else {
124
    /* The standard has no provision for encoding a larger value.
125
    In practice, however, it is highly unlikely that this
126
    limitation will ever be encountered. */
127
0
    return -1;
128
0
  }
129
130
2.96M
  return (ret != EOF) ? 0 : (-1);
131
2.96M
}
132
133
int jpc_enc_encpkts(jpc_enc_t *enc, jas_stream_t *out)
134
2.12k
{
135
2.12k
  jpc_enc_tile_t *tile;
136
2.12k
  jpc_pi_t *pi;
137
138
2.12k
  tile = enc->curtile;
139
140
2.12k
  jpc_init_t2state(enc, false);
141
2.12k
  pi = tile->pi;
142
2.12k
  jpc_pi_init(pi);
143
144
2.12k
  if (!jpc_pi_next(pi)) {
145
17.5k
    for (;;) {
146
17.5k
      if (jpc_enc_encpkt(enc, out, jpc_pi_cmptno(pi), jpc_pi_rlvlno(pi),
147
17.5k
        jpc_pi_prcno(pi), jpc_pi_lyrno(pi))) {
148
0
        return -1;
149
0
      }
150
17.5k
      if (jpc_pi_next(pi)) {
151
2.12k
        break;
152
2.12k
      }
153
17.5k
    }
154
2.12k
  }
155
  
156
2.12k
  return 0;
157
2.12k
}
158
159
int jpc_enc_encpkt(jpc_enc_t *enc, jas_stream_t *out, unsigned compno, unsigned lvlno, unsigned prcno, unsigned lyrno)
160
505k
{
161
505k
  jpc_enc_tcmpt_t *comp;
162
505k
  jpc_enc_rlvl_t *lvl;
163
505k
  jpc_enc_band_t *band;
164
505k
  jpc_enc_band_t *endbands;
165
505k
  jpc_enc_cblk_t *cblk;
166
505k
  jpc_enc_cblk_t *endcblks;
167
505k
  jpc_bitstream_t *outb;
168
505k
  jpc_enc_pass_t *pass;
169
505k
  jpc_enc_pass_t *startpass;
170
505k
  jpc_enc_pass_t *lastpass;
171
505k
  jpc_enc_pass_t *endpass;
172
505k
  jpc_enc_pass_t *endpasses;
173
505k
  int i;
174
505k
  int ret;
175
505k
  jpc_tagtreenode_t *leaf;
176
505k
  int t1;
177
505k
  int t2;
178
505k
  jpc_enc_tile_t *tile;
179
505k
  jpc_enc_prc_t *prc;
180
505k
  jpc_enc_cp_t *cp;
181
505k
  jpc_ms_t *ms;
182
183
505k
  JAS_LOGDEBUGF(10, "encoding packet begin %d %d %d %d\n", compno, lvlno,
184
505k
    prcno, lyrno);
185
186
505k
  tile = enc->curtile;
187
505k
  cp = enc->cp;
188
189
505k
  if (cp->tcp.csty & JPC_COD_SOP) {
190
0
    if (!(ms = jpc_ms_create(JPC_MS_SOP))) {
191
0
      return -1;
192
0
    }
193
0
    ms->parms.sop.seqno = jpc_pi_getind(tile->pi);
194
0
    if (jpc_putms(out, enc->cstate, ms)) {
195
0
      return -1;
196
0
    }
197
0
    jpc_ms_destroy(ms);
198
0
  }
199
200
505k
  if (!(outb = jpc_bitstream_sopen(out, "w+"))) {
201
0
    return -1;
202
0
  }
203
204
505k
  if (jpc_bitstream_putbit(outb, 1) == EOF) {
205
0
    goto error_close;
206
0
  }
207
505k
  JAS_LOGDEBUGF(10, "present.\n");
208
209
505k
  comp = &tile->tcmpts[compno];
210
505k
  lvl = &comp->rlvls[lvlno];
211
505k
  endbands = &lvl->bands[lvl->numbands];
212
1.85M
  for (band = lvl->bands; band != endbands; ++band) {
213
1.34M
    if (!band->data) {
214
29.3k
      continue;
215
29.3k
    }
216
1.31M
    prc = &band->prcs[prcno];
217
1.31M
    if (!prc->cblks) {
218
0
      continue;
219
0
    }
220
221
1.31M
    endcblks = &prc->cblks[prc->numcblks];
222
19.7M
    for (cblk = prc->cblks; cblk != endcblks; ++cblk) {
223
18.4M
      if (!lyrno) {
224
18.4M
        leaf = jpc_tagtree_getleaf(prc->nlibtree, cblk - prc->cblks);
225
18.4M
        jpc_tagtree_setvalue(prc->nlibtree, leaf, cblk->numimsbs);
226
18.4M
      }
227
18.4M
      pass = cblk->curpass;
228
18.4M
      const bool included = (pass && pass->lyrno == lyrno);
229
18.4M
      if (included && (!cblk->numencpasses)) {
230
2.96M
        assert(pass->lyrno == lyrno);
231
2.96M
        leaf = jpc_tagtree_getleaf(prc->incltree,
232
2.96M
          cblk - prc->cblks);
233
2.96M
        jpc_tagtree_setvalue(prc->incltree, leaf, pass->lyrno);
234
2.96M
      }
235
18.4M
    }
236
237
1.31M
    endcblks = &prc->cblks[prc->numcblks];
238
19.7M
    for (cblk = prc->cblks; cblk != endcblks; ++cblk) {
239
18.4M
      pass = cblk->curpass;
240
18.4M
      const bool included = (pass && pass->lyrno == lyrno);
241
18.4M
      if (!cblk->numencpasses) {
242
18.4M
        leaf = jpc_tagtree_getleaf(prc->incltree,
243
18.4M
          cblk - prc->cblks);
244
18.4M
        if (jpc_tagtree_encode(prc->incltree, leaf, lyrno + 1, outb) <
245
18.4M
          0) {
246
0
          goto error_close;
247
0
        }
248
18.4M
      } else {
249
0
        if (jpc_bitstream_putbit(outb, included) == EOF) {
250
0
          goto error_close;
251
0
        }
252
0
      }
253
18.4M
      JAS_LOGDEBUGF(10, "included=%d ", included);
254
18.4M
      if (!included) {
255
15.4M
        continue;
256
15.4M
      }
257
2.96M
      if (!cblk->numencpasses) {
258
2.96M
        i = 1;
259
2.96M
        leaf = jpc_tagtree_getleaf(prc->nlibtree, cblk - prc->cblks);
260
12.3M
        for (;;) {
261
12.3M
          if ((ret = jpc_tagtree_encode(prc->nlibtree, leaf, i,
262
12.3M
            outb)) < 0) {
263
0
            goto error_close;
264
0
          }
265
12.3M
          if (ret) {
266
2.96M
            break;
267
2.96M
          }
268
9.41M
          ++i;
269
9.41M
        }
270
2.96M
        assert(leaf->known_ && i == leaf->value_ + 1);
271
2.96M
      }
272
273
2.96M
      endpasses = &cblk->passes[cblk->numpasses];
274
2.96M
      startpass = pass;
275
2.96M
      endpass = startpass;
276
33.5M
      while (endpass != endpasses && endpass->lyrno == lyrno){
277
30.6M
        ++endpass;
278
30.6M
      }
279
2.96M
      const unsigned numnewpasses = endpass - startpass;
280
2.96M
      if (jpc_putnumnewpasses(outb, numnewpasses)) {
281
0
        goto error_close;
282
0
      }
283
2.96M
      JAS_LOGDEBUGF(10, "numnewpasses=%d ", numnewpasses);
284
285
2.96M
      lastpass = endpass - 1;
286
2.96M
      unsigned n = startpass->start;
287
2.96M
      unsigned passcount = 1;
288
2.96M
      unsigned maxadjust = 0;
289
33.5M
      for (pass = startpass; pass != endpass; ++pass) {
290
30.6M
        if (pass->term || pass == lastpass) {
291
2.96M
          unsigned datalen = pass->end - n;
292
2.96M
          t1 = jpc_int_firstone(datalen) + 1;
293
2.96M
          t2 = cblk->numlenbits + jpc_floorlog2(passcount);
294
2.96M
          const unsigned adjust = JAS_MAX(t1 - t2, 0);
295
2.96M
          maxadjust = JAS_MAX(adjust, maxadjust);
296
2.96M
          n += datalen;
297
2.96M
          passcount = 1;
298
27.6M
        } else {
299
27.6M
          ++passcount;
300
27.6M
        }
301
30.6M
      }
302
2.96M
      if (jpc_putcommacode(outb, maxadjust)) {
303
0
        goto error_close;
304
0
      }
305
2.96M
      cblk->numlenbits += maxadjust;
306
307
2.96M
      lastpass = endpass - 1;
308
2.96M
      n = startpass->start;
309
2.96M
      passcount = 1;
310
33.5M
      for (pass = startpass; pass != endpass; ++pass) {
311
30.6M
        if (pass->term || pass == lastpass) {
312
2.96M
          unsigned datalen = pass->end - n;
313
2.96M
          assert(jpc_int_firstone(datalen) < cblk->numlenbits +
314
2.96M
            (int)jpc_floorlog2(passcount));
315
2.96M
          if (jpc_bitstream_putbits(outb, cblk->numlenbits +
316
2.96M
            jpc_floorlog2(passcount), datalen) == EOF) {
317
0
            goto error_close;
318
0
          }
319
2.96M
          n += datalen;
320
2.96M
          passcount = 1;
321
27.6M
        } else {
322
27.6M
          ++passcount;
323
27.6M
        }
324
30.6M
      }
325
2.96M
    }
326
1.31M
  }
327
328
505k
  jpc_bitstream_outalign(outb, 0);
329
505k
  jpc_bitstream_close(outb);
330
331
505k
  if (cp->tcp.csty & JPC_COD_EPH) {
332
0
    if (!(ms = jpc_ms_create(JPC_MS_EPH))) {
333
0
      return -1;
334
0
    }
335
0
    if (jpc_putms(out, enc->cstate, ms)) {
336
0
      return -1;
337
0
    }
338
0
    jpc_ms_destroy(ms);
339
0
  }
340
341
505k
  comp = &tile->tcmpts[compno];
342
505k
  lvl = &comp->rlvls[lvlno];
343
505k
  endbands = &lvl->bands[lvl->numbands];
344
1.85M
  for (band = lvl->bands; band != endbands; ++band) {
345
1.34M
    if (!band->data) {
346
29.3k
      continue;
347
29.3k
    }
348
1.31M
    prc = &band->prcs[prcno];
349
1.31M
    if (!prc->cblks) {
350
0
      continue;
351
0
    }
352
1.31M
    endcblks = &prc->cblks[prc->numcblks];
353
19.7M
    for (cblk = prc->cblks; cblk != endcblks; ++cblk) {
354
18.4M
      pass = cblk->curpass;
355
356
18.4M
      if (!pass) {
357
13.2M
        continue;
358
13.2M
      }
359
5.20M
      if (pass->lyrno != lyrno) {
360
2.23M
        assert(pass->lyrno > lyrno);
361
2.23M
        continue;
362
2.23M
      }
363
364
2.96M
      endpasses = &cblk->passes[cblk->numpasses];
365
2.96M
      startpass = pass;
366
2.96M
      endpass = startpass;
367
33.5M
      while (endpass != endpasses && endpass->lyrno == lyrno){
368
30.6M
        ++endpass;
369
30.6M
      }
370
2.96M
      lastpass = endpass - 1;
371
2.96M
      const unsigned numnewpasses = endpass - startpass;
372
373
2.96M
      jas_stream_seek(cblk->stream, startpass->start, SEEK_SET);
374
2.96M
      assert(jas_stream_tell(cblk->stream) == startpass->start);
375
2.96M
      if (jas_stream_copy(out, cblk->stream, lastpass->end -
376
2.96M
        startpass->start)) {
377
0
        return -1;
378
0
      }
379
2.96M
      cblk->curpass = (endpass != endpasses) ? endpass : 0;
380
2.96M
      cblk->numencpasses += numnewpasses;
381
382
2.96M
    }
383
1.31M
  }
384
385
505k
  JAS_LOGDEBUGF(10, "encoding packet end\n");
386
387
505k
  return 0;
388
389
0
error_close:
390
0
  jpc_bitstream_close(outb);
391
0
  return -1;
392
505k
}
393
394
void jpc_save_t2state(jpc_enc_t *enc)
395
56.6k
{
396
/* stream pos in embedded T1 stream may be wrong since not saved/restored! */
397
398
56.6k
  jpc_enc_tcmpt_t *comp;
399
56.6k
  jpc_enc_tcmpt_t *endcomps;
400
56.6k
  jpc_enc_rlvl_t *lvl;
401
56.6k
  jpc_enc_rlvl_t *endlvls;
402
56.6k
  jpc_enc_band_t *band;
403
56.6k
  jpc_enc_band_t *endbands;
404
56.6k
  jpc_enc_cblk_t *cblk;
405
56.6k
  jpc_enc_cblk_t *endcblks;
406
56.6k
  jpc_enc_tile_t *tile;
407
56.6k
  unsigned prcno;
408
56.6k
  jpc_enc_prc_t *prc;
409
410
56.6k
  tile = enc->curtile;
411
412
56.6k
  endcomps = &tile->tcmpts[tile->numtcmpts];
413
135k
  for (comp = tile->tcmpts; comp != endcomps; ++comp) {
414
78.3k
    endlvls = &comp->rlvls[comp->numrlvls];
415
548k
    for (lvl = comp->rlvls; lvl != endlvls; ++lvl) {
416
470k
      if (!lvl->bands) {
417
0
        continue;
418
0
      }
419
470k
      endbands = &lvl->bands[lvl->numbands];
420
1.72M
      for (band = lvl->bands; band != endbands; ++band) {
421
1.25M
        if (!band->data) {
422
23.1k
          continue;
423
23.1k
        }
424
2.46M
        for (prcno = 0, prc = band->prcs; prcno < lvl->numprcs; ++prcno, ++prc) {
425
1.23M
          if (!prc->cblks) {
426
0
            continue;
427
0
          }
428
1.23M
          jpc_tagtree_copy(prc->savincltree, prc->incltree);
429
1.23M
          jpc_tagtree_copy(prc->savnlibtree, prc->nlibtree);
430
1.23M
          endcblks = &prc->cblks[prc->numcblks];
431
18.5M
          for (cblk = prc->cblks; cblk != endcblks; ++cblk) {
432
17.3M
            cblk->savedcurpass = cblk->curpass;
433
17.3M
            cblk->savednumencpasses = cblk->numencpasses;
434
17.3M
            cblk->savednumlenbits = cblk->numlenbits;
435
17.3M
          }
436
1.23M
        }
437
1.23M
      }
438
470k
    }
439
78.3k
  }
440
441
56.6k
}
442
443
void jpc_restore_t2state(jpc_enc_t *enc)
444
56.6k
{
445
446
56.6k
  jpc_enc_tcmpt_t *comp;
447
56.6k
  jpc_enc_tcmpt_t *endcomps;
448
56.6k
  jpc_enc_rlvl_t *lvl;
449
56.6k
  jpc_enc_rlvl_t *endlvls;
450
56.6k
  jpc_enc_band_t *band;
451
56.6k
  jpc_enc_band_t *endbands;
452
56.6k
  jpc_enc_cblk_t *cblk;
453
56.6k
  jpc_enc_cblk_t *endcblks;
454
56.6k
  jpc_enc_tile_t *tile;
455
56.6k
  unsigned prcno;
456
56.6k
  jpc_enc_prc_t *prc;
457
458
56.6k
  tile = enc->curtile;
459
460
56.6k
  endcomps = &tile->tcmpts[tile->numtcmpts];
461
135k
  for (comp = tile->tcmpts; comp != endcomps; ++comp) {
462
78.3k
    endlvls = &comp->rlvls[comp->numrlvls];
463
548k
    for (lvl = comp->rlvls; lvl != endlvls; ++lvl) {
464
470k
      if (!lvl->bands) {
465
0
        continue;
466
0
      }
467
470k
      endbands = &lvl->bands[lvl->numbands];
468
1.72M
      for (band = lvl->bands; band != endbands; ++band) {
469
1.25M
        if (!band->data) {
470
23.1k
          continue;
471
23.1k
        }
472
2.46M
        for (prcno = 0, prc = band->prcs; prcno < lvl->numprcs; ++prcno, ++prc) {
473
1.23M
          if (!prc->cblks) {
474
0
            continue;
475
0
          }
476
1.23M
          jpc_tagtree_copy(prc->incltree, prc->savincltree);
477
1.23M
          jpc_tagtree_copy(prc->nlibtree, prc->savnlibtree);
478
1.23M
          endcblks = &prc->cblks[prc->numcblks];
479
18.5M
          for (cblk = prc->cblks; cblk != endcblks; ++cblk) {
480
17.3M
            cblk->curpass = cblk->savedcurpass;
481
17.3M
            cblk->numencpasses = cblk->savednumencpasses;
482
17.3M
            cblk->numlenbits = cblk->savednumlenbits;
483
17.3M
          }
484
1.23M
        }
485
1.23M
      }
486
470k
    }
487
78.3k
  }
488
56.6k
}
489
490
void jpc_init_t2state(jpc_enc_t *enc, bool raflag)
491
4.24k
{
492
/* It is assumed that band->numbps and cblk->numbps precomputed */
493
494
4.24k
  jpc_enc_tcmpt_t *comp;
495
4.24k
  jpc_enc_tcmpt_t *endcomps;
496
4.24k
  jpc_enc_rlvl_t *lvl;
497
4.24k
  jpc_enc_rlvl_t *endlvls;
498
4.24k
  jpc_enc_band_t *band;
499
4.24k
  jpc_enc_band_t *endbands;
500
4.24k
  jpc_enc_cblk_t *cblk;
501
4.24k
  jpc_enc_cblk_t *endcblks;
502
4.24k
  jpc_enc_pass_t *pass;
503
4.24k
  jpc_enc_pass_t *endpasses;
504
4.24k
  jpc_tagtreenode_t *leaf;
505
4.24k
  jpc_enc_tile_t *tile;
506
4.24k
  unsigned prcno;
507
4.24k
  jpc_enc_prc_t *prc;
508
509
4.24k
  tile = enc->curtile;
510
511
4.24k
  endcomps = &tile->tcmpts[tile->numtcmpts];
512
10.0k
  for (comp = tile->tcmpts; comp != endcomps; ++comp) {
513
5.85k
    endlvls = &comp->rlvls[comp->numrlvls];
514
40.9k
    for (lvl = comp->rlvls; lvl != endlvls; ++lvl) {
515
35.1k
      if (!lvl->bands) {
516
0
        continue;
517
0
      }
518
35.1k
      endbands = &lvl->bands[lvl->numbands];
519
128k
      for (band = lvl->bands; band != endbands; ++band) {
520
93.6k
        if (!band->data) {
521
6.19k
          continue;
522
6.19k
        }
523
174k
        for (prcno = 0, prc = band->prcs; prcno < lvl->numprcs; ++prcno, ++prc) {
524
87.4k
          if (!prc->cblks) {
525
0
            continue;
526
0
          }
527
87.4k
          jpc_tagtree_reset(prc->incltree);
528
87.4k
          jpc_tagtree_reset(prc->nlibtree);
529
87.4k
          endcblks = &prc->cblks[prc->numcblks];
530
1.20M
          for (cblk = prc->cblks; cblk != endcblks; ++cblk) {
531
1.12M
            if (jas_stream_rewind(cblk->stream)) {
532
0
              assert(0);
533
0
            }
534
1.12M
            cblk->curpass = (cblk->numpasses > 0) ? cblk->passes : 0;
535
1.12M
            cblk->numencpasses = 0;
536
1.12M
            cblk->numlenbits = 3;
537
1.12M
            cblk->numimsbs = band->numbps - cblk->numbps;
538
1.12M
            assert(cblk->numimsbs >= 0);
539
1.12M
            leaf = jpc_tagtree_getleaf(prc->nlibtree, cblk - prc->cblks);
540
1.12M
            jpc_tagtree_setvalue(prc->nlibtree, leaf, cblk->numimsbs);
541
542
1.12M
            if (raflag) {
543
560k
              endpasses = &cblk->passes[cblk->numpasses];
544
4.36M
              for (pass = cblk->passes; pass != endpasses; ++pass) {
545
3.79M
                pass->lyrno = 0;
546
3.79M
              }
547
560k
            }
548
1.12M
          }
549
87.4k
        }
550
87.4k
      }
551
35.1k
    }
552
5.85k
  }
553
554
4.24k
}
555
556
jpc_pi_t *jpc_enc_pi_create(jpc_enc_cp_t *cp, jpc_enc_tile_t *tile)
557
2.13k
{
558
2.13k
  jpc_pi_t *pi;
559
2.13k
  unsigned compno;
560
2.13k
  jpc_picomp_t *picomp;
561
2.13k
  jpc_pirlvl_t *pirlvl;
562
2.13k
  jpc_enc_tcmpt_t *tcomp;
563
2.13k
  unsigned rlvlno;
564
2.13k
  jpc_enc_rlvl_t *rlvl;
565
2.13k
  unsigned prcno;
566
2.13k
  unsigned *prclyrno;
567
568
2.13k
  if (!(pi = jpc_pi_create0())) {
569
0
    return 0;
570
0
  }
571
2.13k
  pi->pktno = -1;
572
2.13k
  pi->numcomps = cp->numcmpts;
573
2.13k
  if (!(pi->picomps = jas_alloc2(pi->numcomps, sizeof(jpc_picomp_t)))) {
574
0
    jpc_pi_destroy(pi);
575
0
    return 0;
576
0
  }
577
5.12k
  for (compno = 0, picomp = pi->picomps; compno < pi->numcomps; ++compno,
578
2.98k
    ++picomp) {
579
2.98k
    picomp->pirlvls = 0;
580
2.98k
  }
581
582
2.13k
  for (compno = 0, tcomp = tile->tcmpts, picomp = pi->picomps;
583
5.12k
    compno < pi->numcomps; ++compno, ++tcomp, ++picomp) {
584
2.98k
    picomp->numrlvls = tcomp->numrlvls;
585
2.98k
    if (!(picomp->pirlvls = jas_alloc2(picomp->numrlvls,
586
2.98k
      sizeof(jpc_pirlvl_t)))) {
587
0
      jpc_pi_destroy(pi);
588
0
      return 0;
589
0
    }
590
20.8k
    for (rlvlno = 0, pirlvl = picomp->pirlvls; rlvlno <
591
20.8k
      picomp->numrlvls; ++rlvlno, ++pirlvl) {
592
17.8k
      pirlvl->prclyrnos = 0;
593
17.8k
    }
594
2.98k
    for (rlvlno = 0, pirlvl = picomp->pirlvls, rlvl = tcomp->rlvls;
595
20.8k
      rlvlno < picomp->numrlvls; ++rlvlno, ++pirlvl, ++rlvl) {
596
/* XXX sizeof(long) should be sizeof different type */
597
17.8k
      pirlvl->numprcs = rlvl->numprcs;
598
17.8k
      if (rlvl->numprcs) {
599
17.8k
        if (!(pirlvl->prclyrnos = jas_alloc2(pirlvl->numprcs,
600
17.8k
          sizeof(long)))) {
601
0
          jpc_pi_destroy(pi);
602
0
          return 0;
603
0
        }
604
17.8k
      } else {
605
0
        pirlvl->prclyrnos = 0;
606
0
      }
607
17.8k
    }
608
2.98k
  }
609
610
2.13k
  pi->maxrlvls = 0;
611
2.13k
  for (compno = 0, tcomp = tile->tcmpts, picomp = pi->picomps;
612
5.12k
    compno < pi->numcomps; ++compno, ++tcomp, ++picomp) {
613
2.98k
    picomp->hsamp = cp->ccps[compno].sampgrdstepx;
614
2.98k
    picomp->vsamp = cp->ccps[compno].sampgrdstepy;
615
2.98k
    for (rlvlno = 0, pirlvl = picomp->pirlvls, rlvl = tcomp->rlvls;
616
20.8k
      rlvlno < picomp->numrlvls; ++rlvlno, ++pirlvl, ++rlvl) {
617
17.8k
      pirlvl->prcwidthexpn = rlvl->prcwidthexpn;
618
17.8k
      pirlvl->prcheightexpn = rlvl->prcheightexpn;
619
17.8k
      for (prcno = 0, prclyrno = pirlvl->prclyrnos;
620
35.7k
        prcno < pirlvl->numprcs; ++prcno, ++prclyrno) {
621
17.8k
        *prclyrno = 0;
622
17.8k
      }
623
17.8k
      pirlvl->numhprcs = rlvl->numhprcs;
624
17.8k
    }
625
2.98k
    if (pi->maxrlvls < tcomp->numrlvls) {
626
2.13k
      pi->maxrlvls = tcomp->numrlvls;
627
2.13k
    }
628
2.98k
  }
629
630
2.13k
  pi->numlyrs = tile->numlyrs;
631
2.13k
  pi->xstart = tile->tlx;
632
2.13k
  pi->ystart = tile->tly;
633
2.13k
  pi->xend = tile->brx;
634
2.13k
  pi->yend = tile->bry;
635
636
2.13k
  pi->picomp = 0;
637
2.13k
  pi->pirlvl = 0;
638
2.13k
  pi->x = 0;
639
2.13k
  pi->y = 0;
640
2.13k
  pi->compno = 0;
641
2.13k
  pi->rlvlno = 0;
642
2.13k
  pi->prcno = 0;
643
2.13k
  pi->lyrno = 0;
644
2.13k
  pi->xstep = 0;
645
2.13k
  pi->ystep = 0;
646
647
2.13k
  pi->pchgno = -1;
648
649
2.13k
  pi->defaultpchg.prgord = tile->prg;
650
2.13k
  pi->defaultpchg.compnostart = 0;
651
2.13k
  pi->defaultpchg.compnoend = pi->numcomps;
652
2.13k
  pi->defaultpchg.rlvlnostart = 0;
653
2.13k
  pi->defaultpchg.rlvlnoend = pi->maxrlvls;
654
2.13k
  pi->defaultpchg.lyrnoend = pi->numlyrs;
655
2.13k
  pi->pchg = 0;
656
657
2.13k
  pi->valid = 0;
658
659
2.13k
  return pi;
660
2.13k
}