Compare commits
2339 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1f1e968269 | ||
|
|
54941adbee | ||
|
|
4142ac60d6 | ||
|
|
ac927f2eee | ||
|
|
1be0128fab | ||
|
|
f053508f6f | ||
|
|
7a5fb35b8d | ||
|
|
39f9934a70 | ||
|
|
04a00aab65 | ||
|
|
b7d73d7b25 | ||
|
|
25966346f7 | ||
|
|
d8ae42d808 | ||
|
|
43557dcd3b | ||
|
|
0b7aad3231 | ||
|
|
5e58b30b8b | ||
|
|
ee458b5fd0 | ||
|
|
21a02aa5be | ||
|
|
bf845a3892 | ||
|
|
b75acb3bb9 | ||
|
|
2978541ea2 | ||
|
|
53b4bf29ca | ||
|
|
5196bda0b9 | ||
|
|
3547402709 | ||
|
|
d60b7aa130 | ||
|
|
98a97cef6b | ||
|
|
c8fbf0f516 | ||
|
|
4d2527aa61 | ||
|
|
f62b810892 | ||
|
|
4daf9a8d88 | ||
|
|
f31c327213 | ||
|
|
eebd59a6d6 | ||
|
|
ae2095ef14 | ||
|
|
37b1679a27 | ||
|
|
0fac6e4222 | ||
|
|
76fa5c5639 | ||
|
|
6221641a2c | ||
|
|
0a2178fa27 | ||
|
|
53f25200ed | ||
|
|
fef144283f | ||
|
|
4c5a1cc825 | ||
|
|
bd96ed8353 | ||
|
|
f4a708ba0f | ||
|
|
2372cb78a0 | ||
|
|
9d5002f8fd | ||
|
|
e4c74f5364 | ||
|
|
cb72c08472 | ||
|
|
898ca6f522 | ||
|
|
86698be6e9 | ||
|
|
cdcb77e796 | ||
|
|
954dad66de | ||
|
|
48744a1342 | ||
|
|
788dff0a36 | ||
|
|
d0babeb6f6 | ||
|
|
5a0620026f | ||
|
|
620b06f566 | ||
|
|
b3a8a69503 | ||
|
|
5b9bf39408 | ||
|
|
65e214efd3 | ||
|
|
e0d2a7bd8c | ||
|
|
177fdd94c0 | ||
|
|
a091186825 | ||
|
|
517d57ef1f | ||
|
|
7c41a1e393 | ||
|
|
7269c8f7a6 | ||
|
|
a66c391519 | ||
|
|
9c8ab8bd2e | ||
|
|
595f0e1b2b | ||
|
|
7219854639 | ||
|
|
9466d3100e | ||
|
|
d1ca2b4f29 | ||
|
|
8ba0de3e45 | ||
|
|
2e0779e250 | ||
|
|
e55130d3c5 | ||
|
|
58320d2f3b | ||
|
|
4d2b6a671a | ||
|
|
aae066debc | ||
|
|
6609719b40 | ||
|
|
1a8318f6c2 | ||
|
|
162f6199c0 | ||
|
|
8f9cc62b3f | ||
|
|
44a499f2ac | ||
|
|
94cfb1b008 | ||
|
|
17a0a8a195 | ||
|
|
ba0cf122f6 | ||
|
|
da56086e01 | ||
|
|
04b8cbd27a | ||
|
|
e1e018a8dc | ||
|
|
b51d088267 | ||
|
|
4f11e89c80 | ||
|
|
9a20f8e8d1 | ||
|
|
72deb588cb | ||
|
|
cd77b6003b | ||
|
|
f40a2ff2ad | ||
|
|
be42e72d22 | ||
|
|
15f081c896 | ||
|
|
ad593c9e06 | ||
|
|
319fc971fe | ||
|
|
e166e4a209 | ||
|
|
29313eb5f1 | ||
|
|
e982d03966 | ||
|
|
66fd497765 | ||
|
|
20789fed4e | ||
|
|
5947e10ff7 | ||
|
|
e6881e7527 | ||
|
|
2296dc9e68 | ||
|
|
6f2ac3ee36 | ||
|
|
c559c62853 | ||
|
|
a9feb9addd | ||
|
|
74e814358c | ||
|
|
54393d9e38 | ||
|
|
06e8dc9edd | ||
|
|
f5446fdcfb | ||
|
|
8611d127db | ||
|
|
889bf16791 | ||
|
|
6ea2ff0b06 | ||
|
|
3436c4e9ba | ||
|
|
e1a93d9e59 | ||
|
|
a1c0ee9a86 | ||
|
|
40b5a53d2f | ||
|
|
e7797b97a1 | ||
|
|
5e5f6999a8 | ||
|
|
0069a2bd2f | ||
|
|
e3100f714c | ||
|
|
5611209f12 | ||
|
|
5ce71e1ec9 | ||
|
|
9701c19323 | ||
|
|
5c5ae1d51a | ||
|
|
c84747e580 | ||
|
|
3767af52de | ||
|
|
1b86fb6f48 | ||
|
|
a42d03df79 | ||
|
|
cb33ff43bb | ||
|
|
6a1974d40d | ||
|
|
87c0d7dc1e | ||
|
|
0dd44e7dba | ||
|
|
9cad6bc1f6 | ||
|
|
79b1c4cc85 | ||
|
|
c00ee8bff7 | ||
|
|
a205f70328 | ||
|
|
9c5b30005e | ||
|
|
83e5e2703e | ||
|
|
3a0253f4e2 | ||
|
|
99c4f621bd | ||
|
|
2e4fadf330 | ||
|
|
8f9905936c | ||
|
|
a834ab305f | ||
|
|
51efe91971 | ||
|
|
4ddc2627dd | ||
|
|
5d56fb3115 | ||
|
|
51cbcd5748 | ||
|
|
f51d52f85a | ||
|
|
c414d9c238 | ||
|
|
e5ca873ab1 | ||
|
|
601aa38c30 | ||
|
|
fb4be3894e | ||
|
|
c37d69b25e | ||
|
|
a77717583e | ||
|
|
968085190c | ||
|
|
93a61459cd | ||
|
|
38ffbbe42e | ||
|
|
ce26e523dd | ||
|
|
7dfcbf9d7b | ||
|
|
4ac509182a | ||
|
|
0ae66e891a | ||
|
|
9f78c68953 | ||
|
|
f080ab8ce0 | ||
|
|
e975ca2832 | ||
|
|
b06bed7b7b | ||
|
|
b7a162348d | ||
|
|
540aa58f6c | ||
|
|
d48be27f5a | ||
|
|
eaf55b677c | ||
|
|
0967d64854 | ||
|
|
5799672237 | ||
|
|
a1fc83cc25 | ||
|
|
ad7eb5630e | ||
|
|
4831badeb4 | ||
|
|
80be580d50 | ||
|
|
05b3afd28f | ||
|
|
e1122a8f50 | ||
|
|
f9d47e28b9 | ||
|
|
8034ffde8b | ||
|
|
b3a15954f6 | ||
|
|
83249c318f | ||
|
|
b1a8e1adcb | ||
|
|
ee04854e1a | ||
|
|
b3c581760f | ||
|
|
bd3959dc77 | ||
|
|
fd424cfb66 | ||
|
|
e734f0522a | ||
|
|
9729405a8f | ||
|
|
65f78eaa73 | ||
|
|
08238dbed6 | ||
|
|
c8d03fea9b | ||
|
|
6721f8a53f | ||
|
|
54a5860ee2 | ||
|
|
372fead0d7 | ||
|
|
98324bbd6b | ||
|
|
522d13af2a | ||
|
|
26dcb7c125 | ||
|
|
51a67a9cbf | ||
|
|
dd81b5892d | ||
|
|
0cd240e2e3 | ||
|
|
dac03fd168 | ||
|
|
d02bf257a6 | ||
|
|
0f1b1c63b4 | ||
|
|
11a27e6d20 | ||
|
|
ab8929262a | ||
|
|
813121e688 | ||
|
|
7a7901cd6d | ||
|
|
c5a8732b0e | ||
|
|
101a0034e2 | ||
|
|
2c8ba10cc9 | ||
|
|
30a0180d84 | ||
|
|
99c4376aed | ||
|
|
c3493063b9 | ||
|
|
4042210416 | ||
|
|
dc869c2985 | ||
|
|
caeb91121a | ||
|
|
891e7c298a | ||
|
|
d60937922f | ||
|
|
229d9cdb9c | ||
|
|
f0a980ec16 | ||
|
|
cc9bf1d557 | ||
|
|
a01f7cdee0 | ||
|
|
d753441028 | ||
|
|
53d7f70c15 | ||
|
|
70a16d80d9 | ||
|
|
4560d270e0 | ||
|
|
f33f50126c | ||
|
|
8d2019ae73 | ||
|
|
cf6db1641a | ||
|
|
9df5546838 | ||
|
|
b816ac185b | ||
|
|
d92c2b2117 | ||
|
|
d035952c52 | ||
|
|
1ed6ede703 | ||
|
|
d03c4770cb | ||
|
|
50b561e911 | ||
|
|
2d410fc74b | ||
|
|
d5c460fc5f | ||
|
|
62006e2b26 | ||
|
|
d05b19072d | ||
|
|
32ac092dec | ||
|
|
27102f0b06 | ||
|
|
87d44603a0 | ||
|
|
74f71ec923 | ||
|
|
5c3632b00e | ||
|
|
a4eade843f | ||
|
|
cba89a62a1 | ||
|
|
4123c0ba86 | ||
|
|
1a9cb9aef7 | ||
|
|
0dc4914b4e | ||
|
|
e224dee4b8 | ||
|
|
d2ddf006a6 | ||
|
|
a7ae153a46 | ||
|
|
de0a9ed103 | ||
|
|
553714a87a | ||
|
|
1b2ebfc69a | ||
|
|
3259fe2ff8 | ||
|
|
bbef2a9da3 | ||
|
|
5b6ff103bd | ||
|
|
c86827952f | ||
|
|
9b437b0c6a | ||
|
|
c8ae3c5225 | ||
|
|
07f65540b5 | ||
|
|
8414870ca7 | ||
|
|
2dab5fed59 | ||
|
|
26b2728c49 | ||
|
|
e526d435cc | ||
|
|
f8c8222660 | ||
|
|
d6b51b7041 | ||
|
|
987f96004f | ||
|
|
0b6a592372 | ||
|
|
83c9e0b1f2 | ||
|
|
db23831d57 | ||
|
|
0cfe2ca4a9 | ||
|
|
cf352af089 | ||
|
|
c59f464a3f | ||
|
|
05235963d9 | ||
|
|
99fc1ab306 | ||
|
|
f7dbcf1512 | ||
|
|
838dfb8058 | ||
|
|
4da7e9617f | ||
|
|
b9ca882749 | ||
|
|
f9df8ba19a | ||
|
|
09c35dcb84 | ||
|
|
f82d7f3a63 | ||
|
|
faf63fddad | ||
|
|
281537851b | ||
|
|
55dbf8acff | ||
|
|
c16c91797f | ||
|
|
a4e93c3b0a | ||
|
|
4bb5e24d23 | ||
|
|
6cb56b36f6 | ||
|
|
9c911c0e1e | ||
|
|
3ea4486bed | ||
|
|
6e11b55441 | ||
|
|
c6b2fdf572 | ||
|
|
700f8cb4f8 | ||
|
|
7d32f11a6f | ||
|
|
b4e8a425ae | ||
|
|
c8a3117659 | ||
|
|
49cbc11a19 | ||
|
|
3d295431e6 | ||
|
|
c08bd89739 | ||
|
|
1621df453d | ||
|
|
0b611c5250 | ||
|
|
b8ba5a8357 | ||
|
|
9add0fe298 | ||
|
|
ecb00ea4e4 | ||
|
|
cde7423958 | ||
|
|
6c157b60f2 | ||
|
|
fc131a1339 | ||
|
|
4f157f3cf0 | ||
|
|
41730e8cc6 | ||
|
|
82c238f504 | ||
|
|
52c36b4955 | ||
|
|
b7069ce2b2 | ||
|
|
cc2ae75450 | ||
|
|
b97aadcf3e | ||
|
|
1e2dcaf7b3 | ||
|
|
175eceb020 | ||
|
|
7981908754 | ||
|
|
9258f8f6a7 | ||
|
|
41a96aee5a | ||
|
|
897d2c0b75 | ||
|
|
e3579b6c1d | ||
|
|
8d46ac19ff | ||
|
|
4b02d246a4 | ||
|
|
47b7b2787b | ||
|
|
c31a28fcd1 | ||
|
|
cd10f46572 | ||
|
|
29ce132df4 | ||
|
|
5d953558de | ||
|
|
bac2c9e0a3 | ||
|
|
ee0f313848 | ||
|
|
ccdce606f1 | ||
|
|
d7d9f84707 | ||
|
|
4cde646cd7 | ||
|
|
5f02757eef | ||
|
|
4f5ec07c31 | ||
|
|
0a27667878 | ||
|
|
66d890bf22 | ||
|
|
dd00120e96 | ||
|
|
e71247bb90 | ||
|
|
a024980007 | ||
|
|
dc46d267f0 | ||
|
|
c32809d464 | ||
|
|
5be56d582c | ||
|
|
bd291ae5a8 | ||
|
|
f1ba09f690 | ||
|
|
4eabbc8661 | ||
|
|
e4be47279d | ||
|
|
29c644ec49 | ||
|
|
940100c28a | ||
|
|
c31fb68ccc | ||
|
|
15d07f33d1 | ||
|
|
c5dd6035c9 | ||
|
|
2eb97a851d | ||
|
|
8a95efcd3f | ||
|
|
38770403d4 | ||
|
|
589cc547b9 | ||
|
|
a521472427 | ||
|
|
d4ac2f613d | ||
|
|
fa9142b7e4 | ||
|
|
f98df1c715 | ||
|
|
3109759fd7 | ||
|
|
0a4ac0852a | ||
|
|
dc34a6cc8c | ||
|
|
238f4419ab | ||
|
|
60301842c7 | ||
|
|
acbb297a0a | ||
|
|
4fc1073809 | ||
|
|
7c688c3453 | ||
|
|
372c887aad | ||
|
|
0df90afdf7 | ||
|
|
75a33de3bc | ||
|
|
f026c0541e | ||
|
|
e4735c703d | ||
|
|
ae7953849b | ||
|
|
1947323329 | ||
|
|
c3d9719cd4 | ||
|
|
2263b6bacc | ||
|
|
5b66156be4 | ||
|
|
b0035538af | ||
|
|
45ccf501f0 | ||
|
|
15e4168ee2 | ||
|
|
2452bb7c45 | ||
|
|
85904a3291 | ||
|
|
012f22958a | ||
|
|
f3dad25c77 | ||
|
|
e6cf1744d4 | ||
|
|
db9b3400e5 | ||
|
|
c423cc84e7 | ||
|
|
d87de3a88d | ||
|
|
6007ac5c56 | ||
|
|
335e972554 | ||
|
|
8c4afeff40 | ||
|
|
ffd9db9700 | ||
|
|
b190a91ab5 | ||
|
|
f6843d5511 | ||
|
|
a56819eaab | ||
|
|
d6f2d26430 | ||
|
|
9ac3a1572e | ||
|
|
0905cab40a | ||
|
|
2fc9d4956a | ||
|
|
28c6f54798 | ||
|
|
2c7dab7655 | ||
|
|
96ae1b8dfc | ||
|
|
1bbb607069 | ||
|
|
fd1f7cf297 | ||
|
|
5bb074611a | ||
|
|
46c1dd22fc | ||
|
|
06f6911d7b | ||
|
|
ae4799ad07 | ||
|
|
b88025b38f | ||
|
|
b59085db0c | ||
|
|
8048bbc7a2 | ||
|
|
d1591be3d7 | ||
|
|
6b7ad74e26 | ||
|
|
635a358962 | ||
|
|
8f798864a9 | ||
|
|
ac9fb5a302 | ||
|
|
775ee87776 | ||
|
|
0b1f8eb6f7 | ||
|
|
c887df12a3 | ||
|
|
d1b053afe2 | ||
|
|
5e1474cc92 | ||
|
|
dc43ebf96c | ||
|
|
a7060dae1c | ||
|
|
ba05549b0f | ||
|
|
fb0e397330 | ||
|
|
35ddb3abc7 | ||
|
|
237ddd72f1 | ||
|
|
c999b6c0f0 | ||
|
|
4e0de649bd | ||
|
|
6b0a8e3a0f | ||
|
|
eadfad7a50 | ||
|
|
14361eee24 | ||
|
|
c9e231508b | ||
|
|
6347686385 | ||
|
|
1a8f929111 | ||
|
|
56d3f5af6e | ||
|
|
c665e81a39 | ||
|
|
c6c49865fe | ||
|
|
52d27be5c2 | ||
|
|
6e0118231a | ||
|
|
da3786d2d1 | ||
|
|
8d770ece9a | ||
|
|
0a0cb190da | ||
|
|
79b079bdc0 | ||
|
|
dbb67194b2 | ||
|
|
c255e0140c | ||
|
|
2bd6aa54d6 | ||
|
|
c7535d084e | ||
|
|
c0d7afe15c | ||
|
|
6def7e38b4 | ||
|
|
73881d0e52 | ||
|
|
e3291c4e1f | ||
|
|
0fa5a17c98 | ||
|
|
757f9394bf | ||
|
|
daed8cc919 | ||
|
|
d1a941ea50 | ||
|
|
00a47c1e06 | ||
|
|
1fb24aba4b | ||
|
|
2d24b6000d | ||
|
|
8b5e2a5143 | ||
|
|
3ed5858902 | ||
|
|
7a8cdc4bb0 | ||
|
|
4c0ed02806 | ||
|
|
5d00b719f4 | ||
|
|
42132ed6b5 | ||
|
|
31f5efe453 | ||
|
|
78a7762e3f | ||
|
|
33f52fb611 | ||
|
|
81abe5b3bb | ||
|
|
4a09296771 | ||
|
|
6922124c4c | ||
|
|
59b844347c | ||
|
|
bde5ba6ae8 | ||
|
|
16240e21f9 | ||
|
|
33a0e66eb1 | ||
|
|
f7ff08de5a | ||
|
|
f1bae45c76 | ||
|
|
65c07b42e3 | ||
|
|
3888daac6a | ||
|
|
e966fef3eb | ||
|
|
a504edf724 | ||
|
|
dde788b59e | ||
|
|
58fc86452d | ||
|
|
c0cb119c0e | ||
|
|
9a21e1eef0 | ||
|
|
a0688a9874 | ||
|
|
d0ce2ced53 | ||
|
|
e05d2901ec | ||
|
|
c0710f557c | ||
|
|
f095027329 | ||
|
|
8d320bbdf8 | ||
|
|
776b83ddbc | ||
|
|
04ace2a558 | ||
|
|
46afb746f0 | ||
|
|
570dd13f55 | ||
|
|
63f877769c | ||
|
|
04c6bb4a72 | ||
|
|
131cc98491 | ||
|
|
13bcb63b73 | ||
|
|
0ba5d15b58 | ||
|
|
7e38446075 | ||
|
|
548aff34f4 | ||
|
|
8397eac382 | ||
|
|
a2c2d86d3d | ||
|
|
3bc360fc9d | ||
|
|
ae1da37558 | ||
|
|
f57f59b10d | ||
|
|
b65e3ebdb6 | ||
|
|
50acc339c5 | ||
|
|
f123ce8f8a | ||
|
|
c3629e37a2 | ||
|
|
cf5153c518 | ||
|
|
3b7dced8e6 | ||
|
|
03a410e03d | ||
|
|
0a6eaaa605 | ||
|
|
7f8f284ee5 | ||
|
|
09fb8b6989 | ||
|
|
9e6c62199a | ||
|
|
d47f7a249d | ||
|
|
7280263988 | ||
|
|
3e1fad2da4 | ||
|
|
d72940c56b | ||
|
|
ad4fad0965 | ||
|
|
aff9cb39ed | ||
|
|
0a3f234df7 | ||
|
|
efb70af001 | ||
|
|
e65303b903 | ||
|
|
413de4fbfa | ||
|
|
984351f86f | ||
|
|
f8796711e8 | ||
|
|
0b540067b1 | ||
|
|
3df347eded | ||
|
|
eb7c6d295a | ||
|
|
f126eb0d41 | ||
|
|
7256e43c48 | ||
|
|
a0a3af1dee | ||
|
|
48832d944f | ||
|
|
06bd61b571 | ||
|
|
a1c754c737 | ||
|
|
fef1276901 | ||
|
|
45f33cdbd6 | ||
|
|
1acfa211ae | ||
|
|
2f3fd1194e | ||
|
|
f08af3ed82 | ||
|
|
2720a1a405 | ||
|
|
31fd8d3fe8 | ||
|
|
6868ee373e | ||
|
|
b9a247b559 | ||
|
|
50a205d20f | ||
|
|
b0072bf658 | ||
|
|
2c810567dd | ||
|
|
0a1a29a7fe | ||
|
|
7d21871ed8 | ||
|
|
a38b97fae0 | ||
|
|
cf77ede84c | ||
|
|
45313a8dfa | ||
|
|
b08135e7c1 | ||
|
|
4bac8488df | ||
|
|
de04302c15 | ||
|
|
997758f91c | ||
|
|
763214f7c0 | ||
|
|
77e8dad503 | ||
|
|
1758445a75 | ||
|
|
7a77a8047d | ||
|
|
d8767cbcb7 | ||
|
|
7924d3a456 | ||
|
|
ec84bafcd8 | ||
|
|
08c09b74cf | ||
|
|
7aece5e8e7 | ||
|
|
8d93eae64a | ||
|
|
9a3d660d1b | ||
|
|
7199d9b5d3 | ||
|
|
d19a4ab676 | ||
|
|
f105cb5471 | ||
|
|
4db4198722 | ||
|
|
616a3345c4 | ||
|
|
1f8d84a562 | ||
|
|
a54d757a3e | ||
|
|
b5eb374fb9 | ||
|
|
f1d69068c7 | ||
|
|
ee130e2306 | ||
|
|
9ba6bc6042 | ||
|
|
5e1a0fad08 | ||
|
|
c05118dc49 | ||
|
|
1adf89d5d2 | ||
|
|
666f71b2a1 | ||
|
|
2b7d5b18f3 | ||
|
|
18d5d25cb6 | ||
|
|
492d8ab7d9 | ||
|
|
2b93727bea | ||
|
|
18c5be69e9 | ||
|
|
5a70e97f51 | ||
|
|
f4707da97a | ||
|
|
51ab074d50 | ||
|
|
6d9e8a5a63 | ||
|
|
008de86533 | ||
|
|
ae49fd1aa9 | ||
|
|
79d18f7fd0 | ||
|
|
99d1859a44 | ||
|
|
866cd28ad4 | ||
|
|
71a9f498b5 | ||
|
|
b607da8ae9 | ||
|
|
a43d206b93 | ||
|
|
15863e7170 | ||
|
|
5e91877636 | ||
|
|
7e1d012161 | ||
|
|
de74605777 | ||
|
|
e8abf1fb25 | ||
|
|
b7fe7d25e1 | ||
|
|
138a65d6c1 | ||
|
|
9d0bdf69e5 | ||
|
|
9194dfb94b | ||
|
|
b7ebf54a29 | ||
|
|
3a80b72ac8 | ||
|
|
3e33012bd9 | ||
|
|
fd3f7ca2bb | ||
|
|
6e22c4f68a | ||
|
|
565ef29ae3 | ||
|
|
68398b2a5a | ||
|
|
5624e4a25f | ||
|
|
92e07f3b74 | ||
|
|
8447f0a323 | ||
|
|
f0a2fdd508 | ||
|
|
320784659d | ||
|
|
51ab8cd67d | ||
|
|
237253d83b | ||
|
|
fe100fb490 | ||
|
|
c7b646e23a | ||
|
|
41add6882b | ||
|
|
dd0d2c2f0a | ||
|
|
d38e32c036 | ||
|
|
73315c2edc | ||
|
|
6b51d11d08 | ||
|
|
59270c39a7 | ||
|
|
db82cf7778 | ||
|
|
ddb1d57766 | ||
|
|
5dd770746b | ||
|
|
fa436eb368 | ||
|
|
fcc658f106 | ||
|
|
2e7b8fb9a1 | ||
|
|
1778e2576e | ||
|
|
73c9e85642 | ||
|
|
76557d2eb3 | ||
|
|
9095c7361e | ||
|
|
c02c1432e8 | ||
|
|
8411ed4f80 | ||
|
|
4de95f320f | ||
|
|
aea18173d1 | ||
|
|
856fc0652f | ||
|
|
b01c1240cf | ||
|
|
836ec05920 | ||
|
|
9a52b30c3d | ||
|
|
76af73bc72 | ||
|
|
f7bc0b49cb | ||
|
|
9155e98911 | ||
|
|
7aee50de97 | ||
|
|
24966ffbda | ||
|
|
666ef53fd2 | ||
|
|
e02ba05034 | ||
|
|
b478912910 | ||
|
|
2001932c56 | ||
|
|
f54de95802 | ||
|
|
fa1c2454e6 | ||
|
|
6b94237679 | ||
|
|
aedff8a000 | ||
|
|
a0aa8dd851 | ||
|
|
440ef4873b | ||
|
|
ffad2fbe55 | ||
|
|
cc1354ebfa | ||
|
|
581d2ba8b4 | ||
|
|
61348b20b4 | ||
|
|
e619e06078 | ||
|
|
4f84d1693a | ||
|
|
71d244a5b6 | ||
|
|
f9a0f869e3 | ||
|
|
33c472d734 | ||
|
|
a8eb122c1f | ||
|
|
956b1a7697 | ||
|
|
472ce19183 | ||
|
|
740924fa61 | ||
|
|
01b4bb5447 | ||
|
|
ee3b02932a | ||
|
|
2a07d3d26b | ||
|
|
e238148d42 | ||
|
|
9d21695476 | ||
|
|
22d11a9ccb | ||
|
|
fc9248ea2b | ||
|
|
c302979738 | ||
|
|
e4d077bc98 | ||
|
|
76cd9b7f72 | ||
|
|
e71431ec78 | ||
|
|
7b335eb635 | ||
|
|
c0c086388b | ||
|
|
048c8302fe | ||
|
|
a7b051b172 | ||
|
|
5f7ad58f48 | ||
|
|
016b9fc052 | ||
|
|
99b40e8257 | ||
|
|
a734e447b5 | ||
|
|
37128c34a9 | ||
|
|
f5630ab88e | ||
|
|
6790587db8 | ||
|
|
445f696dc6 | ||
|
|
dd5c3a9c8e | ||
|
|
0f45e38b52 | ||
|
|
93bc3cb628 | ||
|
|
79faedfb9b | ||
|
|
17d9caae83 | ||
|
|
eea18e856e | ||
|
|
7e64eb5414 | ||
|
|
8a959bb1f4 | ||
|
|
8d3ef0729c | ||
|
|
275680bdb7 | ||
|
|
4d5d1f0f66 | ||
|
|
1ef677f264 | ||
|
|
07193e2a34 | ||
|
|
f7da94610d | ||
|
|
872368d25c | ||
|
|
36320b4bf4 | ||
|
|
7185faa857 | ||
|
|
0c80fcff2a | ||
|
|
51caff5dcf | ||
|
|
d643ff5dbc | ||
|
|
44ca89eff7 | ||
|
|
7afad19c77 | ||
|
|
765c4ab4f4 | ||
|
|
24eca792ff | ||
|
|
b1b17ee264 | ||
|
|
74600cfb14 | ||
|
|
171ec1583d | ||
|
|
80c5106015 | ||
|
|
e92fe4c1a4 | ||
|
|
11f402b44a | ||
|
|
18049fe3e0 | ||
|
|
b330c10492 | ||
|
|
25255c4ed1 | ||
|
|
16febebd28 | ||
|
|
339952c2af | ||
|
|
75715635e8 | ||
|
|
9863d8d1d2 | ||
|
|
3ecccb7410 | ||
|
|
3c7a7a1675 | ||
|
|
d14c475de7 | ||
|
|
a68a3feb60 | ||
|
|
43382a9b9c | ||
|
|
a149502c01 | ||
|
|
decace60da | ||
|
|
2c876b6765 | ||
|
|
6d0785a78f | ||
|
|
ec593a2549 | ||
|
|
978de6fb97 | ||
|
|
c53e2960a0 | ||
|
|
cf91ebf278 | ||
|
|
fd5f21af00 | ||
|
|
1b93cb8c0a | ||
|
|
a9e6268766 | ||
|
|
fc855084a0 | ||
|
|
b7bccf86c3 | ||
|
|
6ee2a51edc | ||
|
|
d2dc1597fe | ||
|
|
82647e79c7 | ||
|
|
ecbebe2847 | ||
|
|
816db977fd | ||
|
|
cbe77e2412 | ||
|
|
1eb67ca49d | ||
|
|
7a89d731f7 | ||
|
|
65503dad73 | ||
|
|
a347262468 | ||
|
|
6a6fa7027a | ||
|
|
86cdc91180 | ||
|
|
094465a710 | ||
|
|
6ae56f302e | ||
|
|
ad895fadb1 | ||
|
|
7c120281c7 | ||
|
|
8a4095b405 | ||
|
|
a7cc5b6a5d | ||
|
|
ac1dfd4662 | ||
|
|
abf2f7f05e | ||
|
|
1c209d711e | ||
|
|
91f521ef92 | ||
|
|
9ac3ae1270 | ||
|
|
d74579aa38 | ||
|
|
6deb1a83b5 | ||
|
|
6f3a7ef3c8 | ||
|
|
9f3687f917 | ||
|
|
5e77c4e936 | ||
|
|
97c376e06d | ||
|
|
8f4d674442 | ||
|
|
7f277fea94 | ||
|
|
52440cc2e6 | ||
|
|
3fe9243e1c | ||
|
|
05dae25a22 | ||
|
|
23ea270881 | ||
|
|
7247543da3 | ||
|
|
37a8d2acc1 | ||
|
|
4a7ba87d99 | ||
|
|
51e3764519 | ||
|
|
533d92aa8e | ||
|
|
19887b7b8c | ||
|
|
005e75bdc3 | ||
|
|
5f3470fcd0 | ||
|
|
adb237cfa8 | ||
|
|
29a29d6210 | ||
|
|
3a155ceda6 | ||
|
|
7195a23a9d | ||
|
|
0ae6ff8018 | ||
|
|
241769dc2f | ||
|
|
4a39ee9bbc | ||
|
|
1dedf7f0cd | ||
|
|
70ede09310 | ||
|
|
3da30304fc | ||
|
|
820c04c679 | ||
|
|
9d848e3f5e | ||
|
|
d5f71c2e1d | ||
|
|
36a7d23273 | ||
|
|
c4317177f3 | ||
|
|
e231a84b2f | ||
|
|
b56fb96b1b | ||
|
|
163c7e3460 | ||
|
|
4c1023dac6 | ||
|
|
563d238fa0 | ||
|
|
9021776963 | ||
|
|
18771f1b6a | ||
|
|
ed2af11102 | ||
|
|
7dd65e84e6 | ||
|
|
e260ec6e9d | ||
|
|
7ce3f3c1a6 | ||
|
|
a466755bbb | ||
|
|
901c9d8ae0 | ||
|
|
6145c82804 | ||
|
|
876c02206d | ||
|
|
3ca312033f | ||
|
|
1378475573 | ||
|
|
00b049866b | ||
|
|
d847e477f0 | ||
|
|
c55e164e87 | ||
|
|
531cd5dd14 | ||
|
|
ff0a9f763e | ||
|
|
228e0a3d79 | ||
|
|
f38e29d00a | ||
|
|
963283d7d0 | ||
|
|
c91044a4a7 | ||
|
|
f42c26adbd | ||
|
|
9efad43509 | ||
|
|
33d8f08964 | ||
|
|
e826e9281e | ||
|
|
780120c9a2 | ||
|
|
d6c0c85125 | ||
|
|
c81fb397bb | ||
|
|
caf4e46e06 | ||
|
|
ff1a30d80a | ||
|
|
d143f49a66 | ||
|
|
58698b789a | ||
|
|
ee3f2ffa19 | ||
|
|
c59124dfe2 | ||
|
|
7b14cf8558 | ||
|
|
05f796d2fa | ||
|
|
bd8c91b37d | ||
|
|
7294cdef3e | ||
|
|
4d7b6374c8 | ||
|
|
5855da5a15 | ||
|
|
34fd493512 | ||
|
|
da4bd9b110 | ||
|
|
7fbf6df09e | ||
|
|
68415d040f | ||
|
|
8ee74f6bff | ||
|
|
bf0fa4089f | ||
|
|
07ae149955 | ||
|
|
ecb93d97a5 | ||
|
|
f769d5e27f | ||
|
|
1e414c8f37 | ||
|
|
07e6994be1 | ||
|
|
0abf4f8fbb | ||
|
|
a13e4a77e0 | ||
|
|
6de2271e2a | ||
|
|
021e255282 | ||
|
|
92b1e038c1 | ||
|
|
a8c33ae219 | ||
|
|
e7bc30b409 | ||
|
|
efaefa21fc | ||
|
|
42bd417acf | ||
|
|
af58e8e8f9 | ||
|
|
4bf4a7668e | ||
|
|
c03ca9c73c | ||
|
|
d5884afcf3 | ||
|
|
a2aeafe85b | ||
|
|
0109b39f58 | ||
|
|
752e978d56 | ||
|
|
8b36a11f2b | ||
|
|
ccd448d626 | ||
|
|
44fb38949b | ||
|
|
ad1532ed57 | ||
|
|
caaec3bb05 | ||
|
|
df47fae287 | ||
|
|
b65bf48369 | ||
|
|
4c02acb728 | ||
|
|
8c9151c86b | ||
|
|
c075742bc8 | ||
|
|
b42cf317d6 | ||
|
|
f5429e4ce8 | ||
|
|
82dad8e629 | ||
|
|
59aa37fe2b | ||
|
|
0adb43f06e | ||
|
|
87e09a09da | ||
|
|
ba630816bc | ||
|
|
863fdafcd5 | ||
|
|
be5e6941bf | ||
|
|
7980115412 | ||
|
|
cab86a0deb | ||
|
|
be3a1da14a | ||
|
|
650c587875 | ||
|
|
d29c5760bd | ||
|
|
ee9d777d69 | ||
|
|
59582bafa3 | ||
|
|
1ad85ac9ee | ||
|
|
999a84c77a | ||
|
|
48e0d167aa | ||
|
|
f14da66ce5 | ||
|
|
14ab311d2f | ||
|
|
02ab4363b6 | ||
|
|
e1f7c73324 | ||
|
|
3042fc2a29 | ||
|
|
a622c1c2fe | ||
|
|
b3e467dcba | ||
|
|
c0259255b0 | ||
|
|
9398bc1764 | ||
|
|
fcf9fa3651 | ||
|
|
583df79be9 | ||
|
|
0e0b892493 | ||
|
|
78a8d64a92 | ||
|
|
5433e4dab8 | ||
|
|
c3c59b010b | ||
|
|
8eb481b6c6 | ||
|
|
d5efeb7df5 | ||
|
|
f663042893 | ||
|
|
f07c1a11a0 | ||
|
|
ce297bfa9e | ||
|
|
ba1682c120 | ||
|
|
e212154d8d | ||
|
|
ec0fe09138 | ||
|
|
8562ed3018 | ||
|
|
21b0ccf859 | ||
|
|
84c93c2fea | ||
|
|
e3c2305ff4 | ||
|
|
0e3c467a5b | ||
|
|
94880d8f36 | ||
|
|
7307bb6e9a | ||
|
|
4263410fe8 | ||
|
|
cb0eb855ca | ||
|
|
569d0ec7cc | ||
|
|
1021e87522 | ||
|
|
dc34cf362f | ||
|
|
e71749428c | ||
|
|
8f58b776b0 | ||
|
|
fb0a11636f | ||
|
|
7bf09734d7 | ||
|
|
853bcb3c64 | ||
|
|
4d32395fe1 | ||
|
|
a6a141d326 | ||
|
|
e0161e03db | ||
|
|
82d29d4c2a | ||
|
|
1a5791750b | ||
|
|
482d9b58b3 | ||
|
|
5903dd7d82 | ||
|
|
301b1ffbc7 | ||
|
|
759be64115 | ||
|
|
ece2a2d6c2 | ||
|
|
f31957c502 | ||
|
|
fb69541cfa | ||
|
|
e189679ebc | ||
|
|
18e7fcc37f | ||
|
|
1c8a657044 | ||
|
|
cdea5c8eef | ||
|
|
bcc386e3bb | ||
|
|
a2bd3bb75b | ||
|
|
b63d618e48 | ||
|
|
8864c2d59b | ||
|
|
c75073fbf4 | ||
|
|
cf4529d058 | ||
|
|
9b6900b058 | ||
|
|
7f7ef068fc | ||
|
|
a41790ce8a | ||
|
|
06615a556d | ||
|
|
94a69c2b31 | ||
|
|
425ff2f81d | ||
|
|
2257166e61 | ||
|
|
56cf5f4f67 | ||
|
|
668484ba8f | ||
|
|
f824078c14 | ||
|
|
3250833a62 | ||
|
|
8bc24912d1 | ||
|
|
52f6f7e0c7 | ||
|
|
ee8ee69c30 | ||
|
|
4941ebcc91 | ||
|
|
9adbea785b | ||
|
|
fd19413196 | ||
|
|
6300a8a0a2 | ||
|
|
66c1228c95 | ||
|
|
4585b23552 | ||
|
|
23a624f73a | ||
|
|
f3d7d2f7b1 | ||
|
|
0358983ee6 | ||
|
|
a0977266b4 | ||
|
|
76947f0074 | ||
|
|
f649754018 | ||
|
|
b1c5ce2517 | ||
|
|
f2db5ec4fb | ||
|
|
db08494776 | ||
|
|
9166d595e6 | ||
|
|
f1061c8763 | ||
|
|
fca9803bee | ||
|
|
0d841b5e05 | ||
|
|
216791c3fb | ||
|
|
12c4e68058 | ||
|
|
b4b451863d | ||
|
|
f2808de855 | ||
|
|
9b2897ccd9 | ||
|
|
3c4698435c | ||
|
|
98682e1073 | ||
|
|
d6bcb8b7e0 | ||
|
|
a501237ae3 | ||
|
|
f6622c2fbb | ||
|
|
b08b90d71c | ||
|
|
b46ed8c7a3 | ||
|
|
45869ce843 | ||
|
|
dff377a741 | ||
|
|
b24cf8d157 | ||
|
|
2ad90b7c41 | ||
|
|
a40fc41988 | ||
|
|
3416c6d91b | ||
|
|
54c2bcb60f | ||
|
|
44a5108e1d | ||
|
|
d8715871fa | ||
|
|
772fcc963c | ||
|
|
75b7104724 | ||
|
|
fe3c1f9061 | ||
|
|
e30818ce39 | ||
|
|
2e30886a0d | ||
|
|
b18ffbd08a | ||
|
|
16d2dc662f | ||
|
|
9832c911b3 | ||
|
|
23f5eeec20 | ||
|
|
16106b2978 | ||
|
|
c66e6be4a4 | ||
|
|
eda4c26d24 | ||
|
|
4b140e060b | ||
|
|
1fefa03329 | ||
|
|
37ff9b029c | ||
|
|
e798fe37e1 | ||
|
|
f4a8f7165c | ||
|
|
2d52e409c2 | ||
|
|
1b5e677d0c | ||
|
|
c508923f04 | ||
|
|
6c4024796e | ||
|
|
bd2c6cfa55 | ||
|
|
bd74db932e | ||
|
|
439337fb1b | ||
|
|
5ffe6f5acf | ||
|
|
f281f8cb75 | ||
|
|
3a46e2d86b | ||
|
|
6a84a1788b | ||
|
|
df870e5241 | ||
|
|
82afd3a891 | ||
|
|
514fc72050 | ||
|
|
4dba9aed22 | ||
|
|
a46dbe6941 | ||
|
|
394db7b738 | ||
|
|
3ad58ee1f5 | ||
|
|
00aa77f2d9 | ||
|
|
60fc79c717 | ||
|
|
f501186b18 | ||
|
|
fe6d9ed9ba | ||
|
|
c450d418ef | ||
|
|
c3b1af023b | ||
|
|
bf37be46b8 | ||
|
|
4466c31fc2 | ||
|
|
b2bebcf5ce | ||
|
|
de33ba029b | ||
|
|
465db44499 | ||
|
|
abdb8ee3f7 | ||
|
|
aa6b4b4970 | ||
|
|
25cbfcf34a | ||
|
|
cffc33a51c | ||
|
|
5db7b01fa2 | ||
|
|
1ca5ca8392 | ||
|
|
93761d9ab5 | ||
|
|
bb16d8816c | ||
|
|
e1cd500ac5 | ||
|
|
2d09cbfd21 | ||
|
|
d84b16caf9 | ||
|
|
95f06f0591 | ||
|
|
3bf4d635f2 | ||
|
|
a4fa18e92d | ||
|
|
f71af2a2ef | ||
|
|
3e62f8d9b7 | ||
|
|
028720c9ec | ||
|
|
d518970039 | ||
|
|
8363a6ab1e | ||
|
|
a540dcd2e2 | ||
|
|
58b2c6c4a5 | ||
|
|
34ffde6799 | ||
|
|
e7cd945000 | ||
|
|
ccf0f05e98 | ||
|
|
36672ad50e | ||
|
|
8bee3d89c5 | ||
|
|
cf212e55ac | ||
|
|
a00f61bd5d | ||
|
|
dca76de872 | ||
|
|
70540f9563 | ||
|
|
a545cb7cff | ||
|
|
9a86a3bd23 | ||
|
|
69673635ef | ||
|
|
77e6971bbb | ||
|
|
a9a1336502 | ||
|
|
9103674950 | ||
|
|
2af39ac017 | ||
|
|
d47b8fef18 | ||
|
|
f8fc214b11 | ||
|
|
7861bfa45e | ||
|
|
02734264a1 | ||
|
|
4a845f3d04 | ||
|
|
0452ebdfcd | ||
|
|
c8b8c4cf30 | ||
|
|
1ff1401ff1 | ||
|
|
3991bbe595 | ||
|
|
20beb093a1 | ||
|
|
3135642ff5 | ||
|
|
d5bb3b0039 | ||
|
|
f16216e270 | ||
|
|
de9e1a0693 | ||
|
|
47b18d89f6 | ||
|
|
3f5b474b16 | ||
|
|
b103fec939 | ||
|
|
728be68bfe | ||
|
|
5820e97abe | ||
|
|
4e81ea2a8a | ||
|
|
7bfdb31c77 | ||
|
|
44cec04294 | ||
|
|
c60a84b6f5 | ||
|
|
3b953cc763 | ||
|
|
859ce39666 | ||
|
|
7c6ea4ed00 | ||
|
|
3dab3be859 | ||
|
|
062ed99894 | ||
|
|
d275fc90cf | ||
|
|
dbc4c47b15 | ||
|
|
e6d97ce928 | ||
|
|
b7473285ec | ||
|
|
8b7107b81f | ||
|
|
d1251b2850 | ||
|
|
e972589554 | ||
|
|
0f19c958da | ||
|
|
2935fbc089 | ||
|
|
f47fc4f111 | ||
|
|
01c95cb07e | ||
|
|
1f94541732 | ||
|
|
ff43b4dca0 | ||
|
|
5d494e940f | ||
|
|
30de580afe | ||
|
|
0c13350ea4 | ||
|
|
83a661c360 | ||
|
|
38ec1325c4 | ||
|
|
2ca2e83ce5 | ||
|
|
a9908ba7bd | ||
|
|
9f874c00aa | ||
|
|
b52cdf6a95 | ||
|
|
40e637d9e1 | ||
|
|
21c76d97bb | ||
|
|
4b3147ede7 | ||
|
|
a037a66ea4 | ||
|
|
c071819c26 | ||
|
|
28e018de8a | ||
|
|
65102c0ba5 | ||
|
|
ff8e97310d | ||
|
|
2546661aeb | ||
|
|
fdeed49637 | ||
|
|
fab7693da5 | ||
|
|
582323d63c | ||
|
|
a6522d3706 | ||
|
|
28a0028762 | ||
|
|
ec19c32b63 | ||
|
|
ec9aceb96f | ||
|
|
0e1c2e3378 | ||
|
|
094b952d70 | ||
|
|
3821a4e054 | ||
|
|
d24404ca9a | ||
|
|
fb2d6e8870 | ||
|
|
e421cbac2a | ||
|
|
a71310f58b | ||
|
|
43c392626b | ||
|
|
d286573958 | ||
|
|
ff889c40da | ||
|
|
0ecdbe8614 | ||
|
|
8b3500a2a9 | ||
|
|
c5fd56606d | ||
|
|
dd86b85664 | ||
|
|
3ec9f5fa0b | ||
|
|
3bf3ce06f7 | ||
|
|
cc1d601722 | ||
|
|
e8c1b849b7 | ||
|
|
de44b71b12 | ||
|
|
df70c7136d | ||
|
|
bf2b9ea539 | ||
|
|
b0b46c331e | ||
|
|
b3269581ea | ||
|
|
699edd4393 | ||
|
|
9128c6c17b | ||
|
|
f121223ed8 | ||
|
|
3c0e360df1 | ||
|
|
1de6f5fcf6 | ||
|
|
5bf4b718d4 | ||
|
|
f912007fe8 | ||
|
|
377809a35b | ||
|
|
f0f981b80d | ||
|
|
2b9302632c | ||
|
|
a59a1552ad | ||
|
|
4a80e821df | ||
|
|
6822291f91 | ||
|
|
863aacaee3 | ||
|
|
00a2bf7120 | ||
|
|
6ac5acf765 | ||
|
|
ce7583f173 | ||
|
|
24b10ac585 | ||
|
|
706371e24f | ||
|
|
5de8639685 | ||
|
|
d42e26d59c | ||
|
|
6ea06e87bb | ||
|
|
5eb8a44317 | ||
|
|
c89fb0b828 | ||
|
|
52e111dbb7 | ||
|
|
36b5109387 | ||
|
|
c07b085c81 | ||
|
|
065c442141 | ||
|
|
83b570d981 | ||
|
|
2afdee9c7d | ||
|
|
a7e809e1f7 | ||
|
|
deb7cb708f | ||
|
|
fcd7db6cd1 | ||
|
|
68adbd2e05 | ||
|
|
b6258d612b | ||
|
|
93cb76a292 | ||
|
|
6191f69f0c | ||
|
|
d416e6c854 | ||
|
|
3a63d978dd | ||
|
|
d2a78c33df | ||
|
|
679f91482e | ||
|
|
d380a8554d | ||
|
|
4f36ad0cc1 | ||
|
|
90ba7fbf1f | ||
|
|
76658477af | ||
|
|
ffb6a9c74b | ||
|
|
21d334389f | ||
|
|
94a5e081e5 | ||
|
|
5e78d72ef2 | ||
|
|
5c303e2bb5 | ||
|
|
4c1cb388af | ||
|
|
144bd4a878 | ||
|
|
91737aff68 | ||
|
|
2391b40f47 | ||
|
|
6a8aff5a74 | ||
|
|
c0ec5d404b | ||
|
|
10e9a6b6cd | ||
|
|
a51aed7ce2 | ||
|
|
71e0106846 | ||
|
|
3ce9af7fce | ||
|
|
05e8aae95e | ||
|
|
381de6b7cb | ||
|
|
c077645f77 | ||
|
|
ebc3263987 | ||
|
|
cf6e5bf01f | ||
|
|
958c615a83 | ||
|
|
8e5070f469 | ||
|
|
4397b675cb | ||
|
|
9ed88f6a8d | ||
|
|
f12fde9132 | ||
|
|
1c4ea6d246 | ||
|
|
a6d76b3c48 | ||
|
|
5d0ace0577 | ||
|
|
7b88544d46 | ||
|
|
6767ea2456 | ||
|
|
459db3d64b | ||
|
|
d009cf618a | ||
|
|
9a9897a9de | ||
|
|
3f9fb13df6 | ||
|
|
52f414669a | ||
|
|
b34215906c | ||
|
|
fb768ac792 | ||
|
|
35289bffe2 | ||
|
|
ef00fdf472 | ||
|
|
3de7e8358f | ||
|
|
28ac2f49dc | ||
|
|
c38b5d5eb9 | ||
|
|
180d06613a | ||
|
|
c3ee4212f0 | ||
|
|
efafbe9a5c | ||
|
|
e38680a4df | ||
|
|
f28fc6f2e1 | ||
|
|
5ba8d36687 | ||
|
|
178236cc5f | ||
|
|
79a0533c69 | ||
|
|
64363995be | ||
|
|
426ad6e3a3 | ||
|
|
0d0e7a1008 | ||
|
|
806545df34 | ||
|
|
b8cc257ac5 | ||
|
|
bdb4d96678 | ||
|
|
0c5fb4a81b | ||
|
|
3ff48f27cf | ||
|
|
f0c732452f | ||
|
|
a4d1b1ba21 | ||
|
|
0447ea94c1 | ||
|
|
38fd7a84c7 | ||
|
|
ee17910ec5 | ||
|
|
717a7dbfde | ||
|
|
0fb6576511 | ||
|
|
383495c863 | ||
|
|
b55abf5730 | ||
|
|
3e1aa456b9 | ||
|
|
00558adda8 | ||
|
|
1c3273aab2 | ||
|
|
589b247926 | ||
|
|
6965e3e03c | ||
|
|
202d5ab754 | ||
|
|
1023be33fb | ||
|
|
595c00f55c | ||
|
|
5aaa5eab70 | ||
|
|
70b24b021a | ||
|
|
af96c721c4 | ||
|
|
a9b653db26 | ||
|
|
80c23d4519 | ||
|
|
821d7a8941 | ||
|
|
e7c8a22c67 | ||
|
|
5652ccc780 | ||
|
|
055d429ae1 | ||
|
|
8231897b26 | ||
|
|
df7e656034 | ||
|
|
d045409b9f | ||
|
|
7f3f4cfdd0 | ||
|
|
ef044d9f17 | ||
|
|
9642c7f990 | ||
|
|
0c5193c588 | ||
|
|
f2c2b3fc7a | ||
|
|
1228e0e925 | ||
|
|
3a3820bedc | ||
|
|
91ee6ed60f | ||
|
|
7e28fdc176 | ||
|
|
569bc02649 | ||
|
|
178309be47 | ||
|
|
2fb7ac9a58 | ||
|
|
2e493cb89a | ||
|
|
cdf0d77b20 | ||
|
|
ccdfaa9115 | ||
|
|
34af05ec30 | ||
|
|
6bd41e47ac | ||
|
|
45d11c53f0 | ||
|
|
50a68d7d59 | ||
|
|
cc47b5a78c | ||
|
|
34b4ec3624 | ||
|
|
86ed364dc0 | ||
|
|
438cde4e70 | ||
|
|
3b268d1656 | ||
|
|
0a97782339 | ||
|
|
1cf1d6146c | ||
|
|
f3217ac170 | ||
|
|
c8125f8710 | ||
|
|
1e3bc7c069 | ||
|
|
34df9f3dbf | ||
|
|
72bb159a7e | ||
|
|
afe4e345d2 | ||
|
|
855b5b513d | ||
|
|
b9d271c1a8 | ||
|
|
b3931741ef | ||
|
|
ede48e285f | ||
|
|
8890539f47 | ||
|
|
ff72dd8d2c | ||
|
|
e07b265009 | ||
|
|
8d0e5899b9 | ||
|
|
e6f8b59010 | ||
|
|
8e65846f32 | ||
|
|
96d4d3f3be | ||
|
|
811c01cc2e | ||
|
|
e24127771e | ||
|
|
b3f00d05a8 | ||
|
|
652d34b0a8 | ||
|
|
7539577b46 | ||
|
|
41ee6006c4 | ||
|
|
813ba42cfc | ||
|
|
80076276e1 | ||
|
|
3a78e8010d | ||
|
|
d9940f416b | ||
|
|
dd998e7fd3 | ||
|
|
747db4d940 | ||
|
|
ecd5c523dc | ||
|
|
3de14fc63e | ||
|
|
7f166eaee7 | ||
|
|
ab7b5e48c4 | ||
|
|
345b5cfc5c | ||
|
|
1ac93c3a72 | ||
|
|
4b8c29a708 | ||
|
|
04b057d22c | ||
|
|
fcfb8dd2ed | ||
|
|
4a2673772a | ||
|
|
b9e216ac6f | ||
|
|
e78e2885fe | ||
|
|
777f2e7547 | ||
|
|
27e494d25c | ||
|
|
d88156d998 | ||
|
|
44a3af51f0 | ||
|
|
79f090d92b | ||
|
|
54c65fdad0 | ||
|
|
e917802316 | ||
|
|
6a19a31171 | ||
|
|
a06b7f2ae0 | ||
|
|
405b1067e2 | ||
|
|
10cb93283a | ||
|
|
d28e8f537a | ||
|
|
24d7f54662 | ||
|
|
687a43e199 | ||
|
|
07ef7d750b | ||
|
|
ea2b1d36aa | ||
|
|
c7540fba94 | ||
|
|
3d9198592b | ||
|
|
d6357bacdd | ||
|
|
647551b8e4 | ||
|
|
b158c25dc3 | ||
|
|
bc8a3c5b6f | ||
|
|
c149db2205 | ||
|
|
b5495ec972 | ||
|
|
472c390e75 | ||
|
|
3d9a41e4b4 | ||
|
|
9f77b065d3 | ||
|
|
7abbe1e8d8 | ||
|
|
004b6ed60f | ||
|
|
d12f30f90c | ||
|
|
c433c2f2e2 | ||
|
|
9e52c330ae | ||
|
|
564deec2c4 | ||
|
|
6fd0ffccbf | ||
|
|
ee957a4285 | ||
|
|
c63331a303 | ||
|
|
4d2c44ca87 | ||
|
|
596b5cd732 | ||
|
|
8ff1ba325d | ||
|
|
a19d7e3680 | ||
|
|
90eeb25770 | ||
|
|
bfe8b81d18 | ||
|
|
ec71c19be7 | ||
|
|
cce1fc9c65 | ||
|
|
79fee501af | ||
|
|
12dfaa2d74 | ||
|
|
d4e5366fe6 | ||
|
|
d7388d7e80 | ||
|
|
5c363b76ee | ||
|
|
440adddcde | ||
|
|
af9ad1580a | ||
|
|
d569430cc6 | ||
|
|
c39bea2017 | ||
|
|
a361f618a1 | ||
|
|
8c2d8bc85f | ||
|
|
563b56e09c | ||
|
|
455f675806 | ||
|
|
3932e860ca | ||
|
|
b3368a85da | ||
|
|
defe0b25dd | ||
|
|
b68ed904b1 | ||
|
|
2eba4fb96b | ||
|
|
27ba604ad7 | ||
|
|
769982d058 | ||
|
|
674d702257 | ||
|
|
c974cb1b8e | ||
|
|
20c05a3add | ||
|
|
c27322ff04 | ||
|
|
6e624946d2 | ||
|
|
ab9a63bbea | ||
|
|
3a8438e1f8 | ||
|
|
0e49c6affd | ||
|
|
8bcf78cd78 | ||
|
|
ffc944976b | ||
|
|
1b52be6246 | ||
|
|
e7e1ec6e84 | ||
|
|
ff3c441023 | ||
|
|
aaf6e84373 | ||
|
|
380a357b08 | ||
|
|
8026d0b2e7 | ||
|
|
b41cad58cb | ||
|
|
39e12244cc | ||
|
|
c4c01b61e6 | ||
|
|
eb3cd22aa3 | ||
|
|
5b35f5fb69 | ||
|
|
11d875d043 | ||
|
|
ac946a4602 | ||
|
|
815e2f3d03 | ||
|
|
bd8bca87b2 | ||
|
|
9110aa09a4 | ||
|
|
fe085a631d | ||
|
|
c7489af844 | ||
|
|
32a653e67e | ||
|
|
d16c93aa08 | ||
|
|
46367a7a7b | ||
|
|
83a25c06ef | ||
|
|
db7db67851 | ||
|
|
8d7073abf6 | ||
|
|
f1c8dd887b | ||
|
|
08bc3b0386 | ||
|
|
2808de6084 | ||
|
|
028088f5f0 | ||
|
|
21178c3571 | ||
|
|
b8214e260c | ||
|
|
45d813b62c | ||
|
|
73b3e0e50e | ||
|
|
255fcbc3a5 | ||
|
|
47d93279ff | ||
|
|
5b93ae8628 | ||
|
|
436318a8c8 | ||
|
|
57a328c7a9 | ||
|
|
2cd3f046e5 | ||
|
|
5c88c1376c | ||
|
|
2d39e5d7a5 | ||
|
|
27e255fa75 | ||
|
|
195190b612 | ||
|
|
aeabfaf417 | ||
|
|
f62201ba9d | ||
|
|
5cf331d881 | ||
|
|
28c90cce6c | ||
|
|
ca5b10938a | ||
|
|
acd4cc6f5c | ||
|
|
7ac3a36229 | ||
|
|
a6178c1de6 | ||
|
|
990dd18474 | ||
|
|
c4642d4fda | ||
|
|
c7d3b83164 | ||
|
|
7c87bb35c4 | ||
|
|
f20530dce2 | ||
|
|
5d5adf7c7e | ||
|
|
fc01873d60 | ||
|
|
81b9e78565 | ||
|
|
cee4505172 | ||
|
|
4d4b29ea94 | ||
|
|
efd780f82a | ||
|
|
cc0ff6b0bf | ||
|
|
35e13cf5e8 | ||
|
|
238652b36c | ||
|
|
e4b728ccb9 | ||
|
|
68967aef72 | ||
|
|
fd67d46be7 | ||
|
|
ee0e8a3aad | ||
|
|
f4734d6b4d | ||
|
|
656628e69b | ||
|
|
6b1bca80ee | ||
|
|
537a50214a | ||
|
|
67d04dd9ba | ||
|
|
b8efd02c7f | ||
|
|
a600d8f4e2 | ||
|
|
de7793e918 | ||
|
|
a5e442d490 | ||
|
|
51513c4e6b | ||
|
|
5d0b813cec | ||
|
|
ba0c271774 | ||
|
|
7062c01b68 | ||
|
|
c0bad42eb1 | ||
|
|
af7ebd96a0 | ||
|
|
ac59fd1476 | ||
|
|
6561d70664 | ||
|
|
1a5c59326a | ||
|
|
d44375aece | ||
|
|
cf37058d7c | ||
|
|
dcb3fcbfa7 | ||
|
|
6ece3f6792 | ||
|
|
3b30e42551 | ||
|
|
b0ef524b9e | ||
|
|
b138aaae08 | ||
|
|
3953661078 | ||
|
|
b551844cc2 | ||
|
|
93f3e2b007 | ||
|
|
0a42a8bc46 | ||
|
|
8097b07661 | ||
|
|
1475cabfa0 | ||
|
|
6a1573c228 | ||
|
|
d26e1d783f | ||
|
|
fa720c1858 | ||
|
|
bc7c3e44d5 | ||
|
|
480ca88b68 | ||
|
|
aba0e602ed | ||
|
|
22a2f98ced | ||
|
|
aaa47850c3 | ||
|
|
7c2feb78d2 | ||
|
|
0c65d2cc0c | ||
|
|
13c5f806c6 | ||
|
|
84d3b4de46 | ||
|
|
925a772dce | ||
|
|
95015f1104 | ||
|
|
dcbc727813 | ||
|
|
3b9d4c8d50 | ||
|
|
40fe9e6d67 | ||
|
|
4da816e459 | ||
|
|
9c475467d5 | ||
|
|
0310cbad0a | ||
|
|
ef258914b2 | ||
|
|
c025f363f5 | ||
|
|
51187d06b3 | ||
|
|
8210b3c873 | ||
|
|
883e0826e2 | ||
|
|
003f9f7953 | ||
|
|
2880a679f0 | ||
|
|
4d6cff7eb8 | ||
|
|
d8806649ab | ||
|
|
dc9a65923a | ||
|
|
751d2a0fe7 | ||
|
|
e3e2dc1f6e | ||
|
|
4f329cbb45 | ||
|
|
0e8995aa7e | ||
|
|
7812030886 | ||
|
|
6fb9794200 | ||
|
|
9e419fdaf7 | ||
|
|
e634cd0d62 | ||
|
|
676f8f189f | ||
|
|
df44837b07 | ||
|
|
16998b4b6d | ||
|
|
f57c4fd0c2 | ||
|
|
5743cca5f8 | ||
|
|
e716a316f6 | ||
|
|
c2b0a8101b | ||
|
|
f88a57e5d7 | ||
|
|
1776120dba | ||
|
|
f4601aff8b | ||
|
|
14799e25c6 | ||
|
|
eea61ee5e4 | ||
|
|
ff6d246efd | ||
|
|
a7f08e9b36 | ||
|
|
06363c01e4 | ||
|
|
ec398229b1 | ||
|
|
a19c8a4ea3 | ||
|
|
f8de2fc8eb | ||
|
|
0380840348 | ||
|
|
9cd5752e38 | ||
|
|
65f7f8dc50 | ||
|
|
36c8d85f43 | ||
|
|
d2bfeaa5e2 | ||
|
|
025bc9fbe1 | ||
|
|
acccedbbb7 | ||
|
|
6106e48397 | ||
|
|
0358177c3f | ||
|
|
875ac79d0e | ||
|
|
9350a47153 | ||
|
|
6230ec13b4 | ||
|
|
0a9cd082db | ||
|
|
3f5b6c7aca | ||
|
|
826fda959c | ||
|
|
a5130aebab | ||
|
|
fa6aea80f5 | ||
|
|
b09051fd79 | ||
|
|
1837d6efa0 | ||
|
|
74583409ec | ||
|
|
3da66d4d79 | ||
|
|
645d7cab86 | ||
|
|
d737981cfe | ||
|
|
dd51c25641 | ||
|
|
b7969ce657 | ||
|
|
5cee7cfc40 | ||
|
|
586581685c | ||
|
|
88f43b15fa | ||
|
|
0c9f6a3ac9 | ||
|
|
18cb325a8e | ||
|
|
ed71feac52 | ||
|
|
7fe3933faa | ||
|
|
9837e01971 | ||
|
|
5b1dc83382 | ||
|
|
42e5077688 | ||
|
|
081178cd9a | ||
|
|
fb29d47f0c | ||
|
|
1dc2654b54 | ||
|
|
2a5a6416a5 | ||
|
|
175fd6692c | ||
|
|
31dba0b4e9 | ||
|
|
27b894dd3f | ||
|
|
6aaaa3eae2 | ||
|
|
16f205d886 | ||
|
|
87e4c72ee4 | ||
|
|
5ef5fc65ae | ||
|
|
e93d5a683f | ||
|
|
91419e0e3e | ||
|
|
74626a17db | ||
|
|
1ab46eeff2 | ||
|
|
70177d55b0 | ||
|
|
1fd9603c55 | ||
|
|
279b67c838 | ||
|
|
19f9147e10 | ||
|
|
6bda73eeb2 | ||
|
|
9f349b0988 | ||
|
|
91ce5625b5 | ||
|
|
a3df1f5c5e | ||
|
|
86edc0a40e | ||
|
|
89456eed51 | ||
|
|
e023107e97 | ||
|
|
af71acb043 | ||
|
|
e12008a718 | ||
|
|
c9bae1fd46 | ||
|
|
3a73ff3bc2 | ||
|
|
99c3c5a4af | ||
|
|
a1920bc5c2 | ||
|
|
9a811cb52a | ||
|
|
55c8c2bc77 | ||
|
|
fbffea94a9 | ||
|
|
c7e17d06c8 | ||
|
|
75fa7a8d87 | ||
|
|
5e3290a486 | ||
|
|
90725df206 | ||
|
|
066bda52c0 | ||
|
|
2514c5b550 | ||
|
|
3f234ac21b | ||
|
|
420750f5ca | ||
|
|
51f7cc6874 | ||
|
|
c4252ed824 | ||
|
|
97c5fe052c | ||
|
|
5f1e13e770 | ||
|
|
d2d6e1fd6f | ||
|
|
08459fd944 | ||
|
|
985a163e33 | ||
|
|
7441340ab5 | ||
|
|
50b3b5c991 | ||
|
|
73a6ed7c21 | ||
|
|
56afd80506 | ||
|
|
398b3f08b0 | ||
|
|
1dd92890d7 | ||
|
|
436d2f4bb9 | ||
|
|
0264197f3f | ||
|
|
b487a3521c | ||
|
|
816d914c4e | ||
|
|
c0fd0c8f89 | ||
|
|
ebcda80583 | ||
|
|
407b95e35f | ||
|
|
d08a96e251 | ||
|
|
59d9b97ffe | ||
|
|
cf39198a9a | ||
|
|
02229c7c2d | ||
|
|
1c2ed5cc33 | ||
|
|
efc709578a | ||
|
|
eb5694ca2a | ||
|
|
389166e86e | ||
|
|
2b31495723 | ||
|
|
d5b44a98bc | ||
|
|
0e5551da99 | ||
|
|
3afd3b1afd | ||
|
|
223a39b51e | ||
|
|
8faf300b6e | ||
|
|
5c76f68168 | ||
|
|
ad970dd9df | ||
|
|
161891a06e | ||
|
|
709068ef5b | ||
|
|
2b7f6f82be | ||
|
|
005b1b1a4b | ||
|
|
3eab8f975e | ||
|
|
2a4563a677 | ||
|
|
af32de46a2 | ||
|
|
f35d25c674 | ||
|
|
0dc7f6a2d3 | ||
|
|
bb9232c9d9 | ||
|
|
87cb9efb99 | ||
|
|
4c9a60d4fd | ||
|
|
e36881487d | ||
|
|
56dd722fb4 | ||
|
|
c2f441840f | ||
|
|
a55ea39677 | ||
|
|
fc668f3ec3 | ||
|
|
c515199674 | ||
|
|
b6102e207c | ||
|
|
ddc9a278aa | ||
|
|
e65ef3a24f | ||
|
|
f4b08bacb0 | ||
|
|
ae6cf3da7d | ||
|
|
03133377fa | ||
|
|
106da2f51e | ||
|
|
72b6fdb04b | ||
|
|
453af11e2c | ||
|
|
eeefefd56c | ||
|
|
531c0cf26f | ||
|
|
b7208fb525 | ||
|
|
dc700d5d50 | ||
|
|
00f7af7748 | ||
|
|
9989de4bd0 | ||
|
|
fcbf45ca64 | ||
|
|
509f7a64ea | ||
|
|
e80d147957 | ||
|
|
2cea89dc7d | ||
|
|
1a79adb3a9 | ||
|
|
8dbd92f6c2 | ||
|
|
d22912349b | ||
|
|
26e8f3fd28 | ||
|
|
86864a2f6c | ||
|
|
7c65e4c14b | ||
|
|
a56fbe42a4 | ||
|
|
9427107b94 | ||
|
|
75c589958a | ||
|
|
3e8cad7e39 | ||
|
|
e4c4d146e1 | ||
|
|
34e592341c | ||
|
|
94b9942cd9 | ||
|
|
d5f9ea9fc2 | ||
|
|
f6ed93253b | ||
|
|
3479749499 | ||
|
|
89eafad589 | ||
|
|
8bb5a19905 | ||
|
|
84f77a71e5 | ||
|
|
da0d29e4ab | ||
|
|
f30f4c744e | ||
|
|
6621494d9d | ||
|
|
2374885ac0 | ||
|
|
784cf66dc2 | ||
|
|
6c641471b2 | ||
|
|
18c30c30d6 | ||
|
|
a1b6f1e096 | ||
|
|
a02c683572 | ||
|
|
8ecce4df3d | ||
|
|
9af159c200 | ||
|
|
b96b24ce8c | ||
|
|
fdf04af271 | ||
|
|
203a264f96 | ||
|
|
b5ff4ffedc | ||
|
|
6628a4df45 | ||
|
|
627f484bce | ||
|
|
d03779ee2a | ||
|
|
3e4b0ee509 | ||
|
|
54214fb65f | ||
|
|
3ecae15da2 | ||
|
|
c2da8234d9 | ||
|
|
20d5c4c1a8 | ||
|
|
34c485169e | ||
|
|
cb4702b4c5 | ||
|
|
c1a51d68a6 | ||
|
|
9324bc4cd4 | ||
|
|
449d7bedb6 | ||
|
|
bfd3fe8a4a | ||
|
|
9dbbc6ca13 | ||
|
|
83abf56736 | ||
|
|
a695c8eb51 | ||
|
|
a69db02b7f | ||
|
|
73d8401465 | ||
|
|
4a90f97639 | ||
|
|
4da178b0d8 | ||
|
|
f4bbad8615 | ||
|
|
cebdbda260 | ||
|
|
1d45d7514b | ||
|
|
846bd364be | ||
|
|
295ad6b112 | ||
|
|
f4d394d932 | ||
|
|
65e5ff0fb4 | ||
|
|
2f3dd4916f | ||
|
|
a92cc111a2 | ||
|
|
52296999f6 | ||
|
|
9652def4de | ||
|
|
6d1f3ecc9f | ||
|
|
396cb1e102 | ||
|
|
ac0cc6df62 | ||
|
|
29ea3dde47 | ||
|
|
e21d865440 | ||
|
|
04966097fc | ||
|
|
8c2ae8b03d | ||
|
|
9947453ea8 | ||
|
|
4514e333c6 | ||
|
|
daff186ceb | ||
|
|
8359fbd5e7 | ||
|
|
13209d2565 | ||
|
|
9a6f0596b0 | ||
|
|
901308cbc8 | ||
|
|
ea6d8f5aaf | ||
|
|
4051e87d06 | ||
|
|
4619a94ebf | ||
|
|
287fb0b8fd | ||
|
|
847b082b64 | ||
|
|
5f995bcf4b | ||
|
|
64ed560f4f | ||
|
|
1a33a09726 | ||
|
|
26606c71c8 | ||
|
|
e06bcd027f | ||
|
|
9e5d165e79 | ||
|
|
efa5f7977c | ||
|
|
c458af9cd6 | ||
|
|
010ae27471 | ||
|
|
24e189e4d8 | ||
|
|
61a15672bb | ||
|
|
dbeebe72b9 | ||
|
|
014694b04f | ||
|
|
6a1588c78e | ||
|
|
6d7f5ccc8d | ||
|
|
4bb067642f | ||
|
|
c38de0728d | ||
|
|
b93c12564d | ||
|
|
95d760a173 | ||
|
|
123a680669 | ||
|
|
9e114bcaa4 | ||
|
|
5fdc05d18d | ||
|
|
1f11a4fe90 | ||
|
|
ab0473aa42 | ||
|
|
4b60f17bba | ||
|
|
6265dcfb11 | ||
|
|
7e40a9475a | ||
|
|
a6ba04cdf4 | ||
|
|
55c4c14352 | ||
|
|
569bbb0077 | ||
|
|
abfba20b99 | ||
|
|
09231c317d | ||
|
|
1e705438e4 | ||
|
|
d70a0415b9 | ||
|
|
3816e0edf4 | ||
|
|
e7149e0c56 | ||
|
|
3392d99487 | ||
|
|
263e0f3bb2 | ||
|
|
b29cff9b9c | ||
|
|
2479921c71 | ||
|
|
53471a76f1 | ||
|
|
8ac5e7023c | ||
|
|
dfcacb8247 | ||
|
|
cf95a80be6 | ||
|
|
be5db9489e | ||
|
|
f3456a27e7 | ||
|
|
375754f1e6 | ||
|
|
f9c5f4565a | ||
|
|
86da5c2589 | ||
|
|
23891ede86 | ||
|
|
b4dc6fc133 | ||
|
|
0533b5b78e | ||
|
|
976ca18103 | ||
|
|
7e874368f7 | ||
|
|
d3d2a36fbc | ||
|
|
564e16d5ce | ||
|
|
c4313f0b39 | ||
|
|
7a2d96efe1 | ||
|
|
acfe0ad645 | ||
|
|
d07fa5d9d0 | ||
|
|
c101f8049c | ||
|
|
bd0b6ec2fd | ||
|
|
1d02a8b595 | ||
|
|
07be749bf2 | ||
|
|
2952874cb8 | ||
|
|
1cfbdcc9ce | ||
|
|
d4d23c7eb5 | ||
|
|
adca52578d | ||
|
|
3810e943b1 | ||
|
|
ca2a0114a2 | ||
|
|
2c75c27ee8 | ||
|
|
1d0dbeb232 | ||
|
|
d9924962ff | ||
|
|
00e440ebdb | ||
|
|
17f0828c74 | ||
|
|
8298fd2b0a | ||
|
|
7dcb817e6a | ||
|
|
9cf692e897 | ||
|
|
4f4aa1d49f | ||
|
|
9e5a83d8f9 | ||
|
|
c45b8e6c38 | ||
|
|
64d72b7bfd | ||
|
|
b7ce19709d | ||
|
|
5dec8bbbe9 | ||
|
|
4a50efe542 | ||
|
|
bdb18ab19c | ||
|
|
167fb6337b | ||
|
|
c924975434 | ||
|
|
92398409a5 | ||
|
|
c647671607 | ||
|
|
2845d9bf64 | ||
|
|
3d626da232 | ||
|
|
f428a306a1 | ||
|
|
aec1d7592c | ||
|
|
21f2cab710 | ||
|
|
ea9335ff48 | ||
|
|
adc1aacb60 | ||
|
|
814bab6900 | ||
|
|
1f55aaf4a6 | ||
|
|
8be8111008 | ||
|
|
1bec8fe082 | ||
|
|
7d06d7fb5d | ||
|
|
e0ee9becb4 | ||
|
|
0afa3c70bc | ||
|
|
38137b033a | ||
|
|
1200dd871a | ||
|
|
f3170bf64e | ||
|
|
7c9dc11e33 | ||
|
|
848214e789 | ||
|
|
e5240301c7 | ||
|
|
2bd0f7b8c4 | ||
|
|
fbc9a5edcb | ||
|
|
110b54c7c6 | ||
|
|
dbd132dca8 | ||
|
|
0930d9886b | ||
|
|
dd18811600 | ||
|
|
24146a96cf | ||
|
|
7dd3a5bf22 | ||
|
|
9ba672366e | ||
|
|
a1fe5809a4 | ||
|
|
5a3c1ffe7d | ||
|
|
144e1ff4e6 | ||
|
|
3f36196dfd | ||
|
|
f7c9b01800 | ||
|
|
6045158ce6 | ||
|
|
694a173adb | ||
|
|
8bc6da2ffa | ||
|
|
78003a016a | ||
|
|
9e5d0b1a40 | ||
|
|
219dd65bef | ||
|
|
ba423fe3d0 | ||
|
|
e2a54d9ac6 | ||
|
|
44ab0ccf01 | ||
|
|
192e46c32f | ||
|
|
e5c5d1064e | ||
|
|
2fb6da8d85 | ||
|
|
fd680a1cf0 | ||
|
|
313c772f4a | ||
|
|
0781b7d441 | ||
|
|
e6ce7958f2 | ||
|
|
d268ea7d6a | ||
|
|
0eaafe93ac | ||
|
|
8a75823eea | ||
|
|
e841b13166 | ||
|
|
7cb2194c8e | ||
|
|
eac141b69a | ||
|
|
d084ff59f2 | ||
|
|
dcc6f679bc | ||
|
|
3f5e8eb92b | ||
|
|
16879e20ec | ||
|
|
b700cd9101 | ||
|
|
a6d7377213 | ||
|
|
d48feb45fc | ||
|
|
b5c8558934 | ||
|
|
521b9bef33 | ||
|
|
ed3aec55fd | ||
|
|
ef560f19a3 | ||
|
|
6b9d244449 | ||
|
|
16dc670030 | ||
|
|
acd2187a43 | ||
|
|
b8445ebec0 | ||
|
|
4b75a2784c | ||
|
|
2b3947e8a8 | ||
|
|
1c43ca006d | ||
|
|
bc145d8dc8 | ||
|
|
76ee6b8441 | ||
|
|
3adfd18602 | ||
|
|
9e42842bb5 | ||
|
|
a8591daa68 | ||
|
|
265de2ed0d | ||
|
|
36007b6a76 | ||
|
|
34661c5aea | ||
|
|
d53edb5ea7 | ||
|
|
16fbba79ec | ||
|
|
fb4ad9c507 | ||
|
|
9eaaf55f7a | ||
|
|
dc069254c3 | ||
|
|
b97f88bf7e | ||
|
|
2c03b73dff | ||
|
|
6cc148e226 | ||
|
|
f9d76c0be9 | ||
|
|
bcf7032b8b | ||
|
|
0ace960ea5 | ||
|
|
b420c330b2 | ||
|
|
7fd2ae9786 | ||
|
|
3d2f2b4048 | ||
|
|
9fc6e4f4bd | ||
|
|
07fa11a94c | ||
|
|
36c6e4abb9 | ||
|
|
15949d43d1 | ||
|
|
696cd710df | ||
|
|
2d416a8017 | ||
|
|
b565431251 | ||
|
|
480021bc33 | ||
|
|
af448b94a1 | ||
|
|
4bd7195ea6 | ||
|
|
331d3e523d | ||
|
|
b5aee428ba | ||
|
|
3386c7765a | ||
|
|
97a3327f99 | ||
|
|
173ccf70d4 | ||
|
|
7860407cb5 | ||
|
|
4d6bd49719 | ||
|
|
9aa9170110 | ||
|
|
4b3aabebd2 | ||
|
|
1093244d43 | ||
|
|
0577ed8e6e | ||
|
|
4f87b9abd1 | ||
|
|
abe8e93c21 | ||
|
|
f222743e19 | ||
|
|
190b4b7c9e | ||
|
|
d55af7fe7e | ||
|
|
817681fb98 | ||
|
|
f0721df1d9 | ||
|
|
76d29b8df1 | ||
|
|
2f9aae7671 | ||
|
|
0108506433 | ||
|
|
b883da435b | ||
|
|
6a4572a56f | ||
|
|
fba75d93c4 | ||
|
|
c2b399b363 | ||
|
|
786ec27a05 | ||
|
|
2a505f73c4 | ||
|
|
e318641bfa | ||
|
|
6566009e89 | ||
|
|
a350bdc1c4 | ||
|
|
23eeec8769 | ||
|
|
f31d963a64 | ||
|
|
5e0948c142 | ||
|
|
73ada6ce7f | ||
|
|
48311061c1 | ||
|
|
39ad332cee | ||
|
|
90a4692c48 | ||
|
|
fe720be147 | ||
|
|
8d7b0c9c05 | ||
|
|
33b5757921 | ||
|
|
355b88c15d | ||
|
|
74c1b3637e | ||
|
|
9ffd9e6619 | ||
|
|
1460d23294 | ||
|
|
75cf4f0906 | ||
|
|
85c327861a | ||
|
|
c5c3ca370e | ||
|
|
72de930d08 | ||
|
|
8a662fa4b1 | ||
|
|
7546f19b51 | ||
|
|
55fb4d0b67 | ||
|
|
61e353d652 | ||
|
|
5ff45287ea | ||
|
|
6b27c32ee8 | ||
|
|
44869986ca | ||
|
|
2f75846baf | ||
|
|
ec2b3b3b3f | ||
|
|
b9b72f1951 | ||
|
|
ebeb57d7d3 | ||
|
|
e6aae96217 | ||
|
|
511d342a94 | ||
|
|
a1ec600b42 | ||
|
|
06185ea2d1 | ||
|
|
fc42b3ec84 | ||
|
|
5432a70c79 | ||
|
|
d02b01dc85 | ||
|
|
cc3e813786 | ||
|
|
d280fdef70 | ||
|
|
40fd335947 | ||
|
|
6a52f1a9df | ||
|
|
197b0505cb | ||
|
|
f8d899c4f1 | ||
|
|
d5ecae07ad | ||
|
|
8f9f70f922 | ||
|
|
69dcece31a | ||
|
|
34c8a555fa | ||
|
|
fe33ebe83c | ||
|
|
237bb54678 | ||
|
|
95bc884365 | ||
|
|
e45e87cfb7 | ||
|
|
2dc3ca544d | ||
|
|
4fb43c8af0 | ||
|
|
a5d33c992d | ||
|
|
dbd4b4945b | ||
|
|
17704c6e2f | ||
|
|
a35e8df118 | ||
|
|
d9c1214282 | ||
|
|
0674edc2ca | ||
|
|
f335cb0e0b | ||
|
|
c447f6e6bc | ||
|
|
884c8429fc | ||
|
|
5cf0326dcb | ||
|
|
59835a580e | ||
|
|
08f7bfbb5f | ||
|
|
f61cda9b7d | ||
|
|
76016d509b | ||
|
|
4458ef921c | ||
|
|
c9ac67cd05 | ||
|
|
cff5df73d9 | ||
|
|
e398154212 | ||
|
|
0ea26e7ba6 | ||
|
|
8f3bd54c3d | ||
|
|
18a9bcb882 | ||
|
|
7ee36c3a4c | ||
|
|
7f8f47566f | ||
|
|
d6a523e091 | ||
|
|
ac634b1639 | ||
|
|
a0513798bb | ||
|
|
8f4d6bbeba | ||
|
|
cd98a4f740 | ||
|
|
e25e7e767e | ||
|
|
de75303c38 | ||
|
|
32ba9920db | ||
|
|
7ae6a670fa | ||
|
|
cf4f8be5f0 | ||
|
|
ec1b970a32 | ||
|
|
ee6d0cfba9 | ||
|
|
789f6f8e7a | ||
|
|
3d2a52cd82 | ||
|
|
384068ce8c | ||
|
|
7e518596e0 | ||
|
|
f9eb8f93c2 | ||
|
|
d54925f777 | ||
|
|
eae26f958e | ||
|
|
ee7c2c28f1 | ||
|
|
8a2e6ecd8b | ||
|
|
1b0a585256 | ||
|
|
29b6a4307a | ||
|
|
ad4857df94 | ||
|
|
a73e37301a | ||
|
|
255e296113 | ||
|
|
e4696a445d | ||
|
|
81f688433d | ||
|
|
0130af0ff4 | ||
|
|
2cbcbb25b0 | ||
|
|
5197135a0a | ||
|
|
4c67811f65 | ||
|
|
8e8afafae6 | ||
|
|
370cfc43a2 | ||
|
|
d101633cfa | ||
|
|
128bcc4f62 | ||
|
|
050737bea0 | ||
|
|
63e17a19eb | ||
|
|
61e85ded8b | ||
|
|
1cc9fa6815 | ||
|
|
7bdb0331a6 | ||
|
|
623f1d96cf | ||
|
|
1de9535b8c | ||
|
|
68ebc572fc | ||
|
|
5f44ec7d01 | ||
|
|
10aee43cbc | ||
|
|
7e2e09e2a9 | ||
|
|
86ce4d4c18 | ||
|
|
361edd25b7 | ||
|
|
85691a02a6 | ||
|
|
1f96f0e92a | ||
|
|
34a6c13a2d | ||
|
|
542f06007c | ||
|
|
fdbca0fc9d | ||
|
|
632902d7e3 | ||
|
|
9310f1b4a9 | ||
|
|
ed0a46eff5 | ||
|
|
8323900f73 | ||
|
|
c83ae7397d | ||
|
|
3b1bee0eec | ||
|
|
ba1cf545df | ||
|
|
bfb2f9f58b | ||
|
|
13b8ecfe44 | ||
|
|
9e9e188ebf | ||
|
|
5034581e69 | ||
|
|
85ec5eccf7 | ||
|
|
9c8fcc3616 | ||
|
|
7976b61c89 | ||
|
|
43a6b92345 | ||
|
|
f25acae0bc | ||
|
|
9225f53d62 | ||
|
|
eb1b017ec7 | ||
|
|
0ddef9b2db | ||
|
|
1bdb07cefe | ||
|
|
0a879e2207 | ||
|
|
f3c3eab744 | ||
|
|
08209f1d23 | ||
|
|
3ec116ae08 | ||
|
|
3b600a986c | ||
|
|
0d4a38f3a5 | ||
|
|
2410db2ae7 | ||
|
|
e1278bc691 | ||
|
|
899439a906 | ||
|
|
02e3a4ec77 | ||
|
|
7250ce0668 | ||
|
|
2ebe5f2c92 | ||
|
|
3c730a804b | ||
|
|
313975debf | ||
|
|
0abe8e1997 | ||
|
|
bc5c5115cb | ||
|
|
61ac18531a | ||
|
|
0ee21bdbfe | ||
|
|
d116ca5d10 | ||
|
|
26a630dad2 | ||
|
|
2c2730280e | ||
|
|
2e2ba14c53 | ||
|
|
9fa68ca811 | ||
|
|
d38080aa00 | ||
|
|
aa6c1d28ad | ||
|
|
ba4fd784f5 | ||
|
|
3d67d80d49 | ||
|
|
25e97927f9 | ||
|
|
e13205349d | ||
|
|
cc42bfbaaa | ||
|
|
c785c1b82b | ||
|
|
5da1d86a03 | ||
|
|
54b04573f9 | ||
|
|
ba0042bfe2 | ||
|
|
70ed4ae986 | ||
|
|
47dfe606bd | ||
|
|
cc034349cd | ||
|
|
9653207b67 | ||
|
|
82eea41d24 | ||
|
|
8d2121606d | ||
|
|
e28d3d63ea | ||
|
|
c81b74d91b | ||
|
|
17a559b49e | ||
|
|
0e9da05873 | ||
|
|
75cb7a7b2c | ||
|
|
c020831f95 | ||
|
|
55e5910d6b | ||
|
|
de5a22aea0 | ||
|
|
bc563fc5ba | ||
|
|
f50f66c0c9 | ||
|
|
651f98ad06 | ||
|
|
132d894726 | ||
|
|
af26e8504e | ||
|
|
d695f75c24 | ||
|
|
b391bfa718 | ||
|
|
77ca0769e3 | ||
|
|
06496c203e | ||
|
|
da88349b22 | ||
|
|
a41ed768c9 | ||
|
|
688a82dfd9 | ||
|
|
3cb27c3912 | ||
|
|
71e60bf86c | ||
|
|
275b153fc2 | ||
|
|
a4911967eb | ||
|
|
32e7b1529b | ||
|
|
eb2f910daa | ||
|
|
64c34e0d52 | ||
|
|
ec9bd9f6a4 | ||
|
|
4f83e82a74 | ||
|
|
c74313aa15 | ||
|
|
ae6227a9cf | ||
|
|
4bbd79b370 | ||
|
|
e5106dd836 | ||
|
|
1f7520c88b | ||
|
|
8ed5edaefa | ||
|
|
56fe7488ad | ||
|
|
994f0d518e | ||
|
|
e798d3f348 | ||
|
|
e4dafe5aa2 | ||
|
|
9bf97dc1d0 | ||
|
|
38828e8dcd | ||
|
|
8b1431ecce | ||
|
|
bb349b2cee | ||
|
|
4be829988a | ||
|
|
28283c60ea | ||
|
|
a9cede2d5e | ||
|
|
64bef6ba0a |
17
.gitignore
vendored
Normal file
17
.gitignore
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
# Ignore files and directories made by `cmake .`.
|
||||
CMakeFiles/
|
||||
Makefile
|
||||
cmake_install.cmake
|
||||
/CMakeCache.txt
|
||||
/CPackConfig.cmake
|
||||
/CPackSourceConfig.cmake
|
||||
/CTestCustom.cmake
|
||||
/LICENSE.txt
|
||||
/OpenJPEGConfig.cmake
|
||||
/libopenjp2.pc
|
||||
/src/bin/common/opj_apps_config.h
|
||||
/src/lib/openjp2/opj_config.h
|
||||
/src/lib/openjp2/opj_config_private.h
|
||||
|
||||
# Ignore directories made by `make`.
|
||||
/bin/
|
||||
90
.travis.yml
Normal file
90
.travis.yml
Normal file
@@ -0,0 +1,90 @@
|
||||
language: c
|
||||
|
||||
matrix:
|
||||
include:
|
||||
- os: osx
|
||||
compiler: clang
|
||||
env: OPJ_CI_ARCH=x86_64 OPJ_CI_BUILD_CONFIGURATION=Release OPJ_CI_INCLUDE_IF_DEPLOY=1
|
||||
- os: linux
|
||||
compiler: gcc
|
||||
env: OPJ_CI_ARCH=x86_64 OPJ_CI_BUILD_CONFIGURATION=Release OPJ_CI_INCLUDE_IF_DEPLOY=1
|
||||
- os: linux
|
||||
compiler: gcc
|
||||
env: OPJ_CI_ARCH=i386 OPJ_CI_BUILD_CONFIGURATION=Release
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- gcc-multilib
|
||||
- os: linux
|
||||
compiler: gcc
|
||||
env: OPJ_CI_ARCH=x86_64 OPJ_CI_BUILD_CONFIGURATION=Debug
|
||||
- os: linux
|
||||
compiler: clang
|
||||
env: OPJ_CI_ARCH=x86_64 OPJ_CI_BUILD_CONFIGURATION=Debug OPJ_CI_ASAN=1
|
||||
- os: linux
|
||||
compiler: clang-3.8
|
||||
env: OPJ_CI_ARCH=x86_64 OPJ_CI_BUILD_CONFIGURATION=Release
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- llvm-toolchain-precise-3.8
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- clang-3.8
|
||||
- os: linux
|
||||
compiler: x86_64-w64-mingw32-gcc
|
||||
env: OPJ_CI_ARCH=x86_64 OPJ_CI_BUILD_CONFIGURATION=Release
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- gcc-mingw-w64-base
|
||||
- binutils-mingw-w64-x86-64
|
||||
- gcc-mingw-w64-x86-64
|
||||
- gcc-mingw-w64
|
||||
- os: linux
|
||||
compiler: x86_64-w64-mingw32-gcc
|
||||
env: OPJ_CI_ARCH=i386 OPJ_CI_BUILD_CONFIGURATION=Release
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- gcc-mingw-w64-base
|
||||
- binutils-mingw-w64-i686
|
||||
- gcc-mingw-w64-i686
|
||||
- gcc-mingw-w64
|
||||
- os: linux
|
||||
compiler: gcc-4.8
|
||||
env: OPJ_CI_ABI_CHECK=1
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- gcc-4.8
|
||||
- libelf-dev
|
||||
- elfutils
|
||||
- texinfo
|
||||
- exuberant-ctags
|
||||
|
||||
install:
|
||||
- ./tools/travis-ci/install.sh
|
||||
|
||||
script:
|
||||
- ./tools/travis-ci/run.sh
|
||||
- ./tools/travis-ci/abi-check.sh
|
||||
|
||||
before_deploy:
|
||||
- export OPJ_RELEASE_PKG_FILE=$(ls build/openjpeg-${TRAVIS_TAG}*)
|
||||
- echo "deploying $OPJ_RELEASE_PKG_FILE to GitHub releases"
|
||||
|
||||
deploy:
|
||||
provider: releases
|
||||
api_key:
|
||||
secure: Npi13uOffALCVNwea4p4q8v85Lo/WsRqaeZQcWrAkt8MxRnfvWQtmnuwmHnVB6Cig+T1lVUHrklOaJIApIb6nkGq3CS/9bD8+SCS2NEdAAP/QYWnBi0ubWXVMRyDLypmwRpzLNSZ0xLYGFUl2PjieZYKRcz1dd/J7S+FnXhPtdjXweq0FS63zTcMe7ggjfmzSOWUCEFmMjZPaM0Be+3PweieCO1dxlHuy7ugCkx2S7d+5hNsicIhQmTADjqtJAkHoMhYqu6/yLFxhjO/+f938PATFULdODTvjCsUwdN/ySWi1Oj4uPAntfytZP7H6YrzLh8dS73QCsdkhhDJIgJskHIBSbRyyEVUnOvQgD9VaBVGHtc1KtZQTwc41OUO3BGPHl97s3oX6bqWqo/L53dB3TPHGx+1+2HL/F0zaDZuHhAKMkPwe8LFPMPB/ur65zXMHjnWb2ZTVVdoIvkbQ7nu8ApI60ejxocYBsEyAuC2CPXU2ki4jdEhm0E1hIziWNE9/LTuM17ziQuJ6WpXOSMrfP4o5aVDmLp5ZGBSocrspOksgyI9XogHaO/r+Y6N3exy+giObFfMHkZVUpsKrKmtOJ7TC1Vg5HsYGlWW8RN8dkJV47bUXm9K4sMos9eYMUt/czykPAs+132cogpII3QxXpFZQqZg6SEPVfOiyqQzTUI=
|
||||
file_glob: true
|
||||
file: "${OPJ_RELEASE_PKG_FILE}"
|
||||
skip_cleanup: true
|
||||
on:
|
||||
repo: uclouvain/openjpeg
|
||||
tags: true
|
||||
condition: "$OPJ_CI_INCLUDE_IF_DEPLOY = 1"
|
||||
|
||||
21
AUTHORS.md
Normal file
21
AUTHORS.md
Normal file
@@ -0,0 +1,21 @@
|
||||
# Authors of OpenJPEG
|
||||
See also [THANKS](https://github.com/uclouvain/openjpeg/blob/master/THANKS.md)
|
||||
|
||||
David Janssens designed and implemented the first version of OpenJPEG.
|
||||
|
||||
Kaori Hagihara designed and implemented the first version of OpenJPIP.
|
||||
|
||||
Jerome Fimes implemented the alpha version of OpenJPEG 2.0.
|
||||
|
||||
Giuseppe Baruffa added the JPWL functionalities.
|
||||
|
||||
Mickaë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,
|
||||
Herve Drolon,
|
||||
Francois-Olivier Devaux,
|
||||
Antonin Descampe
|
||||
improved the libraries and utilities.
|
||||
|
||||
446
CHANGELOG.md
Normal file
446
CHANGELOG.md
Normal file
@@ -0,0 +1,446 @@
|
||||
# Changelog
|
||||
|
||||
## [v2.1.2](https://github.com/uclouvain/openjpeg/releases/v2.1.2) (2016-09-28)
|
||||
[Full Changelog](https://github.com/uclouvain/openjpeg/compare/v2.1.1...v2.1.2)
|
||||
|
||||
**Closed issues:**
|
||||
|
||||
- null ptr dereference in convert.c:1331 [\#843](https://github.com/uclouvain/openjpeg/issues/843)
|
||||
- Out-of-Bounds Read in function bmp24toimage of convertbmp.c [\#833](https://github.com/uclouvain/openjpeg/issues/833)
|
||||
- Disable automatic compilation of t1\_generate\_luts in CMakeLists.txt [\#831](https://github.com/uclouvain/openjpeg/issues/831)
|
||||
- CVE-2016-7163 Integer overflow in opj\_pi\_create\_decode [\#826](https://github.com/uclouvain/openjpeg/issues/826)
|
||||
- Security Advisory for OpenJPEG [\#810](https://github.com/uclouvain/openjpeg/issues/810)
|
||||
- Add dashboard with static lib [\#804](https://github.com/uclouvain/openjpeg/issues/804)
|
||||
- hidden visibility for the static library / building with -DOPJ\_STATIC against shared lib [\#802](https://github.com/uclouvain/openjpeg/issues/802)
|
||||
- Optimization when building library from source [\#799](https://github.com/uclouvain/openjpeg/issues/799)
|
||||
- unsigned int16 on Solaris 11.2/sparc [\#796](https://github.com/uclouvain/openjpeg/issues/796)
|
||||
- appveyor [\#793](https://github.com/uclouvain/openjpeg/issues/793)
|
||||
- Please make a new release [\#782](https://github.com/uclouvain/openjpeg/issues/782)
|
||||
- FFMpeg will not link to 2.1.1 release built as shared library [\#766](https://github.com/uclouvain/openjpeg/issues/766)
|
||||
- API change since v2: opj\_event\_mgr\_t not available [\#754](https://github.com/uclouvain/openjpeg/issues/754)
|
||||
- openjpeg.h needs dependencies [\#673](https://github.com/uclouvain/openjpeg/issues/673)
|
||||
- "master" does not build on ubuntu [\#658](https://github.com/uclouvain/openjpeg/issues/658)
|
||||
- Package 'openjp2', required by 'libopenjpip', not found [\#594](https://github.com/uclouvain/openjpeg/issues/594)
|
||||
|
||||
**Merged pull requests:**
|
||||
|
||||
- Fix PNM file reading [\#847](https://github.com/uclouvain/openjpeg/pull/847) ([mayeut](https://github.com/mayeut))
|
||||
- Fix some issues reported by Coverity Scan [\#846](https://github.com/uclouvain/openjpeg/pull/846) ([stweil](https://github.com/stweil))
|
||||
- Fix potential out-of-bounds read \(coverity\) [\#844](https://github.com/uclouvain/openjpeg/pull/844) ([stweil](https://github.com/stweil))
|
||||
- Remove TODO for overflow check [\#842](https://github.com/uclouvain/openjpeg/pull/842) ([mayeut](https://github.com/mayeut))
|
||||
- Add overflow checks for opj\_aligned\_malloc [\#841](https://github.com/uclouvain/openjpeg/pull/841) ([mayeut](https://github.com/mayeut))
|
||||
- Flags in T1 shall be unsigned [\#840](https://github.com/uclouvain/openjpeg/pull/840) ([mayeut](https://github.com/mayeut))
|
||||
- Fix some warnings [\#838](https://github.com/uclouvain/openjpeg/pull/838) ([mayeut](https://github.com/mayeut))
|
||||
- Fix issue 833. [\#834](https://github.com/uclouvain/openjpeg/pull/834) ([trylab](https://github.com/trylab))
|
||||
- Add overflow checks for opj\_aligned\_malloc [\#832](https://github.com/uclouvain/openjpeg/pull/832) ([mayeut](https://github.com/mayeut))
|
||||
- Add test for issue 820 [\#829](https://github.com/uclouvain/openjpeg/pull/829) ([mayeut](https://github.com/mayeut))
|
||||
- Add test for issue 826 [\#827](https://github.com/uclouvain/openjpeg/pull/827) ([mayeut](https://github.com/mayeut))
|
||||
- Fix coverity 113065 \(CWE-484\) [\#824](https://github.com/uclouvain/openjpeg/pull/824) ([mayeut](https://github.com/mayeut))
|
||||
- Add sanity check for tile coordinates [\#823](https://github.com/uclouvain/openjpeg/pull/823) ([mayeut](https://github.com/mayeut))
|
||||
- Add test for PR 818 [\#822](https://github.com/uclouvain/openjpeg/pull/822) ([mayeut](https://github.com/mayeut))
|
||||
- Update to libpng 1.6.25 [\#821](https://github.com/uclouvain/openjpeg/pull/821) ([mayeut](https://github.com/mayeut))
|
||||
- fix incrementing of "l\_tcp-\>m\_nb\_mcc\_records" in opj\_j2k\_read\_mcc [\#820](https://github.com/uclouvain/openjpeg/pull/820) ([mayeut](https://github.com/mayeut))
|
||||
- Add overflow check in opj\_tcd\_init\_tile [\#819](https://github.com/uclouvain/openjpeg/pull/819) ([mayeut](https://github.com/mayeut))
|
||||
- Fix leak & invalid behavior of opj\_jp2\_read\_ihdr [\#818](https://github.com/uclouvain/openjpeg/pull/818) ([mayeut](https://github.com/mayeut))
|
||||
- Add overflow check in opj\_j2k\_update\_image\_data [\#817](https://github.com/uclouvain/openjpeg/pull/817) ([mayeut](https://github.com/mayeut))
|
||||
- Change 'restrict' define to 'OPJ\_RESTRICT' [\#816](https://github.com/uclouvain/openjpeg/pull/816) ([mayeut](https://github.com/mayeut))
|
||||
- Switch to clang 3.8 [\#814](https://github.com/uclouvain/openjpeg/pull/814) ([mayeut](https://github.com/mayeut))
|
||||
- Fix an integer overflow issue [\#809](https://github.com/uclouvain/openjpeg/pull/809) ([trylab](https://github.com/trylab))
|
||||
- Update to lcms 2.8 [\#808](https://github.com/uclouvain/openjpeg/pull/808) ([mayeut](https://github.com/mayeut))
|
||||
- Update to libpng 1.6.24 [\#807](https://github.com/uclouvain/openjpeg/pull/807) ([mayeut](https://github.com/mayeut))
|
||||
- Reenable clang-3.9 build on travis [\#806](https://github.com/uclouvain/openjpeg/pull/806) ([mayeut](https://github.com/mayeut))
|
||||
- Bit fields type [\#805](https://github.com/uclouvain/openjpeg/pull/805) ([smuehlst](https://github.com/smuehlst))
|
||||
- Add compilation test for standalone inclusion of openjpeg.h [\#798](https://github.com/uclouvain/openjpeg/pull/798) ([mayeut](https://github.com/mayeut))
|
||||
- jpwl: Remove non-portable data type u\_int16\_t \(fix issue \#796\) [\#797](https://github.com/uclouvain/openjpeg/pull/797) ([stweil](https://github.com/stweil))
|
||||
- Fix dependency for pkg-config \(issue \#594\) [\#795](https://github.com/uclouvain/openjpeg/pull/795) ([stweil](https://github.com/stweil))
|
||||
- Add .gitignore [\#787](https://github.com/uclouvain/openjpeg/pull/787) ([stweil](https://github.com/stweil))
|
||||
|
||||
## [v2.1.1](https://github.com/uclouvain/openjpeg/releases/tag/v2.1.1) (2016-07-05)
|
||||
[Full Changelog](https://github.com/uclouvain/openjpeg/compare/version.2.1...v2.1.1)
|
||||
|
||||
**Implemented enhancements:**
|
||||
|
||||
- opj\_malloc replacement [\#625](https://github.com/uclouvain/openjpeg/issues/625)
|
||||
- backport "-p" and "-force-rgb" options in 1.5 [\#606](https://github.com/uclouvain/openjpeg/issues/606)
|
||||
- Use travis-ci matrix build [\#581](https://github.com/uclouvain/openjpeg/issues/581)
|
||||
- Add Coverity Scan analysis [\#580](https://github.com/uclouvain/openjpeg/issues/580)
|
||||
- Unnecessary rate distortion calculations [\#479](https://github.com/uclouvain/openjpeg/issues/479)
|
||||
- Add images from various security issues to test suite [\#415](https://github.com/uclouvain/openjpeg/issues/415)
|
||||
- Coding speed for 9/7 on 32bits platforms \(x86/ARM\) can be improved with a quick fix [\#220](https://github.com/uclouvain/openjpeg/issues/220)
|
||||
|
||||
**Fixed bugs:**
|
||||
|
||||
- Out-of-Bounds Access in function opj\_tgt\_reset of tgt.c [\#775](https://github.com/uclouvain/openjpeg/issues/775)
|
||||
- Heap Buffer Overflow in function color\_cmyk\_to\_rgb of color.c [\#774](https://github.com/uclouvain/openjpeg/issues/774)
|
||||
- division-by-zero \(SIGFPE\) error in opj\_tcd\_init\_tile function \(line 730 of tcd.c\) [\#733](https://github.com/uclouvain/openjpeg/issues/733)
|
||||
- Out-Of-Bounds Read in sycc422\_to\_rgb function [\#726](https://github.com/uclouvain/openjpeg/issues/726)
|
||||
- Heap Corruption in opj\_free function [\#725](https://github.com/uclouvain/openjpeg/issues/725)
|
||||
- Out-Of-Bounds Read in opj\_tcd\_free\_tile function [\#724](https://github.com/uclouvain/openjpeg/issues/724)
|
||||
- Cannot handle box of undefined size [\#653](https://github.com/uclouvain/openjpeg/issues/653)
|
||||
- Compilation fails without platform-supplied aligned malloc [\#642](https://github.com/uclouvain/openjpeg/issues/642)
|
||||
- HP compiler warns about redeclaration of static function [\#640](https://github.com/uclouvain/openjpeg/issues/640)
|
||||
- Implementation-defined behavior of malloc causes different behavior on Linux and AIX [\#635](https://github.com/uclouvain/openjpeg/issues/635)
|
||||
- Build on AIX fails because "opj\_includes.h" is included after system headers [\#633](https://github.com/uclouvain/openjpeg/issues/633)
|
||||
- Compiling with SSE2 on Linux 32-bit causes crashes in OpenJPEG [\#624](https://github.com/uclouvain/openjpeg/issues/624)
|
||||
- Build on AIX fails because of "restrict" pointers [\#620](https://github.com/uclouvain/openjpeg/issues/620)
|
||||
- bug in new tif conversion code [\#609](https://github.com/uclouvain/openjpeg/issues/609)
|
||||
- bin/jp2/convert.c line 1085 Resource leak [\#607](https://github.com/uclouvain/openjpeg/issues/607)
|
||||
- bin/jp2/convert.c memory leak [\#601](https://github.com/uclouvain/openjpeg/issues/601)
|
||||
- Resource leak in opj\_j2k\_create\_cstr\_index in case of failure [\#599](https://github.com/uclouvain/openjpeg/issues/599)
|
||||
- Resource leak in opj\_j2k\_encode in case of failure [\#598](https://github.com/uclouvain/openjpeg/issues/598)
|
||||
- Resource leak in opj\_j2k\_decode\_one\_tile in case of failure [\#597](https://github.com/uclouvain/openjpeg/issues/597)
|
||||
- Resource Leak [\#573](https://github.com/uclouvain/openjpeg/issues/573)
|
||||
- opj\_compress fails to compress lossless on gcc/x86 \(-m32\) [\#571](https://github.com/uclouvain/openjpeg/issues/571)
|
||||
- Use-after-free in opj\_j2k\_write\_mco [\#563](https://github.com/uclouvain/openjpeg/issues/563)
|
||||
- openjpeg-master-2015-07-30 failed to compile on LINUX [\#556](https://github.com/uclouvain/openjpeg/issues/556)
|
||||
- PNG images are always read as RGB\(A\) images [\#536](https://github.com/uclouvain/openjpeg/issues/536)
|
||||
- g4\_colr.j2c not handled properly [\#532](https://github.com/uclouvain/openjpeg/issues/532)
|
||||
- Bigendian: opj\_compress + opj\_decompress fails [\#518](https://github.com/uclouvain/openjpeg/issues/518)
|
||||
- Suspicious code in j2k.c [\#517](https://github.com/uclouvain/openjpeg/issues/517)
|
||||
- Decode times almost double\(!!\) on Visual Studio 2013, 2015 [\#505](https://github.com/uclouvain/openjpeg/issues/505)
|
||||
- opj\_data/input/nonregression/issue226.j2k [\#500](https://github.com/uclouvain/openjpeg/issues/500)
|
||||
- opj\_setup\_encoder always returns true [\#497](https://github.com/uclouvain/openjpeg/issues/497)
|
||||
- Double free in j2k\_read\_ppm\_v3 parsing \(\(presumably invalid\) image. [\#496](https://github.com/uclouvain/openjpeg/issues/496)
|
||||
- Invalid write in opj\_j2k\_update\_image\_data [\#495](https://github.com/uclouvain/openjpeg/issues/495)
|
||||
- Undefined printf format specifier %ud used in code [\#494](https://github.com/uclouvain/openjpeg/issues/494)
|
||||
- Potential double free on malloc failure in opj\_j2k\_copy\_default\_tcp\_and\_create\_tcp\(\) [\#492](https://github.com/uclouvain/openjpeg/issues/492)
|
||||
- Do not link with -ffast-math [\#488](https://github.com/uclouvain/openjpeg/issues/488)
|
||||
- Heap-buffer-overflow in opj\_dwt\_decode [\#486](https://github.com/uclouvain/openjpeg/issues/486)
|
||||
- opj\_dump fails on Windows 7, 64 bits [\#482](https://github.com/uclouvain/openjpeg/issues/482)
|
||||
- SIGSEGV in opj\_j2k\_update\_image\_data via pdfium\_test [\#481](https://github.com/uclouvain/openjpeg/issues/481)
|
||||
- Heap-buffer-overflow in opj\_j2k\_tcp\_destroy [\#477](https://github.com/uclouvain/openjpeg/issues/477)
|
||||
- Invalid image causes write past end of heap buffer [\#476](https://github.com/uclouvain/openjpeg/issues/476)
|
||||
- Assertion `l\_res-\>x0 \>= 0' fails when parsing invalid images [\#475](https://github.com/uclouvain/openjpeg/issues/475)
|
||||
- Bug on opj\_write\_bytes\_BE function [\#472](https://github.com/uclouvain/openjpeg/issues/472)
|
||||
- Refactor j2k\_read\_ppm\_v3 function [\#470](https://github.com/uclouvain/openjpeg/issues/470)
|
||||
- compression: strange precinct dimensions [\#466](https://github.com/uclouvain/openjpeg/issues/466)
|
||||
- \(:- Console message in opj\_decompress -:\) [\#465](https://github.com/uclouvain/openjpeg/issues/465)
|
||||
- opj\_decompress fails to decompress any files [\#463](https://github.com/uclouvain/openjpeg/issues/463)
|
||||
- bio-\>ct is unnecessarily set to zero in opj\_bio\_flush method [\#461](https://github.com/uclouvain/openjpeg/issues/461)
|
||||
- Maximal unsigned short is 65535, not 65536 [\#460](https://github.com/uclouvain/openjpeg/issues/460)
|
||||
- OpenJpeg fails to encode components with different precision properly [\#459](https://github.com/uclouvain/openjpeg/issues/459)
|
||||
- component precision upscaling isn't correct in opj\_decompress [\#458](https://github.com/uclouvain/openjpeg/issues/458)
|
||||
- Multiple precision components won't get encoded to jp2 if 1 component is unsigned 1 bit [\#457](https://github.com/uclouvain/openjpeg/issues/457)
|
||||
- Incorrect code in ../bin/jp2/convert.c, function rawtoimage\_common\(...\) [\#456](https://github.com/uclouvain/openjpeg/issues/456)
|
||||
- \[OpenJPEG-trunk\] opj\_stream\_get\_number\_byte\_left throws assert [\#455](https://github.com/uclouvain/openjpeg/issues/455)
|
||||
- NR-DEC-kodak\_2layers\_lrcp.j2c-31-decode-md5 fails randomly when running tests in parallel [\#454](https://github.com/uclouvain/openjpeg/issues/454)
|
||||
- compare\_raw\_files doesn't report an error on invalid arguments / missing input files [\#453](https://github.com/uclouvain/openjpeg/issues/453)
|
||||
- Forward discrete wavelet transform: implement periodic symmetric extension at boundaries [\#452](https://github.com/uclouvain/openjpeg/issues/452)
|
||||
- Bug in tiff reading method in convert.c [\#449](https://github.com/uclouvain/openjpeg/issues/449)
|
||||
- Image in pdf don't display [\#447](https://github.com/uclouvain/openjpeg/issues/447)
|
||||
- Multiple issues causing opj\_decompress to segfault [\#446](https://github.com/uclouvain/openjpeg/issues/446)
|
||||
- opj\_compress: 40% of encode time is spent freeing data [\#445](https://github.com/uclouvain/openjpeg/issues/445)
|
||||
- Multiple warnings when configuring OpenJPEG on MacOS with CMake 3.x \(trunk\) [\#443](https://github.com/uclouvain/openjpeg/issues/443)
|
||||
- valgrind memleak found [\#437](https://github.com/uclouvain/openjpeg/issues/437)
|
||||
- global-buffer-overflow src/lib/openjp2/t1.c:1146 opj\_t1\_getwmsedec [\#436](https://github.com/uclouvain/openjpeg/issues/436)
|
||||
- Warning introduced on trunk r2923 & r2924 [\#435](https://github.com/uclouvain/openjpeg/issues/435)
|
||||
- heap-buffer-overflow in opj\_t1\_decode\_cblks [\#432](https://github.com/uclouvain/openjpeg/issues/432)
|
||||
- Heap-buffer-overflow in opj\_tcd\_init\_decode\_tile [\#431](https://github.com/uclouvain/openjpeg/issues/431)
|
||||
- Heap-buffer-overflow in opj\_j2k\_tcp\_destroy [\#430](https://github.com/uclouvain/openjpeg/issues/430)
|
||||
- Heap-buffer-overflow in opj\_jp2\_apply\_pclr [\#429](https://github.com/uclouvain/openjpeg/issues/429)
|
||||
- issue412 revisited [\#428](https://github.com/uclouvain/openjpeg/issues/428)
|
||||
- Image distorted \(sides look cankered\) [\#423](https://github.com/uclouvain/openjpeg/issues/423)
|
||||
- openjpeg-2.x-trunk-r2918 is broken in color.c [\#422](https://github.com/uclouvain/openjpeg/issues/422)
|
||||
- Heap-buffer-overflow in opj\_tcd\_init\_decode\_tile [\#420](https://github.com/uclouvain/openjpeg/issues/420)
|
||||
- Heap-use-after-free in opj\_t1\_decode\_cblks [\#418](https://github.com/uclouvain/openjpeg/issues/418)
|
||||
- UNKNOWN in opj\_read\_bytes\_LE [\#417](https://github.com/uclouvain/openjpeg/issues/417)
|
||||
- Transparency problem [\#416](https://github.com/uclouvain/openjpeg/issues/416)
|
||||
- Image with per channel alpha \(cdef\) does not decode properly [\#414](https://github.com/uclouvain/openjpeg/issues/414)
|
||||
- OpenJPEG crashes with attached image [\#413](https://github.com/uclouvain/openjpeg/issues/413)
|
||||
- Palette image with cdef fails to decompress [\#412](https://github.com/uclouvain/openjpeg/issues/412)
|
||||
- Invalid member values from opj\_read\_header or opj\_decode ? [\#411](https://github.com/uclouvain/openjpeg/issues/411)
|
||||
- MD5 Checksum hangs under valgrind on MacOS X [\#410](https://github.com/uclouvain/openjpeg/issues/410)
|
||||
- Heap-buffer-overflow in opj\_tcd\_get\_decoded\_tile\_size [\#408](https://github.com/uclouvain/openjpeg/issues/408)
|
||||
- C++ style comments in trunk/src/lib/openjp2/j2k.c [\#407](https://github.com/uclouvain/openjpeg/issues/407)
|
||||
- Backport bugfixes from trunk to 2.1 branch [\#405](https://github.com/uclouvain/openjpeg/issues/405)
|
||||
- Heap-buffer-overflow in parse\_cmdline\_encoder [\#403](https://github.com/uclouvain/openjpeg/issues/403)
|
||||
- Heap-buffer-overflow in opj\_v4dwt\_interleave\_h [\#400](https://github.com/uclouvain/openjpeg/issues/400)
|
||||
- Heap-buffer-overflow in opj\_dwt\_decode [\#399](https://github.com/uclouvain/openjpeg/issues/399)
|
||||
- Heap-use-after-free in opj\_t1\_decode\_cblks [\#398](https://github.com/uclouvain/openjpeg/issues/398)
|
||||
- Heap-buffer-overflow in opj\_jp2\_apply\_cdef [\#397](https://github.com/uclouvain/openjpeg/issues/397)
|
||||
- Heap-buffer-overflow in opj\_t2\_read\_packet\_header [\#396](https://github.com/uclouvain/openjpeg/issues/396)
|
||||
- Heap-buffer-overflow in opj\_t2\_read\_packet\_header [\#395](https://github.com/uclouvain/openjpeg/issues/395)
|
||||
- Heap-buffer-overflow in opj\_dwt\_decode\_1 [\#394](https://github.com/uclouvain/openjpeg/issues/394)
|
||||
- Heap-double-free in j2k\_read\_ppm\_v3 [\#393](https://github.com/uclouvain/openjpeg/issues/393)
|
||||
- Security hole in j2k.c [\#392](https://github.com/uclouvain/openjpeg/issues/392)
|
||||
- Security: double-free in opj\_tcd\_code\_block\_dec\_deallocate [\#391](https://github.com/uclouvain/openjpeg/issues/391)
|
||||
- check for negative-size params in code [\#390](https://github.com/uclouvain/openjpeg/issues/390)
|
||||
- Heap-buffer-overflow in opj\_t2\_read\_packet\_header [\#389](https://github.com/uclouvain/openjpeg/issues/389)
|
||||
- Heap overflow in OpenJpeg 1.5.2 [\#388](https://github.com/uclouvain/openjpeg/issues/388)
|
||||
- openjpip.so.6 file too short [\#387](https://github.com/uclouvain/openjpeg/issues/387)
|
||||
- Corrupted JP3D file [\#386](https://github.com/uclouvain/openjpeg/issues/386)
|
||||
- variable assigned to itself [\#383](https://github.com/uclouvain/openjpeg/issues/383)
|
||||
- Null pointer dereferencing [\#382](https://github.com/uclouvain/openjpeg/issues/382)
|
||||
- bad use of case statement [\#381](https://github.com/uclouvain/openjpeg/issues/381)
|
||||
- Release 2.1 as a Ubuntu package [\#380](https://github.com/uclouvain/openjpeg/issues/380)
|
||||
- Bug in libopenjpwl.pc [\#374](https://github.com/uclouvain/openjpeg/issues/374)
|
||||
- inconsistent tile numbering in decode output message [\#370](https://github.com/uclouvain/openjpeg/issues/370)
|
||||
- error in code block calculations [\#369](https://github.com/uclouvain/openjpeg/issues/369)
|
||||
- r2872 fails to compile due to "attempt to use poisoned malloc" error in j2k.c [\#368](https://github.com/uclouvain/openjpeg/issues/368)
|
||||
- OSX build gives libopenjp2.6.dylib with not-absolute install name id [\#367](https://github.com/uclouvain/openjpeg/issues/367)
|
||||
- opj\_decompress gives error but successfully decompress in OPJ 2.1 [\#366](https://github.com/uclouvain/openjpeg/issues/366)
|
||||
- pngtoimage\(\) and imagetopng\(\) have wrong byte order for 16-Bit image [\#365](https://github.com/uclouvain/openjpeg/issues/365)
|
||||
- PDF crash in chrome - part2 \(due to attachment limit\) [\#364](https://github.com/uclouvain/openjpeg/issues/364)
|
||||
- PDF crash in chrome - part1 [\#363](https://github.com/uclouvain/openjpeg/issues/363)
|
||||
- PDF crash in chrome - part0 [\#362](https://github.com/uclouvain/openjpeg/issues/362)
|
||||
- Compilation fails on Windows with mingw32 gcc4.8 [\#361](https://github.com/uclouvain/openjpeg/issues/361)
|
||||
- security issue [\#360](https://github.com/uclouvain/openjpeg/issues/360)
|
||||
- improve memory management [\#359](https://github.com/uclouvain/openjpeg/issues/359)
|
||||
- how to compress a yuv420 raw data using opj\_compress [\#357](https://github.com/uclouvain/openjpeg/issues/357)
|
||||
- Some memory allocation are not checked [\#355](https://github.com/uclouvain/openjpeg/issues/355)
|
||||
- Static library symbols shall be marked as hidden [\#354](https://github.com/uclouvain/openjpeg/issues/354)
|
||||
- opj\_compress rejects valid bmp files [\#353](https://github.com/uclouvain/openjpeg/issues/353)
|
||||
- opj\_compress crashes when number of resolutions is set to zero [\#352](https://github.com/uclouvain/openjpeg/issues/352)
|
||||
- Compilation error under Visual Studio 2003 [\#351](https://github.com/uclouvain/openjpeg/issues/351)
|
||||
- opj\_compress description example error \[Low priority\] [\#350](https://github.com/uclouvain/openjpeg/issues/350)
|
||||
- opj\_write\_bytes\_BE is wrong in trunk [\#345](https://github.com/uclouvain/openjpeg/issues/345)
|
||||
- PART1ONLY option in release.sh doesn't work properly [\#332](https://github.com/uclouvain/openjpeg/issues/332)
|
||||
- openjpeg crash error [\#330](https://github.com/uclouvain/openjpeg/issues/330)
|
||||
- openjpeg decompress error [\#329](https://github.com/uclouvain/openjpeg/issues/329)
|
||||
- openjpeg decompress issue [\#326](https://github.com/uclouvain/openjpeg/issues/326)
|
||||
- limited tif support [\#322](https://github.com/uclouvain/openjpeg/issues/322)
|
||||
- asoc value of 65536 is allowed [\#321](https://github.com/uclouvain/openjpeg/issues/321)
|
||||
- opj\_skip\_from\_file error [\#314](https://github.com/uclouvain/openjpeg/issues/314)
|
||||
- Heavy quota usage in openjpeg [\#309](https://github.com/uclouvain/openjpeg/issues/309)
|
||||
- Verify -help actually match letter [\#307](https://github.com/uclouvain/openjpeg/issues/307)
|
||||
- g3\_colr.j2c not handled [\#288](https://github.com/uclouvain/openjpeg/issues/288)
|
||||
- reopen/fix issue 165 [\#280](https://github.com/uclouvain/openjpeg/issues/280)
|
||||
- kakadu conformance tests [\#279](https://github.com/uclouvain/openjpeg/issues/279)
|
||||
- missing break after case statement in opj\_dwt\_decode\_real [\#274](https://github.com/uclouvain/openjpeg/issues/274)
|
||||
- Run Coverity on trunk [\#270](https://github.com/uclouvain/openjpeg/issues/270)
|
||||
- NR-ENC-random-issue-0005.tif-12-encode [\#259](https://github.com/uclouvain/openjpeg/issues/259)
|
||||
- Use new add\_test signature to handle cross compilation [\#258](https://github.com/uclouvain/openjpeg/issues/258)
|
||||
- Loss decoding quality in 2.0.0 [\#254](https://github.com/uclouvain/openjpeg/issues/254)
|
||||
- Decompress that worked in 1.5.1 fails in 2.0 [\#252](https://github.com/uclouvain/openjpeg/issues/252)
|
||||
- Expected endianness with raw input is not documented leading to SEGFAULT [\#251](https://github.com/uclouvain/openjpeg/issues/251)
|
||||
- OpenJPEG writes to stderr [\#246](https://github.com/uclouvain/openjpeg/issues/246)
|
||||
- Inconsistent logging of tile index [\#245](https://github.com/uclouvain/openjpeg/issues/245)
|
||||
- patch for openjpeg-trunk-r2347 and BIG\_ENDIAN [\#242](https://github.com/uclouvain/openjpeg/issues/242)
|
||||
- CMAP: MTYP == 0 \(direct use\) not handled properly [\#235](https://github.com/uclouvain/openjpeg/issues/235)
|
||||
- Black Pixel [\#233](https://github.com/uclouvain/openjpeg/issues/233)
|
||||
- opj\_compress runtime error after fresh Linux install due to apparent failure to execute ldconfig [\#219](https://github.com/uclouvain/openjpeg/issues/219)
|
||||
- openjp2 debug works, release build does not [\#217](https://github.com/uclouvain/openjpeg/issues/217)
|
||||
- openjpeg-branch15-r2299 and openjpeg-trunk-r2299 fail to decode a JP2 file [\#212](https://github.com/uclouvain/openjpeg/issues/212)
|
||||
- openjpeg-trunk issue with Win7 [\#201](https://github.com/uclouvain/openjpeg/issues/201)
|
||||
- undefined reference to `opj\_version' [\#200](https://github.com/uclouvain/openjpeg/issues/200)
|
||||
- In tgt.c we used fprintf not the openjpeg message reporter [\#184](https://github.com/uclouvain/openjpeg/issues/184)
|
||||
- Windows binaries not working under WinXP [\#176](https://github.com/uclouvain/openjpeg/issues/176)
|
||||
- add ability to use intel ipp \(performance primitive\) within OpenJPEG [\#164](https://github.com/uclouvain/openjpeg/issues/164)
|
||||
- Migration guide v2 [\#160](https://github.com/uclouvain/openjpeg/issues/160)
|
||||
- Cannot decompress JPEG2000Aware3.18.7.3Win32\_kdutranscode6.3.1.j2k [\#158](https://github.com/uclouvain/openjpeg/issues/158)
|
||||
- Cannot decompress JPEG2000Aware3.18.7.3Win32.j2k [\#157](https://github.com/uclouvain/openjpeg/issues/157)
|
||||
- openjpeg@googlegroups.com has disappeard [\#153](https://github.com/uclouvain/openjpeg/issues/153)
|
||||
- OpenJPEG 1.5.0 crashes on a ridiculously big file... [\#151](https://github.com/uclouvain/openjpeg/issues/151)
|
||||
- opj\_image vs free [\#146](https://github.com/uclouvain/openjpeg/issues/146)
|
||||
- Windows .dll file invalid [\#140](https://github.com/uclouvain/openjpeg/issues/140)
|
||||
- Problem with second layer of a 2 layer coded LRCP \(with precincts\) [\#135](https://github.com/uclouvain/openjpeg/issues/135)
|
||||
- version 1.4 crashes when opening PDF file with JPEG2000 images [\#133](https://github.com/uclouvain/openjpeg/issues/133)
|
||||
- Setup a win64 dashboard [\#132](https://github.com/uclouvain/openjpeg/issues/132)
|
||||
- J2KP4files/codestreams\_profile0/p0\_13.j2k question jpeg2000 [\#131](https://github.com/uclouvain/openjpeg/issues/131)
|
||||
- Out of memory: Kill process 11204 \(opj\_server\) score 917 or sacrifice child [\#123](https://github.com/uclouvain/openjpeg/issues/123)
|
||||
- FILE\* in opj API is unsafe [\#120](https://github.com/uclouvain/openjpeg/issues/120)
|
||||
- third-party lib order [\#119](https://github.com/uclouvain/openjpeg/issues/119)
|
||||
- openjpeg-1.5.0-Darwin-powerpc.dmg is huge ! [\#113](https://github.com/uclouvain/openjpeg/issues/113)
|
||||
- misleading info in JP2 box lead to wrong number of components [\#110](https://github.com/uclouvain/openjpeg/issues/110)
|
||||
- Image\_to\_j2k says that j2k files is generated but no file is on the HDD [\#109](https://github.com/uclouvain/openjpeg/issues/109)
|
||||
- Error in openjpegV1.4 on compiling image\_to\_j2k: crash on reading bmp file [\#108](https://github.com/uclouvain/openjpeg/issues/108)
|
||||
- Update to abi-compliance-checker 1.96 [\#106](https://github.com/uclouvain/openjpeg/issues/106)
|
||||
- Decode error on the attached JPEG...works in KDU and with JASPER...please help! [\#101](https://github.com/uclouvain/openjpeg/issues/101)
|
||||
- Mac binaries v1.4 is broken [\#95](https://github.com/uclouvain/openjpeg/issues/95)
|
||||
- jp2\_read\_boxhdr\(\) has size bug in version 1 [\#92](https://github.com/uclouvain/openjpeg/issues/92)
|
||||
- Support for Java JAI Imageio [\#90](https://github.com/uclouvain/openjpeg/issues/90)
|
||||
- encoding test failing [\#86](https://github.com/uclouvain/openjpeg/issues/86)
|
||||
- source archive on demand [\#85](https://github.com/uclouvain/openjpeg/issues/85)
|
||||
- CMakeLists.txt and Makefile.am for JPIP are buggy [\#84](https://github.com/uclouvain/openjpeg/issues/84)
|
||||
- pclr-cmap-cdef [\#82](https://github.com/uclouvain/openjpeg/issues/82)
|
||||
- Error when compiling openjpeg\_v1\_4\_sources\_r697 [\#79](https://github.com/uclouvain/openjpeg/issues/79)
|
||||
- J2K codec issue on Windows Mobile [\#77](https://github.com/uclouvain/openjpeg/issues/77)
|
||||
- image\_to\_j2k.exe crashes on large .bmp file [\#75](https://github.com/uclouvain/openjpeg/issues/75)
|
||||
- fatal error C1900 building the project on windows [\#65](https://github.com/uclouvain/openjpeg/issues/65)
|
||||
- same option but different size [\#54](https://github.com/uclouvain/openjpeg/issues/54)
|
||||
- Missing openjpegConfigure.h [\#38](https://github.com/uclouvain/openjpeg/issues/38)
|
||||
- Not an issue in openjpeg, but ... [\#37](https://github.com/uclouvain/openjpeg/issues/37)
|
||||
- OpenJPEG-1.3.0 pclr, cmap and cdef [\#27](https://github.com/uclouvain/openjpeg/issues/27)
|
||||
- realloc maybe too big \(t2.c\) [\#26](https://github.com/uclouvain/openjpeg/issues/26)
|
||||
- libopenjpeg/opj\_malloc.h breaks on FreeBSD/Darwin systems [\#20](https://github.com/uclouvain/openjpeg/issues/20)
|
||||
- image\_to\_j2k not outputting to win32 console properly [\#18](https://github.com/uclouvain/openjpeg/issues/18)
|
||||
- \[OpenJPEG\] OpenJPEG\_v13: tiled image part 2 [\#17](https://github.com/uclouvain/openjpeg/issues/17)
|
||||
- JP2 Color Space modification by Matteo Italia [\#13](https://github.com/uclouvain/openjpeg/issues/13)
|
||||
- Patch submission \( exotic video formats, and a few things \) [\#12](https://github.com/uclouvain/openjpeg/issues/12)
|
||||
- 16 bits lossy compression [\#10](https://github.com/uclouvain/openjpeg/issues/10)
|
||||
- pnm file formats not accepting bitdepth greater than 8 bpp [\#8](https://github.com/uclouvain/openjpeg/issues/8)
|
||||
- Heap corruption in j2k encoder [\#5](https://github.com/uclouvain/openjpeg/issues/5)
|
||||
- JPWL crash in marker reallocation\(+patch\), segfault while decoding image with main header protection [\#4](https://github.com/uclouvain/openjpeg/issues/4)
|
||||
- a couple of small errors in libopenjpeg detected by coverity [\#1](https://github.com/uclouvain/openjpeg/issues/1)
|
||||
|
||||
**Closed issues:**
|
||||
|
||||
- Shared library build broken on ubuntu [\#728](https://github.com/uclouvain/openjpeg/issues/728)
|
||||
- opj\_includes.h shouldn't define `\_\_attribute\_\_` [\#727](https://github.com/uclouvain/openjpeg/issues/727)
|
||||
- Possible website problems due to Jekyll upgrade [\#713](https://github.com/uclouvain/openjpeg/issues/713)
|
||||
- Stable Release? [\#712](https://github.com/uclouvain/openjpeg/issues/712)
|
||||
- Meta Issue : try to fix some of these critical bugs before thinking about optimizing the library [\#710](https://github.com/uclouvain/openjpeg/issues/710)
|
||||
- Tiled encoding broken for images with non power of 2 dimensions [\#702](https://github.com/uclouvain/openjpeg/issues/702)
|
||||
- install\_name \(still\) not set on OS X [\#700](https://github.com/uclouvain/openjpeg/issues/700)
|
||||
- Add section in wiki describing where one can get test images [\#699](https://github.com/uclouvain/openjpeg/issues/699)
|
||||
- Make EvenManager into singleton [\#698](https://github.com/uclouvain/openjpeg/issues/698)
|
||||
- Remove old branches from repo [\#696](https://github.com/uclouvain/openjpeg/issues/696)
|
||||
- MQ Coder encode: Conditional jump or move depends on uninitialised value\(s\) [\#695](https://github.com/uclouvain/openjpeg/issues/695)
|
||||
- Can we add these files to our test suite ? [\#688](https://github.com/uclouvain/openjpeg/issues/688)
|
||||
- -t and -d command line flags for decode are not documented on OpenJPEG website [\#685](https://github.com/uclouvain/openjpeg/issues/685)
|
||||
- Decoding at the precinct level [\#676](https://github.com/uclouvain/openjpeg/issues/676)
|
||||
- Support unscaled 10 bit data for 2K cinema @ 48 FPS, as per DCI standard [\#671](https://github.com/uclouvain/openjpeg/issues/671)
|
||||
- Use parallel jobs in ctest [\#664](https://github.com/uclouvain/openjpeg/issues/664)
|
||||
- \[Security\]Multiple Memory error [\#663](https://github.com/uclouvain/openjpeg/issues/663)
|
||||
- lossy encoding a 16 bit TIF file : severe artifiacts in decompressed image [\#660](https://github.com/uclouvain/openjpeg/issues/660)
|
||||
- opj\_compress and opj\_decompress : get\_next\_file method uses hard-coded unix path separator [\#630](https://github.com/uclouvain/openjpeg/issues/630)
|
||||
- Uninitialized variable [\#629](https://github.com/uclouvain/openjpeg/issues/629)
|
||||
- Use of enum variable for bit flags prevents compilation as C++ source [\#619](https://github.com/uclouvain/openjpeg/issues/619)
|
||||
- Serious problem with quantization during lossy encoding [\#615](https://github.com/uclouvain/openjpeg/issues/615)
|
||||
- Decompression does not work with sequential data source [\#613](https://github.com/uclouvain/openjpeg/issues/613)
|
||||
- potential overflow in opj\_tcd\_tile\_t [\#605](https://github.com/uclouvain/openjpeg/issues/605)
|
||||
- Logical condition [\#596](https://github.com/uclouvain/openjpeg/issues/596)
|
||||
- file9.jp2 does not dump correctly on 1.5 [\#595](https://github.com/uclouvain/openjpeg/issues/595)
|
||||
- opj\_compress man page is missing documentation of -jpip option [\#593](https://github.com/uclouvain/openjpeg/issues/593)
|
||||
- opj\_compress fails to compress lossless on gcc/x86 \(-m32\) in 1.5 branch [\#591](https://github.com/uclouvain/openjpeg/issues/591)
|
||||
- Example: opj\_compress -i image.j2k -o image.pgm [\#577](https://github.com/uclouvain/openjpeg/issues/577)
|
||||
- Mismatching delete [\#575](https://github.com/uclouvain/openjpeg/issues/575)
|
||||
- Compilation fails on Win7 [\#546](https://github.com/uclouvain/openjpeg/issues/546)
|
||||
- NR-JP2-file5.jp2-compare2base fails with third party libcms [\#540](https://github.com/uclouvain/openjpeg/issues/540)
|
||||
- CTest spits out an error at the end of the test run [\#516](https://github.com/uclouvain/openjpeg/issues/516)
|
||||
- opj\_uint\_adds\(\) is questionable [\#515](https://github.com/uclouvain/openjpeg/issues/515)
|
||||
- Might consider renaming this method: [\#491](https://github.com/uclouvain/openjpeg/issues/491)
|
||||
- opj\_compress run twice gives different fiile sizes for same file [\#490](https://github.com/uclouvain/openjpeg/issues/490)
|
||||
- Android Support [\#483](https://github.com/uclouvain/openjpeg/issues/483)
|
||||
- Add SSE2/SSE41 implementations for mct.c [\#451](https://github.com/uclouvain/openjpeg/issues/451)
|
||||
- Reduce encoder code block memory usage for non 64x64 code block sizes [\#444](https://github.com/uclouvain/openjpeg/issues/444)
|
||||
- valgrind "Uninitialized Memory Read" & "Uninitialized Memory Conditional" found [\#438](https://github.com/uclouvain/openjpeg/issues/438)
|
||||
- No way to debug opj\_tcd\_init\_encode\_tile or opj\_tcd\_init\_decode\_tile [\#433](https://github.com/uclouvain/openjpeg/issues/433)
|
||||
- Add option to call dsymutil on built binaries [\#409](https://github.com/uclouvain/openjpeg/issues/409)
|
||||
- Allow opj\_compress and opj\_decompress to read/write images over stdin/stdout [\#379](https://github.com/uclouvain/openjpeg/issues/379)
|
||||
- reduce memory significantly for single tile RGB encoding [\#375](https://github.com/uclouvain/openjpeg/issues/375)
|
||||
- Switch code repo to github and start using pull request workflow [\#373](https://github.com/uclouvain/openjpeg/issues/373)
|
||||
- This is a BigTIFF file. This format not supported [\#125](https://github.com/uclouvain/openjpeg/issues/125)
|
||||
- Add a test suite to check the convert functions [\#99](https://github.com/uclouvain/openjpeg/issues/99)
|
||||
- Add build config to the dashboard to verify the autotools build [\#88](https://github.com/uclouvain/openjpeg/issues/88)
|
||||
|
||||
**Merged pull requests:**
|
||||
|
||||
- Correct abi-check.sh for PR [\#791](https://github.com/uclouvain/openjpeg/pull/791) ([mayeut](https://github.com/mayeut))
|
||||
- Update tcd.c [\#790](https://github.com/uclouvain/openjpeg/pull/790) ([maddin200](https://github.com/maddin200))
|
||||
- Update lcms2 [\#773](https://github.com/uclouvain/openjpeg/pull/773) ([mayeut](https://github.com/mayeut))
|
||||
- Use lowercase for cmake commands consistenly [\#769](https://github.com/uclouvain/openjpeg/pull/769) ([julienmalik](https://github.com/julienmalik))
|
||||
- Ignore clang's summary warning [\#768](https://github.com/uclouvain/openjpeg/pull/768) ([julienmalik](https://github.com/julienmalik))
|
||||
- Fix UBSan gcc warning for first arg to memset non null [\#767](https://github.com/uclouvain/openjpeg/pull/767) ([julienmalik](https://github.com/julienmalik))
|
||||
- Update to libtiff-4.0.6 [\#764](https://github.com/uclouvain/openjpeg/pull/764) ([mayeut](https://github.com/mayeut))
|
||||
- Fix warnings [\#763](https://github.com/uclouvain/openjpeg/pull/763) ([mayeut](https://github.com/mayeut))
|
||||
- Check SSIZ is valid in opj\_j2k\_read\_siz [\#762](https://github.com/uclouvain/openjpeg/pull/762) ([mayeut](https://github.com/mayeut))
|
||||
- Fix unsigned int overflow reported by UBSan [\#761](https://github.com/uclouvain/openjpeg/pull/761) ([mayeut](https://github.com/mayeut))
|
||||
- Fix unsigned int overflow reported by UBSan [\#759](https://github.com/uclouvain/openjpeg/pull/759) ([mayeut](https://github.com/mayeut))
|
||||
- Fix negative shift left reported by UBSan [\#758](https://github.com/uclouvain/openjpeg/pull/758) ([mayeut](https://github.com/mayeut))
|
||||
- Fix negative shift left reported by UBSan [\#757](https://github.com/uclouvain/openjpeg/pull/757) ([mayeut](https://github.com/mayeut))
|
||||
- Add clang 3.9 build to Travis matrix [\#753](https://github.com/uclouvain/openjpeg/pull/753) ([julienmalik](https://github.com/julienmalik))
|
||||
- Fix implicit floating bool conversion [\#752](https://github.com/uclouvain/openjpeg/pull/752) ([julienmalik](https://github.com/julienmalik))
|
||||
- Do not define \_\_attribute\_\_ in opj\_includes.h [\#751](https://github.com/uclouvain/openjpeg/pull/751) ([mayeut](https://github.com/mayeut))
|
||||
- Allow to read/write 3/5/7/9/11/13/15 bpp TIF files [\#750](https://github.com/uclouvain/openjpeg/pull/750) ([mayeut](https://github.com/mayeut))
|
||||
- Fix heap-buffer-overflow in color\_esycc\_to\_rgb [\#748](https://github.com/uclouvain/openjpeg/pull/748) ([mayeut](https://github.com/mayeut))
|
||||
- update libpng to from 1.6.17 to 1.6.21 [\#747](https://github.com/uclouvain/openjpeg/pull/747) ([julienmalik](https://github.com/julienmalik))
|
||||
- Update cmake & jpylyzer for travis builds [\#746](https://github.com/uclouvain/openjpeg/pull/746) ([julienmalik](https://github.com/julienmalik))
|
||||
- Fix Out-Of-Bounds Read in sycc42x\_to\_rgb function [\#745](https://github.com/uclouvain/openjpeg/pull/745) ([mayeut](https://github.com/mayeut))
|
||||
- cppcheck fix for openjp2 [\#740](https://github.com/uclouvain/openjpeg/pull/740) ([julienmalik](https://github.com/julienmalik))
|
||||
- Fix uninitialized variable reported by cppcheck [\#735](https://github.com/uclouvain/openjpeg/pull/735) ([julienmalik](https://github.com/julienmalik))
|
||||
- Remove dead code in opj\_dump [\#734](https://github.com/uclouvain/openjpeg/pull/734) ([julienmalik](https://github.com/julienmalik))
|
||||
- issue \#695 MQ Encode: ensure that bp pointer never points to uninitialized memory [\#708](https://github.com/uclouvain/openjpeg/pull/708) ([boxerab](https://github.com/boxerab))
|
||||
- Fix issue 135 [\#706](https://github.com/uclouvain/openjpeg/pull/706) ([mayeut](https://github.com/mayeut))
|
||||
- Fix implementation of opj\_calloc [\#705](https://github.com/uclouvain/openjpeg/pull/705) ([stweil](https://github.com/stweil))
|
||||
- \[git/2.1 regression\] Fix opj\_write\_tile\(\) failure when numresolutions=1 [\#690](https://github.com/uclouvain/openjpeg/pull/690) ([rouault](https://github.com/rouault))
|
||||
- Fix fatal crash on 64 bit Linux [\#687](https://github.com/uclouvain/openjpeg/pull/687) ([stweil](https://github.com/stweil))
|
||||
- \[libtiff\] Add missing include statement for ssize\_t [\#686](https://github.com/uclouvain/openjpeg/pull/686) ([mayeut](https://github.com/mayeut))
|
||||
- Fix duplicate article in comments [\#684](https://github.com/uclouvain/openjpeg/pull/684) ([stweil](https://github.com/stweil))
|
||||
- Fix grammar in comment [\#679](https://github.com/uclouvain/openjpeg/pull/679) ([stweil](https://github.com/stweil))
|
||||
- Remove whitespace and CR at line endings [\#678](https://github.com/uclouvain/openjpeg/pull/678) ([stweil](https://github.com/stweil))
|
||||
- Fix typos [\#665](https://github.com/uclouvain/openjpeg/pull/665) ([jwilk](https://github.com/jwilk))
|
||||
- Add missing source for the JPIP library and executables \(issue \#658\) [\#659](https://github.com/uclouvain/openjpeg/pull/659) ([stweil](https://github.com/stweil))
|
||||
- Fix undefined size jp2 box handling [\#654](https://github.com/uclouvain/openjpeg/pull/654) ([mayeut](https://github.com/mayeut))
|
||||
- opj\_decompress: Update error message [\#651](https://github.com/uclouvain/openjpeg/pull/651) ([stweil](https://github.com/stweil))
|
||||
- Fix support of posix\_memalloc for Linux [\#648](https://github.com/uclouvain/openjpeg/pull/648) ([stweil](https://github.com/stweil))
|
||||
- Fix typo in comments [\#647](https://github.com/uclouvain/openjpeg/pull/647) ([stweil](https://github.com/stweil))
|
||||
- Avoid pointer arithmetic with \(void \*\) pointers [\#644](https://github.com/uclouvain/openjpeg/pull/644) ([smuehlst](https://github.com/smuehlst))
|
||||
- Fix HP compiler warning about redeclaration of function \(\#640\) [\#641](https://github.com/uclouvain/openjpeg/pull/641) ([smuehlst](https://github.com/smuehlst))
|
||||
- Fix format strings and unneeded assignment [\#638](https://github.com/uclouvain/openjpeg/pull/638) ([stweil](https://github.com/stweil))
|
||||
- Fix repository for JPEG2000 test data [\#637](https://github.com/uclouvain/openjpeg/pull/637) ([stweil](https://github.com/stweil))
|
||||
- Update allocation functions [\#636](https://github.com/uclouvain/openjpeg/pull/636) ([mayeut](https://github.com/mayeut))
|
||||
- Fix OpenJPEG GitHub issue \#633. [\#634](https://github.com/uclouvain/openjpeg/pull/634) ([smuehlst](https://github.com/smuehlst))
|
||||
- travis-ci: Include add ons in matrix [\#632](https://github.com/uclouvain/openjpeg/pull/632) ([mayeut](https://github.com/mayeut))
|
||||
- Add Appveyor [\#627](https://github.com/uclouvain/openjpeg/pull/627) ([mayeut](https://github.com/mayeut))
|
||||
- Use Travis-ci to run ABI check [\#626](https://github.com/uclouvain/openjpeg/pull/626) ([mayeut](https://github.com/mayeut))
|
||||
- Fix warnings for C++ [\#623](https://github.com/uclouvain/openjpeg/pull/623) ([stweil](https://github.com/stweil))
|
||||
- Fixed problem that C++ compilation failed because of enum variable. [\#622](https://github.com/uclouvain/openjpeg/pull/622) ([smuehlst](https://github.com/smuehlst))
|
||||
- Added missing casts for return values of opj\_malloc\(\)/opj\_calloc\(\). [\#618](https://github.com/uclouvain/openjpeg/pull/618) ([smuehlst](https://github.com/smuehlst))
|
||||
- Add check for seek support before trying TPsot==TNsot workaround [\#617](https://github.com/uclouvain/openjpeg/pull/617) ([mayeut](https://github.com/mayeut))
|
||||
- Fix some typos found by codespell [\#610](https://github.com/uclouvain/openjpeg/pull/610) ([stweil](https://github.com/stweil))
|
||||
- Correct leak in color\_cielab\_to\_rgb [\#590](https://github.com/uclouvain/openjpeg/pull/590) ([mayeut](https://github.com/mayeut))
|
||||
- Add Travis-ci build matrix [\#584](https://github.com/uclouvain/openjpeg/pull/584) ([mayeut](https://github.com/mayeut))
|
||||
- Correct lossless issue on linux x86 [\#579](https://github.com/uclouvain/openjpeg/pull/579) ([mayeut](https://github.com/mayeut))
|
||||
- Travis-ci update [\#578](https://github.com/uclouvain/openjpeg/pull/578) ([mayeut](https://github.com/mayeut))
|
||||
- Correct CMake version requirements [\#572](https://github.com/uclouvain/openjpeg/pull/572) ([mayeut](https://github.com/mayeut))
|
||||
- Add tests for CMYK/esYCC/CIELab [\#567](https://github.com/uclouvain/openjpeg/pull/567) ([mayeut](https://github.com/mayeut))
|
||||
- Add support for CIELab, EYCC and CMYK [\#559](https://github.com/uclouvain/openjpeg/pull/559) ([szukw000](https://github.com/szukw000))
|
||||
- Remove printf/fprintf to stdout/stderr throughout openjp2 lib [\#558](https://github.com/uclouvain/openjpeg/pull/558) ([mayeut](https://github.com/mayeut))
|
||||
- better -ffast-math handling [\#555](https://github.com/uclouvain/openjpeg/pull/555) ([rdieter](https://github.com/rdieter))
|
||||
- Add jpylyzer tests for JP2 compression [\#552](https://github.com/uclouvain/openjpeg/pull/552) ([mayeut](https://github.com/mayeut))
|
||||
- Add COC/QCC in main header when needed [\#551](https://github.com/uclouvain/openjpeg/pull/551) ([mayeut](https://github.com/mayeut))
|
||||
- Use \_\_emul under msvc x86 for fast 64 = 32 \* 32 [\#550](https://github.com/uclouvain/openjpeg/pull/550) ([mayeut](https://github.com/mayeut))
|
||||
- Update convert for PNG output [\#549](https://github.com/uclouvain/openjpeg/pull/549) ([mayeut](https://github.com/mayeut))
|
||||
- Remove some warnings when building [\#548](https://github.com/uclouvain/openjpeg/pull/548) ([mayeut](https://github.com/mayeut))
|
||||
- Switch to libpng-1.6.17 [\#547](https://github.com/uclouvain/openjpeg/pull/547) ([mayeut](https://github.com/mayeut))
|
||||
- Add some missing static keywords [\#545](https://github.com/uclouvain/openjpeg/pull/545) ([mayeut](https://github.com/mayeut))
|
||||
- Switch to libcms2 mm2/Little-CMS@0e8234e090d6aab33f90e2eb0296f30aa0705e57 [\#544](https://github.com/uclouvain/openjpeg/pull/544) ([mayeut](https://github.com/mayeut))
|
||||
- Prevent overflow when coding 16 bits images [\#543](https://github.com/uclouvain/openjpeg/pull/543) ([mayeut](https://github.com/mayeut))
|
||||
- Switch to libcms2-2.6 [\#542](https://github.com/uclouvain/openjpeg/pull/542) ([mayeut](https://github.com/mayeut))
|
||||
- Update PNG support [\#538](https://github.com/uclouvain/openjpeg/pull/538) ([mayeut](https://github.com/mayeut))
|
||||
- Various Minor fixes [\#537](https://github.com/uclouvain/openjpeg/pull/537) ([mayeut](https://github.com/mayeut))
|
||||
- Update TIFF conversion to support more bit depth. [\#535](https://github.com/uclouvain/openjpeg/pull/535) ([mayeut](https://github.com/mayeut))
|
||||
- Add checks for odd looking cmap & for cmap outside jp2h box [\#534](https://github.com/uclouvain/openjpeg/pull/534) ([mayeut](https://github.com/mayeut))
|
||||
- Refactor opj\_j2k\_read\_ppm & opj\_j2k\_read\_ppt [\#533](https://github.com/uclouvain/openjpeg/pull/533) ([mayeut](https://github.com/mayeut))
|
||||
- Add option to force component splitting in imagetopnm [\#531](https://github.com/uclouvain/openjpeg/pull/531) ([mayeut](https://github.com/mayeut))
|
||||
- fix Suspicious code in j2k.c \#517 [\#529](https://github.com/uclouvain/openjpeg/pull/529) ([renevanderark](https://github.com/renevanderark))
|
||||
- Update zlib to version 1.2.8 [\#528](https://github.com/uclouvain/openjpeg/pull/528) ([mayeut](https://github.com/mayeut))
|
||||
- Fix opj\_write\_bytes\_BE \(\#518\) [\#521](https://github.com/uclouvain/openjpeg/pull/521) ([manisandro](https://github.com/manisandro))
|
||||
- Correctly decode files with incorrect tile-part header fields \(TPsot==TNsot\) [\#514](https://github.com/uclouvain/openjpeg/pull/514) ([mayeut](https://github.com/mayeut))
|
||||
- Fixed typos [\#510](https://github.com/uclouvain/openjpeg/pull/510) ([radarhere](https://github.com/radarhere))
|
||||
- Formatted the readme file [\#507](https://github.com/uclouvain/openjpeg/pull/507) ([htmfilho](https://github.com/htmfilho))
|
||||
|
||||
## [version.2.1](https://github.com/uclouvain/openjpeg/releases/tag/version.2.1) (2014-04-29)
|
||||
List of fixed issues and enhancements unavailable, see [NEWS](https://github.com/uclouvain/openjpeg/blob/master/NEWS.md) or [Full Changelog](https://github.com/uclouvain/openjpeg/compare/version.2.0.1...version.2.1)
|
||||
|
||||
## [version.2.0.1](https://github.com/uclouvain/openjpeg/releases/tag/version.2.0.1) (2014-04-22)
|
||||
List of fixed issues and enhancements unavailable, see [NEWS](https://github.com/uclouvain/openjpeg/blob/master/NEWS.md) or [Full Changelog](https://github.com/uclouvain/openjpeg/compare/version.1.5.2...version.2.0.1)
|
||||
|
||||
## [version.1.5.2](https://github.com/uclouvain/openjpeg/releases/tag/version.1.5.2) (2014-03-28)
|
||||
List of fixed issues and enhancements unavailable, see [NEWS](https://github.com/uclouvain/openjpeg/blob/master/NEWS.md) or [Full Changelog](https://github.com/uclouvain/openjpeg/compare/version.2.0...version.1.5.2)
|
||||
|
||||
## [version.2.0](https://github.com/uclouvain/openjpeg/releases/tag/version.2.0) (2014-03-28)
|
||||
List of fixed issues and enhancements unavailable, see [NEWS](https://github.com/uclouvain/openjpeg/blob/master/NEWS.md) or [Full Changelog](https://github.com/uclouvain/openjpeg/compare/version.1.5.1...version.2.0)
|
||||
|
||||
## [version.1.5.1](https://github.com/uclouvain/openjpeg/releases/tag/version.1.5.1) (2012-09-13)
|
||||
List of fixed issues and enhancements unavailable, see [NEWS](https://github.com/uclouvain/openjpeg/blob/master/NEWS.md) or [Full Changelog](https://github.com/uclouvain/openjpeg/compare/version.1.5...version.1.5.1)
|
||||
|
||||
## [version.1.5](https://github.com/uclouvain/openjpeg/releases/tag/version.1.5) (2012-02-07)
|
||||
List of fixed issues and enhancements unavailable, see [NEWS](https://github.com/uclouvain/openjpeg/blob/master/NEWS.md) or [Full Changelog](https://github.com/uclouvain/openjpeg/compare/version.1.3...version.1.5)
|
||||
|
||||
## [version.1.3](https://github.com/uclouvain/openjpeg/releases/tag/version.1.3) (2011-07-03)
|
||||
List of fixed issues and enhancements unavailable, see [NEWS](https://github.com/uclouvain/openjpeg/blob/master/NEWS.md) or [Full Changelog](https://github.com/uclouvain/openjpeg/compare/version.1.4...version.1.3)
|
||||
|
||||
## [version.1.4](https://github.com/uclouvain/openjpeg/releases/tag/version.1.4) (2011-07-03)
|
||||
List of fixed issues and enhancements unavailable, see [NEWS](https://github.com/uclouvain/openjpeg/blob/master/NEWS.md) or [Full Changelog](https://github.com/uclouvain/openjpeg/compare/version.1.2...version.1.4)
|
||||
|
||||
## [version.1.2](https://github.com/uclouvain/openjpeg/releases/tag/version.1.2) (2007-06-04)
|
||||
List of fixed issues and enhancements unavailable, see [NEWS](https://github.com/uclouvain/openjpeg/blob/master/NEWS.md) or [Full Changelog](https://github.com/uclouvain/openjpeg/compare/version.1.1...version.1.2)
|
||||
|
||||
## [version.1.1](https://github.com/uclouvain/openjpeg/releases/tag/version.1.1) (2007-01-31)
|
||||
List of fixed issues and enhancements unavailable, see [NEWS](https://github.com/uclouvain/openjpeg/blob/master/NEWS.md) or [Full Changelog](https://github.com/uclouvain/openjpeg/compare/version.1.0...version.1.1)
|
||||
|
||||
|
||||
|
||||
\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*
|
||||
387
CMakeLists.txt
Normal file
387
CMakeLists.txt
Normal file
@@ -0,0 +1,387 @@
|
||||
# Main CMakeLists.txt to build the OpenJPEG project using CMake (www.cmake.org)
|
||||
# Written by Mathieu Malaterre
|
||||
|
||||
# This CMake project will by default create a library called openjpeg
|
||||
# But if you want to use this project within your own (CMake) project
|
||||
# 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
|
||||
# e.g.:
|
||||
# set(OPENJPEG_NAMESPACE "GDCMOPENJPEG")
|
||||
cmake_minimum_required(VERSION 2.8.2)
|
||||
|
||||
if(COMMAND CMAKE_POLICY)
|
||||
cmake_policy(SET CMP0003 NEW)
|
||||
if (NOT (${CMAKE_VERSION} VERSION_LESS 3.0))
|
||||
cmake_policy(SET CMP0042 NEW)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(NOT OPENJPEG_NAMESPACE)
|
||||
set(OPENJPEG_NAMESPACE "OPENJPEG")
|
||||
set(OPENJPEG_STANDALONE 1)
|
||||
endif()
|
||||
# In all cases:
|
||||
#string(TOLOWER ${OPENJPEG_NAMESPACE} OPENJPEG_LIBRARY_NAME)
|
||||
set(OPENJPEG_LIBRARY_NAME openjp2)
|
||||
|
||||
project(${OPENJPEG_NAMESPACE} C)
|
||||
|
||||
# Do full dependency headers.
|
||||
include_regular_expression("^.*$")
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# OPENJPEG version number, useful for packaging and doxygen doc:
|
||||
set(OPENJPEG_VERSION_MAJOR 2)
|
||||
set(OPENJPEG_VERSION_MINOR 1)
|
||||
set(OPENJPEG_VERSION_BUILD 2)
|
||||
set(OPENJPEG_VERSION
|
||||
"${OPENJPEG_VERSION_MAJOR}.${OPENJPEG_VERSION_MINOR}.${OPENJPEG_VERSION_BUILD}")
|
||||
set(PACKAGE_VERSION
|
||||
"${OPENJPEG_VERSION_MAJOR}.${OPENJPEG_VERSION_MINOR}.${OPENJPEG_VERSION_BUILD}")
|
||||
|
||||
# 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
|
||||
# version | soversion
|
||||
# 1.0 | 0
|
||||
# 1.1 | 1
|
||||
# 1.2 | 2
|
||||
# 1.3 | 3
|
||||
# 1.4 | 4
|
||||
# 1.5 | 5
|
||||
# 1.5.1 | 5
|
||||
# 2.0 | 6
|
||||
# 2.0.1 | 6
|
||||
# 2.1 | 7
|
||||
# 2.1.1 | 7
|
||||
# 2.1.2 | 7
|
||||
# above is the recommendation by the OPJ team. If you really need to override this default,
|
||||
# you can specify your own OPENJPEG_SOVERSION at cmake configuration time:
|
||||
# cmake -DOPENJPEG_SOVERSION:STRING=42 /path/to/openjpeg
|
||||
if(NOT OPENJPEG_SOVERSION)
|
||||
set(OPENJPEG_SOVERSION 7)
|
||||
endif(NOT OPENJPEG_SOVERSION)
|
||||
set(OPENJPEG_LIBRARY_PROPERTIES
|
||||
VERSION "${OPENJPEG_VERSION_MAJOR}.${OPENJPEG_VERSION_MINOR}.${OPENJPEG_VERSION_BUILD}"
|
||||
SOVERSION "${OPENJPEG_SOVERSION}"
|
||||
)
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# Path to additional CMake modules
|
||||
set(CMAKE_MODULE_PATH
|
||||
${${OPENJPEG_NAMESPACE}_SOURCE_DIR}/cmake
|
||||
${CMAKE_MODULE_PATH})
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# On Visual Studio 8 MS deprecated C. This removes all 1.276E1265 security
|
||||
# warnings
|
||||
if(WIN32)
|
||||
if(NOT BORLAND)
|
||||
if(NOT CYGWIN)
|
||||
if(NOT MINGW)
|
||||
if(NOT ITK_ENABLE_VISUAL_STUDIO_DEPRECATED_C_WARNINGS)
|
||||
add_definitions(
|
||||
-D_CRT_FAR_MAPPINGS_NO_DEPRECATE
|
||||
-D_CRT_IS_WCTYPE_NO_DEPRECATE
|
||||
-D_CRT_MANAGED_FP_NO_DEPRECATE
|
||||
-D_CRT_NONSTDC_NO_DEPRECATE
|
||||
-D_CRT_SECURE_NO_DEPRECATE
|
||||
-D_CRT_SECURE_NO_DEPRECATE_GLOBALS
|
||||
-D_CRT_SETERRORMODE_BEEP_SLEEP_NO_DEPRECATE
|
||||
-D_CRT_TIME_FUNCTIONS_NO_DEPRECATE
|
||||
-D_CRT_VCCLRIT_NO_DEPRECATE
|
||||
-D_SCL_SECURE_NO_DEPRECATE
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# Install directories
|
||||
# Build DOCUMENTATION (not in ALL target and only if Doxygen is found)
|
||||
option(BUILD_DOC "Build the HTML documentation (with doxygen if available)." OFF)
|
||||
|
||||
string(TOLOWER ${PROJECT_NAME} projectname)
|
||||
set(OPENJPEG_INSTALL_SUBDIR "${projectname}-${OPENJPEG_VERSION_MAJOR}.${OPENJPEG_VERSION_MINOR}")
|
||||
|
||||
if(NOT OPENJPEG_INSTALL_BIN_DIR)
|
||||
set(OPENJPEG_INSTALL_BIN_DIR "bin")
|
||||
endif()
|
||||
|
||||
if(NOT OPENJPEG_INSTALL_LIB_DIR)
|
||||
set(OPENJPEG_INSTALL_LIB_DIR "lib")
|
||||
endif()
|
||||
|
||||
if(NOT OPENJPEG_INSTALL_SHARE_DIR)
|
||||
set(OPENJPEG_INSTALL_SHARE_DIR "share")
|
||||
endif()
|
||||
|
||||
if(NOT OPENJPEG_INSTALL_DATA_DIR)
|
||||
set(OPENJPEG_INSTALL_DATA_DIR "${OPENJPEG_INSTALL_SHARE_DIR}/${OPENJPEG_INSTALL_SUBDIR}")
|
||||
endif()
|
||||
|
||||
if(NOT OPENJPEG_INSTALL_INCLUDE_DIR)
|
||||
set(OPENJPEG_INSTALL_INCLUDE_DIR "include/${OPENJPEG_INSTALL_SUBDIR}")
|
||||
endif()
|
||||
|
||||
if(BUILD_DOC)
|
||||
if(NOT OPENJPEG_INSTALL_MAN_DIR)
|
||||
set(OPENJPEG_INSTALL_MAN_DIR "share/man/")
|
||||
endif()
|
||||
|
||||
if(NOT OPENJPEG_INSTALL_DOC_DIR)
|
||||
set(OPENJPEG_INSTALL_DOC_DIR "share/doc/${OPENJPEG_INSTALL_SUBDIR}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(NOT OPENJPEG_INSTALL_JNI_DIR)
|
||||
if(WIN32)
|
||||
set(OPENJPEG_INSTALL_JNI_DIR ${OPENJPEG_INSTALL_BIN_DIR})
|
||||
else()
|
||||
set(OPENJPEG_INSTALL_JNI_DIR ${OPENJPEG_INSTALL_LIB_DIR})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(NOT OPENJPEG_INSTALL_PACKAGE_DIR)
|
||||
# We could install *.cmake files in share/ however those files contains
|
||||
# hardcoded path to libraries on a multi-arch system (fedora/debian) those
|
||||
# path will be different (lib/i386-linux-gnu vs lib/x86_64-linux-gnu)
|
||||
set(OPENJPEG_INSTALL_PACKAGE_DIR "${OPENJPEG_INSTALL_LIB_DIR}/${OPENJPEG_INSTALL_SUBDIR}")
|
||||
endif()
|
||||
|
||||
if (APPLE)
|
||||
list(APPEND OPENJPEG_LIBRARY_PROPERTIES INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/${OPENJPEG_INSTALL_LIB_DIR}")
|
||||
option(OPJ_USE_DSYMUTIL "Call dsymutil on binaries after build." OFF)
|
||||
endif()
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# Big endian test:
|
||||
include (${CMAKE_ROOT}/Modules/TestBigEndian.cmake)
|
||||
TEST_BIG_ENDIAN(OPJ_BIG_ENDIAN)
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# Setup file for setting custom ctest vars
|
||||
configure_file(
|
||||
${${OPENJPEG_NAMESPACE}_SOURCE_DIR}/cmake/CTestCustom.cmake.in
|
||||
${${OPENJPEG_NAMESPACE}_BINARY_DIR}/CTestCustom.cmake
|
||||
@ONLY
|
||||
)
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# OpenJPEG build configuration options.
|
||||
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 (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)
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# configure name mangling to allow multiple libraries to coexist
|
||||
# peacefully
|
||||
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/openjpeg_mangle.h.in)
|
||||
set(MANGLE_PREFIX ${OPENJPEG_LIBRARY_NAME})
|
||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/openjpeg_mangle.h.in
|
||||
${CMAKE_CURRENT_BINARY_DIR}/openjpeg_mangle.h
|
||||
@ONLY)
|
||||
endif()
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# Compiler specific flags:
|
||||
if(CMAKE_COMPILER_IS_GNUCC)
|
||||
# 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.
|
||||
# Do not use ffast-math for all build, it would produce incorrect results, only set for release:
|
||||
set(OPENJPEG_LIBRARY_COMPILE_OPTIONS ${OPENJPEG_LIBRARY_COMPILE_OPTIONS} "$<$<CONFIG:Release>:-ffast-math>")
|
||||
endif()
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# opj_config.h generation (1/2)
|
||||
|
||||
# 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("sys/stat.h" HAVE_SYS_STAT_H)
|
||||
CHECK_INCLUDE_FILE("sys/types.h" HAVE_SYS_TYPES_H)
|
||||
CHECK_INCLUDE_FILE("unistd.h" HAVE_UNISTD_H)
|
||||
|
||||
# Enable Large file support
|
||||
include(TestLargeFiles)
|
||||
OPJ_TEST_LARGE_FILES(OPJ_HAVE_LARGEFILES)
|
||||
|
||||
# Allocating Aligned Memory Blocks
|
||||
include(CheckIncludeFiles)
|
||||
check_include_files(malloc.h OPJ_HAVE_MALLOC_H)
|
||||
include(CheckSymbolExists)
|
||||
# _aligned_alloc https://msdn.microsoft.com/en-us/library/8z34s9c6.aspx
|
||||
check_symbol_exists(_aligned_malloc malloc.h OPJ_HAVE__ALIGNED_MALLOC)
|
||||
# posix_memalign (needs _POSIX_C_SOURCE >= 200112L on Linux)
|
||||
set(CMAKE_REQUIRED_DEFINITIONS -D_POSIX_C_SOURCE=200112L)
|
||||
check_symbol_exists(posix_memalign stdlib.h OPJ_HAVE_POSIX_MEMALIGN)
|
||||
unset(CMAKE_REQUIRED_DEFINITIONS)
|
||||
# memalign (obsolete)
|
||||
check_symbol_exists(memalign malloc.h OPJ_HAVE_MEMALIGN)
|
||||
#-----------------------------------------------------------------------------
|
||||
# Build Library
|
||||
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()
|
||||
endif()
|
||||
add_subdirectory(src/lib)
|
||||
option(BUILD_LUTS_GENERATOR "Build utility to generate t1_luts.h" OFF)
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# Build Applications
|
||||
option(BUILD_CODEC "Build the CODEC executables" ON)
|
||||
option(BUILD_MJ2 "Build the MJ2 executables." OFF)
|
||||
option(BUILD_JPWL "Build the JPWL library and executables" OFF)
|
||||
option(BUILD_JPIP "Build the JPIP library and executables." OFF)
|
||||
if(BUILD_JPIP)
|
||||
option(BUILD_JPIP_SERVER "Build the JPIP server." OFF)
|
||||
endif()
|
||||
option(BUILD_VIEWER "Build the OPJViewer executable (C++)" OFF)
|
||||
option(BUILD_JAVA "Build the openjpeg jar (Java)" OFF)
|
||||
option(BUILD_JP3D "Build the JP3D comp" OFF)
|
||||
mark_as_advanced(BUILD_VIEWER)
|
||||
mark_as_advanced(BUILD_JAVA)
|
||||
mark_as_advanced(BUILD_JP3D)
|
||||
|
||||
if(BUILD_CODEC OR BUILD_MJ2)
|
||||
# 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
|
||||
option(BUILD_THIRDPARTY "Build the thirdparty executables if it is needed" OFF)
|
||||
add_subdirectory(thirdparty)
|
||||
add_subdirectory(src/bin)
|
||||
endif ()
|
||||
add_subdirectory(wrapping)
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# opj_config.h generation (2/2)
|
||||
configure_file(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/src/lib/openjp2/opj_config.h.cmake.in
|
||||
${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
|
||||
)
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# build documentation in doc subdir:
|
||||
if(BUILD_DOC)
|
||||
add_subdirectory(doc)
|
||||
endif()
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# Buld Testing
|
||||
option(BUILD_TESTING "Build the tests." OFF)
|
||||
if(BUILD_TESTING)
|
||||
if(BUILD_CODEC)
|
||||
enable_testing()
|
||||
include(CTest)
|
||||
|
||||
# Search openjpeg data needed for the tests
|
||||
# They could be found via git on the OpenJPEG GitHub code project
|
||||
# git clone https://github.com/uclouvain/openjpeg-data.git
|
||||
find_path(OPJ_DATA_ROOT README-OPJ-Data
|
||||
PATHS $ENV{OPJ_DATA_ROOT} ${CMAKE_SOURCE_DIR}/../data
|
||||
NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH
|
||||
)
|
||||
|
||||
# Add repository where to find tests
|
||||
add_subdirectory(tests)
|
||||
|
||||
else()
|
||||
message(FATAL_ERROR "You need build codec to run the tests")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# install all targets referenced as OPENJPEGTargets
|
||||
install(EXPORT OpenJPEGTargets DESTINATION ${OPENJPEG_INSTALL_PACKAGE_DIR})
|
||||
configure_file( ${${OPENJPEG_NAMESPACE}_SOURCE_DIR}/cmake/OpenJPEGConfig.cmake.in
|
||||
${${OPENJPEG_NAMESPACE}_BINARY_DIR}/OpenJPEGConfig.cmake
|
||||
@ONLY
|
||||
)
|
||||
install( FILES ${OPENJPEG_BINARY_DIR}/OpenJPEGConfig.cmake
|
||||
DESTINATION ${OPENJPEG_INSTALL_PACKAGE_DIR}
|
||||
)
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# install CHANGES and LICENSE
|
||||
if(BUILD_DOC)
|
||||
if(EXISTS ${OPENJPEG_SOURCE_DIR}/CHANGES)
|
||||
install(FILES CHANGES DESTINATION ${OPENJPEG_INSTALL_DOC_DIR})
|
||||
endif()
|
||||
|
||||
install(FILES LICENSE DESTINATION ${OPENJPEG_INSTALL_DOC_DIR})
|
||||
endif()
|
||||
|
||||
include (cmake/OpenJPEGCPack.cmake)
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# pkgconfig support
|
||||
# enabled by default on Unix, disabled by default on other platforms
|
||||
if(UNIX)
|
||||
option(BUILD_PKGCONFIG_FILES "Build and install pkg-config files" ON)
|
||||
else()
|
||||
option(BUILD_PKGCONFIG_FILES "Build and install pkg-config files" OFF)
|
||||
endif()
|
||||
if(BUILD_PKGCONFIG_FILES)
|
||||
# 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()
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
7
CTestConfig.cmake
Normal file
7
CTestConfig.cmake
Normal file
@@ -0,0 +1,7 @@
|
||||
set(CTEST_PROJECT_NAME "OPENJPEG")
|
||||
set(CTEST_NIGHTLY_START_TIME "3:00:00 UTC")
|
||||
|
||||
set(CTEST_DROP_METHOD "http")
|
||||
set(CTEST_DROP_SITE "my.cdash.org")
|
||||
set(CTEST_DROP_LOCATION "/submit.php?project=OPENJPEG")
|
||||
set(CTEST_DROP_SITE_CDASH TRUE)
|
||||
75
INSTALL.md
Normal file
75
INSTALL.md
Normal file
@@ -0,0 +1,75 @@
|
||||
|
||||
# OpenJPEG installation
|
||||
|
||||
The build method maintained by OpenJPEG is [CMake](https://cmake.org/).
|
||||
|
||||
## UNIX/LINUX - MacOS (terminal) - WINDOWS (cygwin, MinGW)
|
||||
|
||||
To build the library, type from source tree directory:
|
||||
```
|
||||
mkdir build
|
||||
cd build
|
||||
cmake ..
|
||||
make
|
||||
```
|
||||
Binaries are then located in the 'bin' directory.
|
||||
|
||||
To install the library, type with root privileges:
|
||||
```
|
||||
make install
|
||||
make clean
|
||||
```
|
||||
|
||||
To build the html documentation, you need doxygen to be installed on your system.
|
||||
It will create an "html" directory in TOP\_LEVEL/build/doc)
|
||||
```
|
||||
make doc
|
||||
```
|
||||
|
||||
Main available cmake flags:
|
||||
* To specify the install path: '-DCMAKE\_INSTALL\_PREFIX=/path'
|
||||
* 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.
|
||||
* To build the CODEC executables: '-DBUILD\_CODEC:bool=on' (default: 'ON')
|
||||
* [OBSOLETE] To build the MJ2 executables: '-DBUILD\_MJ2:bool=on' (default: 'OFF')
|
||||
* [OBSOLETE] To build the JPWL executables and JPWL library: '-DBUILD\_JPWL:bool=on' (default: 'OFF')
|
||||
* [OBSOLETE] To build the JPIP client (java compiler recommended) library and executables: '-DBUILD\_JPIP:bool=on' (default: 'OFF')
|
||||
* [OBSOLETE] To build the JPIP server (need fcgi) library and executables: '-DBUILD\_JPIP\_SERVER:bool=on' (default: 'OFF')
|
||||
* 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' -DBUILDNAME:STRING='name_of_the_build'
|
||||
make
|
||||
make Experimental
|
||||
```
|
||||
Note : test data is available on the following github repo: https://github.com/uclouvain/openjpeg-data
|
||||
|
||||
If '-DOPJ\_DATA\_ROOT:PATH' option is omitted, test files will be automatically searched in '${CMAKE\_SOURCE\_DIR}/../data'.
|
||||
|
||||
Note 2 : to execute the encoding test suite, kakadu binaries are needed to decode encoded image and compare it to the baseline. Kakadu binaries are freely available for non-commercial purposes at http://www.kakadusoftware.com. kdu\_expand will need to be in your PATH for cmake to find it.
|
||||
|
||||
Note 3 : OpenJPEG encoder and decoder (not the library itself !) depends on several libraries: png, tiff, lcms, z. If these libraries are not found on the system, they are automatically built from the versions available in the source tree. You can force the use of these embedded version with BUILD\_THIRDPARTY:BOOL=ON. On a Debian-like system you can also simply install these libraries with:
|
||||
```
|
||||
sudo apt-get install liblcms2-dev libtiff-dev libpng-dev libz-dev
|
||||
```
|
||||
|
||||
Note 4 : On MacOS, if it does not work, try adding the following flag to the cmake command :
|
||||
```
|
||||
-DCMAKE_OSX_ARCHITECTURES:STRING=i386
|
||||
```
|
||||
|
||||
## MacOS (XCode) - WINDOWS (VisualStudio, etc)
|
||||
|
||||
You can use cmake to generate the project files for the IDE you are using (VC2010, XCode, etc).
|
||||
Type 'cmake --help' for available generators on your platform.
|
||||
|
||||
# Using OpenJPEG
|
||||
|
||||
To use openjpeg exported cmake file, simply create your application doing:
|
||||
|
||||
```
|
||||
$ cat CMakeLists.txt
|
||||
find_package(OpenJPEG REQUIRED)
|
||||
include_directories(${OPENJPEG_INCLUDE_DIRS})
|
||||
add_executable(myapp myapp.c)
|
||||
target_link_libraries(myapp ${OPENJPEG_LIBRARIES})
|
||||
```
|
||||
@@ -1,7 +1,19 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2003, David Janssens
|
||||
* 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) 2003-2014, Antonin Descampe
|
||||
* Copyright (c) 2003-2009, Francois-Olivier Devaux
|
||||
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
||||
* Copyright (c) 2002-2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
||||
* 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.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@@ -25,15 +37,3 @@
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "j2k.h"
|
||||
|
||||
int bmptoimage(char *filename, j2k_image_t * img, int subsampling_dx,
|
||||
int subsampling_dy, int Dim[2]);
|
||||
|
||||
int pgxtoimage(char *filename, j2k_image_t * img, int tdy,
|
||||
int subsampling_dx, int subsampling_dy, int Dim[2],
|
||||
j2k_cp_t cp);
|
||||
|
||||
int pnmtoimage(char *filename, j2k_image_t * img, int subsampling_dx,
|
||||
int subsampling_dy, int Dim[2]);
|
||||
72
NEWS.md
Normal file
72
NEWS.md
Normal file
@@ -0,0 +1,72 @@
|
||||
# OpenJPEG NEWS
|
||||
|
||||
More details in the [Changelog](https://github.com/uclouvain/openjpeg/blob/master/CHANGELOG.md)
|
||||
|
||||
## OpenJPEG 2.1.2
|
||||
|
||||
* Bug fixes (including security fixes)
|
||||
* No API/ABI break compared to v2.1.1
|
||||
|
||||
## OpenJPEG 2.1.1
|
||||
|
||||
* Huge amount of critical bugfixes
|
||||
* Speed improvements
|
||||
* No API/ABI break compared to v2.1
|
||||
|
||||
## OpenJPEG 2.1.0
|
||||
|
||||
### New Features
|
||||
|
||||
* Digital Cinema profiles have been fixed and updated
|
||||
* New option to disable MCT if needed
|
||||
* extended RAW support: it is now possible to input raw images
|
||||
with subsampled color components (422, 420, etc)
|
||||
* New way to deal with profiles
|
||||
|
||||
### API/ABI modifications
|
||||
(see [here](http://www.openjpeg.org/abi-check/timeline/openjpeg/) for details)
|
||||
|
||||
* Removed deprecated functions
|
||||
* opj_stream_create_default_file_stream(FILE*,...)
|
||||
* opj_stream_create_file_stream(FILE*,...)
|
||||
* opj_stream_set_user_data (opj_stream_t* p_stream, void * p_data)
|
||||
* Added
|
||||
* opj_stream_create_default_file_stream(char*,...)
|
||||
* opj_stream_create_file_stream(char*,...)
|
||||
* opj_stream_destroy(opj_stream_t*)
|
||||
* opj_stream_set_user_data (opj_stream_t* p_stream, void * p_data,
|
||||
... opj_stream_free_user_data_fn p_function)
|
||||
* JPEG 2000 profiles and Part-2 extensions defined through '#define'
|
||||
* Changed
|
||||
* 'alpha' field added to 'opj_image_comp' structure
|
||||
* 'OPJ_CLRSPC_EYCC' added to enum COLOR_SPACE
|
||||
* 'OPJ_CLRSPC_CMYK' added to enum COLOR_SPACE
|
||||
* 'OPJ_CODEC_JPP' and 'OPJ_CODEC_JPX' added to CODEC_FORMAT
|
||||
(not yet used in use)
|
||||
* 'max_cs_size' and 'rsiz' fields added to opj_cparameters_t
|
||||
|
||||
### Misc
|
||||
|
||||
* OpenJPEG is now officially conformant with JPEG 2000 Part-1
|
||||
and will soon become official reference software at the
|
||||
JPEG committee.
|
||||
* Huge amount of bug fixes. See CHANGES for details.
|
||||
|
||||
|
||||
## OpenJPEG 2.0.0
|
||||
|
||||
### New Features
|
||||
|
||||
* streaming capabilities
|
||||
* merge JP3D
|
||||
|
||||
### API modifications
|
||||
(see [here](http://www.openjpeg.org/abi-check/timeline/openjpeg/) for details)
|
||||
|
||||
* Use a 64bits capable API
|
||||
|
||||
### Misc
|
||||
|
||||
* removed autotools build system
|
||||
* folders hierarchies reorganisation
|
||||
* Huge amount of bug fixes. See CHANGES for details.
|
||||
82
README.md
Normal file
82
README.md
Normal file
@@ -0,0 +1,82 @@
|
||||
|
||||
# OPENJPEG Library and Applications
|
||||
|
||||
## What is OpenJPEG ?
|
||||
|
||||
OpenJPEG is an open-source JPEG 2000 codec written in C language. It has been developed in order to promote the use of [JPEG 2000](http://www.jpeg.org/jpeg2000), a still-image compression standard from the Joint Photographic Experts Group ([JPEG](http://www.jpeg.org)). Since April 2015, it is officially recognized by ISO/IEC and ITU-T as a [JPEG 2000 Reference Software](http://www.itu.int/rec/T-REC-T.804-201504-I!Amd2).
|
||||
|
||||
## Who can use the code ?
|
||||
[![badge-license]][link-license]
|
||||
|
||||
Anyone. As the OpenJPEG code is released under the [BSD 2-clause "Simplified" License][link-license], anyone can use or modify the code, even for commercial applications. The only restriction is to retain the copyright in the sources or in the binaries documentation. Of course, if you modified the code in a way that might be of interest for other users, you are encouraged to share it (through a [github pull request](https://github.com/uclouvain/openjpeg/pulls) or by filling an [issue](https://github.com/uclouvain/openjpeg/issues)) but this is not a requirement.
|
||||
|
||||
## How to install and use OpenJPEG ?
|
||||
API Documentation needs a major refactoring. Meanwhile, you can check [installation](https://github.com/uclouvain/openjpeg/wiki/Installation) instructions and [codec documentation](https://github.com/uclouvain/openjpeg/wiki/DocJ2KCodec).
|
||||
|
||||
## Current Status
|
||||
[![badge-build]][link-build]
|
||||
|
||||
[![badge-msvc-build]][link-msvc-build]
|
||||
|
||||
[![badge-coverity]][link-coverity]
|
||||
|
||||
## Who are the developers ?
|
||||
|
||||
The library is developed and maintained by the Image and Signal Processing Group ([ISPGroup](http://sites.uclouvain.be/ispgroup/)), in the Université catholique de Louvain ([UCL](http://www.uclouvain.be/en-index.html), with the support of the [CNES](https://cnes.fr/), the [CS](http://www.c-s.fr/) company and the [intoPIX](http://www.intopix.com) company. The JPWL module has been developed by the Digital Signal Processing Lab ([DSPLab](http://dsplab.diei.unipg.it/)) of the University of Perugia, Italy ([UNIPG](http://www.unipg.it/)).
|
||||
|
||||
## Details on folders hierarchy
|
||||
|
||||
* src
|
||||
* lib
|
||||
* openjp2: contains the sources of the openjp2 library (Part 1 & 2)
|
||||
* 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
|
||||
* jp2: a basic codec
|
||||
* mj2: motion jpeg 2000 executables
|
||||
* jpip: OpenJPIP applications (server and dec server)
|
||||
* java: a Java client viewer for JPIP
|
||||
* jp3d: JP3D applications
|
||||
* tcltk: a test tool for JP3D
|
||||
* wx
|
||||
* 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.
|
||||
* doc: doxygen documentation setup file and man pages
|
||||
* tests: configuration files and utilities for the openjpeg test suite. All test images are located in [openjpeg-data](https://github.com/uclouvain/openjpeg-data) repository.
|
||||
* cmake: cmake related files
|
||||
|
||||
See [LICENSE][link-license] for license and copyright information.
|
||||
|
||||
See [INSTALL](https://github.com/uclouvain/openjpeg/blob/master/INSTALL.md) for installation procedures.
|
||||
|
||||
See [NEWS](https://github.com/uclouvain/openjpeg/blob/master/NEWS.md) for user visible changes in successive releases.
|
||||
|
||||
## API/ABI
|
||||
|
||||
An API/ABI timeline is automatically updated [here][link-api-timeline].
|
||||
|
||||
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 mechanism 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/hiding function and as such the only
|
||||
API available is the one supported by OpenJPEG.
|
||||
|
||||
[comment-license]: https://img.shields.io/github/license/uclouvain/openjpeg.svg "https://img.shields.io/badge/license-BSD--2--Clause-blue.svg"
|
||||
[badge-license]: https://img.shields.io/badge/license-BSD--2--Clause-blue.svg "BSD 2-clause "Simplified" License"
|
||||
[link-license]: https://github.com/uclouvain/openjpeg/blob/master/LICENSE "BSD 2-clause "Simplified" License"
|
||||
[badge-build]: https://travis-ci.org/uclouvain/openjpeg.svg?branch=openjpeg-2.1 "Build Status"
|
||||
[link-build]: https://travis-ci.org/uclouvain/openjpeg "Build Status"
|
||||
[badge-msvc-build]: https://ci.appveyor.com/api/projects/status/github/uclouvain/openjpeg?branch=openjpeg-2.1&svg=true "Windows Build Status"
|
||||
[link-msvc-build]: https://ci.appveyor.com/project/detonin/openjpeg/branch/openjpeg-2.1 "Windows Build Status"
|
||||
[badge-coverity]: https://scan.coverity.com/projects/6383/badge.svg "Coverity Scan Build Status"
|
||||
[link-coverity]: https://scan.coverity.com/projects/uclouvain-openjpeg "Coverity Scan Build Status"
|
||||
[link-api-timeline]: http://www.openjpeg.org/abi-check/timeline/openjpeg "OpenJPEG API/ABI timeline"
|
||||
38
THANKS.md
Normal file
38
THANKS.md
Normal file
@@ -0,0 +1,38 @@
|
||||
# OpenJPEG THANKS file
|
||||
|
||||
Many people have contributed to OpenJPEG by reporting problems, suggesting various improvements,
|
||||
or submitting actual code. Here is a list of these people. Help me keep
|
||||
it complete and exempt of errors.
|
||||
|
||||
* Giuseppe Baruffa
|
||||
* Ben Boeckel
|
||||
* Aaron Boxer
|
||||
* David Burken
|
||||
* Matthieu Darbois
|
||||
* Rex Dieter
|
||||
* Herve Drolon
|
||||
* Antonin Descampe
|
||||
* Francois-Olivier Devaux
|
||||
* Parvatha Elangovan
|
||||
* Jerôme Fimes
|
||||
* Bob Friesenhahn
|
||||
* Kaori Hagihara
|
||||
* Luc Hermitte
|
||||
* Luis Ibanez
|
||||
* David Janssens
|
||||
* Hans Johnson
|
||||
* Callum Lerwick
|
||||
* Ke Liu (Tencent's Xuanwu LAB)
|
||||
* Sebastien Lugan
|
||||
* Benoit Macq
|
||||
* Mathieu Malaterre
|
||||
* Julien Malik
|
||||
* Arnaud Maye
|
||||
* Vincent Nicolas
|
||||
* Glenn Pearson
|
||||
* Even Rouault
|
||||
* Dzonatas Sol
|
||||
* Winfried Szukalski
|
||||
* Vincent Torri
|
||||
* Yannick Verschueren
|
||||
* Peter Wimmer
|
||||
38
appveyor.yml
Normal file
38
appveyor.yml
Normal file
@@ -0,0 +1,38 @@
|
||||
version: 2.1.1.{build}
|
||||
branches:
|
||||
except:
|
||||
- coverity_scan
|
||||
skip_tags: false
|
||||
clone_depth: 50
|
||||
environment:
|
||||
matrix:
|
||||
- OPJ_CI_ARCH: x86
|
||||
OPJ_CI_VSCOMNTOOLS: $(VS140COMNTOOLS)
|
||||
OPJ_CI_INCLUDE_IF_DEPLOY: 1
|
||||
- OPJ_CI_ARCH: x64
|
||||
OPJ_CI_VSCOMNTOOLS: $(VS140COMNTOOLS)
|
||||
OPJ_CI_INCLUDE_IF_DEPLOY: 1
|
||||
- OPJ_CI_ARCH: x86
|
||||
OPJ_CI_VSCOMNTOOLS: $(VS100COMNTOOLS)
|
||||
install:
|
||||
- cmd: c:\cygwin\bin\bash ./tools/travis-ci/install.sh
|
||||
build_script:
|
||||
- cmd: >-
|
||||
"%OPJ_CI_VSCOMNTOOLS%..\..\VC\vcvarsall.bat" %OPJ_CI_ARCH%
|
||||
|
||||
bash ./tools/travis-ci/run.sh
|
||||
test: off
|
||||
#before_deploy:
|
||||
#- cmd: c:\cygwin\bin\bash ./tools/travis-ci/before_deploy.sh
|
||||
deploy:
|
||||
#release: openjpeg-$(appveyor_repo_tag_name)
|
||||
description: 'OpenJPEG $(appveyor_repo_tag_name) has been released. More info [here](https://github.com/uclouvain/openjpeg/blob/$(appveyor_repo_tag_name)/NEWS) and a detailed view [here](https://github.com/uclouvain/openjpeg/blob/$(appveyor_repo_tag_name)/CHANGES).'
|
||||
provider: GitHub
|
||||
auth_token:
|
||||
secure: Huk03f1heCD/HMyA+4ZeVmICdmKn9rPxK5p8/KxzgL+FtJDHlqcllcCrtN9bDxRH # your encrypted token from GitHub
|
||||
artifact: /.*\.zip/ # upload all zip packages to release assets
|
||||
draft: false
|
||||
prerelease: false
|
||||
on:
|
||||
appveyor_repo_tag: true # deploy on tag push only
|
||||
OPJ_CI_INCLUDE_IF_DEPLOY: 1
|
||||
40
cmake/CTestCustom.cmake.in
Normal file
40
cmake/CTestCustom.cmake.in
Normal file
@@ -0,0 +1,40 @@
|
||||
#----------------------------------------------------------------------
|
||||
#
|
||||
# For further details regarding this file,
|
||||
# see http://www.cmake.org/Wiki/CMake_Testing_With_CTest#Customizing_CTest
|
||||
#
|
||||
# and
|
||||
# http://www.kitware.com/blog/home/post/27
|
||||
#
|
||||
#----------------------------------------------------------------------
|
||||
|
||||
set(CTEST_CUSTOM_MAXIMUM_PASSED_TEST_OUTPUT_SIZE 1000000)
|
||||
set(CTEST_CUSTOM_MAXIMUM_NUMBER_OF_ERRORS 50)
|
||||
set(CTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS 2000)
|
||||
|
||||
set(CTEST_CUSTOM_COVERAGE_EXCLUDE
|
||||
${CTEST_CUSTOM_COVERAGE_EXCLUDE}
|
||||
|
||||
# Exclude files from the Testing directories
|
||||
".*/tests/.*"
|
||||
|
||||
# Exclude files from the ThirdParty Utilities directories
|
||||
".*/thirdparty/.*"
|
||||
)
|
||||
|
||||
set(CTEST_CUSTOM_WARNING_EXCEPTION
|
||||
${CTEST_CUSTOM_WARNING_EXCEPTION}
|
||||
|
||||
# Ignore clang's summary warning, assuming prior text has matched some
|
||||
# other warning expression:
|
||||
"[0-9,]+ warnings? generated."
|
||||
# Suppress warning caused by intentional messages about deprecation
|
||||
".*warning,.* is deprecated"
|
||||
# java also warns about deprecated API
|
||||
".*java.*deprecation"
|
||||
".*deprecation.*"
|
||||
# suppress warnings caused by 3rd party libs:
|
||||
".*thirdparty.*"
|
||||
"libtiff.*has no symbols"
|
||||
"libpng.*has no symbols"
|
||||
)
|
||||
26
cmake/EnsureFileInclude.cmake
Normal file
26
cmake/EnsureFileInclude.cmake
Normal file
@@ -0,0 +1,26 @@
|
||||
# Ensure that an include file is provided by the system
|
||||
# Add the check about the mandatory status to the check_include_file macro
|
||||
# provided by cmake
|
||||
|
||||
include (${CMAKE_ROOT}/Modules/CheckIncludeFile.cmake)
|
||||
|
||||
macro(ensure_file_include INCLUDE_FILENAME VARIABLE_NAME MANDATORY_STATUS)
|
||||
|
||||
#message(WARNING "INCLUDE_FILENAME=${INCLUDE_FILENAME} \n"
|
||||
# "VARIABLE_NAME=${VARIABLE_NAME} \n"
|
||||
# "MANDATORY_STATUS=${MANDATORY_STATUS}")
|
||||
|
||||
CHECK_INCLUDE_FILE(${INCLUDE_FILENAME} ${VARIABLE_NAME})
|
||||
|
||||
#message(WARNING "INCLUDE_FILENAME=${INCLUDE_FILENAME} \n"
|
||||
# "VARIABLE_NAME=${VARIABLE_NAME} \n"
|
||||
# "VARIABLE_NAME_VALUE=${${VARIABLE_NAME}} \n"
|
||||
# "MANDATORY_STATUS=${MANDATORY_STATUS}")
|
||||
|
||||
if (NOT ${${VARIABLE_NAME}})
|
||||
if (${MANDATORY_STATUS})
|
||||
message(FATAL_ERROR "The file ${INCLUDE_FILENAME} is mandatory but not found on your system")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
endmacro()
|
||||
16
cmake/FindCPPCHECK.cmake
Normal file
16
cmake/FindCPPCHECK.cmake
Normal file
@@ -0,0 +1,16 @@
|
||||
# cppcheck
|
||||
#
|
||||
# Copyright (c) 2011 Mathieu Malaterre <mathieu.malaterre@gmail.com>
|
||||
#
|
||||
# Redistribution and use is allowed according to the terms of the New
|
||||
# BSD license.
|
||||
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
||||
#
|
||||
|
||||
find_program(CPPCHECK_EXECUTABLE
|
||||
cppcheck
|
||||
)
|
||||
|
||||
mark_as_advanced(
|
||||
CPPCHECK_EXECUTABLE
|
||||
)
|
||||
20
cmake/FindFCGI.cmake
Normal file
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()
|
||||
set(FCGI_LIBRARIES)
|
||||
set(FCGI_INCLUDE_DIRS)
|
||||
endif()
|
||||
|
||||
mark_as_advanced(FCGI_INCLUDE_DIR FCGI_LIBRARY)
|
||||
12
cmake/FindJPYLYZER.cmake
Normal file
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
|
||||
)
|
||||
24
cmake/FindKAKADU.cmake
Normal file
24
cmake/FindKAKADU.cmake
Normal file
@@ -0,0 +1,24 @@
|
||||
#
|
||||
# this module looks for KAKADU
|
||||
# http://www.kakadusoftware.com/
|
||||
#
|
||||
#
|
||||
# Copyright (c) 2006-2014 Mathieu Malaterre <mathieu.malaterre@gmail.com>
|
||||
#
|
||||
# Redistribution and use is allowed according to the terms of the New
|
||||
# BSD license.
|
||||
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
||||
#
|
||||
|
||||
find_program(KDU_EXPAND_EXECUTABLE
|
||||
kdu_expand
|
||||
)
|
||||
|
||||
find_program(KDU_COMPRESS_EXECUTABLE
|
||||
kdu_compress
|
||||
)
|
||||
|
||||
mark_as_advanced(
|
||||
KDU_EXPAND_EXECUTABLE
|
||||
KDU_COMPRESS_EXECUTABLE
|
||||
)
|
||||
31
cmake/FindLCMS.cmake
Normal file
31
cmake/FindLCMS.cmake
Normal file
@@ -0,0 +1,31 @@
|
||||
# - Find LCMS library
|
||||
# Find the native LCMS includes and library
|
||||
# Once done this will define
|
||||
#
|
||||
# LCMS_INCLUDE_DIR - Where to find lcms.h, etc.
|
||||
# LCMS_LIBRARIES - Libraries to link against to use LCMS.
|
||||
# LCMS_FOUND - If false, do not try to use LCMS.
|
||||
#
|
||||
# also defined, but not for general use are
|
||||
# LCMS_LIBRARY, where to find the LCMS library.
|
||||
|
||||
#=============================================================================
|
||||
#=============================================================================
|
||||
|
||||
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)
|
||||
|
||||
find_library(LCMS_LIBRARY NAMES ${LCMS_NAMES} )
|
||||
|
||||
mark_as_advanced(LCMS_INCLUDE_DIR LCMS_LIBRARY)
|
||||
|
||||
# handle the QUIETLY and REQUIRED arguments and set LCMS_FOUND to TRUE if
|
||||
# all listed variables are TRUE
|
||||
include(FindPackageHandleStandardArgs)
|
||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(LCMS DEFAULT_MSG LCMS_LIBRARY LCMS_INCLUDE_DIR)
|
||||
|
||||
if(LCMS_FOUND)
|
||||
set( LCMS_INCLUDE_DIRS ${LCMS_INCLUDE_DIR})
|
||||
set( LCMS_LIBRARIES ${LCMS_LIBRARY} )
|
||||
endif()
|
||||
31
cmake/FindLCMS2.cmake
Normal file
31
cmake/FindLCMS2.cmake
Normal file
@@ -0,0 +1,31 @@
|
||||
# - Find LCMS2 library
|
||||
# Find the native LCMS2 includes and library
|
||||
# Once done this will define
|
||||
#
|
||||
# LCMS2_INCLUDE_DIR - Where to find lcms2.h, etc.
|
||||
# LCMS2_LIBRARIES - Libraries to link against to use LCMS2.
|
||||
# LCMS2_FOUND - If false, do not try to use LCMS2.
|
||||
#
|
||||
# also defined, but not for general use are
|
||||
# LCMS2_LIBRARY - Where to find the LCMS2 library.
|
||||
|
||||
#=============================================================================
|
||||
#=============================================================================
|
||||
|
||||
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)
|
||||
|
||||
find_library(LCMS2_LIBRARY NAMES ${LCMS2_NAMES} )
|
||||
|
||||
mark_as_advanced(LCMS2_INCLUDE_DIR LCMS2_LIBRARY)
|
||||
|
||||
# handle the QUIETLY and REQUIRED arguments and set LCMS2_FOUND to TRUE if
|
||||
# all listed variables are TRUE
|
||||
include(FindPackageHandleStandardArgs)
|
||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(LCMS2 DEFAULT_MSG LCMS2_LIBRARY LCMS2_INCLUDE_DIR)
|
||||
|
||||
if(LCMS2_FOUND)
|
||||
set( LCMS2_INCLUDE_DIRS ${LCMS2_INCLUDE_DIR})
|
||||
set( LCMS2_LIBRARIES ${LCMS2_LIBRARY} )
|
||||
endif()
|
||||
9
cmake/JPIPTestDriver.cmake
Normal file
9
cmake/JPIPTestDriver.cmake
Normal file
@@ -0,0 +1,9 @@
|
||||
# JPIP test driver
|
||||
#message(STATUS "${D_URL}")
|
||||
file(DOWNLOAD
|
||||
"${D_URL}"
|
||||
"${D_FILE}"
|
||||
LOG log
|
||||
EXPECTED_MD5 "${EXPECTED_MD5}"
|
||||
)
|
||||
message(STATUS "LOG: ${log}")
|
||||
72
cmake/OpenJPEGCPack.cmake
Normal file
72
cmake/OpenJPEGCPack.cmake
Normal file
@@ -0,0 +1,72 @@
|
||||
# package bundler
|
||||
if(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake")
|
||||
if(EXISTS "${CMAKE_ROOT}/Modules/InstallRequiredSystemLibraries.cmake")
|
||||
set(CMAKE_INSTALL_MFC_LIBRARIES 0)
|
||||
set(CMAKE_INSTALL_DEBUG_LIBRARIES 0)
|
||||
if(NOT DEFINED CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_NO_WARNINGS)
|
||||
set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_NO_WARNINGS ON)
|
||||
endif()
|
||||
include(${CMAKE_ROOT}/Modules/InstallRequiredSystemLibraries.cmake)
|
||||
endif()
|
||||
|
||||
set(OPJ_PACKAGE_DESCRIPTION_SUMMARY "OpenJPEG - OpenJPEG a JPEG 2000 implementation.")
|
||||
set(OPJ_PACKAGE_CONTACT "openjpeg users <openjpeg@googlegroups.com>")
|
||||
|
||||
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY ${OPJ_PACKAGE_DESCRIPTION_SUMMARY})
|
||||
set(CPACK_PACKAGE_VENDOR "OpenJPEG Team")
|
||||
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/LICENSE"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/LICENSE.txt" COPYONLY
|
||||
)
|
||||
# For PackageMaker on MacOSX it is important to have a file extension:
|
||||
set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_BINARY_DIR}/LICENSE.txt")
|
||||
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_BINARY_DIR}/LICENSE.txt")
|
||||
set(CPACK_PACKAGE_VERSION_MAJOR "${OPENJPEG_VERSION_MAJOR}")
|
||||
set(CPACK_PACKAGE_VERSION_MINOR "${OPENJPEG_VERSION_MINOR}")
|
||||
set(CPACK_PACKAGE_VERSION_PATCH "${OPENJPEG_VERSION_BUILD}")
|
||||
set(CPACK_PACKAGE_INSTALL_DIRECTORY "OpenJPEG ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}")
|
||||
set(CPACK_SOURCE_PACKAGE_FILE_NAME "openjpeg-${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
|
||||
|
||||
# Make this explicit here, rather than accepting the CPack default value,
|
||||
# so we can refer to it:
|
||||
set(CPACK_PACKAGE_NAME "${OPENJPEG_LIBRARY_NAME}")
|
||||
|
||||
if(NOT DEFINED CPACK_SYSTEM_NAME)
|
||||
# make sure package is not Cygwin-unknown, for Cygwin just
|
||||
# cygwin is good for the system name
|
||||
if("${CMAKE_SYSTEM_NAME}" STREQUAL "CYGWIN")
|
||||
set(CPACK_SYSTEM_NAME Cygwin)
|
||||
else()
|
||||
set(CPACK_SYSTEM_NAME ${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR})
|
||||
endif()
|
||||
endif()
|
||||
if(${CPACK_SYSTEM_NAME} MATCHES Windows)
|
||||
if(CMAKE_CL_64)
|
||||
set(CPACK_SYSTEM_NAME win64-x64)
|
||||
else()
|
||||
set(CPACK_SYSTEM_NAME win32-x86)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(NOT DEFINED CPACK_PACKAGE_FILE_NAME)
|
||||
# if the CPACK_PACKAGE_FILE_NAME is not defined by the cache
|
||||
# default to source package - system, on cygwin system is not
|
||||
# needed
|
||||
if(CYGWIN)
|
||||
set(CPACK_PACKAGE_FILE_NAME "${CPACK_SOURCE_PACKAGE_FILE_NAME}")
|
||||
else()
|
||||
set(CPACK_PACKAGE_FILE_NAME
|
||||
"${CPACK_SOURCE_PACKAGE_FILE_NAME}-${CPACK_SYSTEM_NAME}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
set(CPACK_BUNDLE_NAME "OpenJPEG ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}")
|
||||
if(APPLE)
|
||||
configure_file(${CMAKE_ROOT}/Templates/AppleInfo.plist
|
||||
${CMAKE_CURRENT_BINARY_DIR}/opj.plist)
|
||||
set(CPACK_BUNDLE_PLIST
|
||||
${CMAKE_CURRENT_BINARY_DIR}/opj.plist)
|
||||
#include(BundleUtilities)
|
||||
endif()
|
||||
|
||||
include(CPack)
|
||||
endiF(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake")
|
||||
48
cmake/OpenJPEGConfig.cmake.in
Normal file
48
cmake/OpenJPEGConfig.cmake.in
Normal file
@@ -0,0 +1,48 @@
|
||||
#-----------------------------------------------------------------------------
|
||||
#
|
||||
# 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)
|
||||
if(EXISTS ${SELF_DIR}/OpenJPEGTargets.cmake)
|
||||
# This is an install tree
|
||||
include(${SELF_DIR}/OpenJPEGTargets.cmake)
|
||||
get_filename_component(OPENJPEG_INCLUDE_ROOT "${SELF_DIR}/../../@OPENJPEG_INSTALL_INCLUDE_DIR@" ABSOLUTE)
|
||||
set(OPENJPEG_INCLUDE_DIRS ${OPENJPEG_INCLUDE_ROOT})
|
||||
|
||||
else()
|
||||
if(EXISTS ${SELF_DIR}/OpenJPEGExports.cmake)
|
||||
# This is a build tree
|
||||
set( OPENJPEG_INCLUDE_DIRS @OPENJPEG_INCLUDE_PATH@)
|
||||
|
||||
include(${SELF_DIR}/OpenJPEGExports.cmake)
|
||||
|
||||
else()
|
||||
message(FATAL_ERROR "ooops")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
set(OPENJPEG_USE_FILE ${SELF_DIR}/UseOPENJPEG.cmake)
|
||||
|
||||
# Backward compatible part:
|
||||
set(OPENJPEG_FOUND TRUE)
|
||||
|
||||
11
cmake/TestFileOffsetBits.c
Normal file
11
cmake/TestFileOffsetBits.c
Normal file
@@ -0,0 +1,11 @@
|
||||
#include <sys/types.h>
|
||||
|
||||
/* Cause a compile-time error if off_t is smaller than 64 bits */
|
||||
#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
|
||||
int off_t_is_large[ (LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1 ];
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
23
cmake/TestLargeFiles.c.cmake.in
Normal file
23
cmake/TestLargeFiles.c.cmake.in
Normal file
@@ -0,0 +1,23 @@
|
||||
#cmakedefine _LARGEFILE_SOURCE
|
||||
#cmakedefine _LARGE_FILES
|
||||
#cmakedefine _FILE_OFFSET_BITS @_FILE_OFFSET_BITS@
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
/* Cause a compile-time error if off_t is smaller than 64 bits,
|
||||
* and make sure we have ftello / fseeko.
|
||||
*/
|
||||
#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
|
||||
int off_t_is_large[ (LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1 ];
|
||||
FILE *fp = fopen(argv[0],"r");
|
||||
off_t offset = ftello( fp );
|
||||
|
||||
fseeko( fp, offset, SEEK_CUR );
|
||||
fclose(fp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
134
cmake/TestLargeFiles.cmake
Normal file
134
cmake/TestLargeFiles.cmake
Normal file
@@ -0,0 +1,134 @@
|
||||
# - Define macro to check large file support
|
||||
#
|
||||
# OPJ_TEST_LARGE_FILES(VARIABLE)
|
||||
#
|
||||
# VARIABLE will be set to true if off_t is 64 bits, and fseeko/ftello present.
|
||||
# This macro will also defines the necessary variable enable large file support, for instance
|
||||
# _LARGE_FILES
|
||||
# _LARGEFILE_SOURCE
|
||||
# _FILE_OFFSET_BITS 64
|
||||
# OPJ_HAVE_FSEEKO
|
||||
#
|
||||
# However, it is YOUR job to make sure these defines are set in a #cmakedefine so they
|
||||
# end up in a config.h file that is included in your source if necessary!
|
||||
#
|
||||
# Adapted from Gromacs project (http://www.gromacs.org/)
|
||||
# by Julien Malik
|
||||
#
|
||||
|
||||
macro(OPJ_TEST_LARGE_FILES VARIABLE)
|
||||
if(NOT DEFINED ${VARIABLE})
|
||||
|
||||
# On most platforms it is probably overkill to first test the flags for 64-bit off_t,
|
||||
# and then separately fseeko. However, in the future we might have 128-bit filesystems
|
||||
# (ZFS), so it might be dangerous to indiscriminately set e.g. _FILE_OFFSET_BITS=64.
|
||||
|
||||
message(STATUS "Checking for 64-bit off_t")
|
||||
|
||||
# First check without any special flags
|
||||
try_compile(FILE64_OK "${PROJECT_BINARY_DIR}"
|
||||
"${PROJECT_SOURCE_DIR}/cmake/TestFileOffsetBits.c")
|
||||
if(FILE64_OK)
|
||||
message(STATUS "Checking for 64-bit off_t - present")
|
||||
endif()
|
||||
|
||||
if(NOT FILE64_OK)
|
||||
# Test with _FILE_OFFSET_BITS=64
|
||||
try_compile(FILE64_OK "${PROJECT_BINARY_DIR}"
|
||||
"${PROJECT_SOURCE_DIR}/cmake/TestFileOffsetBits.c"
|
||||
COMPILE_DEFINITIONS "-D_FILE_OFFSET_BITS=64" )
|
||||
if(FILE64_OK)
|
||||
message(STATUS "Checking for 64-bit off_t - present with _FILE_OFFSET_BITS=64")
|
||||
set(_FILE_OFFSET_BITS 64)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(NOT FILE64_OK)
|
||||
# Test with _LARGE_FILES
|
||||
try_compile(FILE64_OK "${PROJECT_BINARY_DIR}"
|
||||
"${PROJECT_SOURCE_DIR}/cmake/TestFileOffsetBits.c"
|
||||
COMPILE_DEFINITIONS "-D_LARGE_FILES" )
|
||||
if(FILE64_OK)
|
||||
message(STATUS "Checking for 64-bit off_t - present with _LARGE_FILES")
|
||||
set(_LARGE_FILES 1)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(NOT FILE64_OK)
|
||||
# Test with _LARGEFILE_SOURCE
|
||||
try_compile(FILE64_OK "${PROJECT_BINARY_DIR}"
|
||||
"${PROJECT_SOURCE_DIR}/cmake/TestFileOffsetBits.c"
|
||||
COMPILE_DEFINITIONS "-D_LARGEFILE_SOURCE" )
|
||||
if(FILE64_OK)
|
||||
message(STATUS "Checking for 64-bit off_t - present with _LARGEFILE_SOURCE")
|
||||
set(_LARGEFILE_SOURCE 1)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
|
||||
#if(NOT FILE64_OK)
|
||||
# # now check for Windows stuff
|
||||
# try_compile(FILE64_OK "${PROJECT_BINARY_DIR}"
|
||||
# "${PROJECT_SOURCE_DIR}/cmake/TestWindowsFSeek.c")
|
||||
# if(FILE64_OK)
|
||||
# message(STATUS "Checking for 64-bit off_t - present with _fseeki64")
|
||||
# set(HAVE__FSEEKI64 1)
|
||||
# endif()
|
||||
#endif()
|
||||
|
||||
if(NOT FILE64_OK)
|
||||
message(STATUS "Checking for 64-bit off_t - not present")
|
||||
endif()
|
||||
|
||||
set(_FILE_OFFSET_BITS ${_FILE_OFFSET_BITS} CACHE INTERNAL "Result of test for needed _FILE_OFFSET_BITS=64")
|
||||
set(_LARGE_FILES ${_LARGE_FILES} CACHE INTERNAL "Result of test for needed _LARGE_FILES")
|
||||
set(_LARGEFILE_SOURCE ${_LARGEFILE_SOURCE} CACHE INTERNAL "Result of test for needed _LARGEFILE_SOURCE")
|
||||
|
||||
# Set the flags we might have determined to be required above
|
||||
configure_file("${PROJECT_SOURCE_DIR}/cmake/TestLargeFiles.c.cmake.in"
|
||||
"${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/TestLargeFiles.c")
|
||||
|
||||
message(STATUS "Checking for fseeko/ftello")
|
||||
|
||||
# Test if ftello/fseeko are available
|
||||
try_compile(FSEEKO_COMPILE_OK
|
||||
"${PROJECT_BINARY_DIR}"
|
||||
"${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/TestLargeFiles.c")
|
||||
|
||||
if(FSEEKO_COMPILE_OK)
|
||||
message(STATUS "Checking for fseeko/ftello - present")
|
||||
endif()
|
||||
|
||||
if(NOT FSEEKO_COMPILE_OK)
|
||||
# glibc 2.2 needs _LARGEFILE_SOURCE for fseeko (but not for 64-bit off_t...)
|
||||
try_compile(FSEEKO_COMPILE_OK
|
||||
"${PROJECT_BINARY_DIR}"
|
||||
"${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/TestLargeFiles.c"
|
||||
COMPILE_DEFINITIONS "-D_LARGEFILE_SOURCE" )
|
||||
|
||||
if(FSEEKO_COMPILE_OK)
|
||||
message(STATUS "Checking for fseeko/ftello - present with _LARGEFILE_SOURCE")
|
||||
set(_LARGEFILE_SOURCE ${_LARGEFILE_SOURCE} CACHE INTERNAL "Result of test for needed _LARGEFILE_SOURCE")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(FSEEKO_COMPILE_OK)
|
||||
set(OPJ_HAVE_FSEEKO ON CACHE INTERNAL "Result of test for fseeko/ftello")
|
||||
else()
|
||||
message(STATUS "Checking for fseeko/ftello - not found")
|
||||
set(OPJ_HAVE_FSEEKO OFF CACHE INTERNAL "Result of test for fseeko/ftello")
|
||||
endif()
|
||||
|
||||
if(FILE64_OK AND FSEEKO_COMPILE_OK)
|
||||
message(STATUS "Large File support - found")
|
||||
set(${VARIABLE} ON CACHE INTERNAL "Result of test for large file support")
|
||||
else()
|
||||
message(STATUS "Large File support - not found")
|
||||
set(${VARIABLE} OFF CACHE INTERNAL "Result of test for large file support")
|
||||
endif()
|
||||
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
|
||||
|
||||
11
cmake/TestWindowsFSeek.c
Normal file
11
cmake/TestWindowsFSeek.c
Normal file
@@ -0,0 +1,11 @@
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
int main()
|
||||
{
|
||||
__int64 off=0;
|
||||
|
||||
_fseeki64(NULL, off, SEEK_SET);
|
||||
|
||||
return 0;
|
||||
}
|
||||
39
cmake/openjpeg_valgrind.supp
Normal file
39
cmake/openjpeg_valgrind.supp
Normal file
@@ -0,0 +1,39 @@
|
||||
|
||||
|
||||
{
|
||||
<Appears with libpng uses with Ubuntu10.04 (hulk)>
|
||||
Memcheck:Cond
|
||||
fun:deflate
|
||||
obj:/lib/libpng12.so.0.42.0
|
||||
obj:/lib/libpng12.so.0.42.0
|
||||
obj:/lib/libpng12.so.0.42.0
|
||||
fun:png_write_row
|
||||
fun:imagetopng
|
||||
fun:main
|
||||
}
|
||||
{
|
||||
<Appears with libpng uses with Ubuntu10.04 (hulk)>
|
||||
Memcheck:Value8
|
||||
fun:crc32
|
||||
obj:/lib/libpng12.so.0.42.0
|
||||
fun:png_write_chunk
|
||||
obj:/lib/libpng12.so.0.42.0
|
||||
obj:/lib/libpng12.so.0.42.0
|
||||
obj:/lib/libpng12.so.0.42.0
|
||||
obj:/lib/libpng12.so.0.42.0
|
||||
fun:png_write_row
|
||||
fun:imagetopng
|
||||
fun:main
|
||||
}
|
||||
{
|
||||
<Appears with libpng uses with Ubuntu10.04 (hulk)>
|
||||
Memcheck:Param
|
||||
write(buf)
|
||||
fun:__write_nocancel
|
||||
fun:_IO_file_write@@GLIBC_2.2.5
|
||||
fun:_IO_do_write@@GLIBC_2.2.5
|
||||
fun:_IO_file_close_it@@GLIBC_2.2.5
|
||||
fun:fclose@@GLIBC_2.2.5
|
||||
fun:imagetopng
|
||||
fun:main
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
obj
|
||||
obj.w32
|
||||
bin
|
||||
bin.w32
|
||||
lib
|
||||
lib.w32
|
||||
@@ -1,80 +0,0 @@
|
||||
# $Id$
|
||||
#
|
||||
# makefile for OpenJPEG codec
|
||||
|
||||
OPENJPEG_DIR = ../libopenjpeg
|
||||
|
||||
ifndef DEBUG
|
||||
LDFLAGS = -s -lm
|
||||
else
|
||||
LDFLAGS = -lm
|
||||
endif
|
||||
|
||||
CFLAGS = -Wall -O3 -fno-strength-reduce -fomit-frame-pointer -I$(OPENJPEG_DIR)
|
||||
|
||||
OBJ_DIR_W32 = obj.w32
|
||||
BIN_DIR_W32 = bin.w32
|
||||
LIB_DIR_W32 = $(OPENJPEG_DIR)/lib.w32
|
||||
|
||||
ifdef MINGW32
|
||||
CC = i386-mingw32-gcc
|
||||
CFLAGS += -DDONT_HAVE_GETOPT
|
||||
OBJ_DIR = $(OBJ_DIR_W32)
|
||||
BIN_DIR = $(BIN_DIR_W32)
|
||||
LIB_DIR = lib.w32
|
||||
all: $(addprefix $(BIN_DIR)/,j2k_to_image.exe image_to_j2k.exe)
|
||||
else
|
||||
CC = gcc
|
||||
OBJ_DIR = obj
|
||||
BIN_DIR = bin
|
||||
LIB_DIR = lib
|
||||
all: $(addprefix $(BIN_DIR)/,j2k_to_image image_to_j2k)
|
||||
endif
|
||||
|
||||
ifdef DYNAMIC
|
||||
ifdef MINGW32
|
||||
LIB_OPENJPEG = $(LIB_DIR)/libopenjpeg.dll
|
||||
LDFLAGS += -L$(LIB_DIR) -lopenjpeg
|
||||
else
|
||||
LIB_OPENJPEG = $(OPENJPEG_DIR)/$(LIB_DIR)/libopenjpeg.so
|
||||
LDFLAGS += -L$(OPENJPEG_DIR)/$(LIB_DIR) -lopenjpeg
|
||||
endif
|
||||
else
|
||||
LIB_OPENJPEG = $(OPENJPEG_DIR)/$(LIB_DIR)/libopenjpeg.a
|
||||
LDFLAGS += $(LIB_OPENJPEG)
|
||||
endif
|
||||
|
||||
$(LIB_DIR)/libopenjpeg.dll: $(OPENJPEG_DIR)/$(LIB_DIR)/libopenjpeg.dll
|
||||
ln -sf ../$< $@
|
||||
$(OPENJPEG_DIR)/$(LIB_DIR)/libopenjpeg.dll:
|
||||
cd $(OPENJPEG_DIR) && $(MAKE) $(LIB_DIR)/libopenjpeg.dll
|
||||
$(OPENJPEG_DIR)/$(LIB_DIR)/libopenjpeg.a:
|
||||
cd $(OPENJPEG_DIR) && $(MAKE) $(LIB_DIR)/libopenjpeg.a
|
||||
$(OPENJPEG_DIR)/$(LIB_DIR)/libopenjpeg.so:
|
||||
cd $(OPENJPEG_DIR) && $(MAKE) $(LIB_DIR)/libopenjpeg.so
|
||||
|
||||
$(OBJ_DIR)/%.o:
|
||||
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
|
||||
|
||||
$(OBJ_DIR)/getopt.o: compat/getopt.c
|
||||
$(OBJ_DIR)/convert.o: convert.c
|
||||
$(OBJ_DIR)/j2k_to_image.o: j2k_to_image.c
|
||||
$(OBJ_DIR)/image_to_j2k.o: image_to_j2k.c convert.h
|
||||
|
||||
J2I_OBJS = $(addprefix $(OBJ_DIR)/,j2k_to_image.o)
|
||||
I2J_OBJS = $(addprefix $(OBJ_DIR)/,image_to_j2k.o convert.o)
|
||||
|
||||
$(BIN_DIR)/j2k_to_image: $(J2I_OBJS) $(LIB_OPENJPEG)
|
||||
${CC} -o $@ $(J2I_OBJS) ${LDFLAGS}
|
||||
|
||||
$(BIN_DIR)/image_to_j2k: $(I2J_OBJS) $(LIB_OPENJPEG)
|
||||
${CC} -o $@ $(I2J_OBJS) ${LDFLAGS}
|
||||
|
||||
$(BIN_DIR)/j2k_to_image.exe: $(J2I_OBJS) $(LIB_OPENJPEG)
|
||||
${CC} -o $@ $(J2I_OBJS) ${LDFLAGS}
|
||||
|
||||
$(BIN_DIR)/image_to_j2k.exe: $(I2J_OBJS) $(LIB_OPENJPEG) $(OBJ_DIR)/getopt.o
|
||||
${CC} -o $@ $(I2J_OBJS) ${LDFLAGS} $(OBJ_DIR)/getopt.o
|
||||
|
||||
clean:
|
||||
rm -f $(BIN_DIR_W32)/* $(BIN_DIR)/* $(OBJ_DIR_W32)/* $(OBJ_DIR)/*
|
||||
899
codec/convert.c
899
codec/convert.c
@@ -1,899 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2003, David Janssens
|
||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
||||
* Copyright (c) 2002-2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
||||
* 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 <openjpeg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
|
||||
/* -->> -->> -->> -->>
|
||||
|
||||
BMP IMAGE FORMAT
|
||||
|
||||
<<-- <<-- <<-- <<-- */
|
||||
|
||||
/* UINT2 defines a two byte word */
|
||||
typedef unsigned short int UINT2;
|
||||
|
||||
/* UINT4 defines a four byte word */
|
||||
typedef unsigned long int UINT4;
|
||||
|
||||
typedef struct {
|
||||
UINT2 bfType; /* 'BM' for Bitmap (19776) */
|
||||
UINT4 bfSize; /* Size of the file */
|
||||
UINT2 bfReserved1; /* Reserved : 0 */
|
||||
UINT2 bfReserved2; /* Reserved : 0 */
|
||||
UINT4 bfOffBits; /* Offset */
|
||||
} BITMAPFILEHEADER_t;
|
||||
|
||||
typedef struct {
|
||||
UINT4 biSize; /* Size of the structure in bytes */
|
||||
UINT4 biWidth; /* Width of the image in pixels */
|
||||
UINT4 biHeight; /* Heigth of the image in pixels */
|
||||
UINT2 biPlanes; /* 1 */
|
||||
UINT2 biBitCount; /* Number of color bits by pixels */
|
||||
UINT4 biCompression; /* Type of encoding 0: none 1: RLE8 2: RLE4 */
|
||||
UINT4 biSizeImage; /* Size of the image in bytes */
|
||||
UINT4 biXpelsPerMeter; /* Horizontal (X) resolution in pixels/meter */
|
||||
UINT4 biYpelsPerMeter; /* Vertical (Y) resolution in pixels/meter */
|
||||
UINT4 biClrUsed; /* Number of color used in the image (0: ALL) */
|
||||
UINT4 biClrImportant; /* Number of important color (0: ALL) */
|
||||
} BITMAPINFOHEADER_t;
|
||||
|
||||
int bmptoimage(char *filename, j2k_image_t * img, int subsampling_dx,
|
||||
int subsampling_dy, int Dim[2])
|
||||
{
|
||||
|
||||
FILE *IN;
|
||||
FILE *Compo0 = NULL, *Compo1 = NULL, *Compo2 = NULL;
|
||||
BITMAPFILEHEADER_t File_h;
|
||||
BITMAPINFOHEADER_t Info_h;
|
||||
unsigned char *RGB;
|
||||
unsigned char *table_R, *table_G, *table_B;
|
||||
int i, w, h;
|
||||
int gray_scale = 1, not_end_file = 1, line = 0, col = 0;
|
||||
unsigned char v, v2;
|
||||
UINT4 W, H;
|
||||
|
||||
IN = fopen(filename, "rb");
|
||||
if (!IN) {
|
||||
fprintf(stderr,
|
||||
"\033[0;33mFailed to open %s for reading !!\033[0;39m\n",
|
||||
filename);
|
||||
return 0;
|
||||
}
|
||||
|
||||
File_h.bfType = getc(IN);
|
||||
File_h.bfType = (getc(IN) << 8) + File_h.bfType;
|
||||
|
||||
if (File_h.bfType != 19778) {
|
||||
printf("Error, not a BMP file!\n");
|
||||
return 0;
|
||||
} else {
|
||||
/* FILE HEADER */
|
||||
/* ------------- */
|
||||
File_h.bfSize = getc(IN);
|
||||
File_h.bfSize = (getc(IN) << 8) + File_h.bfSize;
|
||||
File_h.bfSize = (getc(IN) << 16) + File_h.bfSize;
|
||||
File_h.bfSize = (getc(IN) << 24) + File_h.bfSize;
|
||||
|
||||
File_h.bfReserved1 = getc(IN);
|
||||
File_h.bfReserved1 = (getc(IN) << 8) + File_h.bfReserved1;
|
||||
|
||||
File_h.bfReserved2 = getc(IN);
|
||||
File_h.bfReserved2 = (getc(IN) << 8) + File_h.bfReserved2;
|
||||
|
||||
File_h.bfOffBits = getc(IN);
|
||||
File_h.bfOffBits = (getc(IN) << 8) + File_h.bfOffBits;
|
||||
File_h.bfOffBits = (getc(IN) << 16) + File_h.bfOffBits;
|
||||
File_h.bfOffBits = (getc(IN) << 24) + File_h.bfOffBits;
|
||||
|
||||
/* INFO HEADER */
|
||||
/* ------------- */
|
||||
|
||||
Info_h.biSize = getc(IN);
|
||||
Info_h.biSize = (getc(IN) << 8) + Info_h.biSize;
|
||||
Info_h.biSize = (getc(IN) << 16) + Info_h.biSize;
|
||||
Info_h.biSize = (getc(IN) << 24) + Info_h.biSize;
|
||||
|
||||
Info_h.biWidth = getc(IN);
|
||||
Info_h.biWidth = (getc(IN) << 8) + Info_h.biWidth;
|
||||
Info_h.biWidth = (getc(IN) << 16) + Info_h.biWidth;
|
||||
Info_h.biWidth = (getc(IN) << 24) + Info_h.biWidth;
|
||||
w = Info_h.biWidth;
|
||||
|
||||
Info_h.biHeight = getc(IN);
|
||||
Info_h.biHeight = (getc(IN) << 8) + Info_h.biHeight;
|
||||
Info_h.biHeight = (getc(IN) << 16) + Info_h.biHeight;
|
||||
Info_h.biHeight = (getc(IN) << 24) + Info_h.biHeight;
|
||||
h = Info_h.biHeight;
|
||||
|
||||
Info_h.biPlanes = getc(IN);
|
||||
Info_h.biPlanes = (getc(IN) << 8) + Info_h.biPlanes;
|
||||
|
||||
Info_h.biBitCount = getc(IN);
|
||||
Info_h.biBitCount = (getc(IN) << 8) + Info_h.biBitCount;
|
||||
|
||||
Info_h.biCompression = getc(IN);
|
||||
Info_h.biCompression = (getc(IN) << 8) + Info_h.biCompression;
|
||||
Info_h.biCompression = (getc(IN) << 16) + Info_h.biCompression;
|
||||
Info_h.biCompression = (getc(IN) << 24) + Info_h.biCompression;
|
||||
|
||||
Info_h.biSizeImage = getc(IN);
|
||||
Info_h.biSizeImage = (getc(IN) << 8) + Info_h.biSizeImage;
|
||||
Info_h.biSizeImage = (getc(IN) << 16) + Info_h.biSizeImage;
|
||||
Info_h.biSizeImage = (getc(IN) << 24) + Info_h.biSizeImage;
|
||||
|
||||
Info_h.biXpelsPerMeter = getc(IN);
|
||||
Info_h.biXpelsPerMeter = (getc(IN) << 8) + Info_h.biXpelsPerMeter;
|
||||
Info_h.biXpelsPerMeter = (getc(IN) << 16) + Info_h.biXpelsPerMeter;
|
||||
Info_h.biXpelsPerMeter = (getc(IN) << 24) + Info_h.biXpelsPerMeter;
|
||||
|
||||
Info_h.biYpelsPerMeter = getc(IN);
|
||||
Info_h.biYpelsPerMeter = (getc(IN) << 8) + Info_h.biYpelsPerMeter;
|
||||
Info_h.biYpelsPerMeter = (getc(IN) << 16) + Info_h.biYpelsPerMeter;
|
||||
Info_h.biYpelsPerMeter = (getc(IN) << 24) + Info_h.biYpelsPerMeter;
|
||||
|
||||
Info_h.biClrUsed = getc(IN);
|
||||
Info_h.biClrUsed = (getc(IN) << 8) + Info_h.biClrUsed;
|
||||
Info_h.biClrUsed = (getc(IN) << 16) + Info_h.biClrUsed;
|
||||
Info_h.biClrUsed = (getc(IN) << 24) + Info_h.biClrUsed;
|
||||
|
||||
Info_h.biClrImportant = getc(IN);
|
||||
Info_h.biClrImportant = (getc(IN) << 8) + Info_h.biClrImportant;
|
||||
Info_h.biClrImportant = (getc(IN) << 16) + Info_h.biClrImportant;
|
||||
Info_h.biClrImportant = (getc(IN) << 24) + Info_h.biClrImportant;
|
||||
|
||||
/* Read the data and store them in the OUT file */
|
||||
|
||||
if (Info_h.biBitCount == 24) {
|
||||
img->x0 = Dim[0];
|
||||
img->y0 = Dim[1];
|
||||
img->x1 =
|
||||
!Dim[0] ? (w - 1) * subsampling_dx + 1 : Dim[0] + (w -
|
||||
1) *
|
||||
subsampling_dx + 1;
|
||||
img->y1 =
|
||||
!Dim[1] ? (h - 1) * subsampling_dy + 1 : Dim[1] + (h -
|
||||
1) *
|
||||
subsampling_dy + 1;
|
||||
img->numcomps = 3;
|
||||
img->comps =
|
||||
(j2k_comp_t *) malloc(img->numcomps * sizeof(j2k_comp_t));
|
||||
for (i = 0; i < img->numcomps; i++) {
|
||||
img->comps[i].prec = 8;
|
||||
img->comps[i].bpp = 8;
|
||||
img->comps[i].sgnd = 0;
|
||||
img->comps[i].dx = subsampling_dx;
|
||||
img->comps[i].dy = subsampling_dy;
|
||||
}
|
||||
Compo0 = fopen("Compo0", "wb");
|
||||
if (!Compo0) {
|
||||
fprintf(stderr,
|
||||
"\033[0;33mFailed to open Compo0 for writing !\033[0;39m\n");
|
||||
}
|
||||
Compo1 = fopen("Compo1", "wb");
|
||||
if (!Compo1) {
|
||||
fprintf(stderr,
|
||||
"\033[0;33mFailed to open Compo1 for writing !\033[0;39m\n");
|
||||
}
|
||||
Compo2 = fopen("Compo2", "wb");
|
||||
if (!Compo2) {
|
||||
fprintf(stderr,
|
||||
"\033[0;33mFailed to open Compo2 for writing !\033[0;39m\n");
|
||||
}
|
||||
|
||||
/* Place the cursor at the beginning of the image information */
|
||||
fseek(IN, 0, SEEK_SET);
|
||||
fseek(IN, File_h.bfOffBits, SEEK_SET);
|
||||
|
||||
W = Info_h.biWidth;
|
||||
H = Info_h.biHeight;
|
||||
if (Info_h.biWidth % 2)
|
||||
W++;
|
||||
|
||||
RGB = (unsigned char *) malloc(3 * W * H * sizeof(unsigned char));
|
||||
|
||||
fread(RGB, sizeof(unsigned char), 3 * W * H, IN);
|
||||
for (i = 0; i < W * H; i++) {
|
||||
unsigned char R, G, B;
|
||||
|
||||
B =
|
||||
RGB[3 * W * H - ((i * 3) / (3 * W) + 1) * 3 * W +
|
||||
(i * 3) % (W * 3)];
|
||||
G =
|
||||
RGB[3 * W * H - ((i * 3 + 1) / (3 * W) + 1) * 3 * W +
|
||||
(i * 3 + 1) % (W * 3)];
|
||||
R =
|
||||
RGB[3 * W * H - ((i * 3 + 2) / (3 * W) + 1) * 3 * W +
|
||||
(i * 3 + 2) % (W * 3)];
|
||||
if ((i % W < W - 1 && Info_h.biWidth % 2) || !(Info_h.biWidth % 2)) {
|
||||
fprintf(Compo0, "%c", R);
|
||||
fprintf(Compo1, "%c", G);
|
||||
fprintf(Compo2, "%c", B);
|
||||
}
|
||||
}
|
||||
fclose(Compo0);
|
||||
fclose(Compo1);
|
||||
fclose(Compo2);
|
||||
free(RGB);
|
||||
} else if (Info_h.biBitCount == 8 && Info_h.biCompression == 0) {
|
||||
img->x0 = Dim[0];
|
||||
img->y0 = Dim[1];
|
||||
img->x1 =
|
||||
!Dim[0] ? (w - 1) * subsampling_dx + 1 : Dim[0] + (w -
|
||||
1) *
|
||||
subsampling_dx + 1;
|
||||
img->y1 =
|
||||
!Dim[1] ? (h - 1) * subsampling_dy + 1 : Dim[1] + (h -
|
||||
1) *
|
||||
subsampling_dy + 1;
|
||||
|
||||
table_R = (unsigned char *) malloc(256 * sizeof(unsigned char));
|
||||
table_G = (unsigned char *) malloc(256 * sizeof(unsigned char));
|
||||
table_B = (unsigned char *) malloc(256 * sizeof(unsigned char));
|
||||
|
||||
for (i = 0; i < Info_h.biClrUsed; i++) {
|
||||
table_B[i] = getc(IN);
|
||||
table_G[i] = getc(IN);
|
||||
table_R[i] = getc(IN);
|
||||
getc(IN);
|
||||
if (table_R[i] != table_G[i] && table_R[i] != table_B[i]
|
||||
&& table_G[i] != table_B[i])
|
||||
gray_scale = 0;
|
||||
}
|
||||
|
||||
/* Place the cursor at the beginning of the image information */
|
||||
fseek(IN, 0, SEEK_SET);
|
||||
fseek(IN, File_h.bfOffBits, SEEK_SET);
|
||||
|
||||
W = Info_h.biWidth;
|
||||
H = Info_h.biHeight;
|
||||
if (Info_h.biWidth % 2)
|
||||
W++;
|
||||
|
||||
RGB = (unsigned char *) malloc(W * H * sizeof(unsigned char));
|
||||
|
||||
fread(RGB, sizeof(unsigned char), W * H, IN);
|
||||
if (gray_scale) {
|
||||
img->numcomps = 1;
|
||||
img->comps =
|
||||
(j2k_comp_t *) malloc(img->numcomps * sizeof(j2k_comp_t));
|
||||
img->comps[0].prec = 8;
|
||||
img->comps[0].bpp = 8;
|
||||
img->comps[0].sgnd = 0;
|
||||
img->comps[0].dx = subsampling_dx;
|
||||
img->comps[0].dy = subsampling_dy;
|
||||
Compo0 = fopen("Compo0", "wb");
|
||||
if (!Compo0) {
|
||||
fprintf(stderr,
|
||||
"\033[0;33mFailed to open Compo0 for writing !\033[0;39m\n");
|
||||
}
|
||||
for (i = 0; i < W * H; i++) {
|
||||
if ((i % W < W - 1 && Info_h.biWidth % 2)
|
||||
|| !(Info_h.biWidth % 2))
|
||||
fprintf(Compo0, "%c",
|
||||
table_R[RGB[W * H - ((i) / (W) + 1) * W + (i) % (W)]]);
|
||||
}
|
||||
fclose(Compo0);
|
||||
} else {
|
||||
img->numcomps = 3;
|
||||
img->comps =
|
||||
(j2k_comp_t *) malloc(img->numcomps * sizeof(j2k_comp_t));
|
||||
for (i = 0; i < img->numcomps; i++) {
|
||||
img->comps[i].prec = 8;
|
||||
img->comps[i].bpp = 8;
|
||||
img->comps[i].sgnd = 0;
|
||||
img->comps[i].dx = subsampling_dx;
|
||||
img->comps[i].dy = subsampling_dy;
|
||||
}
|
||||
|
||||
Compo0 = fopen("Compo0", "wb");
|
||||
if (!Compo0) {
|
||||
fprintf(stderr,
|
||||
"\033[0;33mFailed to open Compo0 for writing !\033[0;39m\n");
|
||||
}
|
||||
Compo1 = fopen("Compo1", "wb");
|
||||
if (!Compo1) {
|
||||
fprintf(stderr,
|
||||
"\033[0;33mFailed to open Compo1 for writing !\033[0;39m\n");
|
||||
}
|
||||
Compo2 = fopen("Compo2", "wb");
|
||||
if (!Compo2) {
|
||||
fprintf(stderr,
|
||||
"\033[0;33mFailed to open Compo2 for writing !\033[0;39m\n");
|
||||
}
|
||||
|
||||
for (i = 0; i < W * H; i++) {
|
||||
if ((i % W < W - 1 && Info_h.biWidth % 2)
|
||||
|| !(Info_h.biWidth % 2)) {
|
||||
fprintf(Compo0, "%c",
|
||||
table_R[RGB[W * H - ((i) / (W) + 1) * W + (i) % (W)]]);
|
||||
fprintf(Compo1, "%c",
|
||||
table_G[RGB[W * H - ((i) / (W) + 1) * W + (i) % (W)]]);
|
||||
fprintf(Compo2, "%c",
|
||||
table_B[RGB[W * H - ((i) / (W) + 1) * W + (i) % (W)]]);
|
||||
}
|
||||
|
||||
}
|
||||
fclose(Compo0);
|
||||
fclose(Compo1);
|
||||
fclose(Compo2);
|
||||
}
|
||||
free(RGB);
|
||||
|
||||
} else if (Info_h.biBitCount == 8 && Info_h.biCompression == 1) {
|
||||
img->x0 = Dim[0];
|
||||
img->y0 = Dim[1];
|
||||
img->x1 =
|
||||
!Dim[0] ? (w - 1) * subsampling_dx + 1 : Dim[0] + (w -
|
||||
1) *
|
||||
subsampling_dx + 1;
|
||||
img->y1 =
|
||||
!Dim[1] ? (h - 1) * subsampling_dy + 1 : Dim[1] + (h -
|
||||
1) *
|
||||
subsampling_dy + 1;
|
||||
|
||||
|
||||
|
||||
table_R = (unsigned char *) malloc(256 * sizeof(unsigned char));
|
||||
table_G = (unsigned char *) malloc(256 * sizeof(unsigned char));
|
||||
table_B = (unsigned char *) malloc(256 * sizeof(unsigned char));
|
||||
|
||||
for (i = 0; i < Info_h.biClrUsed; i++) {
|
||||
table_B[i] = getc(IN);
|
||||
table_G[i] = getc(IN);
|
||||
table_R[i] = getc(IN);
|
||||
getc(IN);
|
||||
if (table_R[i] != table_G[i] && table_R[i] != table_B[i]
|
||||
&& table_G[i] != table_B[i])
|
||||
gray_scale = 0;
|
||||
}
|
||||
|
||||
/* Place the cursor at the beginning of the image information */
|
||||
fseek(IN, 0, SEEK_SET);
|
||||
fseek(IN, File_h.bfOffBits, SEEK_SET);
|
||||
|
||||
if (gray_scale) {
|
||||
img->numcomps = 1;
|
||||
img->comps = (j2k_comp_t *) malloc(sizeof(j2k_comp_t));
|
||||
img->comps[0].prec = 8;
|
||||
img->comps[0].bpp = 8;
|
||||
img->comps[0].sgnd = 0;
|
||||
img->comps[0].dx = subsampling_dx;
|
||||
img->comps[0].dy = subsampling_dy;
|
||||
Compo0 = fopen("Compo0", "wb");
|
||||
if (!Compo0) {
|
||||
fprintf(stderr,
|
||||
"\033[0;33mFailed to open Compo0 for writing !\033[0;39m\n");
|
||||
}
|
||||
} else {
|
||||
img->numcomps = 3;
|
||||
img->comps =
|
||||
(j2k_comp_t *) malloc(img->numcomps * sizeof(j2k_comp_t));
|
||||
for (i = 0; i < img->numcomps; i++) {
|
||||
img->comps[i].prec = 8;
|
||||
img->comps[i].bpp = 8;
|
||||
img->comps[i].sgnd = 0;
|
||||
img->comps[i].dx = subsampling_dx;
|
||||
img->comps[i].dy = subsampling_dy;
|
||||
}
|
||||
Compo0 = fopen("Compo0", "wb");
|
||||
if (!Compo0) {
|
||||
fprintf(stderr,
|
||||
"\033[0;33mFailed to open Compo0 for writing !\033[0;39m\n");
|
||||
}
|
||||
Compo1 = fopen("Compo1", "wb");
|
||||
if (!Compo1) {
|
||||
fprintf(stderr,
|
||||
"\033[0;33mFailed to open Compo1 for writing !\033[0;39m\n");
|
||||
}
|
||||
Compo2 = fopen("Compo2", "wb");
|
||||
if (!Compo2) {
|
||||
fprintf(stderr,
|
||||
"\033[0;33mFailed to open Compo2 for writing !\033[0;39m\n");
|
||||
}
|
||||
}
|
||||
|
||||
RGB =
|
||||
(unsigned char *) malloc(Info_h.biWidth * Info_h.biHeight *
|
||||
sizeof(unsigned char));
|
||||
|
||||
while (not_end_file) {
|
||||
v = getc(IN);
|
||||
if (v) {
|
||||
v2 = getc(IN);
|
||||
for (i = 0; i < (int) v; i++) {
|
||||
RGB[line * Info_h.biWidth + col] = v2;
|
||||
col++;
|
||||
}
|
||||
} else {
|
||||
v = getc(IN);
|
||||
switch (v) {
|
||||
case 0:
|
||||
col = 0;
|
||||
line++;
|
||||
break;
|
||||
case 1:
|
||||
line++;
|
||||
not_end_file = 0;
|
||||
break;
|
||||
case 2:
|
||||
printf("No Delta supported\n");
|
||||
return 1;
|
||||
break;
|
||||
default:
|
||||
for (i = 0; i < v; i++) {
|
||||
v2 = getc(IN);
|
||||
RGB[line * Info_h.biWidth + col] = v2;
|
||||
col++;
|
||||
}
|
||||
if (v % 2)
|
||||
v2 = getc(IN);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (gray_scale) {
|
||||
for (line = 0; line < Info_h.biHeight; line++)
|
||||
for (col = 0; col < Info_h.biWidth; col++)
|
||||
fprintf(Compo0, "%c",
|
||||
table_R[(int)
|
||||
RGB[(Info_h.biHeight - line -
|
||||
1) * Info_h.biWidth + col]]);
|
||||
fclose(Compo0);
|
||||
} else {
|
||||
for (line = 0; line < Info_h.biHeight; line++)
|
||||
for (col = 0; col < Info_h.biWidth; col++) {
|
||||
fprintf(Compo0, "%c",
|
||||
table_R[(int)
|
||||
RGB[(Info_h.biHeight - line -
|
||||
1) * Info_h.biWidth + col]]);
|
||||
fprintf(Compo1, "%c",
|
||||
table_G[(int)
|
||||
RGB[(Info_h.biHeight - line -
|
||||
1) * Info_h.biWidth + col]]);
|
||||
fprintf(Compo2, "%c",
|
||||
table_B[(int)
|
||||
RGB[(Info_h.biHeight - line -
|
||||
1) * Info_h.biWidth + col]]);
|
||||
}
|
||||
fclose(Compo0);
|
||||
fclose(Compo1);
|
||||
fclose(Compo2);
|
||||
}
|
||||
free(RGB);
|
||||
} else
|
||||
printf
|
||||
("Other system than 24 bits/pixels or 8 bits (no RLE coding) is not yet implemented [%d]\n",
|
||||
Info_h.biBitCount);
|
||||
|
||||
fclose(IN);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* -->> -->> -->> -->>
|
||||
|
||||
PGX IMAGE FORMAT
|
||||
|
||||
<<-- <<-- <<-- <<-- */
|
||||
|
||||
|
||||
unsigned char readuchar(FILE * f)
|
||||
{
|
||||
unsigned char c1;
|
||||
fread(&c1, 1, 1, f);
|
||||
return c1;
|
||||
}
|
||||
|
||||
unsigned short readushort(FILE * f, int bigendian)
|
||||
{
|
||||
unsigned char c1, c2;
|
||||
fread(&c1, 1, 1, f);
|
||||
fread(&c2, 1, 1, f);
|
||||
if (bigendian)
|
||||
return (c1 << 8) + c2;
|
||||
else
|
||||
return (c2 << 8) + c1;
|
||||
}
|
||||
|
||||
unsigned int readuint(FILE * f, int bigendian)
|
||||
{
|
||||
unsigned char c1, c2, c3, c4;
|
||||
fread(&c1, 1, 1, f);
|
||||
fread(&c2, 1, 1, f);
|
||||
fread(&c3, 1, 1, f);
|
||||
fread(&c4, 1, 1, f);
|
||||
if (bigendian)
|
||||
return (c1 << 24) + (c2 << 16) + (c3 << 8) + c4;
|
||||
else
|
||||
return (c4 << 24) + (c3 << 16) + (c2 << 8) + c1;
|
||||
}
|
||||
|
||||
int pgxtoimage(char *filename, j2k_image_t * img, int tdy,
|
||||
int subsampling_dx, int subsampling_dy, int Dim[2],
|
||||
j2k_cp_t cp)
|
||||
{
|
||||
FILE *f;
|
||||
int w, h, prec;
|
||||
int i, compno, bandno;
|
||||
char str[256], endian[16];
|
||||
char sign;
|
||||
int bigendian;
|
||||
j2k_comp_t *comp;
|
||||
|
||||
img->numcomps = 1;
|
||||
img->comps = (j2k_comp_t *) malloc(img->numcomps * sizeof(j2k_comp_t));
|
||||
for (compno = 0; compno < img->numcomps; compno++) {
|
||||
FILE *src;
|
||||
char tmp[16];
|
||||
int max = 0;
|
||||
int Y1;
|
||||
comp = &img->comps[compno];
|
||||
sprintf(str, "%s", filename);
|
||||
f = fopen(str, "rb");
|
||||
if (!f) {
|
||||
fprintf(stderr, "Failed to open %s for reading !\n", str);
|
||||
return 0;
|
||||
}
|
||||
if (fscanf(f, "PG %s %c %d %d %d", endian, &sign, &prec, &w, &h) == 5)
|
||||
{
|
||||
fgetc(f);
|
||||
if (!strcmp(endian, "ML"))
|
||||
bigendian = 1;
|
||||
else
|
||||
bigendian = 0;
|
||||
if (compno == 0) {
|
||||
img->x0 = Dim[0];
|
||||
img->y0 = Dim[1];
|
||||
img->x1 =
|
||||
!Dim[0] ? (w - 1) * subsampling_dx + 1 : Dim[0] + (w -
|
||||
1) *
|
||||
subsampling_dx + 1;
|
||||
img->y1 =
|
||||
!Dim[1] ? (h - 1) * subsampling_dy + 1 : Dim[1] + (h -
|
||||
1) *
|
||||
subsampling_dy + 1;
|
||||
} else {
|
||||
if (w != img->x1 || h != img->y1)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (sign == '-') {
|
||||
comp->sgnd = 1;
|
||||
} else {
|
||||
comp->sgnd = 0;
|
||||
}
|
||||
comp->prec = prec;
|
||||
comp->dx = subsampling_dx;
|
||||
comp->dy = subsampling_dy;
|
||||
bandno = 1;
|
||||
|
||||
Y1 =
|
||||
cp.ty0 + bandno * cp.tdy <
|
||||
img->y1 ? cp.ty0 + bandno * cp.tdy : img->y1;
|
||||
Y1 -= img->y0;
|
||||
|
||||
sprintf(tmp, "bandtile%d", bandno); /* bandtile file */
|
||||
src = fopen(tmp, "wb");
|
||||
if (!src) {
|
||||
fprintf(stderr, "failed to open %s for writing !\n", tmp);
|
||||
}
|
||||
for (i = 0; i < w * h; i++) {
|
||||
int v;
|
||||
if (i == Y1 * w / subsampling_dy && tdy != -1) { /* bandtile is full */
|
||||
fclose(src);
|
||||
bandno++;
|
||||
sprintf(tmp, "bandtile%d", bandno);
|
||||
src = fopen(tmp, "wb");
|
||||
if (!src) {
|
||||
fprintf(stderr, "failed to open %s for writing !\n", tmp);
|
||||
}
|
||||
Y1 =
|
||||
cp.ty0 + bandno * cp.tdy <
|
||||
img->y1 ? cp.ty0 + bandno * cp.tdy : img->y1;
|
||||
Y1 -= img->y0;
|
||||
}
|
||||
if (comp->prec <= 8) {
|
||||
if (!comp->sgnd) {
|
||||
v = readuchar(f);
|
||||
} else {
|
||||
v = (char) readuchar(f);
|
||||
}
|
||||
} else if (comp->prec <= 16) {
|
||||
if (!comp->sgnd) {
|
||||
v = readushort(f, bigendian);
|
||||
} else {
|
||||
v = (short) readushort(f, bigendian);
|
||||
}
|
||||
} else {
|
||||
if (!comp->sgnd) {
|
||||
v = readuint(f, bigendian);
|
||||
} else {
|
||||
v = (int) readuint(f, bigendian);
|
||||
}
|
||||
}
|
||||
if (v > max)
|
||||
max = v;
|
||||
fprintf(src, "%d ", v);
|
||||
}
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
fclose(f);
|
||||
fclose(src);
|
||||
comp->bpp = int_floorlog2(max) + 1;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* -->> -->> -->> -->>
|
||||
|
||||
PNM IMAGE FORMAT
|
||||
|
||||
<<-- <<-- <<-- <<-- */
|
||||
|
||||
int pnmtoimage(char *filename, j2k_image_t * img, int subsampling_dx,
|
||||
int subsampling_dy, int Dim[2])
|
||||
{
|
||||
FILE *f;
|
||||
FILE *Compo0, *Compo1, *Compo2;
|
||||
int w, h;
|
||||
int i;
|
||||
char value;
|
||||
char comment[256];
|
||||
|
||||
f = fopen(filename, "rb");
|
||||
if (!f) {
|
||||
fprintf(stderr,
|
||||
"\033[0;33mFailed to open %s for reading !!\033[0;39m\n",
|
||||
filename);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (fgetc(f) != 'P')
|
||||
return 0;
|
||||
value = fgetc(f);
|
||||
|
||||
if (value == '2') {
|
||||
fgetc(f);
|
||||
if (fgetc(f) == '#') {
|
||||
fseek(f, 0, SEEK_SET);
|
||||
fscanf(f, "P2\n");
|
||||
fgets(comment, 256, f);
|
||||
fscanf(f, "%d %d\n255", &w, &h);
|
||||
} else {
|
||||
fseek(f, 0, SEEK_SET);
|
||||
fscanf(f, "P2\n%d %d\n255", &w, &h);
|
||||
}
|
||||
|
||||
fgetc(f);
|
||||
img->x0 = Dim[0];
|
||||
img->y0 = Dim[1];
|
||||
img->x1 =
|
||||
!Dim[0] ? (w - 1) * subsampling_dx + 1 : Dim[0] + (w -
|
||||
1) *
|
||||
subsampling_dx + 1;
|
||||
img->y1 =
|
||||
!Dim[1] ? (h - 1) * subsampling_dy + 1 : Dim[1] + (h -
|
||||
1) *
|
||||
subsampling_dy + 1;
|
||||
|
||||
img->numcomps = 1;
|
||||
img->comps = (j2k_comp_t *) malloc(sizeof(j2k_comp_t));
|
||||
img->comps[0].prec = 8;
|
||||
img->comps[0].bpp = 8;
|
||||
img->comps[0].sgnd = 0;
|
||||
img->comps[0].dx = subsampling_dx;
|
||||
img->comps[0].dy = subsampling_dy;
|
||||
|
||||
Compo0 = fopen("Compo0", "wb");
|
||||
if (!Compo0) {
|
||||
fprintf(stderr,
|
||||
"\033[0;33mFailed to open Compo0 for writing !\033[0;39m\n");
|
||||
}
|
||||
for (i = 0; i < w * h; i++) {
|
||||
unsigned int l;
|
||||
fscanf(f, "%d", &l);
|
||||
fprintf(Compo0, "%c", l);
|
||||
}
|
||||
fclose(Compo0);
|
||||
} else if (value == '5') {
|
||||
fgetc(f);
|
||||
if (fgetc(f) == '#') {
|
||||
fseek(f, 0, SEEK_SET);
|
||||
fscanf(f, "P5\n");
|
||||
fgets(comment, 256, f);
|
||||
fscanf(f, "%d %d\n255", &w, &h);
|
||||
} else {
|
||||
fseek(f, 0, SEEK_SET);
|
||||
fscanf(f, "P5\n%d %d\n255", &w, &h);
|
||||
}
|
||||
|
||||
fgetc(f);
|
||||
img->x0 = Dim[0];
|
||||
img->y0 = Dim[1];
|
||||
img->x1 =
|
||||
!Dim[0] ? (w - 1) * subsampling_dx + 1 : Dim[0] + (w -
|
||||
1) *
|
||||
subsampling_dx + 1;
|
||||
img->y1 =
|
||||
!Dim[1] ? (h - 1) * subsampling_dy + 1 : Dim[1] + (h -
|
||||
1) *
|
||||
subsampling_dy + 1;
|
||||
|
||||
img->numcomps = 1;
|
||||
img->comps = (j2k_comp_t *) malloc(sizeof(j2k_comp_t));
|
||||
img->comps[0].prec = 8;
|
||||
img->comps[0].bpp = 8;
|
||||
img->comps[0].sgnd = 0;
|
||||
img->comps[0].dx = subsampling_dx;
|
||||
img->comps[0].dy = subsampling_dy;
|
||||
Compo0 = fopen("Compo0", "wb");
|
||||
if (!Compo0) {
|
||||
fprintf(stderr,
|
||||
"\033[0;33mFailed to open Compo0 for writing !\033[0;39m\n");
|
||||
}
|
||||
for (i = 0; i < w * h; i++) {
|
||||
unsigned char l;
|
||||
fread(&l, 1, 1, f);
|
||||
fwrite(&l, 1, 1, Compo0);
|
||||
}
|
||||
fclose(Compo0);
|
||||
} else if (value == '3') {
|
||||
fgetc(f);
|
||||
if (fgetc(f) == '#') {
|
||||
fseek(f, 0, SEEK_SET);
|
||||
fscanf(f, "P3\n");
|
||||
fgets(comment, 256, f);
|
||||
fscanf(f, "%d %d\n255", &w, &h);
|
||||
} else {
|
||||
fseek(f, 0, SEEK_SET);
|
||||
fscanf(f, "P3\n%d %d\n255", &w, &h);
|
||||
}
|
||||
|
||||
fgetc(f);
|
||||
img->x0 = Dim[0];
|
||||
img->y0 = Dim[1];
|
||||
img->x1 =
|
||||
!Dim[0] ? (w - 1) * subsampling_dx + 1 : Dim[0] + (w -
|
||||
1) *
|
||||
subsampling_dx + 1;
|
||||
img->y1 =
|
||||
!Dim[1] ? (h - 1) * subsampling_dy + 1 : Dim[1] + (h -
|
||||
1) *
|
||||
subsampling_dy + 1;
|
||||
img->numcomps = 3;
|
||||
img->comps = (j2k_comp_t *) malloc(img->numcomps * sizeof(j2k_comp_t));
|
||||
for (i = 0; i < img->numcomps; i++) {
|
||||
img->comps[i].prec = 8;
|
||||
img->comps[i].bpp = 8;
|
||||
img->comps[i].sgnd = 0;
|
||||
img->comps[i].dx = subsampling_dx;
|
||||
img->comps[i].dy = subsampling_dy;
|
||||
}
|
||||
Compo0 = fopen("Compo0", "wb");
|
||||
if (!Compo0) {
|
||||
fprintf(stderr,
|
||||
"\033[0;33mFailed to open Compo0 for writing !\033[0;39m\n");
|
||||
}
|
||||
|
||||
Compo1 = fopen("Compo1", "wb");
|
||||
if (!Compo1) {
|
||||
fprintf(stderr,
|
||||
"\033[0;33mFailed to open Compo1 for writing !\033[0;39m\n");
|
||||
}
|
||||
|
||||
Compo2 = fopen("Compo2", "wb");
|
||||
if (!Compo2) {
|
||||
fprintf(stderr,
|
||||
"\033[0;33mFailed to open Compo2 for writing !\033[0;39m\n");
|
||||
}
|
||||
|
||||
for (i = 0; i < w * h; i++) {
|
||||
unsigned int r, g, b;
|
||||
fscanf(f, "%d", &r);
|
||||
fscanf(f, "%d", &g);
|
||||
fscanf(f, "%d", &b);
|
||||
fprintf(Compo0, "%c", r);
|
||||
fprintf(Compo1, "%c", g);
|
||||
fprintf(Compo2, "%c", b);
|
||||
}
|
||||
fclose(Compo0);
|
||||
fclose(Compo1);
|
||||
fclose(Compo2);
|
||||
} else if (value == '6') {
|
||||
fgetc(f);
|
||||
if (fgetc(f) == '#') {
|
||||
fseek(f, 0, SEEK_SET);
|
||||
fscanf(f, "P6\n");
|
||||
fgets(comment, 256, f);
|
||||
fscanf(f, "%d %d\n255", &w, &h);
|
||||
} else {
|
||||
fseek(f, 0, SEEK_SET);
|
||||
fscanf(f, "P6\n%d %d\n255", &w, &h);
|
||||
}
|
||||
|
||||
fgetc(f);
|
||||
img->x0 = Dim[0];
|
||||
img->y0 = Dim[1];
|
||||
img->x1 =
|
||||
!Dim[0] ? (w - 1) * subsampling_dx + 1 : Dim[0] + (w -
|
||||
1) *
|
||||
subsampling_dx + 1;
|
||||
img->y1 =
|
||||
!Dim[1] ? (h - 1) * subsampling_dy + 1 : Dim[1] + (h -
|
||||
1) *
|
||||
subsampling_dy + 1;
|
||||
img->numcomps = 3;
|
||||
img->comps = (j2k_comp_t *) malloc(img->numcomps * sizeof(j2k_comp_t));
|
||||
for (i = 0; i < img->numcomps; i++) {
|
||||
img->comps[i].prec = 8;
|
||||
img->comps[i].bpp = 8;
|
||||
img->comps[i].sgnd = 0;
|
||||
img->comps[i].dx = subsampling_dx;
|
||||
img->comps[i].dy = subsampling_dy;
|
||||
}
|
||||
Compo0 = fopen("Compo0", "wb");
|
||||
if (!Compo0) {
|
||||
fprintf(stderr,
|
||||
"\033[0;33mFailed to open Compo0 for writing !\033[0;39m\n");
|
||||
}
|
||||
|
||||
Compo1 = fopen("Compo1", "wb");
|
||||
if (!Compo1) {
|
||||
fprintf(stderr,
|
||||
"\033[0;33mFailed to open Compo1 for writing !\033[0;39m\n");
|
||||
}
|
||||
|
||||
Compo2 = fopen("Compo2", "wb");
|
||||
if (!Compo2) {
|
||||
fprintf(stderr,
|
||||
"\033[0;33mFailed to open Compo2 for writing !\033[0;39m\n");
|
||||
}
|
||||
|
||||
for (i = 0; i < w * h; i++) {
|
||||
unsigned char r, g, b;
|
||||
fread(&r, 1, 1, f);
|
||||
fread(&g, 1, 1, f);
|
||||
fread(&b, 1, 1, f);
|
||||
fwrite(&r, 1, 1, Compo0);
|
||||
fwrite(&g, 1, 1, Compo1);
|
||||
fwrite(&b, 1, 1, Compo2);
|
||||
}
|
||||
fclose(Compo0);
|
||||
fclose(Compo1);
|
||||
fclose(Compo2);
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
fclose(f);
|
||||
return 1;
|
||||
}
|
||||
@@ -1,720 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2003, David Janssens
|
||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
||||
* Copyright (c) 2002-2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
||||
* 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 <openjpeg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#ifndef DONT_HAVE_GETOPT
|
||||
#include <getopt.h>
|
||||
#else
|
||||
#include "compat/getopt.h"
|
||||
#endif
|
||||
#include "convert.h"
|
||||
|
||||
void help_display()
|
||||
{
|
||||
printf("HELP\n----\n\n");
|
||||
printf
|
||||
("- the option -help displays the readme.txt file on screen\n\n");
|
||||
|
||||
|
||||
printf("List of parameters for the coder JPEG 2000 :\n");
|
||||
printf("\n");
|
||||
printf
|
||||
("- The markers COD and QCD are writed both of two in the main_header and never appear in the tile_header. The markers in the main header are : SOC SIZ COD QCD COM.\n");
|
||||
printf("\n");
|
||||
printf
|
||||
("- This coder can encode mega image, a test was made on a 24000x24000 pixels color image. You need enough disk space memory (twice the original) to encode the image. (i.e. for a 1.5 Gb image you need a minimum of 3Gb of disk memory)\n");
|
||||
printf("\n");
|
||||
printf("REMARKS :\n");
|
||||
printf("---------\n");
|
||||
printf("\n");
|
||||
printf
|
||||
("* the value of rate enter in the code line is the compression factor !\n");
|
||||
printf("exemple :\n");
|
||||
printf("\n");
|
||||
printf
|
||||
("-r 20,10,1 means quality 1 : compress 20x, quality 2 : compress 10x and quality 3 : compress 1x = lossless\n");
|
||||
printf("\n");
|
||||
printf("By default :\n");
|
||||
printf("------------\n");
|
||||
printf("\n");
|
||||
printf(" * lossless\n");
|
||||
printf(" * 1 tile\n");
|
||||
printf(" * size of precinct 2^15 x 2^15 (means 1 precinct)\n");
|
||||
printf(" * size of code-block 64 x 64\n");
|
||||
printf(" * Number of resolution : 6\n");
|
||||
printf(" * No SOP marker in the codestream\n");
|
||||
printf(" * No EPH marker in the codestream\n");
|
||||
printf(" * No sub-sampling in x and y direction\n");
|
||||
printf(" * No mode switch activated\n");
|
||||
printf(" * progression order : LRCP\n");
|
||||
printf(" * No index file\n");
|
||||
printf(" * No ROI upshifted\n");
|
||||
printf(" * No offset of the origin of the image\n");
|
||||
printf(" * No offset of the origin of the tiles\n");
|
||||
printf(" * Reversible DWT 5-3\n");
|
||||
printf("\n");
|
||||
printf("Parameters :\n");
|
||||
printf("------------\n");
|
||||
printf("\n");
|
||||
printf
|
||||
("-i : source file (-i source.pnm also *.pgm, *.ppm) required\n");
|
||||
printf("\n");
|
||||
printf
|
||||
("-o : destination file (-o dest.j2k) required\n");
|
||||
printf("\n");
|
||||
printf
|
||||
("-help : Display the help information optional\n ");
|
||||
printf("\n");
|
||||
printf
|
||||
("-r : different rates (-r 20,10,5) optional\n ");
|
||||
printf("\n");
|
||||
printf
|
||||
("-n : Number of resolution (-n 3) optional\n");
|
||||
printf("\n");
|
||||
printf
|
||||
("-b : size of code block (-b 32,32) optional\n");
|
||||
printf("\n");
|
||||
printf
|
||||
("-c : size of precinct (-c 128,128) optional\n");
|
||||
printf("\n");
|
||||
printf
|
||||
("-t : size of tile (-t 512,512) optional\n");
|
||||
printf("\n");
|
||||
printf
|
||||
("-p : progression order (-p LRCP) [LRCP, RLCP, RPCL, PCRL, CPRL] optional\n");
|
||||
printf("\n");
|
||||
printf
|
||||
("-s : subsampling factor (-s 2,2) [-s X,Y] optional\n");
|
||||
printf("\n");
|
||||
printf
|
||||
("-SOP : write SOP marker before each packet optional\n");
|
||||
printf("\n");
|
||||
printf
|
||||
("-EPH : write EPH marker after each header packet optional\n");
|
||||
printf("\n");
|
||||
printf
|
||||
("-M : mode switch (-M 3) [1=BYPASS(LAZY) 2=RESET 4=RESTART(TERMALL) 8=VSC 16=ERTERM(SEGTERM) 32=SEGMARK(SEGSYM)] optional\n");
|
||||
printf
|
||||
(" for several mode switch you have to add the value of each mode you want\n");
|
||||
printf
|
||||
(" ex : RESTART(4) + RESET(2) + SEGMARK(32) = -M 38\n");
|
||||
printf("\n");
|
||||
printf
|
||||
("-x : Create an index file *.Idx (-x index_name.Idx) optional\n");
|
||||
printf("\n");
|
||||
printf
|
||||
("-ROI:c=%%d,U=%%d : quantization indices upshifted for component c=%%d [\%%d = 0,1,2]\n");
|
||||
printf
|
||||
(" with a value of U=%%d [0 <= %%d <= 37] (i.e. -ROI:c=0,U=25) optional\n");
|
||||
printf("\n");
|
||||
printf
|
||||
("-d : offset of the origin of the image (-d 150,300) optional\n");
|
||||
printf("\n");
|
||||
printf
|
||||
("-T : offset of the origin of the tiles (-T 100,75) optional\n");
|
||||
printf("\n");
|
||||
printf
|
||||
("-I : Use the irreversible DWT 9-7 (-I) optional\n");
|
||||
printf("\n");
|
||||
printf("IMPORTANT :\n");
|
||||
printf("-----------\n");
|
||||
printf("\n");
|
||||
printf("* subsampling bigger than 2 can produce error\n");
|
||||
printf("\n");
|
||||
printf
|
||||
("The index file respect the structure below :\n");
|
||||
printf
|
||||
("---------------------------------------------\n");
|
||||
printf("\n");
|
||||
printf("Image_height Image_width\n");
|
||||
printf("progression order\n");
|
||||
printf("Tiles_size_X Tiles_size_Y\n");
|
||||
printf("Components_nb\n");
|
||||
printf("Layers_nb\n");
|
||||
printf("decomposition_levels\n");
|
||||
printf("Precincts_size_X Precincts_size_Y\n");
|
||||
printf("Main_header_end_position\n");
|
||||
printf("Codestream_size\n");
|
||||
printf("Tile0 start_pos end_Theader end_pos\n");
|
||||
printf("Tile1 '' '' ''\n");
|
||||
printf("...\n");
|
||||
printf("TileN '' '' ''\n");
|
||||
printf("Tpacket_0 Tile layer res. comp. prec. start_pos end_pos\n");
|
||||
printf("...\n");
|
||||
printf("Tpacket_M '' '' '' '' '' '' ''\n");
|
||||
}
|
||||
|
||||
int give_progression(char progression[4])
|
||||
{
|
||||
if (progression[0] == 'L' && progression[1] == 'R'
|
||||
&& progression[2] == 'C' && progression[3] == 'P') {
|
||||
return 0;
|
||||
} else {
|
||||
if (progression[0] == 'R' && progression[1] == 'L'
|
||||
&& progression[2] == 'C' && progression[3] == 'P') {
|
||||
return 1;
|
||||
} else {
|
||||
if (progression[0] == 'R' && progression[1] == 'P'
|
||||
&& progression[2] == 'C' && progression[3] == 'L') {
|
||||
return 2;
|
||||
} else {
|
||||
if (progression[0] == 'P' && progression[1] == 'C'
|
||||
&& progression[2] == 'R' && progression[3] == 'L') {
|
||||
return 3;
|
||||
} else {
|
||||
if (progression[0] == 'C' && progression[1] == 'P'
|
||||
&& progression[2] == 'R' && progression[3] == 'L') {
|
||||
return 4;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
double dwt_norms_97[4][10] = {
|
||||
{1.000, 1.965, 4.177, 8.403, 16.90, 33.84, 67.69, 135.3, 270.6, 540.9},
|
||||
{2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0},
|
||||
{2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0},
|
||||
{2.080, 3.865, 8.307, 17.18, 34.71, 69.59, 139.3, 278.6, 557.2}
|
||||
};
|
||||
|
||||
int floorlog2(int a)
|
||||
{
|
||||
int l;
|
||||
for (l = 0; a > 1; l++) {
|
||||
a >>= 1;
|
||||
}
|
||||
return l;
|
||||
}
|
||||
|
||||
void encode_stepsize(int stepsize, int numbps, int *expn, int *mant)
|
||||
{
|
||||
int p, n;
|
||||
p = floorlog2(stepsize) - 13;
|
||||
n = 11 - floorlog2(stepsize);
|
||||
*mant = (n < 0 ? stepsize >> -n : stepsize << n) & 0x7ff;
|
||||
*expn = numbps - p;
|
||||
}
|
||||
|
||||
void calc_explicit_stepsizes(j2k_tccp_t * tccp, int prec)
|
||||
{
|
||||
int numbands, bandno;
|
||||
numbands = 3 * tccp->numresolutions - 2;
|
||||
for (bandno = 0; bandno < numbands; bandno++) {
|
||||
double stepsize;
|
||||
|
||||
int resno, level, orient, gain;
|
||||
resno = bandno == 0 ? 0 : (bandno - 1) / 3 + 1;
|
||||
orient = bandno == 0 ? 0 : (bandno - 1) % 3 + 1;
|
||||
level = tccp->numresolutions - 1 - resno;
|
||||
gain =
|
||||
tccp->qmfbid == 0 ? 0 : (orient ==
|
||||
0 ? 0 : (orient == 1
|
||||
|| orient == 2 ? 1 : 2));
|
||||
if (tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) {
|
||||
stepsize = 1.0;
|
||||
} else {
|
||||
double norm = dwt_norms_97[orient][level];
|
||||
stepsize = (1 << (gain + 1)) / norm;
|
||||
}
|
||||
encode_stepsize((int) floor(stepsize * 8192.0), prec + gain,
|
||||
&tccp->stepsizes[bandno].expn,
|
||||
&tccp->stepsizes[bandno].mant);
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int len;
|
||||
int NumResolution, numD_min; /* NumResolution : number of resolution */
|
||||
int Tile_arg; /* Tile_arg = 0 (pas en argument ou = 1 (entre en argument) */
|
||||
int CSty; /* CSty : coding style */
|
||||
int Prog_order; /* progression order (default LRCP) */
|
||||
char progression[4];
|
||||
int numpocs, numpocs_tile; /* Number of progression order change (POC) default 0 */
|
||||
int prcw_init, prch_init; /* Initialisation precincts' size */
|
||||
int cblockw_init, cblockh_init; /* Initialisation codeblocks' size */
|
||||
int mode, value; /* mode switch (cblk_style) */
|
||||
int subsampling_dx, subsampling_dy; /* subsampling value for dx and dy */
|
||||
int ROI_compno, ROI_shift; /* region of interrest */
|
||||
int Dim[2]; /* portion of the image coded */
|
||||
int TX0, TY0; /* tile off-set */
|
||||
j2k_image_t img;
|
||||
j2k_cp_t cp, cp_init; /* cp_init is used to initialise in multiple tiles */
|
||||
j2k_tcp_t *tcp, *tcp_init; /* tcp_init is used to initialise in multiple tile */
|
||||
j2k_poc_t POC[32]; /* POC : used in case of Progression order change */
|
||||
j2k_poc_t *tcp_poc;
|
||||
j2k_tccp_t *tccp;
|
||||
int i, tileno, j;
|
||||
char *infile = 0;
|
||||
char *outfile = 0;
|
||||
char *index = 0;
|
||||
char *s, S1, S2, S3;
|
||||
int ir = 0;
|
||||
|
||||
/* default value */
|
||||
/* ------------- */
|
||||
NumResolution = 6;
|
||||
CSty = 0;
|
||||
cblockw_init = 64;
|
||||
cblockh_init = 64;
|
||||
cp.tw = 1;
|
||||
cp.th = 1;
|
||||
img.index_on = 0;
|
||||
Prog_order = 0;
|
||||
numpocs = 0;
|
||||
mode = 0;
|
||||
subsampling_dx = 1;
|
||||
subsampling_dy = 1;
|
||||
ROI_compno = -1; /* no ROI */
|
||||
ROI_shift = 0;
|
||||
Dim[0] = 0;
|
||||
Dim[1] = 0;
|
||||
TX0 = 0;
|
||||
TY0 = 0;
|
||||
cp.comment = NULL;
|
||||
cp.disto_alloc = 0;
|
||||
cp.fixed_alloc = 0;
|
||||
/* img.PPT=0; */
|
||||
|
||||
Tile_arg = 0;
|
||||
cp_init.tcps = (j2k_tcp_t *) malloc(sizeof(j2k_tcp_t)); /* initialisation if only one tile */
|
||||
tcp_init = &cp_init.tcps[0];
|
||||
tcp_init->numlayers = 0;
|
||||
|
||||
while (1) {
|
||||
int c =
|
||||
getopt(argc, argv, "i:o:r:q:t:n:c:b:x:p:s:d:h:P:S:E:M:R:T:C:I");
|
||||
if (c == -1)
|
||||
break;
|
||||
switch (c) {
|
||||
case 'i': /* IN fill */
|
||||
infile = optarg;
|
||||
s = optarg;
|
||||
while (*s && *s != '.') {
|
||||
s++;
|
||||
}
|
||||
s++;
|
||||
S1 = *s;
|
||||
s++;
|
||||
S2 = *s;
|
||||
s++;
|
||||
S3 = *s;
|
||||
|
||||
if ((S1 == 'p' && S2 == 'g' && S3 == 'x')
|
||||
|| (S1 == 'P' && S2 == 'G' && S3 == 'X')) {
|
||||
cp.image_type = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
if ((S1 == 'p' && S2 == 'n' && S3 == 'm')
|
||||
|| (S1 == 'P' && S2 == 'N' && S3 == 'M') || (S1 == 'p'
|
||||
&& S2 == 'g'
|
||||
&& S3 == 'm')
|
||||
|| (S1 == 'P' && S2 == 'G' && S3 == 'M') || (S1 == 'P'
|
||||
&& S2 == 'P'
|
||||
&& S3 == 'M')
|
||||
|| (S1 == 'p' && S2 == 'p' && S3 == 'm')) {
|
||||
cp.image_type = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
if ((S1 == 'b' && S2 == 'm' && S3 == 'p')
|
||||
|| (S1 == 'B' && S2 == 'M' && S3 == 'P')) {
|
||||
cp.image_type = 2;
|
||||
break;
|
||||
}
|
||||
fprintf(stderr,
|
||||
"!! Unrecognized format for infile [accept only *.pnm, *.pgm, *.ppm, *.pgx or *.bmp] !!\n\n");
|
||||
return 1;
|
||||
break;
|
||||
/* ----------------------------------------------------- */
|
||||
case 'o': /* OUT fill */
|
||||
outfile = optarg;
|
||||
break;
|
||||
/* ----------------------------------------------------- */
|
||||
case 'r': /* rates */
|
||||
s = optarg;
|
||||
while (sscanf(s, "%d", &tcp_init->rates[tcp_init->numlayers]) == 1) {
|
||||
tcp_init->numlayers++;
|
||||
while (*s && *s != ',') {
|
||||
s++;
|
||||
}
|
||||
if (!*s)
|
||||
break;
|
||||
s++;
|
||||
}
|
||||
cp.disto_alloc = 1;
|
||||
break;
|
||||
/* ----------------------------------------------------- */
|
||||
case 'q': /* rates */
|
||||
s = optarg;
|
||||
sscanf(s, "%d", &tcp_init->numlayers);
|
||||
for (i = 0; i < tcp_init->numlayers; i++) {
|
||||
tcp_init->rates[i] = 1;
|
||||
}
|
||||
cp.fixed_alloc = 1;
|
||||
break;
|
||||
/* ----------------------------------------------------- */
|
||||
case 't': /* tiles */
|
||||
sscanf(optarg, "%d,%d", &cp.tdx, &cp.tdy);
|
||||
Tile_arg = 1;
|
||||
break;
|
||||
/* ----------------------------------------------------- */
|
||||
case 'n': /* resolution */
|
||||
sscanf(optarg, "%d", &NumResolution);
|
||||
break;
|
||||
/* ----------------------------------------------------- */
|
||||
case 'c': /* precinct dimension */
|
||||
sscanf(optarg, "%d,%d", &prcw_init, &prch_init);
|
||||
CSty |= 0x01;
|
||||
break;
|
||||
/* ----------------------------------------------------- */
|
||||
case 'b': /* code-block dimension */
|
||||
sscanf(optarg, "%d,%d", &cblockw_init, &cblockh_init);
|
||||
if (cblockw_init * cblockh_init > 4096 || cblockw_init > 1024
|
||||
|| cblockw_init < 4 || cblockh_init > 1024 || cblockh_init < 4) {
|
||||
fprintf(stderr,
|
||||
"!! Size of code_block error (option -b) !!\n\nRestriction :\n * width*height<=4096\n * 4<=width,height<= 1024\n\n");
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
/* ----------------------------------------------------- */
|
||||
case 'x': /* creation of index file */
|
||||
index = optarg;
|
||||
img.index_on = 1;
|
||||
break;
|
||||
/* ----------------------------------------------------- */
|
||||
case 'p': /* progression order */
|
||||
sscanf(optarg, "%s", progression);
|
||||
Prog_order = give_progression(progression);
|
||||
if (Prog_order == -1) {
|
||||
fprintf(stderr,
|
||||
"Unrecognized progression order [LRCP, RLCP, RPCL, PCRL, CPRL] !!\n");
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
/* ----------------------------------------------------- */
|
||||
case 's': /* subsampling factor */
|
||||
if (sscanf(optarg, "%d,%d", &subsampling_dx, &subsampling_dy) != 2) {
|
||||
fprintf(stderr,
|
||||
"'-s' sub-sampling argument error ! [-s dx,dy]\n");
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
/* ----------------------------------------------------- */
|
||||
case 'd': /* coordonnate of the reference grid */
|
||||
if (sscanf(optarg, "%d,%d", &Dim[0], &Dim[1]) != 2) {
|
||||
fprintf(stderr,
|
||||
"-d 'coordonnate of the reference grid' argument error !! [-d x0,y0]\n");
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
/* ----------------------------------------------------- */
|
||||
case 'h': /* Display an help description */
|
||||
help_display();
|
||||
return 0;
|
||||
break;
|
||||
/* ----------------------------------------------------- */
|
||||
case 'P': /* POC */
|
||||
fprintf(stderr, "/----------------------------------\\\n");
|
||||
fprintf(stderr, "| POC option not fully tested !! |\n");
|
||||
fprintf(stderr, "\\----------------------------------/\n");
|
||||
|
||||
s = optarg;
|
||||
while (sscanf
|
||||
(s, "T%d=%d,%d,%d,%d,%d,%s", &POC[numpocs].tile,
|
||||
&POC[numpocs].resno0, &POC[numpocs].compno0,
|
||||
&POC[numpocs].layno1, &POC[numpocs].resno1,
|
||||
&POC[numpocs].compno1, POC[numpocs].progorder) == 7) {
|
||||
POC[numpocs].prg = give_progression(POC[numpocs].progorder);
|
||||
/* POC[numpocs].tile; */
|
||||
numpocs++;
|
||||
while (*s && *s != '/') {
|
||||
s++;
|
||||
}
|
||||
if (!*s)
|
||||
break;
|
||||
s++;
|
||||
}
|
||||
break;
|
||||
/* ------------------------------------------------------ */
|
||||
case 'S': /* SOP marker */
|
||||
CSty |= 0x02;
|
||||
break;
|
||||
/* ------------------------------------------------------ */
|
||||
case 'E': /* EPH marker */
|
||||
CSty |= 0x04;
|
||||
break;
|
||||
/* ------------------------------------------------------ */
|
||||
case 'M': /* Mode switch pas tous au point !! */
|
||||
if (sscanf(optarg, "%d", &value) == 1) {
|
||||
for (i = 0; i <= 5; i++) {
|
||||
int cache = value & (1 << i);
|
||||
if (cache)
|
||||
mode |= (1 << i);
|
||||
}
|
||||
}
|
||||
break;
|
||||
/* ------------------------------------------------------ */
|
||||
case 'R': /* ROI */
|
||||
if (sscanf(optarg, "OI:c=%d,U=%d", &ROI_compno, &ROI_shift) != 2) {
|
||||
fprintf(stderr,
|
||||
"ROI error !! [-ROI:c='compno',U='shift']\n");
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
/* ------------------------------------------------------ */
|
||||
case 'T': /* Tile offset */
|
||||
if (sscanf(optarg, "%d,%d", &TX0, &TY0) != 2) {
|
||||
fprintf(stderr,
|
||||
"-T 'tile offset' argument error !! [-T X0,Y0]");
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
/* ------------------------------------------------------ */
|
||||
case 'C': /* Add a comment */
|
||||
cp.comment = optarg;
|
||||
break;
|
||||
/* ------------------------------------------------------ */
|
||||
case 'I': /* reversible or not */
|
||||
ir = 1;
|
||||
break;
|
||||
/* ------------------------------------------------------ */
|
||||
default:
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
cp.tx0 = TX0;
|
||||
cp.ty0 = TY0;
|
||||
|
||||
/* Error messages */
|
||||
/* -------------- */
|
||||
if (!infile || !outfile) {
|
||||
fprintf(stderr,
|
||||
"usage: pnmtoj2k -i pnm-file -o j2k-file\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (cp.disto_alloc & cp.fixed_alloc) {
|
||||
fprintf(stderr,
|
||||
"Error: option -r and -q can not be used together !!\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* if no rate entered, lossless by default */
|
||||
if (tcp_init->numlayers == 0) {
|
||||
tcp_init->rates[tcp_init->numlayers] = 1;
|
||||
tcp_init->numlayers++;
|
||||
cp.disto_alloc = 1;
|
||||
}
|
||||
|
||||
if (TX0 > Dim[0] || TY0 > Dim[1]) {
|
||||
fprintf(stderr,
|
||||
"Error: Tile offset dimension is unnappropriate --> TX0(%d)<=IMG_X0(%d) TYO(%d)<=IMG_Y0(%d) \n",
|
||||
TX0, Dim[0], TY0, Dim[1]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
for (i = 0; i < numpocs; i++) {
|
||||
if (POC[i].prg == -1) {
|
||||
fprintf(stderr,
|
||||
"Unrecognized progression order in option -P (POC n %d) [LRCP, RLCP, RPCL, PCRL, CPRL] !!\n",
|
||||
i + 1);
|
||||
}
|
||||
}
|
||||
|
||||
switch (cp.image_type) {
|
||||
case 0:
|
||||
if (Tile_arg) {
|
||||
if (!pgxtoimage
|
||||
(infile, &img, cp.tdy, subsampling_dx, subsampling_dy, Dim,
|
||||
cp)) {
|
||||
fprintf(stderr, "not a pgx file\n");
|
||||
return 1;
|
||||
}
|
||||
} else {
|
||||
if (!pgxtoimage
|
||||
(infile, &img, -1, subsampling_dx, subsampling_dy, Dim, cp)) {
|
||||
fprintf(stderr, " not a pgx file\n");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 1:
|
||||
if (!pnmtoimage(infile, &img, subsampling_dx, subsampling_dy, Dim)) {
|
||||
fprintf(stderr, " not a pnm file\n");
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
|
||||
case 2:
|
||||
if (!bmptoimage(infile, &img, subsampling_dx, subsampling_dy, Dim)) {
|
||||
fprintf(stderr, " not a bmp file\n");
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
/* to respect profile - 0 */
|
||||
/* ---------------------- */
|
||||
numD_min = 0;
|
||||
/* while (int_ceildiv(img.x1,(1<<numD_min))-int_ceildiv(img.x0,(1<<numD_min))>120 || int_ceildiv(img.y1,(1<<numD_min))-int_ceildiv(img.y0,(1<<numD_min))>160) numD_min++;
|
||||
if ((numD_min+1)>NumResolution)
|
||||
{
|
||||
fprintf(stderr,"\n********************************************************************************\n\n");
|
||||
fprintf(stderr, "In view to respect Profile-0, the number of resolution used is %d in place of %d\n\n",numD_min+1,NumResolution);
|
||||
fprintf(stderr, "********************************************************************************\n\n");
|
||||
NumResolution=numD_min+1;
|
||||
} */
|
||||
|
||||
if (Tile_arg == 1) {
|
||||
cp.tw = int_ceildiv(img.x1 - cp.tx0, cp.tdx);
|
||||
cp.th = int_ceildiv(img.y1 - cp.ty0, cp.tdy);
|
||||
} else {
|
||||
cp.tdx = img.x1 - cp.tx0;
|
||||
cp.tdy = img.y1 - cp.ty0;
|
||||
}
|
||||
|
||||
/* Init the mutiple tiles */
|
||||
/* ---------------------- */
|
||||
cp.tcps = (j2k_tcp_t *) malloc(cp.tw * cp.th * sizeof(j2k_tcp_t));
|
||||
|
||||
for (tileno = 0; tileno < cp.tw * cp.th; tileno++) {
|
||||
tcp = &cp.tcps[tileno];
|
||||
tcp->numlayers = tcp_init->numlayers;
|
||||
for (j = 0; j < tcp->numlayers; j++) {
|
||||
tcp->rates[j] = tcp_init->rates[j];
|
||||
}
|
||||
tcp->csty = CSty;
|
||||
tcp->prg = Prog_order;
|
||||
tcp->mct = img.numcomps == 3 ? 1 : 0;
|
||||
numpocs_tile = 0;
|
||||
if (numpocs) { /* intialisation of POC */
|
||||
for (i = 0; i < numpocs; i++) {
|
||||
if (tileno == POC[i].tile - 1 || POC[i].tile == -1) {
|
||||
tcp_poc = &tcp->pocs[numpocs_tile];
|
||||
tcp_poc->resno0 = POC[numpocs_tile].resno0;
|
||||
tcp_poc->compno0 = POC[numpocs_tile].compno0;
|
||||
tcp_poc->layno1 = POC[numpocs_tile].layno1;
|
||||
tcp_poc->resno1 = POC[numpocs_tile].resno1;
|
||||
tcp_poc->compno1 = POC[numpocs_tile].compno1;
|
||||
tcp_poc->prg = POC[numpocs_tile].prg;
|
||||
tcp_poc->tile = POC[numpocs_tile].tile;
|
||||
numpocs_tile++;
|
||||
}
|
||||
}
|
||||
}
|
||||
tcp->numpocs = numpocs_tile;
|
||||
tcp->tccps = (j2k_tccp_t *) malloc(img.numcomps * sizeof(j2k_tccp_t));
|
||||
|
||||
for (i = 0; i < img.numcomps; i++) {
|
||||
tccp = &tcp->tccps[i];
|
||||
tccp->csty = CSty & 0x01; /* 0 => one precinct || 1 => custom precinct */
|
||||
tccp->numresolutions = NumResolution;
|
||||
tccp->cblkw = int_floorlog2(cblockw_init);
|
||||
tccp->cblkh = int_floorlog2(cblockh_init);
|
||||
tccp->cblksty = mode;
|
||||
tccp->qmfbid = ir ? 0 : 1;
|
||||
tccp->qntsty = ir ? J2K_CCP_QNTSTY_SEQNT : J2K_CCP_QNTSTY_NOQNT;
|
||||
tccp->numgbits = 2;
|
||||
if (i == ROI_compno)
|
||||
tccp->roishift = ROI_shift;
|
||||
else
|
||||
tccp->roishift = 0;
|
||||
if (CSty & J2K_CCP_CSTY_PRT) {
|
||||
|
||||
for (j = 0; j < tccp->numresolutions; j++) {
|
||||
int size_prcw, size_prch;
|
||||
size_prcw = prcw_init >> (tccp->numresolutions - j - 1);
|
||||
size_prch = prch_init >> (tccp->numresolutions - j - 1);
|
||||
if (size_prcw < 1) {
|
||||
tccp->prcw[j] = 1;
|
||||
} else {
|
||||
tccp->prcw[j] =
|
||||
int_floorlog2(prcw_init >> (tccp->numresolutions - j - 1));
|
||||
}
|
||||
if (size_prch < 1) {
|
||||
tccp->prch[j] = 1;
|
||||
} else {
|
||||
tccp->prch[j] =
|
||||
int_floorlog2(prch_init >> (tccp->numresolutions - j - 1));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (j = 0; j < tccp->numresolutions; j++) {
|
||||
tccp->prcw[j] = 15;
|
||||
tccp->prch[j] = 15;
|
||||
}
|
||||
}
|
||||
calc_explicit_stepsizes(tccp, img.comps[i].prec);
|
||||
}
|
||||
}
|
||||
|
||||
len = j2k_encode(&img, &cp, outfile, cp.tdx * cp.tdy * 2, index);
|
||||
if (len == 0) {
|
||||
fprintf(stderr, "failed to encode image\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (cp.image_type) { /* PNM PGM PPM */
|
||||
/* Remove the temporary file Compo */
|
||||
/* ------------------------------- */
|
||||
for (i = 0; i < img.numcomps; i++) {
|
||||
char tmp[256];
|
||||
sprintf(tmp, "Compo%d", i);
|
||||
if (unlink(tmp) == -1) {
|
||||
fprintf(stderr, "failed to kill %s file !\n",
|
||||
tmp);
|
||||
}
|
||||
}
|
||||
} else { /* PGX */
|
||||
|
||||
/* Kill temporary bandtile file for cleaning the memory space on user's disk */
|
||||
for (i = 0; i < cp.th; i++) {
|
||||
char tmp;
|
||||
sprintf(&tmp, "bandtile%d", i + 1);
|
||||
|
||||
if (unlink(&tmp) == -1) {
|
||||
fprintf(stderr, "failed to kill %s file !\n",
|
||||
&tmp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,350 +0,0 @@
|
||||
/* Copyright (c) 2001 David Janssens
|
||||
* Copyright (c) 2002 Yannick Verschueren
|
||||
* Copyright (c) 2002 Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
||||
*
|
||||
* 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 <openjpeg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
int ceildiv(int a, int b)
|
||||
{
|
||||
return (a + b - 1) / b;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
FILE *f;
|
||||
char *src;
|
||||
char *dest, S1, S2, S3;
|
||||
int len;
|
||||
j2k_image_t *img;
|
||||
j2k_cp_t *cp;
|
||||
int w, h, max;
|
||||
int i, image_type = -1;
|
||||
|
||||
if (argc < 3) {
|
||||
fprintf(stderr, "usage: %s j2k-file pnm-file\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
f = fopen(argv[1], "rb");
|
||||
if (!f) {
|
||||
fprintf(stderr, "failed to open %s for reading\n", argv[1]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
dest = argv[2];
|
||||
|
||||
while (*dest && *dest != '.') {
|
||||
dest++;
|
||||
}
|
||||
dest++;
|
||||
S1 = *dest;
|
||||
dest++;
|
||||
S2 = *dest;
|
||||
dest++;
|
||||
S3 = *dest;
|
||||
|
||||
if ((S1 == 'p' && S2 == 'g' && S3 == 'x')
|
||||
|| (S1 == 'P' && S2 == 'G' && S3 == 'X')) {
|
||||
image_type = 0;
|
||||
}
|
||||
|
||||
if ((S1 == 'p' && S2 == 'n' && S3 == 'm')
|
||||
|| (S1 == 'P' && S2 == 'N' && S3 == 'M') || (S1 == 'p' && S2 == 'g'
|
||||
&& S3 == 'm')
|
||||
|| (S1 == 'P' && S2 == 'G' && S3 == 'M') || (S1 == 'P' && S2 == 'P'
|
||||
&& S3 == 'M')
|
||||
|| (S1 == 'p' && S2 == 'p' && S3 == 'm')) {
|
||||
image_type = 1;
|
||||
}
|
||||
|
||||
if ((S1 == 'b' && S2 == 'm' && S3 == 'p')
|
||||
|| (S1 == 'B' && S2 == 'M' && S3 == 'P')) {
|
||||
image_type = 2;
|
||||
}
|
||||
if (image_type == -1) {
|
||||
fprintf(stderr,
|
||||
"\033[0;33m!! Unrecognized format for infile [accept only *.pnm, *.pgm, *.ppm, *.pgx or *.bmp] !!\033[0;39m\n\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
fseek(f, 0, SEEK_END);
|
||||
len = ftell(f);
|
||||
fseek(f, 0, SEEK_SET);
|
||||
src = (char *) malloc(len);
|
||||
fread(src, 1, len, f);
|
||||
fclose(f);
|
||||
|
||||
if (!j2k_decode(src, len, &img, &cp)) {
|
||||
fprintf(stderr, "j2k_to_image: failed to decode image!\n");
|
||||
return 1;
|
||||
}
|
||||
free(src);
|
||||
|
||||
/* ------------------ CREATE OUT IMAGE WITH THE RIGHT FORMAT ----------------------- */
|
||||
|
||||
/* ------------------------ / */
|
||||
/* / */
|
||||
/* FORMAT : PNM, PGM or PPM / */
|
||||
/* / */
|
||||
/* ------------------------ / */
|
||||
|
||||
if (image_type == 1) { /* PNM PGM PPM */
|
||||
if (img->numcomps == 3 && img->comps[0].dx == img->comps[1].dx
|
||||
&& img->comps[1].dx == img->comps[2].dx
|
||||
&& img->comps[0].dy == img->comps[1].dy
|
||||
&& img->comps[1].dy == img->comps[2].dy
|
||||
&& img->comps[0].prec == img->comps[1].prec
|
||||
&& img->comps[1].prec == img->comps[2].prec) {
|
||||
f = fopen(argv[2], "wb");
|
||||
w = ceildiv(img->x1 - img->x0, img->comps[0].dx);
|
||||
h = ceildiv(img->y1 - img->y0, img->comps[0].dy);
|
||||
max = (1 << img->comps[0].prec) - 1;
|
||||
fprintf(f, "P6\n%d %d\n%d\n", w, h, max);
|
||||
for (i = 0; i < w * h; i++) {
|
||||
char r, g, b;
|
||||
r = img->comps[0].data[i];
|
||||
g = img->comps[1].data[i];
|
||||
b = img->comps[2].data[i];
|
||||
fprintf(f, "%c%c%c", r, g, b);
|
||||
}
|
||||
fclose(f);
|
||||
} else {
|
||||
int compno;
|
||||
for (compno = 0; compno < img->numcomps; compno++) {
|
||||
char name[256];
|
||||
if (img->numcomps > 1) {
|
||||
sprintf(name, "%d.%s", compno, argv[2]);
|
||||
} else {
|
||||
sprintf(name, "%s", argv[2]);
|
||||
}
|
||||
|
||||
f = fopen(name, "wb");
|
||||
|
||||
w = ceildiv(img->x1 - img->x0, img->comps[compno].dx);
|
||||
h = ceildiv(img->y1 - img->y0, img->comps[compno].dy);
|
||||
max = (1 << img->comps[compno].prec) - 1;
|
||||
fprintf(f, "P5\n%d %d\n%d\n", w, h, max);
|
||||
for (i = 0; i < w * h; i++) {
|
||||
char l;
|
||||
l = img->comps[compno].data[i];
|
||||
fprintf(f, "%c", l);
|
||||
}
|
||||
fclose(f);
|
||||
}
|
||||
}
|
||||
} else
|
||||
/* ------------------------ / */
|
||||
/* / */
|
||||
/* FORMAT : PGX / */
|
||||
/* / */
|
||||
/* ------------------------ / */
|
||||
|
||||
if (image_type == 0) { /* PGX */
|
||||
int compno;
|
||||
for (compno = 0; compno < img->numcomps; compno++) {
|
||||
j2k_comp_t *comp = &img->comps[compno];
|
||||
char name[256];
|
||||
/* sprintf(name, "%s-%d.pgx", argv[2], compno); */
|
||||
sprintf(name, "%s", argv[2]);
|
||||
f = fopen(name, "wb");
|
||||
w = ceildiv(img->x1 - img->x0, comp->dx);
|
||||
h = ceildiv(img->y1 - img->y0, comp->dy);
|
||||
fprintf(f, "PG LM %c %d %d %d\n", comp->sgnd ? '-' : '+', comp->prec,
|
||||
w, h);
|
||||
for (i = 0; i < w * h; i++) {
|
||||
int v = img->comps[compno].data[i];
|
||||
if (comp->prec <= 8) {
|
||||
char c = (char) v;
|
||||
fwrite(&c, 1, 1, f);
|
||||
} else if (comp->prec <= 16) {
|
||||
short s = (short) v;
|
||||
fwrite(&s, 2, 1, f);
|
||||
} else {
|
||||
fwrite(&v, 4, 1, f);
|
||||
}
|
||||
}
|
||||
fclose(f);
|
||||
}
|
||||
} else
|
||||
/* ------------------------ / */
|
||||
/* / */
|
||||
/* FORMAT : BMP / */
|
||||
/* / */
|
||||
/* ------------------------ / */
|
||||
|
||||
|
||||
if (image_type == 2) { /* BMP */
|
||||
if (img->numcomps == 3 && img->comps[0].dx == img->comps[1].dx
|
||||
&& img->comps[1].dx == img->comps[2].dx
|
||||
&& img->comps[0].dy == img->comps[1].dy
|
||||
&& img->comps[1].dy == img->comps[2].dy
|
||||
&& img->comps[0].prec == img->comps[1].prec
|
||||
&& img->comps[1].prec == img->comps[2].prec) {
|
||||
/* -->> -->> -->> -->>
|
||||
|
||||
24 bits color
|
||||
|
||||
<<-- <<-- <<-- <<-- */
|
||||
|
||||
f = fopen(argv[2], "wb");
|
||||
w = ceildiv(img->x1 - img->x0, img->comps[0].dx);
|
||||
h = ceildiv(img->y1 - img->y0, img->comps[0].dy);
|
||||
|
||||
fprintf(f, "BM");
|
||||
|
||||
/* FILE HEADER */
|
||||
/* ------------- */
|
||||
fprintf(f, "%c%c%c%c",
|
||||
(unsigned char) (h * w * 3 + 3 * h * (w % 2) + 54) & 0xff,
|
||||
(unsigned char) ((h * w * 3 + 3 * h * (w % 2) + 54) >> 8) &
|
||||
0xff,
|
||||
(unsigned char) ((h * w * 3 + 3 * h * (w % 2) + 54) >> 16) &
|
||||
0xff,
|
||||
(unsigned char) ((h * w * 3 + 3 * h * (w % 2) + 54) >> 24) &
|
||||
0xff);
|
||||
fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff,
|
||||
((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
|
||||
fprintf(f, "%c%c%c%c", (54) & 0xff, ((54) >> 8) & 0xff,
|
||||
((54) >> 16) & 0xff, ((54) >> 24) & 0xff);
|
||||
/* INFO HEADER */
|
||||
/* ------------- */
|
||||
fprintf(f, "%c%c%c%c", (40) & 0xff, ((40) >> 8) & 0xff,
|
||||
((40) >> 16) & 0xff, ((40) >> 24) & 0xff);
|
||||
fprintf(f, "%c%c%c%c", (unsigned char) ((w) & 0xff),
|
||||
(unsigned char) ((w) >> 8) & 0xff,
|
||||
(unsigned char) ((w) >> 16) & 0xff,
|
||||
(unsigned char) ((w) >> 24) & 0xff);
|
||||
fprintf(f, "%c%c%c%c", (unsigned char) ((h) & 0xff),
|
||||
(unsigned char) ((h) >> 8) & 0xff,
|
||||
(unsigned char) ((h) >> 16) & 0xff,
|
||||
(unsigned char) ((h) >> 24) & 0xff);
|
||||
fprintf(f, "%c%c", (1) & 0xff, ((1) >> 8) & 0xff);
|
||||
fprintf(f, "%c%c", (24) & 0xff, ((24) >> 8) & 0xff);
|
||||
fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff,
|
||||
((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
|
||||
fprintf(f, "%c%c%c%c",
|
||||
(unsigned char) (3 * h * w + 3 * h * (w % 2)) & 0xff,
|
||||
(unsigned char) ((h * w * 3 + 3 * h * (w % 2)) >> 8) & 0xff,
|
||||
(unsigned char) ((h * w * 3 + 3 * h * (w % 2)) >> 16) & 0xff,
|
||||
(unsigned char) ((h * w * 3 + 3 * h * (w % 2)) >> 24) &
|
||||
0xff);
|
||||
fprintf(f, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff,
|
||||
((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff);
|
||||
fprintf(f, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff,
|
||||
((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff);
|
||||
fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff,
|
||||
((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
|
||||
fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff,
|
||||
((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
|
||||
|
||||
for (i = 0; i < w * h; i++) {
|
||||
unsigned char R, G, B;
|
||||
|
||||
R = img->comps[0].data[w * h - ((i) / (w) + 1) * w + (i) % (w)];
|
||||
G = img->comps[1].data[w * h - ((i) / (w) + 1) * w + (i) % (w)];
|
||||
B = img->comps[2].data[w * h - ((i) / (w) + 1) * w + (i) % (w)];
|
||||
fprintf(f, "%c%c%c", B, G, R);
|
||||
if (((i + 1) % w == 0 && w % 2))
|
||||
fprintf(f, "%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff,
|
||||
((0) >> 16) & 0xff);
|
||||
}
|
||||
fclose(f);
|
||||
} else { /* Gray-scale */
|
||||
|
||||
/* -->> -->> -->> -->>
|
||||
|
||||
8 bits non code (Gray scale)
|
||||
|
||||
<<-- <<-- <<-- <<-- */
|
||||
f = fopen(argv[2], "wb");
|
||||
w = ceildiv(img->x1 - img->x0, img->comps[0].dx);
|
||||
h = ceildiv(img->y1 - img->y0, img->comps[0].dy);
|
||||
|
||||
fprintf(f, "BM");
|
||||
|
||||
/* FILE HEADER */
|
||||
/* ------------- */
|
||||
fprintf(f, "%c%c%c%c",
|
||||
(unsigned char) (h * w + 54 + 1024 + h * (w % 2)) & 0xff,
|
||||
(unsigned char) ((h * w + 54 + 1024 + h * (w % 2)) >> 8) &
|
||||
0xff,
|
||||
(unsigned char) ((h * w + 54 + 1024 + h * (w % 2)) >> 16) &
|
||||
0xff,
|
||||
(unsigned char) ((h * w + 54 + 1024 + w * (w % 2)) >> 24) &
|
||||
0xff);
|
||||
fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff,
|
||||
((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
|
||||
fprintf(f, "%c%c%c%c", (54 + 1024) & 0xff, ((54 + 1024) >> 8) & 0xff,
|
||||
((54 + 1024) >> 16) & 0xff, ((54 + 1024) >> 24) & 0xff);
|
||||
/* INFO HEADER */
|
||||
/* ------------- */
|
||||
fprintf(f, "%c%c%c%c", (40) & 0xff, ((40) >> 8) & 0xff,
|
||||
((40) >> 16) & 0xff, ((40) >> 24) & 0xff);
|
||||
fprintf(f, "%c%c%c%c", (unsigned char) ((w) & 0xff),
|
||||
(unsigned char) ((w) >> 8) & 0xff,
|
||||
(unsigned char) ((w) >> 16) & 0xff,
|
||||
(unsigned char) ((w) >> 24) & 0xff);
|
||||
fprintf(f, "%c%c%c%c", (unsigned char) ((h) & 0xff),
|
||||
(unsigned char) ((h) >> 8) & 0xff,
|
||||
(unsigned char) ((h) >> 16) & 0xff,
|
||||
(unsigned char) ((h) >> 24) & 0xff);
|
||||
fprintf(f, "%c%c", (1) & 0xff, ((1) >> 8) & 0xff);
|
||||
fprintf(f, "%c%c", (8) & 0xff, ((8) >> 8) & 0xff);
|
||||
fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff,
|
||||
((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
|
||||
fprintf(f, "%c%c%c%c", (unsigned char) (h * w + h * (w % 2)) & 0xff,
|
||||
(unsigned char) ((h * w + h * (w % 2)) >> 8) & 0xff,
|
||||
(unsigned char) ((h * w + h * (w % 2)) >> 16) & 0xff,
|
||||
(unsigned char) ((h * w + h * (w % 2)) >> 24) & 0xff);
|
||||
fprintf(f, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff,
|
||||
((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff);
|
||||
fprintf(f, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff,
|
||||
((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff);
|
||||
fprintf(f, "%c%c%c%c", (256) & 0xff, ((256) >> 8) & 0xff,
|
||||
((256) >> 16) & 0xff, ((256) >> 24) & 0xff);
|
||||
fprintf(f, "%c%c%c%c", (256) & 0xff, ((256) >> 8) & 0xff,
|
||||
((256) >> 16) & 0xff, ((256) >> 24) & 0xff);
|
||||
}
|
||||
|
||||
for (i = 0; i < 256; i++) {
|
||||
fprintf(f, "%c%c%c%c", i, i, i, 0);
|
||||
}
|
||||
|
||||
for (i = 0; i < w * h; i++) {
|
||||
fprintf(f, "%c",
|
||||
img->comps[0].data[w * h - ((i) / (w) + 1) * w + (i) % (w)]);
|
||||
if (((i + 1) % w == 0 && w % 2))
|
||||
fprintf(f, "%c", 0);
|
||||
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
105
codec/readme.txt
105
codec/readme.txt
@@ -1,105 +0,0 @@
|
||||
List of parameters for the coder JPEG 2000 :
|
||||
|
||||
Date : June the 25th, 2003
|
||||
Author : Yannick Verschueren
|
||||
Contact : verschueren@tele.ucl.ac.be
|
||||
|
||||
- the option -help displays the readme.txt file on screen
|
||||
|
||||
- The markers COD and QCD are writed both of two in the main_header and never appear in the tile_header. The markers in the main header are : SOC SIZ COD QCD COM.
|
||||
|
||||
- This coder can encode mega image, a test was made on a 24000x24000 pixels color image. You need enough disk space memory (twice the original) to encode the image. (i.e. for a 1.5 Gb image you need a minimum of 3Gb of disk memory)
|
||||
|
||||
REMARKS :
|
||||
---------
|
||||
|
||||
* the value of rate enter in the code line is the compression factor !
|
||||
exemple :
|
||||
|
||||
-r 20,10,1 means quality 1 : compress 20x, quality 2 : compress 10x and quality 3 : compress 1x = lossless
|
||||
|
||||
* The number of resolution can be modified by the program in view to respect profile-0 conditions (Taubman, Marcelin (2002), "JPEG2000, image compression fundamentals, standards and practice", p700)
|
||||
|
||||
By default :
|
||||
------------
|
||||
|
||||
* lossless
|
||||
* 1 tile
|
||||
* size of precinct 2^15 x 2^15 (means 1 precinct)
|
||||
* size of code-block 64 x 64
|
||||
* Number of resolution : 6
|
||||
* No SOP marker in the codestream
|
||||
* No EPH marker in the codestream
|
||||
* No sub-sampling in x and y direction
|
||||
* No mode switch activated
|
||||
* progression order : LRCP
|
||||
* No index file
|
||||
* No ROI upshifted
|
||||
* No offset of the origin of the image
|
||||
* No offset of the origin of the tiles
|
||||
* Reversible DWT 5-3
|
||||
|
||||
Parameters :
|
||||
------------
|
||||
|
||||
-i : source file (-i source.pnm also *.pgm, *.ppm) "required"
|
||||
|
||||
-o : destination file (-o dest.j2k) "required"
|
||||
|
||||
-r : different rates (-r 20,10,5) "optional"
|
||||
|
||||
-n : Number of resolution (-n 3) "optional"
|
||||
|
||||
-b : size of code block (-b 32,32) "optional"
|
||||
|
||||
-c : size of precinct (-c 128,128) "optional"
|
||||
|
||||
-t : size of tile (-t 512,512) "optional"
|
||||
|
||||
-p : progression order (-p LRCP) [LRCP, RLCP, RPCL, PCRL, CPRL] "optional"
|
||||
|
||||
-s : subsampling factor (-s 2,2) [-s X,Y] "optional"
|
||||
|
||||
-SOP : write SOP marker before each packet "optional"
|
||||
|
||||
-EPH : write EPH marker after each header packet "optional"
|
||||
|
||||
-M : mode switch (-M 3) [1= BYPASS(LAZY) 2=RESET 4=RESTART(TERMALL) 8=VSC 16=ERTERM(SEGTERM) 32=SEGMARK(SEGSYM)] "optional"
|
||||
for several mode switch you have to add the value of each mode you want
|
||||
ex : RESTART(4) + RESET(2) + SEGMARK(32) = -M 38
|
||||
|
||||
-x : Create an index file *.Idx (-x index_name.Idx) "optional"
|
||||
|
||||
-ROI:c=%d,U=%d : quantization indices upshifted for component c=%d [%d = 0,1,2]
|
||||
with a value of U=%d [0 <= %d <= 37] (i.e. -ROI:c=0,U=25) "optional"
|
||||
|
||||
-d : offset of the origin of the image (-d 150,300) "optional"
|
||||
|
||||
-T : offset of the origin of the tiles (-T 100,75) "optional"
|
||||
|
||||
-I : Use the irreversible DWT 9-7 (-I) "optional"
|
||||
|
||||
IMPORTANT :
|
||||
-----------
|
||||
|
||||
* subsampling bigger than 2 can produce error
|
||||
|
||||
The index file respect the structure below :
|
||||
---------------------------------------------
|
||||
|
||||
Image_height Image_width
|
||||
progression order
|
||||
Tiles_size_X Tiles_size_Y
|
||||
Components_nb
|
||||
Layers_nb
|
||||
decomposition_levels
|
||||
Precincts_size_X Precincts_size_Y
|
||||
Main_header_end_position
|
||||
Codestream_size
|
||||
Tile0 start_pos end_Theader end_pos
|
||||
Tile1 " " "
|
||||
...
|
||||
TileN " " "
|
||||
Tpacket_0 Tile layer res. comp. prec. start_pos end_pos
|
||||
...
|
||||
Tpacket_M " " " " " " "
|
||||
52
doc/CMakeLists.txt
Normal file
52
doc/CMakeLists.txt
Normal file
@@ -0,0 +1,52 @@
|
||||
# Generate target to build the html documentation through CMake tool
|
||||
# After having configured the project with the BUILD_DOC option you can run make doc
|
||||
# to generate the html documentation in the doc/html repository of the build folder.
|
||||
|
||||
# Try to find the doxygen tool
|
||||
find_package(Doxygen)
|
||||
|
||||
if(DOXYGEN_FOUND)
|
||||
# Configure the doxygen config file with variable from CMake and move it
|
||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.dox.cmake.in
|
||||
${CMAKE_BINARY_DIR}/doc/Doxyfile-html.dox @ONLY)
|
||||
|
||||
# Configure the html mainpage file of the doxygen documentation with variable
|
||||
# from CMake and move it
|
||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/mainpage.dox.in
|
||||
${CMAKE_BINARY_DIR}/doc/mainpage.dox @ONLY)
|
||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/openjpip.dox.in
|
||||
${CMAKE_BINARY_DIR}/doc/openjpip.dox @ONLY)
|
||||
# copy png file to make local (binary tree) documentation valid:
|
||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/jpip_architect.png
|
||||
${CMAKE_BINARY_DIR}/doc/html/jpip_architect.png COPYONLY)
|
||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/jpip_protocol.png
|
||||
${CMAKE_BINARY_DIR}/doc/html/jpip_protocol.png COPYONLY)
|
||||
|
||||
file(GLOB headers
|
||||
${OPENJPEG_SOURCE_DIR}/src/lib/openjp2/*.h
|
||||
${OPENJPEG_SOURCE_DIR}/src/lib/openjp2/*.c
|
||||
${OPENJPEG_SOURCE_DIR}/src/lib/openjpip/*.h
|
||||
${OPENJPEG_SOURCE_DIR}/src/lib/openjpip/*.c
|
||||
)
|
||||
# Generate new target to build the html documentation
|
||||
add_custom_command(
|
||||
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/html/index.html
|
||||
COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_BINARY_DIR}/doc/Doxyfile-html.dox
|
||||
DEPENDS ${CMAKE_BINARY_DIR}/doc/Doxyfile-html.dox
|
||||
${CMAKE_BINARY_DIR}/doc/mainpage.dox
|
||||
${CMAKE_BINARY_DIR}/doc/openjpip.dox
|
||||
${headers}
|
||||
)
|
||||
add_custom_target(doc ALL
|
||||
DEPENDS ${CMAKE_BINARY_DIR}/doc/html/index.html
|
||||
COMMENT "Building doxygen documentation"
|
||||
)
|
||||
|
||||
# install HTML documentation (install png files too):
|
||||
install(DIRECTORY ${CMAKE_BINARY_DIR}/doc/html
|
||||
DESTINATION share/doc
|
||||
PATTERN ".svn" EXCLUDE
|
||||
)
|
||||
else()
|
||||
message(STATUS "Doxygen not found, we cannot generate the documentation")
|
||||
endif()
|
||||
285
doc/Doxyfile.dox.cmake.in
Normal file
285
doc/Doxyfile.dox.cmake.in
Normal file
@@ -0,0 +1,285 @@
|
||||
# Doxyfile 1.7.1
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Project related configuration options
|
||||
#---------------------------------------------------------------------------
|
||||
DOXYFILE_ENCODING = UTF-8
|
||||
PROJECT_NAME = OpenJPEG
|
||||
PROJECT_NUMBER = @OPENJPEG_VERSION@
|
||||
OUTPUT_DIRECTORY = @OPENJPEG_BINARY_DIR@/doc
|
||||
CREATE_SUBDIRS = NO
|
||||
OUTPUT_LANGUAGE = English
|
||||
BRIEF_MEMBER_DESC = YES
|
||||
REPEAT_BRIEF = YES
|
||||
ABBREVIATE_BRIEF = "The $name class" \
|
||||
"The $name widget" \
|
||||
"The $name file" \
|
||||
is \
|
||||
provides \
|
||||
specifies \
|
||||
contains \
|
||||
represents \
|
||||
a \
|
||||
an \
|
||||
the
|
||||
ALWAYS_DETAILED_SEC = NO
|
||||
INLINE_INHERITED_MEMB = NO
|
||||
FULL_PATH_NAMES = NO
|
||||
STRIP_FROM_PATH = C://
|
||||
STRIP_FROM_INC_PATH =
|
||||
SHORT_NAMES = NO
|
||||
JAVADOC_AUTOBRIEF = YES
|
||||
QT_AUTOBRIEF = NO
|
||||
MULTILINE_CPP_IS_BRIEF = NO
|
||||
INHERIT_DOCS = YES
|
||||
SEPARATE_MEMBER_PAGES = NO
|
||||
TAB_SIZE = 8
|
||||
ALIASES =
|
||||
OPTIMIZE_OUTPUT_FOR_C = YES
|
||||
OPTIMIZE_OUTPUT_JAVA = NO
|
||||
OPTIMIZE_FOR_FORTRAN = NO
|
||||
OPTIMIZE_OUTPUT_VHDL = NO
|
||||
EXTENSION_MAPPING =
|
||||
BUILTIN_STL_SUPPORT = NO
|
||||
CPP_CLI_SUPPORT = NO
|
||||
SIP_SUPPORT = NO
|
||||
IDL_PROPERTY_SUPPORT = YES
|
||||
DISTRIBUTE_GROUP_DOC = NO
|
||||
SUBGROUPING = YES
|
||||
TYPEDEF_HIDES_STRUCT = NO
|
||||
SYMBOL_CACHE_SIZE = 0
|
||||
#---------------------------------------------------------------------------
|
||||
# Build related configuration options
|
||||
#---------------------------------------------------------------------------
|
||||
EXTRACT_ALL = YES
|
||||
EXTRACT_PRIVATE = YES
|
||||
EXTRACT_STATIC = YES
|
||||
EXTRACT_LOCAL_CLASSES = YES
|
||||
EXTRACT_LOCAL_METHODS = NO
|
||||
EXTRACT_ANON_NSPACES = NO
|
||||
HIDE_UNDOC_MEMBERS = NO
|
||||
HIDE_UNDOC_CLASSES = NO
|
||||
HIDE_FRIEND_COMPOUNDS = NO
|
||||
HIDE_IN_BODY_DOCS = NO
|
||||
INTERNAL_DOCS = NO
|
||||
CASE_SENSE_NAMES = NO
|
||||
HIDE_SCOPE_NAMES = NO
|
||||
SHOW_INCLUDE_FILES = YES
|
||||
FORCE_LOCAL_INCLUDES = NO
|
||||
INLINE_INFO = YES
|
||||
SORT_MEMBER_DOCS = YES
|
||||
SORT_BRIEF_DOCS = NO
|
||||
SORT_MEMBERS_CTORS_1ST = NO
|
||||
SORT_GROUP_NAMES = NO
|
||||
SORT_BY_SCOPE_NAME = NO
|
||||
GENERATE_TODOLIST = YES
|
||||
GENERATE_TESTLIST = YES
|
||||
GENERATE_BUGLIST = YES
|
||||
GENERATE_DEPRECATEDLIST= YES
|
||||
ENABLED_SECTIONS =
|
||||
MAX_INITIALIZER_LINES = 30
|
||||
SHOW_USED_FILES = YES
|
||||
SHOW_DIRECTORIES = NO
|
||||
SHOW_FILES = YES
|
||||
SHOW_NAMESPACES = YES
|
||||
FILE_VERSION_FILTER =
|
||||
LAYOUT_FILE =
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to warning and progress messages
|
||||
#---------------------------------------------------------------------------
|
||||
QUIET = NO
|
||||
WARNINGS = YES
|
||||
WARN_IF_UNDOCUMENTED = YES
|
||||
WARN_IF_DOC_ERROR = YES
|
||||
WARN_NO_PARAMDOC = NO
|
||||
WARN_FORMAT = "$file:$line: $text"
|
||||
WARN_LOGFILE =
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the input files
|
||||
#---------------------------------------------------------------------------
|
||||
INPUT = @OPENJPEG_SOURCE_DIR@/src/lib/openjp2 \
|
||||
@OPENJPEG_SOURCE_DIR@/src/lib/openjpip \
|
||||
@OPENJPEG_BINARY_DIR@/doc
|
||||
INPUT_ENCODING = UTF-8
|
||||
FILE_PATTERNS = *.h \
|
||||
*.c \
|
||||
*.dox
|
||||
RECURSIVE = YES
|
||||
EXCLUDE =
|
||||
EXCLUDE_SYMLINKS = NO
|
||||
EXCLUDE_PATTERNS = */.svn/*
|
||||
EXCLUDE_SYMBOLS =
|
||||
EXAMPLE_PATH =
|
||||
EXAMPLE_PATTERNS = *
|
||||
EXAMPLE_RECURSIVE = NO
|
||||
IMAGE_PATH = @OPENJPEG_SOURCE_DIR@/doc
|
||||
INPUT_FILTER =
|
||||
FILTER_PATTERNS =
|
||||
FILTER_SOURCE_FILES = NO
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to source browsing
|
||||
#---------------------------------------------------------------------------
|
||||
SOURCE_BROWSER = NO
|
||||
INLINE_SOURCES = NO
|
||||
STRIP_CODE_COMMENTS = YES
|
||||
REFERENCED_BY_RELATION = YES
|
||||
REFERENCES_RELATION = YES
|
||||
REFERENCES_LINK_SOURCE = YES
|
||||
USE_HTAGS = NO
|
||||
VERBATIM_HEADERS = YES
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the alphabetical class index
|
||||
#---------------------------------------------------------------------------
|
||||
ALPHABETICAL_INDEX = NO
|
||||
COLS_IN_ALPHA_INDEX = 5
|
||||
IGNORE_PREFIX =
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the HTML output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_HTML = YES
|
||||
HTML_OUTPUT = ./html
|
||||
HTML_FILE_EXTENSION = .html
|
||||
HTML_HEADER =
|
||||
HTML_FOOTER =
|
||||
HTML_STYLESHEET =
|
||||
HTML_COLORSTYLE_HUE = 220
|
||||
HTML_COLORSTYLE_SAT = 100
|
||||
HTML_COLORSTYLE_GAMMA = 80
|
||||
HTML_TIMESTAMP = NO
|
||||
HTML_ALIGN_MEMBERS = YES
|
||||
HTML_DYNAMIC_SECTIONS = NO
|
||||
GENERATE_DOCSET = NO
|
||||
DOCSET_FEEDNAME = "Doxygen generated docs"
|
||||
DOCSET_BUNDLE_ID = org.doxygen.Project
|
||||
DOCSET_PUBLISHER_ID = org.doxygen.Publisher
|
||||
DOCSET_PUBLISHER_NAME = Publisher
|
||||
GENERATE_HTMLHELP = NO
|
||||
CHM_FILE =
|
||||
HHC_LOCATION =
|
||||
GENERATE_CHI = NO
|
||||
CHM_INDEX_ENCODING =
|
||||
BINARY_TOC = NO
|
||||
TOC_EXPAND = NO
|
||||
GENERATE_QHP = NO
|
||||
QCH_FILE =
|
||||
QHP_NAMESPACE = org.doxygen.Project
|
||||
QHP_VIRTUAL_FOLDER = doc
|
||||
QHP_CUST_FILTER_NAME =
|
||||
QHP_CUST_FILTER_ATTRS =
|
||||
QHP_SECT_FILTER_ATTRS =
|
||||
QHG_LOCATION =
|
||||
GENERATE_ECLIPSEHELP = NO
|
||||
ECLIPSE_DOC_ID = org.doxygen.Project
|
||||
DISABLE_INDEX = NO
|
||||
ENUM_VALUES_PER_LINE = 4
|
||||
GENERATE_TREEVIEW = NO
|
||||
USE_INLINE_TREES = NO
|
||||
TREEVIEW_WIDTH = 250
|
||||
EXT_LINKS_IN_WINDOW = NO
|
||||
FORMULA_FONTSIZE = 10
|
||||
FORMULA_TRANSPARENT = YES
|
||||
SEARCHENGINE = NO
|
||||
SERVER_BASED_SEARCH = NO
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the LaTeX output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_LATEX = NO
|
||||
LATEX_OUTPUT = latex
|
||||
LATEX_CMD_NAME = latex
|
||||
MAKEINDEX_CMD_NAME = makeindex
|
||||
COMPACT_LATEX = NO
|
||||
PAPER_TYPE = a4wide
|
||||
EXTRA_PACKAGES =
|
||||
LATEX_HEADER =
|
||||
PDF_HYPERLINKS = NO
|
||||
USE_PDFLATEX = NO
|
||||
LATEX_BATCHMODE = NO
|
||||
LATEX_HIDE_INDICES = NO
|
||||
LATEX_SOURCE_CODE = NO
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the RTF output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_RTF = NO
|
||||
RTF_OUTPUT = rtf
|
||||
COMPACT_RTF = NO
|
||||
RTF_HYPERLINKS = NO
|
||||
RTF_STYLESHEET_FILE =
|
||||
RTF_EXTENSIONS_FILE =
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the man page output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_MAN = NO
|
||||
MAN_OUTPUT = man
|
||||
MAN_EXTENSION = .3
|
||||
MAN_LINKS = NO
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the XML output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_XML = NO
|
||||
XML_OUTPUT = xml
|
||||
XML_SCHEMA =
|
||||
XML_DTD =
|
||||
XML_PROGRAMLISTING = YES
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options for the AutoGen Definitions output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_AUTOGEN_DEF = NO
|
||||
#---------------------------------------------------------------------------
|
||||
# configuration options related to the Perl module output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_PERLMOD = NO
|
||||
PERLMOD_LATEX = NO
|
||||
PERLMOD_PRETTY = YES
|
||||
PERLMOD_MAKEVAR_PREFIX =
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the preprocessor
|
||||
#---------------------------------------------------------------------------
|
||||
ENABLE_PREPROCESSING = YES
|
||||
MACRO_EXPANSION = NO
|
||||
EXPAND_ONLY_PREDEF = NO
|
||||
SEARCH_INCLUDES = YES
|
||||
INCLUDE_PATH =
|
||||
INCLUDE_FILE_PATTERNS =
|
||||
PREDEFINED = USE_JPWL \
|
||||
USE_JPSEC
|
||||
EXPAND_AS_DEFINED =
|
||||
SKIP_FUNCTION_MACROS = YES
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration::additions related to external references
|
||||
#---------------------------------------------------------------------------
|
||||
TAGFILES =
|
||||
GENERATE_TAGFILE =
|
||||
ALLEXTERNALS = NO
|
||||
EXTERNAL_GROUPS = YES
|
||||
PERL_PATH = /usr/bin/perl
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the dot tool
|
||||
#---------------------------------------------------------------------------
|
||||
CLASS_DIAGRAMS = YES
|
||||
MSCGEN_PATH =
|
||||
HIDE_UNDOC_RELATIONS = YES
|
||||
HAVE_DOT = NO
|
||||
DOT_NUM_THREADS = 0
|
||||
DOT_FONTNAME = Helvetica
|
||||
DOT_FONTSIZE = 10
|
||||
DOT_FONTPATH =
|
||||
CLASS_GRAPH = YES
|
||||
COLLABORATION_GRAPH = YES
|
||||
GROUP_GRAPHS = YES
|
||||
UML_LOOK = NO
|
||||
TEMPLATE_RELATIONS = NO
|
||||
INCLUDE_GRAPH = YES
|
||||
INCLUDED_BY_GRAPH = YES
|
||||
CALL_GRAPH = NO
|
||||
CALLER_GRAPH = NO
|
||||
GRAPHICAL_HIERARCHY = YES
|
||||
DIRECTORY_GRAPH = YES
|
||||
DOT_IMAGE_FORMAT = png
|
||||
DOT_PATH =
|
||||
DOTFILE_DIRS =
|
||||
DOT_GRAPH_MAX_NODES = 50
|
||||
MAX_DOT_GRAPH_DEPTH = 1000
|
||||
DOT_TRANSPARENT = NO
|
||||
DOT_MULTI_TARGETS = NO
|
||||
GENERATE_LEGEND = YES
|
||||
DOT_CLEANUP = YES
|
||||
BIN
doc/jpip_architect.png
Normal file
BIN
doc/jpip_architect.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 61 KiB |
BIN
doc/jpip_protocol.png
Normal file
BIN
doc/jpip_protocol.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.2 KiB |
62
doc/mainpage.dox.in
Normal file
62
doc/mainpage.dox.in
Normal file
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
|
||||
* Copyright (c) 2011, Mickael Savinaud, Communications & Systemes <mickael.savinaud@c-s.fr>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/*! \mainpage OpenJPEG v@OPENJPEG_VERSION@ Documentation
|
||||
*
|
||||
* \section intro Introduction
|
||||
* This manual documents the low-level OpenJPEG C API.\n
|
||||
* The OpenJPEG library is an open-source JPEG 2000 library developed in order to promote the use of JPEG 2000.\n
|
||||
* This documents is focused on the main part of the library which try to implement Part 1 and Part 2 of the JPEG2000 norm.\n
|
||||
*
|
||||
* \section home Home page
|
||||
*
|
||||
* The Home Page of the OpenJPEG project can be found at:
|
||||
*
|
||||
* http://www.openjpeg.org/
|
||||
*
|
||||
* The source code repository is available here:
|
||||
*
|
||||
* http://github.com/uclouvain/openjpeg
|
||||
*
|
||||
* The OpenJPEG mailing list is located here:
|
||||
*
|
||||
* http://groups.google.com/group/openjpeg
|
||||
*
|
||||
* The test files repository is available here:
|
||||
*
|
||||
* http://github.com/uclouvain/openjpeg-data
|
||||
*
|
||||
* \section license License
|
||||
* This software is released under the BSD license, anybody can use or modify the library, even for commercial applications.\n
|
||||
* The only restriction is to retain the copyright in the sources or the binaries documentation.\n
|
||||
* Neither the author, nor the university accept any responsibility for any kind of error or data loss which may occur during usage.
|
||||
*
|
||||
* \author OpenJPEG Team
|
||||
*
|
||||
*/
|
||||
222
doc/man/man1/opj_compress.1
Normal file
222
doc/man/man1/opj_compress.1
Normal file
@@ -0,0 +1,222 @@
|
||||
'\" t
|
||||
'\" The line above instructs most `man' programs to invoke tbl
|
||||
'\"
|
||||
'\" Separate paragraphs; not the same as PP which resets indent level.
|
||||
.de SP
|
||||
.if t .sp .5
|
||||
.if n .sp
|
||||
..
|
||||
'\"
|
||||
'\" Replacement em-dash for nroff (default is too short).
|
||||
.ie n .ds m " -
|
||||
.el .ds m \(em
|
||||
'\"
|
||||
'\" Placeholder macro for if longer nroff arrow is needed.
|
||||
.ds RA \(->
|
||||
'\"
|
||||
'\" Decimal point set slightly raised
|
||||
.if t .ds d \v'-.15m'.\v'+.15m'
|
||||
.if n .ds d .
|
||||
'\"
|
||||
'\" Enclosure macro for examples
|
||||
.de EX
|
||||
.SP
|
||||
.nf
|
||||
.ft CW
|
||||
..
|
||||
.de EE
|
||||
.ft R
|
||||
.SP
|
||||
.fi
|
||||
..
|
||||
.TH opj_compress 1 "Version 2.1.1" "opj_compress" "converts to jpeg2000 files"
|
||||
.P
|
||||
.SH NAME
|
||||
opj_compress \-
|
||||
This program reads in an image of a certain type and converts it to a
|
||||
jpeg2000 file. It is part of the OpenJPEG library.
|
||||
.SP
|
||||
Valid input image extensions are
|
||||
.B .bmp, .pgm, .pgx, .png, .pnm, .ppm, .raw, .tga, .tif \fR. For PNG resp. TIF it needs libpng resp. libtiff .
|
||||
.SP
|
||||
Valid output image extensions are
|
||||
.B .j2k, .jp2
|
||||
.SH SYNOPSIS
|
||||
.P
|
||||
.B opj_compress \-i \fRinfile.bmp \fB-o \fRoutfile.j2k
|
||||
.P
|
||||
.B opj_compress \-ImgDir \fRdirectory_name \fB-OutFor \fRjp2
|
||||
.P
|
||||
.B opj_compress \-h \fRPrint a help message and exit.
|
||||
.P
|
||||
.R See JPWL OPTIONS for special options
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
.B \-\^b " n,n"
|
||||
(Size of code block (e.g. \-b 32,32). Default: 64 x 64)
|
||||
.TP
|
||||
.B \-\^c " n"
|
||||
(Size of precinct (e.g. \-c 128,128). Default: 2^15 x 2^15)
|
||||
.TP
|
||||
.B \-\^cinema2K " fps"
|
||||
Digital Cinema 2K profile compliant codestream. Valid \fBfps\fR values are 24 or 48.
|
||||
.TP
|
||||
.B \-\^cinema4K
|
||||
Digital Cinema 4K profile compliant codestream. Does not need an fps: default is 24 fps.
|
||||
.TP
|
||||
.B \-\^d " X,Y"
|
||||
(Offset of image origin (e.g. \-d 150,300))
|
||||
.TP
|
||||
.B \-\^h
|
||||
Print a help message and exit.
|
||||
.TP
|
||||
.B \-\^i " name"
|
||||
(input file name)
|
||||
.TP
|
||||
.B \-\^n " n"
|
||||
(Number of resolutions. Default: 6)
|
||||
.TP
|
||||
.B \-\^o " name"
|
||||
(output file name)
|
||||
.TP
|
||||
.B \-\^p " name"
|
||||
Progression order. \fBname\fR can be one out of:LRCP, RLCP, RPCL, PCRL, CPRL. Default: LRCP.
|
||||
.TP
|
||||
.B \-\^q " n"
|
||||
different psnr for successive layers
|
||||
.br
|
||||
.B Note: \fR(options \-r and \-q cannot be used together)
|
||||
.TP
|
||||
.B \-\^r " n"
|
||||
different compression ratio(s) for successive layers. The rate specified for each quality level is the desired compression factor.
|
||||
.br
|
||||
.B Note: \fR(options \-r and \-q cannot be used together)
|
||||
.TP
|
||||
.B \-\^s " X,Y"
|
||||
sub-sampling factor (e.g. \-s 2,2). Default: No sub-sampling in x or y direction.
|
||||
.br
|
||||
.B Remark: \fRsub-sampling bigger than 2 can produce errors.
|
||||
.TP
|
||||
.B \-\^t " W,H"
|
||||
(Size of tile (e.g. \-t 512,512) )
|
||||
.TP
|
||||
.B \-\^x " name"
|
||||
(Create index file and fill it. Default: no index file)
|
||||
.TP
|
||||
.B \-\^EPH
|
||||
(Write EPH marker after each header packet. Default:no EPH)
|
||||
.TP
|
||||
.B \-\^F " rawWidth,rawHeight,rawComp,rawBitDepth,s_or_u"
|
||||
characteristics of the raw input image
|
||||
.TP
|
||||
.B \-\^I
|
||||
(Use the irreversible DWT 9-7. Default: Reversible DWT 5-3)
|
||||
.TP
|
||||
.B \-\^ImgDir " directory_name"
|
||||
(directory containing input files)
|
||||
.TP
|
||||
.B \-\^M " n"
|
||||
mode switch with values: 1, 2, 4, 8, 16, 32. Default:No mode switch activated.
|
||||
.br
|
||||
\fIMeaning:\fR
|
||||
.br
|
||||
BYPASS(1)
|
||||
.br
|
||||
RESET(2)
|
||||
.br
|
||||
RESTART(4)
|
||||
.br
|
||||
VSC(8)
|
||||
.br
|
||||
ERTERM(16)
|
||||
.br
|
||||
SEGMARK(32)
|
||||
.br
|
||||
Values can be added: RESTART(4) + RESET(2) + SEGMARK(32) = \-M 38
|
||||
.TP
|
||||
.B \-\^OutFor "ext"
|
||||
(extension for output files)
|
||||
.TP
|
||||
.B \-\^POC "TtileNr=resolutionStart, componentStart, layerEnd, resolutionEnd, componentEnd, progressionOrder"
|
||||
(see Examples)
|
||||
.TP
|
||||
.B \-\^ROI "c=n,U=n"
|
||||
quantization indices upshifted for component c (0 or 1 or 2) with a value of U (>= 0 and <= 37)
|
||||
.br
|
||||
e.g. \fB-ROI c=0,U=25\fR
|
||||
.TP
|
||||
.B \-\^SOP
|
||||
(Write SOP marker before each packet. Default: No SOP marker in the codestream.)
|
||||
.TP
|
||||
.B \-\^T "X,Y"
|
||||
(Offset of the origin of the tiles (e.g. \-T 100,75) )
|
||||
.TP
|
||||
.B \-\^W
|
||||
(see JPWL OPTIONS)
|
||||
.P
|
||||
.SH JPWL OPTIONS
|
||||
Options usable only if the library has been compiled with \fB-DUSE_JPWL\fR
|
||||
.P
|
||||
.B \-W h<tilepart><=type>, s<tilepart><=method>, a=<addr>, z=<size>, g=<range>, p<tilepart:pack><=type>
|
||||
.P
|
||||
.B h\fR selects the header error protection (EPB): \fBtype\fR can be
|
||||
[0=none 1,absent=predefined 16=CRC-16 32=CRC-32 37-128=RS]
|
||||
if \fBtilepart\fR is absent, it is for main and tile headers
|
||||
if \fBtilepart\fR is present, it applies from that tile
|
||||
onwards, up to the next h<> spec, or to the last tilepart
|
||||
in the codestream (max. 16 specs)
|
||||
.P
|
||||
.B p \fRselects the packet error protection (EEP/UEP with EPBs)
|
||||
to be applied to raw data: \fBtype\fR can be
|
||||
[0=none 1,absent=predefined 16=CRC-16 32=CRC-32 37-128=RS]
|
||||
if \fBtilepart:pack\fR is absent, it is from tile 0, packet 0
|
||||
if \fBtilepart:pack\fR is present, it applies from that tile
|
||||
and that packet onwards, up to the next packet spec
|
||||
or to the last packet in the last tilepart in the stream
|
||||
(max. 16 specs)
|
||||
.P
|
||||
.B s \fRenables sensitivity data insertion (ESD): \fBmethod\fR can be
|
||||
[\-1=NO ESD 0=RELATIVE ERROR 1=MSE 2=MSE REDUCTION 3=PSNR
|
||||
4=PSNR INCREMENT 5=MAXERR 6=TSE 7=RESERVED]
|
||||
if \fBtilepart\fR is absent, it is for main header only
|
||||
if \fBtilepart\fR is present, it applies from that tile
|
||||
onwards, up to the next s<> spec, or to the last tilepart
|
||||
in the codestream (max. 16 specs)
|
||||
.P
|
||||
.B g \fRdetermines the addressing mode: \fBrange\fR can be
|
||||
[0=PACKET 1=BYTE RANGE 2=PACKET RANGE]
|
||||
.P
|
||||
.B a \fRdetermines the size of data addressing: \fBaddr\fR can be
|
||||
2/4 bytes (small/large codestreams). If not set, auto-mode
|
||||
.P
|
||||
.B z \fRdetermines the size of sensitivity values: \fBsize\fR can be
|
||||
1/2 bytes, for the transformed pseudo-floating point value
|
||||
.P
|
||||
.SH EXAMPLES
|
||||
.P
|
||||
.B opj_compress \-i \fRfile.bmp \fB-o \fRfile.j2k \fB-r \fR20,10,1 (compress 20x, then 10x, then lossless).
|
||||
.P
|
||||
.B opj_compress \-i \fRfile.ppm \fB-o \fRfile.j2k \fB-q \fR30,40,50
|
||||
.P
|
||||
.B opj_compress \-i \fRfile.pgx \fB-o \fRfile.j2k \fB-POC \fRT1=0,0,1,5,3,CPRL
|
||||
.P
|
||||
.B opj_compress \-i \fRlena.raw \fB-o \fRlena.j2k \fB-F \fR512,512,3,8,u
|
||||
.P
|
||||
.SH AUTHORS
|
||||
Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
|
||||
.br
|
||||
Copyright (c) 2002-2014, Professor Benoit Macq
|
||||
.br
|
||||
Copyright (c) 2001-2003, David Janssens
|
||||
.br
|
||||
Copyright (c) 2002-2003, Yannick Verschueren
|
||||
.br
|
||||
Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
|
||||
.br
|
||||
Copyright (c) 2005, Herve Drolon, FreeImage Team
|
||||
.br
|
||||
Copyright (c) 2006-2007, Parvatha Elangovan
|
||||
.P
|
||||
.SH "SEE ALSO"
|
||||
opj_decompress(1) opj_dump(1)
|
||||
|
||||
119
doc/man/man1/opj_decompress.1
Normal file
119
doc/man/man1/opj_decompress.1
Normal file
@@ -0,0 +1,119 @@
|
||||
'\" t
|
||||
'\" The line above instructs most `man' programs to invoke tbl
|
||||
'\"
|
||||
'\" Separate paragraphs; not the same as PP which resets indent level.
|
||||
.de SP
|
||||
.if t .sp .5
|
||||
.if n .sp
|
||||
..
|
||||
'\"
|
||||
'\" Replacement em-dash for nroff (default is too short).
|
||||
.ie n .ds m " -
|
||||
.el .ds m \(em
|
||||
'\"
|
||||
'\" Placeholder macro for if longer nroff arrow is needed.
|
||||
.ds RA \(->
|
||||
'\"
|
||||
'\" Decimal point set slightly raised
|
||||
.if t .ds d \v'-.15m'.\v'+.15m'
|
||||
.if n .ds d .
|
||||
'\"
|
||||
'\" Enclosure macro for examples
|
||||
.de EX
|
||||
.SP
|
||||
.nf
|
||||
.ft CW
|
||||
..
|
||||
.de EE
|
||||
.ft R
|
||||
.SP
|
||||
.fi
|
||||
..
|
||||
.TH opj_decompress 1 "Version 2.1.1" "opj_decompress" "converts jpeg2000 files"
|
||||
.P
|
||||
.SH NAME
|
||||
opj_decompress \-
|
||||
This program reads in a jpeg2000 image and converts it to another
|
||||
image type. It is part of the OpenJPEG library.
|
||||
.SP
|
||||
Valid input image extensions are
|
||||
.B .j2k, .jp2, .j2c, .jpt
|
||||
.SP
|
||||
Valid output image extensions are
|
||||
.B .bmp, .pgm, .pgx, .png, .pnm, .ppm, .raw, .tga, .tif \fR. For PNG resp. TIF it needs libpng resp. libtiff .
|
||||
.SH SYNOPSIS
|
||||
.P
|
||||
.B opj_decompress \-i \fRinfile.j2k \fB-o \fRoutfile.png
|
||||
.P
|
||||
.B opj_decompress \-ImgDir \fRimages/ \fB-OutFor \fRbmp
|
||||
.P
|
||||
.B opj_decompress \-h \fRPrint help message and exit
|
||||
.P
|
||||
.R See JPWL OPTIONS for special options
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
.B \-\^i "name"
|
||||
(jpeg2000 input file name)
|
||||
.TP
|
||||
.B \-\^l "n"
|
||||
n is the maximum number of quality layers to decode. See LAYERS below)
|
||||
.TP
|
||||
.B \-\^o "name"
|
||||
(output file name with extension)
|
||||
.TP
|
||||
.B \-\^r "n"
|
||||
(n is the highest resolution level to be discarded. See REDUCTION below)
|
||||
.TP
|
||||
.B \-\^x "name"
|
||||
(use name as index file and fill it)
|
||||
.TP
|
||||
.B \-\^ImgDir "directory_name"
|
||||
(directory containing input files)
|
||||
.TP
|
||||
.B \-\^OutFor "ext"
|
||||
(extension for output files)
|
||||
.P
|
||||
.SH JPIP OPTIONS
|
||||
Options usable only if the library has been compiled with
|
||||
.B BUILD_JPIP
|
||||
.TP
|
||||
.B -jpip
|
||||
Embed index table box into the output JP2 file (compulsory for JPIP)
|
||||
.TP
|
||||
.B -TP R
|
||||
Partition a tile into tile parts of different resolution levels (compulsory for JPT-stream)
|
||||
.P
|
||||
.SH JPWL OPTIONS
|
||||
Options usable only if the library has been compiled with
|
||||
.B BUILD_JPWL
|
||||
.TP
|
||||
.B -W c\fR[=Nc] (Nc is the number of expected components in the codestream; default:3)
|
||||
.TP
|
||||
.B -W t\fR[=Nt] (Nt is the maximum number of tiles in the codestream; default:8192)
|
||||
.TP
|
||||
.B -W c\fR[=Nc]\fB, t\fR[=Nt] \fR(same as above)
|
||||
.P
|
||||
.SH REDUCTION
|
||||
Set the number of highest resolution levels to be discarded.
|
||||
The image resolution is effectively divided by 2 to the power of the number of discarded levels. The reduce factor is limited by the smallest total number of decomposition levels among tiles.
|
||||
.SH TILES
|
||||
Set the maximum number of quality layers to decode. If there are less quality layers than the specified number, all the quality layers are decoded.
|
||||
.P
|
||||
'\".SH BUGS
|
||||
.SH AUTHORS
|
||||
Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
|
||||
.br
|
||||
Copyright (c) 2002-2014, Professor Benoit Macq
|
||||
.br
|
||||
Copyright (c) 2001-2003, David Janssens
|
||||
.br
|
||||
Copyright (c) 2002-2003, Yannick Verschueren
|
||||
.br
|
||||
Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
|
||||
.br
|
||||
Copyright (c) 2005, Herve Drolon, FreeImage Team
|
||||
.br
|
||||
Copyright (c) 2006-2007, Parvatha Elangovan
|
||||
.P
|
||||
.SH "SEE ALSO"
|
||||
opj_compress(1) opj_dump(1)
|
||||
62
doc/man/man1/opj_dump.1
Normal file
62
doc/man/man1/opj_dump.1
Normal file
@@ -0,0 +1,62 @@
|
||||
'\" t
|
||||
'\" The line above instructs most `man' programs to invoke tbl
|
||||
'\"
|
||||
'\" Separate paragraphs; not the same as PP which resets indent level.
|
||||
.de SP
|
||||
.if t .sp .5
|
||||
.if n .sp
|
||||
..
|
||||
'\"
|
||||
'\" Replacement em-dash for nroff (default is too short).
|
||||
.ie n .ds m " -
|
||||
.el .ds m \(em
|
||||
'\"
|
||||
'\" Placeholder macro for if longer nroff arrow is needed.
|
||||
.ds RA \(->
|
||||
'\"
|
||||
'\" Decimal point set slightly raised
|
||||
.if t .ds d \v'-.15m'.\v'+.15m'
|
||||
.if n .ds d .
|
||||
'\"
|
||||
'\" Enclosure macro for examples
|
||||
.de EX
|
||||
.SP
|
||||
.nf
|
||||
.ft CW
|
||||
..
|
||||
.de EE
|
||||
.ft R
|
||||
.SP
|
||||
.fi
|
||||
..
|
||||
.TH opj_dump 1 "Version 2.1.1" "opj_dump" "dumps jpeg2000 files"
|
||||
.P
|
||||
.SH NAME
|
||||
opj_dump \-
|
||||
This program reads in a jpeg2000 image and dumps the contents to stdout. It is part of the OpenJPEG library.
|
||||
.SP
|
||||
Valid input image extensions are
|
||||
.B .j2k, .jp2, .jpt
|
||||
.SP
|
||||
.SH SYNOPSIS
|
||||
.P
|
||||
.B opj_dump \-i \fRinfile.j2k
|
||||
.P
|
||||
.B opj_dump \-ImgDir \fRimages/ \fRDump all files in images/
|
||||
.P
|
||||
.B opj_dump \-h \fRPrint help message and exit
|
||||
.P
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
.B \-\^i "name"
|
||||
(jpeg2000 input file name)
|
||||
.TP
|
||||
.B \-\^ImgDir "directory_name"
|
||||
(directory containing jpeg2000 input files)
|
||||
.P
|
||||
'\".SH BUGS
|
||||
.SH AUTHORS
|
||||
Copyright (c) 2010, Mathieu Malaterre
|
||||
.P
|
||||
.SH "SEE ALSO"
|
||||
opj_compress(1) opj_decompress(1)
|
||||
337
doc/man/man3/libopenjp2.3
Normal file
337
doc/man/man3/libopenjp2.3
Normal file
@@ -0,0 +1,337 @@
|
||||
'\" t
|
||||
'\" The line above instructs most `man' programs to invoke tbl
|
||||
'\"
|
||||
'\" Separate paragraphs; not the same as PP which resets indent level.
|
||||
.de SP
|
||||
.if t .sp .5
|
||||
.if n .sp
|
||||
..
|
||||
'\"
|
||||
'\" Replacement em-dash for nroff (default is too short).
|
||||
.ie n .ds m " -
|
||||
.el .ds m \(em
|
||||
'\"
|
||||
'\" Placeholder macro for if longer nroff arrow is needed.
|
||||
.ds RA \(->
|
||||
'\"
|
||||
'\" Decimal point set slightly raised
|
||||
.if t .ds d \v'-.15m'.\v'+.15m'
|
||||
.if n .ds d .
|
||||
'\"
|
||||
'\" Enclosure macro for examples
|
||||
.de EX
|
||||
.SP
|
||||
.nf
|
||||
.ft CW
|
||||
..
|
||||
.de EE
|
||||
.ft R
|
||||
.SP
|
||||
.fi
|
||||
..
|
||||
.TH libopenjp2 3 "Oct 2010" "Version 1.4.0" "Oct 2010"
|
||||
.P
|
||||
.SH NAME
|
||||
libopenjp2 -
|
||||
a library for reading and writing JPEG2000 image files.
|
||||
.SP
|
||||
.SH SYNOPSIS
|
||||
.P
|
||||
.B #include <openjpeg.h>
|
||||
.P
|
||||
.SS CONVERSION FORMATS
|
||||
.B PGX: imagetopgx() \fR/\fB pgxtoimage()
|
||||
.P
|
||||
.B PXM: imagetopnm() \fR/\fB pnmtoimage()
|
||||
.P
|
||||
.B BMP: imagetobmp() \fR/\fB bmptoimage()
|
||||
.P
|
||||
.B TIF: imagetotif() \fR/\fB tiftoimage()
|
||||
.P
|
||||
.B RAW: imagetoraw() \fR/\fB rawtoimage()
|
||||
.P
|
||||
.B TGA: imagetotga() \fR/\fB tgatoimage()
|
||||
.P
|
||||
.B PNG: imagetopng() \fR/\fB pngtoimage()
|
||||
.P
|
||||
.B YUV: imagetoyuv() \fR/\fB yuvtoimage() \fR(MJ2)
|
||||
.P
|
||||
.SS READ
|
||||
.B opj_set_default_decoder_parameters(opj_dparameters_t *\fIparams\fB);
|
||||
.P
|
||||
.B opj_dinfo_t *opj_create_decompress(OPJ_CODEC_FORMAT \fIformat\fB);
|
||||
.P
|
||||
.B opj_event_mgr_t *opj_set_event_mgr(opj_common_ptr \fIinfo\fB, opj_event_mgr_t *\fIevent_mgr\fB, void *\fIcontext\fB);
|
||||
.P
|
||||
.B void opj_setup_decoder(opj_dinfo_t *\fIdinfo\fB, opj_dparameters_t * \fIparams\fB);
|
||||
.P
|
||||
.B opj_cio_t *opj_cio_open(opj_common_ptr \fIinfo\fB, unsigned char *\fIbuf\fB, int \fIbuf_len\fB);
|
||||
.P
|
||||
.B opj_image_t *opj_decode(opj_dinfo_t *\fIdinfo\fB, opj_cio_t *\fIcio\fB);
|
||||
.P
|
||||
.B void opj_cio_close(opj_cio_t *\fIcio\fB);
|
||||
.P
|
||||
.B void opj_destroy_decompress(opj_dinfo_t *\fIdinfo\fB);
|
||||
.P
|
||||
.B void opj_image_destroy(opj_image_t *\fIimage\fB);
|
||||
.P
|
||||
.SS WRITE
|
||||
.B void opj_set_default_encoder_parameters(opj_cparameters_t *\fIparams\fB);
|
||||
.P
|
||||
/*
|
||||
.B opj_image_t *FORMATtoimage(const char *\fIfname\fB, opj_cparameters_t *\fIparams\fB);
|
||||
.P
|
||||
*/
|
||||
.br
|
||||
.B opj_cinfo_t* opj_create_compress(OPJ_CODEC_FORMAT \fIformat\fB);
|
||||
.P
|
||||
.B opj_event_mgr_t *opj_set_event_mgr(opj_common_ptr \fIinfo\fB, opj_event_mgr_t *\fIevent_mgr\fB, void *\fIcontext\fB);
|
||||
.P
|
||||
.B void opj_setup_encoder(opj_cinfo_t *\fIcinfo\fB, opj_cparameters_t *\fIparams\fB, opj_image_t *\fIimage\fB);
|
||||
.P
|
||||
.B opj_cio_t *opj_cio_open(opj_common_ptr \fIcinfo\fB, \fINULL\fB, \fI0\fB);
|
||||
.P
|
||||
.B bool opj_encode(opj_cinfo_t *\fIcinfo\fB, opj_cio_t *\fIcio\fB, opj_image_t *\fIimage\fB, char *\fIindex\fB);
|
||||
.P
|
||||
.B void opj_cio_close(opj_cio_t *\fIcio\fB);
|
||||
.P
|
||||
.B void opj_destroy_compress(opj_cinfo_t *\fIcinfo\fB);
|
||||
.P
|
||||
.B void opj_image_destroy(opj_image_t *\fIimage\fB);
|
||||
.P
|
||||
.SS GENERAL
|
||||
.P
|
||||
.B void opj_image_create(int \fInumcmpts\fB, opj_image_cmptparm_t *\fIcmptparms\fB, OPJ_COLOR_SPACE \fIclrspc\fB);
|
||||
.P
|
||||
.B int cio_tell(opj_cio_t *\fIcio\fB);
|
||||
.P
|
||||
.B void cio_seek(opj_cio_t *\fIcio\fB, int \fIpos\fB);
|
||||
.P
|
||||
.B opj_image_t *opj_decode_with_info(opj_dinfo_t *\fIdinfo\fB, opj_cio_t *\fIcio\fB, opj_codestream_info_t *\fIcstr_info\fB);
|
||||
.P
|
||||
.B bool opj_encode_with_info(opj_cinfo_t *\fIcinfo\fB, opj_cio_t *\fIcio\fB, opj_image_t *\fIimage\fB, opj_codestream_info_t *\fIcstr_info\fB);
|
||||
.P
|
||||
.B void opj_destroy_cstr_info(opj_codestream_info_t *\fIcstr_info\fB);
|
||||
.P
|
||||
.B const char *opj_version(\fIvoid\fB);
|
||||
.P
|
||||
.SH OPJ_CODEC_FORMAT
|
||||
.P
|
||||
.B CODEC_J2K\fR or \fBCODEC_JPT\fR or \fBCODEC_JP2
|
||||
.P
|
||||
.SH OPJ_COLOR_SPACE
|
||||
.P
|
||||
.B CLRSPC_UNKNOWN\fR or \fBCLRSPC_UNSPECIFIED\fR or \fBCLRSPC_SRGB\fR or \fBCLRSPC_GRAY\fR or \fBCLRSPC_SYCC
|
||||
.P
|
||||
.SH DECOMPRESSION PARAMETERS
|
||||
.p
|
||||
typedef struct opj_dparameters
|
||||
.br
|
||||
{
|
||||
/*
|
||||
Set the number of highest resolution levels to be discarded.
|
||||
The image resolution is effectively divided by 2 to the power
|
||||
of the number of discarded levels.
|
||||
The reduce factor is limited by the smallest total number of
|
||||
decomposition levels among tiles.
|
||||
if != 0, then original dimension divided by 2^(reduce);
|
||||
if == 0 or not used, image is decoded to the full resolution
|
||||
*/
|
||||
\fBint\fR cp_reduce;
|
||||
/*
|
||||
Set the maximum number of quality layers to decode.
|
||||
If there are less quality layers than the specified number,
|
||||
all the quality layers are decoded.
|
||||
if != 0, then only the first "layer" layers are decoded;
|
||||
if == 0 or not used, all the quality layers are decoded
|
||||
*/
|
||||
\fBint\fR cp_layer;
|
||||
|
||||
/*command line encoder parameters (not used inside the library) */
|
||||
/* input file name */
|
||||
\fBchar\fR infile[OPJ_PATH_LEN];
|
||||
/* output file name */
|
||||
\fBchar\fR outfile[OPJ_PATH_LEN];
|
||||
/* input file format: see OPJ_CODEC_FORMAT */
|
||||
\fBint\fR decod_format;
|
||||
/* output file format */
|
||||
\fBint\fR cod_format;
|
||||
|
||||
/*JPWL decoding parameters */
|
||||
/* activates the JPWL correction capabilities */
|
||||
\fBbool\fR jpwl_correct;
|
||||
/* expected number of components */
|
||||
\fBint\fR jpwl_exp_comps;
|
||||
/* maximum number of tiles */
|
||||
\fBint\fR jpwl_max_tiles;
|
||||
|
||||
/*
|
||||
Specify whether the decoding should be done on the entire
|
||||
codestream, or be limited to the main header
|
||||
Limiting the decoding to the main header makes it possible
|
||||
to extract the characteristics of the codestream
|
||||
if == NO_LIMITATION, the entire codestream is decoded;
|
||||
if == LIMIT_TO_MAIN_HEADER, only the main header is decoded;
|
||||
*/
|
||||
\fBOPJ_LIMIT_DECODING\fR cp_limit_decoding;
|
||||
.br
|
||||
} opj_dparameters_t;
|
||||
|
||||
.SH COMPRESSION PARAMETERS
|
||||
.P
|
||||
typedef struct opj_cparameters
|
||||
.br
|
||||
{
|
||||
/* size of tile: tile_size_on = false (not in argument)
|
||||
or tile_size_on = true (in argument) */
|
||||
\fBbool\fR tile_size_on;
|
||||
/* XTOsiz */
|
||||
\fBint\fR cp_tx0;
|
||||
/* YTOsiz */
|
||||
\fBint\fR cp_ty0;
|
||||
/* XTsiz */
|
||||
\fBint\fR cp_tdx;
|
||||
/* YTsiz */
|
||||
\fBint\fR cp_tdy;
|
||||
/* allocation by rate/distortion */
|
||||
\fBint\fR cp_disto_alloc;
|
||||
/* allocation by fixed layer */
|
||||
\fBint\fR cp_fixed_alloc;
|
||||
/* add fixed_quality */
|
||||
\fBint\fR cp_fixed_quality;
|
||||
/* fixed layer */
|
||||
\fBint *\fRcp_matrice;
|
||||
/* comment for coding */
|
||||
\fBchar *\fRcp_comment;
|
||||
/* coding style */
|
||||
\fBint\fR csty;
|
||||
/* progression order:
|
||||
PROG_UNKNOWN, LRCP(default), RLCP, RPCL, PCRL, CPRL */
|
||||
\fBOPJ_PROG_ORDER\fR prog_order;
|
||||
/* progression order changes */
|
||||
\fBopj_poc_t\fR POC[32];
|
||||
/* number of progression order changes (POC), default: 0 */
|
||||
\fBint\fR numpocs;
|
||||
/* number of layers */
|
||||
\fBint\fR tcp_numlayers;
|
||||
/* rates of layers */
|
||||
\fBfloat\fR tcp_rates[100];
|
||||
/* different psnr for successive layers */
|
||||
\fBfloat\fR tcp_distoratio[100];
|
||||
/* number of resolutions */
|
||||
\fBint\fR numresolution;
|
||||
/* initial code block width, default: 64 */
|
||||
\fBint\fR cblockw_init;
|
||||
/* initial code block height, default: 64 */
|
||||
\fBint\fR cblockh_init;
|
||||
/* mode switch (cblk_style) */
|
||||
/* 1 : use the irreversible DWT 9-7,
|
||||
0 : use lossless compression (default) */
|
||||
\fBint\fR irreversible;
|
||||
/* region of interest: affected component in [0..3],
|
||||
-1 means no ROI */
|
||||
\fBint\fR roi_compno;
|
||||
/* region of interest: upshift value */
|
||||
\fBint\fR roi_shift;
|
||||
/* number of precinct size specifications */
|
||||
\fBint\fR res_spec;
|
||||
/* initial precinct width */
|
||||
\fBint\fR prcw_init[J2K_MAXRLVLS];
|
||||
/* initial precinct height */
|
||||
\fBint\fR prch_init[J2K_MAXRLVLS];
|
||||
|
||||
/*command line encoder parameters (not used inside the library) */
|
||||
/* input file name */
|
||||
\fBchar\fR infile[OPJ_PATH_LEN];
|
||||
/* output file name */
|
||||
\fBchar\fR outfile[OPJ_PATH_LEN];
|
||||
/* DEPRECATED. Index generation is now handeld with the
|
||||
opj_encode_with_info() function. Set to NULL */
|
||||
\fBint\fR index_on;
|
||||
/* DEPRECATED. Index generation is now handeld with the
|
||||
opj_encode_with_info() function. Set to NULL */
|
||||
\fBchar\fR index[OPJ_PATH_LEN];
|
||||
/* subimage encoding: origin image offset in x direction */
|
||||
\fBint\fR image_offset_x0;
|
||||
/* subimage encoding: origin image offset in y direction */
|
||||
\fBint\fR image_offset_y0;
|
||||
/* subsampling value for dx */
|
||||
\fBint\fR subsampling_dx;
|
||||
/* subsampling value for dy */
|
||||
\fBint\fR subsampling_dy;
|
||||
/* input file format */
|
||||
\fBint\fR decod_format;
|
||||
/* output file format: see OPJ_CODEC_FORMAT */
|
||||
\fBint\fR cod_format;
|
||||
|
||||
/*JPWL encoding parameters */
|
||||
/* enables writing of EPC in MH, thus activating JPWL */
|
||||
\fBbool\fR jpwl_epc_on;
|
||||
/* error protection method for MH (0,1,16,32,37-128) */
|
||||
\fBint\fR jpwl_hprot_MH;
|
||||
/* tile number of header protection specification (>=0) */
|
||||
\fBint\fR jpwl_hprot_TPH_tileno[JPWL_MAX_NO_TILESPECS];
|
||||
/* error protection methods for TPHs (0,1,16,32,37-128) */
|
||||
\fBint\fR jpwl_hprot_TPH[JPWL_MAX_NO_TILESPECS];
|
||||
/* tile number of packet protection specification (>=0) */
|
||||
\fBint\fR jpwl_pprot_tileno[JPWL_MAX_NO_PACKSPECS];
|
||||
/* packet number of packet protection specification (>=0) */
|
||||
\fBint\fR jpwl_pprot_packno[JPWL_MAX_NO_PACKSPECS];
|
||||
/* error protection methods for packets (0,1,16,32,37-128) */
|
||||
\fBint\fR jpwl_pprot[JPWL_MAX_NO_PACKSPECS];
|
||||
/* enables writing of ESD, (0=no/1/2 bytes) */
|
||||
\fBint\fR jpwl_sens_size;
|
||||
/* sensitivity addressing size (0=auto/2/4 bytes) */
|
||||
\fBint\fR jpwl_sens_addr;
|
||||
/* sensitivity range (0-3) */
|
||||
\fBint\fR jpwl_sens_range;
|
||||
/* sensitivity method for MH (-1=no,0-7) */
|
||||
\fBint\fR jpwl_sens_MH;
|
||||
/* tile number of sensitivity specification (>=0) */
|
||||
\fBint\fR jpwl_sens_TPH_tileno[JPWL_MAX_NO_TILESPECS];
|
||||
/* sensitivity methods for TPHs (-1=no,0-7) */
|
||||
\fBint\fR jpwl_sens_TPH[JPWL_MAX_NO_TILESPECS];
|
||||
|
||||
/* Digital Cinema compliance: OFF-not compliant,
|
||||
CINEMA2K_24, CINEMA2K_48, CINEMA4K_24 */
|
||||
\fBOPJ_CINEMA_MODE\fR cp_cinema;
|
||||
/* Maximum rate for each component.
|
||||
If == 0, component size limitation is not considered */
|
||||
\fBint\fR max_comp_size;
|
||||
/* Profile name*/
|
||||
\fBOPJ_RSIZ_CAPABILITIES\fR cp_rsiz;
|
||||
/* Tile part generation*/
|
||||
\fBchar\fR tp_on;
|
||||
/* Flag for Tile part generation*/
|
||||
\fBchar\fR tp_flag;
|
||||
/* MCT (multiple component transform) */
|
||||
\fBchar\fR tcp_mct;
|
||||
.br
|
||||
} opj_cparameters_t;
|
||||
|
||||
|
||||
'\".SH OPTIONS
|
||||
'\".SH BUGS
|
||||
.SH AUTHORS
|
||||
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 and Antonin Descampe
|
||||
|
||||
Copyright (c) 2005, Herve Drolon, FreeImage Team
|
||||
|
||||
Copyright (c) 2006-2007, Parvatha Elangovan
|
||||
|
||||
.P
|
||||
.SH "SEE ALSO"
|
||||
\fBimage_to_j2k\fR(1) \fBj2k_to_image\fR(1) \fBj2k_dump\fR(1)
|
||||
|
||||
\fBJPWL_image_to_j2k\fR(1) \fBJPWL_j2k_to_image\fR(1)
|
||||
|
||||
\fBextract_j2k_from_mj2\fR(1) \fBwrap_j2k_in_mj2\fR(1)
|
||||
\fBframes_to_mj2\fR(1) \fBmj2_to_frames\fR(1)
|
||||
94
doc/openjpip.dox.in
Normal file
94
doc/openjpip.dox.in
Normal file
@@ -0,0 +1,94 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
|
||||
* Copyright (c) 2002-2014, Professor Benoit Macq
|
||||
* Copyright (c) 2010-2011, Kaori Hagihara
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/*! \page openjpippage OpenJPIP v@OPENJPEG_VERSION@ Documentation
|
||||
*
|
||||
* \section intro Introduction
|
||||
* This manual documents the low-level OpenJPIP C API.\n
|
||||
* OpenJPIP software is an implementation of JPEG 2000 Part9: Interactivity tools, APIs and protocols (JPIP).\n
|
||||
* ( For more info about JPIP, check the website: http://www.jpeg.org/jpeg2000/j2kpart9.html)\n
|
||||
*
|
||||
* This whole documents covers the following six programs.\n
|
||||
* - opj_server.c JPIP server supporting HTTP connection and JPT/JPP-stream
|
||||
* - opj_dec_server.c Server to decode JPT/JPP-stream and communicate locally with JPIP client, which is coded in java
|
||||
* - opj_jpip_addxml.c To Embed metadata into JP2 file
|
||||
* - opj_jpip_transcode.c To Convert JPT/JPP-stream to JP2 or J2K
|
||||
* - opj_jpip_test.c To test index code format of a JP2 file
|
||||
*
|
||||
* \section license License
|
||||
* This software is released under the BSD license, anybody can use or modify the library, even for commercial applications.\n
|
||||
* The only restriction is to retain the copyright in the sources or the binaries documentation.\n
|
||||
* Neither the author, nor the university accept any responsibility for any kind of error or data loss which may occur during usage.
|
||||
*
|
||||
*
|
||||
* \section reqlibs Required libraries
|
||||
* - OpenJPEG library
|
||||
* - FastCGI development kit (C libraries) at server (http://www.fastcgi.com)
|
||||
* - libcURL library
|
||||
*
|
||||
* We tested this software with a virtual server running on the same Linux machine as the clients.
|
||||
*
|
||||
*
|
||||
* \section compilenotes Compiling Notes
|
||||
* When you are making opj_server, set anything (e.g. yes) to the parameter jpipserver to define itself in the Makefile, which enables to make it in server mode.\n
|
||||
* Otherwise do not define (or do not set to) the parameter jpipserver.\n
|
||||
* Be sure that any object files and library file libopenjpip.a are not reused to compile in the two different mode (server mode and non server mode).\n
|
||||
* In other words, do make clean before making new targets which are in different modes as previous make.\n
|
||||
*
|
||||
*
|
||||
* \section sysarchtect System Architecture
|
||||
* JPIP protocol is implemented between the JPIP server program (opj_server) and the JPIP client java program (opj_viewer).\n
|
||||
* Figure below represents the overview of our system architecture.\n
|
||||
* The JPIP server parses JPIP query and sends corresponding JPT/JPP-stream.
|
||||
* The JPIP client viewer is an image viewer with GUI to publish JPIP requests and receive JPT/JPP-stream.\n
|
||||
* Particularly, our system has the image decoding module implemented on a server (opj_dec_server, Image decoding Server).
|
||||
* Image decoding Server and JPIP client viewer communicate closely.
|
||||
* This specific architecture enables sharing cache of image codestream data among all viewers connected to the same Image decoding Server not only locally but also remotely.
|
||||
*
|
||||
* \image html jpip_architect.png "OpenJPIP system architecture"
|
||||
*
|
||||
* JPIP server follows up the client cache during a session. \n
|
||||
* Concretely, the JPIP server models cache in each session, to which Channel IDs are associated.
|
||||
* A Channel ID identifies a JPIP client viewer.
|
||||
* And, new viewers can belong to a session by referring to one of its channel ID.
|
||||
* The Image decoding Server maintains the association between channel IDs and targets, and provides a reference channel ID to a Viewer on demand.\n
|
||||
*
|
||||
* Typical requests and replies among JPIP server, JPIP client, and Image decoding server is presented below.\n
|
||||
* The JPIP server parses HTTP query and sends corresponding JPT/JPP-stream back to the JPIP client (Viewer).
|
||||
* JPT/JPP-stream is unreadable by JPIP client, and it is directly passed to Image decoding Server, and which provides the image in raw format (PGM or PPM) to the JPIP client.
|
||||
* The Image decoding Server handles the decoding and caching of JPT/JPP-stream.
|
||||
* JPIP client can read PGM and PPM images natively.
|
||||
* Before connecting to the JPIP server, every JPIP client checks local cache data of the requesting image with the image decoding server.
|
||||
* If its cache exists, the image decoding server provides ChannelID (CID), which identifies the image and its cache model on the JPIP server, and the whole system can continue the session using the CID.
|
||||
*
|
||||
* \image html jpip_protocol.png "Message Sequence Chart of OpenJPIP impementation"
|
||||
*
|
||||
* \author Kaori Hagihara UCL/SST/ICTM/ELEN
|
||||
*/
|
||||
@@ -1,23 +0,0 @@
|
||||
CC = gcc
|
||||
|
||||
LDFLAGS = -lm
|
||||
CFLAGS = -Wall
|
||||
|
||||
all: index_create
|
||||
|
||||
|
||||
bio.o : bio.c bio.h
|
||||
cio.o : cio.c cio.h
|
||||
int.o : int.c
|
||||
pi.o : pi.c pi.h int.h
|
||||
index_create.o : index_create.c j2k.h cio.h tcd.h int.h
|
||||
t2.o : t2.c t2.h tcd.h bio.h j2k.h pi.h tgt.h int.h cio.h
|
||||
tgt.o : tgt.c bio.h tgt.h
|
||||
tcd.o : tcd.c tcd.h t2.h int.h
|
||||
jpip.o : jpip.c j2k.h cio.h tcd.h int.h
|
||||
jp2.o : jp2.c j2k.h cio.h tcd.h int.h
|
||||
|
||||
index_create : bio.o cio.o int.o pi.o t2.o tgt.o tcd.o index_create.o jpip.o jp2.o
|
||||
|
||||
clean:
|
||||
rm -rf *.o *.*~ *~ core.*
|
||||
@@ -1,163 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2002, David Janssens
|
||||
* Copyright (c) 2003, Yannick Verschueren
|
||||
* Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
||||
* 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 "bio.h"
|
||||
#include <setjmp.h>
|
||||
|
||||
static unsigned char *bio_start, *bio_end, *bio_bp;
|
||||
static unsigned int bio_buf;
|
||||
static int bio_ct;
|
||||
|
||||
extern jmp_buf j2k_error;
|
||||
|
||||
/// <summary>
|
||||
/// Number of bytes written.
|
||||
/// </summary>
|
||||
int bio_numbytes() {
|
||||
return bio_bp-bio_start;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Init encoder.
|
||||
/// </summary>
|
||||
/// <param name="bp">Output buffer</param>
|
||||
/// <param name="len">Output buffer length</param>
|
||||
void bio_init_enc(unsigned char *bp, int len) {
|
||||
bio_start=bp;
|
||||
bio_end=bp+len;
|
||||
bio_bp=bp;
|
||||
bio_buf=0;
|
||||
bio_ct=8;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Init decoder.
|
||||
/// </summary>
|
||||
/// <param name="bp">Input buffer</param>
|
||||
/// <param name="len">Input buffer length</param>
|
||||
void bio_init_dec(unsigned char *bp, int len) {
|
||||
bio_start=bp;
|
||||
bio_end=bp+len;
|
||||
bio_bp=bp;
|
||||
bio_buf=0;
|
||||
bio_ct=0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Write byte.
|
||||
/// </summary>
|
||||
int bio_byteout() {
|
||||
bio_buf=(bio_buf<<8)&0xffff;
|
||||
bio_ct=bio_buf==0xff00?7:8;
|
||||
if (bio_bp>=bio_end) return 1; //longjmp(j2k_error, 1);
|
||||
*bio_bp++=bio_buf>>8;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Read byte.
|
||||
/// </summary>
|
||||
int bio_bytein() {
|
||||
bio_buf=(bio_buf<<8)&0xffff;
|
||||
bio_ct=bio_buf==0xff00?7:8;
|
||||
if (bio_bp>=bio_end) return 1; //longjmp(j2k_error, 1);
|
||||
bio_buf|=*bio_bp++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Write bit.
|
||||
/// </summary>
|
||||
/// <param name="b">Bit to write (0 or 1)</param>
|
||||
void bio_putbit(int b) {
|
||||
if (bio_ct==0) {
|
||||
bio_byteout();
|
||||
}
|
||||
bio_ct--;
|
||||
bio_buf|=b<<bio_ct;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Read bit.
|
||||
/// </summary>
|
||||
int bio_getbit() {
|
||||
if (bio_ct==0) {
|
||||
bio_bytein();
|
||||
}
|
||||
bio_ct--;
|
||||
return (bio_buf>>bio_ct)&1;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Write bits.
|
||||
/// </summary>
|
||||
/// <param name="v">Value of bits</param>
|
||||
/// <param name="n">Number of bits to write</param>
|
||||
void bio_write(int v, int n) {
|
||||
int i;
|
||||
for (i=n-1; i>=0; i--) {
|
||||
bio_putbit((v>>i)&1);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Read bits.
|
||||
/// </summary>
|
||||
/// <param name="n">Number of bits to read</param>
|
||||
int bio_read(int n) {
|
||||
int i, v;
|
||||
v=0;
|
||||
for (i=n-1; i>=0; i--) {
|
||||
v+=bio_getbit()<<i;
|
||||
}
|
||||
return v;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Flush bits.
|
||||
/// </summary>
|
||||
int bio_flush() {
|
||||
bio_ct=0;
|
||||
bio_byteout();
|
||||
if (bio_ct==7) {
|
||||
bio_ct=0;
|
||||
if ( bio_byteout()) return 1;;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// </summary>
|
||||
int bio_inalign() {
|
||||
bio_ct=0;
|
||||
if ((bio_buf&0xff)==0xff) {
|
||||
if( bio_bytein()) return 1;
|
||||
bio_ct=0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -1,127 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2002, David Janssens
|
||||
* Copyright (c) 2003, Yannick Verschueren
|
||||
* Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
||||
* 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 "cio.h"
|
||||
#include <setjmp.h>
|
||||
|
||||
static unsigned char *cio_start, *cio_end, *cio_bp;
|
||||
|
||||
extern jmp_buf j2k_error;
|
||||
|
||||
/// <summary>
|
||||
/// Number of bytes written.
|
||||
/// </summary>
|
||||
int cio_numbytes() {
|
||||
return cio_bp-cio_start;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get position in byte stream.
|
||||
/// </summary>
|
||||
int cio_tell() {
|
||||
return cio_bp-cio_start;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Set position in byte stream.
|
||||
/// </summary>
|
||||
void cio_seek(int pos) {
|
||||
cio_bp=cio_start+pos;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Number of bytes left before the end of the stream.
|
||||
/// </summary>
|
||||
int cio_numbytesleft() {
|
||||
return cio_end-cio_bp;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get pointer to the current position in the stream.
|
||||
/// </summary>
|
||||
unsigned char *cio_getbp() {
|
||||
return cio_bp;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initialize byte IO.
|
||||
/// </summary>
|
||||
void cio_init(unsigned char *bp, int len) {
|
||||
cio_start=bp;
|
||||
cio_end=bp+len;
|
||||
cio_bp=bp;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Write a byte.
|
||||
/// </summary>
|
||||
void cio_byteout(unsigned char v) {
|
||||
if (cio_bp>=cio_end) longjmp(j2k_error, 1);
|
||||
*cio_bp++=v;
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Read a byte.
|
||||
/// </summary>
|
||||
unsigned char cio_bytein() {
|
||||
if (cio_bp>=cio_end) longjmp(j2k_error, 1);
|
||||
return *cio_bp++;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Write a byte.
|
||||
/// </summary>
|
||||
//void cio_write(unsigned int v, int n) {
|
||||
void cio_write(long long v, int n) {
|
||||
int i;
|
||||
for (i=n-1; i>=0; i--)
|
||||
{
|
||||
cio_byteout((unsigned char)((v>>(i<<3))&0xff));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Read some bytes.
|
||||
/// </summary>
|
||||
unsigned int cio_read(int n) {
|
||||
int i;
|
||||
unsigned int v;
|
||||
v=0;
|
||||
for (i=n-1; i>=0; i--) {
|
||||
v+=cio_bytein()<<(i<<3);
|
||||
}
|
||||
return v;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Write some bytes.
|
||||
/// </summary>
|
||||
void cio_skip(int n) {
|
||||
cio_bp+=n;
|
||||
}
|
||||
@@ -1,34 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2002, David Janssens
|
||||
* Copyright (c) 2003, Yannick Verschueren
|
||||
* Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef __FIX_H
|
||||
#define __FIX_H
|
||||
|
||||
int fix_mul(int a, int b);
|
||||
|
||||
#endif
|
||||
@@ -1,765 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2002, David Janssens
|
||||
* Copyright (c) 2003, Yannick Verschueren
|
||||
* Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
||||
* 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 <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <setjmp.h>
|
||||
#include <math.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "j2k.h"
|
||||
#include "cio.h"
|
||||
#include "tcd.h"
|
||||
#include "int.h"
|
||||
#include "jpip.h"
|
||||
#include "jp2.h"
|
||||
|
||||
#define J2K_MS_SOC 0xff4f
|
||||
#define J2K_MS_SOT 0xff90
|
||||
#define J2K_MS_SOD 0xff93
|
||||
#define J2K_MS_EOC 0xffd9
|
||||
#define J2K_MS_SIZ 0xff51
|
||||
#define J2K_MS_COD 0xff52
|
||||
#define J2K_MS_COC 0xff53
|
||||
#define J2K_MS_RGN 0xff5e
|
||||
#define J2K_MS_QCD 0xff5c
|
||||
#define J2K_MS_QCC 0xff5d
|
||||
#define J2K_MS_POC 0xff5f
|
||||
#define J2K_MS_TLM 0xff55
|
||||
#define J2K_MS_PLM 0xff57
|
||||
#define J2K_MS_PLT 0xff58
|
||||
#define J2K_MS_PPM 0xff60
|
||||
#define J2K_MS_PPT 0xff61
|
||||
#define J2K_MS_SOP 0xff91
|
||||
#define J2K_MS_EPH 0xff92
|
||||
#define J2K_MS_CRG 0xff63
|
||||
#define J2K_MS_COM 0xff64
|
||||
|
||||
#define J2K_STATE_MHSOC 0x0001
|
||||
#define J2K_STATE_MHSIZ 0x0002
|
||||
#define J2K_STATE_MH 0x0004
|
||||
#define J2K_STATE_TPHSOT 0x0008
|
||||
#define J2K_STATE_TPH 0x0010
|
||||
#define J2K_STATE_MT 0x0020
|
||||
|
||||
jmp_buf j2k_error;
|
||||
|
||||
static int j2k_state;
|
||||
static int j2k_curtileno;
|
||||
static j2k_tcp_t j2k_default_tcp;
|
||||
static unsigned char *j2k_eot;
|
||||
|
||||
static j2k_image_t *j2k_img;
|
||||
static j2k_cp_t *j2k_cp;
|
||||
|
||||
static unsigned char **j2k_tile_data;
|
||||
static int *j2k_tile_len;
|
||||
|
||||
static info_image_t img;
|
||||
|
||||
void j2k_clean() {
|
||||
int tileno = 0;
|
||||
int compno, resno, precno;
|
||||
|
||||
tcd_free(j2k_img,j2k_cp);
|
||||
|
||||
for (tileno=0;tileno<j2k_cp->tw*j2k_cp->th;tileno++) {
|
||||
info_tile_t *tile_Idx = &img.tile[tileno];
|
||||
|
||||
for (compno=0;compno<img.Comp;compno++)
|
||||
{
|
||||
info_compo_t *compo_Idx = &tile_Idx->compo[compno];
|
||||
|
||||
for(resno=0;resno<img.Decomposition+1;resno++)
|
||||
{
|
||||
info_reso_t *reso_Idx = &compo_Idx->reso[resno];
|
||||
for (precno=0;precno<img.tile[tileno].pw*img.tile[tileno].ph;precno++)
|
||||
{
|
||||
info_prec_t *prec_Idx = &reso_Idx->prec[precno];
|
||||
free(prec_Idx->layer);
|
||||
}
|
||||
free(reso_Idx->prec);
|
||||
}
|
||||
free(compo_Idx->reso);
|
||||
}
|
||||
free(tile_Idx->compo);
|
||||
}
|
||||
free(img.tile);
|
||||
free(img.marker);
|
||||
}
|
||||
|
||||
void j2k_read_soc() {
|
||||
j2k_state=J2K_STATE_MHSIZ;
|
||||
}
|
||||
|
||||
void j2k_read_siz() {
|
||||
int len, i;
|
||||
len=cio_read(2);
|
||||
|
||||
// <INDEX>
|
||||
img.marker[img.num_marker].type=J2K_MS_SIZ;
|
||||
img.marker[img.num_marker].start_pos=cio_tell()-2;
|
||||
img.marker[img.num_marker].len=len;
|
||||
img.num_marker++;
|
||||
// </INDEX>
|
||||
|
||||
|
||||
cio_read(2); // Rsiz (capabilities)
|
||||
j2k_img->x1=cio_read(4); // Xsiz
|
||||
j2k_img->y1=cio_read(4); // Ysiz
|
||||
j2k_img->x0=cio_read(4); // X0siz
|
||||
j2k_img->y0=cio_read(4); // Y0siz
|
||||
j2k_cp->tdx=cio_read(4); // XTsiz
|
||||
j2k_cp->tdy=cio_read(4); // YTsiz
|
||||
j2k_cp->tx0=cio_read(4); // XT0siz
|
||||
j2k_cp->ty0=cio_read(4); // YTOsiz
|
||||
j2k_img->numcomps=cio_read(2); // Csiz
|
||||
j2k_img->comps=(j2k_comp_t*)malloc(j2k_img->numcomps*sizeof(j2k_comp_t));
|
||||
for (i=0; i<j2k_img->numcomps; i++) {
|
||||
int tmp, w, h;
|
||||
tmp=cio_read(1);
|
||||
j2k_img->comps[i].prec=(tmp&0x7f)+1;
|
||||
j2k_img->comps[i].sgnd=tmp>>7;
|
||||
j2k_img->comps[i].dx=cio_read(1);
|
||||
j2k_img->comps[i].dy=cio_read(1);
|
||||
w=int_ceildiv(j2k_img->x1-j2k_img->x0, j2k_img->comps[i].dx);
|
||||
h=int_ceildiv(j2k_img->y1-j2k_img->y0, j2k_img->comps[i].dy);
|
||||
j2k_img->comps[i].data=(int*)malloc(sizeof(int)*w*h);
|
||||
}
|
||||
j2k_cp->tw=int_ceildiv(j2k_img->x1-j2k_img->x0, j2k_cp->tdx);
|
||||
j2k_cp->th=int_ceildiv(j2k_img->y1-j2k_img->y0, j2k_cp->tdy);
|
||||
|
||||
j2k_cp->tcps=(j2k_tcp_t*)calloc(sizeof(j2k_tcp_t), j2k_cp->tw*j2k_cp->th);
|
||||
j2k_default_tcp.tccps=(j2k_tccp_t*)calloc(sizeof(j2k_tccp_t), j2k_img->numcomps);
|
||||
for (i=0; i<j2k_cp->tw*j2k_cp->th; i++) {
|
||||
j2k_cp->tcps[i].tccps=(j2k_tccp_t*)calloc(sizeof(j2k_tccp_t), j2k_img->numcomps);
|
||||
}
|
||||
j2k_tile_data=(unsigned char**)calloc(j2k_cp->tw*j2k_cp->th, sizeof(char*));
|
||||
j2k_tile_len=(int*)calloc(j2k_cp->tw*j2k_cp->th, sizeof(int));
|
||||
j2k_state=J2K_STATE_MH;
|
||||
|
||||
// <INDEX>
|
||||
img.Im_w=j2k_img->x1-j2k_img->x0;
|
||||
img.Im_h=j2k_img->y1-j2k_img->y0;
|
||||
img.Tile_x=j2k_cp->tdx;
|
||||
img.Tile_y=j2k_cp->tdy;
|
||||
img.Comp=j2k_img->numcomps;
|
||||
img.tw=j2k_cp->tw;
|
||||
img.th=j2k_cp->th;
|
||||
img.tile=(info_tile_t*)malloc((img.tw*img.th)*sizeof(info_tile_t));
|
||||
//</INDEX>
|
||||
|
||||
|
||||
}
|
||||
|
||||
void j2k_read_com() {
|
||||
int len;
|
||||
len=cio_read(2);
|
||||
|
||||
// <INDEX>
|
||||
if (j2k_state==J2K_STATE_MH)
|
||||
{
|
||||
if (!img.marker_mul.num_COM)
|
||||
img.marker_mul.COM=(info_marker_t*)malloc(sizeof(info_marker_t));
|
||||
else
|
||||
img.marker_mul.COM=realloc(img.marker_mul.COM,(1+img.marker_mul.num_COM)*sizeof(info_marker_t));
|
||||
img.marker_mul.COM[img.marker_mul.num_COM].type=J2K_MS_COM;
|
||||
img.marker_mul.COM[img.marker_mul.num_COM].start_pos=cio_tell()-2;
|
||||
img.marker_mul.COM[img.marker_mul.num_COM].len=len;
|
||||
img.marker_mul.num_COM++;
|
||||
}
|
||||
// </INDEX>
|
||||
|
||||
cio_skip(len-2);
|
||||
}
|
||||
|
||||
void j2k_read_cox(int compno) {
|
||||
int i;
|
||||
j2k_tcp_t *tcp;
|
||||
j2k_tccp_t *tccp;
|
||||
tcp=j2k_state==J2K_STATE_TPH?&j2k_cp->tcps[j2k_curtileno]:&j2k_default_tcp;
|
||||
tccp=&tcp->tccps[compno];
|
||||
tccp->numresolutions=cio_read(1)+1;
|
||||
|
||||
img.Decomposition=tccp->numresolutions-1; // <INDEX>
|
||||
|
||||
tccp->cblkw=cio_read(1)+2;
|
||||
tccp->cblkh=cio_read(1)+2;
|
||||
tccp->cblksty=cio_read(1);
|
||||
tccp->qmfbid=cio_read(1);
|
||||
if (tccp->csty&J2K_CP_CSTY_PRT) {
|
||||
for (i=0; i<tccp->numresolutions; i++) {
|
||||
int tmp=cio_read(1);
|
||||
tccp->prcw[i]=tmp&0xf;
|
||||
tccp->prch[i]=tmp>>4;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void j2k_read_cod() {
|
||||
int len, i, pos;
|
||||
j2k_tcp_t *tcp;
|
||||
tcp=j2k_state==J2K_STATE_TPH?&j2k_cp->tcps[j2k_curtileno]:&j2k_default_tcp;
|
||||
len=cio_read(2);
|
||||
|
||||
// <INDEX>
|
||||
if (j2k_state==J2K_STATE_MH)
|
||||
{
|
||||
if (!img.marker_mul.num_COD)
|
||||
img.marker_mul.COD=(info_marker_t*)malloc(sizeof(info_marker_t));
|
||||
else
|
||||
img.marker_mul.COD=realloc(img.marker_mul.COD,(1+img.marker_mul.num_COD)*sizeof(info_marker_t));
|
||||
img.marker_mul.COD[img.marker_mul.num_COD].type=J2K_MS_COD;
|
||||
img.marker_mul.COD[img.marker_mul.num_COD].start_pos=cio_tell()-2;
|
||||
img.marker_mul.COD[img.marker_mul.num_COD].len=len;
|
||||
img.marker_mul.num_COD++;
|
||||
}
|
||||
// </INDEX>
|
||||
|
||||
|
||||
tcp->csty=cio_read(1);
|
||||
tcp->prg=cio_read(1);
|
||||
tcp->numlayers=cio_read(2);
|
||||
tcp->mct=cio_read(1);
|
||||
pos=cio_tell();
|
||||
for (i=0; i<j2k_img->numcomps; i++) {
|
||||
tcp->tccps[i].csty=tcp->csty&J2K_CP_CSTY_PRT;
|
||||
cio_seek(pos);
|
||||
j2k_read_cox(i);
|
||||
}
|
||||
//<INDEX>
|
||||
img.Prog=tcp->prg;
|
||||
img.Layer=tcp->numlayers;
|
||||
//</INDEX>
|
||||
}
|
||||
|
||||
void j2k_read_coc() {
|
||||
int len, compno;
|
||||
j2k_tcp_t *tcp;
|
||||
tcp=j2k_state==J2K_STATE_TPH?&j2k_cp->tcps[j2k_curtileno]:&j2k_default_tcp;
|
||||
len=cio_read(2);
|
||||
// <INDEX>
|
||||
if (j2k_state==J2K_STATE_MH)
|
||||
{
|
||||
if (!img.marker_mul.num_COC)
|
||||
img.marker_mul.COC=(info_marker_t*)malloc(sizeof(info_marker_t));
|
||||
else
|
||||
img.marker_mul.COC=realloc(img.marker_mul.COC,(1+img.marker_mul.num_COC)*sizeof(info_marker_t));
|
||||
img.marker_mul.COC[img.marker_mul.num_COC].type=J2K_MS_COC;
|
||||
img.marker_mul.COC[img.marker_mul.num_COC].start_pos=cio_tell()-2;
|
||||
img.marker_mul.COC[img.marker_mul.num_COC].len=len;
|
||||
img.marker_mul.num_COC++;
|
||||
}
|
||||
// </INDEX>
|
||||
|
||||
|
||||
compno=cio_read(j2k_img->numcomps<=256?1:2);
|
||||
tcp->tccps[compno].csty=cio_read(1);
|
||||
j2k_read_cox(compno);
|
||||
}
|
||||
|
||||
void j2k_read_qcx(int compno, int len) {
|
||||
int tmp;
|
||||
j2k_tcp_t *tcp;
|
||||
j2k_tccp_t *tccp;
|
||||
int bandno, numbands;
|
||||
tcp=j2k_state==J2K_STATE_TPH?&j2k_cp->tcps[j2k_curtileno]:&j2k_default_tcp;
|
||||
tccp=&tcp->tccps[compno];
|
||||
tmp=cio_read(1);
|
||||
tccp->qntsty=tmp&0x1f;
|
||||
tccp->numgbits=tmp>>5;
|
||||
numbands=tccp->qntsty==J2K_CCP_QNTSTY_SIQNT?1:(tccp->qntsty==J2K_CCP_QNTSTY_NOQNT?len-1:(len-1)/2);
|
||||
for (bandno=0; bandno<numbands; bandno++) {
|
||||
int expn, mant;
|
||||
if (tccp->qntsty==J2K_CCP_QNTSTY_NOQNT) { // WHY STEPSIZES WHEN NOQNT ?
|
||||
expn=cio_read(1)>>3;
|
||||
mant=0;
|
||||
} else {
|
||||
tmp=cio_read(2);
|
||||
expn=tmp>>11;
|
||||
mant=tmp&0x7ff;
|
||||
}
|
||||
tccp->stepsizes[bandno].expn=expn;
|
||||
tccp->stepsizes[bandno].mant=mant;
|
||||
}
|
||||
}
|
||||
|
||||
void j2k_read_qcd() {
|
||||
int len, i, pos;
|
||||
len=cio_read(2);
|
||||
|
||||
// <INDEX>
|
||||
if (j2k_state==J2K_STATE_MH)
|
||||
{
|
||||
img.marker[img.num_marker].type=J2K_MS_QCD;
|
||||
img.marker[img.num_marker].start_pos=cio_tell()-2;
|
||||
img.marker[img.num_marker].len=len;
|
||||
img.num_marker++;
|
||||
}
|
||||
// </INDEX>
|
||||
|
||||
|
||||
pos=cio_tell();
|
||||
for (i=0; i<j2k_img->numcomps; i++) {
|
||||
cio_seek(pos);
|
||||
j2k_read_qcx(i, len-2);
|
||||
}
|
||||
}
|
||||
|
||||
void j2k_read_qcc() {
|
||||
int len, compno;
|
||||
len=cio_read(2);
|
||||
|
||||
// <INDEX>
|
||||
if (j2k_state==J2K_STATE_MH)
|
||||
{
|
||||
if (!img.marker_mul.num_QCC)
|
||||
img.marker_mul.QCC=(info_marker_t*)malloc(sizeof(info_marker_t));
|
||||
else
|
||||
img.marker_mul.QCC=realloc(img.marker_mul.QCC,(1+img.marker_mul.num_QCC)*sizeof(info_marker_t));
|
||||
img.marker_mul.QCC[img.marker_mul.num_QCC].type=J2K_MS_QCC;
|
||||
img.marker_mul.QCC[img.marker_mul.num_QCC].start_pos=cio_tell()-2;
|
||||
img.marker_mul.QCC[img.marker_mul.num_QCC].len=len;
|
||||
img.marker_mul.num_QCC++;
|
||||
}
|
||||
// </INDEX>
|
||||
|
||||
|
||||
compno=cio_read(j2k_img->numcomps<=256?1:2);
|
||||
j2k_read_qcx(compno, len-2-(j2k_img->numcomps<=256?1:2));
|
||||
}
|
||||
|
||||
void j2k_read_poc() {
|
||||
int len, numpchgs, i;
|
||||
j2k_tcp_t *tcp;
|
||||
fprintf(stderr, "WARNING: POC marker segment processing not fully implemented\n");
|
||||
tcp=j2k_state==J2K_STATE_TPH?&j2k_cp->tcps[j2k_curtileno]:&j2k_default_tcp;
|
||||
len=cio_read(2);
|
||||
|
||||
// <INDEX>
|
||||
if (j2k_state==J2K_STATE_MH)
|
||||
{
|
||||
img.marker[img.num_marker].type=J2K_MS_POC;
|
||||
img.marker[img.num_marker].start_pos=cio_tell()-2;
|
||||
img.marker[img.num_marker].len=len;
|
||||
img.num_marker++;
|
||||
}
|
||||
// </INDEX>
|
||||
|
||||
|
||||
numpchgs=(len-2)/(5+2*(j2k_img->numcomps<=256?1:2));
|
||||
for (i=0; i<numpchgs; i++) {
|
||||
j2k_poc_t *poc;
|
||||
poc=&tcp->pocs[i];
|
||||
poc->resno0=cio_read(1);
|
||||
poc->compno0=cio_read(j2k_img->numcomps<=256?1:2);
|
||||
poc->layno1=cio_read(2);
|
||||
poc->resno1=cio_read(1);
|
||||
poc->compno1=cio_read(j2k_img->numcomps<=256?1:2);
|
||||
poc->prg=cio_read(1);
|
||||
}
|
||||
}
|
||||
|
||||
void j2k_read_crg() {
|
||||
int len;
|
||||
len=cio_read(2);
|
||||
|
||||
// <INDEX>
|
||||
if (j2k_state==J2K_STATE_MH)
|
||||
{
|
||||
img.marker[img.num_marker].type=J2K_MS_CRG;
|
||||
img.marker[img.num_marker].start_pos=cio_tell()-2;
|
||||
img.marker[img.num_marker].len=len;
|
||||
img.num_marker++;
|
||||
}
|
||||
// </INDEX>
|
||||
|
||||
fprintf(stderr, "WARNING: CRG marker segment processing not implemented\n");
|
||||
cio_skip(len-2);
|
||||
}
|
||||
|
||||
void j2k_read_tlm() {
|
||||
int len;
|
||||
len=cio_read(2);
|
||||
|
||||
// <INDEX>
|
||||
if (j2k_state==J2K_STATE_MH)
|
||||
{
|
||||
if (!img.marker_mul.num_TLM)
|
||||
img.marker_mul.TLM=(info_marker_t*)malloc(sizeof(info_marker_t));
|
||||
else
|
||||
img.marker_mul.TLM=realloc(img.marker_mul.TLM,(1+img.marker_mul.num_TLM)*sizeof(info_marker_t));
|
||||
img.marker_mul.TLM[img.marker_mul.num_TLM].type=J2K_MS_TLM;
|
||||
img.marker_mul.TLM[img.marker_mul.num_TLM].start_pos=cio_tell()-2;
|
||||
img.marker_mul.TLM[img.marker_mul.num_TLM].len=len;
|
||||
img.marker_mul.num_TLM++;
|
||||
}
|
||||
// </INDEX>
|
||||
|
||||
fprintf(stderr, "WARNING: TLM marker segment processing not implemented\n");
|
||||
cio_skip(len-2);
|
||||
}
|
||||
|
||||
void j2k_read_plm() {
|
||||
int len;
|
||||
len=cio_read(2);
|
||||
|
||||
// <INDEX>
|
||||
if (j2k_state==J2K_STATE_MH)
|
||||
{
|
||||
if (!img.marker_mul.num_PLM)
|
||||
img.marker_mul.PLM=(info_marker_t*)malloc(sizeof(info_marker_t));
|
||||
else
|
||||
img.marker_mul.PLM=realloc(img.marker_mul.PLM,(1+img.marker_mul.num_PLM)*sizeof(info_marker_t));
|
||||
img.marker_mul.PLM[img.marker_mul.num_PLM].type=J2K_MS_PLM;
|
||||
img.marker_mul.PLM[img.marker_mul.num_PLM].start_pos=cio_tell()-2;
|
||||
img.marker_mul.PLM[img.marker_mul.num_PLM].len=len;
|
||||
img.marker_mul.num_PLM++;
|
||||
}
|
||||
// </INDEX>
|
||||
|
||||
fprintf(stderr, "WARNING: PLM marker segment processing not implemented\n");
|
||||
cio_skip(len-2);
|
||||
}
|
||||
|
||||
void j2k_read_plt() {
|
||||
int len;
|
||||
len=cio_read(2);
|
||||
fprintf(stderr, "WARNING: PLT marker segment processing not implemented\n");
|
||||
cio_skip(len-2);
|
||||
}
|
||||
|
||||
void j2k_read_ppm() {
|
||||
int len;
|
||||
len=cio_read(2);
|
||||
// <INDEX>
|
||||
if (j2k_state==J2K_STATE_MH)
|
||||
{
|
||||
img.marker[img.num_marker].type=J2K_MS_PPM;
|
||||
img.marker[img.num_marker].start_pos=cio_tell()-2;
|
||||
img.marker[img.num_marker].len=len;
|
||||
img.num_marker++;
|
||||
}
|
||||
// </INDEX>
|
||||
|
||||
fprintf(stderr, "WARNING: PPM marker segment processing not implemented\n");
|
||||
cio_skip(len-2);
|
||||
}
|
||||
|
||||
void j2k_read_ppt() {
|
||||
int len;
|
||||
len=cio_read(2);
|
||||
fprintf(stderr, "WARNING: PPT marker segment processing not implemented\n");
|
||||
cio_skip(len-2);
|
||||
}
|
||||
|
||||
void j2k_read_sot() {
|
||||
int len, tileno, totlen, partno, numparts, i;
|
||||
j2k_tcp_t *tcp;
|
||||
j2k_tccp_t *tmp;
|
||||
len=cio_read(2);
|
||||
tileno=cio_read(2);
|
||||
//<INDEX>
|
||||
if (!tileno) img.Main_head_end=cio_tell()-6; // Correction End = First byte of first SOT
|
||||
img.tile[tileno].start_pos=cio_tell()-6;
|
||||
img.tile[tileno].num_tile=tileno;
|
||||
// </INDEX>
|
||||
totlen=cio_read(4);
|
||||
if (!totlen) totlen = cio_numbytesleft() + 8;
|
||||
|
||||
img.tile[tileno].end_pos=totlen+img.tile[tileno].start_pos; // <INDEX>
|
||||
|
||||
partno=cio_read(1);
|
||||
numparts=cio_read(1);
|
||||
j2k_curtileno=tileno;
|
||||
j2k_eot=cio_getbp()-12+totlen;
|
||||
j2k_state=J2K_STATE_TPH;
|
||||
tcp=&j2k_cp->tcps[j2k_curtileno];
|
||||
tmp=tcp->tccps;
|
||||
*tcp=j2k_default_tcp;
|
||||
tcp->tccps=tmp;
|
||||
for (i=0; i<j2k_img->numcomps; i++) {
|
||||
tcp->tccps[i]=j2k_default_tcp.tccps[i];
|
||||
}
|
||||
}
|
||||
|
||||
void j2k_read_sod() {
|
||||
int len;
|
||||
unsigned char *data;
|
||||
img.tile[j2k_curtileno].end_header=cio_tell()-1; //<INDEX>
|
||||
len=int_min(j2k_eot-cio_getbp(), cio_numbytesleft());
|
||||
j2k_tile_len[j2k_curtileno]+=len;
|
||||
data=(unsigned char*)realloc(j2k_tile_data[j2k_curtileno], j2k_tile_len[j2k_curtileno]);
|
||||
memcpy(data, cio_getbp(), len);
|
||||
j2k_tile_data[j2k_curtileno]=data;
|
||||
cio_skip(len);
|
||||
j2k_state=J2K_STATE_TPHSOT;
|
||||
|
||||
}
|
||||
|
||||
void j2k_read_rgn() {
|
||||
int len, compno, roisty;
|
||||
j2k_tcp_t *tcp;
|
||||
tcp=j2k_state==J2K_STATE_TPH?&j2k_cp->tcps[j2k_curtileno]:&j2k_default_tcp;
|
||||
len=cio_read(2);
|
||||
|
||||
// <INDEX>
|
||||
if (j2k_state==J2K_STATE_MH)
|
||||
{
|
||||
if (!img.marker_mul.num_RGN)
|
||||
img.marker_mul.RGN=(info_marker_t*)malloc(sizeof(info_marker_t));
|
||||
else
|
||||
img.marker_mul.RGN=realloc(img.marker_mul.RGN,(1+img.marker_mul.num_RGN)*sizeof(info_marker_t));
|
||||
img.marker_mul.RGN[img.marker_mul.num_RGN].type=J2K_MS_RGN;
|
||||
img.marker_mul.RGN[img.marker_mul.num_RGN].start_pos=cio_tell()-2;
|
||||
img.marker_mul.RGN[img.marker_mul.num_RGN].len=len;
|
||||
img.marker_mul.num_RGN++;
|
||||
}
|
||||
// </INDEX>
|
||||
|
||||
|
||||
compno=cio_read(j2k_img->numcomps<=256?1:2);
|
||||
roisty=cio_read(1);
|
||||
tcp->tccps[compno].roishift=cio_read(1);
|
||||
}
|
||||
|
||||
void j2k_read_eoc() {
|
||||
int tileno;
|
||||
tcd_init(j2k_img, j2k_cp, &img);
|
||||
for (tileno=0; tileno<j2k_cp->tw*j2k_cp->th; tileno++) {
|
||||
tcd_decode_tile(j2k_tile_data[tileno], j2k_tile_len[tileno], tileno, &img);
|
||||
}
|
||||
|
||||
j2k_state=J2K_STATE_MT;
|
||||
longjmp(j2k_error, 1);
|
||||
|
||||
}
|
||||
|
||||
void j2k_read_unk() {
|
||||
fprintf(stderr, "warning: unknown marker\n");
|
||||
}
|
||||
|
||||
int j2k_index_JPIP(char *Idx_file, char *J2K_file, int len){
|
||||
FILE *dest;
|
||||
char *index;
|
||||
int pos_iptr, end_pos;
|
||||
int len_cidx, pos_cidx;
|
||||
int len_jp2c, pos_jp2c;
|
||||
int len_fidx, pos_fidx;
|
||||
|
||||
dest=fopen(Idx_file, "wb");
|
||||
if (!dest) {
|
||||
fprintf(stderr,"Failed to open %s for reading !!\n",Idx_file);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// INDEX MODE JPIP
|
||||
index=(char*)malloc(len);
|
||||
cio_init(index, len);
|
||||
jp2_write_jp();
|
||||
jp2_write_ftyp();
|
||||
|
||||
jp2_write_jp2h(j2k_img);
|
||||
jp2_write_dbtl(Idx_file);
|
||||
|
||||
pos_iptr=cio_tell();
|
||||
cio_skip(24); // IPTR further !
|
||||
|
||||
pos_jp2c=cio_tell();
|
||||
len_jp2c=jp2_write_jp2c(J2K_file);
|
||||
|
||||
pos_cidx=cio_tell();
|
||||
len_cidx=jpip_write_cidx(pos_jp2c+8,img, j2k_cp); // Correction len_jp2C --> pos_jp2c+8
|
||||
|
||||
pos_fidx=cio_tell();
|
||||
len_fidx=jpip_write_fidx(pos_jp2c, len_jp2c, pos_cidx, len_cidx);
|
||||
|
||||
end_pos=cio_tell();
|
||||
cio_seek(pos_iptr);
|
||||
jpip_write_iptr(pos_fidx,len_fidx);
|
||||
cio_seek(end_pos);
|
||||
|
||||
fwrite(index, 1, cio_tell(), dest);
|
||||
free(index);
|
||||
|
||||
fclose(dest);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
typedef struct {
|
||||
int id;
|
||||
int states;
|
||||
void (*handler)();
|
||||
} j2k_dec_mstabent_t;
|
||||
|
||||
j2k_dec_mstabent_t j2k_dec_mstab[]={
|
||||
{J2K_MS_SOC, J2K_STATE_MHSOC, j2k_read_soc},
|
||||
{J2K_MS_SOT, J2K_STATE_MH|J2K_STATE_TPHSOT, j2k_read_sot},
|
||||
{J2K_MS_SOD, J2K_STATE_TPH, j2k_read_sod},
|
||||
{J2K_MS_EOC, J2K_STATE_TPHSOT, j2k_read_eoc},
|
||||
{J2K_MS_SIZ, J2K_STATE_MHSIZ, j2k_read_siz},
|
||||
{J2K_MS_COD, J2K_STATE_MH|J2K_STATE_TPH, j2k_read_cod},
|
||||
{J2K_MS_COC, J2K_STATE_MH|J2K_STATE_TPH, j2k_read_coc},
|
||||
{J2K_MS_RGN, J2K_STATE_MH|J2K_STATE_TPH, j2k_read_rgn},
|
||||
{J2K_MS_QCD, J2K_STATE_MH|J2K_STATE_TPH, j2k_read_qcd},
|
||||
{J2K_MS_QCC, J2K_STATE_MH|J2K_STATE_TPH, j2k_read_qcc},
|
||||
{J2K_MS_POC, J2K_STATE_MH|J2K_STATE_TPH, j2k_read_poc},
|
||||
{J2K_MS_TLM, J2K_STATE_MH, j2k_read_tlm},
|
||||
{J2K_MS_PLM, J2K_STATE_MH, j2k_read_plm},
|
||||
{J2K_MS_PLT, J2K_STATE_TPH, j2k_read_plt},
|
||||
{J2K_MS_PPM, J2K_STATE_MH, j2k_read_ppm},
|
||||
{J2K_MS_PPT, J2K_STATE_TPH, j2k_read_ppt},
|
||||
{J2K_MS_SOP, 0, 0},
|
||||
{J2K_MS_CRG, J2K_STATE_MH, j2k_read_crg},
|
||||
{J2K_MS_COM, J2K_STATE_MH|J2K_STATE_TPH, j2k_read_com},
|
||||
{0, J2K_STATE_MH|J2K_STATE_TPH, j2k_read_unk}
|
||||
};
|
||||
|
||||
j2k_dec_mstabent_t *j2k_dec_mstab_lookup(int id) {
|
||||
j2k_dec_mstabent_t *e;
|
||||
for (e=j2k_dec_mstab; e->id!=0; e++) {
|
||||
if (e->id==id) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return e;
|
||||
}
|
||||
|
||||
LIBJ2K_API int j2k_decode(unsigned char *src, int len, j2k_image_t **image, j2k_cp_t **cp) {
|
||||
if (setjmp(j2k_error)) {
|
||||
if (j2k_state!=J2K_STATE_MT) {
|
||||
fprintf(stderr, "WARNING: incomplete bitstream\n");
|
||||
return 0;
|
||||
}
|
||||
return cio_numbytes();
|
||||
}
|
||||
j2k_img=(j2k_image_t*)malloc(sizeof(j2k_image_t));
|
||||
j2k_cp=(j2k_cp_t*)malloc(sizeof(j2k_cp_t));
|
||||
*image=j2k_img;
|
||||
*cp=j2k_cp;
|
||||
j2k_state=J2K_STATE_MHSOC;
|
||||
cio_init(src, len);
|
||||
for (;;) {
|
||||
j2k_dec_mstabent_t *e;
|
||||
int id=cio_read(2);
|
||||
if (id>>8!=0xff) {
|
||||
fprintf(stderr, "%.8x: expected a marker instead of %x\n", cio_tell()-2, id);
|
||||
return 0;
|
||||
}
|
||||
e=j2k_dec_mstab_lookup(id);
|
||||
if (!(j2k_state & e->states)) {
|
||||
fprintf(stderr, "%.8x: unexpected marker %x\n", cio_tell()-2, id);
|
||||
return 0;
|
||||
}
|
||||
if (e->handler) {
|
||||
(*e->handler)();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#ifdef WIN32
|
||||
#include <windows.h>
|
||||
|
||||
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
|
||||
switch (ul_reason_for_call) {
|
||||
case DLL_PROCESS_ATTACH:
|
||||
case DLL_THREAD_ATTACH:
|
||||
case DLL_THREAD_DETACH:
|
||||
case DLL_PROCESS_DETACH:
|
||||
break;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
extern info_image_t img;
|
||||
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
FILE *src;
|
||||
int totlen;
|
||||
char *j2kfile;
|
||||
j2k_image_t *imgg;
|
||||
j2k_cp_t *cp;
|
||||
|
||||
if (argc!=3)
|
||||
{
|
||||
fprintf(stderr,"\nERROR in entry : index_create J2K-file Idx-file\n\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
src=fopen(argv[1], "rb");
|
||||
if (!src) {
|
||||
fprintf(stderr,"Failed to open %s for reading !!\n",argv[1]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// length of the codestream
|
||||
fseek(src, 0, SEEK_END);
|
||||
totlen=ftell(src);
|
||||
fseek(src, 0, SEEK_SET);
|
||||
|
||||
j2kfile=(char*)malloc(totlen);
|
||||
fread(j2kfile, 1, totlen, src);
|
||||
|
||||
img.marker=(info_marker_t*)malloc(32*sizeof(info_marker_t));
|
||||
img.num_marker=0;
|
||||
img.marker_mul.num_COD=0;
|
||||
img.marker_mul.num_COC=0;
|
||||
img.marker_mul.num_RGN=0;
|
||||
img.marker_mul.num_QCC=0;
|
||||
img.marker_mul.num_TLM=0;
|
||||
img.marker_mul.num_PLM=0;
|
||||
img.marker_mul.num_COM=0;
|
||||
|
||||
// decode
|
||||
|
||||
if (!j2k_decode(j2kfile, totlen, &imgg, &cp)) {
|
||||
fprintf(stderr, "Index_creator: failed to decode image!\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
free(j2kfile);
|
||||
|
||||
fseek(src, 0, SEEK_SET);
|
||||
img.codestream_size=totlen;
|
||||
|
||||
j2k_index_JPIP(argv[2],argv[1],totlen*2>30000?totlen*2:30000);
|
||||
|
||||
fclose(src);
|
||||
|
||||
j2k_clean();
|
||||
return 1;
|
||||
}
|
||||
@@ -1,41 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2002, David Janssens
|
||||
* Copyright (c) 2003, Yannick Verschueren
|
||||
* Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef __INT_H
|
||||
#define __INT_H
|
||||
|
||||
int int_min(int a, int b);
|
||||
int int_max(int a, int b);
|
||||
int int_clamp(int a, int min, int max);
|
||||
int int_abs(int a);
|
||||
int int_ceildiv(int a, int b);
|
||||
int int_ceildivpow2(int a, int b);
|
||||
int int_floordivpow2(int a, int b);
|
||||
int int_floorlog2(int a);
|
||||
|
||||
#endif
|
||||
@@ -1,222 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2002, David Janssens
|
||||
* Copyright (c) 2003, Yannick Verschueren
|
||||
* Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#define VERSION "0.0.8"
|
||||
|
||||
#ifdef WIN32
|
||||
#ifdef LIBJ2K_EXPORTS
|
||||
#define LIBJ2K_API __declspec(dllexport)
|
||||
#else
|
||||
#define LIBJ2K_API __declspec(dllimport)
|
||||
#endif
|
||||
#else
|
||||
#define LIBJ2K_API
|
||||
#endif
|
||||
|
||||
#ifndef __J2K_H
|
||||
#define __J2K_H
|
||||
|
||||
#define J2K_MAXRLVLS 33
|
||||
#define J2K_MAXBANDS (3*J2K_MAXRLVLS+1)
|
||||
|
||||
#define J2K_CP_CSTY_PRT 0x01
|
||||
#define J2K_CP_CSTY_SOP 0x02
|
||||
#define J2K_CP_CSTY_EPH 0x04
|
||||
#define J2K_CCP_CSTY_PRT 0x01
|
||||
#define J2K_CCP_CBLKSTY_LAZY 0x01
|
||||
#define J2K_CCP_CBLKSTY_RESET 0x02
|
||||
#define J2K_CCP_CBLKSTY_TERMALL 0x04
|
||||
#define J2K_CCP_CBLKSTY_VSC 0x08
|
||||
#define J2K_CCP_CBLKSTY_PTERM 0x10
|
||||
#define J2K_CCP_CBLKSTY_SEGSYM 0x20
|
||||
#define J2K_CCP_QNTSTY_NOQNT 0
|
||||
#define J2K_CCP_QNTSTY_SIQNT 1
|
||||
#define J2K_CCP_QNTSTY_SEQNT 2
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int dx, dy; // XRsiz, YRsiz
|
||||
int prec; // precision
|
||||
int bpp; // deapth of image in bits
|
||||
int sgnd; // signed
|
||||
int *data; // image-component data
|
||||
} j2k_comp_t;
|
||||
|
||||
typedef struct {
|
||||
int x0, y0; // XOsiz, YOsiz
|
||||
int x1, y1; // Xsiz, Ysiz
|
||||
int numcomps; // number of components
|
||||
int index_on; // 0 = no index || 1 = index
|
||||
//int PPT;
|
||||
j2k_comp_t *comps; // image-components
|
||||
} j2k_image_t;
|
||||
|
||||
typedef struct {
|
||||
int expn; // exponent
|
||||
int mant; // mantissa
|
||||
} j2k_stepsize_t;
|
||||
|
||||
typedef struct {
|
||||
int csty; // coding style
|
||||
int numresolutions; // number of resolutions
|
||||
int cblkw; // width of code-blocks
|
||||
int cblkh; // height of code-blocks
|
||||
int cblksty; // code-block coding style
|
||||
int qmfbid; // discrete wavelet transform identifier
|
||||
int qntsty; // quantisation style
|
||||
j2k_stepsize_t stepsizes[J2K_MAXBANDS]; // stepsizes used for quantisation
|
||||
int numgbits; // number of guard bits
|
||||
int roishift; // Region Of Interest shift
|
||||
int prcw[J2K_MAXRLVLS]; // Precinct width
|
||||
int prch[J2K_MAXRLVLS]; // Precinct height
|
||||
} j2k_tccp_t;
|
||||
|
||||
typedef struct {
|
||||
int resno0, compno0;
|
||||
int layno1, resno1, compno1;
|
||||
int prg;
|
||||
int tile;
|
||||
char progorder[4];
|
||||
} j2k_poc_t;
|
||||
|
||||
typedef struct {
|
||||
int csty; // coding style
|
||||
int prg; // progression order
|
||||
int numlayers; // number of layers
|
||||
int mct; // multi-component transform identifier
|
||||
int rates[100]; // rates of layers
|
||||
int numpocs; // number of progression order changes
|
||||
j2k_poc_t pocs[32]; // progression order changes
|
||||
j2k_tccp_t *tccps; // tile-component coding parameters
|
||||
} j2k_tcp_t;
|
||||
|
||||
typedef struct {
|
||||
int tx0, ty0; // XTOsiz, YTOsiz
|
||||
int tdx, tdy; // XTsiz, YTsiz
|
||||
int tw, th;
|
||||
j2k_tcp_t *tcps; // tile coding parameters
|
||||
} j2k_cp_t;
|
||||
|
||||
typedef struct {
|
||||
int len;
|
||||
int len_header;
|
||||
int offset;
|
||||
} info_layer_t;
|
||||
|
||||
typedef struct {
|
||||
info_layer_t *layer;
|
||||
} info_prec_t;
|
||||
|
||||
typedef struct {
|
||||
info_prec_t *prec;
|
||||
} info_reso_t;
|
||||
|
||||
typedef struct {
|
||||
info_reso_t *reso;
|
||||
} info_compo_t;
|
||||
|
||||
typedef struct {
|
||||
int num_tile; // Number of Tile
|
||||
int start_pos; // Start position
|
||||
int end_header; // End position of the header
|
||||
int end_pos; // End position
|
||||
int pw, ph; // number of precinct by tile
|
||||
int num_packet; // number of packet in the tile
|
||||
info_compo_t *compo; // component [packet]
|
||||
} info_tile_t; // index struct
|
||||
|
||||
typedef struct {
|
||||
int type; // type of marker [SIZ, QCD, POC, PPM, CRG] appearing only once
|
||||
int start_pos; // Start position of the marker
|
||||
int len; // Length of the marker
|
||||
} info_marker_t; // index struct
|
||||
|
||||
typedef struct{
|
||||
info_marker_t *COD;
|
||||
int num_COD;
|
||||
info_marker_t *COC;
|
||||
int num_COC;
|
||||
info_marker_t *RGN;
|
||||
int num_RGN;
|
||||
info_marker_t *QCC;
|
||||
int num_QCC;
|
||||
info_marker_t *TLM;
|
||||
int num_TLM;
|
||||
info_marker_t *PLM;
|
||||
int num_PLM;
|
||||
info_marker_t *PPM;
|
||||
int num_PPM;
|
||||
info_marker_t *COM;
|
||||
int num_COM;
|
||||
} info_marker_mul_t; // index struct
|
||||
|
||||
typedef struct {
|
||||
int index_on;
|
||||
int num; // numero of packet
|
||||
int index_write; // writing the packet inthe index with t2_encode_packets
|
||||
int Im_w, Im_h; // Image width and Height
|
||||
int Prog; // progression order
|
||||
int Tile_x, Tile_y; // Number of Tile in X and Y
|
||||
int tw, th;
|
||||
int Comp; // Component numbers
|
||||
int Layer; // number of layer
|
||||
int Decomposition; // number of decomposition
|
||||
int pw, ph; // nombre precinct in X and Y
|
||||
int pdx, pdy; // size of precinct in X and Y
|
||||
int Main_head_end; // Main header position
|
||||
int codestream_size; // codestream's size
|
||||
info_tile_t *tile; // information concerning tiles inside image
|
||||
info_marker_t *marker; // information concerning markers inside image [only one apparition]
|
||||
info_marker_mul_t marker_mul; // information concerning markers inside image [multiple apparition]
|
||||
int num_marker; // number of marker
|
||||
int num_packet_max; // MAximum number of packet
|
||||
} info_image_t; // index struct
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Encode an image into a JPEG-2000 codestream
|
||||
* i: image to encode
|
||||
* cp: coding parameters
|
||||
* dest: destination buffer
|
||||
* len: length of destination buffer
|
||||
* index : index file name
|
||||
*/
|
||||
LIBJ2K_API int j2k_encode(j2k_image_t *i, j2k_cp_t *cp,char *outfile, int len,char *index);
|
||||
|
||||
//LIBJ2K_API int j2k_encode(j2k_image_t *i, j2k_cp_t *cp,unsigned char *dest, int len);
|
||||
/*
|
||||
* Decode an image from a JPEG-2000 codestream
|
||||
* src: source buffer
|
||||
* len: length of source buffer
|
||||
* i: decode image
|
||||
* cp: coding parameters that were used to encode the image
|
||||
*/
|
||||
LIBJ2K_API int j2k_decode(unsigned char *src, int len, j2k_image_t **i, j2k_cp_t **cp);
|
||||
|
||||
#endif
|
||||
@@ -1,259 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2003, Yannick Verschueren
|
||||
* Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
||||
* 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 <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <setjmp.h>
|
||||
#include <math.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "j2k.h"
|
||||
#include "cio.h"
|
||||
#include "tcd.h"
|
||||
#include "int.h"
|
||||
|
||||
#define JPIP_JPIP 0x6a706970
|
||||
|
||||
#define JP2_JP 0x6a502020
|
||||
#define JP2_FTYP 0x66747970
|
||||
#define JP2_JP2H 0x6a703268
|
||||
#define JP2_IHDR 0x69686472
|
||||
#define JP2_COLR 0x636f6c72
|
||||
#define JP2_JP2C 0x6a703263
|
||||
#define JP2_URL 0x75726c20
|
||||
#define JP2_DBTL 0x6474626c
|
||||
#define JP2_BPCC 0x62706363
|
||||
#define JP2 0x6a703220
|
||||
|
||||
|
||||
void jp2_write_url(char *Idx_file)
|
||||
{
|
||||
int len, lenp, i;
|
||||
char str[256];
|
||||
|
||||
sprintf(str, "%s", Idx_file);
|
||||
lenp=cio_tell();
|
||||
cio_skip(4);
|
||||
cio_write(JP2_URL, 4); // DBTL
|
||||
cio_write(0,1); // VERS
|
||||
cio_write(0,3); // FLAG
|
||||
|
||||
for (i=0; i<strlen(str); i++) {
|
||||
cio_write(str[i], 1);
|
||||
}
|
||||
|
||||
len=cio_tell()-lenp;
|
||||
cio_seek(lenp);
|
||||
cio_write(len,4); // L
|
||||
cio_seek(lenp+len);
|
||||
}
|
||||
|
||||
void jp2_write_dbtl(char *Idx_file)
|
||||
{
|
||||
int len, lenp;
|
||||
|
||||
lenp=cio_tell();
|
||||
cio_skip(4);
|
||||
cio_write(JP2_DBTL, 4); // DBTL
|
||||
cio_write(1,2); // NDR : Only 1
|
||||
|
||||
jp2_write_url(Idx_file); // URL Box
|
||||
|
||||
len=cio_tell()-lenp;
|
||||
cio_seek(lenp);
|
||||
cio_write(len,4); // L
|
||||
cio_seek(lenp+len);
|
||||
}
|
||||
|
||||
int jp2_write_ihdr(j2k_image_t *j2k_img)
|
||||
{
|
||||
int len, lenp,i;
|
||||
int depth_0,depth, sign, BPC_ok=1;
|
||||
|
||||
lenp=cio_tell();
|
||||
cio_skip(4);
|
||||
cio_write(JP2_IHDR, 4); // IHDR
|
||||
|
||||
cio_write(j2k_img->y1-j2k_img->x0,4); // HEIGHT
|
||||
cio_write(j2k_img->x1-j2k_img->x0,4); // WIDTH
|
||||
cio_write(j2k_img->numcomps,2); // NC
|
||||
|
||||
depth_0=j2k_img->comps[0].prec-1;
|
||||
sign=j2k_img->comps[0].sgnd;
|
||||
|
||||
for(i=1;i<j2k_img->numcomps;i++)
|
||||
{
|
||||
depth=j2k_img->comps[i].prec-1;
|
||||
sign=j2k_img->comps[i].sgnd;
|
||||
if(depth_0!=depth) BPC_ok=0;
|
||||
}
|
||||
|
||||
if (BPC_ok)
|
||||
cio_write(depth_0+(sign<<7),1);
|
||||
else
|
||||
cio_write(255,1);
|
||||
|
||||
cio_write(7,1); // C : Always 7
|
||||
cio_write(1,1); // UnkC, colorspace unknow
|
||||
cio_write(0,1); // IPR, no intellectual property
|
||||
|
||||
len=cio_tell()-lenp;
|
||||
cio_seek(lenp);
|
||||
cio_write(len,4); // L
|
||||
cio_seek(lenp+len);
|
||||
|
||||
return BPC_ok;
|
||||
}
|
||||
|
||||
void jp2_write_bpcc(j2k_image_t *j2k_img)
|
||||
{
|
||||
int len, lenp, i;
|
||||
|
||||
lenp=cio_tell();
|
||||
cio_skip(4);
|
||||
cio_write(JP2_BPCC, 4); // BPCC
|
||||
|
||||
for(i=0;i<j2k_img->numcomps;i++)
|
||||
cio_write(j2k_img->comps[i].prec-1+(j2k_img->comps[i].sgnd<<7),1);
|
||||
|
||||
len=cio_tell()-lenp;
|
||||
cio_seek(lenp);
|
||||
cio_write(len,4); // L
|
||||
cio_seek(lenp+len);
|
||||
}
|
||||
|
||||
void jp2_write_colr(int BPC_ok, j2k_image_t *j2k_img)
|
||||
{
|
||||
int len, lenp, meth;
|
||||
|
||||
lenp=cio_tell();
|
||||
cio_skip(4);
|
||||
cio_write(JP2_COLR, 4); // COLR
|
||||
|
||||
if ((j2k_img->numcomps==1 || j2k_img->numcomps==3) && (BPC_ok && j2k_img->comps[0].prec==8))
|
||||
meth=1;
|
||||
else
|
||||
meth=2;
|
||||
|
||||
cio_write(meth,1); // METH
|
||||
cio_write(0,1); // PREC
|
||||
cio_write(0,1); // APPROX
|
||||
|
||||
if (meth==1)
|
||||
cio_write(j2k_img->numcomps>1?16:17,4); // EnumCS
|
||||
|
||||
if (meth==2)
|
||||
cio_write(0,1); // PROFILE (??)
|
||||
|
||||
len=cio_tell()-lenp;
|
||||
cio_seek(lenp);
|
||||
cio_write(len,4); // L
|
||||
cio_seek(lenp+len);
|
||||
}
|
||||
|
||||
void jp2_write_jp2h(j2k_image_t *j2k_img)
|
||||
{
|
||||
int len, lenp, BPC_ok;
|
||||
|
||||
lenp=cio_tell();
|
||||
cio_skip(4);
|
||||
cio_write(JP2_JP2H, 4); // JP2H
|
||||
|
||||
BPC_ok=jp2_write_ihdr(j2k_img);
|
||||
|
||||
if (!BPC_ok)
|
||||
jp2_write_bpcc(j2k_img);
|
||||
jp2_write_colr(BPC_ok, j2k_img);
|
||||
|
||||
len=cio_tell()-lenp;
|
||||
cio_seek(lenp);
|
||||
cio_write(len,4); // L
|
||||
cio_seek(lenp+len);
|
||||
}
|
||||
|
||||
void jp2_write_ftyp()
|
||||
{
|
||||
int len, lenp;
|
||||
|
||||
lenp=cio_tell();
|
||||
cio_skip(4);
|
||||
cio_write(JP2_FTYP, 4); // FTYP
|
||||
|
||||
cio_write(JP2,4); // BR
|
||||
cio_write(0,4); // MinV
|
||||
cio_write(JP2,4); // CL0 : JP2
|
||||
cio_write(JPIP_JPIP,4); // CL1 : JPIP
|
||||
|
||||
len=cio_tell()-lenp;
|
||||
cio_seek(lenp);
|
||||
cio_write(len,4); // L
|
||||
cio_seek(lenp+len);
|
||||
}
|
||||
|
||||
int jp2_write_jp2c(char *J2K_file)
|
||||
{
|
||||
int len, lenp, totlen, i;
|
||||
FILE *src;
|
||||
char *j2kfile;
|
||||
|
||||
lenp=cio_tell();
|
||||
cio_skip(4);
|
||||
cio_write(JP2_JP2C, 4); // JP2C
|
||||
|
||||
src=fopen(J2K_file, "rb");
|
||||
fseek(src, 0, SEEK_END);
|
||||
totlen=ftell(src);
|
||||
fseek(src, 0, SEEK_SET);
|
||||
|
||||
j2kfile=(char*)malloc(totlen);
|
||||
fread(j2kfile, 1, totlen, src);
|
||||
fclose(src);
|
||||
|
||||
for (i=0;i<totlen;i++)
|
||||
cio_write(j2kfile[i],1);
|
||||
|
||||
len=cio_tell()-lenp;
|
||||
cio_seek(lenp);
|
||||
cio_write(len,4); // L
|
||||
cio_seek(lenp+len);
|
||||
return lenp;
|
||||
}
|
||||
|
||||
void jp2_write_jp()
|
||||
{
|
||||
int len, lenp;
|
||||
|
||||
lenp=cio_tell();
|
||||
cio_skip(4);
|
||||
cio_write(JP2_JP, 4); // JP
|
||||
cio_write(0x0d0a870a,4);
|
||||
len=cio_tell()-lenp;
|
||||
cio_seek(lenp);
|
||||
cio_write(len,4); // L
|
||||
cio_seek(lenp+len);
|
||||
}
|
||||
@@ -1,489 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2003, Yannick Verschueren
|
||||
* Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
||||
* 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 <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <setjmp.h>
|
||||
#include <math.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "j2k.h"
|
||||
#include "cio.h"
|
||||
#include "tcd.h"
|
||||
#include "int.h"
|
||||
|
||||
#define JPIP_CIDX 0x63696478
|
||||
#define JPIP_CPTR 0x63707472
|
||||
#define JPIP_MANF 0x6d616e66
|
||||
#define JPIP_FAIX 0x66616978
|
||||
#define JPIP_MHIX 0x6d686978
|
||||
#define JPIP_TPIX 0x74706978
|
||||
#define JPIP_THIX 0x74686978
|
||||
#define JPIP_PPIX 0x70706978
|
||||
#define JPIP_PHIX 0x70686978
|
||||
#define JPIP_FIDX 0x66696478
|
||||
#define JPIP_FPTR 0x66707472
|
||||
#define JPIP_PRXY 0x70727879
|
||||
#define JPIP_IPTR 0x69707472
|
||||
|
||||
#define JP2C 0x6a703263
|
||||
|
||||
static info_marker_t marker_jpip[32], marker_local_jpip[32]; // SIZE to precise !
|
||||
static int num_marker_jpip, num_marker_local_jpip;
|
||||
|
||||
void jpip_write_cptr(int offset, info_image_t img) // Codestream finder box (box)
|
||||
{
|
||||
int len, lenp;
|
||||
|
||||
lenp=cio_tell();
|
||||
cio_skip(4); // L [at the end]
|
||||
cio_write(JPIP_CPTR,4); // T
|
||||
cio_write(0,2); // DR A PRECISER !!
|
||||
cio_write(0,2); // CONT
|
||||
cio_write(offset,8); // COFF A PRECISER !!
|
||||
cio_write(img.codestream_size,8); // CLEN
|
||||
len=cio_tell()-lenp;
|
||||
cio_seek(lenp);
|
||||
cio_write(len, 4); // L
|
||||
cio_seek(lenp+len);
|
||||
}
|
||||
|
||||
void jpip_write_manf(int second, int v, info_marker_t *marker) // Manifest box (box)
|
||||
{
|
||||
int len, lenp, i;
|
||||
lenp=cio_tell();
|
||||
cio_skip(4); // L [at the end]
|
||||
cio_write(JPIP_MANF,4); // T
|
||||
|
||||
if (second) // Write only during the second pass
|
||||
{
|
||||
for(i=0;i<v;i++)
|
||||
{
|
||||
cio_write(marker[i].len,4);
|
||||
cio_write(marker[i].type,4);
|
||||
}
|
||||
}
|
||||
|
||||
len=cio_tell()-lenp;
|
||||
cio_seek(lenp);
|
||||
cio_write(len, 4); // L
|
||||
cio_seek(lenp+len);
|
||||
}
|
||||
|
||||
int jpip_write_mhix(info_image_t img) // Main Header Index Table (box)
|
||||
{
|
||||
int len, lenp, i;
|
||||
lenp=cio_tell();
|
||||
cio_skip(4); // L [at the end]
|
||||
cio_write(JPIP_MHIX, 4); // CIDX
|
||||
|
||||
cio_write(img.Main_head_end,8); // TLEN
|
||||
|
||||
for(i=0;i<img.num_marker;i++) // Marker restricted to 1 apparition
|
||||
{
|
||||
cio_write(img.marker[i].type,2);
|
||||
cio_write(0,2);
|
||||
cio_write(img.marker[i].start_pos,8);
|
||||
cio_write(img.marker[i].len,2);
|
||||
}
|
||||
|
||||
// Marker NOT restricted to 1 apparition
|
||||
for(i=img.marker_mul.num_COD-1;i>=0;i--) // COD
|
||||
{
|
||||
cio_write(img.marker_mul.COD[i].type,2);
|
||||
cio_write(i,2);
|
||||
cio_write(img.marker_mul.COD[i].start_pos,8);
|
||||
cio_write(img.marker_mul.COD[i].len,2);
|
||||
}
|
||||
|
||||
for(i=img.marker_mul.num_COC-1;i>=0;i--) // COC
|
||||
{
|
||||
cio_write(img.marker_mul.COC[i].type,2);
|
||||
cio_write(i,2);
|
||||
cio_write(img.marker_mul.COC[i].start_pos,8);
|
||||
cio_write(img.marker_mul.COC[i].len,2);
|
||||
}
|
||||
|
||||
for(i=img.marker_mul.num_RGN-1;i>=0;i--) // RGN
|
||||
{
|
||||
cio_write(img.marker_mul.RGN[i].type,2);
|
||||
cio_write(i,2);
|
||||
cio_write(img.marker_mul.RGN[i].start_pos,8);
|
||||
cio_write(img.marker_mul.RGN[i].len,2);
|
||||
}
|
||||
|
||||
for(i=img.marker_mul.num_QCC-1;i>=0;i--) // QCC
|
||||
{
|
||||
cio_write(img.marker_mul.QCC[i].type,2);
|
||||
cio_write(i,2);
|
||||
cio_write(img.marker_mul.QCC[i].start_pos,8);
|
||||
cio_write(img.marker_mul.QCC[i].len,2);
|
||||
}
|
||||
|
||||
for(i=img.marker_mul.num_TLM-1;i>=0;i--) // TLM
|
||||
{
|
||||
cio_write(img.marker_mul.TLM[i].type,2);
|
||||
cio_write(i,2);
|
||||
cio_write(img.marker_mul.TLM[i].start_pos,8);
|
||||
cio_write(img.marker_mul.TLM[i].len,2);
|
||||
}
|
||||
|
||||
for(i=img.marker_mul.num_PLM-1;i>=0;i--) // PLM
|
||||
{
|
||||
cio_write(img.marker_mul.PLM[i].type,2);
|
||||
cio_write(i,2);
|
||||
cio_write(img.marker_mul.PLM[i].start_pos,8);
|
||||
cio_write(img.marker_mul.PLM[i].len,2);
|
||||
}
|
||||
|
||||
for(i=img.marker_mul.num_COM-1;i>=0;i--) // COM
|
||||
{
|
||||
cio_write(img.marker_mul.COM[i].type,2);
|
||||
cio_write(i,2);
|
||||
cio_write(img.marker_mul.COM[i].start_pos,8);
|
||||
cio_write(img.marker_mul.COM[i].len,2);
|
||||
}
|
||||
|
||||
len=cio_tell()-lenp;
|
||||
cio_seek(lenp);
|
||||
cio_write(len, 4); // L
|
||||
cio_seek(lenp+len);
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
int jpip_write_faix(int v, int compno, info_image_t img, j2k_cp_t *j2k_cp) // Fragment array Index box
|
||||
{
|
||||
int len, lenp, i;
|
||||
int version = 0;
|
||||
int tileno, resno, precno, layno, num_packet=0;
|
||||
|
||||
lenp=cio_tell();
|
||||
cio_skip(4); // L [at the end]
|
||||
cio_write(JPIP_FAIX, 4); // MHIX
|
||||
cio_write(version,1); // Version 0 = 4 bytes
|
||||
|
||||
switch(v)
|
||||
{
|
||||
case 0: // TPIX
|
||||
cio_write(1,version?8:4); // NMAX
|
||||
cio_write(img.tw*img.th,version?8:4); // M
|
||||
for (i=0;i<img.tw*img.th;i++)
|
||||
{
|
||||
cio_write(img.tile[i].start_pos,version?8:4);
|
||||
cio_write(img.tile[i].end_pos-img.tile[i].start_pos,version?8:4);
|
||||
}
|
||||
break;
|
||||
|
||||
case 1: // THIX
|
||||
cio_write(1,version?8:4); // NMAX
|
||||
cio_write(img.tw*img.th,version?8:4); // M
|
||||
for (i=0;i<img.tw*img.th;i++)
|
||||
{
|
||||
cio_write(img.tile[i].start_pos,version?8:4);
|
||||
cio_write(img.tile[i].end_header-img.tile[i].start_pos,version?8:4);
|
||||
}
|
||||
break;
|
||||
|
||||
case 2: // PPIX NOT FINISHED !!
|
||||
cio_write(img.num_packet_max,version?8:4); // NMAX
|
||||
cio_write(img.tw*img.th,version?8:4); // M
|
||||
for(tileno=0;tileno<img.tw*img.th;tileno++)
|
||||
{
|
||||
info_tile_t *tile_Idx = &img.tile[tileno];
|
||||
info_compo_t *compo_Idx = &tile_Idx->compo[compno];
|
||||
int correction;
|
||||
if(j2k_cp->tcps[tileno].csty&J2K_CP_CSTY_EPH)
|
||||
correction=3;
|
||||
else
|
||||
correction=1;
|
||||
for(resno=0;resno<img.Decomposition+1;resno++)
|
||||
{
|
||||
info_reso_t *reso_Idx = &compo_Idx->reso[resno];
|
||||
for (precno=0;precno<img.tile[tileno].pw*img.tile[tileno].ph;precno++)
|
||||
{
|
||||
info_prec_t *prec_Idx = &reso_Idx->prec[precno];
|
||||
for(layno=0;layno<img.Layer;layno++)
|
||||
{
|
||||
info_layer_t *layer_Idx = &prec_Idx->layer[layno];
|
||||
cio_write(layer_Idx->offset,version?8:4);
|
||||
cio_write((layer_Idx->len_header-correction)?0:layer_Idx->len,version?8:4);
|
||||
num_packet++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// PADDING
|
||||
while (num_packet<img.num_packet_max)
|
||||
{
|
||||
cio_write(0,version?8:4);
|
||||
cio_write(0,version?8:4);
|
||||
num_packet++;
|
||||
}
|
||||
break;
|
||||
|
||||
case 3: // PHIX NOT FINISHED !!
|
||||
cio_write(img.num_packet_max,version?8:4); // NMAX
|
||||
cio_write(img.tw*img.th,version?8:4); // M
|
||||
for(tileno=0;tileno<img.tw*img.th;tileno++)
|
||||
{
|
||||
info_tile_t *tile_Idx = &img.tile[tileno];
|
||||
info_compo_t *compo_Idx = &tile_Idx->compo[compno];
|
||||
int correction;
|
||||
if(j2k_cp->tcps[tileno].csty&J2K_CP_CSTY_EPH)
|
||||
correction=3;
|
||||
else
|
||||
correction=1;
|
||||
for(resno=0;resno<img.Decomposition+1;resno++)
|
||||
{
|
||||
info_reso_t *reso_Idx = &compo_Idx->reso[resno];
|
||||
for (precno=0;precno<img.tile[tileno].pw*img.tile[tileno].ph;precno++)
|
||||
{
|
||||
info_prec_t *prec_Idx = &reso_Idx->prec[precno];
|
||||
for(layno=0;layno<img.Layer;layno++)
|
||||
{
|
||||
info_layer_t *layer_Idx = &prec_Idx->layer[layno];
|
||||
cio_write(layer_Idx->offset,version?8:4);
|
||||
cio_write((layer_Idx->len_header-correction)?0:layer_Idx->len_header,version?8:4);
|
||||
num_packet++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// PADDING
|
||||
while (num_packet<img.num_packet_max)
|
||||
{
|
||||
cio_write(0,version?8:4);
|
||||
cio_write(0,version?8:4);
|
||||
num_packet++;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
len=cio_tell()-lenp;
|
||||
cio_seek(lenp);
|
||||
cio_write(len, 4); // L
|
||||
cio_seek(lenp+len);
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
int jpip_write_tpix(info_image_t img, j2k_cp_t *j2k_cp) // Tile-part Index Table box (superbox)
|
||||
{
|
||||
int len, lenp;
|
||||
lenp=cio_tell();
|
||||
cio_skip(4); // L [at the end]
|
||||
cio_write(JPIP_TPIX, 4); // TPIX
|
||||
|
||||
jpip_write_faix(0,0,img, j2k_cp);
|
||||
|
||||
len=cio_tell()-lenp;
|
||||
cio_seek(lenp);
|
||||
cio_write(len, 4); // L
|
||||
cio_seek(lenp+len);
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
int jpip_write_thix(info_image_t img, j2k_cp_t *j2k_cp) // Tile header Index Table box (superbox)
|
||||
{
|
||||
int len, lenp;
|
||||
lenp=cio_tell();
|
||||
cio_skip(4); // L [at the end]
|
||||
cio_write(JPIP_THIX, 4); // THIX
|
||||
|
||||
jpip_write_faix(1,0,img, j2k_cp);
|
||||
|
||||
len=cio_tell()-lenp;
|
||||
cio_seek(lenp);
|
||||
cio_write(len, 4); // L
|
||||
cio_seek(lenp+len);
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
int jpip_write_ppix(info_image_t img,j2k_cp_t *j2k_cp) // Precinct Packet Index Table box (superbox)
|
||||
{
|
||||
int len, lenp, compno, i;
|
||||
|
||||
for (i=0;i<2;i++)
|
||||
{
|
||||
if (i) cio_seek(lenp);
|
||||
|
||||
lenp=cio_tell();
|
||||
cio_skip(4); // L [at the end]
|
||||
cio_write(JPIP_PPIX, 4); // PPIX
|
||||
jpip_write_manf(i,img.Comp,marker_local_jpip);
|
||||
|
||||
num_marker_local_jpip=img.Comp;
|
||||
|
||||
for (compno=0; compno<img.Comp; compno++)
|
||||
{
|
||||
marker_local_jpip[compno].len=jpip_write_faix(2,compno,img, j2k_cp);
|
||||
marker_local_jpip[compno].type=JPIP_FAIX;
|
||||
}
|
||||
|
||||
len=cio_tell()-lenp;
|
||||
cio_seek(lenp);
|
||||
cio_write(len, 4); // L
|
||||
cio_seek(lenp+len);
|
||||
}
|
||||
return len;
|
||||
}
|
||||
|
||||
int jpip_write_phix(info_image_t img, j2k_cp_t *j2k_cp) // Packet Header Index Table Box (superbox)
|
||||
{
|
||||
int len, lenp=0, compno, i;
|
||||
|
||||
for (i=0;i<2;i++)
|
||||
{
|
||||
if (i) cio_seek(lenp);
|
||||
|
||||
lenp=cio_tell();
|
||||
cio_skip(4); // L [at the end]
|
||||
cio_write(JPIP_PHIX, 4); // PHIX
|
||||
|
||||
jpip_write_manf(i,img.Comp,marker_local_jpip);
|
||||
|
||||
for (compno=0; compno<img.Comp; compno++)
|
||||
{
|
||||
marker_local_jpip[compno].len=jpip_write_faix(3,compno,img, j2k_cp);
|
||||
marker_local_jpip[compno].type=JPIP_FAIX;
|
||||
}
|
||||
|
||||
len=cio_tell()-lenp;
|
||||
cio_seek(lenp);
|
||||
cio_write(len, 4); // L
|
||||
cio_seek(lenp+len);
|
||||
}
|
||||
return len;
|
||||
}
|
||||
|
||||
int jpip_write_cidx(int offset, info_image_t img, j2k_cp_t *j2k_cp) // Codestream index box (superbox)
|
||||
{
|
||||
int len, lenp=0, i;
|
||||
num_marker_jpip=0;
|
||||
|
||||
for (i=0;i<2;i++)
|
||||
{
|
||||
if(i)
|
||||
cio_seek(lenp);
|
||||
|
||||
lenp=cio_tell();
|
||||
|
||||
cio_skip(4); // L [at the end]
|
||||
cio_write(JPIP_CIDX, 4); // CIDX
|
||||
jpip_write_cptr(offset, img);
|
||||
jpip_write_manf(i,num_marker_jpip, marker_jpip); // A definir
|
||||
|
||||
num_marker_jpip=0;
|
||||
marker_jpip[num_marker_jpip].len=jpip_write_mhix(img);
|
||||
marker_jpip[num_marker_jpip].type=JPIP_MHIX;
|
||||
num_marker_jpip++;
|
||||
|
||||
marker_jpip[num_marker_jpip].len=jpip_write_tpix(img, j2k_cp);
|
||||
marker_jpip[num_marker_jpip].type=JPIP_TPIX;
|
||||
num_marker_jpip++;
|
||||
|
||||
marker_jpip[num_marker_jpip].len=jpip_write_thix(img, j2k_cp);
|
||||
marker_jpip[num_marker_jpip].type=JPIP_THIX;
|
||||
num_marker_jpip++;
|
||||
|
||||
marker_jpip[num_marker_jpip].len=jpip_write_ppix(img, j2k_cp);
|
||||
marker_jpip[num_marker_jpip].type=JPIP_PPIX;
|
||||
num_marker_jpip++;
|
||||
|
||||
marker_jpip[num_marker_jpip].len=jpip_write_phix(img, j2k_cp);
|
||||
marker_jpip[num_marker_jpip].type=JPIP_PHIX;
|
||||
num_marker_jpip++;
|
||||
|
||||
len=cio_tell()-lenp;
|
||||
cio_seek(lenp);
|
||||
cio_write(len, 4); // L
|
||||
cio_seek(lenp+len);
|
||||
}
|
||||
|
||||
return len;
|
||||
|
||||
}
|
||||
|
||||
void jpip_write_iptr(int offset, int length)
|
||||
{
|
||||
int len, lenp;
|
||||
lenp=cio_tell();
|
||||
cio_skip(4); // L [at the end]
|
||||
cio_write(JPIP_IPTR, 4); // IPTR
|
||||
|
||||
cio_write(offset,8);
|
||||
cio_write(length,8);
|
||||
|
||||
len=cio_tell()-lenp;
|
||||
cio_seek(lenp);
|
||||
cio_write(len, 4); // L
|
||||
cio_seek(lenp+len);
|
||||
}
|
||||
|
||||
void jpip_write_prxy(int offset_jp2c, int length_jp2c, int offset_idx, int length_idx)
|
||||
{
|
||||
int len, lenp;
|
||||
lenp=cio_tell();
|
||||
cio_skip(4); // L [at the end]
|
||||
cio_write(JPIP_PRXY, 4); // IPTR
|
||||
|
||||
cio_write(offset_jp2c,8); // OOFF
|
||||
cio_write(length_jp2c,4); // OBH part 1
|
||||
cio_write(JP2C,4); // OBH part 2
|
||||
|
||||
cio_write(1,1); // NI
|
||||
|
||||
cio_write(offset_idx,8); // IOFF
|
||||
cio_write(length_idx,4); // IBH part 1
|
||||
cio_write(JPIP_CIDX,4); // IBH part 2
|
||||
|
||||
len=cio_tell()-lenp;
|
||||
cio_seek(lenp);
|
||||
cio_write(len, 4); // L
|
||||
cio_seek(lenp+len);
|
||||
}
|
||||
|
||||
int jpip_write_fidx(int offset_jp2c, int length_jp2c, int offset_idx, int length_idx)
|
||||
{
|
||||
int len, lenp;
|
||||
lenp=cio_tell();
|
||||
cio_skip(4); // L [at the end]
|
||||
cio_write(JPIP_FIDX, 4); // IPTR
|
||||
|
||||
jpip_write_prxy(offset_jp2c, length_jp2c, offset_idx, offset_jp2c);
|
||||
|
||||
len=cio_tell()-lenp;
|
||||
cio_seek(lenp);
|
||||
cio_write(len, 4); // L
|
||||
cio_seek(lenp+len);
|
||||
|
||||
return len;
|
||||
}
|
||||
@@ -1,434 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2002, David Janssens
|
||||
* Copyright (c) 2003, Yannick Verschueren
|
||||
* Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
||||
* 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 "pi.h"
|
||||
#include "int.h"
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Create a packet iterator.
|
||||
/// </summary>
|
||||
pi_iterator_t *pi_create(j2k_image_t *img, j2k_cp_t *cp, int tileno) {
|
||||
int p, q;
|
||||
int compno, resno,pino, layno, precno;
|
||||
int maxres=0;
|
||||
pi_iterator_t *pi;
|
||||
j2k_tcp_t *tcp;
|
||||
j2k_tccp_t *tccp;
|
||||
|
||||
tcp=&cp->tcps[tileno];
|
||||
pi=(pi_iterator_t*)malloc((tcp->numpocs+1)*sizeof(pi_iterator_t));
|
||||
|
||||
for (pino=0;pino<tcp->numpocs+1;pino++) // change
|
||||
{
|
||||
p=tileno%cp->tw;
|
||||
q=tileno/cp->tw;
|
||||
|
||||
pi[pino].tx0=int_max(cp->tx0+p*cp->tdx, img->x0);
|
||||
pi[pino].ty0=int_max(cp->ty0+q*cp->tdy, img->y0);
|
||||
pi[pino].tx1=int_min(cp->tx0+(p+1)*cp->tdx, img->x1);
|
||||
pi[pino].ty1=int_min(cp->ty0+(q+1)*cp->tdy, img->y1);
|
||||
pi[pino].numcomps=img->numcomps;
|
||||
pi[pino].comps=(pi_comp_t*)malloc(img->numcomps*sizeof(pi_comp_t));
|
||||
|
||||
for (compno=0; compno<pi->numcomps; compno++)
|
||||
{
|
||||
int tcx0, tcy0, tcx1, tcy1;
|
||||
pi_comp_t *comp=&pi[pino].comps[compno];
|
||||
|
||||
tccp=&tcp->tccps[compno];
|
||||
comp->dx=img->comps[compno].dx;
|
||||
comp->dy=img->comps[compno].dy;
|
||||
comp->numresolutions=tccp->numresolutions;
|
||||
comp->resolutions=(pi_resolution_t*)malloc(comp->numresolutions*sizeof(pi_resolution_t));
|
||||
tcx0=int_ceildiv(pi->tx0, comp->dx);
|
||||
tcy0=int_ceildiv(pi->ty0, comp->dy);
|
||||
tcx1=int_ceildiv(pi->tx1, comp->dx);
|
||||
tcy1=int_ceildiv(pi->ty1, comp->dy);
|
||||
if (comp->numresolutions>maxres) {
|
||||
maxres=comp->numresolutions;
|
||||
}
|
||||
for (resno=0; resno<comp->numresolutions; resno++)
|
||||
{
|
||||
int levelno;
|
||||
int rx0, ry0, rx1, ry1;
|
||||
int px0, py0, px1, py1;
|
||||
pi_resolution_t *res=&comp->resolutions[resno];
|
||||
if (tccp->csty&J2K_CCP_CSTY_PRT) {
|
||||
res->pdx=tccp->prcw[resno];
|
||||
res->pdy=tccp->prch[resno];
|
||||
} else {
|
||||
res->pdx=15;
|
||||
res->pdy=15;
|
||||
}
|
||||
levelno=comp->numresolutions-1-resno;
|
||||
rx0=int_ceildivpow2(tcx0, levelno);
|
||||
ry0=int_ceildivpow2(tcy0, levelno);
|
||||
rx1=int_ceildivpow2(tcx1, levelno);
|
||||
ry1=int_ceildivpow2(tcy1, levelno);
|
||||
px0=int_floordivpow2(rx0, res->pdx)<<res->pdx;
|
||||
py0=int_floordivpow2(ry0, res->pdy)<<res->pdy;
|
||||
px1=int_ceildivpow2(rx1, res->pdx)<<res->pdx;
|
||||
py1=int_ceildivpow2(ry1, res->pdy)<<res->pdy;
|
||||
res->pw=(px1-px0)>>res->pdx;
|
||||
res->ph=(py1-py0)>>res->pdy;
|
||||
}
|
||||
}
|
||||
|
||||
for (layno=0; layno<10; layno++)
|
||||
{
|
||||
for (resno=0; resno<10; resno++)
|
||||
{
|
||||
for (compno=0; compno<3; compno++)
|
||||
{
|
||||
for (precno=0; precno<99; precno++)
|
||||
{
|
||||
pi[pino].include[layno][resno][compno][precno]=0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (pino==tcp->numpocs)
|
||||
{
|
||||
pi[pino].first=1;
|
||||
pi[pino].poc.resno0=0;
|
||||
pi[pino].poc.compno0=0;
|
||||
pi[pino].poc.layno1=tcp->numlayers;
|
||||
pi[pino].poc.resno1=maxres;
|
||||
pi[pino].poc.compno1=img->numcomps;
|
||||
pi[pino].poc.prg=tcp->prg;
|
||||
} else
|
||||
{
|
||||
pi[pino].first=1;
|
||||
pi[pino].poc.resno0=tcp->pocs[pino].resno0;
|
||||
pi[pino].poc.compno0=tcp->pocs[pino].compno0;
|
||||
pi[pino].poc.layno1=tcp->pocs[pino].layno1;
|
||||
pi[pino].poc.resno1=tcp->pocs[pino].resno1;
|
||||
pi[pino].poc.compno1=tcp->pocs[pino].compno1;
|
||||
pi[pino].poc.prg=tcp->pocs[pino].prg;
|
||||
}
|
||||
}
|
||||
return pi;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get next packet in layer=resolution-component-precinct order.
|
||||
/// </summary>
|
||||
int pi_next_lrcp(pi_iterator_t *pi) {
|
||||
pi_comp_t *comp;
|
||||
pi_resolution_t *res;
|
||||
|
||||
if (!pi->first)
|
||||
{
|
||||
comp=&pi->comps[pi->compno];
|
||||
res=&comp->resolutions[pi->resno];
|
||||
goto skip;
|
||||
} else {
|
||||
pi->first=0;
|
||||
}
|
||||
for (pi->layno=0; pi->layno<pi->poc.layno1; pi->layno++)
|
||||
{
|
||||
for (pi->resno=pi->poc.resno0; pi->resno<pi->poc.resno1; pi->resno++)
|
||||
{
|
||||
for (pi->compno=pi->poc.compno0; pi->compno<pi->poc.compno1; pi->compno++)
|
||||
{
|
||||
|
||||
comp=&pi->comps[pi->compno];
|
||||
if (pi->resno>=comp->numresolutions)
|
||||
{
|
||||
|
||||
continue;
|
||||
}
|
||||
res=&comp->resolutions[pi->resno];
|
||||
|
||||
for (pi->precno=0; pi->precno<res->pw*res->ph; pi->precno++)
|
||||
{
|
||||
|
||||
if (!pi->include[pi->layno][pi->resno][pi->compno][pi->precno])
|
||||
{
|
||||
pi->include[pi->layno][pi->resno][pi->compno][pi->precno]=1;
|
||||
return 1;
|
||||
}
|
||||
skip: ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get next packet in resolution-layer-component-precinct order.
|
||||
/// </summary>
|
||||
int pi_next_rlcp(pi_iterator_t *pi) {
|
||||
pi_comp_t *comp;
|
||||
pi_resolution_t *res;
|
||||
if (!pi->first) {
|
||||
comp=&pi->comps[pi->compno];
|
||||
res=&comp->resolutions[pi->resno];
|
||||
goto skip;
|
||||
} else {
|
||||
pi->first=0;
|
||||
}
|
||||
for (pi->resno=pi->poc.resno0; pi->resno<pi->poc.resno1; pi->resno++) {
|
||||
for (pi->layno=0; pi->layno<pi->poc.layno1; pi->layno++) {
|
||||
for (pi->compno=pi->poc.compno0; pi->compno<pi->poc.compno1; pi->compno++) {
|
||||
comp=&pi->comps[pi->compno];
|
||||
if (pi->resno>=comp->numresolutions) {
|
||||
continue;
|
||||
}
|
||||
res=&comp->resolutions[pi->resno];
|
||||
for (pi->precno=0; pi->precno<res->pw*res->ph; pi->precno++) {
|
||||
if (!pi->include[pi->layno][pi->resno][pi->compno][pi->precno])
|
||||
{
|
||||
pi->include[pi->layno][pi->resno][pi->compno][pi->precno]=1;
|
||||
return 1;
|
||||
}
|
||||
skip: ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get next packet in resolution-precinct-component-layer order.
|
||||
/// </summary>
|
||||
int pi_next_rpcl(pi_iterator_t *pi) {
|
||||
pi_comp_t *comp;
|
||||
pi_resolution_t *res;
|
||||
if (!pi->first) {
|
||||
goto skip;
|
||||
} else {
|
||||
int compno, resno;
|
||||
pi->first=0;
|
||||
pi->dx=0;
|
||||
pi->dy=0;
|
||||
for (compno=0; compno<pi->numcomps; compno++) {
|
||||
comp=&pi->comps[compno];
|
||||
for (resno=0; resno<comp->numresolutions; resno++) {
|
||||
int dx, dy;
|
||||
res=&comp->resolutions[resno];
|
||||
dx=comp->dx*(1<<(res->pdx+comp->numresolutions-1-resno));
|
||||
dy=comp->dy*(1<<(res->pdy+comp->numresolutions-1-resno));
|
||||
pi->dx=!pi->dx?dx:int_min(pi->dx, dx);
|
||||
pi->dy=!pi->dy?dy:int_min(pi->dy, dy);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (pi->resno=pi->poc.resno0; pi->resno<pi->poc.resno1; pi->resno++) {
|
||||
for (pi->y=pi->ty0; pi->y<pi->ty1; pi->y+=pi->dy-(pi->y%pi->dy)) {
|
||||
for (pi->x=pi->tx0; pi->x<pi->tx1; pi->x+=pi->dx-(pi->x%pi->dx)) {
|
||||
for (pi->compno=pi->poc.compno0; pi->compno<pi->poc.compno1; pi->compno++) {
|
||||
int levelno;
|
||||
int trx0, try0;
|
||||
int rpx, rpy;
|
||||
int prci, prcj;
|
||||
comp=&pi->comps[pi->compno];
|
||||
if (pi->resno>=comp->numresolutions) {
|
||||
continue;
|
||||
}
|
||||
res=&comp->resolutions[pi->resno];
|
||||
levelno=comp->numresolutions-1-pi->resno;
|
||||
trx0=int_ceildiv(pi->tx0, comp->dx<<levelno);
|
||||
try0=int_ceildiv(pi->ty0, comp->dy<<levelno);
|
||||
rpx=res->pdx+levelno;
|
||||
rpy=res->pdy+levelno;
|
||||
if (!(pi->x%(comp->dx<<rpx)==0||(pi->x==pi->tx0&&(trx0<<levelno)%(1<<rpx)))) {
|
||||
continue;
|
||||
}
|
||||
if (!(pi->y%(comp->dy<<rpy)==0||(pi->y==pi->ty0&&(try0<<levelno)%(1<<rpx)))) {
|
||||
continue;
|
||||
}
|
||||
prci=int_floordivpow2(int_ceildiv(pi->x, comp->dx<<levelno), res->pdx)-int_floordivpow2(trx0, res->pdx);
|
||||
prcj=int_floordivpow2(int_ceildiv(pi->y, comp->dy<<levelno), res->pdy)-int_floordivpow2(try0, res->pdy);
|
||||
pi->precno=prci+prcj*res->pw;
|
||||
for (pi->layno=0; pi->layno<pi->poc.layno1; pi->layno++) {
|
||||
if (!pi->include[pi->layno][pi->resno][pi->compno][pi->precno])
|
||||
{
|
||||
pi->include[pi->layno][pi->resno][pi->compno][pi->precno]=1;
|
||||
return 1;
|
||||
}
|
||||
skip: ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get next packet in precinct-component-resolution-layer order.
|
||||
/// </summary>
|
||||
int pi_next_pcrl(pi_iterator_t *pi) {
|
||||
pi_comp_t *comp;
|
||||
pi_resolution_t *res;
|
||||
if (!pi->first) {
|
||||
comp=&pi->comps[pi->compno];
|
||||
goto skip;
|
||||
} else {
|
||||
int compno, resno;
|
||||
pi->first=0;
|
||||
pi->dx=0;
|
||||
pi->dy=0;
|
||||
for (compno=0; compno<pi->numcomps; compno++) {
|
||||
comp=&pi->comps[compno];
|
||||
for (resno=0; resno<comp->numresolutions; resno++) {
|
||||
int dx, dy;
|
||||
res=&comp->resolutions[resno];
|
||||
dx=comp->dx*(1<<(res->pdx+comp->numresolutions-1-resno));
|
||||
dy=comp->dy*(1<<(res->pdy+comp->numresolutions-1-resno));
|
||||
pi->dx=!pi->dx?dx:int_min(pi->dx, dx);
|
||||
pi->dy=!pi->dy?dy:int_min(pi->dy, dy);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (pi->y=pi->ty0; pi->y<pi->ty1; pi->y+=pi->dy-(pi->y%pi->dy)) {
|
||||
for (pi->x=pi->tx0; pi->x<pi->tx1; pi->x+=pi->dx-(pi->x%pi->dx)) {
|
||||
for (pi->compno=pi->poc.compno0; pi->compno<pi->poc.compno1; pi->compno++) {
|
||||
comp=&pi->comps[pi->compno];
|
||||
for (pi->resno=pi->poc.resno0; pi->resno<int_min(pi->poc.resno1, comp->numresolutions); pi->resno++) {
|
||||
int levelno;
|
||||
int trx0, try0;
|
||||
int rpx, rpy;
|
||||
int prci, prcj;
|
||||
res=&comp->resolutions[pi->resno];
|
||||
levelno=comp->numresolutions-1-pi->resno;
|
||||
trx0=int_ceildiv(pi->tx0, comp->dx<<levelno);
|
||||
try0=int_ceildiv(pi->ty0, comp->dy<<levelno);
|
||||
rpx=res->pdx+levelno;
|
||||
rpy=res->pdy+levelno;
|
||||
if (!(pi->x%(comp->dx<<rpx)==0||(pi->x==pi->tx0&&(trx0<<levelno)%(1<<rpx)))) {
|
||||
continue;
|
||||
}
|
||||
if (!(pi->y%(comp->dy<<rpy)==0||(pi->y==pi->ty0&&(try0<<levelno)%(1<<rpx)))) {
|
||||
continue;
|
||||
}
|
||||
prci=int_floordivpow2(int_ceildiv(pi->x, comp->dx<<levelno), res->pdx)-int_floordivpow2(trx0, res->pdx);
|
||||
prcj=int_floordivpow2(int_ceildiv(pi->y, comp->dy<<levelno), res->pdy)-int_floordivpow2(try0, res->pdy);
|
||||
pi->precno=prci+prcj*res->pw;
|
||||
for (pi->layno=0; pi->layno<pi->poc.layno1; pi->layno++) {
|
||||
if (!pi->include[pi->layno][pi->resno][pi->compno][pi->precno])
|
||||
{
|
||||
pi->include[pi->layno][pi->resno][pi->compno][pi->precno]=1;
|
||||
return 1;
|
||||
}
|
||||
skip: ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get next packet in component-precinct-resolution-layer order.
|
||||
/// </summary>
|
||||
int pi_next_cprl(pi_iterator_t *pi) {
|
||||
pi_comp_t *comp;
|
||||
pi_resolution_t *res;
|
||||
if (!pi->first) {
|
||||
comp=&pi->comps[pi->compno];
|
||||
goto skip;
|
||||
} else {
|
||||
pi->first=0;
|
||||
}
|
||||
for (pi->compno=pi->poc.compno0; pi->compno<pi->poc.compno1; pi->compno++) {
|
||||
int resno;
|
||||
comp=&pi->comps[pi->compno];
|
||||
pi->dx=0;
|
||||
pi->dy=0;
|
||||
for (resno=0; resno<comp->numresolutions; resno++) {
|
||||
int dx, dy;
|
||||
res=&comp->resolutions[resno];
|
||||
dx=comp->dx*(1<<(res->pdx+comp->numresolutions-1-resno));
|
||||
dy=comp->dy*(1<<(res->pdy+comp->numresolutions-1-resno));
|
||||
pi->dx=!pi->dx?dx:int_min(pi->dx, dx);
|
||||
pi->dy=!pi->dy?dy:int_min(pi->dy, dy);
|
||||
}
|
||||
for (pi->y=pi->ty0; pi->y<pi->ty1; pi->y+=pi->dy-(pi->y%pi->dy)) {
|
||||
for (pi->x=pi->tx0; pi->x<pi->tx1; pi->x+=pi->dx-(pi->x%pi->dx)) {
|
||||
for (pi->resno=pi->poc.resno0; pi->resno<int_min(pi->poc.resno1, comp->numresolutions); pi->resno++) {
|
||||
int levelno;
|
||||
int trx0, try0;
|
||||
int rpx, rpy;
|
||||
int prci, prcj;
|
||||
res=&comp->resolutions[pi->resno];
|
||||
levelno=comp->numresolutions-1-pi->resno;
|
||||
trx0=int_ceildiv(pi->tx0, comp->dx<<levelno);
|
||||
try0=int_ceildiv(pi->ty0, comp->dy<<levelno);
|
||||
rpx=res->pdx+levelno;
|
||||
rpy=res->pdy+levelno;
|
||||
if (!(pi->x%(comp->dx<<rpx)==0||(pi->x==pi->tx0&&(trx0<<levelno)%(1<<rpx)))) {
|
||||
continue;
|
||||
}
|
||||
if (!(pi->y%(comp->dy<<rpy)==0||(pi->y==pi->ty0&&(try0<<levelno)%(1<<rpx)))) {
|
||||
continue;
|
||||
}
|
||||
prci=int_floordivpow2(int_ceildiv(pi->x, comp->dx<<levelno), res->pdx)-int_floordivpow2(trx0, res->pdx);
|
||||
prcj=int_floordivpow2(int_ceildiv(pi->y, comp->dy<<levelno), res->pdy)-int_floordivpow2(try0, res->pdy);
|
||||
pi->precno=prci+prcj*res->pw;
|
||||
for (pi->layno=0; pi->layno<pi->poc.layno1; pi->layno++) {
|
||||
if (!pi->include[pi->layno][pi->resno][pi->compno][pi->precno])
|
||||
{
|
||||
pi->include[pi->layno][pi->resno][pi->compno][pi->precno]=1;
|
||||
return 1;
|
||||
}
|
||||
skip: ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get next packet.
|
||||
/// </summary>
|
||||
int pi_next(pi_iterator_t *pi) {
|
||||
switch (pi->poc.prg) {
|
||||
case 0:
|
||||
return pi_next_lrcp(pi);
|
||||
case 1:
|
||||
return pi_next_rlcp(pi);
|
||||
case 2:
|
||||
return pi_next_rpcl(pi);
|
||||
case 3:
|
||||
return pi_next_pcrl(pi);
|
||||
case 4:
|
||||
return pi_next_cprl(pi);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -1,254 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2002, David Janssens
|
||||
* Copyright (c) 2003, Yannick Verschueren
|
||||
* Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
||||
* 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 "t2.h"
|
||||
#include "tcd.h"
|
||||
#include "bio.h"
|
||||
#include "j2k.h"
|
||||
#include "pi.h"
|
||||
#include "tgt.h"
|
||||
#include "int.h"
|
||||
#include "cio.h"
|
||||
#include <stdio.h>
|
||||
#include <setjmp.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define RESTART 0x04
|
||||
|
||||
extern jmp_buf j2k_error;
|
||||
|
||||
int t2_getcommacode() {
|
||||
int n;
|
||||
for (n=0; bio_read(1); n++) {}
|
||||
return n;
|
||||
}
|
||||
|
||||
int t2_getnumpasses()
|
||||
{
|
||||
int n;
|
||||
if (!bio_read(1)) return 1;
|
||||
if (!bio_read(1)) return 2;
|
||||
if ((n=bio_read(2))!=3) return 3+n;
|
||||
if ((n=bio_read(5))!=31) return 6+n;
|
||||
return 37+bio_read(7);
|
||||
}
|
||||
|
||||
void t2_init_seg(tcd_seg_t *seg, int cblksty) {
|
||||
seg->numpasses=0;
|
||||
seg->len=0;
|
||||
seg->maxpasses=cblksty&J2K_CCP_CBLKSTY_TERMALL?1:100;
|
||||
}
|
||||
|
||||
int t2_decode_packet(unsigned char *src, int len, tcd_tile_t *tile, j2k_tcp_t *tcp, int compno, int resno, int precno, int layno, info_layer_t *layer_Idx) {
|
||||
int bandno, cblkno;
|
||||
tcd_tilecomp_t *tilec=&tile->comps[compno];
|
||||
tcd_resolution_t *res=&tilec->resolutions[resno];
|
||||
unsigned char *c=src;
|
||||
unsigned char *d=c;
|
||||
int e;
|
||||
int present;
|
||||
|
||||
if (layno==0) {
|
||||
for (bandno=0; bandno<res->numbands; bandno++) {
|
||||
tcd_band_t *band=&res->bands[bandno];
|
||||
tcd_precinct_t *prc=&band->precincts[precno];
|
||||
tgt_reset(prc->incltree);
|
||||
tgt_reset(prc->imsbtree);
|
||||
for (cblkno=0; cblkno<prc->cw*prc->ch; cblkno++) {
|
||||
tcd_cblk_t *cblk=&prc->cblks[cblkno];
|
||||
cblk->numsegs=0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (tcp->csty&J2K_CP_CSTY_SOP) {
|
||||
c+=6;
|
||||
}
|
||||
bio_init_dec(c, src+len-c);
|
||||
present=bio_read(1);
|
||||
if (!present) {
|
||||
bio_inalign();
|
||||
c+=bio_numbytes();
|
||||
return c-src;
|
||||
}
|
||||
for (bandno=0; bandno<res->numbands; bandno++) {
|
||||
tcd_band_t *band=&res->bands[bandno];
|
||||
tcd_precinct_t *prc=&band->precincts[precno];
|
||||
for (cblkno=0; cblkno<prc->cw*prc->ch; cblkno++) {
|
||||
int included, increment, n;
|
||||
tcd_cblk_t *cblk=&prc->cblks[cblkno];
|
||||
tcd_seg_t *seg;
|
||||
if (!cblk->numsegs) {
|
||||
included=tgt_decode(prc->incltree, cblkno, layno+1);
|
||||
} else {
|
||||
included=bio_read(1);
|
||||
}
|
||||
if (!included) {
|
||||
cblk->numnewpasses=0;
|
||||
continue;
|
||||
}
|
||||
if (!cblk->numsegs) {
|
||||
int i, numimsbs;
|
||||
for (i=0; !tgt_decode(prc->imsbtree, cblkno, i); i++) {}
|
||||
numimsbs=i-1;
|
||||
cblk->numbps=band->numbps-numimsbs;
|
||||
cblk->numlenbits=3;
|
||||
}
|
||||
cblk->numnewpasses=t2_getnumpasses();
|
||||
increment=t2_getcommacode();
|
||||
cblk->numlenbits+=increment;
|
||||
if (!cblk->numsegs) {
|
||||
seg=&cblk->segs[0];
|
||||
t2_init_seg(seg, tcp->tccps[compno].cblksty);
|
||||
} else {
|
||||
seg=&cblk->segs[cblk->numsegs-1];
|
||||
if (seg->numpasses==seg->maxpasses) {
|
||||
t2_init_seg(++seg, tcp->tccps[compno].cblksty);
|
||||
}
|
||||
}
|
||||
n=cblk->numnewpasses;
|
||||
do {
|
||||
seg->numnewpasses=int_min(seg->maxpasses-seg->numpasses, n);
|
||||
seg->newlen=bio_read(cblk->numlenbits+int_floorlog2(seg->numnewpasses));
|
||||
n-=seg->numnewpasses;
|
||||
if (n>0) {
|
||||
t2_init_seg(++seg, tcp->tccps[compno].cblksty);
|
||||
}
|
||||
} while (n>0);
|
||||
}
|
||||
}
|
||||
if(bio_inalign()) return -999;
|
||||
c+=bio_numbytes();
|
||||
if (tcp->csty&J2K_CP_CSTY_EPH) {
|
||||
c+=2;
|
||||
}
|
||||
|
||||
// INDEX
|
||||
layer_Idx->len_header=c-d;
|
||||
if (tcp->csty&J2K_CP_CSTY_SOP)
|
||||
layer_Idx->len_header-=6;
|
||||
// \INDEX --> END OF HEADER !!
|
||||
|
||||
for (bandno=0; bandno<res->numbands; bandno++) {
|
||||
tcd_band_t *band=&res->bands[bandno];
|
||||
tcd_precinct_t *prc=&band->precincts[precno];
|
||||
for (cblkno=0; cblkno<prc->cw*prc->ch; cblkno++) {
|
||||
tcd_cblk_t *cblk=&prc->cblks[cblkno];
|
||||
tcd_seg_t *seg;
|
||||
if (!cblk->numnewpasses) continue;
|
||||
if (!cblk->numsegs) {
|
||||
seg=&cblk->segs[cblk->numsegs++];
|
||||
cblk->len=0;
|
||||
} else {
|
||||
seg=&cblk->segs[cblk->numsegs-1];
|
||||
if (seg->numpasses==seg->maxpasses) {
|
||||
seg++;
|
||||
cblk->numsegs++;
|
||||
}
|
||||
}
|
||||
do {
|
||||
if (c+seg->newlen>src+len) return -999;
|
||||
memcpy(cblk->data+cblk->len, c, seg->newlen);
|
||||
if (seg->numpasses==0) {
|
||||
seg->data=cblk->data+cblk->len;
|
||||
}
|
||||
c+=seg->newlen;
|
||||
cblk->len+=seg->newlen;
|
||||
seg->len+=seg->newlen;
|
||||
seg->numpasses+=seg->numnewpasses;
|
||||
cblk->numnewpasses-=seg->numnewpasses;
|
||||
if (cblk->numnewpasses>0) {
|
||||
seg++;
|
||||
cblk->numsegs++;
|
||||
}
|
||||
} while (cblk->numnewpasses>0);
|
||||
}
|
||||
}
|
||||
//<INDEX>
|
||||
e=c-d;
|
||||
layer_Idx->len=e;
|
||||
//</INDEX>
|
||||
|
||||
return c-src;
|
||||
}
|
||||
|
||||
int t2_decode_packets(unsigned char *src, int len, j2k_image_t *img, j2k_cp_t *cp, int tileno, tcd_tile_t *tile, info_image_t *imgg) {
|
||||
unsigned char *c=src;
|
||||
pi_iterator_t *pi;
|
||||
int pino, compno,e;
|
||||
int position=imgg->tile[tileno].end_header+1;
|
||||
info_tile_t *tile_Idx;
|
||||
info_compo_t *compo_Idx;
|
||||
info_reso_t *reso_Idx;
|
||||
info_prec_t *prec_Idx;
|
||||
info_layer_t *layer_Idx;
|
||||
|
||||
tile_Idx=&imgg->tile[tileno];
|
||||
tile_Idx->num_packet=0;
|
||||
pi=pi_create(img, cp, tileno);
|
||||
|
||||
for (pino=0; pino<=cp->tcps[tileno].numpocs;pino++)
|
||||
{
|
||||
|
||||
while (pi_next(&pi[pino])) {
|
||||
compo_Idx=&tile_Idx->compo[pi[pino].compno];
|
||||
reso_Idx=&compo_Idx->reso[pi[pino].resno];
|
||||
prec_Idx=&reso_Idx->prec[pi[pino].precno];
|
||||
layer_Idx=&prec_Idx->layer[pi[pino].layno];
|
||||
|
||||
layer_Idx->offset=position;
|
||||
|
||||
e=t2_decode_packet(c, src+len-c, tile, &cp->tcps[tileno], pi[pino].compno, pi[pino].resno, pi[pino].precno, pi[pino].layno,layer_Idx);
|
||||
|
||||
if (e==-999)
|
||||
{
|
||||
break;
|
||||
} else
|
||||
c+=e;
|
||||
position+=e;
|
||||
tile_Idx->num_packet++;
|
||||
}
|
||||
|
||||
// FREE space memory taken by pi
|
||||
for (compno=0; compno<pi[pino].numcomps; compno++)
|
||||
{
|
||||
free(pi[pino].comps[compno].resolutions);
|
||||
}
|
||||
free(pi[pino].comps);
|
||||
}
|
||||
free(pi);
|
||||
|
||||
if (e==-999)
|
||||
return e;
|
||||
else
|
||||
{
|
||||
imgg->num_packet_max=int_max(imgg->num_packet_max,tile_Idx->num_packet);
|
||||
return c-src;
|
||||
}
|
||||
}
|
||||
@@ -1,292 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2002, David Janssens
|
||||
* Copyright (c) 2003, Yannick Verschueren
|
||||
* Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
||||
* 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 "tcd.h"
|
||||
#include "int.h"
|
||||
#include "t2.h"
|
||||
#include <setjmp.h>
|
||||
#include <float.h>
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
#include <math.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
static tcd_image_t tcd_image;
|
||||
|
||||
static j2k_image_t *tcd_img;
|
||||
static j2k_cp_t *tcd_cp;
|
||||
|
||||
static tcd_tile_t *tcd_tile;
|
||||
static j2k_tcp_t *tcd_tcp;
|
||||
static int tcd_tileno;
|
||||
|
||||
extern jmp_buf j2k_error;
|
||||
|
||||
void tcd_init(j2k_image_t *img, j2k_cp_t *cp, info_image_t *imgg) {
|
||||
int tileno, compno, resno, bandno, precno, cblkno;
|
||||
tcd_img=img;
|
||||
tcd_cp=cp;
|
||||
tcd_image.tw=cp->tw;
|
||||
tcd_image.th=cp->th;
|
||||
tcd_image.tiles=(tcd_tile_t*)malloc(cp->tw*cp->th*sizeof(tcd_tile_t));
|
||||
for (tileno=0; tileno<cp->tw*cp->th; tileno++) {
|
||||
j2k_tcp_t *tcp=&cp->tcps[tileno];
|
||||
tcd_tile_t *tile=&tcd_image.tiles[tileno];
|
||||
// cfr p59 ISO/IEC FDIS15444-1 : 2000 (18 august 2000)
|
||||
int p=tileno%cp->tw; // si numerotation matricielle ..
|
||||
int q=tileno/cp->tw; // .. coordonnees de la tile (q,p) q pour ligne et p pour colonne
|
||||
info_tile_t *tile_Idx=&imgg->tile[tileno]; // INDEX
|
||||
|
||||
// 4 borders of the tile rescale on the image if necessary
|
||||
tile->x0=int_max(cp->tx0+p*cp->tdx, img->x0);
|
||||
tile->y0=int_max(cp->ty0+q*cp->tdy, img->y0);
|
||||
tile->x1=int_min(cp->tx0+(p+1)*cp->tdx, img->x1);
|
||||
tile->y1=int_min(cp->ty0+(q+1)*cp->tdy, img->y1);
|
||||
|
||||
tile->numcomps=img->numcomps;
|
||||
tile->comps=(tcd_tilecomp_t*)malloc(img->numcomps*sizeof(tcd_tilecomp_t));
|
||||
tile_Idx->compo=(info_compo_t*)malloc(img->numcomps*sizeof(info_compo_t)); // INDEX
|
||||
for (compno=0; compno<tile->numcomps; compno++) {
|
||||
j2k_tccp_t *tccp=&tcp->tccps[compno];
|
||||
tcd_tilecomp_t *tilec=&tile->comps[compno];
|
||||
info_compo_t *compo_Idx=&tile_Idx->compo[compno]; // INDEX
|
||||
|
||||
// border of each tile component (global)
|
||||
tilec->x0=int_ceildiv(tile->x0, img->comps[compno].dx);
|
||||
tilec->y0=int_ceildiv(tile->y0, img->comps[compno].dy);
|
||||
tilec->x1=int_ceildiv(tile->x1, img->comps[compno].dx);
|
||||
tilec->y1=int_ceildiv(tile->y1, img->comps[compno].dy);
|
||||
|
||||
tilec->data=(int*)malloc(sizeof(int)*(tilec->x1-tilec->x0)*(tilec->y1-tilec->y0));
|
||||
tilec->numresolutions=tccp->numresolutions;
|
||||
tilec->resolutions=(tcd_resolution_t*)malloc(tilec->numresolutions*sizeof(tcd_resolution_t));
|
||||
compo_Idx->reso=(info_reso_t*)malloc(tilec->numresolutions*sizeof(info_reso_t)); // INDEX
|
||||
for (resno=0; resno<tilec->numresolutions; resno++) {
|
||||
int pdx, pdy;
|
||||
int levelno=tilec->numresolutions-1-resno;
|
||||
int tlprcxstart, tlprcystart, brprcxend, brprcyend;
|
||||
int tlcbgxstart, tlcbgystart, brcbgxend, brcbgyend;
|
||||
int cbgwidthexpn, cbgheightexpn;
|
||||
int cblkwidthexpn, cblkheightexpn;
|
||||
tcd_resolution_t *res=&tilec->resolutions[resno];
|
||||
info_reso_t *res_Idx=&compo_Idx->reso[resno]; // INDEX
|
||||
int precno_Idx; // INDEX
|
||||
|
||||
// border for each resolution level (global)
|
||||
res->x0=int_ceildivpow2(tilec->x0, levelno);
|
||||
res->y0=int_ceildivpow2(tilec->y0, levelno);
|
||||
res->x1=int_ceildivpow2(tilec->x1, levelno);
|
||||
res->y1=int_ceildivpow2(tilec->y1, levelno);
|
||||
|
||||
res->numbands=resno==0?1:3;
|
||||
// p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000)
|
||||
if (tccp->csty&J2K_CCP_CSTY_PRT) {
|
||||
pdx=tccp->prcw[resno];
|
||||
pdy=tccp->prch[resno];
|
||||
} else {
|
||||
pdx=15;
|
||||
pdy=15;
|
||||
}
|
||||
// p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000)
|
||||
tlprcxstart=int_floordivpow2(res->x0, pdx)<<pdx;
|
||||
tlprcystart=int_floordivpow2(res->y0, pdy)<<pdy;
|
||||
brprcxend=int_ceildivpow2(res->x1, pdx)<<pdx;
|
||||
brprcyend=int_ceildivpow2(res->y1, pdy)<<pdy;
|
||||
res->pw=(brprcxend-tlprcxstart)>>pdx;
|
||||
res->ph=(brprcyend-tlprcystart)>>pdy;
|
||||
|
||||
// <INDEX>
|
||||
imgg->tile[tileno].pw=res->pw;
|
||||
imgg->tile[tileno].ph=res->ph;
|
||||
|
||||
res_Idx->prec=(info_prec_t*)malloc(res->pw*res->ph*sizeof(info_prec_t));
|
||||
for (precno_Idx=0;precno_Idx<res->pw*res->ph;precno_Idx++)
|
||||
{
|
||||
info_prec_t *prec_Idx = &res_Idx->prec[precno_Idx];
|
||||
prec_Idx->layer=(info_layer_t*)malloc(imgg->Layer*sizeof(info_layer_t));
|
||||
}
|
||||
|
||||
imgg->pw=res->pw; // old parser version
|
||||
imgg->ph=res->ph; // old parser version
|
||||
imgg->pdx=1<<pdx;
|
||||
imgg->pdy=1<<pdy;
|
||||
// </INDEX>
|
||||
|
||||
if (resno==0) {
|
||||
tlcbgxstart=tlprcxstart;
|
||||
tlcbgystart=tlprcystart;
|
||||
brcbgxend=brprcxend;
|
||||
brcbgyend=brprcyend;
|
||||
cbgwidthexpn=pdx;
|
||||
cbgheightexpn=pdy;
|
||||
} else {
|
||||
tlcbgxstart=int_ceildivpow2(tlprcxstart, 1);
|
||||
tlcbgystart=int_ceildivpow2(tlprcystart, 1);
|
||||
brcbgxend=int_ceildivpow2(brprcxend, 1);
|
||||
brcbgyend=int_ceildivpow2(brprcyend, 1);
|
||||
cbgwidthexpn=pdx-1;
|
||||
cbgheightexpn=pdy-1;
|
||||
}
|
||||
|
||||
cblkwidthexpn=int_min(tccp->cblkw, cbgwidthexpn);
|
||||
cblkheightexpn=int_min(tccp->cblkh, cbgheightexpn);
|
||||
|
||||
for (bandno=0; bandno<res->numbands; bandno++) {
|
||||
int x0b, y0b;
|
||||
tcd_band_t *band=&res->bands[bandno];
|
||||
band->bandno=resno==0?0:bandno+1;
|
||||
x0b=(band->bandno==1)||(band->bandno==3)?1:0;
|
||||
y0b=(band->bandno==2)||(band->bandno==3)?1:0;
|
||||
|
||||
if (band->bandno==0) {
|
||||
// band border (global)
|
||||
band->x0=int_ceildivpow2(tilec->x0, levelno);
|
||||
band->y0=int_ceildivpow2(tilec->y0, levelno);
|
||||
band->x1=int_ceildivpow2(tilec->x1, levelno);
|
||||
band->y1=int_ceildivpow2(tilec->y1, levelno);
|
||||
} else {
|
||||
// band border (global)
|
||||
band->x0=int_ceildivpow2(tilec->x0-(1<<levelno)*x0b, levelno+1);
|
||||
band->y0=int_ceildivpow2(tilec->y0-(1<<levelno)*y0b, levelno+1);
|
||||
band->x1=int_ceildivpow2(tilec->x1-(1<<levelno)*x0b, levelno+1);
|
||||
band->y1=int_ceildivpow2(tilec->y1-(1<<levelno)*y0b, levelno+1);
|
||||
}
|
||||
|
||||
band->precincts=(tcd_precinct_t*)malloc(res->pw*res->ph*sizeof(tcd_precinct_t));
|
||||
|
||||
for (precno=0; precno<res->pw*res->ph; precno++) {
|
||||
int tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend;
|
||||
int cbgxstart=tlcbgxstart+(precno%res->pw)*(1<<cbgwidthexpn);
|
||||
int cbgystart=tlcbgystart+(precno/res->pw)*(1<<cbgheightexpn);
|
||||
int cbgxend=cbgxstart+(1<<cbgwidthexpn);
|
||||
int cbgyend=cbgystart+(1<<cbgheightexpn);
|
||||
tcd_precinct_t *prc=&band->precincts[precno];
|
||||
// precinct size (global)
|
||||
prc->x0=int_max(cbgxstart, band->x0);
|
||||
prc->y0=int_max(cbgystart, band->y0);
|
||||
prc->x1=int_min(cbgxend, band->x1);
|
||||
prc->y1=int_min(cbgyend, band->y1);
|
||||
|
||||
tlcblkxstart=int_floordivpow2(prc->x0, cblkwidthexpn)<<cblkwidthexpn;
|
||||
tlcblkystart=int_floordivpow2(prc->y0, cblkheightexpn)<<cblkheightexpn;
|
||||
brcblkxend=int_ceildivpow2(prc->x1, cblkwidthexpn)<<cblkwidthexpn;
|
||||
brcblkyend=int_ceildivpow2(prc->y1, cblkheightexpn)<<cblkheightexpn;
|
||||
prc->cw=(brcblkxend-tlcblkxstart)>>cblkwidthexpn;
|
||||
prc->ch=(brcblkyend-tlcblkystart)>>cblkheightexpn;
|
||||
|
||||
prc->cblks=(tcd_cblk_t*)malloc(prc->cw*prc->ch*sizeof(tcd_cblk_t));
|
||||
|
||||
prc->incltree=tgt_create(prc->cw, prc->ch);
|
||||
prc->imsbtree=tgt_create(prc->cw, prc->ch);
|
||||
|
||||
for (cblkno=0; cblkno<prc->cw*prc->ch; cblkno++) {
|
||||
int cblkxstart=tlcblkxstart+(cblkno%prc->cw)*(1<<cblkwidthexpn);
|
||||
int cblkystart=tlcblkystart+(cblkno/prc->cw)*(1<<cblkheightexpn);
|
||||
int cblkxend=cblkxstart+(1<<cblkwidthexpn);
|
||||
int cblkyend=cblkystart+(1<<cblkheightexpn);
|
||||
tcd_cblk_t *cblk=&prc->cblks[cblkno];
|
||||
// code-block size (global)
|
||||
cblk->x0=int_max(cblkxstart, prc->x0);
|
||||
cblk->y0=int_max(cblkystart, prc->y0);
|
||||
cblk->x1=int_min(cblkxend, prc->x1);
|
||||
cblk->y1=int_min(cblkyend, prc->y1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void tcd_free(j2k_image_t *img, j2k_cp_t *cp) {
|
||||
int tileno, compno, resno, bandno, precno;
|
||||
tcd_img=img;
|
||||
tcd_cp=cp;
|
||||
tcd_image.tw=cp->tw;
|
||||
tcd_image.th=cp->th;
|
||||
for (tileno=0; tileno<tcd_image.tw*tcd_image.th; tileno++)
|
||||
{
|
||||
// j2k_tcp_t *tcp=&cp->tcps[curtileno];
|
||||
tcd_tile_t *tile=&tcd_image.tiles[tileno];
|
||||
for (compno=0; compno<tile->numcomps; compno++)
|
||||
{
|
||||
tcd_tilecomp_t *tilec=&tile->comps[compno];
|
||||
for (resno=0; resno<tilec->numresolutions; resno++)
|
||||
{
|
||||
tcd_resolution_t *res=&tilec->resolutions[resno];
|
||||
for (bandno=0; bandno<res->numbands; bandno++)
|
||||
{
|
||||
tcd_band_t *band=&res->bands[bandno];
|
||||
for (precno=0; precno<res->pw*res->ph; precno++)
|
||||
{
|
||||
tcd_precinct_t *prc=&band->precincts[precno];
|
||||
|
||||
if (prc->incltree!=NULL)
|
||||
tgt_destroy(prc->incltree);
|
||||
if (prc->imsbtree!=NULL)
|
||||
tgt_destroy(prc->imsbtree);
|
||||
free(prc->cblks);
|
||||
} // for (precno
|
||||
free(band->precincts);
|
||||
} // for (bandno
|
||||
} // for (resno
|
||||
free(tilec->resolutions);
|
||||
} // for (compno
|
||||
free(tile->comps);
|
||||
} // for (tileno
|
||||
free(tcd_image.tiles);
|
||||
}
|
||||
|
||||
|
||||
int tcd_decode_tile(unsigned char *src, int len, int tileno, info_image_t *imgg) {
|
||||
int l;
|
||||
int eof=0;
|
||||
|
||||
tcd_tile_t *tile;
|
||||
tcd_tileno=tileno;
|
||||
tcd_tile=&tcd_image.tiles[tileno];
|
||||
tcd_tcp=&tcd_cp->tcps[tileno];
|
||||
tile=tcd_tile;
|
||||
|
||||
l=t2_decode_packets(src, len, tcd_img, tcd_cp, tileno, tile, imgg);
|
||||
|
||||
if (l==-999)
|
||||
{
|
||||
eof=1;
|
||||
fprintf(stderr, "tcd_decode: incomplete bistream\n");
|
||||
}
|
||||
|
||||
if (eof) {
|
||||
longjmp(j2k_error, 1);
|
||||
}
|
||||
|
||||
l=1;
|
||||
return l;
|
||||
}
|
||||
@@ -1,137 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2002, David Janssens
|
||||
* Copyright (c) 2003, Yannick Verschueren
|
||||
* Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef __TCD_H
|
||||
#define __TCD_H
|
||||
|
||||
#include "j2k.h"
|
||||
#include "tgt.h"
|
||||
|
||||
typedef struct {
|
||||
int numpasses;
|
||||
int len;
|
||||
unsigned char *data;
|
||||
int maxpasses;
|
||||
int numnewpasses;
|
||||
int newlen;
|
||||
} tcd_seg_t;
|
||||
|
||||
typedef struct {
|
||||
int rate;
|
||||
double distortiondec;
|
||||
} tcd_pass_t;
|
||||
|
||||
typedef struct {
|
||||
int numpasses;
|
||||
int len;
|
||||
unsigned char *data;
|
||||
} tcd_layer_t;
|
||||
|
||||
typedef struct {
|
||||
int x0, y0, x1, y1;
|
||||
int numbps;
|
||||
int numlenbits;
|
||||
int len;
|
||||
int numpasses;
|
||||
int numnewpasses;
|
||||
int numsegs;
|
||||
tcd_seg_t segs[100];
|
||||
unsigned char data[8192];
|
||||
int numpassesinlayers;
|
||||
tcd_layer_t layers[100];
|
||||
int totalpasses;
|
||||
tcd_pass_t passes[100];
|
||||
} tcd_cblk_t;
|
||||
|
||||
typedef struct {
|
||||
int x0, y0, x1, y1;
|
||||
int cw, ch;
|
||||
tcd_cblk_t *cblks;
|
||||
tgt_tree_t *incltree;
|
||||
tgt_tree_t *imsbtree;
|
||||
} tcd_precinct_t;
|
||||
|
||||
typedef struct {
|
||||
int x0, y0, x1, y1;
|
||||
int bandno;
|
||||
tcd_precinct_t *precincts;
|
||||
int numbps;
|
||||
int stepsize;
|
||||
} tcd_band_t;
|
||||
|
||||
typedef struct {
|
||||
int x0, y0, x1, y1;
|
||||
int previous_x0, previous_y0, previous_x1, previous_y1; // usefull for the DWT
|
||||
int cas_col, cas_row; // usefull for the DWT
|
||||
int pw, ph;
|
||||
int numbands;
|
||||
tcd_band_t bands[3];
|
||||
} tcd_resolution_t;
|
||||
|
||||
typedef struct {
|
||||
int x0, y0, x1, y1;
|
||||
int previous_row, previous_col; // usefull for the DWT
|
||||
int numresolutions;
|
||||
tcd_resolution_t *resolutions;
|
||||
int *data;
|
||||
} tcd_tilecomp_t;
|
||||
|
||||
typedef struct {
|
||||
int x0, y0, x1, y1;
|
||||
int numcomps;
|
||||
//int PPT;
|
||||
//int len_ppt;
|
||||
tcd_tilecomp_t *comps;
|
||||
} tcd_tile_t;
|
||||
|
||||
typedef struct {
|
||||
int tw, th;
|
||||
tcd_tile_t *tiles;
|
||||
} tcd_image_t;
|
||||
|
||||
/*
|
||||
* Initialize the tile coder/decoder
|
||||
* img: raw image
|
||||
* cp: coding parameters
|
||||
* imgg: creation of index file
|
||||
*/
|
||||
|
||||
void tcd_init(j2k_image_t *img, j2k_cp_t *cp, info_image_t *imgg);
|
||||
|
||||
void tcd_free(j2k_image_t *img, j2k_cp_t *cp);
|
||||
|
||||
/*
|
||||
* Decode a tile from a buffer into a raw image
|
||||
* src: source buffer
|
||||
* len: length of the source buffer
|
||||
* tileno: number that identifies the tile that will be decoded
|
||||
* imgg : Structure for index file
|
||||
*/
|
||||
int tcd_decode_tile(unsigned char *src, int len, int tileno, info_image_t *imgg);
|
||||
|
||||
#endif
|
||||
@@ -1,170 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2002, David Janssens
|
||||
* Copyright (c) 2003, Yannick Verschueren
|
||||
* Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
||||
* 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 "tgt.h"
|
||||
#include "bio.h"
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
/// <summary>
|
||||
/// Reset tag-tree.
|
||||
/// </summary>
|
||||
void tgt_reset(tgt_tree_t *tree)
|
||||
{
|
||||
int i;
|
||||
for (i=0; i<tree->numnodes; i++) {
|
||||
tree->nodes[i].value=999;
|
||||
tree->nodes[i].low=0;
|
||||
tree->nodes[i].known=0;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create tag-tree.
|
||||
/// </summary>
|
||||
tgt_tree_t *tgt_create(int numleafsh, int numleafsv)
|
||||
{
|
||||
int nplh[32];
|
||||
int nplv[32];
|
||||
tgt_node_t *node;
|
||||
tgt_node_t *parentnode;
|
||||
tgt_node_t *parentnode0;
|
||||
tgt_tree_t *tree;
|
||||
int i, j, k;
|
||||
int numlvls;
|
||||
int n;
|
||||
|
||||
tree=(tgt_tree_t*)malloc(sizeof(tgt_tree_t));
|
||||
tree->numleafsh=numleafsh;
|
||||
tree->numleafsv=numleafsv;
|
||||
|
||||
numlvls=0;
|
||||
nplh[0]=numleafsh;
|
||||
nplv[0]=numleafsv;
|
||||
tree->numnodes=0;
|
||||
do {
|
||||
n=nplh[numlvls]*nplv[numlvls];
|
||||
nplh[numlvls+1]=(nplh[numlvls]+1)/2;
|
||||
nplv[numlvls+1]=(nplv[numlvls]+1)/2;
|
||||
tree->numnodes+=n;
|
||||
++numlvls;
|
||||
} while (n>1);
|
||||
|
||||
tree->nodes=(tgt_node_t*)malloc(tree->numnodes*sizeof(tgt_node_t));
|
||||
|
||||
node=tree->nodes;
|
||||
parentnode=&tree->nodes[tree->numleafsh*tree->numleafsv];
|
||||
parentnode0=parentnode;
|
||||
|
||||
for (i=0; i<numlvls-1; ++i) {
|
||||
for (j=0; j<nplv[i]; ++j) {
|
||||
k=nplh[i];
|
||||
while (--k>=0) {
|
||||
node->parent=parentnode;
|
||||
++node;
|
||||
if (--k >= 0) {
|
||||
node->parent=parentnode;
|
||||
++node;
|
||||
}
|
||||
++parentnode;
|
||||
}
|
||||
if ((j&1)||j==nplv[i]-1) {
|
||||
parentnode0=parentnode;
|
||||
} else {
|
||||
parentnode=parentnode0;
|
||||
parentnode0+=nplh[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
node->parent=0;
|
||||
|
||||
tgt_reset(tree);
|
||||
|
||||
return tree;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Destroy tag-tree.
|
||||
/// </summary>
|
||||
void tgt_destroy(tgt_tree_t *t) {
|
||||
free(t->nodes);
|
||||
free(t);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Set the value of a leaf of the tag-tree.
|
||||
/// </summary>
|
||||
void tgt_setvalue(tgt_tree_t *tree, int leafno, int value) {
|
||||
tgt_node_t *node;
|
||||
node=&tree->nodes[leafno];
|
||||
while (node && node->value>value) {
|
||||
node->value=value;
|
||||
node=node->parent;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Decode the value of a leaf of the tag-tree.
|
||||
/// </summary>
|
||||
int tgt_decode(tgt_tree_t *tree, int leafno, int threshold)
|
||||
{
|
||||
tgt_node_t *stk[31];
|
||||
tgt_node_t **stkptr;
|
||||
tgt_node_t *node;
|
||||
int low;
|
||||
|
||||
stkptr=stk;
|
||||
node=&tree->nodes[leafno];
|
||||
while (node->parent) {
|
||||
*stkptr++=node;
|
||||
node=node->parent;
|
||||
}
|
||||
|
||||
low=0;
|
||||
for (;;) {
|
||||
if (low>node->low) {
|
||||
node->low=low;
|
||||
} else {
|
||||
low=node->low;
|
||||
}
|
||||
while (low<threshold && low<node->value) {
|
||||
if (bio_read(1)) {
|
||||
node->value=low;
|
||||
} else {
|
||||
++low;
|
||||
}
|
||||
}
|
||||
node->low=low;
|
||||
if (stkptr==stk) {
|
||||
break;
|
||||
}
|
||||
node=*--stkptr;
|
||||
}
|
||||
|
||||
return (node->value<threshold)?1:0;
|
||||
}
|
||||
@@ -1,80 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2002, David Janssens
|
||||
* Copyright (c) 2003, Yannick Verschueren
|
||||
* Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef __TGT_H
|
||||
#define __TGT_H
|
||||
|
||||
typedef struct tgt_node {
|
||||
struct tgt_node *parent;
|
||||
int value;
|
||||
int low;
|
||||
int known;
|
||||
} tgt_node_t;
|
||||
|
||||
typedef struct {
|
||||
int numleafsh;
|
||||
int numleafsv;
|
||||
int numnodes;
|
||||
tgt_node_t *nodes;
|
||||
} tgt_tree_t;
|
||||
|
||||
/*
|
||||
* Create a tag-tree
|
||||
* numleafsh: width of the array of leafs of the tree
|
||||
* numleafsv: height of the array of leafs of the tree
|
||||
*/
|
||||
tgt_tree_t *tgt_create(int numleafsh, int numleafsv);
|
||||
|
||||
/*
|
||||
* Reset a tag-tree (set all leafs to 0)
|
||||
* tree: tag-tree to reset
|
||||
*/
|
||||
void tgt_reset(tgt_tree_t *tree);
|
||||
|
||||
/*
|
||||
* Destroy a tag-tree, liberating memory
|
||||
* tree: tag-tree to destroy
|
||||
*/
|
||||
void tgt_destroy(tgt_tree_t *tree);
|
||||
|
||||
/*
|
||||
* Set the value of a leaf of a tag-tree
|
||||
* tree: tag-tree to modify
|
||||
* leafno: number that identifies the leaf to modify
|
||||
* value: new value of the leaf
|
||||
*/
|
||||
void tgt_setvalue(tgt_tree_t *tree, int leafno, int value);
|
||||
|
||||
/*
|
||||
* Decode the value of a leaf of the tag-tree up to a given threshold
|
||||
* leafno: number that identifies the leaf to decode
|
||||
* threshold: threshold to use when decoding value of the leaf
|
||||
*/
|
||||
int tgt_decode(tgt_tree_t *tree, int leafno, int threshold);
|
||||
|
||||
#endif
|
||||
@@ -1,6 +0,0 @@
|
||||
obj
|
||||
obj.w32
|
||||
bin
|
||||
bin.w32
|
||||
lib
|
||||
lib.w32
|
||||
@@ -1,67 +0,0 @@
|
||||
# $Id$
|
||||
#
|
||||
# makefile for OpenJPEG library
|
||||
|
||||
CFLAGS = -Wall -O3 -fno-strength-reduce -fomit-frame-pointer
|
||||
|
||||
ifndef DEBUG
|
||||
LDFLAGS = -s -lm
|
||||
else
|
||||
LDFLAGS = -lm
|
||||
endif
|
||||
|
||||
OBJ_DIR_W32 = obj.w32
|
||||
LIB_DIR_W32 = lib.w32
|
||||
|
||||
ifdef MINGW32
|
||||
CC = i386-mingw32-gcc
|
||||
AR = i386-mingw32-ar
|
||||
OBJ_DIR = $(OBJ_DIR_W32)
|
||||
LIB_DIR = $(LIB_DIR_W32)
|
||||
all: $(LIB_DIR)/libopenjpeg.a $(LIB_DIR)/libopenjpeg.dll
|
||||
else
|
||||
CC = gcc
|
||||
AR = ar
|
||||
OBJ_DIR = obj
|
||||
LIB_DIR = lib
|
||||
all: $(LIB_DIR)/libopenjpeg.a $(LIB_DIR)/libopenjpeg.so
|
||||
endif
|
||||
|
||||
$(OBJ_DIR)/%.o:
|
||||
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
|
||||
|
||||
$(OBJ_DIR)/bio.o: bio.c bio.h
|
||||
$(OBJ_DIR)/cio.o: cio.c cio.h
|
||||
$(OBJ_DIR)/dwt.o: dwt.c dwt.h int.h fix.h tcd.h
|
||||
$(OBJ_DIR)/fix.o: fix.c fix.h
|
||||
$(OBJ_DIR)/int.o: int.c
|
||||
$(OBJ_DIR)/j2k.o: j2k.c j2k.h cio.h tcd.h dwt.h int.h
|
||||
$(OBJ_DIR)/mct.o: mct.c mct.h fix.h
|
||||
$(OBJ_DIR)/mqc.o: mqc.c mqc.h
|
||||
$(OBJ_DIR)/pi.o: pi.c pi.h int.h
|
||||
$(OBJ_DIR)/raw.o: raw.c raw.h
|
||||
$(OBJ_DIR)/t1.o: t1.c t1.h j2k.h mqc.h raw.h int.h mct.h dwt.h fix.h
|
||||
$(OBJ_DIR)/t2.o: t2.c t2.h tcd.h bio.h j2k.h pi.h tgt.h int.h cio.h
|
||||
$(OBJ_DIR)/tcd.o: tcd.c tcd.h int.h t1.h t2.h dwt.h mct.h
|
||||
$(OBJ_DIR)/tgt.o: tgt.c tgt.h bio.h
|
||||
|
||||
COM_OBJS = $(addprefix $(OBJ_DIR)/, j2k.o bio.o cio.o dwt.o fix.o int.o mct.o \
|
||||
mqc.o pi.o t1.o t2.o tgt.o tcd.o raw.o)
|
||||
|
||||
$(LIB_DIR)/libopenjpeg.a: ${COM_OBJS}
|
||||
$(AR) -sr $@ $^
|
||||
|
||||
$(LIB_DIR)/libopenjpeg.dll: ${COM_OBJS}
|
||||
${CC} -s -shared -Wl,-soname,libopenjpeg.dll -o $@ $^
|
||||
|
||||
$(LIB_DIR)/libopenjpeg.so.1.0: ${COM_OBJS}
|
||||
${CC} -s -shared -Wl,-soname,libopenjpeg.so.1 -o $@ $^
|
||||
|
||||
$(LIB_DIR)/libopenjpeg.so.1: $(LIB_DIR)/libopenjpeg.so.1.0
|
||||
ln -s libopenjpeg.so.1.0 $(LIB_DIR)/libopenjpeg.so.1
|
||||
|
||||
$(LIB_DIR)/libopenjpeg.so: $(LIB_DIR)/libopenjpeg.so.1
|
||||
ln -s libopenjpeg.so.1 $(LIB_DIR)/libopenjpeg.so
|
||||
|
||||
clean:
|
||||
rm -f $(OBJ_DIR_W32)/* $(OBJ_DIR)/* $(LIB_DIR_W32)/* $(LIB_DIR)/*
|
||||
@@ -1,182 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2002, David Janssens
|
||||
* Copyright (c) 2003, Yannick Verschueren
|
||||
* Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
||||
*
|
||||
* 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 "bio.h"
|
||||
#include <stdio.h>
|
||||
#include <setjmp.h>
|
||||
|
||||
static unsigned char *bio_start, *bio_end, *bio_bp;
|
||||
static unsigned int bio_buf;
|
||||
static int bio_ct;
|
||||
|
||||
extern jmp_buf j2k_error;
|
||||
|
||||
/* <summary> */
|
||||
/* Number of bytes written. */
|
||||
/* </summary> */
|
||||
int bio_numbytes()
|
||||
{
|
||||
return bio_bp - bio_start;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Init encoder. */
|
||||
/* </summary> */
|
||||
/* <param name="bp">Output buffer</param> */
|
||||
/* <param name="len">Output buffer length</param> */
|
||||
void bio_init_enc(unsigned char *bp, int len)
|
||||
{
|
||||
bio_start = bp;
|
||||
bio_end = bp + len;
|
||||
bio_bp = bp;
|
||||
bio_buf = 0;
|
||||
bio_ct = 8;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Init decoder. */
|
||||
/* </summary> */
|
||||
/* <param name="bp">Input buffer</param> */
|
||||
/* <param name="len">Input buffer length</param> */
|
||||
void bio_init_dec(unsigned char *bp, int len)
|
||||
{
|
||||
bio_start = bp;
|
||||
bio_end = bp + len;
|
||||
bio_bp = bp;
|
||||
bio_buf = 0;
|
||||
bio_ct = 0;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Write byte. --> function modified to eliminate longjmp !!! */
|
||||
/* </summary> */
|
||||
int bio_byteout()
|
||||
{
|
||||
bio_buf = (bio_buf << 8) & 0xffff;
|
||||
bio_ct = bio_buf == 0xff00 ? 7 : 8;
|
||||
if (bio_bp >= bio_end)
|
||||
return 1;
|
||||
*bio_bp++ = bio_buf >> 8;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Read byte. --> function modified to eliminate longjmp !! */
|
||||
/* </summary> */
|
||||
int bio_bytein()
|
||||
{
|
||||
bio_buf = (bio_buf << 8) & 0xffff;
|
||||
bio_ct = bio_buf == 0xff00 ? 7 : 8;
|
||||
if (bio_bp >= bio_end)
|
||||
return 1;
|
||||
bio_buf |= *bio_bp++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Write bit. */
|
||||
/* </summary> */
|
||||
/* <param name="b">Bit to write (0 or 1)</param> */
|
||||
void bio_putbit(int b)
|
||||
{
|
||||
if (bio_ct == 0) {
|
||||
bio_byteout();
|
||||
}
|
||||
bio_ct--;
|
||||
bio_buf |= b << bio_ct;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Read bit. */
|
||||
/* </summary> */
|
||||
int bio_getbit()
|
||||
{
|
||||
if (bio_ct == 0) {
|
||||
bio_bytein();
|
||||
}
|
||||
bio_ct--;
|
||||
return (bio_buf >> bio_ct) & 1;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Write bits. */
|
||||
/* </summary> */
|
||||
/* <param name="v">Value of bits</param> */
|
||||
/* <param name="n">Number of bits to write</param> */
|
||||
void bio_write(int v, int n)
|
||||
{
|
||||
int i;
|
||||
for (i = n - 1; i >= 0; i--) {
|
||||
bio_putbit((v >> i) & 1);
|
||||
}
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Read bits. */
|
||||
/* </summary> */
|
||||
/* <param name="n">Number of bits to read</param> */
|
||||
int bio_read(int n)
|
||||
{
|
||||
int i, v;
|
||||
v = 0;
|
||||
for (i = n - 1; i >= 0; i--) {
|
||||
v += bio_getbit() << i;
|
||||
}
|
||||
return v;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Flush bits. MOdified to eliminate longjmp !! */
|
||||
/* </summary> */
|
||||
int bio_flush()
|
||||
{
|
||||
bio_ct = 0;
|
||||
if (bio_byteout())
|
||||
return 1;
|
||||
if (bio_ct == 7) {
|
||||
bio_ct = 0;
|
||||
|
||||
if (bio_byteout())
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* </summary> */
|
||||
int bio_inalign()
|
||||
{
|
||||
bio_ct = 0;
|
||||
if ((bio_buf & 0xff) == 0xff) {
|
||||
if (bio_bytein())
|
||||
return 1;
|
||||
bio_ct = 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -1,136 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2002, David Janssens
|
||||
* 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 "cio.h"
|
||||
#include <setjmp.h>
|
||||
|
||||
static unsigned char *cio_start, *cio_end, *cio_bp;
|
||||
|
||||
extern jmp_buf j2k_error;
|
||||
|
||||
/* <summary> */
|
||||
/* Number of bytes written. */
|
||||
/* </summary> */
|
||||
int cio_numbytes()
|
||||
{
|
||||
return cio_bp - cio_start;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Get position in byte stream. */
|
||||
/* </summary> */
|
||||
int cio_tell()
|
||||
{
|
||||
return cio_bp - cio_start;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Set position in byte stream. */
|
||||
/* </summary> */
|
||||
void cio_seek(int pos)
|
||||
{
|
||||
cio_bp = cio_start + pos;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Number of bytes left before the end of the stream. */
|
||||
/* </summary> */
|
||||
int cio_numbytesleft()
|
||||
{
|
||||
return cio_end - cio_bp;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Get pointer to the current position in the stream. */
|
||||
/* </summary> */
|
||||
unsigned char *cio_getbp()
|
||||
{
|
||||
return cio_bp;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Initialize byte IO. */
|
||||
/* </summary> */
|
||||
void cio_init(unsigned char *bp, int len)
|
||||
{
|
||||
cio_start = bp;
|
||||
cio_end = bp + len;
|
||||
cio_bp = bp;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Write a byte. */
|
||||
/* </summary> */
|
||||
void cio_byteout(unsigned char v)
|
||||
{
|
||||
if (cio_bp >= cio_end)
|
||||
longjmp(j2k_error, 1);
|
||||
*cio_bp++ = v;
|
||||
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Read a byte. */
|
||||
/* </summary> */
|
||||
unsigned char cio_bytein()
|
||||
{
|
||||
if (cio_bp >= cio_end)
|
||||
longjmp(j2k_error, 1);
|
||||
return *cio_bp++;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Write a byte. */
|
||||
/* </summary> */
|
||||
void cio_write(unsigned int v, int n)
|
||||
{
|
||||
int i;
|
||||
for (i = n - 1; i >= 0; i--) {
|
||||
cio_byteout((unsigned char) ((v >> (i << 3)) & 0xff));
|
||||
}
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Read some bytes. */
|
||||
/* </summary> */
|
||||
unsigned int cio_read(int n)
|
||||
{
|
||||
int i;
|
||||
unsigned int v;
|
||||
v = 0;
|
||||
for (i = n - 1; i >= 0; i--) {
|
||||
v += cio_bytein() << (i << 3);
|
||||
}
|
||||
return v;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Write some bytes. */
|
||||
/* </summary> */
|
||||
void cio_skip(int n)
|
||||
{
|
||||
cio_bp += n;
|
||||
}
|
||||
@@ -1,40 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2002, David Janssens
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef __CIO_H
|
||||
#define __CIO_H
|
||||
|
||||
int cio_tell();
|
||||
void cio_seek(int pos);
|
||||
int cio_numbytes();
|
||||
int cio_numbytesleft();
|
||||
unsigned char *cio_getbp();
|
||||
void cio_init(unsigned char *bp, int len);
|
||||
void cio_write(unsigned int v, int n);
|
||||
unsigned int cio_read(int n);
|
||||
void cio_skip(int n);
|
||||
|
||||
#endif
|
||||
@@ -1,681 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2002, David Janssens
|
||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
||||
* Copyright (c) 2002-2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
||||
* 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 "dwt.h"
|
||||
#include "int.h"
|
||||
#include "fix.h"
|
||||
#include "tcd.h"
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#define S(i) a[x*(i)*2]
|
||||
#define D(i) a[x*(1+(i)*2)]
|
||||
#define S_(i) ((i)<0?S(0):((i)>=sn?S(sn-1):S(i)))
|
||||
#define D_(i) ((i)<0?D(0):((i)>=dn?D(dn-1):D(i)))
|
||||
/* new */
|
||||
#define SS_(i) ((i)<0?S(0):((i)>=dn?S(dn-1):S(i)))
|
||||
#define DD_(i) ((i)<0?D(0):((i)>=sn?D(sn-1):D(i)))
|
||||
|
||||
/* <summary> */
|
||||
/* This table contains the norms of the 5-3 wavelets for different bands. */
|
||||
/* </summary> */
|
||||
double dwt_norms[4][10] = {
|
||||
{1.000, 1.500, 2.750, 5.375, 10.68, 21.34, 42.67, 85.33, 170.7, 341.3},
|
||||
{1.038, 1.592, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9},
|
||||
{1.038, 1.592, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9},
|
||||
{.7186, .9218, 1.586, 3.043, 6.019, 12.01, 24.00, 47.97, 95.93}
|
||||
};
|
||||
|
||||
/* <summary> */
|
||||
/* This table contains the norms of the 9-7 wavelets for different bands. */
|
||||
/* </summary> */
|
||||
double dwt_norms_real[4][10] = {
|
||||
{1.000, 1.965, 4.177, 8.403, 16.90, 33.84, 67.69, 135.3, 270.6, 540.9},
|
||||
{2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0},
|
||||
{2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0},
|
||||
{2.080, 3.865, 8.307, 17.18, 34.71, 69.59, 139.3, 278.6, 557.2}
|
||||
};
|
||||
|
||||
/* Add Patrick */
|
||||
static int *b = NULL;
|
||||
static int lastSizeOfB = 0;
|
||||
|
||||
|
||||
void dwt_clean()
|
||||
{
|
||||
if (b != NULL) {
|
||||
free(b);
|
||||
}
|
||||
b = NULL;
|
||||
lastSizeOfB = 0;
|
||||
}
|
||||
|
||||
/* \ Add Patrick */
|
||||
|
||||
/* <summary> */
|
||||
/* Forward lazy transform. */
|
||||
/* </summary> */
|
||||
void dwt_deinterleave(int *a, int n, int x, int res, int cas)
|
||||
{
|
||||
int dn, sn, i;
|
||||
sn = res;
|
||||
dn = n - res;
|
||||
if (lastSizeOfB != n) {
|
||||
if (b != NULL)
|
||||
free(b);
|
||||
b = (int *) malloc(n * sizeof(int));
|
||||
lastSizeOfB = n;
|
||||
}
|
||||
|
||||
if (cas) {
|
||||
for (i = 0; i < sn; i++)
|
||||
b[i] = a[(2 * i + 1) * x];
|
||||
for (i = 0; i < dn; i++)
|
||||
b[sn + i] = a[2 * i * x];
|
||||
} else {
|
||||
for (i = 0; i < sn; i++)
|
||||
b[i] = a[2 * i * x];
|
||||
for (i = 0; i < dn; i++)
|
||||
b[sn + i] = a[(2 * i + 1) * x];
|
||||
}
|
||||
for (i = 0; i < n; i++)
|
||||
a[i * x] = b[i];
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Forward lazy transform. */
|
||||
/* </summary> */
|
||||
void dwt_deinterleave_real(int *a, int n, int x, int res, int cas)
|
||||
{
|
||||
int dn, sn, i;
|
||||
sn = res;
|
||||
dn = n - res;
|
||||
|
||||
if (lastSizeOfB != n) {
|
||||
if (b != NULL)
|
||||
free(b);
|
||||
b = (int *) malloc(n * sizeof(int));
|
||||
lastSizeOfB = n;
|
||||
}
|
||||
|
||||
if (cas) {
|
||||
for (i = 0; i < sn; i++)
|
||||
b[i] = a[(2 * i + 1) * x];
|
||||
for (i = 0; i < dn; i++)
|
||||
b[sn + i] = a[2 * i * x];
|
||||
} else {
|
||||
for (i = 0; i < sn; i++)
|
||||
b[i] = a[2 * i * x];
|
||||
for (i = 0; i < dn; i++)
|
||||
b[sn + i] = a[(2 * i + 1) * x];
|
||||
}
|
||||
for (i = 0; i < n; i++)
|
||||
a[i * x] = b[i];
|
||||
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Inverse lazy transform. */
|
||||
/* </summary> */
|
||||
void dwt_interleave(int *a, int n, int x, int res, int cas)
|
||||
{
|
||||
int dn, sn, i;
|
||||
sn = res;
|
||||
dn = n - res;
|
||||
|
||||
if (lastSizeOfB != n) {
|
||||
if (b != NULL)
|
||||
free(b);
|
||||
b = (int *) malloc(n * sizeof(int));
|
||||
lastSizeOfB = n;
|
||||
}
|
||||
|
||||
if (cas) {
|
||||
for (i = 0; i < sn; i++)
|
||||
b[2 * i + 1] = a[i * x];
|
||||
for (i = 0; i < dn; i++)
|
||||
b[2 * i] = a[(sn + i) * x];
|
||||
} else {
|
||||
for (i = 0; i < sn; i++)
|
||||
b[2 * i] = a[i * x];
|
||||
for (i = 0; i < dn; i++)
|
||||
b[2 * i + 1] = a[(sn + i) * x];
|
||||
}
|
||||
for (i = 0; i < n; i++)
|
||||
a[i * x] = b[i];
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Inverse lazy transform. */
|
||||
/* </summary> */
|
||||
void dwt_interleave_real(int *a, int n, int x, int res, int cas)
|
||||
{
|
||||
int dn, sn, i;
|
||||
sn = res;
|
||||
dn = n - res;
|
||||
|
||||
if (lastSizeOfB != n) {
|
||||
if (b != NULL)
|
||||
free(b);
|
||||
b = (int *) malloc(n * sizeof(int));
|
||||
lastSizeOfB = n;
|
||||
}
|
||||
|
||||
if (cas) {
|
||||
for (i = 0; i < sn; i++)
|
||||
b[2 * i + 1] = a[i * x];
|
||||
for (i = 0; i < dn; i++)
|
||||
b[2 * i] = a[(sn + i) * x];
|
||||
} else {
|
||||
for (i = 0; i < sn; i++)
|
||||
b[2 * i] = a[i * x];
|
||||
for (i = 0; i < dn; i++)
|
||||
b[2 * i + 1] = a[(sn + i) * x];
|
||||
}
|
||||
for (i = 0; i < n; i++)
|
||||
a[i * x] = b[i];
|
||||
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Forward 5-3 wavelet tranform in 1-D. */
|
||||
/* </summary> */
|
||||
void dwt_encode_1(int *a, int n, int x, int res, int cas)
|
||||
{
|
||||
int dn, sn, i = 0;
|
||||
sn = res;
|
||||
dn = n - res;
|
||||
|
||||
if (cas) {
|
||||
if (!sn && dn == 1) /* NEW : CASE ONE ELEMENT */
|
||||
S(i) *= 2;
|
||||
else {
|
||||
for (i = 0; i < dn; i++)
|
||||
S(i) -= (DD_(i) + DD_(i - 1)) >> 1;
|
||||
for (i = 0; i < sn; i++)
|
||||
D(i) += (SS_(i) + SS_(i + 1) + 2) >> 2;
|
||||
}
|
||||
} else {
|
||||
if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */
|
||||
for (i = 0; i < dn; i++)
|
||||
D(i) -= (S_(i) + S_(i + 1)) >> 1;
|
||||
for (i = 0; i < sn; i++)
|
||||
S(i) += (D_(i - 1) + D_(i) + 2) >> 2;
|
||||
}
|
||||
}
|
||||
dwt_deinterleave(a, n, x, res, cas);
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Inverse 5-3 wavelet tranform in 1-D. */
|
||||
/* </summary> */
|
||||
void dwt_decode_1(int *a, int n, int x, int res, int cas)
|
||||
{
|
||||
int dn, sn, i = 0;
|
||||
/* dn=n/2; */
|
||||
/* sn=(n+1)/2; */
|
||||
sn = res;
|
||||
dn = n - res;
|
||||
|
||||
dwt_interleave(a, n, x, res, cas);
|
||||
if (cas) {
|
||||
if (!sn && dn == 1) /* NEW : CASE ONE ELEMENT */
|
||||
S(i) /= 2;
|
||||
else {
|
||||
for (i = 0; i < sn; i++)
|
||||
D(i) -= (SS_(i) + SS_(i + 1) + 2) >> 2;
|
||||
for (i = 0; i < dn; i++)
|
||||
S(i) += (DD_(i) + DD_(i - 1)) >> 1;
|
||||
}
|
||||
} else {
|
||||
if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */
|
||||
for (i = 0; i < sn; i++)
|
||||
S(i) -= (D_(i - 1) + D_(i) + 2) >> 2;
|
||||
for (i = 0; i < dn; i++)
|
||||
D(i) += (S_(i) + S_(i + 1)) >> 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Forward 5-3 wavelet tranform in 2-D. */
|
||||
/* </summary> */
|
||||
void dwt_encode(int *a, int w, int h, tcd_tilecomp_t * tilec, int l)
|
||||
{
|
||||
int i, j, rw, rh, rw1, rh1;
|
||||
int previous_rw, previous_rh, previous_rw1, previous_rh1;
|
||||
|
||||
for (i = 0; i < l; i++) {
|
||||
int cas_col = 0;
|
||||
int cas_row = 0;
|
||||
rw = tilec->resolutions[l - i].x1 - tilec->resolutions[l - i].x0;
|
||||
rh = tilec->resolutions[l - i].y1 - tilec->resolutions[l - i].y0;
|
||||
rw1 =
|
||||
tilec->resolutions[l - i - 1].x1 - tilec->resolutions[l - i - 1].x0;
|
||||
rh1 =
|
||||
tilec->resolutions[l - i - 1].y1 - tilec->resolutions[l - i - 1].y0;
|
||||
|
||||
/* Check the different cases for that it's necessary to invert high pass and low pass filter */
|
||||
|
||||
if (tilec->previous_row) {
|
||||
previous_rw =
|
||||
tilec->resolutions[l - i].previous_x1 - tilec->resolutions[l -
|
||||
i].
|
||||
previous_x0;
|
||||
previous_rw1 =
|
||||
tilec->resolutions[l - i - 1].previous_x1 - tilec->resolutions[l -
|
||||
i -
|
||||
1].
|
||||
previous_x0;
|
||||
/* inversion on the previous and propagation of the inversion on the other tile */
|
||||
if ((previous_rw1 > previous_rw - previous_rw1 && rw1 == rw - rw1)
|
||||
|| (tilec->resolutions[l - i - 1].cas_row
|
||||
&& previous_rw1 == previous_rw - previous_rw1))
|
||||
cas_row = 1;
|
||||
}
|
||||
|
||||
if (tilec->previous_col) {
|
||||
previous_rh =
|
||||
tilec->resolutions[l - i].previous_y1 - tilec->resolutions[l -
|
||||
i].
|
||||
previous_y0;
|
||||
previous_rh1 =
|
||||
tilec->resolutions[l - i - 1].previous_y1 - tilec->resolutions[l -
|
||||
i -
|
||||
1].
|
||||
previous_y0;
|
||||
/* inversion on the previous and propagation of the inversion on the other tile */
|
||||
if ((previous_rh1 > previous_rh - previous_rh1 && rh1 == rh - rh1)
|
||||
|| (tilec->resolutions[l - i - 1].cas_col
|
||||
&& previous_rh1 == previous_rh - previous_rh1))
|
||||
cas_col = 1;
|
||||
}
|
||||
|
||||
/* subband LL shorter than LH or HL */
|
||||
if (rw1 < rw - rw1)
|
||||
cas_row = 1;
|
||||
if (rh1 < rh - rh1)
|
||||
cas_col = 1;
|
||||
|
||||
/* OFFSET IMAGE (If origin of the resolution is odd and first tile on the row or column) */
|
||||
if (!tilec->previous_row && ((tilec->resolutions[l - i].x0 % 2) == 1))
|
||||
cas_row = 1;
|
||||
if (!tilec->previous_col && ((tilec->resolutions[l - i].y0 % 2) == 1))
|
||||
cas_col = 1;
|
||||
|
||||
tilec->resolutions[l - i - 1].cas_row = cas_row;
|
||||
tilec->resolutions[l - i - 1].cas_col = cas_col;
|
||||
|
||||
for (j = 0; j < rw; j++)
|
||||
dwt_encode_1(a + j, rh, w, rh1, cas_col);
|
||||
for (j = 0; j < rh; j++)
|
||||
dwt_encode_1(a + j * w, rw, 1, rw1, cas_row);
|
||||
}
|
||||
|
||||
dwt_clean();
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Inverse 5-3 wavelet tranform in 2-D. */
|
||||
/* </summary> */
|
||||
void dwt_decode(int *a, int w, int h, tcd_tilecomp_t * tilec, int l,
|
||||
tcd_tilecomp_t * row_tilec, tcd_tilecomp_t * col_tilec)
|
||||
{
|
||||
int i, j, rw, rh, rw1, rh1;
|
||||
int previous_rw, previous_rh, previous_rw1, previous_rh1;
|
||||
for (i = l - 1; i >= 0; i--) {
|
||||
int cas_col = 0;
|
||||
int cas_row = 0;
|
||||
|
||||
rw = tilec->resolutions[l - i].x1 - tilec->resolutions[l - i].x0;
|
||||
rh = tilec->resolutions[l - i].y1 - tilec->resolutions[l - i].y0;
|
||||
rw1 =
|
||||
tilec->resolutions[l - i - 1].x1 - tilec->resolutions[l - i - 1].x0;
|
||||
rh1 =
|
||||
tilec->resolutions[l - i - 1].y1 - tilec->resolutions[l - i - 1].y0;
|
||||
|
||||
if (tilec->previous_row) {
|
||||
previous_rw =
|
||||
tilec->resolutions[l - i].previous_x1 - tilec->resolutions[l -
|
||||
i].
|
||||
previous_x0;
|
||||
previous_rw1 =
|
||||
tilec->resolutions[l - i - 1].previous_x1 - tilec->resolutions[l -
|
||||
i -
|
||||
1].
|
||||
previous_x0;
|
||||
if ((previous_rw1 > previous_rw - previous_rw1 && rw1 == rw - rw1)
|
||||
|| (row_tilec->resolutions[l - i - 1].cas_row
|
||||
&& previous_rw1 == previous_rw - previous_rw1))
|
||||
cas_row = 1;
|
||||
}
|
||||
|
||||
if (tilec->previous_col) {
|
||||
previous_rh =
|
||||
tilec->resolutions[l - i].previous_y1 - tilec->resolutions[l -
|
||||
i].
|
||||
previous_y0;
|
||||
previous_rh1 =
|
||||
tilec->resolutions[l - i - 1].previous_y1 - tilec->resolutions[l -
|
||||
i -
|
||||
1].
|
||||
previous_y0;
|
||||
if ((previous_rh1 > previous_rh - previous_rh1 && rh1 == rh - rh1)
|
||||
|| (col_tilec->resolutions[l - i - 1].cas_col
|
||||
&& previous_rh1 == previous_rh - previous_rh1))
|
||||
cas_col = 1;
|
||||
}
|
||||
|
||||
if (rw1 < rw - rw1)
|
||||
cas_row = 1;
|
||||
if (rh1 < rh - rh1)
|
||||
cas_col = 1;
|
||||
|
||||
/* OFFSET IMAGE (If origin of the resolution is odd and first tile on the row or column) */
|
||||
if (!tilec->previous_row && ((tilec->resolutions[l - i].x0 % 2) == 1))
|
||||
cas_row = 1;
|
||||
if (!tilec->previous_col && ((tilec->resolutions[l - i].y0 % 2) == 1))
|
||||
cas_col = 1;
|
||||
|
||||
tilec->resolutions[l - i - 1].cas_row = cas_row;
|
||||
tilec->resolutions[l - i - 1].cas_col = cas_col;
|
||||
|
||||
for (j = 0; j < rh; j++)
|
||||
dwt_decode_1(a + j * w, rw, 1, rw1, cas_row);
|
||||
for (j = 0; j < rw; j++)
|
||||
dwt_decode_1(a + j, rh, w, rh1, cas_col);
|
||||
}
|
||||
dwt_clean();
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Get gain of 5-3 wavelet transform. */
|
||||
/* </summary> */
|
||||
int dwt_getgain(int orient)
|
||||
{
|
||||
if (orient == 0)
|
||||
return 0;
|
||||
if (orient == 1 || orient == 2)
|
||||
return 1;
|
||||
return 2;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Get norm of 5-3 wavelet. */
|
||||
/* </summary> */
|
||||
double dwt_getnorm(int level, int orient)
|
||||
{
|
||||
return dwt_norms[orient][level];
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Forward 9-7 wavelet transform in 1-D. */
|
||||
/* </summary> */
|
||||
void dwt_encode_1_real(int *a, int n, int x, int res, int cas)
|
||||
{
|
||||
int dn, sn, i = 0;
|
||||
dn = n - res;
|
||||
sn = res;
|
||||
|
||||
if (cas) {
|
||||
if ((sn > 0) || (dn > 1)) { /* NEW : CASE ONE ELEMENT */
|
||||
for (i = 0; i < dn; i++)
|
||||
S(i) -= fix_mul(DD_(i) + DD_(i - 1), 12993);
|
||||
for (i = 0; i < sn; i++)
|
||||
D(i) -= fix_mul(SS_(i) + SS_(i + 1), 434);
|
||||
for (i = 0; i < dn; i++)
|
||||
S(i) += fix_mul(DD_(i) + DD_(i - 1), 7233);
|
||||
for (i = 0; i < sn; i++)
|
||||
D(i) += fix_mul(SS_(i) + SS_(i + 1), 3633);
|
||||
for (i = 0; i < dn; i++)
|
||||
S(i) = fix_mul(S(i), 5038);
|
||||
for (i = 0; i < sn; i++)
|
||||
D(i) = fix_mul(D(i), 6660);
|
||||
}
|
||||
} else {
|
||||
if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */
|
||||
for (i = 0; i < dn; i++)
|
||||
D(i) -= fix_mul(S_(i) + S_(i + 1), 12993);
|
||||
for (i = 0; i < sn; i++)
|
||||
S(i) -= fix_mul(D_(i - 1) + D_(i), 434);
|
||||
for (i = 0; i < dn; i++)
|
||||
D(i) += fix_mul(S_(i) + S_(i + 1), 7233);
|
||||
for (i = 0; i < sn; i++)
|
||||
S(i) += fix_mul(D_(i - 1) + D_(i), 3633);
|
||||
for (i = 0; i < dn; i++)
|
||||
D(i) = fix_mul(D(i), 5038);
|
||||
for (i = 0; i < sn; i++)
|
||||
S(i) = fix_mul(S(i), 6660);
|
||||
}
|
||||
}
|
||||
dwt_deinterleave_real(a, n, x, res, cas);
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Inverse 9-7 wavelet transform in 1-D. */
|
||||
/* </summary> */
|
||||
void dwt_decode_1_real(int *a, int n, int x, int res, int cas)
|
||||
{
|
||||
int dn, sn, i = 0;
|
||||
dn = n - res;
|
||||
sn = res;
|
||||
dwt_interleave_real(a, n, x, res, cas);
|
||||
if (cas) {
|
||||
if ((sn > 0) || (dn > 1)) { /* NEW : CASE ONE ELEMENT */
|
||||
for (i = 0; i < sn; i++)
|
||||
D(i) = fix_mul(D(i), 10076);
|
||||
for (i = 0; i < dn; i++)
|
||||
S(i) = fix_mul(S(i), 13320);
|
||||
for (i = 0; i < sn; i++)
|
||||
D(i) -= fix_mul(SS_(i) + SS_(i + 1), 3633);
|
||||
for (i = 0; i < dn; i++)
|
||||
S(i) -= fix_mul(DD_(i) + DD_(i - 1), 7233);
|
||||
for (i = 0; i < sn; i++)
|
||||
D(i) += fix_mul(SS_(i) + SS_(i + 1), 434);
|
||||
for (i = 0; i < dn; i++)
|
||||
S(i) += fix_mul(DD_(i) + DD_(i - 1), 12993);
|
||||
}
|
||||
} else {
|
||||
if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */
|
||||
for (i = 0; i < sn; i++)
|
||||
S(i) = fix_mul(S(i), 10076);
|
||||
for (i = 0; i < dn; i++)
|
||||
D(i) = fix_mul(D(i), 13320);
|
||||
for (i = 0; i < sn; i++)
|
||||
S(i) -= fix_mul(D_(i - 1) + D_(i), 3633);
|
||||
for (i = 0; i < dn; i++)
|
||||
D(i) -= fix_mul(S_(i) + S_(i + 1), 7233);
|
||||
for (i = 0; i < sn; i++)
|
||||
S(i) += fix_mul(D_(i - 1) + D_(i), 434);
|
||||
for (i = 0; i < dn; i++)
|
||||
D(i) += fix_mul(S_(i) + S_(i + 1), 12993);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Forward 9-7 wavelet transform in 2-D. */
|
||||
/* </summary> */
|
||||
|
||||
void dwt_encode_real(int *a, int w, int h, tcd_tilecomp_t * tilec, int l)
|
||||
{
|
||||
int i, j, rw, rh, rw1, rh1;
|
||||
int previous_rw, previous_rh, previous_rw1, previous_rh1;
|
||||
|
||||
for (i = 0; i < l; i++) {
|
||||
int cas_col = 0;
|
||||
int cas_row = 0;
|
||||
rw = tilec->resolutions[l - i].x1 - tilec->resolutions[l - i].x0;
|
||||
rh = tilec->resolutions[l - i].y1 - tilec->resolutions[l - i].y0;
|
||||
rw1 =
|
||||
tilec->resolutions[l - i - 1].x1 - tilec->resolutions[l - i - 1].x0;
|
||||
rh1 =
|
||||
tilec->resolutions[l - i - 1].y1 - tilec->resolutions[l - i - 1].y0;
|
||||
|
||||
if (tilec->previous_row) {
|
||||
previous_rw =
|
||||
tilec->resolutions[l - i].previous_x1 - tilec->resolutions[l -
|
||||
i].
|
||||
previous_x0;
|
||||
previous_rw1 =
|
||||
tilec->resolutions[l - i - 1].previous_x1 - tilec->resolutions[l -
|
||||
i -
|
||||
1].
|
||||
previous_x0;
|
||||
if ((previous_rw1 > previous_rw - previous_rw1 && rw1 == rw - rw1)
|
||||
|| (tilec->resolutions[l - i - 1].cas_row
|
||||
&& previous_rw1 == previous_rw - previous_rw1))
|
||||
cas_row = 1;
|
||||
}
|
||||
|
||||
if (tilec->previous_col) {
|
||||
previous_rh =
|
||||
tilec->resolutions[l - i].previous_y1 - tilec->resolutions[l -
|
||||
i].
|
||||
previous_y0;
|
||||
previous_rh1 =
|
||||
tilec->resolutions[l - i - 1].previous_y1 - tilec->resolutions[l -
|
||||
i -
|
||||
1].
|
||||
previous_y0;
|
||||
if ((previous_rh1 > previous_rh - previous_rh1 && rh1 == rh - rh1)
|
||||
|| (tilec->resolutions[l - i - 1].cas_col
|
||||
&& previous_rh1 == previous_rh - previous_rh1))
|
||||
cas_col = 1;
|
||||
}
|
||||
|
||||
if (rw1 < rw - rw1)
|
||||
cas_row = 1;
|
||||
if (rh1 < rh - rh1)
|
||||
cas_col = 1;
|
||||
|
||||
/* OFFSET IMAGE (If origin of the resolution is odd and first tile on the row or column) */
|
||||
if (!tilec->previous_row && ((tilec->resolutions[l - i].x0 % 2) == 1))
|
||||
cas_row = 1;
|
||||
if (!tilec->previous_col && ((tilec->resolutions[l - i].y0 % 2) == 1))
|
||||
cas_col = 1;
|
||||
|
||||
tilec->resolutions[l - i - 1].cas_row = cas_row;
|
||||
tilec->resolutions[l - i - 1].cas_col = cas_col;
|
||||
|
||||
for (j = 0; j < rw; j++)
|
||||
dwt_encode_1_real(a + j, rh, w, rh1, cas_col);
|
||||
for (j = 0; j < rh; j++)
|
||||
dwt_encode_1_real(a + j * w, rw, 1, rw1, cas_row);
|
||||
}
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Inverse 9-7 wavelet transform in 2-D. */
|
||||
/* </summary> */
|
||||
void dwt_decode_real(int *a, int w, int h, tcd_tilecomp_t * tilec, int l,
|
||||
tcd_tilecomp_t * row_tilec,
|
||||
tcd_tilecomp_t * col_tilec)
|
||||
{
|
||||
int i, j, rw, rh, rw1, rh1;
|
||||
int previous_rw, previous_rh, previous_rw1, previous_rh1;
|
||||
|
||||
for (i = l - 1; i >= 0; i--) {
|
||||
int cas_col = 0;
|
||||
int cas_row = 0;
|
||||
|
||||
rw = tilec->resolutions[l - i].x1 - tilec->resolutions[l - i].x0;
|
||||
rh = tilec->resolutions[l - i].y1 - tilec->resolutions[l - i].y0;
|
||||
rw1 =
|
||||
tilec->resolutions[l - i - 1].x1 - tilec->resolutions[l - i - 1].x0;
|
||||
rh1 =
|
||||
tilec->resolutions[l - i - 1].y1 - tilec->resolutions[l - i - 1].y0;
|
||||
|
||||
if (tilec->previous_row) {
|
||||
previous_rw =
|
||||
tilec->resolutions[l - i].previous_x1 - tilec->resolutions[l -
|
||||
i].
|
||||
previous_x0;
|
||||
previous_rw1 =
|
||||
tilec->resolutions[l - i - 1].previous_x1 - tilec->resolutions[l -
|
||||
i -
|
||||
1].
|
||||
previous_x0;
|
||||
if ((previous_rw1 > previous_rw - previous_rw1 && rw1 == rw - rw1)
|
||||
|| (row_tilec->resolutions[l - i - 1].cas_row
|
||||
&& previous_rw1 == previous_rw - previous_rw1))
|
||||
cas_row = 1;
|
||||
}
|
||||
|
||||
if (tilec->previous_col) {
|
||||
previous_rh =
|
||||
tilec->resolutions[l - i].previous_y1 - tilec->resolutions[l -
|
||||
i].
|
||||
previous_y0;
|
||||
previous_rh1 =
|
||||
tilec->resolutions[l - i - 1].previous_y1 - tilec->resolutions[l -
|
||||
i -
|
||||
1].
|
||||
previous_y0;
|
||||
if ((previous_rh1 > previous_rh - previous_rh1 && rh1 == rh - rh1)
|
||||
|| (col_tilec->resolutions[l - i - 1].cas_col
|
||||
&& previous_rh1 == previous_rh - previous_rh1))
|
||||
cas_col = 1;
|
||||
}
|
||||
|
||||
if (rw1 < rw - rw1)
|
||||
cas_row = 1;
|
||||
if (rh1 < rh - rh1)
|
||||
cas_col = 1;
|
||||
|
||||
/* OFFSET IMAGE (If origin of the resolution is odd and first tile on the row or column) */
|
||||
if (!tilec->previous_row && ((tilec->resolutions[l - i].x0 % 2) == 1))
|
||||
cas_row = 1;
|
||||
if (!tilec->previous_col && ((tilec->resolutions[l - i].y0 % 2) == 1))
|
||||
cas_col = 1;
|
||||
|
||||
tilec->resolutions[l - i - 1].cas_row = cas_row;
|
||||
tilec->resolutions[l - i - 1].cas_col = cas_col;
|
||||
|
||||
for (j = 0; j < rh; j++)
|
||||
dwt_decode_1_real(a + j * w, rw, 1, rw1, cas_row);
|
||||
for (j = 0; j < rw; j++)
|
||||
dwt_decode_1_real(a + j, rh, w, rh1, cas_col);
|
||||
}
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Get gain of 9-7 wavelet transform. */
|
||||
/* </summary> */
|
||||
int dwt_getgain_real(int orient)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Get norm of 9-7 wavelet. */
|
||||
/* </summary> */
|
||||
double dwt_getnorm_real(int level, int orient)
|
||||
{
|
||||
return dwt_norms_real[orient][level];
|
||||
}
|
||||
@@ -1,98 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2002, David Janssens
|
||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
||||
* Copyright (c) 2002-2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
||||
* 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 "tcd.h"
|
||||
|
||||
#ifndef __DWT_H
|
||||
#define __DWT_H
|
||||
|
||||
/*
|
||||
* Apply a reversible DWT transform to a component of an image
|
||||
* a: samples of the component
|
||||
* w: width of the component
|
||||
* h: height of the component
|
||||
* l: number of decomposition levels in the DWT
|
||||
*/
|
||||
/* void dwt_encode(int* a, int w, int h, int l); */
|
||||
void dwt_encode(int *a, int w, int h, tcd_tilecomp_t * tilec, int l);
|
||||
/*
|
||||
* Apply a reversible inverse DWT transform to a component of an image
|
||||
* a: samples of the component
|
||||
* w: width of the component
|
||||
* h: height of the component
|
||||
* l: number of decomposition levels in the DWT
|
||||
*/
|
||||
void dwt_decode(int *a, int w, int h, tcd_tilecomp_t * tilec, int l,
|
||||
tcd_tilecomp_t * row_tilec, tcd_tilecomp_t * col_tilec);
|
||||
/* void dwt_decode(int* a, int w, int h,tcd_tilecomp_t *tilec, int l); */
|
||||
/*
|
||||
* Get the gain of a subband for the reversible DWT
|
||||
* orient: number that identifies the subband (0->LL, 1->HL, 2->LH, 3->HH)
|
||||
*/
|
||||
int dwt_getgain(int orient);
|
||||
|
||||
/*
|
||||
* Get the norm of a wavelet function of a subband at a specified level for the reversible DWT
|
||||
* level: level of the wavelet function
|
||||
* orient: band of the wavelet function
|
||||
*/
|
||||
double dwt_getnorm(int level, int orient);
|
||||
|
||||
/*
|
||||
* Apply an irreversible DWT transform to a component of an image
|
||||
* a: samples of the component
|
||||
* w: width of the component
|
||||
* h: height of the component
|
||||
* l: number of decomposition levels in the DWT
|
||||
*/
|
||||
void dwt_encode_real(int *a, int w, int h, tcd_tilecomp_t * tilec, int l);
|
||||
|
||||
/*
|
||||
* Apply an irreversible inverse DWT transform to a component of an image
|
||||
* a: samples of the component
|
||||
* w: width of the component
|
||||
* h: height of the component
|
||||
* l: number of decomposition levels in the DWT
|
||||
*/
|
||||
void dwt_decode_real(int *a, int w, int h, tcd_tilecomp_t * tilec, int l,
|
||||
tcd_tilecomp_t * row_tilec,
|
||||
tcd_tilecomp_t * col_tilec);
|
||||
/*
|
||||
* Get the gain of a subband for the irreversible DWT
|
||||
* orient: number that identifies the subband (0->LL, 1->HL, 2->LH, 3->HH)
|
||||
*/
|
||||
int dwt_getgain_real(int orient);
|
||||
|
||||
/*
|
||||
* Get the norm of a wavelet function of a subband at a specified level for the irreversible DWT
|
||||
* level: level of the wavelet function
|
||||
* orient: band of the wavelet function
|
||||
*/
|
||||
double dwt_getnorm_real(int level, int orient);
|
||||
|
||||
#endif
|
||||
@@ -1,33 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2002, David Janssens
|
||||
* 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.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __FIX_H
|
||||
#define __FIX_H
|
||||
|
||||
int fix_mul(int a, int b);
|
||||
|
||||
#endif
|
||||
@@ -1,39 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2002, David Janssens
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef __INT_H
|
||||
#define __INT_H
|
||||
|
||||
int int_min(int a, int b);
|
||||
int int_max(int a, int b);
|
||||
int int_clamp(int a, int min, int max);
|
||||
int int_abs(int a);
|
||||
int int_ceildiv(int a, int b);
|
||||
int int_ceildivpow2(int a, int b);
|
||||
int int_floordivpow2(int a, int b);
|
||||
int int_floorlog2(int a);
|
||||
|
||||
#endif
|
||||
1153
libopenjpeg/j2k.c
1153
libopenjpeg/j2k.c
File diff suppressed because it is too large
Load Diff
@@ -1,185 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2002, David Janssens
|
||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
||||
* Copyright (c) 2002-2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#define VERSION "0.0.8"
|
||||
|
||||
#ifdef DAVID_WIN32
|
||||
#ifdef LIBJ2K_EXPORTS
|
||||
#define LIBJ2K_API __declspec(dllexport)
|
||||
#else
|
||||
#define LIBJ2K_API __declspec(dllimport)
|
||||
#endif
|
||||
#else
|
||||
#define LIBJ2K_API
|
||||
#endif
|
||||
|
||||
#ifndef __J2K_H
|
||||
#define __J2K_H
|
||||
|
||||
#define J2K_MAXRLVLS 33
|
||||
#define J2K_MAXBANDS (3*J2K_MAXRLVLS+1)
|
||||
|
||||
#define J2K_CP_CSTY_PRT 0x01
|
||||
#define J2K_CP_CSTY_SOP 0x02
|
||||
#define J2K_CP_CSTY_EPH 0x04
|
||||
#define J2K_CCP_CSTY_PRT 0x01
|
||||
#define J2K_CCP_CBLKSTY_LAZY 0x01
|
||||
#define J2K_CCP_CBLKSTY_RESET 0x02
|
||||
#define J2K_CCP_CBLKSTY_TERMALL 0x04
|
||||
#define J2K_CCP_CBLKSTY_VSC 0x08
|
||||
#define J2K_CCP_CBLKSTY_PTERM 0x10
|
||||
#define J2K_CCP_CBLKSTY_SEGSYM 0x20
|
||||
#define J2K_CCP_QNTSTY_NOQNT 0
|
||||
#define J2K_CCP_QNTSTY_SIQNT 1
|
||||
#define J2K_CCP_QNTSTY_SEQNT 2
|
||||
|
||||
typedef struct {
|
||||
int dx, dy; /* XRsiz, YRsiz */
|
||||
int prec; /* precision */
|
||||
int bpp; /* deapth of image in bits */
|
||||
int sgnd; /* signed */
|
||||
int *data; /* image-component data */
|
||||
} j2k_comp_t;
|
||||
|
||||
typedef struct {
|
||||
int x0, y0; /* XOsiz, YOsiz */
|
||||
int x1, y1; /* Xsiz, Ysiz */
|
||||
int numcomps; /* number of components */
|
||||
int index_on; /* 0 = no index || 1 = index */
|
||||
/* int PPT; */
|
||||
j2k_comp_t *comps; /* image-components */
|
||||
} j2k_image_t;
|
||||
|
||||
typedef struct {
|
||||
int expn; /* exponent */
|
||||
int mant; /* mantissa */
|
||||
} j2k_stepsize_t;
|
||||
|
||||
typedef struct {
|
||||
int csty; /* coding style */
|
||||
int numresolutions; /* number of resolutions */
|
||||
int cblkw; /* width of code-blocks */
|
||||
int cblkh; /* height of code-blocks */
|
||||
int cblksty; /* code-block coding style */
|
||||
int qmfbid; /* discrete wavelet transform identifier */
|
||||
int qntsty; /* quantisation style */
|
||||
j2k_stepsize_t stepsizes[J2K_MAXBANDS]; /* stepsizes used for quantisation */
|
||||
int numgbits; /* number of guard bits */
|
||||
int roishift; /* Region Of Interest shift */
|
||||
int prcw[J2K_MAXRLVLS]; /* Precinct width */
|
||||
int prch[J2K_MAXRLVLS]; /* Precinct height */
|
||||
} j2k_tccp_t;
|
||||
|
||||
typedef struct {
|
||||
int resno0, compno0;
|
||||
int layno1, resno1, compno1;
|
||||
int prg;
|
||||
int tile;
|
||||
char progorder[4];
|
||||
} j2k_poc_t;
|
||||
|
||||
typedef struct {
|
||||
int csty; /* coding style */
|
||||
int prg; /* progression order */
|
||||
int numlayers; /* number of layers */
|
||||
int mct; /* multi-component transform identifier */
|
||||
int rates[100]; /* rates of layers */
|
||||
int numpocs; /* number of progression order changes */
|
||||
j2k_poc_t pocs[32]; /* progression order changes */
|
||||
j2k_tccp_t *tccps; /* tile-component coding parameters */
|
||||
} j2k_tcp_t;
|
||||
|
||||
typedef struct {
|
||||
int image_type; /* 0: PNM, PGM, PPM 1: PGX */
|
||||
int disto_alloc; /* Allocation by rate/distortion */
|
||||
int fixed_alloc; /* Allocation by fixed layer */
|
||||
int tx0, ty0; /* XTOsiz, YTOsiz */
|
||||
int tdx, tdy; /* XTsiz, YTsiz */
|
||||
char *comment; /* comment for coding */
|
||||
int tw, th;
|
||||
j2k_tcp_t *tcps; /* tile coding parameters */
|
||||
} j2k_cp_t;
|
||||
|
||||
typedef struct {
|
||||
int start_pos, end_pos; /* start and end position */
|
||||
double disto;
|
||||
} info_packet; /* Index struct */
|
||||
|
||||
typedef struct {
|
||||
int num_tile; /* Number of Tile */
|
||||
int start_pos; /* Start position */
|
||||
int end_header; /* End position of the header */
|
||||
int end_pos; /* End position */
|
||||
int pw, ph; /* number of precinct by tile */
|
||||
info_packet *packet; /* information concerning packets inside tile */
|
||||
} info_tile; /* index struct */
|
||||
|
||||
typedef struct {
|
||||
int index_on;
|
||||
double D_max; /* ADD for Marcela */
|
||||
int num; /* numero of packet */
|
||||
int index_write; /* writing the packet inthe index with t2_encode_packets */
|
||||
int Im_w, Im_h; /* Image width and Height */
|
||||
int Prog; /* progression order */
|
||||
int Tile_x, Tile_y; /* Number of Tile in X and Y */
|
||||
int tw, th;
|
||||
int Comp; /* Component numbers */
|
||||
int Layer; /* number of layer */
|
||||
int Decomposition; /* number of decomposition */
|
||||
int pw, ph; /* nombre precinct in X and Y */
|
||||
int pdx, pdy; /* size of precinct in X and Y */
|
||||
int Main_head_end; /* Main header position */
|
||||
int codestream_size; /* codestream's size */
|
||||
info_tile *tile; /* information concerning tiles inside image */
|
||||
} info_image; /* index struct */
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Encode an image into a JPEG-2000 codestream
|
||||
* i: image to encode
|
||||
* cp: coding parameters
|
||||
* dest: destination buffer
|
||||
* len: length of destination buffer
|
||||
* index : index file name
|
||||
*/
|
||||
LIBJ2K_API int j2k_encode(j2k_image_t * i, j2k_cp_t * cp, char *outfile,
|
||||
int len, char *index);
|
||||
|
||||
/* LIBJ2K_API int j2k_encode(j2k_image_t *i, j2k_cp_t *cp,unsigned char *dest, int len); */
|
||||
/*
|
||||
* Decode an image from a JPEG-2000 codestream
|
||||
* src: source buffer
|
||||
* len: length of source buffer
|
||||
* i: decode image
|
||||
* cp: coding parameters that were used to encode the image
|
||||
*/
|
||||
LIBJ2K_API int j2k_decode(unsigned char *src, int len, j2k_image_t ** i,
|
||||
j2k_cp_t ** cp);
|
||||
|
||||
#endif
|
||||
@@ -1,74 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2002, David Janssens
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef __MCT_H
|
||||
#define __MCT_H
|
||||
|
||||
/*
|
||||
* Apply a reversible multi-component transform to an image
|
||||
* R: samples for red component
|
||||
* G: samples for green component
|
||||
* B: samples blue component
|
||||
* n: number of samples for each component
|
||||
*/
|
||||
void mct_encode(int *R, int *G, int *B, int n);
|
||||
/*
|
||||
* Apply a reversible multi-component inverse transform to an image
|
||||
* Y: samples for luminance component
|
||||
* U: samples for red chrominance component
|
||||
* V: samples for blue chrominance component
|
||||
* n: number of samples for each component
|
||||
*/
|
||||
void mct_decode(int *V, int *U, int *Y, int n);
|
||||
/*
|
||||
* Get norm of the basis function used for the reversible multi-component transform
|
||||
* compno: number of the component (0->Y, 1->U, 2->V)
|
||||
*/
|
||||
double mct_getnorm(int compno);
|
||||
|
||||
/*
|
||||
* Apply an irreversible multi-component transform to an image
|
||||
* R: samples for red component
|
||||
* G: samples for green component
|
||||
* B: samples blue component
|
||||
* n: number of samples for each component
|
||||
*/
|
||||
void mct_encode_real(int *c0, int *c1, int *c2, int n);
|
||||
/*
|
||||
* Apply an irreversible multi-component inverse transform to an image
|
||||
* Y: samples for luminance component
|
||||
* U: samples for red chrominance component
|
||||
* V: samples for blue chrominance component
|
||||
* n: number of samples for each component
|
||||
*/
|
||||
void mct_decode_real(int *c0, int *c1, int *c2, int n);
|
||||
/*
|
||||
* Get norm of the basis function used for the irreversible multi-component transform
|
||||
* compno: number of the component (0->Y, 1->U, 2->V)
|
||||
*/
|
||||
double mct_getnorm_real(int compno);
|
||||
|
||||
#endif
|
||||
@@ -1,588 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2002, David Janssens
|
||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
||||
* Copyright (c) 2002-2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
||||
* 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 "mqc.h"
|
||||
#include <stdio.h>
|
||||
|
||||
/* <summary> */
|
||||
/* This struct defines the state of a context. */
|
||||
/* </summary> */
|
||||
typedef struct mqc_state_s {
|
||||
unsigned int qeval; /* the probability of the Least Probable Symbol (0.75->0x8000, 1.5->0xffff) */
|
||||
int mps; /* the Most Probable Symbol (0 or 1) */
|
||||
struct mqc_state_s *nmps; /* next state if the next encoded symbol is the MPS */
|
||||
struct mqc_state_s *nlps; /* next state if the next encoded symbol is the LPS */
|
||||
} mqc_state_t;
|
||||
|
||||
/* <summary> */
|
||||
/* This array defines all the possible states for a context. */
|
||||
/* </summary> */
|
||||
mqc_state_t mqc_states[47 * 2] = {
|
||||
{0x5601, 0, &mqc_states[2], &mqc_states[3]},
|
||||
{0x5601, 1, &mqc_states[3], &mqc_states[2]},
|
||||
{0x3401, 0, &mqc_states[4], &mqc_states[12]},
|
||||
{0x3401, 1, &mqc_states[5], &mqc_states[13]},
|
||||
{0x1801, 0, &mqc_states[6], &mqc_states[18]},
|
||||
{0x1801, 1, &mqc_states[7], &mqc_states[19]},
|
||||
{0x0ac1, 0, &mqc_states[8], &mqc_states[24]},
|
||||
{0x0ac1, 1, &mqc_states[9], &mqc_states[25]},
|
||||
{0x0521, 0, &mqc_states[10], &mqc_states[58]},
|
||||
{0x0521, 1, &mqc_states[11], &mqc_states[59]},
|
||||
{0x0221, 0, &mqc_states[76], &mqc_states[66]},
|
||||
{0x0221, 1, &mqc_states[77], &mqc_states[67]},
|
||||
{0x5601, 0, &mqc_states[14], &mqc_states[13]},
|
||||
{0x5601, 1, &mqc_states[15], &mqc_states[12]},
|
||||
{0x5401, 0, &mqc_states[16], &mqc_states[28]},
|
||||
{0x5401, 1, &mqc_states[17], &mqc_states[29]},
|
||||
{0x4801, 0, &mqc_states[18], &mqc_states[28]},
|
||||
{0x4801, 1, &mqc_states[19], &mqc_states[29]},
|
||||
{0x3801, 0, &mqc_states[20], &mqc_states[28]},
|
||||
{0x3801, 1, &mqc_states[21], &mqc_states[29]},
|
||||
{0x3001, 0, &mqc_states[22], &mqc_states[34]},
|
||||
{0x3001, 1, &mqc_states[23], &mqc_states[35]},
|
||||
{0x2401, 0, &mqc_states[24], &mqc_states[36]},
|
||||
{0x2401, 1, &mqc_states[25], &mqc_states[37]},
|
||||
{0x1c01, 0, &mqc_states[26], &mqc_states[40]},
|
||||
{0x1c01, 1, &mqc_states[27], &mqc_states[41]},
|
||||
{0x1601, 0, &mqc_states[58], &mqc_states[42]},
|
||||
{0x1601, 1, &mqc_states[59], &mqc_states[43]},
|
||||
{0x5601, 0, &mqc_states[30], &mqc_states[29]},
|
||||
{0x5601, 1, &mqc_states[31], &mqc_states[28]},
|
||||
{0x5401, 0, &mqc_states[32], &mqc_states[28]},
|
||||
{0x5401, 1, &mqc_states[33], &mqc_states[29]},
|
||||
{0x5101, 0, &mqc_states[34], &mqc_states[30]},
|
||||
{0x5101, 1, &mqc_states[35], &mqc_states[31]},
|
||||
{0x4801, 0, &mqc_states[36], &mqc_states[32]},
|
||||
{0x4801, 1, &mqc_states[37], &mqc_states[33]},
|
||||
{0x3801, 0, &mqc_states[38], &mqc_states[34]},
|
||||
{0x3801, 1, &mqc_states[39], &mqc_states[35]},
|
||||
{0x3401, 0, &mqc_states[40], &mqc_states[36]},
|
||||
{0x3401, 1, &mqc_states[41], &mqc_states[37]},
|
||||
{0x3001, 0, &mqc_states[42], &mqc_states[38]},
|
||||
{0x3001, 1, &mqc_states[43], &mqc_states[39]},
|
||||
{0x2801, 0, &mqc_states[44], &mqc_states[38]},
|
||||
{0x2801, 1, &mqc_states[45], &mqc_states[39]},
|
||||
{0x2401, 0, &mqc_states[46], &mqc_states[40]},
|
||||
{0x2401, 1, &mqc_states[47], &mqc_states[41]},
|
||||
{0x2201, 0, &mqc_states[48], &mqc_states[42]},
|
||||
{0x2201, 1, &mqc_states[49], &mqc_states[43]},
|
||||
{0x1c01, 0, &mqc_states[50], &mqc_states[44]},
|
||||
{0x1c01, 1, &mqc_states[51], &mqc_states[45]},
|
||||
{0x1801, 0, &mqc_states[52], &mqc_states[46]},
|
||||
{0x1801, 1, &mqc_states[53], &mqc_states[47]},
|
||||
{0x1601, 0, &mqc_states[54], &mqc_states[48]},
|
||||
{0x1601, 1, &mqc_states[55], &mqc_states[49]},
|
||||
{0x1401, 0, &mqc_states[56], &mqc_states[50]},
|
||||
{0x1401, 1, &mqc_states[57], &mqc_states[51]},
|
||||
{0x1201, 0, &mqc_states[58], &mqc_states[52]},
|
||||
{0x1201, 1, &mqc_states[59], &mqc_states[53]},
|
||||
{0x1101, 0, &mqc_states[60], &mqc_states[54]},
|
||||
{0x1101, 1, &mqc_states[61], &mqc_states[55]},
|
||||
{0x0ac1, 0, &mqc_states[62], &mqc_states[56]},
|
||||
{0x0ac1, 1, &mqc_states[63], &mqc_states[57]},
|
||||
{0x09c1, 0, &mqc_states[64], &mqc_states[58]},
|
||||
{0x09c1, 1, &mqc_states[65], &mqc_states[59]},
|
||||
{0x08a1, 0, &mqc_states[66], &mqc_states[60]},
|
||||
{0x08a1, 1, &mqc_states[67], &mqc_states[61]},
|
||||
{0x0521, 0, &mqc_states[68], &mqc_states[62]},
|
||||
{0x0521, 1, &mqc_states[69], &mqc_states[63]},
|
||||
{0x0441, 0, &mqc_states[70], &mqc_states[64]},
|
||||
{0x0441, 1, &mqc_states[71], &mqc_states[65]},
|
||||
{0x02a1, 0, &mqc_states[72], &mqc_states[66]},
|
||||
{0x02a1, 1, &mqc_states[73], &mqc_states[67]},
|
||||
{0x0221, 0, &mqc_states[74], &mqc_states[68]},
|
||||
{0x0221, 1, &mqc_states[75], &mqc_states[69]},
|
||||
{0x0141, 0, &mqc_states[76], &mqc_states[70]},
|
||||
{0x0141, 1, &mqc_states[77], &mqc_states[71]},
|
||||
{0x0111, 0, &mqc_states[78], &mqc_states[72]},
|
||||
{0x0111, 1, &mqc_states[79], &mqc_states[73]},
|
||||
{0x0085, 0, &mqc_states[80], &mqc_states[74]},
|
||||
{0x0085, 1, &mqc_states[81], &mqc_states[75]},
|
||||
{0x0049, 0, &mqc_states[82], &mqc_states[76]},
|
||||
{0x0049, 1, &mqc_states[83], &mqc_states[77]},
|
||||
{0x0025, 0, &mqc_states[84], &mqc_states[78]},
|
||||
{0x0025, 1, &mqc_states[85], &mqc_states[79]},
|
||||
{0x0015, 0, &mqc_states[86], &mqc_states[80]},
|
||||
{0x0015, 1, &mqc_states[87], &mqc_states[81]},
|
||||
{0x0009, 0, &mqc_states[88], &mqc_states[82]},
|
||||
{0x0009, 1, &mqc_states[89], &mqc_states[83]},
|
||||
{0x0005, 0, &mqc_states[90], &mqc_states[84]},
|
||||
{0x0005, 1, &mqc_states[91], &mqc_states[85]},
|
||||
{0x0001, 0, &mqc_states[90], &mqc_states[86]},
|
||||
{0x0001, 1, &mqc_states[91], &mqc_states[87]},
|
||||
{0x5601, 0, &mqc_states[92], &mqc_states[92]},
|
||||
{0x5601, 1, &mqc_states[93], &mqc_states[93]},
|
||||
};
|
||||
|
||||
#define MQC_NUMCTXS 32
|
||||
|
||||
unsigned int mqc_c;
|
||||
unsigned int mqc_a;
|
||||
unsigned int mqc_ct;
|
||||
unsigned char *mqc_bp;
|
||||
unsigned char *mqc_start;
|
||||
unsigned char *mqc_end;
|
||||
mqc_state_t *mqc_ctxs[MQC_NUMCTXS];
|
||||
mqc_state_t **mqc_curctx;
|
||||
|
||||
/* <summary> */
|
||||
/* Return the number of bytes already encoded. */
|
||||
/* </summary> */
|
||||
int mqc_numbytes()
|
||||
{
|
||||
return mqc_bp - mqc_start;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Output a byte, doing bit-stuffing if necessary. */
|
||||
/* After a 0xff byte, the next byte must be smaller than 0x90 */
|
||||
/* </summary> */
|
||||
void mqc_byteout()
|
||||
{
|
||||
if (*mqc_bp == 0xff) {
|
||||
mqc_bp++;
|
||||
*mqc_bp = mqc_c >> 20;
|
||||
mqc_c &= 0xfffff;
|
||||
mqc_ct = 7;
|
||||
} else {
|
||||
if ((mqc_c & 0x8000000) == 0) { /* ((mqc_c&0x8000000)==0) CHANGE */
|
||||
mqc_bp++;
|
||||
*mqc_bp = mqc_c >> 19;
|
||||
mqc_c &= 0x7ffff;
|
||||
mqc_ct = 8;
|
||||
} else {
|
||||
(*mqc_bp)++;
|
||||
if (*mqc_bp == 0xff) {
|
||||
mqc_c &= 0x7ffffff;
|
||||
mqc_bp++;
|
||||
*mqc_bp = mqc_c >> 20;
|
||||
mqc_c &= 0xfffff;
|
||||
mqc_ct = 7;
|
||||
} else {
|
||||
mqc_bp++;
|
||||
*mqc_bp = mqc_c >> 19;
|
||||
mqc_c &= 0x7ffff;
|
||||
mqc_ct = 8;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Renormalize mqc_a and mqc_c while encoding, so that mqc_a stays between 0x8000 and 0x10000 */
|
||||
/* </summary> */
|
||||
void mqc_renorme()
|
||||
{
|
||||
do {
|
||||
mqc_a <<= 1;
|
||||
mqc_c <<= 1;
|
||||
mqc_ct--;
|
||||
if (mqc_ct == 0) {
|
||||
mqc_byteout();
|
||||
}
|
||||
} while ((mqc_a & 0x8000) == 0);
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Encode the most probable symbol. */
|
||||
/* </summary> */
|
||||
void mqc_codemps()
|
||||
{
|
||||
mqc_a -= (*mqc_curctx)->qeval;
|
||||
if ((mqc_a & 0x8000) == 0) {
|
||||
if (mqc_a < (*mqc_curctx)->qeval) {
|
||||
mqc_a = (*mqc_curctx)->qeval;
|
||||
} else {
|
||||
mqc_c += (*mqc_curctx)->qeval;
|
||||
}
|
||||
*mqc_curctx = (*mqc_curctx)->nmps;
|
||||
mqc_renorme();
|
||||
} else {
|
||||
mqc_c += (*mqc_curctx)->qeval;
|
||||
}
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Encode the most least symbol. */
|
||||
/* </summary> */
|
||||
void mqc_codelps()
|
||||
{
|
||||
mqc_a -= (*mqc_curctx)->qeval;
|
||||
if (mqc_a < (*mqc_curctx)->qeval) {
|
||||
mqc_c += (*mqc_curctx)->qeval;
|
||||
} else {
|
||||
mqc_a = (*mqc_curctx)->qeval;
|
||||
}
|
||||
*mqc_curctx = (*mqc_curctx)->nlps;
|
||||
mqc_renorme();
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Initialize encoder. */
|
||||
/* </summary> */
|
||||
/* <param name="bp">Output buffer.</param> */
|
||||
void mqc_init_enc(unsigned char *bp)
|
||||
{
|
||||
mqc_setcurctx(0);
|
||||
mqc_a = 0x8000;
|
||||
mqc_c = 0;
|
||||
mqc_bp = bp - 1;
|
||||
mqc_ct = 12;
|
||||
if (*mqc_bp == 0xff) {
|
||||
mqc_ct = 13;
|
||||
}
|
||||
mqc_start = bp;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Set current context. */
|
||||
/* </summary> */
|
||||
/* <param name="ctxno">Context number.</param> */
|
||||
void mqc_setcurctx(int ctxno)
|
||||
{
|
||||
mqc_curctx = &mqc_ctxs[ctxno];
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Encode a symbol using the MQ-coder. */
|
||||
/* </summary> */
|
||||
/* <param name="d"> The symbol to be encoded (0 or 1).</param> */
|
||||
void mqc_encode(int d)
|
||||
{
|
||||
if ((*mqc_curctx)->mps == d) {
|
||||
mqc_codemps();
|
||||
} else {
|
||||
mqc_codelps();
|
||||
}
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Fill mqc_c with 1's for flushing */
|
||||
/* </summary> */
|
||||
void mqc_setbits()
|
||||
{
|
||||
unsigned int tempc = mqc_c + mqc_a;
|
||||
mqc_c |= 0xffff;
|
||||
if (mqc_c >= tempc) {
|
||||
mqc_c -= 0x8000;
|
||||
}
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Flush encoded data. */
|
||||
/* </summary> */
|
||||
void mqc_flush()
|
||||
{
|
||||
mqc_setbits();
|
||||
mqc_c <<= mqc_ct;
|
||||
mqc_byteout();
|
||||
mqc_c <<= mqc_ct;
|
||||
mqc_byteout();
|
||||
|
||||
if (*mqc_bp != 0xff) {
|
||||
mqc_bp++;
|
||||
}
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* not fully implemented and tested !! */
|
||||
/* BYPASS mode switch, initialization operation */
|
||||
/* JPEG 2000 p 505 */
|
||||
/* </summary> */
|
||||
void mqc_bypass_init_enc()
|
||||
{
|
||||
mqc_c = 0;
|
||||
mqc_ct = 8;
|
||||
if (*mqc_bp == 0xff) {
|
||||
mqc_ct = 7;
|
||||
}
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* not fully implemented and tested !! */
|
||||
/* BYPASS mode switch, coding operation */
|
||||
/* JPEG 2000 p 505 */
|
||||
/* </summary> */
|
||||
void mqc_bypass_enc(int d)
|
||||
{
|
||||
mqc_ct--;
|
||||
mqc_c = mqc_c + (d << mqc_ct);
|
||||
if (mqc_ct == 0) {
|
||||
mqc_bp++;
|
||||
*mqc_bp = mqc_c;
|
||||
mqc_ct = 8;
|
||||
if (*mqc_bp == 0xff) {
|
||||
mqc_ct = 7;
|
||||
}
|
||||
mqc_c = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* not fully implemented and tested !! */
|
||||
/* BYPASS mode switch, flush operation */
|
||||
/* </summary> */
|
||||
int mqc_bypass_flush_enc()
|
||||
{
|
||||
unsigned char bit_padding;
|
||||
|
||||
bit_padding = 0;
|
||||
|
||||
if (mqc_ct != 0) {
|
||||
while (mqc_ct > 0) {
|
||||
mqc_ct--;
|
||||
mqc_c += bit_padding << mqc_ct;
|
||||
bit_padding = (bit_padding + 1) & 0x01;
|
||||
}
|
||||
mqc_bp++;
|
||||
*mqc_bp = mqc_c;
|
||||
mqc_ct = 8;
|
||||
mqc_c = 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* RESET mode switch */
|
||||
/* </summary> */
|
||||
void mqc_reset_enc()
|
||||
{
|
||||
mqc_resetstates();
|
||||
mqc_setstate(18, 0, 46);
|
||||
mqc_setstate(0, 0, 3);
|
||||
mqc_setstate(1, 0, 4);
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* mode switch RESTART (TERMALL) */
|
||||
/* </summary> */
|
||||
int mqc_restart_enc()
|
||||
{
|
||||
int correction = 1;
|
||||
|
||||
/* <flush part> */
|
||||
int n = 27 - 15 - mqc_ct;
|
||||
mqc_c <<= mqc_ct;
|
||||
while (n > 0) {
|
||||
mqc_byteout();
|
||||
n -= mqc_ct;
|
||||
mqc_c <<= mqc_ct;
|
||||
}
|
||||
mqc_byteout();
|
||||
|
||||
return correction;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* mode switch RESTART (TERMALL) reinitialisation */
|
||||
/* </summary> */
|
||||
void mqc_restart_init_enc()
|
||||
{
|
||||
/* <Re-init part> */
|
||||
mqc_a = 0x8000;
|
||||
mqc_c = 0;
|
||||
mqc_ct = 12;
|
||||
mqc_bp--;
|
||||
if (*mqc_bp == 0xff) {
|
||||
mqc_ct = 13;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* <summary> */
|
||||
/* ERTERM mode switch */
|
||||
/* </summary> */
|
||||
void mqc_erterm_enc()
|
||||
{
|
||||
int k = 11 - mqc_ct + 1;
|
||||
|
||||
while (k > 0) {
|
||||
mqc_c <<= mqc_ct;
|
||||
mqc_ct = 0;
|
||||
mqc_byteout();
|
||||
k -= mqc_ct;
|
||||
}
|
||||
|
||||
if (*mqc_bp != 0xff) {
|
||||
mqc_byteout();
|
||||
}
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* SEGMARK mode switch (SEGSYM) */
|
||||
/* </summary> */
|
||||
void mqc_segmark_enc()
|
||||
{
|
||||
int i;
|
||||
mqc_setcurctx(18);
|
||||
|
||||
for (i = 1; i < 5; i++) {
|
||||
mqc_encode(i % 2);
|
||||
}
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* </summary> */
|
||||
int mqc_mpsexchange()
|
||||
{
|
||||
int d;
|
||||
if (mqc_a < (*mqc_curctx)->qeval) {
|
||||
d = 1 - (*mqc_curctx)->mps;
|
||||
*mqc_curctx = (*mqc_curctx)->nlps;
|
||||
} else {
|
||||
d = (*mqc_curctx)->mps;
|
||||
*mqc_curctx = (*mqc_curctx)->nmps;
|
||||
}
|
||||
return d;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* </summary> */
|
||||
int mqc_lpsexchange()
|
||||
{
|
||||
int d;
|
||||
if (mqc_a < (*mqc_curctx)->qeval) {
|
||||
mqc_a = (*mqc_curctx)->qeval;
|
||||
d = (*mqc_curctx)->mps;
|
||||
*mqc_curctx = (*mqc_curctx)->nmps;
|
||||
} else {
|
||||
mqc_a = (*mqc_curctx)->qeval;
|
||||
d = 1 - (*mqc_curctx)->mps;
|
||||
*mqc_curctx = (*mqc_curctx)->nlps;
|
||||
}
|
||||
return d;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Input a byte. */
|
||||
/* </summary> */
|
||||
void mqc_bytein()
|
||||
{
|
||||
if (mqc_bp != mqc_end) {
|
||||
unsigned int c;
|
||||
if (mqc_bp + 1 != mqc_end) {
|
||||
c = *(mqc_bp + 1);
|
||||
} else {
|
||||
c = 0xff;
|
||||
}
|
||||
if (*mqc_bp == 0xff) {
|
||||
if (c > 0x8f) {
|
||||
mqc_c += 0xff00;
|
||||
mqc_ct = 8;
|
||||
} else {
|
||||
mqc_bp++;
|
||||
mqc_c += c << 9;
|
||||
mqc_ct = 7;
|
||||
}
|
||||
} else {
|
||||
mqc_bp++;
|
||||
mqc_c += c << 8;
|
||||
mqc_ct = 8;
|
||||
}
|
||||
} else {
|
||||
mqc_c += 0xff00;
|
||||
mqc_ct = 8;
|
||||
}
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Renormalize mqc_a and mqc_c while decoding. */
|
||||
/* </summary> */
|
||||
void mqc_renormd()
|
||||
{
|
||||
do {
|
||||
if (mqc_ct == 0) {
|
||||
mqc_bytein();
|
||||
}
|
||||
mqc_a <<= 1;
|
||||
mqc_c <<= 1;
|
||||
mqc_ct--;
|
||||
} while (mqc_a < 0x8000);
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Initialize decoder. */
|
||||
/* </summary> */
|
||||
void mqc_init_dec(unsigned char *bp, int len)
|
||||
{
|
||||
mqc_setcurctx(0);
|
||||
mqc_start = bp;
|
||||
mqc_end = bp + len;
|
||||
mqc_bp = bp;
|
||||
mqc_c = *mqc_bp << 16;
|
||||
mqc_bytein();
|
||||
mqc_c <<= 7;
|
||||
mqc_ct -= 7;
|
||||
mqc_a = 0x8000;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Decode a symbol. */
|
||||
/* </summary> */
|
||||
int mqc_decode()
|
||||
{
|
||||
int d;
|
||||
mqc_a -= (*mqc_curctx)->qeval;
|
||||
if ((mqc_c >> 16) < (*mqc_curctx)->qeval) {
|
||||
d = mqc_lpsexchange();
|
||||
mqc_renormd();
|
||||
} else {
|
||||
mqc_c -= (*mqc_curctx)->qeval << 16;
|
||||
if ((mqc_a & 0x8000) == 0) {
|
||||
d = mqc_mpsexchange();
|
||||
mqc_renormd();
|
||||
} else {
|
||||
d = (*mqc_curctx)->mps;
|
||||
}
|
||||
}
|
||||
return d;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Reset states of all contexts. */
|
||||
/* </summary> */
|
||||
void mqc_resetstates()
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < MQC_NUMCTXS; i++) {
|
||||
mqc_ctxs[i] = mqc_states;
|
||||
}
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Set the state for a context. */
|
||||
/* </summary> */
|
||||
/* <param name="ctxno">Context number</param> */
|
||||
/* <param name="msb">Most significant bit</param> */
|
||||
/* <param name="prob">Index to the probability of symbols</param> */
|
||||
void mqc_setstate(int ctxno, int msb, int prob)
|
||||
{
|
||||
mqc_ctxs[ctxno] = &mqc_states[msb + (prob << 1)];
|
||||
}
|
||||
@@ -1,127 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2002, David Janssens
|
||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
||||
* Copyright (c) 2002-2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef __MQC_H
|
||||
#define __MQC_H
|
||||
|
||||
/*
|
||||
* Return the number of bytes written/read since initialisation
|
||||
*/
|
||||
int mqc_numbytes();
|
||||
|
||||
/*
|
||||
* Reset the states of all the context of the coder/decoder
|
||||
* (each context is set to a state where 0 and 1 are more or less equiprobable)
|
||||
*/
|
||||
void mqc_resetstates();
|
||||
|
||||
/*
|
||||
* Set the state of a particular context
|
||||
* ctxno: number that identifies the context
|
||||
* msb: the MSB of the new state of the context
|
||||
* prob: number that identifies the probability of the symbols for the new state of the context
|
||||
*/
|
||||
void mqc_setstate(int ctxno, int msb, int prob);
|
||||
|
||||
/*
|
||||
* Initialize the encoder
|
||||
* bp: pointer to the start of the buffer where the bytes will be written
|
||||
*/
|
||||
void mqc_init_enc(unsigned char *bp);
|
||||
|
||||
/*
|
||||
* Set the current context used for coding/decoding
|
||||
* ctxno: number that identifies the context
|
||||
*/
|
||||
void mqc_setcurctx(int ctxno);
|
||||
|
||||
/*
|
||||
* Encode a bit
|
||||
* d: bit to encode (0 or 1)
|
||||
*/
|
||||
void mqc_encode(int d);
|
||||
|
||||
/*
|
||||
* Flush the encoder, so that all remaining data is written
|
||||
*/
|
||||
void mqc_flush();
|
||||
|
||||
/*
|
||||
* BYPASS mode switch
|
||||
*/
|
||||
void mqc_bypass_init_enc();
|
||||
|
||||
/*
|
||||
* BYPASS mode switch
|
||||
*/
|
||||
void mqc_bypass_enc();
|
||||
|
||||
/*
|
||||
* BYPASS mode switch
|
||||
*/
|
||||
int mqc_bypass_flush_enc();
|
||||
|
||||
/*
|
||||
* RESET mode switch
|
||||
*/
|
||||
void mqc_reset_enc();
|
||||
|
||||
/*
|
||||
* RESTART mode switch (TERMALL)
|
||||
*/
|
||||
int mqc_restart_enc();
|
||||
|
||||
/*
|
||||
* RESTART mode switch (TERMALL)
|
||||
*/
|
||||
void mqc_restart_init_enc();
|
||||
|
||||
/*
|
||||
* ERTERM mode switch (PTERM)
|
||||
*/
|
||||
void mqc_erterm_enc();
|
||||
|
||||
/*
|
||||
* SEGMARK mode switch (SEGSYM)
|
||||
*/
|
||||
void mqc_segmark_enc();
|
||||
|
||||
|
||||
/*
|
||||
* Initialize the decoder
|
||||
* bp: pointer to the start of the buffer from which the bytes will be read
|
||||
* len: length of the input buffer
|
||||
*/
|
||||
void mqc_init_dec(unsigned char *bp, int len);
|
||||
|
||||
/*
|
||||
* Decode a bit (returns 0 or 1)
|
||||
*/
|
||||
int mqc_decode();
|
||||
|
||||
#endif
|
||||
@@ -1,48 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2002, David Janssens
|
||||
* Copyright (c) 2003, Yannick Verschueren
|
||||
* Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef __OPENJPEG_H
|
||||
#define __OPENJPEG_H
|
||||
|
||||
#include <j2k.h>
|
||||
#include <tcd.h>
|
||||
|
||||
#include <bio.h>
|
||||
#include <cio.h>
|
||||
#include <dwt.h>
|
||||
#include <fix.h>
|
||||
#include <int.h>
|
||||
#include <mct.h>
|
||||
#include <mqc.h>
|
||||
#include <pi.h>
|
||||
#include <raw.h>
|
||||
#include <t1.h>
|
||||
#include <t2.h>
|
||||
#include <tgt.h>
|
||||
|
||||
#endif
|
||||
488
libopenjpeg/pi.c
488
libopenjpeg/pi.c
@@ -1,488 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2002, David Janssens
|
||||
* Copyright (c) 2003, Yannick Verschueren
|
||||
* Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
||||
* 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 "pi.h"
|
||||
#include "int.h"
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
/* <summary> */
|
||||
/* Create a packet iterator. */
|
||||
/* </summary> */
|
||||
pi_iterator_t *pi_create(j2k_image_t * img, j2k_cp_t * cp, int tileno)
|
||||
{
|
||||
int p, q;
|
||||
int compno, resno, pino, layno, precno;
|
||||
int maxres = 0;
|
||||
pi_iterator_t *pi;
|
||||
j2k_tcp_t *tcp;
|
||||
j2k_tccp_t *tccp;
|
||||
|
||||
tcp = &cp->tcps[tileno];
|
||||
pi =
|
||||
(pi_iterator_t *) malloc((tcp->numpocs + 1) * sizeof(pi_iterator_t));
|
||||
|
||||
for (pino = 0; pino < tcp->numpocs + 1; pino++) { /* change */
|
||||
p = tileno % cp->tw;
|
||||
q = tileno / cp->tw;
|
||||
|
||||
/* pi->tx0=int_max(cp->tx0+p*cp->tdx, img->x0);
|
||||
pi->ty0=int_max(cp->ty0+q*cp->tdy, img->y0);
|
||||
pi->tx1=int_min(cp->tx0+(p+1)*cp->tdx, img->x1);
|
||||
pi->ty1=int_min(cp->ty0+(q+1)*cp->tdy, img->y1);
|
||||
pi->numcomps=img->numcomps;
|
||||
pi->comps=(pi_comp_t*)malloc(img->numcomps*sizeof(pi_comp_t)); */
|
||||
|
||||
pi[pino].tx0 = int_max(cp->tx0 + p * cp->tdx, img->x0);
|
||||
pi[pino].ty0 = int_max(cp->ty0 + q * cp->tdy, img->y0);
|
||||
pi[pino].tx1 = int_min(cp->tx0 + (p + 1) * cp->tdx, img->x1);
|
||||
pi[pino].ty1 = int_min(cp->ty0 + (q + 1) * cp->tdy, img->y1);
|
||||
pi[pino].numcomps = img->numcomps;
|
||||
pi[pino].comps =
|
||||
(pi_comp_t *) malloc(img->numcomps * sizeof(pi_comp_t));
|
||||
|
||||
for (compno = 0; compno < pi->numcomps; compno++) {
|
||||
int tcx0, tcy0, tcx1, tcy1;
|
||||
/* pi_comp_t *comp=&pi->comps[compno]; */
|
||||
pi_comp_t *comp = &pi[pino].comps[compno];
|
||||
tccp = &tcp->tccps[compno];
|
||||
comp->dx = img->comps[compno].dx;
|
||||
comp->dy = img->comps[compno].dy;
|
||||
comp->numresolutions = tccp->numresolutions;
|
||||
comp->resolutions =
|
||||
(pi_resolution_t *) malloc(comp->numresolutions *
|
||||
sizeof(pi_resolution_t));
|
||||
tcx0 = int_ceildiv(pi->tx0, comp->dx);
|
||||
tcy0 = int_ceildiv(pi->ty0, comp->dy);
|
||||
tcx1 = int_ceildiv(pi->tx1, comp->dx);
|
||||
tcy1 = int_ceildiv(pi->ty1, comp->dy);
|
||||
if (comp->numresolutions > maxres) {
|
||||
maxres = comp->numresolutions;
|
||||
}
|
||||
for (resno = 0; resno < comp->numresolutions; resno++) {
|
||||
int levelno;
|
||||
int rx0, ry0, rx1, ry1;
|
||||
int px0, py0, px1, py1;
|
||||
pi_resolution_t *res = &comp->resolutions[resno];
|
||||
if (tccp->csty & J2K_CCP_CSTY_PRT) {
|
||||
res->pdx = tccp->prcw[resno];
|
||||
res->pdy = tccp->prch[resno];
|
||||
} else {
|
||||
res->pdx = 15;
|
||||
res->pdy = 15;
|
||||
}
|
||||
levelno = comp->numresolutions - 1 - resno;
|
||||
rx0 = int_ceildivpow2(tcx0, levelno);
|
||||
ry0 = int_ceildivpow2(tcy0, levelno);
|
||||
rx1 = int_ceildivpow2(tcx1, levelno);
|
||||
ry1 = int_ceildivpow2(tcy1, levelno);
|
||||
px0 = int_floordivpow2(rx0, res->pdx) << res->pdx;
|
||||
py0 = int_floordivpow2(ry0, res->pdy) << res->pdy;
|
||||
px1 = int_ceildivpow2(rx1, res->pdx) << res->pdx;
|
||||
py1 = int_ceildivpow2(ry1, res->pdy) << res->pdy;
|
||||
res->pw = (px1 - px0) >> res->pdx;
|
||||
res->ph = (py1 - py0) >> res->pdy;
|
||||
}
|
||||
}
|
||||
|
||||
/* pi->first=1;
|
||||
pi->poc.resno0=0;
|
||||
pi->poc.compno0=0;
|
||||
pi->poc.layno1=tcp->numlayers;
|
||||
pi->poc.resno1=maxres;
|
||||
pi->poc.compno1=img->numcomps;
|
||||
pi->poc.prg=tcp->prg; */
|
||||
|
||||
for (layno = 0; layno < 10; layno++) {
|
||||
/* pi_comp_t *compo; */
|
||||
/* pi_resolution_t *res; */
|
||||
for (resno = 0; resno < 10; resno++) {
|
||||
for (compno = 0; compno < 3; compno++) {
|
||||
/* compo=&pi[pino].comps[compno]; */
|
||||
/* res=&compo->resolutions[pi->resno]; */
|
||||
for (precno = 0; precno < 99; precno++) {
|
||||
pi[pino].include[layno][resno][compno][precno] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (pino == tcp->numpocs) {
|
||||
pi[pino].first = 1;
|
||||
pi[pino].poc.resno0 = 0;
|
||||
pi[pino].poc.compno0 = 0;
|
||||
pi[pino].poc.layno1 = tcp->numlayers;
|
||||
pi[pino].poc.resno1 = maxres;
|
||||
pi[pino].poc.compno1 = img->numcomps;
|
||||
pi[pino].poc.prg = tcp->prg;
|
||||
} else {
|
||||
pi[pino].first = 1;
|
||||
pi[pino].poc.resno0 = tcp->pocs[pino].resno0;
|
||||
pi[pino].poc.compno0 = tcp->pocs[pino].compno0;
|
||||
pi[pino].poc.layno1 = tcp->pocs[pino].layno1;
|
||||
pi[pino].poc.resno1 = tcp->pocs[pino].resno1;
|
||||
pi[pino].poc.compno1 = tcp->pocs[pino].compno1;
|
||||
pi[pino].poc.prg = tcp->pocs[pino].prg;
|
||||
}
|
||||
}
|
||||
return pi;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Get next packet in layer=resolution-component-precinct order. */
|
||||
/* </summary> */
|
||||
int pi_next_lrcp(pi_iterator_t * pi)
|
||||
{
|
||||
pi_comp_t *comp;
|
||||
pi_resolution_t *res;
|
||||
|
||||
if (!pi->first) {
|
||||
comp = &pi->comps[pi->compno];
|
||||
res = &comp->resolutions[pi->resno];
|
||||
goto skip;
|
||||
} else {
|
||||
pi->first = 0;
|
||||
}
|
||||
for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) {
|
||||
for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1;
|
||||
pi->resno++) {
|
||||
for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1;
|
||||
pi->compno++) {
|
||||
comp = &pi->comps[pi->compno];
|
||||
if (pi->resno >= comp->numresolutions) {
|
||||
|
||||
continue;
|
||||
}
|
||||
res = &comp->resolutions[pi->resno];
|
||||
for (pi->precno = 0; pi->precno < res->pw * res->ph; pi->precno++) {
|
||||
if (!pi->include[pi->layno][pi->resno][pi->compno][pi->precno]) {
|
||||
pi->include[pi->layno][pi->resno][pi->compno][pi->precno] = 1;
|
||||
return 1;
|
||||
}
|
||||
skip:;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Get next packet in resolution-layer-component-precinct order. */
|
||||
/* </summary> */
|
||||
int pi_next_rlcp(pi_iterator_t * pi)
|
||||
{
|
||||
pi_comp_t *comp;
|
||||
pi_resolution_t *res;
|
||||
if (!pi->first) {
|
||||
comp = &pi->comps[pi->compno];
|
||||
res = &comp->resolutions[pi->resno];
|
||||
goto skip;
|
||||
} else {
|
||||
pi->first = 0;
|
||||
}
|
||||
for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) {
|
||||
for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) {
|
||||
for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1;
|
||||
pi->compno++) {
|
||||
comp = &pi->comps[pi->compno];
|
||||
if (pi->resno >= comp->numresolutions) {
|
||||
continue;
|
||||
}
|
||||
res = &comp->resolutions[pi->resno];
|
||||
for (pi->precno = 0; pi->precno < res->pw * res->ph; pi->precno++) {
|
||||
if (!pi->include[pi->layno][pi->resno][pi->compno][pi->precno]) {
|
||||
pi->include[pi->layno][pi->resno][pi->compno][pi->precno] = 1;
|
||||
return 1;
|
||||
}
|
||||
skip:;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Get next packet in resolution-precinct-component-layer order. */
|
||||
/* </summary> */
|
||||
int pi_next_rpcl(pi_iterator_t * pi)
|
||||
{
|
||||
pi_comp_t *comp;
|
||||
pi_resolution_t *res;
|
||||
if (!pi->first) {
|
||||
goto skip;
|
||||
} else {
|
||||
int compno, resno;
|
||||
pi->first = 0;
|
||||
pi->dx = 0;
|
||||
pi->dy = 0;
|
||||
for (compno = 0; compno < pi->numcomps; compno++) {
|
||||
comp = &pi->comps[compno];
|
||||
for (resno = 0; resno < comp->numresolutions; resno++) {
|
||||
int dx, dy;
|
||||
res = &comp->resolutions[resno];
|
||||
dx =
|
||||
comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno));
|
||||
dy =
|
||||
comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno));
|
||||
pi->dx = !pi->dx ? dx : int_min(pi->dx, dx);
|
||||
pi->dy = !pi->dy ? dy : int_min(pi->dy, dy);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) {
|
||||
for (pi->y = pi->ty0; pi->y < pi->ty1;
|
||||
pi->y += pi->dy - (pi->y % pi->dy)) {
|
||||
for (pi->x = pi->tx0; pi->x < pi->tx1;
|
||||
pi->x += pi->dx - (pi->x % pi->dx)) {
|
||||
for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1;
|
||||
pi->compno++) {
|
||||
int levelno;
|
||||
int trx0, try0;
|
||||
int rpx, rpy;
|
||||
int prci, prcj;
|
||||
comp = &pi->comps[pi->compno];
|
||||
if (pi->resno >= comp->numresolutions) {
|
||||
continue;
|
||||
}
|
||||
res = &comp->resolutions[pi->resno];
|
||||
levelno = comp->numresolutions - 1 - pi->resno;
|
||||
trx0 = int_ceildiv(pi->tx0, comp->dx << levelno);
|
||||
try0 = int_ceildiv(pi->ty0, comp->dy << levelno);
|
||||
rpx = res->pdx + levelno;
|
||||
rpy = res->pdy + levelno;
|
||||
if (!
|
||||
(pi->x % (comp->dx << rpx) == 0
|
||||
|| (pi->x == pi->tx0 && (trx0 << levelno) % (1 << rpx)))) {
|
||||
continue;
|
||||
}
|
||||
if (!
|
||||
(pi->y % (comp->dy << rpy) == 0
|
||||
|| (pi->y == pi->ty0 && (try0 << levelno) % (1 << rpx)))) {
|
||||
continue;
|
||||
}
|
||||
prci =
|
||||
int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno),
|
||||
res->pdx) - int_floordivpow2(trx0, res->pdx);
|
||||
prcj =
|
||||
int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno),
|
||||
res->pdy) - int_floordivpow2(try0, res->pdy);
|
||||
pi->precno = prci + prcj * res->pw;
|
||||
for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) {
|
||||
if (!pi->include[pi->layno][pi->resno][pi->compno][pi->precno]) {
|
||||
pi->include[pi->layno][pi->resno][pi->compno][pi->precno] =
|
||||
1;
|
||||
return 1;
|
||||
}
|
||||
skip:;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Get next packet in precinct-component-resolution-layer order. */
|
||||
/* </summary> */
|
||||
int pi_next_pcrl(pi_iterator_t * pi)
|
||||
{
|
||||
pi_comp_t *comp;
|
||||
pi_resolution_t *res;
|
||||
if (!pi->first) {
|
||||
comp = &pi->comps[pi->compno];
|
||||
goto skip;
|
||||
} else {
|
||||
int compno, resno;
|
||||
pi->first = 0;
|
||||
pi->dx = 0;
|
||||
pi->dy = 0;
|
||||
for (compno = 0; compno < pi->numcomps; compno++) {
|
||||
comp = &pi->comps[compno];
|
||||
for (resno = 0; resno < comp->numresolutions; resno++) {
|
||||
int dx, dy;
|
||||
res = &comp->resolutions[resno];
|
||||
dx =
|
||||
comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno));
|
||||
dy =
|
||||
comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno));
|
||||
pi->dx = !pi->dx ? dx : int_min(pi->dx, dx);
|
||||
pi->dy = !pi->dy ? dy : int_min(pi->dy, dy);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (pi->y = pi->ty0; pi->y < pi->ty1;
|
||||
pi->y += pi->dy - (pi->y % pi->dy)) {
|
||||
for (pi->x = pi->tx0; pi->x < pi->tx1;
|
||||
pi->x += pi->dx - (pi->x % pi->dx)) {
|
||||
for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1;
|
||||
pi->compno++) {
|
||||
comp = &pi->comps[pi->compno];
|
||||
for (pi->resno = pi->poc.resno0;
|
||||
pi->resno < int_min(pi->poc.resno1, comp->numresolutions);
|
||||
pi->resno++) {
|
||||
int levelno;
|
||||
int trx0, try0;
|
||||
int rpx, rpy;
|
||||
int prci, prcj;
|
||||
res = &comp->resolutions[pi->resno];
|
||||
levelno = comp->numresolutions - 1 - pi->resno;
|
||||
trx0 = int_ceildiv(pi->tx0, comp->dx << levelno);
|
||||
try0 = int_ceildiv(pi->ty0, comp->dy << levelno);
|
||||
rpx = res->pdx + levelno;
|
||||
rpy = res->pdy + levelno;
|
||||
if (!
|
||||
(pi->x % (comp->dx << rpx) == 0
|
||||
|| (pi->x == pi->tx0 && (trx0 << levelno) % (1 << rpx)))) {
|
||||
continue;
|
||||
}
|
||||
if (!
|
||||
(pi->y % (comp->dy << rpy) == 0
|
||||
|| (pi->y == pi->ty0 && (try0 << levelno) % (1 << rpx)))) {
|
||||
continue;
|
||||
}
|
||||
prci =
|
||||
int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno),
|
||||
res->pdx) - int_floordivpow2(trx0, res->pdx);
|
||||
prcj =
|
||||
int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno),
|
||||
res->pdy) - int_floordivpow2(try0, res->pdy);
|
||||
pi->precno = prci + prcj * res->pw;
|
||||
for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) {
|
||||
if (!pi->include[pi->layno][pi->resno][pi->compno][pi->precno]) {
|
||||
pi->include[pi->layno][pi->resno][pi->compno][pi->precno] =
|
||||
1;
|
||||
return 1;
|
||||
}
|
||||
skip:;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Get next packet in component-precinct-resolution-layer order. */
|
||||
/* </summary> */
|
||||
int pi_next_cprl(pi_iterator_t * pi)
|
||||
{
|
||||
pi_comp_t *comp;
|
||||
pi_resolution_t *res;
|
||||
if (!pi->first) {
|
||||
comp = &pi->comps[pi->compno];
|
||||
goto skip;
|
||||
} else {
|
||||
pi->first = 0;
|
||||
}
|
||||
for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1;
|
||||
pi->compno++) {
|
||||
int resno;
|
||||
comp = &pi->comps[pi->compno];
|
||||
pi->dx = 0;
|
||||
pi->dy = 0;
|
||||
for (resno = 0; resno < comp->numresolutions; resno++) {
|
||||
int dx, dy;
|
||||
res = &comp->resolutions[resno];
|
||||
dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno));
|
||||
dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno));
|
||||
pi->dx = !pi->dx ? dx : int_min(pi->dx, dx);
|
||||
pi->dy = !pi->dy ? dy : int_min(pi->dy, dy);
|
||||
}
|
||||
for (pi->y = pi->ty0; pi->y < pi->ty1;
|
||||
pi->y += pi->dy - (pi->y % pi->dy)) {
|
||||
for (pi->x = pi->tx0; pi->x < pi->tx1;
|
||||
pi->x += pi->dx - (pi->x % pi->dx)) {
|
||||
for (pi->resno = pi->poc.resno0;
|
||||
pi->resno < int_min(pi->poc.resno1, comp->numresolutions);
|
||||
pi->resno++) {
|
||||
int levelno;
|
||||
int trx0, try0;
|
||||
int rpx, rpy;
|
||||
int prci, prcj;
|
||||
res = &comp->resolutions[pi->resno];
|
||||
levelno = comp->numresolutions - 1 - pi->resno;
|
||||
trx0 = int_ceildiv(pi->tx0, comp->dx << levelno);
|
||||
try0 = int_ceildiv(pi->ty0, comp->dy << levelno);
|
||||
rpx = res->pdx + levelno;
|
||||
rpy = res->pdy + levelno;
|
||||
if (!
|
||||
(pi->x % (comp->dx << rpx) == 0
|
||||
|| (pi->x == pi->tx0 && (trx0 << levelno) % (1 << rpx)))) {
|
||||
continue;
|
||||
}
|
||||
if (!
|
||||
(pi->y % (comp->dy << rpy) == 0
|
||||
|| (pi->y == pi->ty0 && (try0 << levelno) % (1 << rpx)))) {
|
||||
continue;
|
||||
}
|
||||
prci =
|
||||
int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno),
|
||||
res->pdx) - int_floordivpow2(trx0, res->pdx);
|
||||
prcj =
|
||||
int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno),
|
||||
res->pdy) - int_floordivpow2(try0, res->pdy);
|
||||
pi->precno = prci + prcj * res->pw;
|
||||
for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) {
|
||||
if (!pi->include[pi->layno][pi->resno][pi->compno][pi->precno]) {
|
||||
pi->include[pi->layno][pi->resno][pi->compno][pi->precno] =
|
||||
1;
|
||||
return 1;
|
||||
}
|
||||
skip:;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Get next packet. */
|
||||
/* </summary> */
|
||||
int pi_next(pi_iterator_t * pi)
|
||||
{
|
||||
switch (pi->poc.prg) {
|
||||
case 0:
|
||||
return pi_next_lrcp(pi);
|
||||
case 1:
|
||||
return pi_next_rlcp(pi);
|
||||
case 2:
|
||||
return pi_next_rpcl(pi);
|
||||
case 3:
|
||||
return pi_next_pcrl(pi);
|
||||
case 4:
|
||||
return pi_next_cprl(pi);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -1,129 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002-2003, Antonin Descampe
|
||||
* 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 "raw.h"
|
||||
|
||||
|
||||
unsigned char raw_c;
|
||||
unsigned int raw_ct, raw_lenmax, raw_len;
|
||||
unsigned char *raw_bp;
|
||||
unsigned char *raw_start;
|
||||
unsigned char *raw_end;
|
||||
|
||||
/* <summary> */
|
||||
/* Return the number of bytes already encoded. */
|
||||
/* </summary> */
|
||||
int raw_numbytes()
|
||||
{
|
||||
return raw_bp - raw_start;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Initialize raw-encoder. */
|
||||
/* </summary> */
|
||||
/* <param name="bp">Output buffer.</param> */
|
||||
void raw_init_enc(unsigned char *bp)
|
||||
{
|
||||
raw_bp = bp - 1;
|
||||
raw_c = 0;
|
||||
raw_ct = 7;
|
||||
raw_start = bp;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Encode a symbol using the RAW-coder. */
|
||||
/* </summary> */
|
||||
/* <param name="d"> The symbol to be encoded (0 or 1).</param> */
|
||||
void raw_encode(int d)
|
||||
{
|
||||
/* raw_c+=d; */
|
||||
|
||||
raw_ct--;
|
||||
raw_c += (d << raw_ct);
|
||||
|
||||
if (raw_ct == 0) {
|
||||
raw_bp++;
|
||||
*raw_bp = raw_c;
|
||||
raw_ct = 7;
|
||||
if (raw_c == 0xff) {
|
||||
raw_ct = 6;
|
||||
}
|
||||
raw_c = 0;
|
||||
}
|
||||
/*else
|
||||
{
|
||||
raw_ct--;
|
||||
raw_c<<=1;
|
||||
} */
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Flush encoded data. */
|
||||
/* </summary> */
|
||||
void raw_flush()
|
||||
{
|
||||
char first = 1;
|
||||
int prev = 1;
|
||||
while (raw_ct != 7) {
|
||||
raw_encode(first ? 0 : !(prev));
|
||||
prev = first ? 0 : !(prev);
|
||||
first = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Initialize raw-decoder. */
|
||||
/* </summary> */
|
||||
void raw_init_dec(unsigned char *bp, int len)
|
||||
{
|
||||
raw_start = bp;
|
||||
raw_lenmax = len;
|
||||
raw_len = 0;
|
||||
raw_c = 0;
|
||||
raw_ct = 0;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Decode a symbol using raw-decoder. Cfr p.506 TAUBMAN */
|
||||
/* </summary> */
|
||||
int raw_decode()
|
||||
{
|
||||
int d;
|
||||
if (raw_ct == 0) {
|
||||
raw_ct = 8;
|
||||
if (raw_len == raw_lenmax)
|
||||
raw_c = 0xff;
|
||||
else {
|
||||
if (raw_c == 0xff)
|
||||
raw_ct = 7;
|
||||
raw_c = *(raw_start + raw_len);
|
||||
raw_len++;
|
||||
}
|
||||
}
|
||||
raw_ct--;
|
||||
d = (raw_c >> raw_ct) & 0x01;
|
||||
return d;
|
||||
}
|
||||
1077
libopenjpeg/t1.c
1077
libopenjpeg/t1.c
File diff suppressed because it is too large
Load Diff
505
libopenjpeg/t2.c
505
libopenjpeg/t2.c
@@ -1,505 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2002, David Janssens
|
||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
||||
* Copyright (c) 2002-2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
||||
* 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 "t2.h"
|
||||
#include "tcd.h"
|
||||
#include "bio.h"
|
||||
#include "j2k.h"
|
||||
#include "pi.h"
|
||||
#include "tgt.h"
|
||||
#include "int.h"
|
||||
#include "cio.h"
|
||||
#include <stdio.h>
|
||||
#include <setjmp.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define RESTART 0x04
|
||||
|
||||
extern jmp_buf j2k_error;
|
||||
|
||||
void t2_putcommacode(int n)
|
||||
{
|
||||
while (--n >= 0) {
|
||||
bio_write(1, 1);
|
||||
}
|
||||
bio_write(0, 1);
|
||||
}
|
||||
|
||||
int t2_getcommacode()
|
||||
{
|
||||
int n;
|
||||
for (n = 0; bio_read(1); n++) {
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Variable length code for signalling delta Zil (truncation point) */
|
||||
/* <val> n : delta Zil */
|
||||
/* <\summary> */
|
||||
void t2_putnumpasses(int n)
|
||||
{
|
||||
if (n == 1) {
|
||||
bio_write(0, 1);
|
||||
} else if (n == 2) {
|
||||
bio_write(2, 2);
|
||||
} else if (n <= 5) {
|
||||
bio_write(0xc | (n - 3), 4);
|
||||
} else if (n <= 36) {
|
||||
bio_write(0x1e0 | (n - 6), 9);
|
||||
} else if (n <= 164) {
|
||||
bio_write(0xff80 | (n - 37), 16);
|
||||
}
|
||||
}
|
||||
|
||||
int t2_getnumpasses()
|
||||
{
|
||||
int n;
|
||||
if (!bio_read(1))
|
||||
return 1;
|
||||
if (!bio_read(1))
|
||||
return 2;
|
||||
if ((n = bio_read(2)) != 3)
|
||||
return 3 + n;
|
||||
if ((n = bio_read(5)) != 31)
|
||||
return 6 + n;
|
||||
return 37 + bio_read(7);
|
||||
}
|
||||
|
||||
int t2_encode_packet(tcd_tile_t * tile, j2k_tcp_t * tcp, int compno,
|
||||
int resno, int precno, int layno, unsigned char *dest,
|
||||
int len, info_image * info_IM, int tileno)
|
||||
{
|
||||
int bandno, cblkno;
|
||||
unsigned char *sop = 0, *eph = 0;
|
||||
tcd_tilecomp_t *tilec = &tile->comps[compno];
|
||||
tcd_resolution_t *res = &tilec->resolutions[resno];
|
||||
unsigned char *c = dest;
|
||||
|
||||
/* int PPT=tile->PPT, ppt_len=0; */
|
||||
/* FILE *PPT_file; */
|
||||
|
||||
/* <SOP 0xff91> */
|
||||
if (tcp->csty & J2K_CP_CSTY_SOP) {
|
||||
sop = (unsigned char *) malloc(6 * sizeof(unsigned char));
|
||||
sop[0] = 255;
|
||||
sop[1] = 145;
|
||||
sop[2] = 0;
|
||||
sop[3] = 4;
|
||||
sop[4] = (info_IM->num % 65536) / 256;
|
||||
sop[5] = (info_IM->num % 65536) % 256;
|
||||
memcpy(c, sop, 6);
|
||||
free(sop);
|
||||
c += 6;
|
||||
}
|
||||
/* </SOP> */
|
||||
|
||||
if (!layno) {
|
||||
for (bandno = 0; bandno < res->numbands; bandno++) {
|
||||
tcd_band_t *band = &res->bands[bandno];
|
||||
tcd_precinct_t *prc = &band->precincts[precno];
|
||||
tgt_reset(prc->incltree);
|
||||
tgt_reset(prc->imsbtree);
|
||||
for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
|
||||
tcd_cblk_t *cblk = &prc->cblks[cblkno];
|
||||
cblk->numpasses = 0;
|
||||
tgt_setvalue(prc->imsbtree, cblkno, band->numbps - cblk->numbps);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bio_init_enc(c, len);
|
||||
bio_write(1, 1); /* Empty header bit */
|
||||
|
||||
/* Writing Packet header */
|
||||
for (bandno = 0; bandno < res->numbands; bandno++) {
|
||||
tcd_band_t *band = &res->bands[bandno];
|
||||
tcd_precinct_t *prc = &band->precincts[precno];
|
||||
for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
|
||||
tcd_cblk_t *cblk = &prc->cblks[cblkno];
|
||||
tcd_layer_t *layer = &cblk->layers[layno];
|
||||
if (!cblk->numpasses && layer->numpasses) {
|
||||
tgt_setvalue(prc->incltree, cblkno, layno);
|
||||
}
|
||||
}
|
||||
for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
|
||||
tcd_cblk_t *cblk = &prc->cblks[cblkno];
|
||||
tcd_layer_t *layer = &cblk->layers[layno];
|
||||
int increment = 0;
|
||||
int nump = 0;
|
||||
int len = 0, passno;
|
||||
/* cblk inclusion bits */
|
||||
if (!cblk->numpasses) {
|
||||
tgt_encode(prc->incltree, cblkno, layno + 1);
|
||||
} else {
|
||||
bio_write(layer->numpasses != 0, 1);
|
||||
}
|
||||
/* if cblk not included, go to the next cblk */
|
||||
if (!layer->numpasses) {
|
||||
continue;
|
||||
}
|
||||
/* if first instance of cblk --> zero bit-planes information */
|
||||
if (!cblk->numpasses) {
|
||||
cblk->numlenbits = 3;
|
||||
tgt_encode(prc->imsbtree, cblkno, 999);
|
||||
}
|
||||
/* number of coding passes included */
|
||||
t2_putnumpasses(layer->numpasses);
|
||||
|
||||
/* computation of the increase of the length indicator and insertion in the header */
|
||||
for (passno = cblk->numpasses;
|
||||
passno < cblk->numpasses + layer->numpasses; passno++) {
|
||||
tcd_pass_t *pass = &cblk->passes[passno];
|
||||
nump++;
|
||||
len += pass->len;
|
||||
if (pass->term
|
||||
|| passno == (cblk->numpasses + layer->numpasses) - 1) {
|
||||
increment =
|
||||
int_max(increment,
|
||||
int_floorlog2(len) + 1 - (cblk->numlenbits +
|
||||
int_floorlog2(nump)));
|
||||
len = 0;
|
||||
nump = 0;
|
||||
}
|
||||
}
|
||||
t2_putcommacode(increment);
|
||||
/* computation of the new Length indicator */
|
||||
cblk->numlenbits += increment;
|
||||
/* insertion of the codeword segment length */
|
||||
|
||||
for (passno = cblk->numpasses;
|
||||
passno < cblk->numpasses + layer->numpasses; passno++) {
|
||||
tcd_pass_t *pass = &cblk->passes[passno];
|
||||
nump++;
|
||||
len += pass->len;
|
||||
if (pass->term
|
||||
|| passno == (cblk->numpasses + layer->numpasses) - 1) {
|
||||
bio_write(len, cblk->numlenbits + int_floorlog2(nump));
|
||||
len = 0;
|
||||
nump = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (bio_flush())
|
||||
return -999; /* modified to eliminate longjmp !! */
|
||||
|
||||
c += bio_numbytes();
|
||||
|
||||
/* <EPH 0xff92> */
|
||||
if (tcp->csty & J2K_CP_CSTY_EPH) {
|
||||
eph = (unsigned char *) malloc(2 * sizeof(unsigned char));
|
||||
eph[0] = 255;
|
||||
eph[1] = 146;
|
||||
memcpy(c, eph, 2);
|
||||
free(eph);
|
||||
c += 2;
|
||||
}
|
||||
/* </EPH> */
|
||||
/* } */
|
||||
/* Writing the packet body */
|
||||
|
||||
for (bandno = 0; bandno < res->numbands; bandno++) {
|
||||
tcd_band_t *band = &res->bands[bandno];
|
||||
tcd_precinct_t *prc = &band->precincts[precno];
|
||||
for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
|
||||
tcd_cblk_t *cblk = &prc->cblks[cblkno];
|
||||
tcd_layer_t *layer = &cblk->layers[layno];
|
||||
if (!layer->numpasses) { /* ADD for index Cfr. Marcela --> delta disto by packet */
|
||||
if (info_IM->index_write && info_IM->index_on) {
|
||||
info_tile *info_TL = &info_IM->tile[tileno];
|
||||
info_packet *info_PK = &info_TL->packet[info_IM->num];
|
||||
info_PK->disto = layer->disto;
|
||||
if (info_IM->D_max < info_PK->disto)
|
||||
info_IM->D_max = info_PK->disto;
|
||||
} /* </ADD> */
|
||||
continue;
|
||||
}
|
||||
if (c + layer->len > dest + len) {
|
||||
return -999;
|
||||
}
|
||||
|
||||
memcpy(c, layer->data, layer->len);
|
||||
cblk->numpasses += layer->numpasses;
|
||||
c += layer->len;
|
||||
/* ADD for index Cfr. Marcela --> delta disto by packet */
|
||||
if (info_IM->index_write && info_IM->index_on) {
|
||||
info_tile *info_TL = &info_IM->tile[tileno];
|
||||
info_packet *info_PK = &info_TL->packet[info_IM->num];
|
||||
info_PK->disto = layer->disto;
|
||||
if (info_IM->D_max < info_PK->disto)
|
||||
info_IM->D_max = info_PK->disto;
|
||||
} /* </ADD> */
|
||||
}
|
||||
}
|
||||
return c - dest;
|
||||
}
|
||||
|
||||
void t2_init_seg(tcd_seg_t * seg, int cblksty, int first)
|
||||
{
|
||||
seg->numpasses = 0;
|
||||
seg->len = 0;
|
||||
if (cblksty & J2K_CCP_CBLKSTY_TERMALL)
|
||||
seg->maxpasses = 1;
|
||||
else if (cblksty & J2K_CCP_CBLKSTY_LAZY) {
|
||||
if (first)
|
||||
seg->maxpasses = 10;
|
||||
else
|
||||
seg->maxpasses = (((seg - 1)->maxpasses == 1)
|
||||
|| ((seg - 1)->maxpasses == 10)) ? 2 : 1;
|
||||
} else
|
||||
seg->maxpasses = 109;
|
||||
}
|
||||
|
||||
int t2_decode_packet(unsigned char *src, int len, tcd_tile_t * tile,
|
||||
j2k_tcp_t * tcp, int compno, int resno, int precno,
|
||||
int layno)
|
||||
{
|
||||
int bandno, cblkno;
|
||||
tcd_tilecomp_t *tilec = &tile->comps[compno];
|
||||
tcd_resolution_t *res = &tilec->resolutions[resno];
|
||||
unsigned char *c = src;
|
||||
int present;
|
||||
|
||||
if (layno == 0) {
|
||||
for (bandno = 0; bandno < res->numbands; bandno++) {
|
||||
tcd_band_t *band = &res->bands[bandno];
|
||||
tcd_precinct_t *prc = &band->precincts[precno];
|
||||
tgt_reset(prc->incltree);
|
||||
tgt_reset(prc->imsbtree);
|
||||
for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
|
||||
tcd_cblk_t *cblk = &prc->cblks[cblkno];
|
||||
cblk->numsegs = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (tcp->csty & J2K_CP_CSTY_SOP) {
|
||||
c += 6;
|
||||
}
|
||||
bio_init_dec(c, src + len - c);
|
||||
present = bio_read(1);
|
||||
if (!present) {
|
||||
bio_inalign();
|
||||
c += bio_numbytes();
|
||||
return c - src;
|
||||
}
|
||||
for (bandno = 0; bandno < res->numbands; bandno++) {
|
||||
tcd_band_t *band = &res->bands[bandno];
|
||||
tcd_precinct_t *prc = &band->precincts[precno];
|
||||
for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
|
||||
int included, increment, n;
|
||||
tcd_cblk_t *cblk = &prc->cblks[cblkno];
|
||||
tcd_seg_t *seg;
|
||||
/* if cblk not yet included before --> inclusion tagtree */
|
||||
if (!cblk->numsegs) {
|
||||
included = tgt_decode(prc->incltree, cblkno, layno + 1);
|
||||
/* else one bit */
|
||||
} else {
|
||||
included = bio_read(1);
|
||||
}
|
||||
/* if cblk not included */
|
||||
if (!included) {
|
||||
cblk->numnewpasses = 0;
|
||||
continue;
|
||||
}
|
||||
/* if cblk not yet included --> zero-bitplane tagtree */
|
||||
if (!cblk->numsegs) {
|
||||
int i, numimsbs;
|
||||
for (i = 0; !tgt_decode(prc->imsbtree, cblkno, i); i++) {
|
||||
}
|
||||
numimsbs = i - 1;
|
||||
cblk->numbps = band->numbps - numimsbs;
|
||||
cblk->numlenbits = 3;
|
||||
}
|
||||
/* number of coding passes */
|
||||
cblk->numnewpasses = t2_getnumpasses();
|
||||
increment = t2_getcommacode();
|
||||
/* length indicator increment */
|
||||
cblk->numlenbits += increment;
|
||||
if (!cblk->numsegs) {
|
||||
seg = &cblk->segs[0];
|
||||
t2_init_seg(seg, tcp->tccps[compno].cblksty, 1);
|
||||
} else {
|
||||
seg = &cblk->segs[cblk->numsegs - 1];
|
||||
if (seg->numpasses == seg->maxpasses) {
|
||||
t2_init_seg(++seg, tcp->tccps[compno].cblksty, 0);
|
||||
}
|
||||
}
|
||||
n = cblk->numnewpasses;
|
||||
|
||||
do {
|
||||
seg->numnewpasses = int_min(seg->maxpasses - seg->numpasses, n);
|
||||
seg->newlen =
|
||||
bio_read(cblk->numlenbits + int_floorlog2(seg->numnewpasses));
|
||||
n -= seg->numnewpasses;
|
||||
if (n > 0) {
|
||||
t2_init_seg(++seg, tcp->tccps[compno].cblksty, 0);
|
||||
}
|
||||
} while (n > 0);
|
||||
}
|
||||
}
|
||||
if (bio_inalign())
|
||||
return -999;
|
||||
c += bio_numbytes();
|
||||
if (tcp->csty & J2K_CP_CSTY_EPH) {
|
||||
c += 2;
|
||||
}
|
||||
for (bandno = 0; bandno < res->numbands; bandno++) {
|
||||
tcd_band_t *band = &res->bands[bandno];
|
||||
tcd_precinct_t *prc = &band->precincts[precno];
|
||||
for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
|
||||
tcd_cblk_t *cblk = &prc->cblks[cblkno];
|
||||
tcd_seg_t *seg;
|
||||
if (!cblk->numnewpasses)
|
||||
continue;
|
||||
if (!cblk->numsegs) {
|
||||
seg = &cblk->segs[cblk->numsegs++];
|
||||
cblk->len = 0;
|
||||
} else {
|
||||
seg = &cblk->segs[cblk->numsegs - 1];
|
||||
if (seg->numpasses == seg->maxpasses) {
|
||||
seg++;
|
||||
cblk->numsegs++;
|
||||
}
|
||||
}
|
||||
do {
|
||||
if (c + seg->newlen > src + len)
|
||||
return -999;
|
||||
memcpy(cblk->data + cblk->len, c, seg->newlen);
|
||||
if (seg->numpasses == 0) {
|
||||
seg->data = cblk->data + cblk->len;
|
||||
}
|
||||
c += seg->newlen;
|
||||
cblk->len += seg->newlen;
|
||||
seg->len += seg->newlen;
|
||||
seg->numpasses += seg->numnewpasses;
|
||||
cblk->numnewpasses -= seg->numnewpasses;
|
||||
if (cblk->numnewpasses > 0) {
|
||||
seg++;
|
||||
cblk->numsegs++;
|
||||
}
|
||||
} while (cblk->numnewpasses > 0);
|
||||
}
|
||||
}
|
||||
|
||||
return c - src;
|
||||
}
|
||||
|
||||
int t2_encode_packets(j2k_image_t * img, j2k_cp_t * cp, int tileno,
|
||||
tcd_tile_t * tile, int maxlayers,
|
||||
unsigned char *dest, int len, info_image * info_IM)
|
||||
{
|
||||
unsigned char *c = dest;
|
||||
int e = 0;
|
||||
pi_iterator_t *pi;
|
||||
int pino, compno;
|
||||
|
||||
pi = pi_create(img, cp, tileno);
|
||||
|
||||
for (pino = 0; pino <= cp->tcps[tileno].numpocs; pino++) {
|
||||
while (pi_next(&pi[pino])) {
|
||||
if (pi[pino].layno < maxlayers) {
|
||||
e =
|
||||
t2_encode_packet(tile, &cp->tcps[tileno], pi[pino].compno,
|
||||
pi[pino].resno, pi[pino].precno, pi[pino].layno,
|
||||
c, dest + len - c, info_IM, tileno);
|
||||
if (e == -999) {
|
||||
break;
|
||||
} else
|
||||
c += e;
|
||||
/* INDEX >> */
|
||||
if (info_IM->index_write && info_IM->index_on) {
|
||||
info_tile *info_TL = &info_IM->tile[tileno];
|
||||
info_packet *info_PK = &info_TL->packet[info_IM->num];
|
||||
if (!info_IM->num) {
|
||||
info_PK->start_pos = info_TL->end_header + 1;
|
||||
} else {
|
||||
info_PK->start_pos =
|
||||
info_TL->packet[info_IM->num - 1].end_pos + 1;
|
||||
}
|
||||
info_PK->end_pos = info_PK->start_pos + e - 1;
|
||||
|
||||
}
|
||||
/* << INDEX */
|
||||
if ((info_IM->index_write
|
||||
&& cp->tcps[tileno].csty & J2K_CP_CSTY_SOP)
|
||||
|| (info_IM->index_write && info_IM->index_on)) {
|
||||
info_IM->num++;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* FREE space memory taken by pi */
|
||||
for (compno = 0; compno < pi[pino].numcomps; compno++) {
|
||||
free(pi[pino].comps[compno].resolutions);
|
||||
}
|
||||
free(pi[pino].comps);
|
||||
}
|
||||
free(pi);
|
||||
if (e == -999)
|
||||
return e;
|
||||
else
|
||||
return c - dest;
|
||||
}
|
||||
|
||||
int t2_decode_packets(unsigned char *src, int len, j2k_image_t * img,
|
||||
j2k_cp_t * cp, int tileno, tcd_tile_t * tile)
|
||||
{
|
||||
unsigned char *c = src;
|
||||
pi_iterator_t *pi;
|
||||
int pino, compno, e = 0;
|
||||
|
||||
pi = pi_create(img, cp, tileno);
|
||||
|
||||
for (pino = 0; pino <= cp->tcps[tileno].numpocs; pino++) {
|
||||
while (pi_next(&pi[pino])) {
|
||||
e =
|
||||
t2_decode_packet(c, src + len - c, tile, &cp->tcps[tileno],
|
||||
pi[pino].compno, pi[pino].resno, pi[pino].precno,
|
||||
pi[pino].layno);
|
||||
if (e == -999) { /* ADD */
|
||||
break;
|
||||
} else
|
||||
c += e;
|
||||
}
|
||||
/* FREE space memory taken by pi */
|
||||
for (compno = 0; compno < pi[pino].numcomps; compno++) {
|
||||
free(pi[pino].comps[compno].resolutions);
|
||||
}
|
||||
free(pi[pino].comps);
|
||||
}
|
||||
free(pi);
|
||||
if (e == -999)
|
||||
return e;
|
||||
else
|
||||
return c - src;
|
||||
}
|
||||
1637
libopenjpeg/tcd.c
1637
libopenjpeg/tcd.c
File diff suppressed because it is too large
Load Diff
@@ -1,159 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2002, David Janssens
|
||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
||||
* Copyright (c) 2002-2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef __TCD_H
|
||||
#define __TCD_H
|
||||
|
||||
#include "j2k.h"
|
||||
#include "tgt.h"
|
||||
|
||||
typedef struct {
|
||||
int numpasses;
|
||||
int len;
|
||||
unsigned char *data;
|
||||
int maxpasses;
|
||||
int numnewpasses;
|
||||
int newlen;
|
||||
} tcd_seg_t;
|
||||
|
||||
typedef struct {
|
||||
int rate;
|
||||
double distortiondec;
|
||||
int term, len;
|
||||
} tcd_pass_t;
|
||||
|
||||
typedef struct {
|
||||
int numpasses;
|
||||
int len;
|
||||
double disto; /* add for index (Cfr. Marcela) */
|
||||
unsigned char *data;
|
||||
} tcd_layer_t;
|
||||
|
||||
typedef struct {
|
||||
int x0, y0, x1, y1;
|
||||
int numbps;
|
||||
int numlenbits;
|
||||
int len;
|
||||
int numpasses;
|
||||
int numnewpasses;
|
||||
int numsegs;
|
||||
tcd_seg_t segs[100];
|
||||
unsigned char data[8192];
|
||||
int numpassesinlayers;
|
||||
tcd_layer_t layers[100];
|
||||
int totalpasses;
|
||||
tcd_pass_t passes[100];
|
||||
} tcd_cblk_t;
|
||||
|
||||
typedef struct {
|
||||
int x0, y0, x1, y1;
|
||||
int cw, ch;
|
||||
tcd_cblk_t *cblks;
|
||||
tgt_tree_t *incltree;
|
||||
tgt_tree_t *imsbtree;
|
||||
} tcd_precinct_t;
|
||||
|
||||
typedef struct {
|
||||
int x0, y0, x1, y1;
|
||||
int bandno;
|
||||
tcd_precinct_t *precincts;
|
||||
int numbps;
|
||||
int stepsize;
|
||||
} tcd_band_t;
|
||||
|
||||
typedef struct {
|
||||
int x0, y0, x1, y1;
|
||||
int previous_x0, previous_y0, previous_x1, previous_y1; /* usefull for the DWT */
|
||||
int cas_col, cas_row; /* usefull for the DWT */
|
||||
int pw, ph; /* , old_pw,old_ph, old_pw_max,old_ph_max; */
|
||||
int numbands;
|
||||
tcd_band_t bands[3];
|
||||
} tcd_resolution_t;
|
||||
|
||||
typedef struct {
|
||||
int x0, y0, x1, y1;
|
||||
int previous_row, previous_col; /* usefull for the DWT */
|
||||
int numresolutions;
|
||||
tcd_resolution_t *resolutions;
|
||||
int *data;
|
||||
} tcd_tilecomp_t;
|
||||
|
||||
typedef struct {
|
||||
int x0, y0, x1, y1;
|
||||
int numcomps;
|
||||
/* int PPT; */
|
||||
/* int len_ppt; */
|
||||
tcd_tilecomp_t *comps;
|
||||
} tcd_tile_t;
|
||||
|
||||
typedef struct {
|
||||
int tw, th;
|
||||
tcd_tile_t *tiles;
|
||||
} tcd_image_t;
|
||||
|
||||
/*
|
||||
* Initialize the tile coder/decoder
|
||||
* img: raw image
|
||||
* cp: coding parameters
|
||||
* info_IM: creation of index file
|
||||
*/
|
||||
void tcd_init_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno);
|
||||
|
||||
void tcd_malloc_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno);
|
||||
|
||||
void tcd_init(j2k_image_t * img, j2k_cp_t * cp);
|
||||
|
||||
void tcd_free_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno);
|
||||
|
||||
/*
|
||||
* Encode a tile from the raw image into a buffer, format pnm, pgm or ppm
|
||||
* tileno: number that identifies one of the tiles to be encoded
|
||||
* dest: destination buffer
|
||||
* len: length of destination buffer
|
||||
*/
|
||||
int tcd_encode_tile_pxm(int tileno, unsigned char *dest, int len,
|
||||
info_image * info_IM);
|
||||
|
||||
/*
|
||||
* Encode a tile from the raw image into a buffer, format pgx
|
||||
* tileno: number that identifies one of the tiles to be encoded
|
||||
* dest: destination buffer
|
||||
* len: length of destination buffer
|
||||
*/
|
||||
int tcd_encode_tile_pgx(int tileno, unsigned char *dest, int len,
|
||||
info_image * info_IM);
|
||||
|
||||
/*
|
||||
* Decode a tile from a buffer into a raw image
|
||||
* src: source buffer
|
||||
* len: length of the source buffer
|
||||
* tileno: number that identifies the tile that will be decoded
|
||||
*/
|
||||
int tcd_decode_tile(unsigned char *src, int len, int tileno);
|
||||
|
||||
#endif
|
||||
@@ -1,85 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2002, David Janssens
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef __TGT_H
|
||||
#define __TGT_H
|
||||
|
||||
typedef struct tgt_node {
|
||||
struct tgt_node *parent;
|
||||
int value;
|
||||
int low;
|
||||
int known;
|
||||
} tgt_node_t;
|
||||
|
||||
typedef struct {
|
||||
int numleafsh;
|
||||
int numleafsv;
|
||||
int numnodes;
|
||||
tgt_node_t *nodes;
|
||||
} tgt_tree_t;
|
||||
|
||||
/*
|
||||
* Create a tag-tree
|
||||
* numleafsh: width of the array of leafs of the tree
|
||||
* numleafsv: height of the array of leafs of the tree
|
||||
*/
|
||||
tgt_tree_t *tgt_create(int numleafsh, int numleafsv);
|
||||
|
||||
/*
|
||||
* Reset a tag-tree (set all leafs to 0)
|
||||
* tree: tag-tree to reset
|
||||
*/
|
||||
void tgt_reset(tgt_tree_t * tree);
|
||||
|
||||
/*
|
||||
* Destroy a tag-tree, liberating memory
|
||||
* tree: tag-tree to destroy
|
||||
*/
|
||||
void tgt_destroy(tgt_tree_t * tree);
|
||||
|
||||
/*
|
||||
* Set the value of a leaf of a tag-tree
|
||||
* tree: tag-tree to modify
|
||||
* leafno: number that identifies the leaf to modify
|
||||
* value: new value of the leaf
|
||||
*/
|
||||
void tgt_setvalue(tgt_tree_t * tree, int leafno, int value);
|
||||
|
||||
/*
|
||||
* Encode the value of a leaf of the tag-tree up to a given threshold
|
||||
* leafno: number that identifies the leaf to encode
|
||||
* threshold: threshold to use when encoding value of the leaf
|
||||
*/
|
||||
void tgt_encode(tgt_tree_t * tree, int leafno, int threshold);
|
||||
|
||||
/*
|
||||
* Decode the value of a leaf of the tag-tree up to a given threshold
|
||||
* leafno: number that identifies the leaf to decode
|
||||
* threshold: threshold to use when decoding value of the leaf
|
||||
*/
|
||||
int tgt_decode(tgt_tree_t * tree, int leafno, int threshold);
|
||||
|
||||
#endif
|
||||
12
src/CMakeLists.txt
Normal file
12
src/CMakeLists.txt
Normal file
@@ -0,0 +1,12 @@
|
||||
# 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()
|
||||
#endif()
|
||||
|
||||
#add_subdirectory(lib)
|
||||
#add_subdirectory(bin)
|
||||
21
src/bin/CMakeLists.txt
Normal file
21
src/bin/CMakeLists.txt
Normal file
@@ -0,0 +1,21 @@
|
||||
# source code for openjpeg apps:
|
||||
add_subdirectory(common)
|
||||
# Part 1 & 2:
|
||||
add_subdirectory(jp2)
|
||||
|
||||
# optionals components:
|
||||
if(BUILD_JPWL)
|
||||
add_subdirectory(jpwl)
|
||||
endif()
|
||||
if(BUILD_MJ2)
|
||||
add_subdirectory(mj2)
|
||||
endif()
|
||||
if(BUILD_JPIP)
|
||||
add_subdirectory(jpip)
|
||||
endif()
|
||||
if(BUILD_JP3D)
|
||||
add_subdirectory(jp3d)
|
||||
endif()
|
||||
|
||||
# wx apps:
|
||||
add_subdirectory(wx)
|
||||
7
src/bin/common/CMakeLists.txt
Normal file
7
src/bin/common/CMakeLists.txt
Normal file
@@ -0,0 +1,7 @@
|
||||
#-----------------------------------------------------------------------------
|
||||
# opj_apps_config.h generation
|
||||
configure_file(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/opj_apps_config.h.cmake.in
|
||||
${CMAKE_CURRENT_BINARY_DIR}/opj_apps_config.h
|
||||
@ONLY
|
||||
)
|
||||
965
src/bin/common/color.c
Normal file
965
src/bin/common/color.c
Normal file
@@ -0,0 +1,965 @@
|
||||
/*
|
||||
* 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
|
||||
* 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 <assert.h>
|
||||
|
||||
#include "opj_apps_config.h"
|
||||
#include "openjpeg.h"
|
||||
#include "color.h"
|
||||
|
||||
#ifdef OPJ_HAVE_LIBLCMS2
|
||||
#include <lcms2.h>
|
||||
#endif
|
||||
#ifdef OPJ_HAVE_LIBLCMS1
|
||||
#include <lcms.h>
|
||||
#endif
|
||||
|
||||
#ifdef OPJ_USE_LEGACY
|
||||
#define OPJ_CLRSPC_GRAY CLRSPC_GRAY
|
||||
#define OPJ_CLRSPC_SRGB CLRSPC_SRGB
|
||||
#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;
|
||||
size_t maxw, maxh, max, i;
|
||||
int offset, upb;
|
||||
|
||||
upb = (int)img->comps[0].prec;
|
||||
offset = 1<<(upb - 1); upb = (1<<upb)-1;
|
||||
|
||||
maxw = (size_t)img->comps[0].w; maxh = (size_t)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) * max);
|
||||
d1 = g = (int*)malloc(sizeof(int) * max);
|
||||
d2 = b = (int*)malloc(sizeof(int) * max);
|
||||
|
||||
if(r == NULL || g == NULL || b == NULL) goto fails;
|
||||
|
||||
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;
|
||||
img->color_space = OPJ_CLRSPC_SRGB;
|
||||
return;
|
||||
|
||||
fails:
|
||||
free(r);
|
||||
free(g);
|
||||
free(b);
|
||||
}/* sycc444_to_rgb() */
|
||||
|
||||
static void sycc422_to_rgb(opj_image_t *img)
|
||||
{
|
||||
int *d0, *d1, *d2, *r, *g, *b;
|
||||
const int *y, *cb, *cr;
|
||||
size_t maxw, maxh, max, offx, loopmaxw;
|
||||
int offset, upb;
|
||||
size_t i;
|
||||
|
||||
upb = (int)img->comps[0].prec;
|
||||
offset = 1<<(upb - 1); upb = (1<<upb)-1;
|
||||
|
||||
maxw = (size_t)img->comps[0].w; maxh = (size_t)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) * max);
|
||||
d1 = g = (int*)malloc(sizeof(int) * max);
|
||||
d2 = b = (int*)malloc(sizeof(int) * max);
|
||||
|
||||
if(r == NULL || g == NULL || b == NULL) goto fails;
|
||||
|
||||
/* if img->x0 is odd, then first column shall use Cb/Cr = 0 */
|
||||
offx = img->x0 & 1U;
|
||||
loopmaxw = maxw - offx;
|
||||
|
||||
for(i=0U; i < maxh; ++i)
|
||||
{
|
||||
size_t j;
|
||||
|
||||
if (offx > 0U) {
|
||||
sycc_to_rgb(offset, upb, *y, 0, 0, r, g, b);
|
||||
++y; ++r; ++g; ++b;
|
||||
}
|
||||
|
||||
for(j=0U; j < (loopmaxw & ~(size_t)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 < loopmaxw) {
|
||||
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 = img->comps[2].w = img->comps[0].w;
|
||||
img->comps[1].h = img->comps[2].h = img->comps[0].h;
|
||||
img->comps[1].dx = img->comps[2].dx = img->comps[0].dx;
|
||||
img->comps[1].dy = img->comps[2].dy = img->comps[0].dy;
|
||||
img->color_space = OPJ_CLRSPC_SRGB;
|
||||
return;
|
||||
|
||||
fails:
|
||||
free(r);
|
||||
free(g);
|
||||
free(b);
|
||||
}/* 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;
|
||||
size_t maxw, maxh, max, offx, loopmaxw, offy, loopmaxh;
|
||||
int offset, upb;
|
||||
size_t i;
|
||||
|
||||
upb = (int)img->comps[0].prec;
|
||||
offset = 1<<(upb - 1); upb = (1<<upb)-1;
|
||||
|
||||
maxw = (size_t)img->comps[0].w; maxh = (size_t)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) * max);
|
||||
d1 = g = (int*)malloc(sizeof(int) * max);
|
||||
d2 = b = (int*)malloc(sizeof(int) * max);
|
||||
|
||||
if (r == NULL || g == NULL || b == NULL) goto fails;
|
||||
|
||||
/* if img->x0 is odd, then first column shall use Cb/Cr = 0 */
|
||||
offx = img->x0 & 1U;
|
||||
loopmaxw = maxw - offx;
|
||||
/* if img->y0 is odd, then first line shall use Cb/Cr = 0 */
|
||||
offy = img->y0 & 1U;
|
||||
loopmaxh = maxh - offy;
|
||||
|
||||
if (offy > 0U) {
|
||||
size_t j;
|
||||
|
||||
for(j=0; j < maxw; ++j)
|
||||
{
|
||||
sycc_to_rgb(offset, upb, *y, 0, 0, r, g, b);
|
||||
++y; ++r; ++g; ++b;
|
||||
}
|
||||
}
|
||||
|
||||
for(i=0U; i < (loopmaxh & ~(size_t)1U); i += 2U)
|
||||
{
|
||||
size_t j;
|
||||
|
||||
ny = y + maxw;
|
||||
nr = r + maxw; ng = g + maxw; nb = b + maxw;
|
||||
|
||||
if (offx > 0U) {
|
||||
sycc_to_rgb(offset, upb, *y, 0, 0, r, g, b);
|
||||
++y; ++r; ++g; ++b;
|
||||
sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb);
|
||||
++ny; ++nr; ++ng; ++nb;
|
||||
}
|
||||
|
||||
for(j=0; j < (loopmaxw & ~(size_t)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 < loopmaxw)
|
||||
{
|
||||
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 < loopmaxh)
|
||||
{
|
||||
size_t j;
|
||||
|
||||
for(j=0U; j < (maxw & ~(size_t)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 = img->comps[2].w = img->comps[0].w;
|
||||
img->comps[1].h = img->comps[2].h = img->comps[0].h;
|
||||
img->comps[1].dx = img->comps[2].dx = img->comps[0].dx;
|
||||
img->comps[1].dy = img->comps[2].dy = img->comps[0].dy;
|
||||
img->color_space = OPJ_CLRSPC_SRGB;
|
||||
return;
|
||||
|
||||
fails:
|
||||
free(r);
|
||||
free(g);
|
||||
free(b);
|
||||
}/* sycc420_to_rgb() */
|
||||
|
||||
void color_sycc_to_rgb(opj_image_t *img)
|
||||
{
|
||||
if(img->numcomps < 3)
|
||||
{
|
||||
img->color_space = OPJ_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;
|
||||
}
|
||||
}/* color_sycc_to_rgb() */
|
||||
|
||||
#if defined(OPJ_HAVE_LIBLCMS2) || defined(OPJ_HAVE_LIBLCMS1)
|
||||
|
||||
#ifdef OPJ_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 /* OPJ_HAVE_LIBLCMS1 */
|
||||
|
||||
/*#define DEBUG_PROFILE*/
|
||||
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;
|
||||
int *r, *g, *b;
|
||||
size_t nr_samples, i, max, max_w, max_h;
|
||||
int prec, ok = 0;
|
||||
OPJ_COLOR_SPACE new_space;
|
||||
|
||||
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 = image->comps[0].w;
|
||||
max_h = image->comps[0].h;
|
||||
prec = (int)image->comps[0].prec;
|
||||
|
||||
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();
|
||||
new_space = OPJ_CLRSPC_SRGB;
|
||||
}
|
||||
else if(out_space == cmsSigGrayData) /* enumCS 17 */
|
||||
{
|
||||
in_type = TYPE_GRAY_8;
|
||||
out_type = TYPE_RGB_8;
|
||||
out_prof = cmsCreate_sRGBProfile();
|
||||
new_space = OPJ_CLRSPC_SRGB;
|
||||
}
|
||||
else if(out_space == cmsSigYCbCrData) /* enumCS 18 */
|
||||
{
|
||||
in_type = TYPE_YCbCr_16;
|
||||
out_type = TYPE_RGB_16;
|
||||
out_prof = cmsCreate_sRGBProfile();
|
||||
new_space = OPJ_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
|
||||
cmsCloseProfile(in_prof);
|
||||
|
||||
return;
|
||||
}
|
||||
if(out_prof == NULL)
|
||||
{
|
||||
cmsCloseProfile(in_prof);
|
||||
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 OPJ_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
|
||||
|
||||
#ifdef OPJ_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 = (size_t)(max * 3U * sizeof(unsigned char));
|
||||
in = inbuf = (unsigned char*)malloc(nr_samples);
|
||||
out = outbuf = (unsigned char*)malloc(nr_samples);
|
||||
|
||||
if(inbuf == NULL || outbuf == NULL) goto fails0;
|
||||
|
||||
r = image->comps[0].data;
|
||||
g = image->comps[1].data;
|
||||
b = image->comps[2].data;
|
||||
|
||||
for(i = 0U; 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 = 0U; i < max; ++i)
|
||||
{
|
||||
*r++ = (int)*out++;
|
||||
*g++ = (int)*out++;
|
||||
*b++ = (int)*out++;
|
||||
}
|
||||
ok = 1;
|
||||
|
||||
fails0:
|
||||
free(inbuf);
|
||||
free(outbuf);
|
||||
}
|
||||
else /* prec > 8 */
|
||||
{
|
||||
unsigned short *inbuf, *outbuf, *in, *out;
|
||||
|
||||
max = max_w * max_h;
|
||||
nr_samples = (size_t)(max * 3U * sizeof(unsigned short));
|
||||
in = inbuf = (unsigned short*)malloc(nr_samples);
|
||||
out = outbuf = (unsigned short*)malloc(nr_samples);
|
||||
|
||||
if(inbuf == NULL || outbuf == NULL) goto fails1;
|
||||
|
||||
r = image->comps[0].data;
|
||||
g = image->comps[1].data;
|
||||
b = image->comps[2].data;
|
||||
|
||||
for(i = 0U ; 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++;
|
||||
}
|
||||
ok = 1;
|
||||
|
||||
fails1:
|
||||
free(inbuf);
|
||||
free(outbuf);
|
||||
}
|
||||
}
|
||||
else /* image->numcomps <= 2 : GRAY, GRAYA */
|
||||
{
|
||||
if(prec <= 8)
|
||||
{
|
||||
unsigned char *in, *inbuf, *out, *outbuf;
|
||||
opj_image_comp_t *new_comps;
|
||||
|
||||
max = max_w * max_h;
|
||||
nr_samples = (size_t)(max * 3 * sizeof(unsigned char));
|
||||
in = inbuf = (unsigned char*)malloc(nr_samples);
|
||||
out = outbuf = (unsigned char*)malloc(nr_samples);
|
||||
g = (int*)calloc((size_t)max, sizeof(int));
|
||||
b = (int*)calloc((size_t)max, sizeof(int));
|
||||
|
||||
if(inbuf == NULL || outbuf == NULL || g == NULL || b == NULL) goto fails2;
|
||||
|
||||
new_comps = (opj_image_comp_t*)realloc(image->comps, (image->numcomps+2)*sizeof(opj_image_comp_t));
|
||||
|
||||
if(new_comps == NULL) goto fails2;
|
||||
|
||||
image->comps = new_comps;
|
||||
|
||||
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 = g;
|
||||
image->comps[2].data = b;
|
||||
|
||||
image->numcomps += 2;
|
||||
|
||||
r = image->comps[0].data;
|
||||
|
||||
for(i = 0U; 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 = 0U; i < max; ++i)
|
||||
{
|
||||
*r++ = (int)*out++; *g++ = (int)*out++; *b++ = (int)*out++;
|
||||
}
|
||||
r = g = b = NULL;
|
||||
ok = 1;
|
||||
|
||||
fails2:
|
||||
free(inbuf);
|
||||
free(outbuf);
|
||||
free(g);
|
||||
free(b);
|
||||
}
|
||||
else /* prec > 8 */
|
||||
{
|
||||
unsigned short *in, *inbuf, *out, *outbuf;
|
||||
opj_image_comp_t *new_comps;
|
||||
|
||||
max = max_w * max_h;
|
||||
nr_samples = (size_t)(max * 3U * sizeof(unsigned short));
|
||||
in = inbuf = (unsigned short*)malloc(nr_samples);
|
||||
out = outbuf = (unsigned short*)malloc(nr_samples);
|
||||
g = (int*)calloc((size_t)max, sizeof(int));
|
||||
b = (int*)calloc((size_t)max, sizeof(int));
|
||||
|
||||
if(inbuf == NULL || outbuf == NULL || g == NULL || b == NULL) goto fails3;
|
||||
|
||||
new_comps = (opj_image_comp_t*)realloc(image->comps, (image->numcomps+2)*sizeof(opj_image_comp_t));
|
||||
|
||||
if(new_comps == NULL) goto fails3;
|
||||
|
||||
image->comps = new_comps;
|
||||
|
||||
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 = g;
|
||||
image->comps[2].data = b;
|
||||
|
||||
image->numcomps += 2;
|
||||
|
||||
r = image->comps[0].data;
|
||||
|
||||
for(i = 0U; i < max; ++i)
|
||||
{
|
||||
*in++ = (unsigned short)*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++;
|
||||
}
|
||||
r = g = b = NULL;
|
||||
ok = 1;
|
||||
|
||||
fails3:
|
||||
free(inbuf);
|
||||
free(outbuf);
|
||||
free(g);
|
||||
free(b);
|
||||
}
|
||||
}/* if(image->numcomps > 2) */
|
||||
|
||||
cmsDeleteTransform(transform);
|
||||
|
||||
#ifdef OPJ_HAVE_LIBLCMS1
|
||||
cmsCloseProfile(in_prof);
|
||||
cmsCloseProfile(out_prof);
|
||||
#endif
|
||||
if(ok)
|
||||
{
|
||||
image->color_space = new_space;
|
||||
}
|
||||
}/* color_apply_icc_profile() */
|
||||
|
||||
void color_cielab_to_rgb(opj_image_t *image)
|
||||
{
|
||||
int *row;
|
||||
int enumcs, numcomps;
|
||||
OPJ_COLOR_SPACE new_space;
|
||||
|
||||
numcomps = (int)image->numcomps;
|
||||
|
||||
if(numcomps != 3)
|
||||
{
|
||||
fprintf(stderr,"%s:%d:\n\tnumcomps %d not handled. Quitting.\n",
|
||||
__FILE__,__LINE__,numcomps);
|
||||
return;
|
||||
}
|
||||
|
||||
row = (int*)image->icc_profile_buf;
|
||||
enumcs = row[0];
|
||||
|
||||
if(enumcs == 14) /* CIELab */
|
||||
{
|
||||
int *L, *a, *b, *red, *green, *blue;
|
||||
int *src0, *src1, *src2, *dst0, *dst1, *dst2;
|
||||
double rl, ol, ra, oa, rb, ob, prec0, prec1, prec2;
|
||||
double minL, maxL, mina, maxa, minb, maxb;
|
||||
unsigned int default_type;
|
||||
unsigned int i, max;
|
||||
cmsHPROFILE in, out;
|
||||
cmsHTRANSFORM transform;
|
||||
cmsUInt16Number RGB[3];
|
||||
cmsCIELab Lab;
|
||||
|
||||
in = cmsCreateLab4Profile(NULL);
|
||||
if(in == NULL){
|
||||
return;
|
||||
}
|
||||
out = cmsCreate_sRGBProfile();
|
||||
if(out == NULL){
|
||||
cmsCloseProfile(in);
|
||||
return;
|
||||
}
|
||||
transform = cmsCreateTransform(in, TYPE_Lab_DBL, out, TYPE_RGB_16, INTENT_PERCEPTUAL, 0);
|
||||
|
||||
#ifdef OPJ_HAVE_LIBLCMS2
|
||||
cmsCloseProfile(in);
|
||||
cmsCloseProfile(out);
|
||||
#endif
|
||||
if(transform == NULL)
|
||||
{
|
||||
#ifdef OPJ_HAVE_LIBLCMS1
|
||||
cmsCloseProfile(in);
|
||||
cmsCloseProfile(out);
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
new_space = OPJ_CLRSPC_SRGB;
|
||||
|
||||
prec0 = (double)image->comps[0].prec;
|
||||
prec1 = (double)image->comps[1].prec;
|
||||
prec2 = (double)image->comps[2].prec;
|
||||
|
||||
default_type = (unsigned int)row[1];
|
||||
|
||||
if(default_type == 0x44454600)/* DEF : default */
|
||||
{
|
||||
rl = 100; ra = 170; rb = 200;
|
||||
ol = 0;
|
||||
oa = pow(2, prec1 - 1);
|
||||
ob = pow(2, prec2 - 2) + pow(2, prec2 - 3);
|
||||
}
|
||||
else
|
||||
{
|
||||
rl = row[2]; ra = row[4]; rb = row[6];
|
||||
ol = row[3]; oa = row[5]; ob = row[7];
|
||||
}
|
||||
|
||||
L = src0 = image->comps[0].data;
|
||||
a = src1 = image->comps[1].data;
|
||||
b = src2 = image->comps[2].data;
|
||||
|
||||
max = image->comps[0].w * image->comps[0].h;
|
||||
|
||||
red = dst0 = (int*)malloc(max * sizeof(int));
|
||||
green = dst1 = (int*)malloc(max * sizeof(int));
|
||||
blue = dst2 = (int*)malloc(max * sizeof(int));
|
||||
|
||||
if(red == NULL || green == NULL || blue == NULL) goto fails;
|
||||
|
||||
minL = -(rl * ol)/(pow(2, prec0)-1);
|
||||
maxL = minL + rl;
|
||||
|
||||
mina = -(ra * oa)/(pow(2, prec1)-1);
|
||||
maxa = mina + ra;
|
||||
|
||||
minb = -(rb * ob)/(pow(2, prec2)-1);
|
||||
maxb = minb + rb;
|
||||
|
||||
for(i = 0; i < max; ++i)
|
||||
{
|
||||
Lab.L = minL + (double)(*L) * (maxL - minL)/(pow(2, prec0)-1); ++L;
|
||||
Lab.a = mina + (double)(*a) * (maxa - mina)/(pow(2, prec1)-1); ++a;
|
||||
Lab.b = minb + (double)(*b) * (maxb - minb)/(pow(2, prec2)-1); ++b;
|
||||
|
||||
cmsDoTransform(transform, &Lab, RGB, 1);
|
||||
|
||||
*red++ = RGB[0];
|
||||
*green++ = RGB[1];
|
||||
*blue++ = RGB[2];
|
||||
}
|
||||
cmsDeleteTransform(transform);
|
||||
#ifdef OPJ_HAVE_LIBLCMS1
|
||||
cmsCloseProfile(in);
|
||||
cmsCloseProfile(out);
|
||||
#endif
|
||||
free(src0); image->comps[0].data = dst0;
|
||||
free(src1); image->comps[1].data = dst1;
|
||||
free(src2); image->comps[2].data = dst2;
|
||||
|
||||
image->color_space = new_space;
|
||||
image->comps[0].prec = 16;
|
||||
image->comps[1].prec = 16;
|
||||
image->comps[2].prec = 16;
|
||||
|
||||
return;
|
||||
|
||||
fails:
|
||||
cmsDeleteTransform(transform);
|
||||
#ifdef OPJ_HAVE_LIBLCMS1
|
||||
cmsCloseProfile(in);
|
||||
cmsCloseProfile(out);
|
||||
#endif
|
||||
if(red) free(red);
|
||||
if(green) free(green);
|
||||
if(blue) free(blue);
|
||||
return;
|
||||
}
|
||||
|
||||
fprintf(stderr,"%s:%d:\n\tenumCS %d not handled. Ignoring.\n", __FILE__,__LINE__, enumcs);
|
||||
}/* color_cielab_to_rgb() */
|
||||
|
||||
#endif /* OPJ_HAVE_LIBLCMS2 || OPJ_HAVE_LIBLCMS1 */
|
||||
|
||||
void color_cmyk_to_rgb(opj_image_t *image)
|
||||
{
|
||||
float C, M, Y, K;
|
||||
float sC, sM, sY, sK;
|
||||
unsigned int w, h, max, i;
|
||||
|
||||
w = image->comps[0].w;
|
||||
h = image->comps[0].h;
|
||||
|
||||
if (
|
||||
(image->numcomps < 4)
|
||||
|| (image->comps[0].dx != image->comps[1].dx) || (image->comps[0].dx != image->comps[2].dx) || (image->comps[0].dx != image->comps[3].dx)
|
||||
|| (image->comps[0].dy != image->comps[1].dy) || (image->comps[0].dy != image->comps[2].dy) || (image->comps[0].dy != image->comps[3].dy)
|
||||
) {
|
||||
fprintf(stderr,"%s:%d:color_cmyk_to_rgb\n\tCAN NOT CONVERT\n", __FILE__,__LINE__);
|
||||
return;
|
||||
}
|
||||
|
||||
max = w * h;
|
||||
|
||||
sC = 1.0F / (float)((1 << image->comps[0].prec) - 1);
|
||||
sM = 1.0F / (float)((1 << image->comps[1].prec) - 1);
|
||||
sY = 1.0F / (float)((1 << image->comps[2].prec) - 1);
|
||||
sK = 1.0F / (float)((1 << image->comps[3].prec) - 1);
|
||||
|
||||
for(i = 0; i < max; ++i)
|
||||
{
|
||||
/* CMYK values from 0 to 1 */
|
||||
C = (float)(image->comps[0].data[i]) * sC;
|
||||
M = (float)(image->comps[1].data[i]) * sM;
|
||||
Y = (float)(image->comps[2].data[i]) * sY;
|
||||
K = (float)(image->comps[3].data[i]) * sK;
|
||||
|
||||
/* Invert all CMYK values */
|
||||
C = 1.0F - C;
|
||||
M = 1.0F - M;
|
||||
Y = 1.0F - Y;
|
||||
K = 1.0F - K;
|
||||
|
||||
/* CMYK -> RGB : RGB results from 0 to 255 */
|
||||
image->comps[0].data[i] = (int)(255.0F * C * K); /* R */
|
||||
image->comps[1].data[i] = (int)(255.0F * M * K); /* G */
|
||||
image->comps[2].data[i] = (int)(255.0F * Y * K); /* B */
|
||||
}
|
||||
|
||||
free(image->comps[3].data); image->comps[3].data = NULL;
|
||||
image->comps[0].prec = 8;
|
||||
image->comps[1].prec = 8;
|
||||
image->comps[2].prec = 8;
|
||||
image->numcomps -= 1;
|
||||
image->color_space = OPJ_CLRSPC_SRGB;
|
||||
|
||||
for (i = 3; i < image->numcomps; ++i) {
|
||||
memcpy(&(image->comps[i]), &(image->comps[i+1]), sizeof(image->comps[i]));
|
||||
}
|
||||
|
||||
}/* color_cmyk_to_rgb() */
|
||||
|
||||
/*
|
||||
* This code has been adopted from sjpx_openjpeg.c of ghostscript
|
||||
*/
|
||||
void color_esycc_to_rgb(opj_image_t *image)
|
||||
{
|
||||
int y, cb, cr, sign1, sign2, val;
|
||||
unsigned int w, h, max, i;
|
||||
int flip_value = (1 << (image->comps[0].prec-1));
|
||||
int max_value = (1 << image->comps[0].prec) - 1;
|
||||
|
||||
if (
|
||||
(image->numcomps < 3)
|
||||
|| (image->comps[0].dx != image->comps[1].dx) || (image->comps[0].dx != image->comps[2].dx)
|
||||
|| (image->comps[0].dy != image->comps[1].dy) || (image->comps[0].dy != image->comps[2].dy)
|
||||
) {
|
||||
fprintf(stderr,"%s:%d:color_esycc_to_rgb\n\tCAN NOT CONVERT\n", __FILE__,__LINE__);
|
||||
return;
|
||||
}
|
||||
|
||||
w = image->comps[0].w;
|
||||
h = image->comps[0].h;
|
||||
|
||||
sign1 = (int)image->comps[1].sgnd;
|
||||
sign2 = (int)image->comps[2].sgnd;
|
||||
|
||||
max = w * h;
|
||||
|
||||
for(i = 0; i < max; ++i)
|
||||
{
|
||||
|
||||
y = image->comps[0].data[i]; cb = image->comps[1].data[i]; cr = image->comps[2].data[i];
|
||||
|
||||
if( !sign1) cb -= flip_value;
|
||||
if( !sign2) cr -= flip_value;
|
||||
|
||||
val = (int)
|
||||
((float)y - (float)0.0000368 * (float)cb
|
||||
+ (float)1.40199 * (float)cr + (float)0.5);
|
||||
|
||||
if(val > max_value) val = max_value; else if(val < 0) val = 0;
|
||||
image->comps[0].data[i] = val;
|
||||
|
||||
val = (int)
|
||||
((float)1.0003 * (float)y - (float)0.344125 * (float)cb
|
||||
- (float)0.7141128 * (float)cr + (float)0.5);
|
||||
|
||||
if(val > max_value) val = max_value; else if(val < 0) val = 0;
|
||||
image->comps[1].data[i] = val;
|
||||
|
||||
val = (int)
|
||||
((float)0.999823 * (float)y + (float)1.77204 * (float)cb
|
||||
- (float)0.000008 *(float)cr + (float)0.5);
|
||||
|
||||
if(val > max_value) val = max_value; else if(val < 0) val = 0;
|
||||
image->comps[2].data[i] = val;
|
||||
}
|
||||
image->color_space = OPJ_CLRSPC_SRGB;
|
||||
|
||||
}/* color_esycc_to_rgb() */
|
||||
@@ -1,7 +1,16 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2002, David Janssens
|
||||
* Copyright (c) 2003, Yannick Verschueren
|
||||
* Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
||||
* 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
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@@ -26,18 +35,13 @@
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef __CIO_H
|
||||
#define __CIO_H
|
||||
#ifndef _OPJ_COLOR_H_
|
||||
#define _OPJ_COLOR_H_
|
||||
|
||||
int cio_tell();
|
||||
void cio_seek(int pos);
|
||||
int cio_numbytes();
|
||||
int cio_numbytesleft();
|
||||
unsigned char *cio_getbp();
|
||||
void cio_init(unsigned char *bp, int len);
|
||||
//void cio_write(unsigned int v, int n);
|
||||
void cio_write(long long v, int n);
|
||||
unsigned int cio_read(int n);
|
||||
void cio_skip(int n);
|
||||
extern void color_sycc_to_rgb(opj_image_t *img);
|
||||
extern void color_apply_icc_profile(opj_image_t *image);
|
||||
extern void color_cielab_to_rgb(opj_image_t *image);
|
||||
|
||||
#endif
|
||||
extern void color_cmyk_to_rgb(opj_image_t *image);
|
||||
extern void color_esycc_to_rgb(opj_image_t *image);
|
||||
#endif /* _OPJ_COLOR_H_ */
|
||||
55
src/bin/common/format_defs.h
Normal file
55
src/bin/common/format_defs.h
Normal file
@@ -0,0 +1,55 @@
|
||||
/*
|
||||
* 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
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef _OPJ_FORMAT_DEFS_H_
|
||||
#define _OPJ_FORMAT_DEFS_H_
|
||||
|
||||
#define J2K_CFMT 0
|
||||
#define JP2_CFMT 1
|
||||
#define JPT_CFMT 2
|
||||
|
||||
#define PXM_DFMT 10
|
||||
#define PGX_DFMT 11
|
||||
#define BMP_DFMT 12
|
||||
#define YUV_DFMT 13
|
||||
#define TIF_DFMT 14
|
||||
#define RAW_DFMT 15 /* MSB / Big Endian */
|
||||
#define TGA_DFMT 16
|
||||
#define PNG_DFMT 17
|
||||
#define RAWL_DFMT 18 /* LSB / Little Endian */
|
||||
|
||||
#endif /* _OPJ_FORMAT_DEFS_H_ */
|
||||
15
src/bin/common/opj_apps_config.h.cmake.in
Normal file
15
src/bin/common/opj_apps_config.h.cmake.in
Normal file
@@ -0,0 +1,15 @@
|
||||
#include "opj_config_private.h"
|
||||
|
||||
/* create opj_apps_config.h for CMake */
|
||||
|
||||
#cmakedefine OPJ_HAVE_LIBPNG @HAVE_LIBPNG@
|
||||
#cmakedefine OPJ_HAVE_PNG_H @HAVE_PNG_H@
|
||||
#cmakedefine OPJ_HAVE_LIBTIFF @HAVE_LIBTIFF@
|
||||
#cmakedefine OPJ_HAVE_TIFF_H @HAVE_TIFF_H@
|
||||
|
||||
#cmakedefine OPJ_HAVE_LIBLCMS1
|
||||
#cmakedefine OPJ_HAVE_LIBLCMS2
|
||||
#cmakedefine OPJ_HAVE_LCMS1_H
|
||||
#cmakedefine OPJ_HAVE_LCMS2_H
|
||||
|
||||
|
||||
255
src/bin/common/opj_getopt.c
Normal file
255
src/bin/common/opj_getopt.c
Normal file
@@ -0,0 +1,255 @@
|
||||
/*
|
||||
* 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
|
||||
* The Regents of the University of California. 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.
|
||||
* 3. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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.
|
||||
*/
|
||||
|
||||
/* last review : october 29th, 2002 */
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static char sccsid[] = "@(#)opj_getopt.c 8.3 (Berkeley) 4/27/95";
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "opj_getopt.h"
|
||||
|
||||
int opj_opterr = 1, /* if error message should be printed */
|
||||
opj_optind = 1, /* index into parent argv vector */
|
||||
opj_optopt, /* character checked for validity */
|
||||
opj_optreset; /* reset getopt */
|
||||
char *opj_optarg; /* argument associated with option */
|
||||
|
||||
#define BADCH (int)'?'
|
||||
#define BADARG (int)':'
|
||||
static char EMSG[]={""};
|
||||
|
||||
/* As this class remembers its values from one Java call to the other, reset the values before each use */
|
||||
void opj_reset_options_reading(void) {
|
||||
opj_opterr = 1;
|
||||
opj_optind = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* getopt --
|
||||
* Parse argc/argv argument vector.
|
||||
*/
|
||||
int opj_getopt(int nargc, char *const *nargv, const char *ostr) {
|
||||
# define __progname nargv[0]
|
||||
static char *place = EMSG; /* option letter processing */
|
||||
const char *oli = NULL; /* option letter list index */
|
||||
|
||||
if (opj_optreset || !*place) { /* update scanning pointer */
|
||||
opj_optreset = 0;
|
||||
if (opj_optind >= nargc || *(place = nargv[opj_optind]) != '-') {
|
||||
place = EMSG;
|
||||
return (-1);
|
||||
}
|
||||
if (place[1] && *++place == '-') { /* found "--" */
|
||||
++opj_optind;
|
||||
place = EMSG;
|
||||
return (-1);
|
||||
}
|
||||
} /* option letter okay? */
|
||||
if ((opj_optopt = (int) *place++) == (int) ':' ||
|
||||
!(oli = strchr(ostr, opj_optopt))) {
|
||||
/*
|
||||
* if the user didn't specify '-' as an option,
|
||||
* assume it means -1.
|
||||
*/
|
||||
if (opj_optopt == (int) '-')
|
||||
return (-1);
|
||||
if (!*place)
|
||||
++opj_optind;
|
||||
if (opj_opterr && *ostr != ':') {
|
||||
fprintf(stderr,
|
||||
"%s: illegal option -- %c\n", __progname, opj_optopt);
|
||||
return (BADCH);
|
||||
}
|
||||
}
|
||||
if (*++oli != ':') { /* don't need argument */
|
||||
opj_optarg = NULL;
|
||||
if (!*place)
|
||||
++opj_optind;
|
||||
} else { /* need an argument */
|
||||
if (*place) /* no white space */
|
||||
opj_optarg = place;
|
||||
else if (nargc <= ++opj_optind) { /* no arg */
|
||||
place = EMSG;
|
||||
if (*ostr == ':')
|
||||
return (BADARG);
|
||||
if (opj_opterr) {
|
||||
fprintf(stderr,
|
||||
"%s: option requires an argument -- %c\n",
|
||||
__progname, opj_optopt);
|
||||
return (BADCH);
|
||||
}
|
||||
} else /* white space */
|
||||
opj_optarg = nargv[opj_optind];
|
||||
place = EMSG;
|
||||
++opj_optind;
|
||||
}
|
||||
return (opj_optopt); /* dump back option letter */
|
||||
}
|
||||
|
||||
|
||||
int opj_getopt_long(int argc, char * const argv[], const char *optstring,
|
||||
const opj_option_t *longopts, int totlen) {
|
||||
static int lastidx,lastofs;
|
||||
const char *tmp;
|
||||
int i,len;
|
||||
char param = 1;
|
||||
|
||||
again:
|
||||
if (opj_optind >= argc || !argv[opj_optind] || *argv[opj_optind]!='-')
|
||||
return -1;
|
||||
|
||||
if (argv[opj_optind][0]=='-' && argv[opj_optind][1]==0) {
|
||||
if(opj_optind >= (argc - 1)){ /* no more input parameters */
|
||||
param = 0;
|
||||
}
|
||||
else{ /* more input parameters */
|
||||
if(argv[opj_optind + 1][0] == '-'){
|
||||
param = 0; /* Missing parameter after '-' */
|
||||
}
|
||||
else{
|
||||
param = 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (param == 0) {
|
||||
++opj_optind;
|
||||
return (BADCH);
|
||||
}
|
||||
|
||||
if (argv[opj_optind][0]=='-') { /* long option */
|
||||
char* arg=argv[opj_optind]+1;
|
||||
const opj_option_t* o;
|
||||
o=longopts;
|
||||
len=sizeof(longopts[0]);
|
||||
|
||||
if (param > 1){
|
||||
arg = argv[opj_optind+1];
|
||||
opj_optind++;
|
||||
}
|
||||
else
|
||||
arg = argv[opj_optind]+1;
|
||||
|
||||
if(strlen(arg)>1){
|
||||
for (i=0;i<totlen;i=i+len,o++) {
|
||||
if (!strcmp(o->name,arg)) { /* match */
|
||||
if (o->has_arg == 0) {
|
||||
if ((argv[opj_optind+1])&&(!(argv[opj_optind+1][0]=='-'))){
|
||||
fprintf(stderr,"%s: option does not require an argument. Ignoring %s\n",arg,argv[opj_optind+1]);
|
||||
++opj_optind;
|
||||
}
|
||||
}else{
|
||||
opj_optarg=argv[opj_optind+1];
|
||||
if(opj_optarg){
|
||||
if (opj_optarg[0] == '-'){ /* Has read next input parameter: No arg for current parameter */
|
||||
if (opj_opterr) {
|
||||
fprintf(stderr,"%s: option requires an argument\n",arg);
|
||||
return (BADCH);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!opj_optarg && o->has_arg==1) { /* no argument there */
|
||||
if (opj_opterr) {
|
||||
fprintf(stderr,"%s: option requires an argument \n",arg);
|
||||
return (BADCH);
|
||||
}
|
||||
}
|
||||
++opj_optind;
|
||||
}
|
||||
++opj_optind;
|
||||
if (o->flag)
|
||||
*(o->flag)=o->val;
|
||||
else
|
||||
return o->val;
|
||||
return 0;
|
||||
}
|
||||
}/*(end for)String not found in the list*/
|
||||
fprintf(stderr,"Invalid option %s\n",arg);
|
||||
++opj_optind;
|
||||
return (BADCH);
|
||||
}else{ /*Single character input parameter*/
|
||||
if (*optstring==':') return ':';
|
||||
if (lastidx!=opj_optind) {
|
||||
lastidx=opj_optind; lastofs=0;
|
||||
}
|
||||
opj_optopt=argv[opj_optind][lastofs+1];
|
||||
if ((tmp=strchr(optstring,opj_optopt))) {/*Found input parameter in list*/
|
||||
if (*tmp==0) { /* apparently, we looked for \0, i.e. end of argument */
|
||||
++opj_optind;
|
||||
goto again;
|
||||
}
|
||||
if (tmp[1]==':') { /* argument expected */
|
||||
if (tmp[2]==':' || argv[opj_optind][lastofs+2]) { /* "-foo", return "oo" as opj_optarg */
|
||||
if (!*(opj_optarg=argv[opj_optind]+lastofs+2)) opj_optarg=0;
|
||||
goto found;
|
||||
}
|
||||
opj_optarg=argv[opj_optind+1];
|
||||
if(opj_optarg){
|
||||
if (opj_optarg[0] == '-'){ /* Has read next input parameter: No arg for current parameter */
|
||||
if (opj_opterr) {
|
||||
fprintf(stderr,"%s: option requires an argument\n",arg);
|
||||
return (BADCH);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!opj_optarg) { /* missing argument */
|
||||
if (opj_opterr) {
|
||||
fprintf(stderr,"%s: option requires an argument\n",arg);
|
||||
return (BADCH);
|
||||
}
|
||||
}
|
||||
++opj_optind;
|
||||
}else {/*Argument not expected*/
|
||||
++lastofs;
|
||||
return opj_optopt;
|
||||
}
|
||||
found:
|
||||
++opj_optind;
|
||||
return opj_optopt;
|
||||
} else { /* not found */
|
||||
fprintf(stderr,"Invalid option %s\n",arg);
|
||||
++opj_optind;
|
||||
return (BADCH);
|
||||
}/*end of not found*/
|
||||
|
||||
}/* end of single character*/
|
||||
}/*end '-'*/
|
||||
fprintf(stderr,"Invalid option\n");
|
||||
++opj_optind;
|
||||
return (BADCH);;
|
||||
}/*end function*/
|
||||
29
src/bin/common/opj_getopt.h
Normal file
29
src/bin/common/opj_getopt.h
Normal file
@@ -0,0 +1,29 @@
|
||||
/* last review : october 29th, 2002 */
|
||||
|
||||
#ifndef _GETOPT_H_
|
||||
#define _GETOPT_H_
|
||||
|
||||
typedef struct opj_option
|
||||
{
|
||||
const char *name;
|
||||
int has_arg;
|
||||
int *flag;
|
||||
int val;
|
||||
}opj_option_t;
|
||||
|
||||
#define NO_ARG 0
|
||||
#define REQ_ARG 1
|
||||
#define OPT_ARG 2
|
||||
|
||||
extern int opj_opterr;
|
||||
extern int opj_optind;
|
||||
extern int opj_optopt;
|
||||
extern int opj_optreset;
|
||||
extern char *opj_optarg;
|
||||
|
||||
extern int opj_getopt(int nargc, char *const *nargv, const char *ostr);
|
||||
extern int opj_getopt_long(int argc, char * const argv[], const char *optstring,
|
||||
const opj_option_t *longopts, int totlen);
|
||||
extern void opj_reset_options_reading(void);
|
||||
|
||||
#endif /* _GETOPT_H_ */
|
||||
@@ -1,5 +1,10 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2002, David Janssens
|
||||
* 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) 2015, Matthieu Darbois
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@@ -24,74 +29,44 @@
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/* <summary> */
|
||||
/* Get the minimum of two integers. */
|
||||
/* </summary> */
|
||||
int int_min(int a, int b)
|
||||
{
|
||||
return a < b ? a : b;
|
||||
}
|
||||
#ifndef OPJ_STRING_H
|
||||
#define OPJ_STRING_H
|
||||
|
||||
/* <summary> */
|
||||
/* Get the maximum of two integers. */
|
||||
/* </summary> */
|
||||
int int_max(int a, int b)
|
||||
{
|
||||
return a > b ? a : b;
|
||||
}
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
|
||||
/* <summary> */
|
||||
/* Clamp an integer inside an interval. */
|
||||
/* </summary> */
|
||||
int int_clamp(int a, int min, int max)
|
||||
/* strnlen is not standard, strlen_s is C11... */
|
||||
/* keep in mind there still is a buffer read overflow possible */
|
||||
static size_t opj_strnlen_s(const char *src, size_t max_len)
|
||||
{
|
||||
if (a < min)
|
||||
return min;
|
||||
if (a > max)
|
||||
return max;
|
||||
return a;
|
||||
}
|
||||
size_t len;
|
||||
|
||||
/* <summary> */
|
||||
/* Get absolute value of integer. */
|
||||
/* </summary> */
|
||||
int int_abs(int a)
|
||||
{
|
||||
return a < 0 ? -a : a;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Divide an integer and round upwards. */
|
||||
/* </summary> */
|
||||
int int_ceildiv(int a, int b)
|
||||
{
|
||||
return (a + b - 1) / b;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Divide an integer by a power of 2 and round upwards. */
|
||||
/* </summary> */
|
||||
int int_ceildivpow2(int a, int b)
|
||||
{
|
||||
return (a + (1 << b) - 1) >> b;
|
||||
}
|
||||
|
||||
/* <summary> */
|
||||
/* Divide an integer by a power of 2 and round downwards. */
|
||||
/* </summary> */
|
||||
int int_floordivpow2(int a, int b)
|
||||
{
|
||||
return a >> b;
|
||||
}
|
||||
|
||||
/* <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;
|
||||
if (src == NULL) {
|
||||
return 0U;
|
||||
}
|
||||
return l;
|
||||
for (len = 0U; (*src != '\0') && (len < max_len); src++, len++);
|
||||
return len;
|
||||
}
|
||||
|
||||
/* should be equivalent to C11 function except for the handler */
|
||||
/* keep in mind there still is a buffer read overflow possible */
|
||||
static int opj_strcpy_s(char* dst, size_t dst_size, const char* src)
|
||||
{
|
||||
size_t src_len = 0U;
|
||||
if ((dst == NULL) || (dst_size == 0U)) {
|
||||
return EINVAL;
|
||||
}
|
||||
if (src == NULL) {
|
||||
dst[0] = '\0';
|
||||
return EINVAL;
|
||||
}
|
||||
src_len = opj_strnlen_s(src, dst_size);
|
||||
if (src_len >= dst_size) {
|
||||
return ERANGE;
|
||||
}
|
||||
memcpy(dst, src, src_len);
|
||||
dst[src_len] = '\0';
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* OPJ_STRING_H */
|
||||
82
src/bin/jp2/CMakeLists.txt
Normal file
82
src/bin/jp2/CMakeLists.txt
Normal file
@@ -0,0 +1,82 @@
|
||||
# Build the demo app, small examples
|
||||
|
||||
# First thing define the common source:
|
||||
set(common_SRCS
|
||||
convert.c
|
||||
convert.h
|
||||
convertbmp.c
|
||||
index.c
|
||||
index.h
|
||||
${OPENJPEG_SOURCE_DIR}/src/bin/common/color.c
|
||||
${OPENJPEG_SOURCE_DIR}/src/bin/common/color.h
|
||||
${OPENJPEG_SOURCE_DIR}/src/bin/common/opj_getopt.c
|
||||
${OPENJPEG_SOURCE_DIR}/src/bin/common/opj_getopt.h
|
||||
${OPENJPEG_SOURCE_DIR}/src/bin/common/opj_string.h
|
||||
)
|
||||
|
||||
if(OPJ_HAVE_LIBTIFF)
|
||||
list(APPEND common_SRCS converttif.c)
|
||||
endif()
|
||||
if(OPJ_HAVE_LIBPNG)
|
||||
list(APPEND common_SRCS convertpng.c)
|
||||
endif()
|
||||
|
||||
# Headers file are located here:
|
||||
include_directories(
|
||||
${OPENJPEG_BINARY_DIR}/src/lib/openjp2 # opj_config.h
|
||||
${OPENJPEG_BINARY_DIR}/src/bin/common # opj_apps_config.h
|
||||
${OPENJPEG_SOURCE_DIR}/src/lib/openjp2
|
||||
${OPENJPEG_SOURCE_DIR}/src/bin/common
|
||||
${LCMS_INCLUDE_DIRNAME}
|
||||
${Z_INCLUDE_DIRNAME}
|
||||
${PNG_INCLUDE_DIRNAME}
|
||||
${TIFF_INCLUDE_DIRNAME}
|
||||
)
|
||||
|
||||
if(WIN32)
|
||||
if(BUILD_SHARED_LIBS)
|
||||
add_definitions(-DOPJ_EXPORTS)
|
||||
else()
|
||||
add_definitions(-DOPJ_STATIC)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Loop over all executables:
|
||||
foreach(exe opj_decompress opj_compress opj_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()
|
||||
|
||||
# On unix you need to link to the math library:
|
||||
if(UNIX)
|
||||
target_link_libraries(${exe} m)
|
||||
endif()
|
||||
# Install exe
|
||||
install(TARGETS ${exe}
|
||||
EXPORT OpenJPEGTargets
|
||||
DESTINATION ${OPENJPEG_INSTALL_BIN_DIR} COMPONENT Applications
|
||||
)
|
||||
if(OPJ_USE_DSYMUTIL)
|
||||
add_custom_command(TARGET ${exe} POST_BUILD
|
||||
COMMAND "dsymutil" "$<TARGET_FILE:${exe}>"
|
||||
COMMENT "dsymutil $<TARGET_FILE:${exe}>"
|
||||
DEPENDS ${exe})
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
if(BUILD_DOC)
|
||||
# Install man pages
|
||||
install(
|
||||
FILES ${OPENJPEG_SOURCE_DIR}/doc/man/man1/opj_compress.1
|
||||
${OPENJPEG_SOURCE_DIR}/doc/man/man1/opj_decompress.1
|
||||
${OPENJPEG_SOURCE_DIR}/doc/man/man1/opj_dump.1
|
||||
DESTINATION ${OPENJPEG_INSTALL_MAN_DIR}/man1)
|
||||
#
|
||||
endif()
|
||||
2265
src/bin/jp2/convert.c
Normal file
2265
src/bin/jp2/convert.c
Normal file
File diff suppressed because it is too large
Load Diff
119
src/bin/jp2/convert.h
Normal file
119
src/bin/jp2/convert.h
Normal file
@@ -0,0 +1,119 @@
|
||||
/*
|
||||
* 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
|
||||
* 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.
|
||||
*/
|
||||
#ifndef __J2K_CONVERT_H
|
||||
#define __J2K_CONVERT_H
|
||||
|
||||
/**@name RAW component encoding parameters */
|
||||
/*@{*/
|
||||
typedef struct raw_comp_cparameters {
|
||||
/** subsampling in X direction */
|
||||
int dx;
|
||||
/** subsampling in Y direction */
|
||||
int dy;
|
||||
/*@}*/
|
||||
} raw_comp_cparameters_t;
|
||||
|
||||
/**@name RAW image encoding parameters */
|
||||
/*@{*/
|
||||
typedef struct raw_cparameters {
|
||||
/** width of the raw image */
|
||||
int rawWidth;
|
||||
/** height of the raw image */
|
||||
int rawHeight;
|
||||
/** number of components of the raw image */
|
||||
int rawComp;
|
||||
/** bit depth of the raw image */
|
||||
int rawBitDepth;
|
||||
/** signed/unsigned raw image */
|
||||
OPJ_BOOL rawSigned;
|
||||
/** raw components parameters */
|
||||
raw_comp_cparameters_t *rawComps;
|
||||
/*@}*/
|
||||
} raw_cparameters_t;
|
||||
|
||||
/* Component precision clipping */
|
||||
void clip_component(opj_image_comp_t* component, OPJ_UINT32 precision);
|
||||
/* Component precision scaling */
|
||||
void scale_component(opj_image_comp_t* component, OPJ_UINT32 precision);
|
||||
|
||||
/* planar / interleaved conversions */
|
||||
typedef void (* convert_32s_CXPX)(const OPJ_INT32* pSrc, OPJ_INT32* const* pDst, OPJ_SIZE_T length);
|
||||
extern const convert_32s_CXPX convert_32s_CXPX_LUT[5];
|
||||
typedef void (* convert_32s_PXCX)(OPJ_INT32 const* const* pSrc, OPJ_INT32* pDst, OPJ_SIZE_T length, OPJ_INT32 adjust);
|
||||
extern const convert_32s_PXCX convert_32s_PXCX_LUT[5];
|
||||
/* bit depth conversions */
|
||||
typedef void (* convert_XXx32s_C1R)(const OPJ_BYTE* pSrc, OPJ_INT32* pDst, OPJ_SIZE_T length);
|
||||
extern const convert_XXx32s_C1R convert_XXu32s_C1R_LUT[9]; /* up to 8bpp */
|
||||
typedef void (* convert_32sXXx_C1R)(const OPJ_INT32* pSrc, OPJ_BYTE* pDst, OPJ_SIZE_T length);
|
||||
extern const convert_32sXXx_C1R convert_32sXXu_C1R_LUT[9]; /* up to 8bpp */
|
||||
|
||||
|
||||
/* TGA conversion */
|
||||
opj_image_t* tgatoimage(const char *filename, opj_cparameters_t *parameters);
|
||||
int imagetotga(opj_image_t * image, const char *outfile);
|
||||
|
||||
/* BMP conversion */
|
||||
opj_image_t* bmptoimage(const char *filename, opj_cparameters_t *parameters);
|
||||
int imagetobmp(opj_image_t *image, const char *outfile);
|
||||
|
||||
/* TIFF conversion*/
|
||||
opj_image_t* tiftoimage(const char *filename, opj_cparameters_t *parameters);
|
||||
int imagetotif(opj_image_t *image, const char *outfile);
|
||||
/**
|
||||
Load a single image component encoded in PGX file format
|
||||
@param filename Name of the PGX file to load
|
||||
@param parameters *List ?*
|
||||
@return Returns a greyscale image if successful, returns NULL otherwise
|
||||
*/
|
||||
opj_image_t* pgxtoimage(const char *filename, opj_cparameters_t *parameters);
|
||||
int imagetopgx(opj_image_t *image, const char *outfile);
|
||||
|
||||
opj_image_t* pnmtoimage(const char *filename, opj_cparameters_t *parameters);
|
||||
int imagetopnm(opj_image_t *image, const char *outfile, int force_split);
|
||||
|
||||
/* RAW conversion */
|
||||
int imagetoraw(opj_image_t * image, const char *outfile);
|
||||
int imagetorawl(opj_image_t * image, const char *outfile);
|
||||
opj_image_t* rawtoimage(const char *filename, opj_cparameters_t *parameters, raw_cparameters_t *raw_cp);
|
||||
opj_image_t* rawltoimage(const char *filename, opj_cparameters_t *parameters, raw_cparameters_t *raw_cp);
|
||||
|
||||
/* PNG conversion*/
|
||||
extern int imagetopng(opj_image_t *image, const char *write_idf);
|
||||
extern opj_image_t* pngtoimage(const char *filename, opj_cparameters_t *parameters);
|
||||
|
||||
#endif /* __J2K_CONVERT_H */
|
||||
|
||||
996
src/bin/jp2/convertbmp.c
Normal file
996
src/bin/jp2/convertbmp.c
Normal file
@@ -0,0 +1,996 @@
|
||||
/*
|
||||
* 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_apps_config.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#include "openjpeg.h"
|
||||
#include "convert.h"
|
||||
|
||||
typedef struct {
|
||||
OPJ_UINT16 bfType; /* 'BM' for Bitmap (19776) */
|
||||
OPJ_UINT32 bfSize; /* Size of the file */
|
||||
OPJ_UINT16 bfReserved1; /* Reserved : 0 */
|
||||
OPJ_UINT16 bfReserved2; /* Reserved : 0 */
|
||||
OPJ_UINT32 bfOffBits; /* Offset */
|
||||
} OPJ_BITMAPFILEHEADER;
|
||||
|
||||
typedef struct {
|
||||
OPJ_UINT32 biSize; /* Size of the structure in bytes */
|
||||
OPJ_UINT32 biWidth; /* Width of the image in pixels */
|
||||
OPJ_UINT32 biHeight; /* Heigth of the image in pixels */
|
||||
OPJ_UINT16 biPlanes; /* 1 */
|
||||
OPJ_UINT16 biBitCount; /* Number of color bits by pixels */
|
||||
OPJ_UINT32 biCompression; /* Type of encoding 0: none 1: RLE8 2: RLE4 */
|
||||
OPJ_UINT32 biSizeImage; /* Size of the image in bytes */
|
||||
OPJ_UINT32 biXpelsPerMeter; /* Horizontal (X) resolution in pixels/meter */
|
||||
OPJ_UINT32 biYpelsPerMeter; /* Vertical (Y) resolution in pixels/meter */
|
||||
OPJ_UINT32 biClrUsed; /* Number of color used in the image (0: ALL) */
|
||||
OPJ_UINT32 biClrImportant; /* Number of important color (0: ALL) */
|
||||
OPJ_UINT32 biRedMask; /* Red channel bit mask */
|
||||
OPJ_UINT32 biGreenMask; /* Green channel bit mask */
|
||||
OPJ_UINT32 biBlueMask; /* Blue channel bit mask */
|
||||
OPJ_UINT32 biAlphaMask; /* Alpha channel bit mask */
|
||||
OPJ_UINT32 biColorSpaceType; /* Color space type */
|
||||
OPJ_UINT8 biColorSpaceEP[36]; /* Color space end points */
|
||||
OPJ_UINT32 biRedGamma; /* Red channel gamma */
|
||||
OPJ_UINT32 biGreenGamma; /* Green channel gamma */
|
||||
OPJ_UINT32 biBlueGamma; /* Blue channel gamma */
|
||||
OPJ_UINT32 biIntent; /* Intent */
|
||||
OPJ_UINT32 biIccProfileData; /* ICC profile data */
|
||||
OPJ_UINT32 biIccProfileSize; /* ICC profile size */
|
||||
OPJ_UINT32 biReserved; /* Reserved */
|
||||
} OPJ_BITMAPINFOHEADER;
|
||||
|
||||
static void opj_applyLUT8u_8u32s_C1R(
|
||||
OPJ_UINT8 const* pSrc, OPJ_INT32 srcStride,
|
||||
OPJ_INT32* pDst, OPJ_INT32 dstStride,
|
||||
OPJ_UINT8 const* pLUT,
|
||||
OPJ_UINT32 width, OPJ_UINT32 height)
|
||||
{
|
||||
OPJ_UINT32 y;
|
||||
|
||||
for (y = height; y != 0U; --y) {
|
||||
OPJ_UINT32 x;
|
||||
|
||||
for(x = 0; x < width; x++)
|
||||
{
|
||||
pDst[x] = (OPJ_INT32)pLUT[pSrc[x]];
|
||||
}
|
||||
pSrc += srcStride;
|
||||
pDst += dstStride;
|
||||
}
|
||||
}
|
||||
|
||||
static void opj_applyLUT8u_8u32s_C1P3R(
|
||||
OPJ_UINT8 const* pSrc, OPJ_INT32 srcStride,
|
||||
OPJ_INT32* const* pDst, OPJ_INT32 const* pDstStride,
|
||||
OPJ_UINT8 const* const* pLUT,
|
||||
OPJ_UINT32 width, OPJ_UINT32 height)
|
||||
{
|
||||
OPJ_UINT32 y;
|
||||
OPJ_INT32* pR = pDst[0];
|
||||
OPJ_INT32* pG = pDst[1];
|
||||
OPJ_INT32* pB = pDst[2];
|
||||
OPJ_UINT8 const* pLUT_R = pLUT[0];
|
||||
OPJ_UINT8 const* pLUT_G = pLUT[1];
|
||||
OPJ_UINT8 const* pLUT_B = pLUT[2];
|
||||
|
||||
for (y = height; y != 0U; --y) {
|
||||
OPJ_UINT32 x;
|
||||
|
||||
for(x = 0; x < width; x++)
|
||||
{
|
||||
OPJ_UINT8 idx = pSrc[x];
|
||||
pR[x] = (OPJ_INT32)pLUT_R[idx];
|
||||
pG[x] = (OPJ_INT32)pLUT_G[idx];
|
||||
pB[x] = (OPJ_INT32)pLUT_B[idx];
|
||||
}
|
||||
pSrc += srcStride;
|
||||
pR += pDstStride[0];
|
||||
pG += pDstStride[1];
|
||||
pB += pDstStride[2];
|
||||
}
|
||||
}
|
||||
|
||||
static void bmp24toimage(const OPJ_UINT8* pData, OPJ_UINT32 stride, opj_image_t* image)
|
||||
{
|
||||
int index;
|
||||
OPJ_UINT32 width, height;
|
||||
OPJ_UINT32 x, y;
|
||||
const OPJ_UINT8 *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] = (OPJ_INT32)pSrc[3*x+2]; /* R */
|
||||
image->comps[1].data[index] = (OPJ_INT32)pSrc[3*x+1]; /* G */
|
||||
image->comps[2].data[index] = (OPJ_INT32)pSrc[3*x+0]; /* B */
|
||||
index++;
|
||||
}
|
||||
pSrc -= stride;
|
||||
}
|
||||
}
|
||||
|
||||
static void bmp_mask_get_shift_and_prec(OPJ_UINT32 mask, OPJ_UINT32* shift, OPJ_UINT32* prec)
|
||||
{
|
||||
OPJ_UINT32 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 OPJ_UINT8* pData, OPJ_UINT32 stride, opj_image_t* image, OPJ_UINT32 redMask, OPJ_UINT32 greenMask, OPJ_UINT32 blueMask, OPJ_UINT32 alphaMask)
|
||||
{
|
||||
int index;
|
||||
OPJ_UINT32 width, height;
|
||||
OPJ_UINT32 x, y;
|
||||
const OPJ_UINT8 *pSrc = NULL;
|
||||
OPJ_BOOL hasAlpha;
|
||||
OPJ_UINT32 redShift, redPrec;
|
||||
OPJ_UINT32 greenShift, greenPrec;
|
||||
OPJ_UINT32 blueShift, bluePrec;
|
||||
OPJ_UINT32 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++)
|
||||
{
|
||||
OPJ_UINT32 value = 0U;
|
||||
|
||||
value |= ((OPJ_UINT32)pSrc[4*x+0]) << 0;
|
||||
value |= ((OPJ_UINT32)pSrc[4*x+1]) << 8;
|
||||
value |= ((OPJ_UINT32)pSrc[4*x+2]) << 16;
|
||||
value |= ((OPJ_UINT32)pSrc[4*x+3]) << 24;
|
||||
|
||||
image->comps[0].data[index] = (OPJ_INT32)((value & redMask) >> redShift); /* R */
|
||||
image->comps[1].data[index] = (OPJ_INT32)((value & greenMask) >> greenShift); /* G */
|
||||
image->comps[2].data[index] = (OPJ_INT32)((value & blueMask) >> blueShift); /* B */
|
||||
if (hasAlpha) {
|
||||
image->comps[3].data[index] = (OPJ_INT32)((value & alphaMask) >> alphaShift); /* A */
|
||||
}
|
||||
index++;
|
||||
}
|
||||
pSrc -= stride;
|
||||
}
|
||||
}
|
||||
|
||||
static void bmpmask16toimage(const OPJ_UINT8* pData, OPJ_UINT32 stride, opj_image_t* image, OPJ_UINT32 redMask, OPJ_UINT32 greenMask, OPJ_UINT32 blueMask, OPJ_UINT32 alphaMask)
|
||||
{
|
||||
int index;
|
||||
OPJ_UINT32 width, height;
|
||||
OPJ_UINT32 x, y;
|
||||
const OPJ_UINT8 *pSrc = NULL;
|
||||
OPJ_BOOL hasAlpha;
|
||||
OPJ_UINT32 redShift, redPrec;
|
||||
OPJ_UINT32 greenShift, greenPrec;
|
||||
OPJ_UINT32 blueShift, bluePrec;
|
||||
OPJ_UINT32 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++)
|
||||
{
|
||||
OPJ_UINT32 value = 0U;
|
||||
|
||||
value |= ((OPJ_UINT32)pSrc[2*x+0]) << 0;
|
||||
value |= ((OPJ_UINT32)pSrc[2*x+1]) << 8;
|
||||
|
||||
image->comps[0].data[index] = (OPJ_INT32)((value & redMask) >> redShift); /* R */
|
||||
image->comps[1].data[index] = (OPJ_INT32)((value & greenMask) >> greenShift); /* G */
|
||||
image->comps[2].data[index] = (OPJ_INT32)((value & blueMask) >> blueShift); /* B */
|
||||
if (hasAlpha) {
|
||||
image->comps[3].data[index] = (OPJ_INT32)((value & alphaMask) >> alphaShift); /* A */
|
||||
}
|
||||
index++;
|
||||
}
|
||||
pSrc -= stride;
|
||||
}
|
||||
}
|
||||
|
||||
static opj_image_t* bmp8toimage(const OPJ_UINT8* pData, OPJ_UINT32 stride, opj_image_t* image, OPJ_UINT8 const* const* pLUT)
|
||||
{
|
||||
OPJ_UINT32 width, height;
|
||||
const OPJ_UINT8 *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, -(OPJ_INT32)stride, image->comps[0].data, (OPJ_INT32)width, pLUT[0], width, height);
|
||||
}
|
||||
else {
|
||||
OPJ_INT32* pDst[3];
|
||||
OPJ_INT32 pDstStride[3];
|
||||
|
||||
pDst[0] = image->comps[0].data; pDst[1] = image->comps[1].data; pDst[2] = image->comps[2].data;
|
||||
pDstStride[0] = (OPJ_INT32)width; pDstStride[1] = (OPJ_INT32)width; pDstStride[2] = (OPJ_INT32)width;
|
||||
opj_applyLUT8u_8u32s_C1P3R(pSrc, -(OPJ_INT32)stride, pDst, pDstStride, pLUT, width, height);
|
||||
}
|
||||
return image;
|
||||
}
|
||||
|
||||
static OPJ_BOOL bmp_read_file_header(FILE* IN, OPJ_BITMAPFILEHEADER* header)
|
||||
{
|
||||
header->bfType = (OPJ_UINT16)getc(IN);
|
||||
header->bfType |= (OPJ_UINT16)((OPJ_UINT32)getc(IN) << 8);
|
||||
|
||||
if (header->bfType != 19778) {
|
||||
fprintf(stderr,"Error, not a BMP file!\n");
|
||||
return OPJ_FALSE;
|
||||
}
|
||||
|
||||
/* FILE HEADER */
|
||||
/* ------------- */
|
||||
header->bfSize = (OPJ_UINT32)getc(IN);
|
||||
header->bfSize |= (OPJ_UINT32)getc(IN) << 8;
|
||||
header->bfSize |= (OPJ_UINT32)getc(IN) << 16;
|
||||
header->bfSize |= (OPJ_UINT32)getc(IN) << 24;
|
||||
|
||||
header->bfReserved1 = (OPJ_UINT16)getc(IN);
|
||||
header->bfReserved1 |= (OPJ_UINT16)((OPJ_UINT32)getc(IN) << 8);
|
||||
|
||||
header->bfReserved2 = (OPJ_UINT16)getc(IN);
|
||||
header->bfReserved2 |= (OPJ_UINT16)((OPJ_UINT32)getc(IN) << 8);
|
||||
|
||||
header->bfOffBits = (OPJ_UINT32)getc(IN);
|
||||
header->bfOffBits |= (OPJ_UINT32)getc(IN) << 8;
|
||||
header->bfOffBits |= (OPJ_UINT32)getc(IN) << 16;
|
||||
header->bfOffBits |= (OPJ_UINT32)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 = (OPJ_UINT32)getc(IN);
|
||||
header->biSize |= (OPJ_UINT32)getc(IN) << 8;
|
||||
header->biSize |= (OPJ_UINT32)getc(IN) << 16;
|
||||
header->biSize |= (OPJ_UINT32)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 = (OPJ_UINT32)getc(IN);
|
||||
header->biWidth |= (OPJ_UINT32)getc(IN) << 8;
|
||||
header->biWidth |= (OPJ_UINT32)getc(IN) << 16;
|
||||
header->biWidth |= (OPJ_UINT32)getc(IN) << 24;
|
||||
|
||||
header->biHeight = (OPJ_UINT32)getc(IN);
|
||||
header->biHeight |= (OPJ_UINT32)getc(IN) << 8;
|
||||
header->biHeight |= (OPJ_UINT32)getc(IN) << 16;
|
||||
header->biHeight |= (OPJ_UINT32)getc(IN) << 24;
|
||||
|
||||
header->biPlanes = (OPJ_UINT16)getc(IN);
|
||||
header->biPlanes |= (OPJ_UINT16)((OPJ_UINT32)getc(IN) << 8);
|
||||
|
||||
header->biBitCount = (OPJ_UINT16)getc(IN);
|
||||
header->biBitCount |= (OPJ_UINT16)((OPJ_UINT32)getc(IN) << 8);
|
||||
|
||||
if(header->biSize >= 40U) {
|
||||
header->biCompression = (OPJ_UINT32)getc(IN);
|
||||
header->biCompression |= (OPJ_UINT32)getc(IN) << 8;
|
||||
header->biCompression |= (OPJ_UINT32)getc(IN) << 16;
|
||||
header->biCompression |= (OPJ_UINT32)getc(IN) << 24;
|
||||
|
||||
header->biSizeImage = (OPJ_UINT32)getc(IN);
|
||||
header->biSizeImage |= (OPJ_UINT32)getc(IN) << 8;
|
||||
header->biSizeImage |= (OPJ_UINT32)getc(IN) << 16;
|
||||
header->biSizeImage |= (OPJ_UINT32)getc(IN) << 24;
|
||||
|
||||
header->biXpelsPerMeter = (OPJ_UINT32)getc(IN);
|
||||
header->biXpelsPerMeter |= (OPJ_UINT32)getc(IN) << 8;
|
||||
header->biXpelsPerMeter |= (OPJ_UINT32)getc(IN) << 16;
|
||||
header->biXpelsPerMeter |= (OPJ_UINT32)getc(IN) << 24;
|
||||
|
||||
header->biYpelsPerMeter = (OPJ_UINT32)getc(IN);
|
||||
header->biYpelsPerMeter |= (OPJ_UINT32)getc(IN) << 8;
|
||||
header->biYpelsPerMeter |= (OPJ_UINT32)getc(IN) << 16;
|
||||
header->biYpelsPerMeter |= (OPJ_UINT32)getc(IN) << 24;
|
||||
|
||||
header->biClrUsed = (OPJ_UINT32)getc(IN);
|
||||
header->biClrUsed |= (OPJ_UINT32)getc(IN) << 8;
|
||||
header->biClrUsed |= (OPJ_UINT32)getc(IN) << 16;
|
||||
header->biClrUsed |= (OPJ_UINT32)getc(IN) << 24;
|
||||
|
||||
header->biClrImportant = (OPJ_UINT32)getc(IN);
|
||||
header->biClrImportant |= (OPJ_UINT32)getc(IN) << 8;
|
||||
header->biClrImportant |= (OPJ_UINT32)getc(IN) << 16;
|
||||
header->biClrImportant |= (OPJ_UINT32)getc(IN) << 24;
|
||||
}
|
||||
|
||||
if(header->biSize >= 56U) {
|
||||
header->biRedMask = (OPJ_UINT32)getc(IN);
|
||||
header->biRedMask |= (OPJ_UINT32)getc(IN) << 8;
|
||||
header->biRedMask |= (OPJ_UINT32)getc(IN) << 16;
|
||||
header->biRedMask |= (OPJ_UINT32)getc(IN) << 24;
|
||||
|
||||
header->biGreenMask = (OPJ_UINT32)getc(IN);
|
||||
header->biGreenMask |= (OPJ_UINT32)getc(IN) << 8;
|
||||
header->biGreenMask |= (OPJ_UINT32)getc(IN) << 16;
|
||||
header->biGreenMask |= (OPJ_UINT32)getc(IN) << 24;
|
||||
|
||||
header->biBlueMask = (OPJ_UINT32)getc(IN);
|
||||
header->biBlueMask |= (OPJ_UINT32)getc(IN) << 8;
|
||||
header->biBlueMask |= (OPJ_UINT32)getc(IN) << 16;
|
||||
header->biBlueMask |= (OPJ_UINT32)getc(IN) << 24;
|
||||
|
||||
header->biAlphaMask = (OPJ_UINT32)getc(IN);
|
||||
header->biAlphaMask |= (OPJ_UINT32)getc(IN) << 8;
|
||||
header->biAlphaMask |= (OPJ_UINT32)getc(IN) << 16;
|
||||
header->biAlphaMask |= (OPJ_UINT32)getc(IN) << 24;
|
||||
}
|
||||
|
||||
if(header->biSize >= 108U) {
|
||||
header->biColorSpaceType = (OPJ_UINT32)getc(IN);
|
||||
header->biColorSpaceType |= (OPJ_UINT32)getc(IN) << 8;
|
||||
header->biColorSpaceType |= (OPJ_UINT32)getc(IN) << 16;
|
||||
header->biColorSpaceType |= (OPJ_UINT32)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 = (OPJ_UINT32)getc(IN);
|
||||
header->biRedGamma |= (OPJ_UINT32)getc(IN) << 8;
|
||||
header->biRedGamma |= (OPJ_UINT32)getc(IN) << 16;
|
||||
header->biRedGamma |= (OPJ_UINT32)getc(IN) << 24;
|
||||
|
||||
header->biGreenGamma = (OPJ_UINT32)getc(IN);
|
||||
header->biGreenGamma |= (OPJ_UINT32)getc(IN) << 8;
|
||||
header->biGreenGamma |= (OPJ_UINT32)getc(IN) << 16;
|
||||
header->biGreenGamma |= (OPJ_UINT32)getc(IN) << 24;
|
||||
|
||||
header->biBlueGamma = (OPJ_UINT32)getc(IN);
|
||||
header->biBlueGamma |= (OPJ_UINT32)getc(IN) << 8;
|
||||
header->biBlueGamma |= (OPJ_UINT32)getc(IN) << 16;
|
||||
header->biBlueGamma |= (OPJ_UINT32)getc(IN) << 24;
|
||||
}
|
||||
|
||||
if(header->biSize >= 124U) {
|
||||
header->biIntent = (OPJ_UINT32)getc(IN);
|
||||
header->biIntent |= (OPJ_UINT32)getc(IN) << 8;
|
||||
header->biIntent |= (OPJ_UINT32)getc(IN) << 16;
|
||||
header->biIntent |= (OPJ_UINT32)getc(IN) << 24;
|
||||
|
||||
header->biIccProfileData = (OPJ_UINT32)getc(IN);
|
||||
header->biIccProfileData |= (OPJ_UINT32)getc(IN) << 8;
|
||||
header->biIccProfileData |= (OPJ_UINT32)getc(IN) << 16;
|
||||
header->biIccProfileData |= (OPJ_UINT32)getc(IN) << 24;
|
||||
|
||||
header->biIccProfileSize = (OPJ_UINT32)getc(IN);
|
||||
header->biIccProfileSize |= (OPJ_UINT32)getc(IN) << 8;
|
||||
header->biIccProfileSize |= (OPJ_UINT32)getc(IN) << 16;
|
||||
header->biIccProfileSize |= (OPJ_UINT32)getc(IN) << 24;
|
||||
|
||||
header->biReserved = (OPJ_UINT32)getc(IN);
|
||||
header->biReserved |= (OPJ_UINT32)getc(IN) << 8;
|
||||
header->biReserved |= (OPJ_UINT32)getc(IN) << 16;
|
||||
header->biReserved |= (OPJ_UINT32)getc(IN) << 24;
|
||||
}
|
||||
return OPJ_TRUE;
|
||||
}
|
||||
|
||||
static OPJ_BOOL bmp_read_raw_data(FILE* IN, OPJ_UINT8* pData, OPJ_UINT32 stride, OPJ_UINT32 width, OPJ_UINT32 height)
|
||||
{
|
||||
OPJ_ARG_NOT_USED(width);
|
||||
|
||||
if ( fread(pData, sizeof(OPJ_UINT8), 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, OPJ_UINT8* pData, OPJ_UINT32 stride, OPJ_UINT32 width, OPJ_UINT32 height)
|
||||
{
|
||||
OPJ_UINT32 x, y;
|
||||
OPJ_UINT8 *pix;
|
||||
const OPJ_UINT8 *beyond;
|
||||
|
||||
beyond = pData + stride * height;
|
||||
pix = pData;
|
||||
|
||||
x = y = 0U;
|
||||
while (y < height)
|
||||
{
|
||||
int c = getc(IN);
|
||||
|
||||
if (c) {
|
||||
int j;
|
||||
OPJ_UINT8 c1 = (OPJ_UINT8)getc(IN);
|
||||
|
||||
for (j = 0; (j < c) && (x < width) && ((OPJ_SIZE_T)pix < (OPJ_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 += (OPJ_UINT32)c;
|
||||
c = getc(IN);
|
||||
y += (OPJ_UINT32)c;
|
||||
pix = pData + y * stride + x;
|
||||
}
|
||||
else /* 03 .. 255 */
|
||||
{
|
||||
int j;
|
||||
for (j = 0; (j < c) && (x < width) && ((OPJ_SIZE_T)pix < (OPJ_SIZE_T)beyond); j++, x++, pix++)
|
||||
{
|
||||
OPJ_UINT8 c1 = (OPJ_UINT8)getc(IN);
|
||||
*pix = c1;
|
||||
}
|
||||
if ((OPJ_UINT32)c & 1U) { /* skip padding byte */
|
||||
getc(IN);
|
||||
}
|
||||
}
|
||||
}
|
||||
}/* while() */
|
||||
return OPJ_TRUE;
|
||||
}
|
||||
|
||||
static OPJ_BOOL bmp_read_rle4_data(FILE* IN, OPJ_UINT8* pData, OPJ_UINT32 stride, OPJ_UINT32 width, OPJ_UINT32 height)
|
||||
{
|
||||
OPJ_UINT32 x, y;
|
||||
OPJ_UINT8 *pix;
|
||||
const OPJ_UINT8 *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;
|
||||
OPJ_UINT8 c1 = (OPJ_UINT8)getc(IN);
|
||||
|
||||
for (j = 0; (j < c) && (x < width) && ((OPJ_SIZE_T)pix < (OPJ_SIZE_T)beyond); j++, x++, pix++) {
|
||||
*pix = (OPJ_UINT8)((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 += (OPJ_UINT32)c;
|
||||
c = getc(IN); y += (OPJ_UINT32)c;
|
||||
pix = pData + y * stride + x;
|
||||
}
|
||||
else { /* 03 .. 255 : absolute mode */
|
||||
int j;
|
||||
OPJ_UINT8 c1 = 0U;
|
||||
|
||||
for (j = 0; (j < c) && (x < width) && ((OPJ_SIZE_T)pix < (OPJ_SIZE_T)beyond); j++, x++, pix++) {
|
||||
if((j&1) == 0) {
|
||||
c1 = (OPJ_UINT8)getc(IN);
|
||||
}
|
||||
*pix = (OPJ_UINT8)((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 */
|
||||
OPJ_UINT8 lut_R[256], lut_G[256], lut_B[256];
|
||||
OPJ_UINT8 const* pLUT[3];
|
||||
opj_image_t * image = NULL;
|
||||
FILE *IN;
|
||||
OPJ_BITMAPFILEHEADER File_h;
|
||||
OPJ_BITMAPINFOHEADER Info_h;
|
||||
OPJ_UINT32 i, palette_len, numcmpts = 1U;
|
||||
OPJ_BOOL l_result = OPJ_FALSE;
|
||||
OPJ_UINT8* pData = NULL;
|
||||
OPJ_UINT32 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) {
|
||||
OPJ_UINT8 has_color = 0U;
|
||||
for (i = 0U; i < palette_len; i++) {
|
||||
lut_B[i] = (OPJ_UINT8)getc(IN);
|
||||
lut_G[i] = (OPJ_UINT8)getc(IN);
|
||||
lut_R[i] = (OPJ_UINT8)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++;
|
||||
}
|
||||
}
|
||||
|
||||
if (Info_h.biWidth == 0 || Info_h.biHeight == 0) {
|
||||
fclose(IN);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (Info_h.biBitCount > (((OPJ_UINT32)-1) - 31) / Info_h.biWidth) {
|
||||
fclose(IN);
|
||||
return NULL;
|
||||
}
|
||||
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... */
|
||||
if (8 > (((OPJ_UINT32)-1) - 31) / Info_h.biWidth) {
|
||||
fclose(IN);
|
||||
return NULL;
|
||||
}
|
||||
stride = ((Info_h.biWidth * 8U + 31U) / 32U) * 4U;
|
||||
}
|
||||
|
||||
if (stride > ((OPJ_UINT32)-1) / sizeof(OPJ_UINT8) / Info_h.biHeight) {
|
||||
fclose(IN);
|
||||
return NULL;
|
||||
}
|
||||
pData = (OPJ_UINT8 *) calloc(1, stride * Info_h.biHeight * sizeof(OPJ_UINT8));
|
||||
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 = (OPJ_UINT32)parameters->subsampling_dx;
|
||||
cmptparm[i].dy = (OPJ_UINT32)parameters->subsampling_dy;
|
||||
cmptparm[i].w = Info_h.biWidth;
|
||||
cmptparm[i].h = Info_h.biHeight;
|
||||
}
|
||||
|
||||
image = opj_image_create(numcmpts, &cmptparm[0], (numcmpts == 1U) ? OPJ_CLRSPC_GRAY : OPJ_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 = (OPJ_UINT32)parameters->image_offset_x0;
|
||||
image->y0 = (OPJ_UINT32)parameters->image_offset_y0;
|
||||
image->x1 = image->x0 + (Info_h.biWidth - 1U) * (OPJ_UINT32)parameters->subsampling_dx + 1U;
|
||||
image->y1 = image->y0 + (Info_h.biHeight - 1U) * (OPJ_UINT32)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",
|
||||
(OPJ_UINT8) (h * w * 3 + 3 * h * (w % 2) + 54) & 0xff,
|
||||
(OPJ_UINT8) ((h * w * 3 + 3 * h * (w % 2) + 54) >> 8) & 0xff,
|
||||
(OPJ_UINT8) ((h * w * 3 + 3 * h * (w % 2) + 54) >> 16) & 0xff,
|
||||
(OPJ_UINT8) ((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", (OPJ_UINT8) ((w) & 0xff),
|
||||
(OPJ_UINT8) ((w) >> 8) & 0xff,
|
||||
(OPJ_UINT8) ((w) >> 16) & 0xff,
|
||||
(OPJ_UINT8) ((w) >> 24) & 0xff);
|
||||
fprintf(fdest, "%c%c%c%c", (OPJ_UINT8) ((h) & 0xff),
|
||||
(OPJ_UINT8) ((h) >> 8) & 0xff,
|
||||
(OPJ_UINT8) ((h) >> 16) & 0xff,
|
||||
(OPJ_UINT8) ((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", (OPJ_UINT8) (3 * h * w + 3 * h * (w % 2)) & 0xff,
|
||||
(OPJ_UINT8) ((h * w * 3 + 3 * h * (w % 2)) >> 8) & 0xff,
|
||||
(OPJ_UINT8) ((h * w * 3 + 3 * h * (w % 2)) >> 16) & 0xff,
|
||||
(OPJ_UINT8) ((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++) {
|
||||
OPJ_UINT8 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 = (OPJ_UINT8)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 = (OPJ_UINT8)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 = (OPJ_UINT8)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", (OPJ_UINT8) (h * w + 54 + 1024 + h * (w % 2)) & 0xff,
|
||||
(OPJ_UINT8) ((h * w + 54 + 1024 + h * (w % 2)) >> 8) & 0xff,
|
||||
(OPJ_UINT8) ((h * w + 54 + 1024 + h * (w % 2)) >> 16) & 0xff,
|
||||
(OPJ_UINT8) ((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", (OPJ_UINT8) ((w) & 0xff),
|
||||
(OPJ_UINT8) ((w) >> 8) & 0xff,
|
||||
(OPJ_UINT8) ((w) >> 16) & 0xff,
|
||||
(OPJ_UINT8) ((w) >> 24) & 0xff);
|
||||
fprintf(fdest, "%c%c%c%c", (OPJ_UINT8) ((h) & 0xff),
|
||||
(OPJ_UINT8) ((h) >> 8) & 0xff,
|
||||
(OPJ_UINT8) ((h) >> 16) & 0xff,
|
||||
(OPJ_UINT8) ((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", (OPJ_UINT8) (h * w + h * (w % 2)) & 0xff,
|
||||
(OPJ_UINT8) ((h * w + h * (w % 2)) >> 8) & 0xff,
|
||||
(OPJ_UINT8) ((h * w + h * (w % 2)) >> 16) & 0xff,
|
||||
(OPJ_UINT8) ((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", (OPJ_UINT8)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;
|
||||
}
|
||||
500
src/bin/jp2/convertpng.c
Normal file
500
src/bin/jp2/convertpng.c
Normal file
@@ -0,0 +1,500 @@
|
||||
/*
|
||||
* 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_apps_config.h"
|
||||
|
||||
#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 OPJ_BYTE* pSrc, OPJ_INT32* pDst, OPJ_SIZE_T length)
|
||||
{
|
||||
OPJ_SIZE_T i;
|
||||
for (i = 0; i < length; i++) {
|
||||
OPJ_INT32 val0 = *pSrc++;
|
||||
OPJ_INT32 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;
|
||||
OPJ_UINT32 i;
|
||||
png_uint_32 width, height = 0U;
|
||||
int color_type;
|
||||
FILE *reader = NULL;
|
||||
OPJ_BYTE** rows = NULL;
|
||||
OPJ_INT32* row32s = NULL;
|
||||
/* j2k: */
|
||||
opj_image_t *image = NULL;
|
||||
opj_image_cmptparm_t cmptparm[4];
|
||||
OPJ_UINT32 nr_comp;
|
||||
OPJ_BYTE sigbuf[8];
|
||||
convert_XXx32s_C1R cvtXXTo32s = NULL;
|
||||
convert_32s_CXPX cvtCxToPx = NULL;
|
||||
OPJ_INT32* 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 = (OPJ_BYTE**)calloc(height+1, sizeof(OPJ_BYTE*));
|
||||
if(rows == NULL){
|
||||
fprintf(stderr, "pngtoimage: memory out\n");
|
||||
goto fin;
|
||||
}
|
||||
for(i = 0; i < height; ++i){
|
||||
rows[i] = (OPJ_BYTE*)malloc(png_get_rowbytes(png,info));
|
||||
if(rows[i] == NULL){
|
||||
fprintf(stderr,"pngtoimage: memory out\n");
|
||||
goto fin;
|
||||
}
|
||||
}
|
||||
png_read_image(png, rows);
|
||||
|
||||
/* Create image */
|
||||
memset(cmptparm, 0, sizeof(cmptparm));
|
||||
for(i = 0; i < nr_comp; ++i)
|
||||
{
|
||||
cmptparm[i].prec = (OPJ_UINT32)bit_depth;
|
||||
/* bits_per_pixel: 8 or 16 */
|
||||
cmptparm[i].bpp = (OPJ_UINT32)bit_depth;
|
||||
cmptparm[i].sgnd = 0;
|
||||
cmptparm[i].dx = (OPJ_UINT32)params->subsampling_dx;
|
||||
cmptparm[i].dy = (OPJ_UINT32)params->subsampling_dy;
|
||||
cmptparm[i].w = (OPJ_UINT32)width;
|
||||
cmptparm[i].h = (OPJ_UINT32)height;
|
||||
}
|
||||
|
||||
image = opj_image_create(nr_comp, &cmptparm[0], (nr_comp > 2U) ? OPJ_CLRSPC_SRGB : OPJ_CLRSPC_GRAY);
|
||||
if(image == NULL) goto fin;
|
||||
image->x0 = (OPJ_UINT32)params->image_offset_x0;
|
||||
image->y0 = (OPJ_UINT32)params->image_offset_y0;
|
||||
image->x1 = (OPJ_UINT32)(image->x0 + (width - 1) * (OPJ_UINT32)params->subsampling_dx + 1 + image->x0);
|
||||
image->y1 = (OPJ_UINT32)(image->y0 + (height - 1) * (OPJ_UINT32)params->subsampling_dy + 1 + image->y0);
|
||||
|
||||
row32s = (OPJ_INT32 *)malloc((size_t)width * nr_comp * sizeof(OPJ_INT32));
|
||||
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, (OPJ_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)
|
||||
if(rows[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 OPJ_INT32* pSrc, OPJ_BYTE* pDst, OPJ_SIZE_T length)
|
||||
{
|
||||
OPJ_SIZE_T i;
|
||||
for (i = 0; i < length; i++) {
|
||||
OPJ_UINT32 val = (OPJ_UINT32)pSrc[i];
|
||||
*pDst++ = (OPJ_BYTE)(val >> 8);
|
||||
*pDst++ = (OPJ_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;
|
||||
OPJ_INT32 const* planes[4];
|
||||
int i;
|
||||
OPJ_INT32* 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]), (OPJ_UINT32)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 */
|
||||
{
|
||||
OPJ_SIZE_T rowStride;
|
||||
png_size_t png_row_size;
|
||||
|
||||
png_row_size = png_get_rowbytes(png, info);
|
||||
rowStride = ((OPJ_SIZE_T)image->comps[0].w * (OPJ_SIZE_T)nr_comp * (OPJ_SIZE_T)prec + 7U) / 8U;
|
||||
if (rowStride != (OPJ_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 = (OPJ_INT32*)malloc((OPJ_SIZE_T)image->comps[0].w * (OPJ_SIZE_T)nr_comp * sizeof(OPJ_INT32));
|
||||
if (buffer32s == NULL) {
|
||||
fprintf(stderr, "Can't allocate memory for interleaved 32s row\n");
|
||||
goto fin;
|
||||
}
|
||||
}
|
||||
|
||||
/* convert */
|
||||
{
|
||||
OPJ_SIZE_T width= image->comps[0].w;
|
||||
OPJ_UINT32 y;
|
||||
convert_32s_PXCX cvtPxToCx = convert_32s_PXCX_LUT[nr_comp];
|
||||
convert_32sXXx_C1R cvt32sToPack = NULL;
|
||||
OPJ_INT32 adjust = image->comps[0].sgnd ? 1 << (prec - 1) : 0;
|
||||
png_bytep row_buf_cpy = row_buf;
|
||||
OPJ_INT32* 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 * (OPJ_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() */
|
||||
1457
src/bin/jp2/converttif.c
Normal file
1457
src/bin/jp2/converttif.c
Normal file
File diff suppressed because it is too large
Load Diff
397
src/bin/jp2/index.c
Normal file
397
src/bin/jp2/index.c
Normal file
@@ -0,0 +1,397 @@
|
||||
/*
|
||||
* 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) 2003-2007, Francois-Olivier Devaux
|
||||
* 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 <math.h>
|
||||
#include <string.h>
|
||||
#include "openjpeg.h"
|
||||
#include "index.h"
|
||||
#include "opj_inttypes.h"
|
||||
|
||||
/* ------------------------------------------------------------------------------------ */
|
||||
|
||||
/**
|
||||
Write a structured index to a file
|
||||
@param cstr_info Codestream information
|
||||
@param index Index filename
|
||||
@return Returns 0 if successful, returns 1 otherwise
|
||||
*/
|
||||
int write_index_file(opj_codestream_info_t *cstr_info, char *index) {
|
||||
int tileno, compno, layno, resno, precno, pack_nb, x, y;
|
||||
FILE *stream = NULL;
|
||||
double total_disto = 0;
|
||||
/* UniPG>> */
|
||||
int tilepartno;
|
||||
char disto_on, numpix_on;
|
||||
|
||||
#ifdef USE_JPWL
|
||||
if (!strcmp(index, JPWL_PRIVATEINDEX_NAME))
|
||||
return 0;
|
||||
#endif /* USE_JPWL */
|
||||
/* <<UniPG */
|
||||
|
||||
if (!cstr_info)
|
||||
return 1;
|
||||
|
||||
stream = fopen(index, "w");
|
||||
if (!stream) {
|
||||
fprintf(stderr, "failed to open index file [%s] for writing\n", index);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (cstr_info->tile[0].distotile > 0.0)
|
||||
disto_on = 1;
|
||||
else
|
||||
disto_on = 0;
|
||||
|
||||
if (cstr_info->tile[0].numpix)
|
||||
numpix_on = 1;
|
||||
else
|
||||
numpix_on = 0;
|
||||
|
||||
fprintf(stream, "%d %d\n", cstr_info->image_w, cstr_info->image_h);
|
||||
fprintf(stream, "%d\n", cstr_info->prog);
|
||||
fprintf(stream, "%d %d\n", cstr_info->tile_x, cstr_info->tile_y);
|
||||
fprintf(stream, "%d %d\n", cstr_info->tw, cstr_info->th);
|
||||
fprintf(stream, "%d\n", cstr_info->numcomps);
|
||||
fprintf(stream, "%d\n", cstr_info->numlayers);
|
||||
fprintf(stream, "%d\n", cstr_info->numdecompos[0]); /* based on component 0 */
|
||||
|
||||
for (resno = cstr_info->numdecompos[0]; resno >= 0; resno--) {
|
||||
fprintf(stream, "[%d,%d] ",
|
||||
(1 << cstr_info->tile[0].pdx[resno]), (1 << cstr_info->tile[0].pdx[resno])); /* based on tile 0 and component 0 */
|
||||
}
|
||||
|
||||
fprintf(stream, "\n");
|
||||
/* UniPG>> */
|
||||
fprintf(stream, "%d\n", cstr_info->main_head_start);
|
||||
/* <<UniPG */
|
||||
fprintf(stream, "%d\n", cstr_info->main_head_end);
|
||||
fprintf(stream, "%d\n", cstr_info->codestream_size);
|
||||
|
||||
fprintf(stream, "\nINFO ON TILES\n");
|
||||
fprintf(stream, "tileno start_pos end_hd end_tile nbparts");
|
||||
if (disto_on)
|
||||
fprintf(stream," disto");
|
||||
if (numpix_on)
|
||||
fprintf(stream," nbpix");
|
||||
if (disto_on && numpix_on)
|
||||
fprintf(stream," disto/nbpix");
|
||||
fprintf(stream, "\n");
|
||||
|
||||
for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) {
|
||||
fprintf(stream, "%4d %9d %9d %9d %9d",
|
||||
cstr_info->tile[tileno].tileno,
|
||||
cstr_info->tile[tileno].start_pos,
|
||||
cstr_info->tile[tileno].end_header,
|
||||
cstr_info->tile[tileno].end_pos,
|
||||
cstr_info->tile[tileno].num_tps);
|
||||
if (disto_on)
|
||||
fprintf(stream," %9e", cstr_info->tile[tileno].distotile);
|
||||
if (numpix_on)
|
||||
fprintf(stream," %9d", cstr_info->tile[tileno].numpix);
|
||||
if (disto_on && numpix_on)
|
||||
fprintf(stream," %9e", cstr_info->tile[tileno].distotile / cstr_info->tile[tileno].numpix);
|
||||
fprintf(stream, "\n");
|
||||
}
|
||||
|
||||
for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) {
|
||||
OPJ_OFF_T start_pos, end_ph_pos, end_pos;
|
||||
double disto = 0;
|
||||
int max_numdecompos = 0;
|
||||
pack_nb = 0;
|
||||
|
||||
for (compno = 0; compno < cstr_info->numcomps; compno++) {
|
||||
if (max_numdecompos < cstr_info->numdecompos[compno])
|
||||
max_numdecompos = cstr_info->numdecompos[compno];
|
||||
}
|
||||
|
||||
fprintf(stream, "\nTILE %d DETAILS\n", tileno);
|
||||
fprintf(stream, "part_nb tileno start_pack num_packs start_pos end_tph_pos end_pos\n");
|
||||
for (tilepartno = 0; tilepartno < cstr_info->tile[tileno].num_tps; tilepartno++)
|
||||
fprintf(stream, "%4d %9d %9d %9d %9d %11d %9d\n",
|
||||
tilepartno, tileno,
|
||||
cstr_info->tile[tileno].tp[tilepartno].tp_start_pack,
|
||||
cstr_info->tile[tileno].tp[tilepartno].tp_numpacks,
|
||||
cstr_info->tile[tileno].tp[tilepartno].tp_start_pos,
|
||||
cstr_info->tile[tileno].tp[tilepartno].tp_end_header,
|
||||
cstr_info->tile[tileno].tp[tilepartno].tp_end_pos
|
||||
);
|
||||
|
||||
if (cstr_info->prog == OPJ_LRCP) { /* LRCP */
|
||||
fprintf(stream, "LRCP\npack_nb tileno layno resno compno precno start_pos end_ph_pos end_pos");
|
||||
if (disto_on)
|
||||
fprintf(stream, " disto");
|
||||
fprintf(stream,"\n");
|
||||
|
||||
for (layno = 0; layno < cstr_info->numlayers; layno++) {
|
||||
for (resno = 0; resno < max_numdecompos + 1; resno++) {
|
||||
for (compno = 0; compno < cstr_info->numcomps; compno++) {
|
||||
int prec_max;
|
||||
if (resno > cstr_info->numdecompos[compno])
|
||||
break;
|
||||
prec_max = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];
|
||||
for (precno = 0; precno < prec_max; precno++) {
|
||||
start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos;
|
||||
end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos;
|
||||
end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos;
|
||||
disto = cstr_info->tile[tileno].packet[pack_nb].disto;
|
||||
fprintf(stream, "%4d %6d %7d %5d %6d %6d %6" PRId64 " %6" PRId64 " %7" PRId64,
|
||||
pack_nb, tileno, layno, resno, compno, precno, start_pos, end_ph_pos, end_pos);
|
||||
if (disto_on)
|
||||
fprintf(stream, " %8e", disto);
|
||||
fprintf(stream, "\n");
|
||||
total_disto += disto;
|
||||
pack_nb++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} /* LRCP */
|
||||
|
||||
else if (cstr_info->prog == OPJ_RLCP) { /* RLCP */
|
||||
fprintf(stream, "RLCP\npack_nb tileno resno layno compno precno start_pos end_ph_pos end_pos\n");
|
||||
if (disto_on)
|
||||
fprintf(stream, " disto");
|
||||
fprintf(stream,"\n");
|
||||
|
||||
for (resno = 0; resno < max_numdecompos + 1; resno++) {
|
||||
for (layno = 0; layno < cstr_info->numlayers; layno++) {
|
||||
for (compno = 0; compno < cstr_info->numcomps; compno++) {
|
||||
int prec_max;
|
||||
if (resno > cstr_info->numdecompos[compno])
|
||||
break;
|
||||
prec_max = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];
|
||||
for (precno = 0; precno < prec_max; precno++) {
|
||||
start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos;
|
||||
end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos;
|
||||
end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos;
|
||||
disto = cstr_info->tile[tileno].packet[pack_nb].disto;
|
||||
fprintf(stream, "%4d %6d %5d %7d %6d %6d %9" PRId64 " %9" PRId64 " %7" PRId64,
|
||||
pack_nb, tileno, resno, layno, compno, precno, start_pos, end_ph_pos, end_pos);
|
||||
if (disto_on)
|
||||
fprintf(stream, " %8e", disto);
|
||||
fprintf(stream, "\n");
|
||||
total_disto += disto;
|
||||
pack_nb++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} /* RLCP */
|
||||
|
||||
else if (cstr_info->prog == OPJ_RPCL) { /* RPCL */
|
||||
|
||||
fprintf(stream, "RPCL\npack_nb tileno resno precno compno layno start_pos end_ph_pos end_pos");
|
||||
if (disto_on)
|
||||
fprintf(stream, " disto");
|
||||
fprintf(stream,"\n");
|
||||
|
||||
for (resno = 0; resno < max_numdecompos + 1; resno++) {
|
||||
int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];
|
||||
for (precno = 0; precno < numprec; precno++) {
|
||||
/* I suppose components have same XRsiz, YRsiz */
|
||||
int x0 = cstr_info->tile_Ox + tileno - (int)floor((float)tileno/(float)cstr_info->tw ) * cstr_info->tw * cstr_info->tile_x;
|
||||
int y0 = cstr_info->tile_Ox + (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tile_y;
|
||||
int x1 = x0 + cstr_info->tile_x;
|
||||
int y1 = y0 + cstr_info->tile_y;
|
||||
for (compno = 0; compno < cstr_info->numcomps; compno++) {
|
||||
int pcnx = cstr_info->tile[tileno].pw[resno];
|
||||
int pcx = (int) pow( 2, cstr_info->tile[tileno].pdx[resno] + cstr_info->numdecompos[compno] - resno );
|
||||
int pcy = (int) pow( 2, cstr_info->tile[tileno].pdy[resno] + cstr_info->numdecompos[compno] - resno );
|
||||
int precno_x = precno - (int) floor( (float)precno/(float)pcnx ) * pcnx;
|
||||
int precno_y = (int) floor( (float)precno/(float)pcnx );
|
||||
if (resno > cstr_info->numdecompos[compno])
|
||||
break;
|
||||
for(y = y0; y < y1; y++) {
|
||||
if (precno_y*pcy == y ) {
|
||||
for (x = x0; x < x1; x++) {
|
||||
if (precno_x*pcx == x ) {
|
||||
for (layno = 0; layno < cstr_info->numlayers; layno++) {
|
||||
start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos;
|
||||
end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos;
|
||||
end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos;
|
||||
disto = cstr_info->tile[tileno].packet[pack_nb].disto;
|
||||
fprintf(stream, "%4d %6d %5d %6d %6d %7d %9" PRId64 " %9" PRId64 " %7" PRId64,
|
||||
pack_nb, tileno, resno, precno, compno, layno, start_pos, end_ph_pos, end_pos);
|
||||
if (disto_on)
|
||||
fprintf(stream, " %8e", disto);
|
||||
fprintf(stream, "\n");
|
||||
total_disto += disto;
|
||||
pack_nb++;
|
||||
}
|
||||
}
|
||||
}/* x = x0..x1 */
|
||||
}
|
||||
} /* y = y0..y1 */
|
||||
} /* precno */
|
||||
} /* compno */
|
||||
} /* resno */
|
||||
} /* RPCL */
|
||||
|
||||
else if (cstr_info->prog == OPJ_PCRL) { /* PCRL */
|
||||
/* I suppose components have same XRsiz, YRsiz */
|
||||
int x0 = cstr_info->tile_Ox + tileno - (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tw * cstr_info->tile_x;
|
||||
int y0 = cstr_info->tile_Ox + (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tile_y;
|
||||
int x1 = x0 + cstr_info->tile_x;
|
||||
int y1 = y0 + cstr_info->tile_y;
|
||||
|
||||
/* Count the maximum number of precincts */
|
||||
int max_numprec = 0;
|
||||
for (resno = 0; resno < max_numdecompos + 1; resno++) {
|
||||
int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];
|
||||
if (numprec > max_numprec)
|
||||
max_numprec = numprec;
|
||||
}
|
||||
|
||||
fprintf(stream, "PCRL\npack_nb tileno precno compno resno layno start_pos end_ph_pos end_pos");
|
||||
if (disto_on)
|
||||
fprintf(stream, " disto");
|
||||
fprintf(stream,"\n");
|
||||
|
||||
for (precno = 0; precno < max_numprec; precno++) {
|
||||
for (compno = 0; compno < cstr_info->numcomps; compno++) {
|
||||
for (resno = 0; resno < cstr_info->numdecompos[compno] + 1; resno++) {
|
||||
int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];
|
||||
int pcnx = cstr_info->tile[tileno].pw[resno];
|
||||
int pcx = (int) pow( 2, cstr_info->tile[tileno].pdx[resno] + cstr_info->numdecompos[compno] - resno );
|
||||
int pcy = (int) pow( 2, cstr_info->tile[tileno].pdy[resno] + cstr_info->numdecompos[compno] - resno );
|
||||
int precno_x = precno - (int) floor( (float)precno/(float)pcnx ) * pcnx;
|
||||
int precno_y = (int) floor( (float)precno/(float)pcnx );
|
||||
if (precno >= numprec)
|
||||
continue;
|
||||
for(y = y0; y < y1; y++) {
|
||||
if (precno_y*pcy == y ) {
|
||||
for (x = x0; x < x1; x++) {
|
||||
if (precno_x*pcx == x ) {
|
||||
for (layno = 0; layno < cstr_info->numlayers; layno++) {
|
||||
start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos;
|
||||
end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos;
|
||||
end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos;
|
||||
disto = cstr_info->tile[tileno].packet[pack_nb].disto;
|
||||
fprintf(stream, "%4d %6d %6d %6d %5d %7d %9" PRId64 " %9" PRId64 " %7" PRId64,
|
||||
pack_nb, tileno, precno, compno, resno, layno, start_pos, end_ph_pos, end_pos);
|
||||
if (disto_on)
|
||||
fprintf(stream, " %8e", disto);
|
||||
fprintf(stream, "\n");
|
||||
total_disto += disto;
|
||||
pack_nb++;
|
||||
}
|
||||
}
|
||||
}/* x = x0..x1 */
|
||||
}
|
||||
} /* y = y0..y1 */
|
||||
} /* resno */
|
||||
} /* compno */
|
||||
} /* precno */
|
||||
} /* PCRL */
|
||||
|
||||
else { /* CPRL */
|
||||
/* Count the maximum number of precincts */
|
||||
int max_numprec = 0;
|
||||
for (resno = 0; resno < max_numdecompos + 1; resno++) {
|
||||
int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];
|
||||
if (numprec > max_numprec)
|
||||
max_numprec = numprec;
|
||||
}
|
||||
|
||||
fprintf(stream, "CPRL\npack_nb tileno compno precno resno layno start_pos end_ph_pos end_pos");
|
||||
if (disto_on)
|
||||
fprintf(stream, " disto");
|
||||
fprintf(stream,"\n");
|
||||
|
||||
for (compno = 0; compno < cstr_info->numcomps; compno++) {
|
||||
/* I suppose components have same XRsiz, YRsiz */
|
||||
int x0 = cstr_info->tile_Ox + tileno - (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tw * cstr_info->tile_x;
|
||||
int y0 = cstr_info->tile_Ox + (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tile_y;
|
||||
int x1 = x0 + cstr_info->tile_x;
|
||||
int y1 = y0 + cstr_info->tile_y;
|
||||
|
||||
for (precno = 0; precno < max_numprec; precno++) {
|
||||
for (resno = 0; resno < cstr_info->numdecompos[compno] + 1; resno++) {
|
||||
int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];
|
||||
int pcnx = cstr_info->tile[tileno].pw[resno];
|
||||
int pcx = (int) pow( 2, cstr_info->tile[tileno].pdx[resno] + cstr_info->numdecompos[compno] - resno );
|
||||
int pcy = (int) pow( 2, cstr_info->tile[tileno].pdy[resno] + cstr_info->numdecompos[compno] - resno );
|
||||
int precno_x = precno - (int) floor( (float)precno/(float)pcnx ) * pcnx;
|
||||
int precno_y = (int) floor( (float)precno/(float)pcnx );
|
||||
if (precno >= numprec)
|
||||
continue;
|
||||
|
||||
for(y = y0; y < y1; y++) {
|
||||
if (precno_y*pcy == y ) {
|
||||
for (x = x0; x < x1; x++) {
|
||||
if (precno_x*pcx == x ) {
|
||||
for (layno = 0; layno < cstr_info->numlayers; layno++) {
|
||||
start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos;
|
||||
end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos;
|
||||
end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos;
|
||||
disto = cstr_info->tile[tileno].packet[pack_nb].disto;
|
||||
fprintf(stream, "%4d %6d %6d %6d %5d %7d %9" PRId64 " %9" PRId64 " %7" PRId64,
|
||||
pack_nb, tileno, compno, precno, resno, layno, start_pos, end_ph_pos, end_pos);
|
||||
if (disto_on)
|
||||
fprintf(stream, " %8e", disto);
|
||||
fprintf(stream, "\n");
|
||||
total_disto += disto;
|
||||
pack_nb++;
|
||||
}
|
||||
}
|
||||
}/* x = x0..x1 */
|
||||
}
|
||||
} /* y = y0..y1 */
|
||||
} /* resno */
|
||||
} /* precno */
|
||||
} /* compno */
|
||||
} /* CPRL */
|
||||
} /* tileno */
|
||||
|
||||
if (disto_on) {
|
||||
fprintf(stream, "%8e\n", cstr_info->D_max); /* SE max */
|
||||
fprintf(stream, "%.8e\n", total_disto); /* SE totale */
|
||||
}
|
||||
/* UniPG>> */
|
||||
/* print the markers' list */
|
||||
if (cstr_info->marknum) {
|
||||
fprintf(stream, "\nMARKER LIST\n");
|
||||
fprintf(stream, "%d\n", cstr_info->marknum);
|
||||
fprintf(stream, "type\tstart_pos length\n");
|
||||
for (x = 0; x < cstr_info->marknum; x++)
|
||||
fprintf(stream, "%X\t%9" PRId64 " %9d\n", cstr_info->marker[x].type, cstr_info->marker[x].pos, cstr_info->marker[x].len);
|
||||
}
|
||||
/* <<UniPG */
|
||||
fclose(stream);
|
||||
|
||||
fprintf(stderr,"Generated index file %s\n", index);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,7 +1,12 @@
|
||||
/*
|
||||
* Copyright (c) 2001-2002, David Janssens
|
||||
* Copyright (c) 2003, Yannick Verschueren
|
||||
* Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
||||
* 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) 2003-2007, Francois-Olivier Devaux
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@@ -26,17 +31,24 @@
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "fix.h"
|
||||
#ifndef __J2K_INDEX_H
|
||||
#define __J2K_INDEX_H
|
||||
|
||||
#ifdef WIN32
|
||||
#define int64 __int64
|
||||
#else
|
||||
#define int64 long long
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Multiply two fixed-precision rational numbers.
|
||||
/// </summary>
|
||||
int fix_mul(int a, int b) {
|
||||
return (int)((int64)a*(int64)b>>13);
|
||||
/**
|
||||
Write a structured index to a file
|
||||
@param cstr_info Codestream information
|
||||
@param index Index filename
|
||||
@return Returns 0 if successful, returns 1 otherwise
|
||||
*/
|
||||
int write_index_file(opj_codestream_info_t *cstr_info, char *index);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __J2K_INDEX_H */
|
||||
|
||||
1932
src/bin/jp2/opj_compress.c
Normal file
1932
src/bin/jp2/opj_compress.c
Normal file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user