1 | /* |
2 | * The copyright in this software is being made available under the 2-clauses |
3 | * BSD License, included below. This software may be subject to other third |
4 | * party and contributor rights, including patent rights, and no such rights |
5 | * are granted under this license. |
6 | * |
7 | * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium |
8 | * Copyright (c) 2002-2014, Professor Benoit Macq |
9 | * Copyright (c) 2002-2003, Yannick Verschueren |
10 | * Copyright (c) 2005, Herve Drolon, FreeImage Team |
11 | * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR |
12 | * Copyright (c) 2012, CS Systemes d'Information, France |
13 | * All rights reserved. |
14 | * |
15 | * Redistribution and use in source and binary forms, with or without |
16 | * modification, are permitted provided that the following conditions |
17 | * are met: |
18 | * 1. Redistributions of source code must retain the above copyright |
19 | * notice, this list of conditions and the following disclaimer. |
20 | * 2. Redistributions in binary form must reproduce the above copyright |
21 | * notice, this list of conditions and the following disclaimer in the |
22 | * documentation and/or other materials provided with the distribution. |
23 | * |
24 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' |
25 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
26 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
27 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
28 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
29 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
30 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
31 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
32 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
33 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
34 | * POSSIBILITY OF SUCH DAMAGE. |
35 | */ |
36 | #ifndef OPJ_JP2_H |
37 | #define OPJ_JP2_H |
38 | /** |
39 | @file jp2.h |
40 | @brief The JPEG-2000 file format Reader/Writer (JP2) |
41 | |
42 | */ |
43 | |
44 | /** @defgroup JP2 JP2 - JPEG-2000 file format reader/writer */ |
45 | /*@{*/ |
46 | |
47 | /*#define JPIP_JPIP 0x6a706970*/ |
48 | |
49 | #define JP2_JP 0x6a502020 /**< JPEG 2000 signature box */ |
50 | #define JP2_FTYP 0x66747970 /**< File type box */ |
51 | #define JP2_JP2H 0x6a703268 /**< JP2 header box (super-box) */ |
52 | #define JP2_IHDR 0x69686472 /**< Image header box */ |
53 | #define JP2_COLR 0x636f6c72 /**< Colour specification box */ |
54 | #define JP2_JP2C 0x6a703263 /**< Contiguous codestream box */ |
55 | #define JP2_URL 0x75726c20 /**< Data entry URL box */ |
56 | #define JP2_PCLR 0x70636c72 /**< Palette box */ |
57 | #define JP2_CMAP 0x636d6170 /**< Component Mapping box */ |
58 | #define JP2_CDEF 0x63646566 /**< Channel Definition box */ |
59 | #define JP2_DTBL 0x6474626c /**< Data Reference box */ |
60 | #define JP2_BPCC 0x62706363 /**< Bits per component box */ |
61 | #define JP2_JP2 0x6a703220 /**< File type fields */ |
62 | |
63 | /* For the future */ |
64 | /* #define JP2_RES 0x72657320 */ /**< Resolution box (super-box) */ |
65 | /* #define JP2_JP2I 0x6a703269 */ /**< Intellectual property box */ |
66 | /* #define JP2_XML 0x786d6c20 */ /**< XML box */ |
67 | /* #define JP2_UUID 0x75756994 */ /**< UUID box */ |
68 | /* #define JP2_UINF 0x75696e66 */ /**< UUID info box (super-box) */ |
69 | /* #define JP2_ULST 0x756c7374 */ /**< UUID list box */ |
70 | |
71 | /* ----------------------------------------------------------------------- */ |
72 | |
73 | typedef enum { |
74 | JP2_STATE_NONE = 0x0, |
75 | JP2_STATE_SIGNATURE = 0x1, |
76 | JP2_STATE_FILE_TYPE = 0x2, |
77 | = 0x4, |
78 | JP2_STATE_CODESTREAM = 0x8, |
79 | JP2_STATE_END_CODESTREAM = 0x10, |
80 | JP2_STATE_UNKNOWN = 0x7fffffff /* ISO C restricts enumerator values to range of 'int' */ |
81 | } |
82 | JP2_STATE; |
83 | |
84 | typedef enum { |
85 | JP2_IMG_STATE_NONE = 0x0, |
86 | JP2_IMG_STATE_UNKNOWN = 0x7fffffff |
87 | } |
88 | JP2_IMG_STATE; |
89 | |
90 | /** |
91 | Channel description: channel index, type, association |
92 | */ |
93 | typedef struct opj_jp2_cdef_info { |
94 | OPJ_UINT16 cn, typ, asoc; |
95 | } opj_jp2_cdef_info_t; |
96 | |
97 | /** |
98 | Channel descriptions and number of descriptions |
99 | */ |
100 | typedef struct opj_jp2_cdef { |
101 | opj_jp2_cdef_info_t *info; |
102 | OPJ_UINT16 n; |
103 | } opj_jp2_cdef_t; |
104 | |
105 | /** |
106 | Component mappings: channel index, mapping type, palette index |
107 | */ |
108 | typedef struct opj_jp2_cmap_comp { |
109 | OPJ_UINT16 cmp; |
110 | OPJ_BYTE mtyp, pcol; |
111 | } opj_jp2_cmap_comp_t; |
112 | |
113 | /** |
114 | Palette data: table entries, palette columns |
115 | */ |
116 | typedef struct opj_jp2_pclr { |
117 | OPJ_UINT32 *entries; |
118 | OPJ_BYTE *channel_sign; |
119 | OPJ_BYTE *channel_size; |
120 | opj_jp2_cmap_comp_t *cmap; |
121 | OPJ_UINT16 nr_entries; |
122 | OPJ_BYTE nr_channels; |
123 | } opj_jp2_pclr_t; |
124 | |
125 | /** |
126 | Collector for ICC profile, palette, component mapping, channel description |
127 | */ |
128 | typedef struct opj_jp2_color { |
129 | OPJ_BYTE *icc_profile_buf; |
130 | OPJ_UINT32 icc_profile_len; |
131 | |
132 | opj_jp2_cdef_t *jp2_cdef; |
133 | opj_jp2_pclr_t *jp2_pclr; |
134 | OPJ_BYTE jp2_has_colr; |
135 | } opj_jp2_color_t; |
136 | |
137 | /** |
138 | JP2 component |
139 | */ |
140 | typedef struct opj_jp2_comps { |
141 | OPJ_UINT32 depth; |
142 | OPJ_UINT32 sgnd; |
143 | OPJ_UINT32 bpcc; |
144 | } opj_jp2_comps_t; |
145 | |
146 | /** |
147 | JPEG-2000 file format reader/writer |
148 | */ |
149 | typedef struct opj_jp2 { |
150 | /** handle to the J2K codec */ |
151 | opj_j2k_t *j2k; |
152 | /** list of validation procedures */ |
153 | struct opj_procedure_list * m_validation_list; |
154 | /** list of execution procedures */ |
155 | struct opj_procedure_list * m_procedure_list; |
156 | |
157 | /* width of image */ |
158 | OPJ_UINT32 w; |
159 | /* height of image */ |
160 | OPJ_UINT32 h; |
161 | /* number of components in the image */ |
162 | OPJ_UINT32 numcomps; |
163 | OPJ_UINT32 bpc; |
164 | OPJ_UINT32 C; |
165 | OPJ_UINT32 UnkC; |
166 | OPJ_UINT32 IPR; |
167 | OPJ_UINT32 meth; |
168 | OPJ_UINT32 approx; |
169 | OPJ_UINT32 enumcs; |
170 | OPJ_UINT32 precedence; |
171 | OPJ_UINT32 brand; |
172 | OPJ_UINT32 minversion; |
173 | OPJ_UINT32 numcl; |
174 | OPJ_UINT32 *cl; |
175 | opj_jp2_comps_t *comps; |
176 | /* FIXME: The following two variables are used to save offset |
177 | as we write out a JP2 file to disk. This mechanism is not flexible |
178 | as codec writers will need to extand those fields as new part |
179 | of the standard are implemented. |
180 | */ |
181 | OPJ_OFF_T j2k_codestream_offset; |
182 | OPJ_OFF_T jpip_iptr_offset; |
183 | OPJ_BOOL jpip_on; |
184 | OPJ_UINT32 jp2_state; |
185 | OPJ_UINT32 jp2_img_state; |
186 | |
187 | opj_jp2_color_t color; |
188 | |
189 | OPJ_BOOL ignore_pclr_cmap_cdef; |
190 | OPJ_BYTE has_jp2h; |
191 | OPJ_BYTE has_ihdr; |
192 | } |
193 | opj_jp2_t; |
194 | |
195 | /** |
196 | JP2 Box |
197 | */ |
198 | typedef struct opj_jp2_box { |
199 | OPJ_UINT32 length; |
200 | OPJ_UINT32 type; |
201 | OPJ_INT32 init_pos; |
202 | } opj_jp2_box_t; |
203 | |
204 | typedef struct opj_jp2_header_handler { |
205 | /* marker value */ |
206 | OPJ_UINT32 id; |
207 | /* action linked to the marker */ |
208 | OPJ_BOOL(*handler)(opj_jp2_t *jp2, |
209 | OPJ_BYTE *, |
210 | OPJ_UINT32 , |
211 | opj_event_mgr_t * p_manager); |
212 | } |
213 | opj_jp2_header_handler_t; |
214 | |
215 | |
216 | typedef struct opj_jp2_img_header_writer_handler { |
217 | /* action to perform */ |
218 | OPJ_BYTE* (*handler)(opj_jp2_t *jp2, OPJ_UINT32 * p_data_size); |
219 | /* result of the action : data */ |
220 | OPJ_BYTE* m_data; |
221 | /* size of data */ |
222 | OPJ_UINT32 m_size; |
223 | } |
224 | opj_jp2_img_header_writer_handler_t; |
225 | |
226 | /** @name Exported functions */ |
227 | /*@{*/ |
228 | /* ----------------------------------------------------------------------- */ |
229 | |
230 | /** |
231 | Setup the decoder decoding parameters using user parameters. |
232 | Decoding parameters are returned in jp2->j2k->cp. |
233 | @param jp2 JP2 decompressor handle |
234 | @param parameters decompression parameters |
235 | */ |
236 | void opj_jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters); |
237 | |
238 | /** Allocates worker threads for the compressor/decompressor. |
239 | * |
240 | * @param jp2 JP2 decompressor handle |
241 | * @param num_threads Number of threads. |
242 | * @return OPJ_TRUE in case of success. |
243 | */ |
244 | OPJ_BOOL opj_jp2_set_threads(opj_jp2_t *jp2, OPJ_UINT32 num_threads); |
245 | |
246 | /** |
247 | * Decode an image from a JPEG-2000 file stream |
248 | * @param jp2 JP2 decompressor handle |
249 | * @param p_stream FIXME DOC |
250 | * @param p_image FIXME DOC |
251 | * @param p_manager FIXME DOC |
252 | * |
253 | * @return Returns a decoded image if successful, returns NULL otherwise |
254 | */ |
255 | OPJ_BOOL opj_jp2_decode(opj_jp2_t *jp2, |
256 | opj_stream_private_t *p_stream, |
257 | opj_image_t* p_image, |
258 | opj_event_mgr_t * p_manager); |
259 | |
260 | /** |
261 | * Setup the encoder parameters using the current image and using user parameters. |
262 | * Coding parameters are returned in jp2->j2k->cp. |
263 | * |
264 | * @param jp2 JP2 compressor handle |
265 | * @param parameters compression parameters |
266 | * @param image input filled image |
267 | * @param p_manager FIXME DOC |
268 | * @return OPJ_TRUE if successful, OPJ_FALSE otherwise |
269 | */ |
270 | OPJ_BOOL opj_jp2_setup_encoder(opj_jp2_t *jp2, |
271 | opj_cparameters_t *parameters, |
272 | opj_image_t *image, |
273 | opj_event_mgr_t * p_manager); |
274 | |
275 | /** |
276 | Encode an image into a JPEG-2000 file stream |
277 | @param jp2 JP2 compressor handle |
278 | @param stream Output buffer stream |
279 | @param p_manager event manager |
280 | @return Returns true if successful, returns false otherwise |
281 | */ |
282 | OPJ_BOOL opj_jp2_encode(opj_jp2_t *jp2, |
283 | opj_stream_private_t *stream, |
284 | opj_event_mgr_t * p_manager); |
285 | |
286 | |
287 | /** |
288 | * Starts a compression scheme, i.e. validates the codec parameters, writes the header. |
289 | * |
290 | * @param jp2 the jpeg2000 file codec. |
291 | * @param stream the stream object. |
292 | * @param p_image FIXME DOC |
293 | * @param p_manager FIXME DOC |
294 | * |
295 | * @return true if the codec is valid. |
296 | */ |
297 | OPJ_BOOL opj_jp2_start_compress(opj_jp2_t *jp2, |
298 | opj_stream_private_t *stream, |
299 | opj_image_t * p_image, |
300 | opj_event_mgr_t * p_manager); |
301 | |
302 | |
303 | /** |
304 | * Ends the compression procedures and possibiliy add data to be read after the |
305 | * codestream. |
306 | */ |
307 | OPJ_BOOL opj_jp2_end_compress(opj_jp2_t *jp2, |
308 | opj_stream_private_t *cio, |
309 | opj_event_mgr_t * p_manager); |
310 | |
311 | /* ----------------------------------------------------------------------- */ |
312 | |
313 | /** |
314 | * Ends the decompression procedures and possibiliy add data to be read after the |
315 | * codestream. |
316 | */ |
317 | OPJ_BOOL opj_jp2_end_decompress(opj_jp2_t *jp2, |
318 | opj_stream_private_t *cio, |
319 | opj_event_mgr_t * p_manager); |
320 | |
321 | /** |
322 | * Reads a jpeg2000 file header structure. |
323 | * |
324 | * @param p_stream the stream to read data from. |
325 | * @param jp2 the jpeg2000 file header structure. |
326 | * @param p_image FIXME DOC |
327 | * @param p_manager the user event manager. |
328 | * |
329 | * @return true if the box is valid. |
330 | */ |
331 | OPJ_BOOL (opj_stream_private_t *p_stream, |
332 | opj_jp2_t *jp2, |
333 | opj_image_t ** p_image, |
334 | opj_event_mgr_t * p_manager); |
335 | |
336 | /** Sets the indices of the components to decode. |
337 | * |
338 | * @param jp2 JP2 decompressor handle |
339 | * @param numcomps Number of components to decode. |
340 | * @param comps_indices Array of num_compts indices (numbering starting at 0) |
341 | * corresponding to the components to decode. |
342 | * @param p_manager Event manager; |
343 | * |
344 | * @return OPJ_TRUE in case of success. |
345 | */ |
346 | OPJ_BOOL opj_jp2_set_decoded_components(opj_jp2_t *jp2, |
347 | OPJ_UINT32 numcomps, |
348 | const OPJ_UINT32* comps_indices, |
349 | opj_event_mgr_t * p_manager); |
350 | |
351 | /** |
352 | * Reads a tile header. |
353 | * @param p_jp2 the jpeg2000 codec. |
354 | * @param p_tile_index FIXME DOC |
355 | * @param p_data_size FIXME DOC |
356 | * @param p_tile_x0 FIXME DOC |
357 | * @param p_tile_y0 FIXME DOC |
358 | * @param p_tile_x1 FIXME DOC |
359 | * @param p_tile_y1 FIXME DOC |
360 | * @param p_nb_comps FIXME DOC |
361 | * @param p_go_on FIXME DOC |
362 | * @param p_stream the stream to write data to. |
363 | * @param p_manager the user event manager. |
364 | */ |
365 | OPJ_BOOL (opj_jp2_t * p_jp2, |
366 | OPJ_UINT32 * p_tile_index, |
367 | OPJ_UINT32 * p_data_size, |
368 | OPJ_INT32 * p_tile_x0, |
369 | OPJ_INT32 * p_tile_y0, |
370 | OPJ_INT32 * p_tile_x1, |
371 | OPJ_INT32 * p_tile_y1, |
372 | OPJ_UINT32 * p_nb_comps, |
373 | OPJ_BOOL * p_go_on, |
374 | opj_stream_private_t *p_stream, |
375 | opj_event_mgr_t * p_manager); |
376 | |
377 | /** |
378 | * Writes a tile. |
379 | * |
380 | * @param p_jp2 the jpeg2000 codec. |
381 | * @param p_tile_index FIXME DOC |
382 | * @param p_data FIXME DOC |
383 | * @param p_data_size FIXME DOC |
384 | * @param p_stream the stream to write data to. |
385 | * @param p_manager the user event manager. |
386 | */ |
387 | OPJ_BOOL opj_jp2_write_tile(opj_jp2_t *p_jp2, |
388 | OPJ_UINT32 p_tile_index, |
389 | OPJ_BYTE * p_data, |
390 | OPJ_UINT32 p_data_size, |
391 | opj_stream_private_t *p_stream, |
392 | opj_event_mgr_t * p_manager); |
393 | |
394 | /** |
395 | * Decode tile data. |
396 | * @param p_jp2 the jpeg2000 codec. |
397 | * @param p_tile_index FIXME DOC |
398 | * @param p_data FIXME DOC |
399 | * @param p_data_size FIXME DOC |
400 | * @param p_stream the stream to write data to. |
401 | * @param p_manager the user event manager. |
402 | * |
403 | * @return FIXME DOC |
404 | */ |
405 | OPJ_BOOL opj_jp2_decode_tile(opj_jp2_t * p_jp2, |
406 | OPJ_UINT32 p_tile_index, |
407 | OPJ_BYTE * p_data, |
408 | OPJ_UINT32 p_data_size, |
409 | opj_stream_private_t *p_stream, |
410 | opj_event_mgr_t * p_manager); |
411 | |
412 | /** |
413 | * Creates a jpeg2000 file decompressor. |
414 | * |
415 | * @return an empty jpeg2000 file codec. |
416 | */ |
417 | opj_jp2_t* opj_jp2_create(OPJ_BOOL p_is_decoder); |
418 | |
419 | /** |
420 | Destroy a JP2 decompressor handle |
421 | @param jp2 JP2 decompressor handle to destroy |
422 | */ |
423 | void opj_jp2_destroy(opj_jp2_t *jp2); |
424 | |
425 | |
426 | /** |
427 | * Sets the given area to be decoded. This function should be called right after opj_read_header and before any tile header reading. |
428 | * |
429 | * @param p_jp2 the jpeg2000 codec. |
430 | * @param p_image FIXME DOC |
431 | * @param p_start_x the left position of the rectangle to decode (in image coordinates). |
432 | * @param p_start_y the up position of the rectangle to decode (in image coordinates). |
433 | * @param p_end_x the right position of the rectangle to decode (in image coordinates). |
434 | * @param p_end_y the bottom position of the rectangle to decode (in image coordinates). |
435 | * @param p_manager the user event manager |
436 | * |
437 | * @return true if the area could be set. |
438 | */ |
439 | OPJ_BOOL opj_jp2_set_decode_area(opj_jp2_t *p_jp2, |
440 | opj_image_t* p_image, |
441 | OPJ_INT32 p_start_x, OPJ_INT32 p_start_y, |
442 | OPJ_INT32 p_end_x, OPJ_INT32 p_end_y, |
443 | opj_event_mgr_t * p_manager); |
444 | |
445 | /** |
446 | * |
447 | */ |
448 | OPJ_BOOL opj_jp2_get_tile(opj_jp2_t *p_jp2, |
449 | opj_stream_private_t *p_stream, |
450 | opj_image_t* p_image, |
451 | opj_event_mgr_t * p_manager, |
452 | OPJ_UINT32 tile_index); |
453 | |
454 | |
455 | /** |
456 | * |
457 | */ |
458 | OPJ_BOOL opj_jp2_set_decoded_resolution_factor(opj_jp2_t *p_jp2, |
459 | OPJ_UINT32 res_factor, |
460 | opj_event_mgr_t * p_manager); |
461 | |
462 | |
463 | /* TODO MSD: clean these 3 functions */ |
464 | /** |
465 | * Dump some elements from the JP2 decompression structure . |
466 | * |
467 | *@param p_jp2 the jp2 codec. |
468 | *@param flag flag to describe what elements are dump. |
469 | *@param out_stream output stream where dump the elements. |
470 | * |
471 | */ |
472 | void jp2_dump(opj_jp2_t* p_jp2, OPJ_INT32 flag, FILE* out_stream); |
473 | |
474 | /** |
475 | * Get the codestream info from a JPEG2000 codec. |
476 | * |
477 | *@param p_jp2 jp2 codec. |
478 | * |
479 | *@return the codestream information extract from the jpg2000 codec |
480 | */ |
481 | opj_codestream_info_v2_t* jp2_get_cstr_info(opj_jp2_t* p_jp2); |
482 | |
483 | /** |
484 | * Get the codestream index from a JPEG2000 codec. |
485 | * |
486 | *@param p_jp2 jp2 codec. |
487 | * |
488 | *@return the codestream index extract from the jpg2000 codec |
489 | */ |
490 | opj_codestream_index_t* jp2_get_cstr_index(opj_jp2_t* p_jp2); |
491 | |
492 | |
493 | /*@}*/ |
494 | |
495 | /*@}*/ |
496 | |
497 | #endif /* OPJ_JP2_H */ |
498 | |
499 | |