Compare commits
324 Commits
openjpeg-2
...
openjpeg-1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f0dd842b11 | ||
|
|
96c3a8315b | ||
|
|
6711fa669a | ||
|
|
935816e8c9 | ||
|
|
c0abb808f5 | ||
|
|
348e96e44b | ||
|
|
e94720fea0 | ||
|
|
04291bf0ab | ||
|
|
46440fe368 | ||
|
|
9cf9018ffc | ||
|
|
001cd957ba | ||
|
|
a024c148fc | ||
|
|
a4bd2ed06e | ||
|
|
66f65919cf | ||
|
|
7ad3e2a870 | ||
|
|
9542c08d62 | ||
|
|
cbaa2d7d98 | ||
|
|
650df81e09 | ||
|
|
618e50954f | ||
|
|
959ebdab5e | ||
|
|
3cee252347 | ||
|
|
2a4101c60e | ||
|
|
32b04ad49d | ||
|
|
5e3fae7f48 | ||
|
|
4469a98cd7 | ||
|
|
93c79f8fb1 | ||
|
|
e755ebd1b0 | ||
|
|
f35aaa8a82 | ||
|
|
b44e07fe19 | ||
|
|
d3c0915992 | ||
|
|
c91e2099b1 | ||
|
|
d0e85b0c52 | ||
|
|
31e35fcf7b | ||
|
|
2d47938b25 | ||
|
|
2e508f1c89 | ||
|
|
f8013bec95 | ||
|
|
770e81eebc | ||
|
|
2c3f5c269a | ||
|
|
0ec0b2594c | ||
|
|
2eebb05ca2 | ||
|
|
ff72d131ed | ||
|
|
7d6d19c473 | ||
|
|
78053c44c8 | ||
|
|
902fe2569c | ||
|
|
8c71728242 | ||
|
|
4140dfdea8 | ||
|
|
259f629a46 | ||
|
|
c302efcf86 | ||
|
|
e0b5b08f9a | ||
|
|
dac95eff3a | ||
|
|
4f4de7070e | ||
|
|
78d1820881 | ||
|
|
de73cfeec1 | ||
|
|
49044ae2a8 | ||
|
|
6e0162a8a6 | ||
|
|
910af7edec | ||
|
|
69cd4f9211 | ||
|
|
6fc2b56847 | ||
|
|
773bd89130 | ||
|
|
5d356d6fcb | ||
|
|
a2f90ab2cb | ||
|
|
a05a9aa4ed | ||
|
|
af2be2d456 | ||
|
|
96dba34ddc | ||
|
|
6aad1208b2 | ||
|
|
d2be8c5d21 | ||
|
|
b42f76cb7f | ||
|
|
07163be7ed | ||
|
|
4e672cc1e9 | ||
|
|
ced9a50367 | ||
|
|
a1683bd7c2 | ||
|
|
f968a70e22 | ||
|
|
2fe6bac6eb | ||
|
|
15243144c4 | ||
|
|
c0c69d1c36 | ||
|
|
d9d62a77ee | ||
|
|
15488c94d2 | ||
|
|
75175b715c | ||
|
|
46831582b2 | ||
|
|
e55d5e29e0 | ||
|
|
c02f145cd1 | ||
|
|
6280b5ad8d | ||
|
|
7720188fa7 | ||
|
|
20f9f96719 | ||
|
|
4776f48477 | ||
|
|
c2f32bb485 | ||
|
|
bba708462d | ||
|
|
4935eaf773 | ||
|
|
bad9a71e77 | ||
|
|
a74a41b932 | ||
|
|
6b5bbc2645 | ||
|
|
8b5f815925 | ||
|
|
abce31e706 | ||
|
|
8062f74deb | ||
|
|
b8fecbbc99 | ||
|
|
cd8896968d | ||
|
|
b94bc0dbe2 | ||
|
|
083d4c2361 | ||
|
|
6c5a066b20 | ||
|
|
835bf5357f | ||
|
|
8a279881d4 | ||
|
|
6da56bb11a | ||
|
|
8cd13f3a55 | ||
|
|
eeca4a220c | ||
|
|
e17dcf58c9 | ||
|
|
39ac7c479f | ||
|
|
401e9cbb5c | ||
|
|
5dbf771bb9 | ||
|
|
ce9d5083ef | ||
|
|
baa7e32f9c | ||
|
|
097496a9f0 | ||
|
|
6b649f3bf6 | ||
|
|
65f8ae765e | ||
|
|
3aba3e203b | ||
|
|
95cf10e979 | ||
|
|
3a643798bd | ||
|
|
875591f664 | ||
|
|
4e8aea6b5a | ||
|
|
5379ec5715 | ||
|
|
b431cb0a41 | ||
|
|
dfbab28b4d | ||
|
|
3819c1b5f4 | ||
|
|
b09cd38b08 | ||
|
|
da453218a4 | ||
|
|
e0795464c1 | ||
|
|
fab8de59d3 | ||
|
|
dcf78f14f6 | ||
|
|
d1a1653f2a | ||
|
|
5a817eba3d | ||
|
|
ce5bbefff0 | ||
|
|
a5d96e54b9 | ||
|
|
2dddf54f8b | ||
|
|
992409c00c | ||
|
|
ee9c46d350 | ||
|
|
87a1081f7c | ||
|
|
83332e13ad | ||
|
|
675f34fabd | ||
|
|
0c7b21c46f | ||
|
|
590ba6d460 | ||
|
|
6f314ae48e | ||
|
|
24ab49a363 | ||
|
|
ecb36f02c8 | ||
|
|
8c9fd1b351 | ||
|
|
dd999a2840 | ||
|
|
b3b2ee0925 | ||
|
|
58cfcaff9f | ||
|
|
c1c2d24b16 | ||
|
|
cefa643823 | ||
|
|
64e37e2a66 | ||
|
|
545680cdb4 | ||
|
|
23cab09e07 | ||
|
|
8336ace29a | ||
|
|
a794ee233d | ||
|
|
a39e4a2a82 | ||
|
|
b267239603 | ||
|
|
54e4e8f809 | ||
|
|
8fc06de0c5 | ||
|
|
9a5ab44e35 | ||
|
|
4d76145884 | ||
|
|
bdf1343f62 | ||
|
|
52f5452d4d | ||
|
|
a9b7c7b0b4 | ||
|
|
07521a5dc2 | ||
|
|
d1bb3ed1f2 | ||
|
|
6c6cd79820 | ||
|
|
7b6ae8810d | ||
|
|
699f172e6c | ||
|
|
5fbf79e730 | ||
|
|
aa28216f9b | ||
|
|
e449cb706f | ||
|
|
a85c5151ce | ||
|
|
ed58a22d2e | ||
|
|
3408787101 | ||
|
|
948dfd50c0 | ||
|
|
46da9f2294 | ||
|
|
995b145f09 | ||
|
|
451a41064e | ||
|
|
c6b02b10fe | ||
|
|
36b66a8796 | ||
|
|
f1e441596e | ||
|
|
d5fa5605c4 | ||
|
|
427b2427d4 | ||
|
|
09522e65af | ||
|
|
19cfaac52e | ||
|
|
21c38214ef | ||
|
|
577fdbc8a5 | ||
|
|
f93aed8031 | ||
|
|
326c58b4e1 | ||
|
|
ec0c69af7a | ||
|
|
21509a3955 | ||
|
|
5b2ca9caf6 | ||
|
|
529006f136 | ||
|
|
7d96e7c1c0 | ||
|
|
e2948acd92 | ||
|
|
6dc8635e28 | ||
|
|
7d0a419c87 | ||
|
|
0ea0e8b915 | ||
|
|
8e53bad7fb | ||
|
|
9c51a37dbf | ||
|
|
aa00142949 | ||
|
|
87b05f2885 | ||
|
|
baf01b98fd | ||
|
|
6dd7da0e05 | ||
|
|
4949b593be | ||
|
|
0ed7aa7c1b | ||
|
|
02b906f6ad | ||
|
|
6a03e3a438 | ||
|
|
ec33653961 | ||
|
|
133426ddfe | ||
|
|
aab317eb8c | ||
|
|
f3f86e1eb7 | ||
|
|
040c9a68b6 | ||
|
|
2b746a71cb | ||
|
|
ba01e855a3 | ||
|
|
d3c1a49246 | ||
|
|
85bbc6def8 | ||
|
|
5bd5d894eb | ||
|
|
452403d393 | ||
|
|
fc268dff90 | ||
|
|
180dd26df1 | ||
|
|
d27bc19d71 | ||
|
|
b7b72bbf97 | ||
|
|
e1340fe087 | ||
|
|
32e80bc4a7 | ||
|
|
8d18c77a7d | ||
|
|
f492f0a3d6 | ||
|
|
6b43ba091e | ||
|
|
5dfadb2eb1 | ||
|
|
30944454de | ||
|
|
0e7529c272 | ||
|
|
c9986d1b78 | ||
|
|
4bc00a40ca | ||
|
|
80f69364b0 | ||
|
|
2e3900780d | ||
|
|
d530d35024 | ||
|
|
e96f7a5f50 | ||
|
|
79ce6ccce5 | ||
|
|
b7e489c901 | ||
|
|
dbd60c1469 | ||
|
|
007409e2af | ||
|
|
b82b6cbd05 | ||
|
|
f26b96dd5c | ||
|
|
7e6c287d78 | ||
|
|
6b1e9d1b4e | ||
|
|
d88dfc3472 | ||
|
|
64f08e216b | ||
|
|
c9ae2a5fbc | ||
|
|
51ae8b7926 | ||
|
|
3280dc344f | ||
|
|
0b7e0166a7 | ||
|
|
5fe8eed4da | ||
|
|
9d4d3b2cd0 | ||
|
|
02d9f43802 | ||
|
|
00b479cb79 | ||
|
|
6219ad32b0 | ||
|
|
a3a161660a | ||
|
|
2643f79069 | ||
|
|
fba8f701c4 | ||
|
|
4bcd3a1e42 | ||
|
|
594148ae83 | ||
|
|
2a2f169b27 | ||
|
|
e576aa9f06 | ||
|
|
c469e1339f | ||
|
|
abf9809c22 | ||
|
|
3ebdd674d8 | ||
|
|
a13abdaf65 | ||
|
|
72867bc692 | ||
|
|
b081ff2813 | ||
|
|
9d1bd03be4 | ||
|
|
82e539d333 | ||
|
|
548a49bb7f | ||
|
|
dc9a8b03aa | ||
|
|
c6e0b71633 | ||
|
|
0c350f4908 | ||
|
|
01749cb8a2 | ||
|
|
49f1a5ff54 | ||
|
|
ff1f022d47 | ||
|
|
3459199eba | ||
|
|
544e8c9de0 | ||
|
|
735b40989d | ||
|
|
09f2926cd5 | ||
|
|
238b767917 | ||
|
|
49a0f0db8f | ||
|
|
6a1530e4b1 | ||
|
|
8d8841c84f | ||
|
|
1dc6eddf1c | ||
|
|
c1510793e3 | ||
|
|
d728868263 | ||
|
|
8a2af121a4 | ||
|
|
9e60c2f8e9 | ||
|
|
d35f647aaa | ||
|
|
adbccc2e56 | ||
|
|
642d09f5cb | ||
|
|
d1cb786dd8 | ||
|
|
182e4b1882 | ||
|
|
73106fe839 | ||
|
|
40b4ecfaec | ||
|
|
fb82b6d7d9 | ||
|
|
5d6ac5ea72 | ||
|
|
3d06f03072 | ||
|
|
5213675ba8 | ||
|
|
9a89e2f162 | ||
|
|
e89eb575ac | ||
|
|
d15f01b6e3 | ||
|
|
9ec5e8cf9a | ||
|
|
4c9acc22b8 | ||
|
|
6adb5f5070 | ||
|
|
d1d662768d | ||
|
|
4091882dfb | ||
|
|
61e0ed6a96 | ||
|
|
9c7899372b | ||
|
|
a098921d34 | ||
|
|
8ed4cb1a1e | ||
|
|
721904bc26 | ||
|
|
2724f85cad | ||
|
|
40b989ce00 | ||
|
|
3e1d8d6aef | ||
|
|
fda0cada0e | ||
|
|
a58987d082 | ||
|
|
0f101066f2 | ||
|
|
cbe26cbb88 | ||
|
|
f753a1c36c | ||
|
|
c0ea54e518 | ||
|
|
c85e1a10cf |
4
.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
|
||||||
|
CMakeLists.txt.user
|
||||||
|
|
||||||
|
*.bak
|
||||||
4
AUTHORS
@@ -3,10 +3,8 @@ See also the files THANKS and CHANGES
|
|||||||
|
|
||||||
David Janssens designed and implemented the first version of OpenJPEG.
|
David Janssens designed and implemented the first version of OpenJPEG.
|
||||||
Kaori Hagihara designed and implemented the first version of OpenJPIP.
|
Kaori Hagihara designed and implemented the first version of OpenJPIP.
|
||||||
Jerome Fimes implemented the alpha version of OpenJPEG 2.0.
|
Jerome Fimes implemented the alpha version of OpenJPEG v2.
|
||||||
Giuseppe Baruffa added the JPWL functionalities.
|
Giuseppe Baruffa added the JPWL functionalities.
|
||||||
Micka<EFBFBD>l Savinaud implemented the final OpenJPEG 2.0 version based on a big merge between 1.5 version and alpha version of 2.0.
|
|
||||||
Mathieu Malaterre participated to the OpenJPEG 2.0 version and improved the libraries and utilities.
|
|
||||||
Yannick Verschueren,
|
Yannick Verschueren,
|
||||||
Herve Drolon,
|
Herve Drolon,
|
||||||
Francois-Olivier Devaux,
|
Francois-Olivier Devaux,
|
||||||
|
|||||||
@@ -8,11 +8,11 @@
|
|||||||
#
|
#
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
|
|
||||||
set(CTEST_CUSTOM_MAXIMUM_PASSED_TEST_OUTPUT_SIZE 1000000)
|
SET(CTEST_CUSTOM_MAXIMUM_PASSED_TEST_OUTPUT_SIZE 1000000)
|
||||||
set(CTEST_CUSTOM_MAXIMUM_NUMBER_OF_ERRORS 50)
|
SET(CTEST_CUSTOM_MAXIMUM_NUMBER_OF_ERRORS 50)
|
||||||
set(CTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS 2000)
|
SET(CTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS 2000)
|
||||||
|
|
||||||
set(CTEST_CUSTOM_COVERAGE_EXCLUDE
|
SET(CTEST_CUSTOM_COVERAGE_EXCLUDE
|
||||||
${CTEST_CUSTOM_COVERAGE_EXCLUDE}
|
${CTEST_CUSTOM_COVERAGE_EXCLUDE}
|
||||||
|
|
||||||
# Exclude files from the Testing directories
|
# Exclude files from the Testing directories
|
||||||
@@ -22,14 +22,11 @@ set(CTEST_CUSTOM_COVERAGE_EXCLUDE
|
|||||||
".*/thirdparty/.*"
|
".*/thirdparty/.*"
|
||||||
)
|
)
|
||||||
|
|
||||||
set(CTEST_CUSTOM_WARNING_EXCEPTION
|
SET(CTEST_CUSTOM_WARNING_EXCEPTION
|
||||||
${CTEST_CUSTOM_WARNING_EXCEPTION}
|
${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"
|
||||||
# java also warns about deprecated API
|
|
||||||
".*java.*deprecation"
|
|
||||||
".*deprecation.*"
|
|
||||||
# supress warnings caused by 3rd party libs:
|
# supress warnings caused by 3rd party libs:
|
||||||
".*thirdparty.*"
|
".*thirdparty.*"
|
||||||
"libtiff.*has no symbols"
|
"libtiff.*has no symbols"
|
||||||
20
CMake/FindFCGI.cmake
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
# Look for the header file.
|
||||||
|
FIND_PATH(FCGI_INCLUDE_DIR NAMES fastcgi.h)
|
||||||
|
|
||||||
|
# Look for the library.
|
||||||
|
FIND_LIBRARY(FCGI_LIBRARY NAMES fcgi)
|
||||||
|
|
||||||
|
# Handle the QUIETLY and REQUIRED arguments and set FCGI_FOUND to TRUE if all listed variables are TRUE.
|
||||||
|
INCLUDE(FindPackageHandleStandardArgs)
|
||||||
|
FIND_PACKAGE_HANDLE_STANDARD_ARGS(FCGI DEFAULT_MSG FCGI_LIBRARY FCGI_INCLUDE_DIR)
|
||||||
|
|
||||||
|
# Copy the results to the output variables.
|
||||||
|
IF(FCGI_FOUND)
|
||||||
|
SET(FCGI_LIBRARIES ${FCGI_LIBRARY})
|
||||||
|
SET(FCGI_INCLUDE_DIRS ${FCGI_INCLUDE_DIR})
|
||||||
|
ELSE(FCGI_FOUND)
|
||||||
|
SET(FCGI_LIBRARIES)
|
||||||
|
SET(FCGI_INCLUDE_DIRS)
|
||||||
|
ENDIF(FCGI_FOUND)
|
||||||
|
|
||||||
|
MARK_AS_ADVANCED(FCGI_INCLUDE_DIR FCGI_LIBRARY)
|
||||||
12
CMake/FindJPYLYZER.cmake
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
#
|
||||||
|
# this module looks for JPYLYZER
|
||||||
|
# http://jpylyzer.openpreservation.org
|
||||||
|
#
|
||||||
|
|
||||||
|
find_program(JPYLYZER_EXECUTABLE
|
||||||
|
jpylyzer
|
||||||
|
)
|
||||||
|
|
||||||
|
mark_as_advanced(
|
||||||
|
JPYLYZER_EXECUTABLE
|
||||||
|
)
|
||||||
@@ -1,24 +1,19 @@
|
|||||||
#
|
#
|
||||||
# this module looks for KAKADU
|
# this module looks for KAKADu
|
||||||
# http://www.kakadusoftware.com/
|
# http://www.kakadusoftware.com/
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
# Copyright (c) 2006-2014 Mathieu Malaterre <mathieu.malaterre@gmail.com>
|
# Copyright (c) 2006-2011 Mathieu Malaterre <mathieu.malaterre@gmail.com>
|
||||||
#
|
#
|
||||||
# Redistribution and use is allowed according to the terms of the New
|
# Redistribution and use is allowed according to the terms of the New
|
||||||
# BSD license.
|
# BSD license.
|
||||||
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
||||||
#
|
#
|
||||||
|
|
||||||
find_program(KDU_EXPAND_EXECUTABLE
|
FIND_PROGRAM(KDU_EXPAND_EXECUTABLE
|
||||||
kdu_expand
|
kdu_expand
|
||||||
)
|
)
|
||||||
|
|
||||||
find_program(KDU_COMPRESS_EXECUTABLE
|
MARK_AS_ADVANCED(
|
||||||
kdu_compress
|
|
||||||
)
|
|
||||||
|
|
||||||
mark_as_advanced(
|
|
||||||
KDU_EXPAND_EXECUTABLE
|
KDU_EXPAND_EXECUTABLE
|
||||||
KDU_COMPRESS_EXECUTABLE
|
|
||||||
)
|
)
|
||||||
@@ -12,20 +12,20 @@
|
|||||||
#=============================================================================
|
#=============================================================================
|
||||||
#=============================================================================
|
#=============================================================================
|
||||||
|
|
||||||
find_path(LCMS_INCLUDE_DIR lcms.h PATHS /usr/include /usr/local/include /opt/include /opt/local/include)
|
FIND_PATH(LCMS_INCLUDE_DIR lcms.h PATHS /usr/include /usr/local/include /opt/include /opt/local/include)
|
||||||
|
|
||||||
set(LCMS_NAMES ${LCMS_NAMES} lcms liblcms liblcms_static)
|
SET(LCMS_NAMES ${LCMS_NAMES} lcms liblcms liblcms_static)
|
||||||
|
|
||||||
find_library(LCMS_LIBRARY NAMES ${LCMS_NAMES} )
|
FIND_LIBRARY(LCMS_LIBRARY NAMES ${LCMS_NAMES} )
|
||||||
|
|
||||||
mark_as_advanced(LCMS_INCLUDE_DIR LCMS_LIBRARY)
|
MARK_AS_ADVANCED(LCMS_INCLUDE_DIR LCMS_LIBRARY)
|
||||||
|
|
||||||
# handle the QUIETLY and REQUIRED arguments and set LCMS_FOUND to TRUE if
|
# handle the QUIETLY and REQUIRED arguments and set LCMS_FOUND to TRUE if
|
||||||
# all listed variables are TRUE
|
# all listed variables are TRUE
|
||||||
include(FindPackageHandleStandardArgs)
|
INCLUDE(FindPackageHandleStandardArgs)
|
||||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(LCMS DEFAULT_MSG LCMS_LIBRARY LCMS_INCLUDE_DIR)
|
FIND_PACKAGE_HANDLE_STANDARD_ARGS(LCMS DEFAULT_MSG LCMS_LIBRARY LCMS_INCLUDE_DIR)
|
||||||
|
|
||||||
if(LCMS_FOUND)
|
IF(LCMS_FOUND)
|
||||||
set( LCMS_INCLUDE_DIRS ${LCMS_INCLUDE_DIR})
|
SET( LCMS_INCLUDE_DIRS ${LCMS_INCLUDE_DIR})
|
||||||
set( LCMS_LIBRARIES ${LCMS_LIBRARY} )
|
SET( LCMS_LIBRARIES ${LCMS_LIBRARY} )
|
||||||
endif()
|
ENDIF(LCMS_FOUND)
|
||||||
@@ -12,20 +12,20 @@
|
|||||||
#=============================================================================
|
#=============================================================================
|
||||||
#=============================================================================
|
#=============================================================================
|
||||||
|
|
||||||
find_path(LCMS2_INCLUDE_DIR lcms2.h PATHS /usr/include /usr/local/include /opt/include /opt/local/include)
|
FIND_PATH(LCMS2_INCLUDE_DIR lcms2.h PATHS /usr/include /usr/local/include /opt/include /opt/local/include)
|
||||||
|
|
||||||
set(LCMS2_NAMES ${LCMS2_NAMES} lcms2 liblcms2 liblcms2_static)
|
SET(LCMS2_NAMES ${LCMS2_NAMES} lcms2 liblcms2 liblcms2_static)
|
||||||
|
|
||||||
find_library(LCMS2_LIBRARY NAMES ${LCMS2_NAMES} )
|
FIND_LIBRARY(LCMS2_LIBRARY NAMES ${LCMS2_NAMES} )
|
||||||
|
|
||||||
mark_as_advanced(LCMS2_INCLUDE_DIR LCMS2_LIBRARY)
|
MARK_AS_ADVANCED(LCMS2_INCLUDE_DIR LCMS2_LIBRARY)
|
||||||
|
|
||||||
# handle the QUIETLY and REQUIRED arguments and set LCMS2_FOUND to TRUE if
|
# handle the QUIETLY and REQUIRED arguments and set LCMS2_FOUND to TRUE if
|
||||||
# all listed variables are TRUE
|
# all listed variables are TRUE
|
||||||
include(FindPackageHandleStandardArgs)
|
INCLUDE(FindPackageHandleStandardArgs)
|
||||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(LCMS2 DEFAULT_MSG LCMS2_LIBRARY LCMS2_INCLUDE_DIR)
|
FIND_PACKAGE_HANDLE_STANDARD_ARGS(LCMS2 DEFAULT_MSG LCMS2_LIBRARY LCMS2_INCLUDE_DIR)
|
||||||
|
|
||||||
if(LCMS2_FOUND)
|
IF(LCMS2_FOUND)
|
||||||
set( LCMS2_INCLUDE_DIRS ${LCMS2_INCLUDE_DIR})
|
SET( LCMS2_INCLUDE_DIRS ${LCMS2_INCLUDE_DIR})
|
||||||
set( LCMS2_LIBRARIES ${LCMS2_LIBRARY} )
|
SET( LCMS2_LIBRARIES ${LCMS2_LIBRARY} )
|
||||||
endif()
|
ENDIF(LCMS2_FOUND)
|
||||||
@@ -7,7 +7,7 @@ if(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake")
|
|||||||
set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_NO_WARNINGS ON)
|
set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_NO_WARNINGS ON)
|
||||||
endif()
|
endif()
|
||||||
include(${CMAKE_ROOT}/Modules/InstallRequiredSystemLibraries.cmake)
|
include(${CMAKE_ROOT}/Modules/InstallRequiredSystemLibraries.cmake)
|
||||||
endif()
|
endif(EXISTS "${CMAKE_ROOT}/Modules/InstallRequiredSystemLibraries.cmake")
|
||||||
|
|
||||||
set(OPJ_PACKAGE_DESCRIPTION_SUMMARY "OpenJPEG - OpenJPEG a JPEG 2000 implementation.")
|
set(OPJ_PACKAGE_DESCRIPTION_SUMMARY "OpenJPEG - OpenJPEG a JPEG 2000 implementation.")
|
||||||
set(OPJ_PACKAGE_CONTACT "openjpeg users <openjpeg@googlegroups.com>")
|
set(OPJ_PACKAGE_CONTACT "openjpeg users <openjpeg@googlegroups.com>")
|
||||||
@@ -28,45 +28,43 @@ if(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake")
|
|||||||
|
|
||||||
# Make this explicit here, rather than accepting the CPack default value,
|
# Make this explicit here, rather than accepting the CPack default value,
|
||||||
# so we can refer to it:
|
# so we can refer to it:
|
||||||
set(CPACK_PACKAGE_NAME "${OPENJPEG_LIBRARY_NAME}")
|
SET(CPACK_PACKAGE_NAME "${OPENJPEG_LIBRARY_NAME}")
|
||||||
|
|
||||||
if(NOT DEFINED CPACK_SYSTEM_NAME)
|
IF(NOT DEFINED CPACK_SYSTEM_NAME)
|
||||||
# make sure package is not Cygwin-unknown, for Cygwin just
|
# make sure package is not Cygwin-unknown, for Cygwin just
|
||||||
# cygwin is good for the system name
|
# cygwin is good for the system name
|
||||||
if("${CMAKE_SYSTEM_NAME}" STREQUAL "CYGWIN")
|
IF("${CMAKE_SYSTEM_NAME}" STREQUAL "CYGWIN")
|
||||||
set(CPACK_SYSTEM_NAME Cygwin)
|
SET(CPACK_SYSTEM_NAME Cygwin)
|
||||||
else()
|
ELSE("${CMAKE_SYSTEM_NAME}" STREQUAL "CYGWIN")
|
||||||
set(CPACK_SYSTEM_NAME ${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR})
|
SET(CPACK_SYSTEM_NAME ${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR})
|
||||||
endif()
|
ENDIF("${CMAKE_SYSTEM_NAME}" STREQUAL "CYGWIN")
|
||||||
endif()
|
ENDIF(NOT DEFINED CPACK_SYSTEM_NAME)
|
||||||
if(${CPACK_SYSTEM_NAME} MATCHES Windows)
|
IF(${CPACK_SYSTEM_NAME} MATCHES Windows)
|
||||||
if(CMAKE_CL_64)
|
IF(CMAKE_CL_64)
|
||||||
set(CPACK_SYSTEM_NAME win64-x64)
|
SET(CPACK_SYSTEM_NAME win64-x64)
|
||||||
else()
|
ELSE(CMAKE_CL_64)
|
||||||
set(CPACK_SYSTEM_NAME win32-x86)
|
SET(CPACK_SYSTEM_NAME win32-x86)
|
||||||
endif()
|
ENDIF(CMAKE_CL_64)
|
||||||
endif()
|
ENDIF(${CPACK_SYSTEM_NAME} MATCHES Windows)
|
||||||
|
|
||||||
if(NOT DEFINED CPACK_PACKAGE_FILE_NAME)
|
IF(NOT DEFINED CPACK_PACKAGE_FILE_NAME)
|
||||||
# if the CPACK_PACKAGE_FILE_NAME is not defined by the cache
|
# if the CPACK_PACKAGE_FILE_NAME is not defined by the cache
|
||||||
# default to source package - system, on cygwin system is not
|
# default to source package - system, on cygwin system is not
|
||||||
# needed
|
# needed
|
||||||
if(CYGWIN)
|
IF(CYGWIN)
|
||||||
set(CPACK_PACKAGE_FILE_NAME "${CPACK_SOURCE_PACKAGE_FILE_NAME}")
|
SET(CPACK_PACKAGE_FILE_NAME "${CPACK_SOURCE_PACKAGE_FILE_NAME}")
|
||||||
else()
|
ELSE(CYGWIN)
|
||||||
set(CPACK_PACKAGE_FILE_NAME
|
SET(CPACK_PACKAGE_FILE_NAME
|
||||||
"${CPACK_SOURCE_PACKAGE_FILE_NAME}-${CPACK_SYSTEM_NAME}")
|
"${CPACK_SOURCE_PACKAGE_FILE_NAME}-${CPACK_SYSTEM_NAME}")
|
||||||
endif()
|
ENDIF(CYGWIN)
|
||||||
endif()
|
ENDIF(NOT DEFINED CPACK_PACKAGE_FILE_NAME)
|
||||||
|
|
||||||
set(CPACK_BUNDLE_NAME "OpenJPEG ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}")
|
set(CPACK_BUNDLE_NAME "OpenJPEG ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}")
|
||||||
if(APPLE)
|
|
||||||
configure_file(${CMAKE_ROOT}/Templates/AppleInfo.plist
|
configure_file(${CMAKE_ROOT}/Templates/AppleInfo.plist
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/opj.plist)
|
${CMAKE_CURRENT_BINARY_DIR}/opj.plist)
|
||||||
set(CPACK_BUNDLE_PLIST
|
SET(CPACK_BUNDLE_PLIST
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/opj.plist)
|
${CMAKE_CURRENT_BINARY_DIR}/opj.plist)
|
||||||
#include(BundleUtilities)
|
#include(BundleUtilities)
|
||||||
endif()
|
|
||||||
|
|
||||||
include(CPack)
|
include(CPack)
|
||||||
endiF(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake")
|
endiF(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake")
|
||||||
54
CMake/OpenJPEGConfig.cmake.in
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
#-----------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# OPENJPEGConfig.cmake - CMake configuration file for external projects.
|
||||||
|
#
|
||||||
|
# This file is configured by OPENJPEG and used by the UseOPENJPEG.cmake
|
||||||
|
# module to load OPENJPEG's settings for an external project.
|
||||||
|
@OPENJPEG_CONFIG_INSTALL_ONLY@
|
||||||
|
# The OPENJPEG version number.
|
||||||
|
SET(OPENJPEG_MAJOR_VERSION "@OPENJPEG_VERSION_MAJOR@")
|
||||||
|
SET(OPENJPEG_MINOR_VERSION "@OPENJPEG_VERSION_MINOR@")
|
||||||
|
SET(OPENJPEG_BUILD_VERSION "@OPENJPEG_VERSION_BUILD@")
|
||||||
|
|
||||||
|
# The libraries.
|
||||||
|
SET(OPENJPEG_LIBRARIES "@OPENJPEG_LIBRARY_NAME@")
|
||||||
|
|
||||||
|
# The CMake macros dir.
|
||||||
|
SET(OPENJPEG_CMAKE_DIR "@OPENJPEG_INSTALL_PACKAGE_DIR@")
|
||||||
|
|
||||||
|
# The configuration options.
|
||||||
|
SET(OPENJPEG_BUILD_SHARED_LIBS "@BUILD_SHARED_LIBS@")
|
||||||
|
|
||||||
|
# The "use" file.
|
||||||
|
SET(OPENJPEG_USE_FILE "@OPENJPEG_USE_FILE_CONFIG@")
|
||||||
|
|
||||||
|
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)
|
||||||
|
# This is an install tree
|
||||||
|
include(${SELF_DIR}/OpenJPEGTargets.cmake)
|
||||||
|
get_filename_component(OPENJPEG_INCLUDE_ROOT "${SELF_DIR}/@relative_parent@/@OPENJPEG_INSTALL_INCLUDE_DIR@" ABSOLUTE)
|
||||||
|
set(OPENJPEG_INCLUDE_DIRS ${OPENJPEG_INCLUDE_ROOT})
|
||||||
|
|
||||||
|
else(EXISTS ${SELF_DIR}/OpenJPEGTargets.cmake)
|
||||||
|
if(EXISTS ${SELF_DIR}/OpenJPEGExports.cmake)
|
||||||
|
# This is a build tree
|
||||||
|
SET( OPENJPEG_INCLUDE_DIRS @OPENJPEG_INCLUDE_PATH@)
|
||||||
|
|
||||||
|
include(${SELF_DIR}/OpenJPEGExports.cmake)
|
||||||
|
|
||||||
|
else(EXISTS ${SELF_DIR}/OpenJPEGExports.cmake)
|
||||||
|
message(FATAL_ERROR "ooops")
|
||||||
|
endif(EXISTS ${SELF_DIR}/OpenJPEGExports.cmake)
|
||||||
|
endif(EXISTS ${SELF_DIR}/OpenJPEGTargets.cmake)
|
||||||
|
|
||||||
|
set(OPENJPEG_USE_FILE ${SELF_DIR}/UseOPENJPEG.cmake)
|
||||||
|
|
||||||
|
# Backward compatible part:
|
||||||
|
SET(OPENJPEG_FOUND TRUE)
|
||||||
|
|
||||||
350
CMakeLists.txt
@@ -6,38 +6,40 @@
|
|||||||
# you will eventually like to prefix the library to avoid linking confusion
|
# you will eventually like to prefix the library to avoid linking confusion
|
||||||
# For this purpose you can define a CMake var: OPENJPEG_NAMESPACE to whatever you like
|
# For this purpose you can define a CMake var: OPENJPEG_NAMESPACE to whatever you like
|
||||||
# e.g.:
|
# e.g.:
|
||||||
# set(OPENJPEG_NAMESPACE "GDCMOPENJPEG")
|
# SET(OPENJPEG_NAMESPACE "GDCMOPENJPEG")
|
||||||
cmake_minimum_required(VERSION 2.8.2)
|
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
|
||||||
|
|
||||||
if(COMMAND CMAKE_POLICY)
|
IF(COMMAND CMAKE_POLICY)
|
||||||
cmake_policy(SET CMP0003 NEW)
|
CMAKE_POLICY(SET CMP0003 NEW)
|
||||||
endif()
|
if (NOT (${CMAKE_VERSION} VERSION_LESS 3.0))
|
||||||
|
cmake_policy(SET CMP0042 NEW)
|
||||||
|
endif()
|
||||||
|
ENDIF(COMMAND CMAKE_POLICY)
|
||||||
|
|
||||||
if(NOT OPENJPEG_NAMESPACE)
|
IF(NOT OPENJPEG_NAMESPACE)
|
||||||
set(OPENJPEG_NAMESPACE "OPENJPEG")
|
SET(OPENJPEG_NAMESPACE "OPENJPEG")
|
||||||
set(OPENJPEG_STANDALONE 1)
|
SET(OPENJPEG_STANDALONE 1)
|
||||||
endif()
|
ENDIF(NOT OPENJPEG_NAMESPACE)
|
||||||
# In all cases:
|
# In all cases:
|
||||||
#string(TOLOWER ${OPENJPEG_NAMESPACE} OPENJPEG_LIBRARY_NAME)
|
STRING(TOLOWER ${OPENJPEG_NAMESPACE} OPENJPEG_LIBRARY_NAME)
|
||||||
set(OPENJPEG_LIBRARY_NAME openjp2)
|
|
||||||
|
|
||||||
project(${OPENJPEG_NAMESPACE} C)
|
PROJECT(${OPENJPEG_NAMESPACE} C)
|
||||||
|
|
||||||
# Do full dependency headers.
|
# Do full dependency headers.
|
||||||
include_regular_expression("^.*$")
|
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 2)
|
SET(OPENJPEG_VERSION_MAJOR 1)
|
||||||
set(OPENJPEG_VERSION_MINOR 0)
|
SET(OPENJPEG_VERSION_MINOR 5)
|
||||||
set(OPENJPEG_VERSION_BUILD 1)
|
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
|
# Because autotools does not support X.Y notation for SOVERSION, we have to use
|
||||||
# two numbering, one for the openjpeg version and one for openjpeg soversion
|
# two numerorations, one for the openjpeg version and one for openjpeg soversion
|
||||||
# version | soversion
|
# version | soversion
|
||||||
# 1.0 | 0
|
# 1.0 | 0
|
||||||
# 1.1 | 1
|
# 1.1 | 1
|
||||||
@@ -47,33 +49,32 @@ set(PACKAGE_VERSION
|
|||||||
# 1.5 | 5
|
# 1.5 | 5
|
||||||
# 1.5.1 | 5
|
# 1.5.1 | 5
|
||||||
# 2.0 | 6
|
# 2.0 | 6
|
||||||
# 2.0.1 | 6
|
|
||||||
# above is the recommendation by the OPJ team. If you really need to override this default,
|
# 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:
|
# you can specify your own OPENJPEG_SOVERSION at cmake configuration time:
|
||||||
# cmake -DOPENJPEG_SOVERSION:STRING=42 /path/to/openjpeg
|
# cmake -DOPENJPEG_SOVERSION:STRING=42 /path/to/openjpeg
|
||||||
if(NOT OPENJPEG_SOVERSION)
|
if(NOT OPENJPEG_SOVERSION)
|
||||||
SET(OPENJPEG_SOVERSION 7)
|
SET(OPENJPEG_SOVERSION 5)
|
||||||
endif(NOT OPENJPEG_SOVERSION)
|
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_SOVERSION}"
|
SOVERSION "${OPENJPEG_SOVERSION}"
|
||||||
)
|
)
|
||||||
|
|
||||||
# --------------------------------------------------------------------------
|
# --------------------------------------------------------------------------
|
||||||
# Path to additional CMake modules
|
# Path to additional CMake modules
|
||||||
set(CMAKE_MODULE_PATH
|
SET(CMAKE_MODULE_PATH
|
||||||
${CMAKE_SOURCE_DIR}/cmake
|
${CMAKE_SOURCE_DIR}/CMake
|
||||||
${CMAKE_MODULE_PATH})
|
${CMAKE_MODULE_PATH})
|
||||||
|
|
||||||
# --------------------------------------------------------------------------
|
# --------------------------------------------------------------------------
|
||||||
# On Visual Studio 8 MS deprecated C. This removes all 1.276E1265 security
|
# On Visual Studio 8 MS deprecated C. This removes all 1.276E1265 security
|
||||||
# warnings
|
# warnings
|
||||||
if(WIN32)
|
IF(WIN32)
|
||||||
if(NOT BORLAND)
|
IF(NOT BORLAND)
|
||||||
if(NOT CYGWIN)
|
IF(NOT CYGWIN)
|
||||||
if(NOT MINGW)
|
IF(NOT MINGW)
|
||||||
if(NOT ITK_ENABLE_VISUAL_STUDIO_DEPRECATED_C_WARNINGS)
|
IF(NOT ITK_ENABLE_VISUAL_STUDIO_DEPRECATED_C_WARNINGS)
|
||||||
add_definitions(
|
ADD_DEFINITIONS(
|
||||||
-D_CRT_FAR_MAPPINGS_NO_DEPRECATE
|
-D_CRT_FAR_MAPPINGS_NO_DEPRECATE
|
||||||
-D_CRT_IS_WCTYPE_NO_DEPRECATE
|
-D_CRT_IS_WCTYPE_NO_DEPRECATE
|
||||||
-D_CRT_MANAGED_FP_NO_DEPRECATE
|
-D_CRT_MANAGED_FP_NO_DEPRECATE
|
||||||
@@ -85,46 +86,58 @@ if(WIN32)
|
|||||||
-D_CRT_VCCLRIT_NO_DEPRECATE
|
-D_CRT_VCCLRIT_NO_DEPRECATE
|
||||||
-D_SCL_SECURE_NO_DEPRECATE
|
-D_SCL_SECURE_NO_DEPRECATE
|
||||||
)
|
)
|
||||||
endif()
|
ENDIF(NOT ITK_ENABLE_VISUAL_STUDIO_DEPRECATED_C_WARNINGS)
|
||||||
endif()
|
ENDIF(NOT MINGW)
|
||||||
endif()
|
ENDIF(NOT CYGWIN)
|
||||||
endif()
|
ENDIF(NOT BORLAND)
|
||||||
endif()
|
ENDIF(WIN32)
|
||||||
|
|
||||||
|
|
||||||
# --------------------------------------------------------------------------
|
# --------------------------------------------------------------------------
|
||||||
# Install directories
|
# Install directories
|
||||||
|
|
||||||
string(TOLOWER ${PROJECT_NAME} projectname)
|
STRING(TOLOWER ${PROJECT_NAME} projectname)
|
||||||
set(OPENJPEG_INSTALL_SUBDIR "${projectname}-${OPENJPEG_VERSION_MAJOR}.${OPENJPEG_VERSION_MINOR}")
|
SET(OPENJPEG_INSTALL_SUBDIR "${projectname}-${OPENJPEG_VERSION_MAJOR}.${OPENJPEG_VERSION_MINOR}")
|
||||||
|
|
||||||
if(NOT OPENJPEG_INSTALL_BIN_DIR)
|
IF(NOT OPENJPEG_INSTALL_BIN_DIR)
|
||||||
set(OPENJPEG_INSTALL_BIN_DIR "bin")
|
SET(OPENJPEG_INSTALL_BIN_DIR "bin")
|
||||||
endif()
|
ENDIF(NOT OPENJPEG_INSTALL_BIN_DIR)
|
||||||
|
|
||||||
if(NOT OPENJPEG_INSTALL_LIB_DIR)
|
IF(NOT OPENJPEG_INSTALL_LIB_DIR)
|
||||||
set(OPENJPEG_INSTALL_LIB_DIR "lib")
|
SET(OPENJPEG_INSTALL_LIB_DIR "lib")
|
||||||
endif()
|
ENDIF(NOT OPENJPEG_INSTALL_LIB_DIR)
|
||||||
|
|
||||||
if(NOT OPENJPEG_INSTALL_SHARE_DIR)
|
# The following will compute the amount of parent dir to go
|
||||||
set(OPENJPEG_INSTALL_SHARE_DIR "share")
|
# from include to lib. it works nicely with
|
||||||
endif()
|
# 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_DATA_DIR)
|
IF(NOT OPENJPEG_INSTALL_SHARE_DIR)
|
||||||
set(OPENJPEG_INSTALL_DATA_DIR "${OPENJPEG_INSTALL_SHARE_DIR}/${OPENJPEG_INSTALL_SUBDIR}")
|
SET(OPENJPEG_INSTALL_SHARE_DIR "share")
|
||||||
endif()
|
ENDIF(NOT OPENJPEG_INSTALL_SHARE_DIR)
|
||||||
|
|
||||||
if(NOT OPENJPEG_INSTALL_INCLUDE_DIR)
|
IF(NOT OPENJPEG_INSTALL_DATA_DIR)
|
||||||
set(OPENJPEG_INSTALL_INCLUDE_DIR "include/${OPENJPEG_INSTALL_SUBDIR}")
|
SET(OPENJPEG_INSTALL_DATA_DIR "${OPENJPEG_INSTALL_SHARE_DIR}/${OPENJPEG_INSTALL_SUBDIR}")
|
||||||
endif()
|
ENDIF(NOT OPENJPEG_INSTALL_DATA_DIR)
|
||||||
|
|
||||||
if(NOT OPENJPEG_INSTALL_MAN_DIR)
|
IF(NOT OPENJPEG_INSTALL_INCLUDE_DIR)
|
||||||
set(OPENJPEG_INSTALL_MAN_DIR "share/man/")
|
SET(OPENJPEG_INSTALL_INCLUDE_DIR "include/${OPENJPEG_INSTALL_SUBDIR}")
|
||||||
endif()
|
ENDIF(NOT OPENJPEG_INSTALL_INCLUDE_DIR)
|
||||||
|
|
||||||
if(NOT OPENJPEG_INSTALL_DOC_DIR)
|
IF(NOT OPENJPEG_INSTALL_MAN_DIR)
|
||||||
set(OPENJPEG_INSTALL_DOC_DIR "share/doc/${OPENJPEG_INSTALL_SUBDIR}")
|
SET(OPENJPEG_INSTALL_MAN_DIR "share/man/")
|
||||||
endif()
|
ENDIF(NOT OPENJPEG_INSTALL_MAN_DIR)
|
||||||
|
|
||||||
|
IF(NOT OPENJPEG_INSTALL_DOC_DIR)
|
||||||
|
SET(OPENJPEG_INSTALL_DOC_DIR "share/doc/${OPENJPEG_INSTALL_SUBDIR}")
|
||||||
|
ENDIF(NOT OPENJPEG_INSTALL_DOC_DIR)
|
||||||
|
|
||||||
if(NOT OPENJPEG_INSTALL_JNI_DIR)
|
if(NOT OPENJPEG_INSTALL_JNI_DIR)
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
@@ -134,218 +147,163 @@ if(NOT OPENJPEG_INSTALL_JNI_DIR)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(NOT OPENJPEG_INSTALL_PACKAGE_DIR)
|
IF(NOT OPENJPEG_INSTALL_PACKAGE_DIR)
|
||||||
# We could install *.cmake files in share/ however those files contains
|
# We could install *.cmake files in share/ however those files contains
|
||||||
# hardcoded path to libraries on a multi-arch system (fedora/debian) those
|
# 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)
|
# 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}")
|
SET(OPENJPEG_INSTALL_PACKAGE_DIR "${OPENJPEG_INSTALL_LIB_DIR}/${OPENJPEG_INSTALL_SUBDIR}")
|
||||||
endif()
|
ENDIF(NOT OPENJPEG_INSTALL_PACKAGE_DIR)
|
||||||
|
|
||||||
#-----------------------------------------------------------------------------
|
#-----------------------------------------------------------------------------
|
||||||
# Big endian test:
|
# Big endian test:
|
||||||
include (${CMAKE_ROOT}/Modules/TestBigEndian.cmake)
|
INCLUDE (${CMAKE_ROOT}/Modules/TestBigEndian.cmake)
|
||||||
TEST_BIG_ENDIAN(OPJ_BIG_ENDIAN)
|
TEST_BIG_ENDIAN(OPJ_BIG_ENDIAN)
|
||||||
|
|
||||||
#-----------------------------------------------------------------------------
|
#-----------------------------------------------------------------------------
|
||||||
# Setup file for setting custom ctest vars
|
# Setup file for setting custom ctest vars
|
||||||
configure_file(
|
CONFIGURE_FILE(
|
||||||
${CMAKE_SOURCE_DIR}/cmake/CTestCustom.cmake.in
|
${CMAKE_SOURCE_DIR}/CMake/CTestCustom.cmake.in
|
||||||
${CMAKE_BINARY_DIR}/CTestCustom.cmake
|
${CMAKE_BINARY_DIR}/CTestCustom.cmake
|
||||||
@ONLY
|
@ONLY
|
||||||
)
|
)
|
||||||
|
|
||||||
#-----------------------------------------------------------------------------
|
#-----------------------------------------------------------------------------
|
||||||
# OpenJPEG build configuration options.
|
# OpenJPEG build configuration options.
|
||||||
option(BUILD_SHARED_LIBS "Build OpenJPEG shared library and link executables against it." ON)
|
OPTION(BUILD_SHARED_LIBS "Build OpenJPEG shared library and link executables against it." ON)
|
||||||
set (EXECUTABLE_OUTPUT_PATH ${OPENJPEG_BINARY_DIR}/bin CACHE PATH "Single output directory for building all executables.")
|
SET (EXECUTABLE_OUTPUT_PATH ${OPENJPEG_BINARY_DIR}/bin CACHE PATH "Single output directory for building all executables.")
|
||||||
set (LIBRARY_OUTPUT_PATH ${OPENJPEG_BINARY_DIR}/bin CACHE PATH "Single output directory for building all libraries.")
|
SET (LIBRARY_OUTPUT_PATH ${OPENJPEG_BINARY_DIR}/bin CACHE PATH "Single output directory for building all libraries.")
|
||||||
mark_as_advanced(LIBRARY_OUTPUT_PATH EXECUTABLE_OUTPUT_PATH)
|
MARK_AS_ADVANCED(LIBRARY_OUTPUT_PATH EXECUTABLE_OUTPUT_PATH)
|
||||||
|
|
||||||
#-----------------------------------------------------------------------------
|
#-----------------------------------------------------------------------------
|
||||||
# configure name mangling to allow multiple libraries to coexist
|
# configure name mangling to allow multiple libraries to coexist
|
||||||
# peacefully
|
# peacefully
|
||||||
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/openjpeg_mangle.h.in)
|
IF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/openjpeg_mangle.h.in)
|
||||||
set(MANGLE_PREFIX ${OPENJPEG_LIBRARY_NAME})
|
SET(MANGLE_PREFIX ${OPENJPEG_LIBRARY_NAME})
|
||||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/openjpeg_mangle.h.in
|
CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/openjpeg_mangle.h.in
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/openjpeg_mangle.h
|
${CMAKE_CURRENT_BINARY_DIR}/openjpeg_mangle.h
|
||||||
@ONLY)
|
@ONLY)
|
||||||
endif()
|
ENDIF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/openjpeg_mangle.h.in)
|
||||||
|
|
||||||
|
#-----------------------------------------------------------------------------
|
||||||
|
# pkgconfig support
|
||||||
|
IF(UNIX)
|
||||||
|
# install in lib and not share (see multi-arch note above)
|
||||||
|
CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/libopenjpeg1.pc.cmake
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/libopenjpeg1.pc @ONLY)
|
||||||
|
INSTALL( FILES ${CMAKE_CURRENT_BINARY_DIR}/libopenjpeg1.pc DESTINATION
|
||||||
|
${OPENJPEG_INSTALL_LIB_DIR}/pkgconfig )
|
||||||
|
INSTALL( CODE "EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E create_symlink
|
||||||
|
\"libopenjpeg1.pc\"
|
||||||
|
\"\$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/${OPENJPEG_INSTALL_SHARE_DIR}/pkgconfig/libopenjpeg.pc\")")
|
||||||
|
ENDIF(UNIX)
|
||||||
|
|
||||||
#-----------------------------------------------------------------------------
|
#-----------------------------------------------------------------------------
|
||||||
# Compiler specific flags:
|
# Compiler specific flags:
|
||||||
if(CMAKE_COMPILER_IS_GNUCC)
|
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()
|
ENDIF(CMAKE_COMPILER_IS_GNUCC)
|
||||||
|
|
||||||
#-----------------------------------------------------------------------------
|
#-----------------------------------------------------------------------------
|
||||||
# opj_config.h generation (1/2)
|
# opj_config.h generation (1/2)
|
||||||
|
INCLUDE (${CMAKE_ROOT}/Modules/CheckIncludeFile.cmake)
|
||||||
# Check if some include files are provided by the system
|
|
||||||
include(EnsureFileInclude)
|
|
||||||
# These files are mandatory
|
|
||||||
ensure_file_include("string.h" HAVE_STRING_H YES)
|
|
||||||
ensure_file_include("memory.h" HAVE_MEMORY_H YES)
|
|
||||||
ensure_file_include("stdlib.h" HAVE_STDLIB_H YES)
|
|
||||||
ensure_file_include("stdio.h" HAVE_STDIO_H YES)
|
|
||||||
ensure_file_include("math.h" HAVE_MATH_H YES)
|
|
||||||
ensure_file_include("float.h" HAVE_FLOAT_H YES)
|
|
||||||
ensure_file_include("time.h" HAVE_TIME_H YES)
|
|
||||||
ensure_file_include("stdarg.h" HAVE_STDARG_H YES)
|
|
||||||
ensure_file_include("ctype.h" HAVE_CTYPE_H YES)
|
|
||||||
ensure_file_include("assert.h" HAVE_ASSERT_H YES)
|
|
||||||
|
|
||||||
# For the following files, we provide an alternative, they are not mandatory
|
|
||||||
ensure_file_include("stdint.h" OPJ_HAVE_STDINT_H NO)
|
|
||||||
ensure_file_include("inttypes.h" OPJ_HAVE_INTTYPES_H NO)
|
|
||||||
|
|
||||||
# why check this one ? for openjpip ?
|
|
||||||
include (${CMAKE_ROOT}/Modules/CheckIncludeFile.cmake)
|
|
||||||
CHECK_INCLUDE_FILE("strings.h" HAVE_STRINGS_H)
|
CHECK_INCLUDE_FILE("strings.h" HAVE_STRINGS_H)
|
||||||
|
CHECK_INCLUDE_FILE("inttypes.h" HAVE_INTTYPES_H)
|
||||||
|
CHECK_INCLUDE_FILE("memory.h" HAVE_MEMORY_H)
|
||||||
|
CHECK_INCLUDE_FILE("stdint.h" HAVE_STDINT_H)
|
||||||
|
CHECK_INCLUDE_FILE("stdlib.h" HAVE_STDLIB_H)
|
||||||
|
CHECK_INCLUDE_FILE("string.h" HAVE_STRING_H)
|
||||||
CHECK_INCLUDE_FILE("sys/stat.h" HAVE_SYS_STAT_H)
|
CHECK_INCLUDE_FILE("sys/stat.h" HAVE_SYS_STAT_H)
|
||||||
CHECK_INCLUDE_FILE("sys/types.h" HAVE_SYS_TYPES_H)
|
CHECK_INCLUDE_FILE("sys/types.h" HAVE_SYS_TYPES_H)
|
||||||
CHECK_INCLUDE_FILE("unistd.h" HAVE_UNISTD_H)
|
CHECK_INCLUDE_FILE("unistd.h" HAVE_UNISTD_H)
|
||||||
|
|
||||||
# Enable Large file support
|
|
||||||
include(TestLargeFiles)
|
|
||||||
OPJ_TEST_LARGE_FILES(OPJ_HAVE_LARGEFILES)
|
|
||||||
|
|
||||||
#-----------------------------------------------------------------------------
|
#-----------------------------------------------------------------------------
|
||||||
# Build Library
|
# Build Library
|
||||||
if(BUILD_JPIP_SERVER)
|
INCLUDE_DIRECTORIES(BEFORE ${OPENJPEG_BINARY_DIR})
|
||||||
find_package(CURL REQUIRED)
|
ADD_SUBDIRECTORY(libopenjpeg)
|
||||||
find_package(FCGI REQUIRED)
|
|
||||||
find_package(Threads REQUIRED)
|
|
||||||
if(NOT CMAKE_USE_PTHREADS_INIT)
|
|
||||||
message(FATAL_ERROR "Only pthread are supported")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
add_subdirectory(src/lib)
|
|
||||||
|
|
||||||
#-----------------------------------------------------------------------------
|
#-----------------------------------------------------------------------------
|
||||||
# Build Applications
|
# Build Applications
|
||||||
option(BUILD_CODEC "Build the CODEC executables" ON)
|
OPTION(BUILD_CODEC "Build the CODEC executables" ON)
|
||||||
option(BUILD_MJ2 "Build the MJ2 executables." OFF)
|
OPTION(BUILD_MJ2 "Build the MJ2 executables." OFF)
|
||||||
option(BUILD_JPWL "Build the JPWL library and executables" OFF)
|
OPTION(BUILD_JPWL "Build the JPWL library and executables" OFF)
|
||||||
option(BUILD_JPIP "Build the JPIP library and executables." OFF)
|
OPTION(BUILD_JPIP "Build the JPIP library and executables." OFF)
|
||||||
if(BUILD_JPIP)
|
IF(BUILD_JPIP)
|
||||||
option(BUILD_JPIP_SERVER "Build the JPIP server." OFF)
|
OPTION(BUILD_JPIP_SERVER "Build the JPIP server." OFF)
|
||||||
endif()
|
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(BUILD_JP3D "Build the JP3D comp" OFF)
|
OPTION(USE_SYSTEM_GETOPT "Prefer system installed getopt()" OFF)
|
||||||
mark_as_advanced(BUILD_VIEWER)
|
MARK_AS_ADVANCED(USE_SYSTEM_GETOPT)
|
||||||
mark_as_advanced(BUILD_JAVA)
|
MARK_AS_ADVANCED(BUILD_VIEWER)
|
||||||
mark_as_advanced(BUILD_JP3D)
|
MARK_AS_ADVANCED(BUILD_JAVA)
|
||||||
|
|
||||||
if(BUILD_CODEC OR BUILD_MJ2)
|
IF(BUILD_CODEC OR BUILD_MJ2)
|
||||||
# OFF: It will only build 3rd party libs if they are not found on the system
|
# OFF: It will only build 3rd party libs if they are not found on the system
|
||||||
# ON: 3rd party libs will ALWAYS be build, and used
|
# ON: 3rd party libs will ALWAYS be build, and used
|
||||||
option(BUILD_THIRDPARTY "Build the thirdparty executables if it is needed" OFF)
|
OPTION(BUILD_THIRDPARTY "Build the thirdparty executables if it is needed" OFF)
|
||||||
add_subdirectory(thirdparty)
|
ADD_SUBDIRECTORY(thirdparty)
|
||||||
add_subdirectory(src/bin)
|
ADD_SUBDIRECTORY(applications)
|
||||||
endif ()
|
ENDIF (BUILD_CODEC OR BUILD_MJ2)
|
||||||
add_subdirectory(wrapping)
|
|
||||||
|
|
||||||
#-----------------------------------------------------------------------------
|
#-----------------------------------------------------------------------------
|
||||||
# opj_config.h generation (2/2)
|
# opj_config.h generation (2/2)
|
||||||
configure_file(
|
CONFIGURE_FILE("${OPENJPEG_SOURCE_DIR}/opj_config.h.cmake.in"
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/src/lib/openjp2/opj_config.h.cmake.in
|
"${OPENJPEG_BINARY_DIR}/opj_config.h"
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/src/lib/openjp2/opj_config.h
|
|
||||||
@ONLY
|
|
||||||
)
|
|
||||||
|
|
||||||
configure_file(
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/src/lib/openjp2/opj_config_private.h.cmake.in
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/src/lib/openjp2/opj_config_private.h
|
|
||||||
@ONLY
|
@ONLY
|
||||||
)
|
)
|
||||||
|
|
||||||
#-----------------------------------------------------------------------------
|
#-----------------------------------------------------------------------------
|
||||||
# Build DOCUMENTATION (not in ALL target and only if Doxygen is found)
|
# Build DOCUMENTATION (not in ALL target and only if Doxygen is found)
|
||||||
option(BUILD_DOC "Build the HTML documentation (with doxygen if available)." OFF)
|
OPTION(BUILD_DOC "Build the HTML documentation (with doxygen if available)." OFF)
|
||||||
if(BUILD_DOC)
|
IF(BUILD_DOC)
|
||||||
add_subdirectory(doc)
|
ADD_SUBDIRECTORY(doc)
|
||||||
endif()
|
ENDIF(BUILD_DOC)
|
||||||
|
|
||||||
#-----------------------------------------------------------------------------
|
#-----------------------------------------------------------------------------
|
||||||
# Buld Testing
|
# Buld Testing
|
||||||
option(BUILD_TESTING "Build the tests." OFF)
|
OPTION(BUILD_TESTING "Build the tests." OFF)
|
||||||
if(BUILD_TESTING)
|
IF(BUILD_TESTING)
|
||||||
if(BUILD_CODEC)
|
IF(BUILD_CODEC)
|
||||||
enable_testing()
|
ENABLE_TESTING()
|
||||||
include(CTest)
|
INCLUDE(CTest)
|
||||||
|
|
||||||
# Search openjpeg data needed for the tests
|
# Search openjpeg data needed for the tests
|
||||||
# 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 $ENV{OPJ_DATA_ROOT} ${CMAKE_SOURCE_DIR}/../../data
|
PATHS $ENV{OPJ_DATA_ROOT} ${CMAKE_SOURCE_DIR}/../data
|
||||||
|
${CMAKE_SOURCE_DIR}/../../data
|
||||||
NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH
|
NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH
|
||||||
)
|
)
|
||||||
|
|
||||||
# Add repository where to find tests
|
# Add repository where to find tests
|
||||||
add_subdirectory(tests)
|
ADD_SUBDIRECTORY(tests)
|
||||||
|
|
||||||
else()
|
ELSE(BUILD_CODEC)
|
||||||
message(FATAL_ERROR "You need build codec to run the tests")
|
message(FATAL_ERROR "You need build codec to run the tests")
|
||||||
endif()
|
ENDIF(BUILD_CODEC)
|
||||||
endif()
|
ENDIF(BUILD_TESTING)
|
||||||
|
|
||||||
#-----------------------------------------------------------------------------
|
#-----------------------------------------------------------------------------
|
||||||
# install all targets referenced as OPENJPEGTargets
|
# install all targets referenced as OPENJPEGTargets
|
||||||
install(EXPORT OpenJPEGTargets DESTINATION ${OPENJPEG_INSTALL_PACKAGE_DIR})
|
INSTALL(EXPORT OpenJPEGTargets DESTINATION ${OPENJPEG_INSTALL_PACKAGE_DIR})
|
||||||
configure_file( ${OPENJPEG_SOURCE_DIR}/cmake/OpenJPEGConfig.cmake.in
|
CONFIGURE_FILE( ${OPENJPEG_SOURCE_DIR}/CMake/OpenJPEGConfig.cmake.in
|
||||||
${OPENJPEG_BINARY_DIR}/OpenJPEGConfig.cmake
|
${OPENJPEG_BINARY_DIR}/OpenJPEGConfig.cmake
|
||||||
@ONLY
|
@ONLY
|
||||||
)
|
)
|
||||||
install( FILES ${OPENJPEG_BINARY_DIR}/OpenJPEGConfig.cmake
|
INSTALL( FILES ${OPENJPEG_BINARY_DIR}/OpenJPEGConfig.cmake
|
||||||
DESTINATION ${OPENJPEG_INSTALL_PACKAGE_DIR}
|
DESTINATION ${OPENJPEG_INSTALL_PACKAGE_DIR}
|
||||||
)
|
)
|
||||||
|
|
||||||
#-----------------------------------------------------------------------------
|
#-----------------------------------------------------------------------------
|
||||||
# install CHANGES and LICENSE
|
# install CHANGES and LICENSE
|
||||||
if(EXISTS ${OPENJPEG_SOURCE_DIR}/CHANGES)
|
IF(EXISTS ${OPENJPEG_SOURCE_DIR}/CHANGES)
|
||||||
install(FILES CHANGES DESTINATION ${OPENJPEG_INSTALL_DOC_DIR})
|
INSTALL(FILES CHANGES DESTINATION ${OPENJPEG_INSTALL_DOC_DIR})
|
||||||
endif()
|
ENDIF(EXISTS ${OPENJPEG_SOURCE_DIR}/CHANGES)
|
||||||
install(FILES LICENSE DESTINATION ${OPENJPEG_INSTALL_DOC_DIR})
|
INSTALL(FILES LICENSE DESTINATION ${OPENJPEG_INSTALL_DOC_DIR})
|
||||||
|
|
||||||
include (cmake/OpenJPEGCPack.cmake)
|
INCLUDE (CMake/OpenJPEGCPack.cmake)
|
||||||
|
|
||||||
#-----------------------------------------------------------------------------
|
|
||||||
# pkgconfig support
|
|
||||||
if(UNIX)
|
|
||||||
# install in lib and not share (see multi-arch note above)
|
|
||||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/lib/openjp2/libopenjp2.pc.cmake.in
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/libopenjp2.pc @ONLY)
|
|
||||||
install( FILES ${CMAKE_CURRENT_BINARY_DIR}/libopenjp2.pc DESTINATION
|
|
||||||
${OPENJPEG_INSTALL_LIB_DIR}/pkgconfig )
|
|
||||||
#
|
|
||||||
if(BUILD_JPWL)
|
|
||||||
# install in lib and not share (see multi-arch note above)
|
|
||||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/lib/openjpwl/libopenjpwl.pc.cmake.in
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/libopenjpwl.pc @ONLY)
|
|
||||||
install( FILES ${CMAKE_CURRENT_BINARY_DIR}/libopenjpwl.pc DESTINATION
|
|
||||||
${OPENJPEG_INSTALL_LIB_DIR}/pkgconfig )
|
|
||||||
endif()
|
|
||||||
#
|
|
||||||
if(BUILD_JPIP)
|
|
||||||
# install in lib and not share (see multi-arch note above)
|
|
||||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/lib/openjpip/libopenjpip.pc.cmake.in
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/libopenjpip.pc @ONLY)
|
|
||||||
install( FILES ${CMAKE_CURRENT_BINARY_DIR}/libopenjpip.pc DESTINATION
|
|
||||||
${OPENJPEG_INSTALL_LIB_DIR}/pkgconfig )
|
|
||||||
endif()
|
|
||||||
#
|
|
||||||
if(BUILD_JP3D)
|
|
||||||
# install in lib and not share (see multi-arch note above)
|
|
||||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/lib/openjp3d/libopenjp3d.pc.cmake.in
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/libopenjp3d.pc @ONLY)
|
|
||||||
install( FILES ${CMAKE_CURRENT_BINARY_DIR}/libopenjp3d.pc DESTINATION
|
|
||||||
${OPENJPEG_INSTALL_LIB_DIR}/pkgconfig )
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
#-----------------------------------------------------------------------------
|
|
||||||
|
|||||||
73
INSTALL
@@ -2,10 +2,63 @@
|
|||||||
How to build and install openjpeg binaries
|
How to build and install openjpeg binaries
|
||||||
==========================================
|
==========================================
|
||||||
|
|
||||||
UNIX/LINUX/MacOSX/Windows systems
|
UNIX/LINUX similar systems
|
||||||
--------------------------
|
--------------------------
|
||||||
|
|
||||||
Using cmake (see www.cmake.org)
|
1) Using autotools
|
||||||
|
|
||||||
|
It is highly recommended that pkg-config is installed. If needed, you have to
|
||||||
|
properly set the environment variable PKG_CONFIG_PATH so that the .pc files
|
||||||
|
are found.
|
||||||
|
|
||||||
|
To build from top-level directory, you can simply type:
|
||||||
|
./bootstrap.sh
|
||||||
|
./configure
|
||||||
|
make
|
||||||
|
|
||||||
|
To keep all build files in a separate directory, you can type instead:
|
||||||
|
./bootstrap.sh
|
||||||
|
mkdir build
|
||||||
|
cd build
|
||||||
|
../configure
|
||||||
|
make
|
||||||
|
|
||||||
|
To install:
|
||||||
|
sudo make install
|
||||||
|
|
||||||
|
To clean:
|
||||||
|
make clean
|
||||||
|
make distclean
|
||||||
|
|
||||||
|
To build doc (requires 'doxygen' to be found on your system):
|
||||||
|
(this will create an html directory in TOP_LEVEL/doc)
|
||||||
|
make doc
|
||||||
|
|
||||||
|
Main './configure' options (type './configure --help' for more details)
|
||||||
|
'--enable-mj2'
|
||||||
|
'--enable-jpwl'
|
||||||
|
'--enable-jpip'
|
||||||
|
'--prefix=/path/to/install/directory' (example : '--prefix=$PWD/installed')
|
||||||
|
'--enable-debug' (default : disabled)
|
||||||
|
|
||||||
|
You can also specify your own CFLAGS and LDFLAGS with (for example):
|
||||||
|
CFLAGS="-O3 -pipe" LDFLAGS="-Wl,-s" ./configure
|
||||||
|
|
||||||
|
The (optional) dependencies of some binaries are libpng, libtiff, libcms 1 or 2
|
||||||
|
and FastCGI. Only libtiff and FastCGI have no .pc file. There should be some
|
||||||
|
automatic detection if they are installed in /usr, /usr/local or /opt/local.
|
||||||
|
Otherwise, you can tune their detection (as well as for libpng and libcms1 or 2
|
||||||
|
too) with the environment variables:
|
||||||
|
|
||||||
|
TIFF_CFLAGS
|
||||||
|
TIFF_LIBS
|
||||||
|
FCGI_CFLAGS
|
||||||
|
FCGI_LIBS
|
||||||
|
|
||||||
|
See './configure --help' output for more details.
|
||||||
|
|
||||||
|
|
||||||
|
2) Using cmake (see www.cmake.org)
|
||||||
|
|
||||||
Type:
|
Type:
|
||||||
cmake .
|
cmake .
|
||||||
@@ -31,15 +84,9 @@ Main available cmake flags:
|
|||||||
* 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')
|
||||||
* To build the documentation: '-DBUILD_DOC:bool=on' (default: 'OFF')
|
|
||||||
* To build the MJ2 executables: '-DBUILD_MJ2:bool=on' (default: 'OFF')
|
* To build the MJ2 executables: '-DBUILD_MJ2:bool=on' (default: 'OFF')
|
||||||
* To build the JPWL executables and JPWL library: '-DBUILD_JPWL:bool=on' (default: 'OFF')
|
* To build the JPWL executables and JPWL library: '-DBUILD_JPWL:bool=on' (default: 'OFF')
|
||||||
* To build the JPIP library and utilities: '-DBUILD_JPIP:bool=on' (default: 'OFF')
|
* To build the JPIP library and utilities: '-DBUILD_JPIP:bool=on' (default: 'OFF')
|
||||||
** To build the JPIP server: '-DBUILD_JPIP_SERVER:bool=on' (default: 'OFF')
|
|
||||||
* To build the JP3D library and utilities: '-DBUILD_JP3D:bool=on' (default: 'OFF') (experimental)
|
|
||||||
* To build the Java binding: '-DBUILD_JAVA:bool=on' (default: 'OFF') (experimental).
|
|
||||||
** to choose which java implementation, you can set your JAVA_HOME env var.
|
|
||||||
* To build the wxWidgets/C++ viewer: 'BUILD_VIEWER:BOOL=ON' (default OFF) (experimental)
|
|
||||||
* To enable testing (and automatic result upload to http://my.cdash.org/index.php?project=OPENJPEG):
|
* To enable testing (and automatic result upload to http://my.cdash.org/index.php?project=OPENJPEG):
|
||||||
cmake . -DBUILD_TESTING:BOOL=ON -DOPJ_DATA_ROOT:PATH='path/to/the/data/directory'
|
cmake . -DBUILD_TESTING:BOOL=ON -DOPJ_DATA_ROOT:PATH='path/to/the/data/directory'
|
||||||
make
|
make
|
||||||
@@ -52,7 +99,7 @@ Main available cmake flags:
|
|||||||
MACOSX
|
MACOSX
|
||||||
------
|
------
|
||||||
|
|
||||||
The same building procedures as above work for MACOSX.
|
The same building procedures as above (autotools and cmake) work for MACOSX.
|
||||||
The xcode project file can also be used.
|
The xcode project file can also be used.
|
||||||
|
|
||||||
If it does not work, try adding the following flag to the cmake command :
|
If it does not work, try adding the following flag to the cmake command :
|
||||||
@@ -61,9 +108,7 @@ If it does not work, try adding the following flag to the cmake command :
|
|||||||
WINDOWS
|
WINDOWS
|
||||||
-------
|
-------
|
||||||
|
|
||||||
You can use cmake to generate project files for the IDE you are using (VS2010, NMake, etc).
|
If you're using cygwin or MinGW+MSYS, the same procedures as for Unix can be used.
|
||||||
|
|
||||||
|
Otherwise you can use cmake to generate project files for the IDE you are using (VC2010, etc).
|
||||||
Type 'cmake --help' for available generators on your platform.
|
Type 'cmake --help' for available generators on your platform.
|
||||||
|
|
||||||
Make sure to build the third party libs (png, zlib ...):
|
|
||||||
|
|
||||||
'-DBUILD_THIRDPARTY:BOOL=ON'
|
|
||||||
|
|||||||
14
LICENSE
@@ -1,19 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
* The copyright in this software is being made available under the 2-clauses
|
* Copyright (c) 2002-2012, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
|
||||||
* BSD License, included below. This software may be subject to other third
|
* Copyright (c) 2002-2012, Professor Benoit Macq
|
||||||
* party and contributor rights, including patent rights, and no such rights
|
* Copyright (c) 2003-2012, Antonin Descampe
|
||||||
* are granted under this license.
|
|
||||||
*
|
|
||||||
* Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
|
|
||||||
* Copyright (c) 2002-2014, Professor Benoit Macq
|
|
||||||
* Copyright (c) 2003-2014, Antonin Descampe
|
|
||||||
* Copyright (c) 2003-2009, Francois-Olivier Devaux
|
* Copyright (c) 2003-2009, Francois-Olivier Devaux
|
||||||
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
* Copyright (c) 2002-2003, Yannick Verschueren
|
||||||
* Copyright (c) 2001-2003, David Janssens
|
* Copyright (c) 2001-2003, David Janssens
|
||||||
* Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France
|
|
||||||
* Copyright (c) 2012, CS Systemes d'Information, France
|
|
||||||
*
|
|
||||||
* 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
|
||||||
|
|||||||
75
Makefile.am
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
DISTCHECK_CONFIGURE_FLAGS = --enable-jpip=yes --enable-jpip-server=yes --enable-jpwl=yes --enable-mj2=yes
|
||||||
|
|
||||||
|
ACLOCAL_AMFLAGS = -I m4
|
||||||
|
|
||||||
|
SUBDIRS = libopenjpeg applications doc
|
||||||
|
|
||||||
|
pkgconfigdir = $(libdir)/pkgconfig
|
||||||
|
pkgconfig_DATA = libopenjpeg1.pc
|
||||||
|
|
||||||
|
if WANT_JPWL
|
||||||
|
pkgconfig_DATA += libopenjpeg-jpwl.pc
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
MAINTAINERCLEANFILES = \
|
||||||
|
Makefile.in \
|
||||||
|
aclocal.m4 \
|
||||||
|
config.guess \
|
||||||
|
opj_config.h.in \
|
||||||
|
opj_config.h.in~ \
|
||||||
|
config.sub \
|
||||||
|
configure \
|
||||||
|
depcomp \
|
||||||
|
install-sh \
|
||||||
|
ltmain.sh \
|
||||||
|
missing
|
||||||
|
|
||||||
|
EXTRA_DIST = \
|
||||||
|
CMake/CTestCustom.cmake.in \
|
||||||
|
CMake/FindFCGI.cmake \
|
||||||
|
CMake/FindLCMS2.cmake \
|
||||||
|
CMake/FindLCMS.cmake \
|
||||||
|
CMake/OpenJPEGConfig.cmake.in \
|
||||||
|
CMakeLists.txt \
|
||||||
|
CTestConfig.cmake \
|
||||||
|
AUTHORS \
|
||||||
|
CHANGES \
|
||||||
|
INSTALL \
|
||||||
|
LICENSE \
|
||||||
|
NEWS \
|
||||||
|
README \
|
||||||
|
THANKS \
|
||||||
|
bootstrap.sh \
|
||||||
|
libopenjpeg1.pc.cmake \
|
||||||
|
libopenjpeg1.pc.in \
|
||||||
|
libopenjpeg-jpwl.pc.in \
|
||||||
|
opj_config.h.cmake.in \
|
||||||
|
m4/opj_check_lib.m4 \
|
||||||
|
m4/opj_doxygen.m4 \
|
||||||
|
m4/pkg.m4
|
||||||
|
|
||||||
|
.PHONY: doc
|
||||||
|
|
||||||
|
# Documentation
|
||||||
|
|
||||||
|
doc:
|
||||||
|
@echo "entering doc/"
|
||||||
|
@cd doc && make doc
|
||||||
|
|
||||||
|
install-data-hook:
|
||||||
|
if HAVE_WIN32
|
||||||
|
$(LN_S) -f libopenjpeg1.pc $(DESTDIR)$(pkgconfigdir)/libopenjpeg.pc
|
||||||
|
else
|
||||||
|
$(LN_S) -nf libopenjpeg1.pc $(DESTDIR)$(pkgconfigdir)/libopenjpeg.pc
|
||||||
|
endif
|
||||||
|
@echo -e " (PC)\t$(pkgconfigdir)/libopenjpeg1.pc" >> $(top_builddir)/report.txt
|
||||||
|
@echo -e " (LN)\t$(pkgconfigdir)/libopenjpeg.pc" >> $(top_builddir)/report.txt
|
||||||
|
if WANT_JPWL
|
||||||
|
@echo -e " (PC)\t$(pkgconfigdir)/libopenjpeg-jpwl.pc" >> $(top_builddir)/report.txt
|
||||||
|
endif
|
||||||
|
@cat $(top_builddir)/report.txt
|
||||||
|
@rm $(top_builddir)/report.txt
|
||||||
|
|
||||||
|
uninstall-hook:
|
||||||
|
rm -f $(DESTDIR)$(pkgconfigdir)/libopenjpeg.pc
|
||||||
43
NEWS
@@ -2,42 +2,23 @@
|
|||||||
OpenJPEG NEWS - user visible changes
|
OpenJPEG NEWS - user visible changes
|
||||||
====================================
|
====================================
|
||||||
|
|
||||||
Changes from OpenJPEG 2.0.0 to OpenJPEG 2.0.1
|
Changes from OpenJPEG 1.5.1 to OpenJPEG 1.5.0
|
||||||
----------------------------------------------
|
----------------------------------------------
|
||||||
|
|
||||||
|
Security:
|
||||||
|
|
||||||
|
* Fixes: CVE-2012-3535
|
||||||
|
* Fixes: CVE-2012-3358
|
||||||
|
|
||||||
New Features:
|
New Features:
|
||||||
|
|
||||||
* Digital Cinema profiles have been fixed and updated
|
* Use a new API scheme and solve the SOVERSIONing in OpenJPEG
|
||||||
* New option to disable MCT if needed
|
* Allow better integration with multi-arch system
|
||||||
* extended RAW support: it is now possible to input raw images
|
* Compile & Install Java bindings (CMake)
|
||||||
with subsampled color components (422, 420, etc)
|
* Install required addXMLinJP2 (JPIP)
|
||||||
|
|
||||||
API/ABI modifications: (see abi_compat_report_2.0.1.html in dev-utils/scripts)
|
|
||||||
|
|
||||||
* No changes, API/ABI fully compatible with 2.0.0
|
|
||||||
|
|
||||||
Misc:
|
Misc:
|
||||||
|
|
||||||
* OpenJPEG is now officialy conformant with JPEG 2000 Part-1
|
* fix linker error by resolving all symbols (eg. missing -lm)
|
||||||
and will soon become official reference software at the
|
* fix some man page typos
|
||||||
JPEG committee.
|
|
||||||
* Huge amount of bug fixes. See CHANGES for details.
|
|
||||||
|
|
||||||
|
|
||||||
Changes from OpenJPEG 1.5.x to OpenJPEG 2.0.0
|
|
||||||
----------------------------------------------
|
|
||||||
|
|
||||||
New Features:
|
|
||||||
|
|
||||||
* streaming capabilities
|
|
||||||
* merge JP3D
|
|
||||||
|
|
||||||
API modifications:
|
|
||||||
|
|
||||||
* Use a 64bits capable API
|
|
||||||
|
|
||||||
Misc:
|
|
||||||
|
|
||||||
* removed autotools build system
|
|
||||||
* folders hierarchies reorganisation
|
|
||||||
* Huge amount of bug fixes. See CHANGES for details.
|
* Huge amount of bug fixes. See CHANGES for details.
|
||||||
|
|||||||
38
README
@@ -4,44 +4,22 @@ OPENJPEG LIBRARY and APPLICATIONS
|
|||||||
|
|
||||||
Details on folders hierarchy:
|
Details on folders hierarchy:
|
||||||
|
|
||||||
* src
|
* libopenjpeg: contains the sources of the openjpeg library
|
||||||
* lib
|
* jpwl: contains the additional sources if you want to build a JPWL-flavoured library.
|
||||||
* openjp2: contains the sources of the openjp2 library (Part 1 & 2)
|
* applications: contains all applications that use the openjpeg library
|
||||||
* openjpwl: contains the additional sources if you want to build a JPWL-flavoured library.
|
|
||||||
* openjpip: complete client-server architecture for remote browsing of jpeg 2000 images.
|
|
||||||
* openjp3d: JP3D implementation
|
|
||||||
* openmj2: MJ2 implementation
|
|
||||||
* bin: contains all applications that use the openjpeg library
|
|
||||||
* common: common files to all applications
|
* common: common files to all applications
|
||||||
* jp2: a basic codec
|
* codec: a basic codec
|
||||||
* mj2: motion jpeg 2000 executables
|
* mj2: motion jpeg 2000 executables
|
||||||
* jpip: OpenJPIP applications (server and dec server)
|
* JavaOpenJPEG: java jni to use openjpeg in a java program
|
||||||
* java: a Java client viewer for JPIP
|
* jpip: complete client-server architecture for remote browsing of jpeg 2000 images. See corresponding README for more details.
|
||||||
* jp3d: JP3D applications
|
|
||||||
* tcltk: a test tool for JP3D
|
|
||||||
* wx
|
|
||||||
* OPJViewer: gui for displaying j2k files (based on wxWidget)
|
* OPJViewer: gui for displaying j2k files (based on wxWidget)
|
||||||
* wrapping
|
|
||||||
* java: java jni to use openjpeg in a java program
|
|
||||||
* thirdparty: thirdparty libraries used by some applications. These libraries will be built only if there are not found on the system. Note that libopenjpeg itself does not have any dependency.
|
* thirdparty: thirdparty libraries used by some applications. These libraries will be built only if there are not found on the system. Note that libopenjpeg itself does not have any dependency.
|
||||||
* doc: doxygen documentation setup file and man pages
|
* doc: doxygen documentation setup file and man pages
|
||||||
* tests: configuration files and utilities for the openjpeg test suite. All test images are located in 'http://openjpeg.googlecode.com/svn/data' folder.
|
* tests: configuration files and utilities for the openjpeg test suite. All test images are located in 'http://openjpeg.googlecode.com/svn/data' folder.
|
||||||
* cmake: cmake related files
|
* CMake: cmake related files
|
||||||
|
* m4: autotools related files
|
||||||
|
|
||||||
see LICENSE for license and copyright information.
|
see LICENSE for license and copyright information.
|
||||||
see INSTALL for installation procedures.
|
see INSTALL for installation procedures.
|
||||||
see NEWS for user visible changes in successive releases.
|
see NEWS for user visible changes in successive releases.
|
||||||
see CHANGES for per-revision changes.
|
see CHANGES for per-revision changes.
|
||||||
|
|
||||||
----------------
|
|
||||||
API/ABI
|
|
||||||
|
|
||||||
OpenJPEG strives to provide a stable API/ABI for your applications. As such it
|
|
||||||
only exposes a limited subset of its functions. It uses a mecanism of
|
|
||||||
exporting/hiding functions. If you are unsure which functions you can use in
|
|
||||||
your applications, you should compile OpenJPEG using something similar to gcc:
|
|
||||||
-fvisibility=hidden compilation flag.
|
|
||||||
See also: http://gcc.gnu.org/wiki/Visibility
|
|
||||||
|
|
||||||
On windows, MSVC directly supports export/hidding function and as such the only
|
|
||||||
API available is the one supported by OpenJPEG.
|
|
||||||
|
|||||||
4
THANKS
@@ -4,11 +4,13 @@ Many people have contributed to OpenJPEG by reporting problems, suggesting vario
|
|||||||
or submitting actual code. Here is a list of these people. Help me keep
|
or submitting actual code. Here is a list of these people. Help me keep
|
||||||
it complete and exempt of errors.
|
it complete and exempt of errors.
|
||||||
|
|
||||||
|
Mathieu Malaterre
|
||||||
Winfried Szukalski
|
Winfried Szukalski
|
||||||
Vincent Torri
|
Vincent Torri
|
||||||
Bob Friesenhahn
|
Bob Friesenhahn
|
||||||
Callum Lerwick
|
Callum Lerwick
|
||||||
Dzonatas Sol
|
Dzonatas Sol
|
||||||
|
Mickaël Savinaud
|
||||||
Julien Malik
|
Julien Malik
|
||||||
Jerôme Fimes
|
Jerôme Fimes
|
||||||
Herve Drolon
|
Herve Drolon
|
||||||
@@ -29,5 +31,3 @@ Arnaud Maye
|
|||||||
Rex Dieter
|
Rex Dieter
|
||||||
David Burken
|
David Burken
|
||||||
Parvatha Elangovan
|
Parvatha Elangovan
|
||||||
Hans Johnson
|
|
||||||
Luc Hermitte
|
|
||||||
22
applications/CMakeLists.txt
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
# Build the each application if it needed
|
||||||
|
|
||||||
|
IF(BUILD_CODEC)
|
||||||
|
ADD_SUBDIRECTORY(codec)
|
||||||
|
ENDIF(BUILD_CODEC)
|
||||||
|
|
||||||
|
IF(BUILD_MJ2)
|
||||||
|
ADD_SUBDIRECTORY(mj2)
|
||||||
|
ENDIF(BUILD_MJ2)
|
||||||
|
|
||||||
|
# Client & Server:
|
||||||
|
IF(BUILD_JPIP)
|
||||||
|
ADD_SUBDIRECTORY(jpip)
|
||||||
|
ENDIF(BUILD_JPIP)
|
||||||
|
|
||||||
|
IF(BUILD_VIEWER)
|
||||||
|
ADD_SUBDIRECTORY(OPJViewer)
|
||||||
|
ENDIF(BUILD_VIEWER)
|
||||||
|
|
||||||
|
IF(BUILD_JAVA)
|
||||||
|
ADD_SUBDIRECTORY(JavaOpenJPEG)
|
||||||
|
ENDIF(BUILD_JAVA)
|
||||||
@@ -1,13 +1,18 @@
|
|||||||
#JavaOpenJPEG/CMakeLists.txt
|
#JavaOpenJPEG/CMakeLists.txt
|
||||||
|
|
||||||
# First thing define the common source:
|
# First thing define the common source:
|
||||||
set(openjpegjni_SRCS
|
SET(openjpegjni_SRCS
|
||||||
JavaOpenJPEGDecoder.c
|
JavaOpenJPEGDecoder.c
|
||||||
JavaOpenJPEG.c
|
JavaOpenJPEG.c
|
||||||
${OPENJPEG_SOURCE_DIR}/src/bin/common/opj_getopt.c
|
${OPENJPEG_SOURCE_DIR}/applications/codec/index.c
|
||||||
${OPENJPEG_SOURCE_DIR}/src/bin/jp2/convert.c
|
${OPENJPEG_SOURCE_DIR}/applications/codec/convert.c
|
||||||
index.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)
|
||||||
@@ -15,10 +20,9 @@ include_directories(${JNI_INCLUDE_DIRS})
|
|||||||
|
|
||||||
# required header file:
|
# required header file:
|
||||||
include_directories(
|
include_directories(
|
||||||
${OPENJPEG_BINARY_DIR}/src/lib/openjp2 # opj_config.h
|
${OPENJPEG_SOURCE_DIR}/libopenjpeg
|
||||||
${OPENJPEG_SOURCE_DIR}/src/lib/openmj2
|
${OPENJPEG_SOURCE_DIR}/applications/common
|
||||||
${OPENJPEG_SOURCE_DIR}/src/bin/common
|
${OPENJPEG_SOURCE_DIR}/applications/codec
|
||||||
${OPENJPEG_SOURCE_DIR}/src/bin/jp2
|
|
||||||
)
|
)
|
||||||
|
|
||||||
add_library(openjpegjni MODULE
|
add_library(openjpegjni MODULE
|
||||||
@@ -27,24 +31,27 @@ add_library(openjpegjni MODULE
|
|||||||
# Java module should not have a SONAME:
|
# Java module should not have a SONAME:
|
||||||
set_property(TARGET openjpegjni PROPERTY NO_SONAME 1)
|
set_property(TARGET openjpegjni PROPERTY NO_SONAME 1)
|
||||||
|
|
||||||
# FIXME (need to use old API):
|
TARGET_LINK_LIBRARIES(openjpegjni ${OPENJPEG_LIBRARY_NAME})
|
||||||
if(BUILD_MJ2)
|
|
||||||
target_link_libraries(openjpegjni openmj2)
|
|
||||||
endif()
|
|
||||||
target_link_libraries(openjpegjni
|
|
||||||
${PNG_LIBNAME} ${TIFF_LIBNAME} ${LCMS_LIBNAME} ${Z_LIBNAME}
|
|
||||||
)
|
|
||||||
if(UNIX)
|
if(UNIX)
|
||||||
target_link_libraries(openjpegjni m)
|
target_link_libraries(openjpegjni m)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
install(TARGETS openjpegjni
|
INSTALL(TARGETS openjpegjni
|
||||||
EXPORT OpenJPEGTargets
|
EXPORT OpenJPEGTargets
|
||||||
LIBRARY DESTINATION ${OPENJPEG_INSTALL_JNI_DIR} COMPONENT Libraries
|
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")
|
||||||
@@ -52,9 +59,11 @@ file(GLOB java_srcs "java-sources/org/openJpeg/*.java")
|
|||||||
# make sure target javac dir exists:
|
# make sure target javac dir exists:
|
||||||
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/classes)
|
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
|
||||||
@@ -63,11 +72,11 @@ add_custom_command(
|
|||||||
)
|
)
|
||||||
|
|
||||||
# name the target
|
# name the target
|
||||||
add_custom_target(OpenJPEGJavaJar ALL
|
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
|
INSTALL(FILES ${LIBRARY_OUTPUT_PATH}/openjpeg.jar
|
||||||
DESTINATION ${OPENJPEG_INSTALL_SHARE_DIR} COMPONENT JavaModule
|
DESTINATION ${OPENJPEG_INSTALL_SHARE_DIR} COMPONENT JavaModule
|
||||||
)
|
)
|
||||||
@@ -1,10 +1,9 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
|
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
|
||||||
* Copyright (c) 2002-2014, Professor Benoit Macq
|
* Copyright (c) 2002-2007, Professor Benoit Macq
|
||||||
* Copyright (c) 2001-2003, David Janssens
|
* Copyright (c) 2001-2003, David Janssens
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
* Copyright (c) 2002-2003, Yannick Verschueren
|
||||||
* Copyright (c) 2003-2007, Francois-Olivier Devaux
|
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
|
||||||
* Copyright (c) 2003-2014, Antonin Descampe
|
|
||||||
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
||||||
* Copyright (c) 2006-2007, Parvatha Elangovan
|
* Copyright (c) 2006-2007, Parvatha Elangovan
|
||||||
* Copyright (c) 2007, Patrick Piscaglia (Telemis)
|
* Copyright (c) 2007, Patrick Piscaglia (Telemis)
|
||||||
@@ -38,7 +37,6 @@
|
|||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
#include "openjpeg.h"
|
#include "openjpeg.h"
|
||||||
#include "opj_includes.h"
|
|
||||||
#include "opj_getopt.h"
|
#include "opj_getopt.h"
|
||||||
#include "convert.h"
|
#include "convert.h"
|
||||||
#include "index.h"
|
#include "index.h"
|
||||||
@@ -91,7 +89,7 @@ typedef struct img_folder{
|
|||||||
float *rates;
|
float *rates;
|
||||||
}img_fol_t;
|
}img_fol_t;
|
||||||
|
|
||||||
static void encode_help_display() {
|
void encode_help_display() {
|
||||||
fprintf(stdout,"HELP\n----\n\n");
|
fprintf(stdout,"HELP\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");
|
||||||
|
|
||||||
@@ -331,7 +329,7 @@ static void encode_help_display() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static OPJ_PROG_ORDER give_progression(const char progression[4]) {
|
OPJ_PROG_ORDER give_progression(char progression[4]) {
|
||||||
if(strncmp(progression, "LRCP", 4) == 0) {
|
if(strncmp(progression, "LRCP", 4) == 0) {
|
||||||
return LRCP;
|
return LRCP;
|
||||||
}
|
}
|
||||||
@@ -351,6 +349,19 @@ static OPJ_PROG_ORDER give_progression(const char progression[4]) {
|
|||||||
return PROG_UNKNOWN;
|
return PROG_UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* <summary>
|
||||||
|
* Get logarithm of an integer and round downwards.
|
||||||
|
* </summary>
|
||||||
|
*/
|
||||||
|
int int_floorlog2(int a) {
|
||||||
|
int l;
|
||||||
|
for (l=0; a>1; l++) {
|
||||||
|
a>>=1;
|
||||||
|
}
|
||||||
|
return l;
|
||||||
|
}
|
||||||
|
|
||||||
static int initialise_4K_poc(opj_poc_t *POC, int numres){
|
static int initialise_4K_poc(opj_poc_t *POC, int numres){
|
||||||
POC[0].tile = 1;
|
POC[0].tile = 1;
|
||||||
POC[0].resno0 = 0;
|
POC[0].resno0 = 0;
|
||||||
@@ -369,7 +380,7 @@ static int initialise_4K_poc(opj_poc_t *POC, int numres){
|
|||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cinema_parameters(opj_cparameters_t *parameters){
|
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;
|
||||||
@@ -402,7 +413,7 @@ static void cinema_parameters(opj_cparameters_t *parameters){
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cinema_setup_encoder(opj_cparameters_t *parameters,opj_image_t *image, img_fol_t *img_fol){
|
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;
|
||||||
opj_poc_t *POC = NULL;
|
opj_poc_t *POC = NULL;
|
||||||
@@ -484,7 +495,7 @@ static void cinema_setup_encoder(opj_cparameters_t *parameters,opj_image_t *imag
|
|||||||
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------------------------ */
|
||||||
static 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[]={
|
||||||
@@ -502,7 +513,7 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param
|
|||||||
|
|
||||||
/* parse the command line */
|
/* parse the command line */
|
||||||
/* UniPG>> */
|
/* UniPG>> */
|
||||||
const char optlist[] = "i:o:hr:q:n:b:c:t:p:s:SEM:x:R:d:T:If:P:C:F:u:"
|
const char optlist[] = "i:o:hr:q:n:b:c:t:p:s:SEM:x:R:d:T:If:P:C:F:u:J"
|
||||||
#ifdef USE_JPWL
|
#ifdef USE_JPWL
|
||||||
"W:"
|
"W:"
|
||||||
#endif /* USE_JPWL */
|
#endif /* USE_JPWL */
|
||||||
@@ -617,7 +628,9 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param
|
|||||||
parameters->tcp_numlayers = numlayers;
|
parameters->tcp_numlayers = numlayers;
|
||||||
numresolution = parameters->numresolution;
|
numresolution = parameters->numresolution;
|
||||||
matrix_width = numresolution * 3;
|
matrix_width = numresolution * 3;
|
||||||
parameters->cp_matrice = (int *) opj_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++) {
|
||||||
@@ -845,7 +858,10 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param
|
|||||||
|
|
||||||
case 'C': /* add a comment */
|
case 'C': /* add a comment */
|
||||||
{
|
{
|
||||||
parameters->cp_comment = (char*)opj_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);
|
||||||
}
|
}
|
||||||
@@ -874,7 +890,10 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param
|
|||||||
|
|
||||||
case 'z': /* Image Directory path */
|
case 'z': /* Image Directory path */
|
||||||
{
|
{
|
||||||
img_fol->imgdirpath = (char*)opj_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;
|
||||||
}
|
}
|
||||||
@@ -1236,6 +1255,10 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param
|
|||||||
/* <<UniPG */
|
/* <<UniPG */
|
||||||
/* ------------------------------------------------------ */
|
/* ------------------------------------------------------ */
|
||||||
|
|
||||||
|
case 'J': /* jpip on */
|
||||||
|
{
|
||||||
|
parameters->jpip_on = OPJ_TRUE;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
/* ------------------------------------------------------ */
|
/* ------------------------------------------------------ */
|
||||||
|
|
||||||
@@ -1325,7 +1348,7 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param
|
|||||||
start position in the codestream
|
start position in the codestream
|
||||||
end position of this packet
|
end position of this packet
|
||||||
*/
|
*/
|
||||||
static char* create_index_into_byte_array(opj_codestream_info_t *cstr_info, int* buffer_size) {
|
char* create_index_into_byte_array(opj_codestream_info_t *cstr_info, int* buffer_size) {
|
||||||
int tileno, compno, layno, resno, precno, pack_nb, x, y;
|
int tileno, compno, layno, resno, precno, pack_nb, x, y;
|
||||||
char* buffer = NULL;
|
char* buffer = NULL;
|
||||||
int buffer_pos = 0;
|
int buffer_pos = 0;
|
||||||
@@ -1334,11 +1357,11 @@ static char* create_index_into_byte_array(opj_codestream_info_t *cstr_info, int*
|
|||||||
prec_max = 0;
|
prec_max = 0;
|
||||||
for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) {
|
for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) {
|
||||||
for (resno = 0; resno < cstr_info->numdecompos[0] + 1; resno++) {
|
for (resno = 0; resno < cstr_info->numdecompos[0] + 1; resno++) {
|
||||||
prec_max = int_max(prec_max,cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno]);
|
prec_max = max(prec_max,cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 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 */
|
||||||
@@ -1347,18 +1370,18 @@ static char* create_index_into_byte_array(opj_codestream_info_t *cstr_info, int*
|
|||||||
+ 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*) opj_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;
|
||||||
@@ -1583,7 +1606,7 @@ static char* create_index_into_byte_array(opj_codestream_info_t *cstr_info, int*
|
|||||||
} /* 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;
|
||||||
}
|
}
|
||||||
@@ -1597,7 +1620,7 @@ static char* create_index_into_byte_array(opj_codestream_info_t *cstr_info, int*
|
|||||||
/* --------------------------------------------------------------------------
|
/* --------------------------------------------------------------------------
|
||||||
------------ Get the image byte[] from the Java object -------------------*/
|
------------ Get the image byte[] from the Java object -------------------*/
|
||||||
|
|
||||||
static opj_image_t* loadImage(opj_cparameters_t *parameters, JNIEnv *env, jobject obj, jclass cls) {
|
opj_image_t* loadImage(opj_cparameters_t *parameters, JNIEnv *env, jobject obj, jclass cls) {
|
||||||
int i,max,shift,w,h,depth;
|
int i,max,shift,w,h,depth;
|
||||||
opj_image_t * img = NULL;
|
opj_image_t * img = NULL;
|
||||||
int compno, numcomps;
|
int compno, numcomps;
|
||||||
@@ -1616,7 +1639,7 @@ static opj_image_t* loadImage(opj_cparameters_t *parameters, JNIEnv *env, jobjec
|
|||||||
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;
|
||||||
@@ -1629,7 +1652,7 @@ static opj_image_t* loadImage(opj_cparameters_t *parameters, JNIEnv *env, jobjec
|
|||||||
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;
|
||||||
@@ -1644,8 +1667,10 @@ static opj_image_t* loadImage(opj_cparameters_t *parameters, JNIEnv *env, jobjec
|
|||||||
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;
|
||||||
@@ -1691,12 +1716,12 @@ static opj_image_t* loadImage(opj_cparameters_t *parameters, JNIEnv *env, jobjec
|
|||||||
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];
|
||||||
@@ -1710,13 +1735,14 @@ static opj_image_t* loadImage(opj_cparameters_t *parameters, JNIEnv *env, jobjec
|
|||||||
}
|
}
|
||||||
(*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];
|
||||||
@@ -1729,14 +1755,15 @@ static opj_image_t* loadImage(opj_cparameters_t *parameters, JNIEnv *env, jobjec
|
|||||||
}
|
}
|
||||||
(*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];
|
||||||
@@ -1751,7 +1778,7 @@ static opj_image_t* loadImage(opj_cparameters_t *parameters, JNIEnv *env, jobjec
|
|||||||
}
|
}
|
||||||
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;
|
||||||
}
|
}
|
||||||
@@ -1761,7 +1788,7 @@ static opj_image_t* loadImage(opj_cparameters_t *parameters, JNIEnv *env, jobjec
|
|||||||
-------------------- 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;
|
||||||
@@ -1772,9 +1799,9 @@ JNIEXPORT jlong JNICALL Java_org_openJpeg_OpenJPEGJavaEncoder_internalEncodeImag
|
|||||||
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 */
|
||||||
|
|
||||||
char* 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;
|
||||||
@@ -1783,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");
|
||||||
@@ -1802,12 +1831,15 @@ 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 = opj_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);
|
||||||
argv[i] = (char*)(*env)->GetStringUTFChars(env, object, &isCopy);
|
argv[i] = (*env)->GetStringUTFChars(env, object, &isCopy);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*printf("C: ");
|
/*printf("C: ");
|
||||||
@@ -1827,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(¶meters);
|
opj_set_default_encoder_parameters(¶meters);
|
||||||
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, ¶meters,&img_fol, indexfilename) == 1) {
|
j = parse_cmdline_encoder(argc, (char *const*)argv, ¶meters,&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(¶meters);
|
cinema_parameters(¶meters);
|
||||||
@@ -1857,10 +1887,16 @@ JNIEXPORT jlong JNICALL Java_org_openJpeg_OpenJPEGJavaEncoder_internalEncodeImag
|
|||||||
const char *version = opj_version();
|
const char *version = opj_version();
|
||||||
/* UniPG>> */
|
/* UniPG>> */
|
||||||
#ifdef USE_JPWL
|
#ifdef USE_JPWL
|
||||||
parameters.cp_comment = (char*)opj_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*)opj_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 */
|
||||||
@@ -1877,10 +1913,10 @@ JNIEXPORT jlong JNICALL Java_org_openJpeg_OpenJPEGJavaEncoder_internalEncodeImag
|
|||||||
fprintf(stderr,"\n");
|
fprintf(stderr,"\n");
|
||||||
|
|
||||||
image = loadImage(¶meters, env, obj, cls);
|
image = loadImage(¶meters, 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 */
|
||||||
@@ -1914,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);
|
||||||
|
|
||||||
@@ -1926,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);
|
||||||
@@ -1934,21 +1971,21 @@ JNIEXPORT jlong JNICALL Java_org_openJpeg_OpenJPEGJavaEncoder_internalEncodeImag
|
|||||||
memcpy(jbBody, compressed_index, compressed_index_size);
|
memcpy(jbBody, compressed_index, compressed_index_size);
|
||||||
(*env)->ReleasePrimitiveArrayCritical(env, jba, jbBody, 0);
|
(*env)->ReleasePrimitiveArrayCritical(env, jba, jbBody, 0);
|
||||||
(*env)->SetObjectField(env, obj, fid, jba);
|
(*env)->SetObjectField(env, obj, fid, jba);
|
||||||
opj_free(compressed_index);
|
free(compressed_index);
|
||||||
|
|
||||||
/* write the generated codestream to disk ? */
|
/* write the generated codestream to disk ? */
|
||||||
if (parameters.outfile[0]!='\0') {
|
if (parameters.outfile[0]!='\0') {
|
||||||
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);
|
||||||
@@ -1967,8 +2004,13 @@ JNIEXPORT jlong JNICALL Java_org_openJpeg_OpenJPEGJavaEncoder_internalEncodeImag
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* free user parameters structure */
|
/* free user parameters structure */
|
||||||
if(parameters.cp_comment) opj_free(parameters.cp_comment);
|
if(parameters.cp_comment) free(parameters.cp_comment);
|
||||||
if(parameters.cp_matrice) opj_free(parameters.cp_matrice);
|
if(parameters.cp_matrice) free(parameters.cp_matrice);
|
||||||
|
|
||||||
return codestream_length;
|
retval = codestream_length;
|
||||||
|
|
||||||
|
fin:
|
||||||
|
free(argv);
|
||||||
|
|
||||||
|
return retval;
|
||||||
}
|
}
|
||||||
@@ -1,10 +1,9 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
|
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
|
||||||
* Copyright (c) 2002-2014, Professor Benoit Macq
|
* Copyright (c) 2002-2007, Professor Benoit Macq
|
||||||
* Copyright (c) 2001-2003, David Janssens
|
* Copyright (c) 2001-2003, David Janssens
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
* Copyright (c) 2002-2003, Yannick Verschueren
|
||||||
* Copyright (c) 2003-2007, Francois-Olivier Devaux
|
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
|
||||||
* Copyright (c) 2003-2014, Antonin Descampe
|
|
||||||
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
||||||
* Copyright (c) 2006-2007, Parvatha Elangovan
|
* Copyright (c) 2006-2007, Parvatha Elangovan
|
||||||
* Copyright (c) 2007, Patrick Piscaglia (Telemis)
|
* Copyright (c) 2007, Patrick Piscaglia (Telemis)
|
||||||
@@ -38,7 +37,6 @@
|
|||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
#include "openjpeg.h"
|
#include "openjpeg.h"
|
||||||
#include "opj_includes.h"
|
|
||||||
#include "opj_getopt.h"
|
#include "opj_getopt.h"
|
||||||
#include "convert.h"
|
#include "convert.h"
|
||||||
#include "dirent.h"
|
#include "dirent.h"
|
||||||
@@ -205,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[]={
|
||||||
@@ -340,7 +338,10 @@ 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*)opj_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;
|
||||||
}
|
}
|
||||||
@@ -428,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() */
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
|
|
||||||
@@ -490,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 */
|
||||||
@@ -510,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;
|
||||||
@@ -523,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));
|
||||||
@@ -532,24 +535,30 @@ 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 = opj_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);
|
||||||
argv[i] = (char*)(*env)->GetStringUTFChars(env, object, &isCopy);
|
argv[i] = (*env)->GetStringUTFChars(env, object, &isCopy);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*printf("C: decoder params = ");
|
/*printf("C: decoder params = ");
|
||||||
@@ -563,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, ¶meters,&img_fol) == 1) {
|
j = parse_cmdline_decoder(argc, (char * const*)argv, ¶meters,&img_fol);
|
||||||
/* 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,
|
||||||
return -1;
|
(*env)->GetObjectArrayElement(env, javaParameters, i-1), argv[i]);
|
||||||
}
|
|
||||||
/* Release the Java arguments array*/
|
if(j == 1) goto fin; /* failure */
|
||||||
for (i=1; i<argc; i++)
|
|
||||||
(*env)->ReleaseStringUTFChars(env, (*env)->GetObjectArrayElement(env, javaParameters, i-1), argv[i]);
|
|
||||||
|
|
||||||
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);
|
||||||
|
|
||||||
@@ -589,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 *) opj_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);
|
||||||
@@ -638,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 */
|
||||||
@@ -668,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 */
|
||||||
@@ -699,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 */
|
||||||
@@ -714,7 +725,7 @@ JNIEXPORT jint JNICALL Java_org_openJpeg_OpenJPEGJavaDecoder_internalDecodeJ2Kto
|
|||||||
|
|
||||||
/* free the memory containing the code-stream */
|
/* free the memory containing the code-stream */
|
||||||
if (parameters.infile && parameters.infile[0]!='\0') {
|
if (parameters.infile && parameters.infile[0]!='\0') {
|
||||||
opj_free(src);
|
free(src);
|
||||||
} else {
|
} else {
|
||||||
(*env)->ReleaseByteArrayElements(env, jba, jbBody, 0);
|
(*env)->ReleaseByteArrayElements(env, jba, jbBody, 0);
|
||||||
}
|
}
|
||||||
@@ -754,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;
|
||||||
@@ -777,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]);
|
||||||
@@ -806,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);
|
||||||
@@ -823,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
|
||||||
@@ -851,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
|
||||||
@@ -879,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 */
|
||||||
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
|
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
|
||||||
* Copyright (c) 2002-2014, Professor Benoit Macq
|
* Copyright (c) 2002-2007, Professor Benoit Macq
|
||||||
* Copyright (c) 2002-2007, Patrick Piscaglia, Telemis s.a.
|
* Copyright (c) 2002-2007, Patrick Piscaglia, Telemis s.a.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
|
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
|
||||||
* Copyright (c) 2002-2014, Professor Benoit Macq
|
* Copyright (c) 2002-2007, Professor Benoit Macq
|
||||||
* Copyright (c) 2002-2007, Patrick Piscaglia, Telemis s.a.
|
* Copyright (c) 2002-2007, Patrick Piscaglia, Telemis s.a.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
19
applications/Makefile.am
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
MAINTAINERCLEANFILES = Makefile.in
|
||||||
|
|
||||||
|
SUBDIRS = codec
|
||||||
|
|
||||||
|
if WANT_MJ2
|
||||||
|
SUBDIRS += mj2
|
||||||
|
endif
|
||||||
|
|
||||||
|
if WANT_JPIP_CODE
|
||||||
|
SUBDIRS += jpip
|
||||||
|
endif
|
||||||
|
|
||||||
|
EXTRA_DIST = \
|
||||||
|
CMakeLists.txt \
|
||||||
|
common/color.c \
|
||||||
|
common/color.h \
|
||||||
|
common/format_defs.h \
|
||||||
|
common/opj_getopt.c \
|
||||||
|
common/opj_getopt.h
|
||||||
@@ -1,21 +1,17 @@
|
|||||||
project(viewer CXX)
|
PROJECT(viewer CXX)
|
||||||
|
|
||||||
find_package(wxWidgets REQUIRED)
|
FIND_PACKAGE(wxWidgets REQUIRED)
|
||||||
include(${wxWidgets_USE_FILE})
|
INCLUDE(${wxWidgets_USE_FILE})
|
||||||
|
|
||||||
include_directories(
|
INCLUDE_DIRECTORIES(
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../..
|
${CMAKE_CURRENT_SOURCE_DIR}/../..
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/..
|
${CMAKE_CURRENT_SOURCE_DIR}/..
|
||||||
${OPENJPEG_SOURCE_DIR}/src/lib
|
|
||||||
${OPENJPEG_SOURCE_DIR}/src/bin
|
|
||||||
${OPENJPEG_SOURCE_DIR}/src/lib/openjp2
|
|
||||||
${OPENJPEG_BINARY_DIR}/src/lib/openjp2 # opj_config.h and opj_config_private.h
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# original flags:
|
# original flags:
|
||||||
# -DUSE_JPWL -DwxUSE_LIBOPENJPEG -DwxUSE_GUI=1 -DOPJ_STATIC -DOPJ_HTMLABOUT -DOPJ_INICONFIG -DUSE_JPSEC -DOPJ_MANYFORMATS
|
# -DUSE_JPWL -DwxUSE_LIBOPENJPEG -DwxUSE_GUI=1 -DOPJ_STATIC -DOPJ_HTMLABOUT -DOPJ_INICONFIG -DUSE_JPSEC -DOPJ_MANYFORMATS
|
||||||
add_definitions(-DwxUSE_LIBOPENJPEG -DOPENJPEG_VERSION="1.5.0")
|
ADD_DEFINITIONS(-DwxUSE_LIBOPENJPEG -DOPENJPEG_VERSION="1.5.0")
|
||||||
set(OPJV_SRCS
|
SET(OPJV_SRCS
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/source/imagjpeg2000.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/source/imagjpeg2000.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/source/wxj2kparser.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/source/wxj2kparser.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/source/OPJViewer.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/source/OPJViewer.cpp
|
||||||
@@ -23,7 +19,7 @@ set(OPJV_SRCS
|
|||||||
${CMAKE_CURRENT_SOURCE_DIR}/source/OPJDialogs.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/source/OPJDialogs.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/source/OPJThreads.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/source/OPJThreads.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/source/OPJAbout.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/source/OPJAbout.cpp
|
||||||
${OPENJPEG_SOURCE_DIR}/src/bin/jp2/index.c
|
${CMAKE_CURRENT_SOURCE_DIR}/../codec/index.c
|
||||||
)
|
)
|
||||||
add_executable(opjviewer ${OPJV_SRCS})
|
ADD_EXECUTABLE(opjviewer ${OPJV_SRCS})
|
||||||
target_link_libraries(opjviewer ${wxWidgets_LIBRARIES} openjpeg)
|
TARGET_LINK_LIBRARIES(opjviewer ${wxWidgets_LIBRARIES} openjpeg)
|
||||||
|
Before Width: | Height: | Size: 6.3 KiB After Width: | Height: | Size: 6.3 KiB |
@@ -1,9 +1,4 @@
|
|||||||
/*
|
/*
|
||||||
* 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) 2007, Digital Signal Processing Laboratory, Universita' degli studi di Perugia (UPG), Italy
|
* Copyright (c) 2007, Digital Signal Processing Laboratory, Universita' degli studi di Perugia (UPG), Italy
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
@@ -1,9 +1,4 @@
|
|||||||
/*
|
/*
|
||||||
* 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) 2007, Digital Signal Processing Laboratory, Universita' degli studi di Perugia (UPG), Italy
|
* Copyright (c) 2007, Digital Signal Processing Laboratory, Universita' degli studi di Perugia (UPG), Italy
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -1,9 +1,4 @@
|
|||||||
/*
|
/*
|
||||||
* 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) 2007, Digital Signal Processing Laboratory, Universita' degli studi di Perugia (UPG), Italy
|
* Copyright (c) 2007, Digital Signal Processing Laboratory, Universita' degli studi di Perugia (UPG), Italy
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -1,9 +1,4 @@
|
|||||||
/*
|
/*
|
||||||
* 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) 2007, Digital Signal Processing Laboratory, Universita' degli studi di Perugia (UPG), Italy
|
* Copyright (c) 2007, Digital Signal Processing Laboratory, Universita' degli studi di Perugia (UPG), Italy
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -1,10 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* The copyright in this software is being made available under the 2-clauses
|
* Copyright (c) 2007, Digital Signal Processing Laboratory, Università degli studi di Perugia (UPG), Italy
|
||||||
* 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) 2007, Digital Signal Processing Laboratory, Universita degli studi di Perugia (UPG), Italy
|
|
||||||
* 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
|
||||||
@@ -106,7 +101,7 @@
|
|||||||
#include "wx/toolbar.h"
|
#include "wx/toolbar.h"
|
||||||
#include "wx/artprov.h"
|
#include "wx/artprov.h"
|
||||||
|
|
||||||
#include "openjp2/openjpeg.h"
|
#include "libopenjpeg/openjpeg.h"
|
||||||
|
|
||||||
//#include "imagj2k.h"
|
//#include "imagj2k.h"
|
||||||
//#include "imagjp2.h"
|
//#include "imagjp2.h"
|
||||||
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
@@ -1,9 +1,4 @@
|
|||||||
/*
|
/*
|
||||||
* 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) 2007, Digital Signal Processing Laboratory, Università degli studi di Perugia (UPG), Italy
|
* Copyright (c) 2007, Digital Signal Processing Laboratory, Università degli studi di Perugia (UPG), Italy
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -56,7 +51,7 @@
|
|||||||
#include "wx/module.h"
|
#include "wx/module.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "openjp2/openjpeg.h"
|
#include "libopenjpeg/openjpeg.h"
|
||||||
|
|
||||||
#include "wx/filefn.h"
|
#include "wx/filefn.h"
|
||||||
#include "wx/wfstream.h"
|
#include "wx/wfstream.h"
|
||||||
@@ -1,10 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* The copyright in this software is being made available under the 2-clauses
|
* Copyright (c) 2007, Digital Signal Processing Laboratory, Università degli studi di Perugia (UPG), Italy
|
||||||
* 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) 2007, Digital Signal Processing Laboratory, Universita degli studi di Perugia (UPG), Italy
|
|
||||||
* 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
|
||||||
@@ -49,8 +44,8 @@
|
|||||||
#if wxUSE_LIBOPENJPEG
|
#if wxUSE_LIBOPENJPEG
|
||||||
|
|
||||||
#include "wx/image.h"
|
#include "wx/image.h"
|
||||||
#include "openjp2/openjpeg.h"
|
#include "libopenjpeg/openjpeg.h"
|
||||||
#include "jp2/index.h"
|
#include "codec/index.h"
|
||||||
|
|
||||||
#define wxBITMAP_TYPE_JPEG2000 50
|
#define wxBITMAP_TYPE_JPEG2000 50
|
||||||
|
|
||||||
@@ -1,9 +1,4 @@
|
|||||||
/*
|
/*
|
||||||
* 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) 2007, Digital Signal Processing Laboratory, Università degli studi di Perugia (UPG), Italy
|
* Copyright (c) 2007, Digital Signal Processing Laboratory, Università degli studi di Perugia (UPG), Italy
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -1,10 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* The copyright in this software is being made available under the 2-clauses
|
* Copyright (c) 2007, Digital Signal Processing Laboratory, Università degli studi di Perugia (UPG), Italy
|
||||||
* 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) 2007, Digital Signal Processing Laboratory, Universita degli studi di Perugia (UPG), Italy
|
|
||||||
* 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
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
|
Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
|
||||||
Copyright (c) 2002-2014, Professor Benoit Macq
|
Copyright (c) 2002-2007, Professor Benoit Macq
|
||||||
Copyright (c) 2001-2003, David Janssens
|
Copyright (c) 2001-2003, David Janssens
|
||||||
Copyright (c) 2002-2003, Yannick Verschueren
|
Copyright (c) 2002-2003, Yannick Verschueren
|
||||||
Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
|
Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
|
||||||
@@ -1,9 +1,4 @@
|
|||||||
/*
|
/*
|
||||||
* 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) 2007, Digital Signal Processing Laboratory, Università degli studi di Perugia (UPG), Italy
|
* Copyright (c) 2007, Digital Signal Processing Laboratory, Università degli studi di Perugia (UPG), Italy
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -1,9 +1,4 @@
|
|||||||
/*
|
/*
|
||||||
* 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) 2007, Digital Signal Processing Laboratory, Università degli studi di Perugia (UPG), Italy
|
* Copyright (c) 2007, Digital Signal Processing Laboratory, Università degli studi di Perugia (UPG), Italy
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
120
applications/codec/CMakeLists.txt
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
# Build the demo app, small examples
|
||||||
|
|
||||||
|
# First thing define the common source:
|
||||||
|
SET(common_SRCS
|
||||||
|
convert.c
|
||||||
|
converttif.c
|
||||||
|
convertbmp.c
|
||||||
|
convertpng.c
|
||||||
|
index.c
|
||||||
|
${OPENJPEG_SOURCE_DIR}/applications/common/color.c
|
||||||
|
)
|
||||||
|
if(NOT USE_SYSTEM_GETOPT)
|
||||||
|
list(APPEND common_SRCS
|
||||||
|
${OPENJPEG_SOURCE_DIR}/applications/common/opj_getopt.c
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Headers file are located here:
|
||||||
|
INCLUDE_DIRECTORIES(
|
||||||
|
${OPENJPEG_SOURCE_DIR}/libopenjpeg
|
||||||
|
${LCMS_INCLUDE_DIRNAME}
|
||||||
|
${OPENJPEG_SOURCE_DIR}/applications/common
|
||||||
|
${Z_INCLUDE_DIRNAME}
|
||||||
|
${PNG_INCLUDE_DIRNAME}
|
||||||
|
${TIFF_INCLUDE_DIRNAME}
|
||||||
|
)
|
||||||
|
|
||||||
|
IF(WIN32)
|
||||||
|
IF(BUILD_SHARED_LIBS)
|
||||||
|
ADD_DEFINITIONS(-DOPJ_EXPORTS)
|
||||||
|
ELSE(BUILD_SHARED_LIBS)
|
||||||
|
ADD_DEFINITIONS(-DOPJ_STATIC)
|
||||||
|
ENDIF(BUILD_SHARED_LIBS)
|
||||||
|
ENDIF(WIN32)
|
||||||
|
|
||||||
|
# Loop over all executables:
|
||||||
|
FOREACH(exe j2k_to_image image_to_j2k j2k_dump)
|
||||||
|
ADD_EXECUTABLE(${exe} ${exe}.c ${common_SRCS})
|
||||||
|
TARGET_LINK_LIBRARIES(${exe} ${OPENJPEG_LIBRARY_NAME}
|
||||||
|
${PNG_LIBNAME} ${TIFF_LIBNAME} ${LCMS_LIBNAME}
|
||||||
|
)
|
||||||
|
# To support universal exe:
|
||||||
|
IF(ZLIB_FOUND AND APPLE)
|
||||||
|
TARGET_LINK_LIBRARIES(${exe} z)
|
||||||
|
ELSe(ZLIB_FOUND AND APPLE)
|
||||||
|
TARGET_LINK_LIBRARIES(${exe} ${Z_LIBNAME})
|
||||||
|
ENDIF(ZLIB_FOUND AND APPLE)
|
||||||
|
|
||||||
|
# On unix you need to link to the math library:
|
||||||
|
IF(UNIX)
|
||||||
|
TARGET_LINK_LIBRARIES(${exe} m)
|
||||||
|
ENDIF(UNIX)
|
||||||
|
# Install exe
|
||||||
|
INSTALL(TARGETS ${exe}
|
||||||
|
EXPORT OpenJPEGTargets
|
||||||
|
DESTINATION ${OPENJPEG_INSTALL_BIN_DIR} COMPONENT Applications
|
||||||
|
)
|
||||||
|
ENDFOREACH(exe)
|
||||||
|
|
||||||
|
# Install man pages
|
||||||
|
INSTALL(
|
||||||
|
FILES ${OPENJPEG_SOURCE_DIR}/doc/man/man1/image_to_j2k.1
|
||||||
|
${OPENJPEG_SOURCE_DIR}/doc/man/man1/j2k_dump.1
|
||||||
|
${OPENJPEG_SOURCE_DIR}/doc/man/man1/j2k_to_image.1
|
||||||
|
DESTINATION ${OPENJPEG_INSTALL_MAN_DIR}/man1)
|
||||||
|
#
|
||||||
|
|
||||||
|
IF(BUILD_JPWL)
|
||||||
|
ADD_EXECUTABLE(JPWL_j2k_to_image
|
||||||
|
j2k_to_image.c
|
||||||
|
${common_SRCS}
|
||||||
|
)
|
||||||
|
|
||||||
|
SET_PROPERTY(
|
||||||
|
TARGET JPWL_j2k_to_image
|
||||||
|
APPEND PROPERTY COMPILE_DEFINITIONS USE_JPWL
|
||||||
|
)
|
||||||
|
|
||||||
|
TARGET_LINK_LIBRARIES(JPWL_j2k_to_image ${OPENJPEG_LIBRARY_NAME}_JPWL
|
||||||
|
${LCMS_LIBNAME} ${PNG_LIBNAME} ${TIFF_LIBNAME})
|
||||||
|
|
||||||
|
# To support universal exe:
|
||||||
|
IF(ZLIB_FOUND AND APPLE)
|
||||||
|
TARGET_LINK_LIBRARIES(JPWL_j2k_to_image z)
|
||||||
|
ELSe(ZLIB_FOUND AND APPLE)
|
||||||
|
TARGET_LINK_LIBRARIES(JPWL_j2k_to_image ${Z_LIBNAME})
|
||||||
|
ENDIF(ZLIB_FOUND AND APPLE)
|
||||||
|
|
||||||
|
IF(UNIX)
|
||||||
|
TARGET_LINK_LIBRARIES(JPWL_j2k_to_image m)
|
||||||
|
ENDIF(UNIX)
|
||||||
|
|
||||||
|
ADD_EXECUTABLE(JPWL_image_to_j2k
|
||||||
|
image_to_j2k.c
|
||||||
|
${common_SRCS}
|
||||||
|
)
|
||||||
|
|
||||||
|
SET_PROPERTY(
|
||||||
|
TARGET JPWL_image_to_j2k
|
||||||
|
APPEND PROPERTY COMPILE_DEFINITIONS USE_JPWL
|
||||||
|
)
|
||||||
|
|
||||||
|
TARGET_LINK_LIBRARIES(JPWL_image_to_j2k ${OPENJPEG_LIBRARY_NAME}_JPWL
|
||||||
|
${LCMS_LIBNAME} ${PNG_LIBNAME} ${TIFF_LIBNAME})
|
||||||
|
|
||||||
|
# To support universal exe:
|
||||||
|
IF(ZLIB_FOUND AND APPLE)
|
||||||
|
TARGET_LINK_LIBRARIES(JPWL_image_to_j2k z)
|
||||||
|
ELSe(ZLIB_FOUND AND APPLE)
|
||||||
|
TARGET_LINK_LIBRARIES(JPWL_image_to_j2k ${Z_LIBNAME})
|
||||||
|
ENDIF(ZLIB_FOUND AND APPLE)
|
||||||
|
|
||||||
|
IF(UNIX)
|
||||||
|
TARGET_LINK_LIBRARIES(JPWL_image_to_j2k m)
|
||||||
|
ENDIF(UNIX)
|
||||||
|
|
||||||
|
INSTALL(TARGETS JPWL_image_to_j2k JPWL_j2k_to_image
|
||||||
|
DESTINATION ${OPENJPEG_INSTALL_BIN_DIR} COMPONENT Applications
|
||||||
|
)
|
||||||
|
ENDIF(BUILD_JPWL)
|
||||||
118
applications/codec/Makefile.am
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
MAINTAINERCLEANFILES = Makefile.in
|
||||||
|
|
||||||
|
bin_PROGRAMS = j2k_to_image image_to_j2k j2k_dump
|
||||||
|
|
||||||
|
if WANT_JPWL
|
||||||
|
bin_PROGRAMS += JPWL_j2k_to_image JPWL_image_to_j2k
|
||||||
|
endif
|
||||||
|
|
||||||
|
j2k_to_image_CPPFLAGS = \
|
||||||
|
-I. \
|
||||||
|
-I$(top_srcdir)/applications/codec \
|
||||||
|
-I$(top_builddir)/applications/codec \
|
||||||
|
-I$(top_srcdir)/applications/common \
|
||||||
|
-I$(top_builddir)/applications/common \
|
||||||
|
-I$(top_srcdir)/libopenjpeg \
|
||||||
|
-I$(top_builddir)/libopenjpeg \
|
||||||
|
@PNG_CFLAGS@ \
|
||||||
|
@TIFF_CFLAGS@ \
|
||||||
|
@LCMS1_CFLAGS@ \
|
||||||
|
@LCMS2_CFLAGS@
|
||||||
|
j2k_to_image_CFLAGS =
|
||||||
|
j2k_to_image_LDADD = $(top_builddir)/libopenjpeg/libopenjpeg.la @LCMS1_LIBS@ @LCMS2_LIBS@ @TIFF_LIBS@ @PNG_LIBS@ -lm
|
||||||
|
j2k_to_image_SOURCES = \
|
||||||
|
../common/color.c \
|
||||||
|
../common/opj_getopt.c \
|
||||||
|
convert.c \
|
||||||
|
index.c \
|
||||||
|
j2k_to_image.c \
|
||||||
|
../common/color.h
|
||||||
|
|
||||||
|
image_to_j2k_CPPFLAGS = \
|
||||||
|
-I. \
|
||||||
|
-I$(top_srcdir)/applications/codec \
|
||||||
|
-I$(top_builddir)/applications/codec \
|
||||||
|
-I$(top_srcdir)/applications/common \
|
||||||
|
-I$(top_builddir)/applications/common \
|
||||||
|
-I$(top_srcdir)/libopenjpeg \
|
||||||
|
-I$(top_builddir)/libopenjpeg \
|
||||||
|
@PNG_CFLAGS@ \
|
||||||
|
@TIFF_CFLAGS@
|
||||||
|
image_to_j2k_CFLAGS =
|
||||||
|
image_to_j2k_LDADD = $(top_builddir)/libopenjpeg/libopenjpeg.la @TIFF_LIBS@ @PNG_LIBS@ -lm
|
||||||
|
image_to_j2k_SOURCES = \
|
||||||
|
../common/opj_getopt.c \
|
||||||
|
convert.c \
|
||||||
|
index.c \
|
||||||
|
image_to_j2k.c \
|
||||||
|
convert.h \
|
||||||
|
../common/format_defs.h \
|
||||||
|
index.h
|
||||||
|
|
||||||
|
j2k_dump_CPPFLAGS = \
|
||||||
|
-I. \
|
||||||
|
-I$(top_srcdir)/applications/codec \
|
||||||
|
-I$(top_builddir)/applications/codec \
|
||||||
|
-I$(top_srcdir)/applications/common \
|
||||||
|
-I$(top_builddir)/applications/common \
|
||||||
|
-I$(top_srcdir)/libopenjpeg \
|
||||||
|
-I$(top_builddir)/libopenjpeg
|
||||||
|
j2k_dump_CFLAGS =
|
||||||
|
j2k_dump_LDADD = $(top_builddir)/libopenjpeg/libopenjpeg.la -lm
|
||||||
|
j2k_dump_SOURCES = \
|
||||||
|
../common/opj_getopt.c \
|
||||||
|
index.c \
|
||||||
|
j2k_dump.c \
|
||||||
|
../common/opj_getopt.h \
|
||||||
|
index.h
|
||||||
|
|
||||||
|
JPWL_j2k_to_image_CPPFLAGS = \
|
||||||
|
-I. \
|
||||||
|
-I$(top_srcdir)/applications/common \
|
||||||
|
-I$(top_builddir)/applications/common \
|
||||||
|
-I$(top_srcdir)/libopenjpeg \
|
||||||
|
-I$(top_builddir)/libopenjpeg \
|
||||||
|
-DUSE_JPWL \
|
||||||
|
@TIFF_CFLAGS@ \
|
||||||
|
@PNG_CFLAGS@ \
|
||||||
|
@LCMS1_CFLAGS@ \
|
||||||
|
@LCMS2_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@ -lm
|
||||||
|
JPWL_j2k_to_image_SOURCES = \
|
||||||
|
../common/color.c \
|
||||||
|
../common/opj_getopt.c \
|
||||||
|
index.c \
|
||||||
|
convert.c \
|
||||||
|
j2k_to_image.c
|
||||||
|
|
||||||
|
JPWL_image_to_j2k_CPPFLAGS = \
|
||||||
|
-I. \
|
||||||
|
-I$(top_srcdir)/applications/common \
|
||||||
|
-I$(top_builddir)/applications/common \
|
||||||
|
-I$(top_srcdir)/libopenjpeg \
|
||||||
|
-I$(top_builddir)/libopenjpeg \
|
||||||
|
-DUSE_JPWL \
|
||||||
|
@TIFF_CFLAGS@ \
|
||||||
|
@PNG_CFLAGS@
|
||||||
|
JPWL_image_to_j2k_CFLAGS =
|
||||||
|
JPWL_image_to_j2k_LDADD = $(top_builddir)/libopenjpeg/jpwl/libopenjpeg_JPWL.la @TIFF_LIBS@ @PNG_LIBS@ -lm
|
||||||
|
|
||||||
|
JPWL_image_to_j2k_SOURCES = \
|
||||||
|
../common/opj_getopt.c \
|
||||||
|
index.c \
|
||||||
|
convert.c \
|
||||||
|
image_to_j2k.c
|
||||||
|
|
||||||
|
EXTRA_DIST = \
|
||||||
|
CMakeLists.txt \
|
||||||
|
windirent.h
|
||||||
|
|
||||||
|
install-data-hook:
|
||||||
|
@echo -e " (B)\t$(bindir)/j2k_to_image$(EXEEXT)" >> $(top_builddir)/report.txt
|
||||||
|
@echo -e " (B)\t$(bindir)/image_to_j2k$(EXEEXT)" >> $(top_builddir)/report.txt
|
||||||
|
@echo -e " (B)\t$(bindir)/j2k_dump$(EXEEXT)" >> $(top_builddir)/report.txt
|
||||||
|
if WANT_JPWL
|
||||||
|
@echo -e " (B)\t$(bindir)/JPWL_j2k_to_image$(EXEEXT)" >> $(top_builddir)/report.txt
|
||||||
|
@echo -e " (B)\t$(bindir)/JPWL_image_to_j2k$(EXEEXT)" >> $(top_builddir)/report.txt
|
||||||
|
endif
|
||||||
8
applications/codec/README
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
Simple codec compilation
|
||||||
|
------------------------
|
||||||
|
Once you've built the library, you might want to test it with a basic codec. To do this, go to the codec directory and either use the provided Makefile or use one of the following commands to build an encoder and decoder respectively:
|
||||||
|
|
||||||
|
gcc index.c convert.c image_to_j2k.c -o image_to_j2k -lopenjpeg -I ../libopenjpeg/ -lm -ltiff
|
||||||
|
gcc index.c convert.c j2k_to_image.c -o j2k_to_image -lopenjpeg -I ../libopenjpeg/ -lm -ltiff
|
||||||
|
|
||||||
|
You should add '-L..' to those lines if you did not use the 'install' target when building the library.
|
||||||
2160
applications/codec/convert.c
Normal file
@@ -1,15 +1,9 @@
|
|||||||
/*
|
/*
|
||||||
* The copyright in this software is being made available under the 2-clauses
|
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
|
||||||
* BSD License, included below. This software may be subject to other third
|
* Copyright (c) 2002-2007, Professor Benoit Macq
|
||||||
* 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) 2001-2003, David Janssens
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
* Copyright (c) 2002-2003, Yannick Verschueren
|
||||||
* Copyright (c) 2003-2007, Francois-Olivier Devaux
|
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
|
||||||
* Copyright (c) 2003-2014, Antonin Descampe
|
|
||||||
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -53,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);
|
||||||
995
applications/codec/convertbmp.c
Normal 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;
|
||||||
|
}
|
||||||
496
applications/codec/convertpng.c
Normal 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() */
|
||||||
633
applications/codec/converttif.c
Normal 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() */
|
||||||
|
|
||||||
@@ -1,15 +1,9 @@
|
|||||||
/*
|
/*
|
||||||
* The copyright in this software is being made available under the 2-clauses
|
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
|
||||||
* BSD License, included below. This software may be subject to other third
|
* Copyright (c) 2002-2007, Professor Benoit Macq
|
||||||
* 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) 2001-2003, David Janssens
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
* Copyright (c) 2002-2003, Yannick Verschueren
|
||||||
* Copyright (c) 2003-2007, Francois-Olivier Devaux
|
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
|
||||||
* Copyright (c) 2003-2014, Antonin Descampe
|
|
||||||
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
||||||
* Copyright (c) 2006-2007, Parvatha Elangovan
|
* Copyright (c) 2006-2007, Parvatha Elangovan
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
@@ -49,13 +43,13 @@
|
|||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#define strcasecmp _stricmp
|
|
||||||
#define strncasecmp _strnicmp
|
|
||||||
#else
|
#else
|
||||||
#include <strings.h>
|
#include <strings.h>
|
||||||
|
#define _stricmp strcasecmp
|
||||||
|
#define _strnicmp strncasecmp
|
||||||
#endif /* _WIN32 */
|
#endif /* _WIN32 */
|
||||||
|
|
||||||
#include "opj_apps_config.h"
|
#include "opj_config.h"
|
||||||
#include "openjpeg.h"
|
#include "openjpeg.h"
|
||||||
#include "opj_getopt.h"
|
#include "opj_getopt.h"
|
||||||
#include "convert.h"
|
#include "convert.h"
|
||||||
@@ -89,7 +83,7 @@ typedef struct img_folder{
|
|||||||
}img_fol_t;
|
}img_fol_t;
|
||||||
|
|
||||||
static void encode_help_display(void) {
|
static void encode_help_display(void) {
|
||||||
fprintf(stdout,"HELP for opj_jpwl_compress\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");
|
||||||
|
|
||||||
/* UniPG>> */
|
/* UniPG>> */
|
||||||
@@ -327,7 +321,7 @@ static void encode_help_display(void) {
|
|||||||
fprintf(stdout,"TotalDisto\n\n");
|
fprintf(stdout,"TotalDisto\n\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static OPJ_PROG_ORDER give_progression(const 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;
|
||||||
}
|
}
|
||||||
@@ -347,10 +341,10 @@ static OPJ_PROG_ORDER give_progression(const char progression[4]) {
|
|||||||
return PROG_UNKNOWN;
|
return PROG_UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int get_num_images(char *imgdirpath){
|
static int get_num_images(char *imgdirpath){
|
||||||
DIR *dir;
|
DIR *dir;
|
||||||
struct dirent* content;
|
struct dirent* content;
|
||||||
unsigned int num_images = 0;
|
int num_images = 0;
|
||||||
|
|
||||||
/*Reading the input images from given input directory*/
|
/*Reading the input images from given input directory*/
|
||||||
|
|
||||||
@@ -366,6 +360,7 @@ static unsigned int get_num_images(char *imgdirpath){
|
|||||||
continue;
|
continue;
|
||||||
num_images++;
|
num_images++;
|
||||||
}
|
}
|
||||||
|
closedir(dir);
|
||||||
return num_images;
|
return num_images;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -391,6 +386,7 @@ static 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -407,7 +403,7 @@ static int get_file_format(char *filename) {
|
|||||||
return -1;
|
return -1;
|
||||||
ext++;
|
ext++;
|
||||||
for(i = 0; i < sizeof(format)/sizeof(*format); i++) {
|
for(i = 0; i < sizeof(format)/sizeof(*format); i++) {
|
||||||
if(strcasecmp(ext, extension[i]) == 0) {
|
if(_strnicmp(ext, extension[i], 3) == 0) {
|
||||||
return format[i];
|
return format[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -416,7 +412,6 @@ static int get_file_format(char *filename) {
|
|||||||
|
|
||||||
static 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;
|
||||||
}
|
}
|
||||||
@@ -595,7 +590,10 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param
|
|||||||
{"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 */
|
||||||
@@ -610,7 +608,11 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param
|
|||||||
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,15 +1387,15 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param
|
|||||||
|
|
||||||
case 'J': /* jpip on */
|
case 'J': /* jpip on */
|
||||||
{
|
{
|
||||||
/*parameters->jpip_on = OPJ_TRUE;*/
|
parameters->jpip_on = OPJ_TRUE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
/* ------------------------------------------------------ */
|
/* ------------------------------------------------------ */
|
||||||
|
|
||||||
|
|
||||||
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);
|
||||||
|
|
||||||
@@ -1633,7 +1635,7 @@ int main(int argc, char **argv) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#ifdef OPJ_HAVE_LIBTIFF
|
#ifdef HAVE_LIBTIFF
|
||||||
case TIF_DFMT:
|
case TIF_DFMT:
|
||||||
image = tiftoimage(parameters.infile, ¶meters);
|
image = tiftoimage(parameters.infile, ¶meters);
|
||||||
if (!image) {
|
if (!image) {
|
||||||
@@ -1641,7 +1643,7 @@ int main(int argc, char **argv) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#endif /* OPJ_HAVE_LIBTIFF */
|
#endif /* HAVE_LIBTIFF */
|
||||||
case RAW_DFMT:
|
case RAW_DFMT:
|
||||||
image = rawtoimage(parameters.infile, ¶meters, &raw_cp);
|
image = rawtoimage(parameters.infile, ¶meters, &raw_cp);
|
||||||
if (!image) {
|
if (!image) {
|
||||||
@@ -1657,7 +1659,7 @@ int main(int argc, char **argv) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#ifdef OPJ_HAVE_LIBPNG
|
#ifdef HAVE_LIBPNG
|
||||||
case PNG_DFMT:
|
case PNG_DFMT:
|
||||||
image = pngtoimage(parameters.infile, ¶meters);
|
image = pngtoimage(parameters.infile, ¶meters);
|
||||||
if (!image) {
|
if (!image) {
|
||||||
@@ -1665,10 +1667,10 @@ int main(int argc, char **argv) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#endif /* OPJ_HAVE_LIBPNG */
|
#endif /* HAVE_LIBPNG */
|
||||||
}
|
}
|
||||||
/* Can happen if input file is TIFF or PNG
|
/* Can happen if input file is TIFF or PNG
|
||||||
* and OPJ_HAVE_LIBTIF or OPJ_HAVE_LIBPNG is undefined
|
* and HAVE_LIBTIF or HAVE_LIBPNG is undefined
|
||||||
*/
|
*/
|
||||||
if( !image)
|
if( !image)
|
||||||
{
|
{
|
||||||
@@ -1766,7 +1768,7 @@ int main(int argc, char **argv) {
|
|||||||
cio = opj_cio_open((opj_common_ptr)cinfo, NULL, 0);
|
cio = opj_cio_open((opj_common_ptr)cinfo, NULL, 0);
|
||||||
|
|
||||||
/* encode the image */
|
/* encode the image */
|
||||||
if (*indexfilename /*|| parameters.jpip_on*/) /* If need to extract codestream information*/
|
if (*indexfilename || parameters.jpip_on) /* If need to extract codestream information*/
|
||||||
bSuccess = opj_encode_with_info(cinfo, cio, image, &cstr_info);
|
bSuccess = opj_encode_with_info(cinfo, cio, image, &cstr_info);
|
||||||
else
|
else
|
||||||
bSuccess = opj_encode(cinfo, cio, image, NULL);
|
bSuccess = opj_encode(cinfo, cio, image, NULL);
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
|
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
|
||||||
* Copyright (c) 2002-2014, Professor Benoit Macq
|
* Copyright (c) 2002-2007, Professor Benoit Macq
|
||||||
* Copyright (c) 2003-2007, Francois-Olivier Devaux
|
* Copyright (c) 2003-2007, Francois-Olivier Devaux
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
|
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
|
||||||
* Copyright (c) 2002-2014, Professor Benoit Macq
|
* Copyright (c) 2002-2007, Professor Benoit Macq
|
||||||
* Copyright (c) 2003-2007, Francois-Olivier Devaux
|
* Copyright (c) 2003-2007, Francois-Olivier Devaux
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -1,17 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* The copyright in this software is being made available under the 2-clauses
|
* Copyright (c) 2010, Mathieu Malaterre, GDCM
|
||||||
* 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.
|
* 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
|
||||||
@@ -55,20 +43,14 @@
|
|||||||
#define _strnicmp strncasecmp
|
#define _strnicmp strncasecmp
|
||||||
#endif /* _WIN32 */
|
#endif /* _WIN32 */
|
||||||
|
|
||||||
#include "opj_apps_config.h"
|
#include "opj_config.h"
|
||||||
#include "openjpeg.h"
|
#include "openjpeg.h"
|
||||||
|
#include "j2k.h"
|
||||||
|
#include "jp2.h"
|
||||||
#include "opj_getopt.h"
|
#include "opj_getopt.h"
|
||||||
#include "convert.h"
|
#include "convert.h"
|
||||||
#include "index.h"
|
#include "index.h"
|
||||||
|
|
||||||
#ifdef OPJ_HAVE_LIBLCMS2
|
|
||||||
#include <lcms2.h>
|
|
||||||
#endif
|
|
||||||
#ifdef OPJ_HAVE_LIBLCMS1
|
|
||||||
#include <lcms.h>
|
|
||||||
#endif
|
|
||||||
#include "color.h"
|
|
||||||
|
|
||||||
#include "format_defs.h"
|
#include "format_defs.h"
|
||||||
|
|
||||||
typedef struct dircnt{
|
typedef struct dircnt{
|
||||||
@@ -92,7 +74,7 @@ typedef struct img_folder{
|
|||||||
}img_fol_t;
|
}img_fol_t;
|
||||||
|
|
||||||
void decode_help_display(void) {
|
void decode_help_display(void) {
|
||||||
fprintf(stdout,"HELP for j2k_to_image\n----\n\n");
|
fprintf(stdout,"HELP for j2k_dump\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");
|
||||||
|
|
||||||
/* UniPG>> */
|
/* UniPG>> */
|
||||||
@@ -106,49 +88,20 @@ void decode_help_display(void) {
|
|||||||
fprintf(stdout,"\n");
|
fprintf(stdout,"\n");
|
||||||
fprintf(stdout," -ImgDir \n");
|
fprintf(stdout," -ImgDir \n");
|
||||||
fprintf(stdout," Image file Directory path \n");
|
fprintf(stdout," Image file Directory path \n");
|
||||||
fprintf(stdout," -OutFor \n");
|
|
||||||
fprintf(stdout," REQUIRED only if -ImgDir is used\n");
|
|
||||||
fprintf(stdout," Need to specify only format without filename <BMP> \n");
|
|
||||||
fprintf(stdout," Currently accepts PGM, PPM, PNM, PGX, PNG, BMP, TIF, RAW and TGA formats\n");
|
|
||||||
fprintf(stdout," -i <compressed file>\n");
|
fprintf(stdout," -i <compressed file>\n");
|
||||||
fprintf(stdout," REQUIRED only if an Input image directory not specified\n");
|
fprintf(stdout," REQUIRED only if an Input image directory not specified\n");
|
||||||
fprintf(stdout," Currently accepts J2K-files, JP2-files and JPT-files. The file type\n");
|
fprintf(stdout," Currently accepts J2K-files, JP2-files and JPT-files. The file type\n");
|
||||||
fprintf(stdout," is identified based on its suffix.\n");
|
fprintf(stdout," is identified based on its suffix.\n");
|
||||||
fprintf(stdout," -o <decompressed file>\n");
|
fprintf(stdout," -o <output file>\n");
|
||||||
fprintf(stdout," REQUIRED\n");
|
fprintf(stdout," OPTIONAL\n");
|
||||||
fprintf(stdout," Currently accepts PGM, PPM, PNM, PGX, PNG, BMP, TIF, RAW and TGA files\n");
|
fprintf(stdout," Output file where file info will be dump.\n");
|
||||||
fprintf(stdout," Binary data is written to the file (not ascii). If a PGX\n");
|
fprintf(stdout," By default it will be in the stdout.\n");
|
||||||
fprintf(stdout," filename is given, there will be as many output files as there are\n");
|
|
||||||
fprintf(stdout," components: an indice starting from 0 will then be appended to the\n");
|
|
||||||
fprintf(stdout," output filename, just before the \"pgx\" extension. If a PGM filename\n");
|
|
||||||
fprintf(stdout," is given and there are more than one component, only the first component\n");
|
|
||||||
fprintf(stdout," will be written to the file.\n");
|
|
||||||
fprintf(stdout," -r <reduce factor>\n");
|
|
||||||
fprintf(stdout," Set the number of highest resolution levels to be discarded. The\n");
|
|
||||||
fprintf(stdout," image resolution is effectively divided by 2 to the power of the\n");
|
|
||||||
fprintf(stdout," number of discarded levels. The reduce factor is limited by the\n");
|
|
||||||
fprintf(stdout," smallest total number of decomposition levels among tiles.\n");
|
|
||||||
fprintf(stdout," -l <number of quality layers to decode>\n");
|
|
||||||
fprintf(stdout," Set the maximum number of quality layers to decode. If there are\n");
|
|
||||||
fprintf(stdout," less quality layers than the specified number, all the quality layers\n");
|
|
||||||
fprintf(stdout," are decoded.\n");
|
|
||||||
fprintf(stdout," -x \n");
|
|
||||||
fprintf(stdout," Create an index file *.Idx (-x index_name.Idx) \n");
|
|
||||||
fprintf(stdout,"\n");
|
|
||||||
/* UniPG>> */
|
|
||||||
#ifdef USE_JPWL
|
|
||||||
fprintf(stdout," -W <options>\n");
|
|
||||||
fprintf(stdout," Activates the JPWL correction capability, if the codestream complies.\n");
|
|
||||||
fprintf(stdout," Options can be a comma separated list of <param=val> tokens:\n");
|
|
||||||
fprintf(stdout," c, c=numcomps\n");
|
|
||||||
fprintf(stdout," numcomps is the number of expected components in the codestream\n");
|
|
||||||
fprintf(stdout," (search of first EPB rely upon this, default is %d)\n", JPWL_EXPECTED_COMPONENTS);
|
|
||||||
#endif /* USE_JPWL */
|
|
||||||
/* <<UniPG */
|
|
||||||
fprintf(stdout,"\n");
|
fprintf(stdout,"\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
|
static void j2k_dump_image(FILE *fd, opj_image_t * img);
|
||||||
|
static void j2k_dump_cp(FILE *fd, opj_image_t * img, opj_cp_t * cp);
|
||||||
|
|
||||||
int get_num_images(char *imgdirpath){
|
int get_num_images(char *imgdirpath){
|
||||||
DIR *dir;
|
DIR *dir;
|
||||||
@@ -168,6 +121,7 @@ int get_num_images(char *imgdirpath){
|
|||||||
continue;
|
continue;
|
||||||
num_images++;
|
num_images++;
|
||||||
}
|
}
|
||||||
|
closedir(dir);
|
||||||
return num_images;
|
return num_images;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -193,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -246,21 +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'},
|
||||||
{"OutFor",REQ_ARG, NULL ,'O'},
|
#ifdef USE_SYSTEM_GETOPT
|
||||||
|
{0,0,0,0} /* GNU getopt_long requirement */
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
const char optlist[] = "i:o:h";
|
||||||
|
|
||||||
const char optlist[] = "i:o:r:l:x:"
|
OPJ_ARG_NOT_USED(indexfilename);
|
||||||
|
|
||||||
/* UniPG>> */
|
|
||||||
#ifdef USE_JPWL
|
|
||||||
"W:"
|
|
||||||
#endif /* USE_JPWL */
|
|
||||||
/* <<UniPG */
|
|
||||||
"h" ;
|
|
||||||
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) {
|
||||||
@@ -283,88 +239,17 @@ int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters,i
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* ----------------------------------------------------- */
|
/* ------------------------------------------------------ */
|
||||||
|
|
||||||
case 'o': /* output file */
|
case 'o': /* output file */
|
||||||
{
|
{
|
||||||
char *outfile = opj_optarg;
|
char *outfile = opj_optarg;
|
||||||
parameters->cod_format = get_file_format(outfile);
|
|
||||||
switch(parameters->cod_format) {
|
|
||||||
case PGX_DFMT:
|
|
||||||
case PXM_DFMT:
|
|
||||||
case BMP_DFMT:
|
|
||||||
case TIF_DFMT:
|
|
||||||
case RAW_DFMT:
|
|
||||||
case TGA_DFMT:
|
|
||||||
case PNG_DFMT:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
fprintf(stderr, "Unknown output format image %s [only *.pnm, *.pgm, *.ppm, *.pgx, *.bmp, *.tif, *.raw or *.tga]!! \n", outfile);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
strncpy(parameters->outfile, outfile, sizeof(parameters->outfile)-1);
|
strncpy(parameters->outfile, outfile, sizeof(parameters->outfile)-1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* ----------------------------------------------------- */
|
/* ----------------------------------------------------- */
|
||||||
|
|
||||||
case 'O': /* output format */
|
|
||||||
{
|
|
||||||
char outformat[50];
|
|
||||||
char *of = opj_optarg;
|
|
||||||
sprintf(outformat,".%s",of);
|
|
||||||
img_fol->set_out_format = 1;
|
|
||||||
parameters->cod_format = get_file_format(outformat);
|
|
||||||
switch(parameters->cod_format) {
|
|
||||||
case PGX_DFMT:
|
|
||||||
img_fol->out_format = "pgx";
|
|
||||||
break;
|
|
||||||
case PXM_DFMT:
|
|
||||||
img_fol->out_format = "ppm";
|
|
||||||
break;
|
|
||||||
case BMP_DFMT:
|
|
||||||
img_fol->out_format = "bmp";
|
|
||||||
break;
|
|
||||||
case TIF_DFMT:
|
|
||||||
img_fol->out_format = "tif";
|
|
||||||
break;
|
|
||||||
case RAW_DFMT:
|
|
||||||
img_fol->out_format = "raw";
|
|
||||||
break;
|
|
||||||
case TGA_DFMT:
|
|
||||||
img_fol->out_format = "raw";
|
|
||||||
break;
|
|
||||||
case PNG_DFMT:
|
|
||||||
img_fol->out_format = "png";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
fprintf(stderr, "Unknown output format image %s [only *.pnm, *.pgm, *.ppm, *.pgx, *.bmp, *.tif, *.raw or *.tga]!! \n", outformat);
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* ----------------------------------------------------- */
|
|
||||||
|
|
||||||
|
|
||||||
case 'r': /* reduce option */
|
|
||||||
{
|
|
||||||
sscanf(opj_optarg, "%d", ¶meters->cp_reduce);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* ----------------------------------------------------- */
|
|
||||||
|
|
||||||
|
|
||||||
case 'l': /* layering option */
|
|
||||||
{
|
|
||||||
sscanf(opj_optarg, "%d", ¶meters->cp_layer);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* ----------------------------------------------------- */
|
|
||||||
|
|
||||||
case 'h': /* display an help description */
|
case 'h': /* display an help description */
|
||||||
decode_help_display();
|
decode_help_display();
|
||||||
return 1;
|
return 1;
|
||||||
@@ -378,89 +263,11 @@ int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters,i
|
|||||||
img_fol->set_imgdir=1;
|
img_fol->set_imgdir=1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
/* ----------------------------------------------------- */
|
|
||||||
case 'x': /* Creation of index file */
|
|
||||||
{
|
|
||||||
char *index = opj_optarg;
|
|
||||||
strncpy(indexfilename, index, OPJ_PATH_LEN);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
/* ----------------------------------------------------- */
|
|
||||||
/* UniPG>> */
|
|
||||||
#ifdef USE_JPWL
|
|
||||||
|
|
||||||
case 'W': /* activate JPWL correction */
|
|
||||||
{
|
|
||||||
char *token = NULL;
|
|
||||||
|
|
||||||
token = strtok(opj_optarg, ",");
|
|
||||||
while(token != NULL) {
|
|
||||||
|
|
||||||
/* search expected number of components */
|
|
||||||
if (*token == 'c') {
|
|
||||||
|
|
||||||
static int compno;
|
|
||||||
|
|
||||||
compno = JPWL_EXPECTED_COMPONENTS; /* predefined no. of components */
|
|
||||||
|
|
||||||
if(sscanf(token, "c=%d", &compno) == 1) {
|
|
||||||
/* Specified */
|
|
||||||
if ((compno < 1) || (compno > 256)) {
|
|
||||||
fprintf(stderr, "ERROR -> invalid number of components c = %d\n", compno);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
parameters->jpwl_exp_comps = compno;
|
|
||||||
|
|
||||||
} else if (!strcmp(token, "c")) {
|
|
||||||
/* default */
|
|
||||||
parameters->jpwl_exp_comps = compno; /* auto for default size */
|
|
||||||
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "ERROR -> invalid components specified = %s\n", token);
|
|
||||||
return 1;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/* search maximum number of tiles */
|
|
||||||
if (*token == 't') {
|
|
||||||
|
|
||||||
static int tileno;
|
|
||||||
|
|
||||||
tileno = JPWL_MAXIMUM_TILES; /* maximum no. of tiles */
|
|
||||||
|
|
||||||
if(sscanf(token, "t=%d", &tileno) == 1) {
|
|
||||||
/* Specified */
|
|
||||||
if ((tileno < 1) || (tileno > JPWL_MAXIMUM_TILES)) {
|
|
||||||
fprintf(stderr, "ERROR -> invalid number of tiles t = %d\n", tileno);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
parameters->jpwl_max_tiles = tileno;
|
|
||||||
|
|
||||||
} else if (!strcmp(token, "t")) {
|
|
||||||
/* default */
|
|
||||||
parameters->jpwl_max_tiles = tileno; /* auto for default size */
|
|
||||||
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "ERROR -> invalid tiles specified = %s\n", token);
|
|
||||||
return 1;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/* next token or bust */
|
|
||||||
token = strtok(NULL, ",");
|
|
||||||
};
|
|
||||||
parameters->jpwl_correct = OPJ_TRUE;
|
|
||||||
fprintf(stdout, "JPWL correction capability activated\n");
|
|
||||||
fprintf(stdout, "- expecting %d components\n", parameters->jpwl_exp_comps);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
#endif /* USE_JPWL */
|
|
||||||
/* <<UniPG */
|
|
||||||
|
|
||||||
/* ----------------------------------------------------- */
|
/* ----------------------------------------------------- */
|
||||||
|
|
||||||
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);
|
||||||
@@ -476,13 +283,13 @@ 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) || (parameters->outfile[0] == 0)) {
|
if( parameters->infile[0] == 0 ) {
|
||||||
fprintf(stderr, "Example: %s -i image.j2k -o image.pgm\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;
|
||||||
}
|
}
|
||||||
@@ -517,12 +324,13 @@ void info_callback(const char *msg, void *client_data) {
|
|||||||
|
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
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 */
|
||||||
opj_image_t *image = NULL;
|
opj_image_t *image = NULL;
|
||||||
FILE *fsrc = NULL;
|
FILE *fsrc = NULL, *fout = NULL;
|
||||||
unsigned char *src = NULL;
|
unsigned char *src = NULL;
|
||||||
int file_length;
|
int file_length;
|
||||||
int num_images;
|
int num_images;
|
||||||
@@ -551,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);
|
||||||
@@ -578,8 +391,22 @@ int main(int argc, char **argv) {
|
|||||||
num_images=1;
|
num_images=1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* */
|
||||||
|
if (parameters.outfile[0] != 0)
|
||||||
|
{
|
||||||
|
fout = fopen(parameters.outfile,"w");
|
||||||
|
if (!fout)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "ERROR -> failed to open %s for reading\n", parameters.outfile);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
fout = stdout;
|
||||||
|
|
||||||
/*Encoding image one by one*/
|
/*Encoding image one by one*/
|
||||||
for(imageno = 0; imageno < num_images ; imageno++) {
|
for(imageno = 0; imageno < num_images ; imageno++)
|
||||||
|
{
|
||||||
image = NULL;
|
image = NULL;
|
||||||
fprintf(stderr,"\n");
|
fprintf(stderr,"\n");
|
||||||
|
|
||||||
@@ -605,6 +432,7 @@ int main(int argc, char **argv) {
|
|||||||
{
|
{
|
||||||
free(src);
|
free(src);
|
||||||
fclose(fsrc);
|
fclose(fsrc);
|
||||||
|
fclose(fout);
|
||||||
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");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -639,9 +467,15 @@ int main(int argc, char **argv) {
|
|||||||
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);
|
||||||
|
fclose(fout);
|
||||||
free(src);
|
free(src);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
/* dump image */
|
||||||
|
j2k_dump_image(fout, image);
|
||||||
|
|
||||||
|
/* dump cp */
|
||||||
|
j2k_dump_cp(fout, image, ((opj_j2k_t*)dinfo->j2k_handle)->cp);
|
||||||
|
|
||||||
/* close the byte stream */
|
/* close the byte stream */
|
||||||
opj_cio_close(cio);
|
opj_cio_close(cio);
|
||||||
@@ -682,9 +516,19 @@ int main(int argc, char **argv) {
|
|||||||
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);
|
||||||
|
fclose(fout);
|
||||||
free(src);
|
free(src);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
/* dump image */
|
||||||
|
if(image->icc_profile_buf)
|
||||||
|
{
|
||||||
|
free(image->icc_profile_buf); image->icc_profile_buf = NULL;
|
||||||
|
}
|
||||||
|
j2k_dump_image(fout, image);
|
||||||
|
|
||||||
|
/* dump cp */
|
||||||
|
j2k_dump_cp(fout, image, ((opj_jp2_t*)dinfo->jp2_handle)->j2k->cp);
|
||||||
|
|
||||||
/* close the byte stream */
|
/* close the byte stream */
|
||||||
opj_cio_close(cio);
|
opj_cio_close(cio);
|
||||||
@@ -725,6 +569,7 @@ int main(int argc, char **argv) {
|
|||||||
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);
|
||||||
|
fclose(fout);
|
||||||
free(src);
|
free(src);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -752,94 +597,6 @@ int main(int argc, char **argv) {
|
|||||||
free(src);
|
free(src);
|
||||||
src = NULL;
|
src = NULL;
|
||||||
|
|
||||||
if(image->color_space == CLRSPC_SYCC)
|
|
||||||
{
|
|
||||||
color_sycc_to_rgb(image);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(image->icc_profile_buf)
|
|
||||||
{
|
|
||||||
#if defined(OPJ_HAVE_LIBLCMS1) || defined(OPJ_HAVE_LIBLCMS2)
|
|
||||||
color_apply_icc_profile(image);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
free(image->icc_profile_buf);
|
|
||||||
image->icc_profile_buf = NULL; image->icc_profile_len = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* create output image */
|
|
||||||
/* ------------------- */
|
|
||||||
switch (parameters.cod_format) {
|
|
||||||
case PXM_DFMT: /* PNM PGM PPM */
|
|
||||||
if (imagetopnm(image, parameters.outfile)) {
|
|
||||||
fprintf(stdout,"Outfile %s not generated\n",parameters.outfile);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
fprintf(stdout,"Generated Outfile %s\n",parameters.outfile);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PGX_DFMT: /* PGX */
|
|
||||||
if(imagetopgx(image, parameters.outfile)){
|
|
||||||
fprintf(stdout,"Outfile %s not generated\n",parameters.outfile);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
fprintf(stdout,"Generated Outfile %s\n",parameters.outfile);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BMP_DFMT: /* BMP */
|
|
||||||
if(imagetobmp(image, parameters.outfile)){
|
|
||||||
fprintf(stdout,"Outfile %s not generated\n",parameters.outfile);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
fprintf(stdout,"Generated Outfile %s\n",parameters.outfile);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
#ifdef OPJ_HAVE_LIBTIFF
|
|
||||||
case TIF_DFMT: /* TIFF */
|
|
||||||
if(imagetotif(image, parameters.outfile)){
|
|
||||||
fprintf(stdout,"Outfile %s not generated\n",parameters.outfile);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
fprintf(stdout,"Generated Outfile %s\n",parameters.outfile);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
#endif /* OPJ_HAVE_LIBTIFF */
|
|
||||||
case RAW_DFMT: /* RAW */
|
|
||||||
if(imagetoraw(image, parameters.outfile)){
|
|
||||||
fprintf(stdout,"Error generating raw file. Outfile %s not generated\n",parameters.outfile);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
fprintf(stdout,"Successfully generated Outfile %s\n",parameters.outfile);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TGA_DFMT: /* TGA */
|
|
||||||
if(imagetotga(image, parameters.outfile)){
|
|
||||||
fprintf(stdout,"Error generating tga file. Outfile %s not generated\n",parameters.outfile);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
fprintf(stdout,"Successfully generated Outfile %s\n",parameters.outfile);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
#ifdef OPJ_HAVE_LIBPNG
|
|
||||||
case PNG_DFMT: /* PNG */
|
|
||||||
if(imagetopng(image, parameters.outfile)){
|
|
||||||
fprintf(stdout,"Error generating png file. Outfile %s not generated\n",parameters.outfile);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
fprintf(stdout,"Successfully generated Outfile %s\n",parameters.outfile);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
#endif /* OPJ_HAVE_LIBPNG */
|
|
||||||
/* Can happen if output file is TIFF or PNG
|
|
||||||
* and OPJ_HAVE_LIBTIF or OPJ_HAVE_LIBPNG is undefined
|
|
||||||
*/
|
|
||||||
default:
|
|
||||||
fprintf(stderr,"Outfile %s not generated\n",parameters.outfile);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* free remaining structures */
|
/* free remaining structures */
|
||||||
if(dinfo) {
|
if(dinfo) {
|
||||||
opj_destroy_decompress(dinfo);
|
opj_destroy_decompress(dinfo);
|
||||||
@@ -851,10 +608,84 @@ int main(int argc, char **argv) {
|
|||||||
opj_image_destroy(image);
|
opj_image_destroy(image);
|
||||||
|
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
|
fclose(fout);
|
||||||
|
|
||||||
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
/*end main*/
|
|
||||||
|
|
||||||
|
|
||||||
|
static void j2k_dump_image(FILE *fd, opj_image_t * img) {
|
||||||
|
int compno;
|
||||||
|
fprintf(fd, "image {\n");
|
||||||
|
fprintf(fd, " x0=%d, y0=%d, x1=%d, y1=%d\n", img->x0, img->y0, img->x1, img->y1);
|
||||||
|
fprintf(fd, " numcomps=%d\n", img->numcomps);
|
||||||
|
for (compno = 0; compno < img->numcomps; compno++) {
|
||||||
|
opj_image_comp_t *comp = &img->comps[compno];
|
||||||
|
fprintf(fd, " comp %d {\n", compno);
|
||||||
|
fprintf(fd, " dx=%d, dy=%d\n", comp->dx, comp->dy);
|
||||||
|
fprintf(fd, " prec=%d\n", comp->prec);
|
||||||
|
/*fprintf(fd, " bpp=%d\n", comp->bpp);*/
|
||||||
|
fprintf(fd, " sgnd=%d\n", comp->sgnd);
|
||||||
|
fprintf(fd, " }\n");
|
||||||
|
}
|
||||||
|
fprintf(fd, "}\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void j2k_dump_cp(FILE *fd, opj_image_t * img, opj_cp_t * cp) {
|
||||||
|
int tileno, compno, layno, bandno, resno, numbands;
|
||||||
|
fprintf(fd, "coding parameters {\n");
|
||||||
|
fprintf(fd, " tx0=%d, ty0=%d\n", cp->tx0, cp->ty0);
|
||||||
|
fprintf(fd, " tdx=%d, tdy=%d\n", cp->tdx, cp->tdy);
|
||||||
|
fprintf(fd, " tw=%d, th=%d\n", cp->tw, cp->th);
|
||||||
|
for (tileno = 0; tileno < cp->tw * cp->th; tileno++) {
|
||||||
|
opj_tcp_t *tcp = &cp->tcps[tileno];
|
||||||
|
fprintf(fd, " tile %d {\n", tileno);
|
||||||
|
fprintf(fd, " csty=%x\n", tcp->csty);
|
||||||
|
fprintf(fd, " prg=%d\n", tcp->prg);
|
||||||
|
fprintf(fd, " numlayers=%d\n", tcp->numlayers);
|
||||||
|
fprintf(fd, " mct=%d\n", tcp->mct);
|
||||||
|
fprintf(fd, " rates=");
|
||||||
|
for (layno = 0; layno < tcp->numlayers; layno++) {
|
||||||
|
fprintf(fd, "%.1f ", tcp->rates[layno]);
|
||||||
|
}
|
||||||
|
fprintf(fd, "\n");
|
||||||
|
for (compno = 0; compno < img->numcomps; compno++) {
|
||||||
|
opj_tccp_t *tccp = &tcp->tccps[compno];
|
||||||
|
fprintf(fd, " comp %d {\n", compno);
|
||||||
|
fprintf(fd, " csty=%x\n", tccp->csty);
|
||||||
|
fprintf(fd, " numresolutions=%d\n", tccp->numresolutions);
|
||||||
|
fprintf(fd, " cblkw=%d\n", tccp->cblkw);
|
||||||
|
fprintf(fd, " cblkh=%d\n", tccp->cblkh);
|
||||||
|
fprintf(fd, " cblksty=%x\n", tccp->cblksty);
|
||||||
|
fprintf(fd, " qmfbid=%d\n", tccp->qmfbid);
|
||||||
|
fprintf(fd, " qntsty=%d\n", tccp->qntsty);
|
||||||
|
fprintf(fd, " numgbits=%d\n", tccp->numgbits);
|
||||||
|
fprintf(fd, " roishift=%d\n", tccp->roishift);
|
||||||
|
fprintf(fd, " stepsizes=");
|
||||||
|
numbands = tccp->qntsty == J2K_CCP_QNTSTY_SIQNT ? 1 : tccp->numresolutions * 3 - 2;
|
||||||
|
for (bandno = 0; bandno < numbands; bandno++) {
|
||||||
|
fprintf(fd, "(%d,%d) ", tccp->stepsizes[bandno].mant,
|
||||||
|
tccp->stepsizes[bandno].expn);
|
||||||
|
}
|
||||||
|
fprintf(fd, "\n");
|
||||||
|
|
||||||
|
if (tccp->csty & J2K_CCP_CSTY_PRT) {
|
||||||
|
fprintf(fd, " prcw=");
|
||||||
|
for (resno = 0; resno < tccp->numresolutions; resno++) {
|
||||||
|
fprintf(fd, "%d ", tccp->prcw[resno]);
|
||||||
|
}
|
||||||
|
fprintf(fd, "\n");
|
||||||
|
fprintf(fd, " prch=");
|
||||||
|
for (resno = 0; resno < tccp->numresolutions; resno++) {
|
||||||
|
fprintf(fd, "%d ", tccp->prch[resno]);
|
||||||
|
}
|
||||||
|
fprintf(fd, "\n");
|
||||||
|
}
|
||||||
|
fprintf(fd, " }\n");
|
||||||
|
}
|
||||||
|
fprintf(fd, " }\n");
|
||||||
|
}
|
||||||
|
fprintf(fd, "}\n");
|
||||||
|
}
|
||||||
|
|
||||||
1360
applications/codec/j2k_to_image.c
Normal file
537
applications/common/color.c
Normal file
@@ -0,0 +1,537 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
|
||||||
|
* Copyright (c) 2002-2007, Professor Benoit Macq
|
||||||
|
* Copyright (c) 2001-2003, David Janssens
|
||||||
|
* Copyright (c) 2002-2003, Yannick Verschueren
|
||||||
|
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
|
||||||
|
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
||||||
|
* 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 <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include "opj_config.h"
|
||||||
|
#include "openjpeg.h"
|
||||||
|
#include "color.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBLCMS2
|
||||||
|
#include <lcms2.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_LIBLCMS1
|
||||||
|
#include <lcms.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*--------------------------------------------------------
|
||||||
|
Matrix for sYCC, Amendment 1 to IEC 61966-2-1
|
||||||
|
|
||||||
|
Y : 0.299 0.587 0.114 :R
|
||||||
|
Cb: -0.1687 -0.3312 0.5 :G
|
||||||
|
Cr: 0.5 -0.4187 -0.0812 :B
|
||||||
|
|
||||||
|
Inverse:
|
||||||
|
|
||||||
|
R: 1 -3.68213e-05 1.40199 :Y
|
||||||
|
G: 1.00003 -0.344125 -0.714128 :Cb - 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,
|
||||||
|
int *out_r, int *out_g, int *out_b)
|
||||||
|
{
|
||||||
|
int r, g, b;
|
||||||
|
|
||||||
|
cb -= offset; cr -= offset;
|
||||||
|
r = y + (int)(1.402 * (float)cr);
|
||||||
|
if(r < 0) r = 0; else if(r > upb) r = upb; *out_r = r;
|
||||||
|
|
||||||
|
g = y - (int)(0.344 * (float)cb + 0.714 * (float)cr);
|
||||||
|
if(g < 0) g = 0; else if(g > upb) g = upb; *out_g = g;
|
||||||
|
|
||||||
|
b = y + (int)(1.772 * (float)cb);
|
||||||
|
if(b < 0) b = 0; else if(b > upb) b = upb; *out_b = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void sycc444_to_rgb(opj_image_t *img)
|
||||||
|
{
|
||||||
|
int *d0, *d1, *d2, *r, *g, *b;
|
||||||
|
const int *y, *cb, *cr;
|
||||||
|
unsigned int maxw, maxh, max, i;
|
||||||
|
int offset, upb;
|
||||||
|
|
||||||
|
upb = (int)img->comps[0].prec;
|
||||||
|
offset = 1<<(upb - 1); upb = (1<<upb)-1;
|
||||||
|
|
||||||
|
maxw = (unsigned int)img->comps[0].w; maxh = (unsigned int)img->comps[0].h;
|
||||||
|
max = maxw * maxh;
|
||||||
|
|
||||||
|
y = img->comps[0].data;
|
||||||
|
cb = img->comps[1].data;
|
||||||
|
cr = img->comps[2].data;
|
||||||
|
|
||||||
|
d0 = r = (int*)malloc(sizeof(int) * (size_t)max);
|
||||||
|
d1 = g = (int*)malloc(sizeof(int) * (size_t)max);
|
||||||
|
d2 = b = (int*)malloc(sizeof(int) * (size_t)max);
|
||||||
|
|
||||||
|
for(i = 0U; i < max; ++i)
|
||||||
|
{
|
||||||
|
sycc_to_rgb(offset, upb, *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[1].data); img->comps[1].data = d1;
|
||||||
|
free(img->comps[2].data); img->comps[2].data = d2;
|
||||||
|
|
||||||
|
}/* sycc444_to_rgb() */
|
||||||
|
|
||||||
|
static void sycc422_to_rgb(opj_image_t *img)
|
||||||
|
{
|
||||||
|
int *d0, *d1, *d2, *r, *g, *b;
|
||||||
|
const int *y, *cb, *cr;
|
||||||
|
unsigned int maxw, maxh, max;
|
||||||
|
int offset, upb;
|
||||||
|
unsigned int i, j;
|
||||||
|
|
||||||
|
upb = (int)img->comps[0].prec;
|
||||||
|
offset = 1<<(upb - 1); upb = (1<<upb)-1;
|
||||||
|
|
||||||
|
maxw = (unsigned int)img->comps[0].w; maxh = (unsigned int)img->comps[0].h;
|
||||||
|
max = maxw * maxh;
|
||||||
|
|
||||||
|
y = img->comps[0].data;
|
||||||
|
cb = img->comps[1].data;
|
||||||
|
cr = img->comps[2].data;
|
||||||
|
|
||||||
|
d0 = r = (int*)malloc(sizeof(int) * (size_t)max);
|
||||||
|
d1 = g = (int*)malloc(sizeof(int) * (size_t)max);
|
||||||
|
d2 = b = (int*)malloc(sizeof(int) * (size_t)max);
|
||||||
|
|
||||||
|
for(i=0U; i < maxh; ++i)
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
|
||||||
|
++y; ++r; ++g; ++b; ++cb; ++cr;
|
||||||
|
}
|
||||||
|
if (j < maxw) {
|
||||||
|
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[1].data); img->comps[1].data = d1;
|
||||||
|
free(img->comps[2].data); img->comps[2].data = d2;
|
||||||
|
|
||||||
|
img->comps[1].w = maxw; img->comps[1].h = maxh;
|
||||||
|
img->comps[2].w = maxw; img->comps[2].h = maxh;
|
||||||
|
img->comps[1].dx = img->comps[0].dx;
|
||||||
|
img->comps[2].dx = img->comps[0].dx;
|
||||||
|
img->comps[1].dy = img->comps[0].dy;
|
||||||
|
img->comps[2].dy = img->comps[0].dy;
|
||||||
|
}/* sycc422_to_rgb() */
|
||||||
|
|
||||||
|
static void sycc420_to_rgb(opj_image_t *img)
|
||||||
|
{
|
||||||
|
int *d0, *d1, *d2, *r, *g, *b, *nr, *ng, *nb;
|
||||||
|
const int *y, *cb, *cr, *ny;
|
||||||
|
unsigned int maxw, maxh, max;
|
||||||
|
int offset, upb;
|
||||||
|
unsigned int i, j;
|
||||||
|
|
||||||
|
upb = (int)img->comps[0].prec;
|
||||||
|
offset = 1<<(upb - 1); upb = (1<<upb)-1;
|
||||||
|
|
||||||
|
maxw = (unsigned int)img->comps[0].w; maxh = (unsigned int)img->comps[0].h;
|
||||||
|
max = maxw * maxh;
|
||||||
|
|
||||||
|
y = img->comps[0].data;
|
||||||
|
cb = img->comps[1].data;
|
||||||
|
cr = img->comps[2].data;
|
||||||
|
|
||||||
|
d0 = r = (int*)malloc(sizeof(int) * (size_t)max);
|
||||||
|
d1 = g = (int*)malloc(sizeof(int) * (size_t)max);
|
||||||
|
d2 = b = (int*)malloc(sizeof(int) * (size_t)max);
|
||||||
|
|
||||||
|
for(i=0U; i < (maxh & ~(unsigned int)1U); i += 2U)
|
||||||
|
{
|
||||||
|
ny = y + maxw;
|
||||||
|
nr = r + maxw; ng = g + maxw; nb = b + maxw;
|
||||||
|
|
||||||
|
for(j=0; j < (maxw & ~(unsigned int)1U); j += 2U)
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
|
||||||
|
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, *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;
|
||||||
|
|
||||||
|
sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
|
||||||
|
|
||||||
|
++y; ++r; ++g; ++b; ++cb; ++cr;
|
||||||
|
}
|
||||||
|
if(j < maxw)
|
||||||
|
{
|
||||||
|
sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free(img->comps[0].data); img->comps[0].data = d0;
|
||||||
|
free(img->comps[1].data); img->comps[1].data = d1;
|
||||||
|
free(img->comps[2].data); img->comps[2].data = d2;
|
||||||
|
|
||||||
|
img->comps[1].w = maxw; img->comps[1].h = maxh;
|
||||||
|
img->comps[2].w = maxw; img->comps[2].h = maxh;
|
||||||
|
img->comps[1].dx = img->comps[0].dx;
|
||||||
|
img->comps[2].dx = img->comps[0].dx;
|
||||||
|
img->comps[1].dy = img->comps[0].dy;
|
||||||
|
img->comps[2].dy = img->comps[0].dy;
|
||||||
|
|
||||||
|
}/* sycc420_to_rgb() */
|
||||||
|
|
||||||
|
void color_sycc_to_rgb(opj_image_t *img)
|
||||||
|
{
|
||||||
|
if(img->numcomps < 3)
|
||||||
|
{
|
||||||
|
img->color_space = CLRSPC_GRAY;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if((img->comps[0].dx == 1)
|
||||||
|
&& (img->comps[1].dx == 2)
|
||||||
|
&& (img->comps[2].dx == 2)
|
||||||
|
&& (img->comps[0].dy == 1)
|
||||||
|
&& (img->comps[1].dy == 2)
|
||||||
|
&& (img->comps[2].dy == 2))/* horizontal and vertical sub-sample */
|
||||||
|
{
|
||||||
|
sycc420_to_rgb(img);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if((img->comps[0].dx == 1)
|
||||||
|
&& (img->comps[1].dx == 2)
|
||||||
|
&& (img->comps[2].dx == 2)
|
||||||
|
&& (img->comps[0].dy == 1)
|
||||||
|
&& (img->comps[1].dy == 1)
|
||||||
|
&& (img->comps[2].dy == 1))/* horizontal sub-sample only */
|
||||||
|
{
|
||||||
|
sycc422_to_rgb(img);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if((img->comps[0].dx == 1)
|
||||||
|
&& (img->comps[1].dx == 1)
|
||||||
|
&& (img->comps[2].dx == 1)
|
||||||
|
&& (img->comps[0].dy == 1)
|
||||||
|
&& (img->comps[1].dy == 1)
|
||||||
|
&& (img->comps[2].dy == 1))/* no sub-sample */
|
||||||
|
{
|
||||||
|
sycc444_to_rgb(img);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr,"%s:%d:color_sycc_to_rgb\n\tCAN NOT CONVERT\n", __FILE__,__LINE__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
img->color_space = CLRSPC_SRGB;
|
||||||
|
|
||||||
|
}/* color_sycc_to_rgb() */
|
||||||
|
|
||||||
|
#if defined(HAVE_LIBLCMS2) || defined(HAVE_LIBLCMS1)
|
||||||
|
#ifdef HAVE_LIBLCMS1
|
||||||
|
/* Bob Friesenhahn proposed:*/
|
||||||
|
#define cmsSigXYZData icSigXYZData
|
||||||
|
#define cmsSigLabData icSigLabData
|
||||||
|
#define cmsSigCmykData icSigCmykData
|
||||||
|
#define cmsSigYCbCrData icSigYCbCrData
|
||||||
|
#define cmsSigLuvData icSigLuvData
|
||||||
|
#define cmsSigGrayData icSigGrayData
|
||||||
|
#define cmsSigRgbData icSigRgbData
|
||||||
|
#define cmsUInt32Number DWORD
|
||||||
|
|
||||||
|
#define cmsColorSpaceSignature icColorSpaceSignature
|
||||||
|
#define cmsGetHeaderRenderingIntent cmsTakeRenderingIntent
|
||||||
|
|
||||||
|
#endif /* HAVE_LIBLCMS1 */
|
||||||
|
|
||||||
|
void color_apply_icc_profile(opj_image_t *image)
|
||||||
|
{
|
||||||
|
cmsHPROFILE in_prof, out_prof;
|
||||||
|
cmsHTRANSFORM transform;
|
||||||
|
cmsColorSpaceSignature in_space, out_space;
|
||||||
|
cmsUInt32Number intent, in_type, out_type, nr_samples;
|
||||||
|
int *r, *g, *b;
|
||||||
|
int prec, i, max, max_w, max_h;
|
||||||
|
OPJ_COLOR_SPACE oldspace;
|
||||||
|
|
||||||
|
in_prof =
|
||||||
|
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;
|
||||||
|
|
||||||
|
in_space = cmsGetPCS(in_prof);
|
||||||
|
out_space = cmsGetColorSpace(in_prof);
|
||||||
|
intent = cmsGetHeaderRenderingIntent(in_prof);
|
||||||
|
|
||||||
|
|
||||||
|
max_w = (int)image->comps[0].w;
|
||||||
|
max_h = (int)image->comps[0].h;
|
||||||
|
prec = (int)image->comps[0].prec;
|
||||||
|
oldspace = image->color_space;
|
||||||
|
|
||||||
|
if(out_space == cmsSigRgbData) /* enumCS 16 */
|
||||||
|
{
|
||||||
|
if( prec <= 8 )
|
||||||
|
{
|
||||||
|
in_type = TYPE_RGB_8;
|
||||||
|
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
|
||||||
|
{
|
||||||
|
#ifdef DEBUG_PROFILE
|
||||||
|
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",
|
||||||
|
__FILE__,__LINE__,out_space,
|
||||||
|
(out_space>>24) & 0xff,(out_space>>16) & 0xff,
|
||||||
|
(out_space>>8) & 0xff, out_space & 0xff);
|
||||||
|
#endif
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DEBUG_PROFILE
|
||||||
|
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,
|
||||||
|
max_w,max_h, (void*)in_prof,(void*)out_prof);
|
||||||
|
|
||||||
|
fprintf(stderr,"\trender_intent (%u)\n\t"
|
||||||
|
"color_space: in(%#x)(%c%c%c%c) out:(%#x)(%c%c%c%c)\n\t"
|
||||||
|
" type: in(%u) out:(%u)\n",
|
||||||
|
intent,
|
||||||
|
in_space,
|
||||||
|
(in_space>>24) & 0xff,(in_space>>16) & 0xff,
|
||||||
|
(in_space>>8) & 0xff, in_space & 0xff,
|
||||||
|
|
||||||
|
out_space,
|
||||||
|
(out_space>>24) & 0xff,(out_space>>16) & 0xff,
|
||||||
|
(out_space>>8) & 0xff, out_space & 0xff,
|
||||||
|
|
||||||
|
in_type,out_type
|
||||||
|
);
|
||||||
|
#else
|
||||||
|
(void)prec;
|
||||||
|
(void)in_space;
|
||||||
|
#endif /* DEBUG_PROFILE */
|
||||||
|
|
||||||
|
transform = cmsCreateTransform(in_prof, in_type, out_prof, out_type, intent, 0);
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBLCMS2
|
||||||
|
/* Possible for: LCMS_VERSION >= 2000 :*/
|
||||||
|
cmsCloseProfile(in_prof);
|
||||||
|
cmsCloseProfile(out_prof);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if(transform == NULL)
|
||||||
|
{
|
||||||
|
#ifdef DEBUG_PROFILE
|
||||||
|
fprintf(stderr,"%s:%d:color_apply_icc_profile\n\tcmsCreateTransform failed. "
|
||||||
|
"ICC Profile ignored.\n",__FILE__,__LINE__);
|
||||||
|
#endif
|
||||||
|
image->color_space = oldspace;
|
||||||
|
#ifdef HAVE_LIBLCMS1
|
||||||
|
cmsCloseProfile(in_prof);
|
||||||
|
cmsCloseProfile(out_prof);
|
||||||
|
#endif
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(image->numcomps > 2)/* RGB, RGBA */
|
||||||
|
{
|
||||||
|
if( prec <= 8 )
|
||||||
|
{
|
||||||
|
unsigned char *inbuf, *outbuf, *in, *out;
|
||||||
|
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;
|
||||||
|
g = image->comps[1].data;
|
||||||
|
b = image->comps[2].data;
|
||||||
|
|
||||||
|
for(i = 0; i < max; ++i)
|
||||||
|
{
|
||||||
|
*in++ = (unsigned char)*r++;
|
||||||
|
*in++ = (unsigned char)*g++;
|
||||||
|
*in++ = (unsigned char)*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
|
||||||
|
{
|
||||||
|
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 */
|
||||||
|
{
|
||||||
|
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);
|
||||||
|
|
||||||
|
image->comps = (opj_image_comp_t*)realloc(image->comps, (image->numcomps+2)*sizeof(opj_image_comp_t));
|
||||||
|
|
||||||
|
if(image->numcomps == 2)
|
||||||
|
image->comps[3] = image->comps[1];
|
||||||
|
|
||||||
|
image->comps[1] = image->comps[0];
|
||||||
|
image->comps[2] = image->comps[0];
|
||||||
|
|
||||||
|
image->comps[1].data = (int*)calloc((size_t)max, sizeof(int));
|
||||||
|
image->comps[2].data = (int*)calloc((size_t)max, sizeof(int));
|
||||||
|
|
||||||
|
image->numcomps += 2;
|
||||||
|
|
||||||
|
r = image->comps[0].data;
|
||||||
|
|
||||||
|
for(i = 0; i < max; ++i)
|
||||||
|
{
|
||||||
|
*in++ = (unsigned char)*r++;
|
||||||
|
}
|
||||||
|
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);
|
||||||
|
|
||||||
|
}/* if(image->numcomps */
|
||||||
|
|
||||||
|
cmsDeleteTransform(transform);
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBLCMS1
|
||||||
|
cmsCloseProfile(in_prof);
|
||||||
|
cmsCloseProfile(out_prof);
|
||||||
|
#endif
|
||||||
|
}/* color_apply_icc_profile() */
|
||||||
|
|
||||||
|
#endif /* HAVE_LIBLCMS2 || HAVE_LIBLCMS1 */
|
||||||
|
|
||||||
@@ -1,15 +1,9 @@
|
|||||||
/*
|
/*
|
||||||
* The copyright in this software is being made available under the 2-clauses
|
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
|
||||||
* BSD License, included below. This software may be subject to other third
|
* Copyright (c) 2002-2007, Professor Benoit Macq
|
||||||
* 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) 2001-2003, David Janssens
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
* Copyright (c) 2002-2003, Yannick Verschueren
|
||||||
* Copyright (c) 2003-2007, Francois-Olivier Devaux
|
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
|
||||||
* Copyright (c) 2003-2014, Antonin Descampe
|
|
||||||
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -1,15 +1,9 @@
|
|||||||
/*
|
/*
|
||||||
* The copyright in this software is being made available under the 2-clauses
|
* Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
|
||||||
* BSD License, included below. This software may be subject to other third
|
* Copyright (c) 2002-2007, Professor Benoit Macq
|
||||||
* 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) 2001-2003, David Janssens
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
* Copyright (c) 2002-2003, Yannick Verschueren
|
||||||
* Copyright (c) 2003-2007, Francois-Olivier Devaux
|
* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
|
||||||
* Copyright (c) 2003-2014, Antonin Descampe
|
|
||||||
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -47,9 +41,8 @@
|
|||||||
#define BMP_DFMT 12
|
#define BMP_DFMT 12
|
||||||
#define YUV_DFMT 13
|
#define YUV_DFMT 13
|
||||||
#define TIF_DFMT 14
|
#define TIF_DFMT 14
|
||||||
#define RAW_DFMT 15 /* MSB / Big Endian */
|
#define RAW_DFMT 15
|
||||||
#define TGA_DFMT 16
|
#define TGA_DFMT 16
|
||||||
#define PNG_DFMT 17
|
#define PNG_DFMT 17
|
||||||
#define RAWL_DFMT 18 /* LSB / Little Endian */
|
|
||||||
|
|
||||||
#endif /* _OPJ_FORMAT_DEFS_H_ */
|
#endif /* _OPJ_FORMAT_DEFS_H_ */
|
||||||
@@ -1,9 +1,4 @@
|
|||||||
/*
|
/*
|
||||||
* The copyright in this software is being made available under the 3-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) 1987, 1993, 1994
|
* Copyright (c) 1987, 1993, 1994
|
||||||
* The Regents of the University of California. All rights reserved.
|
* The Regents of the University of California. All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -43,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 */
|
||||||
@@ -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 */
|
||||||
127
applications/jpip/CHANGES
Normal file
@@ -0,0 +1,127 @@
|
|||||||
|
What's New for OpenJPIP
|
||||||
|
|
||||||
|
* : fixed
|
||||||
|
- : removed
|
||||||
|
! : changed
|
||||||
|
+ : added
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
December 24, 2011
|
||||||
|
* [kaori] additional modification for the warning
|
||||||
|
|
||||||
|
December 22, 2011
|
||||||
|
* [kaori] fixed auxtrans_manager to enable MAC
|
||||||
|
* [kaori] warnings due to disregarding return value are removed
|
||||||
|
|
||||||
|
November 30, 2011
|
||||||
|
+ [kaori] TCP return (http-tcp) implemented
|
||||||
|
|
||||||
|
November 16, 2011
|
||||||
|
* [kaori] fixed Region of Interest option, and memory leak of opj_dec_server
|
||||||
|
+ [kaori] new feature to target JP2 files from www (libcurl required)
|
||||||
|
* [kaori] fixed opj_server execusion error (instant terminating) with autotool, cmake still need to be fixed
|
||||||
|
|
||||||
|
November 8, 2011
|
||||||
|
! [kaori] updated main page of doxygen
|
||||||
|
|
||||||
|
November 3, 2011
|
||||||
|
* [kaori] solved memory leak of opj_server
|
||||||
|
! [kaori] removed redundant defines
|
||||||
|
|
||||||
|
November 2, 2011
|
||||||
|
* [antonin] additional patches for autotools and cmake
|
||||||
|
|
||||||
|
October 26, 2011
|
||||||
|
* [kaori] additional patches for autotool are applied
|
||||||
|
|
||||||
|
October 25, 2011
|
||||||
|
* [kaori] patches for cmake and autotool are applied
|
||||||
|
* [kaori] fixed client viewer to be compatible with server response header both Content-type and Content-Type
|
||||||
|
|
||||||
|
October 20, 2011
|
||||||
|
+ [added] API style in openJPIP library
|
||||||
|
! [kaori] rearranged directories, applications are all under util/ directory, currently only 'make -f Makefile.nix' works
|
||||||
|
|
||||||
|
October 18, 2011
|
||||||
|
! [kaori] rearranged opj_server, opj_dec_server directory
|
||||||
|
|
||||||
|
October 14, 2011
|
||||||
|
+ [kaori] enable all progression orders
|
||||||
|
|
||||||
|
October 12, 2011
|
||||||
|
+ [kaori] enable layers requests; restricting the number of codesream quality layers
|
||||||
|
|
||||||
|
October 11, 2011
|
||||||
|
+ [antonin] enable JPT-stream request from client viewer option (credit to kaori)
|
||||||
|
|
||||||
|
October 10, 2011
|
||||||
|
- [antonin] removed obsolete indexer utility (credit to kaori)
|
||||||
|
+ [antonin] enabled JPP-stream (credit to kaori)
|
||||||
|
|
||||||
|
September 16, 2011
|
||||||
|
+ [kaori] enabled stateless requests from the opj_viewers
|
||||||
|
|
||||||
|
Septempber 1, 2011
|
||||||
|
* [kaori] changed terminating status of opj_server in debug/non-server mode
|
||||||
|
|
||||||
|
August 27, 2011
|
||||||
|
* [antonin] fixed missing include directory in opj_client/opj_dec_server/CMakeLists.txt
|
||||||
|
|
||||||
|
August 26, 2011
|
||||||
|
* [antonin] fixed cmake and autotools files to reflect recent indexer changes in JPIP
|
||||||
|
! [kaori] indexer using the latest openjpeg library
|
||||||
|
* [antonin] fixed cmake and autotools files to reflect recent changes in JPIP
|
||||||
|
! [kaori] fixed Makefile.nix to load openjpeg library from this archive
|
||||||
|
|
||||||
|
August 25, 2011
|
||||||
|
+ [kaori] added tid request support to JPIP client
|
||||||
|
+ [kaori] added quit JPIP server request
|
||||||
|
|
||||||
|
August 24, 2011
|
||||||
|
+ [kaori] added cachemodel_manager, which had been managed in target_manager previously
|
||||||
|
+ [kaori] added tid request support to JPIP server
|
||||||
|
|
||||||
|
August 16, 2011
|
||||||
|
* [antonin] fixed cmake support for openjpip
|
||||||
|
|
||||||
|
August 12, 2011
|
||||||
|
+ [antonin] added cmake support to openjpip
|
||||||
|
|
||||||
|
July 6, 2011
|
||||||
|
* [antonin] JPIP : fixed autotools to work with recent name changes
|
||||||
|
|
||||||
|
July 5, 2011
|
||||||
|
! [kaori] changed parameter, file names, message names regarding JPT-stream to JPIP-stream, which handles also JPP-stream
|
||||||
|
|
||||||
|
May 26, 2011
|
||||||
|
! [antonin] changed Makefile to Makefile.nix to avoid having autotools overwrite them.
|
||||||
|
|
||||||
|
May 23, 2011
|
||||||
|
+ [antonin] added autotools for the 'tools' directory
|
||||||
|
+ [antonin] added autotools as a build method for jpip (credit to Vincent Torri)
|
||||||
|
|
||||||
|
May 10, 2011
|
||||||
|
! [kaori] opj_viewer removed the xml functions (for users without Xersus2)
|
||||||
|
+ [kaori] renamed opj_viewer to opj_viewer_xerces ( needs Xersus2)
|
||||||
|
! [kaori] Modification of opj_dec_server to be portable to windows
|
||||||
|
|
||||||
|
May 9, 2011
|
||||||
|
* [kaori] Removal of c99 from the compile option (to be compatible to win platform) and bool definition in libopenjpip/bool.h
|
||||||
|
|
||||||
|
May 9, 2011
|
||||||
|
* [antonin] OpenJPIP: small bug fixes to compile on win platform
|
||||||
|
|
||||||
|
May 8, 2011
|
||||||
|
* [antonin] OpenJPIP: fixed several bugs in opj_server (removal of strsep function, duplication of query string) + some changes to compile opj_server under windows (replacement of strcasecmp(), bzero()).
|
||||||
|
|
||||||
|
April 14, 2011
|
||||||
|
+ [antonin] initial commit of OpenJPIP 1.0, a JPIP client-server architecture based on OpenJPEG (see README file in jpip directory for more details)
|
||||||
16
applications/jpip/CMakeLists.txt
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# required dep for server:
|
||||||
|
IF(BUILD_JPIP_SERVER)
|
||||||
|
FIND_PACKAGE(CURL REQUIRED)
|
||||||
|
FIND_PACKAGE(FCGI 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)
|
||||||
|
|
||||||
|
# JPIP library:
|
||||||
|
ADD_SUBDIRECTORY(libopenjpip)
|
||||||
|
|
||||||
|
# JPIP binaries:
|
||||||
|
ADD_SUBDIRECTORY(util)
|
||||||
|
|
||||||
3
applications/jpip/Makefile.am
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
MAINTAINERCLEANFILES = Makefile.in
|
||||||
|
|
||||||
|
SUBDIRS = libopenjpip util
|
||||||
1514
applications/jpip/doc/Doxyfile
Normal file
|
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.2 KiB |
@@ -1,17 +1,13 @@
|
|||||||
include_regular_expression("^.*$")
|
INCLUDE_REGULAR_EXPRESSION("^.*$")
|
||||||
|
|
||||||
add_definitions(-DUSE_JPIP)
|
INCLUDE_DIRECTORIES(
|
||||||
|
${OPENJPEG_SOURCE_DIR}/libopenjpeg
|
||||||
include_directories(
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}
|
|
||||||
${OPENJPEG_BINARY_DIR}/src/lib/openjp2 # opj_config.h
|
|
||||||
${OPENJPEG_SOURCE_DIR}/src/lib/openjp2
|
|
||||||
${FCGI_INCLUDE_DIRS}
|
${FCGI_INCLUDE_DIRS}
|
||||||
${CURL_INCLUDE_DIRS}
|
${CURL_INCLUDE_DIRS}
|
||||||
)
|
)
|
||||||
|
|
||||||
# Defines the source code for the library
|
# Defines the source code for the library
|
||||||
set(OPENJPIP_SRCS
|
SET(OPENJPIP_SRCS
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/boxheader_manager.c
|
${CMAKE_CURRENT_SOURCE_DIR}/boxheader_manager.c
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/codestream_manager.c
|
${CMAKE_CURRENT_SOURCE_DIR}/codestream_manager.c
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/imgreg_manager.c
|
${CMAKE_CURRENT_SOURCE_DIR}/imgreg_manager.c
|
||||||
@@ -38,11 +34,11 @@ set(OPENJPIP_SRCS
|
|||||||
${CMAKE_CURRENT_SOURCE_DIR}/sock_manager.c
|
${CMAKE_CURRENT_SOURCE_DIR}/sock_manager.c
|
||||||
)
|
)
|
||||||
|
|
||||||
set(SERVER_SRCS
|
SET(SERVER_SRCS
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/auxtrans_manager.c
|
${CMAKE_CURRENT_SOURCE_DIR}/auxtrans_manager.c
|
||||||
)
|
)
|
||||||
|
|
||||||
set(LOCAL_SRCS
|
SET(LOCAL_SRCS
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/jp2k_decoder.c
|
${CMAKE_CURRENT_SOURCE_DIR}/jp2k_decoder.c
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/imgsock_manager.c
|
${CMAKE_CURRENT_SOURCE_DIR}/imgsock_manager.c
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/jpipstream_manager.c
|
${CMAKE_CURRENT_SOURCE_DIR}/jpipstream_manager.c
|
||||||
@@ -51,37 +47,26 @@ set(LOCAL_SRCS
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Build the library
|
# Build the library
|
||||||
if(WIN32)
|
ADD_LIBRARY(openjpip_local STATIC ${OPENJPIP_SRCS} ${LOCAL_SRCS})
|
||||||
if(BUILD_SHARED_LIBS)
|
TARGET_LINK_LIBRARIES(openjpip_local ${OPENJPEG_LIBRARY_NAME})
|
||||||
add_definitions(-DOPJ_EXPORTS)
|
IF(WIN32)
|
||||||
else()
|
|
||||||
add_definitions(-DOPJ_STATIC)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
add_library(openjpip ${OPENJPIP_SRCS} ${LOCAL_SRCS})
|
|
||||||
set_target_properties(openjpip
|
|
||||||
PROPERTIES ${OPENJPEG_LIBRARY_PROPERTIES})
|
|
||||||
target_link_libraries(openjpip ${OPENJPEG_LIBRARY_NAME})
|
|
||||||
if(WIN32)
|
|
||||||
# add Winsock on windows+mingw
|
# add Winsock on windows+mingw
|
||||||
target_link_libraries(openjpip ws2_32)
|
TARGET_LINK_LIBRARIES(openjpip_local ws2_32)
|
||||||
endif()
|
ENDIF(WIN32)
|
||||||
|
|
||||||
# Install library
|
# Install library
|
||||||
install(TARGETS openjpip
|
INSTALL(TARGETS openjpip_local
|
||||||
EXPORT OpenJPEGTargets
|
|
||||||
RUNTIME DESTINATION ${OPENJPEG_INSTALL_BIN_DIR} COMPONENT Applications
|
|
||||||
LIBRARY DESTINATION ${OPENJPEG_INSTALL_LIB_DIR} COMPONENT Libraries
|
|
||||||
ARCHIVE DESTINATION ${OPENJPEG_INSTALL_LIB_DIR} COMPONENT Libraries
|
|
||||||
)
|
|
||||||
|
|
||||||
if(BUILD_JPIP_SERVER)
|
|
||||||
add_library(openjpip_server STATIC ${OPENJPIP_SRCS} ${SERVER_SRCS})
|
|
||||||
target_link_libraries(openjpip_server ${FCGI_LIBRARIES} ${CURL_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT})
|
|
||||||
set_target_properties(openjpip_server
|
|
||||||
PROPERTIES COMPILE_FLAGS "-DSERVER")
|
|
||||||
install(TARGETS openjpip_server
|
|
||||||
EXPORT OpenJPEGTargets
|
EXPORT OpenJPEGTargets
|
||||||
DESTINATION ${OPENJPEG_INSTALL_LIB_DIR} COMPONENT Libraries
|
DESTINATION ${OPENJPEG_INSTALL_LIB_DIR} COMPONENT Libraries
|
||||||
)
|
)
|
||||||
endif()
|
|
||||||
|
IF(BUILD_JPIP_SERVER)
|
||||||
|
ADD_LIBRARY(openjpip_server STATIC ${OPENJPIP_SRCS} ${SERVER_SRCS})
|
||||||
|
TARGET_LINK_LIBRARIES(openjpip_server ${FCGI_LIBRARIES} ${CURL_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT})
|
||||||
|
SET_TARGET_PROPERTIES(openjpip_server
|
||||||
|
PROPERTIES COMPILE_FLAGS "-DSERVER")
|
||||||
|
INSTALL(TARGETS openjpip_server
|
||||||
|
EXPORT OpenJPEGTargets
|
||||||
|
DESTINATION ${OPENJPEG_INSTALL_LIB_DIR} COMPONENT Libraries
|
||||||
|
)
|
||||||
|
ENDIF(BUILD_JPIP_SERVER)
|
||||||
151
applications/jpip/libopenjpip/Makefile.am
Normal file
@@ -0,0 +1,151 @@
|
|||||||
|
MAINTAINERCLEANFILES = Makefile.in
|
||||||
|
|
||||||
|
includesdir = $(includedir)/openjpeg-$(MAJOR_NR).$(MINOR_NR)
|
||||||
|
includes_HEADERS =
|
||||||
|
|
||||||
|
lib_LTLIBRARIES =
|
||||||
|
|
||||||
|
if WANT_JPIP
|
||||||
|
lib_LTLIBRARIES += libopenjpip_local.la
|
||||||
|
endif
|
||||||
|
|
||||||
|
if WANT_JPIP_SERVER
|
||||||
|
lib_LTLIBRARIES += libopenjpip_server.la
|
||||||
|
endif
|
||||||
|
|
||||||
|
JPIP_SRC = \
|
||||||
|
openjpip.c \
|
||||||
|
query_parser.c \
|
||||||
|
channel_manager.c \
|
||||||
|
session_manager.c \
|
||||||
|
jpip_parser.c \
|
||||||
|
boxheader_manager.c \
|
||||||
|
codestream_manager.c \
|
||||||
|
imgreg_manager.c \
|
||||||
|
marker_manager.c \
|
||||||
|
msgqueue_manager.c \
|
||||||
|
box_manager.c \
|
||||||
|
faixbox_manager.c \
|
||||||
|
index_manager.c \
|
||||||
|
metadata_manager.c \
|
||||||
|
placeholder_manager.c \
|
||||||
|
byte_manager.c \
|
||||||
|
ihdrbox_manager.c \
|
||||||
|
manfbox_manager.c \
|
||||||
|
mhixbox_manager.c \
|
||||||
|
target_manager.c \
|
||||||
|
cachemodel_manager.c \
|
||||||
|
j2kheader_manager.c \
|
||||||
|
jp2k_encoder.c \
|
||||||
|
sock_manager.c \
|
||||||
|
openjpip.h \
|
||||||
|
bool.h \
|
||||||
|
boxheader_manager.h \
|
||||||
|
box_manager.h \
|
||||||
|
byte_manager.h \
|
||||||
|
codestream_manager.h \
|
||||||
|
faixbox_manager.h \
|
||||||
|
ihdrbox_manager.h \
|
||||||
|
imgreg_manager.h \
|
||||||
|
index_manager.h \
|
||||||
|
manfbox_manager.h \
|
||||||
|
marker_manager.h \
|
||||||
|
metadata_manager.h \
|
||||||
|
mhixbox_manager.h \
|
||||||
|
msgqueue_manager.h \
|
||||||
|
placeholder_manager.h \
|
||||||
|
target_manager.h \
|
||||||
|
cachemodel_manager.h \
|
||||||
|
j2kheader_manager.h \
|
||||||
|
jp2k_encoder.h \
|
||||||
|
query_parser.h \
|
||||||
|
channel_manager.h \
|
||||||
|
session_manager.h \
|
||||||
|
jpip_parser.h \
|
||||||
|
jp2k_decoder.h \
|
||||||
|
sock_manager.h
|
||||||
|
|
||||||
|
SERVER_SRC = auxtrans_manager.c \
|
||||||
|
auxtrans_manager.h
|
||||||
|
|
||||||
|
LOCAL_SRC = jp2k_decoder.c \
|
||||||
|
imgsock_manager.c \
|
||||||
|
jpipstream_manager.c \
|
||||||
|
cache_manager.c \
|
||||||
|
dec_clientmsg_handler.c \
|
||||||
|
imgsock_manager.h \
|
||||||
|
jpipstream_manager.h \
|
||||||
|
cache_manager.h \
|
||||||
|
dec_clientmsg_handler.h
|
||||||
|
|
||||||
|
libopenjpip_server_la_CPPFLAGS = \
|
||||||
|
-I. \
|
||||||
|
-I$(top_srcdir)/applications/jpip/libopenjpip \
|
||||||
|
-I$(top_builddir)/applications/jpip/libopenjpip \
|
||||||
|
@FCGI_CFLAGS@ \
|
||||||
|
@LIBCURL_CFLAGS@ \
|
||||||
|
-DSERVER
|
||||||
|
libopenjpip_server_la_CFLAGS = @THREAD_CFLAGS@
|
||||||
|
libopenjpip_server_la_LIBADD = @FCGI_LIBS@ @LIBCURL_LIBS@ @THREAD_LIBS@ -lm
|
||||||
|
libopenjpip_server_la_LDFLAGS = -no-undefined -version-info @lt_version@
|
||||||
|
libopenjpip_server_la_SOURCES = $(JPIP_SRC) $(SERVER_SRC)
|
||||||
|
|
||||||
|
libopenjpip_local_la_CPPFLAGS = \
|
||||||
|
-I. \
|
||||||
|
-I$(top_srcdir)/libopenjpeg \
|
||||||
|
-I$(top_builddir)/libopenjpeg \
|
||||||
|
-I$(top_srcdir)/applications/jpip/libopenjpip \
|
||||||
|
-I$(top_builddir)/applications/jpip/libopenjpip \
|
||||||
|
@LIBCURL_CFLAGS@
|
||||||
|
libopenjpip_local_la_CFLAGS =
|
||||||
|
libopenjpip_local_la_LIBADD = $(top_builddir)/libopenjpeg/libopenjpeg.la -lm
|
||||||
|
libopenjpip_local_la_LDFLAGS = -no-undefined -version-info @lt_version@
|
||||||
|
libopenjpip_local_la_SOURCES = $(JPIP_SRC) $(LOCAL_SRC)
|
||||||
|
|
||||||
|
install-data-hook:
|
||||||
|
if WANT_JPIP_SERVER
|
||||||
|
@echo -e " (LA)\t$(libdir)/libopenjpip_server.la" >> $(top_builddir)/report.txt
|
||||||
|
if BUILD_SHARED
|
||||||
|
@( $(call solist_s) ) >> $(top_builddir)/report.txt
|
||||||
|
endif
|
||||||
|
if BUILD_STATIC
|
||||||
|
@echo -e " (A)\t$(base_s)/$(a_s)" >> $(top_builddir)/report.txt
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
if WANT_JPIP
|
||||||
|
@echo -e " (LA)\t$(libdir)/libopenjpip_local.la" >> $(top_builddir)/report.txt
|
||||||
|
if BUILD_SHARED
|
||||||
|
@( $(call solist_c) ) >> $(top_builddir)/report.txt
|
||||||
|
endif
|
||||||
|
if BUILD_STATIC
|
||||||
|
@echo -e " (A)\t$(base_c)/$(a_c)" >> $(top_builddir)/report.txt
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
solist_s = $(foreach f, $(dll_s) $(so_s), echo -e ' $(SO_PREFIX)\t$(base_s)/$(f)' ;)
|
||||||
|
get_tok_s = $(shell grep -E "^$(1)=" libopenjpip_server.la | cut -d "'" -f 2)
|
||||||
|
base_s = $(call get_tok_s,libdir)
|
||||||
|
so_s = $(call get_tok_s,library_names)
|
||||||
|
a_s = $(call get_tok_s,old_library)
|
||||||
|
|
||||||
|
solist_c = $(foreach f, $(dll_c) $(so_c), echo -e ' $(SO_PREFIX)\t$(base_c)/$(f)' ;)
|
||||||
|
get_tok_c = $(shell grep -E "^$(1)=" libopenjpip_local.la | cut -d "'" -f 2)
|
||||||
|
base_c = $(call get_tok_c,libdir)
|
||||||
|
so_c = $(call get_tok_c,library_names)
|
||||||
|
a_c = $(call get_tok_c,old_library)
|
||||||
|
|
||||||
|
if HAVE_WIN32
|
||||||
|
SO_PREFIX = (DLL)
|
||||||
|
dll_s = $(call get_tok_s,dlname)
|
||||||
|
dll_c = $(call get_tok_c,dlname)
|
||||||
|
else
|
||||||
|
if HAVE_DARWIN
|
||||||
|
SO_PREFIX = (DY)
|
||||||
|
dll_s =
|
||||||
|
dll_c =
|
||||||
|
else
|
||||||
|
SO_PREFIX = (SO)
|
||||||
|
dll_s =
|
||||||
|
dll_c =
|
||||||
|
endif
|
||||||
|
endif
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
/*
|
/*
|
||||||
* $Id$
|
* $Id$
|
||||||
*
|
*
|
||||||
* Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
|
* Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
|
||||||
* Copyright (c) 2002-2014, Professor Benoit Macq
|
* Copyright (c) 2002-2011, Professor Benoit Macq
|
||||||
* Copyright (c) 2010-2011, Kaori Hagihara
|
* Copyright (c) 2010-2011, Kaori Hagihara
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -56,7 +56,7 @@ auxtrans_param_t init_aux_transport( int tcp_auxport, int udp_auxport)
|
|||||||
auxtrans.udpauxport = udp_auxport;
|
auxtrans.udpauxport = udp_auxport;
|
||||||
|
|
||||||
if( 49152 <= tcp_auxport && tcp_auxport <= 65535)
|
if( 49152 <= tcp_auxport && tcp_auxport <= 65535)
|
||||||
auxtrans.tcplistensock = open_listeningsocket( (uint16_t)tcp_auxport);
|
auxtrans.tcplistensock = open_listeningsocket( tcp_auxport);
|
||||||
else
|
else
|
||||||
auxtrans.tcplistensock = -1;
|
auxtrans.tcplistensock = -1;
|
||||||
|
|
||||||
@@ -82,15 +82,15 @@ void close_aux_transport( auxtrans_param_t auxtrans)
|
|||||||
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 */
|
||||||
OPJ_SIZE_T datalen; /*!< length of data */
|
int datalen; /*!< length of data */
|
||||||
OPJ_SIZE_T 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;
|
||||||
|
|
||||||
aux_response_param_t * gene_auxresponse( OPJ_BOOL istcp, auxtrans_param_t auxtrans, const char cid[], void *data, OPJ_SIZE_T datalen, OPJ_SIZE_T maxlenPerFrame);
|
aux_response_param_t * gene_auxresponse( bool istcp, auxtrans_param_t auxtrans, char cid[], void *data, int datalen, int maxlenPerFrame);
|
||||||
|
|
||||||
void delete_auxresponse( aux_response_param_t **auxresponse);
|
void delete_auxresponse( aux_response_param_t **auxresponse);
|
||||||
|
|
||||||
@@ -101,7 +101,7 @@ unsigned __stdcall aux_streaming( void *arg);
|
|||||||
void * aux_streaming( void *arg);
|
void * aux_streaming( void *arg);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void send_responsedata_on_aux( OPJ_BOOL istcp, auxtrans_param_t auxtrans, const char cid[], void *data, OPJ_SIZE_T datalen, OPJ_SIZE_T maxlenPerFrame)
|
void send_responsedata_on_aux( bool istcp, auxtrans_param_t auxtrans, char cid[], void *data, int datalen, int maxlenPerFrame)
|
||||||
{
|
{
|
||||||
aux_response_param_t *auxresponse;
|
aux_response_param_t *auxresponse;
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
@@ -133,11 +133,11 @@ void send_responsedata_on_aux( OPJ_BOOL istcp, auxtrans_param_t auxtrans, const
|
|||||||
fprintf( FCGI_stderr, "Error: error in send_responsedata_on_aux(), udp not implemented\n");
|
fprintf( FCGI_stderr, "Error: error in send_responsedata_on_aux(), udp not implemented\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
aux_response_param_t * gene_auxresponse( OPJ_BOOL istcp, auxtrans_param_t auxtrans, const char cid[], void *data, OPJ_SIZE_T datalen, OPJ_SIZE_T maxlenPerFrame)
|
aux_response_param_t * gene_auxresponse( bool istcp, auxtrans_param_t auxtrans, char cid[], void *data, int datalen, int maxlenPerFrame)
|
||||||
{
|
{
|
||||||
aux_response_param_t *auxresponse;
|
aux_response_param_t *auxresponse;
|
||||||
|
|
||||||
auxresponse = (aux_response_param_t *)opj_malloc( sizeof(aux_response_param_t));
|
auxresponse = (aux_response_param_t *)malloc( sizeof(aux_response_param_t));
|
||||||
|
|
||||||
auxresponse->cid = strdup( cid);
|
auxresponse->cid = strdup( cid);
|
||||||
auxresponse->data = data;
|
auxresponse->data = data;
|
||||||
@@ -150,9 +150,9 @@ aux_response_param_t * gene_auxresponse( OPJ_BOOL istcp, auxtrans_param_t auxtra
|
|||||||
|
|
||||||
void delete_auxresponse( aux_response_param_t **auxresponse)
|
void delete_auxresponse( aux_response_param_t **auxresponse)
|
||||||
{
|
{
|
||||||
opj_free( (*auxresponse)->cid);
|
free( (*auxresponse)->cid);
|
||||||
opj_free( (*auxresponse)->data);
|
free( (*auxresponse)->data);
|
||||||
opj_free( *auxresponse);
|
free( *auxresponse);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -163,9 +163,9 @@ void delete_auxresponse( aux_response_param_t **auxresponse)
|
|||||||
* @param [in] fp file pointer for log of aux stream
|
* @param [in] fp file pointer for log of aux stream
|
||||||
* @return true if identified, false otherwise
|
* @return true if identified, false otherwise
|
||||||
*/
|
*/
|
||||||
OPJ_BOOL identify_cid( SOCKET connected_socket, char refcid[], FILE *fp);
|
bool identify_cid( SOCKET connected_socket, char refcid[], FILE *fp);
|
||||||
|
|
||||||
OPJ_BOOL recv_ack( SOCKET connected_socket, void *data);
|
bool recv_ack( SOCKET connected_socket, void *data);
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
unsigned __stdcall aux_streaming( void *arg)
|
unsigned __stdcall aux_streaming( void *arg)
|
||||||
@@ -175,8 +175,8 @@ void * aux_streaming( void *arg)
|
|||||||
{
|
{
|
||||||
SOCKET connected_socket;
|
SOCKET connected_socket;
|
||||||
unsigned char *chunk, *ptr;
|
unsigned char *chunk, *ptr;
|
||||||
OPJ_SIZE_T maxLenOfBody, remlen, chunklen;
|
int maxLenOfBody, remlen, chunklen;
|
||||||
const OPJ_SIZE_T headlen = 8;
|
const int headlen = 8;
|
||||||
|
|
||||||
aux_response_param_t *auxresponse = (aux_response_param_t *)arg;
|
aux_response_param_t *auxresponse = (aux_response_param_t *)arg;
|
||||||
|
|
||||||
@@ -186,7 +186,7 @@ void * aux_streaming( void *arg)
|
|||||||
pthread_detach( pthread_self());
|
pthread_detach( pthread_self());
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
chunk = (unsigned char *)opj_malloc( auxresponse->maxlenPerFrame);
|
chunk = (unsigned char *)malloc( auxresponse->maxlenPerFrame);
|
||||||
maxLenOfBody = auxresponse->maxlenPerFrame - headlen;
|
maxLenOfBody = auxresponse->maxlenPerFrame - headlen;
|
||||||
remlen = auxresponse->datalen;
|
remlen = auxresponse->datalen;
|
||||||
|
|
||||||
@@ -216,7 +216,7 @@ void * aux_streaming( void *arg)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
opj_free( chunk);
|
free( chunk);
|
||||||
|
|
||||||
delete_auxresponse( &auxresponse);
|
delete_auxresponse( &auxresponse);
|
||||||
|
|
||||||
@@ -230,38 +230,38 @@ void * aux_streaming( void *arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
OPJ_BOOL identify_cid( SOCKET connected_socket, char refcid[], FILE *fp)
|
bool identify_cid( SOCKET connected_socket, char refcid[], FILE *fp)
|
||||||
{
|
{
|
||||||
char *cid;
|
char *cid;
|
||||||
OPJ_BOOL succeed;
|
bool succeed;
|
||||||
|
|
||||||
if(!(cid = receive_string( connected_socket))){
|
if(!(cid = receive_string( connected_socket))){
|
||||||
fprintf( fp, "Error: error in identify_cid(), while receiving cid from client\n");
|
fprintf( fp, "Error: error in identify_cid(), while receiving cid from client\n");
|
||||||
return OPJ_FALSE;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
succeed = OPJ_FALSE;
|
succeed = false;
|
||||||
if( strncmp( refcid, cid, strlen( refcid)) == 0)
|
if( strncmp( refcid, cid, strlen( refcid)) == 0)
|
||||||
succeed = OPJ_TRUE;
|
succeed = true;
|
||||||
|
|
||||||
opj_free( cid);
|
free( cid);
|
||||||
|
|
||||||
return succeed;
|
return succeed;
|
||||||
}
|
}
|
||||||
|
|
||||||
OPJ_BOOL recv_ack( SOCKET connected_socket, void *data)
|
bool recv_ack( SOCKET connected_socket, void *data)
|
||||||
{
|
{
|
||||||
char *header;
|
char *header;
|
||||||
OPJ_BOOL succeed;
|
bool succeed;
|
||||||
|
|
||||||
header = receive_stream( connected_socket, 8);
|
header = receive_stream( connected_socket, 8);
|
||||||
|
|
||||||
if( memcmp( header, data, 8) != 0)
|
if( memcmp( header, data, 8) != 0)
|
||||||
succeed = OPJ_FALSE;
|
succeed = false;
|
||||||
else
|
else
|
||||||
succeed = OPJ_TRUE;
|
succeed = true;
|
||||||
|
|
||||||
opj_free( header);
|
free( header);
|
||||||
|
|
||||||
return succeed;
|
return succeed;
|
||||||
}
|
}
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
/*
|
/*
|
||||||
* $Id$
|
* $Id$
|
||||||
*
|
*
|
||||||
* Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
|
* Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
|
||||||
* Copyright (c) 2002-2014, Professor Benoit Macq
|
* Copyright (c) 2002-2011, Professor Benoit Macq
|
||||||
* Copyright (c) 2010-2011, Kaori Hagihara
|
* Copyright (c) 2010-2011, Kaori Hagihara
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -32,7 +32,6 @@
|
|||||||
# define AUXTRANS_MANAGER_H_
|
# define AUXTRANS_MANAGER_H_
|
||||||
|
|
||||||
#include "sock_manager.h"
|
#include "sock_manager.h"
|
||||||
#include "opj_includes.h"
|
|
||||||
|
|
||||||
/** auxiliary transport setting parameters*/
|
/** auxiliary transport setting parameters*/
|
||||||
typedef struct auxtrans_param{
|
typedef struct auxtrans_param{
|
||||||
@@ -45,8 +44,8 @@ typedef struct auxtrans_param{
|
|||||||
/**
|
/**
|
||||||
* Initialize auxiliary transport server of JPIP server
|
* Initialize auxiliary transport server of JPIP server
|
||||||
*
|
*
|
||||||
* @param[in] tcp_auxport opening tcp auxiliary port ( 0 not to open, valid No. 49152-65535)
|
* @param[in] tcp_auxport opening tcp auxiliary port ( 0 not to open, valid No. 49152–65535)
|
||||||
* @param[in] udp_auxport opening udp auxiliary port ( 0 not to open, valid No. 49152-65535)
|
* @param[in] udp_auxport opening udp auxiliary port ( 0 not to open, valid No. 49152–65535)
|
||||||
* @return intialized transport parameters
|
* @return intialized transport parameters
|
||||||
*/
|
*/
|
||||||
auxtrans_param_t init_aux_transport( int tcp_auxport, int udp_auxport);
|
auxtrans_param_t init_aux_transport( int tcp_auxport, int udp_auxport);
|
||||||
@@ -68,6 +67,6 @@ void close_aux_transport( auxtrans_param_t auxtrans);
|
|||||||
* @param[in] length length of data
|
* @param[in] length length of data
|
||||||
* @param[in] maxlenPerFrame maximum data length to send per frame
|
* @param[in] maxlenPerFrame maximum data length to send per frame
|
||||||
*/
|
*/
|
||||||
void send_responsedata_on_aux( OPJ_BOOL istcp, auxtrans_param_t auxtrans, const char cid[], void *data, OPJ_SIZE_T length, OPJ_SIZE_T maxlenPerFrame);
|
void send_responsedata_on_aux( bool istcp, auxtrans_param_t auxtrans, char cid[], void *data, int length, int maxlenPerFrame);
|
||||||
|
|
||||||
#endif /* !AUXTRANS_MANAGER_H_ */
|
#endif /* !AUXTRANS_MANAGER_H_ */
|
||||||
@@ -1,10 +1,9 @@
|
|||||||
/*
|
/*
|
||||||
* The copyright in this software is being made available under the 2-clauses
|
* $Id$
|
||||||
* 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) 2012, Mathieu Malaterre <mathieu.malaterre@gmail.com>
|
* Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
|
||||||
|
* Copyright (c) 2002-2011, Professor Benoit Macq
|
||||||
|
* Copyright (c) 2010-2011, Kaori Hagihara
|
||||||
* 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
|
||||||
@@ -28,21 +27,26 @@
|
|||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
#ifndef OPJ_INTTYPES_H
|
|
||||||
#define OPJ_INTTYPES_H
|
|
||||||
|
|
||||||
#include "opj_config_private.h"
|
#ifndef BOOL_H_
|
||||||
#ifdef OPJ_HAVE_INTTYPES_H
|
# define BOOL_H_
|
||||||
#include <inttypes.h>
|
|
||||||
#else
|
#ifndef false
|
||||||
#if defined(_WIN32)
|
#define false 0
|
||||||
#define PRId64 "I64d"
|
|
||||||
#define PRIi64 "I64i"
|
|
||||||
#define PRIu64 "I64u"
|
|
||||||
#define PRIx64 "I64x"
|
|
||||||
#else
|
|
||||||
#error unsupported platform
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* OPJ_INTTYPES_H */
|
#ifndef FALSE
|
||||||
|
#define FALSE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef true
|
||||||
|
#define true (!false)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef TRUE
|
||||||
|
#define TRUE (!FALSE)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef char bool;
|
||||||
|
|
||||||
|
#endif /* !BOOL_H_ */
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
/*
|
/*
|
||||||
* $Id$
|
* $Id: box_manager.c 44 2011-02-15 12:32:29Z kaori $
|
||||||
*
|
*
|
||||||
* Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
|
* Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
|
||||||
* Copyright (c) 2002-2014, Professor Benoit Macq
|
* Copyright (c) 2002-2011, Professor Benoit Macq
|
||||||
* Copyright (c) 2010-2011, Kaori Hagihara
|
* Copyright (c) 2010-2011, Kaori Hagihara
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -32,9 +32,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <assert.h>
|
|
||||||
#include "box_manager.h"
|
#include "box_manager.h"
|
||||||
#include "opj_inttypes.h"
|
|
||||||
|
|
||||||
#ifdef SERVER
|
#ifdef SERVER
|
||||||
#include "fcgi_stdio.h"
|
#include "fcgi_stdio.h"
|
||||||
@@ -45,7 +43,7 @@
|
|||||||
#define logstream stderr
|
#define logstream stderr
|
||||||
#endif /*SERVER*/
|
#endif /*SERVER*/
|
||||||
|
|
||||||
boxlist_param_t * gene_boxlist(void)
|
boxlist_param_t * gene_boxlist()
|
||||||
{
|
{
|
||||||
boxlist_param_t *boxlist;
|
boxlist_param_t *boxlist;
|
||||||
|
|
||||||
@@ -57,41 +55,38 @@ boxlist_param_t * gene_boxlist(void)
|
|||||||
return boxlist;
|
return boxlist;
|
||||||
}
|
}
|
||||||
|
|
||||||
boxlist_param_t * get_boxstructure( int fd, OPJ_OFF_T offset, OPJ_SIZE_T length)
|
boxlist_param_t * get_boxstructure( int fd, Byte8_t offset, Byte8_t length)
|
||||||
{
|
{
|
||||||
boxlist_param_t *boxlist;
|
boxlist_param_t *boxlist;
|
||||||
box_param_t *box;
|
box_param_t *box;
|
||||||
OPJ_OFF_T pos;
|
int pos;
|
||||||
|
|
||||||
boxlist = NULL;
|
boxlist = NULL;
|
||||||
pos = offset;
|
pos = offset;
|
||||||
assert( (OPJ_OFF_T)length>=0);
|
|
||||||
do{
|
do{
|
||||||
if(!(box = gene_boxbyOffset( fd, pos)))
|
if(!(box = gene_boxbyOffset( fd, pos)))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
assert( (OPJ_OFF_T)box->length >= 0);
|
pos += box->length;
|
||||||
pos += (OPJ_OFF_T)box->length;
|
|
||||||
|
|
||||||
if( !boxlist)
|
if( !boxlist)
|
||||||
boxlist = gene_boxlist();
|
boxlist = gene_boxlist();
|
||||||
insert_box_into_list( box, boxlist);
|
insert_box_into_list( box, boxlist);
|
||||||
}while( pos < offset+(OPJ_OFF_T)length);
|
}while( pos < (int)(offset+length));
|
||||||
|
|
||||||
return boxlist;
|
return boxlist;
|
||||||
}
|
}
|
||||||
|
|
||||||
box_param_t * gene_boxbyOffset( int fd, OPJ_OFF_T offset)
|
box_param_t * gene_boxbyOffset( int fd, Byte8_t offset)
|
||||||
{
|
{
|
||||||
Byte_t *data;
|
Byte_t *data;
|
||||||
Byte8_t boxlen;
|
Byte8_t boxlen, headlen;
|
||||||
Byte_t headlen;
|
|
||||||
char *boxtype;
|
char *boxtype;
|
||||||
box_param_t *box;
|
box_param_t *box;
|
||||||
|
|
||||||
/* read LBox and TBox*/
|
/* read LBox and TBox*/
|
||||||
if(!(data = fetch_bytes( fd, offset, 8))){
|
if(!(data = fetch_bytes( fd, offset, 8))){
|
||||||
fprintf( FCGI_stderr, "Error: error in gene_boxbyOffset( %d, %" PRId64 ")\n", fd, offset);
|
fprintf( FCGI_stderr, "Error: error in gene_boxbyOffset( %d, %lld)\n", fd, offset);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -116,7 +111,7 @@ box_param_t * gene_boxbyOffset( int fd, OPJ_OFF_T offset)
|
|||||||
free(data2);
|
free(data2);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
fprintf( FCGI_stderr, "Error: error in gene_boxbyOffset( %d, %" PRId64 ")\n", fd, offset);
|
fprintf( FCGI_stderr, "Error: error in gene_boxbyOffset( %d, %lld)\n", fd, offset);
|
||||||
free( data);
|
free( data);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -132,10 +127,9 @@ box_param_t * gene_boxbyOffset( int fd, OPJ_OFF_T offset)
|
|||||||
return box;
|
return box;
|
||||||
}
|
}
|
||||||
|
|
||||||
box_param_t * gene_boxbyOffinStream( Byte_t *stream, OPJ_OFF_T offset)
|
box_param_t * gene_boxbyOffinStream( Byte_t *stream, Byte8_t offset)
|
||||||
{
|
{
|
||||||
Byte8_t boxlen;
|
Byte8_t boxlen, headlen;
|
||||||
Byte_t headlen;
|
|
||||||
char *boxtype;
|
char *boxtype;
|
||||||
box_param_t *box;
|
box_param_t *box;
|
||||||
|
|
||||||
@@ -167,28 +161,22 @@ box_param_t * gene_boxbyOffinStream( Byte_t *stream, OPJ_OFF_T offset)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
box_param_t * gene_boxbyType( int fd, OPJ_OFF_T offset, OPJ_SIZE_T length, const char TBox[])
|
box_param_t * gene_boxbyType( int fd, Byte8_t offset, Byte8_t length, const char TBox[])
|
||||||
{
|
{
|
||||||
OPJ_OFF_T pos;
|
Byte8_t pos;
|
||||||
Byte_t *data;
|
Byte_t *data;
|
||||||
Byte8_t boxlen;
|
Byte8_t boxlen, headlen;
|
||||||
Byte_t headlen;
|
|
||||||
char *boxtype;
|
char *boxtype;
|
||||||
box_param_t *foundbox;
|
box_param_t *foundbox;
|
||||||
|
|
||||||
|
|
||||||
if( length==0){ /* set the max length*/
|
if( length==0){ /* set the max length*/
|
||||||
if( get_filesize( fd) <= offset )
|
if( (length = get_filesize( fd) - offset) <= 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
assert( get_filesize( fd) > offset );
|
|
||||||
assert( offset >= 0 );
|
|
||||||
length = (OPJ_SIZE_T)(get_filesize( fd) - offset);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pos = offset;
|
pos = offset;
|
||||||
assert( pos >= 0 );
|
while( pos < offset+length-7){ /* LBox+TBox-1=7*/
|
||||||
assert( (OPJ_OFF_T)length >= 0 );
|
|
||||||
while( pos < offset+(OPJ_OFF_T)length-7){ /* LBox+TBox-1=7*/
|
|
||||||
|
|
||||||
/* read LBox and TBox*/
|
/* read LBox and TBox*/
|
||||||
if((data = fetch_bytes( fd, pos, 8))){
|
if((data = fetch_bytes( fd, pos, 8))){
|
||||||
@@ -205,7 +193,7 @@ box_param_t * gene_boxbyType( int fd, OPJ_OFF_T offset, OPJ_SIZE_T length, const
|
|||||||
free(data2);
|
free(data2);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
fprintf( FCGI_stderr, "Error: error in gene_boxbyType( %d, %" PRId64 ", %" PRId64 ", %s)\n", fd, offset, length, TBox);
|
fprintf( FCGI_stderr, "Error: error in gene_boxbyType( %d, %lld, %lld, %s)\n", fd, offset, length, TBox);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -223,30 +211,32 @@ box_param_t * gene_boxbyType( int fd, OPJ_OFF_T offset, OPJ_SIZE_T length, const
|
|||||||
free( data);
|
free( data);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
fprintf( FCGI_stderr, "Error: error in gene_boxbyType( %d, %" PRId64 ", %" PRId64 ", %s)\n", fd, offset, length, TBox);
|
fprintf( FCGI_stderr, "Error: error in gene_boxbyType( %d, %lld, %lld, %s)\n", fd, offset, length, TBox);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
assert( ((Byte8_t)pos+boxlen)>=(Byte8_t)pos);
|
pos+= boxlen;
|
||||||
pos+= (OPJ_OFF_T)boxlen;
|
|
||||||
}
|
}
|
||||||
fprintf( FCGI_stderr, "Error: Box %s not found\n", TBox);
|
fprintf( FCGI_stderr, "Error: Box %s not found\n", TBox);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
box_param_t * gene_boxbyTypeinStream( Byte_t *stream, OPJ_OFF_T offset, OPJ_SIZE_T length, const char TBox[])
|
box_param_t * gene_boxbyTypeinStream( Byte_t *stream, Byte8_t offset, Byte8_t length, const char TBox[])
|
||||||
{
|
{
|
||||||
OPJ_OFF_T pos;
|
Byte8_t pos;
|
||||||
Byte_t *data;
|
Byte_t *data;
|
||||||
Byte8_t boxlen;
|
Byte8_t boxlen, headlen;
|
||||||
Byte_t headlen;
|
|
||||||
char *boxtype;
|
char *boxtype;
|
||||||
box_param_t *foundbox;
|
box_param_t *foundbox;
|
||||||
|
|
||||||
|
|
||||||
|
if( length<=0){ /* set the max length*/
|
||||||
|
fprintf( FCGI_stderr, "func gene_boxbyTypeinStream(), max length must be more than 0\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
pos = offset;
|
pos = offset;
|
||||||
assert( pos >= 0 );
|
while( pos < offset+length-7){ /* LBox+TBox-1=7*/
|
||||||
assert( (OPJ_OFF_T)length >= 0 );
|
|
||||||
while( pos < offset+(OPJ_OFF_T)(length)-7){ /* LBox+TBox-1=7*/
|
|
||||||
|
|
||||||
/* read LBox and TBox*/
|
/* read LBox and TBox*/
|
||||||
data = stream + pos;
|
data = stream + pos;
|
||||||
@@ -270,39 +260,31 @@ box_param_t * gene_boxbyTypeinStream( Byte_t *stream, OPJ_OFF_T offset, OPJ_SIZE
|
|||||||
foundbox->next = NULL;
|
foundbox->next = NULL;
|
||||||
return foundbox;
|
return foundbox;
|
||||||
}
|
}
|
||||||
assert( ((Byte8_t)pos+boxlen)>=(Byte8_t)pos);
|
pos+= boxlen;
|
||||||
pos+= (OPJ_OFF_T)boxlen;
|
|
||||||
}
|
}
|
||||||
fprintf( FCGI_stderr, "Error: Box %s not found\n", TBox);
|
fprintf( FCGI_stderr, "Error: Box %s not found\n", TBox);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
box_param_t * gene_childboxbyOffset( box_param_t *superbox, OPJ_OFF_T offset)
|
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, OPJ_OFF_T offset, const char TBox[])
|
box_param_t * gene_childboxbyType( box_param_t *superbox, Byte8_t offset, const char TBox[])
|
||||||
{
|
{
|
||||||
OPJ_SIZE_T DBOXlen = get_DBoxlen(superbox);
|
return gene_boxbyType( superbox->fd, get_DBoxoff( superbox)+offset, get_DBoxlen( superbox)-offset, TBox);
|
||||||
assert( offset >= 0 );
|
|
||||||
if( DBOXlen < (OPJ_SIZE_T)offset )
|
|
||||||
{
|
|
||||||
fprintf( FCGI_stderr, "Error: Impossible happen %lu < %ld\n", DBOXlen, offset);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return gene_boxbyType( superbox->fd, get_DBoxoff( superbox)+offset, DBOXlen-(OPJ_SIZE_T)offset, TBox);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
OPJ_OFF_T get_DBoxoff( box_param_t *box)
|
Byte8_t get_DBoxoff( box_param_t *box)
|
||||||
{
|
{
|
||||||
return box->offset+box->headlen;
|
return box->offset+box->headlen;
|
||||||
}
|
}
|
||||||
|
|
||||||
OPJ_SIZE_T get_DBoxlen( box_param_t *box)
|
Byte8_t get_DBoxlen( box_param_t *box)
|
||||||
{
|
{
|
||||||
return box->length - box->headlen;
|
return box->length-box->headlen;
|
||||||
}
|
}
|
||||||
|
|
||||||
Byte_t * fetch_headbytes( box_param_t *box)
|
Byte_t * fetch_headbytes( box_param_t *box)
|
||||||
@@ -310,27 +292,27 @@ Byte_t * fetch_headbytes( box_param_t *box)
|
|||||||
return fetch_bytes( box->fd, box->offset, box->headlen);
|
return fetch_bytes( box->fd, box->offset, box->headlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
Byte_t * fetch_DBoxbytes( box_param_t *box, OPJ_OFF_T offset, OPJ_SIZE_T size)
|
Byte_t * fetch_DBoxbytes( box_param_t *box, long offset, int size)
|
||||||
{
|
{
|
||||||
return fetch_bytes( box->fd, get_DBoxoff( box)+offset, size);
|
return fetch_bytes( box->fd, get_DBoxoff( box)+offset, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
Byte_t fetch_DBox1byte( box_param_t *box, OPJ_OFF_T offset)
|
Byte_t fetch_DBox1byte( box_param_t *box, long offset)
|
||||||
{
|
{
|
||||||
return fetch_1byte( box->fd, get_DBoxoff( box)+offset);
|
return fetch_1byte( box->fd, get_DBoxoff( box)+offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
Byte2_t fetch_DBox2bytebigendian( box_param_t *box, OPJ_OFF_T offset)
|
Byte2_t fetch_DBox2bytebigendian( box_param_t *box, long offset)
|
||||||
{
|
{
|
||||||
return fetch_2bytebigendian( box->fd, get_DBoxoff( box)+offset);
|
return fetch_2bytebigendian( box->fd, get_DBoxoff( box)+offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
Byte4_t fetch_DBox4bytebigendian( box_param_t *box, OPJ_OFF_T offset)
|
Byte4_t fetch_DBox4bytebigendian( box_param_t *box, long offset)
|
||||||
{
|
{
|
||||||
return fetch_4bytebigendian( box->fd, get_DBoxoff( box)+offset);
|
return fetch_4bytebigendian( box->fd, get_DBoxoff( box)+offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
Byte8_t fetch_DBox8bytebigendian( box_param_t *box, OPJ_OFF_T offset)
|
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);
|
||||||
}
|
}
|
||||||
@@ -357,10 +339,9 @@ void print_box( box_param_t *box)
|
|||||||
{
|
{
|
||||||
fprintf( logstream, "box info:\n"
|
fprintf( logstream, "box info:\n"
|
||||||
"\t type: %.4s\n"
|
"\t type: %.4s\n"
|
||||||
"\t offset: %" PRId64 " %#" PRIx64 "\n"
|
"\t offset: %lld %#llx\n"
|
||||||
"\t header length: %d\n"
|
"\t header length: %d\n"
|
||||||
"\t length: %" PRId64 " %#" PRIx64 "\n", box->type, box->offset,
|
"\t length: %lld %#llx\n", box->type, box->offset, box->offset, box->headlen, box->length, box->length);
|
||||||
box->offset, box->headlen, box->length, box->length);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void print_allbox( boxlist_param_t *boxlist)
|
void print_allbox( boxlist_param_t *boxlist)
|
||||||
@@ -400,7 +381,7 @@ void delete_box_in_list( box_param_t **box, boxlist_param_t *boxlist)
|
|||||||
free( *box);
|
free( *box);
|
||||||
}
|
}
|
||||||
|
|
||||||
void delete_box_in_list_by_type( const char type[], boxlist_param_t *boxlist)
|
void delete_box_in_list_by_type( char type[], boxlist_param_t *boxlist)
|
||||||
{
|
{
|
||||||
box_param_t *box;
|
box_param_t *box;
|
||||||
|
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
/*
|
/*
|
||||||
* $Id$
|
* $Id: box_manager.h 44 2011-02-15 12:32:29Z kaori $
|
||||||
*
|
*
|
||||||
* Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
|
* Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
|
||||||
* Copyright (c) 2002-2014, Professor Benoit Macq
|
* Copyright (c) 2002-2011, Professor Benoit Macq
|
||||||
* Copyright (c) 2010-2011, Kaori Hagihara
|
* Copyright (c) 2010-2011, Kaori Hagihara
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -36,7 +36,7 @@
|
|||||||
/** box parameters*/
|
/** box parameters*/
|
||||||
typedef struct box_param{
|
typedef struct box_param{
|
||||||
int fd; /**< file descriptor*/
|
int fd; /**< file descriptor*/
|
||||||
OPJ_OFF_T offset; /**< byte position of the whole Box (LBox) in the file*/
|
Byte8_t offset; /**< byte position of the whole Box (LBox) in the file*/
|
||||||
Byte_t headlen; /**< header length 8 or 16*/
|
Byte_t headlen; /**< header length 8 or 16*/
|
||||||
Byte8_t length; /**< length of the whole Box*/
|
Byte8_t length; /**< length of the whole Box*/
|
||||||
char type[4]; /**< type of information in the DBox*/
|
char type[4]; /**< type of information in the DBox*/
|
||||||
@@ -56,7 +56,7 @@ typedef struct boxlist_param{
|
|||||||
*
|
*
|
||||||
* @return pointer to the generated box list
|
* @return pointer to the generated box list
|
||||||
*/
|
*/
|
||||||
boxlist_param_t * gene_boxlist(void);
|
boxlist_param_t * gene_boxlist();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get box structure of JP2 file
|
* get box structure of JP2 file
|
||||||
@@ -66,7 +66,7 @@ boxlist_param_t * gene_boxlist(void);
|
|||||||
* @param[in] length length of the decomposing region
|
* @param[in] length length of the decomposing region
|
||||||
* @return pointer to the generated boxlist
|
* @return pointer to the generated boxlist
|
||||||
*/
|
*/
|
||||||
boxlist_param_t * get_boxstructure( int fd, OPJ_OFF_T offset, OPJ_SIZE_T length);
|
boxlist_param_t * get_boxstructure( int fd, Byte8_t offset, Byte8_t length);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -76,7 +76,7 @@ boxlist_param_t * get_boxstructure( int fd, OPJ_OFF_T offset, OPJ_SIZE_T length)
|
|||||||
* @param[in] offset Box offset
|
* @param[in] offset Box offset
|
||||||
* @return pointer to the structure of generate box parameters
|
* @return pointer to the structure of generate box parameters
|
||||||
*/
|
*/
|
||||||
box_param_t * gene_boxbyOffset( int fd, OPJ_OFF_T offset);
|
box_param_t * gene_boxbyOffset( int fd, Byte8_t offset);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -86,7 +86,7 @@ box_param_t * gene_boxbyOffset( int fd, OPJ_OFF_T offset);
|
|||||||
* @param[in] offset Box offset of the whole stream
|
* @param[in] offset Box offset of the whole stream
|
||||||
* @return pointer to the structure of generate box parameters
|
* @return pointer to the structure of generate box parameters
|
||||||
*/
|
*/
|
||||||
box_param_t * gene_boxbyOffinStream( Byte_t *stream, OPJ_OFF_T offset);
|
box_param_t * gene_boxbyOffinStream( Byte_t *stream, Byte8_t offset);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* generate(search) box from JP2 file
|
* generate(search) box from JP2 file
|
||||||
@@ -97,7 +97,7 @@ box_param_t * gene_boxbyOffinStream( Byte_t *stream, OPJ_OFF_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, OPJ_OFF_T offset, OPJ_SIZE_T length, const 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, OPJ_OFF_T offset, OPJ_SIZE_T length, const
|
|||||||
* @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, OPJ_OFF_T offset, OPJ_SIZE_T length, const 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
|
||||||
@@ -117,7 +117,7 @@ box_param_t * gene_boxbyTypeinStream( Byte_t *stream, OPJ_OFF_T offset, OPJ_SIZE
|
|||||||
* @param[in] offset offset from DBox first byte of superbox
|
* @param[in] offset offset from DBox first byte of superbox
|
||||||
* @return pointer to the structure of generate box parameters
|
* @return pointer to the structure of generate box parameters
|
||||||
*/
|
*/
|
||||||
box_param_t * gene_childboxbyOffset( box_param_t *superbox, OPJ_OFF_T offset);
|
box_param_t * gene_childboxbyOffset( box_param_t *superbox, Byte8_t offset);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* generate(search) box from JP2 file
|
* generate(search) box from JP2 file
|
||||||
@@ -127,7 +127,7 @@ box_param_t * gene_childboxbyOffset( box_param_t *superbox, OPJ_OFF_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, OPJ_OFF_T offset, const char TBox[]);
|
box_param_t * gene_childboxbyType( box_param_t *superbox, Byte8_t offset, const char TBox[]);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get DBox offset
|
* get DBox offset
|
||||||
@@ -135,7 +135,7 @@ box_param_t * gene_childboxbyType( box_param_t *superbox, OPJ_OFF_T offset, cons
|
|||||||
* @param[in] box box pointer
|
* @param[in] box box pointer
|
||||||
* @return DBox offset (byte position) in the file
|
* @return DBox offset (byte position) in the file
|
||||||
*/
|
*/
|
||||||
OPJ_OFF_T get_DBoxoff( box_param_t *box);
|
Byte8_t get_DBoxoff( box_param_t *box);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -144,7 +144,7 @@ OPJ_OFF_T get_DBoxoff( box_param_t *box);
|
|||||||
* @param[in] box box pointer
|
* @param[in] box box pointer
|
||||||
* @return DBox length ( content length)
|
* @return DBox length ( content length)
|
||||||
*/
|
*/
|
||||||
OPJ_SIZE_T get_DBoxlen( box_param_t *box);
|
Byte8_t get_DBoxlen( box_param_t *box);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -164,7 +164,7 @@ Byte_t * fetch_headbytes( box_param_t *box);
|
|||||||
* @param[in] size Byte length
|
* @param[in] size Byte length
|
||||||
* @return pointer to the fetched data
|
* @return pointer to the fetched data
|
||||||
*/
|
*/
|
||||||
Byte_t * fetch_DBoxbytes( box_param_t *box, OPJ_OFF_T offset, OPJ_SIZE_T size);
|
Byte_t * fetch_DBoxbytes( box_param_t *box, long offset, int size);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fetch DBox (Box Contents) 1-byte Byte codes in file stream
|
* fetch DBox (Box Contents) 1-byte Byte codes in file stream
|
||||||
@@ -173,7 +173,7 @@ Byte_t * fetch_DBoxbytes( box_param_t *box, OPJ_OFF_T offset, OPJ_SIZE_T size);
|
|||||||
* @param[in] offset start Byte position in DBox
|
* @param[in] offset start Byte position in DBox
|
||||||
* @return fetched code
|
* @return fetched code
|
||||||
*/
|
*/
|
||||||
Byte_t fetch_DBox1byte( box_param_t *box, OPJ_OFF_T offset);
|
Byte_t fetch_DBox1byte( box_param_t *box, long offset);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fetch DBox (Box Contents) 2-byte big endian Byte codes in file stream
|
* fetch DBox (Box Contents) 2-byte big endian Byte codes in file stream
|
||||||
@@ -182,7 +182,7 @@ Byte_t fetch_DBox1byte( box_param_t *box, OPJ_OFF_T offset);
|
|||||||
* @param[in] offset start Byte position in DBox
|
* @param[in] offset start Byte position in DBox
|
||||||
* @return fetched code
|
* @return fetched code
|
||||||
*/
|
*/
|
||||||
Byte2_t fetch_DBox2bytebigendian( box_param_t *box, OPJ_OFF_T offset);
|
Byte2_t fetch_DBox2bytebigendian( box_param_t *box, long offset);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fetch DBox (Box Contents) 4-byte big endian Byte codes in file stream
|
* fetch DBox (Box Contents) 4-byte big endian Byte codes in file stream
|
||||||
@@ -191,7 +191,7 @@ Byte2_t fetch_DBox2bytebigendian( box_param_t *box, OPJ_OFF_T offset);
|
|||||||
* @param[in] offset start Byte position in DBox
|
* @param[in] offset start Byte position in DBox
|
||||||
* @return fetched code
|
* @return fetched code
|
||||||
*/
|
*/
|
||||||
Byte4_t fetch_DBox4bytebigendian( box_param_t *box, OPJ_OFF_T offset);
|
Byte4_t fetch_DBox4bytebigendian( box_param_t *box, long offset);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fetch DBox (Box Contents) 8-byte big endian Byte codes in file stream
|
* fetch DBox (Box Contents) 8-byte big endian Byte codes in file stream
|
||||||
@@ -200,7 +200,7 @@ Byte4_t fetch_DBox4bytebigendian( box_param_t *box, OPJ_OFF_T offset);
|
|||||||
* @param[in] offset start Byte position in DBox
|
* @param[in] offset start Byte position in DBox
|
||||||
* @return fetched code
|
* @return fetched code
|
||||||
*/
|
*/
|
||||||
Byte8_t fetch_DBox8bytebigendian( box_param_t *box, OPJ_OFF_T offset);
|
Byte8_t fetch_DBox8bytebigendian( box_param_t *box, long offset);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -242,7 +242,7 @@ void delete_box_in_list( box_param_t **box, boxlist_param_t *boxlist);
|
|||||||
* @param[in,out] type box type
|
* @param[in,out] type box type
|
||||||
* @param[in] boxlist box list pointer
|
* @param[in] boxlist box list pointer
|
||||||
*/
|
*/
|
||||||
void delete_box_in_list_by_type( const char type[], boxlist_param_t *boxlist);
|
void delete_box_in_list_by_type( char type[], boxlist_param_t *boxlist);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
/*
|
/*
|
||||||
* $Id$
|
* $Id: boxheader_manager.c 44 2011-02-15 12:32:29Z kaori $
|
||||||
*
|
*
|
||||||
* Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
|
* Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
|
||||||
* Copyright (c) 2002-2014, Professor Benoit Macq
|
* Copyright (c) 2002-2011, Professor Benoit Macq
|
||||||
* Copyright (c) 2010-2011, Kaori Hagihara
|
* Copyright (c) 2010-2011, Kaori Hagihara
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -33,7 +33,6 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "boxheader_manager.h"
|
#include "boxheader_manager.h"
|
||||||
#include "opj_inttypes.h"
|
|
||||||
|
|
||||||
#ifdef SERVER
|
#ifdef SERVER
|
||||||
#include "fcgi_stdio.h"
|
#include "fcgi_stdio.h"
|
||||||
@@ -45,7 +44,7 @@
|
|||||||
#endif /*SERVER*/
|
#endif /*SERVER*/
|
||||||
|
|
||||||
|
|
||||||
boxheader_param_t * gene_boxheader( int fd, OPJ_OFF_T offset)
|
boxheader_param_t * gene_boxheader( int fd, Byte8_t offset)
|
||||||
{
|
{
|
||||||
Byte8_t boxlen;
|
Byte8_t boxlen;
|
||||||
Byte_t headlen;
|
Byte_t headlen;
|
||||||
@@ -71,14 +70,14 @@ boxheader_param_t * gene_boxheader( int fd, OPJ_OFF_T offset)
|
|||||||
return boxheader;
|
return boxheader;
|
||||||
}
|
}
|
||||||
|
|
||||||
boxheader_param_t * gene_childboxheader( box_param_t *superbox, OPJ_OFF_T offset)
|
boxheader_param_t * gene_childboxheader( box_param_t *superbox, Byte8_t offset)
|
||||||
{
|
{
|
||||||
return gene_boxheader( superbox->fd, get_DBoxoff(superbox)+offset);
|
return gene_boxheader( superbox->fd, get_DBoxoff( superbox)+offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
void print_boxheader( boxheader_param_t *boxheader)
|
void print_boxheader( boxheader_param_t *boxheader)
|
||||||
{
|
{
|
||||||
fprintf( logstream, "boxheader info:\n"
|
fprintf( logstream, "boxheader info:\n"
|
||||||
"\t type: %.4s\n"
|
"\t type: %.4s\n"
|
||||||
"\t length:%" PRId64 " %#" PRIx64 "\n", boxheader->type, boxheader->length, boxheader->length);
|
"\t length:%lld %#llx\n", boxheader->type, boxheader->length, boxheader->length);
|
||||||
}
|
}
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
/*
|
/*
|
||||||
* $Id$
|
* $Id: boxheader_manager.h 44 2011-02-15 12:32:29Z kaori $
|
||||||
*
|
*
|
||||||
* Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
|
* Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
|
||||||
* Copyright (c) 2002-2014, Professor Benoit Macq
|
* Copyright (c) 2002-2011, Professor Benoit Macq
|
||||||
* Copyright (c) 2010-2011, Kaori Hagihara
|
* Copyright (c) 2010-2011, Kaori Hagihara
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -31,7 +31,6 @@
|
|||||||
#ifndef BOXHEADER_MANAGER_H_
|
#ifndef BOXHEADER_MANAGER_H_
|
||||||
# define BOXHEADER_MANAGER_H_
|
# define BOXHEADER_MANAGER_H_
|
||||||
|
|
||||||
#include "openjpeg.h"
|
|
||||||
#include "byte_manager.h"
|
#include "byte_manager.h"
|
||||||
#include "box_manager.h"
|
#include "box_manager.h"
|
||||||
|
|
||||||
@@ -51,7 +50,7 @@ typedef struct boxheader_param{
|
|||||||
* @param[in] offset Box offset
|
* @param[in] offset Box offset
|
||||||
* @return pointer to the structure of generate box header parameters
|
* @return pointer to the structure of generate box header parameters
|
||||||
*/
|
*/
|
||||||
boxheader_param_t * gene_boxheader( int fd, OPJ_OFF_T offset);
|
boxheader_param_t * gene_boxheader( int fd, Byte8_t offset);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* generate a child box header at the given offset
|
* generate a child box header at the given offset
|
||||||
@@ -60,7 +59,7 @@ boxheader_param_t * gene_boxheader( int fd, OPJ_OFF_T offset);
|
|||||||
* @param[in] offset offset from DBox first byte of superbox
|
* @param[in] offset offset from DBox first byte of superbox
|
||||||
* @return pointer to the structure of generate box header parameters
|
* @return pointer to the structure of generate box header parameters
|
||||||
*/
|
*/
|
||||||
boxheader_param_t * gene_childboxheader( box_param_t *superbox, OPJ_OFF_T offset);
|
boxheader_param_t * gene_childboxheader( box_param_t *superbox, Byte8_t offset);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* print box header parameters
|
* print box header parameters
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
/*
|
/*
|
||||||
* $Id$
|
* $Id: byte_manager.c 44 2011-02-15 12:32:29Z kaori $
|
||||||
*
|
*
|
||||||
* Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
|
* Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
|
||||||
* Copyright (c) 2002-2014, Professor Benoit Macq
|
* Copyright (c) 2002-2011, Professor Benoit Macq
|
||||||
* Copyright (c) 2010-2011, Kaori Hagihara
|
* Copyright (c) 2010-2011, Kaori Hagihara
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -49,52 +49,52 @@
|
|||||||
#endif /*SERVER*/
|
#endif /*SERVER*/
|
||||||
|
|
||||||
|
|
||||||
Byte_t * fetch_bytes( int fd, OPJ_OFF_T offset, OPJ_SIZE_T size)
|
Byte_t * fetch_bytes( int fd, long offset, int size)
|
||||||
{
|
{
|
||||||
Byte_t *data;
|
Byte_t *data;
|
||||||
|
|
||||||
if( lseek( fd, offset, SEEK_SET)==-1){
|
if( lseek( fd, offset, SEEK_SET)==-1){
|
||||||
fprintf( FCGI_stdout, "Reason: Target broken (fseek error)\r\n");
|
fprintf( FCGI_stdout, "Reason: Target broken (fseek error)\r\n");
|
||||||
fprintf( FCGI_stderr, "Error: error in fetch_bytes( %d, %ld, %lu)\n", fd, offset, size);
|
fprintf( FCGI_stderr, "Error: error in fetch_bytes( %d, %ld, %d)\n", fd, offset, size);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
data = (Byte_t *)malloc( size);
|
data = (Byte_t *)malloc( size);
|
||||||
|
|
||||||
if( (OPJ_SIZE_T)read( fd, data, size) != size){
|
if( read( fd, data, size) != size){
|
||||||
free( data);
|
free( data);
|
||||||
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, %lu)\n", fd, offset, size);
|
fprintf( FCGI_stderr, "Error: error in fetch_bytes( %d, %ld, %d)\n", fd, offset, size);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
Byte_t fetch_1byte( int fd, OPJ_OFF_T offset)
|
Byte_t fetch_1byte( int fd, long offset)
|
||||||
{
|
{
|
||||||
Byte_t code;
|
Byte_t code;
|
||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
Byte2_t fetch_2bytebigendian( int fd, OPJ_OFF_T offset)
|
Byte2_t fetch_2bytebigendian( int fd, long offset)
|
||||||
{
|
{
|
||||||
Byte_t *data;
|
Byte_t *data;
|
||||||
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);
|
||||||
@@ -103,13 +103,13 @@ Byte2_t fetch_2bytebigendian( int fd, OPJ_OFF_T offset)
|
|||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
Byte4_t fetch_4bytebigendian( int fd, OPJ_OFF_T offset)
|
Byte4_t fetch_4bytebigendian( int fd, long offset)
|
||||||
{
|
{
|
||||||
Byte_t *data;
|
Byte_t *data;
|
||||||
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);
|
||||||
@@ -118,13 +118,13 @@ Byte4_t fetch_4bytebigendian( int fd, OPJ_OFF_T offset)
|
|||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
Byte8_t fetch_8bytebigendian( int fd, OPJ_OFF_T offset)
|
Byte8_t fetch_8bytebigendian( int fd, long offset)
|
||||||
{
|
{
|
||||||
Byte_t *data;
|
Byte_t *data;
|
||||||
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);
|
||||||
@@ -136,7 +136,7 @@ Byte8_t fetch_8bytebigendian( int fd, OPJ_OFF_T offset)
|
|||||||
|
|
||||||
Byte2_t big2( Byte_t *buf)
|
Byte2_t big2( Byte_t *buf)
|
||||||
{
|
{
|
||||||
return (Byte2_t)((((Byte2_t) buf[0]) << 8) + ((Byte2_t) buf[1]));
|
return (((Byte2_t) buf[0]) << 8) + ((Byte2_t) buf[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
Byte4_t big4( Byte_t *buf)
|
Byte4_t big4( Byte_t *buf)
|
||||||
@@ -159,7 +159,7 @@ void modify_4Bytecode( Byte4_t code, Byte_t *stream)
|
|||||||
*(stream+3) = (Byte_t) (code & 0x000000ff);
|
*(stream+3) = (Byte_t) (code & 0x000000ff);
|
||||||
}
|
}
|
||||||
|
|
||||||
OPJ_OFF_T get_filesize( int fd)
|
Byte8_t get_filesize( int fd)
|
||||||
{
|
{
|
||||||
struct stat sb;
|
struct stat sb;
|
||||||
|
|
||||||
@@ -168,5 +168,5 @@ OPJ_OFF_T get_filesize( int fd)
|
|||||||
fprintf( FCGI_stderr, "Error: error in get_filesize( %d)\n", fd);
|
fprintf( FCGI_stderr, "Error: error in get_filesize( %d)\n", fd);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return sb.st_size;
|
return (Byte8_t)sb.st_size;
|
||||||
}
|
}
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
/*
|
/*
|
||||||
* $Id$
|
* $Id: byte_manager.h 44 2011-02-15 12:32:29Z kaori $
|
||||||
*
|
*
|
||||||
* Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
|
* Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
|
||||||
* Copyright (c) 2002-2014, Professor Benoit Macq
|
* Copyright (c) 2002-2011, Professor Benoit Macq
|
||||||
* Copyright (c) 2010-2011, Kaori Hagihara
|
* Copyright (c) 2010-2011, Kaori Hagihara
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -31,13 +31,28 @@
|
|||||||
#ifndef BYTE_MANAGER_H_
|
#ifndef BYTE_MANAGER_H_
|
||||||
#define BYTE_MANAGER_H_
|
#define BYTE_MANAGER_H_
|
||||||
|
|
||||||
#include <stddef.h>
|
#include "opj_config.h"
|
||||||
#include "openjpeg.h"
|
#ifdef HAVE_STDINT_H
|
||||||
#include "opj_stdint.h"
|
#include <stdint.h>
|
||||||
typedef uint8_t Byte_t;
|
typedef uint8_t Byte_t;
|
||||||
typedef uint16_t Byte2_t;
|
typedef uint16_t Byte2_t;
|
||||||
typedef uint32_t Byte4_t;
|
typedef uint32_t Byte4_t;
|
||||||
typedef uint64_t Byte8_t;
|
typedef uint64_t Byte8_t;
|
||||||
|
#else
|
||||||
|
#if defined(_WIN32)
|
||||||
|
/** 1Byte parameter type*/
|
||||||
|
typedef unsigned __int8 Byte_t;
|
||||||
|
/** 2Byte parameter type*/
|
||||||
|
typedef unsigned __int16 Byte2_t;
|
||||||
|
/** 4Byte parameter type*/
|
||||||
|
typedef unsigned __int32 Byte4_t;
|
||||||
|
/** 8Byte parameter type*/
|
||||||
|
typedef unsigned __int64 Byte8_t;
|
||||||
|
#else
|
||||||
|
#error unsupported platform
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fetch bytes of data in file stream
|
* fetch bytes of data in file stream
|
||||||
@@ -47,7 +62,7 @@ typedef uint64_t Byte8_t;
|
|||||||
* @param[in] size Byte length
|
* @param[in] size Byte length
|
||||||
* @return pointer to the fetched data
|
* @return pointer to the fetched data
|
||||||
*/
|
*/
|
||||||
Byte_t * fetch_bytes( int fd, OPJ_OFF_T offset, OPJ_SIZE_T size);
|
Byte_t * fetch_bytes( int fd, long offset, int size);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -57,7 +72,7 @@ Byte_t * fetch_bytes( int fd, OPJ_OFF_T offset, OPJ_SIZE_T size);
|
|||||||
* @param[in] offset start Byte position
|
* @param[in] offset start Byte position
|
||||||
* @return fetched codes
|
* @return fetched codes
|
||||||
*/
|
*/
|
||||||
Byte_t fetch_1byte( int fd, OPJ_OFF_T offset);
|
Byte_t fetch_1byte( int fd, long offset);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fetch a 2-byte big endian Byte codes in file stream
|
* fetch a 2-byte big endian Byte codes in file stream
|
||||||
@@ -66,7 +81,7 @@ Byte_t fetch_1byte( int fd, OPJ_OFF_T offset);
|
|||||||
* @param[in] offset start Byte position
|
* @param[in] offset start Byte position
|
||||||
* @return fetched codes
|
* @return fetched codes
|
||||||
*/
|
*/
|
||||||
Byte2_t fetch_2bytebigendian( int fd, OPJ_OFF_T offset);
|
Byte2_t fetch_2bytebigendian( int fd, long offset);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fetch a 4-byte big endian Byte codes in file stream
|
* fetch a 4-byte big endian Byte codes in file stream
|
||||||
@@ -75,7 +90,7 @@ Byte2_t fetch_2bytebigendian( int fd, OPJ_OFF_T offset);
|
|||||||
* @param[in] offset start Byte position
|
* @param[in] offset start Byte position
|
||||||
* @return fetched codes
|
* @return fetched codes
|
||||||
*/
|
*/
|
||||||
Byte4_t fetch_4bytebigendian( int fd, OPJ_OFF_T offset);
|
Byte4_t fetch_4bytebigendian( int fd, long offset);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fetch a 8-byte big endian Byte codes in file stream
|
* fetch a 8-byte big endian Byte codes in file stream
|
||||||
@@ -84,7 +99,7 @@ Byte4_t fetch_4bytebigendian( int fd, OPJ_OFF_T offset);
|
|||||||
* @param[in] offset start Byte position
|
* @param[in] offset start Byte position
|
||||||
* @return fetched codes
|
* @return fetched codes
|
||||||
*/
|
*/
|
||||||
Byte8_t fetch_8bytebigendian( int fd, OPJ_OFF_T offset);
|
Byte8_t fetch_8bytebigendian( int fd, long offset);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -125,6 +140,6 @@ void modify_4Bytecode( Byte4_t code, Byte_t *stream);
|
|||||||
* @param[in] fd file discriptor
|
* @param[in] fd file discriptor
|
||||||
* @return file size
|
* @return file size
|
||||||
*/
|
*/
|
||||||
OPJ_OFF_T get_filesize( int fd);
|
Byte8_t get_filesize( int fd);
|
||||||
|
|
||||||
#endif /* !BYTE_MANAGER_H_ */
|
#endif /* !BYTE_MANAGER_H_ */
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
/*
|
/*
|
||||||
* $Id$
|
* $Id: cache_manager.c 53 2011-05-09 16:55:39Z kaori $
|
||||||
*
|
*
|
||||||
* Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
|
* Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
|
||||||
* Copyright (c) 2002-2014, Professor Benoit Macq
|
* Copyright (c) 2002-2011, Professor Benoit Macq
|
||||||
* Copyright (c) 2010-2011, Kaori Hagihara
|
* Copyright (c) 2010-2011, Kaori Hagihara
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "cache_manager.h"
|
#include "cache_manager.h"
|
||||||
|
|
||||||
cachelist_param_t * gene_cachelist(void)
|
cachelist_param_t * gene_cachelist()
|
||||||
{
|
{
|
||||||
cachelist_param_t *cachelist;
|
cachelist_param_t *cachelist;
|
||||||
|
|
||||||
@@ -58,7 +58,7 @@ void delete_cachelist(cachelist_param_t **cachelist)
|
|||||||
free( *cachelist);
|
free( *cachelist);
|
||||||
}
|
}
|
||||||
|
|
||||||
cache_param_t * gene_cache( const char *targetname, int csn, char *tid, char *cid)
|
cache_param_t * gene_cache( char *targetname, int csn, char *tid, char *cid)
|
||||||
{
|
{
|
||||||
cache_param_t *cache;
|
cache_param_t *cache;
|
||||||
|
|
||||||
@@ -106,7 +106,7 @@ void insert_cache_into_list( cache_param_t *cache, cachelist_param_t *cachelist)
|
|||||||
cachelist->last = cache;
|
cachelist->last = cache;
|
||||||
}
|
}
|
||||||
|
|
||||||
cache_param_t * search_cache( const char targetname[], cachelist_param_t *cachelist)
|
cache_param_t * search_cache( char targetname[], cachelist_param_t *cachelist)
|
||||||
{
|
{
|
||||||
cache_param_t *foundcache;
|
cache_param_t *foundcache;
|
||||||
|
|
||||||
@@ -140,7 +140,7 @@ cache_param_t * search_cacheBycsn( int csn, cachelist_param_t *cachelist)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
cache_param_t * search_cacheBycid( const char cid[], cachelist_param_t *cachelist)
|
cache_param_t * search_cacheBycid( char cid[], cachelist_param_t *cachelist)
|
||||||
{
|
{
|
||||||
cache_param_t *foundcache;
|
cache_param_t *foundcache;
|
||||||
int i;
|
int i;
|
||||||
@@ -159,7 +159,7 @@ cache_param_t * search_cacheBycid( const char cid[], cachelist_param_t *cachelis
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
cache_param_t * search_cacheBytid( const char tid[], cachelist_param_t *cachelist)
|
cache_param_t * search_cacheBytid( char tid[], cachelist_param_t *cachelist)
|
||||||
{
|
{
|
||||||
cache_param_t *foundcache;
|
cache_param_t *foundcache;
|
||||||
|
|
||||||
@@ -176,12 +176,12 @@ cache_param_t * search_cacheBytid( const char tid[], cachelist_param_t *cachelis
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void add_cachecid( const char *cid, cache_param_t *cache)
|
void add_cachecid( char *cid, cache_param_t *cache)
|
||||||
{
|
{
|
||||||
if( !cid)
|
if( !cid)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if( (cache->cid = realloc( cache->cid, (OPJ_SIZE_T)(cache->numOfcid+1)*sizeof(char *))) == NULL){
|
if( (cache->cid = realloc( cache->cid, (cache->numOfcid+1)*sizeof(char *))) == NULL){
|
||||||
fprintf( stderr, "failed to add new cid to cache table in add_cachecid()\n");
|
fprintf( stderr, "failed to add new cid to cache table in add_cachecid()\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -191,7 +191,7 @@ void add_cachecid( const char *cid, cache_param_t *cache)
|
|||||||
cache->numOfcid ++;
|
cache->numOfcid ++;
|
||||||
}
|
}
|
||||||
|
|
||||||
void update_cachetid( const char *tid, cache_param_t *cache)
|
void update_cachetid( char *tid, cache_param_t *cache)
|
||||||
{
|
{
|
||||||
if( !tid)
|
if( !tid)
|
||||||
return;
|
return;
|
||||||
@@ -203,9 +203,9 @@ void update_cachetid( const char *tid, cache_param_t *cache)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void remove_cidInCache( const char *cid, cache_param_t *cache);
|
void remove_cidInCache( char *cid, cache_param_t *cache);
|
||||||
|
|
||||||
void remove_cachecid( const char *cid, cachelist_param_t *cachelist)
|
void remove_cachecid( char *cid, cachelist_param_t *cachelist)
|
||||||
{
|
{
|
||||||
cache_param_t *cache;
|
cache_param_t *cache;
|
||||||
|
|
||||||
@@ -213,7 +213,7 @@ void remove_cachecid( const char *cid, cachelist_param_t *cachelist)
|
|||||||
remove_cidInCache( cid, cache);
|
remove_cidInCache( cid, cache);
|
||||||
}
|
}
|
||||||
|
|
||||||
void remove_cidInCache( const char *cid, cache_param_t *cache)
|
void remove_cidInCache( char *cid, cache_param_t *cache)
|
||||||
{
|
{
|
||||||
int idx = -1;
|
int idx = -1;
|
||||||
char **tmp;
|
char **tmp;
|
||||||
@@ -232,7 +232,7 @@ void remove_cidInCache( const char *cid, cache_param_t *cache)
|
|||||||
|
|
||||||
tmp = cache->cid;
|
tmp = cache->cid;
|
||||||
|
|
||||||
cache->cid = (char **)malloc( (OPJ_SIZE_T)(cache->numOfcid-1)*sizeof(char *));
|
cache->cid = (char **)malloc( (cache->numOfcid-1)*sizeof(char *));
|
||||||
|
|
||||||
for( i=0, j=0; i<cache->numOfcid; i++){
|
for( i=0, j=0; i<cache->numOfcid; i++){
|
||||||
if( i != idx){
|
if( i != idx){
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
/*
|
/*
|
||||||
* $Id$
|
* $Id: cache_manager.h 44 2011-02-15 12:32:29Z kaori $
|
||||||
*
|
*
|
||||||
* Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
|
* Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
|
||||||
* Copyright (c) 2002-2014, Professor Benoit Macq
|
* Copyright (c) 2002-2011, Professor Benoit Macq
|
||||||
* Copyright (c) 2010-2011, Kaori Hagihara
|
* Copyright (c) 2010-2011, Kaori Hagihara
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -58,7 +58,7 @@ typedef struct cachelist_param{
|
|||||||
*
|
*
|
||||||
* @return pointer to the generated cache list
|
* @return pointer to the generated cache list
|
||||||
*/
|
*/
|
||||||
cachelist_param_t * gene_cachelist(void);
|
cachelist_param_t * gene_cachelist();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* delete cache list
|
* delete cache list
|
||||||
@@ -76,7 +76,7 @@ void delete_cachelist(cachelist_param_t **cachelist);
|
|||||||
* @param[in] cid channel identifier
|
* @param[in] cid channel identifier
|
||||||
* @return pointer to the generated cache
|
* @return pointer to the generated cache
|
||||||
*/
|
*/
|
||||||
cache_param_t * gene_cache( const char *targetname, int csn, char *tid, char *cid);
|
cache_param_t * gene_cache( char *targetname, int csn, char *tid, char *cid);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* delete a cache
|
* delete a cache
|
||||||
@@ -101,7 +101,7 @@ void insert_cache_into_list( cache_param_t *cache, cachelist_param_t *cachelist)
|
|||||||
* @param[in] cachelist cache list pointer
|
* @param[in] cachelist cache list pointer
|
||||||
* @return found cache pointer
|
* @return found cache pointer
|
||||||
*/
|
*/
|
||||||
cache_param_t * search_cache( const char targetname[], cachelist_param_t *cachelist);
|
cache_param_t * search_cache( char targetname[], cachelist_param_t *cachelist);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -121,7 +121,7 @@ cache_param_t * search_cacheBycsn( int csn, cachelist_param_t *cachelist);
|
|||||||
* @param[in] cachelist cache list pointer
|
* @param[in] cachelist cache list pointer
|
||||||
* @return found cache pointer
|
* @return found cache pointer
|
||||||
*/
|
*/
|
||||||
cache_param_t * search_cacheBycid( const char cid[], cachelist_param_t *cachelist);
|
cache_param_t * search_cacheBycid( char cid[], cachelist_param_t *cachelist);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -131,7 +131,7 @@ cache_param_t * search_cacheBycid( const char cid[], cachelist_param_t *cachelis
|
|||||||
* @param[in] cachelist cache list pointer
|
* @param[in] cachelist cache list pointer
|
||||||
* @return found cache pointer
|
* @return found cache pointer
|
||||||
*/
|
*/
|
||||||
cache_param_t * search_cacheBytid( const char tid[], cachelist_param_t *cachelist);
|
cache_param_t * search_cacheBytid( char tid[], cachelist_param_t *cachelist);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* add cid into a cache
|
* add cid into a cache
|
||||||
@@ -139,7 +139,7 @@ cache_param_t * search_cacheBytid( const char tid[], cachelist_param_t *cachelis
|
|||||||
* @param[in] cid channel identifier
|
* @param[in] cid channel identifier
|
||||||
* @param[in] cache cache pointer
|
* @param[in] cache cache pointer
|
||||||
*/
|
*/
|
||||||
void add_cachecid( const char *cid, cache_param_t *cache);
|
void add_cachecid( char *cid, cache_param_t *cache);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -148,7 +148,7 @@ void add_cachecid( const char *cid, cache_param_t *cache);
|
|||||||
* @param[in] tid target identifier
|
* @param[in] tid target identifier
|
||||||
* @param[in] cache cache pointer
|
* @param[in] cache cache pointer
|
||||||
*/
|
*/
|
||||||
void update_cachetid( const char *tid, cache_param_t *cache);
|
void update_cachetid( char *tid, cache_param_t *cache);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -157,7 +157,7 @@ void update_cachetid( const char *tid, cache_param_t *cache);
|
|||||||
* @param[in] cid channel identifier
|
* @param[in] cid channel identifier
|
||||||
* @param[in] cachelist cachelist pointer
|
* @param[in] cachelist cachelist pointer
|
||||||
*/
|
*/
|
||||||
void remove_cachecid( const char *cid, cachelist_param_t *cachelist);
|
void remove_cachecid( char *cid, cachelist_param_t *cachelist);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
/*
|
/*
|
||||||
* $Id$
|
* $Id$
|
||||||
*
|
*
|
||||||
* Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
|
* Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
|
||||||
* Copyright (c) 2002-2014, Professor Benoit Macq
|
* Copyright (c) 2002-2011, Professor Benoit Macq
|
||||||
* Copyright (c) 2010-2011, Kaori Hagihara
|
* Copyright (c) 2010-2011, Kaori Hagihara
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -32,7 +32,6 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "cachemodel_manager.h"
|
#include "cachemodel_manager.h"
|
||||||
#include "faixbox_manager.h"
|
#include "faixbox_manager.h"
|
||||||
#include "opj_inttypes.h"
|
|
||||||
|
|
||||||
#ifdef SERVER
|
#ifdef SERVER
|
||||||
#include "fcgi_stdio.h"
|
#include "fcgi_stdio.h"
|
||||||
@@ -48,7 +47,7 @@ cachemodellist_param_t * gene_cachemodellist(void)
|
|||||||
{
|
{
|
||||||
cachemodellist_param_t *cachemodellist;
|
cachemodellist_param_t *cachemodellist;
|
||||||
|
|
||||||
cachemodellist = (cachemodellist_param_t *)opj_malloc( sizeof(cachemodellist_param_t));
|
cachemodellist = (cachemodellist_param_t *)malloc( sizeof(cachemodellist_param_t));
|
||||||
|
|
||||||
cachemodellist->first = NULL;
|
cachemodellist->first = NULL;
|
||||||
cachemodellist->last = NULL;
|
cachemodellist->last = NULL;
|
||||||
@@ -56,7 +55,7 @@ cachemodellist_param_t * gene_cachemodellist(void)
|
|||||||
return cachemodellist;
|
return cachemodellist;
|
||||||
}
|
}
|
||||||
|
|
||||||
cachemodel_param_t * gene_cachemodel( cachemodellist_param_t *cachemodellist, target_param_t *target, OPJ_BOOL reqJPP)
|
cachemodel_param_t * gene_cachemodel( cachemodellist_param_t *cachemodellist, target_param_t *target, bool reqJPP)
|
||||||
{
|
{
|
||||||
cachemodel_param_t *cachemodel;
|
cachemodel_param_t *cachemodel;
|
||||||
faixbox_param_t *tilepart;
|
faixbox_param_t *tilepart;
|
||||||
@@ -65,33 +64,33 @@ cachemodel_param_t * gene_cachemodel( cachemodellist_param_t *cachemodellist, ta
|
|||||||
Byte8_t numOftiles;
|
Byte8_t numOftiles;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
cachemodel = (cachemodel_param_t *)opj_malloc( sizeof(cachemodel_param_t));
|
cachemodel = (cachemodel_param_t *)malloc( sizeof(cachemodel_param_t));
|
||||||
|
|
||||||
refer_target( target, &cachemodel->target);
|
refer_target( target, &cachemodel->target);
|
||||||
|
|
||||||
if( reqJPP){
|
if( reqJPP){
|
||||||
if( target->jppstream)
|
if( target->jppstream)
|
||||||
cachemodel->jppstream = OPJ_TRUE;
|
cachemodel->jppstream = true;
|
||||||
else
|
else
|
||||||
cachemodel->jppstream = OPJ_FALSE;
|
cachemodel->jppstream = false;
|
||||||
} else{ /* reqJPT */
|
} else{ /* reqJPT */
|
||||||
if( target->jptstream)
|
if( target->jptstream)
|
||||||
cachemodel->jppstream = OPJ_FALSE;
|
cachemodel->jppstream = false;
|
||||||
else
|
else
|
||||||
cachemodel->jppstream = OPJ_TRUE;
|
cachemodel->jppstream = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
cachemodel->mhead_model = OPJ_FALSE;
|
cachemodel->mhead_model = false;
|
||||||
|
|
||||||
tilepart = target->codeidx->tilepart;
|
tilepart = target->codeidx->tilepart;
|
||||||
numOftiles = get_m( tilepart);
|
numOftiles = get_m( tilepart);
|
||||||
numOfelem = get_nmax( tilepart)*numOftiles;
|
numOfelem = get_nmax( tilepart)*numOftiles;
|
||||||
cachemodel->tp_model = (OPJ_BOOL *)opj_calloc( 1, numOfelem*sizeof(OPJ_BOOL));
|
cachemodel->tp_model = (bool *)calloc( 1, numOfelem*sizeof(bool));
|
||||||
cachemodel->th_model = (OPJ_BOOL *)opj_calloc( 1, numOftiles*sizeof(OPJ_BOOL));
|
cachemodel->th_model = (bool *)calloc( 1, numOftiles*sizeof(bool));
|
||||||
cachemodel->pp_model = (OPJ_BOOL **)opj_malloc( target->codeidx->SIZ.Csiz*sizeof(OPJ_BOOL *));
|
cachemodel->pp_model = (bool **)malloc( target->codeidx->SIZ.Csiz*sizeof(bool *));
|
||||||
for( i=0; i<target->codeidx->SIZ.Csiz; i++){
|
for( i=0; i<target->codeidx->SIZ.Csiz; i++){
|
||||||
precpacket = target->codeidx->precpacket[i];
|
precpacket = target->codeidx->precpacket[i];
|
||||||
cachemodel->pp_model[i] = (OPJ_BOOL *)opj_calloc( 1, get_nmax(precpacket)*get_m(precpacket)*sizeof(OPJ_BOOL));
|
cachemodel->pp_model[i] = (bool *)calloc( 1, get_nmax(precpacket)*get_m(precpacket)*sizeof(bool));
|
||||||
}
|
}
|
||||||
cachemodel->next = NULL;
|
cachemodel->next = NULL;
|
||||||
|
|
||||||
@@ -137,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.%" PRIu64 " %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.%" PRIu64 ": ", 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]);
|
||||||
@@ -174,7 +173,7 @@ void delete_cachemodellist( cachemodellist_param_t **cachemodellist)
|
|||||||
delete_cachemodel( &cachemodelPtr);
|
delete_cachemodel( &cachemodelPtr);
|
||||||
cachemodelPtr=cachemodelNext;
|
cachemodelPtr=cachemodelNext;
|
||||||
}
|
}
|
||||||
opj_free(*cachemodellist);
|
free(*cachemodellist);
|
||||||
}
|
}
|
||||||
|
|
||||||
void delete_cachemodel( cachemodel_param_t **cachemodel)
|
void delete_cachemodel( cachemodel_param_t **cachemodel)
|
||||||
@@ -183,20 +182,20 @@ void delete_cachemodel( cachemodel_param_t **cachemodel)
|
|||||||
|
|
||||||
unrefer_target( (*cachemodel)->target);
|
unrefer_target( (*cachemodel)->target);
|
||||||
|
|
||||||
opj_free( (*cachemodel)->tp_model);
|
free( (*cachemodel)->tp_model);
|
||||||
opj_free( (*cachemodel)->th_model);
|
free( (*cachemodel)->th_model);
|
||||||
|
|
||||||
for( i=0; i<(*cachemodel)->target->codeidx->SIZ.Csiz; i++)
|
for( i=0; i<(*cachemodel)->target->codeidx->SIZ.Csiz; i++)
|
||||||
opj_free( (*cachemodel)->pp_model[i]);
|
free( (*cachemodel)->pp_model[i]);
|
||||||
opj_free( (*cachemodel)->pp_model);
|
free( (*cachemodel)->pp_model);
|
||||||
|
|
||||||
#ifndef SERVER
|
#ifndef SERVER
|
||||||
fprintf( logstream, "local log: cachemodel deleted\n");
|
fprintf( logstream, "local log: cachemodel deleted\n");
|
||||||
#endif
|
#endif
|
||||||
opj_free( *cachemodel);
|
free( *cachemodel);
|
||||||
}
|
}
|
||||||
|
|
||||||
OPJ_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 */
|
||||||
@@ -207,30 +206,30 @@ OPJ_BOOL is_allsent( cachemodel_param_t cachemodel)
|
|||||||
target = cachemodel.target;
|
target = cachemodel.target;
|
||||||
|
|
||||||
if( !cachemodel.mhead_model)
|
if( !cachemodel.mhead_model)
|
||||||
return OPJ_FALSE;
|
return false;
|
||||||
|
|
||||||
TPnum = get_nmax( target->codeidx->tilepart);
|
TPnum = get_nmax( target->codeidx->tilepart);
|
||||||
|
|
||||||
if( cachemodel.jppstream){
|
if( cachemodel.jppstream){
|
||||||
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++){
|
||||||
if( !cachemodel.th_model[i])
|
if( !cachemodel.th_model[i])
|
||||||
return OPJ_FALSE;
|
return false;
|
||||||
|
|
||||||
for( j=0; j<target->codeidx->SIZ.Csiz; j++){
|
for( j=0; j<target->codeidx->SIZ.Csiz; 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++)
|
||||||
if( !cachemodel.pp_model[j][i*Pmax+k])
|
if( !cachemodel.pp_model[j][i*Pmax+k])
|
||||||
return OPJ_FALSE;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return OPJ_TRUE;
|
return true;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
for( i=0, n=0; i<target->codeidx->SIZ.YTnum; i++)
|
for( i=0, n=0; i<target->codeidx->SIZ.YTnum; i++)
|
||||||
for( j=0; j<target->codeidx->SIZ.XTnum; j++)
|
for( j=0; j<target->codeidx->SIZ.XTnum; j++)
|
||||||
for( k=0; k<TPnum; k++)
|
for( k=0; k<TPnum; k++)
|
||||||
if( !cachemodel.tp_model[n++])
|
if( !cachemodel.tp_model[n++])
|
||||||
return OPJ_FALSE;
|
return false;
|
||||||
return OPJ_TRUE;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||