1/*
2 * Copyright (c) 1999-2000 Image Power, Inc. and the University of
3 *   British Columbia.
4 * Copyright (c) 2001-2002 Michael David Adams.
5 * All rights reserved.
6 */
7
8/* __START_OF_JASPER_LICENSE__
9 *
10 * JasPer Software License
11 *
12 * IMAGE POWER JPEG-2000 PUBLIC LICENSE
13 * ************************************
14 *
15 * GRANT:
16 *
17 * Permission is hereby granted, free of charge, to any person (the "User")
18 * obtaining a copy of this software and associated documentation, to deal
19 * in the JasPer Software without restriction, including without limitation
20 * the right to use, copy, modify, merge, publish, distribute, sublicense,
21 * and/or sell copies of the JasPer Software (in source and binary forms),
22 * and to permit persons to whom the JasPer Software is furnished to do so,
23 * provided further that the License Conditions below are met.
24 *
25 * License Conditions
26 * ******************
27 *
28 * A.  Redistributions of source code must retain the above copyright notice,
29 * and this list of conditions, and the following disclaimer.
30 *
31 * B.  Redistributions in binary form must reproduce the above copyright
32 * notice, and this list of conditions, and the following disclaimer in
33 * the documentation and/or other materials provided with the distribution.
34 *
35 * C.  Neither the name of Image Power, Inc. nor any other contributor
36 * (including, but not limited to, the University of British Columbia and
37 * Michael David Adams) may be used to endorse or promote products derived
38 * from this software without specific prior written permission.
39 *
40 * D.  User agrees that it shall not commence any action against Image Power,
41 * Inc., the University of British Columbia, Michael David Adams, or any
42 * other contributors (collectively "Licensors") for infringement of any
43 * intellectual property rights ("IPR") held by the User in respect of any
44 * technology that User owns or has a right to license or sublicense and
45 * which is an element required in order to claim compliance with ISO/IEC
46 * 15444-1 (i.e., JPEG-2000 Part 1).  "IPR" means all intellectual property
47 * rights worldwide arising under statutory or common law, and whether
48 * or not perfected, including, without limitation, all (i) patents and
49 * patent applications owned or licensable by User; (ii) rights associated
50 * with works of authorship including copyrights, copyright applications,
51 * copyright registrations, mask work rights, mask work applications,
52 * mask work registrations; (iii) rights relating to the protection of
53 * trade secrets and confidential information; (iv) any right analogous
54 * to those set forth in subsections (i), (ii), or (iii) and any other
55 * proprietary rights relating to intangible property (other than trademark,
56 * trade dress, or service mark rights); and (v) divisions, continuations,
57 * renewals, reissues and extensions of the foregoing (as and to the extent
58 * applicable) now existing, hereafter filed, issued or acquired.
59 *
60 * E.  If User commences an infringement action against any Licensor(s) then
61 * such Licensor(s) shall have the right to terminate User's license and
62 * all sublicenses that have been granted hereunder by User to other parties.
63 *
64 * F.  This software is for use only in hardware or software products that
65 * are compliant with ISO/IEC 15444-1 (i.e., JPEG-2000 Part 1).  No license
66 * or right to this Software is granted for products that do not comply
67 * with ISO/IEC 15444-1.  The JPEG-2000 Part 1 standard can be purchased
68 * from the ISO.
69 *
70 * THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE.
71 * NO USE OF THE JASPER SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER
72 * THIS DISCLAIMER.  THE JASPER SOFTWARE IS PROVIDED BY THE LICENSORS AND
73 * CONTRIBUTORS UNDER THIS LICENSE ON AN ``AS-IS'' BASIS, WITHOUT WARRANTY
74 * OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION,
75 * WARRANTIES THAT THE JASPER SOFTWARE IS FREE OF DEFECTS, IS MERCHANTABLE,
76 * IS FIT FOR A PARTICULAR PURPOSE OR IS NON-INFRINGING.  THOSE INTENDING
77 * TO USE THE JASPER SOFTWARE OR MODIFICATIONS THEREOF FOR USE IN HARDWARE
78 * OR SOFTWARE PRODUCTS ARE ADVISED THAT THEIR USE MAY INFRINGE EXISTING
79 * PATENTS, COPYRIGHTS, TRADEMARKS, OR OTHER INTELLECTUAL PROPERTY RIGHTS.
80 * THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE JASPER SOFTWARE
81 * IS WITH THE USER.  SHOULD ANY PART OF THE JASPER SOFTWARE PROVE DEFECTIVE
82 * IN ANY RESPECT, THE USER (AND NOT THE INITIAL DEVELOPERS, THE UNIVERSITY
83 * OF BRITISH COLUMBIA, IMAGE POWER, INC., MICHAEL DAVID ADAMS, OR ANY
84 * OTHER CONTRIBUTOR) SHALL ASSUME THE COST OF ANY NECESSARY SERVICING,
85 * REPAIR OR CORRECTION.  UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY,
86 * WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE
87 * INITIAL DEVELOPER, THE UNIVERSITY OF BRITISH COLUMBIA, IMAGE POWER, INC.,
88 * MICHAEL DAVID ADAMS, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF THE
89 * JASPER SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO
90 * THE USER OR ANY OTHER PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR
91 * CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION,
92 * DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR
93 * MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF
94 * SUCH PARTY HAD BEEN INFORMED, OR OUGHT TO HAVE KNOWN, OF THE POSSIBILITY
95 * OF SUCH DAMAGES.  THE JASPER SOFTWARE AND UNDERLYING TECHNOLOGY ARE NOT
96 * FAULT-TOLERANT AND ARE NOT DESIGNED, MANUFACTURED OR INTENDED FOR USE OR
97 * RESALE AS ON-LINE CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING
98 * FAIL-SAFE PERFORMANCE, SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES,
99 * AIRCRAFT NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, DIRECT
100 * LIFE SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE
101 * JASPER SOFTWARE OR UNDERLYING TECHNOLOGY OR PRODUCT COULD LEAD DIRECTLY
102 * TO DEATH, PERSONAL INJURY, OR SEVERE PHYSICAL OR ENVIRONMENTAL DAMAGE
103 * ("HIGH RISK ACTIVITIES").  LICENSOR SPECIFICALLY DISCLAIMS ANY EXPRESS
104 * OR IMPLIED WARRANTY OF FITNESS FOR HIGH RISK ACTIVITIES.  USER WILL NOT
105 * KNOWINGLY USE, DISTRIBUTE OR RESELL THE JASPER SOFTWARE OR UNDERLYING
106 * TECHNOLOGY OR PRODUCTS FOR HIGH RISK ACTIVITIES AND WILL ENSURE THAT ITS
107 * CUSTOMERS AND END-USERS OF ITS PRODUCTS ARE PROVIDED WITH A COPY OF THE
108 * NOTICE SPECIFIED IN THIS SECTION.
109 *
110 * __END_OF_JASPER_LICENSE__
111 */
112
113/*
114 * Tier-2 Coding Library
115 *
116 * $Id: jpc_t2cod.h 14449 2005-10-20 12:15:56Z stippi $
117 */
118
119#ifndef JPC_T2COD_H
120#define	JPC_T2COD_H
121
122/******************************************************************************\
123* Includes.
124\******************************************************************************/
125
126#include "jpc_cs.h"
127
128/******************************************************************************\
129* Types.
130\******************************************************************************/
131
132/* Progression change list. */
133
134typedef struct {
135
136	/* The number of progression changes. */
137	int numpchgs;
138
139	/* The maximum number of progression changes that can be accomodated
140	  without growing the progression change array. */
141	int maxpchgs;
142
143	/* The progression changes. */
144	jpc_pchg_t **pchgs;
145
146} jpc_pchglist_t;
147
148/* Packet iterator per-resolution-level information. */
149
150typedef struct {
151
152	/* The number of precincts. */
153	int numprcs;
154
155	/* The last layer processed for each precinct. */
156	int *prclyrnos;
157
158	/* The precinct width exponent. */
159	int prcwidthexpn;
160
161	/* The precinct height exponent. */
162	int prcheightexpn;
163
164	/* The number of precincts spanning the resolution level in the horizontal
165	  direction. */
166	int numhprcs;
167
168} jpc_pirlvl_t;
169
170/* Packet iterator per-component information. */
171
172typedef struct {
173
174	/* The number of resolution levels. */
175	int numrlvls;
176
177	/* The per-resolution-level information. */
178	jpc_pirlvl_t *pirlvls;
179
180	/* The horizontal sampling period. */
181	int hsamp;
182
183	/* The vertical sampling period. */
184	int vsamp;
185
186} jpc_picomp_t;
187
188/* Packet iterator class. */
189
190typedef struct {
191
192	/* The number of layers. */
193	int numlyrs;
194
195	/* The number of resolution levels. */
196	int maxrlvls;
197
198	/* The number of components. */
199	int numcomps;
200
201	/* The per-component information. */
202	jpc_picomp_t *picomps;
203
204	/* The current component. */
205	jpc_picomp_t *picomp;
206
207	/* The current resolution level. */
208	jpc_pirlvl_t *pirlvl;
209
210	/* The number of the current component. */
211	int compno;
212
213	/* The number of the current resolution level. */
214	int rlvlno;
215
216	/* The number of the current precinct. */
217	int prcno;
218
219	/* The number of the current layer. */
220	int lyrno;
221
222	/* The x-coordinate of the current position. */
223	int x;
224
225	/* The y-coordinate of the current position. */
226	int y;
227
228	/* The horizontal step size. */
229	int xstep;
230
231	/* The vertical step size. */
232	int ystep;
233
234	/* The x-coordinate of the top-left corner of the tile on the reference
235	  grid. */
236	int xstart;
237
238	/* The y-coordinate of the top-left corner of the tile on the reference
239	  grid. */
240	int ystart;
241
242	/* The x-coordinate of the bottom-right corner of the tile on the
243	  reference grid (plus one). */
244	int xend;
245
246	/* The y-coordinate of the bottom-right corner of the tile on the
247	  reference grid (plus one). */
248	int yend;
249
250	/* The current progression change. */
251	jpc_pchg_t *pchg;
252
253	/* The progression change list. */
254	jpc_pchglist_t *pchglist;
255
256	/* The progression to use in the absense of explicit specification. */
257	jpc_pchg_t defaultpchg;
258
259	/* The current progression change number. */
260	int pchgno;
261
262	/* Is this the first time in the current progression volume? */
263	JPR_BOOL prgvolfirst;
264
265	/* Is the current iterator value valid? */
266	JPR_BOOL valid;
267
268	/* The current packet number. */
269	int pktno;
270
271} jpc_pi_t;
272
273/******************************************************************************\
274* Functions/macros for packet iterators.
275\******************************************************************************/
276
277/* Create a packet iterator. */
278jpc_pi_t *jpc_pi_create0();
279
280/* Destroy a packet iterator. */
281void jpc_pi_destroy(jpc_pi_t *pi);
282
283/* Add a progression change to a packet iterator. */
284int jpc_pi_addpchg(jpc_pi_t *pi, jpc_pocpchg_t *pchg);
285
286/* Prepare a packet iterator for iteration. */
287int jpc_pi_init(jpc_pi_t *pi);
288
289/* Set the iterator to the first packet. */
290int jpc_pi_begin(jpc_pi_t *pi);
291
292/* Proceed to the next packet in sequence. */
293int jpc_pi_next(jpc_pi_t *pi);
294
295/* Get the index of the current packet. */
296#define	jpc_pi_getind(pi)	((pi)->pktno)
297
298/* Get the component number of the current packet. */
299#define jpc_pi_cmptno(pi)	(assert(pi->valid), (pi)->compno)
300
301/* Get the resolution level of the current packet. */
302#define jpc_pi_rlvlno(pi)	(assert(pi->valid), (pi)->rlvlno)
303
304/* Get the layer number of the current packet. */
305#define jpc_pi_lyrno(pi)	(assert(pi->valid), (pi)->lyrno)
306
307/* Get the precinct number of the current packet. */
308#define jpc_pi_prcno(pi)	(assert(pi->valid), (pi)->prcno)
309
310/* Get the progression order for the current packet. */
311#define jpc_pi_prg(pi)	(assert(pi->valid), (pi)->pchg->prgord)
312
313/******************************************************************************\
314* Functions/macros for progression change lists.
315\******************************************************************************/
316
317/* Create a progression change list. */
318jpc_pchglist_t *jpc_pchglist_create();
319
320/* Destroy a progression change list. */
321void jpc_pchglist_destroy(jpc_pchglist_t *pchglist);
322
323/* Insert a new element into a progression change list. */
324int jpc_pchglist_insert(jpc_pchglist_t *pchglist, int pchgno, jpc_pchg_t *pchg);
325
326/* Remove an element from a progression change list. */
327jpc_pchg_t *jpc_pchglist_remove(jpc_pchglist_t *pchglist, int pchgno);
328
329/* Get an element from a progression change list. */
330jpc_pchg_t *jpc_pchglist_get(jpc_pchglist_t *pchglist, int pchgno);
331
332/* Copy a progression change list. */
333jpc_pchglist_t *jpc_pchglist_copy(jpc_pchglist_t *pchglist);
334
335/* Get the number of elements in a progression change list. */
336int jpc_pchglist_numpchgs(jpc_pchglist_t *pchglist);
337
338/******************************************************************************\
339* Functions/macros for progression changes.
340\******************************************************************************/
341
342/* Destroy a progression change. */
343void jpc_pchg_destroy(jpc_pchg_t *pchg);
344
345/* Copy a progression change. */
346jpc_pchg_t *jpc_pchg_copy(jpc_pchg_t *pchg);
347
348#endif
349