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, Herve 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
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
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.
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.
35 @brief The JPEG-2000 Codestream Reader/Writer (J3D)
37 The functions in J3D.C have for goal to read/write the several parts of the codestream: markers and data.
40 /** @defgroup J3D J3D - JPEG-2000 PART 10 codestream reader/writer */
43 #define J3D_CP_CSTY_PRT 0x01
44 #define J3D_CP_CSTY_SOP 0x02
45 #define J3D_CP_CSTY_EPH 0x04
46 #define J3D_CCP_CSTY_PRT 0x01
48 #define J3D_CCP_CBLKSTY_LAZY 0x01 /* Selective arithmetic coding bypass */
49 #define J3D_CCP_CBLKSTY_RESET 0x02 /* Reset context probabilities on coding pass boundaries */
50 #define J3D_CCP_CBLKSTY_TERMALL 0x04 /* Termination on each coding pass */
51 #define J3D_CCP_CBLKSTY_VSC 0x08 /* Vertically causal context, add also hook for switching off and on 3D context models */
52 #define J3D_CCP_CBLKSTY_PTERM 0x10 /* Predictable termination */
53 #define J3D_CCP_CBLKSTY_SEGSYM 0x20 /* Segmentation symbols are used */
54 #define J3D_CCP_CBLKSTY_3DCTXT 0x40 /* 3D context models (3D-EBCOT) vs 2D context models */
56 #define J3D_CCP_QNTSTY_NOQNT 0 /* Quantization style : no quantization */
57 #define J3D_CCP_QNTSTY_SIQNT 1 /* Quantization style : scalar derived (values signalled only in LLL subband) */
58 #define J3D_CCP_QNTSTY_SEQNT 2 /* Quantization style : scalar expounded (values signalled for each subband) */
60 /* ----------------------------------------------------------------------- */
62 #define J3D_MS_SOC 0xff4f /**< SOC marker value */
63 #define J3D_MS_SOT 0xff90 /**< SOT marker value */
64 #define J3D_MS_SOD 0xff93 /**< SOD marker value */
65 #define J3D_MS_EOC 0xffd9 /**< EOC marker value */
66 #define J3D_MS_CAP 0xff50 /**< CAP marker value */
67 #define J3D_MS_SIZ 0xff51 /**< SIZ marker value */
68 #define J3D_MS_NSI 0xff54 /**< NSI marker value */
69 #define J3D_MS_COD 0xff52 /**< COD marker value */
70 #define J3D_MS_COC 0xff53 /**< COC marker value */
71 #define J3D_MS_RGN 0xff5e /**< RGN marker value */
72 #define J3D_MS_QCD 0xff5c /**< QCD marker value */
73 #define J3D_MS_QCC 0xff5d /**< QCC marker value */
74 #define J3D_MS_POC 0xff5f /**< POC marker value */
75 #define J3D_MS_TLM 0xff55 /**< TLM marker value */
76 #define J3D_MS_PLM 0xff57 /**< PLM marker value */
77 #define J3D_MS_PLT 0xff58 /**< PLT marker value */
78 #define J3D_MS_PPM 0xff60 /**< PPM marker value */
79 #define J3D_MS_PPT 0xff61 /**< PPT marker value */
80 #define J3D_MS_SOP 0xff91 /**< SOP marker value */
81 #define J3D_MS_EPH 0xff92 /**< EPH marker value */
82 #define J3D_MS_CRG 0xff63 /**< CRG marker value */
83 #define J3D_MS_COM 0xff64 /**< COM marker value */
85 #define J3D_MS_DCO 0xff70 /**< DCO marker value */
86 #define J3D_MS_VMS 0xff71 /**< VMS marker value */
87 #define J3D_MS_DFS 0xff72 /**< DFS marker value */
88 #define J3D_MS_ADS 0xff73 /**< ADS marker value */
89 #define J3D_MS_ATK 0xff79 /**< ATK marker value */
90 #define J3D_MS_CBD 0xff78 /**< CBD marker value */
91 #define J3D_MS_MCT 0xff74 /**< MCT marker value */
92 #define J3D_MS_MCC 0xff75 /**< MCC marker value */
93 #define J3D_MS_MCO 0xff77 /**< MCO marker value */
94 #define J3D_MS_NLT 0xff76 /**< NLT marker value */
95 #define J3D_MS_QPD 0xff5a /**< QPD marker value */
96 #define J3D_MS_QPC 0xff5b /**< QPC marker value */
98 /* ----------------------------------------------------------------------- */
99 /* Capability RSIZ parameter, extended */
100 #define J3D_RSIZ_BASIC 0x0000
102 #define J3D_RSIZ_DCO 0x8001 /* Required */
103 #define J3D_RSIZ_VSQNT 0x8002
104 #define J3D_RSIZ_TCQNT 0x8004
105 #define J3D_RSIZ_VMASK 0x8008
106 #define J3D_RSIZ_SSOVL 0x8010
107 #define J3D_RSIZ_ADECS 0x8020
108 #define J3D_RSIZ_ATK 0x8040 /*Required*/
109 #define J3D_RSIZ_SSYMK 0x8080
110 #define J3D_RSIZ_MCT 0x8100 /*Not compatible with DCO*/
111 #define J3D_RSIZ_NLT 0x8200 /*Required*/
112 #define J3D_RSIZ_ASHAP 0x8400
113 #define J3D_RSIZ_PRQNT 0x8800
115 #define J3D_CAP_10 0x00400000
116 /* Arbitrary transformation kernel, 15444-2 */
117 #define J3D_ATK_IRR 0
118 #define J3D_ATK_REV 1
119 #define J3D_ATK_ARB 0
121 #define J3D_ATK_CON 0
122 /* ----------------------------------------------------------------------- */
125 Values that specify the status of the decoding process when decoding the main header.
126 These values may be combined with a | operator.
128 typedef enum J3D_STATUS {
129 /**< a SOC marker is expected */
130 J3D_STATE_MHSOC = 0x0001,
131 /**< a SIZ marker is expected */
132 J3D_STATE_MHSIZ = 0x0002,
133 /**< the decoding process is in the main header */
134 J3D_STATE_MH = 0x0004,
135 /**< the decoding process is in a tile part header and expects a SOT marker */
136 J3D_STATE_TPHSOT = 0x0008,
137 /**< the decoding process is in a tile part header */
138 J3D_STATE_TPH = 0x0010,
139 /**< the EOC marker has just been read */
140 J3D_STATE_MT = 0x0020,
141 /**< the decoding process must not expect a EOC marker because the codestream is truncated */
142 J3D_STATE_NEOC = 0x0040
148 Arbitrary transformation kernel
150 typedef struct opj_atk {
151 /** index of wavelet kernel */
153 /** Numerical type of scaling factor and lifting step parameters */
155 /** Wavelet filter category */
157 /** Wavelet transformation type (REV/IRR) */
159 /** Initial odd/even subsequence */
161 /** Boundary extension method (constant CON / whole-sample symmetric WS) */
163 /** Scaling factor. Only for wt_typ=IRR */
165 /** Number of lifting steps */
167 /** Offset for lifting step s. Only for filt_cat=ARB */
169 /** Base 2 scaling exponent for lifting step s. Only for wt_typ=REV */
171 /** Additive residue for lifting step s. Only for wt_typ=REV */
173 /** Number of lifting coefficients signaled for lifting step s */
175 /** Lifting coefficient k for lifting step s */
176 double Aatk[256][256];
181 Quantization stepsize
183 typedef struct opj_stepsize {
191 Tile-component coding parameters
193 typedef struct opj_tccp {
196 /** number of resolutions of x, y and z-axis */
197 int numresolution[3];
198 /** code-blocks width height & depth*/
200 /** code-block coding style */
202 /** 0: no ATK (only 9-7 or 5-3) 1: ATK defined WT*/
204 /** Arbitrary transformation kernel (15444-2)*/
206 /** DWT identifier for x, y and z-axis (0:WT9-7 1:WT5-3 >1:WT-atk->index) */
208 /** reversible/irreversible wavelet transfomation (0:irrev 1:reversible)*/
210 /** quantisation style */
212 /** stepsizes used for quantization */
213 opj_stepsize_t stepsizes[J3D_MAXBANDS];
214 /** number of guard bits. Table A28 de 15444-1*/
216 /** Region Of Interest shift */
218 /** precinct width heigth & depth*/
219 int prctsiz[3][J3D_MAXRLVLS];
223 Tile coding parameters : coding/decoding parameters common to all tiles
224 (information like COD, COC in main header)
226 typedef struct opj_tcp {
227 /** 1 : first part-tile of a tile */
231 /** progression order */
233 /** number of layers */
235 /** multi-component transform identifier */
237 /** rates of layers */
239 /** number of progression order changes */
241 /** indicates if a POC marker has been used O:NO, 1:YES */
243 /** progression order changes */
244 opj_poc_t pocs[J3D_MAXRLVLS - 1];
245 /** add fixed_quality */
246 float distoratio[100];
247 /** tile-component coding parameters */
249 /** packet header store there for futur use in t2_decode_packet */
250 unsigned char *ppt_data;
251 /** pointer remaining on the first byte of the first header if ppt is used */
252 unsigned char *ppt_data_first;
253 /** If ppt == 1 --> there was a PPT marker for the present tile */
255 /** used in case of multiple marker PPT (number of info already stored) */
263 typedef struct opj_cp {
264 /** transform format 0: 2DWT, 1: 2D1P, 2: 3DWT, 3: 3RLS */
265 OPJ_TRANSFORM transform_format;
266 /** entropy coding format 0: 2EB, 1: 3EB, 2: 2GR, 3: 3GR, 4: GRI*/
267 OPJ_ENTROPY_CODING encoding_format;
268 /** allocation by rate/distortion */
270 /** allocation by fixed layer */
272 /** add fixed_quality */
274 /** Rsiz: capabilities */
276 /** if != 0, then original dimension divided by 2^(reduce); if == 0 or not used, volume is decoded to the full resolution */
278 /** if != 0, then only the first "layer" layers are decoded; if == 0 or not used, all the quality layers are decoded */
280 /** 0 = no index || 1 = index */
282 /** Big-Endian/Little-endian order */
296 /** comment for coding */
298 /** number of tiles in width, heigth and depth */
302 /** ID number of the tiles present in the codestream */
304 /** size of the vector tileno */
306 /** tile coding parameters */
311 /** packet header store there for futur use in t2_decode_packet */
312 unsigned char *ppm_data;
313 /** pointer remaining on the first byte of the first header if ppm is used */
314 unsigned char *ppm_data_first;
315 /** if ppm == 1 --> there was a PPM marker for the present tile */
317 /** use in case of multiple marker PPM (number of info already store) */
319 /** use in case of multiple marker PPM (case on non-finished previous info) */
325 Information concerning a packet inside tile
327 typedef struct opj_packet_info {
328 /** start position */
332 /** distorsion introduced */
337 Index structure : information regarding tiles inside volume
339 typedef struct opj_tile_info {
340 /** value of thresh for each layer by tile cfr. Marcela */
342 /** number of tile */
344 /** start position */
346 /** end position of the header */
350 /** precinct number for each resolution level (width, heigth and depth) */
351 int prctno[3][J3D_MAXRLVLS];
352 /** precinct size (in power of 2), in X for each resolution level */
353 int prctsiz[3][J3D_MAXRLVLS];
354 /** information concerning packets inside tile */
355 opj_packet_info_t *packet;
357 /** add fixed_quality */
359 /** add fixed_quality */
366 typedef struct opj_volume_info {
368 /** transform format 0: 2DWT, 1: 2D1P, 2: 3DWT, 3: 3RLS */
369 OPJ_TRANSFORM transform_format;
370 /** output file format 0: 2EB, 1: 3EB, 2: 2GR, 3: 3GR, 4: GRI*/
371 OPJ_ENTROPY_CODING encoding_format; /** 0 = no index || 1 = index */
373 /** 0 = wt 9-7 || 1 = wt 5-3 || >=2 wt atk defined */
375 /** maximum distortion reduction on the whole volume (add for Marcela) */
379 /** writing the packet in the index with t2_encode_packets */
381 /** volume width, height and depth */
385 /** progression order */
387 /** tile size in x, y and z */
391 /** tile origin in x, y and z */
395 /** number of tiles in X, Y and Z */
399 /** component numbers */
401 /** number of layer */
403 /** number of decomposition in X, Y and Z*/
404 int decomposition[3];
405 /** DC offset (15444-2) */
407 /** main header position */
409 /** codestream's size */
411 /** information regarding tiles inside volume */
412 opj_tile_info_t *tile;
416 JPEG-2000 codestream reader/writer
418 typedef struct opj_j3d {
420 opj_common_ptr cinfo;
421 /** locate in which part of the codestream the decoder is (main header, tile header, end) */
423 /** number of the tile curently concern by coding/decoding */
425 /** locate the position of the end of the tile in the codestream, used to detect a truncated codestream (in j3d_read_sod) */
427 /** locate the start position of the SOT marker of the current coded tile: */
429 /* after encoding the tile, a jump (in j3d_write_sod) is done to the SOT marker to store the value of its length. */
431 /** as the J3D-file is written in several parts during encoding, it enables to make the right correction in position return by cio_tell */
433 /** array used to store the data of each tile */
434 unsigned char **tile_data;
435 /** array used to store the length of each tile */
438 /** decompression only : store decoding parameters common to all tiles */
439 opj_tcp_t *default_tcp;
440 /** pointer to the encoded / decoded volume */
441 opj_volume_t *volume;
442 /** pointer to the coding parameters */
444 /** helper used to write the index file */
445 opj_volume_info_t *volume_info;
446 /** pointer to the byte i/o stream */
450 /** @name Funciones generales */
452 /* ----------------------------------------------------------------------- */
454 Creates a J3D decompression structure
455 @param cinfo Codec context info
456 @return Returns a handle to a J3D decompressor if successful, returns NULL otherwise
458 opj_j3d_t* j3d_create_decompress(opj_common_ptr cinfo);
460 Destroy a J3D decompressor handle
461 @param j3d J3D decompressor handle to destroy
463 void j3d_destroy_decompress(opj_j3d_t *j3d);
465 Setup the decoder decoding parameters using user parameters.
466 Decoding parameters are returned in j3d->cp.
467 @param j3d J3D decompressor handle
468 @param parameters decompression parameters
470 void j3d_setup_decoder(opj_j3d_t *j3d, opj_dparameters_t *parameters);
472 Decode an volume from a JPEG-2000 codestream
473 @param j3d J3D decompressor handle
474 @param cio Input buffer stream
475 @return Returns a decoded volume if successful, returns NULL otherwise
477 opj_volume_t* j3d_decode(opj_j3d_t *j3d, opj_cio_t *cio);
479 Decode an volume form a JPT-stream (JPEG 2000, JPIP)
480 @param j3d J3D decompressor handle
481 @param cio Input buffer stream
482 @return Returns a decoded volume if successful, returns NULL otherwise
484 opj_volume_t* j3d_decode_jpt_stream(opj_j3d_t *j3d, opj_cio_t *cio);
486 Creates a J3D compression structure
487 @param cinfo Codec context info
488 @return Returns a handle to a J3D compressor if successful, returns NULL otherwise
490 opj_j3d_t* j3d_create_compress(opj_common_ptr cinfo);
492 Destroy a J3D compressor handle
493 @param j3d J3D compressor handle to destroy
495 void j3d_destroy_compress(opj_j3d_t *j3d);
497 Setup the encoder parameters using the current volume and using user parameters.
498 Coding parameters are returned in j3d->cp.
499 @param j3d J3D compressor handle
500 @param parameters compression parameters
501 @param volume input filled volume
503 void j3d_setup_encoder(opj_j3d_t *j3d, opj_cparameters_t *parameters, opj_volume_t *volume);
505 Encode an volume into a JPEG-2000 codestream
506 @param j3d J3D compressor handle
507 @param cio Output buffer stream
508 @param volume Volume to encode
509 @param index Name of the index file if required, NULL otherwise
510 @return Returns true if successful, returns false otherwise
512 bool j3d_encode(opj_j3d_t *j3d, opj_cio_t *cio, opj_volume_t *volume, char *index);
513 /* ----------------------------------------------------------------------- */