[trunk] move opj_bool to OPJ_BOOL to follow the other type
[openjpeg.git] / src / lib / openjp2 / tcd.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  * All rights reserved.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
20  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 #ifndef __TCD_H
32 #define __TCD_H
33 /**
34 @file tcd.h
35 @brief Implementation of a tile coder/decoder (TCD)
36
37 The functions in TCD.C encode or decode each tile independently from
38 each other. The functions in TCD.C are used by other functions in J2K.C.
39 */
40
41 /** @defgroup TCD TCD - Implementation of a tile coder/decoder */
42 /*@{*/
43
44 /**
45 FIXME DOC
46 */
47 typedef struct opj_tcd_seg {
48         OPJ_BYTE ** data;
49         OPJ_UINT32 dataindex;
50         OPJ_UINT32 numpasses;
51         OPJ_UINT32 real_num_passes;
52         OPJ_UINT32 len;
53         OPJ_UINT32 maxpasses;
54         OPJ_UINT32 numnewpasses;
55         OPJ_UINT32 newlen;
56 } opj_tcd_seg_t;
57
58 /**
59 FIXME DOC
60 */
61 typedef struct opj_tcd_pass {
62         OPJ_UINT32 rate;
63         OPJ_FLOAT64 distortiondec;
64         OPJ_UINT32 len;
65         OPJ_UINT32 term : 1;
66 } opj_tcd_pass_t;
67
68 /**
69 FIXME DOC
70 */
71 typedef struct opj_tcd_layer {
72         OPJ_UINT32 numpasses;           /* Number of passes in the layer */
73         OPJ_UINT32 len;                         /* len of information */
74         OPJ_FLOAT64 disto;                      /* add for index (Cfr. Marcela) */
75         OPJ_BYTE *data;                         /* data */
76 } opj_tcd_layer_t;
77
78 /**
79 FIXME DOC
80 */
81 typedef struct opj_tcd_cblk_enc {
82         OPJ_BYTE* data;                                 /* Data */
83         opj_tcd_layer_t* layers;                /* layer information */
84         opj_tcd_pass_t* passes;         /* information about the passes */
85         OPJ_INT32 x0, y0, x1, y1;               /* dimension of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */
86         OPJ_UINT32 numbps;
87         OPJ_UINT32 numlenbits;
88         OPJ_UINT32 numpasses;                   /* number of pass already done for the code-blocks */
89         OPJ_UINT32 numpassesinlayers;   /* number of passes in the layer */
90         OPJ_UINT32 totalpasses;                 /* total number of passes */
91 } opj_tcd_cblk_enc_t;
92
93
94 typedef struct opj_tcd_cblk_dec {
95         OPJ_BYTE * data;                                /* Data */
96         opj_tcd_seg_t* segs;                    /* segments information */
97         OPJ_INT32 x0, y0, x1, y1;               /* dimension of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */
98         OPJ_UINT32 numbps;
99         OPJ_UINT32 numlenbits;
100         OPJ_UINT32 len;                                 /* length */
101         OPJ_UINT32 numnewpasses;                /* number of pass added to the code-blocks */
102         OPJ_UINT32 numsegs;                             /* number of segments */
103         OPJ_UINT32 real_num_segs;
104         OPJ_UINT32 m_current_max_segs;
105 } opj_tcd_cblk_dec_t;
106
107 /**
108 FIXME DOC
109 */
110 typedef struct opj_tcd_precinct {
111         OPJ_INT32 x0, y0, x1, y1;               /* dimension of the precinct : left upper corner (x0, y0) right low corner (x1,y1) */
112         OPJ_UINT32 cw, ch;                              /* number of precinct in width and height */
113         union{                                                  /* code-blocks information */
114                 opj_tcd_cblk_enc_t* enc;
115                 opj_tcd_cblk_dec_t* dec;
116         } cblks;
117         OPJ_UINT32 block_size;                  /* size taken by cblks (in bytes) */
118         opj_tgt_tree_t *incltree;           /* inclusion tree */
119         opj_tgt_tree_t *imsbtree;           /* IMSB tree */
120 } opj_tcd_precinct_t;
121
122 /**
123 FIXME DOC
124 */
125 typedef struct opj_tcd_band {
126         OPJ_INT32 x0, y0, x1, y1;               /* dimension of the subband : left upper corner (x0, y0) right low corner (x1,y1) */
127         OPJ_UINT32 bandno;
128         opj_tcd_precinct_t *precincts;  /* precinct information */
129         OPJ_UINT32 precincts_data_size; /* size of data taken by precincts */
130         OPJ_INT32 numbps;
131         OPJ_FLOAT32 stepsize;
132 } opj_tcd_band_t;
133
134 /**
135 FIXME DOC
136 */
137 typedef struct opj_tcd_resolution {
138         OPJ_INT32 x0, y0, x1, y1;               /* dimension of the resolution level : left upper corner (x0, y0) right low corner (x1,y1) */
139         OPJ_UINT32 pw, ph;
140         OPJ_UINT32 numbands;                    /* number sub-band for the resolution level */
141         opj_tcd_band_t bands[3];                /* subband information */
142 } opj_tcd_resolution_t;
143
144 /**
145 FIXME DOC
146 */
147 typedef struct opj_tcd_tilecomp
148 {
149         OPJ_INT32 x0, y0, x1, y1;                               /* dimension of component : left upper corner (x0, y0) right low corner (x1,y1) */
150         OPJ_UINT32 numresolutions;                              /* number of resolutions level */
151         OPJ_UINT32 minimum_num_resolutions;             /* number of resolutions level to decode (at max)*/
152         opj_tcd_resolution_t *resolutions;      /* resolutions information */
153         OPJ_UINT32 resolutions_size;                    /* size of data for resolutions (in bytes) */
154         OPJ_INT32 *data;                                                /* data of the component */
155         OPJ_UINT32 data_size;                                   /* size of the data of the component */
156         OPJ_INT32 numpix;                                               /* add fixed_quality */
157 } opj_tcd_tilecomp_t;
158
159
160 /**
161 FIXME DOC
162 */
163 typedef struct opj_tcd_tile {
164         OPJ_INT32 x0, y0, x1, y1;               /* dimension of the tile : left upper corner (x0, y0) right low corner (x1,y1) */
165         OPJ_UINT32 numcomps;                    /* number of components in tile */
166         opj_tcd_tilecomp_t *comps;      /* Components information */
167         OPJ_INT32 numpix;                               /* add fixed_quality */
168         OPJ_FLOAT64 distotile;                  /* add fixed_quality */
169         OPJ_FLOAT64 distolayer[100];    /* add fixed_quality */
170         OPJ_UINT32 packno;              /* packet number */
171 } opj_tcd_tile_t;
172
173 /**
174 FIXME DOC
175 */
176 typedef struct opj_tcd_image
177 {
178         opj_tcd_tile_t *tiles;          /* Tiles information */
179 }
180 opj_tcd_image_t;
181
182
183 /**
184 Tile coder/decoder
185 */
186 typedef struct opj_tcd
187 {
188         /** Position of the tilepart flag in Progression order*/
189         OPJ_INT32 tp_pos;
190         /** Tile part number*/
191         OPJ_UINT32 tp_num;
192         /** Current tile part number*/
193         OPJ_UINT32 cur_tp_num;
194         /** Total number of tileparts of the current tile*/
195         OPJ_UINT32 cur_totnum_tp;
196         /** Current Packet iterator number */
197         OPJ_UINT32 cur_pino;
198         /** info on each image tile */
199         opj_tcd_image_t *tcd_image;
200         /** image header */
201         opj_image_t *image;
202         /** coding parameters */
203         opj_cp_t *cp;
204         /** coding/decoding parameters common to all tiles */
205         opj_tcp_t *tcp;
206         /** current encoded/decoded tile */
207         OPJ_UINT32 tcd_tileno;
208         /** tell if the tcd is a decoder. */
209         OPJ_UINT32 m_is_decoder : 1;
210 } opj_tcd_t;
211
212 /** @name Exported functions */
213 /*@{*/
214 /* ----------------------------------------------------------------------- */
215
216 /**
217 Dump the content of a tcd structure
218 */
219 /*void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t *img);*/ /* TODO MSD shoul use the new v2 structures */ 
220
221 /**
222 Create a new TCD handle
223 @param p_is_decoder FIXME DOC
224 @return Returns a new TCD handle if successful returns NULL otherwise
225 */
226 opj_tcd_t* opj_tcd_create(OPJ_BOOL p_is_decoder);
227
228 /**
229 Destroy a previously created TCD handle
230 @param tcd TCD handle to destroy
231 */
232 void opj_tcd_destroy(opj_tcd_t *tcd);
233
234 /**
235  * Initialize the tile coder and may reuse some memory.
236  * @param       p_tcd           TCD handle.
237  * @param       p_image         raw image.
238  * @param       p_cp            coding parameters.
239  *
240  * @return true if the encoding values could be set (false otherwise).
241 */
242 OPJ_BOOL opj_tcd_init(  opj_tcd_t *p_tcd,
243                                                 opj_image_t * p_image,
244                                                 opj_cp_t * p_cp );
245
246 /**
247  * Allocates memory for decoding a specific tile.
248  *
249  * @param       p_tcd           the tile decoder.
250  * @param       p_tile_no       the index of the tile received in sequence. This not necessarily lead to the
251  * tile at index p_tile_no.
252  *
253  * @return      true if the remaining data is sufficient.
254  */
255 OPJ_BOOL opj_tcd_init_decode_tile(opj_tcd_t *p_tcd, OPJ_UINT32 p_tile_no);
256
257 void opj_tcd_makelayer_fixed(opj_tcd_t *tcd, OPJ_UINT32 layno, OPJ_UINT32 final);
258
259 void opj_tcd_rateallocate_fixed(opj_tcd_t *tcd);
260
261 void opj_tcd_makelayer( opj_tcd_t *tcd,
262                                                 OPJ_UINT32 layno,
263                                                 OPJ_FLOAT64 thresh,
264                                                 OPJ_UINT32 final);
265
266 OPJ_BOOL opj_tcd_rateallocate(  opj_tcd_t *tcd,
267                                                                 OPJ_BYTE *dest,
268                                                                 OPJ_UINT32 * p_data_written,
269                                                                 OPJ_UINT32 len,
270                                                                 opj_codestream_info_t *cstr_info);
271
272 /**
273  * Gets the maximum tile size that will be taken by the tile once decoded.
274  */
275 OPJ_UINT32 opj_tcd_get_decoded_tile_size (opj_tcd_t *p_tcd );
276
277 /**
278  * Encodes a tile from the raw image into the given buffer.
279  * @param       p_tcd                   Tile Coder handle
280  * @param       p_tile_no               Index of the tile to encode.
281  * @param       p_dest                  Destination buffer
282  * @param       p_data_written  pointer to an int that is incremented by the number of bytes really written on p_dest
283  * @param       p_len                   Maximum length of the destination buffer
284  * @param       p_cstr_info             Codestream information structure
285  * @return  true if the coding is successfull.
286 */
287 OPJ_BOOL opj_tcd_encode_tile(   opj_tcd_t *p_tcd,
288                                                             OPJ_UINT32 p_tile_no,
289                                                             OPJ_BYTE *p_dest,
290                                                             OPJ_UINT32 * p_data_written,
291                                                             OPJ_UINT32 p_len,
292                                                             struct opj_codestream_info *p_cstr_info);
293
294
295 /**
296 Decode a tile from a buffer into a raw image
297 @param tcd TCD handle
298 @param src Source buffer
299 @param len Length of source buffer
300 @param tileno Number that identifies one of the tiles to be decoded
301 @param cstr_info  FIXME DOC
302 */
303 OPJ_BOOL opj_tcd_decode_tile(   opj_tcd_t *tcd,
304                                                             OPJ_BYTE *src,
305                                                             OPJ_UINT32 len,
306                                                             OPJ_UINT32 tileno,
307                                                             opj_codestream_index_t *cstr_info);
308
309
310 /**
311  * Copies tile data from the system onto the given memory block.
312  */
313 OPJ_BOOL opj_tcd_update_tile_data (     opj_tcd_t *p_tcd,
314                                                                     OPJ_BYTE * p_dest,
315                                                                     OPJ_UINT32 p_dest_length );
316
317 /**
318  *
319  */
320 OPJ_UINT32 opj_tcd_get_encoded_tile_size ( opj_tcd_t *p_tcd );
321
322 /**
323  * Initialize the tile coder and may reuse some meory.
324  *
325  * @param       p_tcd           TCD handle.
326  * @param       p_tile_no       current tile index to encode.
327  *
328  * @return true if the encoding values could be set (false otherwise).
329 */
330 OPJ_BOOL opj_tcd_init_encode_tile (     opj_tcd_t *p_tcd,
331                                                                     OPJ_UINT32 p_tile_no );
332
333 /**
334  * Copies tile data from the given memory block onto the system.
335  */
336 OPJ_BOOL opj_tcd_copy_tile_data (opj_tcd_t *p_tcd,
337                                  OPJ_BYTE * p_src,
338                                  OPJ_UINT32 p_src_length );
339
340 /* ----------------------------------------------------------------------- */
341 /*@}*/
342
343 /*@}*/
344
345 #endif /* __TCD_H */