Home | History | Annotate | Download | only in libjasper
      1 /*
      2  * Copyright (c) 1999-2000 Image Power, Inc. and the University of
      3  *   British Columbia.
      4  * Copyright (c) 2001-2003 Michael David Adams.
      5  * All rights reserved.
      6  */
      7 
      8 /* __START_OF_JASPER_LICENSE__
      9  *
     10  * JasPer License Version 2.0
     11  *
     12  * Copyright (c) 2001-2006 Michael David Adams
     13  * Copyright (c) 1999-2000 Image Power, Inc.
     14  * Copyright (c) 1999-2000 The University of British Columbia
     15  *
     16  * All rights reserved.
     17  *
     18  * Permission is hereby granted, free of charge, to any person (the
     19  * "User") obtaining a copy of this software and associated documentation
     20  * files (the "Software"), to deal in the Software without restriction,
     21  * including without limitation the rights to use, copy, modify, merge,
     22  * publish, distribute, and/or sell copies of the Software, and to permit
     23  * persons to whom the Software is furnished to do so, subject to the
     24  * following conditions:
     25  *
     26  * 1.  The above copyright notices and this permission notice (which
     27  * includes the disclaimer below) shall be included in all copies or
     28  * substantial portions of the Software.
     29  *
     30  * 2.  The name of a copyright holder shall not be used to endorse or
     31  * promote products derived from the Software without specific prior
     32  * written permission.
     33  *
     34  * THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS
     35  * LICENSE.  NO USE OF THE SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER
     36  * THIS DISCLAIMER.  THE SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS
     37  * "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
     38  * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
     39  * PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.  IN NO
     40  * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
     41  * INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
     42  * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
     43  * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
     44  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.  NO ASSURANCES ARE
     45  * PROVIDED BY THE COPYRIGHT HOLDERS THAT THE SOFTWARE DOES NOT INFRINGE
     46  * THE PATENT OR OTHER INTELLECTUAL PROPERTY RIGHTS OF ANY OTHER ENTITY.
     47  * EACH COPYRIGHT HOLDER DISCLAIMS ANY LIABILITY TO THE USER FOR CLAIMS
     48  * BROUGHT BY ANY OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL
     49  * PROPERTY RIGHTS OR OTHERWISE.  AS A CONDITION TO EXERCISING THE RIGHTS
     50  * GRANTED HEREUNDER, EACH USER HEREBY ASSUMES SOLE RESPONSIBILITY TO SECURE
     51  * ANY OTHER INTELLECTUAL PROPERTY RIGHTS NEEDED, IF ANY.  THE SOFTWARE
     52  * IS NOT FAULT-TOLERANT AND IS NOT INTENDED FOR USE IN MISSION-CRITICAL
     53  * SYSTEMS, SUCH AS THOSE USED IN THE OPERATION OF NUCLEAR FACILITIES,
     54  * AIRCRAFT NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL
     55  * SYSTEMS, DIRECT LIFE SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH
     56  * THE FAILURE OF THE SOFTWARE OR SYSTEM COULD LEAD DIRECTLY TO DEATH,
     57  * PERSONAL INJURY, OR SEVERE PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH
     58  * RISK ACTIVITIES").  THE COPYRIGHT HOLDERS SPECIFICALLY DISCLAIM ANY
     59  * EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR HIGH RISK ACTIVITIES.
     60  *
     61  * __END_OF_JASPER_LICENSE__
     62  */
     63 
     64 /*
     65  * $Id: jpc_dec.c,v 1.2 2008-05-26 09:40:52 vp153 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             jas_eprintf("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             jas_eprintf("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             jas_eprintf("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_alloc2(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         jas_eprintf("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         jas_eprintf("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             jas_eprintf("warning: ignoring trailing garbage (%lu bytes)\n",
    604               (unsigned long) n);
    605 
    606             while (n-- > 0) {
    607                 if (jas_stream_getc(dec->in) == EOF) {
    608                     jas_eprintf("read error\n");
    609                     return -1;
    610                 }
    611             }
    612         } else if (curoff > dec->curtileendoff) {
    613             jas_eprintf("warning: not enough tile data (%lu bytes)\n",
    614               (unsigned long) curoff - dec->curtileendoff);
    615         }
    616 
    617     }
    618 
    619     if (tile->numparts > 0 && tile->partno == tile->numparts - 1) {
    620         if (jpc_dec_tiledecode(dec, tile)) {
    621             return -1;
    622         }
    623         jpc_dec_tilefini(dec, tile);
    624     }
    625 
    626     dec->curtile = 0;
    627 
    628     /* Increment the expected tile-part number. */
    629     ++tile->partno;
    630 
    631     /* We should expect to encounter a SOT marker segment next. */
    632     dec->state = JPC_TPHSOT;
    633 
    634     return 0;
    635 }
    636 
    637 static int jpc_dec_tileinit(jpc_dec_t *dec, jpc_dec_tile_t *tile)
    638 {
    639     jpc_dec_tcomp_t *tcomp;
    640     int compno;
    641     int rlvlno;
    642     jpc_dec_rlvl_t *rlvl;
    643     jpc_dec_band_t *band;
    644     jpc_dec_prc_t *prc;
    645     int bndno;
    646     jpc_tsfb_band_t *bnd;
    647     int bandno;
    648     jpc_dec_ccp_t *ccp;
    649     int prccnt;
    650     jpc_dec_cblk_t *cblk;
    651     int cblkcnt;
    652     uint_fast32_t tlprcxstart;
    653     uint_fast32_t tlprcystart;
    654     uint_fast32_t brprcxend;
    655     uint_fast32_t brprcyend;
    656     uint_fast32_t tlcbgxstart;
    657     uint_fast32_t tlcbgystart;
    658     uint_fast32_t brcbgxend;
    659     uint_fast32_t brcbgyend;
    660     uint_fast32_t cbgxstart;
    661     uint_fast32_t cbgystart;
    662     uint_fast32_t cbgxend;
    663     uint_fast32_t cbgyend;
    664     uint_fast32_t tlcblkxstart;
    665     uint_fast32_t tlcblkystart;
    666     uint_fast32_t brcblkxend;
    667     uint_fast32_t brcblkyend;
    668     uint_fast32_t cblkxstart;
    669     uint_fast32_t cblkystart;
    670     uint_fast32_t cblkxend;
    671     uint_fast32_t cblkyend;
    672     uint_fast32_t tmpxstart;
    673     uint_fast32_t tmpystart;
    674     uint_fast32_t tmpxend;
    675     uint_fast32_t tmpyend;
    676     jpc_dec_cp_t *cp;
    677     jpc_tsfb_band_t bnds[64];
    678     jpc_pchg_t *pchg;
    679     int pchgno;
    680     jpc_dec_cmpt_t *cmpt;
    681 
    682     cp = tile->cp;
    683     tile->realmode = 0;
    684     if (cp->mctid == JPC_MCT_ICT) {
    685         tile->realmode = 1;
    686     }
    687 
    688     for (compno = 0, tcomp = tile->tcomps, cmpt = dec->cmpts; compno <
    689       dec->numcomps; ++compno, ++tcomp, ++cmpt) {
    690         ccp = &tile->cp->ccps[compno];
    691         if (ccp->qmfbid == JPC_COX_INS) {
    692             tile->realmode = 1;
    693         }
    694         tcomp->numrlvls = ccp->numrlvls;
    695         if (!(tcomp->rlvls = jas_alloc2(tcomp->numrlvls,
    696           sizeof(jpc_dec_rlvl_t)))) {
    697             return -1;
    698         }
    699         if (!(tcomp->data = jas_seq2d_create(JPC_CEILDIV(tile->xstart,
    700           cmpt->hstep), JPC_CEILDIV(tile->ystart, cmpt->vstep),
    701           JPC_CEILDIV(tile->xend, cmpt->hstep), JPC_CEILDIV(tile->yend,
    702           cmpt->vstep)))) {
    703             return -1;
    704         }
    705         if (!(tcomp->tsfb = jpc_cod_gettsfb(ccp->qmfbid,
    706           tcomp->numrlvls - 1))) {
    707             return -1;
    708         }
    709 {
    710     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);
    711 }
    712         for (rlvlno = 0, rlvl = tcomp->rlvls; rlvlno < tcomp->numrlvls;
    713           ++rlvlno, ++rlvl) {
    714 rlvl->bands = 0;
    715             rlvl->xstart = JPC_CEILDIVPOW2(tcomp->xstart,
    716               tcomp->numrlvls - 1 - rlvlno);
    717             rlvl->ystart = JPC_CEILDIVPOW2(tcomp->ystart,
    718               tcomp->numrlvls - 1 - rlvlno);
    719             rlvl->xend = JPC_CEILDIVPOW2(tcomp->xend,
    720               tcomp->numrlvls - 1 - rlvlno);
    721             rlvl->yend = JPC_CEILDIVPOW2(tcomp->yend,
    722               tcomp->numrlvls - 1 - rlvlno);
    723             rlvl->prcwidthexpn = ccp->prcwidthexpns[rlvlno];
    724             rlvl->prcheightexpn = ccp->prcheightexpns[rlvlno];
    725             tlprcxstart = JPC_FLOORDIVPOW2(rlvl->xstart,
    726               rlvl->prcwidthexpn) << rlvl->prcwidthexpn;
    727             tlprcystart = JPC_FLOORDIVPOW2(rlvl->ystart,
    728               rlvl->prcheightexpn) << rlvl->prcheightexpn;
    729             brprcxend = JPC_CEILDIVPOW2(rlvl->xend,
    730               rlvl->prcwidthexpn) << rlvl->prcwidthexpn;
    731             brprcyend = JPC_CEILDIVPOW2(rlvl->yend,
    732               rlvl->prcheightexpn) << rlvl->prcheightexpn;
    733             rlvl->numhprcs = (brprcxend - tlprcxstart) >>
    734               rlvl->prcwidthexpn;
    735             rlvl->numvprcs = (brprcyend - tlprcystart) >>
    736               rlvl->prcheightexpn;
    737             rlvl->numprcs = rlvl->numhprcs * rlvl->numvprcs;
    738 
    739             if (rlvl->xstart >= rlvl->xend || rlvl->ystart >= rlvl->yend) {
    740                 rlvl->bands = 0;
    741                 rlvl->numprcs = 0;
    742                 rlvl->numhprcs = 0;
    743                 rlvl->numvprcs = 0;
    744                 continue;
    745             }
    746             if (!rlvlno) {
    747                 tlcbgxstart = tlprcxstart;
    748                 tlcbgystart = tlprcystart;
    749                 brcbgxend = brprcxend;
    750                 brcbgyend = brprcyend;
    751                 rlvl->cbgwidthexpn = rlvl->prcwidthexpn;
    752                 rlvl->cbgheightexpn = rlvl->prcheightexpn;
    753             } else {
    754                 tlcbgxstart = JPC_CEILDIVPOW2(tlprcxstart, 1);
    755                 tlcbgystart = JPC_CEILDIVPOW2(tlprcystart, 1);
    756                 brcbgxend = JPC_CEILDIVPOW2(brprcxend, 1);
    757                 brcbgyend = JPC_CEILDIVPOW2(brprcyend, 1);
    758                 rlvl->cbgwidthexpn = rlvl->prcwidthexpn - 1;
    759                 rlvl->cbgheightexpn = rlvl->prcheightexpn - 1;
    760             }
    761             rlvl->cblkwidthexpn = JAS_MIN(ccp->cblkwidthexpn,
    762               rlvl->cbgwidthexpn);
    763             rlvl->cblkheightexpn = JAS_MIN(ccp->cblkheightexpn,
    764               rlvl->cbgheightexpn);
    765 
    766             rlvl->numbands = (!rlvlno) ? 1 : 3;
    767             if (!(rlvl->bands = jas_alloc2(rlvl->numbands,
    768               sizeof(jpc_dec_band_t)))) {
    769                 return -1;
    770             }
    771             for (bandno = 0, band = rlvl->bands;
    772               bandno < rlvl->numbands; ++bandno, ++band) {
    773                 bndno = (!rlvlno) ? 0 : (3 * (rlvlno - 1) +
    774                   bandno + 1);
    775                 bnd = &bnds[bndno];
    776 
    777                 band->orient = bnd->orient;
    778                 band->stepsize = ccp->stepsizes[bndno];
    779                 band->analgain = JPC_NOMINALGAIN(ccp->qmfbid,
    780                   tcomp->numrlvls - 1, rlvlno, band->orient);
    781                 band->absstepsize = jpc_calcabsstepsize(band->stepsize,
    782                   cmpt->prec + band->analgain);
    783                 band->numbps = ccp->numguardbits +
    784                   JPC_QCX_GETEXPN(band->stepsize) - 1;
    785                 band->roishift = (ccp->roishift + band->numbps >= JPC_PREC) ?
    786                   (JPC_PREC - 1 - band->numbps) : ccp->roishift;
    787                 band->data = 0;
    788                 band->prcs = 0;
    789                 if (bnd->xstart == bnd->xend || bnd->ystart == bnd->yend) {
    790                     continue;
    791                 }
    792                 if (!(band->data = jas_seq2d_create(0, 0, 0, 0))) {
    793                     return -1;
    794                 }
    795                 jas_seq2d_bindsub(band->data, tcomp->data, bnd->locxstart, bnd->locystart, bnd->locxend, bnd->locyend);
    796                 jas_seq2d_setshift(band->data, bnd->xstart, bnd->ystart);
    797 
    798                 assert(rlvl->numprcs);
    799 
    800                 if (!(band->prcs = jas_alloc2(rlvl->numprcs, sizeof(jpc_dec_prc_t)))) {
    801                     return -1;
    802                 }
    803 
    804 /************************************************/
    805     cbgxstart = tlcbgxstart;
    806     cbgystart = tlcbgystart;
    807     for (prccnt = rlvl->numprcs, prc = band->prcs;
    808       prccnt > 0; --prccnt, ++prc) {
    809         cbgxend = cbgxstart + (1 << rlvl->cbgwidthexpn);
    810         cbgyend = cbgystart + (1 << rlvl->cbgheightexpn);
    811         prc->xstart = JAS_MAX(cbgxstart, JAS_CAST(uint_fast32_t, jas_seq2d_xstart(band->data)));
    812         prc->ystart = JAS_MAX(cbgystart, JAS_CAST(uint_fast32_t, jas_seq2d_ystart(band->data)));
    813         prc->xend = JAS_MIN(cbgxend, JAS_CAST(uint_fast32_t, jas_seq2d_xend(band->data)));
    814         prc->yend = JAS_MIN(cbgyend, JAS_CAST(uint_fast32_t, jas_seq2d_yend(band->data)));
    815         if (prc->xend > prc->xstart && prc->yend > prc->ystart) {
    816             tlcblkxstart = JPC_FLOORDIVPOW2(prc->xstart,
    817               rlvl->cblkwidthexpn) << rlvl->cblkwidthexpn;
    818             tlcblkystart = JPC_FLOORDIVPOW2(prc->ystart,
    819               rlvl->cblkheightexpn) << rlvl->cblkheightexpn;
    820             brcblkxend = JPC_CEILDIVPOW2(prc->xend,
    821               rlvl->cblkwidthexpn) << rlvl->cblkwidthexpn;
    822             brcblkyend = JPC_CEILDIVPOW2(prc->yend,
    823               rlvl->cblkheightexpn) << rlvl->cblkheightexpn;
    824             prc->numhcblks = (brcblkxend - tlcblkxstart) >>
    825               rlvl->cblkwidthexpn;
    826             prc->numvcblks = (brcblkyend - tlcblkystart) >>
    827               rlvl->cblkheightexpn;
    828             prc->numcblks = prc->numhcblks * prc->numvcblks;
    829             assert(prc->numcblks > 0);
    830 
    831             if (!(prc->incltagtree = jpc_tagtree_create(prc->numhcblks, prc->numvcblks))) {
    832                 return -1;
    833             }
    834             if (!(prc->numimsbstagtree = jpc_tagtree_create(prc->numhcblks, prc->numvcblks))) {
    835                 return -1;
    836             }
    837             if (!(prc->cblks = jas_alloc2(prc->numcblks, sizeof(jpc_dec_cblk_t)))) {
    838                 return -1;
    839             }
    840 
    841             cblkxstart = cbgxstart;
    842             cblkystart = cbgystart;
    843             for (cblkcnt = prc->numcblks, cblk = prc->cblks; cblkcnt > 0;) {
    844                 cblkxend = cblkxstart + (1 << rlvl->cblkwidthexpn);
    845                 cblkyend = cblkystart + (1 << rlvl->cblkheightexpn);
    846                 tmpxstart = JAS_MAX(cblkxstart, prc->xstart);
    847                 tmpystart = JAS_MAX(cblkystart, prc->ystart);
    848                 tmpxend = JAS_MIN(cblkxend, prc->xend);
    849                 tmpyend = JAS_MIN(cblkyend, prc->yend);
    850                 if (tmpxend > tmpxstart && tmpyend > tmpystart) {
    851                     cblk->firstpassno = -1;
    852                     cblk->mqdec = 0;
    853                     cblk->nulldec = 0;
    854                     cblk->flags = 0;
    855                     cblk->numpasses = 0;
    856                     cblk->segs.head = 0;
    857                     cblk->segs.tail = 0;
    858                     cblk->curseg = 0;
    859                     cblk->numimsbs = 0;
    860                     cblk->numlenbits = 3;
    861                     cblk->flags = 0;
    862                     if (!(cblk->data = jas_seq2d_create(0, 0, 0, 0))) {
    863                         return -1;
    864                     }
    865                     jas_seq2d_bindsub(cblk->data, band->data, tmpxstart, tmpystart, tmpxend, tmpyend);
    866                     ++cblk;
    867                     --cblkcnt;
    868                 }
    869                 cblkxstart += 1 << rlvl->cblkwidthexpn;
    870                 if (cblkxstart >= cbgxend) {
    871                     cblkxstart = cbgxstart;
    872                     cblkystart += 1 << rlvl->cblkheightexpn;
    873                 }
    874             }
    875 
    876         } else {
    877             prc->cblks = 0;
    878             prc->incltagtree = 0;
    879             prc->numimsbstagtree = 0;
    880         }
    881         cbgxstart += 1 << rlvl->cbgwidthexpn;
    882         if (cbgxstart >= brcbgxend) {
    883             cbgxstart = tlcbgxstart;
    884             cbgystart += 1 << rlvl->cbgheightexpn;
    885         }
    886 
    887     }
    888 /********************************************/
    889             }
    890         }
    891     }
    892 
    893 if (!(tile->pi = jpc_dec_pi_create(dec, tile)))
    894 {
    895     return -1;
    896 }
    897 
    898     for (pchgno = 0; pchgno < jpc_pchglist_numpchgs(tile->cp->pchglist);
    899       ++pchgno) {
    900         pchg = jpc_pchg_copy(jpc_pchglist_get(tile->cp->pchglist, pchgno));
    901         assert(pchg);
    902         jpc_pi_addpchg(tile->pi, pchg);
    903     }
    904     jpc_pi_init(tile->pi);
    905 
    906     return 0;
    907 }
    908 
    909 static int jpc_dec_tilefini(jpc_dec_t *dec, jpc_dec_tile_t *tile)
    910 {
    911     jpc_dec_tcomp_t *tcomp;
    912     int compno;
    913     int bandno;
    914     int rlvlno;
    915     jpc_dec_band_t *band;
    916     jpc_dec_rlvl_t *rlvl;
    917     int prcno;
    918     jpc_dec_prc_t *prc;
    919     jpc_dec_seg_t *seg;
    920     jpc_dec_cblk_t *cblk;
    921     int cblkno;
    922 
    923 if (tile->tcomps) {
    924 
    925     for (compno = 0, tcomp = tile->tcomps; compno < dec->numcomps;
    926       ++compno, ++tcomp) {
    927         for (rlvlno = 0, rlvl = tcomp->rlvls; rlvlno < tcomp->numrlvls;
    928           ++rlvlno, ++rlvl) {
    929 if (!rlvl->bands) {
    930     continue;
    931 }
    932             for (bandno = 0, band = rlvl->bands; bandno < rlvl->numbands; ++bandno, ++band) {
    933 if (band->prcs) {
    934                 for (prcno = 0, prc = band->prcs; prcno <
    935                   rlvl->numprcs; ++prcno, ++prc) {
    936 if (!prc->cblks) {
    937     continue;
    938 }
    939                     for (cblkno = 0, cblk = prc->cblks; cblkno < prc->numcblks; ++cblkno, ++cblk) {
    940 
    941     while (cblk->segs.head) {
    942         seg = cblk->segs.head;
    943         jpc_seglist_remove(&cblk->segs, seg);
    944         jpc_seg_destroy(seg);
    945     }
    946     jas_matrix_destroy(cblk->data);
    947     if (cblk->mqdec) {
    948         jpc_mqdec_destroy(cblk->mqdec);
    949     }
    950     if (cblk->nulldec) {
    951         jpc_bitstream_close(cblk->nulldec);
    952     }
    953     if (cblk->flags) {
    954         jas_matrix_destroy(cblk->flags);
    955     }
    956                     }
    957                     if (prc->incltagtree) {
    958                         jpc_tagtree_destroy(prc->incltagtree);
    959                     }
    960                     if (prc->numimsbstagtree) {
    961                         jpc_tagtree_destroy(prc->numimsbstagtree);
    962                     }
    963                     if (prc->cblks) {
    964                         jas_free(prc->cblks);
    965                     }
    966                 }
    967 }
    968                 if (band->data) {
    969                     jas_matrix_destroy(band->data);
    970                 }
    971                 if (band->prcs) {
    972                     jas_free(band->prcs);
    973                 }
    974             }
    975             if (rlvl->bands) {
    976                 jas_free(rlvl->bands);
    977             }
    978         }
    979         if (tcomp->rlvls) {
    980             jas_free(tcomp->rlvls);
    981         }
    982         if (tcomp->data) {
    983             jas_matrix_destroy(tcomp->data);
    984         }
    985         if (tcomp->tsfb) {
    986             jpc_tsfb_destroy(tcomp->tsfb);
    987         }
    988     }
    989 }
    990     if (tile->cp) {
    991         jpc_dec_cp_destroy(tile->cp);
    992         tile->cp = 0;
    993     }
    994     if (tile->tcomps) {
    995         jas_free(tile->tcomps);
    996         tile->tcomps = 0;
    997     }
    998     if (tile->pi) {
    999         jpc_pi_destroy(tile->pi);
   1000         tile->pi = 0;
   1001     }
   1002     if (tile->pkthdrstream) {
   1003         jas_stream_close(tile->pkthdrstream);
   1004         tile->pkthdrstream = 0;
   1005     }
   1006     if (tile->pptstab) {
   1007         jpc_ppxstab_destroy(tile->pptstab);
   1008         tile->pptstab = 0;
   1009     }
   1010 
   1011     tile->state = JPC_TILE_DONE;
   1012 
   1013     return 0;
   1014 }
   1015 
   1016 static int jpc_dec_tiledecode(jpc_dec_t *dec, jpc_dec_tile_t *tile)
   1017 {
   1018     int i;
   1019     int j;
   1020     jpc_dec_tcomp_t *tcomp;
   1021     jpc_dec_rlvl_t *rlvl;
   1022     jpc_dec_band_t *band;
   1023     int compno;
   1024     int rlvlno;
   1025     int bandno;
   1026     int adjust;
   1027     int v;
   1028     jpc_dec_ccp_t *ccp;
   1029     jpc_dec_cmpt_t *cmpt;
   1030 
   1031     if (jpc_dec_decodecblks(dec, tile)) {
   1032         jas_eprintf("jpc_dec_decodecblks failed\n");
   1033         return -1;
   1034     }
   1035 
   1036     /* Perform dequantization. */
   1037     for (compno = 0, tcomp = tile->tcomps; compno < dec->numcomps;
   1038       ++compno, ++tcomp) {
   1039         ccp = &tile->cp->ccps[compno];
   1040         for (rlvlno = 0, rlvl = tcomp->rlvls; rlvlno < tcomp->numrlvls;
   1041           ++rlvlno, ++rlvl) {
   1042             if (!rlvl->bands) {
   1043                 continue;
   1044             }
   1045             for (bandno = 0, band = rlvl->bands;
   1046               bandno < rlvl->numbands; ++bandno, ++band) {
   1047                 if (!band->data) {
   1048                     continue;
   1049                 }
   1050                 jpc_undo_roi(band->data, band->roishift, ccp->roishift -
   1051                   band->roishift, band->numbps);
   1052                 if (tile->realmode) {
   1053                     jas_matrix_asl(band->data, JPC_FIX_FRACBITS);
   1054                     jpc_dequantize(band->data, band->absstepsize);
   1055                 }
   1056 
   1057             }
   1058         }
   1059     }
   1060 
   1061     /* Apply an inverse wavelet transform if necessary. */
   1062     for (compno = 0, tcomp = tile->tcomps; compno < dec->numcomps;
   1063       ++compno, ++tcomp) {
   1064         ccp = &tile->cp->ccps[compno];
   1065         jpc_tsfb_synthesize(tcomp->tsfb, tcomp->data);
   1066     }
   1067 
   1068 
   1069     /* Apply an inverse intercomponent transform if necessary. */
   1070     switch (tile->cp->mctid) {
   1071     case JPC_MCT_RCT:
   1072         assert(dec->numcomps == 3 || dec->numcomps == 4);
   1073         jpc_irct(tile->tcomps[0].data, tile->tcomps[1].data,
   1074           tile->tcomps[2].data);
   1075         break;
   1076     case JPC_MCT_ICT:
   1077         assert(dec->numcomps == 3 || dec->numcomps == 4);
   1078         jpc_iict(tile->tcomps[0].data, tile->tcomps[1].data,
   1079           tile->tcomps[2].data);
   1080         break;
   1081     }
   1082 
   1083     /* Perform rounding and convert to integer values. */
   1084     if (tile->realmode) {
   1085         for (compno = 0, tcomp = tile->tcomps; compno < dec->numcomps;
   1086           ++compno, ++tcomp) {
   1087             for (i = 0; i < jas_matrix_numrows(tcomp->data); ++i) {
   1088                 for (j = 0; j < jas_matrix_numcols(tcomp->data); ++j) {
   1089                     v = jas_matrix_get(tcomp->data, i, j);
   1090                     v = jpc_fix_round(v);
   1091                     jas_matrix_set(tcomp->data, i, j, jpc_fixtoint(v));
   1092                 }
   1093             }
   1094         }
   1095     }
   1096 
   1097     /* Perform level shift. */
   1098     for (compno = 0, tcomp = tile->tcomps, cmpt = dec->cmpts; compno <
   1099       dec->numcomps; ++compno, ++tcomp, ++cmpt) {
   1100         adjust = cmpt->sgnd ? 0 : (1 << (cmpt->prec - 1));
   1101         for (i = 0; i < jas_matrix_numrows(tcomp->data); ++i) {
   1102             for (j = 0; j < jas_matrix_numcols(tcomp->data); ++j) {
   1103                 *jas_matrix_getref(tcomp->data, i, j) += adjust;
   1104             }
   1105         }
   1106     }
   1107 
   1108     /* Perform clipping. */
   1109     for (compno = 0, tcomp = tile->tcomps, cmpt = dec->cmpts; compno <
   1110       dec->numcomps; ++compno, ++tcomp, ++cmpt) {
   1111         jpc_fix_t mn;
   1112         jpc_fix_t mx;
   1113         mn = cmpt->sgnd ? (-(1 << (cmpt->prec - 1))) : (0);
   1114         mx = cmpt->sgnd ? ((1 << (cmpt->prec - 1)) - 1) : ((1 <<
   1115           cmpt->prec) - 1);
   1116         jas_matrix_clip(tcomp->data, mn, mx);
   1117     }
   1118 
   1119     /* XXX need to free tsfb struct */
   1120 
   1121     /* Write the data for each component of the image. */
   1122     for (compno = 0, tcomp = tile->tcomps, cmpt = dec->cmpts; compno <
   1123       dec->numcomps; ++compno, ++tcomp, ++cmpt) {
   1124         if (jas_image_writecmpt(dec->image, compno, tcomp->xstart -
   1125           JPC_CEILDIV(dec->xstart, cmpt->hstep), tcomp->ystart -
   1126           JPC_CEILDIV(dec->ystart, cmpt->vstep), jas_matrix_numcols(
   1127           tcomp->data), jas_matrix_numrows(tcomp->data), tcomp->data)) {
   1128             jas_eprintf("write component failed\n");
   1129             return -4;
   1130         }
   1131     }
   1132 
   1133     return 0;
   1134 }
   1135 
   1136 static int jpc_dec_process_eoc(jpc_dec_t *dec, jpc_ms_t *ms)
   1137 {
   1138     int tileno;
   1139     jpc_dec_tile_t *tile;
   1140 
   1141     /* Eliminate compiler warnings about unused variables. */
   1142     ms = 0;
   1143 
   1144     for (tileno = 0, tile = dec->tiles; tileno < dec->numtiles; ++tileno,
   1145       ++tile) {
   1146         if (tile->state == JPC_TILE_ACTIVE) {
   1147             if (jpc_dec_tiledecode(dec, tile)) {
   1148                 return -1;
   1149             }
   1150         }
   1151         jpc_dec_tilefini(dec, tile);
   1152     }
   1153 
   1154     /* We are done processing the code stream. */
   1155     dec->state = JPC_MT;
   1156 
   1157     return 1;
   1158 }
   1159 
   1160 static int jpc_dec_process_siz(jpc_dec_t *dec, jpc_ms_t *ms)
   1161 {
   1162     jpc_siz_t *siz = &ms->parms.siz;
   1163     int compno;
   1164     int tileno;
   1165     jpc_dec_tile_t *tile;
   1166     jpc_dec_tcomp_t *tcomp;
   1167     int htileno;
   1168     int vtileno;
   1169     jpc_dec_cmpt_t *cmpt;
   1170 
   1171     dec->xstart = siz->xoff;
   1172     dec->ystart = siz->yoff;
   1173     dec->xend = siz->width;
   1174     dec->yend = siz->height;
   1175     dec->tilewidth = siz->tilewidth;
   1176     dec->tileheight = siz->tileheight;
   1177     dec->tilexoff = siz->tilexoff;
   1178     dec->tileyoff = siz->tileyoff;
   1179     dec->numcomps = siz->numcomps;
   1180     if (!(dec->cp = jpc_dec_cp_create(dec->numcomps))) {
   1181         return -1;
   1182     }
   1183 
   1184     if (!(dec->cmpts = jas_alloc2(dec->numcomps, sizeof(jpc_dec_cmpt_t)))) {
   1185         return -1;
   1186     }
   1187 
   1188     for (compno = 0, cmpt = dec->cmpts; compno < dec->numcomps; ++compno,
   1189       ++cmpt) {
   1190         cmpt->prec = siz->comps[compno].prec;
   1191         cmpt->sgnd = siz->comps[compno].sgnd;
   1192         cmpt->hstep = siz->comps[compno].hsamp;
   1193         cmpt->vstep = siz->comps[compno].vsamp;
   1194         cmpt->width = JPC_CEILDIV(dec->xend, cmpt->hstep) -
   1195           JPC_CEILDIV(dec->xstart, cmpt->hstep);
   1196         cmpt->height = JPC_CEILDIV(dec->yend, cmpt->vstep) -
   1197           JPC_CEILDIV(dec->ystart, cmpt->vstep);
   1198         cmpt->hsubstep = 0;
   1199         cmpt->vsubstep = 0;
   1200     }
   1201 
   1202     dec->image = 0;
   1203 
   1204     dec->numhtiles = JPC_CEILDIV(dec->xend - dec->tilexoff, dec->tilewidth);
   1205     dec->numvtiles = JPC_CEILDIV(dec->yend - dec->tileyoff, dec->tileheight);
   1206     dec->numtiles = dec->numhtiles * dec->numvtiles;
   1207     if (!(dec->tiles = jas_alloc2(dec->numtiles, sizeof(jpc_dec_tile_t)))) {
   1208         return -1;
   1209     }
   1210 
   1211     for (tileno = 0, tile = dec->tiles; tileno < dec->numtiles; ++tileno,
   1212       ++tile) {
   1213         htileno = tileno % dec->numhtiles;
   1214         vtileno = tileno / dec->numhtiles;
   1215         tile->realmode = 0;
   1216         tile->state = JPC_TILE_INIT;
   1217         tile->xstart = JAS_MAX(dec->tilexoff + htileno * dec->tilewidth,
   1218           dec->xstart);
   1219         tile->ystart = JAS_MAX(dec->tileyoff + vtileno * dec->tileheight,
   1220           dec->ystart);
   1221         tile->xend = JAS_MIN(dec->tilexoff + (htileno + 1) *
   1222           dec->tilewidth, dec->xend);
   1223         tile->yend = JAS_MIN(dec->tileyoff + (vtileno + 1) *
   1224           dec->tileheight, dec->yend);
   1225         tile->numparts = 0;
   1226         tile->partno = 0;
   1227         tile->pkthdrstream = 0;
   1228         tile->pkthdrstreampos = 0;
   1229         tile->pptstab = 0;
   1230         tile->cp = 0;
   1231         if (!(tile->tcomps = jas_alloc2(dec->numcomps,
   1232           sizeof(jpc_dec_tcomp_t)))) {
   1233             return -1;
   1234         }
   1235         for (compno = 0, cmpt = dec->cmpts, tcomp = tile->tcomps;
   1236           compno < dec->numcomps; ++compno, ++cmpt, ++tcomp) {
   1237             tcomp->rlvls = 0;
   1238             tcomp->data = 0;
   1239             tcomp->xstart = JPC_CEILDIV(tile->xstart, cmpt->hstep);
   1240             tcomp->ystart = JPC_CEILDIV(tile->ystart, cmpt->vstep);
   1241             tcomp->xend = JPC_CEILDIV(tile->xend, cmpt->hstep);
   1242             tcomp->yend = JPC_CEILDIV(tile->yend, cmpt->vstep);
   1243             tcomp->tsfb = 0;
   1244         }
   1245     }
   1246 
   1247     dec->pkthdrstreams = 0;
   1248 
   1249     /* We should expect to encounter other main header marker segments
   1250       or an SOT marker segment next. */
   1251     dec->state = JPC_MH;
   1252 
   1253     return 0;
   1254 }
   1255 
   1256 static int jpc_dec_process_cod(jpc_dec_t *dec, jpc_ms_t *ms)
   1257 {
   1258     jpc_cod_t *cod = &ms->parms.cod;
   1259     jpc_dec_tile_t *tile;
   1260 
   1261     switch (dec->state) {
   1262     case JPC_MH:
   1263         jpc_dec_cp_setfromcod(dec->cp, cod);
   1264         break;
   1265     case JPC_TPH:
   1266         if (!(tile = dec->curtile)) {
   1267             return -1;
   1268         }
   1269         if (tile->partno != 0) {
   1270             return -1;
   1271         }
   1272         jpc_dec_cp_setfromcod(tile->cp, cod);
   1273         break;
   1274     }
   1275     return 0;
   1276 }
   1277 
   1278 static int jpc_dec_process_coc(jpc_dec_t *dec, jpc_ms_t *ms)
   1279 {
   1280     jpc_coc_t *coc = &ms->parms.coc;
   1281     jpc_dec_tile_t *tile;
   1282 
   1283     if (JAS_CAST(int, coc->compno) > dec->numcomps) {
   1284         jas_eprintf("invalid component number in COC marker segment\n");
   1285         return -1;
   1286     }
   1287     switch (dec->state) {
   1288     case JPC_MH:
   1289         jpc_dec_cp_setfromcoc(dec->cp, coc);
   1290         break;
   1291     case JPC_TPH:
   1292         if (!(tile = dec->curtile)) {
   1293             return -1;
   1294         }
   1295         if (tile->partno > 0) {
   1296             return -1;
   1297         }
   1298         jpc_dec_cp_setfromcoc(tile->cp, coc);
   1299         break;
   1300     }
   1301     return 0;
   1302 }
   1303 
   1304 static int jpc_dec_process_rgn(jpc_dec_t *dec, jpc_ms_t *ms)
   1305 {
   1306     jpc_rgn_t *rgn = &ms->parms.rgn;
   1307     jpc_dec_tile_t *tile;
   1308 
   1309     if (JAS_CAST(int, rgn->compno) > dec->numcomps) {
   1310         jas_eprintf("invalid component number in RGN marker segment\n");
   1311         return -1;
   1312     }
   1313     switch (dec->state) {
   1314     case JPC_MH:
   1315         jpc_dec_cp_setfromrgn(dec->cp, rgn);
   1316         break;
   1317     case JPC_TPH:
   1318         if (!(tile = dec->curtile)) {
   1319             return -1;
   1320         }
   1321         if (tile->partno > 0) {
   1322             return -1;
   1323         }
   1324         jpc_dec_cp_setfromrgn(tile->cp, rgn);
   1325         break;
   1326     }
   1327 
   1328     return 0;
   1329 }
   1330 
   1331 static int jpc_dec_process_qcd(jpc_dec_t *dec, jpc_ms_t *ms)
   1332 {
   1333     jpc_qcd_t *qcd = &ms->parms.qcd;
   1334     jpc_dec_tile_t *tile;
   1335 
   1336     switch (dec->state) {
   1337     case JPC_MH:
   1338         jpc_dec_cp_setfromqcd(dec->cp, qcd);
   1339         break;
   1340     case JPC_TPH:
   1341         if (!(tile = dec->curtile)) {
   1342             return -1;
   1343         }
   1344         if (tile->partno > 0) {
   1345             return -1;
   1346         }
   1347         jpc_dec_cp_setfromqcd(tile->cp, qcd);
   1348         break;
   1349     }
   1350     return 0;
   1351 }
   1352 
   1353 static int jpc_dec_process_qcc(jpc_dec_t *dec, jpc_ms_t *ms)
   1354 {
   1355     jpc_qcc_t *qcc = &ms->parms.qcc;
   1356     jpc_dec_tile_t *tile;
   1357 
   1358     if (JAS_CAST(int, qcc->compno) > dec->numcomps) {
   1359         jas_eprintf("invalid component number in QCC marker segment\n");
   1360         return -1;
   1361     }
   1362     switch (dec->state) {
   1363     case JPC_MH:
   1364         jpc_dec_cp_setfromqcc(dec->cp, qcc);
   1365         break;
   1366     case JPC_TPH:
   1367         if (!(tile = dec->curtile)) {
   1368             return -1;
   1369         }
   1370         if (tile->partno > 0) {
   1371             return -1;
   1372         }
   1373         jpc_dec_cp_setfromqcc(tile->cp, qcc);
   1374         break;
   1375     }
   1376     return 0;
   1377 }
   1378 
   1379 static int jpc_dec_process_poc(jpc_dec_t *dec, jpc_ms_t *ms)
   1380 {
   1381     jpc_poc_t *poc = &ms->parms.poc;
   1382     jpc_dec_tile_t *tile;
   1383     switch (dec->state) {
   1384     case JPC_MH:
   1385         if (jpc_dec_cp_setfrompoc(dec->cp, poc, 1)) {
   1386             return -1;
   1387         }
   1388         break;
   1389     case JPC_TPH:
   1390         if (!(tile = dec->curtile)) {
   1391             return -1;
   1392         }
   1393         if (!tile->partno) {
   1394             if (jpc_dec_cp_setfrompoc(tile->cp, poc, (!tile->partno))) {
   1395                 return -1;
   1396             }
   1397         } else {
   1398             jpc_pi_addpchgfrompoc(tile->pi, poc);
   1399         }
   1400         break;
   1401     }
   1402     return 0;
   1403 }
   1404 
   1405 static int jpc_dec_process_ppm(jpc_dec_t *dec, jpc_ms_t *ms)
   1406 {
   1407     jpc_ppm_t *ppm = &ms->parms.ppm;
   1408     jpc_ppxstabent_t *ppmstabent;
   1409 
   1410     if (!dec->ppmstab) {
   1411         if (!(dec->ppmstab = jpc_ppxstab_create())) {
   1412             return -1;
   1413         }
   1414     }
   1415 
   1416     if (!(ppmstabent = jpc_ppxstabent_create())) {
   1417         return -1;
   1418     }
   1419     ppmstabent->ind = ppm->ind;
   1420     ppmstabent->data = ppm->data;
   1421     ppm->data = 0;
   1422     ppmstabent->len = ppm->len;
   1423     if (jpc_ppxstab_insert(dec->ppmstab, ppmstabent)) {
   1424         return -1;
   1425     }
   1426     return 0;
   1427 }
   1428 
   1429 static int jpc_dec_process_ppt(jpc_dec_t *dec, jpc_ms_t *ms)
   1430 {
   1431     jpc_ppt_t *ppt = &ms->parms.ppt;
   1432     jpc_dec_tile_t *tile;
   1433     jpc_ppxstabent_t *pptstabent;
   1434 
   1435     tile = dec->curtile;
   1436     if (!tile->pptstab) {
   1437         if (!(tile->pptstab = jpc_ppxstab_create())) {
   1438             return -1;
   1439         }
   1440     }
   1441     if (!(pptstabent = jpc_ppxstabent_create())) {
   1442         return -1;
   1443     }
   1444     pptstabent->ind = ppt->ind;
   1445     pptstabent->data = ppt->data;
   1446     ppt->data = 0;
   1447     pptstabent->len = ppt->len;
   1448     if (jpc_ppxstab_insert(tile->pptstab, pptstabent)) {
   1449         return -1;
   1450     }
   1451     return 0;
   1452 }
   1453 
   1454 static int jpc_dec_process_com(jpc_dec_t *dec, jpc_ms_t *ms)
   1455 {
   1456     /* Eliminate compiler warnings about unused variables. */
   1457     dec = 0;
   1458     ms = 0;
   1459 
   1460     return 0;
   1461 }
   1462 
   1463 static int jpc_dec_process_unk(jpc_dec_t *dec, jpc_ms_t *ms)
   1464 {
   1465     /* Eliminate compiler warnings about unused variables. */
   1466     dec = 0;
   1467 
   1468     jas_eprintf("warning: ignoring unknown marker segment\n");
   1469     jpc_ms_dump(ms, stderr);
   1470     return 0;
   1471 }
   1472 
   1473 /******************************************************************************\
   1474 *
   1475 \******************************************************************************/
   1476 
   1477 static jpc_dec_cp_t *jpc_dec_cp_create(uint_fast16_t numcomps)
   1478 {
   1479     jpc_dec_cp_t *cp;
   1480     jpc_dec_ccp_t *ccp;
   1481     int compno;
   1482 
   1483     if (!(cp = jas_malloc(sizeof(jpc_dec_cp_t)))) {
   1484         return 0;
   1485     }
   1486     cp->flags = 0;
   1487     cp->numcomps = numcomps;
   1488     cp->prgord = 0;
   1489     cp->numlyrs = 0;
   1490     cp->mctid = 0;
   1491     cp->csty = 0;
   1492     if (!(cp->ccps = jas_alloc2(cp->numcomps, sizeof(jpc_dec_ccp_t)))) {
   1493         return 0;
   1494     }
   1495     if (!(cp->pchglist = jpc_pchglist_create())) {
   1496         jas_free(cp->ccps);
   1497         return 0;
   1498     }
   1499     for (compno = 0, ccp = cp->ccps; compno < cp->numcomps;
   1500       ++compno, ++ccp) {
   1501         ccp->flags = 0;
   1502         ccp->numrlvls = 0;
   1503         ccp->cblkwidthexpn = 0;
   1504         ccp->cblkheightexpn = 0;
   1505         ccp->qmfbid = 0;
   1506         ccp->numstepsizes = 0;
   1507         ccp->numguardbits = 0;
   1508         ccp->roishift = 0;
   1509         ccp->cblkctx = 0;
   1510     }
   1511     return cp;
   1512 }
   1513 
   1514 static jpc_dec_cp_t *jpc_dec_cp_copy(jpc_dec_cp_t *cp)
   1515 {
   1516     jpc_dec_cp_t *newcp;
   1517     jpc_dec_ccp_t *newccp;
   1518     jpc_dec_ccp_t *ccp;
   1519     int compno;
   1520 
   1521     if (!(newcp = jpc_dec_cp_create(cp->numcomps))) {
   1522         return 0;
   1523     }
   1524     newcp->flags = cp->flags;
   1525     newcp->prgord = cp->prgord;
   1526     newcp->numlyrs = cp->numlyrs;
   1527     newcp->mctid = cp->mctid;
   1528     newcp->csty = cp->csty;
   1529     jpc_pchglist_destroy(newcp->pchglist);
   1530     newcp->pchglist = 0;
   1531     if (!(newcp->pchglist = jpc_pchglist_copy(cp->pchglist))) {
   1532         jas_free(newcp);
   1533         return 0;
   1534     }
   1535     for (compno = 0, newccp = newcp->ccps, ccp = cp->ccps;
   1536       compno < cp->numcomps;
   1537       ++compno, ++newccp, ++ccp) {
   1538         *newccp = *ccp;
   1539     }
   1540     return newcp;
   1541 }
   1542 
   1543 static void jpc_dec_cp_resetflags(jpc_dec_cp_t *cp)
   1544 {
   1545     int compno;
   1546     jpc_dec_ccp_t *ccp;
   1547     cp->flags &= (JPC_CSET | JPC_QSET);
   1548     for (compno = 0, ccp = cp->ccps; compno < cp->numcomps;
   1549       ++compno, ++ccp) {
   1550         ccp->flags = 0;
   1551     }
   1552 }
   1553 
   1554 static void jpc_dec_cp_destroy(jpc_dec_cp_t *cp)
   1555 {
   1556     if (cp->ccps) {
   1557         jas_free(cp->ccps);
   1558     }
   1559     if (cp->pchglist) {
   1560         jpc_pchglist_destroy(cp->pchglist);
   1561     }
   1562     jas_free(cp);
   1563 }
   1564 
   1565 static int jpc_dec_cp_isvalid(jpc_dec_cp_t *cp)
   1566 {
   1567     uint_fast16_t compcnt;
   1568     jpc_dec_ccp_t *ccp;
   1569 
   1570     if (!(cp->flags & JPC_CSET) || !(cp->flags & JPC_QSET)) {
   1571         return 0;
   1572     }
   1573     for (compcnt = cp->numcomps, ccp = cp->ccps; compcnt > 0; --compcnt,
   1574       ++ccp) {
   1575         /* Is there enough step sizes for the number of bands? */
   1576         if ((ccp->qsty != JPC_QCX_SIQNT && JAS_CAST(int, ccp->numstepsizes) < 3 *
   1577           ccp->numrlvls - 2) || (ccp->qsty == JPC_QCX_SIQNT &&
   1578           ccp->numstepsizes != 1)) {
   1579             return 0;
   1580         }
   1581     }
   1582     return 1;
   1583 }
   1584 
   1585 static void calcstepsizes(uint_fast16_t refstepsize, int numrlvls,
   1586   uint_fast16_t *stepsizes)
   1587 {
   1588     int bandno;
   1589     int numbands;
   1590     uint_fast16_t expn;
   1591     uint_fast16_t mant;
   1592     expn = JPC_QCX_GETEXPN(refstepsize);
   1593     mant = JPC_QCX_GETMANT(refstepsize);
   1594     numbands = 3 * numrlvls - 2;
   1595     for (bandno = 0; bandno < numbands; ++bandno) {
   1596         stepsizes[bandno] = JPC_QCX_MANT(mant) | JPC_QCX_EXPN(expn +
   1597           (numrlvls - 1) - (numrlvls - 1 - ((bandno > 0) ? ((bandno + 2) / 3) : (0))));
   1598     }
   1599 }
   1600 
   1601 static int jpc_dec_cp_prepare(jpc_dec_cp_t *cp)
   1602 {
   1603     jpc_dec_ccp_t *ccp;
   1604     int compno;
   1605     int i;
   1606     for (compno = 0, ccp = cp->ccps; compno < cp->numcomps;
   1607       ++compno, ++ccp) {
   1608         if (!(ccp->csty & JPC_COX_PRT)) {
   1609             for (i = 0; i < JPC_MAXRLVLS; ++i) {
   1610                 ccp->prcwidthexpns[i] = 15;
   1611                 ccp->prcheightexpns[i] = 15;
   1612             }
   1613         }
   1614         if (ccp->qsty == JPC_QCX_SIQNT) {
   1615             calcstepsizes(ccp->stepsizes[0], ccp->numrlvls, ccp->stepsizes);
   1616         }
   1617     }
   1618     return 0;
   1619 }
   1620 
   1621 static int jpc_dec_cp_setfromcod(jpc_dec_cp_t *cp, jpc_cod_t *cod)
   1622 {
   1623     jpc_dec_ccp_t *ccp;
   1624     int compno;
   1625     cp->flags |= JPC_CSET;
   1626     cp->prgord = cod->prg;
   1627     if (cod->mctrans) {
   1628         cp->mctid = (cod->compparms.qmfbid == JPC_COX_INS) ? (JPC_MCT_ICT) : (JPC_MCT_RCT);
   1629     } else {
   1630         cp->mctid = JPC_MCT_NONE;
   1631     }
   1632     cp->numlyrs = cod->numlyrs;
   1633     cp->csty = cod->csty & (JPC_COD_SOP | JPC_COD_EPH);
   1634     for (compno = 0, ccp = cp->ccps; compno < cp->numcomps;
   1635       ++compno, ++ccp) {
   1636         jpc_dec_cp_setfromcox(cp, ccp, &cod->compparms, 0);
   1637     }
   1638     cp->flags |= JPC_CSET;
   1639     return 0;
   1640 }
   1641 
   1642 static int jpc_dec_cp_setfromcoc(jpc_dec_cp_t *cp, jpc_coc_t *coc)
   1643 {
   1644     jpc_dec_cp_setfromcox(cp, &cp->ccps[coc->compno], &coc->compparms, JPC_COC);
   1645     return 0;
   1646 }
   1647 
   1648 static int jpc_dec_cp_setfromcox(jpc_dec_cp_t *cp, jpc_dec_ccp_t *ccp,
   1649   jpc_coxcp_t *compparms, int flags)
   1650 {
   1651     int rlvlno;
   1652 
   1653     /* Eliminate compiler warnings about unused variables. */
   1654     cp = 0;
   1655 
   1656     if ((flags & JPC_COC) || !(ccp->flags & JPC_COC)) {
   1657         ccp->numrlvls = compparms->numdlvls + 1;
   1658         ccp->cblkwidthexpn = JPC_COX_GETCBLKSIZEEXPN(
   1659           compparms->cblkwidthval);
   1660         ccp->cblkheightexpn = JPC_COX_GETCBLKSIZEEXPN(
   1661           compparms->cblkheightval);
   1662         ccp->qmfbid = compparms->qmfbid;
   1663         ccp->cblkctx = compparms->cblksty;
   1664         ccp->csty = compparms->csty & JPC_COX_PRT;
   1665         for (rlvlno = 0; rlvlno < compparms->numrlvls; ++rlvlno) {
   1666             ccp->prcwidthexpns[rlvlno] =
   1667               compparms->rlvls[rlvlno].parwidthval;
   1668             ccp->prcheightexpns[rlvlno] =
   1669               compparms->rlvls[rlvlno].parheightval;
   1670         }
   1671         ccp->flags |= flags | JPC_CSET;
   1672     }
   1673     return 0;
   1674 }
   1675 
   1676 static int jpc_dec_cp_setfromqcd(jpc_dec_cp_t *cp, jpc_qcd_t *qcd)
   1677 {
   1678     int compno;
   1679     jpc_dec_ccp_t *ccp;
   1680     for (compno = 0, ccp = cp->ccps; compno < cp->numcomps;
   1681       ++compno, ++ccp) {
   1682         jpc_dec_cp_setfromqcx(cp, ccp, &qcd->compparms, 0);
   1683     }
   1684     cp->flags |= JPC_QSET;
   1685     return 0;
   1686 }
   1687 
   1688 static int jpc_dec_cp_setfromqcc(jpc_dec_cp_t *cp, jpc_qcc_t *qcc)
   1689 {
   1690     return jpc_dec_cp_setfromqcx(cp, &cp->ccps[qcc->compno], &qcc->compparms, JPC_QCC);
   1691 }
   1692 
   1693 static int jpc_dec_cp_setfromqcx(jpc_dec_cp_t *cp, jpc_dec_ccp_t *ccp,
   1694   jpc_qcxcp_t *compparms, int flags)
   1695 {
   1696     int bandno;
   1697 
   1698     /* Eliminate compiler warnings about unused variables. */
   1699     cp = 0;
   1700 
   1701     if ((flags & JPC_QCC) || !(ccp->flags & JPC_QCC)) {
   1702         ccp->flags |= flags | JPC_QSET;
   1703         for (bandno = 0; bandno < compparms->numstepsizes; ++bandno) {
   1704             ccp->stepsizes[bandno] = compparms->stepsizes[bandno];
   1705         }
   1706         ccp->numstepsizes = compparms->numstepsizes;
   1707         ccp->numguardbits = compparms->numguard;
   1708         ccp->qsty = compparms->qntsty;
   1709     }
   1710     return 0;
   1711 }
   1712 
   1713 static int jpc_dec_cp_setfromrgn(jpc_dec_cp_t *cp, jpc_rgn_t *rgn)
   1714 {
   1715     jpc_dec_ccp_t *ccp;
   1716     ccp = &cp->ccps[rgn->compno];
   1717     ccp->roishift = rgn->roishift;
   1718     return 0;
   1719 }
   1720 
   1721 static int jpc_pi_addpchgfrompoc(jpc_pi_t *pi, jpc_poc_t *poc)
   1722 {
   1723     int pchgno;
   1724     jpc_pchg_t *pchg;
   1725     for (pchgno = 0; pchgno < poc->numpchgs; ++pchgno) {
   1726         if (!(pchg = jpc_pchg_copy(&poc->pchgs[pchgno]))) {
   1727             return -1;
   1728         }
   1729         if (jpc_pchglist_insert(pi->pchglist, -1, pchg)) {
   1730             return -1;
   1731         }
   1732     }
   1733     return 0;
   1734 }
   1735 
   1736 static int jpc_dec_cp_setfrompoc(jpc_dec_cp_t *cp, jpc_poc_t *poc, int reset)
   1737 {
   1738     int pchgno;
   1739     jpc_pchg_t *pchg;
   1740     if (reset) {
   1741         while (jpc_pchglist_numpchgs(cp->pchglist) > 0) {
   1742             pchg = jpc_pchglist_remove(cp->pchglist, 0);
   1743             jpc_pchg_destroy(pchg);
   1744         }
   1745     }
   1746     for (pchgno = 0; pchgno < poc->numpchgs; ++pchgno) {
   1747         if (!(pchg = jpc_pchg_copy(&poc->pchgs[pchgno]))) {
   1748             return -1;
   1749         }
   1750         if (jpc_pchglist_insert(cp->pchglist, -1, pchg)) {
   1751             return -1;
   1752         }
   1753     }
   1754     return 0;
   1755 }
   1756 
   1757 static jpc_fix_t jpc_calcabsstepsize(int stepsize, int numbits)
   1758 {
   1759     jpc_fix_t absstepsize;
   1760     int n;
   1761 
   1762     absstepsize = jpc_inttofix(1);
   1763     n = JPC_FIX_FRACBITS - 11;
   1764     absstepsize |= (n >= 0) ? (JPC_QCX_GETMANT(stepsize) << n) :
   1765       (JPC_QCX_GETMANT(stepsize) >> (-n));
   1766     n = numbits - JPC_QCX_GETEXPN(stepsize);
   1767     absstepsize = (n >= 0) ? (absstepsize << n) : (absstepsize >> (-n));
   1768     return absstepsize;
   1769 }
   1770 
   1771 static void jpc_dequantize(jas_matrix_t *x, jpc_fix_t absstepsize)
   1772 {
   1773     int i;
   1774     int j;
   1775     int t;
   1776 
   1777     assert(absstepsize >= 0);
   1778     if (absstepsize == jpc_inttofix(1)) {
   1779         return;
   1780     }
   1781 
   1782     for (i = 0; i < jas_matrix_numrows(x); ++i) {
   1783         for (j = 0; j < jas_matrix_numcols(x); ++j) {
   1784             t = jas_matrix_get(x, i, j);
   1785             if (t) {
   1786                 t = jpc_fix_mul(t, absstepsize);
   1787             } else {
   1788                 t = 0;
   1789             }
   1790             jas_matrix_set(x, i, j, t);
   1791         }
   1792     }
   1793 
   1794 }
   1795 
   1796 static void jpc_undo_roi(jas_matrix_t *x, int roishift, int bgshift, int numbps)
   1797 {
   1798     int i;
   1799     int j;
   1800     int thresh;
   1801     jpc_fix_t val;
   1802     jpc_fix_t mag;
   1803     bool warn;
   1804     uint_fast32_t mask;
   1805 
   1806     if (roishift == 0 && bgshift == 0) {
   1807         return;
   1808     }
   1809     thresh = 1 << roishift;
   1810 
   1811     warn = false;
   1812     for (i = 0; i < jas_matrix_numrows(x); ++i) {
   1813         for (j = 0; j < jas_matrix_numcols(x); ++j) {
   1814             val = jas_matrix_get(x, i, j);
   1815             mag = JAS_ABS(val);
   1816             if (mag >= thresh) {
   1817                 /* We are dealing with ROI data. */
   1818                 mag >>= roishift;
   1819                 val = (val < 0) ? (-mag) : mag;
   1820                 jas_matrix_set(x, i, j, val);
   1821             } else {
   1822                 /* We are dealing with non-ROI (i.e., background) data. */
   1823                 mag <<= bgshift;
   1824                 mask = (1 << numbps) - 1;
   1825                 /* Perform a basic sanity check on the sample value. */
   1826                 /* Some implementations write garbage in the unused
   1827                   most-significant bit planes introduced by ROI shifting.
   1828                   Here we ensure that any such bits are masked off. */
   1829                 if (mag & (~mask)) {
   1830                     if (!warn) {
   1831                         jas_eprintf("warning: possibly corrupt code stream\n");
   1832                         warn = true;
   1833                     }
   1834                     mag &= mask;
   1835                 }
   1836                 val = (val < 0) ? (-mag) : mag;
   1837                 jas_matrix_set(x, i, j, val);
   1838             }
   1839         }
   1840     }
   1841 }
   1842 
   1843 static jpc_dec_t *jpc_dec_create(jpc_dec_importopts_t *impopts, jas_stream_t *in)
   1844 {
   1845     jpc_dec_t *dec;
   1846 
   1847     if (!(dec = jas_malloc(sizeof(jpc_dec_t)))) {
   1848         return 0;
   1849     }
   1850 
   1851     dec->image = 0;
   1852     dec->xstart = 0;
   1853     dec->ystart = 0;
   1854     dec->xend = 0;
   1855     dec->yend = 0;
   1856     dec->tilewidth = 0;
   1857     dec->tileheight = 0;
   1858     dec->tilexoff = 0;
   1859     dec->tileyoff = 0;
   1860     dec->numhtiles = 0;
   1861     dec->numvtiles = 0;
   1862     dec->numtiles = 0;
   1863     dec->tiles = 0;
   1864     dec->curtile = 0;
   1865     dec->numcomps = 0;
   1866     dec->in = in;
   1867     dec->cp = 0;
   1868     dec->maxlyrs = impopts->maxlyrs;
   1869     dec->maxpkts = impopts->maxpkts;
   1870 dec->numpkts = 0;
   1871     dec->ppmseqno = 0;
   1872     dec->state = 0;
   1873     dec->cmpts = 0;
   1874     dec->pkthdrstreams = 0;
   1875     dec->ppmstab = 0;
   1876     dec->curtileendoff = 0;
   1877 
   1878     return dec;
   1879 }
   1880 
   1881 static void jpc_dec_destroy(jpc_dec_t *dec)
   1882 {
   1883     if (dec->cstate) {
   1884         jpc_cstate_destroy(dec->cstate);
   1885     }
   1886     if (dec->pkthdrstreams) {
   1887         jpc_streamlist_destroy(dec->pkthdrstreams);
   1888     }
   1889     if (dec->image) {
   1890         jas_image_destroy(dec->image);
   1891     }
   1892 
   1893     if (dec->cp) {
   1894         jpc_dec_cp_destroy(dec->cp);
   1895     }
   1896 
   1897     if (dec->cmpts) {
   1898         jas_free(dec->cmpts);
   1899     }
   1900 
   1901     if (dec->tiles) {
   1902         jas_free(dec->tiles);
   1903     }
   1904 
   1905     jas_free(dec);
   1906 }
   1907 
   1908 /******************************************************************************\
   1909 *
   1910 \******************************************************************************/
   1911 
   1912 void jpc_seglist_insert(jpc_dec_seglist_t *list, jpc_dec_seg_t *ins, jpc_dec_seg_t *node)
   1913 {
   1914     jpc_dec_seg_t *prev;
   1915     jpc_dec_seg_t *next;
   1916 
   1917     prev = ins;
   1918     node->prev = prev;
   1919     next = prev ? (prev->next) : 0;
   1920     node->prev = prev;
   1921     node->next = next;
   1922     if (prev) {
   1923         prev->next = node;
   1924     } else {
   1925         list->head = node;
   1926     }
   1927     if (next) {
   1928         next->prev = node;
   1929     } else {
   1930         list->tail = node;
   1931     }
   1932 }
   1933 
   1934 void jpc_seglist_remove(jpc_dec_seglist_t *list, jpc_dec_seg_t *seg)
   1935 {
   1936     jpc_dec_seg_t *prev;
   1937     jpc_dec_seg_t *next;
   1938 
   1939     prev = seg->prev;
   1940     next = seg->next;
   1941     if (prev) {
   1942         prev->next = next;
   1943     } else {
   1944         list->head = next;
   1945     }
   1946     if (next) {
   1947         next->prev = prev;
   1948     } else {
   1949         list->tail = prev;
   1950     }
   1951     seg->prev = 0;
   1952     seg->next = 0;
   1953 }
   1954 
   1955 jpc_dec_seg_t *jpc_seg_alloc()
   1956 {
   1957     jpc_dec_seg_t *seg;
   1958 
   1959     if (!(seg = jas_malloc(sizeof(jpc_dec_seg_t)))) {
   1960         return 0;
   1961     }
   1962     seg->prev = 0;
   1963     seg->next = 0;
   1964     seg->passno = -1;
   1965     seg->numpasses = 0;
   1966     seg->maxpasses = 0;
   1967     seg->type = JPC_SEG_INVALID;
   1968     seg->stream = 0;
   1969     seg->cnt = 0;
   1970     seg->complete = 0;
   1971     seg->lyrno = -1;
   1972     return seg;
   1973 }
   1974 
   1975 void jpc_seg_destroy(jpc_dec_seg_t *seg)
   1976 {
   1977     if (seg->stream) {
   1978         jas_stream_close(seg->stream);
   1979     }
   1980     jas_free(seg);
   1981 }
   1982 
   1983 static int jpc_dec_dump(jpc_dec_t *dec, FILE *out)
   1984 {
   1985     jpc_dec_tile_t *tile;
   1986     int tileno;
   1987     jpc_dec_tcomp_t *tcomp;
   1988     int compno;
   1989     jpc_dec_rlvl_t *rlvl;
   1990     int rlvlno;
   1991     jpc_dec_band_t *band;
   1992     int bandno;
   1993     jpc_dec_prc_t *prc;
   1994     int prcno;
   1995     jpc_dec_cblk_t *cblk;
   1996     int cblkno;
   1997 
   1998     for (tileno = 0, tile = dec->tiles; tileno < dec->numtiles;
   1999       ++tileno, ++tile) {
   2000         for (compno = 0, tcomp = tile->tcomps; compno < dec->numcomps;
   2001           ++compno, ++tcomp) {
   2002             for (rlvlno = 0, rlvl = tcomp->rlvls; rlvlno <
   2003               tcomp->numrlvls; ++rlvlno, ++rlvl) {
   2004 fprintf(out, "RESOLUTION LEVEL %d\n", rlvlno);
   2005 fprintf(out, "xs =%d, ys = %d, xe = %d, ye = %d, w = %d, h = %d\n",
   2006   (int)rlvl->xstart, (int)rlvl->ystart, (int)rlvl->xend, (int)rlvl->yend, (int)(rlvl->xend -
   2007   rlvl->xstart), (int)(rlvl->yend - rlvl->ystart));
   2008                 for (bandno = 0, band = rlvl->bands;
   2009                   bandno < rlvl->numbands; ++bandno, ++band) {
   2010 fprintf(out, "BAND %d\n", bandno);
   2011 fprintf(out, "xs =%d, ys = %d, xe = %d, ye = %d, w = %d, h = %d\n",
   2012   (int)jas_seq2d_xstart(band->data), (int)jas_seq2d_ystart(band->data), (int)jas_seq2d_xend(band->data),
   2013   (int)jas_seq2d_yend(band->data), (int)(jas_seq2d_xend(band->data) - jas_seq2d_xstart(band->data)),
   2014   (int)(jas_seq2d_yend(band->data) - jas_seq2d_ystart(band->data)));
   2015                     for (prcno = 0, prc = band->prcs;
   2016                       prcno < rlvl->numprcs; ++prcno,
   2017                       ++prc) {
   2018 fprintf(out, "CODE BLOCK GROUP %d\n", prcno);
   2019 fprintf(out, "xs =%d, ys = %d, xe = %d, ye = %d, w = %d, h = %d\n",
   2020   (int)prc->xstart, (int)prc->ystart, (int)prc->xend, (int)prc->yend, (int)(prc->xend -
   2021   prc->xstart), (int)(prc->yend - prc->ystart));
   2022                         for (cblkno = 0, cblk =
   2023                           prc->cblks; cblkno <
   2024                           prc->numcblks; ++cblkno,
   2025                           ++cblk) {
   2026 fprintf(out, "CODE BLOCK %d\n", cblkno);
   2027 fprintf(out, "xs =%d, ys = %d, xe = %d, ye = %d, w = %d, h = %d\n",
   2028   (int)jas_seq2d_xstart(cblk->data), (int)jas_seq2d_ystart(cblk->data), (int)jas_seq2d_xend(cblk->data),
   2029   (int)jas_seq2d_yend(cblk->data), (int)(jas_seq2d_xend(cblk->data) - jas_seq2d_xstart(cblk->data)),
   2030   (int)(jas_seq2d_yend(cblk->data) - jas_seq2d_ystart(cblk->data)));
   2031                         }
   2032                     }
   2033                 }
   2034             }
   2035         }
   2036     }
   2037 
   2038     return 0;
   2039 }
   2040 
   2041 jpc_streamlist_t *jpc_streamlist_create()
   2042 {
   2043     jpc_streamlist_t *streamlist;
   2044     int i;
   2045 
   2046     if (!(streamlist = jas_malloc(sizeof(jpc_streamlist_t)))) {
   2047         return 0;
   2048     }
   2049     streamlist->numstreams = 0;
   2050     streamlist->maxstreams = 100;
   2051     if (!(streamlist->streams = jas_alloc2(streamlist->maxstreams,
   2052       sizeof(jas_stream_t *)))) {
   2053         jas_free(streamlist);
   2054         return 0;
   2055     }
   2056     for (i = 0; i < streamlist->maxstreams; ++i) {
   2057         streamlist->streams[i] = 0;
   2058     }
   2059     return streamlist;
   2060 }
   2061 
   2062 int jpc_streamlist_insert(jpc_streamlist_t *streamlist, int streamno,
   2063   jas_stream_t *stream)
   2064 {
   2065     jas_stream_t **newstreams;
   2066     int newmaxstreams;
   2067     int i;
   2068     /* Grow the array of streams if necessary. */
   2069     if (streamlist->numstreams >= streamlist->maxstreams) {
   2070         newmaxstreams = streamlist->maxstreams + 1024;
   2071         if (!(newstreams = jas_realloc2(streamlist->streams,
   2072           (newmaxstreams + 1024), sizeof(jas_stream_t *)))) {
   2073             return -1;
   2074         }
   2075         for (i = streamlist->numstreams; i < streamlist->maxstreams; ++i) {
   2076             streamlist->streams[i] = 0;
   2077         }
   2078         streamlist->maxstreams = newmaxstreams;
   2079         streamlist->streams = newstreams;
   2080     }
   2081     if (streamno != streamlist->numstreams) {
   2082         /* Can only handle insertion at start of list. */
   2083         return -1;
   2084     }
   2085     streamlist->streams[streamno] = stream;
   2086     ++streamlist->numstreams;
   2087     return 0;
   2088 }
   2089 
   2090 jas_stream_t *jpc_streamlist_remove(jpc_streamlist_t *streamlist, int streamno)
   2091 {
   2092     jas_stream_t *stream;
   2093     int i;
   2094     if (streamno >= streamlist->numstreams) {
   2095         abort();
   2096     }
   2097     stream = streamlist->streams[streamno];
   2098     for (i = streamno + 1; i < streamlist->numstreams; ++i) {
   2099         streamlist->streams[i - 1] = streamlist->streams[i];
   2100     }
   2101     --streamlist->numstreams;
   2102     return stream;
   2103 }
   2104 
   2105 void jpc_streamlist_destroy(jpc_streamlist_t *streamlist)
   2106 {
   2107     int streamno;
   2108     if (streamlist->streams) {
   2109         for (streamno = 0; streamno < streamlist->numstreams;
   2110           ++streamno) {
   2111             jas_stream_close(streamlist->streams[streamno]);
   2112         }
   2113         jas_free(streamlist->streams);
   2114     }
   2115     jas_free(streamlist);
   2116 }
   2117 
   2118 jas_stream_t *jpc_streamlist_get(jpc_streamlist_t *streamlist, int streamno)
   2119 {
   2120     assert(streamno < streamlist->numstreams);
   2121     return streamlist->streams[streamno];
   2122 }
   2123 
   2124 int jpc_streamlist_numstreams(jpc_streamlist_t *streamlist)
   2125 {
   2126     return streamlist->numstreams;
   2127 }
   2128 
   2129 jpc_ppxstab_t *jpc_ppxstab_create()
   2130 {
   2131     jpc_ppxstab_t *tab;
   2132 
   2133     if (!(tab = jas_malloc(sizeof(jpc_ppxstab_t)))) {
   2134         return 0;
   2135     }
   2136     tab->numents = 0;
   2137     tab->maxents = 0;
   2138     tab->ents = 0;
   2139     return tab;
   2140 }
   2141 
   2142 void jpc_ppxstab_destroy(jpc_ppxstab_t *tab)
   2143 {
   2144     int i;
   2145     for (i = 0; i < tab->numents; ++i) {
   2146         jpc_ppxstabent_destroy(tab->ents[i]);
   2147     }
   2148     if (tab->ents) {
   2149         jas_free(tab->ents);
   2150     }
   2151     jas_free(tab);
   2152 }
   2153 
   2154 int jpc_ppxstab_grow(jpc_ppxstab_t *tab, int maxents)
   2155 {
   2156     jpc_ppxstabent_t **newents;
   2157     if (tab->maxents < maxents) {
   2158         newents = jas_realloc2(tab->ents, maxents, sizeof(jpc_ppxstabent_t *));
   2159         if (!newents) {
   2160             return -1;
   2161         }
   2162         tab->ents = newents;
   2163         tab->maxents = maxents;
   2164     }
   2165     return 0;
   2166 }
   2167 
   2168 int jpc_ppxstab_insert(jpc_ppxstab_t *tab, jpc_ppxstabent_t *ent)
   2169 {
   2170     int inspt;
   2171     int i;
   2172 
   2173     for (i = 0; i < tab->numents; ++i) {
   2174         if (tab->ents[i]->ind > ent->ind) {
   2175             break;
   2176         }
   2177     }
   2178     inspt = i;
   2179 
   2180     if (tab->numents >= tab->maxents) {
   2181         if (jpc_ppxstab_grow(tab, tab->maxents + 128)) {
   2182             return -1;
   2183         }
   2184     }
   2185 
   2186     for (i = tab->numents; i > inspt; --i) {
   2187         tab->ents[i] = tab->ents[i - 1];
   2188     }
   2189     tab->ents[i] = ent;
   2190     ++tab->numents;
   2191 
   2192     return 0;
   2193 }
   2194 
   2195 jpc_streamlist_t *jpc_ppmstabtostreams(jpc_ppxstab_t *tab)
   2196 {
   2197     jpc_streamlist_t *streams;
   2198     uchar *dataptr;
   2199     uint_fast32_t datacnt;
   2200     uint_fast32_t tpcnt;
   2201     jpc_ppxstabent_t *ent;
   2202     int entno;
   2203     jas_stream_t *stream;
   2204     int n;
   2205 
   2206     if (!(streams = jpc_streamlist_create())) {
   2207         goto error;
   2208     }
   2209 
   2210     if (!tab->numents) {
   2211         return streams;
   2212     }
   2213 
   2214     entno = 0;
   2215     ent = tab->ents[entno];
   2216     dataptr = ent->data;
   2217     datacnt = ent->len;
   2218     for (;;) {
   2219 
   2220         /* Get the length of the packet header data for the current
   2221           tile-part. */
   2222         if (datacnt < 4) {
   2223             goto error;
   2224         }
   2225         if (!(stream = jas_stream_memopen(0, 0))) {
   2226             goto error;
   2227         }
   2228         if (jpc_streamlist_insert(streams, jpc_streamlist_numstreams(streams),
   2229           stream)) {
   2230             goto error;
   2231         }
   2232         tpcnt = (dataptr[0] << 24) | (dataptr[1] << 16) | (dataptr[2] << 8)
   2233           | dataptr[3];
   2234         datacnt -= 4;
   2235         dataptr += 4;
   2236 
   2237         /* Get the packet header data for the current tile-part. */
   2238         while (tpcnt) {
   2239             if (!datacnt) {
   2240                 if (++entno >= tab->numents) {
   2241                     goto error;
   2242                 }
   2243                 ent = tab->ents[entno];
   2244                 dataptr = ent->data;
   2245                 datacnt = ent->len;
   2246             }
   2247             n = JAS_MIN(tpcnt, datacnt);
   2248             if (jas_stream_write(stream, dataptr, n) != n) {
   2249                 goto error;
   2250             }
   2251             tpcnt -= n;
   2252             dataptr += n;
   2253             datacnt -= n;
   2254         }
   2255         jas_stream_rewind(stream);
   2256         if (!datacnt) {
   2257             if (++entno >= tab->numents) {
   2258                 break;
   2259             }
   2260             ent = tab->ents[entno];
   2261             dataptr = ent->data;
   2262             datacnt = ent->len;
   2263         }
   2264     }
   2265 
   2266     return streams;
   2267 
   2268 error:
   2269     jpc_streamlist_destroy(streams);
   2270     return 0;
   2271 }
   2272 
   2273 int jpc_pptstabwrite(jas_stream_t *out, jpc_ppxstab_t *tab)
   2274 {
   2275     int i;
   2276     jpc_ppxstabent_t *ent;
   2277     for (i = 0; i < tab->numents; ++i) {
   2278         ent = tab->ents[i];
   2279         if (jas_stream_write(out, ent->data, ent->len) != JAS_CAST(int, ent->len)) {
   2280             return -1;
   2281         }
   2282     }
   2283     return 0;
   2284 }
   2285 
   2286 jpc_ppxstabent_t *jpc_ppxstabent_create()
   2287 {
   2288     jpc_ppxstabent_t *ent;
   2289     if (!(ent = jas_malloc(sizeof(jpc_ppxstabent_t)))) {
   2290         return 0;
   2291     }
   2292     ent->data = 0;
   2293     ent->len = 0;
   2294     ent->ind = 0;
   2295     return ent;
   2296 }
   2297 
   2298 void jpc_ppxstabent_destroy(jpc_ppxstabent_t *ent)
   2299 {
   2300     if (ent->data) {
   2301         jas_free(ent->data);
   2302     }
   2303     jas_free(ent);
   2304 }
   2305