Initial commit of openjpeg version 2. Temprarily added as a separate directory in...
[openjpeg.git] / v2 / libopenjpeg / j2k.h
1 /*\r
2  * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium\r
3  * Copyright (c) 2002-2007, Professor Benoit Macq\r
4  * Copyright (c) 2001-2003, David Janssens\r
5  * Copyright (c) 2002-2003, Yannick Verschueren\r
6  * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe\r
7  * Copyright (c) 2005, Herve Drolon, FreeImage Team\r
8  * Copyright (c) 2006-2007, Parvatha Elangovan\r
9  * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>\r
10  * All rights reserved.\r
11  *\r
12  * Redistribution and use in source and binary forms, with or without\r
13  * modification, are permitted provided that the following conditions\r
14  * are met:\r
15  * 1. Redistributions of source code must retain the above copyright\r
16  *    notice, this list of conditions and the following disclaimer.\r
17  * 2. Redistributions in binary form must reproduce the above copyright\r
18  *    notice, this list of conditions and the following disclaimer in the\r
19  *    documentation and/or other materials provided with the distribution.\r
20  *\r
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
22  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
25  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
26  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
27  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
28  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
29  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
31  * POSSIBILITY OF SUCH DAMAGE.\r
32  */\r
33 #ifndef __J2K_H\r
34 #define __J2K_H\r
35 /**\r
36 @file j2k.h\r
37 @brief The JPEG-2000 Codestream Reader/Writer (J2K)\r
38 \r
39 The functions in J2K.C have for goal to read/write the several parts of the codestream: markers and data.\r
40 */\r
41 \r
42 #include "openjpeg.h"\r
43 \r
44 struct opj_dparameters;\r
45 struct opj_stream_private;\r
46 struct opj_event_mgr;\r
47 /** @defgroup J2K J2K - JPEG-2000 codestream reader/writer */\r
48 /*@{*/\r
49 \r
50 #define J2K_CP_CSTY_PRT 0x01\r
51 #define J2K_CP_CSTY_SOP 0x02\r
52 #define J2K_CP_CSTY_EPH 0x04\r
53 #define J2K_CCP_CSTY_PRT 0x01\r
54 #define J2K_CCP_CBLKSTY_LAZY 0x01\r
55 #define J2K_CCP_CBLKSTY_RESET 0x02\r
56 #define J2K_CCP_CBLKSTY_TERMALL 0x04\r
57 #define J2K_CCP_CBLKSTY_VSC 0x08\r
58 #define J2K_CCP_CBLKSTY_PTERM 0x10\r
59 #define J2K_CCP_CBLKSTY_SEGSYM 0x20\r
60 #define J2K_CCP_QNTSTY_NOQNT 0\r
61 #define J2K_CCP_QNTSTY_SIQNT 1\r
62 #define J2K_CCP_QNTSTY_SEQNT 2\r
63 \r
64 /* ----------------------------------------------------------------------- */\r
65 \r
66 #define J2K_MS_SOC 0xff4f       /**< SOC marker value */\r
67 #define J2K_MS_SOT 0xff90       /**< SOT marker value */\r
68 #define J2K_MS_SOD 0xff93       /**< SOD marker value */\r
69 #define J2K_MS_EOC 0xffd9       /**< EOC marker value */\r
70 #define J2K_MS_SIZ 0xff51       /**< SIZ marker value */\r
71 #define J2K_MS_COD 0xff52       /**< COD marker value */\r
72 #define J2K_MS_COC 0xff53       /**< COC marker value */\r
73 #define J2K_MS_RGN 0xff5e       /**< RGN marker value */\r
74 #define J2K_MS_QCD 0xff5c       /**< QCD marker value */\r
75 #define J2K_MS_QCC 0xff5d       /**< QCC marker value */\r
76 #define J2K_MS_POC 0xff5f       /**< POC marker value */\r
77 #define J2K_MS_TLM 0xff55       /**< TLM marker value */\r
78 #define J2K_MS_PLM 0xff57       /**< PLM marker value */\r
79 #define J2K_MS_PLT 0xff58       /**< PLT marker value */\r
80 #define J2K_MS_PPM 0xff60       /**< PPM marker value */\r
81 #define J2K_MS_PPT 0xff61       /**< PPT marker value */\r
82 #define J2K_MS_SOP 0xff91       /**< SOP marker value */\r
83 #define J2K_MS_EPH 0xff92       /**< EPH marker value */\r
84 #define J2K_MS_CRG 0xff63       /**< CRG marker value */\r
85 #define J2K_MS_COM 0xff64       /**< COM marker value */\r
86 #define J2K_MS_CBD 0xff78       /**< CBD marker value */\r
87 #define J2K_MS_MCC 0xff75       /**< MCC marker value */\r
88 #define J2K_MS_MCT 0xff74       /**< MCT marker value */\r
89 #define J2K_MS_MCO 0xff77       /**< MCO marker value */\r
90 \r
91 /* UniPG>> */\r
92 #ifdef USE_JPWL\r
93 #define J2K_MS_EPC 0xff68       /**< EPC marker value (Part 11: JPEG 2000 for Wireless) */\r
94 #define J2K_MS_EPB 0xff66       /**< EPB marker value (Part 11: JPEG 2000 for Wireless) */ \r
95 #define J2K_MS_ESD 0xff67       /**< ESD marker value (Part 11: JPEG 2000 for Wireless) */ \r
96 #define J2K_MS_RED 0xff69       /**< RED marker value (Part 11: JPEG 2000 for Wireless) */\r
97 #endif /* USE_JPWL */\r
98 #ifdef USE_JPSEC\r
99 #define J2K_MS_SEC 0xff65    /**< SEC marker value (Part 8: Secure JPEG 2000) */\r
100 #define J2K_MS_INSEC 0xff94  /**< INSEC marker value (Part 8: Secure JPEG 2000) */\r
101 #endif /* USE_JPSEC */\r
102 /* <<UniPG */\r
103 \r
104 \r
105 /* ----------------------------------------------------------------------- */\r
106 \r
107 /**\r
108 Values that specify the status of the decoding process when decoding the main header. \r
109 These values may be combined with a | operator. \r
110 */\r
111 typedef enum\r
112 {\r
113         J2K_DEC_STATE_NONE  =  0x0000, /**< a SOC marker is expected */\r
114         J2K_DEC_STATE_MHSOC  = 0x0001, /**< a SOC marker is expected */\r
115         J2K_DEC_STATE_MHSIZ  = 0x0002, /**< a SIZ marker is expected */\r
116         J2K_DEC_STATE_MH     = 0x0004, /**< the decoding process is in the main header */\r
117         J2K_DEC_STATE_TPHSOT = 0x0008, /**< the decoding process is in a tile part header and expects a SOT marker */\r
118         J2K_DEC_STATE_TPH    = 0x0010, /**< the decoding process is in a tile part header */\r
119         J2K_DEC_STATE_MT     = 0x0020, /**< the EOC marker has just been read */\r
120         J2K_DEC_STATE_NEOC   = 0x0040, /**< the decoding process must not expect a EOC marker because the codestream is truncated */\r
121         J2K_DEC_STATE_DATA   = 0x0080, /**< the decoding process must not expect a EOC marker because the codestream is truncated */\r
122         J2K_DEC_STATE_ERR    = 0x8000,  /**< the decoding process has encountered an error */\r
123         J2K_DEC_STATE_EOC        = 0x0100\r
124\r
125 J2K_DECODING_STATUS;\r
126 \r
127 /**\r
128 Values that specify the status of the decoding process when decoding the main header. \r
129 These values may be combined with a | operator. \r
130 */\r
131 typedef enum\r
132 {\r
133         J2K_ENC_STATE_NONE  =  0x0000, /**< a SOC marker is expected */\r
134         J2K_ENC_STATE_ENCODE  = 0x0001, /**< a SOC marker is expected */\r
135\r
136 J2K_ENCODING_STATUS;\r
137 \r
138 /** \r
139  * Type of data for storing the MCT data\r
140  */\r
141 typedef enum MCT_ELEMENT_TYPE \r
142 {\r
143         MCT_TYPE_INT16 = 0,             /** MCT data is stored as signed shorts*/\r
144         MCT_TYPE_INT32 = 1,             /** MCT data is stored as signed integers*/\r
145         MCT_TYPE_FLOAT = 2,             /** MCT data is stored as floats*/\r
146         MCT_TYPE_DOUBLE = 3             /** MCT data is stored as doubles*/\r
147 } J2K_MCT_ELEMENT_TYPE;\r
148 \r
149 /** \r
150  * Type of data for storing the MCT data\r
151  */\r
152 typedef enum MCT_ARRAY_TYPE \r
153 {\r
154         MCT_TYPE_DEPENDENCY = 0,                \r
155         MCT_TYPE_DECORRELATION = 1,\r
156         MCT_TYPE_OFFSET = 2     \r
157 } J2K_MCT_ARRAY_TYPE;\r
158 \r
159 \r
160 /* ----------------------------------------------------------------------- */\r
161 \r
162 \r
163 \r
164 /**\r
165 Quantization stepsize\r
166 */\r
167 typedef struct opj_stepsize \r
168 {\r
169         /** exponent */\r
170         OPJ_UINT32 expn;\r
171         /** mantissa */\r
172         OPJ_UINT32 mant;\r
173\r
174 opj_stepsize_t;\r
175 \r
176 typedef struct opj_mct_data\r
177 {\r
178         J2K_MCT_ELEMENT_TYPE m_element_type;\r
179         J2K_MCT_ARRAY_TYPE       m_array_type;\r
180         OPJ_UINT32                       m_index;\r
181         OPJ_BYTE *                       m_data;\r
182         OPJ_UINT32                       m_data_size;\r
183 }\r
184 opj_mct_data_t;\r
185 \r
186 typedef struct opj_simple_mcc_decorrelation_data\r
187 {\r
188         OPJ_UINT32                       m_index;\r
189         OPJ_UINT32                       m_nb_comps;\r
190         opj_mct_data_t *         m_decorrelation_array;\r
191         opj_mct_data_t *         m_offset_array;\r
192         OPJ_UINT32                       m_is_irreversible : 1;\r
193 }\r
194 opj_simple_mcc_decorrelation_data_t;\r
195 \r
196 \r
197 /**\r
198 Tile-component coding parameters\r
199 */\r
200 typedef struct opj_tccp \r
201 {\r
202         /** coding style */\r
203         OPJ_UINT32 csty;\r
204         /** number of resolutions */\r
205         OPJ_UINT32 numresolutions;\r
206         /** code-blocks width */\r
207         OPJ_UINT32 cblkw;\r
208         /** code-blocks height */\r
209         OPJ_UINT32 cblkh;\r
210         /** code-block coding style */\r
211         OPJ_UINT32 cblksty;\r
212         /** discrete wavelet transform identifier */\r
213         OPJ_UINT32 qmfbid;\r
214         /** quantisation style */\r
215         OPJ_UINT32 qntsty;\r
216         /** stepsizes used for quantization */\r
217         opj_stepsize_t stepsizes[J2K_MAXBANDS];\r
218         /** number of guard bits */\r
219         OPJ_UINT32 numgbits;\r
220         /** Region Of Interest shift */\r
221         OPJ_INT32 roishift;\r
222         /** precinct width */\r
223         OPJ_UINT32 prcw[J2K_MAXRLVLS];\r
224         /** precinct height */\r
225         OPJ_UINT32 prch[J2K_MAXRLVLS];\r
226         /** the dc_level_shift **/\r
227         OPJ_INT32 m_dc_level_shift;\r
228\r
229 opj_tccp_t;\r
230 \r
231 /**\r
232 Tile coding parameters : \r
233 this structure is used to store coding/decoding parameters common to all\r
234 tiles (information like COD, COC in main header)\r
235 */\r
236 typedef struct opj_tcp \r
237 {\r
238         /** coding style */\r
239         OPJ_UINT32 csty;\r
240         /** progression order */\r
241         OPJ_PROG_ORDER prg;\r
242         /** number of layers */\r
243         OPJ_UINT32 numlayers;\r
244         OPJ_UINT32 num_layers_to_decode;\r
245         /** multi-component transform identifier */\r
246         OPJ_UINT32 mct;\r
247         /** rates of layers */\r
248         OPJ_FLOAT32 rates[100];\r
249         /** number of progression order changes */\r
250         OPJ_UINT32 numpocs;\r
251         /** progression order changes */\r
252         opj_poc_t pocs[32];\r
253         /** packet header store there for futur use in t2_decode_packet */\r
254         OPJ_BYTE *ppt_data;\r
255         /** used to keep a track of the allocated memory */\r
256         OPJ_BYTE *ppt_buffer;\r
257         /** Number of bytes stored inside ppt_data*/\r
258         OPJ_UINT32 ppt_data_size;\r
259         /** size of ppt_data*/\r
260         OPJ_UINT32 ppt_len;\r
261         /** add fixed_quality */\r
262         OPJ_FLOAT32 distoratio[100];\r
263         /** tile-component coding parameters */\r
264         opj_tccp_t *tccps;\r
265         /** number of tile parts for the tile. */\r
266         OPJ_UINT32 m_nb_tile_parts;\r
267         /** data for the tile */\r
268         OPJ_BYTE *              m_data;\r
269         /** size of data */\r
270         OPJ_UINT32              m_data_size;\r
271         /** encoding norms */\r
272         OPJ_FLOAT64 *   mct_norms;\r
273         /** the mct decoding matrix */\r
274         OPJ_FLOAT32 *   m_mct_decoding_matrix;\r
275         /** the mct coding matrix */\r
276         OPJ_FLOAT32 *   m_mct_coding_matrix;\r
277         /** mct records */\r
278         opj_mct_data_t * m_mct_records;\r
279         /** the number of mct records. */\r
280         OPJ_UINT32 m_nb_mct_records;\r
281         /** the max number of mct records. */\r
282         OPJ_UINT32 m_nb_max_mct_records;\r
283         /** mcc records */\r
284         opj_simple_mcc_decorrelation_data_t * m_mcc_records;\r
285         /** the number of mct records. */\r
286         OPJ_UINT32 m_nb_mcc_records;\r
287         /** the max number of mct records. */\r
288         OPJ_UINT32 m_nb_max_mcc_records;\r
289         \r
290 \r
291 \r
292         /***** FLAGS *******/\r
293         /** If ppt == 1 --> there was a PPT marker for the present tile */\r
294         OPJ_UINT32 ppt : 1;\r
295         /** indicates if a POC marker has been used O:NO, 1:YES */\r
296         OPJ_UINT32 POC : 1;\r
297 } opj_tcp_t;\r
298 \r
299 typedef struct opj_encoding_param\r
300 {\r
301         /** Digital cinema profile*/\r
302         OPJ_CINEMA_MODE m_cinema;\r
303         /** Maximum rate for each component. If == 0, component size limitation is not considered */\r
304         OPJ_UINT32 m_max_comp_size;\r
305         /** Position of tile part flag in progression order*/\r
306         OPJ_INT32 m_tp_pos;\r
307         /** fixed layer */\r
308         OPJ_INT32 *m_matrice;\r
309         /** Flag determining tile part generation*/\r
310         OPJ_BYTE m_tp_flag;\r
311         /** allocation by rate/distortion */\r
312         OPJ_UINT32 m_disto_alloc : 1;\r
313         /** allocation by fixed layer */\r
314         OPJ_UINT32 m_fixed_alloc : 1;\r
315         /** add fixed_quality */\r
316         OPJ_UINT32 m_fixed_quality : 1;\r
317         /** Enabling Tile part generation*/\r
318         OPJ_UINT32 m_tp_on : 1;\r
319 }\r
320 opj_encoding_param_t;\r
321 \r
322 typedef struct opj_decoding_param\r
323 {\r
324         /** if != 0, then original dimension divided by 2^(reduce); if == 0 or not used, image is decoded to the full resolution */\r
325         OPJ_UINT32 m_reduce;\r
326         /** if != 0, then only the first "layer" layers are decoded; if == 0 or not used, all the quality layers are decoded */\r
327         OPJ_UINT32 m_layer;\r
328 }\r
329 opj_decoding_param_t;\r
330         \r
331 /**\r
332 Coding parameters\r
333 */\r
334 typedef struct opj_cp \r
335 {\r
336         /** Size of the image in bits*/\r
337         /*int img_size;*/\r
338         /** Rsiz*/\r
339         OPJ_RSIZ_CAPABILITIES rsiz;\r
340         /** XTOsiz */\r
341         OPJ_INT32 tx0;\r
342         /** YTOsiz */\r
343         OPJ_INT32 ty0;\r
344         /** XTsiz */\r
345         OPJ_UINT32 tdx;\r
346         /** YTsiz */\r
347         OPJ_UINT32 tdy;\r
348         /** comment */\r
349         OPJ_CHAR *comment;\r
350         /** number of tiles in width */\r
351         OPJ_UINT32 tw;\r
352         /** number of tiles in heigth */\r
353         OPJ_UINT32 th;\r
354         /** packet header storage original buffer */\r
355         OPJ_BYTE *ppm_buffer;\r
356         /** packet header store there for futur use in t2_decode_packet */\r
357         OPJ_BYTE *ppm_data;\r
358         /** size of the ppm_data*/\r
359         OPJ_UINT32 ppm_len;\r
360         /** Number of bytes actually stored inside the ppm_data */\r
361         OPJ_UINT32 ppm_data_size;\r
362         /** tile coding parameters */\r
363         opj_tcp_t *tcps;\r
364         union\r
365         {\r
366                 opj_decoding_param_t m_dec;\r
367                 opj_encoding_param_t m_enc;\r
368         }\r
369         m_specific_param;\r
370 \r
371 \r
372 /* UniPG>> */\r
373 #ifdef USE_JPWL\r
374         /** enables writing of EPC in MH, thus activating JPWL */\r
375         bool epc_on;\r
376         /** enables writing of EPB, in case of activated JPWL */\r
377         bool epb_on;\r
378         /** enables writing of ESD, in case of activated JPWL */\r
379         bool esd_on;\r
380         /** enables writing of informative techniques of ESD, in case of activated JPWL */\r
381         bool info_on;\r
382         /** enables writing of RED, in case of activated JPWL */\r
383         bool red_on;\r
384         /** error protection method for MH (0,1,16,32,37-128) */\r
385         int hprot_MH;\r
386         /** tile number of header protection specification (>=0) */\r
387         int hprot_TPH_tileno[JPWL_MAX_NO_TILESPECS];\r
388         /** error protection methods for TPHs (0,1,16,32,37-128) */\r
389         int hprot_TPH[JPWL_MAX_NO_TILESPECS];\r
390         /** tile number of packet protection specification (>=0) */\r
391         int pprot_tileno[JPWL_MAX_NO_PACKSPECS];\r
392         /** packet number of packet protection specification (>=0) */\r
393         int pprot_packno[JPWL_MAX_NO_PACKSPECS];\r
394         /** error protection methods for packets (0,1,16,32,37-128) */\r
395         int pprot[JPWL_MAX_NO_PACKSPECS];\r
396         /** enables writing of ESD, (0/2/4 bytes) */\r
397         int sens_size;\r
398         /** sensitivity addressing size (0=auto/2/4 bytes) */\r
399         int sens_addr;\r
400         /** sensitivity range (0-3) */\r
401         int sens_range;\r
402         /** sensitivity method for MH (-1,0-7) */\r
403         int sens_MH;\r
404         /** tile number of sensitivity specification (>=0) */\r
405         int sens_TPH_tileno[JPWL_MAX_NO_TILESPECS];\r
406         /** sensitivity methods for TPHs (-1,0-7) */\r
407         int sens_TPH[JPWL_MAX_NO_TILESPECS];\r
408         /** enables JPWL correction at the decoder */\r
409         bool correct;\r
410         /** expected number of components at the decoder */\r
411         int exp_comps;\r
412         /** maximum number of tiles at the decoder */\r
413         int max_tiles;\r
414 #endif /* USE_JPWL */\r
415 \r
416         /******** FLAGS *********/\r
417         /** if ppm == 1 --> there was a PPM marker*/\r
418         OPJ_UINT32 ppm : 1;\r
419         /** tells if the parameter is a coding or decoding one */\r
420         OPJ_UINT32 m_is_decoder : 1;\r
421 /* <<UniPG */\r
422 } opj_cp_t;\r
423 \r
424 typedef struct opj_j2k_dec\r
425 {\r
426         /** locate in which part of the codestream the decoder is (main header, tile header, end) */\r
427         OPJ_UINT32 m_state;\r
428         /** \r
429          * store decoding parameters common to all tiles (information like COD, COC in main header)\r
430          */\r
431         opj_tcp_t *m_default_tcp;\r
432         OPJ_BYTE  *m_header_data;\r
433         OPJ_UINT32 m_header_data_size;\r
434         /** to tell the tile part length */\r
435         OPJ_UINT32 m_sot_length;\r
436         /** Only tiles index in the correct range will be decoded.*/\r
437         OPJ_UINT32 m_start_tile_x;\r
438         OPJ_UINT32 m_start_tile_y;\r
439         OPJ_UINT32 m_end_tile_x;\r
440         OPJ_UINT32 m_end_tile_y;\r
441         /** to tell that a tile can be decoded. */\r
442         OPJ_UINT32 m_can_decode                 : 1;\r
443         OPJ_UINT32 m_discard_tiles              : 1;\r
444         OPJ_UINT32 m_skip_data                  : 1;\r
445 \r
446 } opj_j2k_dec_t;\r
447 \r
448 typedef struct opj_j2k_enc\r
449 {\r
450         /** Tile part number, regardless of poc, for each new poc, tp is reset to 1*/\r
451         OPJ_UINT32 m_current_poc_tile_part_number; // tp_num\r
452         \r
453         /** 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.*/\r
454         OPJ_UINT32 m_current_tile_part_number; //cur_tp_num\r
455         \r
456         /**\r
457         locate the start position of the TLM marker  \r
458         after encoding the tilepart, a jump (in j2k_write_sod) is done to the TLM marker to store the value of its length. \r
459         */\r
460         OPJ_SIZE_T m_tlm_start;\r
461         /**\r
462          * Stores the sizes of the tlm.\r
463          */\r
464         OPJ_BYTE * m_tlm_sot_offsets_buffer;\r
465         /**\r
466          * The current offset of the tlm buffer.\r
467          */\r
468         OPJ_BYTE * m_tlm_sot_offsets_current;\r
469 \r
470         /** Total num of tile parts in whole image = num tiles* num tileparts in each tile*/\r
471         /** used in TLMmarker*/\r
472         OPJ_UINT32 m_total_tile_parts;   // totnum_tp\r
473         \r
474         /* encoded data for a tile */\r
475         OPJ_BYTE * m_encoded_tile_data;\r
476         \r
477         /* size of the encoded_data */\r
478         OPJ_UINT32 m_encoded_tile_size;\r
479         \r
480         /* encoded data for a tile */\r
481         OPJ_BYTE * m_header_tile_data;\r
482         \r
483         /* size of the encoded_data */\r
484         OPJ_UINT32 m_header_tile_data_size;\r
485 \r
486 \r
487 } opj_j2k_enc_t;\r
488 \r
489         \r
490 \r
491 \r
492 /**\r
493 JPEG-2000 codestream reader/writer\r
494 */\r
495 typedef struct opj_j2k \r
496 {\r
497         union\r
498         {\r
499                 opj_j2k_dec_t m_decoder;\r
500                 opj_j2k_enc_t m_encoder;\r
501         } \r
502         m_specific_param;\r
503 \r
504         /** number of the tile curently concern by coding/decoding */\r
505         OPJ_UINT32 m_current_tile_number;\r
506 \r
507         /** pointer to the encoded / decoded image */\r
508         opj_image_t *m_image;\r
509 \r
510         /** Coding parameters */\r
511         opj_cp_t m_cp;\r
512 \r
513         /** the list of procedures to exec **/\r
514         struct opj_procedure_list *     m_procedure_list;\r
515 \r
516         /** the list of validation procedures to follow to make sure the code is valid **/\r
517         struct opj_procedure_list *     m_validation_list;\r
518         \r
519         /** helper used to write the index file */\r
520         opj_codestream_info_t *cstr_info;\r
521 \r
522         /** the current tile coder/decoder **/\r
523         struct opj_tcd *        m_tcd;\r
524         \r
525         OPJ_UINT32 m_is_decoder : 1;\r
526         \r
527\r
528 opj_j2k_t;\r
529 \r
530 /** @name Exported functions */\r
531 /*@{*/\r
532 /* ----------------------------------------------------------------------- */\r
533 /**\r
534  * Creates a J2K decompression structure.\r
535  * \r
536  * @return a handle to a J2K decompressor if successful, NULL otherwise.\r
537 */\r
538 opj_j2k_t* j2k_create_decompress();\r
539 \r
540 /**\r
541  * Destroys a jpeg2000 codec.\r
542  * \r
543  * @param       p_j2k   the jpeg20000 structure to destroy.\r
544  */\r
545 void j2k_destroy (opj_j2k_t *p_j2k);\r
546 \r
547 /**\r
548  * Starts a compression scheme, i.e. validates the codec parameters, writes the header.\r
549  *\r
550  * @param       p_j2k           the jpeg2000 codec.\r
551  * @param       cio                     the stream object.\r
552  * @param       p_manager       the user event manager.\r
553  *\r
554  * @return true if the codec is valid.\r
555  */\r
556 bool j2k_start_compress(\r
557                                                 opj_j2k_t *p_j2k, \r
558                                                 struct opj_stream_private *cio, \r
559                                                 struct opj_image * p_image,\r
560                                                 struct opj_event_mgr * p_manager\r
561                                                 );\r
562 /**\r
563  * Ends the compression procedures and possibiliy add data to be read after the \r
564  * codestream.\r
565  */\r
566 bool j2k_end_compress(opj_j2k_t *p_j2k, struct opj_stream_private *cio, struct opj_event_mgr * p_manager);\r
567 \r
568 /**\r
569  * Sets up the decoder decoding parameters using user parameters.\r
570  * Decoding parameters are stored in j2k->cp. \r
571  * \r
572  * @param       p_j2k                   J2K codec\r
573  * @param       p_parameters    decompression parameters\r
574  * @deprecated  \r
575 */\r
576 void j2k_setup_decoder(\r
577                                            opj_j2k_t *p_j2k, \r
578                                            struct opj_dparameters *p_parameters\r
579                                            );\r
580 /**\r
581  * Reads a jpeg2000 codestream header structure.\r
582  *\r
583  * @param cio the stream to read data from.\r
584  * @param p_j2k the jpeg2000 codec.\r
585  * @param p_manager the user event manager.\r
586  *\r
587  * @return true if the box is valid.\r
588  */\r
589 bool j2k_read_header(\r
590                                                                 opj_j2k_t *p_j2k,\r
591                                                                 struct opj_image ** p_image,\r
592                                                                 OPJ_INT32 * p_tile_x0,\r
593                                                                 OPJ_INT32 * p_tile_y0,\r
594                                                                 OPJ_UINT32 * p_tile_width,\r
595                                                                 OPJ_UINT32 * p_tile_height,\r
596                                                                 OPJ_UINT32 * p_nb_tiles_x,\r
597                                                                 OPJ_UINT32 * p_nb_tiles_y,\r
598                                                                 struct opj_stream_private *cio,\r
599                                                                 struct opj_event_mgr * p_manager\r
600                                                         );\r
601 /**\r
602 Decode an image from a JPEG-2000 codestream\r
603 @param j2k J2K decompressor handle\r
604 @param cio Input buffer stream\r
605 @param cstr_info Codestream information structure if required, NULL otherwise\r
606 @return Returns a decoded image if successful, returns NULL otherwise\r
607 */\r
608 opj_image_t* j2k_decode(opj_j2k_t *j2k, struct opj_stream_private *cio, struct opj_event_mgr * p_manager);\r
609 \r
610 /**\r
611  * Ends the decompression procedures and possibiliy add data to be read after the \r
612  * codestream.\r
613  */\r
614 bool j2k_end_decompress(opj_j2k_t *j2k, struct opj_stream_private *cio, struct opj_event_mgr * p_manager);\r
615 \r
616 /**\r
617 Decode an image form a JPT-stream (JPEG 2000, JPIP)\r
618 @param j2k J2K decompressor handle\r
619 @param cio Input buffer stream\r
620 @param cstr_info Codestream information structure if required, NULL otherwise\r
621 @return Returns a decoded image if successful, returns NULL otherwise\r
622 */\r
623 opj_image_t* j2k_decode_jpt_stream(opj_j2k_t *j2k, struct opj_stream_private *cio, struct opj_codestream_info *cstr_info);\r
624 \r
625 /**\r
626 Creates a J2K compression structure\r
627 @param cinfo Codec context info\r
628 @return Returns a handle to a J2K compressor if successful, returns NULL otherwise\r
629 */\r
630 opj_j2k_t* j2k_create_compress();\r
631 \r
632 /**\r
633 Setup the encoder parameters using the current image and using user parameters. \r
634 Coding parameters are returned in j2k->cp. \r
635 @param j2k J2K compressor handle\r
636 @param parameters compression parameters\r
637 @param image input filled image\r
638 */\r
639 void j2k_setup_encoder(opj_j2k_t *j2k, opj_cparameters_t *parameters, opj_image_t *image, struct opj_event_mgr * p_manager);\r
640 \r
641 /**\r
642  * Writes a tile.\r
643  * @param       p_j2k           the jpeg2000 codec.\r
644  * @param       p_stream                        the stream to write data to.\r
645  * @param       p_manager       the user event manager.\r
646  */\r
647 bool j2k_write_tile (\r
648                                          opj_j2k_t * p_j2k,\r
649                                          OPJ_UINT32 p_tile_index,\r
650                                          OPJ_BYTE * p_data,\r
651                                          OPJ_UINT32 p_data_size,\r
652                                          struct opj_stream_private *p_stream,\r
653                                          struct opj_event_mgr * p_manager\r
654                                         );\r
655 \r
656 /**\r
657  * Converts an enum type progression order to string type.\r
658  * \r
659  * @param prg_order             the progression order to get.\r
660  * \r
661  * @return      the string representation of the gicen progression order.\r
662  */\r
663 const char * j2k_convert_progression_order(OPJ_PROG_ORDER prg_order);\r
664 \r
665 \r
666 /**\r
667  * Encodes an image into a JPEG-2000 codestream\r
668  */\r
669 bool j2k_encode( \r
670                                         opj_j2k_t * p_j2k,\r
671                                         struct opj_stream_private *cio,\r
672                                         struct opj_event_mgr * p_manager\r
673                                 );\r
674 bool     j2k_setup_mct_encoding (opj_tcp_t * p_tcp,opj_image_t * p_image);\r
675 \r
676 /**\r
677  * Decode tile data.\r
678  * @param       p_j2k           the jpeg2000 codec.\r
679  * @param       p_stream                        the stream to write data to.\r
680  * @param       p_manager       the user event manager.\r
681  */\r
682 bool j2k_decode_tile (\r
683                                         opj_j2k_t * p_j2k,\r
684                                         OPJ_UINT32 p_tile_index,\r
685                                         OPJ_BYTE * p_data,\r
686                                         OPJ_UINT32 p_data_size,\r
687                                         struct opj_stream_private *p_stream,\r
688                                         struct opj_event_mgr * p_manager\r
689                                         );\r
690 /**\r
691  * Reads a tile header.\r
692  * @param       p_j2k           the jpeg2000 codec.\r
693  * @param       p_stream                        the stream to write data to.\r
694  * @param       p_manager       the user event manager.\r
695  */\r
696 bool j2k_read_tile_header (\r
697                                          opj_j2k_t * p_j2k,\r
698                                          OPJ_UINT32 * p_tile_index,\r
699                                          OPJ_UINT32 * p_data_size,\r
700                                          OPJ_INT32 * p_tile_x0,\r
701                                          OPJ_INT32 * p_tile_y0,\r
702                                          OPJ_INT32 * p_tile_x1,\r
703                                          OPJ_INT32 * p_tile_y1,\r
704                                          OPJ_UINT32 * p_nb_comps,\r
705                                          bool * p_go_on,\r
706                                          struct opj_stream_private *p_stream,\r
707                                          struct opj_event_mgr * p_manager\r
708                                         );\r
709 /**\r
710  * Sets the given area to be decoded. This function should be called right after opj_read_header and before any tile header reading.\r
711  * \r
712  * @param       p_j2k                   the jpeg2000 codec.\r
713  * @param       p_start_x               the left position of the rectangle to decode (in image coordinates).\r
714  * @param       p_end_x                 the right position of the rectangle to decode (in image coordinates).\r
715  * @param       p_start_y               the up position of the rectangle to decode (in image coordinates).\r
716  * @param       p_end_y                 the bottom position of the rectangle to decode (in image coordinates).\r
717  * @param       p_manager               the user event manager\r
718  *\r
719  * @return      true                    if the area could be set.\r
720  */                             \r
721 bool j2k_set_decode_area(\r
722                         opj_j2k_t *p_j2k,\r
723                         OPJ_INT32 p_start_x,\r
724                         OPJ_INT32 p_start_y,\r
725                         OPJ_INT32 p_end_x,\r
726                         OPJ_INT32 p_end_y,\r
727                         struct opj_event_mgr * p_manager\r
728                         );\r
729 \r
730 \r
731 /* ----------------------------------------------------------------------- */\r
732 /*@}*/\r
733 \r
734 /*@}*/\r
735 \r
736 #endif /* __J2K_H */\r