2 * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
3 * Copyright (c) 2002-2007, Professor Benoit Macq
4 * Copyright (c) 2001-2003, David Janssens
5 * Copyright (c) 2002-2003, Yannick Verschueren
6 * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
7 * Copyright (c) 2005, Herve Drolon, FreeImage Team
8 * Copyright (c) 2006-2007, Parvatha Elangovan
9 * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>
10 * All rights reserved.
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions
15 * 1. Redistributions of source code must retain the above copyright
16 * notice, this list of conditions and the following disclaimer.
17 * 2. Redistributions in binary form must reproduce the above copyright
18 * notice, this list of conditions and the following disclaimer in the
19 * documentation and/or other materials provided with the distribution.
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
25 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 * POSSIBILITY OF SUCH DAMAGE.
35 #include "opj_malloc.h"
36 #include "opj_includes.h"
42 #include "function_list.h"
48 /** @defgroup J2K J2K - JPEG-2000 codestream reader/writer */
52 /***************************************************************************
53 ********************** TYPEDEFS *******************************************
54 ***************************************************************************/
56 * Correspondance prog order <-> string representation
58 typedef struct j2k_prog_order
60 OPJ_PROG_ORDER enum_prog;
65 typedef struct opj_dec_memory_marker_handler
69 /** value of the state when the marker can appear */
71 /** action linked to the marker */
74 OPJ_BYTE * p_header_data,
75 OPJ_UINT32 p_header_size,
76 struct opj_event_mgr * p_manager
79 opj_dec_memory_marker_handler_t;
83 /** @name Local static functions */
86 * Writes a SPCod or SPCoc element, i.e. the coding style of a given component of a tile.
88 * @param p_comp_no the component number to output.
89 * @param p_stream the stream to write data to.
90 * @param p_j2k J2K codec.
91 * @param p_manager the user event manager.
94 static bool j2k_write_SPCod_SPCoc(
99 OPJ_UINT32 * p_header_size,
100 struct opj_event_mgr * p_manager
104 * Reads a SPCod or SPCoc element, i.e. the coding style of a given component of a tile.
105 * @param p_header_data the data contained in the COM box.
106 * @param p_j2k the jpeg2000 codec.
107 * @param p_header_size the size of the data contained in the COM marker.
108 * @param p_manager the user event manager.
110 static bool j2k_read_SPCod_SPCoc(
113 OPJ_BYTE * p_header_data,
114 OPJ_UINT32 * p_header_size,
115 struct opj_event_mgr * p_manager
119 * Gets the size taken by writting a SPCod or SPCoc for the given tile and component.
121 * @param p_tile_no the tile indix.
122 * @param p_comp_no the component being outputted.
123 * @param p_j2k the J2K codec.
125 * @return the number of bytes taken by the SPCod element.
127 static OPJ_UINT32 j2k_get_SPCod_SPCoc_size (
129 OPJ_UINT32 p_tile_no,
134 * Writes a SQcd or SQcc element, i.e. the quantization values of a band in the QCD or QCC.
136 * @param p_tile_no the tile to output.
137 * @param p_comp_no the component number to output.
138 * @param p_data the data buffer.
139 * @param p_header_size pointer to the size of the data buffer, it is changed by the function.
140 * @param p_j2k J2K codec.
141 * @param p_manager the user event manager.
144 static bool j2k_write_SQcd_SQcc(
146 OPJ_UINT32 p_tile_no,
147 OPJ_UINT32 p_comp_no,
149 OPJ_UINT32 * p_header_size,
150 struct opj_event_mgr * p_manager
154 * Reads a SQcd or SQcc element, i.e. the quantization values of a band in the QCD or QCC.
156 * @param p_tile_no the tile to output.
157 * @param p_comp_no the component number to output.
158 * @param p_data the data buffer.
159 * @param p_header_size pointer to the size of the data buffer, it is changed by the function.
160 * @param p_j2k J2K codec.
161 * @param p_manager the user event manager.
164 static bool j2k_read_SQcd_SQcc(
167 OPJ_BYTE * p_header_data,
168 OPJ_UINT32 * p_header_size,
169 struct opj_event_mgr * p_manager
172 * Updates the Tile Length Marker.
174 static void j2k_update_tlm (
176 OPJ_UINT32 p_tile_part_size);
179 * Gets the size taken by writting SQcd or SQcc element, i.e. the quantization values of a band in the QCD or QCC.
181 * @param p_tile_no the tile indix.
182 * @param p_comp_no the component being outputted.
183 * @param p_j2k the J2K codec.
185 * @return the number of bytes taken by the SPCod element.
187 static OPJ_UINT32 j2k_get_SQcd_SQcc_size (
189 OPJ_UINT32 p_tile_no,
195 * Copies the tile component parameters of all the component from the first tile component.
197 * @param p_j2k the J2k codec.
199 static void j2k_copy_tile_component_parameters(
204 * Writes the SOC marker (Start Of Codestream)
206 * @param p_stream the stream to write data to.
207 * @param p_j2k J2K codec.
208 * @param p_manager the user event manager.
211 static bool j2k_write_soc(
213 struct opj_stream_private *p_stream,
214 struct opj_event_mgr * p_manager
217 * Reads a SOC marker (Start of Codestream)
218 * @param p_header_data the data contained in the SOC box.
219 * @param jp2 the jpeg2000 file codec.
220 * @param p_header_size the size of the data contained in the SOC marker.
221 * @param p_manager the user event manager.
223 static bool j2k_read_soc(
225 struct opj_stream_private *p_stream,
226 struct opj_event_mgr * p_manager
229 * Writes the SIZ marker (image and tile size)
231 * @param p_stream the stream to write data to.
232 * @param p_j2k J2K codec.
233 * @param p_manager the user event manager.
235 static bool j2k_write_siz(
237 struct opj_stream_private *p_stream,
238 struct opj_event_mgr * p_manager
241 * Writes the CBD-MCT-MCC-MCO markers (Multi components transform)
243 * @param p_stream the stream to write data to.
244 * @param p_j2k J2K codec.
245 * @param p_manager the user event manager.
247 static bool j2k_write_mct_data_group(
249 struct opj_stream_private *p_stream,
250 struct opj_event_mgr * p_manager
254 * Reads a SIZ marker (image and tile size)
255 * @param p_header_data the data contained in the SIZ box.
256 * @param jp2 the jpeg2000 file codec.
257 * @param p_header_size the size of the data contained in the SIZ marker.
258 * @param p_manager the user event manager.
260 static bool j2k_read_siz (
262 OPJ_BYTE * p_header_data,
263 OPJ_UINT32 p_header_size,
264 struct opj_event_mgr * p_manager
267 * Writes the COM marker (comment)
269 * @param p_stream the stream to write data to.
270 * @param p_j2k J2K codec.
271 * @param p_manager the user event manager.
273 static bool j2k_write_com(
275 struct opj_stream_private *p_stream,
276 struct opj_event_mgr * p_manager
279 * Reads a COM marker (comments)
280 * @param p_header_data the data contained in the COM box.
281 * @param jp2 the jpeg2000 file codec.
282 * @param p_header_size the size of the data contained in the COM marker.
283 * @param p_manager the user event manager.
285 static bool j2k_read_com (
287 OPJ_BYTE * p_header_data,
288 OPJ_UINT32 p_header_size,
289 struct opj_event_mgr * p_manager
295 * Writes the COD marker (Coding style default)
297 * @param p_stream the stream to write data to.
298 * @param p_j2k J2K codec.
299 * @param p_manager the user event manager.
301 static bool j2k_write_cod(
303 struct opj_stream_private *p_stream,
304 struct opj_event_mgr * p_manager
307 * Reads a COD marker (Coding Styke defaults)
308 * @param p_header_data the data contained in the COD box.
309 * @param p_j2k the jpeg2000 codec.
310 * @param p_header_size the size of the data contained in the COD marker.
311 * @param p_manager the user event manager.
313 static bool j2k_read_cod (
315 OPJ_BYTE * p_header_data,
316 OPJ_UINT32 p_header_size,
317 struct opj_event_mgr * p_manager
321 * Writes the COC marker (Coding style component)
323 * @param p_comp_number the index of the component to output.
324 * @param p_stream the stream to write data to.
325 * @param p_j2k J2K codec.
326 * @param p_manager the user event manager.
328 static bool j2k_write_coc(
330 OPJ_UINT32 p_comp_number,
331 struct opj_stream_private *p_stream,
332 struct opj_event_mgr * p_manager
336 * Writes the COC marker (Coding style component)
338 * @param p_comp_no the index of the component to output.
339 * @param p_stream the stream to write data to.
340 * @param p_j2k J2K codec.
341 * @param p_manager the user event manager.
343 static void j2k_write_coc_in_memory(
345 OPJ_UINT32 p_comp_no,
347 OPJ_UINT32 * p_data_written,
348 struct opj_event_mgr * p_manager
351 * Gets the maximum size taken by a coc.
353 * @param p_j2k the jpeg2000 codec to use.
355 static OPJ_UINT32 j2k_get_max_coc_size(opj_j2k_t *p_j2k);
358 * Reads a COC marker (Coding Style Component)
359 * @param p_header_data the data contained in the COC box.
360 * @param p_j2k the jpeg2000 codec.
361 * @param p_header_size the size of the data contained in the COC marker.
362 * @param p_manager the user event manager.
364 static bool j2k_read_coc (
366 OPJ_BYTE * p_header_data,
367 OPJ_UINT32 p_header_size,
368 struct opj_event_mgr * p_manager
372 * Writes the QCD marker (quantization default)
374 * @param p_comp_number the index of the component to output.
375 * @param p_stream the stream to write data to.
376 * @param p_j2k J2K codec.
377 * @param p_manager the user event manager.
379 static bool j2k_write_qcd(
381 struct opj_stream_private *p_stream,
382 struct opj_event_mgr * p_manager
387 * Reads a QCD marker (Quantization defaults)
388 * @param p_header_data the data contained in the QCD box.
389 * @param p_j2k the jpeg2000 codec.
390 * @param p_header_size the size of the data contained in the QCD marker.
391 * @param p_manager the user event manager.
393 static bool j2k_read_qcd (
395 OPJ_BYTE * p_header_data,
396 OPJ_UINT32 p_header_size,
397 struct opj_event_mgr * p_manager
400 * Writes the QCC marker (quantization component)
402 * @param p_comp_no the index of the component to output.
403 * @param p_stream the stream to write data to.
404 * @param p_j2k J2K codec.
405 * @param p_manager the user event manager.
407 static bool j2k_write_qcc(
409 OPJ_UINT32 p_comp_no,
410 struct opj_stream_private *p_stream,
411 struct opj_event_mgr * p_manager
414 * Writes the QCC marker (quantization component)
416 * @param p_comp_no the index of the component to output.
417 * @param p_stream the stream to write data to.
418 * @param p_j2k J2K codec.
419 * @param p_manager the user event manager.
421 static void j2k_write_qcc_in_memory(
423 OPJ_UINT32 p_comp_no,
425 OPJ_UINT32 * p_data_written,
426 struct opj_event_mgr * p_manager
429 * Gets the maximum size taken by a qcc.
431 static OPJ_UINT32 j2k_get_max_qcc_size (opj_j2k_t *p_j2k);
434 * Reads a QCC marker (Quantization component)
435 * @param p_header_data the data contained in the QCC box.
436 * @param p_j2k the jpeg2000 codec.
437 * @param p_header_size the size of the data contained in the QCC marker.
438 * @param p_manager the user event manager.
440 static bool j2k_read_qcc(
442 OPJ_BYTE * p_header_data,
443 OPJ_UINT32 p_header_size,
444 struct opj_event_mgr * p_manager);
446 * Writes the POC marker (Progression Order Change)
448 * @param p_stream the stream to write data to.
449 * @param p_j2k J2K codec.
450 * @param p_manager the user event manager.
452 static bool j2k_write_poc(
454 struct opj_stream_private *p_stream,
455 struct opj_event_mgr * p_manager
459 * Writes the updated tlm.
461 * @param p_stream the stream to write data to.
462 * @param p_j2k J2K codec.
463 * @param p_manager the user event manager.
465 static bool j2k_write_updated_tlm(
467 struct opj_stream_private *p_stream,
468 struct opj_event_mgr * p_manager
472 * Writes the POC marker (Progression Order Change)
474 * @param p_stream the stream to write data to.
475 * @param p_j2k J2K codec.
476 * @param p_manager the user event manager.
478 static void j2k_write_poc_in_memory(
481 OPJ_UINT32 * p_data_written,
482 struct opj_event_mgr * p_manager
486 * Gets the maximum size taken by the writting of a POC.
488 static OPJ_UINT32 j2k_get_max_poc_size(opj_j2k_t *p_j2k);
491 * Gets the maximum size taken by the toc headers of all the tile parts of any given tile.
493 static OPJ_UINT32 j2k_get_max_toc_size (opj_j2k_t *p_j2k);
496 * Gets the maximum size taken by the headers of the SOT.
498 * @param p_j2k the jpeg2000 codec to use.
500 static OPJ_UINT32 j2k_get_specific_header_sizes(opj_j2k_t *p_j2k);
503 * Reads a POC marker (Progression Order Change)
505 * @param p_header_data the data contained in the POC box.
506 * @param p_j2k the jpeg2000 codec.
507 * @param p_header_size the size of the data contained in the POC marker.
508 * @param p_manager the user event manager.
510 static bool j2k_read_poc (
512 OPJ_BYTE * p_header_data,
513 OPJ_UINT32 p_header_size,
514 struct opj_event_mgr * p_manager
517 * Reads a CRG marker (Component registration)
519 * @param p_header_data the data contained in the TLM box.
520 * @param p_j2k the jpeg2000 codec.
521 * @param p_header_size the size of the data contained in the TLM marker.
522 * @param p_manager the user event manager.
524 static bool j2k_read_crg (
526 OPJ_BYTE * p_header_data,
527 OPJ_UINT32 p_header_size,
528 struct opj_event_mgr * p_manager
531 * Reads a TLM marker (Tile Length Marker)
533 * @param p_header_data the data contained in the TLM box.
534 * @param p_j2k the jpeg2000 codec.
535 * @param p_header_size the size of the data contained in the TLM marker.
536 * @param p_manager the user event manager.
538 static bool j2k_read_tlm (
540 OPJ_BYTE * p_header_data,
541 OPJ_UINT32 p_header_size,
542 struct opj_event_mgr * p_manager
545 * Reads a PLM marker (Packet length, main header marker)
547 * @param p_header_data the data contained in the TLM box.
548 * @param p_j2k the jpeg2000 codec.
549 * @param p_header_size the size of the data contained in the TLM marker.
550 * @param p_manager the user event manager.
552 static bool j2k_read_plm (
554 OPJ_BYTE * p_header_data,
555 OPJ_UINT32 p_header_size,
556 struct opj_event_mgr * p_manager
559 * Reads a PLT marker (Packet length, tile-part header)
561 * @param p_header_data the data contained in the PLT box.
562 * @param p_j2k the jpeg2000 codec.
563 * @param p_header_size the size of the data contained in the PLT marker.
564 * @param p_manager the user event manager.
566 static bool j2k_read_plt (
568 OPJ_BYTE * p_header_data,
569 OPJ_UINT32 p_header_size,
570 struct opj_event_mgr * p_manager
573 * Reads a PPM marker (Packed packet headers, main header)
575 * @param p_header_data the data contained in the POC box.
576 * @param p_j2k the jpeg2000 codec.
577 * @param p_header_size the size of the data contained in the POC marker.
578 * @param p_manager the user event manager.
580 static bool j2k_read_ppm (
582 OPJ_BYTE * p_header_data,
583 OPJ_UINT32 p_header_size,
584 struct opj_event_mgr * p_manager
587 * Reads a PPT marker (Packed packet headers, tile-part header)
589 * @param p_header_data the data contained in the PPT box.
590 * @param p_j2k the jpeg2000 codec.
591 * @param p_header_size the size of the data contained in the PPT marker.
592 * @param p_manager the user event manager.
594 static bool j2k_read_ppt (
596 OPJ_BYTE * p_header_data,
597 OPJ_UINT32 p_header_size,
598 struct opj_event_mgr * p_manager
601 * Writes the TLM marker (Tile Length Marker)
603 * @param p_stream the stream to write data to.
604 * @param p_j2k J2K codec.
605 * @param p_manager the user event manager.
607 static bool j2k_write_tlm(
609 struct opj_stream_private *p_stream,
610 struct opj_event_mgr * p_manager
613 * Writes the SOT marker (Start of tile-part)
615 * @param p_stream the stream to write data to.
616 * @param p_j2k J2K codec.
617 * @param p_manager the user event manager.
619 static bool j2k_write_sot(
622 OPJ_UINT32 * p_data_written,
623 const struct opj_stream_private *p_stream,
624 struct opj_event_mgr * p_manager
627 * Reads a PPT marker (Packed packet headers, tile-part header)
629 * @param p_header_data the data contained in the PPT box.
630 * @param p_j2k the jpeg2000 codec.
631 * @param p_header_size the size of the data contained in the PPT marker.
632 * @param p_manager the user event manager.
634 static bool j2k_read_sot (
636 OPJ_BYTE * p_header_data,
637 OPJ_UINT32 p_header_size,
638 struct opj_event_mgr * p_manager
641 * Writes the SOD marker (Start of data)
643 * @param p_stream the stream to write data to.
644 * @param p_j2k J2K codec.
645 * @param p_manager the user event manager.
647 static bool j2k_write_sod(
649 struct opj_tcd * p_tile_coder,
651 OPJ_UINT32 * p_data_written,
652 OPJ_UINT32 p_total_data_size,
653 const struct opj_stream_private *p_stream,
654 struct opj_event_mgr * p_manager
657 * Reads a SOD marker (Start Of Data)
659 * @param p_header_data the data contained in the SOD box.
660 * @param p_j2k the jpeg2000 codec.
661 * @param p_header_size the size of the data contained in the SOD marker.
662 * @param p_manager the user event manager.
664 static bool j2k_read_sod (
666 struct opj_stream_private *p_stream,
667 struct opj_event_mgr * p_manager
670 * Writes the RGN marker (Region Of Interest)
672 * @param p_tile_no the tile to output
673 * @param p_comp_no the component to output
674 * @param p_stream the stream to write data to.
675 * @param p_j2k J2K codec.
676 * @param p_manager the user event manager.
678 static bool j2k_write_rgn(
680 OPJ_UINT32 p_tile_no,
681 OPJ_UINT32 p_comp_no,
682 struct opj_stream_private *p_stream,
683 struct opj_event_mgr * p_manager
686 * Reads a RGN marker (Region Of Interest)
688 * @param p_header_data the data contained in the POC box.
689 * @param p_j2k the jpeg2000 codec.
690 * @param p_header_size the size of the data contained in the POC marker.
691 * @param p_manager the user event manager.
693 static bool j2k_read_rgn (
695 OPJ_BYTE * p_header_data,
696 OPJ_UINT32 p_header_size,
697 struct opj_event_mgr * p_manager
700 * Writes the EOC marker (End of Codestream)
702 * @param p_stream the stream to write data to.
703 * @param p_j2k J2K codec.
704 * @param p_manager the user event manager.
706 static bool j2k_write_eoc(
708 struct opj_stream_private *p_stream,
709 struct opj_event_mgr * p_manager
713 * Copies the tile component parameters of all the component from the first tile component.
715 * @param p_j2k the J2k codec.
717 static void j2k_copy_tile_quantization_parameters(
722 * Reads a EOC marker (End Of Codestream)
724 * @param p_header_data the data contained in the SOD box.
725 * @param p_j2k the jpeg2000 codec.
726 * @param p_header_size the size of the data contained in the SOD marker.
727 * @param p_manager the user event manager.
729 static bool j2k_read_eoc (
731 struct opj_stream_private *p_stream,
732 struct opj_event_mgr * p_manager
738 * @param p_stream the stream to write data to.
739 * @param p_j2k J2K codec.
740 * @param p_manager the user event manager.
742 static bool j2k_init_info(
744 struct opj_stream_private *p_stream,
745 struct opj_event_mgr * p_manager
748 * Reads an unknown marker
750 * @param p_stream the stream object to read from.
751 * @param p_j2k the jpeg2000 codec.
752 * @param p_manager the user event manager.
754 * @return true if the marker could be deduced.
756 static bool j2k_read_unk (
758 struct opj_stream_private *p_stream,
759 struct opj_event_mgr * p_manager
762 * Ends the encoding, i.e. frees memory.
764 * @param p_stream the stream to write data to.
765 * @param p_j2k J2K codec.
766 * @param p_manager the user event manager.
768 static bool j2k_end_encoding(
770 struct opj_stream_private *p_stream,
771 struct opj_event_mgr * p_manager
775 * Writes the CBD marker (Component bit depth definition)
777 * @param p_stream the stream to write data to.
778 * @param p_j2k J2K codec.
779 * @param p_manager the user event manager.
781 static bool j2k_write_cbd(
783 struct opj_stream_private *p_stream,
784 struct opj_event_mgr * p_manager
788 * Reads a CBD marker (Component bit depth definition)
789 * @param p_header_data the data contained in the CBD box.
790 * @param p_j2k the jpeg2000 codec.
791 * @param p_header_size the size of the data contained in the CBD marker.
792 * @param p_manager the user event manager.
794 static bool j2k_read_cbd (
796 OPJ_BYTE * p_header_data,
797 OPJ_UINT32 p_header_size,
798 struct opj_event_mgr * p_manager);
801 * Writes the MCT marker (Multiple Component Transform)
803 * @param p_stream the stream to write data to.
804 * @param p_j2k J2K codec.
805 * @param p_manager the user event manager.
807 static bool j2k_write_mct_record(
809 opj_mct_data_t * p_mct_record,
810 struct opj_stream_private *p_stream,
811 struct opj_event_mgr * p_manager
815 * Reads a MCT marker (Multiple Component Transform)
817 * @param p_header_data the data contained in the MCT box.
818 * @param p_j2k the jpeg2000 codec.
819 * @param p_header_size the size of the data contained in the MCT marker.
820 * @param p_manager the user event manager.
822 static bool j2k_read_mct (
824 OPJ_BYTE * p_header_data,
825 OPJ_UINT32 p_header_size,
826 struct opj_event_mgr * p_manager
830 * Writes the MCC marker (Multiple Component Collection)
832 * @param p_stream the stream to write data to.
833 * @param p_j2k J2K codec.
834 * @param p_manager the user event manager.
836 static bool j2k_write_mcc_record(
838 struct opj_simple_mcc_decorrelation_data * p_mcc_record,
839 struct opj_stream_private *p_stream,
840 struct opj_event_mgr * p_manager
844 * Reads a MCC marker (Multiple Component Collection)
846 * @param p_header_data the data contained in the MCC box.
847 * @param p_j2k the jpeg2000 codec.
848 * @param p_header_size the size of the data contained in the MCC marker.
849 * @param p_manager the user event manager.
851 static bool j2k_read_mcc (
853 OPJ_BYTE * p_header_data,
854 OPJ_UINT32 p_header_size,
855 struct opj_event_mgr * p_manager
859 * Writes the MCO marker (Multiple component transformation ordering)
861 * @param p_stream the stream to write data to.
862 * @param p_j2k J2K codec.
863 * @param p_manager the user event manager.
865 static bool j2k_write_mco(
867 struct opj_stream_private *p_stream,
868 struct opj_event_mgr * p_manager
872 * Reads a MCO marker (Multiple Component Transform Ordering)
874 * @param p_header_data the data contained in the MCO box.
875 * @param p_j2k the jpeg2000 codec.
876 * @param p_header_size the size of the data contained in the MCO marker.
877 * @param p_manager the user event manager.
879 static bool j2k_read_mco (
881 OPJ_BYTE * p_header_data,
882 OPJ_UINT32 p_header_size,
883 struct opj_event_mgr * p_manager
886 * Writes the image components.
888 * @param p_stream the stream to write data to.
889 * @param p_j2k J2K codec.
890 * @param p_manager the user event manager.
892 static bool j2k_write_image_components(
894 struct opj_stream_private *p_stream,
895 struct opj_event_mgr * p_manager
899 * Writes regions of interests.
901 * @param p_stream the stream to write data to.
902 * @param p_j2k J2K codec.
903 * @param p_manager the user event manager.
905 static bool j2k_write_regions(
907 struct opj_stream_private *p_stream,
908 struct opj_event_mgr * p_manager
913 * @param p_stream the stream to write data to.
914 * @param p_j2k J2K codec.
915 * @param p_manager the user event manager.
917 static bool j2k_write_epc(
919 struct opj_stream_private *p_stream,
920 struct opj_event_mgr * p_manager
924 * Checks the progression order changes values. Tells of the poc given as input are valid.
925 * A nice message is outputted at errors.
927 * @param p_pocs the progression order changes.
928 * @param p_nb_pocs the number of progression order changes.
929 * @param p_nb_resolutions the number of resolutions.
930 * @param numcomps the number of components
931 * @param numlayers the number of layers.
933 * @return true if the pocs are valid.
935 static bool j2k_check_poc_val(
936 const opj_poc_t *p_pocs,
937 OPJ_UINT32 p_nb_pocs,
938 OPJ_UINT32 p_nb_resolutions,
940 OPJ_UINT32 numlayers,
941 opj_event_mgr_t * p_manager);
944 * Gets the number of tile parts used for the given change of progression (if any) and the given tile.
946 * @param cp the coding parameters.
947 * @param pino the offset of the given poc (i.e. its position in the coding parameter).
948 * @param tileno the given tile.
950 * @return the number of tile parts.
952 static OPJ_UINT32 j2k_get_num_tp(
957 * Calculates the total number of tile parts needed by the encoder to
958 * encode such an image. If not enough memory is available, then the function return false.
960 * @param p_nb_tiles pointer that will hold the number of tile parts.
961 * @param cp the coding parameters for the image.
962 * @param image the image to encode.
963 * @param p_j2k the p_j2k encoder.
964 * @param p_manager the user event manager.
966 * @return true if the function was successful, false else.
968 static bool j2k_calculate_tp(
971 OPJ_UINT32 * p_nb_tiles,
973 opj_event_mgr_t * p_manager);
975 static bool j2k_write_first_tile_part (
978 OPJ_UINT32 * p_data_written,
979 OPJ_UINT32 p_total_data_size,
980 opj_stream_private_t *p_stream,
981 struct opj_event_mgr * p_manager
983 static bool j2k_write_all_tile_parts(
986 OPJ_UINT32 * p_data_written,
987 OPJ_UINT32 p_total_data_size,
988 opj_stream_private_t *p_stream,
989 struct opj_event_mgr * p_manager
993 * Reads the lookup table containing all the marker, status and action, and returns the handler associated
994 * with the marker value.
995 * @param p_id Marker value to look up
997 * @return the handler associated with the id.
999 static const struct opj_dec_memory_marker_handler * j2k_get_marker_handler (OPJ_UINT32 p_id);
1002 * Destroys a tile coding parameter structure.
1004 * @param p_tcp the tile coding parameter to destroy.
1006 static void j2k_tcp_destroy (opj_tcp_t *p_tcp);
1008 static void j2k_get_tile_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data);
1011 * Destroys a coding parameter structure.
1013 * @param p_cp the coding parameter to destroy.
1015 static void j2k_cp_destroy (opj_cp_t *p_cp);
1018 * Sets up the validation ,i.e. adds the procedures to lauch to make sure the codec parameters
1019 * are valid. Developpers wanting to extend the library can add their own validation procedures.
1021 static void j2k_setup_encoding_validation (opj_j2k_t *p_j2k);
1024 * Sets up the validation ,i.e. adds the procedures to lauch to make sure the codec parameters
1025 * are valid. Developpers wanting to extend the library can add their own validation procedures.
1027 static void j2k_setup_decoding_validation (opj_j2k_t *p_j2k);
1030 * Sets up the validation ,i.e. adds the procedures to lauch to make sure the codec parameters
1031 * are valid. Developpers wanting to extend the library can add their own validation procedures.
1033 static void j2k_setup_end_compress (opj_j2k_t *p_j2k);
1036 * Creates a tile-coder decoder.
1038 * @param p_stream the stream to write data to.
1039 * @param p_j2k J2K codec.
1040 * @param p_manager the user event manager.
1042 static bool j2k_create_tcd(
1044 struct opj_stream_private *p_stream,
1045 struct opj_event_mgr * p_manager
1049 * Excutes the given procedures on the given codec.
1051 * @param p_procedure_list the list of procedures to execute
1052 * @param p_j2k the jpeg2000 codec to execute the procedures on.
1053 * @param p_stream the stream to execute the procedures on.
1054 * @param p_manager the user manager.
1056 * @return true if all the procedures were successfully executed.
1058 static bool j2k_exec (
1060 opj_procedure_list_t * p_procedure_list,
1061 opj_stream_private_t *p_stream,
1062 opj_event_mgr_t * p_manager
1065 * Updates the rates of the tcp.
1067 * @param p_stream the stream to write data to.
1068 * @param p_j2k J2K codec.
1069 * @param p_manager the user event manager.
1071 static bool j2k_update_rates(
1073 struct opj_stream_private *p_stream,
1074 struct opj_event_mgr * p_manager
1078 * The default encoding validation procedure without any extension.
1080 * @param p_j2k the jpeg2000 codec to validate.
1081 * @param p_stream the input stream to validate.
1082 * @param p_manager the user event manager.
1084 * @return true if the parameters are correct.
1086 bool j2k_encoding_validation (
1088 opj_stream_private_t *p_stream,
1089 opj_event_mgr_t * p_manager
1092 * The read header procedure.
1094 bool j2k_read_header_procedure(
1096 struct opj_stream_private *p_stream,
1097 struct opj_event_mgr * p_manager);
1100 * The default decoding validation procedure without any extension.
1102 * @param p_j2k the jpeg2000 codec to validate.
1103 * @param p_stream the input stream to validate.
1104 * @param p_manager the user event manager.
1106 * @return true if the parameters are correct.
1108 bool j2k_decoding_validation (
1110 opj_stream_private_t *p_stream,
1111 opj_event_mgr_t * p_manager
1116 bool j2k_decode_tiles (
1118 struct opj_stream_private *p_stream,
1119 struct opj_event_mgr * p_manager);
1122 * The mct encoding validation procedure.
1124 * @param p_j2k the jpeg2000 codec to validate.
1125 * @param p_stream the input stream to validate.
1126 * @param p_manager the user event manager.
1128 * @return true if the parameters are correct.
1130 bool j2k_mct_validation (
1132 opj_stream_private_t *p_stream,
1133 opj_event_mgr_t * p_manager
1136 * Builds the tcd decoder to use to decode tile.
1138 bool j2k_build_decoder (
1140 opj_stream_private_t *p_stream,
1141 opj_event_mgr_t * p_manager
1144 * Builds the tcd encoder to use to encode tile.
1146 bool j2k_build_encoder (
1148 opj_stream_private_t *p_stream,
1149 opj_event_mgr_t * p_manager
1152 * Copies the decoding tile parameters onto all the tile parameters.
1153 * Creates also the tile decoder.
1155 bool j2k_copy_default_tcp_and_create_tcd(
1157 opj_stream_private_t *p_stream,
1158 opj_event_mgr_t * p_manager
1161 * Destroys the memory associated with the decoding of headers.
1163 bool j2k_destroy_header_memory (
1165 opj_stream_private_t *p_stream,
1166 opj_event_mgr_t * p_manager
1170 * Sets up the procedures to do on writting header. Developpers wanting to extend the library can add their own writting procedures.
1172 void j2k_setup_header_writting (opj_j2k_t *p_j2k);
1175 * Sets up the procedures to do on reading header. Developpers wanting to extend the library can add their own reading procedures.
1177 void j2k_setup_header_reading (opj_j2k_t *p_j2k);
1181 * @param p_j2k the jpeg2000 codec.
1182 * @param p_stream the stream to write data to.
1183 * @param p_manager the user event manager.
1185 static bool j2k_post_write_tile (
1188 OPJ_UINT32 p_data_size,
1189 opj_stream_private_t *p_stream,
1190 opj_event_mgr_t * p_manager
1193 static bool j2k_pre_write_tile (
1195 OPJ_UINT32 p_tile_index,
1196 opj_stream_private_t *p_stream,
1197 opj_event_mgr_t * p_manager
1199 static bool j2k_update_image_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data);
1201 static bool j2k_add_mct(opj_tcp_t * p_tcp,opj_image_t * p_image, OPJ_UINT32 p_index);
1203 * Gets the offset of the header.
1205 * @param p_stream the stream to write data to.
1206 * @param p_j2k J2K codec.
1207 * @param p_manager the user event manager.
1209 static bool j2k_get_end_header(
1211 struct opj_stream_private *p_stream,
1212 struct opj_event_mgr * p_manager
1215 static void j2k_read_int16_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
1216 static void j2k_read_int32_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
1217 static void j2k_read_float32_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
1218 static void j2k_read_float64_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
1220 static void j2k_read_int16_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
1221 static void j2k_read_int32_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
1222 static void j2k_read_float32_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
1223 static void j2k_read_float64_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
1225 static void j2k_write_float_to_int16 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
1226 static void j2k_write_float_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
1227 static void j2k_write_float_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
1228 static void j2k_write_float_to_float64 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
1236 /* ----------------------------------------------------------------------- */
1240 /****************************************************************************
1241 ********************* CONSTANTS ********************************************
1242 ****************************************************************************/
1248 * List of progression orders.
1250 const j2k_prog_order_t j2k_prog_order_list [] =
1257 {(OPJ_PROG_ORDER)-1, ""}
1260 const OPJ_UINT32 MCT_ELEMENT_SIZE [] =
1268 typedef void (* j2k_mct_function) (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
1270 const j2k_mct_function j2k_mct_read_functions_to_float [] =
1272 j2k_read_int16_to_float,
1273 j2k_read_int32_to_float,
1274 j2k_read_float32_to_float,
1275 j2k_read_float64_to_float
1278 const j2k_mct_function j2k_mct_read_functions_to_int32 [] =
1280 j2k_read_int16_to_int32,
1281 j2k_read_int32_to_int32,
1282 j2k_read_float32_to_int32,
1283 j2k_read_float64_to_int32
1286 const j2k_mct_function j2k_mct_write_functions_from_float [] =
1288 j2k_write_float_to_int16,
1289 j2k_write_float_to_int32,
1290 j2k_write_float_to_float,
1291 j2k_write_float_to_float64
1297 /*const opj_dec_stream_marker_handler_t j2k_stream_marker_handler_tab[] =
1299 {J2K_MS_SOC, J2K_DEC_STATE_MHSOC, j2k_read_soc},
1300 {J2K_MS_SOD, J2K_DEC_STATE_TPH, j2k_read_sod},
1301 {J2K_MS_EOC, J2K_DEC_STATE_TPHSOT, j2k_read_eoc},
1304 {J2K_MS_EPC, J2K_DEC_STATE_MH | J2K_DEC_STATE_TPH, j2k_read_epc},
1305 {J2K_MS_EPB, J2K_DEC_STATE_MH | J2K_DEC_STATE_TPH, j2k_read_epb},
1306 {J2K_MS_ESD, J2K_DEC_STATE_MH | J2K_DEC_STATE_TPH, j2k_read_esd},
1307 {J2K_MS_RED, J2K_DEC_STATE_MH | J2K_DEC_STATE_TPH, j2k_read_red},
1310 {J2K_MS_SEC, J2K_DEC_STATE_MH, j2k_read_sec},
1311 {J2K_MS_INSEC, 0, j2k_read_insec},
1314 {0, J2K_DEC_STATE_MH | J2K_DEC_STATE_TPH, j2k_read_unk}
1317 const opj_dec_memory_marker_handler_t j2k_memory_marker_handler_tab [] =
1319 {J2K_MS_SOT, J2K_DEC_STATE_MH | J2K_DEC_STATE_TPHSOT, j2k_read_sot},
1320 {J2K_MS_COD, J2K_DEC_STATE_MH | J2K_DEC_STATE_TPH, j2k_read_cod},
1321 {J2K_MS_COC, J2K_DEC_STATE_MH | J2K_DEC_STATE_TPH, j2k_read_coc},
1322 {J2K_MS_RGN, J2K_DEC_STATE_MH | J2K_DEC_STATE_TPH, j2k_read_rgn},
1323 {J2K_MS_QCD, J2K_DEC_STATE_MH | J2K_DEC_STATE_TPH, j2k_read_qcd},
1324 {J2K_MS_QCC, J2K_DEC_STATE_MH | J2K_DEC_STATE_TPH, j2k_read_qcc},
1325 {J2K_MS_POC, J2K_DEC_STATE_MH | J2K_DEC_STATE_TPH, j2k_read_poc},
1326 {J2K_MS_SIZ, J2K_DEC_STATE_MHSIZ , j2k_read_siz},
1327 {J2K_MS_TLM, J2K_DEC_STATE_MH, j2k_read_tlm},
1328 {J2K_MS_PLM, J2K_DEC_STATE_MH, j2k_read_plm},
1329 {J2K_MS_PLT, J2K_DEC_STATE_TPH, j2k_read_plt},
1330 {J2K_MS_PPM, J2K_DEC_STATE_MH, j2k_read_ppm},
1331 {J2K_MS_PPT, J2K_DEC_STATE_TPH, j2k_read_ppt},
1333 {J2K_MS_CRG, J2K_DEC_STATE_MH, j2k_read_crg},
1334 {J2K_MS_COM, J2K_DEC_STATE_MH | J2K_DEC_STATE_TPH, j2k_read_com},
1335 {J2K_MS_MCT, J2K_DEC_STATE_MH | J2K_DEC_STATE_TPH, j2k_read_mct},
1336 {J2K_MS_CBD, J2K_DEC_STATE_MH , j2k_read_cbd},
1337 {J2K_MS_MCC, J2K_DEC_STATE_MH | J2K_DEC_STATE_TPH, j2k_read_mcc},
1338 {J2K_MS_MCO, J2K_DEC_STATE_MH | J2K_DEC_STATE_TPH, j2k_read_mco}
1340 {J2K_MS_EPC, J2K_DEC_STATE_MH | J2K_DEC_STATE_TPH, j2k_read_epc},
1341 {J2K_MS_EPB, J2K_DEC_STATE_MH | J2K_DEC_STATE_TPH, j2k_read_epb},
1342 {J2K_MS_ESD, J2K_DEC_STATE_MH | J2K_DEC_STATE_TPH, j2k_read_esd},
1343 {J2K_MS_RED, J2K_DEC_STATE_MH | J2K_DEC_STATE_TPH, j2k_read_red},
1344 #endif /* USE_JPWL */
1346 {J2K_MS_SEC, J2K_DEC_STATE_MH, j2k_read_sec},
1347 {J2K_MS_INSEC, 0, j2k_read_insec}
1348 #endif /* USE_JPSEC */
1351 void j2k_read_int16_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
1353 OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1354 OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
1359 (i=0;i<p_nb_elem;++i)
1361 opj_read_bytes(l_src_data,&l_temp,2);
1362 l_src_data+=sizeof(OPJ_INT16);
1363 *(l_dest_data++) = (OPJ_FLOAT32) l_temp;
1367 void j2k_read_int32_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
1369 OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1370 OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
1375 (i=0;i<p_nb_elem;++i)
1377 opj_read_bytes(l_src_data,&l_temp,4);
1378 l_src_data+=sizeof(OPJ_INT32);
1379 *(l_dest_data++) = (OPJ_FLOAT32) l_temp;
1382 void j2k_read_float32_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
1384 OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1385 OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
1390 (i=0;i<p_nb_elem;++i)
1392 opj_read_float(l_src_data,&l_temp);
1393 l_src_data+=sizeof(OPJ_FLOAT32);
1394 *(l_dest_data++) = l_temp;
1398 void j2k_read_float64_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
1400 OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1401 OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
1406 (i=0;i<p_nb_elem;++i)
1408 opj_read_double(l_src_data,&l_temp);
1409 l_src_data+=sizeof(OPJ_FLOAT64);
1410 *(l_dest_data++) = (OPJ_FLOAT32) l_temp;
1415 void j2k_read_int16_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
1417 OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1418 OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
1423 (i=0;i<p_nb_elem;++i)
1425 opj_read_bytes(l_src_data,&l_temp,2);
1426 l_src_data+=sizeof(OPJ_INT16);
1427 *(l_dest_data++) = (OPJ_INT32) l_temp;
1431 void j2k_read_int32_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
1433 OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1434 OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
1439 (i=0;i<p_nb_elem;++i)
1441 opj_read_bytes(l_src_data,&l_temp,4);
1442 l_src_data+=sizeof(OPJ_INT32);
1443 *(l_dest_data++) = (OPJ_INT32) l_temp;
1446 void j2k_read_float32_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
1448 OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1449 OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
1454 (i=0;i<p_nb_elem;++i)
1456 opj_read_float(l_src_data,&l_temp);
1457 l_src_data+=sizeof(OPJ_FLOAT32);
1458 *(l_dest_data++) = (OPJ_INT32) l_temp;
1462 void j2k_read_float64_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
1464 OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
1465 OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
1470 (i=0;i<p_nb_elem;++i)
1472 opj_read_double(l_src_data,&l_temp);
1473 l_src_data+=sizeof(OPJ_FLOAT64);
1474 *(l_dest_data++) = (OPJ_INT32) l_temp;
1479 void j2k_write_float_to_int16 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
1481 OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;
1482 OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;
1487 (i=0;i<p_nb_elem;++i)
1489 l_temp = (OPJ_UINT32) *(l_src_data++);
1490 opj_write_bytes(l_dest_data,l_temp,sizeof(OPJ_INT16));
1491 l_dest_data+=sizeof(OPJ_INT16);
1495 void j2k_write_float_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
1497 OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;
1498 OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;
1503 (i=0;i<p_nb_elem;++i)
1505 l_temp = (OPJ_UINT32) *(l_src_data++);
1506 opj_write_bytes(l_dest_data,l_temp,sizeof(OPJ_INT32));
1507 l_dest_data+=sizeof(OPJ_INT32);
1511 void j2k_write_float_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
1513 OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;
1514 OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;
1519 (i=0;i<p_nb_elem;++i)
1521 l_temp = (OPJ_FLOAT32) *(l_src_data++);
1522 opj_write_float(l_dest_data,l_temp);
1523 l_dest_data+=sizeof(OPJ_FLOAT32);
1528 void j2k_write_float_to_float64 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
1530 OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;
1531 OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;
1535 (i=0;i<p_nb_elem;++i)
1537 l_temp = (OPJ_FLOAT64) *(l_src_data++);
1538 opj_write_double(l_dest_data,l_temp);
1539 l_dest_data+=sizeof(OPJ_FLOAT64);
1547 * Converts an enum type progression order to string type.
1549 * @param prg_order the progression order to get.
1551 * @return the string representation of the gicen progression order.
1553 const OPJ_CHAR * j2k_convert_progression_order(OPJ_PROG_ORDER p_prg_order)
1555 const j2k_prog_order_t *po;
1557 (po = j2k_prog_order_list; po->enum_prog != -1; ++po )
1560 (po->enum_prog == p_prg_order)
1562 return po->str_prog;
1565 return po->str_prog;
1575 * Checks the progression order changes values. Tells if the poc given as input are valid.
1577 * @param p_pocs the progression order changes.
1578 * @param p_nb_pocs the number of progression order changes.
1579 * @param p_nb_resolutions the number of resolutions.
1580 * @param numcomps the number of components
1581 * @param numlayers the number of layers.
1582 * @param p_manager the user event manager.
1584 * @return true if the pocs are valid.
1586 bool j2k_check_poc_val(const opj_poc_t *p_pocs, OPJ_UINT32 p_nb_pocs, OPJ_UINT32 p_nb_resolutions, OPJ_UINT32 p_num_comps, OPJ_UINT32 p_num_layers, opj_event_mgr_t * p_manager)
1588 OPJ_UINT32* packet_array;
1589 OPJ_UINT32 index , resno, compno, layno;
1591 OPJ_UINT32 step_c = 1;
1592 OPJ_UINT32 step_r = p_num_comps * step_c;
1593 OPJ_UINT32 step_l = p_nb_resolutions * step_r;
1595 OPJ_UINT32 layno0 = 0;
1597 packet_array = (OPJ_UINT32*) opj_calloc(step_l * p_num_layers, sizeof(OPJ_UINT32));
1599 (packet_array == 00)
1601 opj_event_msg(p_manager , EVT_ERROR, "Not enough memory for checking the poc values.\n");
1604 memset(packet_array,0,step_l * p_num_layers* sizeof(OPJ_UINT32));
1611 index = step_r * p_pocs->resno0;
1612 // take each resolution for each poc
1614 (resno = p_pocs->resno0 ; resno < p_pocs->resno1 ; ++resno)
1616 OPJ_UINT32 res_index = index + p_pocs->compno0 * step_c;
1617 // take each comp of each resolution for each poc
1619 (compno = p_pocs->compno0 ; compno < p_pocs->compno1 ; ++compno)
1621 OPJ_UINT32 comp_index = res_index + layno0 * step_l;
1622 // and finally take each layer of each res of ...
1624 (layno = layno0; layno < p_pocs->layno1 ; ++layno)
1626 //index = step_r * resno + step_c * compno + step_l * layno;
1627 packet_array[comp_index] = 1;
1628 comp_index += step_l;
1630 res_index += step_c;
1635 // iterate through all the pocs
1637 (i = 1; i < p_nb_pocs ; ++i)
1639 OPJ_UINT32 l_last_layno1 = (p_pocs-1)->layno1 ;
1640 layno0 = (p_pocs->layno1 > l_last_layno1)? l_last_layno1 : 0;
1641 index = step_r * p_pocs->resno0;
1642 // take each resolution for each poc
1644 (resno = p_pocs->resno0 ; resno < p_pocs->resno1 ; ++resno)
1646 OPJ_UINT32 res_index = index + p_pocs->compno0 * step_c;
1647 // take each comp of each resolution for each poc
1649 (compno = p_pocs->compno0 ; compno < p_pocs->compno1 ; ++compno)
1651 OPJ_UINT32 comp_index = res_index + layno0 * step_l;
1652 // and finally take each layer of each res of ...
1654 (layno = layno0; layno < p_pocs->layno1 ; ++layno)
1656 //index = step_r * resno + step_c * compno + step_l * layno;
1657 packet_array[comp_index] = 1;
1658 comp_index += step_l;
1660 res_index += step_c;
1669 (layno = 0; layno < p_num_layers ; ++layno)
1672 (resno = 0; resno < p_nb_resolutions; ++resno)
1675 (compno = 0; compno < p_num_comps; ++compno)
1677 loss |= (packet_array[index]!=1);
1678 //index = step_r * resno + step_c * compno + step_l * layno;
1686 opj_event_msg(p_manager , EVT_ERROR, "Missing packets possible loss of data\n");
1688 opj_free(packet_array);
1693 /* ----------------------------------------------------------------------- */
1696 * Gets the number of tile parts used for the given change of progression (if any) and the given tile.
1698 * @param cp the coding parameters.
1699 * @param pino the offset of the given poc (i.e. its position in the coding parameter).
1700 * @param tileno the given tile.
1702 * @return the number of tile parts.
1704 OPJ_UINT32 j2k_get_num_tp(opj_cp_t *cp,OPJ_UINT32 pino,OPJ_UINT32 tileno)
1706 const OPJ_CHAR *prog = 00;
1708 OPJ_UINT32 tpnum = 1;
1709 opj_tcp_t *tcp = 00;
1710 opj_poc_t * l_current_poc = 00;
1712 // preconditions only in debug
1713 assert(tileno < (cp->tw * cp->th));
1714 assert(pino < (cp->tcps[tileno].numpocs + 1));
1716 // get the given tile coding parameter
1717 tcp = &cp->tcps[tileno];
1719 l_current_poc = &(tcp->pocs[pino]);
1720 assert(l_current_poc != 0);
1722 // get the progression order as a character string
1723 prog = j2k_convert_progression_order(tcp->prg);
1724 assert(strlen(prog) > 0);
1727 (cp->m_specific_param.m_enc.m_tp_on == 1)
1737 tpnum *= l_current_poc->compE;
1741 tpnum *= l_current_poc->resE;
1745 tpnum *= l_current_poc->prcE;
1749 tpnum *= l_current_poc->layE;
1752 // whould we split here ?
1754 ( cp->m_specific_param.m_enc.m_tp_flag == prog[i] )
1756 cp->m_specific_param.m_enc.m_tp_pos=i;
1769 * Calculates the total number of tile parts needed by the encoder to
1770 * encode such an image. If not enough memory is available, then the function return false.
1772 * @param p_nb_tiles pointer that will hold the number of tile parts.
1773 * @param cp the coding parameters for the image.
1774 * @param image the image to encode.
1775 * @param p_j2k the p_j2k encoder.
1776 * @param p_manager the user event manager.
1778 * @return true if the function was successful, false else.
1780 bool j2k_calculate_tp(
1783 OPJ_UINT32 * p_nb_tiles,
1785 opj_event_mgr_t * p_manager)
1787 OPJ_UINT32 pino,tileno;
1788 OPJ_UINT32 l_nb_tiles;
1792 assert(p_nb_tiles != 00);
1794 assert(image != 00);
1795 assert(p_j2k != 00);
1796 assert(p_manager != 00);
1798 l_nb_tiles = cp->tw * cp->th;
1806 opj_tile_info_t * l_info_tile_ptr = p_j2k->cstr_info->tile;
1808 (tileno = 0; tileno < l_nb_tiles; ++tileno)
1810 OPJ_UINT32 cur_totnum_tp = 0;
1811 pi_update_encoding_parameters(image,cp,tileno);
1813 (pino = 0; pino <= tcp->numpocs; ++pino)
1815 OPJ_UINT32 tp_num = j2k_get_num_tp(cp,pino,tileno);
1816 *p_nb_tiles = *p_nb_tiles + tp_num;
1817 cur_totnum_tp += tp_num;
1819 tcp->m_nb_tile_parts = cur_totnum_tp;
1820 l_info_tile_ptr->tp = (opj_tp_info_t *) opj_malloc(cur_totnum_tp * sizeof(opj_tp_info_t));
1822 (l_info_tile_ptr->tp == 00)
1826 memset(l_info_tile_ptr->tp,0,cur_totnum_tp * sizeof(opj_tp_info_t));
1827 l_info_tile_ptr->num_tps = cur_totnum_tp;
1835 (tileno = 0; tileno < l_nb_tiles; ++tileno)
1837 OPJ_UINT32 cur_totnum_tp = 0;
1838 pi_update_encoding_parameters(image,cp,tileno);
1840 (pino = 0; pino <= tcp->numpocs; ++pino)
1842 OPJ_UINT32 tp_num=0;
1843 tp_num = j2k_get_num_tp(cp,pino,tileno);
1844 *p_nb_tiles = *p_nb_tiles + tp_num;
1845 cur_totnum_tp += tp_num;
1847 tcp->m_nb_tile_parts = cur_totnum_tp;
1855 * Writes the SOC marker (Start Of Codestream)
1857 * @param p_stream the stream to write data to.
1858 * @param p_j2k J2K codec.
1859 * @param p_manager the user event manager.
1864 struct opj_stream_private *p_stream,
1865 struct opj_event_mgr * p_manager
1868 /* 2 bytes will be written */
1869 OPJ_BYTE * l_start_stream = 00;
1872 assert(p_stream != 00);
1873 assert(p_j2k != 00);
1874 assert(p_manager != 00);
1876 l_start_stream = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
1878 /* write SOC identifier */
1879 opj_write_bytes(l_start_stream,J2K_MS_SOC,2);
1881 (opj_stream_write_data(p_stream,l_start_stream,2,p_manager) != 2)
1887 /* update markers struct */
1888 j2k_add_marker(p_j2k->cstr_info, J2K_MS_SOC, p_stream_tell(p_stream) - 2, 2);
1889 #endif /* USE_JPWL */
1895 * Reads a SOC marker (Start of Codestream)
1896 * @param p_header_data the data contained in the SOC box.
1897 * @param jp2 the jpeg2000 file codec.
1898 * @param p_header_size the size of the data contained in the SOC marker.
1899 * @param p_manager the user event manager.
1903 struct opj_stream_private *p_stream,
1904 struct opj_event_mgr * p_manager
1908 OPJ_BYTE l_data [2];
1909 OPJ_UINT32 l_marker;
1912 assert(p_j2k != 00);
1913 assert(p_manager != 00);
1914 assert(p_stream != 00);
1916 (opj_stream_read_data(p_stream,l_data,2,p_manager) != 2)
1920 opj_read_bytes(l_data,&l_marker,2);
1922 (l_marker != J2K_MS_SOC)
1926 /* assure length of data is correct (0) */
1927 p_j2k->m_specific_param.m_decoder.m_state = J2K_DEC_STATE_MHSIZ;
1932 //TODO p_j2k->cstr_info->main_head_start = opj_stream_tell(p_stream) - 2; // why - 2 ?
1933 p_j2k->cstr_info->codestream_size = 0;/*p_stream_numbytesleft(p_j2k->p_stream) + 2 - p_j2k->cstr_info->main_head_start*/;
1939 * Writes the SIZ marker (image and tile size)
1941 * @param p_stream the stream to write data to.
1942 * @param p_j2k J2K codec.
1943 * @param p_manager the user event manager.
1947 struct opj_stream_private *p_stream,
1948 struct opj_event_mgr * p_manager
1952 OPJ_UINT32 l_size_len;
1953 OPJ_BYTE * l_current_ptr;
1954 opj_image_t * l_image = 00;
1956 opj_image_comp_t * l_img_comp = 00;
1959 assert(p_stream != 00);
1960 assert(p_j2k != 00);
1961 assert(p_manager != 00);
1963 l_image = p_j2k->m_image;
1964 cp = &(p_j2k->m_cp);
1965 l_size_len = 40 + 3 * l_image->numcomps;
1966 l_img_comp = l_image->comps;
1969 (l_size_len > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size)
1971 p_j2k->m_specific_param.m_encoder.m_header_tile_data
1972 = (OPJ_BYTE*)opj_realloc(
1973 p_j2k->m_specific_param.m_encoder.m_header_tile_data,
1976 (! p_j2k->m_specific_param.m_encoder.m_header_tile_data)
1980 p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_size_len;
1983 l_current_ptr = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
1985 /* write SOC identifier */
1986 opj_write_bytes(l_current_ptr,J2K_MS_SIZ,2); /* SIZ */
1988 opj_write_bytes(l_current_ptr,l_size_len-2,2); /* L_SIZ */
1990 opj_write_bytes(l_current_ptr, cp->rsiz, 2); /* Rsiz (capabilities) */
1992 opj_write_bytes(l_current_ptr, l_image->x1, 4); /* Xsiz */
1994 opj_write_bytes(l_current_ptr, l_image->y1, 4); /* Ysiz */
1996 opj_write_bytes(l_current_ptr, l_image->x0, 4); /* X0siz */
1998 opj_write_bytes(l_current_ptr, l_image->y0, 4); /* Y0siz */
2000 opj_write_bytes(l_current_ptr, cp->tdx, 4); /* XTsiz */
2002 opj_write_bytes(l_current_ptr, cp->tdy, 4); /* YTsiz */
2004 opj_write_bytes(l_current_ptr, cp->tx0, 4); /* XT0siz */
2006 opj_write_bytes(l_current_ptr, cp->ty0, 4); /* YT0siz */
2008 opj_write_bytes(l_current_ptr, l_image->numcomps, 2); /* Csiz */
2011 (i = 0; i < l_image->numcomps; ++i)
2013 // TODO here with MCT ?
2014 opj_write_bytes(l_current_ptr, l_img_comp->prec - 1 + (l_img_comp->sgnd << 7), 1); /* Ssiz_i */
2016 opj_write_bytes(l_current_ptr, l_img_comp->dx, 1); /* XRsiz_i */
2018 opj_write_bytes(l_current_ptr, l_img_comp->dy, 1); /* YRsiz_i */
2023 (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_size_len,p_manager) != l_size_len)
2031 * Reads a SIZ marker (image and tile size)
2032 * @param p_header_data the data contained in the SIZ box.
2033 * @param jp2 the jpeg2000 file codec.
2034 * @param p_header_size the size of the data contained in the SIZ marker.
2035 * @param p_manager the user event manager.
2039 OPJ_BYTE * p_header_data,
2040 OPJ_UINT32 p_header_size,
2041 struct opj_event_mgr * p_manager
2044 OPJ_UINT32 l_size, i;
2045 OPJ_UINT32 l_nb_comp;
2046 OPJ_UINT32 l_nb_comp_remain;
2047 OPJ_UINT32 l_remaining_size;
2048 OPJ_UINT32 l_nb_tiles;
2050 opj_image_t *l_image = 00;
2051 opj_cp_t *l_cp = 00;
2052 opj_image_comp_t * l_img_comp = 00;
2053 opj_tcp_t * l_current_tile_param = 00;
2056 assert(p_j2k != 00);
2057 assert(p_manager != 00);
2058 assert(p_header_data != 00);
2060 l_image = p_j2k->m_image;
2061 l_cp = &(p_j2k->m_cp);
2063 (p_header_size < 36)
2065 opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker size\n");
2068 l_remaining_size = p_header_size - 36;
2070 l_nb_comp = l_remaining_size / 3;
2071 l_nb_comp_remain = l_remaining_size % 3;
2073 (l_nb_comp_remain != 0)
2075 opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker size\n");
2078 l_size = p_header_size + 2; /* Lsiz */
2080 opj_read_bytes(p_header_data,&l_tmp ,2); /* Rsiz (capabilities) */
2082 l_cp->rsiz = (OPJ_RSIZ_CAPABILITIES) l_tmp;
2083 opj_read_bytes(p_header_data,(OPJ_UINT32 *) (&l_image->x1) ,4); /* Xsiz */
2085 opj_read_bytes(p_header_data,(OPJ_UINT32*) (&l_image->y1),4); /* Ysiz */
2087 opj_read_bytes(p_header_data,(OPJ_UINT32*) &l_image->x0,4); /* X0siz */
2089 opj_read_bytes(p_header_data,(OPJ_UINT32*) &l_image->y0,4); /* Y0siz */
2091 opj_read_bytes(p_header_data, (&l_cp->tdx),4); /* XTsiz */
2093 opj_read_bytes(p_header_data,&l_cp->tdy,4); /* YTsiz */
2095 opj_read_bytes(p_header_data,(OPJ_UINT32 *) (&l_cp->tx0),4); /* XT0siz */
2097 opj_read_bytes(p_header_data,(OPJ_UINT32 *) (&l_cp->ty0),4); /* YT0siz */
2099 opj_read_bytes(p_header_data,(&l_image->numcomps),2); /* Csiz */
2102 (l_image->numcomps != l_nb_comp)
2104 opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker size\n");
2109 if (p_j2k->m_cp->correct) {
2110 /* if JPWL is on, we check whether TX errors have damaged
2111 too much the SIZ parameters */
2112 if (!(image->x1 * image->y1)) {
2113 opj_event_msg(p_j2k->cinfo, EVT_ERROR,
2114 "JPWL: bad image size (%d x %d)\n",
2115 image->x1, image->y1);
2116 if (!JPWL_ASSUME || JPWL_ASSUME) {
2117 opj_event_msg(p_j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
2121 if (image->numcomps != ((len - 38) / 3)) {
2122 opj_event_msg(p_j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
2123 "JPWL: Csiz is %d => space in SIZ only for %d comps.!!!\n",
2124 image->numcomps, ((len - 38) / 3));
2126 opj_event_msg(p_j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
2129 /* we try to correct */
2130 opj_event_msg(p_j2k->cinfo, EVT_WARNING, "- trying to adjust this\n");
2131 if (image->numcomps < ((len - 38) / 3)) {
2132 len = 38 + 3 * image->numcomps;
2133 opj_event_msg(p_j2k->cinfo, EVT_WARNING, "- setting Lsiz to %d => HYPOTHESIS!!!\n",
2136 image->numcomps = ((len - 38) / 3);
2137 opj_event_msg(p_j2k->cinfo, EVT_WARNING, "- setting Csiz to %d => HYPOTHESIS!!!\n",
2142 /* update components number in the jpwl_exp_comps filed */
2143 cp->exp_comps = image->numcomps;
2145 #endif /* USE_JPWL */
2147 l_image->comps = (opj_image_comp_t*) opj_calloc(l_image->numcomps, sizeof(opj_image_comp_t));
2149 (l_image->comps == 00)
2151 l_image->numcomps = 0;
2152 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to take in charge SIZ marker\n");
2155 memset(l_image->comps,0,l_image->numcomps * sizeof(opj_image_comp_t));
2156 l_img_comp = l_image->comps;
2158 (i = 0; i < l_image->numcomps; ++i)
2161 opj_read_bytes(p_header_data,&tmp,1); /* Ssiz_i */
2163 l_img_comp->prec = (tmp & 0x7f) + 1;
2164 l_img_comp->sgnd = tmp >> 7;
2165 opj_read_bytes(p_header_data,&l_img_comp->dx,1); /* XRsiz_i */
2167 opj_read_bytes(p_header_data,&l_img_comp->dy,1); /* YRsiz_i */
2170 if (p_j2k->m_cp->correct) {
2171 /* if JPWL is on, we check whether TX errors have damaged
2172 too much the SIZ parameters, again */
2173 if (!(image->comps[i].dx * image->comps[i].dy)) {
2174 opj_event_msg(p_j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
2175 "JPWL: bad XRsiz_%d/YRsiz_%d (%d x %d)\n",
2176 i, i, image->comps[i].dx, image->comps[i].dy);
2178 opj_event_msg(p_j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
2181 /* we try to correct */
2182 opj_event_msg(p_j2k->cinfo, EVT_WARNING, "- trying to adjust them\n");
2183 if (!image->comps[i].dx) {
2184 image->comps[i].dx = 1;
2185 opj_event_msg(p_j2k->cinfo, EVT_WARNING, "- setting XRsiz_%d to %d => HYPOTHESIS!!!\n",
2186 i, image->comps[i].dx);
2188 if (!image->comps[i].dy) {
2189 image->comps[i].dy = 1;
2190 opj_event_msg(p_j2k->cinfo, EVT_WARNING, "- setting YRsiz_%d to %d => HYPOTHESIS!!!\n",
2191 i, image->comps[i].dy);
2196 #endif /* USE_JPWL */
2197 l_img_comp->resno_decoded = 0; /* number of resolution decoded */
2198 l_img_comp->factor = l_cp->m_specific_param.m_dec.m_reduce; /* reducing factor per component */
2202 l_cp->tw = int_ceildiv(l_image->x1 - l_cp->tx0, l_cp->tdx);
2203 l_cp->th = int_ceildiv(l_image->y1 - l_cp->ty0, l_cp->tdy);
2204 l_nb_tiles = l_cp->tw * l_cp->th;
2206 (p_j2k->m_specific_param.m_decoder.m_discard_tiles)
2208 p_j2k->m_specific_param.m_decoder.m_start_tile_x = (p_j2k->m_specific_param.m_decoder.m_start_tile_x - l_cp->tx0) / l_cp->tdx;
2209 p_j2k->m_specific_param.m_decoder.m_start_tile_y = (p_j2k->m_specific_param.m_decoder.m_start_tile_y - l_cp->ty0) / l_cp->tdy;
2210 p_j2k->m_specific_param.m_decoder.m_end_tile_x = int_ceildiv((p_j2k->m_specific_param.m_decoder.m_end_tile_x - l_cp->tx0), l_cp->tdx);
2211 p_j2k->m_specific_param.m_decoder.m_end_tile_y = int_ceildiv((p_j2k->m_specific_param.m_decoder.m_end_tile_y - l_cp->ty0), l_cp->tdy);
2215 p_j2k->m_specific_param.m_decoder.m_start_tile_x = 0;
2216 p_j2k->m_specific_param.m_decoder.m_start_tile_y = 0;
2217 p_j2k->m_specific_param.m_decoder.m_end_tile_x = l_cp->tw;
2218 p_j2k->m_specific_param.m_decoder.m_end_tile_y = l_cp->th;
2222 if (p_j2k->m_cp->correct) {
2223 /* if JPWL is on, we check whether TX errors have damaged
2224 too much the SIZ parameters */
2225 if ((cp->tw < 1) || (cp->th < 1) || (cp->tw > cp->max_tiles) || (cp->th > cp->max_tiles)) {
2226 opj_event_msg(p_j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
2227 "JPWL: bad number of tiles (%d x %d)\n",
2230 opj_event_msg(p_j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
2233 /* we try to correct */
2234 opj_event_msg(p_j2k->cinfo, EVT_WARNING, "- trying to adjust them\n");
2237 opj_event_msg(p_j2k->cinfo, EVT_WARNING, "- setting %d tiles in x => HYPOTHESIS!!!\n",
2240 if (cp->tw > cp->max_tiles) {
2242 opj_event_msg(p_j2k->cinfo, EVT_WARNING, "- too large x, increase expectance of %d\n"
2243 "- setting %d tiles in x => HYPOTHESIS!!!\n",
2244 cp->max_tiles, cp->tw);
2248 opj_event_msg(p_j2k->cinfo, EVT_WARNING, "- setting %d tiles in y => HYPOTHESIS!!!\n",
2251 if (cp->th > cp->max_tiles) {
2253 opj_event_msg(p_j2k->cinfo, EVT_WARNING, "- too large y, increase expectance of %d to continue\n",
2254 "- setting %d tiles in y => HYPOTHESIS!!!\n",
2255 cp->max_tiles, cp->th);
2259 #endif /* USE_JPWL */
2260 /* memory allocations */
2261 l_cp->tcps = (opj_tcp_t*) opj_calloc(l_nb_tiles, sizeof(opj_tcp_t));
2265 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to take in charge SIZ marker\n");
2268 memset(l_cp->tcps,0,l_nb_tiles*sizeof(opj_tcp_t));
2271 if (p_j2k->m_cp->correct) {
2273 opj_event_msg(p_j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
2274 "JPWL: could not alloc tcps field of cp\n");
2275 if (!JPWL_ASSUME || JPWL_ASSUME) {
2276 opj_event_msg(p_j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
2281 #endif /* USE_JPWL */
2283 p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps = (opj_tccp_t*) opj_calloc(l_image->numcomps, sizeof(opj_tccp_t));
2285 (p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps == 00)
2287 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to take in charge SIZ marker\n");
2290 memset(p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps ,0,l_image->numcomps*sizeof(opj_tccp_t));
2292 p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mct_records =
2293 (opj_mct_data_t*)opj_malloc(J2K_MCT_DEFAULT_NB_RECORDS * sizeof(opj_mct_data_t));
2295 (! p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mct_records)
2297 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to take in charge SIZ marker\n");
2300 memset(p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mct_records,0,J2K_MCT_DEFAULT_NB_RECORDS * sizeof(opj_mct_data_t));
2301 p_j2k->m_specific_param.m_decoder.m_default_tcp->m_nb_max_mct_records = J2K_MCT_DEFAULT_NB_RECORDS;
2303 p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mcc_records =
2304 (opj_simple_mcc_decorrelation_data_t*)
2305 opj_malloc(J2K_MCC_DEFAULT_NB_RECORDS * sizeof(opj_simple_mcc_decorrelation_data_t));
2307 (! p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mcc_records)
2309 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to take in charge SIZ marker\n");
2312 memset(p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mcc_records,0,J2K_MCC_DEFAULT_NB_RECORDS * sizeof(opj_simple_mcc_decorrelation_data_t));
2313 p_j2k->m_specific_param.m_decoder.m_default_tcp->m_nb_max_mcc_records = J2K_MCC_DEFAULT_NB_RECORDS;
2315 /* set up default dc level shift */
2317 (i=0;i<l_image->numcomps;++i)
2320 (! l_image->comps[i].sgnd)
2322 p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps[i].m_dc_level_shift = 1 << (l_image->comps[i].prec - 1);
2326 l_current_tile_param = l_cp->tcps;
2328 (i = 0; i < l_nb_tiles; ++i)
2330 l_current_tile_param->tccps = (opj_tccp_t*) opj_malloc(l_image->numcomps * sizeof(opj_tccp_t));
2332 (l_current_tile_param->tccps == 00)
2334 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to take in charge SIZ marker\n");
2337 memset(l_current_tile_param->tccps,0,l_image->numcomps * sizeof(opj_tccp_t));
2339 ++l_current_tile_param;
2342 p_j2k->m_specific_param.m_decoder.m_state = J2K_DEC_STATE_MH;
2343 opj_image_comp_update(l_image,l_cp);
2349 opj_codestream_info_t *cstr_info = p_j2k->cstr_info;
2350 cstr_info->image_w = l_image->x1 - l_image->x0;
2351 cstr_info->image_h = l_image->y1 - l_image->y0;
2352 cstr_info->numcomps = l_image->numcomps;
2353 cstr_info->tw = l_cp->tw;
2354 cstr_info->th = l_cp->th;
2355 cstr_info->tile_x = l_cp->tdx;
2356 cstr_info->tile_y = l_cp->tdy;
2357 cstr_info->tile_Ox = l_cp->tx0;
2358 cstr_info->tile_Oy = l_cp->ty0;
2359 cstr_info->tile = (opj_tile_info_t*) opj_calloc(l_nb_tiles, sizeof(opj_tile_info_t));
2361 (cstr_info->tile == 00)
2363 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to take in charge SIZ marker\n");
2366 memset(cstr_info->tile,0,l_nb_tiles * sizeof(opj_tile_info_t));
2372 * Writes the COM marker (comment)
2374 * @param p_stream the stream to write data to.
2375 * @param p_j2k J2K codec.
2376 * @param p_manager the user event manager.
2380 struct opj_stream_private *p_stream,
2381 struct opj_event_mgr * p_manager
2384 OPJ_UINT32 l_comment_size;
2385 OPJ_UINT32 l_total_com_size;
2386 const OPJ_CHAR *l_comment;
2387 OPJ_BYTE * l_current_ptr = 00;
2390 assert(p_j2k != 00);
2391 assert(p_stream != 00);
2392 assert(p_manager != 00);
2394 l_comment = p_j2k->m_cp.comment;
2395 l_comment_size = strlen(l_comment);
2396 l_total_com_size = l_comment_size + 6;
2399 (l_total_com_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size)
2401 p_j2k->m_specific_param.m_encoder.m_header_tile_data
2402 = (OPJ_BYTE*)opj_realloc(
2403 p_j2k->m_specific_param.m_encoder.m_header_tile_data,
2406 (! p_j2k->m_specific_param.m_encoder.m_header_tile_data)
2410 p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_total_com_size;
2412 l_current_ptr = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
2413 opj_write_bytes(l_current_ptr,J2K_MS_COM , 2); /* COM */
2415 opj_write_bytes(l_current_ptr,l_total_com_size - 2 , 2); /* L_COM */
2417 opj_write_bytes(l_current_ptr,1 , 2); /* General use (IS 8859-15:1999 (Latin) values) */
2419 memcpy( l_current_ptr,l_comment,l_comment_size);
2421 (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_total_com_size,p_manager) != l_total_com_size)
2429 * Reads a COM marker (comments)
2430 * @param p_header_data the data contained in the COM box.
2431 * @param jp2 the jpeg2000 file codec.
2432 * @param p_header_size the size of the data contained in the COM marker.
2433 * @param p_manager the user event manager.
2437 OPJ_BYTE * p_header_data,
2438 OPJ_UINT32 p_header_size,
2439 struct opj_event_mgr * p_manager
2443 assert(p_j2k != 00);
2444 assert(p_manager != 00);
2445 assert(p_header_data != 00);
2450 * Gets the size taken by writting a SPCod or SPCoc for the given tile and component.
2452 * @param p_tile_no the tile indix.
2453 * @param p_comp_no the component being outputted.
2454 * @param p_j2k the J2K codec.
2456 * @return the number of bytes taken by the SPCod element.
2458 OPJ_UINT32 j2k_get_SPCod_SPCoc_size (
2460 OPJ_UINT32 p_tile_no,
2461 OPJ_UINT32 p_comp_no
2464 opj_cp_t *l_cp = 00;
2465 opj_tcp_t *l_tcp = 00;
2466 opj_tccp_t *l_tccp = 00;
2469 assert(p_j2k != 00);
2471 l_cp = &(p_j2k->m_cp);
2472 l_tcp = &l_cp->tcps[p_tile_no];
2473 l_tccp = &l_tcp->tccps[p_comp_no];
2475 // preconditions again
2476 assert(p_tile_no < (l_cp->tw * l_cp->th));
2477 assert(p_comp_no < p_j2k->m_image->numcomps);
2480 (l_tccp->csty & J2K_CCP_CSTY_PRT)
2482 return 5 + l_tccp->numresolutions;
2492 * Writes a SPCod or SPCoc element, i.e. the coding style of a given component of a tile.
2494 * @param p_comp_no the component number to output.
2495 * @param p_stream the stream to write data to.
2496 * @param p_j2k J2K codec.
2497 * @param p_manager the user event manager.
2500 bool j2k_write_SPCod_SPCoc(
2502 OPJ_UINT32 p_tile_no,
2503 OPJ_UINT32 p_comp_no,
2505 OPJ_UINT32 * p_header_size,
2506 struct opj_event_mgr * p_manager
2510 opj_cp_t *l_cp = 00;
2511 opj_tcp_t *l_tcp = 00;
2512 opj_tccp_t *l_tccp = 00;
2515 assert(p_j2k != 00);
2516 assert(p_header_size != 00);
2517 assert(p_manager != 00);
2518 assert(p_data != 00);
2520 l_cp = &(p_j2k->m_cp);
2521 l_tcp = &l_cp->tcps[p_tile_no];
2522 l_tccp = &l_tcp->tccps[p_comp_no];
2524 // preconditions again
2525 assert(p_tile_no < (l_cp->tw * l_cp->th));
2526 assert(p_comp_no <(p_j2k->m_image->numcomps));
2529 (*p_header_size < 5)
2531 opj_event_msg(p_manager, EVT_ERROR, "Error writting SPCod SPCoc element\n");
2535 opj_write_bytes(p_data,l_tccp->numresolutions - 1, 1); /* SPcoc (D) */
2537 opj_write_bytes(p_data,l_tccp->cblkw - 2, 1); /* SPcoc (E) */
2539 opj_write_bytes(p_data,l_tccp->cblkh - 2, 1); /* SPcoc (F) */
2541 opj_write_bytes(p_data,l_tccp->cblksty, 1); /* SPcoc (G) */
2543 opj_write_bytes(p_data,l_tccp->qmfbid, 1); /* SPcoc (H) */
2546 *p_header_size = *p_header_size - 5;
2548 (l_tccp->csty & J2K_CCP_CSTY_PRT)
2551 (*p_header_size < l_tccp->numresolutions)
2553 opj_event_msg(p_manager, EVT_ERROR, "Error writting SPCod SPCoc element\n");
2557 (i = 0; i < l_tccp->numresolutions; ++i)
2559 opj_write_bytes(p_data,l_tccp->prcw[i] + (l_tccp->prch[i] << 4), 1); /* SPcoc (I_i) */
2562 *p_header_size = *p_header_size - l_tccp->numresolutions;
2570 * Reads a SPCod or SPCoc element, i.e. the coding style of a given component of a tile.
2571 * @param p_header_data the data contained in the COM box.
2572 * @param p_j2k the jpeg2000 codec.
2573 * @param p_header_size the size of the data contained in the COM marker.
2574 * @param p_manager the user event manager.
2576 bool j2k_read_SPCod_SPCoc(
2579 OPJ_BYTE * p_header_data,
2580 OPJ_UINT32 * p_header_size,
2581 struct opj_event_mgr * p_manager
2587 opj_cp_t *l_cp = 00;
2588 opj_tcp_t *l_tcp = 00;
2589 opj_tccp_t *l_tccp = 00;
2590 OPJ_BYTE * l_current_ptr = 00;
2594 assert(p_j2k != 00);
2595 assert(p_manager != 00);
2596 assert(p_header_data != 00);
2599 l_cp = &(p_j2k->m_cp);
2600 l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_DEC_STATE_TPH ? &l_cp->tcps[p_j2k->m_current_tile_number] : p_j2k->m_specific_param.m_decoder.m_default_tcp;
2602 // precondition again
2603 assert(compno < p_j2k->m_image->numcomps);
2604 l_tccp = &l_tcp->tccps[compno];
2605 l_current_ptr = p_header_data;
2608 // make sure room is sufficient
2610 (* p_header_size < 5)
2612 opj_event_msg(p_manager, EVT_ERROR, "Error reading SPCod SPCoc element\n");
2615 opj_read_bytes(l_current_ptr, &l_tccp->numresolutions ,1); /* SPcox (D) */
2616 ++l_tccp->numresolutions; /* tccp->numresolutions = read() + 1 */
2619 // If user wants to remove more resolutions than the codestream contains, return error
2621 (l_cp->m_specific_param.m_dec.m_reduce >= l_tccp->numresolutions)
2623 opj_event_msg(p_manager, EVT_ERROR, "Error decoding component %d.\nThe number of resolutions to remove is higher than the number "
2624 "of resolutions of this component\nModify the cp_reduce parameter.\n\n", compno);
2625 p_j2k->m_specific_param.m_decoder.m_state |= J2K_DEC_STATE_ERR;
2629 opj_read_bytes(l_current_ptr,&l_tccp->cblkw ,1); /* SPcoc (E) */
2633 opj_read_bytes(l_current_ptr,&l_tccp->cblkh ,1); /* SPcoc (F) */
2637 opj_read_bytes(l_current_ptr,&l_tccp->cblksty ,1); /* SPcoc (G) */
2640 opj_read_bytes(l_current_ptr,&l_tccp->qmfbid ,1); /* SPcoc (H) */
2643 * p_header_size = * p_header_size - 5;
2645 // use custom precinct size ?
2647 (l_tccp->csty & J2K_CCP_CSTY_PRT)
2650 (* p_header_size < l_tccp->numresolutions)
2652 opj_event_msg(p_manager, EVT_ERROR, "Error reading SPCod SPCoc element\n");
2656 (i = 0; i < l_tccp->numresolutions; ++i)
2658 opj_read_bytes(l_current_ptr,&l_tmp ,1); /* SPcoc (I_i) */
2660 l_tccp->prcw[i] = l_tmp & 0xf;
2661 l_tccp->prch[i] = l_tmp >> 4;
2663 * p_header_size = * p_header_size - l_tccp->numresolutions;
2667 /* set default size for the precinct width and height */
2669 (i = 0; i < l_tccp->numresolutions; ++i)
2671 l_tccp->prcw[i] = 15;
2672 l_tccp->prch[i] = 15;
2678 (p_j2k->cstr_info && compno == 0)
2680 OPJ_UINT32 l_data_size = l_tccp->numresolutions * sizeof(OPJ_UINT32);
2681 memcpy(p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].pdx,l_tccp->prcw, l_data_size);
2682 memcpy(p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].pdy,l_tccp->prch, l_data_size);
2689 * Copies the tile component parameters of all the component from the first tile component.
2691 * @param p_j2k the J2k codec.
2693 void j2k_copy_tile_component_parameters(
2700 opj_cp_t *l_cp = 00;
2701 opj_tcp_t *l_tcp = 00;
2702 opj_tccp_t *l_ref_tccp = 00;
2703 opj_tccp_t *l_copied_tccp = 00;
2704 OPJ_UINT32 l_prc_size;
2706 assert(p_j2k != 00);
2708 l_cp = &(p_j2k->m_cp);
2709 l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_DEC_STATE_TPH ? &l_cp->tcps[p_j2k->m_current_tile_number] : p_j2k->m_specific_param.m_decoder.m_default_tcp;
2711 l_ref_tccp = &l_tcp->tccps[0];
2712 l_copied_tccp = l_ref_tccp + 1;
2713 l_prc_size = l_ref_tccp->numresolutions * sizeof(OPJ_UINT32);
2716 (i=1;i<p_j2k->m_image->numcomps;++i)
2718 l_copied_tccp->numresolutions = l_ref_tccp->numresolutions;
2719 l_copied_tccp->cblkw = l_ref_tccp->cblkw;
2720 l_copied_tccp->cblkh = l_ref_tccp->cblkh;
2721 l_copied_tccp->cblksty = l_ref_tccp->cblksty;
2722 l_copied_tccp->qmfbid = l_ref_tccp->qmfbid;
2723 memcpy(l_copied_tccp->prcw,l_ref_tccp->prcw,l_prc_size);
2724 memcpy(l_copied_tccp->prch,l_ref_tccp->prch,l_prc_size);
2732 * Writes the COD marker (Coding style default)
2734 * @param p_stream the stream to write data to.
2735 * @param p_j2k J2K codec.
2736 * @param p_manager the user event manager.
2740 struct opj_stream_private *p_stream,
2741 struct opj_event_mgr * p_manager
2744 opj_cp_t *l_cp = 00;
2745 opj_tcp_t *l_tcp = 00;
2746 OPJ_UINT32 l_code_size,l_remaining_size;
2747 OPJ_BYTE * l_current_data = 00;
2750 assert(p_j2k != 00);
2751 assert(p_manager != 00);
2752 assert(p_stream != 00);
2754 l_cp = &(p_j2k->m_cp);
2755 l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];
2756 l_code_size = 9 + j2k_get_SPCod_SPCoc_size(p_j2k,p_j2k->m_current_tile_number,0);
2757 l_remaining_size = l_code_size;
2760 (l_code_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size)
2762 p_j2k->m_specific_param.m_encoder.m_header_tile_data
2763 = (OPJ_BYTE*)opj_realloc(
2764 p_j2k->m_specific_param.m_encoder.m_header_tile_data,
2767 (! p_j2k->m_specific_param.m_encoder.m_header_tile_data)
2771 p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_code_size;
2774 l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
2776 opj_write_bytes(l_current_data,J2K_MS_COD,2); /* COD */
2777 l_current_data += 2;
2779 opj_write_bytes(l_current_data,l_code_size-2,2); /* L_COD */
2780 l_current_data += 2;
2782 opj_write_bytes(l_current_data,l_tcp->csty,1); /* Scod */
2785 opj_write_bytes(l_current_data,l_tcp->prg,1); /* SGcod (A) */
2788 opj_write_bytes(l_current_data,l_tcp->numlayers,2); /* SGcod (B) */
2791 opj_write_bytes(l_current_data,l_tcp->mct,1); /* SGcod (C) */
2794 l_remaining_size -= 9;
2797 (! j2k_write_SPCod_SPCoc(p_j2k,p_j2k->m_current_tile_number,0,l_current_data,&l_remaining_size,p_manager))
2799 opj_event_msg(p_manager, EVT_ERROR, "Error writting COD marker\n");
2803 (l_remaining_size != 0)
2805 opj_event_msg(p_manager, EVT_ERROR, "Error writting COD marker\n");
2810 (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_code_size,p_manager) != l_code_size)
2818 * Reads a COD marker (Coding Styke defaults)
2819 * @param p_header_data the data contained in the COD box.
2820 * @param p_j2k the jpeg2000 codec.
2821 * @param p_header_size the size of the data contained in the COD marker.
2822 * @param p_manager the user event manager.
2826 OPJ_BYTE * p_header_data,
2827 OPJ_UINT32 p_header_size,
2828 struct opj_event_mgr * p_manager
2834 opj_cp_t *l_cp = 00;
2835 opj_tcp_t *l_tcp = 00;
2836 opj_image_t *l_image = 00;
2839 assert(p_header_data != 00);
2840 assert(p_j2k != 00);
2841 assert(p_manager != 00);
2843 l_cp = &(p_j2k->m_cp);
2844 l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_DEC_STATE_TPH) ? &l_cp->tcps[p_j2k->m_current_tile_number] : p_j2k->m_specific_param.m_decoder.m_default_tcp;
2845 l_image = p_j2k->m_image;
2847 // make sure room is sufficient
2851 opj_event_msg(p_manager, EVT_ERROR, "Error reading COD marker\n");
2855 opj_read_bytes(p_header_data,&l_tcp->csty,1); /* Scod */
2857 opj_read_bytes(p_header_data,&l_tmp,1); /* SGcod (A) */
2859 l_tcp->prg = (OPJ_PROG_ORDER) l_tmp;
2860 opj_read_bytes(p_header_data,&l_tcp->numlayers,2); /* SGcod (B) */
2863 (l_cp->m_specific_param.m_dec.m_layer)
2865 l_tcp->num_layers_to_decode = l_cp->m_specific_param.m_dec.m_layer;
2869 l_tcp->num_layers_to_decode = l_tcp->numlayers;
2872 opj_read_bytes(p_header_data,&l_tcp->mct,1); /* SGcod (C) */
2877 (i = 0; i < l_image->numcomps; ++i)
2879 l_tcp->tccps[i].csty = l_tcp->csty & J2K_CCP_CSTY_PRT;
2883 (! j2k_read_SPCod_SPCoc(p_j2k,0,p_header_data,&p_header_size,p_manager))
2885 opj_event_msg(p_manager, EVT_ERROR, "Error reading COD marker\n");
2889 (p_header_size != 0)
2891 opj_event_msg(p_manager, EVT_ERROR, "Error reading COD marker\n");
2894 j2k_copy_tile_component_parameters(p_j2k);
2901 opj_codestream_info_t *l_cstr_info = p_j2k->cstr_info;
2902 l_cstr_info->prog = l_tcp->prg;
2903 l_cstr_info->numlayers = l_tcp->numlayers;
2904 l_cstr_info->numdecompos = (OPJ_INT32*) opj_malloc(l_image->numcomps * sizeof(OPJ_UINT32));
2906 (i = 0; i < l_image->numcomps; ++i)
2908 l_cstr_info->numdecompos[i] = l_tcp->tccps[i].numresolutions - 1;
2915 * Writes the COC marker (Coding style component)
2917 * @param p_comp_no the index of the component to output.
2918 * @param p_stream the stream to write data to.
2919 * @param p_j2k J2K codec.
2920 * @param p_manager the user event manager.
2924 OPJ_UINT32 p_comp_no,
2925 struct opj_stream_private *p_stream,
2926 struct opj_event_mgr * p_manager
2929 OPJ_UINT32 l_coc_size,l_remaining_size;
2930 OPJ_UINT32 l_comp_room;
2933 assert(p_j2k != 00);
2934 assert(p_manager != 00);
2935 assert(p_stream != 00);
2937 l_comp_room = (p_j2k->m_image->numcomps <= 256) ? 1 : 2;
2939 l_coc_size = 5 + l_comp_room + j2k_get_SPCod_SPCoc_size(p_j2k,p_j2k->m_current_tile_number,p_comp_no);
2941 (l_coc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size)
2943 p_j2k->m_specific_param.m_encoder.m_header_tile_data
2944 = (OPJ_BYTE*)opj_realloc(
2945 p_j2k->m_specific_param.m_encoder.m_header_tile_data,
2948 (! p_j2k->m_specific_param.m_encoder.m_header_tile_data)
2952 p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_coc_size;
2955 j2k_write_coc_in_memory(p_j2k,p_comp_no,p_j2k->m_specific_param.m_encoder.m_header_tile_data,&l_remaining_size,p_manager);
2958 (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_coc_size,p_manager) != l_coc_size)
2966 * Gets the maximum size taken by a coc.
2968 * @param p_j2k the jpeg2000 codec to use.
2970 OPJ_UINT32 j2k_get_max_coc_size(opj_j2k_t *p_j2k)
2973 OPJ_UINT32 l_nb_comp;
2974 OPJ_UINT32 l_nb_tiles;
2975 OPJ_UINT32 l_max = 0;
2979 l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th ;
2980 l_nb_comp = p_j2k->m_image->numcomps;
2983 (i=0;i<l_nb_tiles;++i)
2986 (j=0;j<l_nb_comp;++j)
2988 l_max = uint_max(l_max,j2k_get_SPCod_SPCoc_size(p_j2k,i,j));
2995 * Gets the maximum size taken by the toc headers of all the tile parts of any given tile.
2997 OPJ_UINT32 j2k_get_max_toc_size (opj_j2k_t *p_j2k)
3000 OPJ_UINT32 l_nb_tiles;
3001 OPJ_UINT32 l_max = 0;
3002 opj_tcp_t * l_tcp = 00;
3005 l_tcp = p_j2k->m_cp.tcps;
3006 l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th ;
3009 (i=0;i<l_nb_tiles;++i)
3011 l_max = uint_max(l_max,l_tcp->m_nb_tile_parts);
3019 * Gets the maximum size taken by the headers of the SOT.
3021 * @param p_j2k the jpeg2000 codec to use.
3023 OPJ_UINT32 j2k_get_specific_header_sizes(opj_j2k_t *p_j2k)
3025 OPJ_UINT32 l_nb_bytes = 0;
3026 OPJ_UINT32 l_nb_comps;
3027 OPJ_UINT32 l_coc_bytes,l_qcc_bytes;
3030 l_nb_comps = p_j2k->m_image->numcomps - 1;
3031 l_nb_bytes += j2k_get_max_toc_size(p_j2k);
3033 (p_j2k->m_cp.m_specific_param.m_enc.m_cinema == 0)
3035 l_coc_bytes = j2k_get_max_coc_size(p_j2k);
3036 l_nb_bytes += l_nb_comps * l_coc_bytes;
3037 l_qcc_bytes = j2k_get_max_qcc_size(p_j2k);
3038 l_nb_bytes += l_nb_comps * l_qcc_bytes;
3040 l_nb_bytes += j2k_get_max_poc_size(p_j2k);
3041 /*** DEVELOPER CORNER, Add room for your headers ***/
3049 * Writes the COC marker (Coding style component)
3051 * @param p_comp_no the index of the component to output.
3052 * @param p_stream the stream to write data to.
3053 * @param p_j2k J2K codec.
3054 * @param p_manager the user event manager.
3056 void j2k_write_coc_in_memory(
3058 OPJ_UINT32 p_comp_no,
3060 OPJ_UINT32 * p_data_written,
3061 struct opj_event_mgr * p_manager
3064 opj_cp_t *l_cp = 00;
3065 opj_tcp_t *l_tcp = 00;
3066 OPJ_UINT32 l_coc_size,l_remaining_size;
3067 OPJ_BYTE * l_current_data = 00;
3068 opj_image_t *l_image = 00;
3069 OPJ_UINT32 l_comp_room;
3072 assert(p_j2k != 00);
3073 assert(p_manager != 00);
3075 l_cp = &(p_j2k->m_cp);
3076 l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];
3077 l_image = p_j2k->m_image;
3078 l_comp_room = (l_image->numcomps <= 256) ? 1 : 2;
3080 l_coc_size = 5 + l_comp_room + j2k_get_SPCod_SPCoc_size(p_j2k,p_j2k->m_current_tile_number,p_comp_no);
3081 l_remaining_size = l_coc_size;
3083 l_current_data = p_data;
3085 opj_write_bytes(l_current_data,J2K_MS_COC,2); /* COC */
3086 l_current_data += 2;
3087 opj_write_bytes(l_current_data,l_coc_size-2,2); /* L_COC */
3088 l_current_data += 2;
3089 opj_write_bytes(l_current_data,p_comp_no, l_comp_room); /* Ccoc */
3090 l_current_data+=l_comp_room;
3091 opj_write_bytes(l_current_data, l_tcp->tccps[p_comp_no].csty, 1); /* Scoc */
3093 l_remaining_size -= (5 + l_comp_room);
3094 j2k_write_SPCod_SPCoc(p_j2k,p_j2k->m_current_tile_number,0,l_current_data,&l_remaining_size,p_manager);
3095 * p_data_written = l_coc_size;
3100 * Reads a COC marker (Coding Style Component)
3101 * @param p_header_data the data contained in the COC box.
3102 * @param p_j2k the jpeg2000 codec.
3103 * @param p_header_size the size of the data contained in the COC marker.
3104 * @param p_manager the user event manager.
3108 OPJ_BYTE * p_header_data,
3109 OPJ_UINT32 p_header_size,
3110 struct opj_event_mgr * p_manager
3113 opj_cp_t *l_cp = 00;
3114 opj_tcp_t *l_tcp = 00;
3115 opj_image_t *l_image = 00;
3116 OPJ_UINT32 l_comp_room;
3117 OPJ_UINT32 l_comp_no;
3120 assert(p_header_data != 00);
3121 assert(p_j2k != 00);
3122 assert(p_manager != 00);
3124 l_cp = &(p_j2k->m_cp);
3125 l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_DEC_STATE_TPH) ? &l_cp->tcps[p_j2k->m_current_tile_number] : p_j2k->m_specific_param.m_decoder.m_default_tcp;
3126 l_image = p_j2k->m_image;
3128 l_comp_room = l_image->numcomps <= 256 ? 1 : 2;
3129 // make sure room is sufficient
3131 (p_header_size < l_comp_room + 1)
3133 opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker\n");
3136 p_header_size -= l_comp_room + 1;
3138 opj_read_bytes(p_header_data,&l_comp_no,l_comp_room); /* Ccoc */
3139 p_header_data += l_comp_room;
3141 (l_comp_no >= l_image->numcomps)
3143 opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker (bad number of components)\n");
3146 opj_read_bytes(p_header_data,&l_tcp->tccps[l_comp_no].csty,1); /* Scoc */
3150 (! j2k_read_SPCod_SPCoc(p_j2k,l_comp_no,p_header_data,&p_header_size,p_manager))
3152 opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker\n");
3156 (p_header_size != 0)
3158 opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker\n");
3165 * Gets the size taken by writting SQcd or SQcc element, i.e. the quantization values of a band in the QCD or QCC.
3167 * @param p_tile_no the tile indix.
3168 * @param p_comp_no the component being outputted.
3169 * @param p_j2k the J2K codec.
3171 * @return the number of bytes taken by the SPCod element.
3173 OPJ_UINT32 j2k_get_SQcd_SQcc_size (
3175 OPJ_UINT32 p_tile_no,
3176 OPJ_UINT32 p_comp_no
3179 OPJ_UINT32 l_num_bands;
3181 opj_cp_t *l_cp = 00;
3182 opj_tcp_t *l_tcp = 00;
3183 opj_tccp_t *l_tccp = 00;
3186 assert(p_j2k != 00);
3188 l_cp = &(p_j2k->m_cp);
3189 l_tcp = &l_cp->tcps[p_tile_no];
3190 l_tccp = &l_tcp->tccps[p_comp_no];
3192 // preconditions again
3193 assert(p_tile_no < l_cp->tw * l_cp->th);
3194 assert(p_comp_no < p_j2k->m_image->numcomps);
3196 l_num_bands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 : (l_tccp->numresolutions * 3 - 2);
3199 (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT)
3201 return 1 + l_num_bands;
3205 return 1 + 2*l_num_bands;
3210 * Writes a SQcd or SQcc element, i.e. the quantization values of a band.
3212 * @param p_tile_no the tile to output.
3213 * @param p_comp_no the component number to output.
3214 * @param p_data the data buffer.
3215 * @param p_header_size pointer to the size of the data buffer, it is changed by the function.
3216 * @param p_j2k J2K codec.
3217 * @param p_manager the user event manager.
3220 bool j2k_write_SQcd_SQcc(
3222 OPJ_UINT32 p_tile_no,
3223 OPJ_UINT32 p_comp_no,
3225 OPJ_UINT32 * p_header_size,
3226 struct opj_event_mgr * p_manager
3229 OPJ_UINT32 l_header_size;
3230 OPJ_UINT32 l_band_no, l_num_bands;
3231 OPJ_UINT32 l_expn,l_mant;
3233 opj_cp_t *l_cp = 00;
3234 opj_tcp_t *l_tcp = 00;
3235 opj_tccp_t *l_tccp = 00;
3238 assert(p_j2k != 00);
3239 assert(p_header_size != 00);
3240 assert(p_manager != 00);
3241 assert(p_data != 00);
3243 l_cp = &(p_j2k->m_cp);
3244 l_tcp = &l_cp->tcps[p_tile_no];
3245 l_tccp = &l_tcp->tccps[p_comp_no];
3247 // preconditions again
3248 assert(p_tile_no < l_cp->tw * l_cp->th);
3249 assert(p_comp_no <p_j2k->m_image->numcomps);
3251 l_num_bands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 : (l_tccp->numresolutions * 3 - 2);
3254 (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT)
3256 l_header_size = 1 + l_num_bands;
3258 (*p_header_size < l_header_size)
3260 opj_event_msg(p_manager, EVT_ERROR, "Error writting SQcd SQcc element\n");
3263 opj_write_bytes(p_data,l_tccp->qntsty + (l_tccp->numgbits << 5), 1); /* Sqcx */
3266 (l_band_no = 0; l_band_no < l_num_bands; ++l_band_no)
3268 l_expn = l_tccp->stepsizes[l_band_no].expn;
3269 opj_write_bytes(p_data, l_expn << 3, 1); /* SPqcx_i */
3275 l_header_size = 1 + 2*l_num_bands;
3277 (*p_header_size < l_header_size)
3279 opj_event_msg(p_manager, EVT_ERROR, "Error writting SQcd SQcc element\n");
3282 opj_write_bytes(p_data,l_tccp->qntsty + (l_tccp->numgbits << 5), 1); /* Sqcx */
3285 (l_band_no = 0; l_band_no < l_num_bands; ++l_band_no)
3287 l_expn = l_tccp->stepsizes[l_band_no].expn;
3288 l_mant = l_tccp->stepsizes[l_band_no].mant;
3289 opj_write_bytes(p_data, (l_expn << 11) + l_mant, 2); /* SPqcx_i */
3293 *p_header_size = *p_header_size - l_header_size;
3298 * Reads a SQcd or SQcc element, i.e. the quantization values of a band.
3300 * @param p_comp_no the component being targeted.
3301 * @param p_header_data the data contained in the COM box.
3302 * @param p_j2k the jpeg2000 codec.
3303 * @param p_header_size the size of the data contained in the COM marker.
3304 * @param p_manager the user event manager.
3306 bool j2k_read_SQcd_SQcc(
3308 OPJ_UINT32 p_comp_no,
3309 OPJ_BYTE* p_header_data,
3310 OPJ_UINT32 * p_header_size,
3311 struct opj_event_mgr * p_manager
3315 OPJ_UINT32 l_band_no;
3316 opj_cp_t *l_cp = 00;
3317 opj_tcp_t *l_tcp = 00;
3318 opj_tccp_t *l_tccp = 00;
3319 OPJ_BYTE * l_current_ptr = 00;
3321 OPJ_UINT32 l_num_band;
3324 assert(p_j2k != 00);
3325 assert(p_manager != 00);
3326 assert(p_header_data != 00);
3328 l_cp = &(p_j2k->m_cp);
3329 l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_DEC_STATE_TPH ? &l_cp->tcps[p_j2k->m_current_tile_number] : p_j2k->m_specific_param.m_decoder.m_default_tcp;
3330 // precondition again
3331 assert(p_comp_no < p_j2k->m_image->numcomps);
3332 l_tccp = &l_tcp->tccps[p_comp_no];
3333 l_current_ptr = p_header_data;
3336 (* p_header_size < 1)
3338 opj_event_msg(p_manager, EVT_ERROR, "Error reading SQcd or SQcc element\n");
3341 * p_header_size -= 1;
3343 opj_read_bytes(l_current_ptr, &l_tmp ,1); /* Sqcx */
3346 l_tccp->qntsty = l_tmp & 0x1f;
3347 l_tccp->numgbits = l_tmp >> 5;
3349 (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT)
3355 l_num_band = (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) ? (*p_header_size) : (*p_header_size) / 2;
3359 if (p_j2k->m_cp->correct) {
3361 /* if JPWL is on, we check whether there are too many subbands */
3362 if ((numbands < 0) || (numbands >= J2K_MAXBANDS)) {
3363 opj_event_msg(p_j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
3364 "JPWL: bad number of subbands in Sqcx (%d)\n",
3367 opj_event_msg(p_j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
3370 /* we try to correct */
3372 opj_event_msg(p_j2k->cinfo, EVT_WARNING, "- trying to adjust them\n"
3373 "- setting number of bands to %d => HYPOTHESIS!!!\n",
3378 #endif /* USE_JPWL */
3380 (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT)
3383 (l_band_no = 0; l_band_no < l_num_band; l_band_no++)
3385 opj_read_bytes(l_current_ptr, &l_tmp ,1); /* SPqcx_i */
3387 l_tccp->stepsizes[l_band_no].expn = l_tmp>>3;
3388 l_tccp->stepsizes[l_band_no].mant = 0;
3390 * p_header_size = * p_header_size - l_num_band;
3395 (l_band_no = 0; l_band_no < l_num_band; l_band_no++)
3397 opj_read_bytes(l_current_ptr, &l_tmp ,2); /* SPqcx_i */
3399 l_tccp->stepsizes[l_band_no].expn = l_tmp >> 11;
3400 l_tccp->stepsizes[l_band_no].mant = l_tmp & 0x7ff;
3402 * p_header_size = * p_header_size - 2*l_num_band;
3405 /* Add Antonin : if scalar_derived -> compute other stepsizes */
3407 (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT)
3410 (l_band_no = 1; l_band_no < J2K_MAXBANDS; l_band_no++)
3412 l_tccp->stepsizes[l_band_no].expn =
3413 ((l_tccp->stepsizes[0].expn) - ((l_band_no - 1) / 3) > 0) ?
3414 (l_tccp->stepsizes[0].expn) - ((l_band_no - 1) / 3) : 0;
3415 l_tccp->stepsizes[l_band_no].mant = l_tccp->stepsizes[0].mant;
3425 * Copies the tile component parameters of all the component from the first tile component.
3427 * @param p_j2k the J2k codec.
3429 void j2k_copy_tile_quantization_parameters(
3436 opj_cp_t *l_cp = 00;
3437 opj_tcp_t *l_tcp = 00;
3438 opj_tccp_t *l_ref_tccp = 00;
3439 opj_tccp_t *l_copied_tccp = 00;
3442 assert(p_j2k != 00);
3444 l_cp = &(p_j2k->m_cp);
3445 l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_DEC_STATE_TPH ? &l_cp->tcps[p_j2k->m_current_tile_number] : p_j2k->m_specific_param.m_decoder.m_default_tcp;
3446 // precondition again
3447 l_ref_tccp = &l_tcp->tccps[0];
3448 l_copied_tccp = l_ref_tccp + 1;
3449 l_size = J2K_MAXBANDS * sizeof(opj_stepsize_t);
3452 (i=1;i<p_j2k->m_image->numcomps;++i)
3454 l_copied_tccp->qntsty = l_ref_tccp->qntsty;
3455 l_copied_tccp->numgbits = l_ref_tccp->numgbits;
3456 memcpy(l_copied_tccp->stepsizes,l_ref_tccp->stepsizes,l_size);
3464 * Writes the QCD marker (quantization default)
3466 * @param p_comp_number the index of the component to output.
3467 * @param p_stream the stream to write data to.
3468 * @param p_j2k J2K codec.
3469 * @param p_manager the user event manager.
3473 struct opj_stream_private *p_stream,
3474 struct opj_event_mgr * p_manager
3477 opj_cp_t *l_cp = 00;
3478 opj_tcp_t *l_tcp = 00;
3479 OPJ_UINT32 l_qcd_size,l_remaining_size;
3480 OPJ_BYTE * l_current_data = 00;
3483 assert(p_j2k != 00);
3484 assert(p_manager != 00);
3485 assert(p_stream != 00);
3487 l_cp = &(p_j2k->m_cp);
3488 l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];
3489 l_qcd_size = 4 + j2k_get_SQcd_SQcc_size(p_j2k,p_j2k->m_current_tile_number,0);
3490 l_remaining_size = l_qcd_size;
3493 (l_qcd_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size)
3495 p_j2k->m_specific_param.m_encoder.m_header_tile_data
3496 = (OPJ_BYTE*)opj_realloc(
3497 p_j2k->m_specific_param.m_encoder.m_header_tile_data,
3500 (! p_j2k->m_specific_param.m_encoder.m_header_tile_data)
3504 p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_qcd_size;
3506 l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
3508 opj_write_bytes(l_current_data,J2K_MS_QCD,2); /* QCD */
3509 l_current_data += 2;
3511 opj_write_bytes(l_current_data,l_qcd_size-2,2); /* L_QCD */
3512 l_current_data += 2;
3514 l_remaining_size -= 4;
3517 (! j2k_write_SQcd_SQcc(p_j2k,p_j2k->m_current_tile_number,0,l_current_data,&l_remaining_size,p_manager))
3519 opj_event_msg(p_manager, EVT_ERROR, "Error writting QCD marker\n");
3523 (l_remaining_size != 0)
3525 opj_event_msg(p_manager, EVT_ERROR, "Error writting QCD marker\n");
3530 (opj_stream_write_data(p_stream, p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_qcd_size,p_manager) != l_qcd_size)
3538 * Reads a QCD marker (Quantization defaults)
3539 * @param p_header_data the data contained in the QCD box.
3540 * @param p_j2k the jpeg2000 codec.
3541 * @param p_header_size the size of the data contained in the QCD marker.
3542 * @param p_manager the user event manager.
3546 OPJ_BYTE * p_header_data,
3547 OPJ_UINT32 p_header_size,
3548 struct opj_event_mgr * p_manager
3552 assert(p_header_data != 00);
3553 assert(p_j2k != 00);
3554 assert(p_manager != 00);
3557 (! j2k_read_SQcd_SQcc(p_j2k,0,p_header_data,&p_header_size,p_manager))
3559 opj_event_msg(p_manager, EVT_ERROR, "Error reading QCD marker\n");
3563 (p_header_size != 0)
3565 opj_event_msg(p_manager, EVT_ERROR, "Error reading QCD marker\n");
3568 j2k_copy_tile_quantization_parameters(p_j2k);
3574 * Writes the QCC marker (quantization component)
3576 * @param p_comp_no the index of the component to output.
3577 * @param p_stream the stream to write data to.
3578 * @param p_j2k J2K codec.
3579 * @param p_manager the user event manager.
3583 OPJ_UINT32 p_comp_no,
3584 struct opj_stream_private *p_stream,
3585 struct opj_event_mgr * p_manager
3588 OPJ_UINT32 l_qcc_size,l_remaining_size;
3591 assert(p_j2k != 00);
3592 assert(p_manager != 00);
3593 assert(p_stream != 00);
3595 l_qcc_size = 6 + j2k_get_SQcd_SQcc_size(p_j2k,p_j2k->m_current_tile_number,p_comp_no);
3596 l_remaining_size = l_qcc_size;
3598 (l_qcc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size)
3600 p_j2k->m_specific_param.m_encoder.m_header_tile_data
3601 = (OPJ_BYTE*)opj_realloc(
3602 p_j2k->m_specific_param.m_encoder.m_header_tile_data,
3605 (! p_j2k->m_specific_param.m_encoder.m_header_tile_data)
3609 p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_qcc_size;
3611 j2k_write_qcc_in_memory(p_j2k,p_comp_no,p_j2k->m_specific_param.m_encoder.m_header_tile_data,&l_remaining_size,p_manager);
3614 (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_qcc_size,p_manager) != l_qcc_size)
3623 * Writes the QCC marker (quantization component)
3625 * @param p_comp_no the index of the component to output.
3626 * @param p_stream the stream to write data to.
3627 * @param p_j2k J2K codec.
3628 * @param p_manager the user event manager.
3630 void j2k_write_qcc_in_memory(
3632 OPJ_UINT32 p_comp_no,
3634 OPJ_UINT32 * p_data_written,
3635 struct opj_event_mgr * p_manager
3638 OPJ_UINT32 l_qcc_size,l_remaining_size;
3639 OPJ_BYTE * l_current_data = 00;
3642 assert(p_j2k != 00);
3643 assert(p_manager != 00);
3645 l_qcc_size = 6 + j2k_get_SQcd_SQcc_size(p_j2k,p_j2k->m_current_tile_number,p_comp_no);
3646 l_remaining_size = l_qcc_size;
3648 l_current_data = p_data;
3650 opj_write_bytes(l_current_data,J2K_MS_QCC,2); /* QCC */
3651 l_current_data += 2;
3654 (p_j2k->m_image->numcomps <= 256)
3657 opj_write_bytes(l_current_data,l_qcc_size-2,2); /* L_QCC */
3658 l_current_data += 2;
3659 opj_write_bytes(l_current_data, p_comp_no, 1); /* Cqcc */
3661 // in the case only one byte is sufficient the last byte allocated is useless -> still do -6 for available
3662 l_remaining_size -= 6;
3666 opj_write_bytes(l_current_data,l_qcc_size-2,2); /* L_QCC */
3667 l_current_data += 2;
3668 opj_write_bytes(l_current_data, p_comp_no, 2); /* Cqcc */
3670 l_remaining_size -= 6;
3672 j2k_write_SQcd_SQcc(p_j2k,p_j2k->m_current_tile_number,p_comp_no,l_current_data,&l_remaining_size,p_manager);
3673 * p_data_written = l_qcc_size;
3677 * Gets the maximum size taken by a qcc.
3679 OPJ_UINT32 j2k_get_max_qcc_size (opj_j2k_t *p_j2k)
3681 return j2k_get_max_coc_size(p_j2k);
3685 * Reads a QCC marker (Quantization component)
3686 * @param p_header_data the data contained in the QCC box.
3687 * @param p_j2k the jpeg2000 codec.
3688 * @param p_header_size the size of the data contained in the QCC marker.
3689 * @param p_manager the user event manager.
3693 OPJ_BYTE * p_header_data,
3694 OPJ_UINT32 p_header_size,
3695 struct opj_event_mgr * p_manager)
3697 OPJ_UINT32 l_num_comp,l_comp_no;
3699 assert(p_header_data != 00);
3700 assert(p_j2k != 00);
3701 assert(p_manager != 00);
3703 l_num_comp = p_j2k->m_image->numcomps;
3706 if (p_j2k->m_cp->correct) {
3708 static OPJ_UINT32 backup_compno = 0;
3710 /* compno is negative or larger than the number of components!!! */
3711 if ((compno < 0) || (compno >= numcomp)) {
3712 opj_event_msg(p_j2k->cinfo, EVT_ERROR,
3713 "JPWL: bad component number in QCC (%d out of a maximum of %d)\n",
3716 opj_event_msg(p_j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
3719 /* we try to correct */
3720 compno = backup_compno % numcomp;
3721 opj_event_msg(p_j2k->cinfo, EVT_WARNING, "- trying to adjust this\n"
3722 "- setting component number to %d\n",
3726 /* keep your private count of tiles */
3729 #endif /* USE_JPWL */
3736 opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
3739 opj_read_bytes(p_header_data,&l_comp_no,1);
3748 opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
3751 opj_read_bytes(p_header_data,&l_comp_no,2);
3756 (! j2k_read_SQcd_SQcc(p_j2k,l_comp_no,p_header_data,&p_header_size,p_manager))
3758 opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
3762 (p_header_size != 0)
3764 opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
3773 * Writes the CBD marker (Component bit depth definition)
3775 * @param p_stream the stream to write data to.
3776 * @param p_j2k J2K codec.
3777 * @param p_manager the user event manager.
3781 struct opj_stream_private *p_stream,
3782 struct opj_event_mgr * p_manager
3786 OPJ_UINT32 l_cbd_size;
3787 OPJ_BYTE * l_current_data = 00;
3788 opj_image_t *l_image = 00;
3789 opj_image_comp_t * l_comp = 00;
3792 assert(p_j2k != 00);
3793 assert(p_manager != 00);
3794 assert(p_stream != 00);
3796 l_image = p_j2k->m_image;
3797 l_cbd_size = 6 + p_j2k->m_image->numcomps;
3800 (l_cbd_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size)
3802 p_j2k->m_specific_param.m_encoder.m_header_tile_data
3803 = (OPJ_BYTE*)opj_realloc(
3804 p_j2k->m_specific_param.m_encoder.m_header_tile_data,
3807 (! p_j2k->m_specific_param.m_encoder.m_header_tile_data)
3811 p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_cbd_size;
3814 l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
3815 opj_write_bytes(l_current_data,J2K_MS_CBD,2); /* CBD */
3816 l_current_data += 2;
3817 opj_write_bytes(l_current_data,l_cbd_size-2,2); /* L_CBD */
3818 l_current_data += 2;
3819 opj_write_bytes(l_current_data,l_image->numcomps, 2); /* Ncbd */
3821 l_comp = l_image->comps;
3823 (i=0;i<l_image->numcomps;++i)
3825 opj_write_bytes(l_current_data, (l_comp->sgnd << 7) | (l_comp->prec - 1), 1); /* Component bit depth */
3830 (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_cbd_size,p_manager) != l_cbd_size)
3838 * Reads a CBD marker (Component bit depth definition)
3839 * @param p_header_data the data contained in the CBD box.
3840 * @param p_j2k the jpeg2000 codec.
3841 * @param p_header_size the size of the data contained in the CBD marker.
3842 * @param p_manager the user event manager.
3846 OPJ_BYTE * p_header_data,
3847 OPJ_UINT32 p_header_size,
3848 struct opj_event_mgr * p_manager)
3850 OPJ_UINT32 l_nb_comp,l_num_comp;
3851 OPJ_UINT32 l_comp_def;
3853 opj_image_comp_t * l_comp = 00;
3856 assert(p_header_data != 00);
3857 assert(p_j2k != 00);
3858 assert(p_manager != 00);
3860 l_num_comp = p_j2k->m_image->numcomps;
3863 (p_header_size != (p_j2k->m_image->numcomps + 2))
3865 opj_event_msg(p_manager, EVT_ERROR, "Crror reading CBD marker\n");
3868 opj_read_bytes(p_header_data,&l_nb_comp,2); /* Ncbd */
3871 (l_nb_comp != l_num_comp)
3873 opj_event_msg(p_manager, EVT_ERROR, "Crror reading CBD marker\n");
3877 l_comp = p_j2k->m_image->comps;
3879 (i=0;i<l_num_comp;++i)
3881 opj_read_bytes(p_header_data,&l_comp_def,1); /* Component bit depth */
3883 l_comp->sgnd = (l_comp_def>>7) & 1;
3884 l_comp->prec = (l_comp_def&0x7f) + 1;
3891 * Writes the MCC marker (Multiple Component Collection)
3893 * @param p_stream the stream to write data to.
3894 * @param p_j2k J2K codec.
3895 * @param p_manager the user event manager.
3897 bool j2k_write_mcc_record(
3899 struct opj_simple_mcc_decorrelation_data * p_mcc_record,
3900 struct opj_stream_private *p_stream,
3901 struct opj_event_mgr * p_manager
3905 OPJ_UINT32 l_mcc_size;
3906 OPJ_BYTE * l_current_data = 00;
3907 OPJ_UINT32 l_nb_bytes_for_comp;
3912 assert(p_j2k != 00);
3913 assert(p_manager != 00);
3914 assert(p_stream != 00);
3917 (p_mcc_record->m_nb_comps > 255 )
3919 l_nb_bytes_for_comp = 2;
3924 l_nb_bytes_for_comp = 1;
3928 l_mcc_size = p_mcc_record->m_nb_comps * 2 * l_nb_bytes_for_comp + 19;
3930 (l_mcc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size)
3932 p_j2k->m_specific_param.m_encoder.m_header_tile_data
3933 = (OPJ_BYTE*)opj_realloc(
3934 p_j2k->m_specific_param.m_encoder.m_header_tile_data,
3937 (! p_j2k->m_specific_param.m_encoder.m_header_tile_data)
3941 p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_mcc_size;
3943 l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
3944 opj_write_bytes(l_current_data,J2K_MS_MCC,2); /* MCC */
3945 l_current_data += 2;
3946 opj_write_bytes(l_current_data,l_mcc_size-2,2); /* Lmcc */
3947 l_current_data += 2;
3950 opj_write_bytes(l_current_data,0,2); /* Zmcc */
3951 l_current_data += 2;
3952 opj_write_bytes(l_current_data,p_mcc_record->m_index,1); /* Imcc -> no need for other values, take the first */
3954 /* only one marker atm */
3955 opj_write_bytes(l_current_data,0,2); /* Ymcc */
3957 opj_write_bytes(l_current_data,1,2); /* Qmcc -> number of collections -> 1 */
3959 opj_write_bytes(l_current_data,0x1,1); /* Xmcci type of component transformation -> array based decorrelation */
3962 opj_write_bytes(l_current_data,p_mcc_record->m_nb_comps | l_mask,2); /* Nmcci number of input components involved and size for each component offset = 8 bits */
3966 (i=0;i<p_mcc_record->m_nb_comps;++i)
3968 opj_write_bytes(l_current_data,i,l_nb_bytes_for_comp); /* Cmccij Component offset*/
3969 l_current_data+=l_nb_bytes_for_comp;
3972 opj_write_bytes(l_current_data,p_mcc_record->m_nb_comps|l_mask,2); /* Mmcci number of output components involved and size for each component offset = 8 bits */
3975 (i=0;i<p_mcc_record->m_nb_comps;++i)
3977 opj_write_bytes(l_current_data,i,l_nb_bytes_for_comp); /* Wmccij Component offset*/
3978 l_current_data+=l_nb_bytes_for_comp;
3980 l_tmcc = ((!p_mcc_record->m_is_irreversible)&1)<<16;
3982 (p_mcc_record->m_decorrelation_array)
3984 l_tmcc |= p_mcc_record->m_decorrelation_array->m_index;
3987 (p_mcc_record->m_offset_array)
3989 l_tmcc |= ((p_mcc_record->m_offset_array->m_index)<<8);
3991 opj_write_bytes(l_current_data,l_tmcc,3); /* Tmcci : use MCT defined as number 1 and irreversible array based. */
3994 (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_mcc_size,p_manager) != l_mcc_size)
4003 * Reads a MCC marker (Multiple Component Collection)
4005 * @param p_header_data the data contained in the MCC box.
4006 * @param p_j2k the jpeg2000 codec.
4007 * @param p_header_size the size of the data contained in the MCC marker.
4008 * @param p_manager the user event manager.
4012 OPJ_BYTE * p_header_data,
4013 OPJ_UINT32 p_header_size,
4014 struct opj_event_mgr * p_manager
4021 opj_simple_mcc_decorrelation_data_t * l_mcc_record;
4022 opj_mct_data_t * l_mct_data;
4023 OPJ_UINT32 l_nb_collections;
4024 OPJ_UINT32 l_nb_comps;
4025 OPJ_UINT32 l_nb_bytes_by_comp;
4029 assert(p_header_data != 00);
4030 assert(p_j2k != 00);
4031 assert(p_manager != 00);
4033 l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_DEC_STATE_TPH ? &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] : p_j2k->m_specific_param.m_decoder.m_default_tcp;
4038 opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
4043 opj_read_bytes(p_header_data,&l_tmp,2); /* Zmcc */
4048 opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge multiple data spanning\n");
4054 opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
4057 opj_read_bytes(p_header_data,&l_indix,1); /* Imcc -> no need for other values, take the first */
4060 l_mcc_record = l_tcp->m_mcc_records;
4062 (i=0;i<l_tcp->m_nb_mcc_records;++i)
4065 (l_mcc_record->m_index == l_indix)
4073 (i == l_tcp->m_nb_mcc_records)
4076 (l_tcp->m_nb_mcc_records == l_tcp->m_nb_max_mcc_records)
4078 l_tcp->m_nb_max_mcc_records += J2K_MCC_DEFAULT_NB_RECORDS;
4079 l_tcp->m_mcc_records = (opj_simple_mcc_decorrelation_data_t*)
4080 opj_realloc(l_tcp->m_mcc_records,l_tcp->m_nb_max_mcc_records * sizeof(opj_simple_mcc_decorrelation_data_t));
4082 (! l_tcp->m_mcc_records)
4084 opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
4087 l_mcc_record = l_tcp->m_mcc_records + l_tcp->m_nb_mcc_records;
4088 memset(l_mcc_record,0,(l_tcp->m_nb_max_mcc_records-l_tcp->m_nb_mcc_records) * sizeof(opj_simple_mcc_decorrelation_data_t));
4090 l_mcc_record = l_tcp->m_mcc_records + l_tcp->m_nb_mcc_records;
4092 l_mcc_record->m_index = l_indix;
4094 /* only one marker atm */
4095 opj_read_bytes(p_header_data,&l_tmp,2); /* Ymcc */
4100 opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge multiple data spanning\n");
4103 opj_read_bytes(p_header_data,&l_nb_collections,2); /* Qmcc -> number of collections -> 1 */
4106 (l_nb_collections > 1)
4108 opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge multiple collections\n");
4113 (i=0;i<l_nb_collections;++i)
4118 opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
4121 opj_read_bytes(p_header_data,&l_tmp,1); /* Xmcci type of component transformation -> array based decorrelation */
4126 opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge collections other than array decorrelation\n");
4129 opj_read_bytes(p_header_data,&l_nb_comps,2);
4132 l_nb_bytes_by_comp = 1 + (l_nb_comps>>15);
4133 l_mcc_record->m_nb_comps = l_nb_comps & 0x7fff;
4135 (p_header_size < (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 2))
4137 opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
4140 p_header_size -= (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 2);
4142 (j=0;j<l_mcc_record->m_nb_comps;++j)
4144 opj_read_bytes(p_header_data,&l_tmp,l_nb_bytes_by_comp); /* Cmccij Component offset*/
4145 p_header_data+=l_nb_bytes_by_comp;
4149 opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge collections with indix shuffle\n");
4153 opj_read_bytes(p_header_data,&l_nb_comps,2);
4155 l_nb_bytes_by_comp = 1 + (l_nb_comps>>15);
4156 l_nb_comps &= 0x7fff;
4158 (l_nb_comps != l_mcc_record->m_nb_comps)
4160 opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge collections without same number of indixes\n");
4164 (p_header_size < (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 3))
4166 opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
4169 p_header_size -= (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 3);
4171 (j=0;j<l_mcc_record->m_nb_comps;++j)
4173 opj_read_bytes(p_header_data,&l_tmp,l_nb_bytes_by_comp); /* Wmccij Component offset*/
4174 p_header_data+=l_nb_bytes_by_comp;
4178 opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge collections with indix shuffle\n");
4182 opj_read_bytes(p_header_data,&l_tmp,3); /* Wmccij Component offset*/
4184 l_mcc_record->m_is_irreversible = ! ((l_tmp>>16) & 1);
4185 l_mcc_record->m_decorrelation_array = 00;
4186 l_mcc_record->m_offset_array = 00;
4187 l_indix = l_tmp & 0xff;
4191 l_mct_data = l_tcp->m_mct_records;
4193 (j=0;j<l_tcp->m_nb_mct_records;++j)
4196 (l_mct_data->m_index == l_indix)
4198 l_mcc_record->m_decorrelation_array = l_mct_data;
4204 (l_mcc_record->m_decorrelation_array == 00)
4206 opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
4210 l_indix = (l_tmp >> 8) & 0xff;
4214 l_mct_data = l_tcp->m_mct_records;
4216 (j=0;j<l_tcp->m_nb_mct_records;++j)
4219 (l_mct_data->m_index == l_indix)
4221 l_mcc_record->m_offset_array = l_mct_data;
4227 (l_mcc_record->m_offset_array == 00)
4229 opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
4235 (p_header_size != 0)
4237 opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
4240 ++l_tcp->m_nb_mcc_records;
4245 * Writes the MCT marker (Multiple Component Transform)
4247 * @param p_stream the stream to write data to.
4248 * @param p_j2k J2K codec.
4249 * @param p_manager the user event manager.
4251 bool j2k_write_mct_record(
4253 opj_mct_data_t * p_mct_record,
4254 struct opj_stream_private *p_stream,
4255 struct opj_event_mgr * p_manager
4258 OPJ_UINT32 l_mct_size;
4259 OPJ_BYTE * l_current_data = 00;
4263 assert(p_j2k != 00);
4264 assert(p_manager != 00);
4265 assert(p_stream != 00);
4267 l_mct_size = 10 + p_mct_record->m_data_size;
4269 (l_mct_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size)
4271 p_j2k->m_specific_param.m_encoder.m_header_tile_data
4272 = (OPJ_BYTE*)opj_realloc(
4273 p_j2k->m_specific_param.m_encoder.m_header_tile_data,
4276 (! p_j2k->m_specific_param.m_encoder.m_header_tile_data)
4280 p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_mct_size;
4283 l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
4285 opj_write_bytes(l_current_data,J2K_MS_MCT,2); /* MCT */
4286 l_current_data += 2;
4287 opj_write_bytes(l_current_data,l_mct_size-2,2); /* Lmct */
4288 l_current_data += 2;
4289 opj_write_bytes(l_current_data,0,2); /* Zmct */
4290 l_current_data += 2;
4291 /* only one marker atm */
4292 l_tmp = (p_mct_record->m_index & 0xff) | (p_mct_record->m_array_type << 8) | (p_mct_record->m_element_type << 10);
4293 opj_write_bytes(l_current_data,l_tmp,2);
4294 l_current_data += 2;
4295 opj_write_bytes(l_current_data,0,2); /* Ymct */
4298 memcpy(l_current_data,p_mct_record->m_data,p_mct_record->m_data_size);
4300 (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_mct_size,p_manager) != l_mct_size)
4308 * Reads a MCT marker (Multiple Component Transform)
4310 * @param p_header_data the data contained in the MCT box.
4311 * @param p_j2k the jpeg2000 codec.
4312 * @param p_header_size the size of the data contained in the MCT marker.
4313 * @param p_manager the user event manager.
4317 OPJ_BYTE * p_header_data,
4318 OPJ_UINT32 p_header_size,
4319 struct opj_event_mgr * p_manager
4323 opj_tcp_t *l_tcp = 00;
4326 opj_mct_data_t * l_mct_data;
4329 assert(p_header_data != 00);
4330 assert(p_j2k != 00);
4332 l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_DEC_STATE_TPH ? &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] : p_j2k->m_specific_param.m_decoder.m_default_tcp;
4337 opj_event_msg(p_manager, EVT_ERROR, "Error reading MCT marker\n");
4341 opj_read_bytes(p_header_data,&l_tmp,2); /* Zmct */
4346 opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge mct data within multiple MCT records\n");
4350 (p_header_size <= 6)
4352 opj_event_msg(p_manager, EVT_ERROR, "Error reading MCT marker\n");
4355 opj_read_bytes(p_header_data,&l_tmp,2); /* Imct -> no need for other values, take the first, type is double with decorrelation x0000 1101 0000 0000*/
4358 l_indix = l_tmp & 0xff;
4359 l_mct_data = l_tcp->m_mct_records;
4361 (i=0;i<l_tcp->m_nb_mct_records;++i)
4364 (l_mct_data->m_index == l_indix)
4372 (i == l_tcp->m_nb_mct_records)
4375 (l_tcp->m_nb_mct_records == l_tcp->m_nb_max_mct_records)
4377 l_tcp->m_nb_max_mct_records += J2K_MCT_DEFAULT_NB_RECORDS;
4378 l_tcp->m_mct_records = (opj_mct_data_t*)opj_realloc(l_tcp->m_mct_records,l_tcp->m_nb_max_mct_records * sizeof(opj_mct_data_t));
4380 (! l_tcp->m_mct_records)
4382 opj_event_msg(p_manager, EVT_ERROR, "Error reading MCT marker\n");
4385 l_mct_data = l_tcp->m_mct_records + l_tcp->m_nb_mct_records;
4386 memset(l_mct_data ,0,(l_tcp->m_nb_max_mct_records - l_tcp->m_nb_mct_records) * sizeof(opj_mct_data_t));
4388 l_mct_data = l_tcp->m_mct_records + l_tcp->m_nb_mct_records;
4391 (l_mct_data->m_data)
4393 opj_free(l_mct_data->m_data);
4394 l_mct_data->m_data = 00;
4396 l_mct_data->m_index = l_indix;
4397 l_mct_data->m_array_type = (J2K_MCT_ARRAY_TYPE)((l_tmp >> 8) & 3);
4398 l_mct_data->m_element_type = (J2K_MCT_ELEMENT_TYPE)((l_tmp >> 10) & 3);
4400 opj_read_bytes(p_header_data,&l_tmp,2); /* Ymct */
4405 opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge multiple MCT markers\n");
4409 l_mct_data->m_data = (OPJ_BYTE*)opj_malloc(p_header_size);
4411 (! l_mct_data->m_data)
4413 opj_event_msg(p_manager, EVT_ERROR, "Error reading MCT marker\n");
4416 memcpy(l_mct_data->m_data,p_header_data,p_header_size);
4417 l_mct_data->m_data_size = p_header_size;
4418 ++l_tcp->m_nb_mct_records;
4422 bool j2k_setup_mct_encoding (opj_tcp_t * p_tcp,opj_image_t * p_image)
4425 OPJ_UINT32 l_indix = 1;
4426 opj_mct_data_t * l_mct_deco_data = 00,* l_mct_offset_data = 00;
4427 opj_simple_mcc_decorrelation_data_t * l_mcc_data;
4428 OPJ_UINT32 l_mct_size,l_nb_elem;
4429 OPJ_FLOAT32 * l_data, * l_current_data;
4430 opj_tccp_t * l_tccp;
4433 assert(p_tcp != 00);
4442 (p_tcp->m_mct_decoding_matrix)
4445 (p_tcp->m_nb_mct_records == p_tcp->m_nb_max_mct_records)
4447 p_tcp->m_nb_max_mct_records += J2K_MCT_DEFAULT_NB_RECORDS;
4448 p_tcp->m_mct_records = (opj_mct_data_t*)opj_realloc(p_tcp->m_mct_records,p_tcp->m_nb_max_mct_records * sizeof(opj_mct_data_t));
4450 (! p_tcp->m_mct_records)
4454 l_mct_deco_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;
4455 memset(l_mct_deco_data ,0,(p_tcp->m_nb_max_mct_records - p_tcp->m_nb_mct_records) * sizeof(opj_mct_data_t));
4457 l_mct_deco_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;
4460 (l_mct_deco_data->m_data)
4462 opj_free(l_mct_deco_data->m_data);
4463 l_mct_deco_data->m_data = 00;
4465 l_mct_deco_data->m_index = l_indix++;
4466 l_mct_deco_data->m_array_type = MCT_TYPE_DECORRELATION;
4467 l_mct_deco_data->m_element_type = MCT_TYPE_FLOAT;
4468 l_nb_elem = p_image->numcomps * p_image->numcomps;
4469 l_mct_size = l_nb_elem * MCT_ELEMENT_SIZE[l_mct_deco_data->m_element_type];
4470 l_mct_deco_data->m_data = (OPJ_BYTE*)opj_malloc(l_mct_size );
4472 (! l_mct_deco_data->m_data)
4476 j2k_mct_write_functions_from_float[l_mct_deco_data->m_element_type](p_tcp->m_mct_decoding_matrix,l_mct_deco_data->m_data,l_nb_elem);
4477 l_mct_deco_data->m_data_size = l_mct_size;
4478 ++p_tcp->m_nb_mct_records;
4482 (p_tcp->m_nb_mct_records == p_tcp->m_nb_max_mct_records)
4484 p_tcp->m_nb_max_mct_records += J2K_MCT_DEFAULT_NB_RECORDS;
4485 p_tcp->m_mct_records = (opj_mct_data_t*)opj_realloc(p_tcp->m_mct_records,p_tcp->m_nb_max_mct_records * sizeof(opj_mct_data_t));
4487 (! p_tcp->m_mct_records)
4491 l_mct_offset_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;
4492 memset(l_mct_offset_data ,0,(p_tcp->m_nb_max_mct_records - p_tcp->m_nb_mct_records) * sizeof(opj_mct_data_t));
4496 l_mct_deco_data = l_mct_offset_data - 1;
4499 l_mct_offset_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;
4501 (l_mct_offset_data->m_data)
4503 opj_free(l_mct_offset_data->m_data);
4504 l_mct_offset_data->m_data = 00;
4507 l_mct_offset_data->m_index = l_indix++;
4508 l_mct_offset_data->m_array_type = MCT_TYPE_OFFSET;
4509 l_mct_offset_data->m_element_type = MCT_TYPE_FLOAT;
4510 l_nb_elem = p_image->numcomps;
4511 l_mct_size = l_nb_elem * MCT_ELEMENT_SIZE[l_mct_offset_data->m_element_type];
4512 l_mct_offset_data->m_data = (OPJ_BYTE*)opj_malloc(l_mct_size );
4514 (! l_mct_offset_data->m_data)
4518 l_data = (OPJ_FLOAT32*)opj_malloc(l_nb_elem * sizeof(OPJ_FLOAT32));
4522 opj_free(l_mct_offset_data->m_data);
4523 l_mct_offset_data->m_data = 00;
4526 l_tccp = p_tcp->tccps;
4527 l_current_data = l_data;
4529 (i=0;i<l_nb_elem;++i)
4531 *(l_current_data++) = (OPJ_FLOAT32) (l_tccp->m_dc_level_shift);
4534 j2k_mct_write_functions_from_float[l_mct_offset_data->m_element_type](l_data,l_mct_offset_data->m_data,l_nb_elem);
4536 l_mct_offset_data->m_data_size = l_mct_size;
4537 ++p_tcp->m_nb_mct_records;
4540 (p_tcp->m_nb_mcc_records == p_tcp->m_nb_max_mcc_records)
4542 p_tcp->m_nb_max_mcc_records += J2K_MCT_DEFAULT_NB_RECORDS;
4543 p_tcp->m_mcc_records = (opj_simple_mcc_decorrelation_data_t*)
4544 opj_realloc(p_tcp->m_mcc_records,p_tcp->m_nb_max_mcc_records * sizeof(opj_simple_mcc_decorrelation_data_t));
4546 (! p_tcp->m_mcc_records)
4550 l_mcc_data = p_tcp->m_mcc_records + p_tcp->m_nb_mcc_records;
4551 memset(l_mcc_data ,0,(p_tcp->m_nb_max_mcc_records - p_tcp->m_nb_mcc_records) * sizeof(opj_simple_mcc_decorrelation_data_t));
4554 l_mcc_data = p_tcp->m_mcc_records + p_tcp->m_nb_mcc_records;
4555 l_mcc_data->m_decorrelation_array = l_mct_deco_data;
4556 l_mcc_data->m_is_irreversible = 1;
4557 l_mcc_data->m_nb_comps = p_image->numcomps;
4558 l_mcc_data->m_index = l_indix++;
4559 l_mcc_data->m_offset_array = l_mct_offset_data;
4560 ++p_tcp->m_nb_mcc_records;
4565 * Writes the MCO marker (Multiple component transformation ordering)
4567 * @param p_stream the stream to write data to.
4568 * @param p_j2k J2K codec.
4569 * @param p_manager the user event manager.
4573 struct opj_stream_private *p_stream,
4574 struct opj_event_mgr * p_manager
4577 OPJ_BYTE * l_current_data = 00;
4578 OPJ_UINT32 l_mco_size;
4579 opj_tcp_t * l_tcp = 00;
4580 opj_simple_mcc_decorrelation_data_t * l_mcc_record;
4584 assert(p_j2k != 00);
4585 assert(p_manager != 00);
4586 assert(p_stream != 00);
4588 l_tcp =&(p_j2k->m_cp.tcps[p_j2k->m_current_tile_number]);
4589 l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
4590 l_mco_size = 5 + l_tcp->m_nb_mcc_records;
4592 (l_mco_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size)
4594 p_j2k->m_specific_param.m_encoder.m_header_tile_data
4595 = (OPJ_BYTE*)opj_realloc(
4596 p_j2k->m_specific_param.m_encoder.m_header_tile_data,
4599 (! p_j2k->m_specific_param.m_encoder.m_header_tile_data)
4603 p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_mco_size;
4606 opj_write_bytes(l_current_data,J2K_MS_MCO,2); /* MCO */
4607 l_current_data += 2;
4608 opj_write_bytes(l_current_data,l_mco_size-2,2); /* Lmco */
4609 l_current_data += 2;
4610 opj_write_bytes(l_current_data,l_tcp->m_nb_mcc_records,1); /* Nmco : only one tranform stage*/
4613 l_mcc_record = l_tcp->m_mcc_records;
4615 (i=0;i<l_tcp->m_nb_mcc_records;++i)
4617 opj_write_bytes(l_current_data,l_mcc_record->m_index,1); /* Imco -> use the mcc indicated by 1*/
4623 (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_mco_size,p_manager) != l_mco_size)
4630 * Reads a MCO marker (Multiple Component Transform Ordering)
4632 * @param p_header_data the data contained in the MCO box.
4633 * @param p_j2k the jpeg2000 codec.
4634 * @param p_header_size the size of the data contained in the MCO marker.
4635 * @param p_manager the user event manager.
4639 OPJ_BYTE * p_header_data,
4640 OPJ_UINT32 p_header_size,
4641 struct opj_event_mgr * p_manager
4644 OPJ_UINT32 l_tmp, i;
4645 OPJ_UINT32 l_nb_stages;
4647 opj_tccp_t * l_tccp;
4648 opj_image_t * l_image;
4649 opj_image_comp_t * l_img_comp;
4652 assert(p_header_data != 00);
4653 assert(p_j2k != 00);
4654 assert(p_manager != 00);
4656 l_image = p_j2k->m_image;
4657 l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_DEC_STATE_TPH ? &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] : p_j2k->m_specific_param.m_decoder.m_default_tcp;
4661 opj_event_msg(p_manager, EVT_ERROR, "Error reading MCO marker\n");
4665 opj_read_bytes(p_header_data,&l_nb_stages,1); /* Nmco : only one tranform stage*/
4670 opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge multiple transformation stages.\n");
4674 (p_header_size != l_nb_stages + 1)
4676 opj_event_msg(p_manager, EVT_WARNING, "Error reading MCO marker\n");
4680 l_tccp = l_tcp->tccps;
4681 l_img_comp = l_image->comps;
4683 (i=0;i<l_image->numcomps;++i)
4685 l_tccp->m_dc_level_shift = 0;
4689 (l_tcp->m_mct_decoding_matrix)
4691 opj_free(l_tcp->m_mct_decoding_matrix);
4692 l_tcp->m_mct_decoding_matrix = 00;
4696 (i=0;i<l_nb_stages;++i)
4698 opj_read_bytes(p_header_data,&l_tmp,1);
4701 (! j2k_add_mct(l_tcp,p_j2k->m_image,l_tmp))
4709 bool j2k_add_mct(opj_tcp_t * p_tcp,opj_image_t * p_image, OPJ_UINT32 p_index)
4712 opj_simple_mcc_decorrelation_data_t * l_mcc_record;
4713 opj_mct_data_t * l_deco_array, * l_offset_array;
4714 OPJ_UINT32 l_data_size,l_mct_size, l_offset_size;
4715 OPJ_UINT32 l_nb_elem;
4716 OPJ_UINT32 * l_offset_data, * l_current_offset_data;
4717 opj_tccp_t * l_tccp;
4721 assert(p_tcp != 00);
4723 l_mcc_record = p_tcp->m_mcc_records;
4725 (i=0;i<p_tcp->m_nb_mcc_records;++i)
4728 (l_mcc_record->m_index == p_index)
4734 (i==p_tcp->m_nb_mcc_records)
4736 /** element discarded **/
4740 (l_mcc_record->m_nb_comps != p_image->numcomps)
4742 /** do not support number of comps != image */
4745 l_deco_array = l_mcc_record->m_decorrelation_array;
4749 l_data_size = MCT_ELEMENT_SIZE[l_deco_array->m_element_type] * p_image->numcomps * p_image->numcomps;
4751 (l_deco_array->m_data_size != l_data_size)
4755 l_nb_elem = p_image->numcomps * p_image->numcomps;
4756 l_mct_size = l_nb_elem * sizeof(OPJ_FLOAT32);
4757 p_tcp->m_mct_decoding_matrix = (OPJ_FLOAT32*)opj_malloc(l_mct_size);
4759 (! p_tcp->m_mct_decoding_matrix )
4763 j2k_mct_read_functions_to_float[l_deco_array->m_element_type](l_deco_array->m_data,p_tcp->m_mct_decoding_matrix,l_nb_elem);
4765 l_offset_array = l_mcc_record->m_offset_array;
4769 l_data_size = MCT_ELEMENT_SIZE[l_offset_array->m_element_type] * p_image->numcomps;
4771 (l_offset_array->m_data_size != l_data_size)
4775 l_nb_elem = p_image->numcomps;
4776 l_offset_size = l_nb_elem * sizeof(OPJ_UINT32);
4777 l_offset_data = (OPJ_UINT32*)opj_malloc(l_offset_size);
4783 j2k_mct_read_functions_to_int32[l_offset_array->m_element_type](l_offset_array->m_data,l_offset_data,l_nb_elem);
4784 l_tccp = p_tcp->tccps;
4785 l_current_offset_data = l_offset_data;
4787 (i=0;i<p_image->numcomps;++i)
4789 l_tccp->m_dc_level_shift = *(l_current_offset_data++);
4792 opj_free(l_offset_data);
4798 * Writes the MCT marker (Multiple Component Transform)
4800 * @param p_stream the stream to write data to.
4801 * @param p_j2k J2K codec.
4802 * @param p_manager the user event manager.
4804 bool j2k_write_mct_data_group(
4806 struct opj_stream_private *p_stream,
4807 struct opj_event_mgr * p_manager
4811 opj_simple_mcc_decorrelation_data_t * l_mcc_record;
4812 opj_mct_data_t * l_mct_record;
4816 assert(p_j2k != 00);
4817 assert(p_stream != 00);
4818 assert(p_manager != 00);
4821 (! j2k_write_cbd(p_j2k,p_stream,p_manager))
4825 l_tcp = &(p_j2k->m_cp.tcps[p_j2k->m_current_tile_number]);
4826 l_mct_record = l_tcp->m_mct_records;
4828 (i=0;i<l_tcp->m_nb_mct_records;++i)
4831 (! j2k_write_mct_record(p_j2k,l_mct_record,p_stream,p_manager))
4837 l_mcc_record = l_tcp->m_mcc_records;
4839 (i=0;i<l_tcp->m_nb_mcc_records;++i)
4842 (! j2k_write_mcc_record(p_j2k,l_mcc_record,p_stream,p_manager))
4849 (! j2k_write_mco(p_j2k,p_stream,p_manager))
4858 * Writes the POC marker (Progression Order Change)
4860 * @param p_stream the stream to write data to.
4861 * @param p_j2k J2K codec.
4862 * @param p_manager the user event manager.
4866 struct opj_stream_private *p_stream,
4867 struct opj_event_mgr * p_manager
4870 OPJ_UINT32 l_nb_comp;
4871 OPJ_UINT32 l_nb_poc;
4872 OPJ_UINT32 l_poc_size;
4873 OPJ_UINT32 l_written_size = 0;
4874 opj_tcp_t *l_tcp = 00;
4875 opj_tccp_t *l_tccp = 00;
4876 OPJ_UINT32 l_poc_room;
4879 assert(p_j2k != 00);
4880 assert(p_manager != 00);
4881 assert(p_stream != 00);
4883 l_tcp = &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number];
4884 l_tccp = &l_tcp->tccps[0];
4885 l_nb_comp = p_j2k->m_image->numcomps;
4886 l_nb_poc = 1 + l_tcp->numpocs;
4896 l_poc_size = 4 + (5 + 2 * l_poc_room) * l_nb_poc;
4898 (l_poc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size)
4900 p_j2k->m_specific_param.m_encoder.m_header_tile_data
4901 = (OPJ_BYTE*)opj_realloc(
4902 p_j2k->m_specific_param.m_encoder.m_header_tile_data,
4905 (! p_j2k->m_specific_param.m_encoder.m_header_tile_data)
4909 p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_poc_size;
4912 j2k_write_poc_in_memory(p_j2k,p_j2k->m_specific_param.m_encoder.m_header_tile_data,&l_written_size,p_manager);
4915 (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_poc_size,p_manager) != l_poc_size)
4926 * @param p_stream the stream to write data to.
4927 * @param p_j2k J2K codec.
4928 * @param p_manager the user event manager.
4932 struct opj_stream_private *p_stream,
4933 struct opj_event_mgr * p_manager
4936 opj_codestream_info_t * l_info = 00;
4939 assert(p_j2k != 00);
4940 assert(p_manager != 00);
4941 assert(p_stream != 00);
4943 l_info = p_j2k->cstr_info;
4947 l_info->codestream_size = opj_stream_tell(p_stream);
4949 /* The following adjustment is done to adjust the codestream size */
4950 /* if SOD is not at 0 in the buffer. Useful in case of JP2, where */
4951 /* the first bunch of bytes is not in the codestream */
4952 l_info->codestream_size -= l_info->main_head_start;
4958 preparation of JPWL marker segments
4962 /* encode according to JPWL */
4963 jpwl_encode(p_j2k, p_stream, image);
4966 #endif /* USE_JPWL */
4972 * Gets the maximum size taken by the writting of a POC.
4974 OPJ_UINT32 j2k_get_max_poc_size(opj_j2k_t *p_j2k)
4976 opj_tcp_t * l_tcp = 00;
4977 OPJ_UINT32 l_nb_tiles = 0;
4978 OPJ_UINT32 l_max_poc = 0;
4981 l_tcp = p_j2k->m_cp.tcps;
4982 l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
4985 (i=0;i<l_nb_tiles;++i)
4987 l_max_poc = uint_max(l_max_poc,l_tcp->numpocs);
4991 return 4 + 9 * l_max_poc;
4996 * Writes the POC marker (Progression Order Change)
4998 * @param p_stream the stream to write data to.
4999 * @param p_j2k J2K codec.
5000 * @param p_manager the user event manager.
5002 void j2k_write_poc_in_memory(
5005 OPJ_UINT32 * p_data_written,
5006 struct opj_event_mgr * p_manager
5010 OPJ_BYTE * l_current_data = 00;
5011 OPJ_UINT32 l_nb_comp;
5012 OPJ_UINT32 l_nb_poc;
5013 OPJ_UINT32 l_poc_size;
5014 opj_image_t *l_image = 00;
5015 opj_tcp_t *l_tcp = 00;
5016 opj_tccp_t *l_tccp = 00;
5017 opj_poc_t *l_current_poc = 00;
5018 OPJ_UINT32 l_poc_room;
5021 assert(p_j2k != 00);
5022 assert(p_manager != 00);
5024 l_tcp = &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number];
5025 l_tccp = &l_tcp->tccps[0];
5026 l_image = p_j2k->m_image;
5027 l_nb_comp = l_image->numcomps;
5028 l_nb_poc = 1 + l_tcp->numpocs;
5038 l_poc_size = 4 + (5 + 2 * l_poc_room) * l_nb_poc;
5040 l_current_data = p_data;
5042 opj_write_bytes(l_current_data,J2K_MS_POC,2); /* POC */
5043 l_current_data += 2;
5044 opj_write_bytes(l_current_data,l_poc_size-2,2); /* Lpoc */
5045 l_current_data += 2;
5047 l_current_poc = l_tcp->pocs;
5049 (i = 0; i < l_nb_poc; ++i)
5051 opj_write_bytes(l_current_data,l_current_poc->resno0,1); /* RSpoc_i */
5053 opj_write_bytes(l_current_data,l_current_poc->compno0,l_poc_room); /* CSpoc_i */
5054 l_current_data+=l_poc_room;
5055 opj_write_bytes(l_current_data,l_current_poc->layno1,2); /* LYEpoc_i */
5057 opj_write_bytes(l_current_data,l_current_poc->resno1,1); /* REpoc_i */
5059 opj_write_bytes(l_current_data,l_current_poc->compno1,l_poc_room); /* CEpoc_i */
5060 l_current_data+=l_poc_room;
5061 opj_write_bytes(l_current_data,l_current_poc->prg,1); /* Ppoc_i */
5064 /* change the value of the max layer according to the actual number of layers in the file, components and resolutions*/
5065 l_current_poc->layno1 = int_min(l_current_poc->layno1, l_tcp->numlayers);
5066 l_current_poc->resno1 = int_min(l_current_poc->resno1, l_tccp->numresolutions);
5067 l_current_poc->compno1 = int_min(l_current_poc->compno1, l_nb_comp);
5070 * p_data_written = l_poc_size;
5075 * Reads a POC marker (Progression Order Change)
5077 * @param p_header_data the data contained in the POC box.
5078 * @param p_j2k the jpeg2000 codec.
5079 * @param p_header_size the size of the data contained in the POC marker.
5080 * @param p_manager the user event manager.
5084 OPJ_BYTE * p_header_data,
5085 OPJ_UINT32 p_header_size,
5086 struct opj_event_mgr * p_manager
5090 OPJ_UINT32 l_nb_comp;
5091 opj_image_t * l_image = 00;
5092 OPJ_UINT32 l_old_poc_nb,l_current_poc_nb,l_current_poc_remaining;
5093 OPJ_UINT32 l_chunk_size;
5096 opj_cp_t *l_cp = 00;
5097 opj_tcp_t *l_tcp = 00;
5098 opj_poc_t *l_current_poc = 00;
5099 OPJ_UINT32 l_comp_room;
5102 assert(p_header_data != 00);
5103 assert(p_j2k != 00);
5104 assert(p_manager != 00);
5106 l_image = p_j2k->m_image;
5107 l_nb_comp = l_image->numcomps;
5117 l_chunk_size = 5 + 2 * l_comp_room;
5118 l_current_poc_nb = p_header_size / l_chunk_size;
5119 l_current_poc_remaining = p_header_size % l_chunk_size;
5122 ((l_current_poc_nb <= 0) || (l_current_poc_remaining != 0))
5124 opj_event_msg(p_manager, EVT_ERROR, "Error reading POC marker\n");
5128 l_cp = &(p_j2k->m_cp);
5129 l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_DEC_STATE_TPH) ? &l_cp->tcps[p_j2k->m_current_tile_number] : p_j2k->m_specific_param.m_decoder.m_default_tcp;
5130 l_old_poc_nb = l_tcp->POC ? l_tcp->numpocs + 1 : 0;
5131 l_current_poc_nb += l_old_poc_nb;
5132 assert(l_current_poc_nb < 32);
5134 /* now poc is in use.*/
5137 l_current_poc = &l_tcp->pocs[l_old_poc_nb];
5139 (i = l_old_poc_nb; i < l_current_poc_nb; ++i)
5141 opj_read_bytes(p_header_data,&(l_current_poc->resno0),1); /* RSpoc_i */
5143 opj_read_bytes(p_header_data,&(l_current_poc->compno0),l_comp_room); /* CSpoc_i */
5144 p_header_data+=l_comp_room;
5145 opj_read_bytes(p_header_data,&(l_current_poc->layno1),2); /* LYEpoc_i */
5147 opj_read_bytes(p_header_data,&(l_current_poc->resno1),1); /* REpoc_i */
5149 opj_read_bytes(p_header_data,&(l_current_poc->compno1),l_comp_room); /* CEpoc_i */
5150 p_header_data+=l_comp_room;
5151 opj_read_bytes(p_header_data,&l_tmp,1); /* Ppoc_i */
5153 l_current_poc->prg = (OPJ_PROG_ORDER) l_tmp;
5154 /* make sure comp is in acceptable bounds */
5155 l_current_poc->compno1 = uint_min(l_current_poc->compno1, l_nb_comp);
5158 l_tcp->numpocs = l_current_poc_nb - 1;
5163 * Writes the RGN marker (Region Of Interest)
5165 * @param p_tile_no the tile to output
5166 * @param p_comp_no the component to output
5167 * @param p_stream the stream to write data to.
5168 * @param p_j2k J2K codec.
5169 * @param p_manager the user event manager.
5173 OPJ_UINT32 p_tile_no,
5174 OPJ_UINT32 p_comp_no,
5175 struct opj_stream_private *p_stream,
5176 struct opj_event_mgr * p_manager
5179 OPJ_BYTE * l_current_data = 00;
5180 OPJ_UINT32 l_nb_comp;
5181 OPJ_UINT32 l_rgn_size;
5182 opj_image_t *l_image = 00;
5183 opj_cp_t *l_cp = 00;
5184 opj_tcp_t *l_tcp = 00;
5185 opj_tccp_t *l_tccp = 00;
5186 OPJ_UINT32 l_comp_room;
5189 assert(p_j2k != 00);
5190 assert(p_manager != 00);
5191 assert(p_stream != 00);
5193 l_cp = &(p_j2k->m_cp);
5194 l_tcp = &l_cp->tcps[p_tile_no];
5195 l_tccp = &l_tcp->tccps[p_comp_no];
5197 l_nb_comp = l_image->numcomps;
5208 l_rgn_size = 6 + l_comp_room;
5210 l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
5212 opj_write_bytes(l_current_data,J2K_MS_RGN,2); /* RGN */
5213 l_current_data += 2;
5214 opj_write_bytes(l_current_data,l_rgn_size-2,2); /* Lrgn */
5215 l_current_data += 2;
5216 opj_write_bytes(l_current_data,p_comp_no,l_comp_room); /* Crgn */
5217 l_current_data+=l_comp_room;
5218 opj_write_bytes(l_current_data, 0,1); /* Srgn */
5220 opj_write_bytes(l_current_data, l_tccp->roishift,1); /* SPrgn */
5224 (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_rgn_size,p_manager) != l_rgn_size)
5232 * Reads a RGN marker (Region Of Interest)
5234 * @param p_header_data the data contained in the POC box.
5235 * @param p_j2k the jpeg2000 codec.
5236 * @param p_header_size the size of the data contained in the POC marker.
5237 * @param p_manager the user event manager.
5241 OPJ_BYTE * p_header_data,
5242 OPJ_UINT32 p_header_size,
5243 struct opj_event_mgr * p_manager
5246 OPJ_UINT32 l_nb_comp;
5247 opj_image_t * l_image = 00;
5249 opj_cp_t *l_cp = 00;
5250 opj_tcp_t *l_tcp = 00;
5251 OPJ_UINT32 l_comp_room;
5252 OPJ_UINT32 l_comp_no;
5253 OPJ_UINT32 l_roi_sty;
5256 assert(p_header_data != 00);
5257 assert(p_j2k != 00);
5258 assert(p_manager != 00);
5260 l_image = p_j2k->m_image;
5261 l_nb_comp = l_image->numcomps;
5272 (p_header_size != 2 + l_comp_room)
5274 opj_event_msg(p_manager, EVT_ERROR, "Error reading RGN marker\n");
5278 l_cp = &(p_j2k->m_cp);
5279 l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_DEC_STATE_TPH) ? &l_cp->tcps[p_j2k->m_current_tile_number] : p_j2k->m_specific_param.m_decoder.m_default_tcp;
5281 opj_read_bytes(p_header_data,&l_comp_no,l_comp_room); /* Crgn */
5282 p_header_data+=l_comp_room;
5283 opj_read_bytes(p_header_data,&l_roi_sty,1); /* Srgn */
5287 if (p_j2k->m_cp->correct) {
5288 /* totlen is negative or larger than the bytes left!!! */
5289 if (compno >= numcomps) {
5290 opj_event_msg(p_j2k->cinfo, EVT_ERROR,
5291 "JPWL: bad component number in RGN (%d when there are only %d)\n",
5293 if (!JPWL_ASSUME || JPWL_ASSUME) {
5294 opj_event_msg(p_j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
5299 #endif /* USE_JPWL */
5301 opj_read_bytes(p_header_data,(OPJ_UINT32 *) (&(l_tcp->tccps[l_comp_no].roishift)),1); /* SPrgn */
5308 * Writes the TLM marker (Tile Length Marker)
5310 * @param p_stream the stream to write data to.
5311 * @param p_j2k J2K codec.
5312 * @param p_manager the user event manager.
5316 struct opj_stream_private *p_stream,
5317 struct opj_event_mgr * p_manager
5320 OPJ_BYTE * l_current_data = 00;
5321 OPJ_UINT32 l_tlm_size;
5324 assert(p_j2k != 00);
5325 assert(p_manager != 00);
5326 assert(p_stream != 00);
5328 l_tlm_size = 6 + (5*p_j2k->m_specific_param.m_encoder.m_total_tile_parts);
5330 (l_tlm_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size)
5332 p_j2k->m_specific_param.m_encoder.m_header_tile_data
5333 = (OPJ_BYTE*)opj_realloc(
5334 p_j2k->m_specific_param.m_encoder.m_header_tile_data,
5337 (! p_j2k->m_specific_param.m_encoder.m_header_tile_data)
5341 p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_tlm_size;
5343 l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
5345 /* change the way data is written to avoid seeking if possible */
5347 p_j2k->m_specific_param.m_encoder.m_tlm_start = opj_stream_tell(p_stream);
5349 opj_write_bytes(l_current_data,J2K_MS_TLM,2); /* TLM */
5350 l_current_data += 2;
5351 opj_write_bytes(l_current_data,l_tlm_size-2,2); /* Lpoc */
5352 l_current_data += 2;
5353 opj_write_bytes(l_current_data,0,1); /* Ztlm=0*/
5355 opj_write_bytes(l_current_data,0x50,1); /* Stlm ST=1(8bits-255 tiles max),SP=1(Ptlm=32bits) */
5357 /* do nothing on the 5 * l_j2k->m_specific_param.m_encoder.m_total_tile_parts remaining data */
5360 (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_tlm_size,p_manager) != l_tlm_size)
5368 * Reads a TLM marker (Tile Length Marker)
5370 * @param p_header_data the data contained in the TLM box.
5371 * @param p_j2k the jpeg2000 codec.
5372 * @param p_header_size the size of the data contained in the TLM marker.
5373 * @param p_manager the user event manager.
5377 OPJ_BYTE * p_header_data,
5378 OPJ_UINT32 p_header_size,
5379 struct opj_event_mgr * p_manager
5382 OPJ_UINT32 l_Ztlm, l_Stlm, l_ST, l_SP, l_tot_num_tp, l_tot_num_tp_remaining, l_quotient, l_Ptlm_size;
5384 assert(p_header_data != 00);
5385 assert(p_j2k != 00);
5386 assert(p_manager != 00);
5391 opj_event_msg(p_manager, EVT_ERROR, "Error reading TLM marker\n");
5397 opj_read_bytes(p_header_data,&l_Ztlm,1); /* Ztlm */
5399 opj_read_bytes(p_header_data,&l_Stlm,1); /* Stlm */
5402 l_ST = ((l_Stlm >> 4) & 0x3);
5403 l_SP = (l_Stlm >> 6) & 0x1;
5405 l_Ptlm_size = (l_SP + 1) * 2;
5406 l_quotient = l_Ptlm_size + l_ST;
5408 l_tot_num_tp = p_header_size / l_quotient;
5409 l_tot_num_tp_remaining = p_header_size % l_quotient;
5411 (l_tot_num_tp_remaining != 0)
5413 opj_event_msg(p_manager, EVT_ERROR, "Error reading TLM marker\n");
5416 /* Do not care of this at the moment since only local variables are set here */
5419 (i = 0; i < l_tot_num_tp; ++i)
5421 opj_read_bytes(p_header_data,&l_Ttlm_i,l_ST); // Ttlm_i
5422 p_header_data += l_ST;
5423 opj_read_bytes(p_header_data,&l_Ptlm_i,l_Ptlm_size); // Ptlm_i
5424 p_header_data += l_Ptlm_size;
5430 * Reads a CRG marker (Component registration)
5432 * @param p_header_data the data contained in the TLM box.
5433 * @param p_j2k the jpeg2000 codec.
5434 * @param p_header_size the size of the data contained in the TLM marker.
5435 * @param p_manager the user event manager.
5439 OPJ_BYTE * p_header_data,
5440 OPJ_UINT32 p_header_size,
5441 struct opj_event_mgr * p_manager
5444 OPJ_UINT32 l_nb_comp;
5446 assert(p_header_data != 00);
5447 assert(p_j2k != 00);
5448 assert(p_manager != 00);
5450 l_nb_comp = p_j2k->m_image->numcomps;
5453 (p_header_size != l_nb_comp *4)
5455 opj_event_msg(p_manager, EVT_ERROR, "Error reading CRG marker\n");
5458 /* Do not care of this at the moment since only local variables are set here */
5461 (i = 0; i < l_nb_comp; ++i)
5463 opj_read_bytes(p_header_data,&l_Xcrg_i,2); // Xcrg_i
5465 opj_read_bytes(p_header_data,&l_Ycrg_i,2); // Xcrg_i
5473 * Reads a PLM marker (Packet length, main header marker)
5475 * @param p_header_data the data contained in the TLM box.
5476 * @param p_j2k the jpeg2000 codec.
5477 * @param p_header_size the size of the data contained in the TLM marker.
5478 * @param p_manager the user event manager.
5482 OPJ_BYTE * p_header_data,
5483 OPJ_UINT32 p_header_size,
5484 struct opj_event_mgr * p_manager
5488 assert(p_header_data != 00);
5489 assert(p_j2k != 00);
5490 assert(p_manager != 00);
5495 opj_event_msg(p_manager, EVT_ERROR, "Error reading PLM marker\n");
5498 /* Do not care of this at the moment since only local variables are set here */
5500 opj_read_bytes(p_header_data,&l_Zplm,1); // Zplm
5507 opj_read_bytes(p_header_data,&l_Nplm,1); // Nplm
5509 p_header_size -= (1+l_Nplm);
5513 opj_event_msg(p_manager, EVT_ERROR, "Error reading PLM marker\n");
5517 (i = 0; i < l_Nplm; ++i)
5519 opj_read_bytes(p_header_data,&l_tmp,1); // Iplm_ij
5521 // take only the last seven bytes
5522 l_packet_len |= (l_tmp & 0x7f);
5530 // store packet length and proceed to next packet
5537 opj_event_msg(p_manager, EVT_ERROR, "Error reading PLM marker\n");
5546 * Reads a PLT marker (Packet length, tile-part header)
5548 * @param p_header_data the data contained in the PLT box.
5549 * @param p_j2k the jpeg2000 codec.
5550 * @param p_header_size the size of the data contained in the PLT marker.
5551 * @param p_manager the user event manager.
5555 OPJ_BYTE * p_header_data,
5556 OPJ_UINT32 p_header_size,
5557 struct opj_event_mgr * p_manager
5560 OPJ_UINT32 l_Zplt, l_tmp, l_packet_len = 0, i;
5563 assert(p_header_data != 00);
5564 assert(p_j2k != 00);
5565 assert(p_manager != 00);
5570 opj_event_msg(p_manager, EVT_ERROR, "Error reading PLM marker\n");
5574 opj_read_bytes(p_header_data,&l_Zplt,1); // Zplt
5578 (i = 0; i < p_header_size; ++i)
5580 opj_read_bytes(p_header_data,&l_tmp,1); // Iplm_ij
5582 // take only the last seven bytes
5583 l_packet_len |= (l_tmp & 0x7f);
5591 // store packet length and proceed to next packet
5598 opj_event_msg(p_manager, EVT_ERROR, "Error reading PLM marker\n");
5605 * Reads a PPM marker (Packed packet headers, main header)
5607 * @param p_header_data the data contained in the POC box.
5608 * @param p_j2k the jpeg2000 codec.
5609 * @param p_header_size the size of the data contained in the POC marker.
5610 * @param p_manager the user event manager.
5614 OPJ_BYTE * p_header_data,
5615 OPJ_UINT32 p_header_size,
5616 struct opj_event_mgr * p_manager
5620 opj_cp_t *l_cp = 00;
5621 OPJ_UINT32 l_remaining_data, l_Z_ppm, l_N_ppm;
5624 assert(p_header_data != 00);
5625 assert(p_j2k != 00);
5626 assert(p_manager != 00);
5631 opj_event_msg(p_manager, EVT_ERROR, "Error reading RGN marker\n");
5634 l_cp = &(p_j2k->m_cp);
5637 opj_read_bytes(p_header_data,&l_Z_ppm,1); /* Z_ppm */
5648 opj_event_msg(p_manager, EVT_ERROR, "Error reading PPM marker\n");
5652 opj_read_bytes(p_header_data,&l_N_ppm,4); /* N_ppm */
5655 /* First PPM marker */
5656 l_cp->ppm_len = l_N_ppm;
5657 l_cp->ppm_data_size = 0;
5658 l_cp->ppm_buffer = (OPJ_BYTE *) opj_malloc(l_cp->ppm_len);
5659 l_cp->ppm_data = l_cp->ppm_buffer;
5661 (l_cp->ppm_buffer == 00)
5663 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory reading ppm marker\n");
5666 memset(l_cp->ppm_buffer,0,l_cp->ppm_len);
5673 (l_cp->ppm_data_size == l_cp->ppm_len)
5676 (p_header_size >= 4)
5679 opj_read_bytes(p_header_data,&l_N_ppm,4); /* N_ppm */
5682 l_cp->ppm_len += l_N_ppm ;
5683 l_cp->ppm_buffer = (OPJ_BYTE *) opj_realloc(l_cp->ppm_buffer, l_cp->ppm_len);
5684 l_cp->ppm_data = l_cp->ppm_buffer;
5686 (l_cp->ppm_buffer == 00)
5688 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory reading ppm marker\n");
5691 memset(l_cp->ppm_buffer+l_cp->ppm_data_size,0,l_N_ppm);
5698 l_remaining_data = l_cp->ppm_len - l_cp->ppm_data_size;
5700 (l_remaining_data <= p_header_size)
5702 /* we must store less information than available in the packet */
5703 memcpy(l_cp->ppm_buffer + l_cp->ppm_data_size , p_header_data , l_remaining_data);
5704 l_cp->ppm_data_size = l_cp->ppm_len;
5705 p_header_size -= l_remaining_data;
5706 p_header_data += l_remaining_data;
5710 memcpy(l_cp->ppm_buffer + l_cp->ppm_data_size , p_header_data , p_header_size);
5711 l_cp->ppm_data_size += p_header_size;
5712 p_header_data += p_header_size;
5721 * Reads a PPT marker (Packed packet headers, tile-part header)
5723 * @param p_header_data the data contained in the PPT box.
5724 * @param p_j2k the jpeg2000 codec.
5725 * @param p_header_size the size of the data contained in the PPT marker.
5726 * @param p_manager the user event manager.
5730 OPJ_BYTE * p_header_data,
5731 OPJ_UINT32 p_header_size,
5732 struct opj_event_mgr * p_manager
5736 opj_cp_t *l_cp = 00;
5737 opj_tcp_t *l_tcp = 00;
5741 assert(p_header_data != 00);
5742 assert(p_j2k != 00);
5743 assert(p_manager != 00);
5748 opj_event_msg(p_manager, EVT_ERROR, "Error reading PPT marker\n");
5752 l_cp = &(p_j2k->m_cp);
5753 l_tcp = &(l_cp->tcps[p_j2k->m_current_tile_number]);
5756 opj_read_bytes(p_header_data,&l_Z_ppt,1); /* Z_ppt */
5764 /* First PPM marker */
5765 l_tcp->ppt_len = p_header_size;
5766 l_tcp->ppt_data_size = 0;
5767 l_tcp->ppt_buffer = (OPJ_BYTE *) opj_malloc(l_tcp->ppt_len);
5768 l_tcp->ppt_data = l_tcp->ppt_buffer;
5770 (l_tcp->ppt_buffer == 00)
5772 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory reading PPT marker\n");
5775 memset(l_tcp->ppt_buffer,0,l_tcp->ppt_len);
5779 l_tcp->ppt_len += p_header_size;
5780 l_tcp->ppt_buffer = (OPJ_BYTE *) opj_realloc(l_tcp->ppt_buffer,l_tcp->ppt_len);
5782 (l_tcp->ppt_buffer == 00)
5784 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory reading PPT marker\n");
5787 l_tcp->ppt_data = l_tcp->ppt_buffer;
5788 memset(l_tcp->ppt_buffer+l_tcp->ppt_data_size,0,p_header_size);
5790 memcpy(l_tcp->ppt_buffer+l_tcp->ppt_data_size,p_header_data,p_header_size);
5791 l_tcp->ppt_data_size += p_header_size;
5796 * Writes the SOT marker (Start of tile-part)
5798 * @param p_stream the stream to write data to.
5799 * @param p_j2k J2K codec.
5800 * @param p_manager the user event manager.
5805 OPJ_UINT32 * p_data_written,
5806 const struct opj_stream_private *p_stream,
5807 struct opj_event_mgr * p_manager
5811 assert(p_j2k != 00);
5812 assert(p_manager != 00);
5813 assert(p_stream != 00);
5815 opj_write_bytes(p_data,J2K_MS_SOT,2); /* SOT */
5818 opj_write_bytes(p_data,10,2); /* Lsot */
5821 opj_write_bytes(p_data, p_j2k->m_current_tile_number,2); /* Isot */
5827 opj_write_bytes(p_data, p_j2k->m_specific_param.m_encoder.m_current_tile_part_number,1); /* TPsot */
5830 opj_write_bytes(p_data, p_j2k->m_cp.tcps[p_j2k->m_current_tile_number].m_nb_tile_parts,1); /* TNsot */
5834 /* update markers struct */
5835 j2k_add_marker(p_j2k->cstr_info, J2K_MS_SOT, p_j2k->sot_start, len + 2);
5836 #endif /* USE_JPWL */
5838 * p_data_written = 12;
5843 * Reads a PPT marker (Packed packet headers, tile-part header)
5845 * @param p_header_data the data contained in the PPT box.
5846 * @param p_j2k the jpeg2000 codec.
5847 * @param p_header_size the size of the data contained in the PPT marker.
5848 * @param p_manager the user event manager.
5852 OPJ_BYTE * p_header_data,
5853 OPJ_UINT32 p_header_size,
5854 struct opj_event_mgr * p_manager
5858 opj_cp_t *l_cp = 00;
5859 opj_tcp_t *l_tcp = 00;
5860 OPJ_UINT32 l_tot_len, l_num_parts = 0;
5861 OPJ_UINT32 l_current_part;
5862 OPJ_UINT32 l_tile_x,l_tile_y;
5865 assert(p_header_data != 00);
5866 assert(p_j2k != 00);
5867 assert(p_manager != 00);
5870 (p_header_size != 8)
5872 opj_event_msg(p_manager, EVT_ERROR, "Error reading SOT marker\n");
5875 l_cp = &(p_j2k->m_cp);
5876 opj_read_bytes(p_header_data,&(p_j2k->m_current_tile_number),2); /* Isot */
5880 l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];
5881 l_tile_x = p_j2k->m_current_tile_number % l_cp->tw;
5882 l_tile_y = p_j2k->m_current_tile_number / l_cp->tw;
5885 if (p_j2k->m_cp->correct) {
5887 static int backup_tileno = 0;
5889 /* tileno is negative or larger than the number of tiles!!! */
5890 if ((tileno < 0) || (tileno > (cp->tw * cp->th))) {
5891 opj_event_msg(p_j2k->cinfo, EVT_ERROR,
5892 "JPWL: bad tile number (%d out of a maximum of %d)\n",
5893 tileno, (cp->tw * cp->th));
5895 opj_event_msg(p_j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
5898 /* we try to correct */
5899 tileno = backup_tileno;
5900 opj_event_msg(p_j2k->cinfo, EVT_WARNING, "- trying to adjust this\n"
5901 "- setting tile number to %d\n",
5905 /* keep your private count of tiles */
5908 #endif /* USE_JPWL */
5910 /* look for the tile in the list of already processed tile (in parts). */
5911 /* Optimization possible here with a more complex data structure and with the removing of tiles */
5912 /* since the time taken by this function can only grow at the time */
5914 opj_read_bytes(p_header_data,&l_tot_len,4); /* Psot */
5918 if (p_j2k->m_cp->correct) {
5920 /* totlen is negative or larger than the bytes left!!! */
5921 if ((totlen < 0) || (totlen > (p_stream_numbytesleft(p_stream) + 8))) {
5922 opj_event_msg(p_j2k->cinfo, EVT_ERROR,
5923 "JPWL: bad tile byte size (%d bytes against %d bytes left)\n",
5924 totlen, p_stream_numbytesleft(p_stream) + 8);
5926 opj_event_msg(p_j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
5929 /* we try to correct */
5931 opj_event_msg(p_j2k->cinfo, EVT_WARNING, "- trying to adjust this\n"
5932 "- setting Psot to %d => assuming it is the last tile\n",
5937 #endif /* USE_JPWL */
5942 opj_event_msg(p_manager, EVT_ERROR, "Cannot read data with no size known, giving up\n");
5946 opj_read_bytes(p_header_data,&l_current_part ,1); /* Psot */
5949 opj_read_bytes(p_header_data,&l_num_parts ,1); /* Psot */
5955 l_tcp->m_nb_tile_parts = l_num_parts;
5958 (l_tcp->m_nb_tile_parts)
5961 (l_tcp->m_nb_tile_parts == (l_current_part + 1))
5963 p_j2k->m_specific_param.m_decoder.m_can_decode = 1;
5966 p_j2k->m_specific_param.m_decoder.m_sot_length = l_tot_len - 12;
5967 p_j2k->m_specific_param.m_decoder.m_state = J2K_DEC_STATE_TPH;
5968 p_j2k->m_specific_param.m_decoder.m_skip_data =
5969 (l_tile_x < p_j2k->m_specific_param.m_decoder.m_start_tile_x)
5970 || (l_tile_x >= p_j2k->m_specific_param.m_decoder.m_end_tile_x)
5971 || (l_tile_y < p_j2k->m_specific_param.m_decoder.m_start_tile_y)
5972 || (l_tile_y >= p_j2k->m_specific_param.m_decoder.m_end_tile_y);
5975 /* move this onto a separate method to call before reading any SOT */
5986 p_j2k->cstr_info->main_head_end = p_stream_tell(p_stream) - 13;
5988 p_j2k->cstr_info->tile[tileno].tileno = tileno;
5989 p_j2k->cstr_info->tile[tileno].start_pos = p_stream_tell(p_stream) - 12;
5990 p_j2k->cstr_info->tile[tileno].end_pos = p_j2k->cstr_info->tile[tileno].start_pos + totlen - 1;
5991 p_j2k->cstr_info->tile[tileno].num_tps = numparts;
5995 p_j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_malloc(numparts * sizeof(opj_tp_info_t));
5999 p_j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_malloc(10 * sizeof(opj_tp_info_t)); // Fixme (10)
6004 p_j2k->cstr_info->tile[tileno].end_pos += totlen;
6006 p_j2k->cstr_info->tile[tileno].tp[partno].tp_start_pos = p_stream_tell(p_stream) - 12;
6007 p_j2k->cstr_info->tile[tileno].tp[partno].tp_end_pos =
6008 p_j2k->cstr_info->tile[tileno].tp[partno].tp_start_pos + totlen - 1;
6014 * Writes the SOD marker (Start of data)
6016 * @param p_stream the stream to write data to.
6017 * @param p_j2k J2K codec.
6018 * @param p_manager the user event manager.
6022 struct opj_tcd * p_tile_coder,
6024 OPJ_UINT32 * p_data_written,
6025 OPJ_UINT32 p_total_data_size,
6026 const struct opj_stream_private *p_stream,
6027 struct opj_event_mgr * p_manager
6030 opj_tcp_t *l_tcp = 00;
6031 opj_codestream_info_t *l_cstr_info = 00;
6032 opj_cp_t *l_cp = 00;
6034 OPJ_UINT32 l_size_tile;
6035 OPJ_UINT32 l_remaining_data;
6038 assert(p_j2k != 00);
6039 assert(p_manager != 00);
6040 assert(p_stream != 00);
6042 opj_write_bytes(p_data,J2K_MS_SOD,2); /* SOD */
6045 /* make room for the EOF marker */
6046 l_remaining_data = p_total_data_size - 4;
6048 l_cp = &(p_j2k->m_cp);
6049 l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];
6050 l_cstr_info = p_j2k->cstr_info;
6052 /* update tile coder */
6053 p_tile_coder->tp_num = p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number ;
6054 p_tile_coder->cur_tp_num = p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;
6055 l_size_tile = l_cp->th * l_cp->tw;
6062 (!p_j2k->m_specific_param.m_encoder.m_current_tile_part_number )
6064 //TODO cstr_info->tile[p_j2k->m_current_tile_number].end_header = p_stream_tell(p_stream) + p_j2k->pos_correction - 1;
6065 l_cstr_info->tile[p_j2k->m_current_tile_number].tileno = p_j2k->m_current_tile_number;
6072 (cstr_info->tile[p_j2k->m_current_tile_number].packet[cstr_info->packno - 1].end_pos < p_stream_tell(p_stream))
6074 cstr_info->tile[p_j2k->m_current_tile_number].packet[cstr_info->packno].start_pos = p_stream_tell(p_stream);
6080 /* update markers struct */
6081 j2k_add_marker(p_j2k->cstr_info, J2K_MS_SOD, p_j2k->sod_start, 2);
6082 #endif /* USE_JPWL */
6088 (p_j2k->m_specific_param.m_encoder.m_current_tile_part_number == 0)
6090 p_tile_coder->tcd_image->tiles->packno = 0;
6094 l_cstr_info->packno = 0;
6097 *p_data_written = 0;
6099 (! tcd_encode_tile(p_tile_coder, p_j2k->m_current_tile_number, p_data, p_data_written, l_remaining_data , l_cstr_info))
6101 opj_event_msg(p_manager, EVT_ERROR, "Cannot encode tile\n");
6104 *p_data_written += 2;
6109 * Updates the Tile Length Marker.
6111 void j2k_update_tlm (
6113 OPJ_UINT32 p_tile_part_size
6116 opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current,p_j2k->m_current_tile_number,1); /* PSOT */
6117 ++p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current;
6118 opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current,p_tile_part_size,4); /* PSOT */
6119 p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current += 4;
6124 * Reads a SOD marker (Start Of Data)
6126 * @param p_header_data the data contained in the SOD box.
6127 * @param p_j2k the jpeg2000 codec.
6128 * @param p_header_size the size of the data contained in the SOD marker.
6129 * @param p_manager the user event manager.
6133 struct opj_stream_private *p_stream,
6134 struct opj_event_mgr * p_manager
6137 OPJ_UINT32 l_current_read_size;
6138 opj_codestream_info_t * l_cstr_info = 00;
6139 OPJ_BYTE ** l_current_data = 00;
6140 opj_tcp_t * l_tcp = 00;
6141 OPJ_UINT32 * l_tile_len = 00;
6144 assert(p_j2k != 00);
6145 assert(p_manager != 00);
6146 assert(p_stream != 00);
6148 l_tcp = &(p_j2k->m_cp.tcps[p_j2k->m_current_tile_number]);
6149 p_j2k->m_specific_param.m_decoder.m_sot_length -= 2;
6150 l_cstr_info = p_j2k->cstr_info;
6152 l_current_data = &(l_tcp->m_data);
6153 l_tile_len = &l_tcp->m_data_size;
6158 *l_current_data = (OPJ_BYTE*) my_opj_malloc(p_j2k->m_specific_param.m_decoder.m_sot_length);
6162 *l_current_data = (OPJ_BYTE*) my_opj_realloc(*l_current_data, *l_tile_len + p_j2k->m_specific_param.m_decoder.m_sot_length);
6165 (*l_current_data == 00)
6167 opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile\n");
6175 OPJ_SIZE_T l_current_pos = opj_stream_tell(p_stream)-1;
6176 l_cstr_info->tile[p_j2k->m_current_tile_number].tp[p_j2k->m_specific_param.m_encoder.m_current_tile_part_number].tp_end_header = l_current_pos;
6178 (p_j2k->m_specific_param.m_encoder.m_current_tile_part_number == 0)
6180 l_cstr_info->tile[p_j2k->m_current_tile_number].end_header = l_current_pos;
6182 l_cstr_info->packno = 0;
6184 l_current_read_size = opj_stream_read_data(p_stream, *l_current_data + *l_tile_len , p_j2k->m_specific_param.m_decoder.m_sot_length,p_manager);
6186 (l_current_read_size != p_j2k->m_specific_param.m_decoder.m_sot_length)
6188 p_j2k->m_specific_param.m_decoder.m_state = J2K_DEC_STATE_NEOC;
6192 p_j2k->m_specific_param.m_decoder.m_state = J2K_DEC_STATE_TPHSOT;
6194 *l_tile_len += l_current_read_size;
6199 * Writes the EOC marker (End of Codestream)
6201 * @param p_stream the stream to write data to.
6202 * @param p_j2k J2K codec.
6203 * @param p_manager the user event manager.
6207 struct opj_stream_private *p_stream,
6208 struct opj_event_mgr * p_manager
6212 assert(p_j2k != 00);
6213 assert(p_manager != 00);
6214 assert(p_stream != 00);
6216 opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_header_tile_data,J2K_MS_EOC,2); /* EOC */
6221 /* update markers struct */
6222 j2k_add_marker(p_j2k->cstr_info, J2K_MS_EOC, p_stream_tell(p_stream) - 2, 2);
6223 #endif /* USE_JPWL */
6226 (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,2,p_manager) != 2)
6231 (! opj_stream_flush(p_stream,p_manager))
6242 * @param p_stream the stream to write data to.
6243 * @param p_j2k J2K codec.
6244 * @param p_manager the user event manager.
6248 struct opj_stream_private *p_stream,
6249 struct opj_event_mgr * p_manager
6252 opj_codestream_info_t * l_cstr_info = 00;
6255 assert(p_j2k != 00);
6256 assert(p_manager != 00);
6257 assert(p_stream != 00);
6258 l_cstr_info = p_j2k->cstr_info;
6264 l_cstr_info->tile = (opj_tile_info_t *) opj_malloc(p_j2k->m_cp.tw * p_j2k->m_cp.th * sizeof(opj_tile_info_t));
6265 l_cstr_info->image_w = p_j2k->m_image->x1 - p_j2k->m_image->x0;
6266 l_cstr_info->image_h = p_j2k->m_image->y1 - p_j2k->m_image->y0;
6267 l_cstr_info->prog = (&p_j2k->m_cp.tcps[0])->prg;
6268 l_cstr_info->tw = p_j2k->m_cp.tw;
6269 l_cstr_info->th = p_j2k->m_cp.th;
6270 l_cstr_info->tile_x = p_j2k->m_cp.tdx; /* new version parser */
6271 l_cstr_info->tile_y = p_j2k->m_cp.tdy; /* new version parser */
6272 l_cstr_info->tile_Ox = p_j2k->m_cp.tx0; /* new version parser */
6273 l_cstr_info->tile_Oy = p_j2k->m_cp.ty0; /* new version parser */
6274 l_cstr_info->numcomps = p_j2k->m_image->numcomps;
6275 l_cstr_info->numlayers = (&p_j2k->m_cp.tcps[0])->numlayers;
6276 l_cstr_info->numdecompos = (OPJ_INT32*) opj_malloc(p_j2k->m_image->numcomps * sizeof(OPJ_INT32));
6277 for (compno=0; compno < p_j2k->m_image->numcomps; compno++) {
6278 l_cstr_info->numdecompos[compno] = (&p_j2k->m_cp.tcps[0])->tccps->numresolutions - 1;
6280 l_cstr_info->D_max = 0.0; /* ADD Marcela */
6281 l_cstr_info->main_head_start = opj_stream_tell(p_stream); /* position of SOC */
6282 l_cstr_info->maxmarknum = 100;
6283 l_cstr_info->marker = (opj_marker_info_t *) opj_malloc(l_cstr_info->maxmarknum * sizeof(opj_marker_info_t));
6284 l_cstr_info->marknum = 0;
6286 return j2k_calculate_tp(p_j2k,&(p_j2k->m_cp),&p_j2k->m_specific_param.m_encoder.m_total_tile_parts,p_j2k->m_image,p_manager);
6290 * Creates a tile-coder decoder.
6292 * @param p_stream the stream to write data to.
6293 * @param p_j2k J2K codec.
6294 * @param p_manager the user event manager.
6296 bool j2k_create_tcd(
6298 struct opj_stream_private *p_stream,
6299 struct opj_event_mgr * p_manager
6303 assert(p_j2k != 00);
6304 assert(p_manager != 00);
6305 assert(p_stream != 00);
6307 p_j2k->m_tcd = tcd_create(false);
6311 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to create Tile Coder\n");
6315 (! tcd_init(p_j2k->m_tcd,p_j2k->m_image,&p_j2k->m_cp))
6317 tcd_destroy(p_j2k->m_tcd);
6324 OPJ_FLOAT32 get_tp_stride (opj_tcp_t * p_tcp)
6326 return (OPJ_FLOAT32) ((p_tcp->m_nb_tile_parts - 1) * 14);
6329 OPJ_FLOAT32 get_default_stride (opj_tcp_t * p_tcp)
6335 * Updates the rates of the tcp.
6337 * @param p_stream the stream to write data to.
6338 * @param p_j2k J2K codec.
6339 * @param p_manager the user event manager.
6341 bool j2k_update_rates(
6343 struct opj_stream_private *p_stream,
6344 struct opj_event_mgr * p_manager
6347 opj_cp_t * l_cp = 00;
6348 opj_image_t * l_image = 00;
6349 opj_tcp_t * l_tcp = 00;
6350 opj_image_comp_t * l_img_comp = 00;
6353 OPJ_INT32 l_x0,l_y0,l_x1,l_y1;
6354 OPJ_FLOAT32 * l_rates = 0;
6355 OPJ_FLOAT32 l_sot_remove;
6356 OPJ_UINT32 l_bits_empty, l_size_pixel;
6357 OPJ_UINT32 l_tile_size = 0;
6358 OPJ_UINT32 l_last_res;
6359 OPJ_FLOAT32 (* l_tp_stride_func)(opj_tcp_t *) = 00;
6362 assert(p_j2k != 00);
6363 assert(p_manager != 00);
6364 assert(p_stream != 00);
6367 l_cp = &(p_j2k->m_cp);
6368 l_image = p_j2k->m_image;
6371 l_bits_empty = 8 * l_image->comps->dx * l_image->comps->dy;
6372 l_size_pixel = l_image->numcomps * l_image->comps->prec;
6373 l_sot_remove = ((OPJ_FLOAT32) opj_stream_tell(p_stream)) / (l_cp->th * l_cp->tw);
6376 (l_cp->m_specific_param.m_enc.m_tp_on)
6378 l_tp_stride_func = get_tp_stride;
6382 l_tp_stride_func = get_default_stride;
6386 (i=0;i<l_cp->th;++i)
6389 (j=0;j<l_cp->tw;++j)
6391 OPJ_FLOAT32 l_offset = ((*l_tp_stride_func)(l_tcp)) / l_tcp->numlayers;
6392 /* 4 borders of the tile rescale on the image if necessary */
6393 l_x0 = int_max(l_cp->tx0 + j * l_cp->tdx, l_image->x0);
6394 l_y0 = int_max(l_cp->ty0 + i * l_cp->tdy, l_image->y0);
6395 l_x1 = int_min(l_cp->tx0 + (j + 1) * l_cp->tdx, l_image->x1);
6396 l_y1 = int_min(l_cp->ty0 + (i + 1) * l_cp->tdy, l_image->y1);
6397 l_rates = l_tcp->rates;
6399 /* Modification of the RATE >> */
6403 *l_rates = (( (float) (l_size_pixel * (l_x1 - l_x0) * (l_y1 - l_y0)))
6405 ((*l_rates) * l_bits_empty)
6412 (k = 1; k < l_tcp->numlayers; ++k)
6417 *l_rates = (( (OPJ_FLOAT32) (l_size_pixel * (l_x1 - l_x0) * (l_y1 - l_y0)))
6419 ((*l_rates) * l_bits_empty)
6432 (i=0;i<l_cp->th;++i)
6435 (j=0;j<l_cp->tw;++j)
6437 l_rates = l_tcp->rates;
6441 *l_rates -= l_sot_remove;
6449 l_last_res = l_tcp->numlayers - 1;
6451 (k = 1; k < l_last_res; ++k)
6456 *l_rates -= l_sot_remove;
6458 (*l_rates < *(l_rates - 1) + 10)
6460 *l_rates = (*(l_rates - 1)) + 20;
6468 *l_rates -= (l_sot_remove + 2.f);
6470 (*l_rates < *(l_rates - 1) + 10)
6472 *l_rates = (*(l_rates - 1)) + 20;
6479 l_img_comp = l_image->comps;
6482 (i=0;i<l_image->numcomps;++i)
6484 l_tile_size += ( uint_ceildiv(l_cp->tdx,l_img_comp->dx)
6486 uint_ceildiv(l_cp->tdy,l_img_comp->dy)
6493 l_tile_size = (OPJ_UINT32) (l_tile_size * 0.1625); /* 1.3/8 = 0.1625 */
6494 l_tile_size += j2k_get_specific_header_sizes(p_j2k);
6496 p_j2k->m_specific_param.m_encoder.m_encoded_tile_size = l_tile_size;
6497 p_j2k->m_specific_param.m_encoder.m_encoded_tile_data = (OPJ_BYTE *) my_opj_malloc(p_j2k->m_specific_param.m_encoder.m_encoded_tile_size);
6499 (p_j2k->m_specific_param.m_encoder.m_encoded_tile_data == 00)
6504 (l_cp->m_specific_param.m_enc.m_cinema)
6506 p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer = (OPJ_BYTE *) opj_malloc(5*p_j2k->m_specific_param.m_encoder.m_total_tile_parts);
6508 (! p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer)
6512 p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current = p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer;
6518 * Reads a EOC marker (End Of Codestream)
6520 * @param p_header_data the data contained in the SOD box.
6521 * @param p_j2k the jpeg2000 codec.
6522 * @param p_header_size the size of the data contained in the SOD marker.
6523 * @param p_manager the user event manager.
6527 struct opj_stream_private *p_stream,
6528 struct opj_event_mgr * p_manager
6532 opj_tcd_t * l_tcd = 00;
6533 OPJ_UINT32 l_nb_tiles;
6534 opj_tcp_t * l_tcp = 00;
6538 assert(p_j2k != 00);
6539 assert(p_manager != 00);
6540 assert(p_stream != 00);
6542 l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
6543 l_tcp = p_j2k->m_cp.tcps;
6545 l_tcd = tcd_create(true);
6549 opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
6556 (i = 0; i < l_nb_tiles; ++i)
6562 (! tcd_init_decode_tile(l_tcd, i))
6565 opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
6568 l_success = tcd_decode_tile(l_tcd, l_tcp->m_data, l_tcp->m_data_size, i, p_j2k->cstr_info);
6573 p_j2k->m_specific_param.m_decoder.m_state |= J2K_DEC_STATE_ERR;
6577 j2k_tcp_destroy(l_tcp);
6585 * Writes the image components.
6587 * @param p_stream the stream to write data to.
6588 * @param p_j2k J2K codec.
6589 * @param p_manager the user event manager.
6591 bool j2k_write_image_components(
6593 struct opj_stream_private *p_stream,
6594 struct opj_event_mgr * p_manager
6599 assert(p_j2k != 00);
6600 assert(p_manager != 00);
6601 assert(p_stream != 00);
6604 (compno = 1; compno < p_j2k->m_image->numcomps; ++compno)
6607 (! j2k_write_coc(p_j2k,compno,p_stream, p_manager))
6612 (! j2k_write_qcc(p_j2k,compno,p_stream, p_manager))
6621 * Writes regions of interests.
6623 * @param p_stream the stream to write data to.
6624 * @param p_j2k J2K codec.
6625 * @param p_manager the user event manager.
6627 bool j2k_write_regions(
6629 struct opj_stream_private *p_stream,
6630 struct opj_event_mgr * p_manager
6634 const opj_tccp_t *l_tccp = 00;
6636 assert(p_j2k != 00);
6637 assert(p_manager != 00);
6638 assert(p_stream != 00);
6640 l_tccp = p_j2k->m_cp.tcps->tccps;
6642 (compno = 0; compno < p_j2k->m_image->numcomps; ++compno)
6648 (! j2k_write_rgn(p_j2k,0,compno,p_stream,p_manager))
6658 * Writes the updated tlm.
6660 * @param p_stream the stream to write data to.
6661 * @param p_j2k J2K codec.
6662 * @param p_manager the user event manager.
6664 bool j2k_write_updated_tlm(
6666 struct opj_stream_private *p_stream,
6667 struct opj_event_mgr * p_manager
6670 OPJ_UINT32 l_tlm_size;
6671 OPJ_SIZE_T l_tlm_position, l_current_position;
6674 assert(p_j2k != 00);
6675 assert(p_manager != 00);
6676 assert(p_stream != 00);
6678 l_tlm_size = 5 * p_j2k->m_specific_param.m_encoder.m_total_tile_parts;
6679 l_tlm_position = 6 + p_j2k->m_specific_param.m_encoder.m_tlm_start;
6680 l_current_position = opj_stream_tell(p_stream);
6683 (! opj_stream_seek(p_stream,l_tlm_position,p_manager))
6688 (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer,l_tlm_size,p_manager) != l_tlm_size)
6693 (! opj_stream_seek(p_stream,l_current_position,p_manager))
6701 * Ends the encoding, i.e. frees memory.
6703 * @param p_stream the stream to write data to.
6704 * @param p_j2k J2K codec.
6705 * @param p_manager the user event manager.
6707 bool j2k_end_encoding(
6709 struct opj_stream_private *p_stream,
6710 struct opj_event_mgr * p_manager
6714 assert(p_j2k != 00);
6715 assert(p_manager != 00);
6716 assert(p_stream != 00);
6718 tcd_destroy(p_j2k->m_tcd);
6722 (p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer)
6724 opj_free(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer);
6725 p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer = 0;
6726 p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current = 0;
6729 (p_j2k->m_specific_param.m_encoder.m_encoded_tile_data)
6731 opj_free(p_j2k->m_specific_param.m_encoder.m_encoded_tile_data);
6732 p_j2k->m_specific_param.m_encoder.m_encoded_tile_data = 0;
6734 p_j2k->m_specific_param.m_encoder.m_encoded_tile_size = 0;
6740 * Gets the offset of the header.
6742 * @param p_stream the stream to write data to.
6743 * @param p_j2k J2K codec.
6744 * @param p_manager the user event manager.
6746 bool j2k_get_end_header(
6748 struct opj_stream_private *p_stream,
6749 struct opj_event_mgr * p_manager
6753 assert(p_j2k != 00);
6754 assert(p_manager != 00);
6755 assert(p_stream != 00);
6757 p_j2k->cstr_info->main_head_end = opj_stream_tell(p_stream);
6765 * Reads an unknown marker
6767 * @param p_stream the stream object to read from.
6768 * @param p_j2k the jpeg2000 codec.
6769 * @param p_manager the user event manager.
6771 * @return true if the marker could be deduced.
6775 struct opj_stream_private *p_stream,
6776 struct opj_event_mgr * p_manager
6779 OPJ_BYTE l_data [2];
6780 OPJ_UINT32 l_unknown_size;
6782 assert(p_j2k != 00);
6783 assert(p_manager != 00);
6784 assert(p_stream != 00);
6786 opj_event_msg(p_manager, EVT_WARNING, "Unknown marker\n");
6789 if (p_j2k->m_cp->correct) {
6790 OPJ_INT32 m = 0, id, i;
6791 OPJ_INT32 min_id = 0, min_dist = 17, cur_dist = 0, tmp_id;
6792 p_stream_seek(p_j2k->p_stream, p_stream_tell(p_j2k->p_stream) - 2);
6793 id = p_stream_read(p_j2k->p_stream, 2);
6794 opj_event_msg(p_j2k->cinfo, EVT_ERROR,
6795 "JPWL: really don't know this marker %x\n",
6798 opj_event_msg(p_j2k->cinfo, EVT_ERROR,
6799 "- possible synch loss due to uncorrectable codestream errors => giving up\n");
6802 /* OK, activate this at your own risk!!! */
6803 /* we look for the marker at the minimum hamming distance from this */
6804 while (j2k_dec_mstab[m].id) {
6806 /* 1's where they differ */
6807 tmp_id = j2k_dec_mstab[m].id ^ id;
6809 /* compute the hamming distance between our id and the current */
6811 for (i = 0; i < 16; i++) {
6812 if ((tmp_id >> i) & 0x0001) {
6817 /* if current distance is smaller, set the minimum */
6818 if (cur_dist < min_dist) {
6819 min_dist = cur_dist;
6820 min_id = j2k_dec_mstab[m].id;
6823 /* jump to the next marker */
6827 /* do we substitute the marker? */
6828 if (min_dist < JPWL_MAXIMUM_HAMMING) {
6829 opj_event_msg(p_j2k->cinfo, EVT_ERROR,
6830 "- marker %x is at distance %d from the read %x\n",
6831 min_id, min_dist, id);
6832 opj_event_msg(p_j2k->cinfo, EVT_ERROR,
6833 "- trying to substitute in place and crossing fingers!\n");
6834 p_stream_seek(p_j2k->p_stream, p_stream_tell(p_j2k->p_stream) - 2);
6835 p_stream_write(p_j2k->p_stream, min_id, 2);
6838 p_stream_seek(p_j2k->p_stream, p_stream_tell(p_j2k->p_stream) - 2);
6843 #endif /* USE_JPWL */
6845 (opj_stream_read_data(p_stream,l_data,2,p_manager) != 2)
6847 opj_event_msg(p_manager, EVT_WARNING, "Unknown marker\n");
6850 opj_read_bytes(l_data,&l_unknown_size,2);
6852 (l_unknown_size < 2)
6859 (opj_stream_skip(p_stream,l_unknown_size,p_manager) != l_unknown_size)
6867 * Reads the lookup table containing all the marker, status and action, and returns the handler associated
6868 * with the marker value.
6869 * @param p_id Marker value to look up
6871 * @return the handler associated with the id.
6873 const opj_dec_memory_marker_handler_t * j2k_get_marker_handler (OPJ_UINT32 p_id)
6875 const opj_dec_memory_marker_handler_t *e;
6877 (e = j2k_memory_marker_handler_tab; e->id != 0; ++e)
6889 * Destroys a tile coding parameter structure.
6891 * @param p_tcp the tile coding parameter to destroy.
6893 void j2k_tcp_destroy (opj_tcp_t *p_tcp)
6901 (p_tcp->ppt_buffer != 00)
6903 opj_free(p_tcp->ppt_buffer);
6904 p_tcp->ppt_buffer = 00;
6907 (p_tcp->tccps != 00)
6909 opj_free(p_tcp->tccps);
6913 (p_tcp->m_mct_coding_matrix != 00)
6915 opj_free(p_tcp->m_mct_coding_matrix);
6916 p_tcp->m_mct_coding_matrix = 00;
6919 (p_tcp->m_mct_decoding_matrix != 00)
6921 opj_free(p_tcp->m_mct_decoding_matrix);
6922 p_tcp->m_mct_decoding_matrix = 00;
6925 (p_tcp->m_mcc_records)
6927 opj_free(p_tcp->m_mcc_records);
6928 p_tcp->m_mcc_records = 00;
6929 p_tcp->m_nb_max_mcc_records = 0;
6930 p_tcp->m_nb_mcc_records = 0;
6933 (p_tcp->m_mct_records)
6935 opj_mct_data_t * l_mct_data = p_tcp->m_mct_records;
6938 (i=0;i<p_tcp->m_nb_mct_records;++i)
6941 (l_mct_data->m_data)
6943 opj_free(l_mct_data->m_data);
6944 l_mct_data->m_data = 00;
6948 opj_free(p_tcp->m_mct_records);
6949 p_tcp->m_mct_records = 00;
6953 (p_tcp->mct_norms != 00)
6955 opj_free(p_tcp->mct_norms);
6956 p_tcp->mct_norms = 00;
6961 opj_free(p_tcp->m_data);
6967 * Destroys a coding parameter structure.
6969 * @param p_cp the coding parameter to destroy.
6971 void j2k_cp_destroy (opj_cp_t *p_cp)
6973 OPJ_UINT32 l_nb_tiles;
6974 opj_tcp_t * l_current_tile = 00;
6985 l_current_tile = p_cp->tcps;
6986 l_nb_tiles = p_cp->th * p_cp->tw;
6989 (i = 0; i < l_nb_tiles; ++i)
6991 j2k_tcp_destroy(l_current_tile);
6994 opj_free(p_cp->tcps);
6998 (p_cp->ppm_buffer != 00)
7000 opj_free(p_cp->ppm_buffer);
7001 p_cp->ppm_buffer = 00;
7004 (p_cp->comment != 00)
7006 opj_free(p_cp->comment);
7010 (! p_cp->m_is_decoder)
7013 (p_cp->m_specific_param.m_enc.m_matrice)
7015 opj_free(p_cp->m_specific_param.m_enc.m_matrice);
7016 p_cp->m_specific_param.m_enc.m_matrice = 00;
7021 /* ----------------------------------------------------------------------- */
7022 /* J2K / JPT decoder interface */
7023 /* ----------------------------------------------------------------------- */
7025 * Creates a J2K decompression structure.
7027 * @return a handle to a J2K decompressor if successful, NULL otherwise.
7029 opj_j2k_t* j2k_create_decompress()
7031 opj_j2k_t *l_j2k = (opj_j2k_t*) opj_malloc(sizeof(opj_j2k_t));
7037 memset(l_j2k,0,sizeof(opj_j2k_t));
7038 l_j2k->m_is_decoder = 1;
7039 l_j2k->m_cp.m_is_decoder = 1;
7040 l_j2k->m_specific_param.m_decoder.m_default_tcp = (opj_tcp_t*) opj_malloc(sizeof(opj_tcp_t));
7042 (!l_j2k->m_specific_param.m_decoder.m_default_tcp)
7047 memset(l_j2k->m_specific_param.m_decoder.m_default_tcp,0,sizeof(opj_tcp_t));
7049 l_j2k->m_specific_param.m_decoder.m_header_data = (OPJ_BYTE *) opj_malloc(J2K_DEFAULT_HEADER_SIZE);
7051 (! l_j2k->m_specific_param.m_decoder.m_header_data)
7056 l_j2k->m_specific_param.m_decoder.m_header_data_size = J2K_DEFAULT_HEADER_SIZE;
7058 // validation list creation
7059 l_j2k->m_validation_list = opj_procedure_list_create();
7061 (! l_j2k->m_validation_list)
7067 // execution list creation
7068 l_j2k->m_procedure_list = opj_procedure_list_create();
7070 (! l_j2k->m_procedure_list)
7078 opj_j2k_t* j2k_create_compress()
7080 opj_j2k_t *l_j2k = (opj_j2k_t*) opj_malloc(sizeof(opj_j2k_t));
7086 memset(l_j2k,0,sizeof(opj_j2k_t));
7087 l_j2k->m_is_decoder = 0;
7088 l_j2k->m_cp.m_is_decoder = 0;
7090 l_j2k->m_specific_param.m_encoder.m_header_tile_data = (OPJ_BYTE *) opj_malloc(J2K_DEFAULT_HEADER_SIZE);
7092 (! l_j2k->m_specific_param.m_encoder.m_header_tile_data)
7097 l_j2k->m_specific_param.m_encoder.m_header_tile_data_size = J2K_DEFAULT_HEADER_SIZE;
7099 // validation list creation
7100 l_j2k->m_validation_list = opj_procedure_list_create();
7102 (! l_j2k->m_validation_list)
7108 // execution list creation
7109 l_j2k->m_procedure_list = opj_procedure_list_create();
7111 (! l_j2k->m_procedure_list)
7121 * Destroys a jpeg2000 codec.
7123 * @param p_j2k the jpeg20000 structure to destroy.
7125 void j2k_destroy (opj_j2k_t *p_j2k)
7134 (p_j2k->m_is_decoder)
7137 (p_j2k->m_specific_param.m_decoder.m_default_tcp != 00)
7139 j2k_tcp_destroy(p_j2k->m_specific_param.m_decoder.m_default_tcp);
7140 opj_free(p_j2k->m_specific_param.m_decoder.m_default_tcp);
7141 p_j2k->m_specific_param.m_decoder.m_default_tcp = 00;
7144 (p_j2k->m_specific_param.m_decoder.m_header_data != 00)
7146 opj_free(p_j2k->m_specific_param.m_decoder.m_header_data);
7147 p_j2k->m_specific_param.m_decoder.m_header_data = 00;
7148 p_j2k->m_specific_param.m_decoder.m_header_data_size = 0;
7155 (p_j2k->m_specific_param.m_encoder.m_encoded_tile_data)
7157 opj_free(p_j2k->m_specific_param.m_encoder.m_encoded_tile_data);
7158 p_j2k->m_specific_param.m_encoder.m_encoded_tile_data = 00;
7161 (p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer)
7163 opj_free(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer);
7164 p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer = 00;
7165 p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current = 00;
7168 (p_j2k->m_specific_param.m_encoder.m_header_tile_data)
7170 opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
7171 p_j2k->m_specific_param.m_encoder.m_header_tile_data = 00;
7172 p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
7175 tcd_destroy(p_j2k->m_tcd);
7177 j2k_cp_destroy(&(p_j2k->m_cp));
7178 memset(&(p_j2k->m_cp),0,sizeof(opj_cp_t));
7180 opj_procedure_list_destroy(p_j2k->m_procedure_list);
7181 p_j2k->m_procedure_list = 00;
7183 opj_procedure_list_destroy(p_j2k->m_validation_list);
7184 p_j2k->m_procedure_list = 00;
7190 * Starts a compression scheme, i.e. validates the codec parameters, writes the header.
7192 * @param p_j2k the jpeg2000 codec.
7193 * @param p_stream the stream object.
7194 * @param p_manager the user event manager.
7196 * @return true if the codec is valid.
7198 bool j2k_start_compress(
7200 opj_stream_private_t *p_stream,
7201 opj_image_t * p_image,
7202 opj_event_mgr_t * p_manager)
7205 assert(p_j2k != 00);
7206 assert(p_stream != 00);
7207 assert(p_manager != 00);
7208 p_j2k->m_image = p_image;
7211 /* customization of the validation */
7212 j2k_setup_encoding_validation (p_j2k);
7214 /* validation of the parameters codec */
7216 (! j2k_exec(p_j2k,p_j2k->m_validation_list,p_stream,p_manager))
7221 /* customization of the encoding */
7222 j2k_setup_header_writting(p_j2k);
7226 (! j2k_exec (p_j2k,p_j2k->m_procedure_list,p_stream,p_manager))
7233 * Sets up the procedures to do on reading header. Developpers wanting to extend the library can add their own reading procedures.
7235 void j2k_setup_header_reading (opj_j2k_t *p_j2k)
7238 assert(p_j2k != 00);
7239 opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(void*)j2k_read_header_procedure);
7241 /* DEVELOPER CORNER, add your custom procedures */
7242 opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(void*)j2k_copy_default_tcp_and_create_tcd);
7247 * Sets up the procedures to do on decoding data. Developpers wanting to extend the library can add their own reading procedures.
7249 void j2k_setup_decoding (opj_j2k_t *p_j2k)
7252 assert(p_j2k != 00);
7254 opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(void*)j2k_decode_tiles);
7255 /* DEVELOPER CORNER, add your custom procedures */
7260 * Sets up the procedures to do on writting header. Developpers wanting to extend the library can add their own writting procedures.
7262 void j2k_setup_header_writting (opj_j2k_t *p_j2k)
7265 assert(p_j2k != 00);
7266 opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(void*)j2k_init_info );
7267 opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(void*)j2k_write_soc );
7268 opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(void*)j2k_write_siz );
7269 opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(void*)j2k_write_cod );
7270 opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(void*)j2k_write_qcd );
7274 (p_j2k->m_cp.m_specific_param.m_enc.m_cinema)
7276 opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(void*)j2k_write_image_components );
7277 opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(void*)j2k_write_tlm );
7279 (p_j2k->m_cp.m_specific_param.m_enc.m_cinema == CINEMA4K_24)
7281 opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(void*)j2k_write_poc );
7284 opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(void*)j2k_write_regions);
7287 (p_j2k->m_cp.comment != 00)
7289 opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(void*)j2k_write_com);
7292 /* DEVELOPER CORNER, insert your custom procedures */
7294 (p_j2k->m_cp.rsiz & MCT)
7296 opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(void*)j2k_write_mct_data_group );
7298 /* End of Developer Corner */
7303 opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(void*)j2k_get_end_header );
7305 opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(void*)j2k_create_tcd);
7306 opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(void*)j2k_update_rates);
7310 * Sets up the validation ,i.e. adds the procedures to lauch to make sure the codec parameters
7311 * are valid. Developpers wanting to extend the library can add their own validation procedures.
7313 void j2k_setup_end_compress (opj_j2k_t *p_j2k)
7316 assert(p_j2k != 00);
7318 /* DEVELOPER CORNER, insert your custom procedures */
7319 opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(void*)j2k_write_eoc );
7321 (p_j2k->m_cp.m_specific_param.m_enc.m_cinema)
7323 opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(void*)j2k_write_updated_tlm);
7325 opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(void*)j2k_write_epc );
7326 opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(void*)j2k_end_encoding );
7327 opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(void*)j2k_destroy_header_memory);
7333 * Sets up the validation ,i.e. adds the procedures to lauch to make sure the codec parameters
7334 * are valid. Developpers wanting to extend the library can add their own validation procedures.
7336 void j2k_setup_encoding_validation (opj_j2k_t *p_j2k)
7339 assert(p_j2k != 00);
7340 opj_procedure_list_add_procedure(p_j2k->m_validation_list, (void*)j2k_build_encoder);
7341 opj_procedure_list_add_procedure(p_j2k->m_validation_list, (void*)j2k_encoding_validation);
7344 /* DEVELOPER CORNER, add your custom validation procedure */
7345 opj_procedure_list_add_procedure(p_j2k->m_validation_list, (void*)j2k_mct_validation);
7349 * Sets up the validation ,i.e. adds the procedures to lauch to make sure the codec parameters
7350 * are valid. Developpers wanting to extend the library can add their own validation procedures.
7352 void j2k_setup_decoding_validation (opj_j2k_t *p_j2k)
7355 assert(p_j2k != 00);
7356 opj_procedure_list_add_procedure(p_j2k->m_validation_list, (void*)j2k_build_decoder);
7357 opj_procedure_list_add_procedure(p_j2k->m_validation_list, (void*)j2k_decoding_validation);
7358 /* DEVELOPER CORNER, add your custom validation procedure */
7364 * Excutes the given procedures on the given codec.
7366 * @param p_procedure_list the list of procedures to execute
7367 * @param p_j2k the jpeg2000 codec to execute the procedures on.
7368 * @param p_stream the stream to execute the procedures on.
7369 * @param p_manager the user manager.
7371 * @return true if all the procedures were successfully executed.
7375 opj_procedure_list_t * p_procedure_list,
7376 opj_stream_private_t *p_stream,
7377 opj_event_mgr_t * p_manager
7380 bool (** l_procedure) (opj_j2k_t * ,opj_stream_private_t *,opj_event_mgr_t *) = 00;
7381 bool l_result = true;
7382 OPJ_UINT32 l_nb_proc, i;
7385 assert(p_procedure_list != 00);
7386 assert(p_j2k != 00);
7387 assert(p_stream != 00);
7388 assert(p_manager != 00);
7390 l_nb_proc = opj_procedure_list_get_nb_procedures(p_procedure_list);
7391 l_procedure = (bool (**) (opj_j2k_t * ,opj_stream_private_t *,opj_event_mgr_t *)) opj_procedure_list_get_first_procedure(p_procedure_list);
7393 (i=0;i<l_nb_proc;++i)
7395 l_result = l_result && ((*l_procedure) (p_j2k,p_stream,p_manager));
7398 // and clear the procedure list at the end.
7399 opj_procedure_list_clear(p_procedure_list);
7404 * The default encoding validation procedure without any extension.
7406 * @param p_j2k the jpeg2000 codec to validate.
7407 * @param p_stream the input stream to validate.
7408 * @param p_manager the user event manager.
7410 * @return true if the parameters are correct.
7412 bool j2k_encoding_validation (
7414 opj_stream_private_t *p_stream,
7415 opj_event_mgr_t * p_manager
7418 bool l_is_valid = true;
7421 assert(p_j2k != 00);
7422 assert(p_stream != 00);
7423 assert(p_manager != 00);
7425 /* STATE checking */
7426 /* make sure the state is at 0 */
7427 l_is_valid &= (p_j2k->m_specific_param.m_decoder.m_state == J2K_DEC_STATE_NONE);
7429 /* POINTER validation */
7430 /* make sure a p_j2k codec is present */
7431 l_is_valid &= (p_j2k->m_procedure_list != 00);
7432 /* make sure a validation list is present */
7433 l_is_valid &= (p_j2k->m_validation_list != 00);
7436 ((p_j2k->m_cp.tdx) < (OPJ_UINT32) (1 << p_j2k->m_cp.tcps->tccps->numresolutions))
7438 opj_event_msg(p_manager, EVT_ERROR, "Number of resolutions is too high in comparison to the size of tiles\n");
7442 ((p_j2k->m_cp.tdy) < (OPJ_UINT32) (1 << p_j2k->m_cp.tcps->tccps->numresolutions))
7444 opj_event_msg(p_manager, EVT_ERROR, "Number of resolutions is too high in comparison to the size of tiles\n");
7448 /* PARAMETER VALIDATION */
7453 * The default decoding validation procedure without any extension.
7455 * @param p_j2k the jpeg2000 codec to validate.
7456 * @param p_stream the input stream to validate.
7457 * @param p_manager the user event manager.
7459 * @return true if the parameters are correct.
7461 bool j2k_decoding_validation (
7463 opj_stream_private_t *p_stream,
7464 opj_event_mgr_t * p_manager
7467 bool l_is_valid = true;
7470 assert(p_j2k != 00);
7471 assert(p_stream != 00);
7472 assert(p_manager != 00);
7474 /* STATE checking */
7475 /* make sure the state is at 0 */
7476 l_is_valid &= (p_j2k->m_specific_param.m_decoder.m_state == J2K_DEC_STATE_NONE);
7478 /* POINTER validation */
7479 /* make sure a p_j2k codec is present */
7480 /* make sure a procedure list is present */
7481 l_is_valid &= (p_j2k->m_procedure_list != 00);
7482 /* make sure a validation list is present */
7483 l_is_valid &= (p_j2k->m_validation_list != 00);
7485 /* PARAMETER VALIDATION */
7490 * The mct encoding validation procedure.
7492 * @param p_j2k the jpeg2000 codec to validate.
7493 * @param p_stream the input stream to validate.
7494 * @param p_manager the user event manager.
7496 * @return true if the parameters are correct.
7498 bool j2k_mct_validation (
7500 opj_stream_private_t *p_stream,
7501 opj_event_mgr_t * p_manager
7504 bool l_is_valid = true;
7508 assert(p_j2k != 00);
7509 assert(p_stream != 00);
7510 assert(p_manager != 00);
7513 ((p_j2k->m_cp.rsiz & 0x8200) == 0x8200)
7515 OPJ_UINT32 l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
7516 opj_tcp_t * l_tcp = p_j2k->m_cp.tcps;
7518 (i=0;i<l_nb_tiles;++i)
7523 opj_tccp_t * l_tccp = l_tcp->tccps;
7524 l_is_valid &= (l_tcp->m_mct_coding_matrix != 00);
7526 (j=0;j<p_j2k->m_image->numcomps;++j)
7528 l_is_valid &= ! (l_tccp->qmfbid & 1);
7539 * Builds the cp decoder parameters to use to decode tile.
7541 bool j2k_build_decoder (
7543 opj_stream_private_t *p_stream,
7544 opj_event_mgr_t * p_manager
7547 // add here initialization of cp
7548 // copy paste of setup_decoder
7553 * Builds the cp encoder parameters to use to encode tile.
7555 bool j2k_build_encoder (
7557 opj_stream_private_t *p_stream,
7558 opj_event_mgr_t * p_manager
7561 // add here initialization of cp
7562 // copy paste of setup_encoder
7566 bool j2k_copy_default_tcp_and_create_tcd
7569 opj_stream_private_t *p_stream,
7570 opj_event_mgr_t * p_manager
7573 opj_tcp_t * l_tcp = 00;
7574 opj_tcp_t * l_default_tcp = 00;
7575 OPJ_UINT32 l_nb_tiles;
7577 opj_tccp_t *l_current_tccp = 00;
7578 OPJ_UINT32 l_tccp_size;
7579 OPJ_UINT32 l_mct_size;
7580 opj_image_t * l_image;
7581 OPJ_UINT32 l_mcc_records_size,l_mct_records_size;
7582 opj_mct_data_t * l_src_mct_rec, *l_dest_mct_rec;
7583 opj_simple_mcc_decorrelation_data_t * l_src_mcc_rec, *l_dest_mcc_rec;
7584 OPJ_UINT32 l_offset;
7586 // preconditions in debug
7587 assert(p_j2k != 00);
7588 assert(p_stream != 00);
7589 assert(p_manager != 00);
7591 l_image = p_j2k->m_image;
7592 l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
7593 l_tcp = p_j2k->m_cp.tcps;
7594 l_tccp_size = l_image->numcomps * sizeof(opj_tccp_t);
7595 l_default_tcp = p_j2k->m_specific_param.m_decoder.m_default_tcp;
7596 l_mct_size = l_image->numcomps * l_image->numcomps * sizeof(OPJ_FLOAT32);
7598 (i=0;i<l_nb_tiles;++i)
7600 l_current_tccp = l_tcp->tccps;
7601 memcpy(l_tcp,l_default_tcp, sizeof(opj_tcp_t));
7603 l_tcp->ppt_data = 00;
7604 l_tcp->tccps = l_current_tccp;
7606 (l_default_tcp->m_mct_decoding_matrix)
7608 l_tcp->m_mct_decoding_matrix = (OPJ_FLOAT32*)opj_malloc(l_mct_size);
7610 (! l_tcp->m_mct_decoding_matrix )
7614 memcpy(l_tcp->m_mct_decoding_matrix,l_default_tcp->m_mct_decoding_matrix,l_mct_size);
7616 l_mct_records_size = l_default_tcp->m_nb_max_mct_records * sizeof(opj_mct_data_t);
7617 l_tcp->m_mct_records = (opj_mct_data_t*)opj_malloc(l_mct_records_size);
7619 (! l_tcp->m_mct_records)
7623 memcpy(l_tcp->m_mct_records, l_default_tcp->m_mct_records,l_mct_records_size);
7624 l_src_mct_rec = l_default_tcp->m_mct_records;
7625 l_dest_mct_rec = l_tcp->m_mct_records;
7627 (j=0;j<l_default_tcp->m_nb_mct_records;++j)
7630 (l_src_mct_rec->m_data)
7632 l_dest_mct_rec->m_data = (OPJ_BYTE*)
7633 opj_malloc(l_src_mct_rec->m_data_size);
7635 (! l_dest_mct_rec->m_data)
7639 memcpy(l_dest_mct_rec->m_data,l_src_mct_rec->m_data,l_src_mct_rec->m_data_size);
7644 l_mcc_records_size = l_default_tcp->m_nb_max_mcc_records * sizeof(opj_simple_mcc_decorrelation_data_t);
7645 l_tcp->m_mcc_records = (opj_simple_mcc_decorrelation_data_t*)
7646 opj_malloc(l_mcc_records_size);
7648 (! l_tcp->m_mcc_records)
7652 memcpy(l_tcp->m_mcc_records,l_default_tcp->m_mcc_records,l_mcc_records_size);
7653 l_src_mcc_rec = l_default_tcp->m_mcc_records;
7654 l_dest_mcc_rec = l_tcp->m_mcc_records;
7656 (j=0;j<l_default_tcp->m_nb_max_mcc_records;++j)
7659 (l_src_mcc_rec->m_decorrelation_array)
7661 l_offset = l_src_mcc_rec->m_decorrelation_array - l_default_tcp->m_mct_records;
7662 l_dest_mcc_rec->m_decorrelation_array = l_tcp->m_mct_records + l_offset;
7665 (l_src_mcc_rec->m_offset_array)
7667 l_offset = l_src_mcc_rec->m_offset_array - l_default_tcp->m_mct_records;
7668 l_dest_mcc_rec->m_offset_array = l_tcp->m_mct_records + l_offset;
7673 memcpy(l_current_tccp,l_default_tcp->tccps,l_tccp_size);
7676 p_j2k->m_tcd = tcd_create(true);
7683 (! tcd_init(p_j2k->m_tcd, l_image, &(p_j2k->m_cp)))
7685 tcd_destroy(p_j2k->m_tcd);
7687 opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
7694 * Destroys the memory associated with the decoding of headers.
7696 bool j2k_destroy_header_memory (
7698 opj_stream_private_t *p_stream,
7699 opj_event_mgr_t * p_manager
7702 // preconditions in debug
7703 assert(p_j2k != 00);
7704 assert(p_stream != 00);
7705 assert(p_manager != 00);
7708 (p_j2k->m_specific_param.m_encoder.m_header_tile_data)
7710 opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
7711 p_j2k->m_specific_param.m_encoder.m_header_tile_data = 0;
7713 p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
7718 * Sets up the decoder decoding parameters using user parameters.
7719 * Decoding parameters are stored in p_j2k->m_cp.
7721 * @param p_j2k J2K codec
7722 * @param p_parameters decompression parameters
7725 void j2k_setup_decoder(
7727 opj_dparameters_t *p_parameters
7731 (p_j2k && p_parameters)
7733 /* create and initialize the coding parameters structure */
7734 p_j2k->m_cp.m_specific_param.m_dec.m_reduce = p_parameters->cp_reduce;
7735 p_j2k->m_cp.m_specific_param.m_dec.m_layer = p_parameters->cp_layer;
7736 p_j2k->m_specific_param.m_decoder.m_discard_tiles = p_parameters->m_use_restrict_decode;
7738 (p_parameters->m_use_restrict_decode)
7740 p_j2k->m_specific_param.m_decoder.m_start_tile_x = p_parameters->m_decode_start_x;
7741 p_j2k->m_specific_param.m_decoder.m_start_tile_y = p_parameters->m_decode_start_y;
7742 p_j2k->m_specific_param.m_decoder.m_end_tile_x = p_parameters->m_decode_end_x;
7743 p_j2k->m_specific_param.m_decoder.m_end_tile_y = p_parameters->m_decode_end_y;
7747 cp->correct = parameters->jpwl_correct;
7748 cp->exp_comps = parameters->jpwl_exp_comps;
7749 cp->max_tiles = parameters->jpwl_max_tiles;
7750 #endif /* USE_JPWL */
7754 void j2k_setup_encoder(opj_j2k_t *p_j2k, opj_cparameters_t *parameters, opj_image_t *image, struct opj_event_mgr * p_manager) {
7755 OPJ_UINT32 i, j, tileno, numpocs_tile;
7758 if(!p_j2k || !parameters || ! image) {
7762 /* keep a link to cp so that we can destroy it later in j2k_destroy_compress */
7763 cp = &(p_j2k->m_cp);
7765 /* set default values for cp */
7770 copy user encoding parameters
7772 cp->m_specific_param.m_enc.m_cinema = parameters->cp_cinema;
7773 cp->m_specific_param.m_enc.m_max_comp_size = parameters->max_comp_size;
7774 cp->rsiz = parameters->cp_rsiz;
7775 cp->m_specific_param.m_enc.m_disto_alloc = parameters->cp_disto_alloc;
7776 cp->m_specific_param.m_enc.m_fixed_alloc = parameters->cp_fixed_alloc;
7777 cp->m_specific_param.m_enc.m_fixed_quality = parameters->cp_fixed_quality;
7779 /* mod fixed_quality */
7781 (parameters->cp_matrice)
7783 size_t array_size = parameters->tcp_numlayers * parameters->numresolution * 3 * sizeof(OPJ_INT32);
7784 cp->m_specific_param.m_enc.m_matrice = (OPJ_INT32 *) opj_malloc(array_size);
7785 memcpy(cp->m_specific_param.m_enc.m_matrice, parameters->cp_matrice, array_size);
7789 cp->tdx = parameters->cp_tdx;
7790 cp->tdy = parameters->cp_tdy;
7793 cp->tx0 = parameters->cp_tx0;
7794 cp->ty0 = parameters->cp_ty0;
7796 /* comment string */
7797 if(parameters->cp_comment) {
7798 cp->comment = (char*)opj_malloc(strlen(parameters->cp_comment) + 1);
7800 strcpy(cp->comment, parameters->cp_comment);
7805 calculate other encoding parameters
7808 if (parameters->tile_size_on) {
7809 cp->tw = int_ceildiv(image->x1 - cp->tx0, cp->tdx);
7810 cp->th = int_ceildiv(image->y1 - cp->ty0, cp->tdy);
7812 cp->tdx = image->x1 - cp->tx0;
7813 cp->tdy = image->y1 - cp->ty0;
7819 cp->m_specific_param.m_enc.m_tp_flag = parameters->tp_flag;
7820 cp->m_specific_param.m_enc.m_tp_on = 1;
7825 calculate JPWL encoding parameters
7828 if (parameters->jpwl_epc_on) {
7833 cp->info_on = false; /* no informative technique */
7836 if ((parameters->jpwl_hprot_MH > 0) || (parameters->jpwl_hprot_TPH[0] > 0)) {
7839 cp->hprot_MH = parameters->jpwl_hprot_MH;
7840 for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
7841 cp->hprot_TPH_tileno[i] = parameters->jpwl_hprot_TPH_tileno[i];
7842 cp->hprot_TPH[i] = parameters->jpwl_hprot_TPH[i];
7844 /* if tile specs are not specified, copy MH specs */
7845 if (cp->hprot_TPH[0] == -1) {
7846 cp->hprot_TPH_tileno[0] = 0;
7847 cp->hprot_TPH[0] = parameters->jpwl_hprot_MH;
7849 for (i = 0; i < JPWL_MAX_NO_PACKSPECS; i++) {
7850 cp->pprot_tileno[i] = parameters->jpwl_pprot_tileno[i];
7851 cp->pprot_packno[i] = parameters->jpwl_pprot_packno[i];
7852 cp->pprot[i] = parameters->jpwl_pprot[i];
7856 /* set ESD writing */
7857 if ((parameters->jpwl_sens_size == 1) || (parameters->jpwl_sens_size == 2)) {
7860 cp->sens_size = parameters->jpwl_sens_size;
7861 cp->sens_addr = parameters->jpwl_sens_addr;
7862 cp->sens_range = parameters->jpwl_sens_range;
7864 cp->sens_MH = parameters->jpwl_sens_MH;
7865 for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
7866 cp->sens_TPH_tileno[i] = parameters->jpwl_sens_TPH_tileno[i];
7867 cp->sens_TPH[i] = parameters->jpwl_sens_TPH[i];
7871 /* always set RED writing to false: we are at the encoder */
7877 #endif /* USE_JPWL */
7880 /* initialize the mutiple tiles */
7881 /* ---------------------------- */
7882 cp->tcps = (opj_tcp_t*) opj_calloc(cp->tw * cp->th, sizeof(opj_tcp_t));
7884 (parameters->numpocs)
7886 /* initialisation of POC */
7887 l_res = j2k_check_poc_val(parameters->POC,parameters->numpocs, parameters->numresolution, image->numcomps, parameters->tcp_numlayers, p_manager);
7890 for (tileno = 0; tileno < cp->tw * cp->th; tileno++) {
7891 opj_tcp_t *tcp = &cp->tcps[tileno];
7892 tcp->numlayers = parameters->tcp_numlayers;
7893 for (j = 0; j < tcp->numlayers; j++) {
7894 if(cp->m_specific_param.m_enc.m_cinema){
7895 if (cp->m_specific_param.m_enc.m_fixed_quality) {
7896 tcp->distoratio[j] = parameters->tcp_distoratio[j];
7898 tcp->rates[j] = parameters->tcp_rates[j];
7900 if (cp->m_specific_param.m_enc.m_fixed_quality) { /* add fixed_quality */
7901 tcp->distoratio[j] = parameters->tcp_distoratio[j];
7903 tcp->rates[j] = parameters->tcp_rates[j];
7907 tcp->csty = parameters->csty;
7908 tcp->prg = parameters->prog_order;
7909 tcp->mct = parameters->tcp_mct;
7916 (parameters->numpocs)
7918 /* initialisation of POC */
7921 for (i = 0; i < (unsigned int) parameters->numpocs; i++) {
7922 if((tileno == parameters->POC[i].tile - 1) || (parameters->POC[i].tile == -1)) {
7923 opj_poc_t *tcp_poc = &tcp->pocs[numpocs_tile];
7924 tcp_poc->resno0 = parameters->POC[numpocs_tile].resno0;
7925 tcp_poc->compno0 = parameters->POC[numpocs_tile].compno0;
7926 tcp_poc->layno1 = parameters->POC[numpocs_tile].layno1;
7927 tcp_poc->resno1 = parameters->POC[numpocs_tile].resno1;
7928 tcp_poc->compno1 = parameters->POC[numpocs_tile].compno1;
7929 tcp_poc->prg1 = parameters->POC[numpocs_tile].prg1;
7930 tcp_poc->tile = parameters->POC[numpocs_tile].tile;
7934 tcp->numpocs = numpocs_tile -1 ;
7939 tcp->tccps = (opj_tccp_t*) opj_calloc(image->numcomps, sizeof(opj_tccp_t));
7941 (parameters->mct_data)
7943 OPJ_UINT32 lMctSize = image->numcomps * image->numcomps * sizeof(OPJ_FLOAT32);
7944 OPJ_FLOAT32 * lTmpBuf = (OPJ_FLOAT32*)opj_malloc(lMctSize);
7945 OPJ_INT32 * l_dc_shift = (OPJ_INT32 *) ((OPJ_BYTE *) parameters->mct_data + lMctSize);
7947 tcp->m_mct_coding_matrix = (OPJ_FLOAT32*)opj_malloc(lMctSize);
7948 memcpy(tcp->m_mct_coding_matrix,parameters->mct_data,lMctSize);
7949 memcpy(lTmpBuf,parameters->mct_data,lMctSize);
7950 tcp->m_mct_decoding_matrix = (OPJ_FLOAT32*)opj_malloc(lMctSize);
7951 assert(opj_matrix_inversion_f(lTmpBuf,(tcp->m_mct_decoding_matrix),image->numcomps));
7952 tcp->mct_norms = (OPJ_FLOAT64*)
7953 opj_malloc(image->numcomps * sizeof(OPJ_FLOAT64));
7954 opj_calculate_norms(tcp->mct_norms,image->numcomps,tcp->m_mct_decoding_matrix);
7957 (i = 0; i < image->numcomps; i++)
7959 opj_tccp_t *tccp = &tcp->tccps[i];
7960 tccp->m_dc_level_shift = l_dc_shift[i];
7962 j2k_setup_mct_encoding(tcp,image);
7967 (i = 0; i < image->numcomps; i++)
7969 opj_tccp_t *tccp = &tcp->tccps[i];
7970 opj_image_comp_t * l_comp = &(image->comps[i]);
7974 tccp->m_dc_level_shift = 1 << (l_comp->prec - 1);
7980 for (i = 0; i < image->numcomps; i++) {
7981 opj_tccp_t *tccp = &tcp->tccps[i];
7982 tccp->csty = parameters->csty & 0x01; /* 0 => one precinct || 1 => custom precinct */
7983 tccp->numresolutions = parameters->numresolution;
7984 tccp->cblkw = int_floorlog2(parameters->cblockw_init);
7985 tccp->cblkh = int_floorlog2(parameters->cblockh_init);
7986 tccp->cblksty = parameters->mode;
7987 tccp->qmfbid = parameters->irreversible ? 0 : 1;
7988 tccp->qntsty = parameters->irreversible ? J2K_CCP_QNTSTY_SEQNT : J2K_CCP_QNTSTY_NOQNT;
7990 if (i == parameters->roi_compno) {
7991 tccp->roishift = parameters->roi_shift;
7996 if(parameters->cp_cinema)
7998 //Precinct size for lowest frequency subband=128
8001 //Precinct size at all other resolutions = 256
8002 for (j = 1; j < tccp->numresolutions; j++) {
8007 if (parameters->csty & J2K_CCP_CSTY_PRT) {
8009 for (j = tccp->numresolutions - 1; j >= 0; j--) {
8010 if (p < parameters->res_spec) {
8012 if (parameters->prcw_init[p] < 1) {
8015 tccp->prcw[j] = int_floorlog2(parameters->prcw_init[p]);
8018 if (parameters->prch_init[p] < 1) {
8021 tccp->prch[j] = int_floorlog2(parameters->prch_init[p]);
8025 int res_spec = parameters->res_spec;
8026 int size_prcw = parameters->prcw_init[res_spec - 1] >> (p - (res_spec - 1));
8027 int size_prch = parameters->prch_init[res_spec - 1] >> (p - (res_spec - 1));
8029 if (size_prcw < 1) {
8032 tccp->prcw[j] = int_floorlog2(size_prcw);
8035 if (size_prch < 1) {
8038 tccp->prch[j] = int_floorlog2(size_prch);
8042 /*printf("\nsize precinct for level %d : %d,%d\n", j,tccp->prcw[j], tccp->prch[j]); */
8045 for (j = 0; j < tccp->numresolutions; j++) {
8052 dwt_calc_explicit_stepsizes(tccp, image->comps[i].prec);
8056 (parameters->mct_data)
8058 opj_free(parameters->mct_data);
8059 parameters->mct_data = 00;
8063 bool j2k_write_first_tile_part (
8066 OPJ_UINT32 * p_data_written,
8067 OPJ_UINT32 p_total_data_size,
8068 opj_stream_private_t *p_stream,
8069 struct opj_event_mgr * p_manager
8073 OPJ_UINT32 l_nb_bytes_written = 0;
8074 OPJ_UINT32 l_current_nb_bytes_written;
8075 OPJ_BYTE * l_begin_data = 00;
8077 opj_tcp_t *l_tcp = 00;
8078 opj_tcd_t * l_tcd = 00;
8079 opj_cp_t * l_cp = 00;
8081 l_tcd = p_j2k->m_tcd;
8082 l_cp = &(p_j2k->m_cp);
8083 l_tcp = l_cp->tcps + p_j2k->m_current_tile_number;
8085 l_tcd->cur_pino = 0;
8086 /*Get number of tile parts*/
8088 p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = 0;
8092 l_current_nb_bytes_written = 0;
8093 l_begin_data = p_data;
8095 (! j2k_write_sot(p_j2k,p_data,&l_current_nb_bytes_written,p_stream,p_manager))
8099 l_nb_bytes_written += l_current_nb_bytes_written;
8100 p_data += l_current_nb_bytes_written;
8101 p_total_data_size -= l_current_nb_bytes_written;
8104 (l_cp->m_specific_param.m_enc.m_cinema == 0)
8107 (compno = 1; compno < p_j2k->m_image->numcomps; compno++)
8109 l_current_nb_bytes_written = 0;
8110 j2k_write_coc_in_memory(p_j2k,compno,p_data,&l_current_nb_bytes_written,p_manager);
8111 l_nb_bytes_written += l_current_nb_bytes_written;
8112 p_data += l_current_nb_bytes_written;
8113 p_total_data_size -= l_current_nb_bytes_written;
8115 l_current_nb_bytes_written = 0;
8116 j2k_write_qcc_in_memory(p_j2k,compno,p_data,&l_current_nb_bytes_written,p_manager);
8117 l_nb_bytes_written += l_current_nb_bytes_written;
8118 p_data += l_current_nb_bytes_written;
8119 p_total_data_size -= l_current_nb_bytes_written;
8122 (l_cp->tcps[p_j2k->m_current_tile_number].numpocs)
8124 l_current_nb_bytes_written = 0;
8125 j2k_write_poc_in_memory(p_j2k,p_data,&l_current_nb_bytes_written,p_manager);
8126 l_nb_bytes_written += l_current_nb_bytes_written;
8127 p_data += l_current_nb_bytes_written;
8128 p_total_data_size -= l_current_nb_bytes_written;
8131 l_current_nb_bytes_written = 0;
8133 (! j2k_write_sod(p_j2k,l_tcd,p_data,&l_current_nb_bytes_written,p_total_data_size,p_stream,p_manager))
8137 l_nb_bytes_written += l_current_nb_bytes_written;
8138 * p_data_written = l_nb_bytes_written;
8140 /* Writing Psot in SOT marker */
8141 opj_write_bytes(l_begin_data + 6,l_nb_bytes_written,4); /* PSOT */
8143 (l_cp->m_specific_param.m_enc.m_cinema)
8145 j2k_update_tlm(p_j2k,l_nb_bytes_written);
8150 bool j2k_write_all_tile_parts(
8153 OPJ_UINT32 * p_data_written,
8154 OPJ_UINT32 p_total_data_size,
8155 opj_stream_private_t *p_stream,
8156 struct opj_event_mgr * p_manager
8159 OPJ_UINT32 tilepartno=0;
8160 OPJ_UINT32 l_nb_bytes_written = 0;
8161 OPJ_UINT32 l_current_nb_bytes_written;
8162 OPJ_UINT32 l_part_tile_size;
8163 OPJ_UINT32 tot_num_tp;
8166 OPJ_BYTE * l_begin_data;
8167 opj_tcp_t *l_tcp = 00;
8168 opj_tcd_t * l_tcd = 00;
8169 opj_cp_t * l_cp = 00;
8172 l_tcd = p_j2k->m_tcd;
8173 l_cp = &(p_j2k->m_cp);
8174 l_tcp = l_cp->tcps + p_j2k->m_current_tile_number;
8176 /*Get number of tile parts*/
8177 tot_num_tp = j2k_get_num_tp(l_cp,0,p_j2k->m_current_tile_number);
8179 (tilepartno = 1; tilepartno < tot_num_tp ; ++tilepartno)
8181 p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = tilepartno;
8182 l_current_nb_bytes_written = 0;
8183 l_part_tile_size = 0;
8184 l_begin_data = p_data;
8186 (! j2k_write_sot(p_j2k,p_data,&l_current_nb_bytes_written,p_stream,p_manager))
8190 l_nb_bytes_written += l_current_nb_bytes_written;
8191 p_data += l_current_nb_bytes_written;
8192 p_total_data_size -= l_current_nb_bytes_written;
8193 l_part_tile_size += l_nb_bytes_written;
8195 l_current_nb_bytes_written = 0;
8197 (! j2k_write_sod(p_j2k,l_tcd,p_data,&l_current_nb_bytes_written,p_total_data_size,p_stream,p_manager))
8201 p_data += l_current_nb_bytes_written;
8202 l_nb_bytes_written += l_current_nb_bytes_written;
8203 p_total_data_size -= l_current_nb_bytes_written;
8204 l_part_tile_size += l_nb_bytes_written;
8206 /* Writing Psot in SOT marker */
8207 opj_write_bytes(l_begin_data + 6,l_part_tile_size,4); /* PSOT */
8210 (l_cp->m_specific_param.m_enc.m_cinema)
8212 j2k_update_tlm(p_j2k,l_part_tile_size);
8214 ++p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;
8217 (pino = 1; pino <= l_tcp->numpocs; ++pino)
8219 l_tcd->cur_pino = pino;
8220 /*Get number of tile parts*/
8221 tot_num_tp = j2k_get_num_tp(l_cp,pino,p_j2k->m_current_tile_number);
8223 (tilepartno = 0; tilepartno < tot_num_tp ; ++tilepartno)
8225 p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = tilepartno;
8226 l_current_nb_bytes_written = 0;
8227 l_part_tile_size = 0;
8228 l_begin_data = p_data;
8230 (! j2k_write_sot(p_j2k,p_data,&l_current_nb_bytes_written,p_stream,p_manager))
8234 l_nb_bytes_written += l_current_nb_bytes_written;
8235 p_data += l_current_nb_bytes_written;
8236 p_total_data_size -= l_current_nb_bytes_written;
8237 l_part_tile_size += l_current_nb_bytes_written;
8239 l_current_nb_bytes_written = 0;
8241 (! j2k_write_sod(p_j2k,l_tcd,p_data,&l_current_nb_bytes_written,p_total_data_size,p_stream,p_manager))
8245 l_nb_bytes_written += l_current_nb_bytes_written;
8246 p_data += l_current_nb_bytes_written;
8247 p_total_data_size -= l_current_nb_bytes_written;
8248 l_part_tile_size += l_current_nb_bytes_written;
8250 /* Writing Psot in SOT marker */
8251 opj_write_bytes(l_begin_data + 6,l_part_tile_size,4); /* PSOT */
8254 (l_cp->m_specific_param.m_enc.m_cinema)
8256 j2k_update_tlm(p_j2k,l_part_tile_size);
8258 ++p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;
8261 *p_data_written = l_nb_bytes_written;
8266 bool j2k_pre_write_tile (
8268 OPJ_UINT32 p_tile_index,
8269 opj_stream_private_t *p_stream,
8270 opj_event_mgr_t * p_manager
8274 (p_tile_index != p_j2k->m_current_tile_number)
8276 opj_event_msg(p_manager, EVT_ERROR, "The given tile index does not match." );
8280 opj_event_msg(p_manager, EVT_INFO, "tile number %d / %d\n", p_j2k->m_current_tile_number + 1, p_j2k->m_cp.tw * p_j2k->m_cp.th);
8282 p_j2k->m_specific_param.m_encoder.m_current_tile_part_number = 0;
8283 p_j2k->m_tcd->cur_totnum_tp = p_j2k->m_cp.tcps[p_tile_index].m_nb_tile_parts;
8284 p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = 0;
8285 /* initialisation before tile encoding */
8287 (! tcd_init_encode_tile(p_j2k->m_tcd, p_j2k->m_current_tile_number))
8296 * @param p_j2k the jpeg2000 codec.
8297 * @param p_stream the stream to write data to.
8298 * @param p_manager the user event manager.
8300 bool j2k_write_tile (
8302 OPJ_UINT32 p_tile_index,
8304 OPJ_UINT32 p_data_size,
8305 opj_stream_private_t *p_stream,
8306 opj_event_mgr_t * p_manager
8310 (! j2k_pre_write_tile(p_j2k,p_tile_index,p_stream,p_manager))
8314 return j2k_post_write_tile(p_j2k,p_data,p_data_size,p_stream,p_manager);
8319 * @param p_j2k the jpeg2000 codec.
8320 * @param p_stream the stream to write data to.
8321 * @param p_manager the user event manager.
8323 bool j2k_post_write_tile (
8326 OPJ_UINT32 p_data_size,
8327 opj_stream_private_t *p_stream,
8328 opj_event_mgr_t * p_manager
8331 opj_tcd_t * l_tcd = 00;
8332 opj_cp_t * l_cp = 00;
8333 opj_tcp_t * l_tcp = 00;
8334 OPJ_UINT32 l_nb_bytes_written;
8335 OPJ_BYTE * l_current_data = 00;
8336 OPJ_UINT32 l_tile_size = 0;
8337 OPJ_UINT32 l_available_data;
8339 assert(p_j2k->m_specific_param.m_encoder.m_encoded_tile_data);
8341 l_tcd = p_j2k->m_tcd;
8342 l_cp = &(p_j2k->m_cp);
8343 l_tcp = l_cp->tcps + p_j2k->m_current_tile_number;
8345 l_tile_size = p_j2k->m_specific_param.m_encoder.m_encoded_tile_size;
8346 l_available_data = l_tile_size;
8347 l_current_data = p_j2k->m_specific_param.m_encoder.m_encoded_tile_data;
8349 (! tcd_copy_tile_data(l_tcd,p_data,p_data_size))
8351 opj_event_msg(p_manager, EVT_ERROR, "Size mismtach between tile data and sent data." );
8355 l_nb_bytes_written = 0;
8357 (! j2k_write_first_tile_part(p_j2k,l_current_data,&l_nb_bytes_written,l_available_data,p_stream,p_manager))
8361 l_current_data += l_nb_bytes_written;
8362 l_available_data -= l_nb_bytes_written;
8364 l_nb_bytes_written = 0;
8366 (! j2k_write_all_tile_parts(p_j2k,l_current_data,&l_nb_bytes_written,l_available_data,p_stream,p_manager))
8371 l_available_data -= l_nb_bytes_written;
8372 l_nb_bytes_written = l_tile_size - l_available_data;
8375 (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_encoded_tile_data,l_nb_bytes_written,p_manager) != l_nb_bytes_written)
8379 ++p_j2k->m_current_tile_number;
8384 * Reads a tile header.
8385 * @param p_j2k the jpeg2000 codec.
8386 * @param p_stream the stream to write data to.
8387 * @param p_manager the user event manager.
8389 bool j2k_read_tile_header (
8391 OPJ_UINT32 * p_tile_index,
8392 OPJ_UINT32 * p_data_size,
8393 OPJ_INT32 * p_tile_x0,
8394 OPJ_INT32 * p_tile_y0,
8395 OPJ_INT32 * p_tile_x1,
8396 OPJ_INT32 * p_tile_y1,
8397 OPJ_UINT32 * p_nb_comps,
8399 opj_stream_private_t *p_stream,
8400 opj_event_mgr_t * p_manager
8403 OPJ_UINT32 l_current_marker = J2K_MS_SOT;
8404 OPJ_UINT32 l_marker_size;
8405 const opj_dec_memory_marker_handler_t * l_marker_handler = 00;
8406 opj_tcp_t * l_tcp = 00;
8407 OPJ_UINT32 l_nb_tiles;
8410 assert(p_stream != 00);
8411 assert(p_j2k != 00);
8412 assert(p_manager != 00);
8415 (p_j2k->m_specific_param.m_decoder.m_state == J2K_DEC_STATE_EOC)
8417 l_current_marker = J2K_MS_EOC;
8420 (p_j2k->m_specific_param.m_decoder.m_state != J2K_DEC_STATE_TPHSOT)
8426 (! p_j2k->m_specific_param.m_decoder.m_can_decode && l_current_marker != J2K_MS_EOC)
8429 (l_current_marker != J2K_MS_SOD)
8432 (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2)
8434 opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
8437 opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_marker_size,2);
8439 (p_j2k->m_specific_param.m_decoder.m_state & J2K_DEC_STATE_TPH)
8441 p_j2k->m_specific_param.m_decoder.m_sot_length -= (l_marker_size + 2);
8445 l_marker_handler = j2k_get_marker_handler(l_current_marker);
8446 // Check if the marker is known
8448 (! (p_j2k->m_specific_param.m_decoder.m_state & l_marker_handler->states) )
8450 opj_event_msg(p_manager, EVT_ERROR, "Marker is not compliant with its position\n");
8454 (l_marker_size > p_j2k->m_specific_param.m_decoder.m_header_data_size)
8456 p_j2k->m_specific_param.m_decoder.m_header_data = (OPJ_BYTE*)
8457 opj_realloc(p_j2k->m_specific_param.m_decoder.m_header_data,l_marker_size);
8459 (p_j2k->m_specific_param.m_decoder.m_header_data == 00)
8463 p_j2k->m_specific_param.m_decoder.m_header_data_size = l_marker_size;
8467 (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,l_marker_size,p_manager) != l_marker_size)
8469 opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
8473 (! (*(l_marker_handler->handler))(p_j2k,p_j2k->m_specific_param.m_decoder.m_header_data,l_marker_size,p_manager))
8475 opj_event_msg(p_manager, EVT_ERROR, "Marker is not compliant with its position\n");
8479 (p_j2k->m_specific_param.m_decoder.m_skip_data)
8482 (opj_stream_skip(p_stream,p_j2k->m_specific_param.m_decoder.m_sot_length,p_manager) != p_j2k->m_specific_param.m_decoder.m_sot_length)
8484 opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
8487 l_current_marker = J2K_MS_SOD;
8492 (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2)
8494 opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
8497 opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_current_marker,2);
8502 (! p_j2k->m_specific_param.m_decoder.m_skip_data)
8505 (! j2k_read_sod(p_j2k,p_stream,p_manager))
8512 p_j2k->m_specific_param.m_decoder.m_skip_data = 0;
8513 p_j2k->m_specific_param.m_decoder.m_can_decode = 0;
8514 p_j2k->m_specific_param.m_decoder.m_state = J2K_DEC_STATE_TPHSOT;
8516 (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2)
8518 opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
8521 opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_current_marker,2);
8526 (l_current_marker == J2K_MS_EOC)
8529 (p_j2k->m_specific_param.m_decoder.m_state != J2K_DEC_STATE_EOC)
8531 p_j2k->m_current_tile_number = 0;
8532 p_j2k->m_specific_param.m_decoder.m_state = J2K_DEC_STATE_EOC;
8536 ( ! p_j2k->m_specific_param.m_decoder.m_can_decode)
8538 l_tcp = p_j2k->m_cp.tcps + p_j2k->m_current_tile_number;
8539 l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
8542 (p_j2k->m_current_tile_number < l_nb_tiles)
8543 && (l_tcp->m_data == 00)
8546 ++p_j2k->m_current_tile_number;
8550 (p_j2k->m_current_tile_number == l_nb_tiles)
8557 (! tcd_init_decode_tile(p_j2k->m_tcd, p_j2k->m_current_tile_number))
8559 opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
8562 *p_tile_index = p_j2k->m_current_tile_number;
8564 *p_data_size = tcd_get_decoded_tile_size(p_j2k->m_tcd);
8565 * p_tile_x0 = p_j2k->m_tcd->tcd_image->tiles->x0;
8566 * p_tile_y0 = p_j2k->m_tcd->tcd_image->tiles->y0;
8567 * p_tile_x1 = p_j2k->m_tcd->tcd_image->tiles->x1;
8568 * p_tile_y1 = p_j2k->m_tcd->tcd_image->tiles->y1;
8569 * p_nb_comps = p_j2k->m_tcd->tcd_image->tiles->numcomps;
8570 p_j2k->m_specific_param.m_decoder.m_state |= J2K_DEC_STATE_DATA;
8574 bool j2k_decode_tile (
8576 OPJ_UINT32 p_tile_index,
8578 OPJ_UINT32 p_data_size,
8579 opj_stream_private_t *p_stream,
8580 opj_event_mgr_t * p_manager
8583 OPJ_UINT32 l_current_marker;
8584 OPJ_BYTE l_data [2];
8588 assert(p_stream != 00);
8589 assert(p_j2k != 00);
8590 assert(p_manager != 00);
8593 (! (p_j2k->m_specific_param.m_decoder.m_state & J2K_DEC_STATE_DATA) || p_tile_index != p_j2k->m_current_tile_number)
8597 l_tcp = &(p_j2k->m_cp.tcps[p_tile_index]);
8601 j2k_tcp_destroy(&(p_j2k->m_cp.tcps[p_tile_index]));
8605 (! tcd_decode_tile(p_j2k->m_tcd, l_tcp->m_data, l_tcp->m_data_size, p_tile_index, p_j2k->cstr_info))
8607 j2k_tcp_destroy(l_tcp);
8608 p_j2k->m_specific_param.m_decoder.m_state |= J2K_DEC_STATE_ERR;
8612 (! tcd_update_tile_data(p_j2k->m_tcd,p_data,p_data_size))
8616 j2k_tcp_destroy(l_tcp);
8617 p_j2k->m_tcd->tcp = 0;
8619 p_j2k->m_specific_param.m_decoder.m_can_decode = 0;
8620 p_j2k->m_specific_param.m_decoder.m_state &= (~J2K_DEC_STATE_DATA);
8622 (p_j2k->m_specific_param.m_decoder.m_state != J2K_DEC_STATE_EOC)
8625 (opj_stream_read_data(p_stream,l_data,2,p_manager) != 2)
8627 opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
8630 opj_read_bytes(l_data,&l_current_marker,2);
8632 (l_current_marker == J2K_MS_EOC)
8634 p_j2k->m_current_tile_number = 0;
8635 p_j2k->m_specific_param.m_decoder.m_state = J2K_DEC_STATE_EOC;
8638 (l_current_marker != J2K_MS_SOT)
8640 opj_event_msg(p_manager, EVT_ERROR, "Stream too short, expected SOT\n");
8649 * Ends the compression procedures and possibiliy add data to be read after the
8652 bool j2k_end_compress(opj_j2k_t *p_j2k, struct opj_stream_private *p_stream, struct opj_event_mgr * p_manager)
8654 /* customization of the encoding */
8655 j2k_setup_end_compress(p_j2k);
8658 (! j2k_exec (p_j2k,p_j2k->m_procedure_list,p_stream,p_manager))
8666 * Reads a jpeg2000 codestream header structure.
8668 * @param p_stream the stream to read data from.
8669 * @param p_j2k the jpeg2000 codec.
8670 * @param p_manager the user event manager.
8672 * @return true if the box is valid.
8674 bool j2k_read_header(
8676 struct opj_image ** p_image,
8677 OPJ_INT32 * p_tile_x0,
8678 OPJ_INT32 * p_tile_y0,
8679 OPJ_UINT32 * p_tile_width,
8680 OPJ_UINT32 * p_tile_height,
8681 OPJ_UINT32 * p_nb_tiles_x,
8682 OPJ_UINT32 * p_nb_tiles_y,
8683 struct opj_stream_private *p_stream,
8684 struct opj_event_mgr * p_manager
8688 assert(p_j2k != 00);
8689 assert(p_stream != 00);
8690 assert(p_manager != 00);
8693 /* create an empty image */
8694 p_j2k->m_image = opj_image_create0();
8701 /* customization of the validation */
8702 j2k_setup_decoding_validation (p_j2k);
8704 /* validation of the parameters codec */
8706 (! j2k_exec(p_j2k,p_j2k->m_validation_list,p_stream,p_manager))
8708 opj_image_destroy(p_j2k->m_image);
8709 p_j2k->m_image = 00;
8713 /* customization of the encoding */
8714 j2k_setup_header_reading(p_j2k);
8718 (! j2k_exec (p_j2k,p_j2k->m_procedure_list,p_stream,p_manager))
8720 opj_image_destroy(p_j2k->m_image);
8721 p_j2k->m_image = 00;
8724 *p_image = p_j2k->m_image;
8725 * p_tile_x0 = p_j2k->m_cp.tx0;
8726 * p_tile_y0 = p_j2k->m_cp.ty0;
8727 * p_tile_width = p_j2k->m_cp.tdx;
8728 * p_tile_height = p_j2k->m_cp.tdy;
8729 * p_nb_tiles_x = p_j2k->m_cp.tw;
8730 * p_nb_tiles_y = p_j2k->m_cp.th;
8735 * The read header procedure.
8737 bool j2k_read_header_procedure(
8739 struct opj_stream_private *p_stream,
8740 struct opj_event_mgr * p_manager)
8742 OPJ_UINT32 l_current_marker;
8743 OPJ_UINT32 l_marker_size;
8744 const opj_dec_memory_marker_handler_t * l_marker_handler = 00;
8747 assert(p_stream != 00);
8748 assert(p_j2k != 00);
8749 assert(p_manager != 00);
8751 p_j2k->m_specific_param.m_decoder.m_state = J2K_DEC_STATE_MHSOC;
8754 (! j2k_read_soc(p_j2k,p_stream,p_manager))
8756 opj_event_msg(p_manager, EVT_ERROR, "Expected a SOC marker \n");
8760 (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2)
8762 opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
8765 opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_current_marker,2);
8768 (l_current_marker != J2K_MS_SOT)
8771 (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2)
8773 opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
8776 opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_marker_size,2);
8779 (l_current_marker < 0xff00)
8781 opj_event_msg(p_manager, EVT_ERROR, "%.8x: expected a marker instead of %x\n", opj_stream_tell(p_stream) - 2, l_current_marker);
8785 l_marker_handler = j2k_get_marker_handler(l_current_marker);
8786 // Check if the marker is known
8788 (! (p_j2k->m_specific_param.m_decoder.m_state & l_marker_handler->states) )
8790 opj_event_msg(p_manager, EVT_ERROR, "Marker is not compliant with its position\n");
8794 (l_marker_size > p_j2k->m_specific_param.m_decoder.m_header_data_size)
8796 p_j2k->m_specific_param.m_decoder.m_header_data = (OPJ_BYTE*)
8797 opj_realloc(p_j2k->m_specific_param.m_decoder.m_header_data,l_marker_size);
8799 (p_j2k->m_specific_param.m_decoder.m_header_data == 00)
8803 p_j2k->m_specific_param.m_decoder.m_header_data_size = l_marker_size;
8806 (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,l_marker_size,p_manager) != l_marker_size)
8808 opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
8812 (! (*(l_marker_handler->handler))(p_j2k,p_j2k->m_specific_param.m_decoder.m_header_data,l_marker_size,p_manager))
8814 opj_event_msg(p_manager, EVT_ERROR, "Marker is not compliant with its position\n");
8818 (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2)
8820 opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
8823 opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_current_marker,2);
8825 p_j2k->m_specific_param.m_decoder.m_state = J2K_DEC_STATE_TPHSOT;
8834 bool j2k_decode_tiles (
8836 struct opj_stream_private *p_stream,
8837 struct opj_event_mgr * p_manager)
8839 bool l_go_on = true;
8840 OPJ_UINT32 l_current_tile_no;
8841 OPJ_UINT32 l_data_size,l_max_data_size;
8842 OPJ_INT32 l_tile_x0,l_tile_y0,l_tile_x1,l_tile_y1;
8843 OPJ_UINT32 l_nb_comps;
8844 OPJ_BYTE * l_current_data;
8846 l_current_data = (OPJ_BYTE*)opj_malloc(1000);
8852 l_max_data_size = 1000;
8858 (! j2k_read_tile_header(
8859 p_j2k,&l_current_tile_no,
8878 (l_data_size > l_max_data_size)
8880 l_current_data = (OPJ_BYTE*)opj_realloc(l_current_data,l_data_size);
8886 l_max_data_size = l_data_size;
8889 (! j2k_decode_tile(p_j2k,l_current_tile_no,l_current_data,l_data_size,p_stream,p_manager))
8891 opj_free(l_current_data);
8895 (! j2k_update_image_data(p_j2k->m_tcd,l_current_data))
8897 opj_free(l_current_data);
8902 opj_free(l_current_data);
8912 * Decodes the tiles of the stream.
8914 opj_image_t * j2k_decode(
8916 opj_stream_private_t * p_stream,
8917 opj_event_mgr_t * p_manager)
8919 /* customization of the encoding */
8920 j2k_setup_decoding(p_j2k);
8924 (! j2k_exec (p_j2k,p_j2k->m_procedure_list,p_stream,p_manager))
8926 opj_image_destroy(p_j2k->m_image);
8927 p_j2k->m_image = 00;
8929 return p_j2k->m_image;
8933 * Encodes all the tiles in a row.
8937 opj_stream_private_t *p_stream,
8938 opj_event_mgr_t * p_manager
8942 OPJ_UINT32 l_nb_tiles;
8943 OPJ_UINT32 l_max_tile_size, l_current_tile_size;
8944 OPJ_BYTE * l_current_data;
8947 assert(p_j2k != 00);
8948 assert(p_stream != 00);
8949 assert(p_manager != 00);
8951 l_current_data = (OPJ_BYTE*)opj_malloc(1000);
8957 l_max_tile_size = 1000;
8959 l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
8961 (i=0;i<l_nb_tiles;++i)
8964 (! j2k_pre_write_tile(p_j2k,i,p_stream,p_manager))
8966 opj_free(l_current_data);
8969 l_current_tile_size = tcd_get_encoded_tile_size(p_j2k->m_tcd);
8971 (l_current_tile_size > l_max_tile_size)
8973 l_current_data = (OPJ_BYTE*)opj_realloc(l_current_data,l_current_tile_size);
8979 l_max_tile_size = l_current_tile_size;
8981 j2k_get_tile_data(p_j2k->m_tcd,l_current_data);
8983 (! j2k_post_write_tile (p_j2k,l_current_data,l_current_tile_size,p_stream,p_manager))
8988 opj_free(l_current_data);
8995 * Ends the decompression procedures and possibiliy add data to be read after the
8998 bool j2k_end_decompress(
9000 struct opj_stream_private *p_stream,
9001 struct opj_event_mgr * p_manager)
9008 void j2k_get_tile_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data)
9010 OPJ_UINT32 i,j,k = 0;
9011 OPJ_UINT32 l_width,l_height,l_stride, l_offset_x,l_offset_y, l_image_width;
9012 opj_image_comp_t * l_img_comp = 00;
9013 opj_tcd_tilecomp_t * l_tilec = 00;
9014 opj_image_t * l_image = 00;
9015 OPJ_UINT32 l_size_comp, l_remaining;
9016 OPJ_INT32 * l_src_ptr;
9017 l_tilec = p_tcd->tcd_image->tiles->comps;
9018 l_image = p_tcd->image;
9019 l_img_comp = l_image->comps;
9021 (i=0;i<p_tcd->image->numcomps;++i)
9023 l_size_comp = l_img_comp->prec >> 3; /*(/ 8)*/
9024 l_remaining = l_img_comp->prec & 7; /* (%8) */
9035 l_width = (l_tilec->x1 - l_tilec->x0);
9036 l_height = (l_tilec->y1 - l_tilec->y0);
9037 l_offset_x = int_ceildiv(l_image->x0, l_img_comp->dx);
9038 l_offset_y = int_ceildiv(l_image->y0, l_img_comp->dy);
9039 l_image_width = int_ceildiv(l_image->x1 - l_image->x0, l_img_comp->dx);
9040 l_stride = l_image_width - l_width;
9041 l_src_ptr = l_img_comp->data + (l_tilec->x0 - l_offset_x) + (l_tilec->y0 - l_offset_y) * l_image_width;
9048 OPJ_CHAR * l_dest_ptr = (OPJ_CHAR*) p_data;
9053 (j=0;j<l_height;++j)
9058 *(l_dest_ptr) = (OPJ_CHAR) (*l_src_ptr);
9062 l_src_ptr += l_stride;
9068 (j=0;j<l_height;++j)
9073 *(l_dest_ptr) = (*l_src_ptr)&0xff;
9077 l_src_ptr += l_stride;
9080 p_data = (OPJ_BYTE*) l_dest_ptr;
9085 OPJ_INT16 * l_dest_ptr = (OPJ_INT16 *) p_data;
9090 (j=0;j<l_height;++j)
9095 *(l_dest_ptr++) = (OPJ_INT16) (*(l_src_ptr++));
9097 l_src_ptr += l_stride;
9103 (j=0;j<l_height;++j)
9108 *(l_dest_ptr++) = (*(l_src_ptr++))&0xffff;
9110 l_src_ptr += l_stride;
9113 p_data = (OPJ_BYTE*) l_dest_ptr;
9118 OPJ_INT32 * l_dest_ptr = (OPJ_INT32 *) p_data;
9120 (j=0;j<l_height;++j)
9125 *(l_dest_ptr++) = *(l_src_ptr++);
9127 l_src_ptr += l_stride;
9129 p_data = (OPJ_BYTE*) l_dest_ptr;
9138 bool j2k_update_image_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data)
9140 OPJ_UINT32 i,j,k = 0;
9141 OPJ_UINT32 l_width,l_height,l_offset_x,l_offset_y;
9142 opj_image_comp_t * l_img_comp = 00;
9143 opj_tcd_tilecomp_t * l_tilec = 00;
9144 opj_image_t * l_image = 00;
9145 OPJ_UINT32 l_size_comp, l_remaining;
9146 OPJ_UINT32 l_dest_stride;
9147 OPJ_INT32 * l_dest_ptr;
9148 opj_tcd_resolution_t* l_res= 00;
9151 l_tilec = p_tcd->tcd_image->tiles->comps;
9152 l_image = p_tcd->image;
9153 l_img_comp = l_image->comps;
9155 (i=0;i<p_tcd->image->numcomps;++i)
9160 l_img_comp->data = (OPJ_INT32*) opj_malloc(l_img_comp->w * l_img_comp->h * sizeof(OPJ_INT32));
9162 (! l_img_comp->data)
9166 memset(l_img_comp->data,0,l_img_comp->w * l_img_comp->h * sizeof(OPJ_INT32));
9169 l_size_comp = l_img_comp->prec >> 3; /*(/ 8)*/
9170 l_remaining = l_img_comp->prec & 7; /* (%8) */
9171 l_res = l_tilec->resolutions + l_img_comp->resno_decoded;
9183 l_width = (l_res->x1 - l_res->x0);
9184 l_height = (l_res->y1 - l_res->y0);
9185 l_dest_stride = (l_img_comp->w) - l_width;
9186 l_offset_x = int_ceildivpow2(l_img_comp->x0, l_img_comp->factor);
9187 l_offset_y = int_ceildivpow2(l_img_comp->y0, l_img_comp->factor);
9188 l_dest_ptr = l_img_comp->data + (l_res->x0 - l_offset_x) + (l_res->y0 - l_offset_y) * l_img_comp->w;
9195 OPJ_CHAR * l_src_ptr = (OPJ_CHAR*) p_data;
9200 (j=0;j<l_height;++j)
9205 *(l_dest_ptr++) = (OPJ_INT32) (*(l_src_ptr++));
9207 l_dest_ptr += l_dest_stride;
9214 (j=0;j<l_height;++j)
9219 *(l_dest_ptr++) = (OPJ_INT32) ((*(l_src_ptr++))&0xff);
9221 l_dest_ptr += l_dest_stride;
9224 p_data = (OPJ_BYTE*) l_src_ptr;
9229 OPJ_INT16 * l_src_ptr = (OPJ_INT16 *) p_data;
9234 (j=0;j<l_height;++j)
9239 *(l_dest_ptr++) = *(l_src_ptr++);
9241 l_dest_ptr += l_dest_stride;
9247 (j=0;j<l_height;++j)
9252 *(l_dest_ptr++) = (*(l_src_ptr++))&0xffff;
9254 l_dest_ptr += l_dest_stride;
9257 p_data = (OPJ_BYTE*) l_src_ptr;
9262 OPJ_INT32 * l_src_ptr = (OPJ_INT32 *) p_data;
9264 (j=0;j<l_height;++j)
9269 *(l_dest_ptr++) = (*(l_src_ptr++));
9271 l_dest_ptr += l_dest_stride;
9273 p_data = (OPJ_BYTE*) l_src_ptr;
9284 * Sets the given area to be decoded. This function should be called right after opj_read_header and before any tile header reading.
9286 * @param p_j2k the jpeg2000 codec.
9287 * @param p_start_x the left position of the rectangle to decode (in image coordinates).
9288 * @param p_end_x the right position of the rectangle to decode (in image coordinates).
9289 * @param p_start_y the up position of the rectangle to decode (in image coordinates).
9290 * @param p_end_y the bottom position of the rectangle to decode (in image coordinates).
9291 * @param p_manager the user event manager
9293 * @return true if the area could be set.
9295 bool j2k_set_decode_area(
9297 OPJ_INT32 p_start_x,
9298 OPJ_INT32 p_start_y,
9301 struct opj_event_mgr * p_manager
9304 opj_cp_t * l_cp = &(p_j2k->m_cp);
9307 (p_j2k->m_specific_param.m_decoder.m_state != J2K_DEC_STATE_TPHSOT)
9311 p_j2k->m_specific_param.m_decoder.m_start_tile_x = (p_start_x - l_cp->tx0) / l_cp->tdx;
9312 p_j2k->m_specific_param.m_decoder.m_start_tile_y = (p_start_y - l_cp->ty0) / l_cp->tdy;
9313 p_j2k->m_specific_param.m_decoder.m_end_tile_x = int_ceildiv((p_end_x - l_cp->tx0), l_cp->tdx);
9314 p_j2k->m_specific_param.m_decoder.m_end_tile_y = int_ceildiv((p_end_y - l_cp->ty0), l_cp->tdy);
9315 p_j2k->m_specific_param.m_decoder.m_discard_tiles = 1;