Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Tetragramm
GitHub Repository: Tetragramm/opencv
Path: blob/master/3rdparty/libjasper/jpc_dec.c
16337 views
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
2306