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