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