Initial revision
[openjpeg.git] / libopenjpeg / tcd.h
1 /*
2  * Copyright (c) 2001-2002, David Janssens 
3  * Copyright (c) 2002-2003, Yannick Verschueren
4  * Copyright (c) 2002-2003,  Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
17  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26  * POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #ifndef __TCD_H
30 #define __TCD_H
31
32 #include "j2k.h"
33 #include "tgt.h"
34
35 typedef struct {
36   int numpasses;
37   int len;
38   unsigned char *data;
39   int maxpasses;
40   int numnewpasses;
41   int newlen;
42 } tcd_seg_t;
43
44 typedef struct {
45   int rate;                         
46   double distortiondec;             
47   int term, len;
48 } tcd_pass_t;
49
50 typedef struct {
51   int numpasses;                    /* Number of passes in the layer */
52   int len;                          /* len of information */
53   double disto;                     /* add for index (Cfr. Marcela) */
54   unsigned char *data;              /* data */
55 } tcd_layer_t;
56
57 typedef struct {
58   int x0, y0, x1, y1;               /* dimension of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */
59   int numbps;
60   int numlenbits;
61   int len;                          /* length */
62   int numpasses;                    /* number of pass already done for the code-blocks */
63   int numnewpasses;                 /* number of pass added to the code-blocks */
64   int numsegs;                      /* number of segments */
65   tcd_seg_t segs[100];              /* segments informations */
66   unsigned char data[8192];         /* Data */
67   int numpassesinlayers;            /* number of passes in the layer */
68   tcd_layer_t layers[100];          /* layer information */
69   int totalpasses;                  /* total number of passes */
70   tcd_pass_t passes[100];           /* information about the passes */
71 } tcd_cblk_t;
72
73 typedef struct {
74   int x0, y0, x1, y1;               /* dimension of the precinct : left upper corner (x0, y0) right low corner (x1,y1) */
75   int cw, ch;                       /* number of precinct in width and heigth */
76   tcd_cblk_t *cblks;                /* code-blocks informations */
77   tgt_tree_t *incltree;             /* inclusion tree */
78   tgt_tree_t *imsbtree;             /* IMSB tree */
79 } tcd_precinct_t;
80
81 typedef struct {
82   int x0, y0, x1, y1;               /* dimension of the subband : left upper corner (x0, y0) right low corner (x1,y1) */
83   int bandno;
84   tcd_precinct_t *precincts;        /* precinct information */
85   int numbps;
86   int stepsize;
87 } tcd_band_t;
88
89 typedef struct {
90   int x0, y0, x1, y1;               /* dimension of the resolution level : left upper corner (x0, y0) right low corner (x1,y1) */
91   int pw, ph;                       
92   int numbands;                     /* number sub-band for the resolution level */
93   tcd_band_t bands[3];              /* subband information */
94 } tcd_resolution_t;
95
96 typedef struct {
97   int x0, y0, x1, y1;               /* dimension of component : left upper corner (x0, y0) right low corner (x1,y1) */
98   int numresolutions;               /* number of resolutions level */
99   tcd_resolution_t *resolutions;    /* resolutions information */
100   int *data;                        /* data of the component */
101 } tcd_tilecomp_t;
102
103 typedef struct {
104   int x0, y0, x1, y1;               /* dimension of the tile : left upper corner (x0, y0) right low corner (x1,y1) */
105   int numcomps;                     /* number of components in tile */
106   tcd_tilecomp_t *comps;            /* Components information */
107 } tcd_tile_t;
108
109 typedef struct {
110   int tw, th;                       /* number of tiles in width and heigth */
111   tcd_tile_t *tiles;                /* Tiles information */
112 } tcd_image_t;
113
114 /*
115  * Initialize the tile coder (reuses the memory allocated by tcd_malloc_encode)
116  * img: raw image
117  * cp: coding parameters
118  * curtileno : number that identifies the tile that will be encoded
119  */
120 void tcd_init_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno);
121
122
123 /*
124  * Initialize the tile coder (allocate the memory)
125  * img: raw image
126  * cp: coding parameters
127  * curtileno : number that identifies the tile that will be encoded
128  */
129 void tcd_malloc_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno);
130
131
132 /*
133  * Initialize the tile decoder
134  * img: raw image
135  * cp: coding parameters
136  */
137 void tcd_init(j2k_image_t * img, j2k_cp_t * cp);
138
139
140 /*
141  * Free the memory allocated for encoding
142  * img: raw image
143  * cp: coding parameters
144  * curtileno : number that identifies the tile that will be encoded
145  */
146 void tcd_free_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno);
147
148 /*
149  * Encode a tile from the raw image into a buffer, format pnm, pgm or ppm
150  * tileno: number that identifies one of the tiles to be encoded
151  * dest: destination buffer
152  * len: length of destination buffer
153  * info_IM: creation of index file
154  */
155 int tcd_encode_tile_pxm(int tileno, unsigned char *dest, int len, info_image * info_IM);
156
157
158 /*
159  * Encode a tile from the raw image into a buffer, format pgx
160  * tileno: number that identifies one of the tiles to be encoded
161  * dest: destination buffer
162  * len: length of destination buffer
163  * info_IM: creation of index file
164  */
165 int tcd_encode_tile_pgx(int tileno, unsigned char *dest, int len, info_image * info_IM);
166
167 /*
168  * Decode a tile from a buffer into a raw image
169  * src: source buffer
170  * len: length of the source buffer
171  * tileno: number that identifies the tile that will be decoded
172  */
173 int tcd_decode_tile(unsigned char *src, int len, int tileno);
174
175 #endif