1) quantization stepsizes stored as float instead of shifted integers -> fixes a...
[openjpeg.git] / libopenjpeg / j2k.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 #define VERSION "0.0.8"
30
31 #ifdef DAVID_WIN32
32 #ifdef LIBJ2K_EXPORTS
33 #define LIBJ2K_API __declspec(dllexport)
34 #else
35 #define LIBJ2K_API __declspec(dllimport)
36 #endif
37 #else
38 #define LIBJ2K_API
39 #endif
40
41 #ifndef __J2K_H
42 #define __J2K_H
43
44 #define J2K_MAXRLVLS 33         /* Number of maximum resolution level authorized                   */
45 #define J2K_MAXBANDS (3*J2K_MAXRLVLS-2) /* Number of maximum sub-band linked to number of resolution level */
46 #define J2K_CFMT 0
47 #define JP2_CFMT 1
48 #define JPT_CFMT 2
49 #define MJ2_CFMT 3
50 #define PXM_DFMT 0
51 #define PGX_DFMT 1
52 #define BMP_DFMT 2
53 #define YUV_DFMT 3
54
55 #define J2K_CP_CSTY_PRT 0x01
56 #define J2K_CP_CSTY_SOP 0x02
57 #define J2K_CP_CSTY_EPH 0x04
58 #define J2K_CCP_CSTY_PRT 0x01
59 #define J2K_CCP_CBLKSTY_LAZY 0x01
60 #define J2K_CCP_CBLKSTY_RESET 0x02
61 #define J2K_CCP_CBLKSTY_TERMALL 0x04
62 #define J2K_CCP_CBLKSTY_VSC 0x08
63 #define J2K_CCP_CBLKSTY_PTERM 0x10
64 #define J2K_CCP_CBLKSTY_SEGSYM 0x20
65 #define J2K_CCP_QNTSTY_NOQNT 0
66 #define J2K_CCP_QNTSTY_SIQNT 1
67 #define J2K_CCP_QNTSTY_SEQNT 2
68
69 typedef struct {
70   int dx, dy;                   /* XRsiz, YRsiz              */
71   int w, h;                     /* width and height of data  */
72   int x0, y0;                   /* offset of the component compare to the whole image  */
73   int prec;                     /* precision                 */
74   int bpp;                      /* deapth of image in bits   */
75   int sgnd;                     /* signed                    */
76   int resno_decoded;            /* number of decoded resolution */
77   int factor;                   /* number of division by 2 of the out image  compare to the original size of image */
78   int *data;                    /* image-component data      */
79 } j2k_comp_t;
80
81 typedef struct {
82   int x0, y0;                   /* XOsiz, YOsiz              */
83   int x1, y1;                   /* Xsiz, Ysiz                */
84   int numcomps;                 /* number of components      */
85   int color_space;              /* sRGB, Greyscale or YUV */
86   j2k_comp_t *comps;            /* image-components          */
87 } j2k_image_t;
88
89 typedef struct {
90   int expn;                     /* exponent                  */
91   int mant;                     /* mantissa                  */
92 } j2k_stepsize_t;
93
94 typedef struct {
95   int csty;                     /* coding style                          */
96   int numresolutions;           /* number of resolutions                 */
97   int cblkw;                    /* width of code-blocks                  */
98   int cblkh;                    /* height of code-blocks                 */
99   int cblksty;                  /* code-block coding style               */
100   int qmfbid;                   /* discrete wavelet transform identifier */
101   int qntsty;                   /* quantisation style                    */
102   j2k_stepsize_t stepsizes[J2K_MAXBANDS];       /* stepsizes used for quantization       */
103   int numgbits;                 /* number of guard bits                  */
104   int roishift;                 /* Region Of Interest shift              */
105   int prcw[J2K_MAXRLVLS];       /* Precinct width                        */
106   int prch[J2K_MAXRLVLS];       /* Precinct height                       */
107 } j2k_tccp_t;
108
109 typedef struct {
110   int resno0, compno0;
111   int layno1, resno1, compno1;
112   int prg;
113   int tile;
114   char progorder[4];
115 } j2k_poc_t;
116
117 typedef struct {
118   int first;                    /* 1 : first part-tile of a tile                                     */
119   int csty;                     /* coding style                                                      */
120   int prg;                      /* progression order                                                 */
121   int numlayers;                /* number of layers                                                  */
122   int mct;                      /* multi-component transform identifier                              */
123   int rates[100];               /* rates of layers                                                   */
124   int numpocs;                  /* number of progression order changes                               */
125   int POC;                      /* Precise if a POC marker has been used O:NO, 1:YES                 */
126   j2k_poc_t pocs[32];           /* progression order changes                                         */
127   unsigned char *ppt_data;      /* packet header store there for futur use in t2_decode_packet       */
128   unsigned char *ppt_data_first;        /* pointer remaining on the first byte of the first header if ppt is used */
129   int ppt;                      /* If ppt == 1 --> there was a PPT marker for the present tile       */
130   int ppt_store;                /* Use in case of multiple marker PPT (number of info already store) */
131   int ppt_len;                  /* ppmbug1 */
132   float distoratio[100];        /* add fixed_quality */
133   j2k_tccp_t *tccps;            /* tile-component coding parameters                                  */
134 } j2k_tcp_t;
135
136 typedef struct {
137   int intermed_file;            /* 1: Store each encoded tile one by one in the output file (for mega-Images)*/
138   int decod_format;             /* 0: PGX, 1: PxM, 2: BMP */
139   int cod_format;               /* 0: J2K, 1: JP2, 2: JPT */
140   int disto_alloc;              /* Allocation by rate/distortion     */
141   int fixed_alloc;              /* Allocation by fixed layer         */
142   int fixed_quality;            /* add fixed_quality */
143   int reduce;                   /* if != 0, then original dimension divided by 2^(reduce); if == 0 or not used, image is decoded to the full resolution */
144   int layer;                    /* if != 0, then only the first "layer" layers are decoded; if == 0 or not used, all the quality layers are decoded */
145   int index_on;                 /* 0 = no index || 1 = index */
146   int tx0, ty0;                 /* XTOsiz, YTOsiz                    */
147   int tdx, tdy;                 /* XTsiz, YTsiz                      */
148   char *comment;                /* comment for coding                */
149   int tw, th;                   /* number of tiles in width and heigth */
150   int *tileno;                  /* ID number of the tiles present in the codestream */
151   int tileno_size;              /* size of the vector tileno */
152   unsigned char *ppm_data;      /* packet header store there for futur use in t2_decode_packet             */
153   unsigned char *ppm_data_first;        /* pointer remaining on the first byte of the first header if ppm is used */
154   int ppm;                      /* If ppm == 1 --> there was a PPM marker for the present tile             */
155   int ppm_store;                /* Use in case of multiple marker PPM (number of info already store)       */
156   int ppm_previous;             /* Use in case of multiple marker PPM (case on non-finished previous info) */
157   int ppm_len;                  /* ppmbug1 */
158   j2k_tcp_t *tcps;              /* tile coding parameters                                                  */
159   int *matrice;                 /* Fixed layer                                                             */
160 } j2k_cp_t;
161
162 typedef struct {
163   int start_pos, end_pos;       /* start and end position            */
164   double disto;                 /* ADD for Marcela                   */
165 } info_packet;                  /* Index struct                      */
166
167 typedef struct {
168   double *thresh;               /* value of thresh for each layer by tile cfr. Marcela   */
169   int num_tile;                 /* Number of Tile                                        */
170   int start_pos;                /* Start position                                        */
171   int end_header;               /* End position of the header                            */
172   int end_pos;                  /* End position                                          */
173   int pw[33], ph[33];           /* precinct number for each resolution level             */
174
175   int pdx[33], pdy[33];         /* precinct size (in power of 2), in X and Y for each resolution level */
176   info_packet *packet;          /* information concerning packets inside tile            */
177   int nbpix;                    /* add fixed_quality                                     */
178   double distotile;             /* add fixed_quality                                     */
179 } info_tile;                    /* index struct                                          */
180
181 typedef struct {
182   int index_on;
183   double D_max;                 /* ADD for Marcela                                       */
184   int num;                      /* numero of packet                                      */
185   int index_write;              /* writing the packet inthe index with t2_encode_packets */
186   int Im_w, Im_h;               /* Image width and Height                                */
187   int Prog;                     /* progression order                                     */
188   int Tile_x, Tile_y;           /* Tile size in x and y                                  */
189   int Tile_Ox, Tile_Oy;
190   int tw, th;                   /* Number of Tile in X and Y                             */
191   int Comp;                     /* Component numbers                                     */
192   int Layer;                    /* number of layer                                       */
193   int Decomposition;            /* number of decomposition                               */
194   int Main_head_end;            /* Main header position                                  */
195   int codestream_size;          /* codestream's size                                     */
196   info_tile *tile;              /* information concerning tiles inside image             */
197 } info_image;                   /* index struct                                          */
198
199 /* 
200  * Encode an image into a JPEG-2000 codestream
201  * i: image to encode
202  * cp: coding parameters
203  * output: destination buffer or name of the output file when cp->intermed_file==1
204  * len: length of destination buffer
205  * index : index file name
206  */
207 LIBJ2K_API int j2k_encode(j2k_image_t * i, j2k_cp_t * cp, char *output,
208                           int len, char *index);
209
210 /* LIBJ2K_API int j2k_encode(j2k_image_t *i, j2k_cp_t *cp,unsigned char *dest, int len); */
211 /*
212  * Decode an image from a JPEG-2000 codestream
213  * src: source buffer
214  * len: length of source buffer
215  * i: decode image
216  * cp: coding parameters that were used to encode the image
217  */
218
219 LIBJ2K_API int j2k_decode(unsigned char *src, int len, j2k_image_t * img,
220                           j2k_cp_t * cp);
221
222
223 /*
224  * Decode an image form a JPT-stream (JPEG 2000, JPIP)
225  * src: source buffer
226  * len: length of source buffer
227  * i: decode image
228  * cp: coding parameters that were used to encode the image
229  *
230  */
231 int j2k_decode_jpt_stream(unsigned char *src, int len, j2k_image_t * img,
232                           j2k_cp_t * cp);
233
234 void j2k_dec_release();//antonin
235
236 #endif