summaryrefslogtreecommitdiff
path: root/indexer_JPIP/j2k.h
blob: e899fae3d90bd3c60e84e1b881c02bd4a0cc8023 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
/*
 * Copyright (c) 2001-2002, David Janssens
 * Copyright (c) 2003, Yannick Verschueren
 * Copyright (c) 2003,  Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
 * All rights reserved. 
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#define VERSION "0.0.8"

#ifdef WIN32
#ifdef LIBJ2K_EXPORTS
#define LIBJ2K_API __declspec(dllexport)
#else
#define LIBJ2K_API __declspec(dllimport)
#endif
#else
#define LIBJ2K_API
#endif

#ifndef __J2K_H
#define __J2K_H

#define J2K_MAXRLVLS 33
#define J2K_MAXBANDS (3*J2K_MAXRLVLS+1)

#define J2K_CP_CSTY_PRT 0x01
#define J2K_CP_CSTY_SOP 0x02
#define J2K_CP_CSTY_EPH 0x04
#define J2K_CCP_CSTY_PRT 0x01
#define J2K_CCP_CBLKSTY_LAZY 0x01
#define J2K_CCP_CBLKSTY_RESET 0x02
#define J2K_CCP_CBLKSTY_TERMALL 0x04
#define J2K_CCP_CBLKSTY_VSC 0x08
#define J2K_CCP_CBLKSTY_PTERM 0x10
#define J2K_CCP_CBLKSTY_SEGSYM 0x20
#define J2K_CCP_QNTSTY_NOQNT 0
#define J2K_CCP_QNTSTY_SIQNT 1
#define J2K_CCP_QNTSTY_SEQNT 2

typedef struct 
{
  int dx, dy; // XRsiz, YRsiz
  int prec; // precision
  int bpp; // deapth of image in bits
  int sgnd; // signed
  int *data; // image-component data
} j2k_comp_t;

typedef struct {
    int x0, y0; // XOsiz, YOsiz
    int x1, y1; // Xsiz, Ysiz 
    int numcomps; // number of components
    int index_on; // 0 = no index || 1 = index
  //int PPT;
    j2k_comp_t *comps; // image-components
} j2k_image_t;

typedef struct {
    int expn; // exponent
    int mant; // mantissa
} j2k_stepsize_t;

typedef struct {
    int csty; // coding style
    int numresolutions; // number of resolutions
    int cblkw; // width of code-blocks
    int cblkh; // height of code-blocks
    int cblksty; // code-block coding style
    int qmfbid; // discrete wavelet transform identifier
    int qntsty; // quantisation style
    j2k_stepsize_t stepsizes[J2K_MAXBANDS]; // stepsizes used for quantisation
    int numgbits; // number of guard bits
    int roishift; // Region Of Interest shift
    int prcw[J2K_MAXRLVLS]; // Precinct width
    int prch[J2K_MAXRLVLS]; // Precinct height
} j2k_tccp_t;

typedef struct {
    int resno0, compno0; 
    int layno1, resno1, compno1;
    int prg;
    int tile;
    char progorder[4];
} j2k_poc_t;

typedef struct {
    int csty; // coding style  
    int prg; // progression order
    int numlayers; // number of layers
    int mct; // multi-component transform identifier
    int rates[100]; // rates of layers
    int numpocs; // number of progression order changes 
    j2k_poc_t pocs[32]; // progression order changes
    j2k_tccp_t *tccps; // tile-component coding parameters
} j2k_tcp_t;

typedef struct {
    int tx0, ty0; // XTOsiz, YTOsiz
    int tdx, tdy; // XTsiz, YTsiz
    int tw, th;
    j2k_tcp_t *tcps; // tile coding parameters
} j2k_cp_t;

typedef struct {  
  int len;
  int len_header;
  int offset;
} info_layer_t;

typedef struct {  
  info_layer_t *layer;
} info_prec_t;

typedef struct {  
  info_prec_t *prec;
} info_reso_t;

typedef struct {  
  info_reso_t *reso;
} info_compo_t;

typedef struct {
  int num_tile;   // Number of Tile
  int start_pos;  // Start position
  int end_header; // End position of the header
  int end_pos;    // End position
  int pw, ph;     // number of precinct by tile
  int num_packet; // number of packet in the tile
  info_compo_t *compo;  // component [packet]
} info_tile_t; // index struct

typedef struct {
  int type;   // type of marker [SIZ, QCD, POC, PPM, CRG] appearing only once
  int start_pos;  // Start position of the marker
  int len; // Length of the marker
} info_marker_t; // index struct

typedef struct{
  info_marker_t *COD;
  int num_COD;
  info_marker_t *COC;
  int num_COC;
  info_marker_t *RGN;
  int num_RGN;
  info_marker_t *QCC;
  int num_QCC;
  info_marker_t *TLM;
  int num_TLM;
  info_marker_t *PLM;
  int num_PLM;
  info_marker_t *PPM;
  int num_PPM;
  info_marker_t *COM;
  int num_COM;
} info_marker_mul_t; // index struct

typedef struct {
  int index_on;
  int num;  // numero of packet
  int index_write; // writing the packet inthe index with t2_encode_packets
  int Im_w, Im_h; // Image width and Height
  int Prog; // progression order
  int Tile_x, Tile_y; // Number of Tile in X and Y
  int tw, th;
  int Comp; // Component numbers
  int Layer; // number of layer
  int Decomposition; // number of decomposition
  int pw, ph;   // nombre precinct in X and Y
  int pdx, pdy; // size of precinct in X and Y
  int Main_head_end; // Main header position
  int codestream_size; // codestream's size
  info_tile_t *tile;  // information concerning tiles inside image
  info_marker_t *marker; // information concerning markers inside image [only one apparition]
  info_marker_mul_t marker_mul;  // information concerning markers inside image [multiple apparition] 
  int num_marker; // number of marker
  int num_packet_max;  // MAximum number of packet
} info_image_t; // index struct



/* 
 * Encode an image into a JPEG-2000 codestream
 * i: image to encode
 * cp: coding parameters
 * dest: destination buffer
 * len: length of destination buffer
 * index : index file name
 */
LIBJ2K_API int j2k_encode(j2k_image_t *i, j2k_cp_t *cp,char *outfile, int len,char *index);

//LIBJ2K_API int j2k_encode(j2k_image_t *i, j2k_cp_t *cp,unsigned char *dest, int len);
/*
 * Decode an image from a JPEG-2000 codestream
 * src: source buffer
 * len: length of source buffer
 * i: decode image
 * cp: coding parameters that were used to encode the image
 */
LIBJ2K_API int j2k_decode(unsigned char *src, int len, j2k_image_t **i, j2k_cp_t **cp);

#endif