[trunk] merge from branch 1.5 a correction about large code-block data (decoding...
[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;               /* position 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 data_max_size;           /* Size of allocated data buffer */
103         OPJ_UINT32 data_current_size;   /* Size of used data buffer */
104         OPJ_UINT32 numnewpasses;                /* number of pass added to the code-blocks */
105         OPJ_UINT32 numsegs;                             /* number of segments */
106         OPJ_UINT32 real_num_segs;
107         OPJ_UINT32 m_current_max_segs;
108 } opj_tcd_cblk_dec_t;
109
110 /**
111 FIXME DOC
112 */
113 typedef struct opj_tcd_precinct {
114         OPJ_INT32 x0, y0, x1, y1;               /* dimension of the precinct : left upper corner (x0, y0) right low corner (x1,y1) */
115         OPJ_UINT32 cw, ch;                              /* number of precinct in width and height */
116         union{                                                  /* code-blocks information */
117                 opj_tcd_cblk_enc_t* enc;
118                 opj_tcd_cblk_dec_t* dec;
119         } cblks;
120         OPJ_UINT32 block_size;                  /* size taken by cblks (in bytes) */
121         opj_tgt_tree_t *incltree;           /* inclusion tree */
122         opj_tgt_tree_t *imsbtree;           /* IMSB tree */
123 } opj_tcd_precinct_t;
124
125 /**
126 FIXME DOC
127 */
128 typedef struct opj_tcd_band {
129         OPJ_INT32 x0, y0, x1, y1;               /* dimension of the subband : left upper corner (x0, y0) right low corner (x1,y1) */
130         OPJ_UINT32 bandno;
131         opj_tcd_precinct_t *precincts;  /* precinct information */
132         OPJ_UINT32 precincts_data_size; /* size of data taken by precincts */
133         OPJ_INT32 numbps;
134         OPJ_FLOAT32 stepsize;
135 } opj_tcd_band_t;
136
137 /**
138 FIXME DOC
139 */
140 typedef struct opj_tcd_resolution {
141         OPJ_INT32 x0, y0, x1, y1;               /* dimension of the resolution level : left upper corner (x0, y0) right low corner (x1,y1) */
142         OPJ_UINT32 pw, ph;
143         OPJ_UINT32 numbands;                    /* number sub-band for the resolution level */
144         opj_tcd_band_t bands[3];                /* subband information */
145 } opj_tcd_resolution_t;
146
147 /**
148 FIXME DOC
149 */
150 typedef struct opj_tcd_tilecomp
151 {
152         OPJ_INT32 x0, y0, x1, y1;                               /* dimension of component : left upper corner (x0, y0) right low corner (x1,y1) */
153         OPJ_UINT32 numresolutions;                              /* number of resolutions level */
154         OPJ_UINT32 minimum_num_resolutions;             /* number of resolutions level to decode (at max)*/
155         opj_tcd_resolution_t *resolutions;      /* resolutions information */
156         OPJ_UINT32 resolutions_size;                    /* size of data for resolutions (in bytes) */
157         OPJ_INT32 *data;                                                /* data of the component */
158         OPJ_UINT32 data_size;                                   /* size of the data of the component */
159         OPJ_INT32 numpix;                                               /* add fixed_quality */
160 } opj_tcd_tilecomp_t;
161
162
163 /**
164 FIXME DOC
165 */
166 typedef struct opj_tcd_tile {
167         OPJ_INT32 x0, y0, x1, y1;               /* dimension of the tile : left upper corner (x0, y0) right low corner (x1,y1) */
168         OPJ_UINT32 numcomps;                    /* number of components in tile */
169         opj_tcd_tilecomp_t *comps;      /* Components information */
170         OPJ_INT32 numpix;                               /* add fixed_quality */
171         OPJ_FLOAT64 distotile;                  /* add fixed_quality */
172         OPJ_FLOAT64 distolayer[100];    /* add fixed_quality */
173         OPJ_UINT32 packno;              /* packet number */
174 } opj_tcd_tile_t;
175
176 /**
177 FIXME DOC
178 */
179 typedef struct opj_tcd_image
180 {
181         opj_tcd_tile_t *tiles;          /* Tiles information */
182 }
183 opj_tcd_image_t;
184
185
186 /**
187 Tile coder/decoder
188 */
189 typedef struct opj_tcd
190 {
191         /** Position of the tilepart flag in Progression order*/
192         OPJ_INT32 tp_pos;
193         /** Tile part number*/
194         OPJ_UINT32 tp_num;
195         /** Current tile part number*/
196         OPJ_UINT32 cur_tp_num;
197         /** Total number of tileparts of the current tile*/
198         OPJ_UINT32 cur_totnum_tp;
199         /** Current Packet iterator number */
200         OPJ_UINT32 cur_pino;
201         /** info on each image tile */
202         opj_tcd_image_t *tcd_image;
203         /** image header */
204         opj_image_t *image;
205         /** coding parameters */
206         opj_cp_t *cp;
207         /** coding/decoding parameters common to all tiles */
208         opj_tcp_t *tcp;
209         /** current encoded/decoded tile */
210         OPJ_UINT32 tcd_tileno;
211         /** tell if the tcd is a decoder. */
212         OPJ_UINT32 m_is_decoder : 1;
213 } opj_tcd_t;
214
215 /** @name Exported functions */
216 /*@{*/
217 /* ----------------------------------------------------------------------- */
218
219 /**
220 Dump the content of a tcd structure
221 */
222 /*void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t *img);*/ /* TODO MSD shoul use the new v2 structures */ 
223
224 /**
225 Create a new TCD handle
226 @param p_is_decoder FIXME DOC
227 @return Returns a new TCD handle if successful returns NULL otherwise
228 */
229 opj_tcd_t* opj_tcd_create(OPJ_BOOL p_is_decoder);
230
231 /**
232 Destroy a previously created TCD handle
233 @param tcd TCD handle to destroy
234 */
235 void opj_tcd_destroy(opj_tcd_t *tcd);
236
237 /**
238  * Initialize the tile coder and may reuse some memory.
239  * @param       p_tcd           TCD handle.
240  * @param       p_image         raw image.
241  * @param       p_cp            coding parameters.
242  *
243  * @return true if the encoding values could be set (false otherwise).
244 */
245 OPJ_BOOL opj_tcd_init(  opj_tcd_t *p_tcd,
246                                                 opj_image_t * p_image,
247                                                 opj_cp_t * p_cp );
248
249 /**
250  * Allocates memory for decoding a specific tile.
251  *
252  * @param       p_tcd           the tile decoder.
253  * @param       p_tile_no       the index of the tile received in sequence. This not necessarily lead to the
254  * tile at index p_tile_no.
255  *
256  * @return      true if the remaining data is sufficient.
257  */
258 OPJ_BOOL opj_tcd_init_decode_tile(opj_tcd_t *p_tcd, OPJ_UINT32 p_tile_no);
259
260 void opj_tcd_makelayer_fixed(opj_tcd_t *tcd, OPJ_UINT32 layno, OPJ_UINT32 final);
261
262 void opj_tcd_rateallocate_fixed(opj_tcd_t *tcd);
263
264 void opj_tcd_makelayer( opj_tcd_t *tcd,
265                                                 OPJ_UINT32 layno,
266                                                 OPJ_FLOAT64 thresh,
267                                                 OPJ_UINT32 final);
268
269 OPJ_BOOL opj_tcd_rateallocate(  opj_tcd_t *tcd,
270                                                                 OPJ_BYTE *dest,
271                                                                 OPJ_UINT32 * p_data_written,
272                                                                 OPJ_UINT32 len,
273                                                                 opj_codestream_info_t *cstr_info);
274
275 /**
276  * Gets the maximum tile size that will be taken by the tile once decoded.
277  */
278 OPJ_UINT32 opj_tcd_get_decoded_tile_size (opj_tcd_t *p_tcd );
279
280 /**
281  * Encodes a tile from the raw image into the given buffer.
282  * @param       p_tcd                   Tile Coder handle
283  * @param       p_tile_no               Index of the tile to encode.
284  * @param       p_dest                  Destination buffer
285  * @param       p_data_written  pointer to an int that is incremented by the number of bytes really written on p_dest
286  * @param       p_len                   Maximum length of the destination buffer
287  * @param       p_cstr_info             Codestream information structure
288  * @return  true if the coding is successfull.
289 */
290 OPJ_BOOL opj_tcd_encode_tile(   opj_tcd_t *p_tcd,
291                                                             OPJ_UINT32 p_tile_no,
292                                                             OPJ_BYTE *p_dest,
293                                                             OPJ_UINT32 * p_data_written,
294                                                             OPJ_UINT32 p_len,
295                                                             struct opj_codestream_info *p_cstr_info);
296
297
298 /**
299 Decode a tile from a buffer into a raw image
300 @param tcd TCD handle
301 @param src Source buffer
302 @param len Length of source buffer
303 @param tileno Number that identifies one of the tiles to be decoded
304 @param cstr_info  FIXME DOC
305 */
306 OPJ_BOOL opj_tcd_decode_tile(   opj_tcd_t *tcd,
307                                                             OPJ_BYTE *src,
308                                                             OPJ_UINT32 len,
309                                                             OPJ_UINT32 tileno,
310                                                             opj_codestream_index_t *cstr_info);
311
312
313 /**
314  * Copies tile data from the system onto the given memory block.
315  */
316 OPJ_BOOL opj_tcd_update_tile_data (     opj_tcd_t *p_tcd,
317                                                                     OPJ_BYTE * p_dest,
318                                                                     OPJ_UINT32 p_dest_length );
319
320 /**
321  *
322  */
323 OPJ_UINT32 opj_tcd_get_encoded_tile_size ( opj_tcd_t *p_tcd );
324
325 /**
326  * Initialize the tile coder and may reuse some meory.
327  *
328  * @param       p_tcd           TCD handle.
329  * @param       p_tile_no       current tile index to encode.
330  *
331  * @return true if the encoding values could be set (false otherwise).
332 */
333 OPJ_BOOL opj_tcd_init_encode_tile (     opj_tcd_t *p_tcd,
334                                                                     OPJ_UINT32 p_tile_no );
335
336 /**
337  * Copies tile data from the given memory block onto the system.
338  */
339 OPJ_BOOL opj_tcd_copy_tile_data (opj_tcd_t *p_tcd,
340                                  OPJ_BYTE * p_src,
341                                  OPJ_UINT32 p_src_length );
342
343 /* ----------------------------------------------------------------------- */
344 /*@}*/
345
346 /*@}*/
347
348 #endif /* __TCD_H */