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) 2001-2003, David Janssens |
10 | * Copyright (c) 2002-2003, Yannick Verschueren |
11 | * Copyright (c) 2003-2007, Francois-Olivier Devaux |
12 | * Copyright (c) 2003-2014, Antonin Descampe |
13 | * Copyright (c) 2005, Herve Drolon, FreeImage Team |
14 | * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR |
15 | * Copyright (c) 2012, CS Systemes d'Information, France |
16 | * Copyright (c) 2017, IntoPIX SA <support@intopix.com> |
17 | * All rights reserved. |
18 | * |
19 | * Redistribution and use in source and binary forms, with or without |
20 | * modification, are permitted provided that the following conditions |
21 | * are met: |
22 | * 1. Redistributions of source code must retain the above copyright |
23 | * notice, this list of conditions and the following disclaimer. |
24 | * 2. Redistributions in binary form must reproduce the above copyright |
25 | * notice, this list of conditions and the following disclaimer in the |
26 | * documentation and/or other materials provided with the distribution. |
27 | * |
28 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' |
29 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
30 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
31 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
32 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
33 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
34 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
35 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
36 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
37 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
38 | * POSSIBILITY OF SUCH DAMAGE. |
39 | */ |
40 | #ifndef OPJ_TCD_H |
41 | #define OPJ_TCD_H |
42 | /** |
43 | @file tcd.h |
44 | @brief Implementation of a tile coder/decoder (TCD) |
45 | |
46 | The functions in TCD.C encode or decode each tile independently from |
47 | each other. The functions in TCD.C are used by other functions in J2K.C. |
48 | */ |
49 | |
50 | /** @defgroup TCD TCD - Implementation of a tile coder/decoder */ |
51 | /*@{*/ |
52 | |
53 | |
54 | /** |
55 | FIXME DOC |
56 | */ |
57 | typedef struct opj_tcd_pass { |
58 | OPJ_UINT32 rate; |
59 | OPJ_FLOAT64 distortiondec; |
60 | OPJ_UINT32 len; |
61 | OPJ_BITFIELD term : 1; |
62 | } opj_tcd_pass_t; |
63 | |
64 | /** |
65 | FIXME DOC |
66 | */ |
67 | typedef struct opj_tcd_layer { |
68 | OPJ_UINT32 numpasses; /* Number of passes in the layer */ |
69 | OPJ_UINT32 len; /* len of information */ |
70 | OPJ_FLOAT64 disto; /* add for index (Cfr. Marcela) */ |
71 | OPJ_BYTE *data; /* data */ |
72 | } opj_tcd_layer_t; |
73 | |
74 | /** |
75 | FIXME DOC |
76 | */ |
77 | typedef struct opj_tcd_cblk_enc { |
78 | OPJ_BYTE* data; /* Data */ |
79 | opj_tcd_layer_t* layers; /* layer information */ |
80 | opj_tcd_pass_t* passes; /* information about the passes */ |
81 | OPJ_INT32 x0, y0, x1, |
82 | y1; /* dimension of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */ |
83 | OPJ_UINT32 numbps; |
84 | OPJ_UINT32 numlenbits; |
85 | OPJ_UINT32 data_size; /* Size of allocated data buffer */ |
86 | OPJ_UINT32 |
87 | numpasses; /* number of pass already done for the code-blocks */ |
88 | OPJ_UINT32 numpassesinlayers; /* number of passes in the layer */ |
89 | OPJ_UINT32 totalpasses; /* total number of passes */ |
90 | } opj_tcd_cblk_enc_t; |
91 | |
92 | |
93 | /** Chunk of codestream data that is part of a code block */ |
94 | typedef struct opj_tcd_seg_data_chunk { |
95 | /* Point to tilepart buffer. We don't make a copy ! |
96 | So the tilepart buffer must be kept alive |
97 | as long as we need to decode the codeblocks */ |
98 | OPJ_BYTE * data; |
99 | OPJ_UINT32 len; /* Usable length of data */ |
100 | } opj_tcd_seg_data_chunk_t; |
101 | |
102 | /** Segment of a code-block. |
103 | * A segment represent a number of consecutive coding passes, without termination |
104 | * of MQC or RAW between them. */ |
105 | typedef struct opj_tcd_seg { |
106 | OPJ_UINT32 len; /* Size of data related to this segment */ |
107 | /* Number of passes decoded. Including those that we skip */ |
108 | OPJ_UINT32 numpasses; |
109 | /* Number of passes actually to be decoded. To be used for code-block decoding */ |
110 | OPJ_UINT32 real_num_passes; |
111 | /* Maximum number of passes for this segment */ |
112 | OPJ_UINT32 maxpasses; |
113 | /* Number of new passes for current packed. Transitory value */ |
114 | OPJ_UINT32 numnewpasses; |
115 | /* Codestream length for this segment for current packed. Transitory value */ |
116 | OPJ_UINT32 newlen; |
117 | } opj_tcd_seg_t; |
118 | |
119 | /** Code-block for decoding */ |
120 | typedef struct opj_tcd_cblk_dec { |
121 | opj_tcd_seg_t* segs; /* segments information */ |
122 | opj_tcd_seg_data_chunk_t* chunks; /* Array of chunks */ |
123 | /* position of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */ |
124 | OPJ_INT32 x0, y0, x1, y1; |
125 | OPJ_UINT32 numbps; |
126 | /* number of bits for len, for the current packet. Transitory value */ |
127 | OPJ_UINT32 numlenbits; |
128 | /* number of pass added to the code-blocks, for the current packet. Transitory value */ |
129 | OPJ_UINT32 numnewpasses; |
130 | /* number of segments, including those of packet we skip */ |
131 | OPJ_UINT32 numsegs; |
132 | /* number of segments, to be used for code block decoding */ |
133 | OPJ_UINT32 real_num_segs; |
134 | OPJ_UINT32 m_current_max_segs; /* allocated number of segs[] items */ |
135 | OPJ_UINT32 numchunks; /* Number of valid chunks items */ |
136 | OPJ_UINT32 numchunksalloc; /* Number of chunks item allocated */ |
137 | /* Decoded code-block. Only used for subtile decoding. Otherwise tilec->data is directly updated */ |
138 | OPJ_INT32* decoded_data; |
139 | } opj_tcd_cblk_dec_t; |
140 | |
141 | /** Precinct structure */ |
142 | typedef struct opj_tcd_precinct { |
143 | /* dimension of the precinct : left upper corner (x0, y0) right low corner (x1,y1) */ |
144 | OPJ_INT32 x0, y0, x1, y1; |
145 | OPJ_UINT32 cw, ch; /* number of code-blocks, in width and height */ |
146 | union { /* code-blocks information */ |
147 | opj_tcd_cblk_enc_t* enc; |
148 | opj_tcd_cblk_dec_t* dec; |
149 | void* blocks; |
150 | } cblks; |
151 | OPJ_UINT32 block_size; /* size taken by cblks (in bytes) */ |
152 | opj_tgt_tree_t *incltree; /* inclusion tree */ |
153 | opj_tgt_tree_t *imsbtree; /* IMSB tree */ |
154 | } opj_tcd_precinct_t; |
155 | |
156 | /** Sub-band structure */ |
157 | typedef struct opj_tcd_band { |
158 | /* dimension of the subband : left upper corner (x0, y0) right low corner (x1,y1) */ |
159 | OPJ_INT32 x0, y0, x1, y1; |
160 | /* band number: for lowest resolution level (0=LL), otherwise (1=HL, 2=LH, 3=HH) */ |
161 | OPJ_UINT32 bandno; |
162 | /* precinct information */ |
163 | opj_tcd_precinct_t *precincts; |
164 | /* size of data taken by precincts */ |
165 | OPJ_UINT32 precincts_data_size; |
166 | OPJ_INT32 numbps; |
167 | OPJ_FLOAT32 stepsize; |
168 | } opj_tcd_band_t; |
169 | |
170 | /** Tile-component resolution structure */ |
171 | typedef struct opj_tcd_resolution { |
172 | /* dimension of the resolution level : left upper corner (x0, y0) right low corner (x1,y1) */ |
173 | OPJ_INT32 x0, y0, x1, y1; |
174 | /* number of precincts, in width and height, for this resolution level */ |
175 | OPJ_UINT32 pw, ph; |
176 | /* number of sub-bands for the resolution level (1 for lowest resolution level, 3 otherwise) */ |
177 | OPJ_UINT32 numbands; |
178 | /* subband information */ |
179 | opj_tcd_band_t bands[3]; |
180 | |
181 | /* dimension of the resolution limited to window of interest. Only valid if tcd->whole_tile_decoding is set */ |
182 | OPJ_UINT32 win_x0; |
183 | OPJ_UINT32 win_y0; |
184 | OPJ_UINT32 win_x1; |
185 | OPJ_UINT32 win_y1; |
186 | } opj_tcd_resolution_t; |
187 | |
188 | /** Tile-component structure */ |
189 | typedef struct opj_tcd_tilecomp { |
190 | /* dimension of component : left upper corner (x0, y0) right low corner (x1,y1) */ |
191 | OPJ_INT32 x0, y0, x1, y1; |
192 | /* component number */ |
193 | OPJ_UINT32 compno; |
194 | /* number of resolutions level */ |
195 | OPJ_UINT32 numresolutions; |
196 | /* number of resolutions level to decode (at max)*/ |
197 | OPJ_UINT32 minimum_num_resolutions; |
198 | /* resolutions information */ |
199 | opj_tcd_resolution_t *resolutions; |
200 | /* size of data for resolutions (in bytes) */ |
201 | OPJ_UINT32 resolutions_size; |
202 | |
203 | /* data of the component. For decoding, only valid if tcd->whole_tile_decoding is set (so exclusive of data_win member) */ |
204 | OPJ_INT32 *data; |
205 | /* if true, then need to free after usage, otherwise do not free */ |
206 | OPJ_BOOL ownsData; |
207 | /* we may either need to allocate this amount of data, or re-use image data and ignore this value */ |
208 | size_t data_size_needed; |
209 | /* size of the data of the component */ |
210 | size_t data_size; |
211 | |
212 | /** data of the component limited to window of interest. Only valid for decoding and if tcd->whole_tile_decoding is NOT set (so exclusive of data member) */ |
213 | OPJ_INT32 *data_win; |
214 | /* dimension of the component limited to window of interest. Only valid for decoding and if tcd->whole_tile_decoding is NOT set */ |
215 | OPJ_UINT32 win_x0; |
216 | OPJ_UINT32 win_y0; |
217 | OPJ_UINT32 win_x1; |
218 | OPJ_UINT32 win_y1; |
219 | |
220 | /* add fixed_quality */ |
221 | OPJ_INT32 numpix; |
222 | } opj_tcd_tilecomp_t; |
223 | |
224 | |
225 | /** |
226 | FIXME DOC |
227 | */ |
228 | typedef struct opj_tcd_tile { |
229 | /* dimension of the tile : left upper corner (x0, y0) right low corner (x1,y1) */ |
230 | OPJ_INT32 x0, y0, x1, y1; |
231 | OPJ_UINT32 numcomps; /* number of components in tile */ |
232 | opj_tcd_tilecomp_t *comps; /* Components information */ |
233 | OPJ_INT32 numpix; /* add fixed_quality */ |
234 | OPJ_FLOAT64 distotile; /* add fixed_quality */ |
235 | OPJ_FLOAT64 distolayer[100]; /* add fixed_quality */ |
236 | OPJ_UINT32 packno; /* packet number */ |
237 | } opj_tcd_tile_t; |
238 | |
239 | /** |
240 | FIXME DOC |
241 | */ |
242 | typedef struct opj_tcd_image { |
243 | opj_tcd_tile_t *tiles; /* Tiles information */ |
244 | } |
245 | opj_tcd_image_t; |
246 | |
247 | |
248 | /** |
249 | Tile coder/decoder |
250 | */ |
251 | typedef struct opj_tcd { |
252 | /** Position of the tilepart flag in Progression order*/ |
253 | OPJ_INT32 tp_pos; |
254 | /** Tile part number*/ |
255 | OPJ_UINT32 tp_num; |
256 | /** Current tile part number*/ |
257 | OPJ_UINT32 cur_tp_num; |
258 | /** Total number of tileparts of the current tile*/ |
259 | OPJ_UINT32 cur_totnum_tp; |
260 | /** Current Packet iterator number */ |
261 | OPJ_UINT32 cur_pino; |
262 | /** info on each image tile */ |
263 | opj_tcd_image_t *tcd_image; |
264 | /** image header */ |
265 | opj_image_t *image; |
266 | /** coding parameters */ |
267 | opj_cp_t *cp; |
268 | /** coding/decoding parameters common to all tiles */ |
269 | opj_tcp_t *tcp; |
270 | /** current encoded/decoded tile */ |
271 | OPJ_UINT32 tcd_tileno; |
272 | /** tell if the tcd is a decoder. */ |
273 | OPJ_BITFIELD m_is_decoder : 1; |
274 | /** Thread pool */ |
275 | opj_thread_pool_t* thread_pool; |
276 | /** Coordinates of the window of interest, in grid reference space */ |
277 | OPJ_UINT32 win_x0; |
278 | OPJ_UINT32 win_y0; |
279 | OPJ_UINT32 win_x1; |
280 | OPJ_UINT32 win_y1; |
281 | /** Only valid for decoding. Whether the whole tile is decoded, or just the region in win_x0/win_y0/win_x1/win_y1 */ |
282 | OPJ_BOOL whole_tile_decoding; |
283 | /* Array of size image->numcomps indicating if a component must be decoded. NULL if all components must be decoded */ |
284 | OPJ_BOOL* used_component; |
285 | } opj_tcd_t; |
286 | |
287 | /** @name Exported functions */ |
288 | /*@{*/ |
289 | /* ----------------------------------------------------------------------- */ |
290 | |
291 | /** |
292 | Dump the content of a tcd structure |
293 | */ |
294 | /*void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t *img);*/ /* TODO MSD shoul use the new v2 structures */ |
295 | |
296 | /** |
297 | Create a new TCD handle |
298 | @param p_is_decoder FIXME DOC |
299 | @return Returns a new TCD handle if successful returns NULL otherwise |
300 | */ |
301 | opj_tcd_t* opj_tcd_create(OPJ_BOOL p_is_decoder); |
302 | |
303 | /** |
304 | Destroy a previously created TCD handle |
305 | @param tcd TCD handle to destroy |
306 | */ |
307 | void opj_tcd_destroy(opj_tcd_t *tcd); |
308 | |
309 | /** |
310 | * Initialize the tile coder and may reuse some memory. |
311 | * @param p_tcd TCD handle. |
312 | * @param p_image raw image. |
313 | * @param p_cp coding parameters. |
314 | * @param p_tp thread pool |
315 | * |
316 | * @return true if the encoding values could be set (false otherwise). |
317 | */ |
318 | OPJ_BOOL opj_tcd_init(opj_tcd_t *p_tcd, |
319 | opj_image_t * p_image, |
320 | opj_cp_t * p_cp, |
321 | opj_thread_pool_t* p_tp); |
322 | |
323 | /** |
324 | * Allocates memory for decoding a specific tile. |
325 | * |
326 | * @param p_tcd the tile decoder. |
327 | * @param p_tile_no the index of the tile received in sequence. This not necessarily lead to the |
328 | * tile at index p_tile_no. |
329 | * @param p_manager the event manager. |
330 | * |
331 | * @return true if the remaining data is sufficient. |
332 | */ |
333 | OPJ_BOOL opj_tcd_init_decode_tile(opj_tcd_t *p_tcd, OPJ_UINT32 p_tile_no, |
334 | opj_event_mgr_t* p_manager); |
335 | |
336 | void opj_tcd_makelayer_fixed(opj_tcd_t *tcd, OPJ_UINT32 layno, |
337 | OPJ_UINT32 final); |
338 | |
339 | void opj_tcd_rateallocate_fixed(opj_tcd_t *tcd); |
340 | |
341 | void opj_tcd_makelayer(opj_tcd_t *tcd, |
342 | OPJ_UINT32 layno, |
343 | OPJ_FLOAT64 thresh, |
344 | OPJ_UINT32 final); |
345 | |
346 | OPJ_BOOL opj_tcd_rateallocate(opj_tcd_t *tcd, |
347 | OPJ_BYTE *dest, |
348 | OPJ_UINT32 * p_data_written, |
349 | OPJ_UINT32 len, |
350 | opj_codestream_info_t *cstr_info, |
351 | opj_event_mgr_t *p_manager); |
352 | |
353 | /** |
354 | * Gets the maximum tile size that will be taken by the tile once decoded. |
355 | */ |
356 | OPJ_UINT32 opj_tcd_get_decoded_tile_size(opj_tcd_t *p_tcd, |
357 | OPJ_BOOL take_into_account_partial_decoding); |
358 | |
359 | /** |
360 | * Encodes a tile from the raw image into the given buffer. |
361 | * @param p_tcd Tile Coder handle |
362 | * @param p_tile_no Index of the tile to encode. |
363 | * @param p_dest Destination buffer |
364 | * @param p_data_written pointer to an int that is incremented by the number of bytes really written on p_dest |
365 | * @param p_len Maximum length of the destination buffer |
366 | * @param p_cstr_info Codestream information structure |
367 | * @param p_manager the user event manager |
368 | * @return true if the coding is successful. |
369 | */ |
370 | OPJ_BOOL opj_tcd_encode_tile(opj_tcd_t *p_tcd, |
371 | OPJ_UINT32 p_tile_no, |
372 | OPJ_BYTE *p_dest, |
373 | OPJ_UINT32 * p_data_written, |
374 | OPJ_UINT32 p_len, |
375 | struct opj_codestream_info *p_cstr_info, |
376 | opj_event_mgr_t *p_manager); |
377 | |
378 | |
379 | /** |
380 | Decode a tile from a buffer into a raw image |
381 | @param tcd TCD handle |
382 | @param win_x0 Upper left x of region to decode (in grid coordinates) |
383 | @param win_y0 Upper left y of region to decode (in grid coordinates) |
384 | @param win_x1 Lower right x of region to decode (in grid coordinates) |
385 | @param win_y1 Lower right y of region to decode (in grid coordinates) |
386 | @param numcomps_to_decode Size of the comps_indices array, or 0 if decoding all components. |
387 | @param comps_indices Array of numcomps values representing the indices |
388 | of the components to decode (relative to the |
389 | codestream, starting at 0). Or NULL if decoding all components. |
390 | @param src Source buffer |
391 | @param len Length of source buffer |
392 | @param tileno Number that identifies one of the tiles to be decoded |
393 | @param cstr_info FIXME DOC |
394 | @param manager the event manager. |
395 | */ |
396 | OPJ_BOOL opj_tcd_decode_tile(opj_tcd_t *tcd, |
397 | OPJ_UINT32 win_x0, |
398 | OPJ_UINT32 win_y0, |
399 | OPJ_UINT32 win_x1, |
400 | OPJ_UINT32 win_y1, |
401 | OPJ_UINT32 numcomps_to_decode, |
402 | const OPJ_UINT32 *comps_indices, |
403 | OPJ_BYTE *src, |
404 | OPJ_UINT32 len, |
405 | OPJ_UINT32 tileno, |
406 | opj_codestream_index_t *cstr_info, |
407 | opj_event_mgr_t *manager); |
408 | |
409 | |
410 | /** |
411 | * Copies tile data from the system onto the given memory block. |
412 | */ |
413 | OPJ_BOOL opj_tcd_update_tile_data(opj_tcd_t *p_tcd, |
414 | OPJ_BYTE * p_dest, |
415 | OPJ_UINT32 p_dest_length); |
416 | |
417 | /** |
418 | * |
419 | */ |
420 | OPJ_SIZE_T opj_tcd_get_encoded_tile_size(opj_tcd_t *p_tcd); |
421 | |
422 | /** |
423 | * Initialize the tile coder and may reuse some meory. |
424 | * |
425 | * @param p_tcd TCD handle. |
426 | * @param p_tile_no current tile index to encode. |
427 | * @param p_manager the event manager. |
428 | * |
429 | * @return true if the encoding values could be set (false otherwise). |
430 | */ |
431 | OPJ_BOOL opj_tcd_init_encode_tile(opj_tcd_t *p_tcd, |
432 | OPJ_UINT32 p_tile_no, opj_event_mgr_t* p_manager); |
433 | |
434 | /** |
435 | * Copies tile data from the given memory block onto the system. |
436 | */ |
437 | OPJ_BOOL opj_tcd_copy_tile_data(opj_tcd_t *p_tcd, |
438 | OPJ_BYTE * p_src, |
439 | OPJ_SIZE_T p_src_length); |
440 | |
441 | /** |
442 | * Allocates tile component data |
443 | * |
444 | * |
445 | */ |
446 | OPJ_BOOL opj_alloc_tile_component_data(opj_tcd_tilecomp_t *l_tilec); |
447 | |
448 | /** Returns whether a sub-band is empty (i.e. whether it has a null area) |
449 | * @param band Sub-band handle. |
450 | * @return OPJ_TRUE whether the sub-band is empty. |
451 | */ |
452 | OPJ_BOOL opj_tcd_is_band_empty(opj_tcd_band_t* band); |
453 | |
454 | /** Reinitialize a segment */ |
455 | void opj_tcd_reinit_segment(opj_tcd_seg_t* seg); |
456 | |
457 | |
458 | /** Returns whether a sub-band region contributes to the area of interest |
459 | * tcd->win_x0,tcd->win_y0,tcd->win_x1,tcd->win_y1. |
460 | * |
461 | * @param tcd TCD handle. |
462 | * @param compno Component number |
463 | * @param resno Resolution number |
464 | * @param bandno Band number (*not* band index, ie 0, 1, 2 or 3) |
465 | * @param x0 Upper left x in subband coordinates |
466 | * @param y0 Upper left y in subband coordinates |
467 | * @param x1 Lower right x in subband coordinates |
468 | * @param y1 Lower right y in subband coordinates |
469 | * @return OPJ_TRUE whether the sub-band region contributs to the area of |
470 | * interest. |
471 | */ |
472 | OPJ_BOOL opj_tcd_is_subband_area_of_interest(opj_tcd_t *tcd, |
473 | OPJ_UINT32 compno, |
474 | OPJ_UINT32 resno, |
475 | OPJ_UINT32 bandno, |
476 | OPJ_UINT32 x0, |
477 | OPJ_UINT32 y0, |
478 | OPJ_UINT32 x1, |
479 | OPJ_UINT32 y1); |
480 | |
481 | /* ----------------------------------------------------------------------- */ |
482 | /*@}*/ |
483 | |
484 | /*@}*/ |
485 | |
486 | #endif /* OPJ_TCD_H */ |
487 | |