[trunk] remove old opj_j2k struct
[openjpeg.git] / src / lib / openjp2 / j2k.h
1 /*
2  * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
3  * Copyright (c) 2002-2007, Professor Benoit Macq
4  * Copyright (c) 2001-2003, David Janssens
5  * Copyright (c) 2002-2003, Yannick Verschueren
6  * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
7  * Copyright (c) 2005, Herve Drolon, FreeImage Team
8  * Copyright (c) 2006-2007, Parvatha Elangovan
9  * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>
10  * Copyright (c) 2011, Mickael Savinaud, Communications & Systemes <mickael.savinaud@c-s.fr>
11  *
12  * All rights reserved.
13  *
14  * Redistribution and use in source and binary forms, with or without
15  * modification, are permitted provided that the following conditions
16  * are met:
17  * 1. Redistributions of source code must retain the above copyright
18  *    notice, this list of conditions and the following disclaimer.
19  * 2. Redistributions in binary form must reproduce the above copyright
20  *    notice, this list of conditions and the following disclaimer in the
21  *    documentation and/or other materials provided with the distribution.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
24  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
27  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
30  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
31  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33  * POSSIBILITY OF SUCH DAMAGE.
34  */
35 #ifndef __J2K_H
36 #define __J2K_H
37 /**
38 @file j2k.h
39 @brief The JPEG-2000 Codestream Reader/Writer (J2K)
40
41 The functions in J2K.C have for goal to read/write the several parts of the codestream: markers and data.
42 */
43
44 /** @defgroup J2K J2K - JPEG-2000 codestream reader/writer */
45 /*@{*/
46
47 #define J2K_CP_CSTY_PRT 0x01
48 #define J2K_CP_CSTY_SOP 0x02
49 #define J2K_CP_CSTY_EPH 0x04
50 #define J2K_CCP_CSTY_PRT 0x01
51 #define J2K_CCP_CBLKSTY_LAZY 0x01     /**< Selective arithmetic coding bypass */
52 #define J2K_CCP_CBLKSTY_RESET 0x02    /**< Reset context probabilities on coding pass boundaries */
53 #define J2K_CCP_CBLKSTY_TERMALL 0x04  /**< Termination on each coding pass */
54 #define J2K_CCP_CBLKSTY_VSC 0x08      /**< Vertically stripe causal context */
55 #define J2K_CCP_CBLKSTY_PTERM 0x10    /**< Predictable termination */
56 #define J2K_CCP_CBLKSTY_SEGSYM 0x20   /**< Segmentation symbols are used */
57 #define J2K_CCP_QNTSTY_NOQNT 0
58 #define J2K_CCP_QNTSTY_SIQNT 1
59 #define J2K_CCP_QNTSTY_SEQNT 2
60
61 /* ----------------------------------------------------------------------- */
62
63 #define J2K_MS_SOC 0xff4f       /**< SOC marker value */
64 #define J2K_MS_SOT 0xff90       /**< SOT marker value */
65 #define J2K_MS_SOD 0xff93       /**< SOD marker value */
66 #define J2K_MS_EOC 0xffd9       /**< EOC marker value */
67 #define J2K_MS_SIZ 0xff51       /**< SIZ marker value */
68 #define J2K_MS_COD 0xff52       /**< COD marker value */
69 #define J2K_MS_COC 0xff53       /**< COC marker value */
70 #define J2K_MS_RGN 0xff5e       /**< RGN marker value */
71 #define J2K_MS_QCD 0xff5c       /**< QCD marker value */
72 #define J2K_MS_QCC 0xff5d       /**< QCC marker value */
73 #define J2K_MS_POC 0xff5f       /**< POC marker value */
74 #define J2K_MS_TLM 0xff55       /**< TLM marker value */
75 #define J2K_MS_PLM 0xff57       /**< PLM marker value */
76 #define J2K_MS_PLT 0xff58       /**< PLT marker value */
77 #define J2K_MS_PPM 0xff60       /**< PPM marker value */
78 #define J2K_MS_PPT 0xff61       /**< PPT marker value */
79 #define J2K_MS_SOP 0xff91       /**< SOP marker value */
80 #define J2K_MS_EPH 0xff92       /**< EPH marker value */
81 #define J2K_MS_CRG 0xff63       /**< CRG marker value */
82 #define J2K_MS_COM 0xff64       /**< COM marker value */
83 #define J2K_MS_CBD 0xff78       /**< CBD marker value */
84 #define J2K_MS_MCC 0xff75       /**< MCC marker value */
85 #define J2K_MS_MCT 0xff74       /**< MCT marker value */
86 #define J2K_MS_MCO 0xff77       /**< MCO marker value */
87
88 #define J2K_MS_UNK 0            /**< UNKNOWN marker value */
89
90 /* UniPG>> */
91 #ifdef USE_JPWL
92 #define J2K_MS_EPC 0xff68       /**< EPC marker value (Part 11: JPEG 2000 for Wireless) */
93 #define J2K_MS_EPB 0xff66       /**< EPB marker value (Part 11: JPEG 2000 for Wireless) */ 
94 #define J2K_MS_ESD 0xff67       /**< ESD marker value (Part 11: JPEG 2000 for Wireless) */ 
95 #define J2K_MS_RED 0xff69       /**< RED marker value (Part 11: JPEG 2000 for Wireless) */
96 #endif /* USE_JPWL */
97 #ifdef USE_JPSEC
98 #define J2K_MS_SEC 0xff65    /**< SEC marker value (Part 8: Secure JPEG 2000) */
99 #define J2K_MS_INSEC 0xff94  /**< INSEC marker value (Part 8: Secure JPEG 2000) */
100 #endif /* USE_JPSEC */
101 /* <<UniPG */
102
103 /* ----------------------------------------------------------------------- */
104
105 /**
106  * Values that specify the status of the decoding process when decoding the main header.
107  * These values may be combined with a | operator.
108  * */
109 typedef enum J2K_STATUS {
110         J2K_STATE_NONE  =  0x0000, /**< a SOC marker is expected */
111         J2K_STATE_MHSOC  = 0x0001, /**< a SOC marker is expected */
112         J2K_STATE_MHSIZ  = 0x0002, /**< a SIZ marker is expected */
113         J2K_STATE_MH     = 0x0004, /**< the decoding process is in the main header */
114         J2K_STATE_TPHSOT = 0x0008, /**< the decoding process is in a tile part header and expects a SOT marker */
115         J2K_STATE_TPH    = 0x0010, /**< the decoding process is in a tile part header */
116         J2K_STATE_MT     = 0x0020, /**< the EOC marker has just been read */
117         J2K_STATE_NEOC   = 0x0040, /**< the decoding process must not expect a EOC marker because the codestream is truncated */
118
119         J2K_STATE_EOC    = 0x0100, /**< the decoding process has encountered the EOC marker */
120         J2K_STATE_ERR    = 0x8000  /**< the decoding process has encountered an error (FIXME warning V1 = 0x0080)*/
121 } J2K_STATUS;
122
123 /**
124  * Type of elements storing in the MCT data
125  */
126 typedef enum MCT_ELEMENT_TYPE
127 {
128         MCT_TYPE_INT16 = 0,             /** MCT data is stored as signed shorts*/
129         MCT_TYPE_INT32 = 1,             /** MCT data is stored as signed integers*/
130         MCT_TYPE_FLOAT = 2,             /** MCT data is stored as floats*/
131         MCT_TYPE_DOUBLE = 3             /** MCT data is stored as doubles*/
132 } J2K_MCT_ELEMENT_TYPE;
133
134 /**
135  * Type of MCT array
136  */
137 typedef enum MCT_ARRAY_TYPE
138 {
139         MCT_TYPE_DEPENDENCY = 0,
140         MCT_TYPE_DECORRELATION = 1,
141         MCT_TYPE_OFFSET = 2
142 } J2K_MCT_ARRAY_TYPE;
143
144 /* ----------------------------------------------------------------------- */
145
146 /** 
147 T2 encoding mode 
148 */
149 typedef enum T2_MODE {
150         THRESH_CALC = 0,        /** Function called in Rate allocation process*/
151         FINAL_PASS = 1          /** Function called in Tier 2 process*/
152 }J2K_T2_MODE;
153
154 /**
155  * Quantization stepsize
156  */
157 typedef struct opj_stepsize {
158         /** exponent */
159         int expn;
160         /** mantissa */
161         int mant;
162 } opj_stepsize_t;
163
164 /**
165 Tile-component coding parameters
166 */
167 typedef struct opj_tccp
168 {
169         /** coding style */
170         OPJ_UINT32 csty;
171         /** number of resolutions */
172         OPJ_UINT32 numresolutions;
173         /** code-blocks width */
174         OPJ_UINT32 cblkw;
175         /** code-blocks height */
176         OPJ_UINT32 cblkh;
177         /** code-block coding style */
178         OPJ_UINT32 cblksty;
179         /** discrete wavelet transform identifier */
180         OPJ_UINT32 qmfbid;
181         /** quantisation style */
182         OPJ_UINT32 qntsty;
183         /** stepsizes used for quantization */
184         opj_stepsize_t stepsizes[J2K_MAXBANDS];
185         /** number of guard bits */
186         OPJ_UINT32 numgbits;
187         /** Region Of Interest shift */
188         OPJ_INT32 roishift;
189         /** precinct width */
190         OPJ_UINT32 prcw[J2K_MAXRLVLS];
191         /** precinct height */
192         OPJ_UINT32 prch[J2K_MAXRLVLS];
193         /** the dc_level_shift **/
194         OPJ_INT32 m_dc_level_shift;
195 }
196 opj_tccp_t;
197
198
199 /** V1 STYLE
200 Tile coding parameters : 
201 this structure is used to store coding/decoding parameters common to all
202 tiles (information like COD, COC in main header)
203 */
204 typedef struct opj_tcp {
205         /** 1 : first part-tile of a tile */
206         int first;
207         /** coding style */
208         int csty;
209         /** progression order */
210         OPJ_PROG_ORDER prg;
211         /** number of layers */
212         int numlayers;
213         /** multi-component transform identifier */
214         int mct;
215         /** rates of layers */
216         float rates[100];
217         /** number of progression order changes */
218         int numpocs;
219         /** indicates if a POC marker has been used O:NO, 1:YES */
220         int POC;
221         /** progression order changes */
222         opj_poc_t pocs[32];
223         /** packet header store there for futur use in t2_decode_packet */
224         unsigned char *ppt_data;
225         /** pointer remaining on the first byte of the first header if ppt is used */
226         unsigned char *ppt_data_first;
227         /** If ppt == 1 --> there was a PPT marker for the present tile */
228         int ppt;
229         /** used in case of multiple marker PPT (number of info already stored) */
230         int ppt_store;
231         /** ppmbug1 */
232         int ppt_len;
233         /** add fixed_quality */
234         float distoratio[100];
235         /** tile-component coding parameters */
236         opj_tccp_t *tccps;
237 } opj_tcp_t;
238
239 /**
240  * FIXME DOC
241  */
242 typedef struct opj_mct_data
243 {
244         J2K_MCT_ELEMENT_TYPE m_element_type;
245         J2K_MCT_ARRAY_TYPE       m_array_type;
246         OPJ_UINT32                       m_index;
247         OPJ_BYTE *                       m_data;
248         OPJ_UINT32                       m_data_size;
249 }
250 opj_mct_data_t;
251
252 /**
253  * FIXME DOC
254  */
255 typedef struct opj_simple_mcc_decorrelation_data
256 {
257         OPJ_UINT32                       m_index;
258         OPJ_UINT32                       m_nb_comps;
259         opj_mct_data_t *         m_decorrelation_array;
260         opj_mct_data_t *         m_offset_array;
261         OPJ_UINT32                       m_is_irreversible : 1;
262 }
263 opj_simple_mcc_decorrelation_data_t;
264
265 /**
266 Tile coding parameters :
267 this structure is used to store coding/decoding parameters common to all
268 tiles (information like COD, COC in main header)
269 */
270 typedef struct opj_tcp_v2
271 {
272         /** coding style */
273         OPJ_UINT32 csty;
274         /** progression order */
275         OPJ_PROG_ORDER prg;
276         /** number of layers */
277         OPJ_UINT32 numlayers;
278         OPJ_UINT32 num_layers_to_decode;
279         /** multi-component transform identifier */
280         OPJ_UINT32 mct;
281         /** rates of layers */
282         OPJ_FLOAT32 rates[100];
283         /** number of progression order changes */
284         OPJ_UINT32 numpocs;
285         /** progression order changes */
286         opj_poc_t pocs[32];
287         /** packet header store there for futur use in t2_decode_packet */
288         OPJ_BYTE *ppt_data;
289         /** used to keep a track of the allocated memory */
290         OPJ_BYTE *ppt_buffer;
291         /** Number of bytes stored inside ppt_data*/
292         OPJ_UINT32 ppt_data_size;
293         /** size of ppt_data*/
294         OPJ_UINT32 ppt_len;
295         /** add fixed_quality */
296         OPJ_FLOAT32 distoratio[100];
297         /** tile-component coding parameters */
298         opj_tccp_t *tccps;
299         /** number of tile parts for the tile. */
300         OPJ_UINT32 m_nb_tile_parts;
301         /** data for the tile */
302         OPJ_BYTE *              m_data;
303         /** size of data */
304         OPJ_UINT32              m_data_size;
305         /** encoding norms */
306         OPJ_FLOAT64 *   mct_norms;
307         /** the mct decoding matrix */
308         OPJ_FLOAT32 *   m_mct_decoding_matrix;
309         /** the mct coding matrix */
310         OPJ_FLOAT32 *   m_mct_coding_matrix;
311         /** mct records */
312         opj_mct_data_t * m_mct_records;
313         /** the number of mct records. */
314         OPJ_UINT32 m_nb_mct_records;
315         /** the max number of mct records. */
316         OPJ_UINT32 m_nb_max_mct_records;
317         /** mcc records */
318         opj_simple_mcc_decorrelation_data_t * m_mcc_records;
319         /** the number of mct records. */
320         OPJ_UINT32 m_nb_mcc_records;
321         /** the max number of mct records. */
322         OPJ_UINT32 m_nb_max_mcc_records;
323
324
325         /***** FLAGS *******/
326         /** If ppt == 1 --> there was a PPT marker for the present tile */
327         OPJ_UINT32 ppt : 1;
328         /** indicates if a POC marker has been used O:NO, 1:YES */
329         OPJ_UINT32 POC : 1;
330 } opj_tcp_v2_t;
331
332
333
334
335
336 /** V1 STYLE
337 Coding parameters
338 */
339 typedef struct opj_cp {
340         /** Digital cinema profile*/
341         OPJ_CINEMA_MODE cinema;
342         /** Maximum rate for each component. If == 0, component size limitation is not considered */
343         int max_comp_size;
344         /** Size of the image in bits*/
345         int img_size;
346         /** Rsiz*/
347         OPJ_RSIZ_CAPABILITIES rsiz;
348         /** Enabling Tile part generation*/
349         char tp_on;
350         /** Flag determining tile part generation*/
351         char tp_flag;
352         /** Position of tile part flag in progression order*/
353         int tp_pos;
354         /** allocation by rate/distortion */
355         int disto_alloc;
356         /** allocation by fixed layer */
357         int fixed_alloc;
358         /** add fixed_quality */
359         int fixed_quality;
360         /** if != 0, then original dimension divided by 2^(reduce); if == 0 or not used, image is decoded to the full resolution */
361         int reduce;
362         /** if != 0, then only the first "layer" layers are decoded; if == 0 or not used, all the quality layers are decoded */
363         int layer;
364         /** if == NO_LIMITATION, decode entire codestream; if == LIMIT_TO_MAIN_HEADER then only decode the main header */
365         OPJ_LIMIT_DECODING limit_decoding;
366         /** XTOsiz */
367         int tx0;
368         /** YTOsiz */
369         int ty0;
370         /** XTsiz */
371         int tdx;
372         /** YTsiz */
373         int tdy;
374         /** comment for coding */
375         char *comment;
376         /** number of tiles in width */
377         int tw;
378         /** number of tiles in heigth */
379         int th;
380         /** ID number of the tiles present in the codestream */
381         int *tileno;
382         /** size of the vector tileno */
383         int tileno_size;
384         /** packet header store there for futur use in t2_decode_packet */
385         unsigned char *ppm_data;
386         /** pointer remaining on the first byte of the first header if ppm is used */
387         unsigned char *ppm_data_first;
388         /** if ppm == 1 --> there was a PPM marker for the present tile */
389         int ppm;
390         /** use in case of multiple marker PPM (number of info already store) */
391         int ppm_store;
392         /** use in case of multiple marker PPM (case on non-finished previous info) */
393         int ppm_previous;
394         /** ppmbug1 */
395         int ppm_len;
396         /** tile coding parameters */
397         opj_tcp_t *tcps;
398         /** fixed layer */
399         int *matrice;
400 /* UniPG>> */
401 #ifdef USE_JPWL
402         /** enables writing of EPC in MH, thus activating JPWL */
403         opj_bool epc_on;
404         /** enables writing of EPB, in case of activated JPWL */
405         opj_bool epb_on;
406         /** enables writing of ESD, in case of activated JPWL */
407         opj_bool esd_on;
408         /** enables writing of informative techniques of ESD, in case of activated JPWL */
409         opj_bool info_on;
410         /** enables writing of RED, in case of activated JPWL */
411         opj_bool red_on;
412         /** error protection method for MH (0,1,16,32,37-128) */
413         int hprot_MH;
414         /** tile number of header protection specification (>=0) */
415         int hprot_TPH_tileno[JPWL_MAX_NO_TILESPECS];
416         /** error protection methods for TPHs (0,1,16,32,37-128) */
417         int hprot_TPH[JPWL_MAX_NO_TILESPECS];
418         /** tile number of packet protection specification (>=0) */
419         int pprot_tileno[JPWL_MAX_NO_PACKSPECS];
420         /** packet number of packet protection specification (>=0) */
421         int pprot_packno[JPWL_MAX_NO_PACKSPECS];
422         /** error protection methods for packets (0,1,16,32,37-128) */
423         int pprot[JPWL_MAX_NO_PACKSPECS];
424         /** enables writing of ESD, (0/2/4 bytes) */
425         int sens_size;
426         /** sensitivity addressing size (0=auto/2/4 bytes) */
427         int sens_addr;
428         /** sensitivity range (0-3) */
429         int sens_range;
430         /** sensitivity method for MH (-1,0-7) */
431         int sens_MH;
432         /** tile number of sensitivity specification (>=0) */
433         int sens_TPH_tileno[JPWL_MAX_NO_TILESPECS];
434         /** sensitivity methods for TPHs (-1,0-7) */
435         int sens_TPH[JPWL_MAX_NO_TILESPECS];
436         /** enables JPWL correction at the decoder */
437         opj_bool correct;
438         /** expected number of components at the decoder */
439         int exp_comps;
440         /** maximum number of tiles at the decoder */
441         int max_tiles;
442 #endif /* USE_JPWL */
443 /* <<UniPG */
444 } opj_cp_t;
445
446 typedef struct opj_encoding_param
447 {
448         /** Digital cinema profile*/
449         OPJ_CINEMA_MODE m_cinema;
450         /** Maximum rate for each component. If == 0, component size limitation is not considered */
451         OPJ_UINT32 m_max_comp_size;
452         /** Position of tile part flag in progression order*/
453         OPJ_INT32 m_tp_pos;
454         /** fixed layer */
455         OPJ_INT32 *m_matrice;
456         /** Flag determining tile part generation*/
457         OPJ_BYTE m_tp_flag;
458         /** allocation by rate/distortion */
459         OPJ_UINT32 m_disto_alloc : 1;
460         /** allocation by fixed layer */
461         OPJ_UINT32 m_fixed_alloc : 1;
462         /** add fixed_quality */
463         OPJ_UINT32 m_fixed_quality : 1;
464         /** Enabling Tile part generation*/
465         OPJ_UINT32 m_tp_on : 1;
466 }
467 opj_encoding_param_t;
468
469 typedef struct opj_decoding_param
470 {
471         /** if != 0, then original dimension divided by 2^(reduce); if == 0 or not used, image is decoded to the full resolution */
472         OPJ_UINT32 m_reduce;
473         /** if != 0, then only the first "layer" layers are decoded; if == 0 or not used, all the quality layers are decoded */
474         OPJ_UINT32 m_layer;
475 }
476 opj_decoding_param_t;
477
478
479 /**
480  * Coding parameters
481  */
482 typedef struct opj_cp_v2
483 {
484         /** Size of the image in bits*/
485         /*int img_size;*/
486         /** Rsiz*/
487         OPJ_RSIZ_CAPABILITIES rsiz;
488         /** XTOsiz */
489         OPJ_UINT32 tx0; /* MSD see norm */
490         /** YTOsiz */
491         OPJ_UINT32 ty0; /* MSD see norm */
492         /** XTsiz */
493         OPJ_UINT32 tdx;
494         /** YTsiz */
495         OPJ_UINT32 tdy;
496         /** comment */
497         OPJ_CHAR *comment;
498         /** number of tiles in width */
499         OPJ_UINT32 tw;
500         /** number of tiles in heigth */
501         OPJ_UINT32 th;
502
503         /** packet header store there for futur use in t2_decode_packet */
504         OPJ_BYTE *ppm_data;
505         /** size of the ppm_data*/
506         OPJ_UINT32 ppm_len;
507         /** size of the ppm_data*/
508         OPJ_UINT32 ppm_data_read;
509
510         OPJ_BYTE *ppm_data_current;
511
512         /** packet header storage original buffer */
513         OPJ_BYTE *ppm_buffer;
514         /** pointer remaining on the first byte of the first header if ppm is used */
515         OPJ_BYTE *ppm_data_first;
516         /** Number of bytes actually stored inside the ppm_data */
517         OPJ_UINT32 ppm_data_size;
518         /** use in case of multiple marker PPM (number of info already store) */
519         OPJ_INT32 ppm_store;
520         /** use in case of multiple marker PPM (case on non-finished previous info) */
521         OPJ_INT32 ppm_previous;
522
523         /** tile coding parameters */
524         opj_tcp_v2_t *tcps;
525
526         union
527         {
528                 opj_decoding_param_t m_dec;
529                 opj_encoding_param_t m_enc;
530         }
531         m_specific_param;
532
533
534 /* UniPG>> */
535 #ifdef USE_JPWL
536         /** enables writing of EPC in MH, thus activating JPWL */
537         opj_bool epc_on;
538         /** enables writing of EPB, in case of activated JPWL */
539         opj_bool epb_on;
540         /** enables writing of ESD, in case of activated JPWL */
541         opj_bool esd_on;
542         /** enables writing of informative techniques of ESD, in case of activated JPWL */
543         opj_bool info_on;
544         /** enables writing of RED, in case of activated JPWL */
545         opj_bool red_on;
546         /** error protection method for MH (0,1,16,32,37-128) */
547         int hprot_MH;
548         /** tile number of header protection specification (>=0) */
549         int hprot_TPH_tileno[JPWL_MAX_NO_TILESPECS];
550         /** error protection methods for TPHs (0,1,16,32,37-128) */
551         int hprot_TPH[JPWL_MAX_NO_TILESPECS];
552         /** tile number of packet protection specification (>=0) */
553         int pprot_tileno[JPWL_MAX_NO_PACKSPECS];
554         /** packet number of packet protection specification (>=0) */
555         int pprot_packno[JPWL_MAX_NO_PACKSPECS];
556         /** error protection methods for packets (0,1,16,32,37-128) */
557         int pprot[JPWL_MAX_NO_PACKSPECS];
558         /** enables writing of ESD, (0/2/4 bytes) */
559         int sens_size;
560         /** sensitivity addressing size (0=auto/2/4 bytes) */
561         int sens_addr;
562         /** sensitivity range (0-3) */
563         int sens_range;
564         /** sensitivity method for MH (-1,0-7) */
565         int sens_MH;
566         /** tile number of sensitivity specification (>=0) */
567         int sens_TPH_tileno[JPWL_MAX_NO_TILESPECS];
568         /** sensitivity methods for TPHs (-1,0-7) */
569         int sens_TPH[JPWL_MAX_NO_TILESPECS];
570         /** enables JPWL correction at the decoder */
571         opj_bool correct;
572         /** expected number of components at the decoder */
573         int exp_comps;
574         /** maximum number of tiles at the decoder */
575         OPJ_UINT32 max_tiles;
576 #endif /* USE_JPWL */
577
578         /******** FLAGS *********/
579         /** if ppm == 1 --> there was a PPM marker*/
580         OPJ_UINT32 ppm : 1;
581         /** tells if the parameter is a coding or decoding one */
582         OPJ_UINT32 m_is_decoder : 1;
583 /* <<UniPG */
584 } opj_cp_v2_t;
585
586
587 typedef struct opj_j2k_dec
588 {
589         /** locate in which part of the codestream the decoder is (main header, tile header, end) */
590         OPJ_UINT32 m_state;
591         /**
592          * store decoding parameters common to all tiles (information like COD, COC in main header)
593          */
594         opj_tcp_v2_t *m_default_tcp;
595         OPJ_BYTE  *m_header_data;
596         OPJ_UINT32 m_header_data_size;
597         /** to tell the tile part length */
598         OPJ_UINT32 m_sot_length;
599         /** Only tiles index in the correct range will be decoded.*/
600         OPJ_UINT32 m_start_tile_x;
601         OPJ_UINT32 m_start_tile_y;
602         OPJ_UINT32 m_end_tile_x;
603         OPJ_UINT32 m_end_tile_y;
604         /**
605          * Decoded area set by the user
606          */
607         OPJ_UINT32 m_DA_x0;
608         OPJ_UINT32 m_DA_y0;
609         OPJ_UINT32 m_DA_x1;
610         OPJ_UINT32 m_DA_y1;
611
612         /** Index of the tile to decode (used in get_tile) */
613         OPJ_INT32 m_tile_ind_to_dec;
614         /** Position of the last SOT marker read */
615         OPJ_OFF_T m_last_sot_read_pos;
616
617         /**
618          * Indicate that the current tile-part is assume as the last tile part of the codestream.
619          * It is useful in the case of PSot is equal to zero. The sot length will be compute in the
620          * SOD reader function. FIXME NOT USED for the moment
621          */
622         opj_bool   m_last_tile_part;
623         /** to tell that a tile can be decoded. */
624         OPJ_UINT32 m_can_decode                 : 1;
625         OPJ_UINT32 m_discard_tiles              : 1;
626         OPJ_UINT32 m_skip_data                  : 1;
627
628 } opj_j2k_dec_t;
629
630 typedef struct opj_j2k_enc
631 {
632         /** Tile part number, regardless of poc, for each new poc, tp is reset to 1*/
633         OPJ_UINT32 m_current_poc_tile_part_number; /* tp_num */
634
635         /** Tile part number currently coding, taking into account POC. m_current_tile_part_number holds the total number of tile parts while encoding the last tile part.*/
636         OPJ_UINT32 m_current_tile_part_number; /*cur_tp_num */
637
638         /**
639         locate the start position of the TLM marker
640         after encoding the tilepart, a jump (in j2k_write_sod) is done to the TLM marker to store the value of its length.
641         */
642     OPJ_OFF_T m_tlm_start;
643         /**
644          * Stores the sizes of the tlm.
645          */
646         OPJ_BYTE * m_tlm_sot_offsets_buffer;
647         /**
648          * The current offset of the tlm buffer.
649          */
650         OPJ_BYTE * m_tlm_sot_offsets_current;
651
652         /** Total num of tile parts in whole image = num tiles* num tileparts in each tile*/
653         /** used in TLMmarker*/
654         OPJ_UINT32 m_total_tile_parts;   /* totnum_tp */
655
656         /* encoded data for a tile */
657         OPJ_BYTE * m_encoded_tile_data;
658
659         /* size of the encoded_data */
660         OPJ_UINT32 m_encoded_tile_size;
661
662         /* encoded data for a tile */
663         OPJ_BYTE * m_header_tile_data;
664
665         /* size of the encoded_data */
666         OPJ_UINT32 m_header_tile_data_size;
667
668
669 } opj_j2k_enc_t;
670
671
672
673 struct opj_tcd_v2;
674 /**
675 JPEG-2000 codestream reader/writer
676 */
677 typedef struct opj_j2k_v2
678 {
679         /* J2K codestream is decoded*/
680         opj_bool m_is_decoder;
681
682         /* FIXME DOC*/
683         union
684         {
685                 opj_j2k_dec_t m_decoder;
686                 opj_j2k_enc_t m_encoder;
687         }
688         m_specific_param;
689
690         /** pointer to the internal/private encoded / decoded image */
691         opj_image_t* m_private_image;
692
693         /* pointer to the output image (decoded)*/
694         opj_image_t* m_output_image;
695
696         /** Coding parameters */
697         opj_cp_v2_t m_cp;
698
699         /** the list of procedures to exec **/
700         struct opj_procedure_list *     m_procedure_list;
701
702         /** the list of validation procedures to follow to make sure the code is valid **/
703         struct opj_procedure_list *     m_validation_list;
704
705         /** helper used to write the index file */
706         opj_codestream_index_t *cstr_index;
707
708         /** number of the tile curently concern by coding/decoding */
709         OPJ_UINT32 m_current_tile_number;
710
711         /** the current tile coder/decoder **/
712         struct opj_tcd_v2 *     m_tcd;
713
714 }
715 opj_j2k_v2_t;
716
717
718
719
720 /** @name Exported functions */
721 /*@{*/
722 /* ----------------------------------------------------------------------- */
723
724 /**
725 Setup the decoder decoding parameters using user parameters.
726 Decoding parameters are returned in j2k->cp. 
727 @param j2k J2K decompressor handle
728 @param parameters decompression parameters
729 */
730 void opj_j2k_setup_decoder(opj_j2k_v2_t *j2k, opj_dparameters_t *parameters);
731
732 /**
733  * Creates a J2K compression structure
734  *
735  * @return Returns a handle to a J2K compressor if successful, returns NULL otherwise
736 */
737 opj_j2k_v2_t* opj_j2k_create_compress(void);
738
739
740 void opj_j2k_setup_encoder(     opj_j2k_v2_t *p_j2k,
741                                                     opj_cparameters_t *parameters,
742                                                     opj_image_t *image,
743                                                     opj_event_mgr_t * p_manager);
744
745 /**
746 Converts an enum type progression order to string type
747 */
748 char *opj_j2k_convert_progression_order(OPJ_PROG_ORDER prg_order);
749
750 /* ----------------------------------------------------------------------- */
751 /*@}*/
752
753 /*@}*/
754
755 /**
756  * Ends the decompression procedures and possibiliy add data to be read after the
757  * codestream.
758  */
759 opj_bool opj_j2k_end_decompress(opj_j2k_v2_t *j2k,
760                                 opj_stream_private_t *p_stream,
761                                 opj_event_mgr_t * p_manager);
762
763 /**
764  * Reads a jpeg2000 codestream header structure.
765  *
766  * @param p_stream the stream to read data from.
767  * @param p_j2k the jpeg2000 codec.
768  * @param p_image FIXME DOC
769  * @param p_manager the user event manager.
770  *
771  * @return true if the box is valid.
772  */
773 opj_bool opj_j2k_read_header(   opj_stream_private_t *p_stream,
774                                 opj_j2k_v2_t* p_j2k,
775                                 opj_image_t** p_image,
776                                 opj_event_mgr_t* p_manager );
777
778
779 /**
780  * Destroys a jpeg2000 codec.
781  *
782  * @param       p_j2k   the jpeg20000 structure to destroy.
783  */
784 void opj_j2k_destroy (opj_j2k_v2_t *p_j2k);
785
786 /**
787  * Destroys a codestream index structure.
788  *
789  * @param       p_cstr_ind      the codestream index parameter to destroy.
790  */
791 void j2k_destroy_cstr_index (opj_codestream_index_t *p_cstr_ind);
792
793 /**
794  * Decode tile data.
795  * @param       p_j2k           the jpeg2000 codec.
796  * @param       p_tile_index
797  * @param p_data       FIXME DOC
798  * @param p_data_size  FIXME DOC
799  * @param       p_stream                        the stream to write data to.
800  * @param       p_manager       the user event manager.
801  */
802 opj_bool opj_j2k_decode_tile (  opj_j2k_v2_t * p_j2k,
803                                 OPJ_UINT32 p_tile_index,
804                                 OPJ_BYTE * p_data,
805                                 OPJ_UINT32 p_data_size,
806                                 opj_stream_private_t *p_stream,
807                                 opj_event_mgr_t * p_manager );
808
809 /**
810  * Reads a tile header.
811  * @param       p_j2k           the jpeg2000 codec.
812  * @param       p_tile_index FIXME DOC
813  * @param       p_data_size FIXME DOC
814  * @param       p_tile_x0 FIXME DOC
815  * @param       p_tile_y0 FIXME DOC
816  * @param       p_tile_x1 FIXME DOC
817  * @param       p_tile_y1 FIXME DOC
818  * @param       p_nb_comps FIXME DOC
819  * @param       p_go_on FIXME DOC
820  * @param       p_stream                        the stream to write data to.
821  * @param       p_manager       the user event manager.
822  */
823 opj_bool opj_j2k_read_tile_header ( opj_j2k_v2_t * p_j2k,
824                                     OPJ_UINT32 * p_tile_index,
825                                     OPJ_UINT32 * p_data_size,
826                                     OPJ_INT32 * p_tile_x0,
827                                     OPJ_INT32 * p_tile_y0,
828                                     OPJ_INT32 * p_tile_x1,
829                                     OPJ_INT32 * p_tile_y1,
830                                     OPJ_UINT32 * p_nb_comps,
831                                     opj_bool * p_go_on,
832                                     opj_stream_private_t *p_stream,
833                                     opj_event_mgr_t * p_manager );
834
835
836 /**
837  * Sets the given area to be decoded. This function should be called right after opj_read_header and before any tile header reading.
838  *
839  * @param       p_j2k                   the jpeg2000 codec.
840  * @param       p_image     FIXME DOC
841  * @param       p_start_x               the left position of the rectangle to decode (in image coordinates).
842  * @param       p_start_y               the up position of the rectangle to decode (in image coordinates).
843  * @param       p_end_x                 the right position of the rectangle to decode (in image coordinates).
844  * @param       p_end_y                 the bottom position of the rectangle to decode (in image coordinates).
845  * @param       p_manager               the user event manager
846  *
847  * @return      true                    if the area could be set.
848  */
849 opj_bool opj_j2k_set_decode_area(       opj_j2k_v2_t *p_j2k,
850                                                                     opj_image_t* p_image,
851                                                                     OPJ_INT32 p_start_x, OPJ_INT32 p_start_y,
852                                                                     OPJ_INT32 p_end_x, OPJ_INT32 p_end_y,
853                                                                     opj_event_mgr_t * p_manager );
854
855 /**
856  * Creates a J2K decompression structure.
857  *
858  * @return a handle to a J2K decompressor if successful, NULL otherwise.
859  */
860 opj_j2k_v2_t* opj_j2k_create_decompress(void);
861
862
863 /**
864  * Dump some elements from the J2K decompression structure .
865  *
866  *@param p_j2k                          the jpeg2000 codec.
867  *@param flag                           flag to describe what elments are dump.
868  *@param out_stream                     output stream where dump the elements.
869  *
870 */
871 void j2k_dump (opj_j2k_v2_t* p_j2k, OPJ_INT32 flag, FILE* out_stream);
872
873
874
875 /**
876  * Dump an image header structure.
877  *
878  *@param image                  the image header to dump.
879  *@param dev_dump_flag          flag to describe if we are in the case of this function is use outside j2k_dump function
880  *@param out_stream                     output stream where dump the elements.
881  */
882 void j2k_dump_image_header(opj_image_t* image, opj_bool dev_dump_flag, FILE* out_stream);
883
884 /**
885  * Dump a component image header structure.
886  *
887  *@param comp           the component image header to dump.
888  *@param dev_dump_flag          flag to describe if we are in the case of this function is use outside j2k_dump function
889  *@param out_stream                     output stream where dump the elements.
890  */
891 void j2k_dump_image_comp_header(opj_image_comp_t* comp, opj_bool dev_dump_flag, FILE* out_stream);
892
893 /**
894  * Get the codestream info from a JPEG2000 codec.
895  *
896  *@param        p_j2k                           the component image header to dump.
897  *
898  *@return       the codestream information extract from the jpg2000 codec
899  */
900 opj_codestream_info_v2_t* j2k_get_cstr_info(opj_j2k_v2_t* p_j2k);
901
902 /**
903  * Get the codestream index from a JPEG2000 codec.
904  *
905  *@param        p_j2k                           the component image header to dump.
906  *
907  *@return       the codestream index extract from the jpg2000 codec
908  */
909 opj_codestream_index_t* j2k_get_cstr_index(opj_j2k_v2_t* p_j2k);
910
911 /**
912  * Decode an image from a JPEG-2000 codestream
913  * @param j2k J2K decompressor handle
914  * @param p_stream  FIXME DOC
915  * @param p_image   FIXME DOC
916  * @param p_manager FIXME DOC
917  * @return FIXME DOC
918 */
919 opj_bool opj_j2k_decode(opj_j2k_v2_t *j2k,
920                         opj_stream_private_t *p_stream,
921                         opj_image_t *p_image,
922                         opj_event_mgr_t *p_manager);
923
924
925 opj_bool opj_j2k_get_tile(      opj_j2k_v2_t *p_j2k,
926                                                 opj_stream_private_t *p_stream,
927                                                 opj_image_t* p_image,
928                                                 opj_event_mgr_t * p_manager,
929                                                     OPJ_UINT32 tile_index );
930
931 opj_bool opj_j2k_set_decoded_resolution_factor(opj_j2k_v2_t *p_j2k, 
932                                                OPJ_UINT32 res_factor,
933                                                opj_event_mgr_t * p_manager);
934
935
936 /**
937  * Writes a tile.
938  * @param       p_j2k           the jpeg2000 codec.
939  * @param p_tile_index FIXME DOC
940  * @param p_data FIXME DOC
941  * @param p_data_size FIXME DOC
942  * @param       p_stream                        the stream to write data to.
943  * @param       p_manager       the user event manager.
944  */
945 opj_bool opj_j2k_write_tile (   opj_j2k_v2_t * p_j2k,
946                                                             OPJ_UINT32 p_tile_index,
947                                                             OPJ_BYTE * p_data,
948                                                             OPJ_UINT32 p_data_size,
949                                                             opj_stream_private_t *p_stream,
950                                                             opj_event_mgr_t * p_manager );
951
952 /**
953  * Encodes an image into a JPEG-2000 codestream
954  */
955 opj_bool opj_j2k_encode_v2(     opj_j2k_v2_t * p_j2k,
956                                                 opj_stream_private_t *cio,
957                                                 opj_event_mgr_t * p_manager );
958
959 /**
960  * Starts a compression scheme, i.e. validates the codec parameters, writes the header.
961  *
962  * @param       p_j2k           the jpeg2000 codec.
963  * @param       p_stream                        the stream object.
964  * @param       p_image FIXME DOC
965  * @param       p_manager       the user event manager.
966  *
967  * @return true if the codec is valid.
968  */
969 opj_bool opj_j2k_start_compress(opj_j2k_v2_t *p_j2k,
970                                                             opj_stream_private_t *p_stream,
971                                                             opj_image_t * p_image,
972                                                             opj_event_mgr_t * p_manager);
973
974 /**
975  * Ends the compression procedures and possibiliy add data to be read after the
976  * codestream.
977  */
978 opj_bool opj_j2k_end_compress(  opj_j2k_v2_t *p_j2k,
979                                                             opj_stream_private_t *cio,
980                                                             opj_event_mgr_t * p_manager);
981
982 opj_bool opj_j2k_setup_mct_encoding (opj_tcp_v2_t * p_tcp, opj_image_t * p_image);
983
984
985 #endif /* __J2K_H */