Home | History | Annotate | Download | only in libopenjpeg20
      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