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 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  * @param p_manager the event manager.
    266  *
    267  * @return	true if the remaining data is sufficient.
    268  */
    269 OPJ_BOOL opj_tcd_init_decode_tile(opj_tcd_t *p_tcd, OPJ_UINT32 p_tile_no, opj_event_mgr_t* p_manager);
    270 
    271 void opj_tcd_makelayer_fixed(opj_tcd_t *tcd, OPJ_UINT32 layno, OPJ_UINT32 final);
    272 
    273 void opj_tcd_rateallocate_fixed(opj_tcd_t *tcd);
    274 
    275 void opj_tcd_makelayer(	opj_tcd_t *tcd,
    276 						OPJ_UINT32 layno,
    277 						OPJ_FLOAT64 thresh,
    278 						OPJ_UINT32 final);
    279 
    280 OPJ_BOOL opj_tcd_rateallocate(	opj_tcd_t *tcd,
    281 								OPJ_BYTE *dest,
    282 								OPJ_UINT32 * p_data_written,
    283 								OPJ_UINT32 len,
    284 								opj_codestream_info_t *cstr_info);
    285 
    286 /**
    287  * Gets the maximum tile size that will be taken by the tile once decoded.
    288  */
    289 OPJ_UINT32 opj_tcd_get_decoded_tile_size (opj_tcd_t *p_tcd );
    290 
    291 /**
    292  * Encodes a tile from the raw image into the given buffer.
    293  * @param	p_tcd			Tile Coder handle
    294  * @param	p_tile_no		Index of the tile to encode.
    295  * @param	p_dest			Destination buffer
    296  * @param	p_data_written	pointer to an int that is incremented by the number of bytes really written on p_dest
    297  * @param	p_len			Maximum length of the destination buffer
    298  * @param	p_cstr_info		Codestream information structure
    299  * @return  true if the coding is successful.
    300 */
    301 OPJ_BOOL opj_tcd_encode_tile(   opj_tcd_t *p_tcd,
    302 							    OPJ_UINT32 p_tile_no,
    303 							    OPJ_BYTE *p_dest,
    304 							    OPJ_UINT32 * p_data_written,
    305 							    OPJ_UINT32 p_len,
    306 							    struct opj_codestream_info *p_cstr_info);
    307 
    308 
    309 /**
    310 Decode a tile from a buffer into a raw image
    311 @param tcd TCD handle
    312 @param src Source buffer
    313 @param len Length of source buffer
    314 @param tileno Number that identifies one of the tiles to be decoded
    315 @param cstr_info  FIXME DOC
    316 @param manager the event manager.
    317 */
    318 OPJ_BOOL opj_tcd_decode_tile(   opj_tcd_t *tcd,
    319 							    OPJ_BYTE *src,
    320 							    OPJ_UINT32 len,
    321 							    OPJ_UINT32 tileno,
    322 							    opj_codestream_index_t *cstr_info,
    323 							    opj_event_mgr_t *manager);
    324 
    325 
    326 /**
    327  * Copies tile data from the system onto the given memory block.
    328  */
    329 OPJ_BOOL opj_tcd_update_tile_data (	opj_tcd_t *p_tcd,
    330 								    OPJ_BYTE * p_dest,
    331 								    OPJ_UINT32 p_dest_length );
    332 
    333 /**
    334  *
    335  */
    336 OPJ_UINT32 opj_tcd_get_encoded_tile_size ( opj_tcd_t *p_tcd );
    337 
    338 /**
    339  * Initialize the tile coder and may reuse some meory.
    340  *
    341  * @param	p_tcd		TCD handle.
    342  * @param	p_tile_no	current tile index to encode.
    343  * @param p_manager the event manager.
    344  *
    345  * @return true if the encoding values could be set (false otherwise).
    346 */
    347 OPJ_BOOL opj_tcd_init_encode_tile (	opj_tcd_t *p_tcd,
    348 								    OPJ_UINT32 p_tile_no, opj_event_mgr_t* p_manager );
    349 
    350 /**
    351  * Copies tile data from the given memory block onto the system.
    352  */
    353 OPJ_BOOL opj_tcd_copy_tile_data (opj_tcd_t *p_tcd,
    354                                  OPJ_BYTE * p_src,
    355                                  OPJ_UINT32 p_src_length );
    356 
    357 /**
    358  * Allocates tile component data
    359  *
    360  *
    361  */
    362 OPJ_BOOL opj_alloc_tile_component_data(opj_tcd_tilecomp_t *l_tilec);
    363 
    364 /* ----------------------------------------------------------------------- */
    365 /*@}*/
    366 
    367 /*@}*/
    368 
    369 #endif /* __TCD_H */
    370