]> Creatis software - gdcm.git/blob - src/gdcmjasper/src/libjasper/jpc/jpc_dec.c
ENH: No brainer activity = removing all warnings
[gdcm.git] / src / gdcmjasper / src / libjasper / jpc / jpc_dec.c
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) 1999-2000 Image Power, Inc.
13  * Copyright (c) 1999-2000 The University of British Columbia
14  * Copyright (c) 2001-2003 Michael David Adams
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: jpc_dec.c,v 1.1 2005/05/22 18:33:04 malaterre Exp $
66  */
67
68 /******************************************************************************\
69 * Includes.
70 \******************************************************************************/
71
72 #include <stdio.h>
73 #include <stdlib.h>
74 #include <assert.h>
75
76 #include "jasper/jas_types.h"
77 #include "jasper/jas_math.h"
78 #include "jasper/jas_tvp.h"
79 #include "jasper/jas_malloc.h"
80 #include "jasper/jas_debug.h"
81
82 #include "jpc_fix.h"
83 #include "jpc_dec.h"
84 #include "jpc_cs.h"
85 #include "jpc_mct.h"
86 #include "jpc_t2dec.h"
87 #include "jpc_t1dec.h"
88 #include "jpc_math.h"
89
90 /******************************************************************************\
91 *
92 \******************************************************************************/
93
94 #define  JPC_MHSOC  0x0001
95   /* In the main header, expecting a SOC marker segment. */
96 #define  JPC_MHSIZ  0x0002
97   /* In the main header, expecting a SIZ marker segment. */
98 #define  JPC_MH    0x0004
99   /* In the main header, expecting "other" marker segments. */
100 #define  JPC_TPHSOT  0x0008
101   /* In a tile-part header, expecting a SOT marker segment. */
102 #define  JPC_TPH    0x0010
103   /* In a tile-part header, expecting "other" marker segments. */
104 #define  JPC_MT    0x0020
105   /* In the main trailer. */
106
107 typedef struct {
108
109   uint_fast16_t id;
110   /* The marker segment type. */
111
112   int validstates;
113   /* The states in which this type of marker segment can be
114     validly encountered. */
115
116   int (*action)(jpc_dec_t *dec, jpc_ms_t *ms);
117   /* The action to take upon encountering this type of marker segment. */
118
119 } jpc_dec_mstabent_t;
120
121 /******************************************************************************\
122 *
123 \******************************************************************************/
124
125 /* COD/COC parameters have been specified. */
126 #define  JPC_CSET  0x0001
127 /* QCD/QCC parameters have been specified. */
128 #define  JPC_QSET  0x0002
129 /* COD/COC parameters set from a COC marker segment. */
130 #define  JPC_COC  0x0004
131 /* QCD/QCC parameters set from a QCC marker segment. */
132 #define  JPC_QCC  0x0008
133
134 /******************************************************************************\
135 * Local function prototypes.
136 \******************************************************************************/
137
138 static int jpc_dec_dump(jpc_dec_t *dec, FILE *out);
139
140 jpc_ppxstab_t *jpc_ppxstab_create(void);
141 void jpc_ppxstab_destroy(jpc_ppxstab_t *tab);
142 int jpc_ppxstab_grow(jpc_ppxstab_t *tab, int maxents);
143 int jpc_ppxstab_insert(jpc_ppxstab_t *tab, jpc_ppxstabent_t *ent);
144 jpc_streamlist_t *jpc_ppmstabtostreams(jpc_ppxstab_t *tab);
145 int jpc_pptstabwrite(jas_stream_t *out, jpc_ppxstab_t *tab);
146 jpc_ppxstabent_t *jpc_ppxstabent_create(void);
147 void jpc_ppxstabent_destroy(jpc_ppxstabent_t *ent);
148
149 int jpc_streamlist_numstreams(jpc_streamlist_t *streamlist);
150 jpc_streamlist_t *jpc_streamlist_create(void);
151 int jpc_streamlist_insert(jpc_streamlist_t *streamlist, int streamno,
152   jas_stream_t *stream);
153 jas_stream_t *jpc_streamlist_remove(jpc_streamlist_t *streamlist, int streamno);
154 void jpc_streamlist_destroy(jpc_streamlist_t *streamlist);
155 jas_stream_t *jpc_streamlist_get(jpc_streamlist_t *streamlist, int streamno);
156
157 static void jpc_dec_cp_resetflags(jpc_dec_cp_t *cp);
158 static jpc_dec_cp_t *jpc_dec_cp_create(uint_fast16_t numcomps);
159 static int jpc_dec_cp_isvalid(jpc_dec_cp_t *cp);
160 static jpc_dec_cp_t *jpc_dec_cp_copy(jpc_dec_cp_t *cp);
161 static int jpc_dec_cp_setfromcod(jpc_dec_cp_t *cp, jpc_cod_t *cod);
162 static int jpc_dec_cp_setfromcoc(jpc_dec_cp_t *cp, jpc_coc_t *coc);
163 static int jpc_dec_cp_setfromcox(jpc_dec_cp_t *cp, jpc_dec_ccp_t *ccp,
164   jpc_coxcp_t *compparms, int flags);
165 static int jpc_dec_cp_setfromqcd(jpc_dec_cp_t *cp, jpc_qcd_t *qcd);
166 static int jpc_dec_cp_setfromqcc(jpc_dec_cp_t *cp, jpc_qcc_t *qcc);
167 static int jpc_dec_cp_setfromqcx(jpc_dec_cp_t *cp, jpc_dec_ccp_t *ccp,
168   jpc_qcxcp_t *compparms, int flags);
169 static int jpc_dec_cp_setfromrgn(jpc_dec_cp_t *cp, jpc_rgn_t *rgn);
170 static int jpc_dec_cp_prepare(jpc_dec_cp_t *cp);
171 static void jpc_dec_cp_destroy(jpc_dec_cp_t *cp);
172 static int jpc_dec_cp_setfrompoc(jpc_dec_cp_t *cp, jpc_poc_t *poc, int reset);
173 static int jpc_pi_addpchgfrompoc(jpc_pi_t *pi, jpc_poc_t *poc);
174
175 static int jpc_dec_decode(jpc_dec_t *dec);
176 static jpc_dec_t *jpc_dec_create(jpc_dec_importopts_t *impopts, jas_stream_t *in);
177 static void jpc_dec_destroy(jpc_dec_t *dec);
178 static void jpc_dequantize(jas_matrix_t *x, jpc_fix_t absstepsize);
179 static void jpc_undo_roi(jas_matrix_t *x, int roishift, int bgshift, int numbps);
180 static jpc_fix_t jpc_calcabsstepsize(int stepsize, int numbits);
181 static int jpc_dec_tiledecode(jpc_dec_t *dec, jpc_dec_tile_t *tile);
182 static int jpc_dec_tileinit(jpc_dec_t *dec, jpc_dec_tile_t *tile);
183 static int jpc_dec_tilefini(jpc_dec_t *dec, jpc_dec_tile_t *tile);
184 static int jpc_dec_process_soc(jpc_dec_t *dec, jpc_ms_t *ms);
185 static int jpc_dec_process_sot(jpc_dec_t *dec, jpc_ms_t *ms);
186 static int jpc_dec_process_sod(jpc_dec_t *dec, jpc_ms_t *ms);
187 static int jpc_dec_process_eoc(jpc_dec_t *dec, jpc_ms_t *ms);
188 static int jpc_dec_process_siz(jpc_dec_t *dec, jpc_ms_t *ms);
189 static int jpc_dec_process_cod(jpc_dec_t *dec, jpc_ms_t *ms);
190 static int jpc_dec_process_coc(jpc_dec_t *dec, jpc_ms_t *ms);
191 static int jpc_dec_process_rgn(jpc_dec_t *dec, jpc_ms_t *ms);
192 static int jpc_dec_process_qcd(jpc_dec_t *dec, jpc_ms_t *ms);
193 static int jpc_dec_process_qcc(jpc_dec_t *dec, jpc_ms_t *ms);
194 static int jpc_dec_process_poc(jpc_dec_t *dec, jpc_ms_t *ms);
195 static int jpc_dec_process_ppm(jpc_dec_t *dec, jpc_ms_t *ms);
196 static int jpc_dec_process_ppt(jpc_dec_t *dec, jpc_ms_t *ms);
197 static int jpc_dec_process_com(jpc_dec_t *dec, jpc_ms_t *ms);
198 static int jpc_dec_process_unk(jpc_dec_t *dec, jpc_ms_t *ms);
199 static int jpc_dec_process_crg(jpc_dec_t *dec, jpc_ms_t *ms);
200 static int jpc_dec_parseopts(char *optstr, jpc_dec_importopts_t *opts);
201
202 static jpc_dec_mstabent_t *jpc_dec_mstab_lookup(uint_fast16_t id);
203
204 /******************************************************************************\
205 * Global data.
206 \******************************************************************************/
207
208 jpc_dec_mstabent_t jpc_dec_mstab[] = {
209   {JPC_MS_SOC, JPC_MHSOC, jpc_dec_process_soc},
210   {JPC_MS_SOT, JPC_MH | JPC_TPHSOT, jpc_dec_process_sot},
211   {JPC_MS_SOD, JPC_TPH, jpc_dec_process_sod},
212   {JPC_MS_EOC, JPC_TPHSOT, jpc_dec_process_eoc},
213   {JPC_MS_SIZ, JPC_MHSIZ, jpc_dec_process_siz},
214   {JPC_MS_COD, JPC_MH | JPC_TPH, jpc_dec_process_cod},
215   {JPC_MS_COC, JPC_MH | JPC_TPH, jpc_dec_process_coc},
216   {JPC_MS_RGN, JPC_MH | JPC_TPH, jpc_dec_process_rgn},
217   {JPC_MS_QCD, JPC_MH | JPC_TPH, jpc_dec_process_qcd},
218   {JPC_MS_QCC, JPC_MH | JPC_TPH, jpc_dec_process_qcc},
219   {JPC_MS_POC, JPC_MH | JPC_TPH, jpc_dec_process_poc},
220   {JPC_MS_TLM, JPC_MH, 0},
221   {JPC_MS_PLM, JPC_MH, 0},
222   {JPC_MS_PLT, JPC_TPH, 0},
223   {JPC_MS_PPM, JPC_MH, jpc_dec_process_ppm},
224   {JPC_MS_PPT, JPC_TPH, jpc_dec_process_ppt},
225   {JPC_MS_SOP, 0, 0},
226   {JPC_MS_CRG, JPC_MH, jpc_dec_process_crg},
227   {JPC_MS_COM, JPC_MH | JPC_TPH, jpc_dec_process_com},
228   {0, JPC_MH | JPC_TPH, jpc_dec_process_unk}
229 };
230
231 /******************************************************************************\
232 * The main entry point for the JPEG-2000 decoder.
233 \******************************************************************************/
234
235 jas_image_t *jpc_decode(jas_stream_t *in, char *optstr)
236 {
237   jpc_dec_importopts_t opts;
238   jpc_dec_t *dec;
239   jas_image_t *image;
240
241   dec = 0;
242
243   if (jpc_dec_parseopts(optstr, &opts)) {
244     goto error;
245   }
246
247   jpc_initluts();
248
249   if (!(dec = jpc_dec_create(&opts, in))) {
250     goto error;
251   }
252
253   /* Do most of the work. */
254   if (jpc_dec_decode(dec)) {
255     goto error;
256   }
257
258   if (jas_image_numcmpts(dec->image) >= 3) {
259     jas_image_setclrspc(dec->image, JAS_CLRSPC_SRGB);
260     jas_image_setcmpttype(dec->image, 0,
261       JAS_IMAGE_CT_COLOR(JAS_CLRSPC_CHANIND_RGB_R));
262     jas_image_setcmpttype(dec->image, 1,
263       JAS_IMAGE_CT_COLOR(JAS_CLRSPC_CHANIND_RGB_G));
264     jas_image_setcmpttype(dec->image, 2,
265       JAS_IMAGE_CT_COLOR(JAS_CLRSPC_CHANIND_RGB_B));
266   } else {
267     jas_image_setclrspc(dec->image, JAS_CLRSPC_SGRAY);
268     jas_image_setcmpttype(dec->image, 0,
269       JAS_IMAGE_CT_COLOR(JAS_CLRSPC_CHANIND_GRAY_Y));
270   }
271
272   /* Save the return value. */
273   image = dec->image;
274
275   /* Stop the image from being discarded. */
276   dec->image = 0;
277
278   /* Destroy decoder. */
279   jpc_dec_destroy(dec);
280
281   return image;
282
283 error:
284   if (dec) {
285     jpc_dec_destroy(dec);
286   }
287   return 0;
288 }
289
290 typedef enum {
291   OPT_MAXLYRS,
292   OPT_MAXPKTS,
293   OPT_DEBUG
294 } optid_t;
295
296 jas_taginfo_t decopts[] = {
297   {OPT_MAXLYRS, "maxlyrs"},
298   {OPT_MAXPKTS, "maxpkts"},
299   {OPT_DEBUG, "debug"},
300   {-1, 0}
301 };
302
303 static int jpc_dec_parseopts(char *optstr, jpc_dec_importopts_t *opts)
304 {
305   jas_tvparser_t *tvp;
306
307   opts->debug = 0;
308   opts->maxlyrs = JPC_MAXLYRS;
309   opts->maxpkts = -1;
310
311   if (!(tvp = jas_tvparser_create(optstr ? optstr : ""))) {
312     return -1;
313   }
314
315   while (!jas_tvparser_next(tvp)) {
316     switch (jas_taginfo_nonull(jas_taginfos_lookup(decopts,
317       jas_tvparser_gettag(tvp)))->id) {
318     case OPT_MAXLYRS:
319       opts->maxlyrs = atoi(jas_tvparser_getval(tvp));
320       break;
321     case OPT_DEBUG:
322       opts->debug = atoi(jas_tvparser_getval(tvp));
323       break;
324     case OPT_MAXPKTS:
325       opts->maxpkts = atoi(jas_tvparser_getval(tvp));
326       break;
327     default:
328       fprintf(stderr, "warning: ignoring invalid option %s\n",
329         jas_tvparser_gettag(tvp));
330       break;
331     }
332   }
333
334   jas_tvparser_destroy(tvp);
335
336   return 0;
337 }
338
339 /******************************************************************************\
340 * Code for table-driven code stream decoder.
341 \******************************************************************************/
342
343 static jpc_dec_mstabent_t *jpc_dec_mstab_lookup(uint_fast16_t id)
344 {
345   jpc_dec_mstabent_t *mstabent;
346   for (mstabent = jpc_dec_mstab; mstabent->id != 0; ++mstabent) {
347     if (mstabent->id == id) {
348       break;
349     }
350   }
351   return mstabent;
352 }
353
354 static int jpc_dec_decode(jpc_dec_t *dec)
355 {
356   jpc_ms_t *ms;
357   jpc_dec_mstabent_t *mstabent;
358   int ret;
359   jpc_cstate_t *cstate;
360
361   if (!(cstate = jpc_cstate_create())) {
362     return -1;
363   }
364   dec->cstate = cstate;
365
366   /* Initially, we should expect to encounter a SOC marker segment. */
367   dec->state = JPC_MHSOC;
368
369   for (;;) {
370
371     /* Get the next marker segment in the code stream. */
372     if (!(ms = jpc_getms(dec->in, cstate))) {
373       fprintf(stderr, "cannot get marker segment\n");
374       return -1;
375     }
376
377     mstabent = jpc_dec_mstab_lookup(ms->id);
378     assert(mstabent);
379
380     /* Ensure that this type of marker segment is permitted
381       at this point in the code stream. */
382     if (!(dec->state & mstabent->validstates)) {
383       fprintf(stderr, "unexpected marker segment type\n");
384       jpc_ms_destroy(ms);
385       return -1;
386     }
387
388     /* Process the marker segment. */
389     if (mstabent->action) {
390       ret = (*mstabent->action)(dec, ms);
391     } else {
392       /* No explicit action is required. */
393       ret = 0;
394     }
395
396     /* Destroy the marker segment. */
397     jpc_ms_destroy(ms);
398
399     if (ret < 0) {
400       return -1;
401     } else if (ret > 0) {
402       break;
403     }
404
405   }
406
407   return 0;
408 }
409
410 static int jpc_dec_process_crg(jpc_dec_t *dec, jpc_ms_t *ms)
411 {
412   int cmptno;
413   jpc_dec_cmpt_t *cmpt;
414   jpc_crg_t *crg;
415
416   crg = &ms->parms.crg;
417   for (cmptno = 0, cmpt = dec->cmpts; cmptno < dec->numcomps; ++cmptno,
418     ++cmpt) {
419     /* Ignore the information in the CRG marker segment for now.
420       This information serves no useful purpose for decoding anyhow.
421       Some other parts of the code need to be changed if these lines
422       are uncommented.
423     cmpt->hsubstep = crg->comps[cmptno].hoff;
424     cmpt->vsubstep = crg->comps[cmptno].voff;
425     */
426   }
427   return 0;
428 }
429
430 static int jpc_dec_process_soc(jpc_dec_t *dec, jpc_ms_t *ms)
431 {
432   /* Eliminate warnings about unused variables. */
433   ms = 0;
434
435   /* We should expect to encounter a SIZ marker segment next. */
436   dec->state = JPC_MHSIZ;
437
438   return 0;
439 }
440
441 static int jpc_dec_process_sot(jpc_dec_t *dec, jpc_ms_t *ms)
442 {
443   jpc_dec_tile_t *tile;
444   jpc_sot_t *sot = &ms->parms.sot;
445   jas_image_cmptparm_t *compinfos;
446   jas_image_cmptparm_t *compinfo;
447   jpc_dec_cmpt_t *cmpt;
448   int cmptno;
449
450   if (dec->state == JPC_MH) {
451
452     compinfos = jas_malloc(dec->numcomps * sizeof(jas_image_cmptparm_t));
453     assert(compinfos);
454     for (cmptno = 0, cmpt = dec->cmpts, compinfo = compinfos;
455       cmptno < dec->numcomps; ++cmptno, ++cmpt, ++compinfo) {
456       compinfo->tlx = 0;
457       compinfo->tly = 0;
458       compinfo->prec = cmpt->prec;
459       compinfo->sgnd = cmpt->sgnd;
460       compinfo->width = cmpt->width;
461       compinfo->height = cmpt->height;
462       compinfo->hstep = cmpt->hstep;
463       compinfo->vstep = cmpt->vstep;
464     }
465
466     if (!(dec->image = jas_image_create(dec->numcomps, compinfos,
467       JAS_CLRSPC_UNKNOWN))) {
468       return -1;
469     }
470     jas_free(compinfos);
471
472     /* Is the packet header information stored in PPM marker segments in
473       the main header? */
474     if (dec->ppmstab) {
475       /* Convert the PPM marker segment data into a collection of streams
476         (one stream per tile-part). */
477       if (!(dec->pkthdrstreams = jpc_ppmstabtostreams(dec->ppmstab))) {
478         abort();
479       }
480       jpc_ppxstab_destroy(dec->ppmstab);
481       dec->ppmstab = 0;
482     }
483   }
484
485   if (sot->len > 0) {
486     dec->curtileendoff = jas_stream_getrwcount(dec->in) - ms->len -
487       4 + sot->len;
488   } else {
489     dec->curtileendoff = 0;
490   }
491
492   if (JAS_CAST(int, sot->tileno) > dec->numtiles) {
493     fprintf(stderr, "invalid tile number in SOT marker segment\n");
494     return -1;
495   }
496   /* Set the current tile. */
497   dec->curtile = &dec->tiles[sot->tileno];
498   tile = dec->curtile;
499   /* Ensure that this is the expected part number. */
500   if (sot->partno != tile->partno) {
501     return -1;
502   }
503   if (tile->numparts > 0 && sot->partno >= tile->numparts) {
504     return -1;
505   }
506   if (!tile->numparts && sot->numparts > 0) {
507     tile->numparts = sot->numparts;
508   }
509
510   tile->pptstab = 0;
511
512   switch (tile->state) {
513   case JPC_TILE_INIT:
514     /* This is the first tile-part for this tile. */
515     tile->state = JPC_TILE_ACTIVE;
516     assert(!tile->cp);
517     if (!(tile->cp = jpc_dec_cp_copy(dec->cp))) {
518       return -1;
519     }
520     jpc_dec_cp_resetflags(dec->cp);
521     break;
522   default:
523     if (sot->numparts == sot->partno - 1) {
524       tile->state = JPC_TILE_ACTIVELAST;
525     }
526     break;
527   }
528
529   /* Note: We do not increment the expected tile-part number until
530     all processing for this tile-part is complete. */
531
532   /* We should expect to encounter other tile-part header marker
533     segments next. */
534   dec->state = JPC_TPH;
535
536   return 0;
537 }
538
539 static int jpc_dec_process_sod(jpc_dec_t *dec, jpc_ms_t *ms)
540 {
541   jpc_dec_tile_t *tile;
542   int pos;
543
544   /* Eliminate compiler warnings about unused variables. */
545   ms = 0;
546
547   if (!(tile = dec->curtile)) {
548     return -1;
549   }
550
551   if (!tile->partno) {
552     if (!jpc_dec_cp_isvalid(tile->cp)) {
553       return -1;
554     }
555     jpc_dec_cp_prepare(tile->cp);
556     if (jpc_dec_tileinit(dec, tile)) {
557       return -1;
558     }
559   }
560
561   /* Are packet headers stored in the main header or tile-part header? */
562   if (dec->pkthdrstreams) {
563     /* Get the stream containing the packet header data for this
564       tile-part. */
565     if (!(tile->pkthdrstream = jpc_streamlist_remove(dec->pkthdrstreams, 0))) {
566       return -1;
567     }
568   }
569
570   if (tile->pptstab) {
571     if (!tile->pkthdrstream) {
572       if (!(tile->pkthdrstream = jas_stream_memopen(0, 0))) {
573         return -1;
574       }
575     }
576     pos = jas_stream_tell(tile->pkthdrstream);
577     jas_stream_seek(tile->pkthdrstream, 0, SEEK_END);
578     if (jpc_pptstabwrite(tile->pkthdrstream, tile->pptstab)) {
579       return -1;
580     }
581     jas_stream_seek(tile->pkthdrstream, pos, SEEK_SET);
582     jpc_ppxstab_destroy(tile->pptstab);
583     tile->pptstab = 0;
584   }
585
586   if (jas_getdbglevel() >= 10) {
587     jpc_dec_dump(dec, stderr);
588   }
589
590   if (jpc_dec_decodepkts(dec, (tile->pkthdrstream) ? tile->pkthdrstream :
591     dec->in, dec->in)) {
592     fprintf(stderr, "jpc_dec_decodepkts failed\n");
593     return -1;
594   }
595
596   /* Gobble any unconsumed tile data. */
597   if (dec->curtileendoff > 0) {
598     long curoff;
599     uint_fast32_t n;
600     curoff = jas_stream_getrwcount(dec->in);
601     if (curoff < dec->curtileendoff) {
602       n = dec->curtileendoff - curoff;
603       fprintf(stderr,
604         "warning: ignoring trailing garbage (%lu bytes)\n",
605         (unsigned long) n);
606
607       while (n-- > 0) {
608         if (jas_stream_getc(dec->in) == EOF) {
609           fprintf(stderr, "read error\n");
610           return -1;
611         }
612       }
613     } else if (curoff > dec->curtileendoff) {
614       fprintf(stderr,
615         "warning: not enough tile data (%lu bytes)\n",
616         (unsigned long) curoff - dec->curtileendoff);
617     }
618
619   }
620
621   if (tile->numparts > 0 && tile->partno == tile->numparts - 1) {
622     if (jpc_dec_tiledecode(dec, tile)) {
623       return -1;
624     }
625     jpc_dec_tilefini(dec, tile);
626   }
627
628   dec->curtile = 0;
629
630   /* Increment the expected tile-part number. */
631   ++tile->partno;
632
633   /* We should expect to encounter a SOT marker segment next. */
634   dec->state = JPC_TPHSOT;
635
636   return 0;
637 }
638
639 static int jpc_dec_tileinit(jpc_dec_t *dec, jpc_dec_tile_t *tile)
640 {
641   jpc_dec_tcomp_t *tcomp;
642   int compno;
643   int rlvlno;
644   jpc_dec_rlvl_t *rlvl;
645   jpc_dec_band_t *band;
646   jpc_dec_prc_t *prc;
647   int bndno;
648   jpc_tsfb_band_t *bnd;
649   int bandno;
650   jpc_dec_ccp_t *ccp;
651   int prccnt;
652   jpc_dec_cblk_t *cblk;
653   int cblkcnt;
654   uint_fast32_t tlprcxstart;
655   uint_fast32_t tlprcystart;
656   uint_fast32_t brprcxend;
657   uint_fast32_t brprcyend;
658   uint_fast32_t tlcbgxstart;
659   uint_fast32_t tlcbgystart;
660   uint_fast32_t brcbgxend;
661   uint_fast32_t brcbgyend;
662   uint_fast32_t cbgxstart;
663   uint_fast32_t cbgystart;
664   uint_fast32_t cbgxend;
665   uint_fast32_t cbgyend;
666   uint_fast32_t tlcblkxstart;
667   uint_fast32_t tlcblkystart;
668   uint_fast32_t brcblkxend;
669   uint_fast32_t brcblkyend;
670   uint_fast32_t cblkxstart;
671   uint_fast32_t cblkystart;
672   uint_fast32_t cblkxend;
673   uint_fast32_t cblkyend;
674   uint_fast32_t tmpxstart;
675   uint_fast32_t tmpystart;
676   uint_fast32_t tmpxend;
677   uint_fast32_t tmpyend;
678   jpc_dec_cp_t *cp;
679   jpc_tsfb_band_t bnds[64];
680   jpc_pchg_t *pchg;
681   int pchgno;
682   jpc_dec_cmpt_t *cmpt;
683
684   cp = tile->cp;
685   tile->realmode = 0;
686   if (cp->mctid == JPC_MCT_ICT) {
687     tile->realmode = 1;
688   }
689
690   for (compno = 0, tcomp = tile->tcomps, cmpt = dec->cmpts; compno <
691     dec->numcomps; ++compno, ++tcomp, ++cmpt) {
692     ccp = &tile->cp->ccps[compno];
693     if (ccp->qmfbid == JPC_COX_INS) {
694       tile->realmode = 1;
695     }
696     tcomp->numrlvls = ccp->numrlvls;
697     if (!(tcomp->rlvls = jas_malloc(tcomp->numrlvls *
698       sizeof(jpc_dec_rlvl_t)))) {
699       return -1;
700     }
701     if (!(tcomp->data = jas_seq2d_create(JPC_CEILDIV(tile->xstart,
702       cmpt->hstep), JPC_CEILDIV(tile->ystart, cmpt->vstep),
703       JPC_CEILDIV(tile->xend, cmpt->hstep), JPC_CEILDIV(tile->yend,
704       cmpt->vstep)))) {
705       return -1;
706     }
707     if (!(tcomp->tsfb = jpc_cod_gettsfb(ccp->qmfbid,
708       tcomp->numrlvls - 1))) {
709       return -1;
710     }
711 {
712   jpc_tsfb_getbands(tcomp->tsfb, jas_seq2d_xstart(tcomp->data), jas_seq2d_ystart(tcomp->data), jas_seq2d_xend(tcomp->data), jas_seq2d_yend(tcomp->data), bnds);
713 }
714     for (rlvlno = 0, rlvl = tcomp->rlvls; rlvlno < tcomp->numrlvls;
715       ++rlvlno, ++rlvl) {
716 rlvl->bands = 0;
717       rlvl->xstart = JPC_CEILDIVPOW2(tcomp->xstart,
718         tcomp->numrlvls - 1 - rlvlno);
719       rlvl->ystart = JPC_CEILDIVPOW2(tcomp->ystart,
720         tcomp->numrlvls - 1 - rlvlno);
721       rlvl->xend = JPC_CEILDIVPOW2(tcomp->xend,
722         tcomp->numrlvls - 1 - rlvlno);
723       rlvl->yend = JPC_CEILDIVPOW2(tcomp->yend,
724         tcomp->numrlvls - 1 - rlvlno);
725       rlvl->prcwidthexpn = ccp->prcwidthexpns[rlvlno];
726       rlvl->prcheightexpn = ccp->prcheightexpns[rlvlno];
727       tlprcxstart = JPC_FLOORDIVPOW2(rlvl->xstart,
728         rlvl->prcwidthexpn) << rlvl->prcwidthexpn;
729       tlprcystart = JPC_FLOORDIVPOW2(rlvl->ystart,
730         rlvl->prcheightexpn) << rlvl->prcheightexpn;
731       brprcxend = JPC_CEILDIVPOW2(rlvl->xend,
732         rlvl->prcwidthexpn) << rlvl->prcwidthexpn;
733       brprcyend = JPC_CEILDIVPOW2(rlvl->yend,
734         rlvl->prcheightexpn) << rlvl->prcheightexpn;
735       rlvl->numhprcs = (brprcxend - tlprcxstart) >>
736         rlvl->prcwidthexpn;
737       rlvl->numvprcs = (brprcyend - tlprcystart) >>
738         rlvl->prcheightexpn;
739       rlvl->numprcs = rlvl->numhprcs * rlvl->numvprcs;
740
741       if (rlvl->xstart >= rlvl->xend || rlvl->ystart >= rlvl->yend) {
742         rlvl->bands = 0;
743         rlvl->numprcs = 0;
744         rlvl->numhprcs = 0;
745         rlvl->numvprcs = 0;
746         continue;
747       }  
748       if (!rlvlno) {
749         tlcbgxstart = tlprcxstart;
750         tlcbgystart = tlprcystart;
751         brcbgxend = brprcxend;
752         brcbgyend = brprcyend;
753         rlvl->cbgwidthexpn = rlvl->prcwidthexpn;
754         rlvl->cbgheightexpn = rlvl->prcheightexpn;
755       } else {
756         tlcbgxstart = JPC_CEILDIVPOW2(tlprcxstart, 1);
757         tlcbgystart = JPC_CEILDIVPOW2(tlprcystart, 1);
758         brcbgxend = JPC_CEILDIVPOW2(brprcxend, 1);
759         brcbgyend = JPC_CEILDIVPOW2(brprcyend, 1);
760         rlvl->cbgwidthexpn = rlvl->prcwidthexpn - 1;
761         rlvl->cbgheightexpn = rlvl->prcheightexpn - 1;
762       }
763       rlvl->cblkwidthexpn = JAS_MIN(ccp->cblkwidthexpn,
764         rlvl->cbgwidthexpn);
765       rlvl->cblkheightexpn = JAS_MIN(ccp->cblkheightexpn,
766         rlvl->cbgheightexpn);
767
768       rlvl->numbands = (!rlvlno) ? 1 : 3;
769       if (!(rlvl->bands = jas_malloc(rlvl->numbands *
770         sizeof(jpc_dec_band_t)))) {
771         return -1;
772       }
773       for (bandno = 0, band = rlvl->bands;
774         bandno < rlvl->numbands; ++bandno, ++band) {
775         bndno = (!rlvlno) ? 0 : (3 * (rlvlno - 1) +
776           bandno + 1);
777         bnd = &bnds[bndno];
778
779         band->orient = bnd->orient;
780         band->stepsize = ccp->stepsizes[bndno];
781         band->analgain = JPC_NOMINALGAIN(ccp->qmfbid,
782           tcomp->numrlvls - 1, rlvlno, band->orient);
783         band->absstepsize = jpc_calcabsstepsize(band->stepsize,
784           cmpt->prec + band->analgain);
785         band->numbps = ccp->numguardbits +
786           JPC_QCX_GETEXPN(band->stepsize) - 1;
787         band->roishift = (ccp->roishift + band->numbps >= JPC_PREC) ?
788           (JPC_PREC - 1 - band->numbps) : ccp->roishift;
789         band->data = 0;
790         band->prcs = 0;
791         if (bnd->xstart == bnd->xend || bnd->ystart == bnd->yend) {
792           continue;
793         }
794         if (!(band->data = jas_seq2d_create(0, 0, 0, 0))) {
795           return -1;
796         }
797         jas_seq2d_bindsub(band->data, tcomp->data, bnd->locxstart, bnd->locystart, bnd->locxend, bnd->locyend);
798         jas_seq2d_setshift(band->data, bnd->xstart, bnd->ystart);
799
800         assert(rlvl->numprcs);
801
802         if (!(band->prcs = jas_malloc(rlvl->numprcs * sizeof(jpc_dec_prc_t)))) {
803           return -1;
804         }
805
806 /************************************************/
807   cbgxstart = tlcbgxstart;
808   cbgystart = tlcbgystart;
809   for (prccnt = rlvl->numprcs, prc = band->prcs;
810     prccnt > 0; --prccnt, ++prc) {
811     cbgxend = cbgxstart + (1 << rlvl->cbgwidthexpn);
812     cbgyend = cbgystart + (1 << rlvl->cbgheightexpn);
813     prc->xstart = JAS_MAX(cbgxstart, JAS_CAST(uint_fast32_t, jas_seq2d_xstart(band->data)));
814     prc->ystart = JAS_MAX(cbgystart, JAS_CAST(uint_fast32_t, jas_seq2d_ystart(band->data)));
815     prc->xend = JAS_MIN(cbgxend, JAS_CAST(uint_fast32_t, jas_seq2d_xend(band->data)));
816     prc->yend = JAS_MIN(cbgyend, JAS_CAST(uint_fast32_t, jas_seq2d_yend(band->data)));
817     if (prc->xend > prc->xstart && prc->yend > prc->ystart) {
818       tlcblkxstart = JPC_FLOORDIVPOW2(prc->xstart,
819         rlvl->cblkwidthexpn) << rlvl->cblkwidthexpn;
820       tlcblkystart = JPC_FLOORDIVPOW2(prc->ystart,
821         rlvl->cblkheightexpn) << rlvl->cblkheightexpn;
822       brcblkxend = JPC_CEILDIVPOW2(prc->xend,
823         rlvl->cblkwidthexpn) << rlvl->cblkwidthexpn;
824       brcblkyend = JPC_CEILDIVPOW2(prc->yend,
825         rlvl->cblkheightexpn) << rlvl->cblkheightexpn;
826       prc->numhcblks = (brcblkxend - tlcblkxstart) >>
827         rlvl->cblkwidthexpn;
828       prc->numvcblks = (brcblkyend - tlcblkystart) >>
829         rlvl->cblkheightexpn;
830       prc->numcblks = prc->numhcblks * prc->numvcblks;
831       assert(prc->numcblks > 0);
832
833       if (!(prc->incltagtree = jpc_tagtree_create(prc->numhcblks, prc->numvcblks))) {
834         return -1;
835       }
836       if (!(prc->numimsbstagtree = jpc_tagtree_create(prc->numhcblks, prc->numvcblks))) {
837         return -1;
838       }
839       if (!(prc->cblks = jas_malloc(prc->numcblks * sizeof(jpc_dec_cblk_t)))) {
840         return -1;
841       }
842
843       cblkxstart = cbgxstart;
844       cblkystart = cbgystart;
845       for (cblkcnt = prc->numcblks, cblk = prc->cblks; cblkcnt > 0;) {
846         cblkxend = cblkxstart + (1 << rlvl->cblkwidthexpn);
847         cblkyend = cblkystart + (1 << rlvl->cblkheightexpn);
848         tmpxstart = JAS_MAX(cblkxstart, prc->xstart);
849         tmpystart = JAS_MAX(cblkystart, prc->ystart);
850         tmpxend = JAS_MIN(cblkxend, prc->xend);
851         tmpyend = JAS_MIN(cblkyend, prc->yend);
852         if (tmpxend > tmpxstart && tmpyend > tmpystart) {
853           cblk->firstpassno = -1;
854           cblk->mqdec = 0;
855           cblk->nulldec = 0;
856           cblk->flags = 0;
857           cblk->numpasses = 0;
858           cblk->segs.head = 0;
859           cblk->segs.tail = 0;
860           cblk->curseg = 0;
861           cblk->numimsbs = 0;
862           cblk->numlenbits = 3;
863           cblk->flags = 0;
864           if (!(cblk->data = jas_seq2d_create(0, 0, 0, 0))) {
865             return -1;
866           }
867           jas_seq2d_bindsub(cblk->data, band->data, tmpxstart, tmpystart, tmpxend, tmpyend);
868           ++cblk;
869           --cblkcnt;
870         }
871         cblkxstart += 1 << rlvl->cblkwidthexpn;
872         if (cblkxstart >= cbgxend) {
873           cblkxstart = cbgxstart;
874           cblkystart += 1 << rlvl->cblkheightexpn;
875         }
876       }
877
878     } else {
879       prc->cblks = 0;
880       prc->incltagtree = 0;
881       prc->numimsbstagtree = 0;
882     }
883     cbgxstart += 1 << rlvl->cbgwidthexpn;
884     if (cbgxstart >= brcbgxend) {
885       cbgxstart = tlcbgxstart;
886       cbgystart += 1 << rlvl->cbgheightexpn;
887     }
888
889   }
890 /********************************************/
891       }
892     }
893   }
894
895 if (!(tile->pi = jpc_dec_pi_create(dec, tile)))
896 {
897   return -1;
898 }
899
900   for (pchgno = 0; pchgno < jpc_pchglist_numpchgs(tile->cp->pchglist);
901     ++pchgno) {
902     pchg = jpc_pchg_copy(jpc_pchglist_get(tile->cp->pchglist, pchgno));
903     assert(pchg);
904     jpc_pi_addpchg(tile->pi, pchg);
905   }
906   jpc_pi_init(tile->pi);
907
908   return 0;
909 }
910
911 static int jpc_dec_tilefini(jpc_dec_t *dec, jpc_dec_tile_t *tile)
912 {
913   jpc_dec_tcomp_t *tcomp;
914   int compno;
915   int bandno;
916   int rlvlno;
917   jpc_dec_band_t *band;
918   jpc_dec_rlvl_t *rlvl;
919   int prcno;
920   jpc_dec_prc_t *prc;
921   jpc_dec_seg_t *seg;
922   jpc_dec_cblk_t *cblk;
923   int cblkno;
924
925 if (tile->tcomps) {
926
927   for (compno = 0, tcomp = tile->tcomps; compno < dec->numcomps;
928     ++compno, ++tcomp) {
929     for (rlvlno = 0, rlvl = tcomp->rlvls; rlvlno < tcomp->numrlvls;
930       ++rlvlno, ++rlvl) {
931 if (!rlvl->bands) {
932   continue;
933 }
934       for (bandno = 0, band = rlvl->bands; bandno < rlvl->numbands; ++bandno, ++band) {
935 if (band->prcs) {
936         for (prcno = 0, prc = band->prcs; prcno <
937           rlvl->numprcs; ++prcno, ++prc) {
938 if (!prc->cblks) {
939   continue;
940 }
941           for (cblkno = 0, cblk = prc->cblks; cblkno < prc->numcblks; ++cblkno, ++cblk) {
942
943   while (cblk->segs.head) {
944     seg = cblk->segs.head;
945     jpc_seglist_remove(&cblk->segs, seg);
946     jpc_seg_destroy(seg);
947   }
948   jas_matrix_destroy(cblk->data);
949   if (cblk->mqdec) {
950     jpc_mqdec_destroy(cblk->mqdec);
951   }
952   if (cblk->nulldec) {
953     jpc_bitstream_close(cblk->nulldec);
954   }
955   if (cblk->flags) {
956     jas_matrix_destroy(cblk->flags);
957   }
958           }
959           if (prc->incltagtree) {
960             jpc_tagtree_destroy(prc->incltagtree);
961           }
962           if (prc->numimsbstagtree) {
963             jpc_tagtree_destroy(prc->numimsbstagtree);
964           }
965           if (prc->cblks) {
966             jas_free(prc->cblks);
967           }
968         }
969 }
970         if (band->data) {
971           jas_matrix_destroy(band->data);
972         }
973         if (band->prcs) {
974           jas_free(band->prcs);
975         }
976       }
977       if (rlvl->bands) {
978         jas_free(rlvl->bands);
979       }
980     }
981     if (tcomp->rlvls) {
982       jas_free(tcomp->rlvls);
983     }
984     if (tcomp->data) {
985       jas_matrix_destroy(tcomp->data);
986     }
987     if (tcomp->tsfb) {
988       jpc_tsfb_destroy(tcomp->tsfb);
989     }
990   }
991 }
992   if (tile->cp) {
993     jpc_dec_cp_destroy(tile->cp);
994     tile->cp = 0;
995   }
996   if (tile->tcomps) {
997     jas_free(tile->tcomps);
998     tile->tcomps = 0;
999   }
1000   if (tile->pi) {
1001     jpc_pi_destroy(tile->pi);
1002     tile->pi = 0;
1003   }
1004   if (tile->pkthdrstream) {
1005     jas_stream_close(tile->pkthdrstream);
1006     tile->pkthdrstream = 0;
1007   }
1008   if (tile->pptstab) {
1009     jpc_ppxstab_destroy(tile->pptstab);
1010     tile->pptstab = 0;
1011   }
1012
1013   tile->state = JPC_TILE_DONE;
1014
1015   return 0;
1016 }
1017
1018 static int jpc_dec_tiledecode(jpc_dec_t *dec, jpc_dec_tile_t *tile)
1019 {
1020   int i;
1021   int j;
1022   jpc_dec_tcomp_t *tcomp;
1023   jpc_dec_rlvl_t *rlvl;
1024   jpc_dec_band_t *band;
1025   int compno;
1026   int rlvlno;
1027   int bandno;
1028   int adjust;
1029   int v;
1030   jpc_dec_ccp_t *ccp;
1031   jpc_dec_cmpt_t *cmpt;
1032
1033   if (jpc_dec_decodecblks(dec, tile)) {
1034     fprintf(stderr, "jpc_dec_decodecblks failed\n");
1035     return -1;
1036   }
1037
1038   /* Perform dequantization. */
1039   for (compno = 0, tcomp = tile->tcomps; compno < dec->numcomps;
1040     ++compno, ++tcomp) {
1041     ccp = &tile->cp->ccps[compno];
1042     for (rlvlno = 0, rlvl = tcomp->rlvls; rlvlno < tcomp->numrlvls;
1043       ++rlvlno, ++rlvl) {
1044       if (!rlvl->bands) {
1045         continue;
1046       }
1047       for (bandno = 0, band = rlvl->bands;
1048         bandno < rlvl->numbands; ++bandno, ++band) {
1049         if (!band->data) {
1050           continue;
1051         }
1052         jpc_undo_roi(band->data, band->roishift, ccp->roishift -
1053           band->roishift, band->numbps);
1054         if (tile->realmode) {
1055           jas_matrix_asl(band->data, JPC_FIX_FRACBITS);
1056           jpc_dequantize(band->data, band->absstepsize);
1057         }
1058
1059       }
1060     }
1061   }
1062
1063   /* Apply an inverse wavelet transform if necessary. */
1064   for (compno = 0, tcomp = tile->tcomps; compno < dec->numcomps;
1065     ++compno, ++tcomp) {
1066     ccp = &tile->cp->ccps[compno];
1067     jpc_tsfb_synthesize(tcomp->tsfb, ((ccp->qmfbid ==
1068       JPC_COX_RFT) ? JPC_TSFB_RITIMODE : 0), tcomp->data);
1069   }
1070
1071
1072   /* Apply an inverse intercomponent transform if necessary. */
1073   switch (tile->cp->mctid) {
1074   case JPC_MCT_RCT:
1075     assert(dec->numcomps == 3);
1076     jpc_irct(tile->tcomps[0].data, tile->tcomps[1].data,
1077       tile->tcomps[2].data);
1078     break;
1079   case JPC_MCT_ICT:
1080     assert(dec->numcomps == 3);
1081     jpc_iict(tile->tcomps[0].data, tile->tcomps[1].data,
1082       tile->tcomps[2].data);
1083     break;
1084   }
1085
1086   /* Perform rounding and convert to integer values. */
1087   if (tile->realmode) {
1088     for (compno = 0, tcomp = tile->tcomps; compno < dec->numcomps;
1089       ++compno, ++tcomp) {
1090       for (i = 0; i < jas_matrix_numrows(tcomp->data); ++i) {
1091         for (j = 0; j < jas_matrix_numcols(tcomp->data); ++j) {
1092           v = jas_matrix_get(tcomp->data, i, j);
1093           v = jpc_fix_round(v);
1094           jas_matrix_set(tcomp->data, i, j, jpc_fixtoint(v));
1095         }
1096       }
1097     }
1098   }
1099
1100   /* Perform level shift. */
1101   for (compno = 0, tcomp = tile->tcomps, cmpt = dec->cmpts; compno <
1102     dec->numcomps; ++compno, ++tcomp, ++cmpt) {
1103     adjust = cmpt->sgnd ? 0 : (1 << (cmpt->prec - 1));
1104     for (i = 0; i < jas_matrix_numrows(tcomp->data); ++i) {
1105       for (j = 0; j < jas_matrix_numcols(tcomp->data); ++j) {
1106         *jas_matrix_getref(tcomp->data, i, j) += adjust;
1107       }
1108     }
1109   }
1110
1111   /* Perform clipping. */
1112   for (compno = 0, tcomp = tile->tcomps, cmpt = dec->cmpts; compno <
1113     dec->numcomps; ++compno, ++tcomp, ++cmpt) {
1114     jpc_fix_t mn;
1115     jpc_fix_t mx;
1116     mn = cmpt->sgnd ? (-(1 << (cmpt->prec - 1))) : (0);
1117     mx = cmpt->sgnd ? ((1 << (cmpt->prec - 1)) - 1) : ((1 <<
1118       cmpt->prec) - 1);
1119     jas_matrix_clip(tcomp->data, mn, mx);
1120   }
1121
1122   /* XXX need to free tsfb struct */
1123
1124   /* Write the data for each component of the image. */
1125   for (compno = 0, tcomp = tile->tcomps, cmpt = dec->cmpts; compno <
1126     dec->numcomps; ++compno, ++tcomp, ++cmpt) {
1127     if (jas_image_writecmpt(dec->image, compno, tcomp->xstart -
1128       JPC_CEILDIV(dec->xstart, cmpt->hstep), tcomp->ystart -
1129       JPC_CEILDIV(dec->ystart, cmpt->vstep), jas_matrix_numcols(
1130       tcomp->data), jas_matrix_numrows(tcomp->data), tcomp->data)) {
1131       fprintf(stderr, "write component failed\n");
1132       return -4;
1133     }
1134   }
1135
1136   return 0;
1137 }
1138
1139 static int jpc_dec_process_eoc(jpc_dec_t *dec, jpc_ms_t *ms)
1140 {
1141   int tileno;
1142   jpc_dec_tile_t *tile;
1143
1144   /* Eliminate compiler warnings about unused variables. */
1145   ms = 0;
1146
1147   for (tileno = 0, tile = dec->tiles; tileno < dec->numtiles; ++tileno,
1148     ++tile) {
1149     if (tile->state == JPC_TILE_ACTIVE) {
1150       if (jpc_dec_tiledecode(dec, tile)) {
1151         return -1;
1152       }
1153     }
1154     jpc_dec_tilefini(dec, tile);
1155   }
1156
1157   /* We are done processing the code stream. */
1158   dec->state = JPC_MT;
1159
1160   return 1;
1161 }
1162
1163 static int jpc_dec_process_siz(jpc_dec_t *dec, jpc_ms_t *ms)
1164 {
1165   jpc_siz_t *siz = &ms->parms.siz;
1166   int compno;
1167   int tileno;
1168   jpc_dec_tile_t *tile;
1169   jpc_dec_tcomp_t *tcomp;
1170   int htileno;
1171   int vtileno;
1172   jpc_dec_cmpt_t *cmpt;
1173
1174   dec->xstart = siz->xoff;
1175   dec->ystart = siz->yoff;
1176   dec->xend = siz->width;
1177   dec->yend = siz->height;
1178   dec->tilewidth = siz->tilewidth;
1179   dec->tileheight = siz->tileheight;
1180   dec->tilexoff = siz->tilexoff;
1181   dec->tileyoff = siz->tileyoff;
1182   dec->numcomps = siz->numcomps;
1183   if (!(dec->cp = jpc_dec_cp_create(dec->numcomps))) {
1184     return -1;
1185   }
1186
1187   if (!(dec->cmpts = jas_malloc(dec->numcomps * sizeof(jpc_dec_cmpt_t)))) {
1188     return -1;
1189   }
1190
1191   for (compno = 0, cmpt = dec->cmpts; compno < dec->numcomps; ++compno,
1192     ++cmpt) {
1193     cmpt->prec = siz->comps[compno].prec;
1194     cmpt->sgnd = siz->comps[compno].sgnd;
1195     cmpt->hstep = siz->comps[compno].hsamp;
1196     cmpt->vstep = siz->comps[compno].vsamp;
1197     cmpt->width = JPC_CEILDIV(dec->xend, cmpt->hstep) -
1198       JPC_CEILDIV(dec->xstart, cmpt->hstep);
1199     cmpt->height = JPC_CEILDIV(dec->yend, cmpt->vstep) -
1200       JPC_CEILDIV(dec->ystart, cmpt->vstep);
1201     cmpt->hsubstep = 0;
1202     cmpt->vsubstep = 0;
1203   }
1204
1205   dec->image = 0;
1206
1207   dec->numhtiles = JPC_CEILDIV(dec->xend - dec->tilexoff, dec->tilewidth);
1208   dec->numvtiles = JPC_CEILDIV(dec->yend - dec->tileyoff, dec->tileheight);
1209   dec->numtiles = dec->numhtiles * dec->numvtiles;
1210   if (!(dec->tiles = jas_malloc(dec->numtiles * sizeof(jpc_dec_tile_t)))) {
1211     return -1;
1212   }
1213
1214   for (tileno = 0, tile = dec->tiles; tileno < dec->numtiles; ++tileno,
1215     ++tile) {
1216     htileno = tileno % dec->numhtiles;
1217     vtileno = tileno / dec->numhtiles;
1218     tile->realmode = 0;
1219     tile->state = JPC_TILE_INIT;
1220     tile->xstart = JAS_MAX(dec->tilexoff + htileno * dec->tilewidth,
1221       dec->xstart);
1222     tile->ystart = JAS_MAX(dec->tileyoff + vtileno * dec->tileheight,
1223       dec->ystart);
1224     tile->xend = JAS_MIN(dec->tilexoff + (htileno + 1) *
1225       dec->tilewidth, dec->xend);
1226     tile->yend = JAS_MIN(dec->tileyoff + (vtileno + 1) *
1227       dec->tileheight, dec->yend);
1228     tile->numparts = 0;
1229     tile->partno = 0;
1230     tile->pkthdrstream = 0;
1231     tile->pkthdrstreampos = 0;
1232     tile->pptstab = 0;
1233     tile->cp = 0;
1234     if (!(tile->tcomps = jas_malloc(dec->numcomps *
1235       sizeof(jpc_dec_tcomp_t)))) {
1236       return -1;
1237     }
1238     for (compno = 0, cmpt = dec->cmpts, tcomp = tile->tcomps;
1239       compno < dec->numcomps; ++compno, ++cmpt, ++tcomp) {
1240       tcomp->rlvls = 0;
1241       tcomp->data = 0;
1242       tcomp->xstart = JPC_CEILDIV(tile->xstart, cmpt->hstep);
1243       tcomp->ystart = JPC_CEILDIV(tile->ystart, cmpt->vstep);
1244       tcomp->xend = JPC_CEILDIV(tile->xend, cmpt->hstep);
1245       tcomp->yend = JPC_CEILDIV(tile->yend, cmpt->vstep);
1246       tcomp->tsfb = 0;
1247     }
1248   }
1249
1250   dec->pkthdrstreams = 0;
1251
1252   /* We should expect to encounter other main header marker segments
1253     or an SOT marker segment next. */
1254   dec->state = JPC_MH;
1255
1256   return 0;
1257 }
1258
1259 static int jpc_dec_process_cod(jpc_dec_t *dec, jpc_ms_t *ms)
1260 {
1261   jpc_cod_t *cod = &ms->parms.cod;
1262   jpc_dec_tile_t *tile;
1263
1264   switch (dec->state) {
1265   case JPC_MH:
1266     jpc_dec_cp_setfromcod(dec->cp, cod);
1267     break;
1268   case JPC_TPH:
1269     if (!(tile = dec->curtile)) {
1270       return -1;
1271     }
1272     if (tile->partno != 0) {
1273       return -1;
1274     }
1275     jpc_dec_cp_setfromcod(tile->cp, cod);
1276     break;
1277   }
1278   return 0;
1279 }
1280
1281 static int jpc_dec_process_coc(jpc_dec_t *dec, jpc_ms_t *ms)
1282 {
1283   jpc_coc_t *coc = &ms->parms.coc;
1284   jpc_dec_tile_t *tile;
1285
1286   if (JAS_CAST(int, coc->compno) > dec->numcomps) {
1287     fprintf(stderr,
1288       "invalid component number in COC marker segment\n");
1289     return -1;
1290   }
1291   switch (dec->state) {
1292   case JPC_MH:
1293     jpc_dec_cp_setfromcoc(dec->cp, coc);
1294     break;
1295   case JPC_TPH:
1296     if (!(tile = dec->curtile)) {
1297       return -1;
1298     }
1299     if (tile->partno > 0) {
1300       return -1;
1301     }
1302     jpc_dec_cp_setfromcoc(tile->cp, coc);
1303     break;
1304   }
1305   return 0;
1306 }
1307
1308 static int jpc_dec_process_rgn(jpc_dec_t *dec, jpc_ms_t *ms)
1309 {
1310   jpc_rgn_t *rgn = &ms->parms.rgn;
1311   jpc_dec_tile_t *tile;
1312
1313   if (JAS_CAST(int, rgn->compno) > dec->numcomps) {
1314     fprintf(stderr,
1315       "invalid component number in RGN marker segment\n");
1316     return -1;
1317   }
1318   switch (dec->state) {
1319   case JPC_MH:
1320     jpc_dec_cp_setfromrgn(dec->cp, rgn);
1321     break;
1322   case JPC_TPH:
1323     if (!(tile = dec->curtile)) {
1324       return -1;
1325     }
1326     if (tile->partno > 0) {
1327       return -1;
1328     }
1329     jpc_dec_cp_setfromrgn(tile->cp, rgn);
1330     break;
1331   }
1332
1333   return 0;
1334 }
1335
1336 static int jpc_dec_process_qcd(jpc_dec_t *dec, jpc_ms_t *ms)
1337 {
1338   jpc_qcd_t *qcd = &ms->parms.qcd;
1339   jpc_dec_tile_t *tile;
1340
1341   switch (dec->state) {
1342   case JPC_MH:
1343     jpc_dec_cp_setfromqcd(dec->cp, qcd);
1344     break;
1345   case JPC_TPH:
1346     if (!(tile = dec->curtile)) {
1347       return -1;
1348     }
1349     if (tile->partno > 0) {
1350       return -1;
1351     }
1352     jpc_dec_cp_setfromqcd(tile->cp, qcd);
1353     break;
1354   }
1355   return 0;
1356 }
1357
1358 static int jpc_dec_process_qcc(jpc_dec_t *dec, jpc_ms_t *ms)
1359 {
1360   jpc_qcc_t *qcc = &ms->parms.qcc;
1361   jpc_dec_tile_t *tile;
1362
1363   if (JAS_CAST(int, qcc->compno) > dec->numcomps) {
1364     fprintf(stderr,
1365       "invalid component number in QCC marker segment\n");
1366     return -1;
1367   }
1368   switch (dec->state) {
1369   case JPC_MH:
1370     jpc_dec_cp_setfromqcc(dec->cp, qcc);
1371     break;
1372   case JPC_TPH:
1373     if (!(tile = dec->curtile)) {
1374       return -1;
1375     }
1376     if (tile->partno > 0) {
1377       return -1;
1378     }
1379     jpc_dec_cp_setfromqcc(tile->cp, qcc);
1380     break;
1381   }
1382   return 0;
1383 }
1384
1385 static int jpc_dec_process_poc(jpc_dec_t *dec, jpc_ms_t *ms)
1386 {
1387   jpc_poc_t *poc = &ms->parms.poc;
1388   jpc_dec_tile_t *tile;
1389   switch (dec->state) {
1390   case JPC_MH:
1391     if (jpc_dec_cp_setfrompoc(dec->cp, poc, 1)) {
1392       return -1;
1393     }
1394     break;
1395   case JPC_TPH:
1396     if (!(tile = dec->curtile)) {
1397       return -1;
1398     }
1399     if (!tile->partno) {
1400       if (jpc_dec_cp_setfrompoc(tile->cp, poc, (!tile->partno))) {
1401         return -1;
1402       }
1403     } else {
1404       jpc_pi_addpchgfrompoc(tile->pi, poc);
1405     }
1406     break;
1407   }
1408   return 0;
1409 }
1410
1411 static int jpc_dec_process_ppm(jpc_dec_t *dec, jpc_ms_t *ms)
1412 {
1413   jpc_ppm_t *ppm = &ms->parms.ppm;
1414   jpc_ppxstabent_t *ppmstabent;
1415
1416   if (!dec->ppmstab) {
1417     if (!(dec->ppmstab = jpc_ppxstab_create())) {
1418       return -1;
1419     }
1420   }
1421
1422   if (!(ppmstabent = jpc_ppxstabent_create())) {
1423     return -1;
1424   }
1425   ppmstabent->ind = ppm->ind;
1426   ppmstabent->data = ppm->data;
1427   ppm->data = 0;
1428   ppmstabent->len = ppm->len;
1429   if (jpc_ppxstab_insert(dec->ppmstab, ppmstabent)) {
1430     return -1;
1431   }
1432   return 0;
1433 }
1434
1435 static int jpc_dec_process_ppt(jpc_dec_t *dec, jpc_ms_t *ms)
1436 {
1437   jpc_ppt_t *ppt = &ms->parms.ppt;
1438   jpc_dec_tile_t *tile;
1439   jpc_ppxstabent_t *pptstabent;
1440
1441   tile = dec->curtile;
1442   if (!tile->pptstab) {
1443     if (!(tile->pptstab = jpc_ppxstab_create())) {
1444       return -1;
1445     }
1446   }
1447   if (!(pptstabent = jpc_ppxstabent_create())) {
1448     return -1;
1449   }
1450   pptstabent->ind = ppt->ind;
1451   pptstabent->data = ppt->data;
1452   ppt->data = 0;
1453   pptstabent->len = ppt->len;
1454   if (jpc_ppxstab_insert(tile->pptstab, pptstabent)) {
1455     return -1;
1456   }
1457   return 0;
1458 }
1459
1460 static int jpc_dec_process_com(jpc_dec_t *dec, jpc_ms_t *ms)
1461 {
1462   /* Eliminate compiler warnings about unused variables. */
1463   dec = 0;
1464   ms = 0;
1465
1466   return 0;
1467 }
1468
1469 static int jpc_dec_process_unk(jpc_dec_t *dec, jpc_ms_t *ms)
1470 {
1471   /* Eliminate compiler warnings about unused variables. */
1472   dec = 0;
1473
1474   fprintf(stderr, "warning: ignoring unknown marker segment\n");
1475   jpc_ms_dump(ms, stderr);
1476   return 0;
1477 }
1478
1479 /******************************************************************************\
1480 *
1481 \******************************************************************************/
1482
1483 static jpc_dec_cp_t *jpc_dec_cp_create(uint_fast16_t numcomps)
1484 {
1485   jpc_dec_cp_t *cp;
1486   jpc_dec_ccp_t *ccp;
1487   int compno;
1488
1489   if (!(cp = jas_malloc(sizeof(jpc_dec_cp_t)))) {
1490     return 0;
1491   }
1492   cp->flags = 0;
1493   cp->numcomps = numcomps;
1494   cp->prgord = 0;
1495   cp->numlyrs = 0;
1496   cp->mctid = 0;
1497   cp->csty = 0;
1498   if (!(cp->ccps = jas_malloc(cp->numcomps * sizeof(jpc_dec_ccp_t)))) {
1499     return 0;
1500   }
1501   if (!(cp->pchglist = jpc_pchglist_create())) {
1502     jas_free(cp->ccps);
1503     return 0;
1504   }
1505   for (compno = 0, ccp = cp->ccps; compno < cp->numcomps;
1506     ++compno, ++ccp) {
1507     ccp->flags = 0;
1508     ccp->numrlvls = 0;
1509     ccp->cblkwidthexpn = 0;
1510     ccp->cblkheightexpn = 0;
1511     ccp->qmfbid = 0;
1512     ccp->numstepsizes = 0;
1513     ccp->numguardbits = 0;
1514     ccp->roishift = 0;
1515     ccp->cblkctx = 0;
1516   }
1517   return cp;
1518 }
1519
1520 static jpc_dec_cp_t *jpc_dec_cp_copy(jpc_dec_cp_t *cp)
1521 {
1522   jpc_dec_cp_t *newcp;
1523   jpc_dec_ccp_t *newccp;
1524   jpc_dec_ccp_t *ccp;
1525   int compno;
1526
1527   if (!(newcp = jpc_dec_cp_create(cp->numcomps))) {
1528     return 0;
1529   }
1530   newcp->flags = cp->flags;
1531   newcp->prgord = cp->prgord;
1532   newcp->numlyrs = cp->numlyrs;
1533   newcp->mctid = cp->mctid;
1534   newcp->csty = cp->csty;
1535   jpc_pchglist_destroy(newcp->pchglist);
1536   newcp->pchglist = 0;
1537   if (!(newcp->pchglist = jpc_pchglist_copy(cp->pchglist))) {
1538     jas_free(newcp);
1539     return 0;
1540   }
1541   for (compno = 0, newccp = newcp->ccps, ccp = cp->ccps;
1542     compno < cp->numcomps;
1543     ++compno, ++newccp, ++ccp) {
1544     *newccp = *ccp;
1545   }
1546   return newcp;
1547 }
1548
1549 static void jpc_dec_cp_resetflags(jpc_dec_cp_t *cp)
1550 {
1551   int compno;
1552   jpc_dec_ccp_t *ccp;
1553   cp->flags &= (JPC_CSET | JPC_QSET);
1554   for (compno = 0, ccp = cp->ccps; compno < cp->numcomps;
1555     ++compno, ++ccp) {
1556     ccp->flags = 0;
1557   }
1558 }
1559
1560 static void jpc_dec_cp_destroy(jpc_dec_cp_t *cp)
1561 {
1562   if (cp->ccps) {
1563     jas_free(cp->ccps);
1564   }
1565   if (cp->pchglist) {
1566     jpc_pchglist_destroy(cp->pchglist);
1567   }
1568   jas_free(cp);
1569 }
1570
1571 static int jpc_dec_cp_isvalid(jpc_dec_cp_t *cp)
1572 {
1573   uint_fast16_t compcnt;
1574   jpc_dec_ccp_t *ccp;
1575
1576   if (!(cp->flags & JPC_CSET) || !(cp->flags & JPC_QSET)) {
1577     return 0;
1578   }
1579   for (compcnt = cp->numcomps, ccp = cp->ccps; compcnt > 0; --compcnt,
1580     ++ccp) {
1581     /* Is there enough step sizes for the number of bands? */
1582     if ((ccp->qsty != JPC_QCX_SIQNT && JAS_CAST(int, ccp->numstepsizes) < 3 *
1583       ccp->numrlvls - 2) || (ccp->qsty == JPC_QCX_SIQNT &&
1584       ccp->numstepsizes != 1)) {
1585       return 0;
1586     }
1587   }
1588   return 1;
1589 }
1590
1591 static void calcstepsizes(uint_fast16_t refstepsize, int numrlvls,
1592   uint_fast16_t *stepsizes)
1593 {
1594   int bandno;
1595   int numbands;
1596   uint_fast16_t expn;
1597   uint_fast16_t mant;
1598   expn = JPC_QCX_GETEXPN(refstepsize);
1599   mant = JPC_QCX_GETMANT(refstepsize);
1600   numbands = 3 * numrlvls - 2;
1601   for (bandno = 0; bandno < numbands; ++bandno) {
1602     stepsizes[bandno] = JPC_QCX_MANT(mant) | JPC_QCX_EXPN(expn +
1603       (numrlvls - 1) - (numrlvls - 1 - ((bandno > 0) ? ((bandno + 2) / 3) : (0))));
1604   }
1605 }
1606
1607 static int jpc_dec_cp_prepare(jpc_dec_cp_t *cp)
1608 {
1609   jpc_dec_ccp_t *ccp;
1610   int compno;
1611   int i;
1612   for (compno = 0, ccp = cp->ccps; compno < cp->numcomps;
1613     ++compno, ++ccp) {
1614     if (!(ccp->csty & JPC_COX_PRT)) {
1615       for (i = 0; i < JPC_MAXRLVLS; ++i) {
1616         ccp->prcwidthexpns[i] = 15;
1617         ccp->prcheightexpns[i] = 15;
1618       }
1619     }
1620     if (ccp->qsty == JPC_QCX_SIQNT) {
1621       calcstepsizes(ccp->stepsizes[0], ccp->numrlvls, ccp->stepsizes);
1622     }
1623   }
1624   return 0;
1625 }
1626
1627 static int jpc_dec_cp_setfromcod(jpc_dec_cp_t *cp, jpc_cod_t *cod)
1628 {
1629   jpc_dec_ccp_t *ccp;
1630   int compno;
1631   cp->flags |= JPC_CSET;
1632   cp->prgord = cod->prg;
1633   if (cod->mctrans) {
1634     cp->mctid = (cod->compparms.qmfbid == JPC_COX_INS) ? (JPC_MCT_ICT) : (JPC_MCT_RCT);
1635   } else {
1636     cp->mctid = JPC_MCT_NONE;
1637   }
1638   cp->numlyrs = cod->numlyrs;
1639   cp->csty = cod->csty & (JPC_COD_SOP | JPC_COD_EPH);
1640   for (compno = 0, ccp = cp->ccps; compno < cp->numcomps;
1641     ++compno, ++ccp) {
1642     jpc_dec_cp_setfromcox(cp, ccp, &cod->compparms, 0);
1643   }
1644   cp->flags |= JPC_CSET;
1645   return 0;
1646 }
1647
1648 static int jpc_dec_cp_setfromcoc(jpc_dec_cp_t *cp, jpc_coc_t *coc)
1649 {
1650   jpc_dec_cp_setfromcox(cp, &cp->ccps[coc->compno], &coc->compparms, JPC_COC);
1651   return 0;
1652 }
1653
1654 static int jpc_dec_cp_setfromcox(jpc_dec_cp_t *cp, jpc_dec_ccp_t *ccp,
1655   jpc_coxcp_t *compparms, int flags)
1656 {
1657   int rlvlno;
1658
1659   /* Eliminate compiler warnings about unused variables. */
1660   cp = 0;
1661
1662   if ((flags & JPC_COC) || !(ccp->flags & JPC_COC)) {
1663     ccp->numrlvls = compparms->numdlvls + 1;
1664     ccp->cblkwidthexpn = JPC_COX_GETCBLKSIZEEXPN(
1665       compparms->cblkwidthval);
1666     ccp->cblkheightexpn = JPC_COX_GETCBLKSIZEEXPN(
1667       compparms->cblkheightval);
1668     ccp->qmfbid = compparms->qmfbid;
1669     ccp->cblkctx = compparms->cblksty;
1670     ccp->csty = compparms->csty & JPC_COX_PRT;
1671     for (rlvlno = 0; rlvlno < compparms->numrlvls; ++rlvlno) {
1672       ccp->prcwidthexpns[rlvlno] =
1673         compparms->rlvls[rlvlno].parwidthval;
1674       ccp->prcheightexpns[rlvlno] =
1675         compparms->rlvls[rlvlno].parheightval;
1676     }
1677     ccp->flags |= flags | JPC_CSET;
1678   }
1679   return 0;
1680 }
1681
1682 static int jpc_dec_cp_setfromqcd(jpc_dec_cp_t *cp, jpc_qcd_t *qcd)
1683 {
1684   int compno;
1685   jpc_dec_ccp_t *ccp;
1686   for (compno = 0, ccp = cp->ccps; compno < cp->numcomps;
1687     ++compno, ++ccp) {
1688     jpc_dec_cp_setfromqcx(cp, ccp, &qcd->compparms, 0);
1689   }
1690   cp->flags |= JPC_QSET;
1691   return 0;
1692 }
1693
1694 static int jpc_dec_cp_setfromqcc(jpc_dec_cp_t *cp, jpc_qcc_t *qcc)
1695 {
1696   return jpc_dec_cp_setfromqcx(cp, &cp->ccps[qcc->compno], &qcc->compparms, JPC_QCC);
1697 }
1698
1699 static int jpc_dec_cp_setfromqcx(jpc_dec_cp_t *cp, jpc_dec_ccp_t *ccp,
1700   jpc_qcxcp_t *compparms, int flags)
1701 {
1702   int bandno;
1703
1704   /* Eliminate compiler warnings about unused variables. */
1705   cp = 0;
1706
1707   if ((flags & JPC_QCC) || !(ccp->flags & JPC_QCC)) {
1708     ccp->flags |= flags | JPC_QSET;
1709     for (bandno = 0; bandno < compparms->numstepsizes; ++bandno) {
1710       ccp->stepsizes[bandno] = compparms->stepsizes[bandno];
1711     }
1712     ccp->numstepsizes = compparms->numstepsizes;
1713     ccp->numguardbits = compparms->numguard;
1714     ccp->qsty = compparms->qntsty;
1715   }
1716   return 0;
1717 }
1718
1719 static int jpc_dec_cp_setfromrgn(jpc_dec_cp_t *cp, jpc_rgn_t *rgn)
1720 {
1721   jpc_dec_ccp_t *ccp;
1722   ccp = &cp->ccps[rgn->compno];
1723   ccp->roishift = rgn->roishift;
1724   return 0;
1725 }
1726
1727 static int jpc_pi_addpchgfrompoc(jpc_pi_t *pi, jpc_poc_t *poc)
1728 {
1729   int pchgno;
1730   jpc_pchg_t *pchg;
1731   for (pchgno = 0; pchgno < poc->numpchgs; ++pchgno) {
1732     if (!(pchg = jpc_pchg_copy(&poc->pchgs[pchgno]))) {
1733       return -1;
1734     }
1735     if (jpc_pchglist_insert(pi->pchglist, -1, pchg)) {
1736       return -1;
1737     }
1738   }
1739   return 0;
1740 }
1741
1742 static int jpc_dec_cp_setfrompoc(jpc_dec_cp_t *cp, jpc_poc_t *poc, int reset)
1743 {
1744   int pchgno;
1745   jpc_pchg_t *pchg;
1746   if (reset) {
1747     while (jpc_pchglist_numpchgs(cp->pchglist) > 0) {
1748       pchg = jpc_pchglist_remove(cp->pchglist, 0);
1749       jpc_pchg_destroy(pchg);
1750     }
1751   }
1752   for (pchgno = 0; pchgno < poc->numpchgs; ++pchgno) {
1753     if (!(pchg = jpc_pchg_copy(&poc->pchgs[pchgno]))) {
1754       return -1;
1755     }
1756     if (jpc_pchglist_insert(cp->pchglist, -1, pchg)) {
1757       return -1;
1758     }
1759   }
1760   return 0;
1761 }
1762
1763 static jpc_fix_t jpc_calcabsstepsize(int stepsize, int numbits)
1764 {
1765   jpc_fix_t absstepsize;
1766   int n;
1767
1768   absstepsize = jpc_inttofix(1);
1769   n = JPC_FIX_FRACBITS - 11;
1770   absstepsize |= (n >= 0) ? (JPC_QCX_GETMANT(stepsize) << n) :
1771     (JPC_QCX_GETMANT(stepsize) >> (-n));
1772   n = numbits - JPC_QCX_GETEXPN(stepsize);
1773   absstepsize = (n >= 0) ? (absstepsize << n) : (absstepsize >> (-n));
1774   return absstepsize;
1775 }
1776
1777 static void jpc_dequantize(jas_matrix_t *x, jpc_fix_t absstepsize)
1778 {
1779   int i;
1780   int j;
1781   int t;
1782
1783   assert(absstepsize >= 0);
1784   if (absstepsize == jpc_inttofix(1)) {
1785     return;
1786   }
1787
1788   for (i = 0; i < jas_matrix_numrows(x); ++i) {
1789     for (j = 0; j < jas_matrix_numcols(x); ++j) {
1790       t = jas_matrix_get(x, i, j);
1791       if (t) {
1792         t = jpc_fix_mul(t, absstepsize);
1793       } else {
1794         t = 0;
1795       }
1796       jas_matrix_set(x, i, j, t);
1797     }
1798   }
1799
1800 }
1801
1802 static void jpc_undo_roi(jas_matrix_t *x, int roishift, int bgshift, int numbps)
1803 {
1804   int i;
1805   int j;
1806   int thresh;
1807   jpc_fix_t val;
1808   jpc_fix_t mag;
1809   bool warn;
1810   uint_fast32_t mask;
1811
1812   if (roishift == 0 && bgshift == 0) {
1813     return;
1814   }
1815   thresh = 1 << roishift;
1816
1817   warn = false;
1818   for (i = 0; i < jas_matrix_numrows(x); ++i) {
1819     for (j = 0; j < jas_matrix_numcols(x); ++j) {
1820       val = jas_matrix_get(x, i, j);
1821       mag = JAS_ABS(val);
1822       if (mag >= thresh) {
1823         /* We are dealing with ROI data. */
1824         mag >>= roishift;
1825         val = (val < 0) ? (-mag) : mag;
1826         jas_matrix_set(x, i, j, val);
1827       } else {
1828         /* We are dealing with non-ROI (i.e., background) data. */
1829         mag <<= bgshift;
1830         mask = (1 << numbps) - 1;
1831         /* Perform a basic sanity check on the sample value. */
1832         /* Some implementations write garbage in the unused
1833           most-significant bit planes introduced by ROI shifting.
1834           Here we ensure that any such bits are masked off. */
1835         if (mag & (~mask)) {
1836           if (!warn) {
1837             fprintf(stderr,
1838               "warning: possibly corrupt code stream\n");
1839             warn = true;
1840           }
1841           mag &= mask;
1842         }
1843         val = (val < 0) ? (-mag) : mag;
1844         jas_matrix_set(x, i, j, val);
1845       }
1846     }
1847   }
1848 }
1849
1850 static jpc_dec_t *jpc_dec_create(jpc_dec_importopts_t *impopts, jas_stream_t *in)
1851 {
1852   jpc_dec_t *dec;
1853
1854   if (!(dec = jas_malloc(sizeof(jpc_dec_t)))) {
1855     return 0;
1856   }
1857
1858   dec->image = 0;
1859   dec->xstart = 0;
1860   dec->ystart = 0;
1861   dec->xend = 0;
1862   dec->yend = 0;
1863   dec->tilewidth = 0;
1864   dec->tileheight = 0;
1865   dec->tilexoff = 0;
1866   dec->tileyoff = 0;
1867   dec->numhtiles = 0;
1868   dec->numvtiles = 0;
1869   dec->numtiles = 0;
1870   dec->tiles = 0;
1871   dec->curtile = 0;
1872   dec->numcomps = 0;
1873   dec->in = in;
1874   dec->cp = 0;
1875   dec->maxlyrs = impopts->maxlyrs;
1876   dec->maxpkts = impopts->maxpkts;
1877 dec->numpkts = 0;
1878   dec->ppmseqno = 0;
1879   dec->state = 0;
1880   dec->cmpts = 0;
1881   dec->pkthdrstreams = 0;
1882   dec->ppmstab = 0;
1883   dec->curtileendoff = 0;
1884
1885   return dec;
1886 }
1887
1888 static void jpc_dec_destroy(jpc_dec_t *dec)
1889 {
1890   if (dec->cstate) {
1891     jpc_cstate_destroy(dec->cstate);
1892   }
1893   if (dec->pkthdrstreams) {
1894     jpc_streamlist_destroy(dec->pkthdrstreams);
1895   }
1896   if (dec->image) {
1897     jas_image_destroy(dec->image);
1898   }
1899
1900   if (dec->cp) {
1901     jpc_dec_cp_destroy(dec->cp);
1902   }
1903
1904   if (dec->cmpts) {
1905     jas_free(dec->cmpts);
1906   }
1907
1908   if (dec->tiles) {
1909     jas_free(dec->tiles);
1910   }
1911
1912   jas_free(dec);
1913 }
1914
1915 /******************************************************************************\
1916 *
1917 \******************************************************************************/
1918
1919 void jpc_seglist_insert(jpc_dec_seglist_t *list, jpc_dec_seg_t *ins, jpc_dec_seg_t *node)
1920 {
1921   jpc_dec_seg_t *prev;
1922   jpc_dec_seg_t *next;
1923
1924   prev = ins;
1925   node->prev = prev;
1926   next = prev ? (prev->next) : 0;
1927   node->prev = prev;
1928   node->next = next;
1929   if (prev) {
1930     prev->next = node;
1931   } else {
1932     list->head = node;
1933   }
1934   if (next) {
1935     next->prev = node;
1936   } else {
1937     list->tail = node;
1938   }
1939 }
1940
1941 void jpc_seglist_remove(jpc_dec_seglist_t *list, jpc_dec_seg_t *seg)
1942 {
1943   jpc_dec_seg_t *prev;
1944   jpc_dec_seg_t *next;
1945
1946   prev = seg->prev;
1947   next = seg->next;
1948   if (prev) {
1949     prev->next = next;
1950   } else {
1951     list->head = next;
1952   }
1953   if (next) {
1954     next->prev = prev;
1955   } else {
1956     list->tail = prev;
1957   }
1958   seg->prev = 0;
1959   seg->next = 0;
1960 }
1961
1962 jpc_dec_seg_t *jpc_seg_alloc()
1963 {
1964   jpc_dec_seg_t *seg;
1965
1966   if (!(seg = jas_malloc(sizeof(jpc_dec_seg_t)))) {
1967     return 0;
1968   }
1969   seg->prev = 0;
1970   seg->next = 0;
1971   seg->passno = -1;
1972   seg->numpasses = 0;
1973   seg->maxpasses = 0;
1974   seg->type = JPC_SEG_INVALID;
1975   seg->stream = 0;
1976   seg->cnt = 0;
1977   seg->complete = 0;
1978   seg->lyrno = -1;
1979   return seg;
1980 }
1981
1982 void jpc_seg_destroy(jpc_dec_seg_t *seg)
1983 {
1984   if (seg->stream) {
1985     jas_stream_close(seg->stream);
1986   }
1987   jas_free(seg);
1988 }
1989
1990 static int jpc_dec_dump(jpc_dec_t *dec, FILE *out)
1991 {
1992   jpc_dec_tile_t *tile;
1993   int tileno;
1994   jpc_dec_tcomp_t *tcomp;
1995   int compno;
1996   jpc_dec_rlvl_t *rlvl;
1997   int rlvlno;
1998   jpc_dec_band_t *band;
1999   int bandno;
2000   jpc_dec_prc_t *prc;
2001   int prcno;
2002   jpc_dec_cblk_t *cblk;
2003   int cblkno;
2004
2005   for (tileno = 0, tile = dec->tiles; tileno < dec->numtiles;
2006     ++tileno, ++tile) {
2007     for (compno = 0, tcomp = tile->tcomps; compno < dec->numcomps;
2008       ++compno, ++tcomp) {
2009       for (rlvlno = 0, rlvl = tcomp->rlvls; rlvlno <
2010         tcomp->numrlvls; ++rlvlno, ++rlvl) {
2011 fprintf(out, "RESOLUTION LEVEL %d\n", rlvlno);
2012 fprintf(out, "xs =%d, ys = %d, xe = %d, ye = %d, w = %d, h = %d\n",
2013   rlvl->xstart, rlvl->ystart, rlvl->xend, rlvl->yend, rlvl->xend -
2014   rlvl->xstart, rlvl->yend - rlvl->ystart);
2015         for (bandno = 0, band = rlvl->bands;
2016           bandno < rlvl->numbands; ++bandno, ++band) {
2017 fprintf(out, "BAND %d\n", bandno);
2018 fprintf(out, "xs =%d, ys = %d, xe = %d, ye = %d, w = %d, h = %d\n",
2019   jas_seq2d_xstart(band->data), jas_seq2d_ystart(band->data), jas_seq2d_xend(band->data),
2020   jas_seq2d_yend(band->data), jas_seq2d_xend(band->data) - jas_seq2d_xstart(band->data),
2021   jas_seq2d_yend(band->data) - jas_seq2d_ystart(band->data));
2022           for (prcno = 0, prc = band->prcs;
2023             prcno < rlvl->numprcs; ++prcno,
2024             ++prc) {
2025 fprintf(out, "CODE BLOCK GROUP %d\n", prcno);
2026 fprintf(out, "xs =%d, ys = %d, xe = %d, ye = %d, w = %d, h = %d\n",
2027   prc->xstart, prc->ystart, prc->xend, prc->yend, prc->xend -
2028   prc->xstart, prc->yend - prc->ystart);
2029             for (cblkno = 0, cblk =
2030               prc->cblks; cblkno <
2031               prc->numcblks; ++cblkno,
2032               ++cblk) {
2033 fprintf(out, "CODE BLOCK %d\n", cblkno);
2034 fprintf(out, "xs =%d, ys = %d, xe = %d, ye = %d, w = %d, h = %d\n",
2035   jas_seq2d_xstart(cblk->data), jas_seq2d_ystart(cblk->data), jas_seq2d_xend(cblk->data),
2036   jas_seq2d_yend(cblk->data), jas_seq2d_xend(cblk->data) - jas_seq2d_xstart(cblk->data),
2037   jas_seq2d_yend(cblk->data) - jas_seq2d_ystart(cblk->data));
2038             }
2039           }
2040         }
2041       }
2042     }
2043   }
2044
2045   return 0;
2046 }
2047
2048 jpc_streamlist_t *jpc_streamlist_create()
2049 {
2050   jpc_streamlist_t *streamlist;
2051   int i;
2052
2053   if (!(streamlist = jas_malloc(sizeof(jpc_streamlist_t)))) {
2054     return 0;
2055   }
2056   streamlist->numstreams = 0;
2057   streamlist->maxstreams = 100;
2058   if (!(streamlist->streams = jas_malloc(streamlist->maxstreams *
2059     sizeof(jas_stream_t *)))) {
2060     jas_free(streamlist);
2061     return 0;
2062   }
2063   for (i = 0; i < streamlist->maxstreams; ++i) {
2064     streamlist->streams[i] = 0;
2065   }
2066   return streamlist;
2067 }
2068
2069 int jpc_streamlist_insert(jpc_streamlist_t *streamlist, int streamno,
2070   jas_stream_t *stream)
2071 {
2072   jas_stream_t **newstreams;
2073   int newmaxstreams;
2074   int i;
2075   /* Grow the array of streams if necessary. */
2076   if (streamlist->numstreams >= streamlist->maxstreams) {
2077     newmaxstreams = streamlist->maxstreams + 1024;
2078     if (!(newstreams = jas_realloc(streamlist->streams,
2079       (newmaxstreams + 1024) * sizeof(jas_stream_t *)))) {
2080       return -1;
2081     }
2082     for (i = streamlist->numstreams; i < streamlist->maxstreams; ++i) {
2083       streamlist->streams[i] = 0;
2084     }
2085     streamlist->maxstreams = newmaxstreams;
2086     streamlist->streams = newstreams;
2087   }
2088   if (streamno != streamlist->numstreams) {
2089     /* Can only handle insertion at start of list. */
2090     return -1;
2091   }
2092   streamlist->streams[streamno] = stream;
2093   ++streamlist->numstreams;
2094   return 0;
2095 }
2096
2097 jas_stream_t *jpc_streamlist_remove(jpc_streamlist_t *streamlist, int streamno)
2098 {
2099   jas_stream_t *stream;
2100   int i;
2101   if (streamno >= streamlist->numstreams) {
2102     abort();
2103   }
2104   stream = streamlist->streams[streamno];
2105   for (i = streamno + 1; i < streamlist->numstreams; ++i) {
2106     streamlist->streams[i - 1] = streamlist->streams[i];
2107   }
2108   --streamlist->numstreams;
2109   return stream;
2110 }
2111
2112 void jpc_streamlist_destroy(jpc_streamlist_t *streamlist)
2113 {
2114   int streamno;
2115   if (streamlist->streams) {
2116     for (streamno = 0; streamno < streamlist->numstreams;
2117       ++streamno) {
2118       jas_stream_close(streamlist->streams[streamno]);
2119     }
2120     jas_free(streamlist->streams);
2121   }
2122   jas_free(streamlist);
2123 }
2124
2125 jas_stream_t *jpc_streamlist_get(jpc_streamlist_t *streamlist, int streamno)
2126 {
2127   assert(streamno < streamlist->numstreams);
2128   return streamlist->streams[streamno];
2129 }
2130
2131 int jpc_streamlist_numstreams(jpc_streamlist_t *streamlist)
2132 {
2133   return streamlist->numstreams;
2134 }
2135
2136 jpc_ppxstab_t *jpc_ppxstab_create()
2137 {
2138   jpc_ppxstab_t *tab;
2139
2140   if (!(tab = jas_malloc(sizeof(jpc_ppxstab_t)))) {
2141     return 0;
2142   }
2143   tab->numents = 0;
2144   tab->maxents = 0;
2145   tab->ents = 0;
2146   return tab;
2147 }
2148
2149 void jpc_ppxstab_destroy(jpc_ppxstab_t *tab)
2150 {
2151   int i;
2152   for (i = 0; i < tab->numents; ++i) {
2153     jpc_ppxstabent_destroy(tab->ents[i]);
2154   }
2155   if (tab->ents) {
2156     jas_free(tab->ents);
2157   }
2158   jas_free(tab);
2159 }
2160
2161 int jpc_ppxstab_grow(jpc_ppxstab_t *tab, int maxents)
2162 {
2163   jpc_ppxstabent_t **newents;
2164   if (tab->maxents < maxents) {
2165     newents = (tab->ents) ? jas_realloc(tab->ents, maxents *
2166       sizeof(jpc_ppxstabent_t *)) : jas_malloc(maxents * sizeof(jpc_ppxstabent_t *));
2167     if (!newents) {
2168       return -1;
2169     }
2170     tab->ents = newents;
2171     tab->maxents = maxents;
2172   }
2173   return 0;
2174 }
2175
2176 int jpc_ppxstab_insert(jpc_ppxstab_t *tab, jpc_ppxstabent_t *ent)
2177 {
2178   int inspt;
2179   int i;
2180
2181   for (i = 0; i < tab->numents; ++i) {
2182     if (tab->ents[i]->ind > ent->ind) {
2183       break;
2184     }
2185   }
2186   inspt = i;
2187
2188   if (tab->numents >= tab->maxents) {
2189     if (jpc_ppxstab_grow(tab, tab->maxents + 128)) {
2190       return -1;
2191     }
2192   }
2193
2194   for (i = tab->numents; i > inspt; --i) {
2195     tab->ents[i] = tab->ents[i - 1];
2196   }
2197   tab->ents[i] = ent;
2198   ++tab->numents;
2199
2200   return 0;
2201 }
2202
2203 jpc_streamlist_t *jpc_ppmstabtostreams(jpc_ppxstab_t *tab)
2204 {
2205   jpc_streamlist_t *streams;
2206   uchar *dataptr;
2207   uint_fast32_t datacnt;
2208   uint_fast32_t tpcnt;
2209   jpc_ppxstabent_t *ent;
2210   int entno;
2211   jas_stream_t *stream;
2212   int n;
2213
2214   if (!(streams = jpc_streamlist_create())) {
2215     goto error;
2216   }
2217
2218   if (!tab->numents) {
2219     return streams;
2220   }
2221
2222   entno = 0;
2223   ent = tab->ents[entno];
2224   dataptr = ent->data;
2225   datacnt = ent->len;
2226   for (;;) {
2227
2228     /* Get the length of the packet header data for the current
2229       tile-part. */
2230     if (datacnt < 4) {
2231       goto error;
2232     }
2233     if (!(stream = jas_stream_memopen(0, 0))) {
2234       goto error;
2235     }
2236     if (jpc_streamlist_insert(streams, jpc_streamlist_numstreams(streams),
2237       stream)) {
2238       goto error;
2239     }
2240     tpcnt = (dataptr[0] << 24) | (dataptr[1] << 16) | (dataptr[2] << 8)
2241       | dataptr[3];
2242     datacnt -= 4;
2243     dataptr += 4;
2244
2245     /* Get the packet header data for the current tile-part. */
2246     while (tpcnt) {
2247       if (!datacnt) {
2248         if (++entno >= tab->numents) {
2249           goto error;
2250         }
2251         ent = tab->ents[entno];
2252         dataptr = ent->data;
2253         datacnt = ent->len;
2254       }
2255       n = JAS_MIN(tpcnt, datacnt);
2256       if (jas_stream_write(stream, dataptr, n) != n) {
2257         goto error;
2258       }
2259       tpcnt -= n;
2260       dataptr += n;
2261       datacnt -= n;
2262     }
2263     jas_stream_rewind(stream);
2264     if (!datacnt) {
2265       if (++entno >= tab->numents) {
2266         break;
2267       }
2268       ent = tab->ents[entno];
2269       dataptr = ent->data;
2270       datacnt = ent->len;
2271     }
2272   }
2273
2274   return streams;
2275
2276 error:
2277   jpc_streamlist_destroy(streams);
2278   return 0;
2279 }
2280
2281 int jpc_pptstabwrite(jas_stream_t *out, jpc_ppxstab_t *tab)
2282 {
2283   int i;
2284   jpc_ppxstabent_t *ent;
2285   for (i = 0; i < tab->numents; ++i) {
2286     ent = tab->ents[i];
2287     if (jas_stream_write(out, ent->data, ent->len) != JAS_CAST(int, ent->len)) {
2288       return -1;
2289     }
2290   }
2291   return 0;
2292 }
2293
2294 jpc_ppxstabent_t *jpc_ppxstabent_create()
2295 {
2296   jpc_ppxstabent_t *ent;
2297   if (!(ent = jas_malloc(sizeof(jpc_ppxstabent_t)))) {
2298     return 0;
2299   }
2300   ent->data = 0;
2301   ent->len = 0;
2302   ent->ind = 0;
2303   return ent;
2304 }
2305
2306 void jpc_ppxstabent_destroy(jpc_ppxstabent_t *ent)
2307 {
2308   if (ent->data) {
2309     jas_free(ent->data);
2310   }
2311   jas_free(ent);
2312 }