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
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
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.
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.
35 @brief Implementation of a tile coder/decoder (TCD)
37 The functions in TCD.C have for goal to encode or decode each tile independently from
38 each other. The functions in TCD.C are used by some function in J2K.C.
41 /** @defgroup TCD TCD - Implementation of a tile coder/decoder */
47 //typedef struct opj_tcd_seg {
48 // unsigned char** data;
60 typedef struct opj_tcd_seg {
64 OPJ_UINT32 real_num_passes;
67 OPJ_UINT32 numnewpasses;
74 typedef struct opj_tcd_pass {
80 typedef struct opj_tcd_pass_v2 {
82 OPJ_FLOAT64 distortiondec;
90 typedef struct opj_tcd_layer {
91 OPJ_UINT32 numpasses; /* Number of passes in the layer */
92 OPJ_UINT32 len; /* len of information */
93 OPJ_FLOAT64 disto; /* add for index (Cfr. Marcela) */
94 OPJ_BYTE *data; /* data */
100 typedef struct opj_tcd_cblk_enc {
101 unsigned char* data; /* Data */
102 opj_tcd_layer_t* layers; /* layer information */
103 opj_tcd_pass_t* passes; /* information about the passes */
104 int x0, y0, x1, y1; /* dimension of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */
107 int numpasses; /* number of pass already done for the code-blocks */
108 int numpassesinlayers; /* number of passes in the layer */
109 int totalpasses; /* total number of passes */
110 } opj_tcd_cblk_enc_t;
115 typedef struct opj_tcd_cblk_enc_v2 {
116 OPJ_BYTE* data; /* Data */
117 opj_tcd_layer_t* layers; /* layer information */
118 opj_tcd_pass_v2_t* passes; /* information about the passes */
119 OPJ_INT32 x0, y0, x1, y1; /* dimension of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */
121 OPJ_UINT32 numlenbits;
122 OPJ_UINT32 numpasses; /* number of pass already done for the code-blocks */
123 OPJ_UINT32 numpassesinlayers; /* number of passes in the layer */
124 OPJ_UINT32 totalpasses; /* total number of passes */
125 } opj_tcd_cblk_enc_v2_t;
127 typedef struct opj_tcd_cblk_dec {
128 unsigned char* data; /* Data */
129 opj_tcd_seg_t* segs; /* segments informations */
130 int x0, y0, x1, y1; /* dimension of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */
133 int len; /* length */
134 int numnewpasses; /* number of pass added to the code-blocks */
135 int numsegs; /* number of segments */
136 } opj_tcd_cblk_dec_t;
139 typedef struct opj_tcd_cblk_dec_v2 {
140 OPJ_BYTE * data; /* Data */
141 opj_tcd_seg_t* segs; /* segments informations */
142 OPJ_INT32 x0, y0, x1, y1; /* dimension of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */
144 OPJ_UINT32 numlenbits;
145 OPJ_UINT32 len; /* length */
146 OPJ_UINT32 numnewpasses; /* number of pass added to the code-blocks */
147 OPJ_UINT32 numsegs; /* number of segments */
148 OPJ_UINT32 real_num_segs;
149 OPJ_UINT32 m_current_max_segs;
150 } opj_tcd_cblk_dec_v2_t;
155 typedef struct opj_tcd_precinct {
156 int x0, y0, x1, y1; /* dimension of the precinct : left upper corner (x0, y0) right low corner (x1,y1) */
157 int cw, ch; /* number of precinct in width and heigth */
158 union{ /* code-blocks informations */
159 opj_tcd_cblk_enc_t* enc;
160 opj_tcd_cblk_dec_t* dec;
162 opj_tgt_tree_t *incltree; /* inclusion tree */
163 opj_tgt_tree_t *imsbtree; /* IMSB tree */
164 } opj_tcd_precinct_t;
167 typedef struct opj_tcd_precinct_v2 {
168 OPJ_INT32 x0, y0, x1, y1; /* dimension of the precinct : left upper corner (x0, y0) right low corner (x1,y1) */
169 OPJ_UINT32 cw, ch; /* number of precinct in width and heigth */
170 union{ /* code-blocks informations */
171 opj_tcd_cblk_enc_v2_t* enc;
172 opj_tcd_cblk_dec_v2_t* dec;
174 OPJ_UINT32 block_size; /* size taken by cblks (in bytes) */
175 opj_tgt_tree_t *incltree; /* inclusion tree */
176 opj_tgt_tree_t *imsbtree; /* IMSB tree */
177 } opj_tcd_precinct_v2_t;
182 typedef struct opj_tcd_band {
183 int x0, y0, x1, y1; /* dimension of the subband : left upper corner (x0, y0) right low corner (x1,y1) */
185 opj_tcd_precinct_t *precincts; /* precinct information */
190 typedef struct opj_tcd_band_v2 {
191 OPJ_INT32 x0, y0, x1, y1; /* dimension of the subband : left upper corner (x0, y0) right low corner (x1,y1) */
193 opj_tcd_precinct_v2_t *precincts; /* precinct information */
194 OPJ_UINT32 precincts_data_size; /* size of data taken by precincts */
196 OPJ_FLOAT32 stepsize;
202 typedef struct opj_tcd_resolution {
203 int x0, y0, x1, y1; /* dimension of the resolution level : left upper corner (x0, y0) right low corner (x1,y1) */
205 int numbands; /* number sub-band for the resolution level */
206 opj_tcd_band_t bands[3]; /* subband information */
207 } opj_tcd_resolution_t;
209 typedef struct opj_tcd_resolution_v2 {
210 OPJ_INT32 x0, y0, x1, y1; /* dimension of the resolution level : left upper corner (x0, y0) right low corner (x1,y1) */
212 OPJ_UINT32 numbands; /* number sub-band for the resolution level */
213 opj_tcd_band_v2_t bands[3]; /* subband information */
214 } opj_tcd_resolution_v2_t;
219 typedef struct opj_tcd_tilecomp {
220 int x0, y0, x1, y1; /* dimension of component : left upper corner (x0, y0) right low corner (x1,y1) */
221 int numresolutions; /* number of resolutions level */
222 opj_tcd_resolution_t *resolutions; /* resolutions information */
223 int *data; /* data of the component */
224 int numpix; /* add fixed_quality */
225 } opj_tcd_tilecomp_t;
227 typedef struct opj_tcd_tilecomp_v2
229 OPJ_INT32 x0, y0, x1, y1; /* dimension of component : left upper corner (x0, y0) right low corner (x1,y1) */
230 OPJ_UINT32 numresolutions; /* number of resolutions level */
231 OPJ_UINT32 minimum_num_resolutions; /* number of resolutions level to decode (at max)*/
232 opj_tcd_resolution_v2_t *resolutions; /* resolutions information */
233 OPJ_UINT32 resolutions_size; /* size of data for resolutions (in bytes) */
234 OPJ_INT32 *data; /* data of the component */
235 OPJ_UINT32 data_size; /* size of the data of the component */
236 OPJ_INT32 numpix; /* add fixed_quality */
237 } opj_tcd_tilecomp_v2_t;
243 typedef struct opj_tcd_tile {
244 int x0, y0, x1, y1; /* dimension of the tile : left upper corner (x0, y0) right low corner (x1,y1) */
245 int numcomps; /* number of components in tile */
246 opj_tcd_tilecomp_t *comps; /* Components information */
247 int numpix; /* add fixed_quality */
248 double distotile; /* add fixed_quality */
249 double distolayer[100]; /* add fixed_quality */
254 typedef struct opj_tcd_tile_v2 {
255 OPJ_INT32 x0, y0, x1, y1; /* dimension of the tile : left upper corner (x0, y0) right low corner (x1,y1) */
256 OPJ_UINT32 numcomps; /* number of components in tile */
257 opj_tcd_tilecomp_v2_t *comps; /* Components information */
258 OPJ_INT32 numpix; /* add fixed_quality */
259 OPJ_FLOAT64 distotile; /* add fixed_quality */
260 OPJ_FLOAT64 distolayer[100]; /* add fixed_quality */
268 typedef struct opj_tcd_image {
269 int tw, th; /* number of tiles in width and heigth */
270 opj_tcd_tile_t *tiles; /* Tiles information */
273 typedef struct opj_tcd_image_v2
275 opj_tcd_tile_v2_t *tiles; /* Tiles information */
282 typedef struct opj_tcd {
283 /** Position of the tilepart flag in Progression order*/
285 /** Tile part number*/
287 /** Current tile part number*/
289 /** Total number of tileparts of the current tile*/
291 /** Current Packet iterator number */
294 opj_common_ptr cinfo;
296 /** info on each image tile */
297 opj_tcd_image_t *tcd_image;
300 /** coding parameters */
302 /** pointer to the current encoded/decoded tile */
303 opj_tcd_tile_t *tcd_tile;
304 /** coding/decoding parameters common to all tiles */
306 /** current encoded/decoded tile */
308 /** Time taken to encode a tile*/
309 double encoding_time;
319 typedef struct opj_tcd_v2
321 /** Position of the tilepart flag in Progression order*/
323 /** Tile part number*/
325 /** Current tile part number*/
326 OPJ_UINT32 cur_tp_num;
327 /** Total number of tileparts of the current tile*/
328 OPJ_UINT32 cur_totnum_tp;
329 /** Current Packet iterator number */
331 /** info on each image tile */
332 opj_tcd_image_v2_t *tcd_image;
335 /** coding parameters */
336 struct opj_cp_v2 *cp;
337 /** coding/decoding parameters common to all tiles */
338 struct opj_tcp_v2 *tcp;
339 /** current encoded/decoded tile */
340 OPJ_UINT32 tcd_tileno;
341 /** tell if the tcd is a decoder. */
342 OPJ_UINT32 m_is_decoder : 1;
345 /** @name Exported functions */
347 /* ----------------------------------------------------------------------- */
350 Dump the content of a tcd structure
352 void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t *img);
354 Create a new TCD handle
355 @param cinfo Codec context info
356 @return Returns a new TCD handle if successful returns NULL otherwise
358 opj_tcd_t* tcd_create(opj_common_ptr cinfo);
361 Create a new TCD handle
363 @return Returns a new TCD handle if successful returns NULL otherwise
365 opj_tcd_v2_t* tcd_create_v2(opj_bool p_is_decoder);
368 Destroy a previously created TCD handle
369 @param tcd TCD handle to destroy
371 void tcd_destroy_v2(opj_tcd_v2_t *tcd);
374 * Initialize the tile coder and may reuse some meory.
375 * @param p_tcd TCD handle.
376 * @param p_image raw image.
377 * @param p_cp coding parameters.
378 * @param p_tile_no current tile index to encode.
380 * @return true if the encoding values could be set (false otherwise).
382 opj_bool tcd_init_v2( opj_tcd_v2_t *p_tcd,
383 opj_image_t * p_image,
388 * Allocates memory for decoding a specific tile.
390 * @param p_tcd the tile decoder.
391 * @param p_image the image to decode.
392 * @param p_cp the decoding parameters.
393 * @param p_tile_no the index of the tile received in sequence. This not necesseraly lead to the
394 * tile at index p_tile_no.
395 * @param p_cstr_info codestream info (if any).
397 * @return true if the remaining data is sufficient.s
399 opj_bool tcd_init_decode_tile(
405 Destroy a previously created TCD handle
406 @param tcd TCD handle to destroy
408 void tcd_destroy(opj_tcd_t *tcd);
410 Initialize the tile coder (allocate the memory)
411 @param tcd TCD handle
412 @param image Raw image
413 @param cp Coding parameters
414 @param curtileno Number that identifies the tile that will be encoded
416 void tcd_malloc_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno);
418 Free the memory allocated for encoding
419 @param tcd TCD handle
421 void tcd_free_encode(opj_tcd_t *tcd);
423 Initialize the tile coder (reuses the memory allocated by tcd_malloc_encode)
424 @param tcd TCD handle
425 @param image Raw image
426 @param cp Coding parameters
427 @param curtileno Number that identifies the tile that will be encoded
429 void tcd_init_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno);
431 Initialize the tile decoder
432 @param tcd TCD handle
433 @param image Raw image
434 @param cp Coding parameters
436 void tcd_malloc_decode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp);
437 void tcd_malloc_decode_tile(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int tileno, opj_codestream_info_t *cstr_info);
438 void tcd_makelayer_fixed(opj_tcd_t *tcd, int layno, int final);
439 void tcd_rateallocate_fixed(opj_tcd_t *tcd);
440 void tcd_makelayer(opj_tcd_t *tcd, int layno, double thresh, int final);
441 opj_bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len, opj_codestream_info_t *cstr_info);
443 Encode a tile from the raw image into a buffer
444 @param tcd TCD handle
445 @param tileno Number that identifies one of the tiles to be encoded
446 @param dest Destination buffer
447 @param len Length of destination buffer
448 @param cstr_info Codestream information structure
451 int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len, opj_codestream_info_t *cstr_info);
453 Decode a tile from a buffer into a raw image
454 @param tcd TCD handle
455 @param src Source buffer
456 @param len Length of source buffer
457 @param tileno Number that identifies one of the tiles to be decoded
458 @param cstr_info Codestream information structure
460 opj_bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, int tileno, opj_codestream_info_t *cstr_info);
462 Free the memory allocated for decoding
463 @param tcd TCD handle
465 void tcd_free_decode(opj_tcd_t *tcd);
466 void tcd_free_decode_tile(opj_tcd_t *tcd, int tileno);
470 * Gets the maximum tile size that will be taken by the tile once decoded.
472 OPJ_UINT32 tcd_get_decoded_tile_size (
477 Decode a tile from a buffer into a raw image
478 @param tcd TCD handle
479 @param src Source buffer
480 @param len Length of source buffer
481 @param tileno Number that identifies one of the tiles to be decoded
483 opj_bool tcd_decode_tile_v2(opj_tcd_v2_t *tcd,
487 opj_codestream_index_t *cstr_info);
491 * Copies tile data from the system onto the given memory block.
493 opj_bool tcd_update_tile_data (
496 OPJ_UINT32 p_dest_length
499 /* ----------------------------------------------------------------------- */