fixed lt_version in configure.ac
[openjpeg.git] / libjp3dvm / tcd.h
1 /*
2  * Copyright (c) 2001-2003, David Janssens
3  * Copyright (c) 2002-2003, Yannick Verschueren
4  * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
5  * Copyright (c) 2005, Herve Drolon, FreeImage Team
6  * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
7  * Copyright (c) 2006, M�nica D�ez Garc�a, Image Processing Laboratory, University of Valladolid, Spain
8  * All rights reserved.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
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.
18  *
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.
30  */
31 #ifndef __TCD_H
32 #define __TCD_H
33 /**
34 @file tcd.h
35 @brief Implementation of a tile coder/decoder (TCD)
36
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 JP3D.C.
39 */
40
41 /** @defgroup TCD TCD - Implementation of a tile coder/decoder */
42 /*@{*/
43
44 /**
45 Tile coder/decoder: segment instance
46 */
47 typedef struct opj_tcd_seg {
48 /** Number of passes in the segment */
49         int numpasses;                  
50 /** Length of information */
51     int len;                                    
52 /** Data */
53         unsigned char *data;            
54 /** Number of passes posible for the segment */
55         int maxpasses;                  
56 /** Number of passes added to the segment */
57         int numnewpasses;                   
58 /** New length after inclusion of segments */
59         int newlen;
60 } opj_tcd_seg_t;
61
62 /**
63 Tile coder/decoder: pass instance
64 */
65 typedef struct opj_tcd_pass {
66 /** Rate obtained in the pass*/
67   int rate;                                     
68 /** Distorsion obtained in the pass*/
69   double distortiondec;         
70   int term;
71 /** Length of information */
72   int len;                                      
73 } opj_tcd_pass_t;
74
75 /**
76 Tile coder/decoder: layer instance
77 */
78 typedef struct opj_tcd_layer {
79 /** Number of passes in the layer */
80         int numpasses;                  
81 /** Length of information */
82   int len;                                      
83 /** Distortion within layer */
84   double disto;                         /* add for index (Cfr. Marcela) */
85   unsigned char *data;          /* data */
86 } opj_tcd_layer_t;
87
88 /**
89 Tile coder/decoder: codeblock instance
90 */
91 typedef struct opj_tcd_cblk {
92 /** Dimension of the code-blocks : left upper corner (x0, y0, z0) */
93   int x0, y0, z0;
94 /** Dimension of the code-blocks : right low corner (x1,y1,z1) */
95   int x1, y1, z1;               
96 /** Number of bits per simbol in codeblock */
97   int numbps;
98   int numlenbits;
99   int len;                                              /* length */
100 /** Number of pass already done for the code-blocks */
101   int numpasses;                                
102 /** number of pass added to the code-blocks */
103   int numnewpasses;                             
104 /** Number of segments */
105   int numsegs;                                  
106 /** Segments informations */
107   opj_tcd_seg_t segs[100];              
108 /** Number of passes in the layer */
109   int numpassesinlayers;                
110 /** Layer information */
111   opj_tcd_layer_t layers[100];  
112 /** Total number of passes */
113   int totalpasses;                              
114 /** Information about the passes */
115   opj_tcd_pass_t passes[100];   
116 /* Data */
117   unsigned char data[524288];           
118   //unsigned char *data;
119 } opj_tcd_cblk_t;
120
121 /**
122 Tile coder/decoder: precint instance
123 */
124 typedef struct opj_tcd_precinct {
125 /** Dimension of the precint : left upper corner (x0, y0, z0) */
126   int x0, y0, z0;
127 /** Dimension of the precint : right low corner (x1,y1,z1) */
128   int x1, y1, z1;
129 /** Number of codeblocks in precinct in width and heigth and length*/
130   int cblkno[3];                                
131 /** Information about the codeblocks */
132   opj_tcd_cblk_t *cblks;                
133 /** Inclusion tree */
134   opj_tgt_tree_t *incltree;             
135 /** Missing MSBs tree */
136   opj_tgt_tree_t *imsbtree;             
137 } opj_tcd_precinct_t;
138
139 /**
140 Tile coder/decoder: subband instance
141 */
142 typedef struct opj_tcd_band {
143 /** Dimension of the subband : left upper corner (x0, y0, z0) */
144   int x0, y0, z0;
145 /** Dimension of the subband : right low corner (x1,y1,z1) */
146   int x1, y1, z1;
147 /** Information about the precints */
148   opj_tcd_precinct_t *precincts;        /* precinct information */
149 /** Number of bits per symbol in band */
150   int numbps;
151 /** Quantization stepsize associated */
152   float stepsize;
153 /** Band orientation (O->LLL,...,7->HHH) */
154   int bandno;
155 } opj_tcd_band_t;
156
157 /**
158 Tile coder/decoder: resolution instance
159 */
160 typedef struct opj_tcd_resolution {
161 /** Dimension of the resolution level : left upper corner (x0, y0, z0) */
162   int x0, y0, z0;
163 /** Dimension of the resolution level : right low corner (x1,y1,z1) */
164   int x1, y1, z1;
165 /** Number of precints in each dimension for the resolution level */
166   int prctno[3];                                
167 /** Number of subbands for the resolution level */
168   int numbands;                                 
169 /** Subband information */
170   opj_tcd_band_t *bands;                
171 } opj_tcd_resolution_t;
172
173 /**
174 Tile coder/decoder: component instance
175 */
176 typedef struct opj_tcd_tilecomp {
177 /** Dimension of the component : left upper corner (x0, y0, z0) */
178   int x0, y0, z0;
179 /** Dimension of the component : right low corner (x1,y1,z1) */
180   int x1, y1, z1;
181 /** Number of resolutions level if DWT transform*/
182   int numresolution[3];                                 
183 /** Resolution information */
184   opj_tcd_resolution_t *resolutions;    
185 /** Data of the component */
186   int *data;                                    
187 /** Fixed_quality related */
188   int nbpix;                            
189 /** Number of bits per voxel in component */
190   int bpp;
191 } opj_tcd_tilecomp_t;
192
193 /**
194 Tile coder/decoder: tile instance
195 */
196 typedef struct opj_tcd_tile {
197 /** Dimension of the tile : left upper corner (x0, y0, z0) */
198   int x0, y0, z0;
199 /** Dimension of the tile : right low corner (x1,y1,z1) */
200   int x1, y1, z1;
201 /** Number of components in tile */
202   int numcomps;                                 
203 /** Components information */
204   opj_tcd_tilecomp_t *comps;    
205 /** Fixed_quality related : no of bytes of data*/
206   int nbpix;                                    
207 /** Fixed_quality related : distortion achieved in tile */
208   double distotile;                             
209 /** Fixed_quality related : distortion achieved in each layer */
210   double distolayer[100];               
211 } opj_tcd_tile_t;
212
213 /**
214 Tile coder/decoder: volume instance
215 */
216 typedef struct opj_tcd_volume {
217 /** Number of tiles in width and heigth and length */
218         int tw, th, tl;                         
219 /** Tiles information */
220   opj_tcd_tile_t *tiles;                
221 } opj_tcd_volume_t;
222
223 /**
224 Tile coder/decoder
225 */
226 typedef struct opj_tcd {
227 /** Codec context */    
228         opj_common_ptr cinfo;                   
229 /** Volume information */       
230         opj_volume_t *volume;                   
231 /** Coding parameters */        
232         opj_cp_t *cp;                                   
233 /** Coding/decoding parameters common to all tiles */   
234         opj_tcp_t *tcp;                                 
235 /** Info on each volume tile */
236         opj_tcd_volume_t *tcd_volume;   
237 /** Pointer to the current encoded/decoded tile */
238         opj_tcd_tile_t *tcd_tile;               
239 /** Current encoded/decoded tile */
240         int tcd_tileno;                                 
241
242         /**@name working variables */
243         /*@{*/
244         opj_tcd_tile_t *tile;
245         opj_tcd_tilecomp_t *tilec;
246         opj_tcd_resolution_t *res;
247         opj_tcd_band_t *band;
248         opj_tcd_precinct_t *prc;
249         opj_tcd_cblk_t *cblk;
250         /*@}*/
251 } opj_tcd_t;
252
253 /** @name Funciones generales */
254 /*@{*/
255 /* ----------------------------------------------------------------------- */
256
257 /**
258 Dump the content of a tcd structure
259 */
260 void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_volume_t *img);
261 /**
262 Create a new TCD handle
263 @param cinfo Codec context info
264 @return Returns a new TCD handle if successful returns NULL otherwise
265 */
266 opj_tcd_t* tcd_create(opj_common_ptr cinfo);
267 /**
268 Destroy a previously created TCD handle
269 @param tcd TCD handle to destroy
270 */
271 void tcd_destroy(opj_tcd_t *tcd);
272 /**
273 Initialize the tile coder (allocate the memory) 
274 @param tcd TCD handle
275 @param volume Raw volume
276 @param cp Coding parameters
277 @param curtileno Number that identifies the tile that will be encoded
278 */
279 void tcd_malloc_encode(opj_tcd_t *tcd, opj_volume_t * volume, opj_cp_t * cp, int curtileno);
280 /**
281 Initialize the tile coder (reuses the memory allocated by tcd_malloc_encode)(for 3D-DWT)
282 @param tcd TCD handle
283 @param volume Raw volume
284 @param cp Coding parameters
285 @param curtileno Number that identifies the tile that will be encoded
286 */
287 void tcd_init_encode(opj_tcd_t *tcd, opj_volume_t * volume, opj_cp_t * cp, int curtileno);
288 /**
289 Free the memory allocated for encoding
290 @param tcd TCD handle
291 */
292 void tcd_free_encode(opj_tcd_t *tcd);
293 /**
294 Initialize the tile decoder
295 @param tcd TCD handle
296 @param volume Raw volume
297 @param cp Coding parameters
298 */
299 void tcd_malloc_decode(opj_tcd_t *tcd, opj_volume_t * volume, opj_cp_t * cp);
300
301 void tcd_makelayer_fixed(opj_tcd_t *tcd, int layno, int final);
302 void tcd_rateallocate_fixed(opj_tcd_t *tcd);
303 void tcd_makelayer(opj_tcd_t *tcd, int layno, double thresh, int final);
304 bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len, opj_volume_info_t * volume_info);
305 /**
306 Encode a tile from the raw volume into a buffer
307 @param tcd TCD handle
308 @param tileno Number that identifies one of the tiles to be encoded
309 @param dest Destination buffer
310 @param len Length of destination buffer
311 @param volume_info Creation of index file
312 @return 
313 */
314 int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len, opj_volume_info_t * volume_info);
315 /**
316 Decode a tile from a buffer into a raw volume
317 @param tcd TCD handle
318 @param src Source buffer
319 @param len Length of source buffer
320 @param tileno Number that identifies one of the tiles to be decoded
321 */
322 bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, int tileno);
323 /**
324 Free the memory allocated for decoding
325 @param tcd TCD handle
326 */
327 void tcd_free_decode(opj_tcd_t *tcd);
328
329 /* ----------------------------------------------------------------------- */
330 /*@}*/
331
332 /*@}*/
333
334 #endif /* __TCD_H */