Compare commits

..

173 Commits

Author SHA1 Message Date
mayeut
f0dd842b11 Fix warning
applications\codec\convertpng.c(465) : warning C4018: '<' :
signed/unsigned mismatch
2015-11-07 01:29:43 +01:00
mayeut
96c3a8315b PNG support enhancement
Update #611
2015-11-05 22:44:58 +01:00
mayeut
6711fa669a BMP support enhancement
Update #611
2015-11-05 00:29:37 +01:00
mayeut
935816e8c9 Update TIFF conversion to support more bit depth.
Update #611
2015-11-03 22:34:43 +01:00
mayeut
c0abb808f5 Fix invalid read in pngtoimage 2015-10-18 19:10:31 +02:00
mayeut
348e96e44b resets resno_decoded for each tile
Update #574
2015-10-18 18:58:54 +02:00
mayeut
e94720fea0 Fix ycc_to_rgb conversions
Update #574
2015-10-18 18:27:14 +02:00
mayeut
04291bf0ab Fix typo 2015-10-18 18:15:12 +02:00
mayeut
46440fe368 Fix some calculations in tcd_malloc_encode and tcd_malloc_decode_tile
Fix #388
2015-10-18 18:10:38 +02:00
mayeut
9cf9018ffc Update to libtiff 4.0.4 2015-10-18 17:18:21 +02:00
mayeut
001cd957ba Update to libpng 1.6.17 2015-10-18 16:45:42 +02:00
mayeut
a024c148fc Update to lib 1.2.8 2015-10-18 16:39:45 +02:00
mayeut
a4bd2ed06e Update to libcms2-2.6 2015-10-18 16:31:49 +02:00
mayeut
66f65919cf Update color_apply_icc_profile 2015-10-18 16:24:51 +02:00
mayeut
7ad3e2a870 Add "-p", "-force-rgb" and "-upsample" options to j2k_to_image
Fix #606
2015-10-18 16:07:40 +02:00
mayeut
9542c08d62 Don't rely on float equality
Fix #591
2015-10-15 15:52:01 +02:00
mayeut
cbaa2d7d98 Fix j2k_validate_encode 2015-10-15 15:48:02 +02:00
mayeut
650df81e09 Use -ffast-math only for compilation
Updates #488
Closes #554
2015-10-15 14:59:36 +02:00
Antonin Descampe
618e50954f Fixes overflow when high number of decompositions
Update #603
2015-10-09 16:56:54 +02:00
Antonin Descampe
959ebdab5e Gracefully reject codestreams with malformed SIZ markers
Update #603
2015-09-30 09:00:50 +02:00
Antonin Descampe
3cee252347 commented out some tests
No plan to fix this in 1.5 branch right now
2015-09-29 16:28:41 +02:00
Antonin Descampe
2a4101c60e Fixed non regression test config + ignore some files 2015-09-23 22:02:13 +02:00
Antonin Descampe
32b04ad49d Makes j2k_dump focus on parsing j2k codestreams, nothing else.
Avoid processing JP2 PCLR, CMAP, CDEF boxes and J2K packets in j2k_dump.
Fixes #595
2015-09-23 17:48:30 +02:00
Antonin Descampe
5e3fae7f48 update md5 signatures
Updates #604
2015-09-22 17:08:11 +02:00
Pedro Gimeno
4469a98cd7 Wrong TGA header generated by j2k_to_image
The TGA file writer used by j2k_to_image writes a wrong field to the
header for alpha-less images.

To reproduce:
1. Take any 24-bit j2k image with no alpha.
2. Convert it to TGA with j2k_to_image -i <image>.j2k -o <image>.tga
3. Open <image>.tga with Gimp.

When opened, the image will have a wrong alpha channel, because Gimp
uses a certain field in the header to determine if the image has alpha.
That field is saved wrongly by j2k_to_image for alpha-less images. Per
the TGA specification, Gimp is correct in this case.
2015-09-16 20:28:29 +02:00
Antonin Descampe
93c79f8fb1 modified checkmd5 2015-09-16 17:04:51 +02:00
Antonin Descampe
e755ebd1b0 backport fixes for issues #362 (-2863) and #393 on branch 1.5 2015-09-16 16:51:15 +02:00
Antonin Descampe
f35aaa8a82 added tests from master in 1.5 branch 2015-09-16 15:48:24 +02:00
Antonin Descampe
b44e07fe19 removed warnings when configuring with CMake 3.x on MacOS (update issue 443 for 1.5 branch) 2015-09-16 13:14:00 +02:00
Antonin Descampe
d3c0915992 added a validation procedure before launching actual decoding, fixed testempty tests 2015-09-16 13:05:20 +02:00
Antonin Descampe
c91e2099b1 disabled gX_colr kdu tests for now 2015-09-16 10:47:00 +02:00
Antonin Descampe
d0e85b0c52 fixed typo in CMakeLists.txt preventing use of libpng 2015-09-15 18:21:07 +02:00
Antonin Descampe
31e35fcf7b preventde seg fault when unknown long options and fixed ability to use USE_SYSTEM_GETOPT 2015-09-15 18:00:52 +02:00
Antonin Descampe
2d47938b25 added testempty0 test 2015-09-15 15:49:58 +02:00
Antonin Descampe
2e508f1c89 backport issue #80 to 1.5 branch 2015-09-15 15:42:17 +02:00
Antonin Descampe
f8013bec95 update conformance test files on 1.5 branch 2015-09-15 15:11:12 +02:00
Antonin Descampe
770e81eebc Fixed "unsupported platform" error 2015-09-14 17:03:03 +02:00
Antonin Descampe
2c3f5c269a [1.5] added int64_t define for win platforms in int.h so that r2990 actually workswith windows 2015-01-27 16:51:27 +00:00
Antonin Descampe
0ec0b2594c [1.5] fixed int_ceildivpow2 implementation (backport from trunk)
Update issue 388
2015-01-08 23:18:52 +00:00
Mathieu Malaterre
2eebb05ca2 [1.5] Fix a typo in comments 2014-04-01 13:55:28 +00:00
Mathieu Malaterre
ff72d131ed [1.5] Rework r2827. getopt was still being used in java binding
Update issue 301
2014-04-01 13:40:41 +00:00
Mathieu Malaterre
7d6d19c473 [1.5] Rework r2769. getopt was still being used in mj2/jpwl codecs
Update issue 301
2014-04-01 13:32:02 +00:00
Mathieu Malaterre
78053c44c8 [1.5] Make sure to compile java code with a defined source/target version 2014-04-01 11:54:43 +00:00
Mathieu Malaterre
902fe2569c [1.5] Tag this version to be the next 1.5.3 2014-04-01 11:54:21 +00:00
Mathieu Malaterre
8c71728242 [1.5] Fix big endian checking with autotools
Thanks to winfried for patch
Fixes issue 302
2014-03-26 15:25:37 +00:00
Mathieu Malaterre
4140dfdea8 [1.5] Import patch from bug tracker
Thanks to winfried
Fixes issue 304
2014-03-25 16:42:49 +00:00
Rex Dieter
259f629a46 Improve check for standard libs
Previously, with <lib>_LIBS and <lib>_CFLAGS undefined,
the most basic compile command "$CC conftest.c -l<lib>" was not
tested.

issue: 129
2014-03-24 17:01:23 +00:00
Rex Dieter
c302efcf86 Install jpwl man pages only if jpwl is enabled
issue: 129
2014-03-24 16:58:46 +00:00
Rex Dieter
e0b5b08f9a Calling AC_CANONICAL_SYSTEM implies AC_CANONICAL_TARGET, which
gives incorrect results when cross compiling. Calling only
AC_CANONICAL_HOST is enough.

issue: 129
2014-03-24 16:58:06 +00:00
Mathieu Malaterre
dac95eff3a [1.5] Rework r2768 in fact getopt_long is slightly different on GNU. Adapt signature to handle BSD signature and GNU one.
Update issue 301
2014-03-18 16:26:39 +00:00
Mathieu Malaterre
4f4de7070e [1.5] Create a new cmake option to choose between convienient copy of getopt and system installed one
Udapte issue 301
2014-03-18 15:59:08 +00:00
Mathieu Malaterre
78d1820881 [1.5] Add a way for user to override source/target java version
Update issue 303
2014-03-18 14:58:14 +00:00
Mathieu Malaterre
de73cfeec1 [1.5] Fix issues with big endian handling
Fixes issue 302
2014-03-18 14:40:37 +00:00
Mathieu Malaterre
49044ae2a8 [1.5] Rework r2758 the conditions were not quite right. Update checks. 2014-03-18 14:27:56 +00:00
Mathieu Malaterre
6e0162a8a6 [1.5] Check the number of tiles 2014-03-18 14:19:21 +00:00
Mathieu Malaterre
910af7edec [1.5] Import patch from trunk to make test passes. Affects: NR-DEC-2977.pdf.asan.67.2198.jp2-52-decode & NR-DEC-4149.pdf.SIGSEGV.cf7.3501.jp2-50-decode 2014-03-18 14:05:44 +00:00
Mathieu Malaterre
69cd4f9211 [1.5] Import portion of patch from issue 297
Run test suite on new datasets
Update issue 297
2014-03-18 12:47:45 +00:00
Mathieu Malaterre
6fc2b56847 [1.5] Remove another set of simple warnings 2014-03-17 16:11:48 +00:00
Mathieu Malaterre
773bd89130 [1.5] Remove simple warning about C++ style comments 2014-03-17 16:03:07 +00:00
Mathieu Malaterre
5d356d6fcb [1.5] Update BSD-4 copyright into a BSD-3 copyright
Update issue 300
2014-03-17 15:02:20 +00:00
Mathieu Malaterre
a2f90ab2cb [1.5] Prevent buffer overflow in openjpip code 2014-03-12 11:55:54 +00:00
Mathieu Malaterre
a05a9aa4ed [1.5] Fix remainings warnings on 1.5 branch 2014-03-12 11:52:26 +00:00
Mathieu Malaterre
af2be2d456 [1.5] Use improved find_path syntax to help cross-compilation setup find openjpeg data root 2014-03-04 08:29:53 +00:00
Mathieu Malaterre
96dba34ddc [1.5] Declare functions static to track unused ones. 2014-02-26 08:43:20 +00:00
Mathieu Malaterre
6aad1208b2 [1.5] Import first patch (fixes.patch) from issue 249 to fix leaks on error condition.
Update issue 249
2014-02-26 08:38:19 +00:00
Mathieu Malaterre
d2be8c5d21 [1.5] Use new add_test signature to handle cross compilation and execution using wine 2014-02-26 08:34:28 +00:00
Mathieu Malaterre
b42f76cb7f [1.5] Remove addition from r1702 this introduced a regression as seen in issue 205
Fixes issue 205
2014-02-25 14:44:55 +00:00
Mathieu Malaterre
07163be7ed [1.5] Import md5 checker from trunk back onto 1.5 branch 2014-02-25 14:28:30 +00:00
Mathieu Malaterre
4e672cc1e9 [1.5] Do not report warning on third party lib 2014-02-24 12:26:51 +00:00
Mathieu Malaterre
ced9a50367 [1.5] Remove some simple warnings 2014-02-24 10:01:27 +00:00
Mathieu Malaterre
a1683bd7c2 [1.5] Import patch suggested in bug #241 2013-09-26 09:24:55 +00:00
Antonin Descampe
f968a70e22 tests : reactivated conformance tests in openjpeg 1.5 branch to enable comparison with trunk 2013-07-11 17:09:02 +00:00
Mickael Savinaud
2fe6bac6eb [b1.5.x] update the micro version into the configure file (thanks to winfried) 2013-03-14 08:52:38 +00:00
Mathieu Malaterre
15243144c4 [1.5] Rework #ifdef checks. We should check for _M_IX86 instead of not(_M_X64). Thanks to Misha Ulyutin for report on ML 2013-02-27 08:03:39 +00:00
Mickael Savinaud
c0c69d1c36 [1.5] improve the bmp read function for RGB8 case (thanks Winfried). Update issue 203 2012-12-18 08:47:19 +00:00
Rex Dieter
d9d62a77ee backport r2259
Doxyfile: HTML_TIMESTAMP = NO

helps when comparing the output of multiple runs,
and distros will appreciate avoiding multilib conflicts.
2012-12-07 15:10:24 +00:00
Mathieu Malaterre
15488c94d2 [1.5] Fix Java binding issues.
Properly link to math lib on UNIX
Make JNI install location a user configuration
Remove SONAME property from the java module
2012-10-22 11:29:32 +00:00
Mathieu Malaterre
75175b715c [1.5] Build small internal tools to generate t1_luts.h 2012-10-02 07:43:12 +00:00
Mathieu Malaterre
46831582b2 [1.5] missing range check in j2k_read_coc et al.
Fixes issue 166
2012-10-02 07:17:09 +00:00
Mathieu Malaterre
e55d5e29e0 [1.5] division by zero in j2k_read_siz
Fixes issue 169
2012-10-02 07:09:57 +00:00
Mathieu Malaterre
c02f145cd1 [1.5] int main() in t1_generate_luts.c breaks mplayer
Fixes issue 152
2012-10-02 07:02:56 +00:00
Mathieu Malaterre
6280b5ad8d [1.5] jp2_read_boxhdr() can trigger random pointer memory access
Fixes issue 155
2012-10-01 15:57:01 +00:00
Mathieu Malaterre
7720188fa7 [1.5] Start opj 1.5.2 2012-10-01 15:49:16 +00:00
Mathieu Malaterre
20f9f96719 [1.5] update NEWS file 2012-09-10 11:28:38 +00:00
Mathieu Malaterre
4776f48477 [1.5] Fix Heap-based buffer-overflow when decoding openjpeg image
Thanks to Huzaifa Sidhpurwala of Red Hat Security Response Team for dataset to reproduce the issue.
Fixes issue 170
2012-09-10 11:16:55 +00:00
Mathieu Malaterre
c2f32bb485 [1.5] Fix issue with str_length not being used. Rewrite code to prefer use of vsnprintf to prevent potential buffer overflow. 2012-09-10 09:54:40 +00:00
Mathieu Malaterre
bba708462d [1.5] remove extra trailing semicolon 2012-09-10 09:28:48 +00:00
Mathieu Malaterre
4935eaf773 [1.5] COMP: Fix warnings identified by clang31
openjpeg/libopenjpeg/tcd.c:1884 col 48: warning: comparison of unsigned expressi
on < 0 is always false

openjpeg/applications/codec/j2k_dump.c:362 col 29: warning: equality comparison
with extraneous parentheses

openjpeg/libopenjpeg/jpwl/jpwl_lib.c:680:19: warning: format specifies type 'int
' but the argument has type 'long long' [-Wformat]
    printf("Marker@%d: %X\n", cio_tell(cio) - 2, id);
                   ~^         ~~~~~~~~~~~~~~~~~
                   %lld

openjpeg/applications/jpip/libopenjpip/byte_manager.c:58:63: warning: format spe
cifies type 'long' but the argument has type 'OPJ_OFF_T' (aka 'long long') [-Wfo
rmat]
fprintf( FCGI_stderr, "Error: error in fetch_bytes( %d, %ld, %lu)\n", fd, offset
, size);

Author: Hans Johnson <hans-johnson@uiowa.edu>
2012-08-24 08:13:17 +00:00
Mathieu Malaterre
bad9a71e77 [1.5] Import portion of patch from Alex Zimnitsky to fix compilation on FreeBSD 2012-07-29 15:21:39 +00:00
Mathieu Malaterre
a74a41b932 [1.5] Fix compilation issue with Compiler Borland C++ v. 5.5
Fixes issue 154
2012-07-11 15:07:05 +00:00
Mathieu Malaterre
6b5bbc2645 [1.5] Fix r1727 (Issue 156) to compile on compilers where false is not defined. 2012-07-11 15:00:55 +00:00
Mathieu Malaterre
8b5f815925 [1.5] This fixes issues seen on PDF files
Fixes issue 156
2012-07-11 14:54:48 +00:00
Mathieu Malaterre
abce31e706 [1.5] Fix heap buffer overflow
Enforce sanity checks on tile number and tile length, even when the (rather
broken) USE_JPWL code isn't enabled.
2012-07-10 13:08:08 +00:00
Mathieu Malaterre
8062f74deb [1.5] jp2_read_boxhdr() call ignores return value
Fixes issue 91
2012-05-29 17:49:11 +00:00
Mathieu Malaterre
b8fecbbc99 [1.5] Make sure openjpeg/mj2 can be compiled with gcc -std=c89 2012-05-29 17:42:17 +00:00
Mathieu Malaterre
cd8896968d [1.5] This commit hides symptoms of CVE-2009-5030
As explained in issue 5, comment 1. This is an easy fix to avoid memory overrun.
Update issue 5
Update issue 62
2012-05-29 17:21:05 +00:00
Mathieu Malaterre
b94bc0dbe2 [1.5] Applying old patch from r1642, with further modification from winfried. Also enable failing test. Everything seems to be working well now.
Fixes issue 150
2012-05-29 16:21:46 +00:00
Mathieu Malaterre
083d4c2361 [1.5] Import r1669 from trunk over to 1.5 branch 2012-05-29 14:57:25 +00:00
Mathieu Malaterre
6c5a066b20 [1.5] Apply private patch from Alex Macfarlane Smith
This gets rids of a lot memory leaks when used on device with low memory
2012-05-29 14:52:45 +00:00
Mathieu Malaterre
835bf5357f [1.5] The two files in Issue145 have a precision < 8-bit:
therefore 'jp2_read_pclr' must be changed.

j2k_to_image fails to create RGB/RGBA images with a
precision < 8-bit: therefore 'imagetopng' must be
changed.
Update issue 145
2012-05-29 13:54:21 +00:00
Mathieu Malaterre
8a279881d4 [1.5] Fix autotools installation. Thanks to winfried for patch.
Update issue 149
2012-05-29 13:41:54 +00:00
Mathieu Malaterre
6da56bb11a [1.5] Fix compilation on FreeBSD. Thanks to rafael carre (funman@videolan.org) for patch.
Fixes issue 111
2012-05-29 10:19:45 +00:00
Mathieu Malaterre
8cd13f3a55 [1.5] Build fails on AIX
Fixes issue 139
2012-05-21 10:34:35 +00:00
Mathieu Malaterre
eeca4a220c [1.5] Man page syntax fixes. Thanks to vskytta for patch.
Fixes issue 147
2012-05-21 09:25:39 +00:00
Mathieu Malaterre
e17dcf58c9 [1.5] fix compilation warning about lrintf being implicit.
Fixes issue 144
2012-05-21 09:23:06 +00:00
Mathieu Malaterre
39ac7c479f [1.5] Revert r1642, as explained on https://groups.google.com/group/openjpeg/msg/77a67fef94a0309b 2012-04-23 19:26:19 +00:00
Mathieu Malaterre
401e9cbb5c [1.5] Adding test suite for file409752.jp2 2012-04-23 14:01:33 +00:00
Mathieu Malaterre
5dbf771bb9 [1.5] Make it easier to find /data from within 1.5 sub-branch 2012-04-23 14:00:36 +00:00
Mathieu Malaterre
ce9d5083ef [1.5] Integrate patch from winfried posted on the mailing list. See here for more info: https://groups.google.com/group/openjpeg/msg/6488859a0dce77 2012-04-23 13:35:01 +00:00
Mathieu Malaterre
baa7e32f9c [1.5] Integrate patch from winfried posted on the mailing list. See here for more info: https://groups.google.com/group/openjpeg/msg/1bbf7ae7ddee3a51 2012-04-23 13:31:29 +00:00
Mathieu Malaterre
097496a9f0 [1.5] Integrate patch from winfried posted on the mailing list. See here for more info: https://groups.google.com/group/openjpeg/msg/7e30b6e288ad5908 2012-04-23 13:23:38 +00:00
Mathieu Malaterre
6b649f3bf6 [1.5] Need to compile/install tool to embed XML file in JP2 for jpip server 2012-04-20 11:15:48 +00:00
Mathieu Malaterre
65f8ae765e [1.5] jar files are arch independant. We can install them safely in share 2012-04-19 12:40:28 +00:00
Mathieu Malaterre
3aba3e203b [1.5] Add install rules for openjpip client 2012-04-19 12:30:30 +00:00
Mathieu Malaterre
95cf10e979 [1.5] Add missing symbols from getopt into the java glue lib 2012-04-19 10:59:41 +00:00
Mathieu Malaterre
3a643798bd [1.5] resolve missing symbols from convert.c/index.c 2012-04-19 10:57:03 +00:00
Mathieu Malaterre
875591f664 [1.5] Add explicit linking from glue java lib to real openjpeg lib 2012-04-19 10:53:04 +00:00
Mathieu Malaterre
4e8aea6b5a [1.5] install java module 2012-04-19 10:37:31 +00:00
Mathieu Malaterre
5379ec5715 [1.5] Fix computation of relative path from include/ to lib/ 2012-04-19 10:26:48 +00:00
Mathieu Malaterre
b431cb0a41 [1.5] fix compilation warnings on windows box 2012-04-18 14:15:10 +00:00
Mathieu Malaterre
dfbab28b4d [1.5] debian tools detected a missing link to math lib 2012-04-16 13:16:16 +00:00
Mathieu Malaterre
3819c1b5f4 [1.5] Adding some simple unit tests 2012-04-06 13:07:01 +00:00
Mathieu Malaterre
b09cd38b08 [1.5] introduce fix for the SOVERSION regression introduced in 1.5.0 2012-04-05 13:28:54 +00:00
Mathieu Malaterre
da453218a4 [1.5] Remove a simple warning report 2012-03-16 16:43:24 +00:00
Mathieu Malaterre
e0795464c1 [1.5] I think == was meant here. 2012-03-16 16:38:46 +00:00
Mathieu Malaterre
fab8de59d3 [1.5] Remove a warning about undefined snprintf on windows compiler. 2012-03-02 17:13:59 +00:00
Mathieu Malaterre
dcf78f14f6 [1.5] Change the logic in byte_manager.h. Prefer the use of stdint.h when available. Default to compiler specific mecanism otherwise. Remove some c++ comments. Fix signed vs unsigned comparison 2012-03-02 16:51:10 +00:00
Mathieu Malaterre
d1a1653f2a [1.5] Finish import of r963 2012-03-02 15:21:29 +00:00
Mathieu Malaterre
5a817eba3d [1.5] merge r963 from trunk over to branch 1.5 2012-03-02 15:19:44 +00:00
Mathieu Malaterre
ce5bbefff0 [1.5] Convert from DOS eol to UNIX eol 2012-03-02 15:11:45 +00:00
Mathieu Malaterre
a5d96e54b9 [1.5] Set from DOS eol to UNIX eol 2012-03-02 14:34:13 +00:00
Mathieu Malaterre
2dddf54f8b [1.5] Sync with trunk and remove uneeded include headers 2012-03-02 14:14:07 +00:00
Mathieu Malaterre
992409c00c [1.5] Import rev 1053 from trunk over to 1.5 2012-03-02 13:56:45 +00:00
Mathieu Malaterre
ee9c46d350 [1.5] Fix typo in date. 2012-03-02 13:47:00 +00:00
Mathieu Malaterre
87a1081f7c [1.5] Sync with trunk. Remove remainings bits of old Makefile based build system 2012-03-02 10:27:51 +00:00
Mathieu Malaterre
83332e13ad [1.5] Convert from DOS eol to UNIX eol 2012-03-02 09:50:30 +00:00
Mathieu Malaterre
675f34fabd [1.5] Use UNIX eol for source code 2012-03-02 09:33:50 +00:00
Mathieu Malaterre
0c7b21c46f [1.5] Sync with trunk. 2012-03-02 09:27:24 +00:00
Mathieu Malaterre
590ba6d460 [1.5] As discussed on the mailing list. OpenJPEG should be compatible with Multi-Arch distros. Thanks to Rex for report 2012-03-02 09:05:09 +00:00
Mathieu Malaterre
6f314ae48e [1.5] Fix a bunch of comparison between signed and unsigned integer expressions. Some are still left to decide. 2012-03-02 08:44:04 +00:00
Mathieu Malaterre
24ab49a363 [1.5] Fix rev 1474, typo in the spelling. 2012-03-01 20:58:29 +00:00
Mathieu Malaterre
ecb36f02c8 [1.5] Fix a warning about comparison of ulong >= 0. Thanks to winfried for report. 2012-03-01 16:55:54 +00:00
Mathieu Malaterre
8c9fd1b351 [1.5] Apply big-endian patch from winfried: libopenjpeg and WORDS_BIGENDIAN, 2012/02/14 2012-03-01 16:10:27 +00:00
Mathieu Malaterre
dd999a2840 Fix a warning reported on the continuous dashboard for linux. 2012-03-01 16:01:47 +00:00
Mathieu Malaterre
b3b2ee0925 [1.5] j2k_to_image does not support writing image with precision less than 8bits. Simply give up for now. Thanks to winfried for report. Also add static keyword for undeclared function in convert.h 2012-03-01 15:52:30 +00:00
Mathieu Malaterre
58cfcaff9f [1.5] Fix a warning about conversion from const char* to char* 2012-03-01 15:39:44 +00:00
Mathieu Malaterre
c1c2d24b16 [1.5] cmake recommends the use of fullpath. Thanks to winfried for report. 2012-03-01 15:30:49 +00:00
Mathieu Malaterre
cefa643823 [1.5] Fix JPWL's DLL installation. Thanks to winfried for report. 2012-03-01 15:08:18 +00:00
Kaori Hagihara
64e37e2a66 [1.5][JPIP] README modification regarding the JP2 encoding 2012-02-29 10:22:49 +00:00
Rex Dieter
545680cdb4 allow finer-grain control of header location via OPENJPEG_INSTALL_INCLUDE_DIR 2012-02-28 17:52:33 +00:00
Rex Dieter
23cab09e07 fix assumptions that OPENJPEG_INSTALL_*_DIR aren't relative paths 2012-02-28 17:44:49 +00:00
Kaori Hagihara
8336ace29a [1.5][JPIP] enabled the opj_server to reply the first query consisting with len request from kakadu client 2012-02-28 11:15:11 +00:00
Rex Dieter
a794ee233d fix pkgconfig to include -I/usr/include/openjpeg-1.5 in cflags (issue #118) 2012-02-23 14:19:02 +00:00
Mathieu Malaterre
a39e4a2a82 [1.5] allow mecanism to provide JFLAGS 2012-02-17 11:33:31 +00:00
Mathieu Malaterre
b267239603 only install CHANGES when present 2012-02-16 08:09:51 +00:00
Mathieu Malaterre
54e4e8f809 remove a warning about unused variable 2012-02-16 08:07:34 +00:00
Mathieu Malaterre
8fc06de0c5 Hide some warnings generated by 3rd party libs 2012-02-14 11:59:41 +00:00
Mathieu Malaterre
9a5ab44e35 Make the code C90 compliant for VS2010 2012-02-14 11:54:10 +00:00
Mathieu Malaterre
4d76145884 Work around issue with FindJava module 2012-02-14 11:46:53 +00:00
Mathieu Malaterre
bdf1343f62 Use C style comment. 2012-02-13 13:40:55 +00:00
Mathieu Malaterre
52f5452d4d [1.5] Need to include unistd for close() declaration 2012-02-13 13:18:58 +00:00
Mathieu Malaterre
a9b7c7b0b4 By default, openjpip client can still built even without java compiler. Print a message to the user as warning. 2012-02-13 11:41:31 +00:00
Mathieu Malaterre
07521a5dc2 [1.5] Fix typo in CMAKE_USE_PTHREADS vs CMAKE_USE_PTHREADS_INIT 2012-02-13 11:37:38 +00:00
Mathieu Malaterre
d1bb3ed1f2 [1.5] Backport diff from trunk 2012-02-13 11:16:38 +00:00
Mathieu Malaterre
6c6cd79820 [1.5] Remove use of custom PTHREAD module. Prefer cmake's one. 2012-02-13 11:09:30 +00:00
Kaori Hagihara
7b6ae8810d [1.5][JPIP] added execution argument to set port number for opj_dec_server, opj_viewer* 2012-02-10 12:05:51 +00:00
Kaori Hagihara
699f172e6c [1.5][JPIP] fixed Doxygen configuration file to document the utilities 2012-02-10 12:00:03 +00:00
Antonin Descampe
5fbf79e730 [1.5] revert r1399 and r1400 2012-02-10 10:01:43 +00:00
Antonin Descampe
aa28216f9b [1.5] fixed an error in autotools that prevented the build because no CHANGES file anymore 2012-02-10 09:27:08 +00:00
Rex Dieter
e449cb706f make OpenJPEGConfig.cmake provide useful (non-empty) values 2012-02-10 01:26:11 +00:00
Rex Dieter
a85c5151ce make openjpeg.h header symlink to match autotools 2012-02-10 01:25:03 +00:00
Rex Dieter
ed58a22d2e install cmake/pkgconfig bits in LIB_DIR 2012-02-10 01:23:39 +00:00
Antonin Descampe
3408787101 update OpenJPEGCPack.cmake with correct package names 2012-02-07 22:10:09 +00:00
306 changed files with 77366 additions and 52225 deletions

4
.gitignore vendored Normal file
View File

@@ -0,0 +1,4 @@
CMakeLists.txt.user
*.bak

1371
CHANGES

File diff suppressed because it is too large Load Diff

View File

@@ -28,5 +28,7 @@ SET(CTEST_CUSTOM_WARNING_EXCEPTION
# Suppress warning caused by intentional messages about deprecation # Suppress warning caused by intentional messages about deprecation
".*warning,.* is deprecated" ".*warning,.* is deprecated"
# supress warnings caused by 3rd party libs: # supress warnings caused by 3rd party libs:
".*/thirdparty/.*" ".*thirdparty.*"
"libtiff.*has no symbols"
"libpng.*has no symbols"
) )

16
CMake/FindCPPCHECK.cmake Normal file
View File

@@ -0,0 +1,16 @@
# cppcheck
#
# Copyright (c) 2011 Mathieu Malaterre <mathieu.malaterre@gmail.com>
#
# Redistribution and use is allowed according to the terms of the New
# BSD license.
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
#
find_program(CPPCHECK_EXECUTABLE
cppcheck
)
mark_as_advanced(
CPPCHECK_EXECUTABLE
)

View File

@@ -17,4 +17,4 @@ ELSE(FCGI_FOUND)
SET(FCGI_INCLUDE_DIRS) SET(FCGI_INCLUDE_DIRS)
ENDIF(FCGI_FOUND) ENDIF(FCGI_FOUND)
MARK_AS_ADVANCED(FCGI_INCLUDE_DIRS FCGI_LIBRARIES) MARK_AS_ADVANCED(FCGI_INCLUDE_DIR FCGI_LIBRARY)

12
CMake/FindJPYLYZER.cmake Normal file
View File

@@ -0,0 +1,12 @@
#
# this module looks for JPYLYZER
# http://jpylyzer.openpreservation.org
#
find_program(JPYLYZER_EXECUTABLE
jpylyzer
)
mark_as_advanced(
JPYLYZER_EXECUTABLE
)

View File

@@ -1,20 +0,0 @@
# Look for the header file.
FIND_PATH(PTHREAD_INCLUDE_DIR NAMES pthread.h)
# Look for the library.
FIND_LIBRARY(PTHREAD_LIBRARY NAMES pthread)
# Handle the QUIETLY and REQUIRED arguments and set PTHREAD_FOUND to TRUE if all listed variables are TRUE.
INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(PTHREAD DEFAULT_MSG PTHREAD_LIBRARY PTHREAD_INCLUDE_DIR)
# Copy the results to the output variables.
IF(PTHREAD_FOUND)
SET(PTHREAD_LIBRARIES ${PTHREAD_LIBRARY})
SET(PTHREAD_INCLUDE_DIRS ${PTHREAD_INCLUDE_DIR})
ELSE(PTHREAD_FOUND)
SET(PTHREAD_LIBRARIES)
SET(PTHREAD_INCLUDE_DIRS)
ENDIF(PTHREAD_FOUND)
MARK_AS_ADVANCED(PTHREAD_INCLUDE_DIRS PTHREAD_LIBRARIES)

View File

@@ -11,22 +11,28 @@ SET(OPENJPEG_MINOR_VERSION "@OPENJPEG_VERSION_MINOR@")
SET(OPENJPEG_BUILD_VERSION "@OPENJPEG_VERSION_BUILD@") SET(OPENJPEG_BUILD_VERSION "@OPENJPEG_VERSION_BUILD@")
# The libraries. # The libraries.
SET(OPENJPEG_LIBRARIES "@OPENJPEG_LIBRARIES@") SET(OPENJPEG_LIBRARIES "@OPENJPEG_LIBRARY_NAME@")
# The CMake macros dir. # The CMake macros dir.
SET(OPENJPEG_CMAKE_DIR "@OPENJPEG_CMAKE_DIR_CONFIG@") SET(OPENJPEG_CMAKE_DIR "@OPENJPEG_INSTALL_PACKAGE_DIR@")
# The configuration options. # The configuration options.
SET(OPENJPEG_BUILD_SHARED_LIBS "@OPENJPEG_BUILD_SHARED_LIBS@") SET(OPENJPEG_BUILD_SHARED_LIBS "@BUILD_SHARED_LIBS@")
# The "use" file. # The "use" file.
SET(OPENJPEG_USE_FILE "@OPENJPEG_USE_FILE_CONFIG@") SET(OPENJPEG_USE_FILE "@OPENJPEG_USE_FILE_CONFIG@")
get_filename_component(SELF_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) get_filename_component(SELF_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
# The following is inspired from:
# http://www.cmake.org/Wiki/CMake/Tutorials/Packaging#Packaging_and_Exporting
# However the following is difficult to handle:
# get_filename_component(myproj_INCLUDE_DIRS "${SELF_DIR}/../../include/myproj" ABSOLUTE)
# it asssumes a non multi-arch system, where 'include' is located '../include' from lib
# therefore we need to take into account the number of subdirs in OPENJPEG_INSTALL_LIB_DIR
if(EXISTS ${SELF_DIR}/OpenJPEGTargets.cmake) if(EXISTS ${SELF_DIR}/OpenJPEGTargets.cmake)
# This is an install tree # This is an install tree
include(${SELF_DIR}/OpenJPEGTargets.cmake) include(${SELF_DIR}/OpenJPEGTargets.cmake)
get_filename_component(OPENJPEG_INCLUDE_ROOT "${SELF_DIR}/../../@OPENJPEG_INSTALL_INCLUDE_DIR@" ABSOLUTE) get_filename_component(OPENJPEG_INCLUDE_ROOT "${SELF_DIR}/@relative_parent@/@OPENJPEG_INSTALL_INCLUDE_DIR@" ABSOLUTE)
set(OPENJPEG_INCLUDE_DIRS ${OPENJPEG_INCLUDE_ROOT}) set(OPENJPEG_INCLUDE_DIRS ${OPENJPEG_INCLUDE_ROOT})
else(EXISTS ${SELF_DIR}/OpenJPEGTargets.cmake) else(EXISTS ${SELF_DIR}/OpenJPEGTargets.cmake)

View File

@@ -11,6 +11,9 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
IF(COMMAND CMAKE_POLICY) IF(COMMAND CMAKE_POLICY)
CMAKE_POLICY(SET CMP0003 NEW) CMAKE_POLICY(SET CMP0003 NEW)
if (NOT (${CMAKE_VERSION} VERSION_LESS 3.0))
cmake_policy(SET CMP0042 NEW)
endif()
ENDIF(COMMAND CMAKE_POLICY) ENDIF(COMMAND CMAKE_POLICY)
IF(NOT OPENJPEG_NAMESPACE) IF(NOT OPENJPEG_NAMESPACE)
@@ -29,14 +32,32 @@ INCLUDE_REGULAR_EXPRESSION("^.*$")
# OPENJPEG version number, useful for packaging and doxygen doc: # OPENJPEG version number, useful for packaging and doxygen doc:
SET(OPENJPEG_VERSION_MAJOR 1) SET(OPENJPEG_VERSION_MAJOR 1)
SET(OPENJPEG_VERSION_MINOR 5) SET(OPENJPEG_VERSION_MINOR 5)
SET(OPENJPEG_VERSION_BUILD 0) SET(OPENJPEG_VERSION_BUILD 3)
SET(OPENJPEG_VERSION SET(OPENJPEG_VERSION
"${OPENJPEG_VERSION_MAJOR}.${OPENJPEG_VERSION_MINOR}.${OPENJPEG_VERSION_BUILD}") "${OPENJPEG_VERSION_MAJOR}.${OPENJPEG_VERSION_MINOR}.${OPENJPEG_VERSION_BUILD}")
SET(PACKAGE_VERSION SET(PACKAGE_VERSION
"${OPENJPEG_VERSION_MAJOR}.${OPENJPEG_VERSION_MINOR}.${OPENJPEG_VERSION_BUILD}") "${OPENJPEG_VERSION_MAJOR}.${OPENJPEG_VERSION_MINOR}.${OPENJPEG_VERSION_BUILD}")
# Because autotools does not support X.Y notation for SOVERSION, we have to use
# two numerorations, one for the openjpeg version and one for openjpeg soversion
# version | soversion
# 1.0 | 0
# 1.1 | 1
# 1.2 | 2
# 1.3 | 3
# 1.4 | 4
# 1.5 | 5
# 1.5.1 | 5
# 2.0 | 6
# above is the recommendation by the OPJ team. If you really need to override this default,
# you can specify your own OPENJPEG_SOVERSION at cmake configuration time:
# cmake -DOPENJPEG_SOVERSION:STRING=42 /path/to/openjpeg
if(NOT OPENJPEG_SOVERSION)
SET(OPENJPEG_SOVERSION 5)
endif(NOT OPENJPEG_SOVERSION)
SET(OPENJPEG_LIBRARY_PROPERTIES SET(OPENJPEG_LIBRARY_PROPERTIES
VERSION "${OPENJPEG_VERSION_MAJOR}.${OPENJPEG_VERSION_MINOR}.${OPENJPEG_VERSION_BUILD}" VERSION "${OPENJPEG_VERSION_MAJOR}.${OPENJPEG_VERSION_MINOR}.${OPENJPEG_VERSION_BUILD}"
SOVERSION "${OPENJPEG_VERSION_MAJOR}" SOVERSION "${OPENJPEG_SOVERSION}"
) )
# -------------------------------------------------------------------------- # --------------------------------------------------------------------------
@@ -86,6 +107,18 @@ IF(NOT OPENJPEG_INSTALL_LIB_DIR)
SET(OPENJPEG_INSTALL_LIB_DIR "lib") SET(OPENJPEG_INSTALL_LIB_DIR "lib")
ENDIF(NOT OPENJPEG_INSTALL_LIB_DIR) ENDIF(NOT OPENJPEG_INSTALL_LIB_DIR)
# The following will compute the amount of parent dir to go
# from include to lib. it works nicely with
# OPENJPEG_INSTALL_LIB_DIR=lib
# OPENJPEG_INSTALL_LIB_DIR=lib/
# OPENJPEG_INSTALL_LIB_DIR=/lib
# OPENJPEG_INSTALL_LIB_DIR=lib/gnu-linux-x64
STRING(REPLACE "/" ";" relative_to_lib ${OPENJPEG_INSTALL_LIB_DIR})
set(relative_parent "..")
foreach( elem ${relative_to_lib})
set( relative_parent "${relative_parent}/.." )
endforeach()
IF(NOT OPENJPEG_INSTALL_SHARE_DIR) IF(NOT OPENJPEG_INSTALL_SHARE_DIR)
SET(OPENJPEG_INSTALL_SHARE_DIR "share") SET(OPENJPEG_INSTALL_SHARE_DIR "share")
ENDIF(NOT OPENJPEG_INSTALL_SHARE_DIR) ENDIF(NOT OPENJPEG_INSTALL_SHARE_DIR)
@@ -95,7 +128,7 @@ IF(NOT OPENJPEG_INSTALL_DATA_DIR)
ENDIF(NOT OPENJPEG_INSTALL_DATA_DIR) ENDIF(NOT OPENJPEG_INSTALL_DATA_DIR)
IF(NOT OPENJPEG_INSTALL_INCLUDE_DIR) IF(NOT OPENJPEG_INSTALL_INCLUDE_DIR)
SET(OPENJPEG_INSTALL_INCLUDE_DIR "include/") SET(OPENJPEG_INSTALL_INCLUDE_DIR "include/${OPENJPEG_INSTALL_SUBDIR}")
ENDIF(NOT OPENJPEG_INSTALL_INCLUDE_DIR) ENDIF(NOT OPENJPEG_INSTALL_INCLUDE_DIR)
IF(NOT OPENJPEG_INSTALL_MAN_DIR) IF(NOT OPENJPEG_INSTALL_MAN_DIR)
@@ -106,8 +139,19 @@ IF(NOT OPENJPEG_INSTALL_DOC_DIR)
SET(OPENJPEG_INSTALL_DOC_DIR "share/doc/${OPENJPEG_INSTALL_SUBDIR}") SET(OPENJPEG_INSTALL_DOC_DIR "share/doc/${OPENJPEG_INSTALL_SUBDIR}")
ENDIF(NOT OPENJPEG_INSTALL_DOC_DIR) ENDIF(NOT OPENJPEG_INSTALL_DOC_DIR)
if(NOT OPENJPEG_INSTALL_JNI_DIR)
if(WIN32)
set(OPENJPEG_INSTALL_JNI_DIR ${OPENJPEG_INSTALL_BIN_DIR})
else()
set(OPENJPEG_INSTALL_JNI_DIR ${OPENJPEG_INSTALL_LIB_DIR})
endif()
endif()
IF(NOT OPENJPEG_INSTALL_PACKAGE_DIR) IF(NOT OPENJPEG_INSTALL_PACKAGE_DIR)
SET(OPENJPEG_INSTALL_PACKAGE_DIR "${OPENJPEG_INSTALL_SHARE_DIR}/${OPENJPEG_INSTALL_SUBDIR}") # We could install *.cmake files in share/ however those files contains
# hardcoded path to libraries on a multi-arch system (fedora/debian) those
# path will be different (lib/i386-linux-gnu vs lib/x86_64-linux-gnu)
SET(OPENJPEG_INSTALL_PACKAGE_DIR "${OPENJPEG_INSTALL_LIB_DIR}/${OPENJPEG_INSTALL_SUBDIR}")
ENDIF(NOT OPENJPEG_INSTALL_PACKAGE_DIR) ENDIF(NOT OPENJPEG_INSTALL_PACKAGE_DIR)
#----------------------------------------------------------------------------- #-----------------------------------------------------------------------------
@@ -143,13 +187,14 @@ ENDIF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/openjpeg_mangle.h.in)
#----------------------------------------------------------------------------- #-----------------------------------------------------------------------------
# pkgconfig support # pkgconfig support
IF(UNIX) IF(UNIX)
# install in lib and not share (see multi-arch note above)
CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/libopenjpeg1.pc.cmake CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/libopenjpeg1.pc.cmake
${CMAKE_CURRENT_BINARY_DIR}/libopenjpeg1.pc @ONLY) ${CMAKE_CURRENT_BINARY_DIR}/libopenjpeg1.pc @ONLY)
INSTALL( FILES ${CMAKE_CURRENT_BINARY_DIR}/libopenjpeg1.pc DESTINATION INSTALL( FILES ${CMAKE_CURRENT_BINARY_DIR}/libopenjpeg1.pc DESTINATION
${OPENJPEG_INSTALL_SHARE_DIR}/pkgconfig ) ${OPENJPEG_INSTALL_LIB_DIR}/pkgconfig )
INSTALL( CODE "EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E create_symlink INSTALL( CODE "EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E create_symlink
\"libopenjpeg1.pc\" \"libopenjpeg1.pc\"
\"\$ENV{DESTDIR}${OPENJPEG_INSTALL_LIB_DIR}/pkgconfig/libopenjpeg.pc\")") \"\$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/${OPENJPEG_INSTALL_SHARE_DIR}/pkgconfig/libopenjpeg.pc\")")
ENDIF(UNIX) ENDIF(UNIX)
#----------------------------------------------------------------------------- #-----------------------------------------------------------------------------
@@ -158,7 +203,7 @@ IF(CMAKE_COMPILER_IS_GNUCC)
# For all builds, make sure openjpeg is std99 compliant: # For all builds, make sure openjpeg is std99 compliant:
# SET(CMAKE_C_FLAGS "-Wall -std=c99 ${CMAKE_C_FLAGS}") # FIXME: this setting prevented us from setting a coverage build. # SET(CMAKE_C_FLAGS "-Wall -std=c99 ${CMAKE_C_FLAGS}") # FIXME: this setting prevented us from setting a coverage build.
# Do not use ffast-math for all build, it would produce incorrect results, only set for release: # Do not use ffast-math for all build, it would produce incorrect results, only set for release:
SET(CMAKE_C_FLAGS_RELEASE "-ffast-math ${CMAKE_C_FLAGS_RELEASE}") SET(OPENJPEG_LIBRARY_COMPILE_OPTIONS ${OPENJPEG_LIBRARY_COMPILE_OPTIONS} "$<$<CONFIG:Release>:-ffast-math>")
ENDIF(CMAKE_COMPILER_IS_GNUCC) ENDIF(CMAKE_COMPILER_IS_GNUCC)
#----------------------------------------------------------------------------- #-----------------------------------------------------------------------------
@@ -191,6 +236,8 @@ IF(BUILD_JPIP)
ENDIF(BUILD_JPIP) ENDIF(BUILD_JPIP)
OPTION(BUILD_VIEWER "Build the OPJViewer executable (C++)" OFF) OPTION(BUILD_VIEWER "Build the OPJViewer executable (C++)" OFF)
OPTION(BUILD_JAVA "Build the openjpeg jar (Java)" OFF) OPTION(BUILD_JAVA "Build the openjpeg jar (Java)" OFF)
OPTION(USE_SYSTEM_GETOPT "Prefer system installed getopt()" OFF)
MARK_AS_ADVANCED(USE_SYSTEM_GETOPT)
MARK_AS_ADVANCED(BUILD_VIEWER) MARK_AS_ADVANCED(BUILD_VIEWER)
MARK_AS_ADVANCED(BUILD_JAVA) MARK_AS_ADVANCED(BUILD_JAVA)
@@ -228,9 +275,9 @@ IF(BUILD_TESTING)
# They could be found via svn on the OpenJPEG google code project # They could be found via svn on the OpenJPEG google code project
# svn checkout http://openjpeg.googlecode.com/svn/data (about 70 Mo) # svn checkout http://openjpeg.googlecode.com/svn/data (about 70 Mo)
FIND_PATH(OPJ_DATA_ROOT README-OPJ-Data FIND_PATH(OPJ_DATA_ROOT README-OPJ-Data
PATHS PATHS $ENV{OPJ_DATA_ROOT} ${CMAKE_SOURCE_DIR}/../data
$ENV{OPJ_DATA_ROOT} ${CMAKE_SOURCE_DIR}/../../data
${CMAKE_SOURCE_DIR}/../data NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH
) )
# Add repository where to find tests # Add repository where to find tests
@@ -254,9 +301,9 @@ INSTALL( FILES ${OPENJPEG_BINARY_DIR}/OpenJPEGConfig.cmake
#----------------------------------------------------------------------------- #-----------------------------------------------------------------------------
# install CHANGES and LICENSE # install CHANGES and LICENSE
INSTALL( IF(EXISTS ${OPENJPEG_SOURCE_DIR}/CHANGES)
FILES CHANGES INSTALL(FILES CHANGES DESTINATION ${OPENJPEG_INSTALL_DOC_DIR})
LICENSE ENDIF(EXISTS ${OPENJPEG_SOURCE_DIR}/CHANGES)
DESTINATION ${OPENJPEG_INSTALL_DOC_DIR}) INSTALL(FILES LICENSE DESTINATION ${OPENJPEG_INSTALL_DOC_DIR})
INCLUDE (CMake/OpenJPEGCPack.cmake) INCLUDE (CMake/OpenJPEGCPack.cmake)

View File

@@ -66,11 +66,12 @@ Type:
If you are root: If you are root:
make install make install
make clean
else: else if you have sudo power:
sudo make install sudo make install
make clean
else
DESTDIR=$HOME/local make install
To build the Doxygen documentation (Doxygen needs to be found on the system): To build the Doxygen documentation (Doxygen needs to be found on the system):
(A 'html' directory is generated in the 'doc' directory) (A 'html' directory is generated in the 'doc' directory)
@@ -79,7 +80,7 @@ To build the Doxygen documentation (Doxygen needs to be found on the system):
Binaries are located in the 'bin' directory. Binaries are located in the 'bin' directory.
Main available cmake flags: Main available cmake flags:
* To specify the install path: '-DCMAKE_INSTALL_PREFIX=/path' * To specify the install path: '-DCMAKE_INSTALL_PREFIX=/path', or use DESTDIR env variable (see above)
* To build the shared libraries and links the executables against it: '-DBUILD_SHARED_LIBS:bool=on' (default: 'ON') * To build the shared libraries and links the executables against it: '-DBUILD_SHARED_LIBS:bool=on' (default: 'ON')
Note: when using this option, static libraries are not built and executables are dynamically linked. Note: when using this option, static libraries are not built and executables are dynamically linked.
* To build the CODEC executables: '-DBUILD_CODEC:bool=on' (default: 'ON') * To build the CODEC executables: '-DBUILD_CODEC:bool=on' (default: 'ON')

34
NEWS
View File

@@ -2,33 +2,23 @@
OpenJPEG NEWS - user visible changes OpenJPEG NEWS - user visible changes
==================================== ====================================
Changes from OpenJPEG 1.4.0 to OpenJPEG 1.5.0 Changes from OpenJPEG 1.5.1 to OpenJPEG 1.5.0
---------------------------------------------- ----------------------------------------------
Security:
* Fixes: CVE-2012-3535
* Fixes: CVE-2012-3358
New Features: New Features:
* openjpip: * Use a new API scheme and solve the SOVERSIONing in OpenJPEG
- complete client-server architecture for remote browsing of jpeg 2000 images. * Allow better integration with multi-arch system
- located in 'applications/jpip'. * Compile & Install Java bindings (CMake)
- see corresponding README for more details. * Install required addXMLinJP2 (JPIP)
API modifications:
* 'bool' type has been replaced by 'opj_bool' type. 'stdbool.h' is no more required.
Misc: Misc:
* added this NEWS file. * fix linker error by resolving all symbols (eg. missing -lm)
* improved cmake and autotools build methods. * fix some man page typos
* removed manual makefiles, VS project files and XCode project files.
* added a 'thirdparty' directory to contain all dependencies.
- These libraries will be build only if there are not found on the system.
- Note that libopenjpeg itself does not have any dependency.
* changed the directory hierarchy of the whole project. See README files for details.
* tests : a complete test suite has been setup.
- both JPEG 2000 conformance tests and non-regressions tests are configured.
- results are submitted to the OpenJPEG dashboard (http://my.cdash.org/index.php?project=OPENJPEG)
- images are located in 'http://openjpeg.googlecode.com/svn/data' folder.
- configuration files and utilities are located in 'tests' folder.
* OPJViewer re-activated (need wxWidgets)
* Huge amount of bug fixes. See CHANGES for details. * Huge amount of bug fixes. See CHANGES for details.

View File

@@ -4,7 +4,15 @@
SET(openjpegjni_SRCS SET(openjpegjni_SRCS
JavaOpenJPEGDecoder.c JavaOpenJPEGDecoder.c
JavaOpenJPEG.c JavaOpenJPEG.c
${OPENJPEG_SOURCE_DIR}/applications/codec/index.c
${OPENJPEG_SOURCE_DIR}/applications/codec/convert.c
#${OPENJPEG_SOURCE_DIR}/applications/common/color.c
) )
if(NOT USE_SYSTEM_GETOPT)
list(APPEND openjpegjni_SRCS
${OPENJPEG_SOURCE_DIR}/applications/common/opj_getopt.c
)
endif()
# JNI binding: # JNI binding:
find_package(JNI REQUIRED) find_package(JNI REQUIRED)
@@ -20,10 +28,31 @@ include_directories(
add_library(openjpegjni MODULE add_library(openjpegjni MODULE
${openjpegjni_SRCS} ${openjpegjni_SRCS}
) )
# Java module should not have a SONAME:
set_property(TARGET openjpegjni PROPERTY NO_SONAME 1)
TARGET_LINK_LIBRARIES(openjpegjni ${OPENJPEG_LIBRARY_NAME})
if(UNIX)
target_link_libraries(openjpegjni m)
endif()
INSTALL(TARGETS openjpegjni
EXPORT OpenJPEGTargets
LIBRARY DESTINATION ${OPENJPEG_INSTALL_JNI_DIR} COMPONENT Libraries
)
# build jar: # build jar:
FIND_PACKAGE(Java 1.5 REQUIRED) # javac, jar FIND_PACKAGE(Java 1.5 REQUIRED) # javac, jar
# User can override this:
if(NOT DEFINED JAVA_SOURCE_VERSION)
set(JAVA_SOURCE_VERSION 1.5)
endif()
if(NOT DEFINED JAVA_TARGET_VERSION)
set(JAVA_TARGET_VERSION 1.5)
endif()
# build dep list: # build dep list:
file(GLOB java_srcs "java-sources/org/openJpeg/*.java") file(GLOB java_srcs "java-sources/org/openJpeg/*.java")
@@ -32,7 +61,9 @@ file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/classes)
# Build java # Build java
ADD_CUSTOM_COMMAND( ADD_CUSTOM_COMMAND(
OUTPUT ${LIBRARY_OUTPUT_PATH}/openjpeg.jar OUTPUT ${LIBRARY_OUTPUT_PATH}/openjpeg.jar
COMMAND ${Java_JAVAC_EXECUTABLE} -sourcepath "${CMAKE_CURRENT_SOURCE_DIR}/java-sources" COMMAND ${Java_JAVAC_EXECUTABLE}
-source ${JAVA_SOURCE_VERSION} -target ${JAVA_TARGET_VERSION}
-sourcepath "${CMAKE_CURRENT_SOURCE_DIR}/java-sources"
${java_srcs} -d ${CMAKE_CURRENT_BINARY_DIR}/classes ${java_srcs} -d ${CMAKE_CURRENT_BINARY_DIR}/classes
COMMAND ${Java_JAR_EXECUTABLE} cvf ${LIBRARY_OUTPUT_PATH}/openjpeg.jar org COMMAND ${Java_JAR_EXECUTABLE} cvf ${LIBRARY_OUTPUT_PATH}/openjpeg.jar org
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/classes WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/classes
@@ -45,3 +76,7 @@ ADD_CUSTOM_TARGET(OpenJPEGJavaJar ALL
DEPENDS ${LIBRARY_OUTPUT_PATH}/openjpeg.jar DEPENDS ${LIBRARY_OUTPUT_PATH}/openjpeg.jar
COMMENT "building openjpeg.jar" COMMENT "building openjpeg.jar"
) )
INSTALL(FILES ${LIBRARY_OUTPUT_PATH}/openjpeg.jar
DESTINATION ${OPENJPEG_INSTALL_SHARE_DIR} COMPONENT JavaModule
)

View File

@@ -57,7 +57,7 @@
extern int get_file_format(char *filename); extern int get_file_format(char *filename);
extern void error_callback(const char *msg, void *client_data); extern void error_callback(const char *msg, void *client_data);
extern warning_callback(const char *msg, void *client_data); extern void warning_callback(const char *msg, void *client_data);
extern void info_callback(const char *msg, void *client_data); extern void info_callback(const char *msg, void *client_data);
typedef struct callback_variables { typedef struct callback_variables {
@@ -349,10 +349,11 @@ OPJ_PROG_ORDER give_progression(char progression[4]) {
return PROG_UNKNOWN; return PROG_UNKNOWN;
} }
/*
/// <summary> * <summary>
/// Get logarithm of an integer and round downwards. * Get logarithm of an integer and round downwards.
/// </summary> * </summary>
*/
int int_floorlog2(int a) { int int_floorlog2(int a) {
int l; int l;
for (l=0; a>1; l++) { for (l=0; a>1; l++) {
@@ -494,7 +495,7 @@ void cinema_setup_encoder(opj_cparameters_t *parameters,opj_image_t *image, img_
/* ------------------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------------------ */
int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters, int parse_cmdline_encoder(int argc, char * const argv[], opj_cparameters_t *parameters,
img_fol_t *img_fol, char *indexfilename) { img_fol_t *img_fol, char *indexfilename) {
int i, j,totlen; int i, j,totlen;
opj_option_t long_option[]={ opj_option_t long_option[]={
@@ -628,6 +629,8 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
numresolution = parameters->numresolution; numresolution = parameters->numresolution;
matrix_width = numresolution * 3; matrix_width = numresolution * 3;
parameters->cp_matrice = (int *) malloc(numlayers * matrix_width * sizeof(int)); parameters->cp_matrice = (int *) malloc(numlayers * matrix_width * sizeof(int));
if(parameters->cp_matrice == NULL) return 1;
s = s + 2; s = s + 2;
for (i = 0; i < numlayers; i++) { for (i = 0; i < numlayers; i++) {
@@ -856,6 +859,9 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
case 'C': /* add a comment */ case 'C': /* add a comment */
{ {
parameters->cp_comment = (char*)malloc(strlen(opj_optarg) + 1); parameters->cp_comment = (char*)malloc(strlen(opj_optarg) + 1);
if(parameters->cp_comment == NULL) return 1;
if(parameters->cp_comment) { if(parameters->cp_comment) {
strcpy(parameters->cp_comment, opj_optarg); strcpy(parameters->cp_comment, opj_optarg);
} }
@@ -885,6 +891,9 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
case 'z': /* Image Directory path */ case 'z': /* Image Directory path */
{ {
img_fol->imgdirpath = (char*)malloc(strlen(opj_optarg) + 1); img_fol->imgdirpath = (char*)malloc(strlen(opj_optarg) + 1);
if(img_fol->imgdirpath == NULL) return 1;
strcpy(img_fol->imgdirpath,opj_optarg); strcpy(img_fol->imgdirpath,opj_optarg);
img_fol->set_imgdir=1; img_fol->set_imgdir=1;
} }
@@ -1352,7 +1361,7 @@ char* create_index_into_byte_array(opj_codestream_info_t *cstr_info, int* buffer
} }
} }
// Compute the size of the index buffer, in number of bytes*/ /* Compute the size of the index buffer, in number of bytes*/
*buffer_size = *buffer_size =
1 /* version */ 1 /* version */
+ (10 /* image_w until decomposition */ + (10 /* image_w until decomposition */
@@ -1361,18 +1370,18 @@ char* create_index_into_byte_array(opj_codestream_info_t *cstr_info, int* buffer
+ cstr_info->tw * cstr_info->th * 4 /* tile info, without distorsion info */ + cstr_info->tw * cstr_info->th * 4 /* tile info, without distorsion info */
+ cstr_info->tw*cstr_info->th * cstr_info->numlayers * (cstr_info->numdecompos[0] + 1) * cstr_info->numcomps * prec_max *8 + cstr_info->tw*cstr_info->th * cstr_info->numlayers * (cstr_info->numdecompos[0] + 1) * cstr_info->numcomps * prec_max *8
) * sizeof(int); ) * sizeof(int);
//printf("C: index buffer size = %d bytes\n", *buffer_size); /*printf("C: index buffer size = %d bytes\n", *buffer_size); */
buffer = (char*) malloc(*buffer_size); buffer = (char*) malloc(*buffer_size);
if (!buffer) { if (!buffer) {
//opj_event_msg(j2k->cinfo, EVT_ERROR, "failed to allocate index buffer for writing %d int\n", *buffer_size); /* opj_event_msg(j2k->cinfo, EVT_ERROR, "failed to allocate index buffer for writing %d int\n", *buffer_size); */
fprintf(stderr, "failed to allocate index buffer for writing %d int\n", *buffer_size); fprintf(stderr, "failed to allocate index buffer for writing %d int\n", *buffer_size);
return 0; return 0;
} }
buffer[0] = 1; // Version stored on a byte buffer[0] = 1; /* Version stored on a byte */
buffer++; buffer++;
// Remaining informations are stored on a int. /* Remaining informations are stored on a int. */
((int*)buffer)[buffer_pos++] = cstr_info->image_w; ((int*)buffer)[buffer_pos++] = cstr_info->image_w;
((int*)buffer)[buffer_pos++] = cstr_info->image_h; ((int*)buffer)[buffer_pos++] = cstr_info->image_h;
((int*)buffer)[buffer_pos++] = cstr_info->prog; ((int*)buffer)[buffer_pos++] = cstr_info->prog;
@@ -1597,7 +1606,7 @@ char* create_index_into_byte_array(opj_codestream_info_t *cstr_info, int* buffer
} /* tileno */ } /* tileno */
if (buffer_pos > *buffer_size) { if (buffer_pos > *buffer_size) {
//opj_event_msg(j2k->cinfo, EVT_ERROR, "index creation: buffer_pos (%d) > buffer_size (%d)!\n", buffer_pos, *buffer_size); /* opj_event_msg(j2k->cinfo, EVT_ERROR, "index creation: buffer_pos (%d) > buffer_size (%d)!\n", buffer_pos, *buffer_size); */
fprintf(stderr, "index creation: buffer_pos (%d) > buffer_size (%d)!\n", buffer_pos, *buffer_size); fprintf(stderr, "index creation: buffer_pos (%d) > buffer_size (%d)!\n", buffer_pos, *buffer_size);
return 0; return 0;
} }
@@ -1630,7 +1639,7 @@ opj_image_t* loadImage(opj_cparameters_t *parameters, JNIEnv *env, jobject obj,
jint *jiBody; jint *jiBody;
jboolean isCopy; jboolean isCopy;
// Image width, height and depth /* Image width, height and depth */
fid = (*env)->GetFieldID(env, cls,"width", "I"); fid = (*env)->GetFieldID(env, cls,"width", "I");
ji = (*env)->GetIntField(env, obj, fid); ji = (*env)->GetIntField(env, obj, fid);
w = ji; w = ji;
@@ -1643,7 +1652,7 @@ opj_image_t* loadImage(opj_cparameters_t *parameters, JNIEnv *env, jobject obj,
ji = (*env)->GetIntField(env, obj, fid); ji = (*env)->GetIntField(env, obj, fid);
depth = ji; depth = ji;
// Read the image /* Read the image */
if (depth <=16) { if (depth <=16) {
numcomps = 1; numcomps = 1;
color_space = CLRSPC_GRAY; color_space = CLRSPC_GRAY;
@@ -1658,8 +1667,10 @@ opj_image_t* loadImage(opj_cparameters_t *parameters, JNIEnv *env, jobject obj,
cmptparm[0].y0 = parameters->image_offset_y0; cmptparm[0].y0 = parameters->image_offset_y0;
cmptparm[0].w = !cmptparm[0].x0 ? (w - 1) * parameters->subsampling_dx + 1 : cmptparm[0].x0 + (w - 1) * parameters->subsampling_dx + 1; cmptparm[0].w = !cmptparm[0].x0 ? (w - 1) * parameters->subsampling_dx + 1 : cmptparm[0].x0 + (w - 1) * parameters->subsampling_dx + 1;
cmptparm[0].h = !cmptparm[0].y0 ? (h - 1) * parameters->subsampling_dy + 1 : cmptparm[0].y0 + (h - 1) * parameters->subsampling_dy + 1; cmptparm[0].h = !cmptparm[0].y0 ? (h - 1) * parameters->subsampling_dy + 1 : cmptparm[0].y0 + (h - 1) * parameters->subsampling_dy + 1;
// Java types are always signed but we use them as unsigned types (shift of the negative part of /* Java types are always signed but we use them as unsigned types
// the pixels of the images in Telemis before entering the encoder). * (shift of the negative part of the pixels of the images in
* Telemis before entering the encoder).
*/
cmptparm[0].sgnd = 0; cmptparm[0].sgnd = 0;
if (depth<=16) if (depth<=16)
cmptparm[0].prec=depth; cmptparm[0].prec=depth;
@@ -1705,12 +1716,12 @@ opj_image_t* loadImage(opj_cparameters_t *parameters, JNIEnv *env, jobject obj,
comp = &image->comps[compno]; comp = &image->comps[compno];
max = -100000; max = -100000;
if (depth == 8) { if (depth == 8) {
fid = (*env)->GetFieldID(env, cls,"image8", "[B"); // byteArray [] fid = (*env)->GetFieldID(env, cls,"image8", "[B");/* byteArray []*/
jba = (*env)->GetObjectField(env, obj, fid); jba = (*env)->GetObjectField(env, obj, fid);
len = (*env)->GetArrayLength(env, jba); len = (*env)->GetArrayLength(env, jba);
jbBody = (*env)->GetPrimitiveArrayCritical(env, jba, &isCopy); jbBody = (*env)->GetPrimitiveArrayCritical(env, jba, &isCopy);
//printf("C: before transfering 8 bpp image\n"); /* printf("C: before transferring 8 bpp image\n"); */
if (comp->sgnd) { if (comp->sgnd) {
for(i=0; i< len;i++) { for(i=0; i< len;i++) {
comp->data[i] = (char) jbBody[i]; comp->data[i] = (char) jbBody[i];
@@ -1724,13 +1735,14 @@ opj_image_t* loadImage(opj_cparameters_t *parameters, JNIEnv *env, jobject obj,
} }
(*env)->ReleasePrimitiveArrayCritical(env, jba, jbBody, 0); (*env)->ReleasePrimitiveArrayCritical(env, jba, jbBody, 0);
} else if(depth == 16) { } else if(depth == 16) {
fid = (*env)->GetFieldID(env, cls,"image16", "[S"); // shortArray [] fid = (*env)->GetFieldID(env, cls,"image16", "[S");/*shortArray []*/
jsa = (*env)->GetObjectField(env, obj, fid); jsa = (*env)->GetObjectField(env, obj, fid);
len = (*env)->GetArrayLength(env, jsa); len = (*env)->GetArrayLength(env, jsa);
jsBody = (*env)->GetPrimitiveArrayCritical(env, jsa, &isCopy); jsBody = (*env)->GetPrimitiveArrayCritical(env, jsa, &isCopy);
//printf("C: before transfering 16 bpp image\n"); /*printf("C: before transferring 16 bpp image\n"); */
if (comp->sgnd) { // Special behaviour to deal with signed elements ?? if (comp->sgnd) {
/* Special behaviour to deal with signed elements ?? */
comp->data[i] = (short) jsBody[i]; comp->data[i] = (short) jsBody[i];
for(i=0; i< len;i++) { for(i=0; i< len;i++) {
if (comp->data[i] > max) max = comp->data[i]; if (comp->data[i] > max) max = comp->data[i];
@@ -1743,14 +1755,15 @@ opj_image_t* loadImage(opj_cparameters_t *parameters, JNIEnv *env, jobject obj,
} }
(*env)->ReleasePrimitiveArrayCritical(env, jsa, jsBody, 0); (*env)->ReleasePrimitiveArrayCritical(env, jsa, jsBody, 0);
} else if (depth == 24) { } else if (depth == 24) {
fid = (*env)->GetFieldID(env, cls,"image24", "[I"); // intArray [] fid = (*env)->GetFieldID(env, cls,"image24", "[I");/* intArray []*/
jia = (*env)->GetObjectField(env, obj, fid); jia = (*env)->GetObjectField(env, obj, fid);
len = (*env)->GetArrayLength(env, jia); len = (*env)->GetArrayLength(env, jia);
shift = compno*8; shift = compno*8;
jiBody = (*env)->GetPrimitiveArrayCritical(env, jia, &isCopy); jiBody = (*env)->GetPrimitiveArrayCritical(env, jia, &isCopy);
//printf("C: before transfering 24 bpp image (component %d, signed = %d)\n", compno, comp->sgnd); /*printf("C: before transferring 24 bpp image (component %d, signed = %d)\n", compno, comp->sgnd);*/
if (comp->sgnd) { // Special behaviour to deal with signed elements ?? XXXXX if (comp->sgnd) {
/* Special behaviour to deal with signed elements ?? XXXXX */
for(i=0; i< len;i++) { for(i=0; i< len;i++) {
comp->data[i] = ( ((int) jiBody[i]) & (0xFF << shift) ) >> shift; comp->data[i] = ( ((int) jiBody[i]) & (0xFF << shift) ) >> shift;
if (comp->data[i] > max) max = comp->data[i]; if (comp->data[i] > max) max = comp->data[i];
@@ -1765,7 +1778,7 @@ opj_image_t* loadImage(opj_cparameters_t *parameters, JNIEnv *env, jobject obj,
} }
comp->bpp = int_floorlog2(max)+1; comp->bpp = int_floorlog2(max)+1;
comp->prec = comp->bpp; comp->prec = comp->bpp;
//printf("C: component %d: max %d, real bpp = %d\n", compno, max, comp->bpp); /*printf("C: component %d: max %d, real bpp = %d\n", compno, max, comp->bpp);*/
} }
return image; return image;
} }
@@ -1775,7 +1788,7 @@ opj_image_t* loadImage(opj_cparameters_t *parameters, JNIEnv *env, jobject obj,
-------------------- MAIN METHOD, CALLED BY JAVA -----------------------*/ -------------------- MAIN METHOD, CALLED BY JAVA -----------------------*/
JNIEXPORT jlong JNICALL Java_org_openJpeg_OpenJPEGJavaEncoder_internalEncodeImageToJ2K(JNIEnv *env, jobject obj, jobjectArray javaParameters) { JNIEXPORT jlong JNICALL Java_org_openJpeg_OpenJPEGJavaEncoder_internalEncodeImageToJ2K(JNIEnv *env, jobject obj, jobjectArray javaParameters) {
int argc; /* To simulate the command line parameters (taken from the javaParameters variable) and be able to re-use the */ int argc; /* To simulate the command line parameters (taken from the javaParameters variable) and be able to re-use the */
char **argv; /* 'parse_cmdline_decoder' method taken from the j2k_to_image project */ const char **argv; /* 'parse_cmdline_decoder' method taken from the j2k_to_image project */
opj_bool bSuccess; opj_bool bSuccess;
opj_cparameters_t parameters; /* compression parameters */ opj_cparameters_t parameters; /* compression parameters */
img_fol_t img_fol; img_fol_t img_fol;
@@ -1783,12 +1796,12 @@ JNIEXPORT jlong JNICALL Java_org_openJpeg_OpenJPEGJavaEncoder_internalEncodeImag
opj_image_t *image = NULL; opj_image_t *image = NULL;
int i,j,num_images; int i,j,num_images;
int imageno; int imageno;
opj_codestream_info_t cstr_info; /* Codestream information structure */ opj_codestream_info_t cstr_info; /* Codestream information structure */
char indexfilename[OPJ_PATH_LEN]; /* index file name */ char indexfilename[OPJ_PATH_LEN]; /* index file name */
int* compressed_index = NULL; int* compressed_index = NULL;
int compressed_index_size=-1; int compressed_index_size=-1;
// ==> Access variables to the Java member variables /* ==> Access variables to the Java member variables */
jsize arraySize; jsize arraySize;
jclass cls; jclass cls;
jobject object; jobject object;
@@ -1797,18 +1810,20 @@ JNIEXPORT jlong JNICALL Java_org_openJpeg_OpenJPEGJavaEncoder_internalEncodeImag
jbyteArray jba; jbyteArray jba;
jbyte *jbBody; jbyte *jbBody;
callback_variables_t msgErrorCallback_vars; callback_variables_t msgErrorCallback_vars;
// <== access variable to the Java member variables. /* <== access variable to the Java member variables. */
jlong retval = -1;
// For the encoding and storage into the file /* For the encoding and storage into the file */
opj_cinfo_t* cinfo; opj_cinfo_t* cinfo;
int codestream_length; int codestream_length = -1;
opj_cio_t *cio = NULL; opj_cio_t *cio = NULL;
FILE *f = NULL; FILE *f = NULL;
// JNI reference to the calling class /* JNI reference to the calling class */
cls = (*env)->GetObjectClass(env, obj); cls = (*env)->GetObjectClass(env, obj);
// Pointers to be able to call a Java method for all the info and error messages /* Pointers to be able to call a Java method
* for all the info and error messages
*/
msgErrorCallback_vars.env = env; msgErrorCallback_vars.env = env;
msgErrorCallback_vars.jobj = &obj; msgErrorCallback_vars.jobj = &obj;
msgErrorCallback_vars.message_mid = (*env)->GetMethodID(env, cls, "logMessage", "(Ljava/lang/String;)V"); msgErrorCallback_vars.message_mid = (*env)->GetMethodID(env, cls, "logMessage", "(Ljava/lang/String;)V");
@@ -1816,8 +1831,11 @@ JNIEXPORT jlong JNICALL Java_org_openJpeg_OpenJPEGJavaEncoder_internalEncodeImag
arraySize = (*env)->GetArrayLength(env, javaParameters); arraySize = (*env)->GetArrayLength(env, javaParameters);
argc = (int) arraySize +1; argc = (int) arraySize +1;
argv = malloc(argc*sizeof(char*)); argv = (const char **)malloc(argc*sizeof(char*));
argv[0] = "ProgramName.exe"; // The program name: useless
if(argv == NULL) return -1;
argv[0] = "ProgramName.exe";/* The program name: useless */
j=0; j=0;
for (i=1; i<argc; i++) { for (i=1; i<argc; i++) {
object = (*env)->GetObjectArrayElement(env, javaParameters, i-1); object = (*env)->GetObjectArrayElement(env, javaParameters, i-1);
@@ -1841,23 +1859,21 @@ JNIEXPORT jlong JNICALL Java_org_openJpeg_OpenJPEGJavaEncoder_internalEncodeImag
/* set encoding parameters to default values */ /* set encoding parameters to default values */
opj_set_default_encoder_parameters(&parameters); opj_set_default_encoder_parameters(&parameters);
parameters.cod_format = J2K_CFMT; parameters.cod_format = J2K_CFMT;
//parameters.index_on = 1; /* parameters.index_on = 1; */
/* Initialize indexfilename and img_fol */ /* Initialize indexfilename and img_fol */
*indexfilename = 0; *indexfilename = 0;
memset(&img_fol,0,sizeof(img_fol_t)); memset(&img_fol,0,sizeof(img_fol_t));
/* parse input and get user encoding parameters */ /* parse input and get user encoding parameters */
if (parse_cmdline_encoder(argc, argv, &parameters,&img_fol, indexfilename) == 1) { j = parse_cmdline_encoder(argc, (char *const*)argv, &parameters,&img_fol, indexfilename);
// Release the Java arguments array
for (i=1; i<argc; i++)
(*env)->ReleaseStringUTFChars(env, (*env)->GetObjectArrayElement(env, javaParameters, i-1), argv[i]);
return -1;
}
// Release the Java arguments array /* Release the Java arguments array */
for (i=1; i<argc; i++) for (i=1; i<argc; i++)
(*env)->ReleaseStringUTFChars(env, (*env)->GetObjectArrayElement(env, javaParameters, i-1), argv[i]); (*env)->ReleaseStringUTFChars(env,
(*env)->GetObjectArrayElement(env, javaParameters, i-1), argv[i]);
if(j == 1) goto fin; /* failure */
if (parameters.cp_cinema){ if (parameters.cp_cinema){
cinema_parameters(&parameters); cinema_parameters(&parameters);
@@ -1872,9 +1888,15 @@ JNIEXPORT jlong JNICALL Java_org_openJpeg_OpenJPEGJavaEncoder_internalEncodeImag
/* UniPG>> */ /* UniPG>> */
#ifdef USE_JPWL #ifdef USE_JPWL
parameters.cp_comment = (char*)malloc(clen+strlen(version)+11); parameters.cp_comment = (char*)malloc(clen+strlen(version)+11);
if(parameters.cp_comment == NULL) goto fin;
sprintf(parameters.cp_comment,"%s%s with JPWL", comment, version); sprintf(parameters.cp_comment,"%s%s with JPWL", comment, version);
#else #else
parameters.cp_comment = (char*)malloc(clen+strlen(version)+1); parameters.cp_comment = (char*)malloc(clen+strlen(version)+1);
if(parameters.cp_comment == NULL) goto fin;
sprintf(parameters.cp_comment,"%s%s", comment, version); sprintf(parameters.cp_comment,"%s%s", comment, version);
#endif #endif
/* <<UniPG */ /* <<UniPG */
@@ -1891,10 +1913,10 @@ JNIEXPORT jlong JNICALL Java_org_openJpeg_OpenJPEGJavaEncoder_internalEncodeImag
fprintf(stderr,"\n"); fprintf(stderr,"\n");
image = loadImage(&parameters, env, obj, cls); image = loadImage(&parameters, env, obj, cls);
//printf("C: after load image: image = %d\n", image); /* printf("C: after load image: image = %d\n", image); */
if (!image) { if (!image) {
fprintf(stderr, "Unable to load image\n"); fprintf(stderr, "Unable to load image\n");
return -1; goto fin;
} }
/* Decide if MCT should be used */ /* Decide if MCT should be used */
@@ -1928,7 +1950,7 @@ JNIEXPORT jlong JNICALL Java_org_openJpeg_OpenJPEGJavaEncoder_internalEncodeImag
if (!bSuccess) { if (!bSuccess) {
opj_cio_close(cio); opj_cio_close(cio);
fprintf(stderr, "failed to encode image\n"); fprintf(stderr, "failed to encode image\n");
return -1; goto fin;
} }
codestream_length = cio_tell(cio); codestream_length = cio_tell(cio);
@@ -1940,7 +1962,8 @@ JNIEXPORT jlong JNICALL Java_org_openJpeg_OpenJPEGJavaEncoder_internalEncodeImag
} }
} }
compressed_index = create_index_into_byte_array(&cstr_info, &compressed_index_size); compressed_index = (int*)
create_index_into_byte_array(&cstr_info, &compressed_index_size);
/* Allocates the Java compressedIndex byte[] and sends this index into the Java object */ /* Allocates the Java compressedIndex byte[] and sends this index into the Java object */
fid = (*env)->GetFieldID(env, cls,"compressedIndex", "[B"); fid = (*env)->GetFieldID(env, cls,"compressedIndex", "[B");
jba = (*env)->NewByteArray(env, compressed_index_size+1); jba = (*env)->NewByteArray(env, compressed_index_size+1);
@@ -1955,14 +1978,14 @@ JNIEXPORT jlong JNICALL Java_org_openJpeg_OpenJPEGJavaEncoder_internalEncodeImag
f = fopen(parameters.outfile, "wb"); f = fopen(parameters.outfile, "wb");
if (!f) { if (!f) {
fprintf(stderr, "failed to open [%s] for writing\n", parameters.outfile); fprintf(stderr, "failed to open [%s] for writing\n", parameters.outfile);
return -1; goto fin;
} }
fwrite(cio->buffer, 1, codestream_length, f); fwrite(cio->buffer, 1, codestream_length, f);
fclose(f); fclose(f);
fprintf(stdout,"Generated outfile [%s]\n",parameters.outfile); fprintf(stdout,"Generated outfile [%s]\n",parameters.outfile);
} }
/* Write the generated codestream to the Java pre-allocated compressedStream byte[] */ /* Write the generated codestream to the Java pre-allocated compressedStream byte[] */
fid = (*env)->GetFieldID(env, cls,"compressedStream", "[B"); fid = (*env)->GetFieldID(env, cls,"compressedStream", "[B");
jba = (*env)->GetObjectField(env, obj, fid); jba = (*env)->GetObjectField(env, obj, fid);
jbBody = (*env)->GetPrimitiveArrayCritical(env, jba, 0); jbBody = (*env)->GetPrimitiveArrayCritical(env, jba, 0);
@@ -1984,5 +2007,10 @@ JNIEXPORT jlong JNICALL Java_org_openJpeg_OpenJPEGJavaEncoder_internalEncodeImag
if(parameters.cp_comment) free(parameters.cp_comment); if(parameters.cp_comment) free(parameters.cp_comment);
if(parameters.cp_matrice) free(parameters.cp_matrice); if(parameters.cp_matrice) free(parameters.cp_matrice);
return codestream_length; retval = codestream_length;
fin:
free(argv);
return retval;
} }

View File

@@ -203,7 +203,7 @@ int get_file_format(char *filename) {
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters,img_fol_t *img_fol) { int parse_cmdline_decoder(int argc, char * const argv[], opj_dparameters_t *parameters,img_fol_t *img_fol) {
/* parse the command line */ /* parse the command line */
int totlen; int totlen;
opj_option_t long_option[]={ opj_option_t long_option[]={
@@ -339,6 +339,9 @@ int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters,i
case 'y': /* Image Directory path */ case 'y': /* Image Directory path */
{ {
img_fol->imgdirpath = (char*)malloc(strlen(opj_optarg) + 1); img_fol->imgdirpath = (char*)malloc(strlen(opj_optarg) + 1);
if(img_fol->imgdirpath == NULL) return 1;
strcpy(img_fol->imgdirpath,opj_optarg); strcpy(img_fol->imgdirpath,opj_optarg);
img_fol->set_imgdir=1; img_fol->set_imgdir=1;
} }
@@ -426,7 +429,7 @@ int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters,i
/* No check for possible errors before the -i and -o options are of course not mandatory*/ /* No check for possible errors before the -i and -o options are of course not mandatory*/
return 0; return 0;
} }/* parse_cmdline_decoder() */
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
@@ -488,12 +491,13 @@ void info_callback(const char *msg, void *client_data) {
(*env)->DeleteLocalRef(env, jbuffer); (*env)->DeleteLocalRef(env, jbuffer);
} }
#define FAILS -1
#define OK 0
/* -------------------------------------------------------------------------- /* --------------------------------------------------------------------------
-------------------- MAIN METHOD, CALLED BY JAVA -----------------------*/ -------------------- MAIN METHOD, CALLED BY JAVA -----------------------*/
JNIEXPORT jint JNICALL Java_org_openJpeg_OpenJPEGJavaDecoder_internalDecodeJ2KtoImage(JNIEnv *env, jobject obj, jobjectArray javaParameters) { JNIEXPORT jint JNICALL Java_org_openJpeg_OpenJPEGJavaDecoder_internalDecodeJ2KtoImage(JNIEnv *env, jobject obj, jobjectArray javaParameters) {
int argc; /* To simulate the command line parameters (taken from the javaParameters variable) and be able to re-use the */ int argc; /* To simulate the command line parameters (taken from the javaParameters variable) and be able to re-use the */
char **argv; /* 'parse_cmdline_decoder' method taken from the j2k_to_image project */ const char **argv; /* 'parse_cmdline_decoder' method taken from the j2k_to_image project */
opj_dparameters_t parameters; /* decompression parameters */ opj_dparameters_t parameters; /* decompression parameters */
img_fol_t img_fol; img_fol_t img_fol;
opj_event_mgr_t event_mgr; /* event manager */ opj_event_mgr_t event_mgr; /* event manager */
@@ -508,7 +512,7 @@ JNIEXPORT jint JNICALL Java_org_openJpeg_OpenJPEGJavaDecoder_internalDecodeJ2Kto
int w,h; int w,h;
long min_value, max_value; long min_value, max_value;
short tempS; unsigned char tempUC, tempUC1, tempUC2; short tempS; unsigned char tempUC, tempUC1, tempUC2;
// ==> Access variables to the Java member variables /* ==> Access variables to the Java member variables */
jsize arraySize; jsize arraySize;
jclass cls; jclass cls;
jobject object; jobject object;
@@ -521,8 +525,9 @@ JNIEXPORT jint JNICALL Java_org_openJpeg_OpenJPEGJavaDecoder_internalDecodeJ2Kto
jshort *jsBody, *ptrSBody; jshort *jsBody, *ptrSBody;
jint *jiBody, *ptrIBody; jint *jiBody, *ptrIBody;
callback_variables_t msgErrorCallback_vars; callback_variables_t msgErrorCallback_vars;
// <=== access variable to Java member variables */ /* <=== access variable to Java member variables */
int *ptr, *ptr1, *ptr2; // <== To transfer the decoded image to Java int *ptr, *ptr1, *ptr2;/* <== To transfer the decoded image to Java */
jint retval = FAILS;
/* configure the event callbacks */ /* configure the event callbacks */
memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); memset(&event_mgr, 0, sizeof(opj_event_mgr_t));
@@ -530,20 +535,26 @@ JNIEXPORT jint JNICALL Java_org_openJpeg_OpenJPEGJavaDecoder_internalDecodeJ2Kto
event_mgr.warning_handler = warning_callback; event_mgr.warning_handler = warning_callback;
event_mgr.info_handler = info_callback; event_mgr.info_handler = info_callback;
// JNI reference to the calling class /* JNI reference to the calling class */
cls = (*env)->GetObjectClass(env, obj); cls = (*env)->GetObjectClass(env, obj);
// Pointers to be able to call a Java method for all the info and error messages /* Pointers to be able to call a Java method
* for all the info and error messages
*/
msgErrorCallback_vars.env = env; msgErrorCallback_vars.env = env;
msgErrorCallback_vars.jobj = &obj; msgErrorCallback_vars.jobj = &obj;
msgErrorCallback_vars.message_mid = (*env)->GetMethodID(env, cls, "logMessage", "(Ljava/lang/String;)V"); msgErrorCallback_vars.message_mid = (*env)->GetMethodID(env, cls, "logMessage", "(Ljava/lang/String;)V");
msgErrorCallback_vars.error_mid = (*env)->GetMethodID(env, cls, "logError", "(Ljava/lang/String;)V"); msgErrorCallback_vars.error_mid = (*env)->GetMethodID(env, cls, "logError", "(Ljava/lang/String;)V");
// Get the String[] containing the parameters, and converts it into a char** to simulate command line arguments. /* Get the String[] containing the parameters */
arraySize = (*env)->GetArrayLength(env, javaParameters); arraySize = (*env)->GetArrayLength(env, javaParameters);
argc = (int) arraySize +1; argc = (int) arraySize +1;
argv = malloc(argc*sizeof(char*)); argv = (const char **)malloc(argc*sizeof(char*));
argv[0] = "ProgramName.exe"; // The program name: useless
if(argv == NULL) return FAILS;
argv[0] = "ProgramName.exe";/* The program name: useless */
j=0; j=0;
for (i=1; i<argc; i++) { for (i=1; i<argc; i++) {
object = (*env)->GetObjectArrayElement(env, javaParameters, i-1); object = (*env)->GetObjectArrayElement(env, javaParameters, i-1);
@@ -561,19 +572,18 @@ JNIEXPORT jint JNICALL Java_org_openJpeg_OpenJPEGJavaDecoder_internalDecodeJ2Kto
parameters.decod_format = J2K_CFMT; parameters.decod_format = J2K_CFMT;
/* parse input and get user encoding parameters */ /* parse input and get user encoding parameters */
if(parse_cmdline_decoder(argc, argv, &parameters,&img_fol) == 1) { j = parse_cmdline_decoder(argc, (char * const*)argv, &parameters,&img_fol);
// Release the Java arguments array
for (i=1; i<argc; i++) /* Release the Java arguments array */
(*env)->ReleaseStringUTFChars(env, (*env)->GetObjectArrayElement(env, javaParameters, i-1), argv[i]);
return -1;
}
// Release the Java arguments array
for (i=1; i<argc; i++) for (i=1; i<argc; i++)
(*env)->ReleaseStringUTFChars(env, (*env)->GetObjectArrayElement(env, javaParameters, i-1), argv[i]); (*env)->ReleaseStringUTFChars(env,
(*env)->GetObjectArrayElement(env, javaParameters, i-1), argv[i]);
if(j == 1) goto fin; /* failure */
num_images=1; num_images=1;
// Get additional information from the Java object variables /* Get additional information from the Java object variables */
fid = (*env)->GetFieldID(env, cls,"skippedResolutions", "I"); fid = (*env)->GetFieldID(env, cls,"skippedResolutions", "I");
parameters.cp_reduce = (short) (*env)->GetIntField(env, obj, fid); parameters.cp_reduce = (short) (*env)->GetIntField(env, obj, fid);
@@ -587,22 +597,25 @@ JNIEXPORT jint JNICALL Java_org_openJpeg_OpenJPEGJavaDecoder_internalDecodeJ2Kto
Implemented for debug purpose. */ Implemented for debug purpose. */
/* -------------------------------------------------------------- */ /* -------------------------------------------------------------- */
if (parameters.infile && parameters.infile[0]!='\0') { if (parameters.infile && parameters.infile[0]!='\0') {
//printf("C: opening [%s]\n", parameters.infile); /* printf("C: opening [%s]\n", parameters.infile); */
fsrc = fopen(parameters.infile, "rb"); fsrc = fopen(parameters.infile, "rb");
if (!fsrc) { if (!fsrc) {
fprintf(stderr, "ERROR -> failed to open %s for reading\n", parameters.infile); fprintf(stderr, "ERROR -> failed to open %s for reading\n", parameters.infile);
return 1; goto fin;
} }
fseek(fsrc, 0, SEEK_END); fseek(fsrc, 0, SEEK_END);
file_length = ftell(fsrc); file_length = ftell(fsrc);
fseek(fsrc, 0, SEEK_SET); fseek(fsrc, 0, SEEK_SET);
src = (unsigned char *) malloc(file_length); src = (unsigned char *) malloc(file_length);
if(src == NULL) goto fin;
fread(src, 1, file_length, fsrc); fread(src, 1, file_length, fsrc);
fclose(fsrc); fclose(fsrc);
//printf("C: %d bytes read from file\n",file_length); /* printf("C: %d bytes read from file\n",file_length); */
} else { } else {
// Preparing the transfer of the codestream from Java to C /* Preparing the transfer of the codestream from Java to C */
//printf("C: before transfering codestream\n"); /* printf("C: before transferring codestream\n"); */
fid = (*env)->GetFieldID(env, cls,"compressedStream", "[B"); fid = (*env)->GetFieldID(env, cls,"compressedStream", "[B");
jba = (*env)->GetObjectField(env, obj, fid); jba = (*env)->GetObjectField(env, obj, fid);
file_length = (*env)->GetArrayLength(env, jba); file_length = (*env)->GetArrayLength(env, jba);
@@ -636,7 +649,7 @@ JNIEXPORT jint JNICALL Java_org_openJpeg_OpenJPEGJavaDecoder_internalDecodeJ2Kto
fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n"); fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n");
opj_destroy_decompress(dinfo); opj_destroy_decompress(dinfo);
opj_cio_close(cio); opj_cio_close(cio);
return 1; goto fin;
} }
/* close the byte stream */ /* close the byte stream */
@@ -666,7 +679,7 @@ JNIEXPORT jint JNICALL Java_org_openJpeg_OpenJPEGJavaDecoder_internalDecodeJ2Kto
fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n"); fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n");
opj_destroy_decompress(dinfo); opj_destroy_decompress(dinfo);
opj_cio_close(cio); opj_cio_close(cio);
return 1; goto fin;
} }
/* close the byte stream */ /* close the byte stream */
@@ -697,7 +710,7 @@ JNIEXPORT jint JNICALL Java_org_openJpeg_OpenJPEGJavaDecoder_internalDecodeJ2Kto
fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n"); fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n");
opj_destroy_decompress(dinfo); opj_destroy_decompress(dinfo);
opj_cio_close(cio); opj_cio_close(cio);
return 1; goto fin;
} }
/* close the byte stream */ /* close the byte stream */
@@ -752,17 +765,21 @@ JNIEXPORT jint JNICALL Java_org_openJpeg_OpenJPEGJavaDecoder_internalDecodeJ2Kto
} }
// ========= Return the image to the Java structure =============== /* ========= Return the image to the Java structure =============== */
#ifdef CHECK_THRESHOLDS #ifdef CHECK_THRESHOLDS
printf("C: checking thresholds\n"); printf("C: checking thresholds\n");
#endif #endif
// First compute the real with and height, in function of the resolutions decoded. /* First compute the real with and height,
//wr = (image->comps[0].w + (1 << image->comps[0].factor) -1) >> image->comps[0].factor; * in function of the resolutions decoded.
//hr = (image->comps[0].h + (1 << image->comps[0].factor) -1) >> image->comps[0].factor; */
/*---
wr = (image->comps[0].w + (1 << image->comps[0].factor) -1) >> image->comps[0].factor;
hr = (image->comps[0].h + (1 << image->comps[0].factor) -1) >> image->comps[0].factor;
---*/
w = image->comps[0].w; w = image->comps[0].w;
h = image->comps[0].h; h = image->comps[0].h;
if (image->numcomps==3) { // 3 components color image if (image->numcomps==3) { /* 3 components color image */
ptr = image->comps[0].data; ptr = image->comps[0].data;
ptr1 = image->comps[1].data; ptr1 = image->comps[1].data;
ptr2 = image->comps[2].data; ptr2 = image->comps[2].data;
@@ -775,12 +792,12 @@ JNIEXPORT jint JNICALL Java_org_openJpeg_OpenJPEGJavaDecoder_internalDecodeJ2Kto
max_value = 255; max_value = 255;
} }
#endif #endif
// Get the pointer to the Java structure where the data must be copied /* Get the pointer to the Java structure where the data must be copied */
fid = (*env)->GetFieldID(env, cls,"image24", "[I"); fid = (*env)->GetFieldID(env, cls,"image24", "[I");
jia = (*env)->GetObjectField(env, obj, fid); jia = (*env)->GetObjectField(env, obj, fid);
jiBody = (*env)->GetIntArrayElements(env, jia, 0); jiBody = (*env)->GetIntArrayElements(env, jia, 0);
ptrIBody = jiBody; ptrIBody = jiBody;
printf("C: transfering image24: %d int to Java pointer=%d\n",image->numcomps*w*h, ptrIBody); printf("C: transferring image24: %d int to Java pointer=%d\n",image->numcomps*w*h, ptrIBody);
for (i=0; i<w*h; i++) { for (i=0; i<w*h; i++) {
tempUC = (unsigned char)(ptr[i]); tempUC = (unsigned char)(ptr[i]);
@@ -804,9 +821,9 @@ JNIEXPORT jint JNICALL Java_org_openJpeg_OpenJPEGJavaDecoder_internalDecodeJ2Kto
} }
(*env)->ReleaseIntArrayElements(env, jia, jiBody, 0); (*env)->ReleaseIntArrayElements(env, jia, jiBody, 0);
} else { // 1 component 8 or 16 bpp image } else { /* 1 component 8 or 16 bpp image */
ptr = image->comps[0].data; ptr = image->comps[0].data;
printf("C: before transfering a %d bpp image to java (length = %d)\n",image->comps[0].prec ,w*h); printf("C: before transferring a %d bpp image to java (length = %d)\n",image->comps[0].prec ,w*h);
if (image->comps[0].prec<=8) { if (image->comps[0].prec<=8) {
fid = (*env)->GetFieldID(env, cls,"image8", "[B"); fid = (*env)->GetFieldID(env, cls,"image8", "[B");
jba = (*env)->GetObjectField(env, obj, fid); jba = (*env)->GetObjectField(env, obj, fid);
@@ -821,7 +838,7 @@ JNIEXPORT jint JNICALL Java_org_openJpeg_OpenJPEGJavaDecoder_internalDecodeJ2Kto
max_value = 255; max_value = 255;
} }
#endif #endif
//printf("C: transfering %d shorts to Java image8 pointer = %d\n", wr*hr,ptrSBody); /* printf("C: transferring %d shorts to Java image8 pointer = %d\n", wr*hr,ptrSBody); */
for (i=0; i<w*h; i++) { for (i=0; i<w*h; i++) {
tempUC = (unsigned char) (ptr[i]); tempUC = (unsigned char) (ptr[i]);
#ifdef CHECK_THRESHOLDS #ifdef CHECK_THRESHOLDS
@@ -849,7 +866,7 @@ JNIEXPORT jint JNICALL Java_org_openJpeg_OpenJPEGJavaDecoder_internalDecodeJ2Kto
} }
printf("C: minValue = %d, maxValue = %d\n", min_value, max_value); printf("C: minValue = %d, maxValue = %d\n", min_value, max_value);
#endif #endif
printf("C: transfering %d shorts to Java image16 pointer = %d\n", w*h,ptrSBody); printf("C: transferring %d shorts to Java image16 pointer = %d\n", w*h,ptrSBody);
for (i=0; i<w*h; i++) { for (i=0; i<w*h; i++) {
tempS = (short) (ptr[i]); tempS = (short) (ptr[i]);
#ifdef CHECK_THRESHOLDS #ifdef CHECK_THRESHOLDS
@@ -877,7 +894,12 @@ JNIEXPORT jint JNICALL Java_org_openJpeg_OpenJPEGJavaDecoder_internalDecodeJ2Kto
opj_image_destroy(image); opj_image_destroy(image);
} }
return 1; /* OK */ retval = OK;
}
//end main fin:
free(argv);
return retval;
}
/* end main MAIN */

View File

@@ -3,10 +3,17 @@
# First thing define the common source: # First thing define the common source:
SET(common_SRCS SET(common_SRCS
convert.c convert.c
converttif.c
convertbmp.c
convertpng.c
index.c index.c
${OPENJPEG_SOURCE_DIR}/applications/common/color.c ${OPENJPEG_SOURCE_DIR}/applications/common/color.c
${OPENJPEG_SOURCE_DIR}/applications/common/opj_getopt.c
) )
if(NOT USE_SYSTEM_GETOPT)
list(APPEND common_SRCS
${OPENJPEG_SOURCE_DIR}/applications/common/opj_getopt.c
)
endif()
# Headers file are located here: # Headers file are located here:
INCLUDE_DIRECTORIES( INCLUDE_DIRECTORIES(

View File

@@ -78,7 +78,7 @@ JPWL_j2k_to_image_CPPFLAGS = \
@LCMS1_CFLAGS@ \ @LCMS1_CFLAGS@ \
@LCMS2_CFLAGS@ @LCMS2_CFLAGS@
JPWL_j2k_to_image_CFLAGS = JPWL_j2k_to_image_CFLAGS =
JPWL_j2k_to_image_LDADD = $(top_builddir)/libopenjpeg/jpwl/libopenjpeg_JPWL.la @LCMS1_LIBS@ @LCMS2_LIBS@ @TIFF_LIBS@ @PNG_LIBS@ JPWL_j2k_to_image_LDADD = $(top_builddir)/libopenjpeg/jpwl/libopenjpeg_JPWL.la @LCMS1_LIBS@ @LCMS2_LIBS@ @TIFF_LIBS@ @PNG_LIBS@ -lm
JPWL_j2k_to_image_SOURCES = \ JPWL_j2k_to_image_SOURCES = \
../common/color.c \ ../common/color.c \
../common/opj_getopt.c \ ../common/opj_getopt.c \
@@ -96,7 +96,7 @@ JPWL_image_to_j2k_CPPFLAGS = \
@TIFF_CFLAGS@ \ @TIFF_CFLAGS@ \
@PNG_CFLAGS@ @PNG_CFLAGS@
JPWL_image_to_j2k_CFLAGS = JPWL_image_to_j2k_CFLAGS =
JPWL_image_to_j2k_LDADD = $(top_builddir)/libopenjpeg/jpwl/libopenjpeg_JPWL.la @TIFF_LIBS@ @PNG_LIBS@ JPWL_image_to_j2k_LDADD = $(top_builddir)/libopenjpeg/jpwl/libopenjpeg_JPWL.la @TIFF_LIBS@ @PNG_LIBS@ -lm
JPWL_image_to_j2k_SOURCES = \ JPWL_image_to_j2k_SOURCES = \
../common/opj_getopt.c \ ../common/opj_getopt.c \

File diff suppressed because it is too large Load Diff

View File

@@ -47,6 +47,21 @@ typedef struct raw_cparameters {
/*@}*/ /*@}*/
} raw_cparameters_t; } raw_cparameters_t;
/* Component precision scaling */
void clip_component(opj_image_comp_t* component, int precision);
void scale_component(opj_image_comp_t* component, int precision);
/* planar / interleaved conversions */
typedef void (* convert_32s_CXPX)(const int* pSrc, int* const* pDst, size_t length);
extern const convert_32s_CXPX convert_32s_CXPX_LUT[5];
typedef void (* convert_32s_PXCX)(int const* const* pSrc, int* pDst, size_t length, int adjust);
extern const convert_32s_PXCX convert_32s_PXCX_LUT[5];
/* bit depth conversions */
typedef void (* convert_XXx32s_C1R)(const unsigned char* pSrc, int* pDst, size_t length);
extern const convert_XXx32s_C1R convert_XXu32s_C1R_LUT[9]; /* up to 8bpp */
typedef void (* convert_32sXXx_C1R)(const int* pSrc, unsigned char* pDst, size_t length);
extern const convert_32sXXx_C1R convert_32sXXu_C1R_LUT[9]; /* up to 8bpp */
/* TGA conversion */ /* TGA conversion */
opj_image_t* tgatoimage(const char *filename, opj_cparameters_t *parameters); opj_image_t* tgatoimage(const char *filename, opj_cparameters_t *parameters);
int imagetotga(opj_image_t * image, const char *outfile); int imagetotga(opj_image_t * image, const char *outfile);

View File

@@ -0,0 +1,995 @@
/*
* The copyright in this software is being made available under the 2-clauses
* BSD License, included below. This software may be subject to other third
* party and contributor rights, including patent rights, and no such rights
* are granted under this license.
*
* Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2014, Professor Benoit Macq
* Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2007, Francois-Olivier Devaux
* Copyright (c) 2003-2014, Antonin Descampe
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* Copyright (c) 2006-2007, Parvatha Elangovan
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include "opj_config.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "openjpeg.h"
#include "convert.h"
#ifdef HAVE_STDINT_H
#include <stdint.h>
#else
#if defined(_WIN32)
typedef signed __int8 int8_t;
typedef unsigned __int8 uint8_t;
typedef signed __int16 int16_t;
typedef unsigned __int16 uint16_t;
typedef signed __int32 int32_t;
typedef unsigned __int32 uint32_t;
typedef signed __int64 int64_t;
typedef unsigned __int64 uint64_t;
#else
#error unsupported platform
#endif
#endif
typedef struct {
uint16_t bfType; /* 'BM' for Bitmap (19776) */
uint32_t bfSize; /* Size of the file */
uint16_t bfReserved1; /* Reserved : 0 */
uint16_t bfReserved2; /* Reserved : 0 */
uint32_t bfOffBits; /* Offset */
} OPJ_BITMAPFILEHEADER;
typedef struct {
uint32_t biSize; /* Size of the structure in bytes */
uint32_t biWidth; /* Width of the image in pixels */
uint32_t biHeight; /* Heigth of the image in pixels */
uint16_t biPlanes; /* 1 */
uint16_t biBitCount; /* Number of color bits by pixels */
uint32_t biCompression; /* Type of encoding 0: none 1: RLE8 2: RLE4 */
uint32_t biSizeImage; /* Size of the image in bytes */
uint32_t biXpelsPerMeter; /* Horizontal (X) resolution in pixels/meter */
uint32_t biYpelsPerMeter; /* Vertical (Y) resolution in pixels/meter */
uint32_t biClrUsed; /* Number of color used in the image (0: ALL) */
uint32_t biClrImportant; /* Number of important color (0: ALL) */
uint32_t biRedMask; /* Red channel bit mask */
uint32_t biGreenMask; /* Green channel bit mask */
uint32_t biBlueMask; /* Blue channel bit mask */
uint32_t biAlphaMask; /* Alpha channel bit mask */
uint32_t biColorSpaceType; /* Color space type */
uint8_t biColorSpaceEP[36]; /* Color space end points */
uint32_t biRedGamma; /* Red channel gamma */
uint32_t biGreenGamma; /* Green channel gamma */
uint32_t biBlueGamma; /* Blue channel gamma */
uint32_t biIntent; /* Intent */
uint32_t biIccProfileData; /* ICC profile data */
uint32_t biIccProfileSize; /* ICC profile size */
uint32_t biReserved; /* Reserved */
} OPJ_BITMAPINFOHEADER;
static void opj_applyLUT8u_8u32s_C1R(
uint8_t const* pSrc, int32_t srcStride,
int32_t* pDst, int32_t dstStride,
uint8_t const* pLUT,
uint32_t width, uint32_t height)
{
uint32_t y;
for (y = height; y != 0U; --y) {
uint32_t x;
for(x = 0; x < width; x++)
{
pDst[x] = (int32_t)pLUT[pSrc[x]];
}
pSrc += srcStride;
pDst += dstStride;
}
}
static void opj_applyLUT8u_8u32s_C1P3R(
uint8_t const* pSrc, int32_t srcStride,
int32_t* const* pDst, int32_t const* pDstStride,
uint8_t const* const* pLUT,
uint32_t width, uint32_t height)
{
uint32_t y;
int32_t* pR = pDst[0];
int32_t* pG = pDst[1];
int32_t* pB = pDst[2];
uint8_t const* pLUT_R = pLUT[0];
uint8_t const* pLUT_G = pLUT[1];
uint8_t const* pLUT_B = pLUT[2];
for (y = height; y != 0U; --y) {
uint32_t x;
for(x = 0; x < width; x++)
{
uint8_t idx = pSrc[x];
pR[x] = (int32_t)pLUT_R[idx];
pG[x] = (int32_t)pLUT_G[idx];
pB[x] = (int32_t)pLUT_B[idx];
}
pSrc += srcStride;
pR += pDstStride[0];
pG += pDstStride[1];
pB += pDstStride[2];
}
}
static void bmp24toimage(const uint8_t* pData, uint32_t stride, opj_image_t* image)
{
int index;
uint32_t width, height;
uint32_t x, y;
const uint8_t *pSrc = NULL;
width = image->comps[0].w;
height = image->comps[0].h;
index = 0;
pSrc = pData + (height - 1U) * stride;
for(y = 0; y < height; y++)
{
for(x = 0; x < width; x++)
{
image->comps[0].data[index] = (int32_t)pSrc[3*x+2]; /* R */
image->comps[1].data[index] = (int32_t)pSrc[3*x+1]; /* G */
image->comps[2].data[index] = (int32_t)pSrc[3*x+0]; /* B */
index++;
}
pSrc -= stride;
}
}
static void bmp_mask_get_shift_and_prec(uint32_t mask, uint32_t* shift, uint32_t* prec)
{
uint32_t l_shift, l_prec;
l_shift = l_prec = 0U;
if (mask != 0U) {
while ((mask & 1U) == 0U) {
mask >>= 1;
l_shift++;
}
while (mask & 1U) {
mask >>= 1;
l_prec++;
}
}
*shift = l_shift; *prec = l_prec;
}
static void bmpmask32toimage(const uint8_t* pData, uint32_t stride, opj_image_t* image, uint32_t redMask, uint32_t greenMask, uint32_t blueMask, uint32_t alphaMask)
{
int index;
uint32_t width, height;
uint32_t x, y;
const uint8_t *pSrc = NULL;
opj_bool hasAlpha = OPJ_FALSE;
uint32_t redShift, redPrec;
uint32_t greenShift, greenPrec;
uint32_t blueShift, bluePrec;
uint32_t alphaShift, alphaPrec;
width = image->comps[0].w;
height = image->comps[0].h;
hasAlpha = image->numcomps > 3U;
bmp_mask_get_shift_and_prec(redMask, &redShift, &redPrec);
bmp_mask_get_shift_and_prec(greenMask, &greenShift, &greenPrec);
bmp_mask_get_shift_and_prec(blueMask, &blueShift, &bluePrec);
bmp_mask_get_shift_and_prec(alphaMask, &alphaShift, &alphaPrec);
image->comps[0].bpp = redPrec;
image->comps[0].prec = redPrec;
image->comps[1].bpp = greenPrec;
image->comps[1].prec = greenPrec;
image->comps[2].bpp = bluePrec;
image->comps[2].prec = bluePrec;
if (hasAlpha) {
image->comps[3].bpp = alphaPrec;
image->comps[3].prec = alphaPrec;
}
index = 0;
pSrc = pData + (height - 1U) * stride;
for(y = 0; y < height; y++)
{
for(x = 0; x < width; x++)
{
uint32_t value = 0U;
value |= ((uint32_t)pSrc[4*x+0]) << 0;
value |= ((uint32_t)pSrc[4*x+1]) << 8;
value |= ((uint32_t)pSrc[4*x+2]) << 16;
value |= ((uint32_t)pSrc[4*x+3]) << 24;
image->comps[0].data[index] = (int32_t)((value & redMask) >> redShift); /* R */
image->comps[1].data[index] = (int32_t)((value & greenMask) >> greenShift); /* G */
image->comps[2].data[index] = (int32_t)((value & blueMask) >> blueShift); /* B */
if (hasAlpha) {
image->comps[3].data[index] = (int32_t)((value & alphaMask) >> alphaShift); /* A */
}
index++;
}
pSrc -= stride;
}
}
static void bmpmask16toimage(const uint8_t* pData, uint32_t stride, opj_image_t* image, uint32_t redMask, uint32_t greenMask, uint32_t blueMask, uint32_t alphaMask)
{
int index;
uint32_t width, height;
uint32_t x, y;
const uint8_t *pSrc = NULL;
opj_bool hasAlpha = OPJ_FALSE;
uint32_t redShift, redPrec;
uint32_t greenShift, greenPrec;
uint32_t blueShift, bluePrec;
uint32_t alphaShift, alphaPrec;
width = image->comps[0].w;
height = image->comps[0].h;
hasAlpha = image->numcomps > 3U;
bmp_mask_get_shift_and_prec(redMask, &redShift, &redPrec);
bmp_mask_get_shift_and_prec(greenMask, &greenShift, &greenPrec);
bmp_mask_get_shift_and_prec(blueMask, &blueShift, &bluePrec);
bmp_mask_get_shift_and_prec(alphaMask, &alphaShift, &alphaPrec);
image->comps[0].bpp = redPrec;
image->comps[0].prec = redPrec;
image->comps[1].bpp = greenPrec;
image->comps[1].prec = greenPrec;
image->comps[2].bpp = bluePrec;
image->comps[2].prec = bluePrec;
if (hasAlpha) {
image->comps[3].bpp = alphaPrec;
image->comps[3].prec = alphaPrec;
}
index = 0;
pSrc = pData + (height - 1U) * stride;
for(y = 0; y < height; y++)
{
for(x = 0; x < width; x++)
{
uint32_t value = 0U;
value |= ((uint32_t)pSrc[2*x+0]) << 0;
value |= ((uint32_t)pSrc[2*x+1]) << 8;
image->comps[0].data[index] = (int32_t)((value & redMask) >> redShift); /* R */
image->comps[1].data[index] = (int32_t)((value & greenMask) >> greenShift); /* G */
image->comps[2].data[index] = (int32_t)((value & blueMask) >> blueShift); /* B */
if (hasAlpha) {
image->comps[3].data[index] = (int32_t)((value & alphaMask) >> alphaShift); /* A */
}
index++;
}
pSrc -= stride;
}
}
static opj_image_t* bmp8toimage(const uint8_t* pData, uint32_t stride, opj_image_t* image, uint8_t const* const* pLUT)
{
uint32_t width, height;
const uint8_t *pSrc = NULL;
width = image->comps[0].w;
height = image->comps[0].h;
pSrc = pData + (height - 1U) * stride;
if (image->numcomps == 1U) {
opj_applyLUT8u_8u32s_C1R(pSrc, -(int32_t)stride, image->comps[0].data, (int32_t)width, pLUT[0], width, height);
}
else {
int32_t* pDst[3];
int32_t pDstStride[3];
pDst[0] = image->comps[0].data; pDst[1] = image->comps[1].data; pDst[2] = image->comps[2].data;
pDstStride[0] = (int32_t)width; pDstStride[1] = (int32_t)width; pDstStride[2] = (int32_t)width;
opj_applyLUT8u_8u32s_C1P3R(pSrc, -(int32_t)stride, pDst, pDstStride, pLUT, width, height);
}
return image;
}
static opj_bool bmp_read_file_header(FILE* IN, OPJ_BITMAPFILEHEADER* header)
{
header->bfType = (uint16_t)getc(IN);
header->bfType |= (uint16_t)((uint32_t)getc(IN) << 8);
if (header->bfType != 19778) {
fprintf(stderr,"Error, not a BMP file!\n");
return OPJ_FALSE;
}
/* FILE HEADER */
/* ------------- */
header->bfSize = (uint32_t)getc(IN);
header->bfSize |= (uint32_t)getc(IN) << 8;
header->bfSize |= (uint32_t)getc(IN) << 16;
header->bfSize |= (uint32_t)getc(IN) << 24;
header->bfReserved1 = (uint16_t)getc(IN);
header->bfReserved1 |= (uint16_t)((uint32_t)getc(IN) << 8);
header->bfReserved2 = (uint16_t)getc(IN);
header->bfReserved2 |= (uint16_t)((uint32_t)getc(IN) << 8);
header->bfOffBits = (uint32_t)getc(IN);
header->bfOffBits |= (uint32_t)getc(IN) << 8;
header->bfOffBits |= (uint32_t)getc(IN) << 16;
header->bfOffBits |= (uint32_t)getc(IN) << 24;
return OPJ_TRUE;
}
static opj_bool bmp_read_info_header(FILE* IN, OPJ_BITMAPINFOHEADER* header)
{
memset(header, 0, sizeof(*header));
/* INFO HEADER */
/* ------------- */
header->biSize = (uint32_t)getc(IN);
header->biSize |= (uint32_t)getc(IN) << 8;
header->biSize |= (uint32_t)getc(IN) << 16;
header->biSize |= (uint32_t)getc(IN) << 24;
switch (header->biSize) {
case 12U: /* BITMAPCOREHEADER */
case 40U: /* BITMAPINFOHEADER */
case 52U: /* BITMAPV2INFOHEADER */
case 56U: /* BITMAPV3INFOHEADER */
case 108U: /* BITMAPV4HEADER */
case 124U: /* BITMAPV5HEADER */
break;
default:
fprintf(stderr,"Error, unknown BMP header size %d\n", header->biSize);
return OPJ_FALSE;
}
header->biWidth = (uint32_t)getc(IN);
header->biWidth |= (uint32_t)getc(IN) << 8;
header->biWidth |= (uint32_t)getc(IN) << 16;
header->biWidth |= (uint32_t)getc(IN) << 24;
header->biHeight = (uint32_t)getc(IN);
header->biHeight |= (uint32_t)getc(IN) << 8;
header->biHeight |= (uint32_t)getc(IN) << 16;
header->biHeight |= (uint32_t)getc(IN) << 24;
header->biPlanes = (uint16_t)getc(IN);
header->biPlanes |= (uint16_t)((uint32_t)getc(IN) << 8);
header->biBitCount = (uint16_t)getc(IN);
header->biBitCount |= (uint16_t)((uint32_t)getc(IN) << 8);
if(header->biSize >= 40U) {
header->biCompression = (uint32_t)getc(IN);
header->biCompression |= (uint32_t)getc(IN) << 8;
header->biCompression |= (uint32_t)getc(IN) << 16;
header->biCompression |= (uint32_t)getc(IN) << 24;
header->biSizeImage = (uint32_t)getc(IN);
header->biSizeImage |= (uint32_t)getc(IN) << 8;
header->biSizeImage |= (uint32_t)getc(IN) << 16;
header->biSizeImage |= (uint32_t)getc(IN) << 24;
header->biXpelsPerMeter = (uint32_t)getc(IN);
header->biXpelsPerMeter |= (uint32_t)getc(IN) << 8;
header->biXpelsPerMeter |= (uint32_t)getc(IN) << 16;
header->biXpelsPerMeter |= (uint32_t)getc(IN) << 24;
header->biYpelsPerMeter = (uint32_t)getc(IN);
header->biYpelsPerMeter |= (uint32_t)getc(IN) << 8;
header->biYpelsPerMeter |= (uint32_t)getc(IN) << 16;
header->biYpelsPerMeter |= (uint32_t)getc(IN) << 24;
header->biClrUsed = (uint32_t)getc(IN);
header->biClrUsed |= (uint32_t)getc(IN) << 8;
header->biClrUsed |= (uint32_t)getc(IN) << 16;
header->biClrUsed |= (uint32_t)getc(IN) << 24;
header->biClrImportant = (uint32_t)getc(IN);
header->biClrImportant |= (uint32_t)getc(IN) << 8;
header->biClrImportant |= (uint32_t)getc(IN) << 16;
header->biClrImportant |= (uint32_t)getc(IN) << 24;
}
if(header->biSize >= 56U) {
header->biRedMask = (uint32_t)getc(IN);
header->biRedMask |= (uint32_t)getc(IN) << 8;
header->biRedMask |= (uint32_t)getc(IN) << 16;
header->biRedMask |= (uint32_t)getc(IN) << 24;
header->biGreenMask = (uint32_t)getc(IN);
header->biGreenMask |= (uint32_t)getc(IN) << 8;
header->biGreenMask |= (uint32_t)getc(IN) << 16;
header->biGreenMask |= (uint32_t)getc(IN) << 24;
header->biBlueMask = (uint32_t)getc(IN);
header->biBlueMask |= (uint32_t)getc(IN) << 8;
header->biBlueMask |= (uint32_t)getc(IN) << 16;
header->biBlueMask |= (uint32_t)getc(IN) << 24;
header->biAlphaMask = (uint32_t)getc(IN);
header->biAlphaMask |= (uint32_t)getc(IN) << 8;
header->biAlphaMask |= (uint32_t)getc(IN) << 16;
header->biAlphaMask |= (uint32_t)getc(IN) << 24;
}
if(header->biSize >= 108U) {
header->biColorSpaceType = (uint32_t)getc(IN);
header->biColorSpaceType |= (uint32_t)getc(IN) << 8;
header->biColorSpaceType |= (uint32_t)getc(IN) << 16;
header->biColorSpaceType |= (uint32_t)getc(IN) << 24;
if (fread(&(header->biColorSpaceEP), 1U, sizeof(header->biColorSpaceEP), IN) != sizeof(header->biColorSpaceEP)) {
fprintf(stderr,"Error, can't read BMP header\n");
return OPJ_FALSE;
}
header->biRedGamma = (uint32_t)getc(IN);
header->biRedGamma |= (uint32_t)getc(IN) << 8;
header->biRedGamma |= (uint32_t)getc(IN) << 16;
header->biRedGamma |= (uint32_t)getc(IN) << 24;
header->biGreenGamma = (uint32_t)getc(IN);
header->biGreenGamma |= (uint32_t)getc(IN) << 8;
header->biGreenGamma |= (uint32_t)getc(IN) << 16;
header->biGreenGamma |= (uint32_t)getc(IN) << 24;
header->biBlueGamma = (uint32_t)getc(IN);
header->biBlueGamma |= (uint32_t)getc(IN) << 8;
header->biBlueGamma |= (uint32_t)getc(IN) << 16;
header->biBlueGamma |= (uint32_t)getc(IN) << 24;
}
if(header->biSize >= 124U) {
header->biIntent = (uint32_t)getc(IN);
header->biIntent |= (uint32_t)getc(IN) << 8;
header->biIntent |= (uint32_t)getc(IN) << 16;
header->biIntent |= (uint32_t)getc(IN) << 24;
header->biIccProfileData = (uint32_t)getc(IN);
header->biIccProfileData |= (uint32_t)getc(IN) << 8;
header->biIccProfileData |= (uint32_t)getc(IN) << 16;
header->biIccProfileData |= (uint32_t)getc(IN) << 24;
header->biIccProfileSize = (uint32_t)getc(IN);
header->biIccProfileSize |= (uint32_t)getc(IN) << 8;
header->biIccProfileSize |= (uint32_t)getc(IN) << 16;
header->biIccProfileSize |= (uint32_t)getc(IN) << 24;
header->biReserved = (uint32_t)getc(IN);
header->biReserved |= (uint32_t)getc(IN) << 8;
header->biReserved |= (uint32_t)getc(IN) << 16;
header->biReserved |= (uint32_t)getc(IN) << 24;
}
return OPJ_TRUE;
}
static opj_bool bmp_read_raw_data(FILE* IN, uint8_t* pData, uint32_t stride, uint32_t width, uint32_t height)
{
OPJ_ARG_NOT_USED(width);
if ( fread(pData, sizeof(uint8_t), stride * height, IN) != (stride * height) )
{
fprintf(stderr, "\nError: fread return a number of element different from the expected.\n");
return OPJ_FALSE;
}
return OPJ_TRUE;
}
static opj_bool bmp_read_rle8_data(FILE* IN, uint8_t* pData, uint32_t stride, uint32_t width, uint32_t height)
{
uint32_t x, y;
uint8_t *pix;
const uint8_t *beyond;
beyond = pData + stride * height;
pix = pData;
x = y = 0U;
while (y < height)
{
int c = getc(IN);
if (c) {
int j;
uint8_t c1 = (uint8_t)getc(IN);
for (j = 0; (j < c) && (x < width) && ((size_t)pix < (size_t)beyond); j++, x++, pix++) {
*pix = c1;
}
}
else {
c = getc(IN);
if (c == 0x00) { /* EOL */
x = 0;
++y;
pix = pData + y * stride + x;
}
else if (c == 0x01) { /* EOP */
break;
}
else if (c == 0x02) { /* MOVE by dxdy */
c = getc(IN);
x += (uint32_t)c;
c = getc(IN);
y += (uint32_t)c;
pix = pData + y * stride + x;
}
else /* 03 .. 255 */
{
int j;
for (j = 0; (j < c) && (x < width) && ((size_t)pix < (size_t)beyond); j++, x++, pix++)
{
uint8_t c1 = (uint8_t)getc(IN);
*pix = c1;
}
if ((uint32_t)c & 1U) { /* skip padding byte */
getc(IN);
}
}
}
}/* while() */
return OPJ_TRUE;
}
static opj_bool bmp_read_rle4_data(FILE* IN, uint8_t* pData, uint32_t stride, uint32_t width, uint32_t height)
{
uint32_t x, y;
uint8_t *pix;
const uint8_t *beyond;
beyond = pData + stride * height;
pix = pData;
x = y = 0U;
while(y < height)
{
int c = getc(IN);
if(c == EOF) break;
if(c) {/* encoded mode */
int j;
uint8_t c1 = (uint8_t)getc(IN);
for (j = 0; (j < c) && (x < width) && ((size_t)pix < (size_t)beyond); j++, x++, pix++) {
*pix = (uint8_t)((j&1) ? (c1 & 0x0fU) : ((c1>>4)&0x0fU));
}
}
else { /* absolute mode */
c = getc(IN);
if(c == EOF) break;
if(c == 0x00) { /* EOL */
x = 0; y++; pix = pData + y * stride;
}
else if(c == 0x01) { /* EOP */
break;
}
else if(c == 0x02) { /* MOVE by dxdy */
c = getc(IN); x += (uint32_t)c;
c = getc(IN); y += (uint32_t)c;
pix = pData + y * stride + x;
}
else { /* 03 .. 255 : absolute mode */
int j;
uint8_t c1 = 0U;
for (j = 0; (j < c) && (x < width) && ((size_t)pix < (size_t)beyond); j++, x++, pix++) {
if((j&1) == 0) {
c1 = (uint8_t)getc(IN);
}
*pix = (uint8_t)((j&1) ? (c1 & 0x0fU) : ((c1>>4)&0x0fU));
}
if(((c&3) == 1) || ((c&3) == 2)) { /* skip padding byte */
getc(IN);
}
}
}
} /* while(y < height) */
return OPJ_TRUE;
}
opj_image_t* bmptoimage(const char *filename, opj_cparameters_t *parameters)
{
opj_image_cmptparm_t cmptparm[4]; /* maximum of 4 components */
uint8_t lut_R[256], lut_G[256], lut_B[256];
uint8_t const* pLUT[3];
opj_image_t * image = NULL;
FILE *IN;
OPJ_BITMAPFILEHEADER File_h;
OPJ_BITMAPINFOHEADER Info_h;
uint32_t i, palette_len, numcmpts = 1U;
opj_bool l_result = OPJ_FALSE;
uint8_t* pData = NULL;
uint32_t stride;
pLUT[0] = lut_R; pLUT[1] = lut_G; pLUT[2] = lut_B;
IN = fopen(filename, "rb");
if (!IN)
{
fprintf(stderr, "Failed to open %s for reading !!\n", filename);
return NULL;
}
if (!bmp_read_file_header(IN, &File_h)) {
fclose(IN);
return NULL;
}
if (!bmp_read_info_header(IN, &Info_h)) {
fclose(IN);
return NULL;
}
/* Load palette */
if (Info_h.biBitCount <= 8U)
{
memset(&lut_R[0], 0, sizeof(lut_R));
memset(&lut_G[0], 0, sizeof(lut_G));
memset(&lut_B[0], 0, sizeof(lut_B));
palette_len = Info_h.biClrUsed;
if((palette_len == 0U) && (Info_h.biBitCount <= 8U)) {
palette_len = (1U << Info_h.biBitCount);
}
if (palette_len > 256U) {
palette_len = 256U;
}
if (palette_len > 0U) {
uint8_t has_color = 0U;
for (i = 0U; i < palette_len; i++) {
lut_B[i] = (uint8_t)getc(IN);
lut_G[i] = (uint8_t)getc(IN);
lut_R[i] = (uint8_t)getc(IN);
(void)getc(IN); /* padding */
has_color |= (lut_B[i] ^ lut_G[i]) | (lut_G[i] ^ lut_R[i]);
}
if(has_color) {
numcmpts = 3U;
}
}
} else {
numcmpts = 3U;
if ((Info_h.biCompression == 3) && (Info_h.biAlphaMask != 0U)) {
numcmpts++;
}
}
stride = ((Info_h.biWidth * Info_h.biBitCount + 31U) / 32U) * 4U; /* rows are aligned on 32bits */
if (Info_h.biBitCount == 4 && Info_h.biCompression == 2) { /* RLE 4 gets decoded as 8 bits data for now... */
stride = ((Info_h.biWidth * 8U + 31U) / 32U) * 4U;
}
pData = (uint8_t *) calloc(1, stride * Info_h.biHeight * sizeof(uint8_t));
if (pData == NULL) {
fclose(IN);
return NULL;
}
/* Place the cursor at the beginning of the image information */
fseek(IN, 0, SEEK_SET);
fseek(IN, (long)File_h.bfOffBits, SEEK_SET);
switch (Info_h.biCompression) {
case 0:
case 3:
/* read raw data */
l_result = bmp_read_raw_data(IN, pData, stride, Info_h.biWidth, Info_h.biHeight);
break;
case 1:
/* read rle8 data */
l_result = bmp_read_rle8_data(IN, pData, stride, Info_h.biWidth, Info_h.biHeight);
break;
case 2:
/* read rle4 data */
l_result = bmp_read_rle4_data(IN, pData, stride, Info_h.biWidth, Info_h.biHeight);
break;
default:
fprintf(stderr, "Unsupported BMP compression\n");
l_result = OPJ_FALSE;
break;
}
if (!l_result) {
free(pData);
fclose(IN);
return NULL;
}
/* create the image */
memset(&cmptparm[0], 0, sizeof(cmptparm));
for(i = 0; i < 4U; i++)
{
cmptparm[i].prec = 8;
cmptparm[i].bpp = 8;
cmptparm[i].sgnd = 0;
cmptparm[i].dx = parameters->subsampling_dx;
cmptparm[i].dy = parameters->subsampling_dy;
cmptparm[i].w = Info_h.biWidth;
cmptparm[i].h = Info_h.biHeight;
}
image = opj_image_create(numcmpts, &cmptparm[0], (numcmpts == 1U) ? CLRSPC_GRAY : CLRSPC_SRGB);
if(!image) {
fclose(IN);
free(pData);
return NULL;
}
/* if (numcmpts == 4U) {
image->comps[3].alpha = 1;
} */
/* set image offset and reference grid */
image->x0 = (uint32_t)parameters->image_offset_x0;
image->y0 = (uint32_t)parameters->image_offset_y0;
image->x1 = image->x0 + (Info_h.biWidth - 1U) * (uint32_t)parameters->subsampling_dx + 1U;
image->y1 = image->y0 + (Info_h.biHeight - 1U) * (uint32_t)parameters->subsampling_dy + 1U;
/* Read the data */
if (Info_h.biBitCount == 24 && Info_h.biCompression == 0) { /*RGB */
bmp24toimage(pData, stride, image);
}
else if (Info_h.biBitCount == 8 && Info_h.biCompression == 0) { /* RGB 8bpp Indexed */
bmp8toimage(pData, stride, image, pLUT);
}
else if (Info_h.biBitCount == 8 && Info_h.biCompression == 1) { /*RLE8*/
bmp8toimage(pData, stride, image, pLUT);
}
else if (Info_h.biBitCount == 4 && Info_h.biCompression == 2) { /*RLE4*/
bmp8toimage(pData, stride, image, pLUT); /* RLE 4 gets decoded as 8 bits data for now */
}
else if (Info_h.biBitCount == 32 && Info_h.biCompression == 0) { /* RGBX */
bmpmask32toimage(pData, stride, image, 0x00FF0000U, 0x0000FF00U, 0x000000FFU, 0x00000000U);
}
else if (Info_h.biBitCount == 32 && Info_h.biCompression == 3) { /* bitmask */
bmpmask32toimage(pData, stride, image, Info_h.biRedMask, Info_h.biGreenMask, Info_h.biBlueMask, Info_h.biAlphaMask);
}
else if (Info_h.biBitCount == 16 && Info_h.biCompression == 0) { /* RGBX */
bmpmask16toimage(pData, stride, image, 0x7C00U, 0x03E0U, 0x001FU, 0x0000U);
}
else if (Info_h.biBitCount == 16 && Info_h.biCompression == 3) { /* bitmask */
if ((Info_h.biRedMask == 0U) && (Info_h.biGreenMask == 0U) && (Info_h.biBlueMask == 0U)) {
Info_h.biRedMask = 0xF800U;
Info_h.biGreenMask = 0x07E0U;
Info_h.biBlueMask = 0x001FU;
}
bmpmask16toimage(pData, stride, image, Info_h.biRedMask, Info_h.biGreenMask, Info_h.biBlueMask, Info_h.biAlphaMask);
}
else {
opj_image_destroy(image);
image = NULL;
fprintf(stderr, "Other system than 24 bits/pixels or 8 bits (no RLE coding) is not yet implemented [%d]\n", Info_h.biBitCount);
}
free(pData);
fclose(IN);
return image;
}
int imagetobmp(opj_image_t * image, const char *outfile) {
int w, h;
int i, pad;
FILE *fdest = NULL;
int adjustR, adjustG, adjustB;
if (image->comps[0].prec < 8) {
fprintf(stderr, "Unsupported number of components: %d\n", image->comps[0].prec);
return 1;
}
if (image->numcomps >= 3 && image->comps[0].dx == image->comps[1].dx
&& image->comps[1].dx == image->comps[2].dx
&& image->comps[0].dy == image->comps[1].dy
&& image->comps[1].dy == image->comps[2].dy
&& image->comps[0].prec == image->comps[1].prec
&& image->comps[1].prec == image->comps[2].prec) {
/* -->> -->> -->> -->>
24 bits color
<<-- <<-- <<-- <<-- */
fdest = fopen(outfile, "wb");
if (!fdest) {
fprintf(stderr, "ERROR -> failed to open %s for writing\n", outfile);
return 1;
}
w = (int)image->comps[0].w;
h = (int)image->comps[0].h;
fprintf(fdest, "BM");
/* FILE HEADER */
/* ------------- */
fprintf(fdest, "%c%c%c%c",
(uint8_t) (h * w * 3 + 3 * h * (w % 2) + 54) & 0xff,
(uint8_t) ((h * w * 3 + 3 * h * (w % 2) + 54) >> 8) & 0xff,
(uint8_t) ((h * w * 3 + 3 * h * (w % 2) + 54) >> 16) & 0xff,
(uint8_t) ((h * w * 3 + 3 * h * (w % 2) + 54) >> 24) & 0xff);
fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
fprintf(fdest, "%c%c%c%c", (54) & 0xff, ((54) >> 8) & 0xff,((54) >> 16) & 0xff, ((54) >> 24) & 0xff);
/* INFO HEADER */
/* ------------- */
fprintf(fdest, "%c%c%c%c", (40) & 0xff, ((40) >> 8) & 0xff, ((40) >> 16) & 0xff, ((40) >> 24) & 0xff);
fprintf(fdest, "%c%c%c%c", (uint8_t) ((w) & 0xff),
(uint8_t) ((w) >> 8) & 0xff,
(uint8_t) ((w) >> 16) & 0xff,
(uint8_t) ((w) >> 24) & 0xff);
fprintf(fdest, "%c%c%c%c", (uint8_t) ((h) & 0xff),
(uint8_t) ((h) >> 8) & 0xff,
(uint8_t) ((h) >> 16) & 0xff,
(uint8_t) ((h) >> 24) & 0xff);
fprintf(fdest, "%c%c", (1) & 0xff, ((1) >> 8) & 0xff);
fprintf(fdest, "%c%c", (24) & 0xff, ((24) >> 8) & 0xff);
fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
fprintf(fdest, "%c%c%c%c", (uint8_t) (3 * h * w + 3 * h * (w % 2)) & 0xff,
(uint8_t) ((h * w * 3 + 3 * h * (w % 2)) >> 8) & 0xff,
(uint8_t) ((h * w * 3 + 3 * h * (w % 2)) >> 16) & 0xff,
(uint8_t) ((h * w * 3 + 3 * h * (w % 2)) >> 24) & 0xff);
fprintf(fdest, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff, ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff);
fprintf(fdest, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff, ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff);
fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
if (image->comps[0].prec > 8) {
adjustR = (int)image->comps[0].prec - 8;
printf("BMP CONVERSION: Truncating component 0 from %d bits to 8 bits\n", image->comps[0].prec);
}
else
adjustR = 0;
if (image->comps[1].prec > 8) {
adjustG = (int)image->comps[1].prec - 8;
printf("BMP CONVERSION: Truncating component 1 from %d bits to 8 bits\n", image->comps[1].prec);
}
else
adjustG = 0;
if (image->comps[2].prec > 8) {
adjustB = (int)image->comps[2].prec - 8;
printf("BMP CONVERSION: Truncating component 2 from %d bits to 8 bits\n", image->comps[2].prec);
}
else
adjustB = 0;
for (i = 0; i < w * h; i++) {
uint8_t rc, gc, bc;
int r, g, b;
r = image->comps[0].data[w * h - ((i) / (w) + 1) * w + (i) % (w)];
r += (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0);
r = ((r >> adjustR)+((r >> (adjustR-1))%2));
if(r > 255) r = 255; else if(r < 0) r = 0;
rc = (uint8_t)r;
g = image->comps[1].data[w * h - ((i) / (w) + 1) * w + (i) % (w)];
g += (image->comps[1].sgnd ? 1 << (image->comps[1].prec - 1) : 0);
g = ((g >> adjustG)+((g >> (adjustG-1))%2));
if(g > 255) g = 255; else if(g < 0) g = 0;
gc = (uint8_t)g;
b = image->comps[2].data[w * h - ((i) / (w) + 1) * w + (i) % (w)];
b += (image->comps[2].sgnd ? 1 << (image->comps[2].prec - 1) : 0);
b = ((b >> adjustB)+((b >> (adjustB-1))%2));
if(b > 255) b = 255; else if(b < 0) b = 0;
bc = (uint8_t)b;
fprintf(fdest, "%c%c%c", bc, gc, rc);
if ((i + 1) % w == 0) {
for (pad = (3 * w) % 4 ? 4 - (3 * w) % 4 : 0; pad > 0; pad--) /* ADD */
fprintf(fdest, "%c", 0);
}
}
fclose(fdest);
} else { /* Gray-scale */
/* -->> -->> -->> -->>
8 bits non code (Gray scale)
<<-- <<-- <<-- <<-- */
fdest = fopen(outfile, "wb");
if (!fdest) {
fprintf(stderr, "ERROR -> failed to open %s for writing\n", outfile);
return 1;
}
w = (int)image->comps[0].w;
h = (int)image->comps[0].h;
fprintf(fdest, "BM");
/* FILE HEADER */
/* ------------- */
fprintf(fdest, "%c%c%c%c", (uint8_t) (h * w + 54 + 1024 + h * (w % 2)) & 0xff,
(uint8_t) ((h * w + 54 + 1024 + h * (w % 2)) >> 8) & 0xff,
(uint8_t) ((h * w + 54 + 1024 + h * (w % 2)) >> 16) & 0xff,
(uint8_t) ((h * w + 54 + 1024 + w * (w % 2)) >> 24) & 0xff);
fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
fprintf(fdest, "%c%c%c%c", (54 + 1024) & 0xff, ((54 + 1024) >> 8) & 0xff,
((54 + 1024) >> 16) & 0xff,
((54 + 1024) >> 24) & 0xff);
/* INFO HEADER */
/* ------------- */
fprintf(fdest, "%c%c%c%c", (40) & 0xff, ((40) >> 8) & 0xff, ((40) >> 16) & 0xff, ((40) >> 24) & 0xff);
fprintf(fdest, "%c%c%c%c", (uint8_t) ((w) & 0xff),
(uint8_t) ((w) >> 8) & 0xff,
(uint8_t) ((w) >> 16) & 0xff,
(uint8_t) ((w) >> 24) & 0xff);
fprintf(fdest, "%c%c%c%c", (uint8_t) ((h) & 0xff),
(uint8_t) ((h) >> 8) & 0xff,
(uint8_t) ((h) >> 16) & 0xff,
(uint8_t) ((h) >> 24) & 0xff);
fprintf(fdest, "%c%c", (1) & 0xff, ((1) >> 8) & 0xff);
fprintf(fdest, "%c%c", (8) & 0xff, ((8) >> 8) & 0xff);
fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
fprintf(fdest, "%c%c%c%c", (uint8_t) (h * w + h * (w % 2)) & 0xff,
(uint8_t) ((h * w + h * (w % 2)) >> 8) & 0xff,
(uint8_t) ((h * w + h * (w % 2)) >> 16) & 0xff,
(uint8_t) ((h * w + h * (w % 2)) >> 24) & 0xff);
fprintf(fdest, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff, ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff);
fprintf(fdest, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff, ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff);
fprintf(fdest, "%c%c%c%c", (256) & 0xff, ((256) >> 8) & 0xff, ((256) >> 16) & 0xff, ((256) >> 24) & 0xff);
fprintf(fdest, "%c%c%c%c", (256) & 0xff, ((256) >> 8) & 0xff, ((256) >> 16) & 0xff, ((256) >> 24) & 0xff);
if (image->comps[0].prec > 8) {
adjustR = (int)image->comps[0].prec - 8;
printf("BMP CONVERSION: Truncating component 0 from %d bits to 8 bits\n", image->comps[0].prec);
}else
adjustR = 0;
for (i = 0; i < 256; i++) {
fprintf(fdest, "%c%c%c%c", i, i, i, 0);
}
for (i = 0; i < w * h; i++) {
int r;
r = image->comps[0].data[w * h - ((i) / (w) + 1) * w + (i) % (w)];
r += (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0);
r = ((r >> adjustR)+((r >> (adjustR-1))%2));
if(r > 255) r = 255; else if(r < 0) r = 0;
fprintf(fdest, "%c", (uint8_t)r);
if ((i + 1) % w == 0) {
for (pad = w % 4 ? 4 - w % 4 : 0; pad > 0; pad--) /* ADD */
fprintf(fdest, "%c", 0);
}
}
fclose(fdest);
}
return 0;
}

View File

@@ -0,0 +1,496 @@
/*
* The copyright in this software is being made available under the 2-clauses
* BSD License, included below. This software may be subject to other third
* party and contributor rights, including patent rights, and no such rights
* are granted under this license.
*
* Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2014, Professor Benoit Macq
* Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2007, Francois-Olivier Devaux
* Copyright (c) 2003-2014, Antonin Descampe
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* Copyright (c) 2006-2007, Parvatha Elangovan
* Copyright (c) 2015, Matthieu Darbois
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include "opj_config.h"
#ifndef HAVE_LIBPNG
# error HAVE_LIBPNG_NOT_DEFINED
#endif /* HAVE_LIBPNG */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <zlib.h>
#include <png.h>
#include "openjpeg.h"
#include "convert.h"
#define PNG_MAGIC "\x89PNG\x0d\x0a\x1a\x0a"
#define MAGIC_SIZE 8
/* PNG allows bits per sample: 1, 2, 4, 8, 16 */
static void convert_16u32s_C1R(const png_byte* pSrc, png_int_32* pDst, size_t length)
{
size_t i;
for (i = 0; i < length; i++) {
png_int_32 val0 = *pSrc++;
png_int_32 val1 = *pSrc++;
pDst[i] = val0 << 8 | val1;
}
}
opj_image_t *pngtoimage(const char *read_idf, opj_cparameters_t * params)
{
png_structp png = NULL;
png_infop info = NULL;
double gamma;
int bit_depth, interlace_type,compression_type, filter_type;
png_uint_32 i;
png_uint_32 width, height = 0U;
int color_type;
FILE *reader = NULL;
png_byte** rows = NULL;
png_int_32* row32s = NULL;
/* j2k: */
opj_image_t *image = NULL;
opj_image_cmptparm_t cmptparm[4];
png_uint_32 nr_comp;
png_byte sigbuf[8];
convert_XXx32s_C1R cvtXXTo32s = NULL;
convert_32s_CXPX cvtCxToPx = NULL;
png_int_32* planes[4];
if((reader = fopen(read_idf, "rb")) == NULL)
{
fprintf(stderr,"pngtoimage: can not open %s\n",read_idf);
return NULL;
}
if(fread(sigbuf, 1, MAGIC_SIZE, reader) != MAGIC_SIZE
|| memcmp(sigbuf, PNG_MAGIC, MAGIC_SIZE) != 0)
{
fprintf(stderr,"pngtoimage: %s is no valid PNG file\n",read_idf);
goto fin;
}
if((png = png_create_read_struct(PNG_LIBPNG_VER_STRING,
NULL, NULL, NULL)) == NULL)
goto fin;
if((info = png_create_info_struct(png)) == NULL)
goto fin;
if(setjmp(png_jmpbuf(png)))
goto fin;
png_init_io(png, reader);
png_set_sig_bytes(png, MAGIC_SIZE);
png_read_info(png, info);
if(png_get_IHDR(png, info, &width, &height,
&bit_depth, &color_type, &interlace_type,
&compression_type, &filter_type) == 0)
goto fin;
/* png_set_expand():
* expand paletted images to RGB, expand grayscale images of
* less than 8-bit depth to 8-bit depth, and expand tRNS chunks
* to alpha channels.
*/
if(color_type == PNG_COLOR_TYPE_PALETTE) {
png_set_expand(png);
}
if(png_get_valid(png, info, PNG_INFO_tRNS)) {
png_set_expand(png);
}
/* We might wan't to expand background */
/*
if(png_get_valid(png, info, PNG_INFO_bKGD)) {
png_color_16p bgnd;
png_get_bKGD(png, info, &bgnd);
png_set_background(png, bgnd, PNG_BACKGROUND_GAMMA_FILE, 1, 1.0);
}
*/
if( !png_get_gAMA(png, info, &gamma))
gamma = 1.0;
/* we're not displaying but converting, screen gamma == 1.0 */
png_set_gamma(png, 1.0, gamma);
png_read_update_info(png, info);
color_type = png_get_color_type(png, info);
switch (color_type) {
case PNG_COLOR_TYPE_GRAY:
nr_comp = 1;
break;
case PNG_COLOR_TYPE_GRAY_ALPHA:
nr_comp = 2;
break;
case PNG_COLOR_TYPE_RGB:
nr_comp = 3;
break;
case PNG_COLOR_TYPE_RGB_ALPHA:
nr_comp = 4;
break;
default:
fprintf(stderr,"pngtoimage: colortype %d is not supported\n", color_type);
goto fin;
}
cvtCxToPx = convert_32s_CXPX_LUT[nr_comp];
bit_depth = png_get_bit_depth(png, info);
switch (bit_depth) {
case 1:
case 2:
case 4:
case 8:
cvtXXTo32s = convert_XXu32s_C1R_LUT[bit_depth];
break;
case 16: /* 16 bpp is specific to PNG */
cvtXXTo32s = convert_16u32s_C1R;
break;
default:
fprintf(stderr,"pngtoimage: bit depth %d is not supported\n", bit_depth);
goto fin;
}
rows = (png_byte**)calloc(height+1, sizeof(png_byte*));
for(i = 0; i < height; ++i)
rows[i] = (png_byte*)malloc(png_get_rowbytes(png,info));
png_read_image(png, rows);
/* Create image */
memset(cmptparm, 0, sizeof(cmptparm));
for(i = 0; i < nr_comp; ++i)
{
cmptparm[i].prec = (png_uint_32)bit_depth;
/* bits_per_pixel: 8 or 16 */
cmptparm[i].bpp = (png_uint_32)bit_depth;
cmptparm[i].sgnd = 0;
cmptparm[i].dx = (png_uint_32)params->subsampling_dx;
cmptparm[i].dy = (png_uint_32)params->subsampling_dy;
cmptparm[i].w = (png_uint_32)width;
cmptparm[i].h = (png_uint_32)height;
}
image = opj_image_create(nr_comp, &cmptparm[0], (nr_comp > 2U) ? CLRSPC_SRGB : CLRSPC_GRAY);
if(image == NULL) goto fin;
image->x0 = (png_uint_32)params->image_offset_x0;
image->y0 = (png_uint_32)params->image_offset_y0;
image->x1 = (png_uint_32)(image->x0 + (width - 1) * (png_uint_32)params->subsampling_dx + 1 + image->x0);
image->y1 = (png_uint_32)(image->y0 + (height - 1) * (png_uint_32)params->subsampling_dy + 1 + image->y0);
row32s = (png_int_32 *)malloc((size_t)width * nr_comp * sizeof(png_int_32));
if(row32s == NULL) goto fin;
/* Set alpha channel */
/* image->comps[nr_comp-1U].alpha = 1U - (nr_comp & 1U); */
for(i = 0; i < nr_comp; i++)
{
planes[i] = image->comps[i].data;
}
for(i = 0; i < height; ++i)
{
cvtXXTo32s(rows[i], row32s, (size_t)width * nr_comp);
cvtCxToPx(row32s, planes, width);
planes[0] += width;
planes[1] += width;
planes[2] += width;
planes[3] += width;
}
fin:
if(rows)
{
for(i = 0; i < height; ++i)
free(rows[i]);
free(rows);
}
if (row32s) {
free(row32s);
}
if(png)
png_destroy_read_struct(&png, &info, NULL);
fclose(reader);
return image;
}/* pngtoimage() */
static void convert_32s16u_C1R(const png_int_32* pSrc, png_byte* pDst, size_t length)
{
size_t i;
for (i = 0; i < length; i++) {
png_uint_32 val = (png_uint_32)pSrc[i];
*pDst++ = (png_byte)(val >> 8);
*pDst++ = (png_byte)val;
}
}
int imagetopng(opj_image_t * image, const char *write_idf)
{
FILE * volatile writer = NULL;
png_structp png = NULL;
png_infop info = NULL;
png_bytep volatile row_buf = NULL;
int nr_comp, color_type;
volatile int prec;
png_color_8 sig_bit;
png_int_32 const* planes[4];
int i;
png_int_32* volatile buffer32s = NULL;
volatile int fails = 1;
memset(&sig_bit, 0, sizeof(sig_bit));
prec = (int)image->comps[0].prec;
planes[0] = image->comps[0].data;
nr_comp = (int)image->numcomps;
if (nr_comp > 4) {
nr_comp = 4;
}
for (i = 1; i < nr_comp; ++i) {
if (image->comps[0].dx != image->comps[i].dx) {
break;
}
if (image->comps[0].dy != image->comps[i].dy) {
break;
}
if (image->comps[0].prec != image->comps[i].prec) {
break;
}
if (image->comps[0].sgnd != image->comps[i].sgnd) {
break;
}
planes[i] = image->comps[i].data;
}
if (i != nr_comp) {
fprintf(stderr,"imagetopng: All components shall have the same subsampling, same bit depth, same sign.\n");
fprintf(stderr,"\tAborting\n");
return 1;
}
for (i = 0; i < nr_comp; ++i) {
clip_component(&(image->comps[i]), image->comps[0].prec);
}
if(prec > 8 && prec < 16)
{
for (i = 0; i < nr_comp; ++i) {
scale_component(&(image->comps[i]), 16);
}
prec = 16;
}
else if(prec < 8 && nr_comp > 1)/* GRAY_ALPHA, RGB, RGB_ALPHA */
{
for (i = 0; i < nr_comp; ++i) {
scale_component(&(image->comps[i]), 8);
}
prec = 8;
} else if((prec > 1) && (prec < 8) && ((prec == 6) || ((prec & 1)==1))) { /* GRAY with non native precision */
if ((prec == 5) || (prec == 6)) {
prec = 8;
} else {
prec++;
}
for (i = 0; i < nr_comp; ++i) {
scale_component(&(image->comps[i]), (png_uint_32)prec);
}
}
if(prec != 1 && prec != 2 && prec != 4 && prec != 8 && prec != 16)
{
fprintf(stderr,"imagetopng: can not create %s\n\twrong bit_depth %d\n", write_idf, prec);
return fails;
}
writer = fopen(write_idf, "wb");
if(writer == NULL) return fails;
/* Create and initialize the png_struct with the desired error handler
* functions. If you want to use the default stderr and longjump method,
* you can supply NULL for the last three parameters. We also check that
* the library version is compatible with the one used at compile time,
* in case we are using dynamically linked libraries. REQUIRED.
*/
png = png_create_write_struct(PNG_LIBPNG_VER_STRING,
NULL, NULL, NULL);
/*png_voidp user_error_ptr, user_error_fn, user_warning_fn); */
if(png == NULL) goto fin;
/* Allocate/initialize the image information data. REQUIRED
*/
info = png_create_info_struct(png);
if(info == NULL) goto fin;
/* Set error handling. REQUIRED if you are not supplying your own
* error handling functions in the png_create_write_struct() call.
*/
if(setjmp(png_jmpbuf(png))) goto fin;
/* I/O initialization functions is REQUIRED
*/
png_init_io(png, writer);
/* Set the image information here. Width and height are up to 2^31,
* bit_depth is one of 1, 2, 4, 8, or 16, but valid values also depend on
* the color_type selected. color_type is one of PNG_COLOR_TYPE_GRAY,
* PNG_COLOR_TYPE_GRAY_ALPHA, PNG_COLOR_TYPE_PALETTE, PNG_COLOR_TYPE_RGB,
* or PNG_COLOR_TYPE_RGB_ALPHA. interlace is either PNG_INTERLACE_NONE or
* PNG_INTERLACE_ADAM7, and the compression_type and filter_type MUST
* currently be PNG_COMPRESSION_TYPE_BASE and PNG_FILTER_TYPE_BASE.
* REQUIRED
*
* ERRORS:
*
* color_type == PNG_COLOR_TYPE_PALETTE && bit_depth > 8
* color_type == PNG_COLOR_TYPE_RGB && bit_depth < 8
* color_type == PNG_COLOR_TYPE_GRAY_ALPHA && bit_depth < 8
* color_type == PNG_COLOR_TYPE_RGB_ALPHA) && bit_depth < 8
*
*/
png_set_compression_level(png, Z_BEST_COMPRESSION);
if(nr_comp >= 3) /* RGB(A) */
{
color_type = PNG_COLOR_TYPE_RGB;
sig_bit.red = sig_bit.green = sig_bit.blue = (png_byte)prec;
}
else /* GRAY(A) */
{
color_type = PNG_COLOR_TYPE_GRAY;
sig_bit.gray = (png_byte)prec;
}
if((nr_comp & 1) == 0) /* ALPHA */
{
color_type |= PNG_COLOR_MASK_ALPHA;
sig_bit.alpha = (png_byte)prec;
}
png_set_IHDR(png, info, image->comps[0].w, image->comps[0].h, prec, color_type,
PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
png_set_sBIT(png, info, &sig_bit);
/* png_set_gamma(png, 2.2, 1./2.2); */
/* png_set_sRGB(png, info, PNG_sRGB_INTENT_PERCEPTUAL); */
png_write_info(png, info);
/* setup conversion */
{
size_t rowStride;
png_size_t png_row_size;
png_row_size = png_get_rowbytes(png, info);
rowStride = ((size_t)image->comps[0].w * (size_t)nr_comp * (size_t)prec + 7U) / 8U;
if (rowStride != (size_t)png_row_size) {
fprintf(stderr, "Invalid PNG row size\n");
goto fin;
}
row_buf = (png_bytep)malloc(png_row_size);
if (row_buf == NULL) {
fprintf(stderr, "Can't allocate memory for PNG row\n");
goto fin;
}
buffer32s = (png_int_32*)malloc((size_t)image->comps[0].w * (size_t)nr_comp * sizeof(png_int_32));
if (buffer32s == NULL) {
fprintf(stderr, "Can't allocate memory for interleaved 32s row\n");
goto fin;
}
}
/* convert */
{
size_t width= image->comps[0].w;
int y;
convert_32s_PXCX cvtPxToCx = convert_32s_PXCX_LUT[nr_comp];
convert_32sXXx_C1R cvt32sToPack = NULL;
png_int_32 adjust = image->comps[0].sgnd ? 1 << (prec - 1) : 0;
png_bytep row_buf_cpy = row_buf;
png_int_32* buffer32s_cpy = buffer32s;
switch (prec) {
case 1:
case 2:
case 4:
case 8:
cvt32sToPack = convert_32sXXu_C1R_LUT[prec];
break;
case 16:
cvt32sToPack = convert_32s16u_C1R;
break;
default:
/* never here */
break;
}
for(y = 0; y < image->comps[0].h; ++y)
{
cvtPxToCx(planes, buffer32s_cpy, width, adjust);
cvt32sToPack(buffer32s_cpy, row_buf_cpy, width * (size_t)nr_comp);
png_write_row(png, row_buf_cpy);
planes[0] += width;
planes[1] += width;
planes[2] += width;
planes[3] += width;
}
}
png_write_end(png, info);
fails = 0;
fin:
if(png) {
png_destroy_write_struct(&png, &info);
}
if(row_buf) {
free(row_buf);
}
if(buffer32s) {
free(buffer32s);
}
fclose(writer);
if(fails) (void)remove(write_idf); /* ignore return value */
return fails;
}/* imagetopng() */

View File

@@ -0,0 +1,633 @@
/*
* The copyright in this software is being made available under the 2-clauses
* BSD License, included below. This software may be subject to other third
* party and contributor rights, including patent rights, and no such rights
* are granted under this license.
*
* Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2002-2014, Professor Benoit Macq
* Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2007, Francois-Olivier Devaux
* Copyright (c) 2003-2014, Antonin Descampe
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* Copyright (c) 2006-2007, Parvatha Elangovan
* Copyright (c) 2015, Matthieu Darbois
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include "opj_config.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#ifndef HAVE_LIBTIFF
# error HAVE_LIBTIFF_NOT_DEFINED
#endif /* HAVE_LIBTIFF */
#include <tiffio.h>
#include "openjpeg.h"
#include "convert.h"
/* -->> -->> -->> -->>
TIFF IMAGE FORMAT
<<-- <<-- <<-- <<-- */
static void tif_32sto10u(const int32* pSrc, uint8* pDst, size_t length)
{
size_t i;
for (i = 0; i < (length & ~(size_t)3U); i+=4U) {
uint32 src0 = (uint32)pSrc[i+0];
uint32 src1 = (uint32)pSrc[i+1];
uint32 src2 = (uint32)pSrc[i+2];
uint32 src3 = (uint32)pSrc[i+3];
*pDst++ = (uint8)(src0 >> 2);
*pDst++ = (uint8)(((src0 & 0x3U) << 6) | (src1 >> 4));
*pDst++ = (uint8)(((src1 & 0xFU) << 4) | (src2 >> 6));
*pDst++ = (uint8)(((src2 & 0x3FU) << 2) | (src3 >> 8));
*pDst++ = (uint8)(src3);
}
if (length & 3U) {
uint32 src0 = (uint32)pSrc[i+0];
uint32 src1 = 0U;
uint32 src2 = 0U;
length = length & 3U;
if (length > 1U) {
src1 = (uint32)pSrc[i+1];
if (length > 2U) {
src2 = (uint32)pSrc[i+2];
}
}
*pDst++ = (uint8)(src0 >> 2);
*pDst++ = (uint8)(((src0 & 0x3U) << 6) | (src1 >> 4));
if (length > 1U) {
*pDst++ = (uint8)(((src1 & 0xFU) << 4) | (src2 >> 6));
if (length > 2U) {
*pDst++ = (uint8)(((src2 & 0x3FU) << 2));
}
}
}
}
static void tif_32sto12u(const int32* pSrc, uint8* pDst, size_t length)
{
size_t i;
for (i = 0; i < (length & ~(size_t)1U); i+=2U) {
uint32 src0 = (uint32)pSrc[i+0];
uint32 src1 = (uint32)pSrc[i+1];
*pDst++ = (uint8)(src0 >> 4);
*pDst++ = (uint8)(((src0 & 0xFU) << 4) | (src1 >> 8));
*pDst++ = (uint8)(src1);
}
if (length & 1U) {
uint32 src0 = (uint32)pSrc[i+0];
*pDst++ = (uint8)(src0 >> 4);
*pDst++ = (uint8)(((src0 & 0xFU) << 4));
}
}
static void tif_32sto14u(const int32* pSrc, uint8* pDst, size_t length)
{
size_t i;
for (i = 0; i < (length & ~(size_t)3U); i+=4U) {
uint32 src0 = (uint32)pSrc[i+0];
uint32 src1 = (uint32)pSrc[i+1];
uint32 src2 = (uint32)pSrc[i+2];
uint32 src3 = (uint32)pSrc[i+3];
*pDst++ = (uint8)(src0 >> 6);
*pDst++ = (uint8)(((src0 & 0x3FU) << 2) | (src1 >> 12));
*pDst++ = (uint8)(src1 >> 4);
*pDst++ = (uint8)(((src1 & 0xFU) << 4) | (src2 >> 10));
*pDst++ = (uint8)(src2 >> 2);
*pDst++ = (uint8)(((src2 & 0x3U) << 6) | (src3 >> 8));
*pDst++ = (uint8)(src3);
}
if (length & 3U) {
uint32 src0 = (uint32)pSrc[i+0];
uint32 src1 = 0U;
uint32 src2 = 0U;
length = length & 3U;
if (length > 1U) {
src1 = (uint32)pSrc[i+1];
if (length > 2U) {
src2 = (uint32)pSrc[i+2];
}
}
*pDst++ = (uint8)(src0 >> 6);
*pDst++ = (uint8)(((src0 & 0x3FU) << 2) | (src1 >> 12));
if (length > 1U) {
*pDst++ = (uint8)(src1 >> 4);
*pDst++ = (uint8)(((src1 & 0xFU) << 4) | (src2 >> 10));
if (length > 2U) {
*pDst++ = (uint8)(src2 >> 2);
*pDst++ = (uint8)(((src2 & 0x3U) << 6));
}
}
}
}
static void tif_32sto16u(const int32* pSrc, uint16* pDst, size_t length)
{
size_t i;
for (i = 0; i < length; ++i) {
pDst[i] = (uint16)pSrc[i];
}
}
int imagetotif(opj_image_t * image, const char *outfile)
{
int width, height;
int bps,adjust, sgnd;
int tiPhoto;
TIFF *tif;
tdata_t buf;
tsize_t strip_size;
int32 i, numcomps;
size_t rowStride;
int32* buffer32s = NULL;
int32 const* planes[4];
convert_32s_PXCX cvtPxToCx = NULL;
convert_32sXXx_C1R cvt32sToTif = NULL;
bps = image->comps[0].prec;
planes[0] = image->comps[0].data;
numcomps = image->numcomps;
if (numcomps > 2) {
tiPhoto = PHOTOMETRIC_RGB;
if (numcomps > 4) {
numcomps = 4;
}
} else {
tiPhoto = PHOTOMETRIC_MINISBLACK;
}
for (i = 1; i < numcomps; ++i) {
if (image->comps[0].dx != image->comps[i].dx) {
break;
}
if (image->comps[0].dy != image->comps[i].dy) {
break;
}
if (image->comps[0].prec != image->comps[i].prec) {
break;
}
if (image->comps[0].sgnd != image->comps[i].sgnd) {
break;
}
planes[i] = image->comps[i].data;
}
if (i != numcomps) {
fprintf(stderr,"imagetotif: All components shall have the same subsampling, same bit depth.\n");
fprintf(stderr,"\tAborting\n");
return 1;
}
if((bps > 16) || ((bps != 1) && (bps & 1))) bps = 0;
if(bps == 0)
{
fprintf(stderr,"imagetotif: Bits=%d, Only 1, 2, 4, 6, 8, 10, 12, 14 and 16 bits implemented\n",bps);
fprintf(stderr,"\tAborting\n");
return 1;
}
tif = TIFFOpen(outfile, "wb");
if (!tif)
{
fprintf(stderr, "imagetotif:failed to open %s for writing\n", outfile);
return 1;
}
for (i = 0; i < numcomps; ++i) {
clip_component(&(image->comps[i]), image->comps[0].prec);
}
cvtPxToCx = convert_32s_PXCX_LUT[numcomps];
switch (bps) {
case 1:
case 2:
case 4:
case 6:
case 8:
cvt32sToTif = convert_32sXXu_C1R_LUT[bps];
break;
case 10:
cvt32sToTif = tif_32sto10u;
break;
case 12:
cvt32sToTif = tif_32sto12u;
break;
case 14:
cvt32sToTif = tif_32sto14u;
break;
case 16:
cvt32sToTif = (convert_32sXXx_C1R)tif_32sto16u;
break;
default:
/* never here */
break;
}
sgnd = (int)image->comps[0].sgnd;
adjust = sgnd ? 1 << (image->comps[0].prec - 1) : 0;
width = (int)image->comps[0].w;
height = (int)image->comps[0].h;
TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, width);
TIFFSetField(tif, TIFFTAG_IMAGELENGTH, height);
TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, numcomps);
TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, bps);
TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, tiPhoto);
TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, 1);
strip_size = TIFFStripSize(tif);
rowStride = ((size_t)width * numcomps * (size_t)bps + 7U) / 8U;
if (rowStride != (size_t)strip_size) {
fprintf(stderr, "Invalid TIFF strip size\n");
TIFFClose(tif);
return 1;
}
buf = _TIFFmalloc(strip_size);
if (buf == NULL) {
TIFFClose(tif);
return 1;
}
buffer32s = (int32 *)malloc((size_t)width * numcomps * sizeof(int32));
if (buffer32s == NULL) {
_TIFFfree(buf);
TIFFClose(tif);
return 1;
}
for (i = 0; i < image->comps[0].h; ++i) {
cvtPxToCx(planes, buffer32s, (size_t)width, adjust);
cvt32sToTif(buffer32s, (uint8 *)buf, (size_t)width * numcomps);
(void)TIFFWriteEncodedStrip(tif, i, (void*)buf, strip_size);
planes[0] += width;
planes[1] += width;
planes[2] += width;
planes[3] += width;
}
_TIFFfree((void*)buf);
TIFFClose(tif);
free(buffer32s);
return 0;
}/* imagetotif() */
static void tif_10uto32s(const uint8* pSrc, int32* pDst, size_t length)
{
size_t i;
for (i = 0; i < (length & ~(size_t)3U); i+=4U) {
uint32 val0 = *pSrc++;
uint32 val1 = *pSrc++;
uint32 val2 = *pSrc++;
uint32 val3 = *pSrc++;
uint32 val4 = *pSrc++;
pDst[i+0] = (int32)((val0 << 2) | (val1 >> 6));
pDst[i+1] = (int32)(((val1 & 0x3FU) << 4) | (val2 >> 4));
pDst[i+2] = (int32)(((val2 & 0xFU) << 6) | (val3 >> 2));
pDst[i+3] = (int32)(((val3 & 0x3U) << 8) | val4);
}
if (length & 3U) {
uint32 val0 = *pSrc++;
uint32 val1 = *pSrc++;
length = length & 3U;
pDst[i+0] = (int32)((val0 << 2) | (val1 >> 6));
if (length > 1U) {
uint32 val2 = *pSrc++;
pDst[i+1] = (int32)(((val1 & 0x3FU) << 4) | (val2 >> 4));
if (length > 2U) {
uint32 val3 = *pSrc++;
pDst[i+2] = (int32)(((val2 & 0xFU) << 6) | (val3 >> 2));
}
}
}
}
static void tif_12uto32s(const uint8* pSrc, int32* pDst, size_t length)
{
size_t i;
for (i = 0; i < (length & ~(size_t)1U); i+=2U) {
uint32 val0 = *pSrc++;
uint32 val1 = *pSrc++;
uint32 val2 = *pSrc++;
pDst[i+0] = (int32)((val0 << 4) | (val1 >> 4));
pDst[i+1] = (int32)(((val1 & 0xFU) << 8) | val2);
}
if (length & 1U) {
uint32 val0 = *pSrc++;
uint32 val1 = *pSrc++;
pDst[i+0] = (int32)((val0 << 4) | (val1 >> 4));
}
}
static void tif_14uto32s(const uint8* pSrc, int32* pDst, size_t length)
{
size_t i;
for (i = 0; i < (length & ~(size_t)3U); i+=4U) {
uint32 val0 = *pSrc++;
uint32 val1 = *pSrc++;
uint32 val2 = *pSrc++;
uint32 val3 = *pSrc++;
uint32 val4 = *pSrc++;
uint32 val5 = *pSrc++;
uint32 val6 = *pSrc++;
pDst[i+0] = (int32)((val0 << 6) | (val1 >> 2));
pDst[i+1] = (int32)(((val1 & 0x3U) << 12) | (val2 << 4) | (val3 >> 4));
pDst[i+2] = (int32)(((val3 & 0xFU) << 10) | (val4 << 2) | (val5 >> 6));
pDst[i+3] = (int32)(((val5 & 0x3FU) << 8) | val6);
}
if (length & 3U) {
uint32 val0 = *pSrc++;
uint32 val1 = *pSrc++;
length = length & 3U;
pDst[i+0] = (int32)((val0 << 6) | (val1 >> 2));
if (length > 1U) {
uint32 val2 = *pSrc++;
uint32 val3 = *pSrc++;
pDst[i+1] = (int32)(((val1 & 0x3U) << 12) | (val2 << 4) | (val3 >> 4));
if (length > 2U) {
uint32 val4 = *pSrc++;
uint32 val5 = *pSrc++;
pDst[i+2] = (int32)(((val3 & 0xFU) << 10) | (val4 << 2) | (val5 >> 6));
}
}
}
}
/* seems that libtiff decodes this to machine endianness */
static void tif_16uto32s(const uint16* pSrc, int32* pDst, size_t length)
{
size_t i;
for (i = 0; i < length; i++) {
pDst[i] = pSrc[i];
}
}
/*
* libtiff/tif_getimage.c : 1,2,4,8,16 bitspersample accepted
* CINEMA : 12 bit precision
*/
opj_image_t* tiftoimage(const char *filename, opj_cparameters_t *parameters)
{
int subsampling_dx = parameters->subsampling_dx;
int subsampling_dy = parameters->subsampling_dy;
TIFF *tif;
tdata_t buf;
tstrip_t strip;
tsize_t strip_size;
int j, currentPlane, numcomps = 0, w, h;
OPJ_COLOR_SPACE color_space = CLRSPC_UNKNOWN;
opj_image_cmptparm_t cmptparm[4]; /* RGBA */
opj_image_t *image = NULL;
int has_alpha = 0;
unsigned short tiBps, tiPhoto, tiSf, tiSpp, tiPC;
unsigned int tiWidth, tiHeight;
opj_bool is_cinema = (parameters->cp_cinema != OFF) ? OPJ_TRUE : OPJ_FALSE;
convert_XXx32s_C1R cvtTifTo32s = NULL;
convert_32s_CXPX cvtCxToPx = NULL;
int32* buffer32s = NULL;
int32* planes[4];
size_t rowStride;
tif = TIFFOpen(filename, "r");
if(!tif)
{
fprintf(stderr, "tiftoimage:Failed to open %s for reading\n", filename);
return 0;
}
tiBps = tiPhoto = tiSf = tiSpp = tiPC = 0;
tiWidth = tiHeight = 0;
TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &tiWidth);
TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &tiHeight);
TIFFGetField(tif, TIFFTAG_BITSPERSAMPLE, &tiBps);
TIFFGetField(tif, TIFFTAG_SAMPLEFORMAT, &tiSf);
TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &tiSpp);
TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &tiPhoto);
TIFFGetField(tif, TIFFTAG_PLANARCONFIG, &tiPC);
w= (int)tiWidth;
h= (int)tiHeight;
if((tiBps > 16U) || ((tiBps != 1U) && (tiBps & 1U))) {
fprintf(stderr,"tiftoimage: Bits=%d, Only 1, 2, 4, 6, 8, 10, 12, 14 and 16 bits implemented\n",tiBps);
fprintf(stderr,"\tAborting\n");
TIFFClose(tif);
return NULL;
}
if(tiPhoto != PHOTOMETRIC_MINISBLACK && tiPhoto != PHOTOMETRIC_RGB) {
fprintf(stderr,"tiftoimage: Bad color format %d.\n\tOnly RGB(A) and GRAY(A) has been implemented\n",(int) tiPhoto);
fprintf(stderr,"\tAborting\n");
TIFFClose(tif);
return NULL;
}
switch (tiBps) {
case 1:
case 2:
case 4:
case 6:
case 8:
cvtTifTo32s = convert_XXu32s_C1R_LUT[tiBps];
break;
/* others are specific to TIFF */
case 10:
cvtTifTo32s = tif_10uto32s;
break;
case 12:
cvtTifTo32s = tif_12uto32s;
break;
case 14:
cvtTifTo32s = tif_14uto32s;
break;
case 16:
cvtTifTo32s = (convert_XXx32s_C1R)tif_16uto32s;
break;
default:
/* never here */
break;
}
{/* From: tiff-4.0.x/libtiff/tif_getimage.c : */
uint16* sampleinfo;
uint16 extrasamples;
TIFFGetFieldDefaulted(tif, TIFFTAG_EXTRASAMPLES,
&extrasamples, &sampleinfo);
if(extrasamples >= 1)
{
switch(sampleinfo[0])
{
case EXTRASAMPLE_UNSPECIFIED:
/* Workaround for some images without correct info about alpha channel
*/
if(tiSpp > 3)
has_alpha = 1;
break;
case EXTRASAMPLE_ASSOCALPHA: /* data pre-multiplied */
case EXTRASAMPLE_UNASSALPHA: /* data not pre-multiplied */
has_alpha = 1;
break;
}
}
else /* extrasamples == 0 */
if(tiSpp == 4 || tiSpp == 2) has_alpha = 1;
}
/* initialize image components */
memset(&cmptparm[0], 0, 4 * sizeof(opj_image_cmptparm_t));
if ((tiPhoto == PHOTOMETRIC_RGB) && (is_cinema) && (tiBps != 12U)) {
fprintf(stdout,"WARNING:\n"
"Input image bitdepth is %d bits\n"
"TIF conversion has automatically rescaled to 12-bits\n"
"to comply with cinema profiles.\n",
tiBps);
} else {
is_cinema = 0U;
}
if(tiPhoto == PHOTOMETRIC_RGB) /* RGB(A) */
{
numcomps = 3 + has_alpha;
color_space = CLRSPC_SRGB;
}
else if (tiPhoto == PHOTOMETRIC_MINISBLACK) /* GRAY(A) */
{
numcomps = 1 + has_alpha;
color_space = CLRSPC_GRAY;
}
cvtCxToPx = convert_32s_CXPX_LUT[numcomps];
if (tiPC == PLANARCONFIG_SEPARATE) {
cvtCxToPx = convert_32s_CXPX_LUT[1]; /* override */
tiSpp = 1U; /* consider only one sample per plane */
}
for(j = 0; j < numcomps; j++)
{
cmptparm[j].prec = tiBps;
cmptparm[j].bpp = tiBps;
cmptparm[j].dx = (uint32)subsampling_dx;
cmptparm[j].dy = (uint32)subsampling_dy;
cmptparm[j].w = (uint32)w;
cmptparm[j].h = (uint32)h;
}
image = opj_image_create((uint32)numcomps, &cmptparm[0], color_space);
if(!image)
{
TIFFClose(tif);
return NULL;
}
/* set image offset and reference grid */
image->x0 = (uint32)parameters->image_offset_x0;
image->y0 = (uint32)parameters->image_offset_y0;
image->x1 = !image->x0 ? (uint32)(w - 1) * (uint32)subsampling_dx + 1 :
image->x0 + (uint32)(w - 1) * (uint32)subsampling_dx + 1;
image->y1 = !image->y0 ? (uint32)(h - 1) * (uint32)subsampling_dy + 1 :
image->y0 + (uint32)(h - 1) * (uint32)subsampling_dy + 1;
for(j = 0; j < numcomps; j++)
{
planes[j] = image->comps[j].data;
}
/* image->comps[numcomps - 1].alpha = (uint16)(1 - (numcomps & 1)); */
strip_size = TIFFStripSize(tif);
buf = _TIFFmalloc(strip_size);
if (buf == NULL) {
TIFFClose(tif);
opj_image_destroy(image);
return NULL;
}
rowStride = ((size_t)w * tiSpp * tiBps + 7U) / 8U;
buffer32s = (int32 *)malloc((size_t)w * tiSpp * sizeof(int32));
if (buffer32s == NULL) {
_TIFFfree(buf);
TIFFClose(tif);
opj_image_destroy(image);
return NULL;
}
strip = 0;
currentPlane = 0;
do
{
planes[0] = image->comps[currentPlane].data; /* to manage planar data */
h= (int)tiHeight;
/* Read the Image components */
for(; (h > 0) && (strip < TIFFNumberOfStrips(tif)); strip++)
{
const uint8 *dat8;
size_t ssize;
ssize = (size_t)TIFFReadEncodedStrip(tif, strip, buf, strip_size);
dat8 = (const uint8*)buf;
while (ssize >= rowStride) {
cvtTifTo32s(dat8, buffer32s, (size_t)w * tiSpp);
cvtCxToPx(buffer32s, planes, (size_t)w);
planes[0] += w;
planes[1] += w;
planes[2] += w;
planes[3] += w;
dat8 += rowStride;
ssize -= rowStride;
h--;
}
}
currentPlane++;
} while ((tiPC == PLANARCONFIG_SEPARATE) && (currentPlane < numcomps));
free(buffer32s);
_TIFFfree(buf);
TIFFClose(tif);
if (is_cinema) {
for (j=0; j < numcomps; ++j) {
scale_component(&(image->comps[j]), 12);
}
}
return image;
}/* tiftoimage() */

View File

@@ -82,7 +82,7 @@ typedef struct img_folder{
float *rates; float *rates;
}img_fol_t; }img_fol_t;
void encode_help_display(void) { static void encode_help_display(void) {
fprintf(stdout,"HELP for image_to_j2k\n----\n\n"); fprintf(stdout,"HELP for image_to_j2k\n----\n\n");
fprintf(stdout,"- the -h option displays this help information on screen\n\n"); fprintf(stdout,"- the -h option displays this help information on screen\n\n");
@@ -321,7 +321,7 @@ void encode_help_display(void) {
fprintf(stdout,"TotalDisto\n\n"); fprintf(stdout,"TotalDisto\n\n");
} }
OPJ_PROG_ORDER give_progression(char progression[4]) { static OPJ_PROG_ORDER give_progression(char progression[4]) {
if(strncmp(progression, "LRCP", 4) == 0) { if(strncmp(progression, "LRCP", 4) == 0) {
return LRCP; return LRCP;
} }
@@ -341,7 +341,7 @@ OPJ_PROG_ORDER give_progression(char progression[4]) {
return PROG_UNKNOWN; return PROG_UNKNOWN;
} }
int get_num_images(char *imgdirpath){ static int get_num_images(char *imgdirpath){
DIR *dir; DIR *dir;
struct dirent* content; struct dirent* content;
int num_images = 0; int num_images = 0;
@@ -360,10 +360,11 @@ int get_num_images(char *imgdirpath){
continue; continue;
num_images++; num_images++;
} }
closedir(dir);
return num_images; return num_images;
} }
int load_images(dircnt_t *dirptr, char *imgdirpath){ static int load_images(dircnt_t *dirptr, char *imgdirpath){
DIR *dir; DIR *dir;
struct dirent* content; struct dirent* content;
int i = 0; int i = 0;
@@ -385,10 +386,11 @@ int load_images(dircnt_t *dirptr, char *imgdirpath){
strcpy(dirptr->filename[i],content->d_name); strcpy(dirptr->filename[i],content->d_name);
i++; i++;
} }
closedir(dir);
return 0; return 0;
} }
int get_file_format(char *filename) { static int get_file_format(char *filename) {
unsigned int i; unsigned int i;
static const char *extension[] = { static const char *extension[] = {
"pgx", "pnm", "pgm", "ppm", "pbm", "pam", "bmp", "tif", "raw", "tga", "png", "j2k", "jp2", "j2c", "jpc" "pgx", "pnm", "pgm", "ppm", "pbm", "pam", "bmp", "tif", "raw", "tga", "png", "j2k", "jp2", "j2c", "jpc"
@@ -408,14 +410,13 @@ int get_file_format(char *filename) {
return -1; return -1;
} }
char * get_file_name(char *name){ static char * get_file_name(char *name){
char *fname; char *fname;
fname= (char*)malloc(OPJ_PATH_LEN*sizeof(char));
fname= strtok(name,"."); fname= strtok(name,".");
return fname; return fname;
} }
char get_next_file(int imageno,dircnt_t *dirptr,img_fol_t *img_fol, opj_cparameters_t *parameters){ static char get_next_file(int imageno,dircnt_t *dirptr,img_fol_t *img_fol, opj_cparameters_t *parameters){
char image_filename[OPJ_PATH_LEN], infilename[OPJ_PATH_LEN],outfilename[OPJ_PATH_LEN],temp_ofname[OPJ_PATH_LEN]; char image_filename[OPJ_PATH_LEN], infilename[OPJ_PATH_LEN],outfilename[OPJ_PATH_LEN],temp_ofname[OPJ_PATH_LEN];
char *temp_p, temp1[OPJ_PATH_LEN]=""; char *temp_p, temp1[OPJ_PATH_LEN]="";
@@ -458,7 +459,7 @@ static int initialise_4K_poc(opj_poc_t *POC, int numres){
return 2; return 2;
} }
void cinema_parameters(opj_cparameters_t *parameters){ static void cinema_parameters(opj_cparameters_t *parameters){
parameters->tile_size_on = OPJ_FALSE; parameters->tile_size_on = OPJ_FALSE;
parameters->cp_tdx=1; parameters->cp_tdx=1;
parameters->cp_tdy=1; parameters->cp_tdy=1;
@@ -491,7 +492,7 @@ void cinema_parameters(opj_cparameters_t *parameters){
} }
void cinema_setup_encoder(opj_cparameters_t *parameters,opj_image_t *image, img_fol_t *img_fol){ static void cinema_setup_encoder(opj_cparameters_t *parameters,opj_image_t *image, img_fol_t *img_fol){
int i; int i;
float temp_rate; float temp_rate;
@@ -576,7 +577,7 @@ void cinema_setup_encoder(opj_cparameters_t *parameters,opj_image_t *image, img_
/* ------------------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------------------ */
int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters, static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
img_fol_t *img_fol, raw_cparameters_t *raw_cp, char *indexfilename) { img_fol_t *img_fol, raw_cparameters_t *raw_cp, char *indexfilename) {
int i, j, totlen, c; int i, j, totlen, c;
opj_option_t long_option[]={ opj_option_t long_option[]={
@@ -589,7 +590,10 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
{"OutFor",REQ_ARG, NULL ,'O'}, {"OutFor",REQ_ARG, NULL ,'O'},
{"POC",REQ_ARG, NULL ,'P'}, {"POC",REQ_ARG, NULL ,'P'},
{"ROI",REQ_ARG, NULL ,'R'}, {"ROI",REQ_ARG, NULL ,'R'},
{"jpip",NO_ARG, NULL, 'J'} {"jpip",NO_ARG, NULL, 'J'},
#ifdef USE_SYSTEM_GETOPT
{0,0,0,0} /* GNU getopt_long requirement */
#endif
}; };
/* parse the command line */ /* parse the command line */
@@ -599,12 +603,16 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
#endif /* USE_JPWL */ #endif /* USE_JPWL */
"h"; "h";
totlen=sizeof(long_option); totlen=sizeof(long_option);
img_fol->set_out_format=0; img_fol->set_out_format=0;
raw_cp->rawWidth = 0; raw_cp->rawWidth = 0;
do{ do{
#ifdef USE_SYSTEM_GETOPT
c = opj_getopt_long(argc, argv, optlist,long_option,0);
#else
c = opj_getopt_long(argc, argv, optlist,long_option,totlen); c = opj_getopt_long(argc, argv, optlist,long_option,totlen);
#endif
if (c == -1) if (c == -1)
break; break;
switch (c) { switch (c) {
@@ -1385,10 +1393,10 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
/* ------------------------------------------------------ */ /* ------------------------------------------------------ */
default: default:
fprintf(stderr, "ERROR -> Command line not valid\n"); fprintf(stderr, "[WARNING] An invalid option has been ignored\n");
return 1; break;
} }
}while(c != -1); }while(c != -1);
/* check for possible errors */ /* check for possible errors */
@@ -1466,21 +1474,21 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
/** /**
sample error callback expecting a FILE* client object sample error callback expecting a FILE* client object
*/ */
void error_callback(const char *msg, void *client_data) { static void error_callback(const char *msg, void *client_data) {
FILE *stream = (FILE*)client_data; FILE *stream = (FILE*)client_data;
fprintf(stream, "[ERROR] %s", msg); fprintf(stream, "[ERROR] %s", msg);
} }
/** /**
sample warning callback expecting a FILE* client object sample warning callback expecting a FILE* client object
*/ */
void warning_callback(const char *msg, void *client_data) { static void warning_callback(const char *msg, void *client_data) {
FILE *stream = (FILE*)client_data; FILE *stream = (FILE*)client_data;
fprintf(stream, "[WARNING] %s", msg); fprintf(stream, "[WARNING] %s", msg);
} }
/** /**
sample debug callback expecting a FILE* client object sample debug callback expecting a FILE* client object
*/ */
void info_callback(const char *msg, void *client_data) { static void info_callback(const char *msg, void *client_data) {
FILE *stream = (FILE*)client_data; FILE *stream = (FILE*)client_data;
fprintf(stream, "[INFO] %s", msg); fprintf(stream, "[INFO] %s", msg);
} }

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 20010, Mathieu Malaterre, GDCM * Copyright (c) 2010, Mathieu Malaterre, GDCM
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@@ -121,6 +121,7 @@ int get_num_images(char *imgdirpath){
continue; continue;
num_images++; num_images++;
} }
closedir(dir);
return num_images; return num_images;
} }
@@ -146,6 +147,7 @@ int load_images(dircnt_t *dirptr, char *imgdirpath){
strcpy(dirptr->filename[i],content->d_name); strcpy(dirptr->filename[i],content->d_name);
i++; i++;
} }
closedir(dir);
return 0; return 0;
} }
@@ -199,15 +201,22 @@ int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters,i
int totlen, c; int totlen, c;
opj_option_t long_option[]={ opj_option_t long_option[]={
{"ImgDir",REQ_ARG, NULL ,'y'}, {"ImgDir",REQ_ARG, NULL ,'y'},
#ifdef USE_SYSTEM_GETOPT
{0,0,0,0} /* GNU getopt_long requirement */
#endif
}; };
const char optlist[] = "i:o:h"; const char optlist[] = "i:o:h";
OPJ_ARG_NOT_USED(indexfilename); OPJ_ARG_NOT_USED(indexfilename);
totlen=sizeof(long_option); totlen=sizeof(long_option);
img_fol->set_out_format = 0; img_fol->set_out_format = 0;
do { do {
#ifdef USE_SYSTEM_GETOPT
c = opj_getopt_long(argc, argv,optlist,long_option,0);
#else
c = opj_getopt_long(argc, argv,optlist,long_option,totlen); c = opj_getopt_long(argc, argv,optlist,long_option,totlen);
#endif
if (c == -1) if (c == -1)
break; break;
switch (c) { switch (c) {
@@ -258,7 +267,7 @@ int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters,i
/* ----------------------------------------------------- */ /* ----------------------------------------------------- */
default: default:
fprintf(stderr,"WARNING -> this option is not valid \"-%c %s\"\n",c, opj_optarg); fprintf(stderr,"[WARNING] An invalid option has been ignored\n");
break; break;
} }
}while(c != -1); }while(c != -1);
@@ -274,12 +283,12 @@ int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters,i
fprintf(stderr, "Only one format allowed! Valid format PGM, PPM, PNM, PGX, BMP, TIF, RAW and TGA!!\n"); fprintf(stderr, "Only one format allowed! Valid format PGM, PPM, PNM, PGX, BMP, TIF, RAW and TGA!!\n");
return 1; return 1;
} }
if(!((parameters->outfile[0] == 0))){ if(!(parameters->outfile[0] == 0)){
fprintf(stderr, "Error: options -ImgDir and -o cannot be used together !!\n"); fprintf(stderr, "Error: options -ImgDir and -o cannot be used together !!\n");
return 1; return 1;
} }
}else{ }else{
if((parameters->infile[0] == 0) ) { if( parameters->infile[0] == 0 ) {
fprintf(stderr, "Example: %s -i image.j2k\n",argv[0]); fprintf(stderr, "Example: %s -i image.j2k\n",argv[0]);
fprintf(stderr, " Try: %s -h\n",argv[0]); fprintf(stderr, " Try: %s -h\n",argv[0]);
return 1; return 1;
@@ -350,6 +359,11 @@ int main(int argc, char *argv[])
return 1; return 1;
} }
/* j2k_dump focuses on j2k codestream and skips JP2 boxes */
parameters.flags = 1;
/* j2k_dump shall not actually decode packets (parsing codestream is enough). */
parameters.cp_limit_decoding = DECODE_ALL_BUT_PACKETS;
/* Initialize reading of directory */ /* Initialize reading of directory */
if(img_fol.set_imgdir==1){ if(img_fol.set_imgdir==1){
num_images=get_num_images(img_fol.imgdirpath); num_images=get_num_images(img_fol.imgdirpath);
@@ -445,7 +459,7 @@ int main(int argc, char *argv[])
cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length); cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length);
/* decode the stream and fill the image structure */ /* decode the stream and fill the image structure */
if (*indexfilename) /* If need to extract codestream information*/ if (*indexfilename) /* If need to extract codestream information*/
image = opj_decode_with_info(dinfo, cio, &cstr_info); image = opj_decode_with_info(dinfo, cio, &cstr_info);
else else
image = opj_decode(dinfo, cio); image = opj_decode(dinfo, cio);
@@ -494,7 +508,7 @@ int main(int argc, char *argv[])
cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length); cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length);
/* decode the stream and fill the image structure */ /* decode the stream and fill the image structure */
if (*indexfilename) /* If need to extract codestream information*/ if (*indexfilename) /* If need to extract codestream information*/
image = opj_decode_with_info(dinfo, cio, &cstr_info); image = opj_decode_with_info(dinfo, cio, &cstr_info);
else else
image = opj_decode(dinfo, cio); image = opj_decode(dinfo, cio);

View File

@@ -85,7 +85,41 @@ typedef struct img_folder{
}img_fol_t; }img_fol_t;
void decode_help_display(void) { typedef enum opj_prec_mode
{
OPJ_PREC_MODE_CLIP,
OPJ_PREC_MODE_SCALE
} opj_precision_mode;
typedef struct opj_prec
{
int prec;
opj_precision_mode mode;
}opj_precision;
typedef struct opj_decompress_params
{
/** core library parameters */
opj_dparameters_t core;
/** input file name */
char infile[OPJ_PATH_LEN];
/** output file name */
char outfile[OPJ_PATH_LEN];
/** input file format 0: J2K, 1: JP2, 2: JPT */
int decod_format;
/** output file format 0: PGX, 1: PxM, 2: BMP */
int cod_format;
opj_precision* precision;
int nb_precision;
/* force output colorspace to RGB */
int force_rgb;
/* upsample components according to their dx/dy values */
int upsample;
}opj_decompress_parameters;
static void decode_help_display(void) {
fprintf(stdout,"HELP for j2k_to_image\n----\n\n"); fprintf(stdout,"HELP for j2k_to_image\n----\n\n");
fprintf(stdout,"- the -h option displays this help information on screen\n\n"); fprintf(stdout,"- the -h option displays this help information on screen\n\n");
@@ -128,6 +162,18 @@ void decode_help_display(void) {
fprintf(stdout," are decoded.\n"); fprintf(stdout," are decoded.\n");
fprintf(stdout," -x \n"); fprintf(stdout," -x \n");
fprintf(stdout," Create an index file *.Idx (-x index_name.Idx) \n"); fprintf(stdout," Create an index file *.Idx (-x index_name.Idx) \n");
fprintf(stdout," -p <comp 0 precision>[C|S][,<comp 1 precision>[C|S][,...]]\n");
fprintf(stdout," OPTIONAL\n");
fprintf(stdout," Force the precision (bit depth) of components.\n");
fprintf(stdout," There shall be at least 1 value. Theres no limit on the number of values (comma separated, last values ignored if too much values).\n");
fprintf(stdout," If there are less values than components, the last value is used for remaining components.\n");
fprintf(stdout," If 'C' is specified (default), values are clipped.\n");
fprintf(stdout," If 'S' is specified, values are scaled.\n");
fprintf(stdout," A 0 value can be specified (meaning original bit depth).\n");
fprintf(stdout," -force-rgb\n");
fprintf(stdout," Force output image colorspace to RGB\n");
fprintf(stdout," -upsample\n");
fprintf(stdout," Downsampled components will be upsampled to image size\n");
fprintf(stdout,"\n"); fprintf(stdout,"\n");
/* UniPG>> */ /* UniPG>> */
#ifdef USE_JPWL #ifdef USE_JPWL
@@ -144,7 +190,112 @@ void decode_help_display(void) {
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
int get_num_images(char *imgdirpath){ static opj_bool parse_precision(const char* option, opj_decompress_parameters* parameters)
{
const char* l_remaining = option;
opj_bool l_result = OPJ_TRUE;
/* reset */
if (parameters->precision) {
free(parameters->precision);
parameters->precision = NULL;
}
parameters->nb_precision = 0U;
for(;;)
{
int prec;
char mode;
char comma;
int count;
count = sscanf(l_remaining, "%d%c%c", &prec, &mode, &comma);
if (count == 1) {
mode = 'C';
count++;
}
if ((count == 2) || (mode==',')) {
if (mode==',') {
mode = 'C';
}
comma=',';
count = 3;
}
if (count == 3) {
if ((prec < 1) || (prec > 32)) {
fprintf(stderr,"Invalid precision %d in precision option %s\n", prec, option);
l_result = OPJ_FALSE;
break;
}
if ((mode != 'C') && (mode != 'S')) {
fprintf(stderr,"Invalid precision mode %c in precision option %s\n", mode, option);
l_result = OPJ_FALSE;
break;
}
if (comma != ',') {
fprintf(stderr,"Invalid character %c in precision option %s\n", comma, option);
l_result = OPJ_FALSE;
break;
}
if (parameters->precision == NULL) {
/* first one */
parameters->precision = (opj_precision *)malloc(sizeof(opj_precision));
if (parameters->precision == NULL) {
fprintf(stderr,"Could not allocate memory for precision option\n");
l_result = OPJ_FALSE;
break;
}
} else {
int l_new_size = parameters->nb_precision + 1U;
opj_precision* l_new;
if (l_new_size == 0U) {
fprintf(stderr,"Could not allocate memory for precision option\n");
l_result = OPJ_FALSE;
break;
}
l_new = (opj_precision *)realloc(parameters->precision, l_new_size * sizeof(opj_precision));
if (l_new == NULL) {
fprintf(stderr,"Could not allocate memory for precision option\n");
l_result = OPJ_FALSE;
break;
}
parameters->precision = l_new;
}
parameters->precision[parameters->nb_precision].prec = prec;
switch (mode) {
case 'C':
parameters->precision[parameters->nb_precision].mode = OPJ_PREC_MODE_CLIP;
break;
case 'S':
parameters->precision[parameters->nb_precision].mode = OPJ_PREC_MODE_SCALE;
break;
default:
break;
}
parameters->nb_precision++;
l_remaining = strchr(l_remaining, ',');
if (l_remaining == NULL) {
break;
}
l_remaining += 1;
} else {
fprintf(stderr,"Could not parse precision option %s\n", option);
l_result = OPJ_FALSE;
break;
}
}
return l_result;
}
/* -------------------------------------------------------------------------- */
static int get_num_images(char *imgdirpath){
DIR *dir; DIR *dir;
struct dirent* content; struct dirent* content;
int num_images = 0; int num_images = 0;
@@ -162,10 +313,11 @@ int get_num_images(char *imgdirpath){
continue; continue;
num_images++; num_images++;
} }
closedir(dir);
return num_images; return num_images;
} }
int load_images(dircnt_t *dirptr, char *imgdirpath){ static int load_images(dircnt_t *dirptr, char *imgdirpath){
DIR *dir; DIR *dir;
struct dirent* content; struct dirent* content;
int i = 0; int i = 0;
@@ -187,10 +339,11 @@ int load_images(dircnt_t *dirptr, char *imgdirpath){
strcpy(dirptr->filename[i],content->d_name); strcpy(dirptr->filename[i],content->d_name);
i++; i++;
} }
closedir(dir);
return 0; return 0;
} }
int get_file_format(char *filename) { static int get_file_format(char *filename) {
unsigned int i; unsigned int i;
static const char *extension[] = {"pgx", "pnm", "pgm", "ppm", "bmp","tif", "raw", "tga", "png", "j2k", "jp2", "jpt", "j2c", "jpc" }; static const char *extension[] = {"pgx", "pnm", "pgm", "ppm", "bmp","tif", "raw", "tga", "png", "j2k", "jp2", "jpt", "j2c", "jpc" };
static const int format[] = { PGX_DFMT, PXM_DFMT, PXM_DFMT, PXM_DFMT, BMP_DFMT, TIF_DFMT, RAW_DFMT, TGA_DFMT, PNG_DFMT, J2K_CFMT, JP2_CFMT, JPT_CFMT, J2K_CFMT, J2K_CFMT }; static const int format[] = { PGX_DFMT, PXM_DFMT, PXM_DFMT, PXM_DFMT, BMP_DFMT, TIF_DFMT, RAW_DFMT, TGA_DFMT, PNG_DFMT, J2K_CFMT, JP2_CFMT, JPT_CFMT, J2K_CFMT, J2K_CFMT };
@@ -209,7 +362,7 @@ int get_file_format(char *filename) {
return -1; return -1;
} }
char get_next_file(int imageno,dircnt_t *dirptr,img_fol_t *img_fol, opj_dparameters_t *parameters){ static char get_next_file(int imageno,dircnt_t *dirptr,img_fol_t *img_fol, opj_decompress_parameters *parameters){
char image_filename[OPJ_PATH_LEN], infilename[OPJ_PATH_LEN],outfilename[OPJ_PATH_LEN],temp_ofname[OPJ_PATH_LEN]; char image_filename[OPJ_PATH_LEN], infilename[OPJ_PATH_LEN],outfilename[OPJ_PATH_LEN],temp_ofname[OPJ_PATH_LEN];
char *temp_p, temp1[OPJ_PATH_LEN]=""; char *temp_p, temp1[OPJ_PATH_LEN]="";
@@ -235,15 +388,20 @@ char get_next_file(int imageno,dircnt_t *dirptr,img_fol_t *img_fol, opj_dparamet
} }
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters,img_fol_t *img_fol, char *indexfilename) { static int parse_cmdline_decoder(int argc, char **argv, opj_decompress_parameters *parameters,img_fol_t *img_fol, char *indexfilename) {
/* parse the command line */ /* parse the command line */
int totlen, c; int totlen, c;
opj_option_t long_option[]={ opj_option_t long_option[]={
{"ImgDir",REQ_ARG, NULL ,'y'}, {"ImgDir",REQ_ARG, NULL ,'y'},
{"OutFor",REQ_ARG, NULL ,'O'}, {"OutFor",REQ_ARG, NULL ,'O'},
{"force-rgb", NO_ARG, NULL, 1},
{"upsample", NO_ARG, NULL, 1},
#ifdef USE_SYSTEM_GETOPT
{0,0,0,0} /* GNU getopt_long requirement */
#endif
}; };
const char optlist[] = "i:o:r:l:x:" const char optlist[] = "i:o:r:l:x:p:"
/* UniPG>> */ /* UniPG>> */
#ifdef USE_JPWL #ifdef USE_JPWL
@@ -251,13 +409,22 @@ int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters,i
#endif /* USE_JPWL */ #endif /* USE_JPWL */
/* <<UniPG */ /* <<UniPG */
"h" ; "h" ;
long_option[2].flag = &(parameters->force_rgb);
long_option[3].flag = &(parameters->upsample);
totlen=sizeof(long_option); totlen=sizeof(long_option);
img_fol->set_out_format = 0; img_fol->set_out_format = 0;
do { do {
#ifdef USE_SYSTEM_GETOPT
c = opj_getopt_long(argc, argv,optlist,long_option,0);
#else
c = opj_getopt_long(argc, argv,optlist,long_option,totlen); c = opj_getopt_long(argc, argv,optlist,long_option,totlen);
#endif
if (c == -1) if (c == -1)
break; break;
switch (c) { switch (c) {
case 0: /* long opt with flag */
break;
case 'i': /* input file */ case 'i': /* input file */
{ {
char *infile = opj_optarg; char *infile = opj_optarg;
@@ -344,7 +511,7 @@ int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters,i
case 'r': /* reduce option */ case 'r': /* reduce option */
{ {
sscanf(opj_optarg, "%d", &parameters->cp_reduce); sscanf(opj_optarg, "%d", &parameters->core.cp_reduce);
} }
break; break;
@@ -353,7 +520,7 @@ int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters,i
case 'l': /* layering option */ case 'l': /* layering option */
{ {
sscanf(opj_optarg, "%d", &parameters->cp_layer); sscanf(opj_optarg, "%d", &parameters->core.cp_layer);
} }
break; break;
@@ -380,6 +547,15 @@ int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters,i
} }
break; break;
/* ----------------------------------------------------- */ /* ----------------------------------------------------- */
case 'p': /* Force precision */
{
if (!parse_precision(opj_optarg, parameters))
{
return 1;
}
}
break;
/* ----------------------------------------------------- */
/* UniPG>> */ /* UniPG>> */
#ifdef USE_JPWL #ifdef USE_JPWL
@@ -454,7 +630,7 @@ int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters,i
/* ----------------------------------------------------- */ /* ----------------------------------------------------- */
default: default:
fprintf(stderr,"WARNING -> this option is not valid \"-%c %s\"\n",c, opj_optarg); fprintf(stderr,"[WARNING] An invalid option has been ignored\n");
break; break;
} }
}while(c != -1); }while(c != -1);
@@ -487,32 +663,283 @@ int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters,i
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
static void set_default_parameters(opj_decompress_parameters* parameters)
{
if (parameters) {
memset(parameters, 0, sizeof(opj_decompress_parameters));
/* default decoding parameters (command line specific) */
parameters->decod_format = -1;
parameters->cod_format = -1;
/* default decoding parameters (core) */
opj_set_default_decoder_parameters(&(parameters->core));
}
}
static void destroy_parameters(opj_decompress_parameters* parameters)
{
if (parameters) {
if (parameters->precision) {
free(parameters->precision);
parameters->precision = NULL;
}
}
}
/* -------------------------------------------------------------------------- */
/** /**
sample error callback expecting a FILE* client object sample error callback expecting a FILE* client object
*/ */
void error_callback(const char *msg, void *client_data) { static void error_callback(const char *msg, void *client_data) {
FILE *stream = (FILE*)client_data; FILE *stream = (FILE*)client_data;
fprintf(stream, "[ERROR] %s", msg); fprintf(stream, "[ERROR] %s", msg);
} }
/** /**
sample warning callback expecting a FILE* client object sample warning callback expecting a FILE* client object
*/ */
void warning_callback(const char *msg, void *client_data) { static void warning_callback(const char *msg, void *client_data) {
FILE *stream = (FILE*)client_data; FILE *stream = (FILE*)client_data;
fprintf(stream, "[WARNING] %s", msg); fprintf(stream, "[WARNING] %s", msg);
} }
/** /**
sample debug callback expecting no client object sample debug callback expecting no client object
*/ */
void info_callback(const char *msg, void *client_data) { static void info_callback(const char *msg, void *client_data) {
(void)client_data; (void)client_data;
fprintf(stdout, "[INFO] %s", msg); fprintf(stdout, "[INFO] %s", msg);
} }
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
static opj_image_t* convert_gray_to_rgb(opj_image_t* original)
{
int compno;
opj_image_t* l_new_image = NULL;
opj_image_cmptparm_t* l_new_components = NULL;
l_new_components = (opj_image_cmptparm_t*)malloc((original->numcomps + 2U) * sizeof(opj_image_cmptparm_t));
if (l_new_components == NULL) {
fprintf(stderr, "ERROR -> j2k_to_image: failed to allocate memory for RGB image!\n");
opj_image_destroy(original);
return NULL;
}
l_new_components[0].bpp = l_new_components[1].bpp = l_new_components[2].bpp = original->comps[0].bpp;
l_new_components[0].dx = l_new_components[1].dx = l_new_components[2].dx = original->comps[0].dx;
l_new_components[0].dy = l_new_components[1].dy = l_new_components[2].dy = original->comps[0].dy;
l_new_components[0].h = l_new_components[1].h = l_new_components[2].h = original->comps[0].h;
l_new_components[0].w = l_new_components[1].w = l_new_components[2].w = original->comps[0].w;
l_new_components[0].prec = l_new_components[1].prec = l_new_components[2].prec = original->comps[0].prec;
l_new_components[0].sgnd = l_new_components[1].sgnd = l_new_components[2].sgnd = original->comps[0].sgnd;
l_new_components[0].x0 = l_new_components[1].x0 = l_new_components[2].x0 = original->comps[0].x0;
l_new_components[0].y0 = l_new_components[1].y0 = l_new_components[2].y0 = original->comps[0].y0;
for(compno = 1; compno < original->numcomps; ++compno) {
l_new_components[compno+2].bpp = original->comps[compno].bpp;
l_new_components[compno+2].dx = original->comps[compno].dx;
l_new_components[compno+2].dy = original->comps[compno].dy;
l_new_components[compno+2].h = original->comps[compno].h;
l_new_components[compno+2].w = original->comps[compno].w;
l_new_components[compno+2].prec = original->comps[compno].prec;
l_new_components[compno+2].sgnd = original->comps[compno].sgnd;
l_new_components[compno+2].x0 = original->comps[compno].x0;
l_new_components[compno+2].y0 = original->comps[compno].y0;
}
l_new_image = opj_image_create(original->numcomps + 2, l_new_components, CLRSPC_SRGB);
free(l_new_components);
if (l_new_image == NULL) {
fprintf(stderr, "ERROR -> j2k_to_image: failed to allocate memory for RGB image!\n");
opj_image_destroy(original);
return NULL;
}
l_new_image->x0 = original->x0;
l_new_image->x1 = original->x1;
l_new_image->y0 = original->y0;
l_new_image->y1 = original->y1;
l_new_image->comps[0].factor = l_new_image->comps[1].factor = l_new_image->comps[2].factor = original->comps[0].factor;
l_new_image->comps[0].resno_decoded = l_new_image->comps[1].resno_decoded = l_new_image->comps[2].resno_decoded = original->comps[0].resno_decoded;
memcpy(l_new_image->comps[0].data, original->comps[0].data, original->comps[0].w * original->comps[0].h * sizeof(int));
memcpy(l_new_image->comps[1].data, original->comps[0].data, original->comps[0].w * original->comps[0].h * sizeof(int));
memcpy(l_new_image->comps[2].data, original->comps[0].data, original->comps[0].w * original->comps[0].h * sizeof(int));
for(compno = 1; compno < original->numcomps; ++compno) {
l_new_image->comps[compno+2].factor = original->comps[compno].factor;
l_new_image->comps[compno+2].resno_decoded = original->comps[compno].resno_decoded;
memcpy(l_new_image->comps[compno+2].data, original->comps[compno].data, original->comps[compno].w * original->comps[compno].h * sizeof(int));
}
opj_image_destroy(original);
return l_new_image;
}
/* -------------------------------------------------------------------------- */
static opj_image_t* upsample_image_components(opj_image_t* original)
{
opj_image_t* l_new_image = NULL;
opj_image_cmptparm_t* l_new_components = NULL;
opj_bool l_upsample_need = OPJ_FALSE;
int compno;
for (compno = 0; compno < original->numcomps; ++compno) {
if (original->comps[compno].factor > 0) {
fprintf(stderr, "ERROR -> j2k_to_image: -upsample not supported with reduction\n");
opj_image_destroy(original);
return NULL;
}
if ((original->comps[compno].dx > 1) || (original->comps[compno].dy > 1)) {
l_upsample_need = OPJ_TRUE;
break;
}
}
if (!l_upsample_need) {
return original;
}
/* Upsample is needed */
l_new_components = (opj_image_cmptparm_t*)malloc(original->numcomps * sizeof(opj_image_cmptparm_t));
if (l_new_components == NULL) {
fprintf(stderr, "ERROR -> j2k_to_image: failed to allocate memory for upsampled components!\n");
opj_image_destroy(original);
return NULL;
}
for (compno = 0; compno < original->numcomps; ++compno) {
opj_image_cmptparm_t* l_new_cmp = &(l_new_components[compno]);
opj_image_comp_t* l_org_cmp = &(original->comps[compno]);
l_new_cmp->bpp = l_org_cmp->bpp;
l_new_cmp->prec = l_org_cmp->prec;
l_new_cmp->sgnd = l_org_cmp->sgnd;
l_new_cmp->x0 = original->x0;
l_new_cmp->y0 = original->y0;
l_new_cmp->dx = 1;
l_new_cmp->dy = 1;
l_new_cmp->w = l_org_cmp->w; /* should be original->x1 - original->x0 for dx==1 */
l_new_cmp->h = l_org_cmp->h; /* should be original->y1 - original->y0 for dy==0 */
if (l_org_cmp->dx > 1) {
l_new_cmp->w = original->x1 - original->x0;
}
if (l_org_cmp->dy > 1) {
l_new_cmp->h = original->y1 - original->y0;
}
}
l_new_image = opj_image_create(original->numcomps, l_new_components, original->color_space);
free(l_new_components);
if (l_new_image == NULL) {
fprintf(stderr, "ERROR -> j2k_to_image: failed to allocate memory for upsampled components!\n");
opj_image_destroy(original);
return NULL;
}
l_new_image->x0 = original->x0;
l_new_image->x1 = original->x1;
l_new_image->y0 = original->y0;
l_new_image->y1 = original->y1;
for (compno = 0; compno < original->numcomps; ++compno) {
opj_image_comp_t* l_new_cmp = &(l_new_image->comps[compno]);
opj_image_comp_t* l_org_cmp = &(original->comps[compno]);
l_new_cmp->factor = l_org_cmp->factor;
l_new_cmp->resno_decoded = l_org_cmp->resno_decoded;
if ((l_org_cmp->dx > 1) || (l_org_cmp->dy > 1)) {
const int* l_src = l_org_cmp->data;
int* l_dst = l_new_cmp->data;
int y;
int xoff, yoff;
/* need to take into account dx & dy */
xoff = l_org_cmp->dx * l_org_cmp->x0 - original->x0;
yoff = l_org_cmp->dy * l_org_cmp->y0 - original->y0;
if ((xoff >= l_org_cmp->dx) || (yoff >= l_org_cmp->dy)) {
fprintf(stderr, "ERROR -> j2k_to_image: Invalid image/component parameters found when upsampling\n");
opj_image_destroy(original);
opj_image_destroy(l_new_image);
return NULL;
}
for (y = 0; y < yoff; ++y) {
memset(l_dst, 0, l_new_cmp->w * sizeof(int));
l_dst += l_new_cmp->w;
}
if(l_new_cmp->h > (l_org_cmp->dy - 1)) { /* check subtraction overflow for really small images */
for (; y < l_new_cmp->h - (l_org_cmp->dy - 1); y += l_org_cmp->dy) {
int x, dy;
int xorg;
xorg = 0;
for (x = 0; x < xoff; ++x) {
l_dst[x] = 0;
}
if (l_new_cmp->w > (l_org_cmp->dx - 1)) { /* check subtraction overflow for really small images */
for (; x < l_new_cmp->w - (l_org_cmp->dx - 1); x += l_org_cmp->dx, ++xorg) {
int dx;
for (dx = 0; dx < l_org_cmp->dx; ++dx) {
l_dst[x + dx] = l_src[xorg];
}
}
}
for (; x < l_new_cmp->w; ++x) {
l_dst[x] = l_src[xorg];
}
l_dst += l_new_cmp->w;
for (dy = 1; dy < l_org_cmp->dy; ++dy) {
memcpy(l_dst, l_dst - l_new_cmp->w, l_new_cmp->w * sizeof(int));
l_dst += l_new_cmp->w;
}
l_src += l_org_cmp->w;
}
}
if (y < l_new_cmp->h) {
int x;
int xorg;
xorg = 0;
for (x = 0; x < xoff; ++x) {
l_dst[x] = 0;
}
if (l_new_cmp->w > (l_org_cmp->dx - 1)) { /* check subtraction overflow for really small images */
for (; x < l_new_cmp->w - (l_org_cmp->dx - 1); x += l_org_cmp->dx, ++xorg) {
int dx;
for (dx = 0; dx < l_org_cmp->dx; ++dx) {
l_dst[x + dx] = l_src[xorg];
}
}
}
for (; x < l_new_cmp->w; ++x) {
l_dst[x] = l_src[xorg];
}
l_dst += l_new_cmp->w;
++y;
for (; y < l_new_cmp->h; ++y) {
memcpy(l_dst, l_dst - l_new_cmp->w, l_new_cmp->w * sizeof(int));
l_dst += l_new_cmp->w;
}
}
}
else {
memcpy(l_new_cmp->data, l_org_cmp->data, l_org_cmp->w * l_org_cmp->h * sizeof(int));
}
}
opj_image_destroy(original);
return l_new_image;
}
/* -------------------------------------------------------------------------- */
int main(int argc, char **argv) { int main(int argc, char **argv) {
opj_dparameters_t parameters; /* decompression parameters */ opj_decompress_parameters parameters; /* decompression parameters */
img_fol_t img_fol; img_fol_t img_fol;
opj_event_mgr_t event_mgr; /* event manager */ opj_event_mgr_t event_mgr; /* event manager */
opj_image_t *image = NULL; opj_image_t *image = NULL;
@@ -534,7 +961,7 @@ int main(int argc, char **argv) {
event_mgr.info_handler = info_callback; event_mgr.info_handler = info_callback;
/* set decoding parameters to default values */ /* set decoding parameters to default values */
opj_set_default_decoder_parameters(&parameters); set_default_parameters(&parameters);
/* Initialize indexfilename and img_fol */ /* Initialize indexfilename and img_fol */
*indexfilename = 0; *indexfilename = 0;
@@ -542,6 +969,7 @@ int main(int argc, char **argv) {
/* parse input and get user encoding parameters */ /* parse input and get user encoding parameters */
if(parse_cmdline_decoder(argc, argv, &parameters,&img_fol, indexfilename) == 1) { if(parse_cmdline_decoder(argc, argv, &parameters,&img_fol, indexfilename) == 1) {
destroy_parameters(&parameters);
return 1; return 1;
} }
@@ -555,6 +983,7 @@ int main(int argc, char **argv) {
dirptr->filename = (char**) malloc(num_images*sizeof(char*)); dirptr->filename = (char**) malloc(num_images*sizeof(char*));
if(!dirptr->filename_buf){ if(!dirptr->filename_buf){
destroy_parameters(&parameters);
return 1; return 1;
} }
for(i=0;i<num_images;i++){ for(i=0;i<num_images;i++){
@@ -562,10 +991,12 @@ int main(int argc, char **argv) {
} }
} }
if(load_images(dirptr,img_fol.imgdirpath)==1){ if(load_images(dirptr,img_fol.imgdirpath)==1){
destroy_parameters(&parameters);
return 1; return 1;
} }
if (num_images==0){ if (num_images==0){
fprintf(stdout,"Folder is empty\n"); fprintf(stdout,"Folder is empty\n");
destroy_parameters(&parameters);
return 1; return 1;
} }
}else{ }else{
@@ -589,6 +1020,7 @@ int main(int argc, char **argv) {
fsrc = fopen(parameters.infile, "rb"); fsrc = fopen(parameters.infile, "rb");
if (!fsrc) { if (!fsrc) {
fprintf(stderr, "ERROR -> failed to open %s for reading\n", parameters.infile); fprintf(stderr, "ERROR -> failed to open %s for reading\n", parameters.infile);
destroy_parameters(&parameters);
return 1; return 1;
} }
fseek(fsrc, 0, SEEK_END); fseek(fsrc, 0, SEEK_END);
@@ -600,6 +1032,7 @@ int main(int argc, char **argv) {
free(src); free(src);
fclose(fsrc); fclose(fsrc);
fprintf(stderr, "\nERROR: fread return a number of element different from the expected.\n"); fprintf(stderr, "\nERROR: fread return a number of element different from the expected.\n");
destroy_parameters(&parameters);
return 1; return 1;
} }
fclose(fsrc); fclose(fsrc);
@@ -619,7 +1052,7 @@ int main(int argc, char **argv) {
opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr); opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr);
/* setup the decoder decoding parameters using user parameters */ /* setup the decoder decoding parameters using user parameters */
opj_setup_decoder(dinfo, &parameters); opj_setup_decoder(dinfo, &parameters.core);
/* open a byte stream */ /* open a byte stream */
cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length); cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length);
@@ -634,6 +1067,7 @@ int main(int argc, char **argv) {
opj_destroy_decompress(dinfo); opj_destroy_decompress(dinfo);
opj_cio_close(cio); opj_cio_close(cio);
free(src); free(src);
destroy_parameters(&parameters);
return 1; return 1;
} }
@@ -662,7 +1096,7 @@ int main(int argc, char **argv) {
opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr); opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr);
/* setup the decoder decoding parameters using the current image and user parameters */ /* setup the decoder decoding parameters using the current image and user parameters */
opj_setup_decoder(dinfo, &parameters); opj_setup_decoder(dinfo, &parameters.core);
/* open a byte stream */ /* open a byte stream */
cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length); cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length);
@@ -677,6 +1111,7 @@ int main(int argc, char **argv) {
opj_destroy_decompress(dinfo); opj_destroy_decompress(dinfo);
opj_cio_close(cio); opj_cio_close(cio);
free(src); free(src);
destroy_parameters(&parameters);
return 1; return 1;
} }
@@ -705,7 +1140,7 @@ int main(int argc, char **argv) {
opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr); opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr);
/* setup the decoder decoding parameters using user parameters */ /* setup the decoder decoding parameters using user parameters */
opj_setup_decoder(dinfo, &parameters); opj_setup_decoder(dinfo, &parameters.core);
/* open a byte stream */ /* open a byte stream */
cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length); cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length);
@@ -720,6 +1155,7 @@ int main(int argc, char **argv) {
opj_destroy_decompress(dinfo); opj_destroy_decompress(dinfo);
opj_cio_close(cio); opj_cio_close(cio);
free(src); free(src);
destroy_parameters(&parameters);
return 1; return 1;
} }
@@ -746,20 +1182,89 @@ int main(int argc, char **argv) {
free(src); free(src);
src = NULL; src = NULL;
if(image->color_space == CLRSPC_SYCC) if(image->color_space == CLRSPC_SYCC)
{ {
color_sycc_to_rgb(image); color_sycc_to_rgb(image);
} }
if(image->icc_profile_buf) if(image->icc_profile_buf)
{ {
#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) #if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
color_apply_icc_profile(image); color_apply_icc_profile(image);
#endif #endif
free(image->icc_profile_buf);
image->icc_profile_buf = NULL; image->icc_profile_len = 0;
}
free(image->icc_profile_buf); /* Force output precision */
image->icc_profile_buf = NULL; image->icc_profile_len = 0; /* ---------------------- */
} if (parameters.precision != NULL)
{
int compno;
for (compno = 0; compno < image->numcomps; ++compno)
{
int precno = compno;
int prec;
if (precno >= parameters.nb_precision) {
precno = parameters.nb_precision - 1U;
}
prec = parameters.precision[precno].prec;
if (prec == 0) {
prec = image->comps[compno].prec;
}
switch (parameters.precision[precno].mode) {
case OPJ_PREC_MODE_CLIP:
clip_component(&(image->comps[compno]), prec);
break;
case OPJ_PREC_MODE_SCALE:
scale_component(&(image->comps[compno]), prec);
break;
default:
break;
}
}
}
/* Upsample components */
/* ------------------- */
if (parameters.upsample)
{
image = upsample_image_components(image);
if (image == NULL) {
fprintf(stderr, "ERROR -> j2k_to_image: failed to upsample image components!\n");
destroy_parameters(&parameters);
opj_destroy_decompress(dinfo);
return EXIT_FAILURE;
}
}
/* Force RGB output */
/* ---------------- */
if (parameters.force_rgb)
{
switch (image->color_space) {
case CLRSPC_SRGB:
break;
case CLRSPC_GRAY:
image = convert_gray_to_rgb(image);
break;
default:
fprintf(stderr, "ERROR -> j2k_to_image: don't know how to convert image to RGB colorspace!\n");
opj_image_destroy(image);
image = NULL;
break;
}
if (image == NULL) {
fprintf(stderr, "ERROR -> j2k_to_image: failed to convert to RGB image!\n");
destroy_parameters(&parameters);
opj_destroy_decompress(dinfo);
return EXIT_FAILURE;
}
}
/* create output image */ /* create output image */
/* ------------------- */ /* ------------------- */
@@ -845,6 +1350,7 @@ int main(int argc, char **argv) {
opj_image_destroy(image); opj_image_destroy(image);
} }
destroy_parameters(&parameters);
return 0; return 0;
} }
/*end main*/ /*end main*/

View File

@@ -46,21 +46,21 @@
#endif #endif
/*-------------------------------------------------------- /*--------------------------------------------------------
Matrix f<EFBFBD>r sYCC, Amendment 1 to IEC 61966-2-1 Matrix for sYCC, Amendment 1 to IEC 61966-2-1
Y : 0.299 0.587 0.114 :R Y : 0.299 0.587 0.114 :R
Cb: -0.1687 -0.3312 0.5 :G Cb: -0.1687 -0.3312 0.5 :G
Cr: 0.5 -0.4187 -0.0812 :B Cr: 0.5 -0.4187 -0.0812 :B
Inverse: Inverse:
R: 1 -3.68213e-05 1.40199 :Y R: 1 -3.68213e-05 1.40199 :Y
G: 1.00003 -0.344125 -0.714128 :Cb - 2^(prec - 1) G: 1.00003 -0.344125 -0.714128 :Cb - 2^(prec - 1)
B: 0.999823 1.77204 -8.04142e-06 :Cr - 2^(prec - 1) B: 0.999823 1.77204 -8.04142e-06 :Cr - 2^(prec - 1)
-----------------------------------------------------------*/ -----------------------------------------------------------*/
static void sycc_to_rgb(int offset, int upb, int y, int cb, int cr, static void sycc_to_rgb(int offset, int upb, int y, int cb, int cr,
int *out_r, int *out_g, int *out_b) int *out_r, int *out_g, int *out_b)
{ {
int r, g, b; int r, g, b;
@@ -79,28 +79,28 @@ static void sycc444_to_rgb(opj_image_t *img)
{ {
int *d0, *d1, *d2, *r, *g, *b; int *d0, *d1, *d2, *r, *g, *b;
const int *y, *cb, *cr; const int *y, *cb, *cr;
int maxw, maxh, max, i, offset, upb; unsigned int maxw, maxh, max, i;
int offset, upb;
i = img->comps[0].prec; upb = (int)img->comps[0].prec;
offset = 1<<(i - 1); upb = (1<<i)-1; offset = 1<<(upb - 1); upb = (1<<upb)-1;
maxw = img->comps[0].w; maxh = img->comps[0].h; maxw = (unsigned int)img->comps[0].w; maxh = (unsigned int)img->comps[0].h;
max = maxw * maxh; max = maxw * maxh;
y = img->comps[0].data; y = img->comps[0].data;
cb = img->comps[1].data; cb = img->comps[1].data;
cr = img->comps[2].data; cr = img->comps[2].data;
d0 = r = (int*)malloc(sizeof(int) * max); d0 = r = (int*)malloc(sizeof(int) * (size_t)max);
d1 = g = (int*)malloc(sizeof(int) * max); d1 = g = (int*)malloc(sizeof(int) * (size_t)max);
d2 = b = (int*)malloc(sizeof(int) * max); d2 = b = (int*)malloc(sizeof(int) * (size_t)max);
for(i = 0; i < max; ++i) for(i = 0U; i < max; ++i)
{ {
sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
++y; ++cb; ++cr; ++r; ++g; ++b;
++y; ++cb; ++cr; ++r; ++g; ++b; }
}
free(img->comps[0].data); img->comps[0].data = d0; free(img->comps[0].data); img->comps[0].data = d0;
free(img->comps[1].data); img->comps[1].data = d1; free(img->comps[1].data); img->comps[1].data = d1;
free(img->comps[2].data); img->comps[2].data = d2; free(img->comps[2].data); img->comps[2].data = d2;
@@ -111,36 +111,38 @@ static void sycc422_to_rgb(opj_image_t *img)
{ {
int *d0, *d1, *d2, *r, *g, *b; int *d0, *d1, *d2, *r, *g, *b;
const int *y, *cb, *cr; const int *y, *cb, *cr;
int maxw, maxh, max, offset, upb; unsigned int maxw, maxh, max;
int i, j; int offset, upb;
unsigned int i, j;
i = img->comps[0].prec; upb = (int)img->comps[0].prec;
offset = 1<<(i - 1); upb = (1<<i)-1; offset = 1<<(upb - 1); upb = (1<<upb)-1;
maxw = img->comps[0].w; maxh = img->comps[0].h; maxw = (unsigned int)img->comps[0].w; maxh = (unsigned int)img->comps[0].h;
max = maxw * maxh; max = maxw * maxh;
y = img->comps[0].data; y = img->comps[0].data;
cb = img->comps[1].data; cb = img->comps[1].data;
cr = img->comps[2].data; cr = img->comps[2].data;
d0 = r = (int*)malloc(sizeof(int) * max); d0 = r = (int*)malloc(sizeof(int) * (size_t)max);
d1 = g = (int*)malloc(sizeof(int) * max); d1 = g = (int*)malloc(sizeof(int) * (size_t)max);
d2 = b = (int*)malloc(sizeof(int) * max); d2 = b = (int*)malloc(sizeof(int) * (size_t)max);
for(i=0; i < maxh; ++i) for(i=0U; i < maxh; ++i)
{ {
for(j=0; j < maxw; j += 2) for(j=0U; j < (maxw & ~(unsigned int)1U); j += 2U)
{ {
sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
++y; ++r; ++g; ++b;
++y; ++r; ++g; ++b; sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
++y; ++r; ++g; ++b; ++cb; ++cr;
sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); }
if (j < maxw) {
++y; ++r; ++g; ++b; ++cb; ++cr; sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
} ++y; ++r; ++g; ++b; ++cb; ++cr;
} }
}
free(img->comps[0].data); img->comps[0].data = d0; free(img->comps[0].data); img->comps[0].data = d0;
free(img->comps[1].data); img->comps[1].data = d1; free(img->comps[1].data); img->comps[1].data = d1;
free(img->comps[2].data); img->comps[2].data = d2; free(img->comps[2].data); img->comps[2].data = d2;
@@ -151,55 +153,75 @@ static void sycc422_to_rgb(opj_image_t *img)
img->comps[2].dx = img->comps[0].dx; img->comps[2].dx = img->comps[0].dx;
img->comps[1].dy = img->comps[0].dy; img->comps[1].dy = img->comps[0].dy;
img->comps[2].dy = img->comps[0].dy; img->comps[2].dy = img->comps[0].dy;
}/* sycc422_to_rgb() */ }/* sycc422_to_rgb() */
static void sycc420_to_rgb(opj_image_t *img) static void sycc420_to_rgb(opj_image_t *img)
{ {
int *d0, *d1, *d2, *r, *g, *b, *nr, *ng, *nb; int *d0, *d1, *d2, *r, *g, *b, *nr, *ng, *nb;
const int *y, *cb, *cr, *ny; const int *y, *cb, *cr, *ny;
int maxw, maxh, max, offset, upb; unsigned int maxw, maxh, max;
int i, j; int offset, upb;
unsigned int i, j;
i = img->comps[0].prec; upb = (int)img->comps[0].prec;
offset = 1<<(i - 1); upb = (1<<i)-1; offset = 1<<(upb - 1); upb = (1<<upb)-1;
maxw = img->comps[0].w; maxh = img->comps[0].h; maxw = (unsigned int)img->comps[0].w; maxh = (unsigned int)img->comps[0].h;
max = maxw * maxh; max = maxw * maxh;
y = img->comps[0].data; y = img->comps[0].data;
cb = img->comps[1].data; cb = img->comps[1].data;
cr = img->comps[2].data; cr = img->comps[2].data;
d0 = r = (int*)malloc(sizeof(int) * max); d0 = r = (int*)malloc(sizeof(int) * (size_t)max);
d1 = g = (int*)malloc(sizeof(int) * max); d1 = g = (int*)malloc(sizeof(int) * (size_t)max);
d2 = b = (int*)malloc(sizeof(int) * max); d2 = b = (int*)malloc(sizeof(int) * (size_t)max);
for(i=0; i < maxh; i += 2) for(i=0U; i < (maxh & ~(unsigned int)1U); i += 2U)
{ {
ny = y + maxw; ny = y + maxw;
nr = r + maxw; ng = g + maxw; nb = b + maxw; nr = r + maxw; ng = g + maxw; nb = b + maxw;
for(j=0; j < maxw; j += 2) for(j=0; j < (maxw & ~(unsigned int)1U); j += 2U)
{ {
sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
++y; ++r; ++g; ++b;
sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
++y; ++r; ++g; ++b;
++y; ++r; ++g; ++b; sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb);
++ny; ++nr; ++ng; ++nb;
sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb);
++ny; ++nr; ++ng; ++nb; ++cb; ++cr;
}
if(j < maxw)
{
sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
++y; ++r; ++g; ++b;
sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b); sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb);
++ny; ++nr; ++ng; ++nb; ++cb; ++cr;
}
y += maxw; r += maxw; g += maxw; b += maxw;
}
if(i < maxh)
{
for(j=0U; j < (maxw & ~(unsigned int)1U); j += 2U)
{
sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
++y; ++r; ++g; ++b; ++y; ++r; ++g; ++b;
sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb); sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
++ny; ++nr; ++ng; ++nb; ++y; ++r; ++g; ++b; ++cb; ++cr;
}
if(j < maxw)
{
sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
}
}
sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb);
++ny; ++nr; ++ng; ++nb; ++cb; ++cr;
}
y += maxw; r += maxw; g += maxw; b += maxw;
}
free(img->comps[0].data); img->comps[0].data = d0; free(img->comps[0].data); img->comps[0].data = d0;
free(img->comps[1].data); img->comps[1].data = d1; free(img->comps[1].data); img->comps[1].data = d1;
free(img->comps[2].data); img->comps[2].data = d2; free(img->comps[2].data); img->comps[2].data = d2;
@@ -216,46 +238,45 @@ static void sycc420_to_rgb(opj_image_t *img)
void color_sycc_to_rgb(opj_image_t *img) void color_sycc_to_rgb(opj_image_t *img)
{ {
if(img->numcomps < 3) if(img->numcomps < 3)
{ {
img->color_space = CLRSPC_GRAY; img->color_space = CLRSPC_GRAY;
return; return;
} }
if((img->comps[0].dx == 1) if((img->comps[0].dx == 1)
&& (img->comps[1].dx == 2) && (img->comps[1].dx == 2)
&& (img->comps[2].dx == 2) && (img->comps[2].dx == 2)
&& (img->comps[0].dy == 1) && (img->comps[0].dy == 1)
&& (img->comps[1].dy == 2) && (img->comps[1].dy == 2)
&& (img->comps[2].dy == 2))/* horizontal and vertical sub-sample */ && (img->comps[2].dy == 2))/* horizontal and vertical sub-sample */
{ {
sycc420_to_rgb(img); sycc420_to_rgb(img);
} }
else else
if((img->comps[0].dx == 1) if((img->comps[0].dx == 1)
&& (img->comps[1].dx == 2) && (img->comps[1].dx == 2)
&& (img->comps[2].dx == 2) && (img->comps[2].dx == 2)
&& (img->comps[0].dy == 1) && (img->comps[0].dy == 1)
&& (img->comps[1].dy == 1) && (img->comps[1].dy == 1)
&& (img->comps[2].dy == 1))/* horizontal sub-sample only */ && (img->comps[2].dy == 1))/* horizontal sub-sample only */
{ {
sycc422_to_rgb(img); sycc422_to_rgb(img);
} }
else else
if((img->comps[0].dx == 1) if((img->comps[0].dx == 1)
&& (img->comps[1].dx == 1) && (img->comps[1].dx == 1)
&& (img->comps[2].dx == 1) && (img->comps[2].dx == 1)
&& (img->comps[0].dy == 1) && (img->comps[0].dy == 1)
&& (img->comps[1].dy == 1) && (img->comps[1].dy == 1)
&& (img->comps[2].dy == 1))/* no sub-sample */ && (img->comps[2].dy == 1))/* no sub-sample */
{ {
sycc444_to_rgb(img); sycc444_to_rgb(img);
} }
else else
{ {
fprintf(stderr,"%s:%d:color_sycc_to_rgb\n\tCAN NOT CONVERT\n", fprintf(stderr,"%s:%d:color_sycc_to_rgb\n\tCAN NOT CONVERT\n", __FILE__,__LINE__);
__FILE__,__LINE__); return;
return; }
}
img->color_space = CLRSPC_SRGB; img->color_space = CLRSPC_SRGB;
}/* color_sycc_to_rgb() */ }/* color_sycc_to_rgb() */
@@ -288,7 +309,12 @@ void color_apply_icc_profile(opj_image_t *image)
OPJ_COLOR_SPACE oldspace; OPJ_COLOR_SPACE oldspace;
in_prof = in_prof =
cmsOpenProfileFromMem(image->icc_profile_buf, image->icc_profile_len); cmsOpenProfileFromMem(image->icc_profile_buf, image->icc_profile_len);
#ifdef DEBUG_PROFILE
FILE *icm = fopen("debug.icm","wb");
fwrite( image->icc_profile_buf,1, image->icc_profile_len,icm);
fclose(icm);
#endif
if(in_prof == NULL) return; if(in_prof == NULL) return;
@@ -297,162 +323,207 @@ void color_apply_icc_profile(opj_image_t *image)
intent = cmsGetHeaderRenderingIntent(in_prof); intent = cmsGetHeaderRenderingIntent(in_prof);
max_w = image->comps[0].w; max_h = image->comps[0].h; max_w = (int)image->comps[0].w;
prec = image->comps[0].prec; max_h = (int)image->comps[0].h;
prec = (int)image->comps[0].prec;
oldspace = image->color_space; oldspace = image->color_space;
if(out_space == cmsSigRgbData) /* enumCS 16 */ if(out_space == cmsSigRgbData) /* enumCS 16 */
{ {
in_type = TYPE_RGB_16; if( prec <= 8 )
out_type = TYPE_RGB_16; {
out_prof = cmsCreate_sRGBProfile(); in_type = TYPE_RGB_8;
image->color_space = CLRSPC_SRGB; out_type = TYPE_RGB_8;
} }
else
{
in_type = TYPE_RGB_16;
out_type = TYPE_RGB_16;
}
out_prof = cmsCreate_sRGBProfile();
image->color_space = CLRSPC_SRGB;
}
else if(out_space == cmsSigGrayData) /* enumCS 17 */
{
in_type = TYPE_GRAY_8;
out_type = TYPE_RGB_8;
out_prof = cmsCreate_sRGBProfile();
image->color_space = CLRSPC_SRGB;
}
else if(out_space == cmsSigYCbCrData) /* enumCS 18 */
{
in_type = TYPE_YCbCr_16;
out_type = TYPE_RGB_16;
out_prof = cmsCreate_sRGBProfile();
image->color_space = CLRSPC_SRGB;
}
else else
if(out_space == cmsSigGrayData) /* enumCS 17 */ {
{
in_type = TYPE_GRAY_8;
out_type = TYPE_RGB_8;
out_prof = cmsCreate_sRGBProfile();
image->color_space = CLRSPC_SRGB;
}
else
if(out_space == cmsSigYCbCrData) /* enumCS 18 */
{
in_type = TYPE_YCbCr_16;
out_type = TYPE_RGB_16;
out_prof = cmsCreate_sRGBProfile();
image->color_space = CLRSPC_SRGB;
}
else
{
#ifdef DEBUG_PROFILE #ifdef DEBUG_PROFILE
fprintf(stderr,"%s:%d: color_apply_icc_profile\n\tICC Profile has unknown " fprintf(stderr,"%s:%d: color_apply_icc_profile\n\tICC Profile has unknown "
"output colorspace(%#x)(%c%c%c%c)\n\tICC Profile ignored.\n", "output colorspace(%#x)(%c%c%c%c)\n\tICC Profile ignored.\n",
__FILE__,__LINE__,out_space, __FILE__,__LINE__,out_space,
(out_space>>24) & 0xff,(out_space>>16) & 0xff, (out_space>>24) & 0xff,(out_space>>16) & 0xff,
(out_space>>8) & 0xff, out_space & 0xff); (out_space>>8) & 0xff, out_space & 0xff);
#endif #endif
return; return;
} }
#ifdef DEBUG_PROFILE #ifdef DEBUG_PROFILE
fprintf(stderr,"%s:%d:color_apply_icc_profile\n\tchannels(%d) prec(%d) w(%d) h(%d)" fprintf(stderr,"%s:%d:color_apply_icc_profile\n\tchannels(%d) prec(%d) w(%d) h(%d)"
"\n\tprofile: in(%p) out(%p)\n",__FILE__,__LINE__,image->numcomps,prec, "\n\tprofile: in(%p) out(%p)\n",__FILE__,__LINE__,image->numcomps,prec,
max_w,max_h, (void*)in_prof,(void*)out_prof); max_w,max_h, (void*)in_prof,(void*)out_prof);
fprintf(stderr,"\trender_intent (%u)\n\t" fprintf(stderr,"\trender_intent (%u)\n\t"
"color_space: in(%#x)(%c%c%c%c) out:(%#x)(%c%c%c%c)\n\t" "color_space: in(%#x)(%c%c%c%c) out:(%#x)(%c%c%c%c)\n\t"
" type: in(%u) out:(%u)\n", " type: in(%u) out:(%u)\n",
intent, intent,
in_space, in_space,
(in_space>>24) & 0xff,(in_space>>16) & 0xff, (in_space>>24) & 0xff,(in_space>>16) & 0xff,
(in_space>>8) & 0xff, in_space & 0xff, (in_space>>8) & 0xff, in_space & 0xff,
out_space, out_space,
(out_space>>24) & 0xff,(out_space>>16) & 0xff, (out_space>>24) & 0xff,(out_space>>16) & 0xff,
(out_space>>8) & 0xff, out_space & 0xff, (out_space>>8) & 0xff, out_space & 0xff,
in_type,out_type in_type,out_type
); );
#else
(void)prec;
(void)in_space;
#endif /* DEBUG_PROFILE */ #endif /* DEBUG_PROFILE */
transform = cmsCreateTransform(in_prof, in_type, transform = cmsCreateTransform(in_prof, in_type, out_prof, out_type, intent, 0);
out_prof, out_type, intent, 0);
#ifdef HAVE_LIBLCMS2 #ifdef HAVE_LIBLCMS2
/* Possible for: LCMS_VERSION >= 2000 :*/ /* Possible for: LCMS_VERSION >= 2000 :*/
cmsCloseProfile(in_prof); cmsCloseProfile(in_prof);
cmsCloseProfile(out_prof); cmsCloseProfile(out_prof);
#endif #endif
if(transform == NULL) if(transform == NULL)
{ {
#ifdef DEBUG_PROFILE #ifdef DEBUG_PROFILE
fprintf(stderr,"%s:%d:color_apply_icc_profile\n\tcmsCreateTransform failed. " fprintf(stderr,"%s:%d:color_apply_icc_profile\n\tcmsCreateTransform failed. "
"ICC Profile ignored.\n",__FILE__,__LINE__); "ICC Profile ignored.\n",__FILE__,__LINE__);
#endif #endif
image->color_space = oldspace; image->color_space = oldspace;
#ifdef HAVE_LIBLCMS1 #ifdef HAVE_LIBLCMS1
cmsCloseProfile(in_prof); cmsCloseProfile(in_prof);
cmsCloseProfile(out_prof); cmsCloseProfile(out_prof);
#endif #endif
return; return;
} }
if(image->numcomps > 2)/* RGB, RGBA */ if(image->numcomps > 2)/* RGB, RGBA */
{ {
unsigned short *inbuf, *outbuf, *in, *out; if( prec <= 8 )
max = max_w * max_h; nr_samples = max * 3 * sizeof(unsigned short); {
in = inbuf = (unsigned short*)malloc(nr_samples); unsigned char *inbuf, *outbuf, *in, *out;
out = outbuf = (unsigned short*)malloc(nr_samples); max = max_w * max_h;
nr_samples = (cmsUInt32Number)max * 3 * (cmsUInt32Number)sizeof(unsigned char);
in = inbuf = (unsigned char*)malloc(nr_samples);
out = outbuf = (unsigned char*)malloc(nr_samples);
r = image->comps[0].data; r = image->comps[0].data;
g = image->comps[1].data; g = image->comps[1].data;
b = image->comps[2].data; b = image->comps[2].data;
for(i = 0; i < max; ++i) for(i = 0; i < max; ++i)
{ {
*in++ = (unsigned short)*r++; *in++ = (unsigned char)*r++;
*in++ = (unsigned short)*g++; *in++ = (unsigned char)*g++;
*in++ = (unsigned short)*b++; *in++ = (unsigned char)*b++;
} }
cmsDoTransform(transform, inbuf, outbuf, max); cmsDoTransform(transform, inbuf, outbuf, (cmsUInt32Number)max);
r = image->comps[0].data; r = image->comps[0].data;
g = image->comps[1].data; g = image->comps[1].data;
b = image->comps[2].data; b = image->comps[2].data;
for(i = 0; i < max; ++i) for(i = 0; i < max; ++i)
{ {
*r++ = (int)*out++; *r++ = (int)*out++;
*g++ = (int)*out++; *g++ = (int)*out++;
*b++ = (int)*out++; *b++ = (int)*out++;
} }
free(inbuf); free(outbuf); free(inbuf); free(outbuf);
} }
else
{
unsigned short *inbuf, *outbuf, *in, *out;
max = max_w * max_h;
nr_samples = (cmsUInt32Number)max * 3 * (cmsUInt32Number)sizeof(unsigned short);
in = inbuf = (unsigned short*)malloc(nr_samples);
out = outbuf = (unsigned short*)malloc(nr_samples);
r = image->comps[0].data;
g = image->comps[1].data;
b = image->comps[2].data;
for(i = 0; i < max; ++i)
{
*in++ = (unsigned short)*r++;
*in++ = (unsigned short)*g++;
*in++ = (unsigned short)*b++;
}
cmsDoTransform(transform, inbuf, outbuf, (cmsUInt32Number)max);
r = image->comps[0].data;
g = image->comps[1].data;
b = image->comps[2].data;
for(i = 0; i < max; ++i)
{
*r++ = (int)*out++;
*g++ = (int)*out++;
*b++ = (int)*out++;
}
free(inbuf); free(outbuf);
}
}
else /* GRAY, GRAYA */ else /* GRAY, GRAYA */
{ {
unsigned char *in, *inbuf, *out, *outbuf; unsigned char *in, *inbuf, *out, *outbuf;
max = max_w * max_h;
nr_samples = (cmsUInt32Number)max * 3 * sizeof(unsigned char);
in = inbuf = (unsigned char*)malloc(nr_samples);
out = outbuf = (unsigned char*)malloc(nr_samples);
max = max_w * max_h; nr_samples = max * 3 * sizeof(unsigned char); image->comps = (opj_image_comp_t*)realloc(image->comps, (image->numcomps+2)*sizeof(opj_image_comp_t));
in = inbuf = (unsigned char*)malloc(nr_samples);
out = outbuf = (unsigned char*)malloc(nr_samples);
image->comps = (opj_image_comp_t*) if(image->numcomps == 2)
realloc(image->comps, (image->numcomps+2)*sizeof(opj_image_comp_t)); image->comps[3] = image->comps[1];
if(image->numcomps == 2) image->comps[1] = image->comps[0];
image->comps[3] = image->comps[1]; image->comps[2] = image->comps[0];
image->comps[1] = image->comps[0]; image->comps[1].data = (int*)calloc((size_t)max, sizeof(int));
image->comps[2] = image->comps[0]; image->comps[2].data = (int*)calloc((size_t)max, sizeof(int));
image->comps[1].data = (int*)calloc(max, sizeof(int)); image->numcomps += 2;
image->comps[2].data = (int*)calloc(max, sizeof(int));
image->numcomps += 2; r = image->comps[0].data;
r = image->comps[0].data; for(i = 0; i < max; ++i)
{
*in++ = (unsigned char)*r++;
}
cmsDoTransform(transform, inbuf, outbuf, (cmsUInt32Number)max);
for(i = 0; i < max; ++i) r = image->comps[0].data;
{ g = image->comps[1].data;
*in++ = (unsigned char)*r++; b = image->comps[2].data;
}
cmsDoTransform(transform, inbuf, outbuf, max);
r = image->comps[0].data; for(i = 0; i < max; ++i)
g = image->comps[1].data; {
b = image->comps[2].data; *r++ = (int)*out++; *g++ = (int)*out++; *b++ = (int)*out++;
}
free(inbuf); free(outbuf);
for(i = 0; i < max; ++i) }/* if(image->numcomps */
{
*r++ = (int)*out++; *g++ = (int)*out++; *b++ = (int)*out++;
}
free(inbuf); free(outbuf);
}/* if(image->numcomps */
cmsDeleteTransform(transform); cmsDeleteTransform(transform);

View File

@@ -10,11 +10,7 @@
* 2. Redistributions in binary form must reproduce the above copyright * 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software * 3. Neither the name of the University nor the names of its contributors
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software * may be used to endorse or promote products derived from this software
* without specific prior written permission. * without specific prior written permission.
* *
@@ -42,6 +38,10 @@ static char sccsid[] = "@(#)opj_getopt.c 8.3 (Berkeley) 4/27/95";
#include <string.h> #include <string.h>
#include "opj_getopt.h" #include "opj_getopt.h"
#ifdef USE_SYSTEM_GETOPT
#error
#endif
int opj_opterr = 1, /* if error message should be printed */ int opj_opterr = 1, /* if error message should be printed */
opj_optind = 1, /* index into parent argv vector */ opj_optind = 1, /* index into parent argv vector */
opj_optopt, /* character checked for validity */ opj_optopt, /* character checked for validity */

View File

@@ -1,5 +1,26 @@
/* last review : october 29th, 2002 */ /* last review : october 29th, 2002 */
#include "opj_config.h"
#ifdef USE_SYSTEM_GETOPT
#include <getopt.h>
#define opj_opterr opterr
#define opj_optind optind
#define opj_optopt optopt
#define opj_optreset optreset
#define opj_optarg optarg
typedef struct option opj_option_t;
#define NO_ARG no_argument
#define REQ_ARG required_argument
#define OPT_ARG optional_argument
#define opj_getopt getopt
#define opj_getopt_long getopt_long
#else
#ifndef _GETOPT_H_ #ifndef _GETOPT_H_
#define _GETOPT_H_ #define _GETOPT_H_
@@ -9,7 +30,7 @@ typedef struct opj_option
int has_arg; int has_arg;
int *flag; int *flag;
int val; int val;
}opj_option_t; } opj_option_t;
#define NO_ARG 0 #define NO_ARG 0
#define REQ_ARG 1 #define REQ_ARG 1
@@ -27,3 +48,4 @@ extern int opj_getopt_long(int argc, char * const argv[], const char *optstring,
extern void reset_options_reading(void); extern void reset_options_reading(void);
#endif /* _GETOPT_H_ */ #endif /* _GETOPT_H_ */
#endif /* USE_SYSTEM_GETOPT */

View File

@@ -5,7 +5,14 @@ What's New for OpenJPIP
! : changed ! : changed
+ : added + : added
January 26, 2011 Feburary 28, 2012
+ [kaori] enabled the opj_server to reply the first query consisting with len request from kakadu client
February 9, 2012
* [kaori] fixed Doxygen configuration file to document the utilities
+ [kaori] added execution argument to set port number for opj_dec_server, opj_viewer*
January 26, 2012
! [kaori] unapplied auxtrans_manager to the local mode ! [kaori] unapplied auxtrans_manager to the local mode
December 24, 2011 December 24, 2011

View File

@@ -2,7 +2,10 @@
IF(BUILD_JPIP_SERVER) IF(BUILD_JPIP_SERVER)
FIND_PACKAGE(CURL REQUIRED) FIND_PACKAGE(CURL REQUIRED)
FIND_PACKAGE(FCGI REQUIRED) FIND_PACKAGE(FCGI REQUIRED)
FIND_PACKAGE(PTHREAD REQUIRED) FIND_PACKAGE(Threads REQUIRED)
IF(NOT CMAKE_USE_PTHREADS_INIT)
MESSAGE(FATAL_ERROR "Only pthread are supported")
ENDIF(NOT CMAKE_USE_PTHREADS_INIT)
ENDIF(BUILD_JPIP_SERVER) ENDIF(BUILD_JPIP_SERVER)
# JPIP library: # JPIP library:

View File

@@ -96,7 +96,7 @@ Server:
Client: Client:
1. Launch image decoding server, and keep it alive as long as image viewers are open 1. Launch image decoding server, and keep it alive as long as image viewers are open
% ./opj_dec_server % ./opj_dec_server [portnumber (50000 by default)]
You might prefer to implement this program from another directory since cache files are saved in the working directory. You might prefer to implement this program from another directory since cache files are saved in the working directory.
% mkdir cache % mkdir cache
@@ -104,10 +104,12 @@ Client:
% ../opj_dec_server % ../opj_dec_server
2. Open image viewers (as many as needed) 2. Open image viewers (as many as needed)
% java -jar opj_viewer.jar http://hostname/myFCGI path/filename.jp2 [stateless/session] [jptstream/jppstream] [tcp/udp] % java -jar opj_viewer.jar http://hostname/myFCGI path/filename.jp2 [hostname] [portnumber] [stateless/session] [jptstream/jppstream] [tcp/udp]
( The arguments ( The arguments
- http://hostname/myFCGI is the HTTP server URI (myFCGI refers to opj_server by the server setting) - http://hostname/myFCGI is the HTTP server URI (myFCGI refers to opj_server by the server setting)
- path/filename.jp2 is the server local path or URL of a JP2 file - path/filename.jp2 is the server local path or URL of a JP2 file
- host name of opj_dec_server, localhost by default
- portnumber of opj_dec_server, 50000 by default
- request type stateless for no caching, session (default) for caching - request type stateless for no caching, session (default) for caching
- return media type, JPT-stream tile based stream, or JPP-stream (default) precinct based stream - return media type, JPT-stream tile based stream, or JPP-stream (default) precinct based stream
- auxiliary return protocol, tcp or udp (udp is not implemented yet), if not given, return data is filled in http chunk - auxiliary return protocol, tcp or udp (udp is not implemented yet), if not given, return data is filled in http chunk
@@ -131,7 +133,7 @@ An example to encode a TIF image "copenhague1.tif" at resolution 4780x4050, 8bit
% ./image_to_j2k -i copenhague1.tif -o copenhague1.jp2 -p RPCL -c [64,64] -t 640,480 -jpip -TP R % ./image_to_j2k -i copenhague1.tif -o copenhague1.jp2 -p RPCL -c [64,64] -t 640,480 -jpip -TP R
options options
-jpip : embed index table box into the output JP2 file (obligation for JPIP) -jpip : embed index table 'cidx' box into the output JP2 file (obligation for JPIP)
-TP R : partition a tile into tile parts of different resolution levels (obligation for JPT-stream) -TP R : partition a tile into tile parts of different resolution levels (obligation for JPT-stream)
<Option> <Option>

View File

@@ -568,7 +568,7 @@ WARN_LOGFILE =
# directories like "/usr/src/myproject". Separate the files or directories # directories like "/usr/src/myproject". Separate the files or directories
# with spaces. # with spaces.
INPUT = .. ../libopenjpip ../opj_server ../opj_client/opj_dec_server ../tools ../tools/indexer INPUT = .. ../libopenjpip ../util
# This tag can be used to specify the character encoding of the source files # This tag can be used to specify the character encoding of the source files
# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is

View File

@@ -4,7 +4,6 @@ INCLUDE_DIRECTORIES(
${OPENJPEG_SOURCE_DIR}/libopenjpeg ${OPENJPEG_SOURCE_DIR}/libopenjpeg
${FCGI_INCLUDE_DIRS} ${FCGI_INCLUDE_DIRS}
${CURL_INCLUDE_DIRS} ${CURL_INCLUDE_DIRS}
${PTHREAD_INCLUDE_DIRS}
) )
# Defines the source code for the library # Defines the source code for the library
@@ -63,7 +62,7 @@ INSTALL(TARGETS openjpip_local
IF(BUILD_JPIP_SERVER) IF(BUILD_JPIP_SERVER)
ADD_LIBRARY(openjpip_server STATIC ${OPENJPIP_SRCS} ${SERVER_SRCS}) ADD_LIBRARY(openjpip_server STATIC ${OPENJPIP_SRCS} ${SERVER_SRCS})
TARGET_LINK_LIBRARIES(openjpip_server ${FCGI_LIBRARIES} ${CURL_LIBRARIES} ${PTHREAD_LIBRARIES}) TARGET_LINK_LIBRARIES(openjpip_server ${FCGI_LIBRARIES} ${CURL_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT})
SET_TARGET_PROPERTIES(openjpip_server SET_TARGET_PROPERTIES(openjpip_server
PROPERTIES COMPILE_FLAGS "-DSERVER") PROPERTIES COMPILE_FLAGS "-DSERVER")
INSTALL(TARGETS openjpip_server INSTALL(TARGETS openjpip_server

View File

@@ -46,7 +46,7 @@
#define FCGI_stdout stdout #define FCGI_stdout stdout
#define FCGI_stderr stderr #define FCGI_stderr stderr
#define logstream stderr #define logstream stderr
#endif //SERVER #endif /*SERVER */
auxtrans_param_t init_aux_transport( int tcp_auxport, int udp_auxport) auxtrans_param_t init_aux_transport( int tcp_auxport, int udp_auxport)
{ {
@@ -61,7 +61,7 @@ auxtrans_param_t init_aux_transport( int tcp_auxport, int udp_auxport)
auxtrans.tcplistensock = -1; auxtrans.tcplistensock = -1;
auxtrans.udplistensock = -1; auxtrans.udplistensock = -1;
// open listening socket for udp later /* open listening socket for udp later */
return auxtrans; return auxtrans;
} }
@@ -78,15 +78,15 @@ void close_aux_transport( auxtrans_param_t auxtrans)
} }
//!< auxiliary response parameters /*!< auxiliary response parameters */
typedef struct aux_response_param{ typedef struct aux_response_param{
char *cid; //!< channel ID char *cid; /*!< channel ID */
unsigned char *data; //!< sending data unsigned char *data; /*!< sending data */
int datalen; //!< length of data int datalen; /*!< length of data */
int maxlenPerFrame; //!< maximum data length to send per frame int maxlenPerFrame; /*!< maximum data length to send per frame */
SOCKET listensock; //!< listeing socket SOCKET listensock; /*!< listeing socket */
#ifdef _WIN32 #ifdef _WIN32
HANDLE hTh; //!< thread handle HANDLE hTh; /*!< thread handle */
#endif #endif
} aux_response_param_t; } aux_response_param_t;

View File

@@ -161,7 +161,7 @@ box_param_t * gene_boxbyOffinStream( Byte_t *stream, Byte8_t offset)
} }
box_param_t * gene_boxbyType( int fd, Byte8_t offset, Byte8_t length, char TBox[]) box_param_t * gene_boxbyType( int fd, Byte8_t offset, Byte8_t length, const char TBox[])
{ {
Byte8_t pos; Byte8_t pos;
Byte_t *data; Byte_t *data;
@@ -221,7 +221,7 @@ box_param_t * gene_boxbyType( int fd, Byte8_t offset, Byte8_t length, char TBox[
return NULL; return NULL;
} }
box_param_t * gene_boxbyTypeinStream( Byte_t *stream, Byte8_t offset, Byte8_t length, char TBox[]) box_param_t * gene_boxbyTypeinStream( Byte_t *stream, Byte8_t offset, Byte8_t length, const char TBox[])
{ {
Byte8_t pos; Byte8_t pos;
Byte_t *data; Byte_t *data;
@@ -272,7 +272,7 @@ box_param_t * gene_childboxbyOffset( box_param_t *superbox, Byte8_t offset)
return gene_boxbyOffset( superbox->fd, get_DBoxoff( superbox)+offset); return gene_boxbyOffset( superbox->fd, get_DBoxoff( superbox)+offset);
} }
box_param_t * gene_childboxbyType( box_param_t *superbox, Byte8_t offset, char TBox[]) box_param_t * gene_childboxbyType( box_param_t *superbox, Byte8_t offset, const char TBox[])
{ {
return gene_boxbyType( superbox->fd, get_DBoxoff( superbox)+offset, get_DBoxlen( superbox)-offset, TBox); return gene_boxbyType( superbox->fd, get_DBoxoff( superbox)+offset, get_DBoxlen( superbox)-offset, TBox);
} }
@@ -317,7 +317,7 @@ Byte8_t fetch_DBox8bytebigendian( box_param_t *box, long offset)
return fetch_8bytebigendian( box->fd, get_DBoxoff( box)+offset); return fetch_8bytebigendian( box->fd, get_DBoxoff( box)+offset);
} }
box_param_t * search_box( char type[], boxlist_param_t *boxlist) box_param_t * search_box( const char type[], boxlist_param_t *boxlist)
{ {
box_param_t *foundbox; box_param_t *foundbox;

View File

@@ -97,7 +97,7 @@ box_param_t * gene_boxbyOffinStream( Byte_t *stream, Byte8_t offset);
* @param[in] TBox Box Type * @param[in] TBox Box Type
* @return pointer to the structure of generate/found box parameters * @return pointer to the structure of generate/found box parameters
*/ */
box_param_t * gene_boxbyType( int fd, Byte8_t offset, Byte8_t length, char TBox[]); box_param_t * gene_boxbyType( int fd, Byte8_t offset, Byte8_t length, const char TBox[]);
/** /**
* generate(search) box from code stream * generate(search) box from code stream
@@ -108,7 +108,7 @@ box_param_t * gene_boxbyType( int fd, Byte8_t offset, Byte8_t length, char TBox[
* @param[in] TBox Box Type * @param[in] TBox Box Type
* @return pointer to the structure of generate/found box parameters * @return pointer to the structure of generate/found box parameters
*/ */
box_param_t * gene_boxbyTypeinStream( Byte_t *stream, Byte8_t offset, Byte8_t length, char TBox[]); box_param_t * gene_boxbyTypeinStream( Byte_t *stream, Byte8_t offset, Byte8_t length, const char TBox[]);
/** /**
* generate child box from JP2 file at the given offset * generate child box from JP2 file at the given offset
@@ -127,7 +127,7 @@ box_param_t * gene_childboxbyOffset( box_param_t *superbox, Byte8_t offset);
* @param[in] TBox Box Type * @param[in] TBox Box Type
* @return pointer to the structure of generate/found box parameters * @return pointer to the structure of generate/found box parameters
*/ */
box_param_t * gene_childboxbyType( box_param_t *superbox, Byte8_t offset, char TBox[]); box_param_t * gene_childboxbyType( box_param_t *superbox, Byte8_t offset, const char TBox[]);
/** /**
* get DBox offset * get DBox offset
@@ -210,7 +210,7 @@ Byte8_t fetch_DBox8bytebigendian( box_param_t *box, long offset);
* @param[in] boxlist box list pointer * @param[in] boxlist box list pointer
* @return found box pointer * @return found box pointer
*/ */
box_param_t * search_box( char type[], boxlist_param_t *boxlist); box_param_t * search_box( const char type[], boxlist_param_t *boxlist);
/** /**
* print box parameters * print box parameters

View File

@@ -41,7 +41,7 @@
#define FCGI_stdout stdout #define FCGI_stdout stdout
#define FCGI_stderr stderr #define FCGI_stderr stderr
#define logstream stderr #define logstream stderr
#endif //SERVER #endif /*SERVER*/
boxheader_param_t * gene_boxheader( int fd, Byte8_t offset) boxheader_param_t * gene_boxheader( int fd, Byte8_t offset)
@@ -55,7 +55,7 @@ boxheader_param_t * gene_boxheader( int fd, Byte8_t offset)
boxtype = (char *)fetch_bytes( fd, offset+4, 4); boxtype = (char *)fetch_bytes( fd, offset+4, 4);
headlen = 8; headlen = 8;
if( boxlen == 1){ // read XLBox if( boxlen == 1){ /* read XLBox */
boxlen = fetch_8bytebigendian( fd, offset+8); boxlen = fetch_8bytebigendian( fd, offset+8);
headlen = 16; headlen = 16;
} }

View File

@@ -76,13 +76,13 @@ Byte_t fetch_1byte( int fd, long offset)
if( lseek( fd, offset, SEEK_SET)==-1){ if( lseek( fd, offset, SEEK_SET)==-1){
fprintf( FCGI_stdout, "Reason: Target broken (seek error)\r\n"); fprintf( FCGI_stdout, "Reason: Target broken (seek error)\r\n");
fprintf( FCGI_stderr, "Error: error in fetch_1byte( %d, %ld)\n", fd, offset); fprintf( FCGI_stderr, "Error: error in fetch_1byte( %d, %lld)\n", fd, offset);
return 0; return 0;
} }
if( read( fd, &code, 1) != 1){ if( read( fd, &code, 1) != 1){
fprintf( FCGI_stdout, "Reason: Target broken (read error)\r\n"); fprintf( FCGI_stdout, "Reason: Target broken (read error)\r\n");
fprintf( FCGI_stderr, "Error: error in fetch_bytes( %d, %ld)\n", fd, offset); fprintf( FCGI_stderr, "Error: error in fetch_bytes( %d, %lld)\n", fd, offset);
return 0; return 0;
} }
return code; return code;
@@ -94,7 +94,7 @@ Byte2_t fetch_2bytebigendian( int fd, long offset)
Byte2_t code; Byte2_t code;
if(!(data = fetch_bytes( fd, offset, 2))){ if(!(data = fetch_bytes( fd, offset, 2))){
fprintf( FCGI_stderr, "Error: error in fetch_2bytebigendian( %d, %ld)\n", fd, offset); fprintf( FCGI_stderr, "Error: error in fetch_2bytebigendian( %d, %lld)\n", fd, offset);
return 0; return 0;
} }
code = big2(data); code = big2(data);
@@ -109,7 +109,7 @@ Byte4_t fetch_4bytebigendian( int fd, long offset)
Byte4_t code; Byte4_t code;
if(!(data = fetch_bytes( fd, offset, 4))){ if(!(data = fetch_bytes( fd, offset, 4))){
fprintf( FCGI_stderr, "Error: error in fetch_4bytebigendian( %d, %ld)\n", fd, offset); fprintf( FCGI_stderr, "Error: error in fetch_4bytebigendian( %d, %lld)\n", fd, offset);
return 0; return 0;
} }
code = big4(data); code = big4(data);
@@ -124,7 +124,7 @@ Byte8_t fetch_8bytebigendian( int fd, long offset)
Byte8_t code; Byte8_t code;
if(!(data = fetch_bytes( fd, offset, 8))){ if(!(data = fetch_bytes( fd, offset, 8))){
fprintf( FCGI_stderr, "Error: error in fetch_8bytebigendian( %d, %ld)\n", fd, offset); fprintf( FCGI_stderr, "Error: error in fetch_8bytebigendian( %d, %lld)\n", fd, offset);
return 0; return 0;
} }
code = big8(data); code = big8(data);

View File

@@ -29,19 +29,29 @@
*/ */
#ifndef BYTE_MANAGER_H_ #ifndef BYTE_MANAGER_H_
# define BYTE_MANAGER_H_ #define BYTE_MANAGER_H_
#include "opj_config.h"
#ifdef HAVE_STDINT_H
#include <stdint.h>
typedef uint8_t Byte_t;
typedef uint16_t Byte2_t;
typedef uint32_t Byte4_t;
typedef uint64_t Byte8_t;
#else
#if defined(_WIN32)
/** 1Byte parameter type*/ /** 1Byte parameter type*/
typedef unsigned char Byte_t; typedef unsigned __int8 Byte_t;
/** 2Byte parameter type*/ /** 2Byte parameter type*/
typedef unsigned short int Byte2_t; typedef unsigned __int16 Byte2_t;
/** 4Byte parameter type*/ /** 4Byte parameter type*/
typedef unsigned int Byte4_t; typedef unsigned __int32 Byte4_t;
/** 8Byte parameter type*/ /** 8Byte parameter type*/
typedef unsigned long long int Byte8_t; typedef unsigned __int64 Byte8_t;
#else
#error unsupported platform
#endif
#endif
/** /**

View File

@@ -40,10 +40,10 @@
#define FCGI_stdout stdout #define FCGI_stdout stdout
#define FCGI_stderr stderr #define FCGI_stderr stderr
#define logstream stderr #define logstream stderr
#endif //SERVER #endif /*SERVER*/
cachemodellist_param_t * gene_cachemodellist() cachemodellist_param_t * gene_cachemodellist(void)
{ {
cachemodellist_param_t *cachemodellist; cachemodellist_param_t *cachemodellist;
@@ -73,7 +73,7 @@ cachemodel_param_t * gene_cachemodel( cachemodellist_param_t *cachemodellist, ta
cachemodel->jppstream = true; cachemodel->jppstream = true;
else else
cachemodel->jppstream = false; cachemodel->jppstream = false;
} else{ // reqJPT } else{ /* reqJPT */
if( target->jptstream) if( target->jptstream)
cachemodel->jppstream = false; cachemodel->jppstream = false;
else else
@@ -95,9 +95,9 @@ cachemodel_param_t * gene_cachemodel( cachemodellist_param_t *cachemodellist, ta
cachemodel->next = NULL; cachemodel->next = NULL;
if( cachemodellist){ if( cachemodellist){
if( cachemodellist->first) // there are one or more entries if( cachemodellist->first) /* there are one or more entries */
cachemodellist->last->next = cachemodel; cachemodellist->last->next = cachemodel;
else // first entry else /* first entry */
cachemodellist->first = cachemodel; cachemodellist->first = cachemodel;
cachemodellist->last = cachemodel; cachemodellist->last = cachemodel;
} }
@@ -112,9 +112,10 @@ cachemodel_param_t * gene_cachemodel( cachemodellist_param_t *cachemodellist, ta
void print_cachemodel( cachemodel_param_t cachemodel) void print_cachemodel( cachemodel_param_t cachemodel)
{ {
target_param_t *target; target_param_t *target;
Byte8_t TPnum; // num of tile parts in each tile Byte8_t TPnum; /* num of tile parts in each tile */
Byte8_t Pmax; // max num of packets per tile Byte8_t Pmax; /* max num of packets per tile */
int i, j, k, n; Byte8_t i, j, k;
int n; /* FIXME: Is this large enough ? */
target = cachemodel.target; target = cachemodel.target;
@@ -135,9 +136,9 @@ void print_cachemodel( cachemodel_param_t cachemodel)
fprintf( logstream, "\t tile header and precinct packet model:\n"); fprintf( logstream, "\t tile header and precinct packet model:\n");
for( i=0; i<target->codeidx->SIZ.XTnum*target->codeidx->SIZ.YTnum; i++){ for( i=0; i<target->codeidx->SIZ.XTnum*target->codeidx->SIZ.YTnum; i++){
fprintf( logstream, "\t tile.%d %d\n", i, cachemodel.th_model[i]); fprintf( logstream, "\t tile.%llud %d\n", i, cachemodel.th_model[i]);
for( j=0; j<target->codeidx->SIZ.Csiz; j++){ for( j=0; j<target->codeidx->SIZ.Csiz; j++){
fprintf( logstream, "\t compo.%d: ", j); fprintf( logstream, "\t compo.%llud: ", j);
Pmax = get_nmax( target->codeidx->precpacket[j]); Pmax = get_nmax( target->codeidx->precpacket[j]);
for( k=0; k<Pmax; k++) for( k=0; k<Pmax; k++)
fprintf( logstream, "%d", cachemodel.pp_model[j][i*Pmax+k]); fprintf( logstream, "%d", cachemodel.pp_model[j][i*Pmax+k]);
@@ -197,9 +198,10 @@ void delete_cachemodel( cachemodel_param_t **cachemodel)
bool is_allsent( cachemodel_param_t cachemodel) bool is_allsent( cachemodel_param_t cachemodel)
{ {
target_param_t *target; target_param_t *target;
Byte8_t TPnum; // num of tile parts in each tile Byte8_t TPnum; /* num of tile parts in each tile */
Byte8_t Pmax; // max num of packets per tile Byte8_t Pmax; /* max num of packets per tile */
int i, j, k, n; Byte8_t i, j, k;
int n; /* FIXME: is this large enough ? */
target = cachemodel.target; target = cachemodel.target;

View File

@@ -57,7 +57,7 @@ typedef struct cachemodellist_param{
* *
* @return pointer to the generated cache model list * @return pointer to the generated cache model list
*/ */
cachemodellist_param_t * gene_cachemodellist(); cachemodellist_param_t * gene_cachemodellist(void);
/** /**
* generate a cache model under a list * generate a cache model under a list

View File

@@ -32,6 +32,9 @@
#include <string.h> #include <string.h>
#include <stdio.h> #include <stdio.h>
#include "channel_manager.h" #include "channel_manager.h"
#ifdef _WIN32
#define snprintf _snprintf /* Visual Studio */
#endif
#ifdef SERVER #ifdef SERVER
#include "fcgi_stdio.h" #include "fcgi_stdio.h"
@@ -40,9 +43,9 @@
#define FCGI_stdout stdout #define FCGI_stdout stdout
#define FCGI_stderr stderr #define FCGI_stderr stderr
#define logstream stderr #define logstream stderr
#endif //SERVER #endif /*SERVER */
channellist_param_t * gene_channellist() channellist_param_t * gene_channellist(void)
{ {
channellist_param_t *channellist; channellist_param_t *channellist;
@@ -68,12 +71,12 @@ channel_param_t * gene_channel( query_param_t query_param, auxtrans_param_t auxt
channel = (channel_param_t *)malloc( sizeof(channel_param_t)); channel = (channel_param_t *)malloc( sizeof(channel_param_t));
channel->cachemodel = cachemodel; channel->cachemodel = cachemodel;
// set channel ID and get present time /* set channel ID and get present time */
snprintf( channel->cid, MAX_LENOFCID, "%x%x", (unsigned int)time( &channel->start_tm), (unsigned int)rand()); snprintf( channel->cid, MAX_LENOFCID, "%x%x", (unsigned int)time( &channel->start_tm), (unsigned int)rand());
channel->aux = query_param.cnew; channel->aux = query_param.cnew;
// only tcp implemented for now /* only tcp implemented for now */
if( channel->aux == udp) if( channel->aux == udp)
channel->aux = tcp; channel->aux = tcp;
@@ -101,7 +104,9 @@ channel_param_t * gene_channel( query_param_t query_param, auxtrans_param_t auxt
void set_channel_variable_param( query_param_t query_param, channel_param_t *channel) void set_channel_variable_param( query_param_t query_param, channel_param_t *channel)
{ {
// set roi information /* set roi information */
(void)query_param;
(void)channel;
} }

View File

@@ -62,7 +62,7 @@ typedef struct channellist_param{
* *
* @return pointer to the generated channel list * @return pointer to the generated channel list
*/ */
channellist_param_t * gene_channellist(); channellist_param_t * gene_channellist(void);
/** /**

View File

@@ -38,7 +38,7 @@
#define FCGI_stdout stdout #define FCGI_stdout stdout
#define FCGI_stderr stderr #define FCGI_stderr stderr
#define logstream stderr #define logstream stderr
#endif //SERVER #endif /*SERVER */
codestream_param_t set_codestream( int fd, Byte8_t offset, Byte8_t length) codestream_param_t set_codestream( int fd, Byte8_t offset, Byte8_t length)
{ {

View File

@@ -1,29 +0,0 @@
ifdef jpipserver
CFLAGS = -O3 -Wall -m32 -DSERVER
LIBNAME = libopenjpip_server.a
else
J2KINCDIR = ../../../libopenjpeg
CFLAGS = -O3 -Wall -I$(J2KINCDIR)
LIBNAME = libopenjpip_local.a
endif
all: $(LIBNAME)
ifdef jpipserver
$(LIBNAME): openjpip.o target_manager.o byte_manager.o box_manager.o boxheader_manager.o manfbox_manager.o \
mhixbox_manager.o marker_manager.o codestream_manager.o faixbox_manager.o index_manager.o \
msgqueue_manager.o metadata_manager.o placeholder_manager.o ihdrbox_manager.o imgreg_manager.o \
cachemodel_manager.o j2kheader_manager.o jp2k_encoder.o query_parser.o channel_manager.o \
session_manager.o jpip_parser.o sock_manager.o auxtrans_manager.o
ar r $@ $^
else
$(LIBNAME): openjpip.o target_manager.o byte_manager.o box_manager.o boxheader_manager.o manfbox_manager.o \
mhixbox_manager.o marker_manager.o codestream_manager.o faixbox_manager.o index_manager.o \
msgqueue_manager.o metadata_manager.o placeholder_manager.o ihdrbox_manager.o imgreg_manager.o \
cachemodel_manager.o j2kheader_manager.o jp2k_encoder.o query_parser.o channel_manager.o \
session_manager.o jpip_parser.o jp2k_decoder.o imgsock_manager.o jpipstream_manager.o cache_manager.o \
dec_clientmsg_handler.o sock_manager.o
ar r $@ $^
endif
clean:
rm -f $(LIBNAME) *.o *~

View File

@@ -40,7 +40,7 @@
#define FCGI_stdout stdout #define FCGI_stdout stdout
#define FCGI_stderr stderr #define FCGI_stderr stderr
#define logstream stderr #define logstream stderr
#endif //SERVER #endif /*SERVER*/
imgreg_param_t map_viewin2imgreg( const int fx, const int fy, imgreg_param_t map_viewin2imgreg( const int fx, const int fy,
const int rx, const int ry, const int rx, const int ry,
@@ -106,13 +106,13 @@ void find_level( int maxlev, int *lev, int *fx, int *fy, int *xmin, int *ymin, i
int xwidth = *xmax - *xmin; int xwidth = *xmax - *xmin;
int ywidth = *ymax - *ymin; int ywidth = *ymax - *ymin;
/// Find smaller frame size for now (i.e. assume "round-down"). /* Find smaller frame size for now (i.e. assume "round-down"). */
if ((*fx < 1 && xwidth != 0) || (*fy < 1 && ywidth != 0)){ if ((*fx < 1 && xwidth != 0) || (*fy < 1 && ywidth != 0)){
fprintf( FCGI_stderr, "Frame size must be strictly positive"); fprintf( FCGI_stderr, "Frame size must be strictly positive");
exit(-1); exit(-1);
} }
else if( *lev < maxlev-1 && ( *fx < xwidth || *fy < ywidth)) { else if( *lev < maxlev-1 && ( *fx < xwidth || *fy < ywidth)) {
// Simulate the ceil function. /* Simulate the ceil function. */
*xmin = ceil((double)*xmin/(double)2.0); *xmin = ceil((double)*xmin/(double)2.0);
*ymin = ceil((double)*ymin/(double)2.0); *ymin = ceil((double)*ymin/(double)2.0);
*xmax = ceil((double)*xmax/(double)2.0); *xmax = ceil((double)*xmax/(double)2.0);
@@ -149,5 +149,7 @@ void print_imgreg( imgreg_param_t imgreg)
fprintf( logstream, "\t roff: %d, %d\n", imgreg.ox, imgreg.oy); fprintf( logstream, "\t roff: %d, %d\n", imgreg.ox, imgreg.oy);
fprintf( logstream, "\t rsiz: %d, %d\n", imgreg.sx, imgreg.sy); fprintf( logstream, "\t rsiz: %d, %d\n", imgreg.sx, imgreg.sy);
fprintf( logstream, "\t level: %d\n", imgreg.level); fprintf( logstream, "\t level: %d\n", imgreg.level);
#else
(void)imgreg;
#endif #endif
} }

View File

@@ -31,14 +31,14 @@
#ifndef IMGREG_MANAGER_H_ #ifndef IMGREG_MANAGER_H_
# define IMGREG_MANAGER_H_ # define IMGREG_MANAGER_H_
//! image region parameters /** image region parameters */
typedef struct imgreg_param{ typedef struct imgreg_param{
int xosiz, yosiz; //!< offset from the origin of the reference grid int xosiz, yosiz; /** offset from the origin of the reference grid
//!at the decomposition level at the decomposition level */
int fx, fy; //!< frame size (fsiz) int fx, fy; /** frame size (fsiz) */
int ox, oy; //!< offset (roff) int ox, oy; /** offset (roff) */
int sx, sy; //!< region size (rsiz) int sx, sy; /** region size (rsiz) */
int level; //!< decomposition level int level; /** decomposition level */
} imgreg_param_t; } imgreg_param_t;

View File

@@ -42,7 +42,7 @@
#define FCGI_stdout stdout #define FCGI_stdout stdout
#define FCGI_stderr stderr #define FCGI_stderr stderr
#define logstream stderr #define logstream stderr
#endif //SERVER #endif /*SERVER */
SIZmarker_param_t get_SIZmkrdata_from_j2kstream( Byte_t *SIZstream); SIZmarker_param_t get_SIZmkrdata_from_j2kstream( Byte_t *SIZstream);
@@ -76,7 +76,7 @@ bool get_mainheader_from_j2kstream( Byte_t *j2kstream, SIZmarker_param_t *SIZ, C
SIZmarker_param_t get_SIZmkrdata_from_j2kstream( Byte_t *SIZstream) SIZmarker_param_t get_SIZmkrdata_from_j2kstream( Byte_t *SIZstream)
{ {
SIZmarker_param_t SIZ ={0}; SIZmarker_param_t SIZ = {0};
int i; int i;
if( *SIZstream++ != 0xff || *SIZstream++ != 0x51){ if( *SIZstream++ != 0xff || *SIZstream++ != 0x51){
@@ -115,6 +115,13 @@ CODmarker_param_t get_CODmkrdata_from_j2kstream( Byte_t *CODstream)
if( *CODstream++ != 0xff || *CODstream++ != 0x52){ if( *CODstream++ != 0xff || *CODstream++ != 0x52){
fprintf( FCGI_stderr, "Error, COD marker not found in the reconstructed j2kstream\n"); fprintf( FCGI_stderr, "Error, COD marker not found in the reconstructed j2kstream\n");
COD.Lcod = 0;
COD.Scod = 0;
COD.prog_order = 0;
COD.numOflayers = 0;
COD.numOfdecomp = 0;
COD.XPsiz = 0;
COD.YPsiz = 0;
return COD; return COD;
} }
@@ -129,7 +136,7 @@ CODmarker_param_t get_CODmkrdata_from_j2kstream( Byte_t *CODstream)
COD.YPsiz = (Byte4_t *)malloc( (COD.numOfdecomp+1)*sizeof(Byte4_t)); COD.YPsiz = (Byte4_t *)malloc( (COD.numOfdecomp+1)*sizeof(Byte4_t));
for( i=0; i<=COD.numOfdecomp; i++){ for( i=0; i<=COD.numOfdecomp; i++){
//precinct size /*precinct size */
COD.XPsiz[i] = pow( 2, *( CODstream+12+i) & 0x0F); COD.XPsiz[i] = pow( 2, *( CODstream+12+i) & 0x0F);
COD.YPsiz[i] = pow( 2, (*( CODstream+12+i) & 0xF0) >> 4); COD.YPsiz[i] = pow( 2, (*( CODstream+12+i) & 0xF0) >> 4);
} }
@@ -188,7 +195,7 @@ bool modify_SIZmkrstream( SIZmarker_param_t SIZ, int difOfdecomplev, Byte_t *SIZ
SIZ.YTOsiz = ceil( (double)SIZ.YTOsiz/2.0); SIZ.YTOsiz = ceil( (double)SIZ.YTOsiz/2.0);
} }
SIZstream += 4; // skip Lsiz + Rsiz SIZstream += 4; /* skip Lsiz + Rsiz */
modify_4Bytecode( SIZ.Xsiz, SIZstream); modify_4Bytecode( SIZ.Xsiz, SIZstream);
modify_4Bytecode( SIZ.Ysiz, SIZstream+4); modify_4Bytecode( SIZ.Ysiz, SIZstream+4);
@@ -222,9 +229,9 @@ Byte2_t modify_CODmkrstream( CODmarker_param_t COD, int numOfdecomp, Byte_t *COD
CODstream += 2; CODstream += 2;
} }
CODstream += 5; // skip Scod & SGcod CODstream += 5; /* skip Scod & SGcod */
// SPcod /* SPcod */
*CODstream++ = (Byte_t) numOfdecomp; *CODstream++ = (Byte_t) numOfdecomp;
return newLcod; return newLcod;
@@ -234,7 +241,7 @@ bool modify_COCmkrstream( int numOfdecomp, Byte_t *COCstream, Byte2_t Csiz, Byte
bool modify_tileheader( Byte_t *j2kstream, Byte8_t SOToffset, int numOfdecomp, Byte2_t Csiz, Byte8_t *j2klen) bool modify_tileheader( Byte_t *j2kstream, Byte8_t SOToffset, int numOfdecomp, Byte2_t Csiz, Byte8_t *j2klen)
{ {
Byte4_t Psot; // tile part length ref A.4.2 Start of tile-part SOT Byte4_t Psot; /* tile part length ref A.4.2 Start of tile-part SOT */
Byte_t *thstream, *SOTstream, *Psot_stream; Byte_t *thstream, *SOTstream, *Psot_stream;
Byte2_t oldLcoc, newLcoc; Byte2_t oldLcoc, newLcoc;
@@ -245,14 +252,14 @@ bool modify_tileheader( Byte_t *j2kstream, Byte8_t SOToffset, int numOfdecomp, B
return false; return false;
} }
SOTstream += 4; // skip Lsot & Isot SOTstream += 4; /* skip Lsot & Isot */
Psot = (SOTstream[0]<<24)+(SOTstream[1]<<16)+(SOTstream[2]<<8)+(SOTstream[3]); Psot = (SOTstream[0]<<24)+(SOTstream[1]<<16)+(SOTstream[2]<<8)+(SOTstream[3]);
Psot_stream = SOTstream; Psot_stream = SOTstream;
thstream += 12; // move to next marker (SOT always 12bytes) thstream += 12; /* move to next marker (SOT always 12bytes) */
while( !( *thstream == 0xff && *(thstream+1) == 0x93)){ // search SOD while( !( *thstream == 0xff && *(thstream+1) == 0x93)){ /* search SOD */
if( numOfdecomp != -1 && *thstream == 0xff && *(thstream+1) == 0x53){ // COC if( numOfdecomp != -1 && *thstream == 0xff && *(thstream+1) == 0x53){ /* COC */
if( !modify_COCmkrstream( numOfdecomp, thstream, Csiz, &oldLcoc, &newLcoc)) if( !modify_COCmkrstream( numOfdecomp, thstream, Csiz, &oldLcoc, &newLcoc))
return false; return false;
@@ -260,7 +267,7 @@ bool modify_tileheader( Byte_t *j2kstream, Byte8_t SOToffset, int numOfdecomp, B
*j2klen -= ( oldLcoc - newLcoc); *j2klen -= ( oldLcoc - newLcoc);
} }
thstream += 2; thstream += 2;
thstream += ((thstream[0]<<8)+(thstream[1])); // marker length thstream += ((thstream[0]<<8)+(thstream[1])); /* marker length */
} }
if( (*j2klen)-SOToffset != Psot){ if( (*j2klen)-SOToffset != Psot){
@@ -282,7 +289,7 @@ bool modify_COCmkrstream( int numOfdecomp, Byte_t *COCstream, Byte2_t Csiz, Byte
*COCstream++ = (Byte_t)((Byte2_t)((*newLcoc) & 0xff00) >> 8); *COCstream++ = (Byte_t)((Byte2_t)((*newLcoc) & 0xff00) >> 8);
*COCstream++ = (Byte_t)((*newLcoc) & 0x00ff); *COCstream++ = (Byte_t)((*newLcoc) & 0x00ff);
if( Csiz < 257) COCstream +=2; // skip Ccoc & Scoc if( Csiz < 257) COCstream +=2; /* skip Ccoc & Scoc */
else COCstream += 3; else COCstream += 3;
*COCstream = numOfdecomp; *COCstream = numOfdecomp;

View File

@@ -125,7 +125,8 @@ void warning_callback(const char *msg, void *client_data) {
*/ */
void info_callback(const char *msg, void *client_data) { void info_callback(const char *msg, void *client_data) {
(void)client_data; (void)client_data;
// fprintf(stdout, "[INFO] %s", msg); (void)msg;
/* fprintf(stdout, "[INFO] %s", msg); */
} }
@@ -190,7 +191,7 @@ Byte_t * imagetopnm(opj_image_t *image, ihdrbox_param_t **ihdrbox)
r = image->comps[0].data[i]; r = image->comps[0].data[i];
r += (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0); r += (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0);
// if( adjustR > 0) /* if( adjustR > 0) */
*(ptr++) = (Byte_t) ((r >> adjustR)+((r >> (adjustR-1))%2)); *(ptr++) = (Byte_t) ((r >> adjustR)+((r >> (adjustR-1))%2));
if( image->numcomps == 3){ if( image->numcomps == 3){

View File

@@ -45,7 +45,7 @@
#define FCGI_stdout stdout #define FCGI_stdout stdout
#define FCGI_stderr stderr #define FCGI_stderr stderr
#define logstream stderr #define logstream stderr
#endif //SERVER #endif /*SERVER*/
/** /**
@@ -105,11 +105,11 @@ Byte_t * recons_jp2( msgqueue_param_t *msgqueue, Byte_t *jpipstream, Byte8_t csn
if( ptr->phld){ if( ptr->phld){
if( strncmp( (char *)ptr->phld->OrigBH+4, "jp2c", 4) == 0){ if( strncmp( (char *)ptr->phld->OrigBH+4, "jp2c", 4) == 0){
jp2cDBoxOffset = *jp2len + ptr->phld->OrigBHlen; jp2cDBoxOffset = *jp2len + ptr->phld->OrigBHlen;
jp2stream = add_emptyboxstream( ptr->phld, jp2stream, jp2len); // header only jp2stream = add_emptyboxstream( ptr->phld, jp2stream, jp2len); /* header only */
jp2cDBoxlen = *jp2len - jp2cDBoxOffset; jp2cDBoxlen = *jp2len - jp2cDBoxOffset;
} }
else else
jp2stream = add_emptyboxstream( ptr->phld, jp2stream, jp2len); // header only jp2stream = add_emptyboxstream( ptr->phld, jp2stream, jp2len); /* header only */
} }
jp2stream = add_msgstream( ptr, jpipstream, jp2stream, jp2len); jp2stream = add_msgstream( ptr, jpipstream, jp2stream, jp2len);
ptr = ptr->next; ptr = ptr->next;
@@ -203,7 +203,7 @@ Byte_t * recons_codestream_from_JPTstream( msgqueue_param_t *msgqueue, Byte_t *j
} }
ptr = msgqueue->first; ptr = msgqueue->first;
while(( ptr = search_message( EXT_TILE_MSG, tileID, csn, ptr))!=NULL){ while(( ptr = search_message( EXT_TILE_MSG, tileID, csn, ptr))!=NULL){
if( ptr->aux > mindeclev){ if( ptr->aux > mindeclev){ /* FIXME: pointer comparison ? */
if( ptr->bin_offset == binOffset){ if( ptr->bin_offset == binOffset){
found = true; found = true;
j2kstream = add_msgstream( ptr, jpipstream, j2kstream, j2klen); j2kstream = add_msgstream( ptr, jpipstream, j2kstream, j2klen);
@@ -625,7 +625,7 @@ Byte8_t get_last_tileID( msgqueue_param_t *msgqueue, Byte8_t csn, bool isJPPstre
message_param_t * search_message( Byte8_t class_id, Byte8_t in_class_id, Byte8_t csn, message_param_t *msg) message_param_t * search_message( Byte8_t class_id, Byte8_t in_class_id, Byte8_t csn, message_param_t *msg)
{ {
while( msg != NULL){ while( msg != NULL){
if( in_class_id == -1){ if( in_class_id == (Byte8_t)-1){
if( msg->class_id == class_id && msg->csn == csn) if( msg->class_id == class_id && msg->csn == csn)
return msg; return msg;
} }

View File

@@ -43,7 +43,7 @@
#define FCGI_stdout stdout #define FCGI_stdout stdout
#define FCGI_stderr stderr #define FCGI_stderr stderr
#define logstream stderr #define logstream stderr
#endif //SERVER #endif /*SERVER*/
bool identify_target( query_param_t query_param, targetlist_param_t *targetlist, target_param_t **target) bool identify_target( query_param_t query_param, targetlist_param_t *targetlist, target_param_t **target)
@@ -132,35 +132,35 @@ bool close_channel( query_param_t query_param,
#ifndef SERVER #ifndef SERVER
fprintf( logstream, "local log: close all\n"); fprintf( logstream, "local log: close all\n");
#endif #endif
// all channels associatd with the session will be closed /* all channels associatd with the session will be closed */
if( !delete_session( cursession, sessionlist)) if( !delete_session( cursession, sessionlist))
return false; return false;
} }
else{ else{
// check if all entry belonging to the same session /* check if all entry belonging to the same session */
for( i=0, cclose=query_param.cclose; i<query_param.numOfcclose; i++, cclose += (strlen(cclose)+1)){ for( i=0, cclose=query_param.cclose; i<query_param.numOfcclose; i++, cclose += (strlen(cclose)+1)){
// In case of the first entry of close cid /* In case of the first entry of close cid */
if( *cursession == NULL){ if( *cursession == NULL){
if( !search_session_and_channel( cclose, sessionlist, cursession, curchannel)) if( !search_session_and_channel( cclose, sessionlist, cursession, curchannel))
return false; return false;
} }
else // second or more entry of close cid else /* second or more entry of close cid */
if( !(*curchannel=search_channel( cclose, (*cursession)->channellist))){ if( !(*curchannel=search_channel( cclose, (*cursession)->channellist))){
fprintf( FCGI_stdout, "Reason: Cclose id %s is from another session\r\n", cclose); fprintf( FCGI_stdout, "Reason: Cclose id %s is from another session\r\n", cclose);
return false; return false;
} }
} }
// delete channels /* delete channels */
for( i=0, cclose=query_param.cclose; i<query_param.numOfcclose; i++, cclose += (strlen(cclose)+1)){ for( i=0, cclose=query_param.cclose; i<query_param.numOfcclose; i++, cclose += (strlen(cclose)+1)){
*curchannel = search_channel( cclose, (*cursession)->channellist); *curchannel = search_channel( cclose, (*cursession)->channellist);
delete_channel( curchannel, (*cursession)->channellist); delete_channel( curchannel, (*cursession)->channellist);
} }
if( (*cursession)->channellist->first == NULL || (*cursession)->channellist->last == NULL) if( (*cursession)->channellist->first == NULL || (*cursession)->channellist->last == NULL)
// In case of empty session /* In case of empty session */
delete_session( cursession, sessionlist); delete_session( cursession, sessionlist);
} }
return true; return true;
@@ -181,8 +181,9 @@ void enqueue_imagedata( query_param_t query_param, msgqueue_param_t *msgqueue);
* @param[in] query_param structured query * @param[in] query_param structured query
* @param[in] metadatalist pointer to metadata bin list * @param[in] metadatalist pointer to metadata bin list
* @param[in,out] msgqueue message queue pointer * @param[in,out] msgqueue message queue pointer
* @return if succeeded (true) or failed (false)
*/ */
void enqueue_metabins( query_param_t query_param, metadatalist_param_t *metadatalist, msgqueue_param_t *msgqueue); bool enqueue_metabins( query_param_t query_param, metadatalist_param_t *metadatalist, msgqueue_param_t *msgqueue);
bool gene_JPIPstream( query_param_t query_param, bool gene_JPIPstream( query_param_t query_param,
@@ -194,14 +195,14 @@ bool gene_JPIPstream( query_param_t query_param,
index_param_t *codeidx; index_param_t *codeidx;
cachemodel_param_t *cachemodel; cachemodel_param_t *cachemodel;
if( !cursession || !curchannel){ // stateless if( !cursession || !curchannel){ /* stateless */
if( !target) if( !target)
return false; return false;
if( !(cachemodel = gene_cachemodel( NULL, target, query_param.return_type==JPPstream))) if( !(cachemodel = gene_cachemodel( NULL, target, query_param.return_type==JPPstream)))
return false; return false;
*msgqueue = gene_msgqueue( true, cachemodel); *msgqueue = gene_msgqueue( true, cachemodel);
} }
else{ // session else{ /* session */
cachemodel = curchannel->cachemodel; cachemodel = curchannel->cachemodel;
target = cachemodel->target; target = cachemodel->target;
*msgqueue = gene_msgqueue( false, cachemodel); *msgqueue = gene_msgqueue( false, cachemodel);
@@ -221,16 +222,22 @@ bool gene_JPIPstream( query_param_t query_param,
} }
} }
//meta /*meta*/
if( query_param.box_type[0][0] != 0 && query_param.len != 0) if( query_param.box_type[0][0] != 0 && query_param.len != 0)
enqueue_metabins( query_param, codeidx->metadatalist, *msgqueue); if( !enqueue_metabins( query_param, codeidx->metadatalist, *msgqueue))
return false;
// image codestream if( query_param.metadata_only)
if( query_param.fx > 0 && query_param.fy > 0){ return true;
if( !cachemodel->mhead_model && query_param.len != 0)
/* main header */
if( !cachemodel->mhead_model && query_param.len != 0)
enqueue_mainheader( *msgqueue); enqueue_mainheader( *msgqueue);
/* image codestream */
if( (query_param.fx > 0 && query_param.fy > 0))
enqueue_imagedata( query_param, *msgqueue); enqueue_imagedata( query_param, *msgqueue);
}
return true; return true;
} }
@@ -270,13 +277,13 @@ void enqueue_imagedata( query_param_t query_param, msgqueue_param_t *msgqueue)
index_param_t *codeidx; index_param_t *codeidx;
imgreg_param_t imgreg; imgreg_param_t imgreg;
range_param_t tile_Xrange, tile_Yrange; range_param_t tile_Xrange, tile_Yrange;
int u, v, tile_id; Byte4_t u, v, tile_id;
int xmin, xmax, ymin, ymax; int xmin, xmax, ymin, ymax;
int numOfreslev; int numOfreslev;
codeidx = msgqueue->cachemodel->target->codeidx; codeidx = msgqueue->cachemodel->target->codeidx;
if( !(msgqueue->cachemodel->jppstream) && get_nmax( codeidx->tilepart) == 1) // normally not the case if( !(msgqueue->cachemodel->jppstream) && get_nmax( codeidx->tilepart) == 1) /* normally not the case */
numOfreslev = 1; numOfreslev = 1;
else else
numOfreslev = codeidx->COD.numOfdecomp+1; numOfreslev = codeidx->COD.numOfdecomp+1;
@@ -296,20 +303,20 @@ void enqueue_imagedata( query_param_t query_param, msgqueue_param_t *msgqueue)
tile_Xrange = get_tile_Xrange( codeidx->SIZ, tile_id, imgreg.level); tile_Xrange = get_tile_Xrange( codeidx->SIZ, tile_id, imgreg.level);
if( tile_Xrange.minvalue < tile_Xrange.maxvalue && tile_Yrange.minvalue < tile_Yrange.maxvalue){ if( tile_Xrange.minvalue < tile_Xrange.maxvalue && tile_Yrange.minvalue < tile_Yrange.maxvalue){
if( tile_Xrange.maxvalue <= imgreg.xosiz + imgreg.ox || if( tile_Xrange.maxvalue <= (Byte4_t)(imgreg.xosiz + imgreg.ox) ||
tile_Xrange.minvalue >= imgreg.xosiz + imgreg.ox + imgreg.sx || tile_Xrange.minvalue >= (Byte4_t)(imgreg.xosiz + imgreg.ox + imgreg.sx) ||
tile_Yrange.maxvalue <= imgreg.yosiz + imgreg.oy || tile_Yrange.maxvalue <= (Byte4_t)(imgreg.yosiz + imgreg.oy) ||
tile_Yrange.minvalue >= imgreg.yosiz + imgreg.oy + imgreg.sy) { tile_Yrange.minvalue >= (Byte4_t)(imgreg.yosiz + imgreg.oy + imgreg.sy)) {
//printf("Tile completely excluded from view-window %d\n", tile_id); /*printf("Tile completely excluded from view-window %d\n", tile_id);*/
// Tile completely excluded from view-window /* Tile completely excluded from view-window */
} }
else if( tile_Xrange.minvalue >= imgreg.xosiz + imgreg.ox && else if( tile_Xrange.minvalue >= (Byte4_t)(imgreg.xosiz + imgreg.ox) &&
tile_Xrange.maxvalue <= imgreg.xosiz + imgreg.ox + imgreg.sx && tile_Xrange.maxvalue <= (Byte4_t)(imgreg.xosiz + imgreg.ox + imgreg.sx) &&
tile_Yrange.minvalue >= imgreg.yosiz + imgreg.oy && tile_Yrange.minvalue >= (Byte4_t)(imgreg.yosiz + imgreg.oy) &&
tile_Yrange.maxvalue <= imgreg.yosiz + imgreg.oy + imgreg.sy) { tile_Yrange.maxvalue <= (Byte4_t)(imgreg.yosiz + imgreg.oy + imgreg.sy)) {
// Tile completely contained within view-window /* Tile completely contained within view-window */
// high priority /* high priority */
//printf("Tile completely contained within view-window %d\n", tile_id); /*printf("Tile completely contained within view-window %d\n", tile_id);*/
if( msgqueue->cachemodel->jppstream){ if( msgqueue->cachemodel->jppstream){
enqueue_tileheader( tile_id, msgqueue); enqueue_tileheader( tile_id, msgqueue);
enqueue_allprecincts( tile_id, imgreg.level, query_param.lastcomp, query_param.comps, query_param.layers, msgqueue); enqueue_allprecincts( tile_id, imgreg.level, query_param.lastcomp, query_param.comps, query_param.layers, msgqueue);
@@ -318,16 +325,17 @@ void enqueue_imagedata( query_param_t query_param, msgqueue_param_t *msgqueue)
enqueue_tile( tile_id, imgreg.level, msgqueue); enqueue_tile( tile_id, imgreg.level, msgqueue);
} }
else{ else{
// Tile partially overlaps view-window /* Tile partially overlaps view-window */
// low priority /* low priority */
//printf("Tile partially overlaps view-window %d\n", tile_id); /*printf("Tile partially overlaps view-window %d\n", tile_id);*/
if( msgqueue->cachemodel->jppstream){ if( msgqueue->cachemodel->jppstream){
enqueue_tileheader( tile_id, msgqueue); enqueue_tileheader( tile_id, msgqueue);
xmin = tile_Xrange.minvalue >= imgreg.xosiz + imgreg.ox ? 0 : imgreg.xosiz + imgreg.ox - tile_Xrange.minvalue; /* FIXME: The following code is suspicious it implicitely cast an unsigned int to int, which truncates values */
xmax = tile_Xrange.maxvalue <= imgreg.xosiz + imgreg.ox + imgreg.sx ? tile_Xrange.maxvalue - tile_Xrange.minvalue -1 : imgreg.xosiz + imgreg.ox + imgreg.sx - tile_Xrange.minvalue -1; xmin = tile_Xrange.minvalue >= (Byte4_t)(imgreg.xosiz + imgreg.ox) ? 0 : imgreg.xosiz + imgreg.ox - tile_Xrange.minvalue;
ymin = tile_Yrange.minvalue >= imgreg.yosiz + imgreg.oy ? 0 : imgreg.yosiz + imgreg.oy - tile_Yrange.minvalue; xmax = tile_Xrange.maxvalue <= (Byte4_t)(imgreg.xosiz + imgreg.ox + imgreg.sx) ? tile_Xrange.maxvalue - tile_Xrange.minvalue -1 : imgreg.xosiz + imgreg.ox + imgreg.sx - tile_Xrange.minvalue -1;
ymax = tile_Yrange.maxvalue <= imgreg.yosiz + imgreg.oy + imgreg.sy ? tile_Yrange.maxvalue - tile_Yrange.minvalue -1 : imgreg.yosiz + imgreg.oy + imgreg.sy - tile_Yrange.minvalue -1; ymin = tile_Yrange.minvalue >= (Byte4_t)(imgreg.yosiz + imgreg.oy) ? 0 : imgreg.yosiz + imgreg.oy - tile_Yrange.minvalue;
ymax = tile_Yrange.maxvalue <= (Byte4_t)(imgreg.yosiz + imgreg.oy + imgreg.sy) ? tile_Yrange.maxvalue - tile_Yrange.minvalue -1 : imgreg.yosiz + imgreg.oy + imgreg.sy - tile_Yrange.minvalue -1;
enqueue_precincts( xmin, xmax, ymin, ymax, tile_id, imgreg.level, query_param.lastcomp, query_param.comps, query_param.layers, msgqueue); enqueue_precincts( xmin, xmax, ymin, ymax, tile_id, imgreg.level, query_param.lastcomp, query_param.comps, query_param.layers, msgqueue);
} }
else else
@@ -339,6 +347,7 @@ void enqueue_imagedata( query_param_t query_param, msgqueue_param_t *msgqueue)
} }
/* MM: shouldnt xmin/xmax be Byte4_t instead ? */
void enqueue_precincts( int xmin, int xmax, int ymin, int ymax, int tile_id, int level, int lastcomp, bool *comps, int layers, msgqueue_param_t *msgqueue) void enqueue_precincts( int xmin, int xmax, int ymin, int ymax, int tile_id, int level, int lastcomp, bool *comps, int layers, msgqueue_param_t *msgqueue)
{ {
index_param_t *codeidx; index_param_t *codeidx;
@@ -374,16 +383,16 @@ void enqueue_precincts( int xmin, int xmax, int ymin, int ymax, int tile_id, int
xmaxP = XTsiz-1; xmaxP = XTsiz-1;
if( xmaxP < xmin || xminP > xmax || ymaxP < ymin || yminP > ymax){ if( xmaxP < xmin || xminP > xmax || ymaxP < ymin || yminP > ymax){
// Precinct completely excluded from view-window /* Precinct completely excluded from view-window */
} }
else if( xminP >= xmin && xmaxP <= xmax && yminP >= ymin && ymaxP <= ymax){ else if( xminP >= xmin && xmaxP <= xmax && yminP >= ymin && ymaxP <= ymax){
// Precinct completely contained within view-window /* Precinct completely contained within view-window
// high priority high priority */
enqueue_precinct( seq_id, tile_id, c, (dec_lev>level)?-1:layers, msgqueue); enqueue_precinct( seq_id, tile_id, c, (dec_lev>level)?-1:layers, msgqueue);
} }
else{ else{
// Precinct partially overlaps view-window /* Precinct partially overlaps view-window
// low priority low priority */
enqueue_precinct( seq_id, tile_id, c, (dec_lev>level)?-1:layers, msgqueue); enqueue_precinct( seq_id, tile_id, c, (dec_lev>level)?-1:layers, msgqueue);
} }
} }
@@ -419,18 +428,26 @@ void enqueue_allprecincts( int tile_id, int level, int lastcomp, bool *comps, in
} }
} }
void enqueue_metabins( query_param_t query_param, metadatalist_param_t *metadatalist, msgqueue_param_t *msgqueue) bool enqueue_metabins( query_param_t query_param, metadatalist_param_t *metadatalist, msgqueue_param_t *msgqueue)
{ {
int i; int i;
for( i=0; query_param.box_type[i][0]!=0 && i<MAX_NUMOFBOX; i++){ for( i=0; query_param.box_type[i][0]!=0 && i<MAX_NUMOFBOX; i++){
if( query_param.box_type[i][0] == '*'){ if( query_param.box_type[i][0] == '*'){
// not implemented fprintf( FCGI_stdout, "Status: 501\r\n");
fprintf( FCGI_stdout, "Reason: metareq with all box-property * not implemented\r\n");
return false;
} }
else{ else{
int idx = search_metadataidx( query_param.box_type[i], metadatalist); int idx = search_metadataidx( query_param.box_type[i], metadatalist);
if( idx != -1) if( idx != -1)
enqueue_metadata( idx, msgqueue); enqueue_metadata( idx, msgqueue);
else{
fprintf( FCGI_stdout, "Status: 400\r\n");
fprintf( FCGI_stdout, "Reason: box-type %.4s not found\r\n", query_param.box_type[i]);
return false;
}
} }
} }
return true;
} }

View File

@@ -52,7 +52,7 @@ Byte_t * update_JPIPstream( Byte_t *newstream, int newstreamlen, Byte_t *cache_s
return stream; return stream;
} }
void save_codestream( Byte_t *codestream, Byte8_t streamlen, char *fmt) void save_codestream( Byte_t *codestream, Byte8_t streamlen, const char *fmt)
{ {
time_t timer; time_t timer;
struct tm *t_st; struct tm *t_st;
@@ -74,7 +74,7 @@ void save_codestream( Byte_t *codestream, Byte8_t streamlen, char *fmt)
Byte_t * jpipstream_to_pnm( Byte_t *jpipstream, msgqueue_param_t *msgqueue, Byte8_t csn, int fw, int fh, ihdrbox_param_t **ihdrbox) Byte_t * jpipstream_to_pnm( Byte_t *jpipstream, msgqueue_param_t *msgqueue, Byte8_t csn, int fw, int fh, ihdrbox_param_t **ihdrbox)
{ {
Byte_t *pnmstream; Byte_t *pnmstream;
Byte_t *j2kstream; // j2k or jp2 codestream Byte_t *j2kstream; /* j2k or jp2 codestream */
Byte8_t j2klen; Byte8_t j2klen;
j2kstream = recons_j2k( msgqueue, jpipstream, csn, fw, fh, &j2klen); j2kstream = recons_j2k( msgqueue, jpipstream, csn, fw, fh, &j2klen);

View File

@@ -34,7 +34,7 @@
Byte_t * update_JPIPstream( Byte_t *newstream, int newstreamlen, Byte_t *cache_stream, int *streamlen); Byte_t * update_JPIPstream( Byte_t *newstream, int newstreamlen, Byte_t *cache_stream, int *streamlen);
void save_codestream( Byte_t *codestream, Byte8_t streamlen, char *fmt); void save_codestream( Byte_t *codestream, Byte8_t streamlen, const char *fmt);
Byte_t * jpipstream_to_pnm( Byte_t *jpipstream, msgqueue_param_t *msgqueue, Byte8_t csn, int fw, int fh, ihdrbox_param_t **ihdrbox); Byte_t * jpipstream_to_pnm( Byte_t *jpipstream, msgqueue_param_t *msgqueue, Byte8_t csn, int fw, int fh, ihdrbox_param_t **ihdrbox);

View File

@@ -40,14 +40,14 @@
#define FCGI_stdout stdout #define FCGI_stdout stdout
#define FCGI_stderr stderr #define FCGI_stderr stderr
#define logstream stderr #define logstream stderr
#endif //SERVER #endif /*SERVER */
manfbox_param_t * gene_manfbox( box_param_t *box) manfbox_param_t * gene_manfbox( box_param_t *box)
{ {
manfbox_param_t *manf; // manifest parameters manfbox_param_t *manf; /* manifest parameters */
boxheader_param_t *bh; // current box pointer boxheader_param_t *bh; /* current box pointer */
boxheader_param_t *last; // last boxheader pointer of the list boxheader_param_t *last; /* last boxheader pointer of the list */
int pos; // current position in manf_box contents; Byte8_t pos; /* current position in manf_box contents; */
manf = ( manfbox_param_t *)malloc( sizeof( manfbox_param_t)); manf = ( manfbox_param_t *)malloc( sizeof( manfbox_param_t));
@@ -59,7 +59,7 @@ manfbox_param_t * gene_manfbox( box_param_t *box)
bh = gene_childboxheader( box, pos); bh = gene_childboxheader( box, pos);
pos += bh->headlen; pos += bh->headlen;
// insert into the list /* insert into the list */
if( manf->first) if( manf->first)
last->next = bh; last->next = bh;
else else
@@ -77,7 +77,7 @@ void delete_manfbox( manfbox_param_t **manf)
while( bhPtr != NULL){ while( bhPtr != NULL){
bhNext = bhPtr->next; bhNext = bhPtr->next;
#ifndef SERVER #ifndef SERVER
// fprintf( logstream, "local log: boxheader %.4s deleted!\n", bhPtr->type); /* fprintf( logstream, "local log: boxheader %.4s deleted!\n", bhPtr->type); */
#endif #endif
free(bhPtr); free(bhPtr);
bhPtr = bhNext; bhPtr = bhNext;
@@ -96,7 +96,7 @@ void print_manfbox( manfbox_param_t *manf)
} }
} }
boxheader_param_t * search_boxheader( char type[], manfbox_param_t *manf) boxheader_param_t * search_boxheader( const char type[], manfbox_param_t *manf)
{ {
boxheader_param_t *found; boxheader_param_t *found;

View File

@@ -75,7 +75,7 @@ void print_manfbox( manfbox_param_t *manf);
* @param[in] manf manf box pointer * @param[in] manf manf box pointer
* @return found box pointer * @return found box pointer
*/ */
boxheader_param_t * search_boxheader( char type[], manfbox_param_t *manf); boxheader_param_t * search_boxheader( const char type[], manfbox_param_t *manf);
#endif /* !MANFBOX_MANAGER_H_ */ #endif /* !MANFBOX_MANAGER_H_ */

View File

@@ -37,7 +37,7 @@
#define FCGI_stdout stdout #define FCGI_stdout stdout
#define FCGI_stderr stderr #define FCGI_stderr stderr
#define logstream stderr #define logstream stderr
#endif //SERVER #endif /*SERVER */
marker_param_t set_marker( codestream_param_t cs, Byte2_t code, Byte8_t offset, Byte2_t length) marker_param_t set_marker( codestream_param_t cs, Byte2_t code, Byte8_t offset, Byte2_t length)
{ {

View File

@@ -43,7 +43,7 @@
#endif /*SERVER*/ #endif /*SERVER*/
metadatalist_param_t * gene_metadatalist() metadatalist_param_t * gene_metadatalist(void)
{ {
metadatalist_param_t *list; metadatalist_param_t *list;
@@ -77,10 +77,6 @@ metadatalist_param_t * const_metadatalist( int fd)
phldlist = gene_placeholderlist(); phldlist = gene_placeholderlist();
metadatalist = gene_metadatalist(); metadatalist = gene_metadatalist();
delete_box_in_list_by_type( "iptr", toplev_boxlist);
delete_box_in_list_by_type( "cidx", toplev_boxlist);
delete_box_in_list_by_type( "fidx", toplev_boxlist);
box = toplev_boxlist->first; box = toplev_boxlist->first;
idx = 0; idx = 0;
while( box){ while( box){

View File

@@ -60,7 +60,7 @@ typedef struct metadatalist_param{
* *
* @return pointer to the generated metadata list * @return pointer to the generated metadata list
*/ */
metadatalist_param_t * gene_metadatalist(); metadatalist_param_t * gene_metadatalist(void);
/** /**

View File

@@ -40,14 +40,14 @@
#define FCGI_stdout stdout #define FCGI_stdout stdout
#define FCGI_stderr stderr #define FCGI_stderr stderr
#define logstream stderr #define logstream stderr
#endif //SERVER #endif /*SERVER */
mhixbox_param_t * gene_mhixbox( box_param_t *box) mhixbox_param_t * gene_mhixbox( box_param_t *box)
{ {
mhixbox_param_t *mhix; mhixbox_param_t *mhix;
markeridx_param_t *mkridx, *lastmkidx; markeridx_param_t *mkridx, *lastmkidx;
long pos = 0; Byte8_t pos = 0;
mhix = ( mhixbox_param_t *)malloc( sizeof( mhixbox_param_t)); mhix = ( mhixbox_param_t *)malloc( sizeof( mhixbox_param_t));
@@ -129,7 +129,7 @@ void delete_mhixbox( mhixbox_param_t **mhix)
while( mkPtr != NULL){ while( mkPtr != NULL){
mkNext=mkPtr->next; mkNext=mkPtr->next;
#ifndef SERVER #ifndef SERVER
// fprintf( logstream, "local log: marker index %#x deleted!\n", mkPtr->code); /* fprintf( logstream, "local log: marker index %#x deleted!\n", mkPtr->code); */
#endif #endif
free(mkPtr); free(mkPtr);
mkPtr=mkNext; mkPtr=mkNext;

View File

@@ -677,7 +677,7 @@ placeholder_param_t * parse_phld( Byte_t *datastream, Byte8_t metalength)
phld = (placeholder_param_t *)malloc( sizeof(placeholder_param_t)); phld = (placeholder_param_t *)malloc( sizeof(placeholder_param_t));
phld->LBox = big4( datastream); phld->LBox = big4( datastream);
strcpy( phld->TBox, "phld"); strncpy( phld->TBox, "phld", 4);
phld->Flags = big4( datastream+8); phld->Flags = big4( datastream+8);
phld->OrigID = big8( datastream+12); phld->OrigID = big8( datastream+12);
phld->OrigBHlen = metalength - 20; phld->OrigBHlen = metalength - 20;

View File

@@ -115,7 +115,7 @@ bool process_JPIPrequest( server_record_t *rec, QR_t *qr)
if( !close_channel( *(qr->query), rec->sessionlist, &cursession, &curchannel)) if( !close_channel( *(qr->query), rec->sessionlist, &cursession, &curchannel))
return false; return false;
if( (qr->query->fx > 0 && qr->query->fy > 0) || qr->query->box_type[0][0] != 0) if( (qr->query->fx > 0 && qr->query->fy > 0) || qr->query->box_type[0][0] != 0 || qr->query->len > 0)
if( !gene_JPIPstream( *(qr->query), target, cursession, curchannel, &qr->msgqueue)) if( !gene_JPIPstream( *(qr->query), target, cursession, curchannel, &qr->msgqueue))
return false; return false;
@@ -150,16 +150,20 @@ void send_responsedata( server_record_t *rec, QR_t *qr)
fprintf( FCGI_stdout, "\r\n"); fprintf( FCGI_stdout, "\r\n");
if( qr->channel) if( len_of_jpipstream){
if( qr->channel->aux == tcp || qr->channel->aux == udp){
send_responsedata_on_aux( qr->channel->aux==tcp, rec->auxtrans, qr->channel->cid, jpipstream, len_of_jpipstream, 1000); /* 1KB per frame*/
return;
}
if( fwrite( jpipstream, len_of_jpipstream, 1, FCGI_stdout) != 1) if( qr->channel)
fprintf( FCGI_stderr, "Error: failed to write jpipstream\n"); if( qr->channel->aux == tcp || qr->channel->aux == udp){
send_responsedata_on_aux( qr->channel->aux==tcp, rec->auxtrans, qr->channel->cid, jpipstream, len_of_jpipstream, 1000); /* 1KB per frame*/
return;
}
if( fwrite( jpipstream, len_of_jpipstream, 1, FCGI_stdout) != 1)
fprintf( FCGI_stderr, "Error: failed to write jpipstream\n");
}
free( jpipstream); free( jpipstream);
return; return;
} }
@@ -179,7 +183,7 @@ void add_EORmsg( int fd, QR_t *qr)
void end_QRprocess( server_record_t *rec, QR_t **qr) void end_QRprocess( server_record_t *rec, QR_t **qr)
{ {
/* TODO: record client preferences if necessary*/ /* TODO: record client preferences if necessary*/
(void)rec; /* unused */
delete_query( &((*qr)->query)); delete_query( &((*qr)->query));
delete_msgqueue( &((*qr)->msgqueue)); delete_msgqueue( &((*qr)->msgqueue));
free( *qr); free( *qr);

View File

@@ -41,11 +41,11 @@
#define FCGI_stdout stdout #define FCGI_stdout stdout
#define FCGI_stderr stderr #define FCGI_stderr stderr
#define logstream stderr #define logstream stderr
#endif //SERVER #endif /*SERVER*/
placeholderlist_param_t * gene_placeholderlist() placeholderlist_param_t * gene_placeholderlist(void)
{ {
placeholderlist_param_t *list; placeholderlist_param_t *list;
@@ -81,7 +81,7 @@ placeholder_param_t * gene_placeholder( box_param_t *box, int origID)
placeholder = (placeholder_param_t *)malloc( sizeof(placeholder_param_t)); placeholder = (placeholder_param_t *)malloc( sizeof(placeholder_param_t));
strncpy( placeholder->TBox, "phld", 4); strncpy( placeholder->TBox, "phld", 4);
placeholder->Flags = 1; // only the access to the original contents of this box, for now placeholder->Flags = 1; /* only the access to the original contents of this box, for now */
placeholder->OrigID = origID; placeholder->OrigID = origID;
placeholder->OrigBH = fetch_headbytes( box); placeholder->OrigBH = fetch_headbytes( box);
placeholder->OrigBHlen = box->headlen; placeholder->OrigBHlen = box->headlen;

View File

@@ -66,7 +66,7 @@ typedef struct placeholderlist_param{
* *
* @return pointer to the generated placeholder list * @return pointer to the generated placeholder list
*/ */
placeholderlist_param_t * gene_placeholderlist(); placeholderlist_param_t * gene_placeholderlist(void);
/** /**

View File

@@ -58,7 +58,7 @@
* *
* @return initial query parameters * @return initial query parameters
*/ */
query_param_t * get_initquery(); query_param_t * get_initquery(void);
/* /*
* get a pair of field name and value from the string starting fieldname=fieldval&... format * get a pair of field name and value from the string starting fieldname=fieldval&... format
@@ -141,14 +141,17 @@ query_param_t * parse_query( char *query_string)
query_param->return_type = JPTstream; query_param->return_type = JPTstream;
} }
else if( strcasecmp( fieldname, "len") == 0) else if( strcasecmp( fieldname, "len") == 0){
sscanf( fieldval, "%d", &query_param->len); sscanf( fieldval, "%d", &query_param->len);
if( query_param->len == 2000) /* for kakadu client*/
strncpy( query_param->box_type[0], "ftyp", 4);
}
} }
} }
return query_param; return query_param;
} }
query_param_t * get_initquery() query_param_t * get_initquery(void)
{ {
query_param_t *query; query_param_t *query;
int i; int i;

View File

@@ -41,10 +41,10 @@
#define FCGI_stdout stdout #define FCGI_stdout stdout
#define FCGI_stderr stderr #define FCGI_stderr stderr
#define logstream stderr #define logstream stderr
#endif //SERVER #endif /*SERVER */
sessionlist_param_t * gene_sessionlist() sessionlist_param_t * gene_sessionlist(void)
{ {
sessionlist_param_t *sessionlist; sessionlist_param_t *sessionlist;
@@ -67,9 +67,9 @@ session_param_t * gene_session( sessionlist_param_t *sessionlist)
session->next = NULL; session->next = NULL;
if( sessionlist->first) // there are one or more entries if( sessionlist->first) /* there are one or more entries */
sessionlist->last->next = session; sessionlist->last->next = session;
else // first entry else /* first entry */
sessionlist->first = session; sessionlist->first = session;
sessionlist->last = session; sessionlist->last = session;

View File

@@ -54,7 +54,7 @@ typedef struct sessionlist_param{
* *
* @return pointer to the generated session list * @return pointer to the generated session list
*/ */
sessionlist_param_t * gene_sessionlist(); sessionlist_param_t * gene_sessionlist(void);
/** /**

View File

@@ -34,6 +34,10 @@
#include <sys/types.h> #include <sys/types.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <arpa/inet.h> #include <arpa/inet.h>
#ifdef __FreeBSD__
#include <netinet/in.h>
#endif
#include <unistd.h>
#endif #endif
#include <stdio.h> #include <stdio.h>
@@ -48,7 +52,7 @@
#define FCGI_stdout stdout #define FCGI_stdout stdout
#define FCGI_stderr stderr #define FCGI_stderr stderr
#define logstream stderr #define logstream stderr
#endif //SERVER #endif /*SERVER*/
SOCKET open_listeningsocket( int port) SOCKET open_listeningsocket( int port)
{ {

View File

@@ -53,7 +53,7 @@
#define logstream stderr #define logstream stderr
#endif /*SERVER*/ #endif /*SERVER*/
targetlist_param_t * gene_targetlist() targetlist_param_t * gene_targetlist(void)
{ {
targetlist_param_t *targetlist; targetlist_param_t *targetlist;

View File

@@ -67,7 +67,7 @@ typedef struct targetlist_param{
* *
* @return pointer to the generated target list * @return pointer to the generated target list
*/ */
targetlist_param_t * gene_targetlist(); targetlist_param_t * gene_targetlist(void);
/** /**

View File

@@ -4,6 +4,14 @@ INCLUDE_DIRECTORIES(
${FCGI_INCLUDE_DIRS} ${FCGI_INCLUDE_DIRS}
) )
# Tool to embed metadata into JP2 file
ADD_EXECUTABLE(addXMLinJP2 addXMLinJP2.c)
# Install exe
INSTALL(TARGETS addXMLinJP2
EXPORT OpenJPEGTargets
DESTINATION ${OPENJPEG_INSTALL_BIN_DIR} COMPONENT Applications
)
IF(BUILD_JPIP_SERVER) IF(BUILD_JPIP_SERVER)
SET(OPJ_SERVER_SRCS SET(OPJ_SERVER_SRCS
@@ -47,81 +55,105 @@ FOREACH(exe ${EXES})
ENDFOREACH(exe) ENDFOREACH(exe)
# Build the two java clients: # Build the two java clients:
FIND_PACKAGE(Java 1.5 REQUIRED) # javac, jar FIND_PACKAGE(Java 1.5 COMPONENTS Development) # javac, jar
# 1. opj_viewer # User can override this:
# build dep list: if(NOT DEFINED JAVA_SOURCE_VERSION)
file(GLOB java1_srcs "opj_viewer/src/*.java") set(JAVA_SOURCE_VERSION 1.5)
endif()
if(NOT DEFINED JAVA_TARGET_VERSION)
set(JAVA_TARGET_VERSION 1.5)
endif()
# make sure target javac dir exists: # Only build the java viewer if dev is found:
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/classes1) if(Java_Development_FOUND AND Java_JAVAC_EXECUTABLE)
# Build java set(jflags $ENV{JFLAGS})
ADD_CUSTOM_COMMAND( # 1. opj_viewer
OUTPUT ${LIBRARY_OUTPUT_PATH}/opj_viewer.jar
COMMAND ${Java_JAVAC_EXECUTABLE}
${java1_srcs} -d ${CMAKE_CURRENT_BINARY_DIR}/classes1
COMMAND ${Java_JAR_EXECUTABLE} cfm ${LIBRARY_OUTPUT_PATH}/opj_viewer.jar
${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer/dist/manifest.txt -C
${CMAKE_CURRENT_BINARY_DIR}/classes1 .
DEPENDS ${java1_srcs}
${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer/dist/manifest.txt
COMMENT "javac *.java; jar cvf -> opj_viewer.jar"
)
# name the target
ADD_CUSTOM_TARGET(OPJViewerJar ALL
DEPENDS ${LIBRARY_OUTPUT_PATH}/opj_viewer.jar
COMMENT "building opj_viewer.jar"
)
# 2. opj_viewer_xerces
# search for package org.apache.xerces.parsers
find_file(APACHE_XERCES_JAR
NAMES xerces-j2.jar xercesImpl.jar
PATHS /usr/share/java/
NO_DEFAULT_PATH
)
mark_as_advanced(APACHE_XERCES_JAR)
if(EXISTS ${APACHE_XERCES_JAR})
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer_xerces/dist/manifest.txt.in
${CMAKE_CURRENT_BINARY_DIR}/opj_viewer_xerces/dist/manifest.txt
@ONLY
)
# build dep list: # build dep list:
file(GLOB java2_srcs "opj_viewer_xerces/src/*.java") file(GLOB java1_srcs "opj_viewer/src/*.java")
# Need some common files:
list(APPEND java2_srcs
${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer/src/ImageManager.java
${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer/src/ImgdecClient.java
${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer/src/JPIPHttpClient.java
${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer/src/MML.java
${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer/src/PnmImage.java
${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer/src/RegimViewer.java
${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer/src/ResizeListener.java
)
# make sure target javac dir exists: # make sure target javac dir exists:
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/classes2) file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/classes1)
# Build java # Build java
ADD_CUSTOM_COMMAND( ADD_CUSTOM_COMMAND(
OUTPUT ${LIBRARY_OUTPUT_PATH}/opj_viewer_xerces.jar OUTPUT ${LIBRARY_OUTPUT_PATH}/opj_viewer.jar
COMMAND ${Java_JAVAC_EXECUTABLE} COMMAND ${Java_JAVAC_EXECUTABLE} ${jflags}
-classpath ${APACHE_XERCES_JAR} -source ${JAVA_SOURCE_VERSION} -target ${JAVA_TARGET_VERSION}
${java2_srcs} -d ${CMAKE_CURRENT_BINARY_DIR}/classes2 ${java1_srcs} -d ${CMAKE_CURRENT_BINARY_DIR}/classes1
COMMAND ${Java_JAR_EXECUTABLE} cfm ${LIBRARY_OUTPUT_PATH}/opj_viewer_xerces.jar COMMAND ${Java_JAR_EXECUTABLE} cfm ${LIBRARY_OUTPUT_PATH}/opj_viewer.jar
${CMAKE_CURRENT_BINARY_DIR}/opj_viewer_xerces/dist/manifest.txt ${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer/dist/manifest.txt -C
-C ${CMAKE_CURRENT_BINARY_DIR}/classes2 . ${CMAKE_CURRENT_BINARY_DIR}/classes1 .
DEPENDS ${java2_srcs} DEPENDS ${java1_srcs}
${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer_xerces/dist/manifest.txt.in ${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer/dist/manifest.txt
COMMENT "javac *.java; jar cvf -> opj_viewer_xerces.jar" COMMENT "javac *.java; jar cvf -> opj_viewer.jar"
) )
# name the target # name the target
ADD_CUSTOM_TARGET(OPJViewerXercesJar ALL ADD_CUSTOM_TARGET(OPJViewerJar ALL
DEPENDS ${LIBRARY_OUTPUT_PATH}/opj_viewer_xerces.jar DEPENDS ${LIBRARY_OUTPUT_PATH}/opj_viewer.jar
COMMENT "building opj_viewer_xerces.jar" COMMENT "building opj_viewer.jar"
) )
INSTALL(FILES ${LIBRARY_OUTPUT_PATH}/opj_viewer.jar
DESTINATION ${OPENJPEG_INSTALL_SHARE_DIR} COMPONENT JavaModule
)
# 2. opj_viewer_xerces
# search for package org.apache.xerces.parsers
find_file(APACHE_XERCES_JAR
NAMES xerces-j2.jar xercesImpl.jar
PATHS /usr/share/java/
NO_DEFAULT_PATH
)
mark_as_advanced(APACHE_XERCES_JAR)
if(EXISTS ${APACHE_XERCES_JAR})
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer_xerces/dist/manifest.txt.in
${CMAKE_CURRENT_BINARY_DIR}/opj_viewer_xerces/dist/manifest.txt
@ONLY
)
# build dep list:
file(GLOB java2_srcs "opj_viewer_xerces/src/*.java")
# Need some common files:
list(APPEND java2_srcs
${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer/src/ImageManager.java
${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer/src/ImgdecClient.java
${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer/src/JPIPHttpClient.java
${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer/src/MML.java
${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer/src/PnmImage.java
${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer/src/RegimViewer.java
${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer/src/ResizeListener.java
)
# make sure target javac dir exists:
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/classes2)
# Build java
ADD_CUSTOM_COMMAND(
OUTPUT ${LIBRARY_OUTPUT_PATH}/opj_viewer_xerces.jar
COMMAND ${Java_JAVAC_EXECUTABLE} ${jflags}
-source ${JAVA_SOURCE_VERSION} -target ${JAVA_TARGET_VERSION}
-classpath ${APACHE_XERCES_JAR}
${java2_srcs} -d ${CMAKE_CURRENT_BINARY_DIR}/classes2
COMMAND ${Java_JAR_EXECUTABLE} cfm ${LIBRARY_OUTPUT_PATH}/opj_viewer_xerces.jar
${CMAKE_CURRENT_BINARY_DIR}/opj_viewer_xerces/dist/manifest.txt
-C ${CMAKE_CURRENT_BINARY_DIR}/classes2 .
DEPENDS ${java2_srcs}
${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer_xerces/dist/manifest.txt.in
COMMENT "javac *.java; jar cvf -> opj_viewer_xerces.jar"
)
# name the target
ADD_CUSTOM_TARGET(OPJViewerXercesJar ALL
DEPENDS ${LIBRARY_OUTPUT_PATH}/opj_viewer_xerces.jar
COMMENT "building opj_viewer_xerces.jar"
)
INSTALL(FILES ${LIBRARY_OUTPUT_PATH}/opj_viewer_xerces.jar
DESTINATION ${OPENJPEG_INSTALL_SHARE_DIR} COMPONENT JavaModule
)
endif()
else(Java_Development_FOUND)
message(WARNING "No java compiler found. Wont be able to build java viewer")
endif() endif()

View File

@@ -73,15 +73,15 @@ char * read_xmlfile( char filename[], long *fsize);
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
FILE *fp;
char *xmldata, type[]="xml ";
long fsize, boxsize;
if( argc<3){ if( argc<3){
fprintf( stderr, "USAGE: ./addXMLinJP2 modifing.jp2 adding.xml\n"); fprintf( stderr, "USAGE: ./addXMLinJP2 modifing.jp2 adding.xml\n");
return -1; return -1;
} }
FILE *fp;
char *xmldata, type[]="xml ";
long fsize, boxsize;
fp = open_jp2file( argv[1]); fp = open_jp2file( argv[1]);
if( !fp) if( !fp)
return -1; return -1;
@@ -94,7 +94,7 @@ int main(int argc, char *argv[])
fputc( (boxsize>>8)&0xff, fp); fputc( (boxsize>>8)&0xff, fp);
fputc( boxsize&0xff, fp); fputc( boxsize&0xff, fp);
fwrite( type, 4, 1, fp); fwrite( type, 4, 1, fp);
fwrite( xmldata, fsize, 1, fp); fwrite( xmldata, (size_t)fsize, 1, fp);
free( xmldata); free( xmldata);
fclose(fp); fclose(fp);
@@ -111,14 +111,14 @@ FILE * open_jp2file( char filename[])
fprintf( stderr, "Original JP2 %s not found\n", filename); fprintf( stderr, "Original JP2 %s not found\n", filename);
return NULL; return NULL;
} }
// Check resource is a JP family file. /* Check resource is a JP family file. */
if( fseek( fp, 0, SEEK_SET)==-1){ if( fseek( fp, 0, SEEK_SET)==-1){
fclose(fp); fclose(fp);
fprintf( stderr, "Original JP2 %s broken (fseek error)\n", filename); fprintf( stderr, "Original JP2 %s broken (fseek error)\n", filename);
return NULL; return NULL;
} }
data = (char *)malloc( 12); // size of header data = (char *)malloc( 12); /* size of header */
if( fread( data, 12, 1, fp) != 1){ if( fread( data, 12, 1, fp) != 1){
free( data); free( data);
fclose(fp); fclose(fp);
@@ -142,7 +142,7 @@ char * read_xmlfile( char filename[], long *fsize)
FILE *fp; FILE *fp;
char *data; char *data;
// fprintf( stderr, "open %s\n", filename); /* fprintf( stderr, "open %s\n", filename); */
if(!(fp = fopen( filename, "r"))){ if(!(fp = fopen( filename, "r"))){
fprintf( stderr, "XML file %s not found\n", filename); fprintf( stderr, "XML file %s not found\n", filename);
return NULL; return NULL;
@@ -166,9 +166,9 @@ char * read_xmlfile( char filename[], long *fsize)
return NULL; return NULL;
} }
data = (char *)malloc( *fsize); data = (char *)malloc( (size_t)*fsize);
if( fread( data, *fsize, 1, fp) != 1){ if( fread( data, (size_t)*fsize, 1, fp) != 1){
fprintf( stderr, "XML file %s broken (read error)\n", filename); fprintf( stderr, "XML file %s broken (read error)\n", filename);
free( data); free( data);
fclose(fp); fclose(fp);

View File

@@ -64,7 +64,7 @@ int main(int argc,char *argv[])
if(!( fwrite_jp2k( argv[2], dec))) if(!( fwrite_jp2k( argv[2], dec)))
return -1; return -1;
// output_log( true, false, false, dec); /* output_log( true, false, false, dec); */
destroy_jpipdecoder( &dec); destroy_jpipdecoder( &dec);

View File

@@ -33,11 +33,12 @@
* *
* \section impinst Implementing instructions * \section impinst Implementing instructions
* Launch opj_dec_server from a terminal in the same machine as JPIP client image viewers. \n * Launch opj_dec_server from a terminal in the same machine as JPIP client image viewers. \n
* % ./opj_dec_server \n * % ./opj_dec_server [portnumber]\n
* ( portnumber=50000 by default)\n
* Keep it alive as long as image viewers are open.\n * Keep it alive as long as image viewers are open.\n
* *
* To quite the opj_dec_server, send a message "quit" through the telnet.\n * To quite the opj_dec_server, send a message "quit" through the telnet.\n
* % telnet localhost 5000\n * % telnet localhost 50000\n
* quit\n * quit\n
* Be sure all image viewers are closed.\n * Be sure all image viewers are closed.\n
* Cache file in JPT format is stored in the working directly before it quites. * Cache file in JPT format is stored in the working directly before it quites.
@@ -45,6 +46,7 @@
*/ */
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
#include "openjpip.h" #include "openjpip.h"
#ifdef _WIN32 #ifdef _WIN32
@@ -55,16 +57,22 @@ int main(int argc, char *argv[]){
dec_server_record_t *server_record; dec_server_record_t *server_record;
client_t client; client_t client;
int port = 50000;
int erreur;
(void)erreur;
if( argc > 1)
port = atoi( argv[1]);
#ifdef _WIN32 #ifdef _WIN32
int erreur = WSAStartup(MAKEWORD(2,2),&initialisation_win32); erreur = WSAStartup(MAKEWORD(2,2),&initialisation_win32);
if( erreur!=0) if( erreur!=0)
fprintf( stderr, "Erreur initialisation Winsock error : %d %d\n",erreur,WSAGetLastError()); fprintf( stderr, "Erreur initialisation Winsock error : %d %d\n",erreur,WSAGetLastError());
else else
printf( "Initialisation Winsock\n"); printf( "Initialisation Winsock\n");
#endif //_WIN32 #endif /*_WIN32*/
server_record = init_dec_server( 50000); server_record = init_dec_server( port);
while(( client = accept_connection( server_record)) != -1 ) while(( client = accept_connection( server_record)) != -1 )
if(!handle_clientreq( client, server_record)) if(!handle_clientreq( client, server_record))

View File

@@ -56,11 +56,14 @@
#ifdef _WIN32 #ifdef _WIN32
WSADATA initialisation_win32; WSADATA initialisation_win32;
#endif //_WIN32 #endif /*_WIN32*/
int main(void) int main(void)
{ {
server_record_t *server_record; server_record_t *server_record;
#ifdef SERVER
char *query_string;
#endif
#ifdef _WIN32 #ifdef _WIN32
int erreur = WSAStartup(MAKEWORD(2,2),&initialisation_win32); int erreur = WSAStartup(MAKEWORD(2,2),&initialisation_win32);
@@ -68,13 +71,11 @@ int main(void)
fprintf( stderr, "Erreur initialisation Winsock error : %d %d\n",erreur,WSAGetLastError()); fprintf( stderr, "Erreur initialisation Winsock error : %d %d\n",erreur,WSAGetLastError());
else else
fprintf( stderr, "Initialisation Winsock\n"); fprintf( stderr, "Initialisation Winsock\n");
#endif //_WIN32 #endif /*_WIN32*/
server_record = init_JPIPserver( 60000, 0); server_record = init_JPIPserver( 60000, 0);
#ifdef SERVER #ifdef SERVER
char *query_string;
while(FCGI_Accept() >= 0) while(FCGI_Accept() >= 0)
#else #else
@@ -82,17 +83,16 @@ int main(void)
while( fgets( query_string, 128, stdin) && query_string[0]!='\n') while( fgets( query_string, 128, stdin) && query_string[0]!='\n')
#endif #endif
{ {
QR_t *qr;
bool parse_status;
#ifdef SERVER #ifdef SERVER
query_string = getenv("QUERY_STRING"); query_string = getenv("QUERY_STRING");
#endif //SERVER #endif /*SERVER*/
if( strcmp( query_string, QUIT_SIGNAL) == 0) if( strcmp( query_string, QUIT_SIGNAL) == 0)
break; break;
QR_t *qr;
bool parse_status;
qr = parse_querystring( query_string); qr = parse_querystring( query_string);
parse_status = process_JPIPrequest( server_record, qr); parse_status = process_JPIPrequest( server_record, qr);
@@ -103,8 +103,10 @@ int main(void)
if( parse_status) if( parse_status)
send_responsedata( server_record, qr); send_responsedata( server_record, qr);
else else{
fprintf( FCGI_stderr, "Error: JPIP request failed\n"); fprintf( FCGI_stderr, "Error: JPIP request failed\n");
fprintf( FCGI_stdout, "\r\n");
}
end_QRprocess( server_record, &qr); end_QRprocess( server_record, &qr);
} }

View File

@@ -35,10 +35,12 @@ public class ImageManager extends JPIPHttpClient
private PnmImage pnmimage; private PnmImage pnmimage;
private int origwidth; private int origwidth;
private int origheight; private int origheight;
private ImgdecClient imgdecoder;
public ImageManager( String uri) public ImageManager( String uri, String host, int port)
{ {
super( uri); super( uri);
imgdecoder = new ImgdecClient( host, port);
pnmimage = null; pnmimage = null;
origwidth = 0; origwidth = 0;
origheight = 0; origheight = 0;
@@ -47,7 +49,7 @@ public class ImageManager extends JPIPHttpClient
public int getOrigWidth(){ public int getOrigWidth(){
if( origwidth == 0){ if( origwidth == 0){
if( cid != null || tid != null){ if( cid != null || tid != null){
java.awt.Dimension dim = ImgdecClient.query_imagesize( cid, tid); java.awt.Dimension dim = imgdecoder.query_imagesize( cid, tid);
if( dim != null){ if( dim != null){
origwidth = dim.width; origwidth = dim.width;
origheight = dim.height; origheight = dim.height;
@@ -69,10 +71,10 @@ public class ImageManager extends JPIPHttpClient
// Todo: check if the cid is for the same stream type // Todo: check if the cid is for the same stream type
if( reqcnew) if( reqcnew)
refcid = ImgdecClient.query_cid( j2kfilename); refcid = imgdecoder.query_cid( j2kfilename);
if( refcid == null){ if( refcid == null){
String reftid = ImgdecClient.query_tid( j2kfilename); String reftid = imgdecoder.query_tid( j2kfilename);
if( reftid == null) if( reftid == null)
jpipstream = super.requestViewWindow( j2kfilename, reqfw, reqfh, reqcnew, reqaux, reqJPP, reqJPT); jpipstream = super.requestViewWindow( j2kfilename, reqfw, reqfh, reqcnew, reqaux, reqJPP, reqJPT);
else else
@@ -82,7 +84,7 @@ public class ImageManager extends JPIPHttpClient
jpipstream = super.requestViewWindow( reqfw, reqfh, refcid, reqcnew, reqaux, reqJPP, reqJPT); jpipstream = super.requestViewWindow( reqfw, reqfh, refcid, reqcnew, reqaux, reqJPP, reqJPT);
System.err.println( "decoding to PNM image"); System.err.println( "decoding to PNM image");
if((pnmimage = ImgdecClient.decode_jpipstream( jpipstream, j2kfilename, tid, cid, fw, fh))!=null){ if((pnmimage = imgdecoder.decode_jpipstream( jpipstream, j2kfilename, tid, cid, fw, fh))!=null){
System.err.println( " done"); System.err.println( " done");
return pnmimage.createROIImage( rx, ry, rw, rh); return pnmimage.createROIImage( rx, ry, rw, rh);
} }
@@ -99,7 +101,7 @@ public class ImageManager extends JPIPHttpClient
byte[] jpipstream = super.requestViewWindow( reqfw, reqfh, reqrx, reqry, reqrw, reqrh); byte[] jpipstream = super.requestViewWindow( reqfw, reqfh, reqrx, reqry, reqrw, reqrh);
System.err.println( "decoding to PNM image"); System.err.println( "decoding to PNM image");
if((pnmimage = ImgdecClient.decode_jpipstream( jpipstream, tid, cid, fw, fh)) != null){ if((pnmimage = imgdecoder.decode_jpipstream( jpipstream, tid, cid, fw, fh)) != null){
System.err.println( " done"); System.err.println( " done");
return pnmimage.createROIImage( rx, ry, rw, rh); return pnmimage.createROIImage( rx, ry, rw, rh);
} }
@@ -117,9 +119,9 @@ public class ImageManager extends JPIPHttpClient
byte[] jpipstream = super.requestXML(); byte[] jpipstream = super.requestXML();
if( jpipstream != null){ if( jpipstream != null){
ImgdecClient.send_JPIPstream( jpipstream); imgdecoder.send_JPIPstream( jpipstream);
xmldata = ImgdecClient.get_XMLstream( cid); xmldata = imgdecoder.get_XMLstream( cid);
} }
return xmldata; return xmldata;
} }
@@ -127,7 +129,7 @@ public class ImageManager extends JPIPHttpClient
public void closeChannel() public void closeChannel()
{ {
if( cid != null){ if( cid != null){
ImgdecClient.destroy_cid( cid); imgdecoder.destroy_cid( cid);
super.closeChannel(); super.closeChannel();
} }
} }

View File

@@ -37,11 +37,11 @@ public class ImageWindow extends JFrame
private ImageViewer imgviewer; private ImageViewer imgviewer;
private ImageManager imgmanager; private ImageManager imgmanager;
public ImageWindow( String uri, String j2kfilename, boolean session, boolean jppstream, int aux) public ImageWindow( String uri, String j2kfilename, String host, int port, boolean session, boolean jppstream, int aux)
{ {
super( j2kfilename); super( j2kfilename);
imgmanager = new ImageManager( uri); imgmanager = new ImageManager( uri, host, port);
imgviewer = new ImageViewer( j2kfilename, imgmanager, session, jppstream, aux); imgviewer = new ImageViewer( j2kfilename, imgmanager, session, jppstream, aux);
imgviewer.setOpaque(true); //content panes must be opaque imgviewer.setOpaque(true); //content panes must be opaque
@@ -66,25 +66,36 @@ public class ImageWindow extends JFrame
public static void main(String s[]) public static void main(String s[])
{ {
String j2kfilename, uri; String j2kfilename, uri, host;
boolean session, jppstream; boolean session, jppstream;
int aux; // 0: none, 1: tcp, 2: udp int port, aux; // 0: none, 1: tcp, 2: udp
if(s.length >= 2){ if(s.length >= 2){
uri = s[0]; uri = s[0];
j2kfilename = s[1]; j2kfilename = s[1];
if( s.length > 2) if( s.length > 2)
session = !s[2].equalsIgnoreCase( "stateless"); host = s[2];
else
host = "localhost";
if( s.length > 3)
port = Integer.valueOf( s[3]).intValue();
else
port = 50000;
if( s.length > 4)
session = !s[4].equalsIgnoreCase( "stateless");
else else
session = true; session = true;
if( s.length > 3) if( s.length > 5)
jppstream = !s[3].equalsIgnoreCase( "JPT"); jppstream = !s[5].equalsIgnoreCase( "JPT");
else else
jppstream = true; jppstream = true;
if( s.length > 4){ if( s.length > 6){
if( s[4].equalsIgnoreCase("udp")) if( s[6].equalsIgnoreCase("udp"))
aux = 2; aux = 2;
else else
aux = 1; aux = 1;
@@ -93,10 +104,10 @@ public class ImageWindow extends JFrame
aux = 0; aux = 0;
} }
else{ else{
System.out.println("Usage: java -jar opj_viewer.jar HTTP_server_URI imagefile.jp2 [stateless/session] [JPT/JPP] [tcp/udp]"); System.out.println("Usage: java -jar opj_viewer.jar HTTP_server_URI imagefile.jp2 [hostname] [portnumber] [stateless/session] [JPT/JPP] [tcp/udp]");
return; return;
} }
ImageWindow frame = new ImageWindow( uri, j2kfilename, session, jppstream, aux); ImageWindow frame = new ImageWindow( uri, j2kfilename, host, port, session, jppstream, aux);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

View File

@@ -33,23 +33,32 @@ import java.net.*;
public class ImgdecClient{ public class ImgdecClient{
public static PnmImage decode_jpipstream( byte[] jpipstream, String tid, String cid, int fw, int fh) private String hostname;
private int portNo;
public ImgdecClient( String host, int port)
{
hostname = host;
portNo = port;
}
public PnmImage decode_jpipstream( byte[] jpipstream, String tid, String cid, int fw, int fh)
{ {
if( jpipstream != null) if( jpipstream != null)
send_JPIPstream( jpipstream); send_JPIPstream( jpipstream);
return get_PNMstream( cid, tid, fw, fh); return get_PNMstream( cid, tid, fw, fh);
} }
public static PnmImage decode_jpipstream( byte[] jpipstream, String j2kfilename, String tid, String cid, int fw, int fh) public PnmImage decode_jpipstream( byte[] jpipstream, String j2kfilename, String tid, String cid, int fw, int fh)
{ {
send_JPIPstream( jpipstream, j2kfilename, tid, cid); send_JPIPstream( jpipstream, j2kfilename, tid, cid);
return get_PNMstream( cid, tid, fw, fh); return get_PNMstream( cid, tid, fw, fh);
} }
public static void send_JPIPstream( byte[] jpipstream) public void send_JPIPstream( byte[] jpipstream)
{ {
try{ try{
Socket imgdecSocket = new Socket( "localhost", 50000); Socket imgdecSocket = new Socket( hostname, portNo);
DataOutputStream os = new DataOutputStream( imgdecSocket.getOutputStream()); DataOutputStream os = new DataOutputStream( imgdecSocket.getOutputStream());
DataInputStream is = new DataInputStream( imgdecSocket.getInputStream()); DataInputStream is = new DataInputStream( imgdecSocket.getInputStream());
@@ -71,10 +80,10 @@ public class ImgdecClient{
} }
} }
public static void send_JPIPstream( byte[] jpipstream, String j2kfilename, String tid, String cid) public void send_JPIPstream( byte[] jpipstream, String j2kfilename, String tid, String cid)
{ {
try{ try{
Socket imgdecSocket = new Socket( "localhost", 50000); Socket imgdecSocket = new Socket( hostname, portNo);
DataOutputStream os = new DataOutputStream( imgdecSocket.getOutputStream()); DataOutputStream os = new DataOutputStream( imgdecSocket.getOutputStream());
DataInputStream is = new DataInputStream( imgdecSocket.getInputStream()); DataInputStream is = new DataInputStream( imgdecSocket.getInputStream());
int length = 0; int length = 0;
@@ -109,12 +118,12 @@ public class ImgdecClient{
} }
} }
public static PnmImage get_PNMstream( String cid, String tid, int fw, int fh) public PnmImage get_PNMstream( String cid, String tid, int fw, int fh)
{ {
PnmImage pnmstream = null; PnmImage pnmstream = null;
try { try {
Socket imgdecSocket = new Socket( "localhost", 50000); Socket imgdecSocket = new Socket( hostname, portNo);
DataOutputStream os = new DataOutputStream( imgdecSocket.getOutputStream()); DataOutputStream os = new DataOutputStream( imgdecSocket.getOutputStream());
DataInputStream is = new DataInputStream( imgdecSocket.getInputStream()); DataInputStream is = new DataInputStream( imgdecSocket.getInputStream());
byte []header = new byte[7]; byte []header = new byte[7];
@@ -166,12 +175,12 @@ public class ImgdecClient{
return pnmstream; return pnmstream;
} }
public static byte [] get_XMLstream( String cid) public byte [] get_XMLstream( String cid)
{ {
byte []xmldata = null; byte []xmldata = null;
try{ try{
Socket imgdecSocket = new Socket( "localhost", 50000); Socket imgdecSocket = new Socket( hostname, portNo);
DataOutputStream os = new DataOutputStream( imgdecSocket.getOutputStream()); DataOutputStream os = new DataOutputStream( imgdecSocket.getOutputStream());
DataInputStream is = new DataInputStream( imgdecSocket.getInputStream()); DataInputStream is = new DataInputStream( imgdecSocket.getInputStream());
byte []header = new byte[5]; byte []header = new byte[5];
@@ -197,7 +206,7 @@ public class ImgdecClient{
return xmldata; return xmldata;
} }
public static String query_cid( String j2kfilename) public String query_cid( String j2kfilename)
{ {
int []retmsglabel = new int[3]; int []retmsglabel = new int[3];
retmsglabel[0] = 67; retmsglabel[0] = 67;
@@ -207,7 +216,7 @@ public class ImgdecClient{
return query_id( "CID request", j2kfilename, retmsglabel); return query_id( "CID request", j2kfilename, retmsglabel);
} }
public static String query_tid( String j2kfilename) public String query_tid( String j2kfilename)
{ {
int []retmsglabel = new int[3]; int []retmsglabel = new int[3];
retmsglabel[0] = 84; retmsglabel[0] = 84;
@@ -217,12 +226,12 @@ public class ImgdecClient{
return query_id( "TID request", j2kfilename, retmsglabel); return query_id( "TID request", j2kfilename, retmsglabel);
} }
public static String query_id( String reqmsghead, String j2kfilename, int[] retmsglabel) public String query_id( String reqmsghead, String j2kfilename, int[] retmsglabel)
{ {
String id = null; String id = null;
try{ try{
Socket imgdecSocket = new Socket( "localhost", 50000); Socket imgdecSocket = new Socket( hostname, portNo);
DataOutputStream os = new DataOutputStream( imgdecSocket.getOutputStream()); DataOutputStream os = new DataOutputStream( imgdecSocket.getOutputStream());
DataInputStream is = new DataInputStream( imgdecSocket.getInputStream()); DataInputStream is = new DataInputStream( imgdecSocket.getInputStream());
byte []header = new byte[4]; byte []header = new byte[4];
@@ -254,12 +263,12 @@ public class ImgdecClient{
return id; return id;
} }
public static java.awt.Dimension query_imagesize( String cid, String tid) public java.awt.Dimension query_imagesize( String cid, String tid)
{ {
java.awt.Dimension dim = null; java.awt.Dimension dim = null;
try{ try{
Socket imgdecSocket = new Socket( "localhost", 50000); Socket imgdecSocket = new Socket( hostname, portNo);
DataOutputStream os = new DataOutputStream( imgdecSocket.getOutputStream()); DataOutputStream os = new DataOutputStream( imgdecSocket.getOutputStream());
DataInputStream is = new DataInputStream( imgdecSocket.getInputStream()); DataInputStream is = new DataInputStream( imgdecSocket.getInputStream());
byte []header = new byte[3]; byte []header = new byte[3];
@@ -297,7 +306,7 @@ public class ImgdecClient{
return dim; return dim;
} }
public static void read_stream( DataInputStream is, byte []stream, int length) private static void read_stream( DataInputStream is, byte []stream, int length)
{ {
int remlen = length; int remlen = length;
int off = 0; int off = 0;
@@ -318,10 +327,10 @@ public class ImgdecClient{
} }
} }
public static void destroy_cid( String cid) public void destroy_cid( String cid)
{ {
try{ try{
Socket imgdecSocket = new Socket( "localhost", 50000); Socket imgdecSocket = new Socket( hostname, portNo);
DataOutputStream os = new DataOutputStream( imgdecSocket.getOutputStream()); DataOutputStream os = new DataOutputStream( imgdecSocket.getOutputStream());
DataInputStream is = new DataInputStream( imgdecSocket.getInputStream()); DataInputStream is = new DataInputStream( imgdecSocket.getInputStream());

View File

@@ -38,11 +38,11 @@ public class ImageWindow extends JFrame
private OptionPanel optpanel; private OptionPanel optpanel;
private ImageManager imgmanager; private ImageManager imgmanager;
public ImageWindow( String uri, String j2kfilename, boolean session, boolean jppstream, int aux) public ImageWindow( String uri, String j2kfilename, String host, int port, boolean session, boolean jppstream, int aux)
{ {
super( j2kfilename); super( j2kfilename);
imgmanager = new ImageManager( uri); imgmanager = new ImageManager( uri, host, port);
imgviewer = new ImageViewer( j2kfilename, imgmanager, session, jppstream, aux); imgviewer = new ImageViewer( j2kfilename, imgmanager, session, jppstream, aux);
imgviewer.setOpaque(true); //content panes must be opaque imgviewer.setOpaque(true); //content panes must be opaque
@@ -70,25 +70,36 @@ public class ImageWindow extends JFrame
public static void main(String s[]) public static void main(String s[])
{ {
String j2kfilename, uri; String j2kfilename, uri, host;
boolean session, jppstream; boolean session, jppstream;
int aux; // 0: none, 1: tcp, 2: udp int port, aux; // 0: none, 1: tcp, 2: udp
if(s.length >= 2){ if(s.length >= 2){
uri = s[0]; uri = s[0];
j2kfilename = s[1]; j2kfilename = s[1];
if( s.length > 2) if( s.length > 2)
session = !s[2].equalsIgnoreCase( "stateless"); host = s[2];
else
host = "localhost";
if( s.length > 3)
port = Integer.valueOf( s[3]).intValue();
else
port = 50000;
if( s.length > 4)
session = !s[4].equalsIgnoreCase( "stateless");
else else
session = true; session = true;
if( s.length > 3) if( s.length > 5)
jppstream = !s[3].equalsIgnoreCase( "JPT"); jppstream = !s[5].equalsIgnoreCase( "JPT");
else else
jppstream = true; jppstream = true;
if( s.length > 4){ if( s.length > 6){
if( s[4].equalsIgnoreCase("udp")) if( s[6].equalsIgnoreCase("udp"))
aux = 2; aux = 2;
else else
aux = 1; aux = 1;
@@ -97,10 +108,10 @@ public class ImageWindow extends JFrame
aux = 0; aux = 0;
} }
else{ else{
System.out.println("Usage: java -jar opj_viewer.jar HTTP_server_URI imagefile.jp2 [stateless/session] [JPT/JPP] [tcp/udp]"); System.out.println("Usage: java -jar opj_viewer.jar HTTP_server_URI imagefile.jp2 [hostname] [portnumber] [stateless/session] [JPT/JPP] [tcp/udp]");
return; return;
} }
ImageWindow frame = new ImageWindow( uri, j2kfilename, session, jppstream, aux); ImageWindow frame = new ImageWindow( uri, j2kfilename, host, port, session, jppstream, aux);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

View File

@@ -1,6 +1,8 @@
# Makefile for the MJ2 codecs of the OpenJPEG library: frames_to_mj2, mj2_to_frames, extract_j2k_from_mj2 and wrap_j2k_in_mj2 # Makefile for the MJ2 codecs of the OpenJPEG library: frames_to_mj2, mj2_to_frames, extract_j2k_from_mj2 and wrap_j2k_in_mj2
if(NOT USE_SYSTEM_GETOPT)
SET(common_SRCS ${OPENJPEG_SOURCE_DIR}/applications/common/opj_getopt.c) SET(common_SRCS ${OPENJPEG_SOURCE_DIR}/applications/common/opj_getopt.c)
endif()
# While mj2 executables do not use the API correctly, we do not link with the library but rather compile the sources files. # While mj2 executables do not use the API correctly, we do not link with the library but rather compile the sources files.
SET(OPJ_SRCS SET(OPJ_SRCS

View File

@@ -31,6 +31,7 @@
#include <string.h> #include <string.h>
#include "openjpeg.h" #include "openjpeg.h"
#include "cio.h"
#include "j2k.h" #include "j2k.h"
#include "jp2.h" #include "jp2.h"
#include "mj2.h" #include "mj2.h"
@@ -60,34 +61,52 @@ void info_callback(const char *msg, void *client_data) {
} }
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
#define JP2_RFC3745_MAGIC "\x00\x00\x00\x0c\x6a\x50\x20\x20\x0d\x0a\x87\x0a"
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
opj_dinfo_t* dinfo; opj_dinfo_t* dinfo;
opj_event_mgr_t event_mgr; /* event manager */ opj_event_mgr_t event_mgr; /* event manager */
int tnum; int tnum, failed;
unsigned int snum; unsigned int snum;
opj_mj2_t *movie; opj_mj2_t *movie;
mj2_tk_t *track; mj2_tk_t *track;
mj2_sample_t *sample; mj2_sample_t *sample;
unsigned char* frame_codestream; unsigned char* frame_codestream;
FILE *file, *outfile; FILE *mj2file, *outfile;
char outfilename[50]; char *outfilename;
mj2_dparameters_t parameters; mj2_dparameters_t parameters;
if (argc != 3) { if (argc != 3) {
printf("Usage: %s mj2filename output_location\n",argv[0]); printf("\nUsage: %s mj2filename output_location\n",argv[0]);
printf("Example: %s foreman.mj2 output/foreman\n",argv[0]); printf("Example: %s foreman.mj2 output/foreman\n\n",argv[0]);
return 1; return 1;
} }
file = fopen(argv[1], "rb"); mj2file = fopen(argv[1], "rb");
if (!file) { if (!mj2file) {
fprintf(stderr, "failed to open %s for reading\n", argv[1]); fprintf(stderr, "failed to open %s for reading\n", argv[1]);
return 1; return 1;
} }
{
unsigned char buf[28];
memset(buf, 0, 28);
fread(buf, 1, 24, mj2file);
if(memcmp(buf, JP2_RFC3745_MAGIC, 12) == 0
&& memcmp(buf+20, "\x6d\x6a\x70\x32", 4) == 0)
{
rewind(mj2file);
}
else
{
fclose(mj2file);
fprintf(stderr,"%s:%d: %s\n\tThis file is not an MJ2 file."
"Quitting\n",__FILE__,__LINE__, argv[0]);
return 1;
}
}
/* /*
configure the event callbacks (not required) configure the event callbacks (not required)
setting of each callback is optionnal setting of each callback is optionnal
@@ -97,9 +116,15 @@ int main(int argc, char *argv[]) {
event_mgr.warning_handler = warning_callback; event_mgr.warning_handler = warning_callback;
event_mgr.info_handler = info_callback; event_mgr.info_handler = info_callback;
failed = 1;
outfilename = (char*)malloc(strlen(argv[2]) + 32);
if(outfilename == NULL) goto fin;
/* get a MJ2 decompressor handle */ /* get a MJ2 decompressor handle */
dinfo = mj2_create_decompress(); dinfo = mj2_create_decompress();
if(dinfo == NULL) goto fin;
/* catch events using our callbacks and give a local context */ /* catch events using our callbacks and give a local context */
opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr); opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr);
@@ -108,42 +133,62 @@ int main(int argc, char *argv[]) {
movie = (opj_mj2_t*) dinfo->mj2_handle; movie = (opj_mj2_t*) dinfo->mj2_handle;
mj2_setup_decoder(movie, &parameters); mj2_setup_decoder(movie, &parameters);
if (mj2_read_struct(file, movie)) // Creating the movie structure /* Create the movie structure: */
return 1; if (mj2_read_struct(mj2file, movie))
goto fin;
// Decode first video track /* Decode first video track : */
tnum = 0; tnum = 0;
while (movie->tk[tnum].track_type != 0) while (movie->tk[tnum].track_type != 0)
tnum ++; tnum ++;
track = &movie->tk[tnum]; track = &movie->tk[tnum];
if(track->jp2_struct.enumcs != ENUMCS_SRGB
&& track->jp2_struct.enumcs != ENUMCS_GRAY)
{
fprintf(stderr,"%s:%d: %s\n"
"\tERROR: this MJ2 file does not contain J2K frames.\n"
"\tPlease try mj2_to_frames for this file.\n",
__FILE__,__LINE__, argv[0]);
goto fin;
}
fprintf(stdout,"Extracting %d frames from file...\n",track->num_samples); fprintf(stdout,"Extracting %d frames from file...\n",track->num_samples);
for (snum=0; snum < track->num_samples; snum++) for (snum=0; snum < track->num_samples; snum++)
{ {
sample = &track->sample[snum]; sample = &track->sample[snum];
frame_codestream = (unsigned char*) malloc (sample->sample_size-8); // Skipping JP2C marker frame_codestream = (unsigned char*)
fseek(file,sample->offset+8,SEEK_SET); malloc (sample->sample_size-8); /* Skipping JP2C marker */
fread(frame_codestream,sample->sample_size-8,1, file); // Assuming that jp and ftyp markers size do fseek(mj2file,sample->offset+8,SEEK_SET);
/* Assuming that jp and ftyp markers size do: */
fread(frame_codestream,sample->sample_size-8,1, mj2file);
sprintf(outfilename,"%s_%05d.j2k",argv[2],snum); sprintf(outfilename,"%s_%05d.j2k",argv[2],snum);
outfile = fopen(outfilename, "wb"); outfile = fopen(outfilename, "wb");
if (!outfile) { if (!outfile) {
fprintf(stderr, "failed to open %s for writing\n",outfilename); fprintf(stderr, "failed to open %s for writing\n",outfilename);
return 1; goto fin;
} }
fwrite(frame_codestream,sample->sample_size-8,1,outfile); fwrite(frame_codestream,sample->sample_size-8,1,outfile);
fclose(outfile); fclose(outfile);
free(frame_codestream); free(frame_codestream);
} }
fclose(file);
fprintf(stdout, "%d frames correctly extracted\n", snum); fprintf(stdout, "%d frames correctly extracted\n", snum);
failed = 0;
fin:
fclose(mj2file);
free(outfilename);
/* free remaining structures */ /* free remaining structures */
if(dinfo) { if(dinfo)
mj2_destroy_decompress((opj_mj2_t*)dinfo->mj2_handle); {
} mj2_destroy_decompress(movie);
free(dinfo);
}
return 0; return failed;
} }/* main() */

View File

@@ -31,9 +31,9 @@
#include "openjpeg.h" #include "openjpeg.h"
#include "j2k_lib.h" #include "j2k_lib.h"
#include "cio.h"
#include "j2k.h" #include "j2k.h"
#include "jp2.h" #include "jp2.h"
#include "cio.h"
#include "mj2.h" #include "mj2.h"
#include "mj2_convert.h" #include "mj2_convert.h"
#include "opj_getopt.h" #include "opj_getopt.h"
@@ -43,10 +43,6 @@ Size of memory first allocated for MOOV box
*/ */
#define TEMP_BUF 10000 #define TEMP_BUF 10000
#define ENUMCS_GRAY 16
#define ENUMCS_SRGB 17
#define ENUMCS_SYCC 18
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
/** /**
@@ -238,7 +234,7 @@ int main(int argc, char **argv)
opj_cparameters_t *j2k_parameters; /* J2K compression parameters */ opj_cparameters_t *j2k_parameters; /* J2K compression parameters */
opj_event_mgr_t event_mgr; /* event manager */ opj_event_mgr_t event_mgr; /* event manager */
opj_cio_t *cio; opj_cio_t *cio;
int value; int value, failed;
opj_mj2_t *movie; opj_mj2_t *movie;
opj_image_t *img; opj_image_t *img;
int i, j; int i, j;
@@ -257,13 +253,13 @@ int main(int argc, char **argv)
memset(&mj2_parameters, 0, sizeof(mj2_cparameters_t)); memset(&mj2_parameters, 0, sizeof(mj2_cparameters_t));
/* default value */ /* default value */
/* ------------- */ /* ------------- */
mj2_parameters.w = 352; // CIF default value mj2_parameters.w = 352; /* CIF default value */
mj2_parameters.h = 288; // CIF default value mj2_parameters.h = 288; /* CIF default value */
mj2_parameters.CbCr_subsampling_dx = 2; // CIF default value mj2_parameters.CbCr_subsampling_dx = 2; /* CIF default value */
mj2_parameters.CbCr_subsampling_dy = 2; // CIF default value mj2_parameters.CbCr_subsampling_dy = 2; /* CIF default value */
mj2_parameters.frame_rate = 25; mj2_parameters.frame_rate = 25;
mj2_parameters.prec = 8; /* DEFAULT */ mj2_parameters.prec = 8; /* DEFAULT */
mj2_parameters.enumcs = ENUMCS_SYCC; /* FIXME: ENUMCS_YUV420 */ mj2_parameters.enumcs = ENUMCS_SYCC;
mj2_parameters.meth = 1; /* enumerated color space */ mj2_parameters.meth = 1; /* enumerated color space */
/* /*
@@ -620,7 +616,7 @@ int main(int argc, char **argv)
/* -------------- */ /* -------------- */
if (!mj2_parameters.cod_format || !mj2_parameters.decod_format) { if (!mj2_parameters.cod_format || !mj2_parameters.decod_format) {
fprintf(stderr, fprintf(stderr,
"Usage: %s -i yuv-file -o mj2-file (+ options)\n",argv[0]); "\nUsage: %s -i yuv-file -o mj2-file (+ options)\n\n",argv[0]);
return 1; return 1;
} }
if(prec < 1 || prec > 16) if(prec < 1 || prec > 16)
@@ -682,9 +678,11 @@ int main(int argc, char **argv)
fprintf(stderr, "failed to open %s for writing\n", argv[2]); fprintf(stderr, "failed to open %s for writing\n", argv[2]);
return 1; return 1;
} }
failed = 1;
/* get a MJ2 decompressor handle */ /* get a MJ2 decompressor handle */
cinfo = mj2_create_compress(); cinfo = mj2_create_compress();
if(cinfo == NULL) goto fin;
movie = (opj_mj2_t*)cinfo->mj2_handle; movie = (opj_mj2_t*)cinfo->mj2_handle;
/* catch events using our callbacks and give a local context */ /* catch events using our callbacks and give a local context */
@@ -697,27 +695,33 @@ int main(int argc, char **argv)
yuv_num_frames(&movie->tk[0],mj2_parameters.infile); yuv_num_frames(&movie->tk[0],mj2_parameters.infile);
if (movie->tk[0].num_samples == 0) { if (movie->tk[0].num_samples == 0) {
return 1; goto fin;
} }
// One sample per chunk /* One sample per chunk */
movie->tk[0].chunk = (mj2_chunk_t*) movie->tk[0].chunk = (mj2_chunk_t*)
malloc(movie->tk[0].num_samples * sizeof(mj2_chunk_t)); malloc(movie->tk[0].num_samples * sizeof(mj2_chunk_t));
movie->tk[0].sample = (mj2_sample_t*) movie->tk[0].sample = (mj2_sample_t*)
malloc(movie->tk[0].num_samples * sizeof(mj2_sample_t)); malloc(movie->tk[0].num_samples * sizeof(mj2_sample_t));
if(movie->tk[0].chunk == NULL || movie->tk[0].sample == NULL)
goto fin;
if (mj2_init_stdmovie(movie)) { if (mj2_init_stdmovie(movie)) {
fprintf(stderr, "Error with movie initialization"); fprintf(stderr, "Error with movie initialization");
return 1; goto fin;
} }
// Writing JP, FTYP and MDAT boxes /* Writing JP, FTYP and MDAT boxes */
// Assuming that the JP and FTYP boxes won't be longer than 300 bytes: /* Assuming that the JP and FTYP boxes won't be longer than 300 bytes:*/
buf = (unsigned char*) buf = (unsigned char*)
malloc (300 * sizeof(unsigned char)); malloc (300 * sizeof(unsigned char));
if(buf == NULL) goto fin;
cio = opj_cio_open((opj_common_ptr)movie->cinfo, buf, 300); cio = opj_cio_open((opj_common_ptr)movie->cinfo, buf, 300);
if(cio == NULL) goto fin;
mj2_write_jp(cio); mj2_write_jp(cio);
mj2_write_ftyp(movie, cio); mj2_write_ftyp(movie, cio);
@@ -729,42 +733,52 @@ int main(int argc, char **argv)
fwrite(buf,cio_tell(cio),1,mj2file); fwrite(buf,cio_tell(cio),1,mj2file);
offset = cio_tell(cio); offset = cio_tell(cio);
/* if(cio->openmode == OPJ_STREAM_READ) */ free(buf);
opj_cio_close(cio); opj_cio_close(cio);
free(buf); buf = NULL; numframes = 0;
for(i = 0; i < movie->num_stk + movie->num_htk + movie->num_vtk; i++) for(i = 0; i < movie->num_stk + movie->num_htk + movie->num_vtk; i++)
{ {
if(movie->tk[i].track_type != 0) mj2_tk_t *track;
track = &movie->tk[i];
numframes = track->num_samples;
if(track->track_type != 0)
{ {
fprintf(stderr, "Unable to write sound or hint tracks\n"); fprintf(stderr, "Unable to write sound or hint tracks\n");
} }
else else
{ {
mj2_tk_t *tk;
int buflen = 0; int buflen = 0;
tk = &movie->tk[i]; track->num_chunks = track->num_samples;
tk->num_chunks = tk->num_samples; track->depth = prec;
numframes = tk->num_samples;
tk->depth = prec;
fprintf(stderr, "Video Track number %d\n", i); fprintf(stderr, "Video Track number %d\n", i);
img = mj2_image_create(tk, j2k_parameters); img = mj2_image_create(track, j2k_parameters);
if(img == NULL) goto fin;
buflen = 2 * (tk->w * tk->h * 8); buflen = 2 * (track->w * track->h * 8);
buf = (unsigned char *) malloc(buflen*sizeof(unsigned char)); buf = (unsigned char *) malloc(buflen*sizeof(unsigned char));
if(buf == NULL)
{
opj_image_destroy(img);
goto fin;
}
for(sampleno = 0; sampleno < numframes; sampleno++) for(sampleno = 0; sampleno < numframes; sampleno++)
{ {
double init_time = opj_clock(); double init_time = opj_clock();
double elapsed_time; double elapsed_time;
if(yuvtoimage(tk, img, sampleno, j2k_parameters, if(yuvtoimage(track, img, sampleno, j2k_parameters,
mj2_parameters.infile)) mj2_parameters.infile))
{ {
fprintf(stderr, "Error with frame number %d in YUV file\n", sampleno); fprintf(stderr, "Error with frame number %d in YUV file\n", sampleno);
return 1; opj_image_destroy(img);
goto fin;
} }
/* setup the encoder parameters using the current image and user parameters */ /* setup the encoder parameters using the current image and user parameters */
@@ -772,16 +786,21 @@ int main(int argc, char **argv)
cio = opj_cio_open((opj_common_ptr)movie->cinfo, buf, buflen); cio = opj_cio_open((opj_common_ptr)movie->cinfo, buf, buflen);
if(cio == NULL) goto fin;
cio_skip(cio, 4); cio_skip(cio, 4);
cio_write(cio, JP2_JP2C, 4); // JP2C cio_write(cio, JP2_JP2C, 4);
/* encode the image */ /* encode the image */
bSuccess = opj_encode(cinfo, cio, img, NULL); bSuccess = opj_encode(cinfo, cio, img, NULL);
if (!bSuccess) { if (!bSuccess) {
opj_image_destroy(img);
/* if(cio->openmode == OPJ_STREAM_READ) */ free(buf);
opj_cio_close(cio); opj_cio_close(cio);
buf = NULL;
fprintf(stderr, "failed to encode image\n"); fprintf(stderr, "failed to encode image\n");
return 1; goto fin;
} }
len = cio_tell(cio) - 8; len = cio_tell(cio) - 8;
@@ -789,9 +808,9 @@ int main(int argc, char **argv)
cio_write(cio, len+8,4); cio_write(cio, len+8,4);
opj_cio_close(cio); opj_cio_close(cio);
tk->sample[sampleno].sample_size = len+8; track->sample[sampleno].sample_size = len+8;
tk->sample[sampleno].offset = offset; track->sample[sampleno].offset = offset;
tk->chunk[sampleno].offset = offset; // There is one sample per chunk track->chunk[sampleno].offset = offset; /* There is one sample per chunk */
fwrite(buf, 1, len+8, mj2file); fwrite(buf, 1, len+8, mj2file);
offset += len+8; offset += len+8;
@@ -801,43 +820,59 @@ int main(int argc, char **argv)
total_time += elapsed_time; total_time += elapsed_time;
} /* for(sampleno */ } /* for(sampleno */
free(buf); free(buf); buf = NULL;
opj_image_destroy(img); opj_image_destroy(img);
} } /* if(track ) */
}/* for(i */ }/* for(i */
fseek(mj2file, mdat_initpos, SEEK_SET); fseek(mj2file, mdat_initpos, SEEK_SET);
buf = (unsigned char*) malloc(4*sizeof(unsigned char)); buf = (unsigned char*) malloc(4*sizeof(unsigned char));
// Init a cio to write box length variable in a little endian way if(buf == NULL) goto fin;
/* Init a cio to write box length variable in a little endian way */
cio = opj_cio_open(NULL, buf, 4); cio = opj_cio_open(NULL, buf, 4);
if(cio == NULL) goto fin;
cio_write(cio, offset - mdat_initpos, 4); cio_write(cio, offset - mdat_initpos, 4);
fwrite(buf, 4, 1, mj2file); fwrite(buf, 4, 1, mj2file);
fseek(mj2file,0,SEEK_END); fseek(mj2file,0,SEEK_END);
free(buf); /* if(cio->openmode == OPJ_STREAM_READ) */ free(buf);
opj_cio_close(cio);
// Writing MOOV box /* Writing MOOV box */
buf = (unsigned char*) buf = (unsigned char*)
malloc ((TEMP_BUF+numframes*20) * sizeof(unsigned char)); malloc ((TEMP_BUF+numframes*20) * sizeof(unsigned char));
if(buf == NULL) goto fin;
cio = opj_cio_open(movie->cinfo, buf, (TEMP_BUF+numframes*20)); cio = opj_cio_open(movie->cinfo, buf, (TEMP_BUF+numframes*20));
if(cio == NULL) goto fin;
mj2_write_moov(movie, cio); mj2_write_moov(movie, cio);
fwrite(buf,cio_tell(cio),1,mj2file); fwrite(buf,cio_tell(cio),1,mj2file);
free(buf); /* if(cio->openmode == OPJ_STREAM_READ) */ free(buf);
opj_cio_close(cio);
fprintf(stdout,"Total encoding time: %.2f s for %d frames (%.1f fps)\n", fprintf(stdout,"Total encoding time: %.2f s for %d frames (%.1f fps)\n",
total_time, numframes, (float)numframes/total_time); total_time, numframes, (float)numframes/total_time);
failed = 0;
// Ending program fin:
fclose(mj2file); fclose(mj2file);
/* free remaining compression structures */ /* free remaining compression structures */
if(cinfo)
{
mj2_destroy_compress(movie); mj2_destroy_compress(movie);
free(cinfo); free(cinfo);
}
if(j2k_parameters->cp_comment) free(j2k_parameters->cp_comment); if(j2k_parameters->cp_comment) free(j2k_parameters->cp_comment);
if(j2k_parameters->cp_matrice) free(j2k_parameters->cp_matrice); if(j2k_parameters->cp_matrice) free(j2k_parameters->cp_matrice);
opj_cio_close(cio);
return 0; if(failed) remove(mj2_parameters.outfile);
return failed;
} }

View File

@@ -1096,8 +1096,8 @@ int mj2_read_smj2(opj_image_t * img, mj2_tk_t * tk, opj_cio_t *cio)
{ {
mj2_box_t box; mj2_box_t box;
mj2_box_t box2; mj2_box_t box2;
int i;
opj_jp2_color_t color; opj_jp2_color_t color;
int i;
opj_bool ok; opj_bool ok;
mj2_read_boxhdr(&box, cio); mj2_read_boxhdr(&box, cio);
@@ -1236,10 +1236,10 @@ void mj2_write_stsd(mj2_tk_t * tk, opj_cio_t *cio)
if (tk->track_type == 0) { if (tk->track_type == 0) {
mj2_write_smj2(tk, cio); mj2_write_smj2(tk, cio);
} else if (tk->track_type == 1) { } else if (tk->track_type == 1) {
// Not implemented /* Not implemented */
} }
if (tk->track_type == 2) { if (tk->track_type == 2) {
// Not implemented /* Not implemented */
} }
@@ -1287,10 +1287,10 @@ int mj2_read_stsd(mj2_tk_t * tk, opj_image_t * img, opj_cio_t *cio)
return 1; return 1;
} }
} else if (tk->track_type == 1) { } else if (tk->track_type == 1) {
len_2skip = cio_read(cio, 4); // Not implemented -> skipping box len_2skip = cio_read(cio, 4); /* Not implemented -> skipping box */
cio_skip(cio,len_2skip - 4); cio_skip(cio,len_2skip - 4);
} else if (tk->track_type == 2) { } else if (tk->track_type == 2) {
len_2skip = cio_read(cio, 4); // Not implemented -> skipping box len_2skip = cio_read(cio, 4); /* Not implemented -> skipping box */
cio_skip(cio,len_2skip - 4); cio_skip(cio,len_2skip - 4);
} }
@@ -2111,7 +2111,7 @@ int mj2_read_mdhd(mj2_tk_t * tk, opj_cio_t *cio)
mj2_box_t box; mj2_box_t box;
mj2_read_boxhdr(&box, cio); mj2_read_boxhdr(&box, cio);
if (!(MJ2_MHDR == box.type || MJ2_MDHD == box.type)) { // Kakadu writes MHDR instead of MDHD if (!(MJ2_MHDR == box.type || MJ2_MDHD == box.type)) { /* Kakadu writes MHDR instead of MDHD */
opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected MDHD Marker\n"); opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected MDHD Marker\n");
return 1; return 1;
} }
@@ -2765,10 +2765,10 @@ void mj2_destroy_decompress(opj_mj2_t *movie) {
tk = &movie->tk[i]; tk = &movie->tk[i];
if (tk->name_size != 0) if (tk->name_size != 0)
opj_free(tk->name); opj_free(tk->name);
if (tk->track_type == 0) {// Video track if (tk->track_type == 0) {/* Video track */
if (tk->jp2_struct.comps != 0) if (tk->jp2_struct.comps != NULL)
opj_free(tk->jp2_struct.comps); opj_free(tk->jp2_struct.comps);
if (tk->jp2_struct.cl != 0) if (tk->jp2_struct.cl != NULL)
opj_free(tk->jp2_struct.cl); opj_free(tk->jp2_struct.cl);
if (tk->num_jp2x != 0) if (tk->num_jp2x != 0)
opj_free(tk->jp2xdata); opj_free(tk->jp2xdata);
@@ -2821,20 +2821,20 @@ void mj2_setup_encoder(opj_mj2_t *movie, mj2_cparameters_t *parameters) {
if(movie && parameters) { if(movie && parameters) {
opj_jp2_t *jp2_struct; opj_jp2_t *jp2_struct;
movie->num_htk = 0; // No hint tracks movie->num_htk = 0; /* No hint tracks */
movie->num_stk = 0; // No sound tracks movie->num_stk = 0; /* No sound tracks */
movie->num_vtk = 1; // One video track movie->num_vtk = 1; /* One video track */
movie->brand = MJ2_MJ2; // One brand: MJ2 movie->brand = MJ2_MJ2; /* One brand: MJ2 */
movie->num_cl = 2; // Two compatible brands: MJ2 and MJ2S movie->num_cl = 2; /* Two compatible brands: MJ2 and MJ2S */
movie->cl = (unsigned int*) opj_malloc(movie->num_cl * sizeof(unsigned int)); movie->cl = (unsigned int*) opj_malloc(movie->num_cl * sizeof(unsigned int));
movie->cl[0] = MJ2_MJ2; movie->cl[0] = MJ2_MJ2;
movie->cl[1] = MJ2_MJ2S; movie->cl[1] = MJ2_MJ2S;
movie->minversion = 0; // Minimum version: 0 movie->minversion = 0; /* Minimum version: 0 */
movie->tk = (mj2_tk_t*) opj_malloc(sizeof(mj2_tk_t)); //Memory allocation for the video track movie->tk = (mj2_tk_t*) opj_malloc(sizeof(mj2_tk_t)); /*Memory allocation for the video track*/
movie->tk[0].track_ID = 1; // Track ID = 1 movie->tk[0].track_ID = 1; /* Track ID = 1 */
movie->tk[0].track_type = 0; // Video track movie->tk[0].track_type = 0; /* Video track */
movie->tk[0].Dim[0] = parameters->Dim[0]; movie->tk[0].Dim[0] = parameters->Dim[0];
movie->tk[0].Dim[1] = parameters->Dim[1]; movie->tk[0].Dim[1] = parameters->Dim[1];
movie->tk[0].w = parameters->w; movie->tk[0].w = parameters->w;
@@ -2848,7 +2848,7 @@ void mj2_setup_encoder(opj_mj2_t *movie, mj2_cparameters_t *parameters) {
movie->tk[0].depth = parameters->prec; movie->tk[0].depth = parameters->prec;
jp2_struct = &movie->tk[0].jp2_struct; jp2_struct = &movie->tk[0].jp2_struct;
jp2_struct->numcomps = parameters->numcomps; // NC jp2_struct->numcomps = parameters->numcomps; /* NC */
jp2_struct->comps = (opj_jp2_comps_t*) opj_malloc(jp2_struct->numcomps * sizeof(opj_jp2_comps_t)); jp2_struct->comps = (opj_jp2_comps_t*) opj_malloc(jp2_struct->numcomps * sizeof(opj_jp2_comps_t));
jp2_struct->precedence = 0; /* PRECEDENCE*/ jp2_struct->precedence = 0; /* PRECEDENCE*/
jp2_struct->approx = 0; /* APPROX*/ jp2_struct->approx = 0; /* APPROX*/
@@ -2884,10 +2884,10 @@ void mj2_destroy_compress(opj_mj2_t *movie) {
tk = &movie->tk[i]; tk = &movie->tk[i];
if (tk->name_size != 0) if (tk->name_size != 0)
opj_free(tk->name); opj_free(tk->name);
if (tk->track_type == 0) {// Video track if (tk->track_type == 0) {/* Video track */
if (tk->jp2_struct.comps != 0) if (tk->jp2_struct.comps != NULL)
opj_free(tk->jp2_struct.comps); opj_free(tk->jp2_struct.comps);
if (tk->jp2_struct.cl != 0) if (tk->jp2_struct.cl != NULL)
opj_free(tk->jp2_struct.cl); opj_free(tk->jp2_struct.cl);
if (tk->num_jp2x != 0) if (tk->num_jp2x != 0)
opj_free(tk->jp2xdata); opj_free(tk->jp2xdata);

View File

@@ -137,7 +137,7 @@ typedef struct mj2_url {
URN URN
*/ */
typedef struct mj2_urn { typedef struct mj2_urn {
int name[2]; int name[4];
int location[4]; int location[4];
} mj2_urn_t; } mj2_urn_t;

View File

@@ -67,12 +67,12 @@ unsigned int yuv_num_frames(mj2_tk_t * tk, char *infile)
return (unsigned int)(end_of_f / frame_size); return (unsigned int)(end_of_f / frame_size);
} }
// ----------------------- /* -----------------------
//
//
// YUV to IMAGE YUV to IMAGE
//
// ----------------------- -----------------------*/
opj_image_t *mj2_image_create(mj2_tk_t * tk, opj_cparameters_t *parameters) opj_image_t *mj2_image_create(mj2_tk_t * tk, opj_cparameters_t *parameters)
{ {
@@ -169,12 +169,12 @@ char yuvtoimage(mj2_tk_t * tk, opj_image_t * img, int frame_num, opj_cparameters
// ----------------------- /* -----------------------
//
//
// IMAGE to YUV IMAGE to YUV
//
// ----------------------- -----------------------*/
opj_bool imagetoyuv(opj_image_t * img, char *outfile) opj_bool imagetoyuv(opj_image_t * img, char *outfile)
@@ -263,12 +263,12 @@ opj_bool imagetoyuv(opj_image_t * img, char *outfile)
return OPJ_TRUE; return OPJ_TRUE;
} }
// ----------------------- /* -----------------------
//
//
// IMAGE to BMP IMAGE to BMP
//
// ----------------------- -----------------------*/
int imagetobmp(opj_image_t * img, char *outfile) { int imagetobmp(opj_image_t * img, char *outfile) {
int w,wr,h,hr,i,pad; int w,wr,h,hr,i,pad;
@@ -353,11 +353,11 @@ int imagetobmp(opj_image_t * img, char *outfile) {
for (i = 0; i < wr * hr; i++) { for (i = 0; i < wr * hr; i++) {
unsigned char R, G, B; unsigned char R, G, B;
/* a modifier */ /* a modifier */
// R = img->comps[0].data[w * h - ((i) / (w) + 1) * w + (i) % (w)]; /* R = img->comps[0].data[w * h - ((i) / (w) + 1) * w + (i) % (w)];*/
R = img->comps[0].data[w * hr - ((i) / (wr) + 1) * w + (i) % (wr)]; R = img->comps[0].data[w * hr - ((i) / (wr) + 1) * w + (i) % (wr)];
// G = img->comps[1].data[w * h - ((i) / (w) + 1) * w + (i) % (w)]; /* G = img->comps[1].data[w * h - ((i) / (w) + 1) * w + (i) % (w)];*/
G = img->comps[1].data[w * hr - ((i) / (wr) + 1) * w + (i) % (wr)]; G = img->comps[1].data[w * hr - ((i) / (wr) + 1) * w + (i) % (wr)];
// B = img->comps[2].data[w * h - ((i) / (w) + 1) * w + (i) % (w)]; /* B = img->comps[2].data[w * h - ((i) / (w) + 1) * w + (i) % (w)];*/
B = img->comps[2].data[w * hr - ((i) / (wr) + 1) * w + (i) % (wr)]; B = img->comps[2].data[w * hr - ((i) / (wr) + 1) * w + (i) % (wr)];
fprintf(f, "%c%c%c", B, G, R); fprintf(f, "%c%c%c", B, G, R);

View File

@@ -69,45 +69,67 @@ void info_callback(const char *msg, void *client_data) {
} }
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
#define JP2_RFC3745_MAGIC "\x00\x00\x00\x0c\x6a\x50\x20\x20\x0d\x0a\x87\x0a"
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
mj2_dparameters_t mj2_parameters; /* decompression parameters */ mj2_dparameters_t mj2_parameters; /* decompression parameters */
opj_dinfo_t* dinfo; opj_dinfo_t* dinfo;
opj_event_mgr_t event_mgr; /* event manager */ opj_event_mgr_t event_mgr; /* event manager */
opj_cio_t *cio = NULL; opj_cio_t *cio = NULL;
unsigned int tnum, snum; unsigned int tnum, snum, failed;
opj_mj2_t *movie; opj_mj2_t *movie;
mj2_tk_t *track; mj2_tk_t *track;
mj2_sample_t *sample; mj2_sample_t *sample;
unsigned char* frame_codestream; unsigned char* frame_codestream;
FILE *file, *outfile; FILE *infile, *outfile;
char outfilename[50];
opj_image_t *img = NULL; opj_image_t *img = NULL;
unsigned int max_codstrm_size = 0; unsigned int max_codstrm_size = 0;
double total_time = 0; double total_time = 0;
unsigned int numframes = 0; unsigned int numframes = 0;
if (argc != 3) { if (argc != 3) {
printf("Usage: %s inputfile.mj2 outputfile.yuv\n",argv[0]); printf("\nUsage: %s inputfile.mj2 outputfile.yuv\n\n",argv[0]);
return 1; return 1;
} }
file = fopen(argv[1], "rb"); infile = fopen(argv[1], "rb");
if (!file) { if (!infile) {
fprintf(stderr, "failed to open %s for reading\n", argv[1]); fprintf(stderr, "failed to open %s for reading\n", argv[1]);
return 1; return 1;
} }
{
unsigned char buf[28];
size_t n;
// Checking output file memset(buf, 0, 28);
outfile = fopen(argv[2], "w"); n = fread(buf, 1, 24, infile);
if (!file) {
fprintf(stderr, "failed to open %s for writing\n", argv[2]); if(memcmp(buf, JP2_RFC3745_MAGIC, 12) == 0
return 1; && memcmp(buf+20, "\x6d\x6a\x70\x32", 4) == 0)
{
rewind(infile);
} }
fclose(outfile); else
{
fclose(infile);
fprintf(stderr,"%s:%d: %s\n\tThis file is not an MJ2 file."
"Quitting\n",__FILE__,__LINE__,argv[0]);
return 1;
}
}
/* Checking output file: */
outfile = fopen(argv[2], "w");
if (!outfile) {
fprintf(stderr, "failed to open %s for writing\n", argv[2]);
fclose(infile);
return 1;
}
fclose(outfile); remove(argv[2]);
frame_codestream = NULL;
failed = 1;
/* /*
configure the event callbacks (not required) configure the event callbacks (not required)
setting of each callback is optionnal setting of each callback is optionnal
@@ -119,6 +141,8 @@ int main(int argc, char *argv[]) {
/* get a MJ2 decompressor handle */ /* get a MJ2 decompressor handle */
dinfo = mj2_create_decompress(); dinfo = mj2_create_decompress();
if(dinfo == NULL) goto fin;
movie = (opj_mj2_t*)dinfo->mj2_handle; movie = (opj_mj2_t*)dinfo->mj2_handle;
/* catch events using our callbacks and give a local context */ /* catch events using our callbacks and give a local context */
@@ -131,10 +155,11 @@ int main(int argc, char *argv[]) {
/* setup the decoder decoding parameters using user parameters */ /* setup the decoder decoding parameters using user parameters */
mj2_setup_decoder(movie, &mj2_parameters); mj2_setup_decoder(movie, &mj2_parameters);
if (mj2_read_struct(file, movie)) // Creating the movie structure /* Create the movie structure: */
return 1; if (mj2_read_struct(infile, movie))
goto fin;
// Decode first video track /* Decode first video track */
for (tnum=0; tnum < (unsigned int)(movie->num_htk + movie->num_stk + movie->num_vtk); tnum++) { for (tnum=0; tnum < (unsigned int)(movie->num_htk + movie->num_stk + movie->num_vtk); tnum++) {
if (movie->tk[tnum].track_type == 0) if (movie->tk[tnum].track_type == 0)
break; break;
@@ -142,24 +167,34 @@ int main(int argc, char *argv[]) {
if (movie->tk[tnum].track_type != 0) { if (movie->tk[tnum].track_type != 0) {
printf("Error. Movie does not contain any video track\n"); printf("Error. Movie does not contain any video track\n");
return 1; goto fin;
} }
track = &movie->tk[tnum]; track = &movie->tk[tnum];
// Output info on first video tracl if(track->jp2_struct.enumcs != ENUMCS_SYCC)
{
fprintf(stderr,"%s:%d: %s\n"
"\tERROR: this MJ2 file does not contain YUV frames.\n"
"\tPlease try extract_j2k_from_mj2 for this file.\n",
__FILE__,__LINE__,argv[0]);
goto fin;
}
/* Output info on first video track: */
fprintf(stdout,"The first video track contains %d frames.\nWidth: %d, Height: %d \n\n", fprintf(stdout,"The first video track contains %d frames.\nWidth: %d, Height: %d \n\n",
track->num_samples, track->w, track->h); track->num_samples, track->w, track->h);
max_codstrm_size = track->sample[0].sample_size-8; max_codstrm_size = track->sample[0].sample_size-8;
frame_codestream = (unsigned char*) malloc(max_codstrm_size * sizeof(unsigned char)); frame_codestream = (unsigned char*)
malloc(max_codstrm_size * sizeof(unsigned char));
if(frame_codestream == NULL) goto fin;
numframes = track->num_samples; numframes = track->num_samples;
for (snum=0; snum < numframes; snum++) for (snum=0; snum < numframes; snum++)
{ {
double init_time = opj_clock(); double init_time = opj_clock();
double elapsed_time; double elapsed_time;
sample = &track->sample[snum]; sample = &track->sample[snum];
if (sample->sample_size-8 > max_codstrm_size) { if (sample->sample_size-8 > max_codstrm_size) {
@@ -167,85 +202,54 @@ int main(int argc, char *argv[]) {
if ((frame_codestream = (unsigned char*) if ((frame_codestream = (unsigned char*)
realloc(frame_codestream, max_codstrm_size)) == NULL) { realloc(frame_codestream, max_codstrm_size)) == NULL) {
printf("Error reallocation memory\n"); printf("Error reallocation memory\n");
return 1; goto fin;
}; };
} }
fseek(file,sample->offset+8,SEEK_SET); fseek(infile,sample->offset+8,SEEK_SET);
fread(frame_codestream, sample->sample_size-8, 1, file); // Assuming that jp and ftyp markers size do /* Assuming that jp and ftyp markers size do: */
fread(frame_codestream, sample->sample_size-8, 1, infile);
/* open a byte stream */ /* open a byte stream */
cio = opj_cio_open((opj_common_ptr)dinfo, frame_codestream, sample->sample_size-8); cio = opj_cio_open((opj_common_ptr)dinfo, frame_codestream, sample->sample_size-8);
img = opj_decode(dinfo, cio); // Decode J2K to image if(cio == NULL) goto fin;
#ifdef WANT_SYCC_TO_RGB img = opj_decode(dinfo, cio);
if(img->color_space == CLRSPC_SYCC)
{
color_sycc_to_rgb(img);
}
#endif
if(img->icc_profile_buf) if(img == NULL) goto fin;
{
#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
color_apply_icc_profile(img);
#endif
free(img->icc_profile_buf); /* Convert frame to YUV: */
img->icc_profile_buf = NULL; img->icc_profile_len = 0; if (!imagetoyuv(img, argv[2]))
} goto fin;
if (((img->numcomps == 3) && (img->comps[0].dx == img->comps[1].dx / 2) opj_cio_close(cio);
&& (img->comps[0].dx == img->comps[2].dx / 2 ) && (img->comps[0].dx == 1))
|| (img->numcomps == 1)) {
if (!imagetoyuv(img, argv[2])) // Convert image to YUV opj_image_destroy(img);
return 1;
}
else if ((img->numcomps == 3) &&
(img->comps[0].dx == 1) && (img->comps[1].dx == 1)&&
(img->comps[2].dx == 1))// If YUV 4:4:4 input --> to bmp
{
fprintf(stdout,"The frames will be output in a bmp format (output_1.bmp, ...)\n");
sprintf(outfilename,"output_%d.bmp",snum);
if (imagetobmp(img, outfilename)) // Convert image to BMP
return 1;
} elapsed_time = opj_clock()-init_time;
else { fprintf(stderr, "Frame number %d/%d decoded in %.2f mseconds\n",
fprintf(stdout,"Image component dimensions are unknown. Unable to output image\n"); snum + 1, numframes, elapsed_time*1000);
fprintf(stdout,"The frames will be output in a j2k file (output_1.j2k, ...)\n"); total_time += elapsed_time;
sprintf(outfilename,"output_%d.j2k",snum); }/* for (snum */
outfile = fopen(outfilename, "wb");
if (!outfile) {
fprintf(stderr, "failed to open %s for writing\n",outfilename);
return 1;
}
fwrite(frame_codestream,sample->sample_size-8,1,outfile);
fclose(outfile);
}
/* close the byte stream */
opj_cio_close(cio);
/* free image data structure */
opj_image_destroy(img);
elapsed_time = opj_clock()-init_time;
fprintf(stderr, "Frame number %d/%d decoded in %.2f mseconds\n", snum + 1, numframes, elapsed_time*1000);
total_time += elapsed_time;
}
free(frame_codestream);
fclose(file);
/* free remaining structures */
if(dinfo) {
mj2_destroy_decompress((opj_mj2_t*)dinfo->mj2_handle);
}
free(dinfo);
fprintf(stdout, "%d frame(s) correctly decompressed\n", snum); fprintf(stdout, "%d frame(s) correctly decompressed\n", snum);
fprintf(stdout,"Total decoding time: %.2f seconds (%.1f fps)\n", total_time, (float)numframes/total_time); fprintf(stdout,"Total decoding time: %.2f seconds (%.1f fps)\n",
total_time, (float)numframes/total_time);
return 0; failed = 0;
}
fin:
fclose(infile);
if(frame_codestream) free(frame_codestream);
/* free remaining structures */
if(dinfo)
{
mj2_destroy_decompress(movie);
free(dinfo);
}
return failed;
}/* main() */

View File

@@ -45,10 +45,6 @@ Size of memory first allocated for MOOV box
*/ */
#define TEMP_BUF 10000 #define TEMP_BUF 10000
#define ENUMCS_GRAY 16
#define ENUMCS_SRGB 17
#define ENUMCS_SYCC 18
#define J2K_CODESTREAM_MAGIC "\xff\x4f\xff\x51" #define J2K_CODESTREAM_MAGIC "\xff\x4f\xff\x51"
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
@@ -77,6 +73,8 @@ static int test_image(const char *fname, mj2_cparameters_t *cp)
if(memcmp(src, J2K_CODESTREAM_MAGIC, 4) != 0) if(memcmp(src, J2K_CODESTREAM_MAGIC, 4) != 0)
{ {
fprintf(stderr,"%s:%d:\n\tONLY J2K files are accepted. Quitting.\n",
__FILE__,__LINE__);
free(src); return success; free(src); return success;
} }
memset(&dparameters, 0, sizeof(opj_dparameters_t)); memset(&dparameters, 0, sizeof(opj_dparameters_t));
@@ -89,8 +87,12 @@ static int test_image(const char *fname, mj2_cparameters_t *cp)
cio = opj_cio_open((opj_common_ptr)dinfo, src, src_len); cio = opj_cio_open((opj_common_ptr)dinfo, src, src_len);
if(cio == NULL) goto fin;
image = opj_decode(dinfo, cio); image = opj_decode(dinfo, cio);
if(image == NULL) goto fin;
free(src); cio->buffer = NULL; free(src); cio->buffer = NULL;
opj_cio_close(cio); opj_cio_close(cio);
@@ -101,68 +103,17 @@ static int test_image(const char *fname, mj2_cparameters_t *cp)
cp->h = image->comps[0].h; cp->h = image->comps[0].h;
cp->prec = image->comps[0].prec; cp->prec = image->comps[0].prec;
if(image->numcomps > 2 ) if(image->numcomps > 2)/* RGB or RGBA */
{ {
if((image->comps[0].dx == 1)
&& (image->comps[1].dx == 2)
&& (image->comps[2].dx == 2)
&& (image->comps[0].dy == 1)
&& (image->comps[1].dy == 2)
&& (image->comps[2].dy == 2))// horizontal and vertical
{
// Y420
cp->enumcs = ENUMCS_SYCC;
cp->CbCr_subsampling_dx = 2;
cp->CbCr_subsampling_dy = 2;
}
else
if((image->comps[0].dx == 1)
&& (image->comps[1].dx == 2)
&& (image->comps[2].dx == 2)
&& (image->comps[0].dy == 1)
&& (image->comps[1].dy == 1)
&& (image->comps[2].dy == 1))// horizontal only
{
// Y422
cp->enumcs = ENUMCS_SYCC;
cp->CbCr_subsampling_dx = 2;
cp->CbCr_subsampling_dy = 1;
}
else
if((image->comps[0].dx == 1)
&& (image->comps[1].dx == 1)
&& (image->comps[2].dx == 1)
&& (image->comps[0].dy == 1)
&& (image->comps[1].dy == 1)
&& (image->comps[2].dy == 1))
{
// Y444 or RGB
if(image->color_space == CLRSPC_SRGB)
{
cp->enumcs = ENUMCS_SRGB; cp->enumcs = ENUMCS_SRGB;
/* cp->CbCr_subsampling_dx = 0; */
// cp->CbCr_subsampling_dx = 0; /* cp->CbCr_subsampling_dy = 0; */
// cp->CbCr_subsampling_dy = 0;
}
else
{
cp->enumcs = ENUMCS_SYCC;
cp->CbCr_subsampling_dx = 1;
cp->CbCr_subsampling_dy = 1;
}
}
else
{
goto fin;
}
} }
else else /* GRAY or GRAYA */
{ {
cp->enumcs = ENUMCS_GRAY; cp->enumcs = ENUMCS_GRAY;
// cp->CbCr_subsampling_dx = 0; /* cp->CbCr_subsampling_dx = 0; */
// cp->CbCr_subsampling_dy = 0; /* cp->CbCr_subsampling_dy = 0; */
} }
if(image->icc_profile_buf) if(image->icc_profile_buf)
{ {
@@ -228,7 +179,9 @@ static void read_siz_marker(FILE *file, opj_image_t *image)
siz_buffer = (unsigned char*) malloc(len * sizeof(unsigned char)); siz_buffer = (unsigned char*) malloc(len * sizeof(unsigned char));
fread(siz_buffer,len, 1, file); fread(siz_buffer,len, 1, file);
cio = opj_cio_open(NULL, siz_buffer, len); cio = opj_cio_open(NULL, siz_buffer, len);
if(cio == NULL) goto fin;
cio_read(cio, 2); /* Rsiz (capabilities) */ cio_read(cio, 2); /* Rsiz (capabilities) */
image->x1 = cio_read(cio, 4); /* Xsiz */ image->x1 = cio_read(cio, 4); /* Xsiz */
@@ -252,7 +205,9 @@ static void read_siz_marker(FILE *file, opj_image_t *image)
image->comps[i].factor = 0; /* reducing factor by component */ image->comps[i].factor = 0; /* reducing factor by component */
} }
fseek(file, 0, SEEK_SET); fseek(file, 0, SEEK_SET);
opj_cio_close(cio); opj_cio_close(cio);
fin:
free(siz_buffer); free(siz_buffer);
} }
@@ -261,50 +216,28 @@ static void setparams(opj_mj2_t *movie, opj_image_t *image) {
movie->tk[0].w = int_ceildiv(image->x1 - image->x0, image->comps[0].dx); movie->tk[0].w = int_ceildiv(image->x1 - image->x0, image->comps[0].dx);
movie->tk[0].h = int_ceildiv(image->y1 - image->y0, image->comps[0].dy); movie->tk[0].h = int_ceildiv(image->y1 - image->y0, image->comps[0].dy);
mj2_init_stdmovie(movie); mj2_init_stdmovie(movie);
movie->tk[0].depth = image->comps[0].prec; movie->tk[0].depth = image->comps[0].prec;
if (image->numcomps==3) { movie->tk[0].CbCr_subsampling_dx = 0;
if ((image->comps[0].dx == 1) movie->tk[0].CbCr_subsampling_dy = 0;
&& (image->comps[1].dx == 1)
&& (image->comps[2].dx == 1))
movie->tk[0].CbCr_subsampling_dx = 1;
else
if ((image->comps[0].dx == 1)
&& (image->comps[1].dx == 2)
&& (image->comps[2].dx == 2))
movie->tk[0].CbCr_subsampling_dx = 2;
else
fprintf(stderr,"Image component sizes are incoherent\n");
if ((image->comps[0].dy == 1)
&& (image->comps[1].dy == 1)
&& (image->comps[2].dy == 1))
movie->tk[0].CbCr_subsampling_dy = 1;
else
if ((image->comps[0].dy == 1)
&& (image->comps[1].dy == 2)
&& (image->comps[2].dy == 2))
movie->tk[0].CbCr_subsampling_dy = 2;
else
fprintf(stderr,"Image component sizes are incoherent\n");
}
movie->tk[0].sample_rate = 25; movie->tk[0].sample_rate = 25;
movie->tk[0].jp2_struct.numcomps = image->numcomps; // NC movie->tk[0].jp2_struct.numcomps = image->numcomps;/* NC */
/* Init Standard jp2 structure */ /* Init Standard jp2 structure */
movie->tk[0].jp2_struct.comps = movie->tk[0].jp2_struct.comps = (opj_jp2_comps_t *)
(opj_jp2_comps_t *) malloc(movie->tk[0].jp2_struct.numcomps * sizeof(opj_jp2_comps_t)); malloc(movie->tk[0].jp2_struct.numcomps * sizeof(opj_jp2_comps_t));
movie->tk[0].jp2_struct.precedence = 0; /* PRECEDENCE*/ movie->tk[0].jp2_struct.precedence = 0; /* PRECEDENCE*/
movie->tk[0].jp2_struct.approx = 0; /* APPROX*/ movie->tk[0].jp2_struct.approx = 0; /* APPROX*/
movie->tk[0].jp2_struct.brand = JP2_JP2; /* BR */ movie->tk[0].jp2_struct.brand = JP2_JP2; /* BR */
movie->tk[0].jp2_struct.minversion = 0; /* MinV */ movie->tk[0].jp2_struct.minversion = 0; /* MinV */
movie->tk[0].jp2_struct.numcl = 1; movie->tk[0].jp2_struct.numcl = 1;
movie->tk[0].jp2_struct.cl = (unsigned int *) malloc(movie->tk[0].jp2_struct.numcl * sizeof(int)); movie->tk[0].jp2_struct.cl = (unsigned int *)
malloc(movie->tk[0].jp2_struct.numcl * sizeof(int));
movie->tk[0].jp2_struct.cl[0] = JP2_JP2; /* CL0 : JP2 */ movie->tk[0].jp2_struct.cl[0] = JP2_JP2; /* CL0 : JP2 */
movie->tk[0].jp2_struct.C = 7; /* C : Always 7*/ movie->tk[0].jp2_struct.C = 7; /* C : Always 7*/
movie->tk[0].jp2_struct.UnkC = 0; /* UnkC, colorspace specified in colr box*/ movie->tk[0].jp2_struct.UnkC = 0; /* UnkC, colorspace specified in colr box*/
@@ -333,29 +266,6 @@ static void setparams(opj_mj2_t *movie, opj_image_t *image) {
else else
movie->tk[0].jp2_struct.meth = 2; movie->tk[0].jp2_struct.meth = 2;
if (image->numcomps == 1)
movie->tk[0].jp2_struct.enumcs = 17; // Grayscale
else
if ((image->comps[0].dx == 1)
&& (image->comps[1].dx == 1)
&& (image->comps[2].dx == 1)
&& (image->comps[0].dy == 1)
&& (image->comps[1].dy == 1)
&& (image->comps[2].dy == 1))
movie->tk[0].jp2_struct.enumcs = 16; // RGB
else
if ((image->comps[0].dx == 1)
&& (image->comps[1].dx == 2)
&& (image->comps[2].dx == 2)
&& (image->comps[0].dy == 1)
&& (image->comps[1].dy == 2)
&& (image->comps[2].dy == 2))
movie->tk[0].jp2_struct.enumcs = 18; // YUV
else
movie->tk[0].jp2_struct.enumcs = 0; // Unkown profile */
} }
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
@@ -368,14 +278,14 @@ int main(int argc, char *argv[]) {
FILE *mj2file, *j2kfile; FILE *mj2file, *j2kfile;
char *j2kfilename; char *j2kfilename;
unsigned char *buf; unsigned char *buf;
int offset, mdat_initpos; int offset, mdat_initpos, failed;
opj_image_t img; opj_image_t img;
opj_cio_t *cio; opj_cio_t *cio;
mj2_cparameters_t parameters; mj2_cparameters_t parameters;
if (argc != 3) { if (argc != 3) {
printf("Usage: %s source_location mj2_filename\n",argv[0]); printf("\nUsage: %s source_location mj2_filename\n",argv[0]);
printf("Example: %s input/input output.mj2\n",argv[0]); printf("Example: %s input/input output.mj2\n\n",argv[0]);
return 1; return 1;
} }
@@ -385,6 +295,7 @@ int main(int argc, char *argv[]) {
fprintf(stderr, "failed to open %s for writing\n", argv[2]); fprintf(stderr, "failed to open %s for writing\n", argv[2]);
return 1; return 1;
} }
failed = 1;
memset(&img, 0, sizeof(opj_image_t)); memset(&img, 0, sizeof(opj_image_t));
/* /*
configure the event callbacks (not required) configure the event callbacks (not required)
@@ -398,6 +309,8 @@ int main(int argc, char *argv[]) {
/* get a MJ2 decompressor handle */ /* get a MJ2 decompressor handle */
cinfo = mj2_create_compress(); cinfo = mj2_create_compress();
if(cinfo == NULL) goto fin;
/* catch events using our callbacks and give a local context */ /* catch events using our callbacks and give a local context */
opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr); opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr);
@@ -406,7 +319,7 @@ int main(int argc, char *argv[]) {
movie = (opj_mj2_t*) cinfo->mj2_handle; movie = (opj_mj2_t*) cinfo->mj2_handle;
j2kfilename = (char*)malloc(strlen(argv[1]) + 12);/* max. '%6d' */ j2kfilename = (char*)malloc(strlen(argv[1]) + 12);/* max. '%6d' */
sprintf(j2kfilename, "%s_00001.j2k",argv[1]); sprintf(j2kfilename, "%s_00000.j2k",argv[1]);
if(test_image(j2kfilename, &parameters) == 0) goto fin; if(test_image(j2kfilename, &parameters) == 0) goto fin;
@@ -415,11 +328,18 @@ int main(int argc, char *argv[]) {
mj2_setup_encoder(movie, &parameters); mj2_setup_encoder(movie, &parameters);
/* Writing JP, FTYP and MDAT boxes /* Writing JP, FTYP and MDAT boxes
Assuming that the JP and FTYP boxes won't be longer than 300 bytes */ Assuming that the JP and FTYP boxes won't be longer than 300 bytes
*/
buf = (unsigned char*) malloc (300 * sizeof(unsigned char)); buf = (unsigned char*) malloc (300 * sizeof(unsigned char));
if(buf == NULL) goto fin;
cio = opj_cio_open(movie->cinfo, buf, 300); cio = opj_cio_open(movie->cinfo, buf, 300);
if(cio == NULL) goto fin;
mj2_write_jp(cio); mj2_write_jp(cio);
mj2_write_ftyp(movie, cio); mj2_write_ftyp(movie, cio);
mdat_initpos = cio_tell(cio); mdat_initpos = cio_tell(cio);
@@ -428,7 +348,7 @@ int main(int argc, char *argv[]) {
fwrite(buf,cio_tell(cio),1,mj2file); fwrite(buf,cio_tell(cio),1,mj2file);
free(buf); free(buf);
// Insert each j2k codestream in a JP2C box /* Insert each j2k codestream in a JP2C box */
snum=0; snum=0;
offset = 0; offset = 0;
while(1) while(1)
@@ -436,43 +356,44 @@ int main(int argc, char *argv[]) {
sample = &movie->tk[0].sample[snum]; sample = &movie->tk[0].sample[snum];
sprintf(j2kfilename,"%s_%05d.j2k",argv[1],snum); sprintf(j2kfilename,"%s_%05d.j2k",argv[1],snum);
j2kfile = fopen(j2kfilename, "rb"); j2kfile = fopen(j2kfilename, "rb");
if (!j2kfile) { if (!j2kfile)
if (snum==0) { // Could not open a single codestream {
fprintf(stderr, "failed to open %s for reading\n",j2kfilename); /* No more files found: done. Leave while(1) loop: */
return 1; fprintf(stdout,"%d frames are being added to the MJ2 file\n",snum);
} break;
else { // Tried to open a inexistant codestream }
fprintf(stdout,"%d frames are being added to the MJ2 file\n",snum);
break;
}
}
// Calculating offset for samples and chunks /* Calculating offset for samples and chunks: */
offset += cio_tell(cio); offset += cio_tell(cio);
sample->offset = offset; sample->offset = offset;
movie->tk[0].chunk[snum].offset = offset; // There will be one sample per chunk /* There will be one sample per chunk: */
movie->tk[0].chunk[snum].offset = offset;
// Calculating sample size /* Calculating sample size: */
fseek(j2kfile,0,SEEK_END); fseek(j2kfile,0,SEEK_END);
sample->sample_size = ftell(j2kfile) + 8; // Sample size is codestream + JP2C box header /* Sample size is codestream + JP2C box header: */
sample->sample_size = ftell(j2kfile) + 8;
fseek(j2kfile,0,SEEK_SET); fseek(j2kfile,0,SEEK_SET);
// Reading siz marker of j2k image for the first codestream /* Reading siz marker of j2k image for the first codestream */
if (snum==0) if (snum==0)
read_siz_marker(j2kfile, &img); read_siz_marker(j2kfile, &img);
// Writing JP2C box header frame_codestream = (unsigned char*)
frame_codestream = (unsigned char*) malloc (sample->sample_size+8); malloc (sample->sample_size+8);
cio = opj_cio_open(movie->cinfo, frame_codestream, sample->sample_size); cio = opj_cio_open(movie->cinfo, frame_codestream, sample->sample_size);
cio_write(cio,sample->sample_size, 4); // Sample size
cio_write(cio,JP2_JP2C, 4); // JP2C
// Writing codestream from J2K file to MJ2 file if(cio == NULL) goto fin;
/* Writing JP2C box header: */
cio_write(cio,sample->sample_size, 4);
cio_write(cio,JP2_JP2C, 4);
/* Writing codestream from J2K file to MJ2 file */
fread(frame_codestream+8,sample->sample_size-8,1,j2kfile); fread(frame_codestream+8,sample->sample_size-8,1,j2kfile);
fwrite(frame_codestream,sample->sample_size,1,mj2file); fwrite(frame_codestream,sample->sample_size,1,mj2file);
cio_skip(cio, sample->sample_size-8); cio_skip(cio, sample->sample_size-8);
// Ending loop
fclose(j2kfile); fclose(j2kfile);
snum++; snum++;
movie->tk[0].sample = (mj2_sample_t*) movie->tk[0].sample = (mj2_sample_t*)
@@ -480,37 +401,63 @@ int main(int argc, char *argv[]) {
movie->tk[0].chunk = (mj2_chunk_t*) movie->tk[0].chunk = (mj2_chunk_t*)
realloc(movie->tk[0].chunk, (snum+1) * sizeof(mj2_chunk_t)); realloc(movie->tk[0].chunk, (snum+1) * sizeof(mj2_chunk_t));
free(frame_codestream); free(frame_codestream);
} }/* while(1) */
// Writing the MDAT box length in header /* Writing the MDAT box length in header */
offset += cio_tell(cio); offset += cio_tell(cio);
buf = (unsigned char*) malloc (4 * sizeof(unsigned char)); buf = (unsigned char*) malloc (4 * sizeof(unsigned char));
cio = opj_cio_open(movie->cinfo, buf, 4);
if(buf == NULL) goto fin;
cio = opj_cio_open(movie->cinfo, buf, 4);
if(cio == NULL) goto fin;
cio_write(cio,offset-mdat_initpos,4); cio_write(cio,offset-mdat_initpos,4);
fseek(mj2file,(long)mdat_initpos,SEEK_SET); fseek(mj2file,(long)mdat_initpos,SEEK_SET);
fwrite(buf,4,1,mj2file); fwrite(buf,4,1,mj2file);
fseek(mj2file,0,SEEK_END); fseek(mj2file,0,SEEK_END);
free(buf);
// Setting movie parameters /* if(cio->openmode == OPJ_STREAM_READ) */ free(buf);
opj_cio_close(cio);
/* Setting movie parameters: */
movie->tk[0].num_samples=snum; movie->tk[0].num_samples=snum;
movie->tk[0].num_chunks=snum; movie->tk[0].num_chunks=snum;
setparams(movie, &img); setparams(movie, &img);
// Writing MOOV box /* Writing MOOV box */
buf = (unsigned char*) malloc ((TEMP_BUF+snum*20) * sizeof(unsigned char)); buf = (unsigned char*) malloc ((TEMP_BUF+snum*20) * sizeof(unsigned char));
cio = opj_cio_open(movie->cinfo, buf, (TEMP_BUF+snum*20));
mj2_write_moov(movie, cio); if(buf == NULL) goto fin;
cio = opj_cio_open(movie->cinfo, buf, (TEMP_BUF+snum*20));
if(cio == NULL) goto fin;
mj2_write_moov(movie, cio);
fwrite(buf,cio_tell(cio),1,mj2file); fwrite(buf,cio_tell(cio),1,mj2file);
// Ending program
free(img.comps); free(img.comps);
/* if(cio->openmode == OPJ_STREAM_READ) */ free(buf);
opj_cio_close(cio); opj_cio_close(cio);
failed = 0; buf = NULL;
fin: fin:
fclose(mj2file); fclose(mj2file);
mj2_destroy_compress(movie);
if(failed) remove(argv[2]);
if(buf) free(buf);
if(cinfo)
{
mj2_destroy_compress(movie);
free(cinfo);
}
free(j2kfilename); free(j2kfilename);
return 0; return failed;
} }

View File

@@ -7,7 +7,7 @@
m4_define([OPJ_MAJOR], [1]) m4_define([OPJ_MAJOR], [1])
m4_define([OPJ_MINOR], [5]) m4_define([OPJ_MINOR], [5])
m4_define([OPJ_MICRO], [0]) m4_define([OPJ_MICRO], [2])
m4_define([lt_cur], m4_eval(OPJ_MAJOR + OPJ_MINOR)) m4_define([lt_cur], m4_eval(OPJ_MAJOR + OPJ_MINOR))
m4_define([lt_rev], OPJ_MICRO) m4_define([lt_rev], OPJ_MICRO)
@@ -23,7 +23,6 @@ AC_CONFIG_SRCDIR([configure.ac])
AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_HEADERS([opj_config.h]) AC_CONFIG_HEADERS([opj_config.h])
AC_CANONICAL_SYSTEM
AC_CANONICAL_HOST AC_CANONICAL_HOST
AM_INIT_AUTOMAKE([1.11 foreign dist-bzip2 dist-xz dist-zip]) AM_INIT_AUTOMAKE([1.11 foreign dist-bzip2 dist-xz dist-zip])
@@ -466,8 +465,14 @@ AC_HEADER_DIRENT
### Checks for compiler characteristics ### Checks for compiler characteristics
AM_PROG_CC_C_O AM_PROG_CC_C_O
AC_C_BIGENDIAN ac_cv_c_big_endian=0
AC_C_BIGENDIAN([ac_cv_c_big_endian=yes], [ac_cv_c_big_endian=no],[])
#
if test "x${ac_cv_c_big_endian}" = "xyes" ; then
AC_DEFINE(OPJ_BIG_ENDIAN, [1], [define to 1 if your machine has BE])
AC_DEFINE(WORDS_BIGENDIAN, [1], [define to 1 if your machine has BE])
fi
#
#OPJ_COMPILER_FLAG([-Wall]) #OPJ_COMPILER_FLAG([-Wall])
#OPJ_COMPILER_FLAG([-Wextra]) #OPJ_COMPILER_FLAG([-Wextra])
#OPJ_COMPILER_FLAG([-Wshadow]) #OPJ_COMPILER_FLAG([-Wshadow])

View File

@@ -10,6 +10,11 @@ IF(DOXYGEN_FOUND)
CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.dox.cmake.in CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.dox.cmake.in
${CMAKE_BINARY_DIR}/doc/Doxyfile-html.dox @ONLY) ${CMAKE_BINARY_DIR}/doc/Doxyfile-html.dox @ONLY)
# Configure the html mainpage file of the doxygen documentation with variable
# from CMake and move it
CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/mainpage.dox.cmake
${CMAKE_BINARY_DIR}/doc/mainpage.dox @ONLY)
# Generate new target to build the html documentation # Generate new target to build the html documentation
ADD_CUSTOM_TARGET(doc ALL ADD_CUSTOM_TARGET(doc ALL
${DOXYGEN_EXECUTABLE} ${CMAKE_BINARY_DIR}/doc/Doxyfile-html.dox) ${DOXYGEN_EXECUTABLE} ${CMAKE_BINARY_DIR}/doc/Doxyfile-html.dox)

View File

@@ -147,7 +147,7 @@ HTML_STYLESHEET =
HTML_COLORSTYLE_HUE = 220 HTML_COLORSTYLE_HUE = 220
HTML_COLORSTYLE_SAT = 100 HTML_COLORSTYLE_SAT = 100
HTML_COLORSTYLE_GAMMA = 80 HTML_COLORSTYLE_GAMMA = 80
HTML_TIMESTAMP = YES HTML_TIMESTAMP = NO
HTML_ALIGN_MEMBERS = YES HTML_ALIGN_MEMBERS = YES
HTML_DYNAMIC_SECTIONS = NO HTML_DYNAMIC_SECTIONS = NO
GENERATE_DOCSET = NO GENERATE_DOCSET = NO

View File

@@ -101,11 +101,12 @@ WARN_LOGFILE =
# configuration options related to the input files # configuration options related to the input files
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
INPUT = @OPENJPEG_SOURCE_DIR@/libopenjpeg \ INPUT = @OPENJPEG_SOURCE_DIR@/libopenjpeg \
@OPENJPEG_SOURCE_DIR@/libopenjpeg/jpwl @OPENJPEG_BINARY_DIR@/doc
INPUT_ENCODING = UTF-8 INPUT_ENCODING = UTF-8
FILE_PATTERNS = *.h \ FILE_PATTERNS = *.h \
*.c *.c \
RECURSIVE = NO *.dox
RECURSIVE = YES
EXCLUDE = EXCLUDE =
EXCLUDE_SYMLINKS = NO EXCLUDE_SYMLINKS = NO
EXCLUDE_PATTERNS = EXCLUDE_PATTERNS =
@@ -147,7 +148,7 @@ HTML_STYLESHEET =
HTML_COLORSTYLE_HUE = 220 HTML_COLORSTYLE_HUE = 220
HTML_COLORSTYLE_SAT = 100 HTML_COLORSTYLE_SAT = 100
HTML_COLORSTYLE_GAMMA = 80 HTML_COLORSTYLE_GAMMA = 80
HTML_TIMESTAMP = YES HTML_TIMESTAMP = NO
HTML_ALIGN_MEMBERS = YES HTML_ALIGN_MEMBERS = YES
HTML_DYNAMIC_SECTIONS = NO HTML_DYNAMIC_SECTIONS = NO
GENERATE_DOCSET = NO GENERATE_DOCSET = NO

View File

@@ -34,7 +34,7 @@ doc:
endif endif
docsdir = $(docdir)-$(MAJOR_NR).$(MINOR_NR) docsdir = $(docdir)-$(MAJOR_NR).$(MINOR_NR)
docs_DATA = $(top_builddir)/LICENSE $(top_builddir)/CHANGES docs_DATA = $(top_builddir)/LICENSE
dist_man1_MANS = \ dist_man1_MANS = \
man/man1/image_to_j2k.1 \ man/man1/image_to_j2k.1 \
@@ -45,6 +45,11 @@ dist_man3_MANS = \
man/man3/libopenjpeg.3 man/man3/libopenjpeg.3
install-data-hook: install-data-hook:
@echo -e " (MAN)\t$(man1dir)/image_to_j2k.1" >> $(top_builddir)/report.txt
@echo -e " (MAN)\t$(man1dir)/j2k_dump.1" >> $(top_builddir)/report.txt
@echo -e " (MAN)\t$(man1dir)/j2k_to_image.1" >> $(top_builddir)/report.txt
@echo -e " (MAN)\t$(man3dir)/libopenjpeg.3" >> $(top_builddir)/report.txt
if WANT_JPWL
cd $(DESTDIR)$(man1dir) && \ cd $(DESTDIR)$(man1dir) && \
rm -f jpwl_image_to_j2k.1 && \ rm -f jpwl_image_to_j2k.1 && \
$(LN_S) image_to_j2k.1 jpwl_image_to_j2k.1 $(LN_S) image_to_j2k.1 jpwl_image_to_j2k.1
@@ -54,18 +59,17 @@ install-data-hook:
cd $(DESTDIR)$(man3dir) && \ cd $(DESTDIR)$(man3dir) && \
rm -f jpwl_libopenjpeg.3 && \ rm -f jpwl_libopenjpeg.3 && \
$(LN_S) libopenjpeg.3 jpwl_libopenjpeg.3 $(LN_S) libopenjpeg.3 jpwl_libopenjpeg.3
@echo -e " (MAN)\t$(man1dir)/image_to_j2k.1" >> $(top_builddir)/report.txt
@echo -e " (LN)\t$(man1dir)/jpwl_image_to_j2k.1" >> $(top_builddir)/report.txt @echo -e " (LN)\t$(man1dir)/jpwl_image_to_j2k.1" >> $(top_builddir)/report.txt
@echo -e " (MAN)\t$(man1dir)/j2k_dump.1" >> $(top_builddir)/report.txt
@echo -e " (MAN)\t$(man1dir)/j2k_to_image.1" >> $(top_builddir)/report.txt
@echo -e " (LN)\t$(man1dir)//jpwl_j2k_to_image.1" >> $(top_builddir)/report.txt @echo -e " (LN)\t$(man1dir)//jpwl_j2k_to_image.1" >> $(top_builddir)/report.txt
@echo -e " (MAN)\t$(man3dir)/libopenjpeg.3" >> $(top_builddir)/report.txt
@echo -e " (LN)\t$(man3dir)/jpwl_libopenjpeg.3" >> $(top_builddir)/report.txt @echo -e " (LN)\t$(man3dir)/jpwl_libopenjpeg.3" >> $(top_builddir)/report.txt
endif
uninstall-hook: uninstall-hook:
if WANT_JPWL
rm -f $(DESTDIR)$(man1dir)/jpwl_image_to_j2k.1 rm -f $(DESTDIR)$(man1dir)/jpwl_image_to_j2k.1
rm -f $(DESTDIR)$(man1dir)/jpwl_j2k_to_image.1 rm -f $(DESTDIR)$(man1dir)/jpwl_j2k_to_image.1
rm -f $(DESTDIR)$(man3dir)/jpwl_libopenjpeg.3 rm -f $(DESTDIR)$(man3dir)/jpwl_libopenjpeg.3
endif
EXTRA_DIST = \ EXTRA_DIST = \
CMakeLists.txt \ CMakeLists.txt \

62
doc/mainpage.dox.cmake Normal file
View File

@@ -0,0 +1,62 @@
/*
* $Id: mainpage.dox.cmake 2011-09-21 Mickael Savinaud $
*
* Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
* Copyright (c) 2011, Mickael Savinaud, Communications & Systemes <mickael.savinaud@c-s.fr>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/*! \mainpage OpenJPEG v@OPENJPEG_VERSION@ Documentation
*
* \section intro Introduction
* This manual documents the low-level OpenJPEG C API.\n
* The OpenJPEG library is an open-source JPEG 2000 library developed in order to promote the use of JPEG 2000.\n
* This documents is focused on the main part of the library which try to implement Part 1 and Part 2 of the JPEG2000 norm.\n
*
* \section home Home page
*
* The Home Page of the OpenJPEG library can be found at:
*
* http://code.google.com/p/openjpeg/
*
* More information about the OpenJPEG library is available here:
*
* http://www.openjpeg.org/
*
* The OpenJPEG mailing list is located here:
*
* http://groups.google.com/group/openjpeg
*
* All the source code is online and can be retrieved using svn from here:
*
* http://openjpeg.googlecode.com/svn/
*
* \section license License
* This software is released under the BSD license, anybody can use or modify the library, even for commercial applications.\n
* The only restriction is to retain the copyright in the sources or the binaries documentation.\n
* Neither the author, nor the university accept any responsibility for any kind of error or data loss which may occur during usage.
*
* \author OpenJPEG Team
*
*/

View File

@@ -49,7 +49,7 @@ Valid output image extensions are
.P .P
.B image_to_j2k -h \fRPrint a help message and exit. .B image_to_j2k -h \fRPrint a help message and exit.
.P .P
.R See JPWL OPTIONS for special options See JPWL OPTIONS for special options
.SH OPTIONS .SH OPTIONS
.TP .TP
.B \-\^b " n,n" .B \-\^b " n,n"

View File

@@ -49,7 +49,7 @@ Valid output image extensions are
.P .P
.B j2k_to_image -h \fRPrint help message and exit .B j2k_to_image -h \fRPrint help message and exit
.P .P
.R See JPWL OPTIONS for special options See JPWL OPTIONS for special options
.SH OPTIONS .SH OPTIONS
.TP .TP
.B \-\^i "name" .B \-\^i "name"

View File

@@ -124,7 +124,7 @@ a library for reading and writing JPEG2000 image files.
.B CLRSPC_UNKNOWN\fR or \fBCLRSPC_UNSPECIFIED\fR or \fBCLRSPC_SRGB\fR or \fBCLRSPC_GRAY\fR or \fBCLRSPC_SYCC .B CLRSPC_UNKNOWN\fR or \fBCLRSPC_UNSPECIFIED\fR or \fBCLRSPC_SRGB\fR or \fBCLRSPC_GRAY\fR or \fBCLRSPC_SYCC
.P .P
.SH DECOMPRESSION PARAMETERS .SH DECOMPRESSION PARAMETERS
.p .P
typedef struct opj_dparameters typedef struct opj_dparameters
.br .br
{ {

View File

@@ -1,7 +1,7 @@
prefix=@prefix@ prefix=@prefix@
exec_prefix=@exec_prefix@ exec_prefix=@exec_prefix@
libdir=@libdir@ libdir=@libdir@
includedir=@includedir@ includedir=@includedir@/openjpeg-@MAJOR_NR@.@MINOR_NR@
Name: openjpeg Name: openjpeg
Description: JPEG2000 Wireless (Part 11 - JPWL) library Description: JPEG2000 Wireless (Part 11 - JPWL) library

View File

@@ -39,7 +39,9 @@ IF(UNIX)
TARGET_LINK_LIBRARIES(${OPENJPEG_LIBRARY_NAME} m) TARGET_LINK_LIBRARIES(${OPENJPEG_LIBRARY_NAME} m)
ENDIF(UNIX) ENDIF(UNIX)
SET_TARGET_PROPERTIES(${OPENJPEG_LIBRARY_NAME} PROPERTIES ${OPENJPEG_LIBRARY_PROPERTIES}) SET_TARGET_PROPERTIES(${OPENJPEG_LIBRARY_NAME} PROPERTIES ${OPENJPEG_LIBRARY_PROPERTIES})
IF(${CMAKE_VERSION} VERSION_GREATER "2.8.11")
TARGET_COMPILE_OPTIONS(${OPENJPEG_LIBRARY_NAME} PRIVATE ${OPENJPEG_LIBRARY_COMPILE_OPTIONS})
ENDIF()
# Build the JPWL library ? # Build the JPWL library ?
IF(BUILD_JPWL) IF(BUILD_JPWL)
ADD_SUBDIRECTORY(jpwl) ADD_SUBDIRECTORY(jpwl)
@@ -55,10 +57,17 @@ INSTALL(TARGETS ${OPENJPEG_LIBRARY_NAME}
# Install includes files # Install includes files
INSTALL(FILES openjpeg.h INSTALL(FILES openjpeg.h
DESTINATION ${OPENJPEG_INSTALL_INCLUDE_DIR}/${OPENJPEG_INSTALL_SUBDIR} COMPONENT Headers DESTINATION ${OPENJPEG_INSTALL_INCLUDE_DIR} COMPONENT Headers
) )
# install man page of the library # install man page of the library
INSTALL( INSTALL(
FILES ${OPENJPEG_SOURCE_DIR}/doc/man/man3/libopenjpeg.3 FILES ${OPENJPEG_SOURCE_DIR}/doc/man/man3/libopenjpeg.3
DESTINATION ${OPENJPEG_INSTALL_MAN_DIR}/man3) DESTINATION ${OPENJPEG_INSTALL_MAN_DIR}/man3)
# internal utilities to generate t1_luts.h
# no need to install:
ADD_EXECUTABLE(t1_generate_luts t1_generate_luts.c)
IF(UNIX)
TARGET_LINK_LIBRARIES(t1_generate_luts m)
ENDIF()

View File

@@ -35,7 +35,6 @@ openjpeg.c \
pi.c \ pi.c \
raw.c \ raw.c \
t1.c \ t1.c \
t1_generate_luts.c \
t2.c \ t2.c \
tcd.c \ tcd.c \
tgt.c \ tgt.c \
@@ -73,10 +72,7 @@ EXTRA_DIST = \
CMakeLists.txt CMakeLists.txt
install-data-hook: install-data-hook:
cd $(DESTDIR)$(includedir) && \ cd $(DESTDIR)$(includedir) && rm -f openjpeg.h
rm -f openjpeg.h && \
$(LN_S) openjpeg-$(MAJOR_NR).$(MINOR_NR)/openjpeg.h \
openjpeg.h
@rm -rf $(top_builddir)/report.txt @rm -rf $(top_builddir)/report.txt
@echo -e " (LA)\t$(libdir)/libopenjpeg.la" >> $(top_builddir)/report.txt @echo -e " (LA)\t$(libdir)/libopenjpeg.la" >> $(top_builddir)/report.txt
if BUILD_SHARED if BUILD_SHARED
@@ -86,7 +82,6 @@ if BUILD_STATIC
@echo -e " (A)\t$(base)/$(a)" >> $(top_builddir)/report.txt @echo -e " (A)\t$(base)/$(a)" >> $(top_builddir)/report.txt
endif endif
@echo -e " (H)\t$(includedir)/openjpeg-$(MAJOR_NR).$(MINOR_NR)/openjpeg.h" >> $(top_builddir)/report.txt @echo -e " (H)\t$(includedir)/openjpeg-$(MAJOR_NR).$(MINOR_NR)/openjpeg.h" >> $(top_builddir)/report.txt
@echo -e " (LN)\t$(includedir)/openjpeg.h" >> $(top_builddir)/report.txt
uninstall-hook: uninstall-hook:
rm -f $(DESTDIR)$(includedir)/openjpeg.h rm -f $(DESTDIR)$(includedir)/openjpeg.h

View File

@@ -42,7 +42,7 @@ Write a bit
@param bio BIO handle @param bio BIO handle
@param b Bit to write (0 or 1) @param b Bit to write (0 or 1)
*/ */
static void bio_putbit(opj_bio_t *bio, int b); static void bio_putbit(opj_bio_t *bio, unsigned int b);
/** /**
Read a bit Read a bit
@param bio BIO handle @param bio BIO handle
@@ -78,7 +78,7 @@ static int bio_byteout(opj_bio_t *bio) {
if (bio->bp >= bio->end) { if (bio->bp >= bio->end) {
return 1; return 1;
} }
*bio->bp++ = bio->buf >> 8; *bio->bp++ = (unsigned char)(bio->buf >> 8);
return 0; return 0;
} }
@@ -92,7 +92,7 @@ static int bio_bytein(opj_bio_t *bio) {
return 0; return 0;
} }
static void bio_putbit(opj_bio_t *bio, int b) { static void bio_putbit(opj_bio_t *bio, unsigned int b) {
if (bio->ct == 0) { if (bio->ct == 0) {
bio_byteout(bio); bio_byteout(bio);
} }
@@ -126,7 +126,7 @@ void bio_destroy(opj_bio_t *bio) {
} }
int bio_numbytes(opj_bio_t *bio) { int bio_numbytes(opj_bio_t *bio) {
return (bio->bp - bio->start); return (int)(bio->bp - bio->start);
} }
void bio_init_enc(opj_bio_t *bio, unsigned char *bp, int len) { void bio_init_enc(opj_bio_t *bio, unsigned char *bp, int len) {

View File

@@ -29,8 +29,6 @@
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#include <stdio.h>
#include <stdlib.h>
#include "opj_includes.h" #include "opj_includes.h"

View File

@@ -30,6 +30,7 @@
*/ */
#include "opj_includes.h" #include "opj_includes.h"
#include <assert.h>
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */
@@ -106,6 +107,7 @@ int OPJ_CALLCONV cio_tell(opj_cio_t *cio) {
* pos : position, in number of bytes, from the beginning of the stream * pos : position, in number of bytes, from the beginning of the stream
*/ */
void OPJ_CALLCONV cio_seek(opj_cio_t *cio, int pos) { void OPJ_CALLCONV cio_seek(opj_cio_t *cio, int pos) {
assert((cio->start + pos) <= cio->end);
cio->bp = cio->start + pos; cio->bp = cio->start + pos;
} }
@@ -113,6 +115,7 @@ void OPJ_CALLCONV cio_seek(opj_cio_t *cio, int pos) {
* Number of bytes left before the end of the stream. * Number of bytes left before the end of the stream.
*/ */
int cio_numbytesleft(opj_cio_t *cio) { int cio_numbytesleft(opj_cio_t *cio) {
assert((cio->end - cio->bp) >= 0);
return cio->end - cio->bp; return cio->end - cio->bp;
} }
@@ -139,6 +142,7 @@ opj_bool cio_byteout(opj_cio_t *cio, unsigned char v) {
* Read a byte. * Read a byte.
*/ */
unsigned char cio_bytein(opj_cio_t *cio) { unsigned char cio_bytein(opj_cio_t *cio) {
assert(cio->bp >= cio->start);
if (cio->bp >= cio->end) { if (cio->bp >= cio->end) {
opj_event_msg(cio->cinfo, EVT_ERROR, "read error: passed the end of the codestream (start = %d, current = %d, end = %d\n", cio->start, cio->bp, cio->end); opj_event_msg(cio->cinfo, EVT_ERROR, "read error: passed the end of the codestream (start = %d, current = %d, end = %d\n", cio->start, cio->bp, cio->end);
return 0; return 0;
@@ -152,7 +156,7 @@ unsigned char cio_bytein(opj_cio_t *cio) {
* v : value to write * v : value to write
* n : number of bytes to write * n : number of bytes to write
*/ */
unsigned int cio_write(opj_cio_t *cio, unsigned long long int v, int n) { unsigned int cio_write(opj_cio_t *cio, unsigned int64 v, int n) {
int i; int i;
for (i = n - 1; i >= 0; i--) { for (i = n - 1; i >= 0; i--) {
if( !cio_byteout(cio, (unsigned char) ((v >> (i << 3)) & 0xff)) ) if( !cio_byteout(cio, (unsigned char) ((v >> (i << 3)) & 0xff)) )
@@ -173,7 +177,7 @@ unsigned int cio_read(opj_cio_t *cio, int n) {
unsigned int v; unsigned int v;
v = 0; v = 0;
for (i = n - 1; i >= 0; i--) { for (i = n - 1; i >= 0; i--) {
v += cio_bytein(cio) << (i << 3); v += (unsigned int)cio_bytein(cio) << (i << 3);
} }
return v; return v;
} }
@@ -184,6 +188,10 @@ unsigned int cio_read(opj_cio_t *cio, int n) {
* n : number of bytes to skip * n : number of bytes to skip
*/ */
void cio_skip(opj_cio_t *cio, int n) { void cio_skip(opj_cio_t *cio, int n) {
assert((cio->bp + n) >= cio->bp);
if (((cio->bp + n) < cio->start) || ((cio->bp + n) > cio->end)) {
assert(0);
}
cio->bp += n; cio->bp += n;
} }

Some files were not shown because too many files have changed in this diff Show More