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