236a3a6b05cb3df6366950897933076a38d1d2f0
[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   int nbpix;                    /* add fixed_quality */
102 } tcd_tilecomp_t;
103
104 typedef struct {
105   int x0, y0, x1, y1;           /* dimension of the tile : left upper corner (x0, y0) right low corner (x1,y1) */
106   int numcomps;                 /* number of components in tile */
107   tcd_tilecomp_t *comps;        /* Components information */
108   int nbpix;                    /* add fixed_quality */
109   double distotile;             /* add fixed_quality */
110   double distolayer[100];       /* add fixed_quality */
111 } tcd_tile_t;
112
113 typedef struct {
114   int tw, th;                   /* number of tiles in width and heigth */
115   tcd_tile_t *tiles;            /* Tiles information */
116 } tcd_image_t;
117
118 /*
119  * Initialize the tile coder (reuses the memory allocated by tcd_malloc_encode)
120  * img: raw image
121  * cp: coding parameters
122  * curtileno : number that identifies the tile that will be encoded
123  */
124 void tcd_init_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno);
125
126
127 /*
128  * Initialize the tile coder (allocate the memory)
129  * img: raw image
130  * cp: coding parameters
131  * curtileno : number that identifies the tile that will be encoded
132  */
133 void tcd_malloc_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno);
134
135
136 /*
137  * Initialize the tile decoder
138  * img: raw image
139  * cp: coding parameters
140  */
141 void tcd_init(j2k_image_t * img, j2k_cp_t * cp);
142
143
144 /*
145  * Free the memory allocated for encoding
146  * img: raw image
147  * cp: coding parameters
148  * curtileno : number that identifies the tile that will be encoded
149  */
150 void tcd_free_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno);
151
152 /*
153  * Encode a tile from the raw image into a buffer, format pnm, pgm or ppm
154  * tileno: number that identifies one of the tiles to be encoded
155  * dest: destination buffer
156  * len: length of destination buffer
157  * info_IM: creation of index file
158  */
159 int tcd_encode_tile_pxm(int tileno, unsigned char *dest, int len,
160                         info_image * info_IM);
161
162
163 /*
164  * Encode a tile from the raw image into a buffer, format pgx
165  * tileno: number that identifies one of the tiles to be encoded
166  * dest: destination buffer
167  * len: length of destination buffer
168  * info_IM: creation of index file
169  */
170 int tcd_encode_tile_pgx(int tileno, unsigned char *dest, int len,
171                         info_image * info_IM);
172
173 /*
174  * Decode a tile from a buffer into a raw image
175  * src: source buffer
176  * len: length of the source buffer
177  * tileno: number that identifies the tile that will be decoded
178  */
179 int tcd_decode_tile(unsigned char *src, int len, int tileno);
180
181 #endif