Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  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, Hervé 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 */
  335.