openjpeg-2.1.0/THANKS000644 001750 001750 00000001166 12327650571 015402 0ustar00mathieumathieu000000 000000 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. Winfried Szukalski Vincent Torri Bob Friesenhahn Callum Lerwick Dzonatas Sol Julien Malik Jerôme Fimes Herve Drolon Yannick Verschueren Sebastien Lugan Kaori Hagihara Peter Wimmer Francois-Olivier Devaux Antonin Descampe David Janssens Pr. Benoit Macq Luis Ibanez Ben Boeckel Vincent Nicolas Glenn Pearson Giuseppe Baruffa Arnaud Maye Rex Dieter David Burken Parvatha Elangovan Hans Johnson Luc Hermitteopenjpeg-2.1.0/LICENSE000644 001750 001750 00000004100 12327650571 015463 0ustar00mathieumathieu000000 000000 /* * 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) 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 * 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. */ openjpeg-2.1.0/INSTALL000644 001750 001750 00000005345 12327650571 015523 0ustar00mathieumathieu000000 000000 How to build and install openjpeg binaries ========================================== UNIX/LINUX/MacOSX/Windows systems -------------------------- Using cmake (see www.cmake.org) Type: cmake . make If you are root: make install else if you have sudo power: sudo make install else DESTDIR=$HOME/local make install To build the Doxygen documentation (Doxygen needs to be found on the system): (A 'html' directory is generated in the 'doc' directory) make doc Binaries are located in the 'bin' directory. Main available cmake flags: * To specify the install path: '-DCMAKE_INSTALL_PREFIX=/path', or use DESTDIR env variable (see above) * To build the shared libraries and links the executables against it: '-DBUILD_SHARED_LIBS:bool=on' (default: 'ON') Note: when using this option, static libraries are not built and executables are dynamically linked. * To build the CODEC executables: '-DBUILD_CODEC:bool=on' (default: 'ON') * To build the documentation: '-DBUILD_DOC:bool=on' (default: 'OFF') * To build the MJ2 executables: '-DBUILD_MJ2:bool=on' (default: 'OFF') * To build the JPWL executables and JPWL library: '-DBUILD_JPWL:bool=on' (default: 'OFF') * To build the JPIP library and utilities: '-DBUILD_JPIP:bool=on' (default: 'OFF') ** To build the JPIP server: '-DBUILD_JPIP_SERVER:bool=on' (default: 'OFF') * To build the JP3D library and utilities: '-DBUILD_JP3D:bool=on' (default: 'OFF') (experimental) * To build the Java binding: '-DBUILD_JAVA:bool=on' (default: 'OFF') (experimental). ** to choose which java implementation, you can set your JAVA_HOME env var. * To build the wxWidgets/C++ viewer: 'BUILD_VIEWER:BOOL=ON' (default OFF) (experimental) * To enable testing (and automatic result upload to http://my.cdash.org/index.php?project=OPENJPEG): cmake . -DBUILD_TESTING:BOOL=ON -DOPJ_DATA_ROOT:PATH='path/to/the/data/directory' make make Experimental Note : JPEG2000 test files are available with 'svn checkout http://openjpeg.googlecode.com/svn/data' (about 70 Mo). If '-DOPJ_DATA_ROOT:PATH' option is omitted, test files will be automatically searched in '${CMAKE_SOURCE_DIR}/../data', corresponding to the location of the data directory when compiling from the trunk (and assuming the data directory has been checked out of course). MACOSX ------ The same building procedures as above work for MACOSX. The xcode project file can also be used. If it does not work, try adding the following flag to the cmake command : '-DCMAKE_OSX_ARCHITECTURES:STRING=i386' WINDOWS ------- You can use cmake to generate project files for the IDE you are using (VS2010, NMake, etc). Type 'cmake --help' for available generators on your platform. Make sure to build the third party libs (png, zlib ...): '-DBUILD_THIRDPARTY:BOOL=ON' openjpeg-2.1.0/NEWS000644 001750 001750 00000003743 12327650571 015171 0ustar00mathieumathieu000000 000000 OpenJPEG NEWS - user visible changes ==================================== Changes from OpenJPEG 2.0.0 to OpenJPEG 2.X.X ---------------------------------------------- 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 abi_compat_report in dev-utils/scripts) * 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 officialy 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. Changes from OpenJPEG 1.5.x to OpenJPEG 2.0.0 ---------------------------------------------- New Features: * streaming capabilities * merge JP3D API modifications: * Use a 64bits capable API Misc: * removed autotools build system * folders hierarchies reorganisation * Huge amount of bug fixes. See CHANGES for details. openjpeg-2.1.0/CHANGES000644 001750 001750 00000115735 12327650571 015472 0ustar00mathieumathieu000000 000000 2014-04-29 Mathieu Malaterre * [r2866] .[CPY]: [2.1] Create the 2.1 branch 2014-04-28 Antonin Descampe * [r2864] [trunk] fixed warning in j2k.c about sign conversion 2014-04-28 Mathieu Malaterre * [r2863] [trunk] Finalize API for openjpeg 2.1 public header will only contains minimal information: major, minor and build version Prefix has been changed from OPENJPEG to OPJ for consistency SOVERSION has been removed from header (ABI vs API info) OPJ_VERSION string has been removed, since it is accessible already (PACKAGE_VERSION) Fixes issue 342 * [r2862] [trunk] Properly handle failure to compress (remove file) Fixes issue 323 * [r2861] [trunk] Missing endianess setting Fixes issue 337 * [r2860] [trunk] properly handle pkg-config on non-UNIX hosts Fixes issue 340 * [r2859] [trunk] Provide #ifdef blockers for OpenJPEG Version Fixes issue 342 2014-04-27 Antonin Descampe * [r2858] [trunk] fixed typo in NEWS 2014-04-25 Antonin Descampe * [r2857] [trunk] updated NEWS for 2.1.0 2014-04-24 Mathieu Malaterre * [r2855] [trunk] Make sure OpenJPIP compiles on WIN32 2014-04-24 Antonin Descampe * [r2852] [trunk] fixed reference to opj_stream_set_user_data_v3 in jpip sources. 2014-04-23 Antonin Descampe * [r2851] [trunk]removed '-x' option for index file as long as it's broken * [r2849] [trunk]re-formatted help display in executables * [r2848] [trunk]formatted some messages. Removed -version option to disambiguate with -v(erbose) option, added version info in help display * [r2847] [trunk]Replaced deprecated opj_stream_set_user_data function from API with its 'v3' version, and removed all other 'v3' suffixes from API. 2014-04-22 Antonin Descampe * [r2845] [trunk] fixed some warning and errors formatting and add a '-version' option to opj_compress and opj_decompress binaries 2014-04-17 Antonin Descampe * [r2838] [trunk] fixed warning related to r2837 and move new field at the end of parameters structure. * [r2837] [trunk] refactoring of rsiz, profiles, and extensions management 2014-04-03 Antonin Descampe * [r2835] [trunk] updated copyright and added copyright notice required by ISO, in each file; updated AUTHORS, NEWS 2014-04-02 Antonin Descampe * [r2832] [trunk] removed debug message in CMakeLists.txt * [r2831] [trunk] fixed a bug triggering SEGFAULT on debug mode (uninitialized structure) 2014-03-27 Mathieu Malaterre * [r2815] [trunk] Properly copy/paste code from the autotools gcc correctly fails compiling this code, I needed to move the code outside the main function to get the error. This actually match the autotools (incorrect) code. We'll see how they fix this code in future release. This make the code compatible with previous openjpeg version and remove C99 requirement. Fixes issue 316 2014-03-26 Mathieu Malaterre * [r2808] [trunk] Make sure to use long long (this is not C89). However this should be ok on most compilers nowadays Update issue 316 2014-03-26 Antonin Descampe * [r2806] [trunk] fixed warnings triggered on linux related to r2802 2014-03-26 Mathieu Malaterre * [r2804] [trunk] Run test suite on issue 316 dataset Update issue 316 2014-03-26 Antonin Descampe * [r2802] [trunk] add ability in opj_compress to input subsampled images through '-F' (aka raw option). Let the user input raw images with 444, 422, 420 (etc) subsampling. To be used in conjunction with '-mct 0' option to compress subsampled YCC images. 2014-03-26 Mathieu Malaterre * [r2801] [trunk] Add small utilities to extract JP2 files from PDF 2014-03-25 Mathieu Malaterre * [r2799] [trunk] Make sure to test value not pointer Update issue 302 2014-03-25 Antonin Descampe * [r2798] [trunk] fixed bug related to r2791 2014-03-25 Mathieu Malaterre * [r2796] [trunk] Add sentinel in case list empty. I was getting a cmake error `list sub-command REMOVE_ITEM requires list to be present` * [r2795] [trunk] Import change from 2.0 branch 2014-03-25 Antonin Descampe * [r2792] [trunk] fixed warning due induced by r2791 * [r2791] [trunk] add "-mct {0,1,2}" option to opj_compress to allow MCT to be disabled if needed. 2014-03-25 Mathieu Malaterre * [r2789] [trunk] Make sure to not use alpha pointer if it is not an RGBA input Fixes issue 310 * [r2786] [trunk] Rework previous commit r2610 This way we are able to gently deprecate the old API, and preserve ABI Update issue 306 * [r2785] [trunk] Add documentation 2014-03-24 Mathieu Malaterre * [r2773] [trunk] Make sure to exit early instead of looping on every single pixels * [r2772] [trunk] Fix typo in comment (this is not j2k_dump) 2014-03-18 Mathieu Malaterre * [r2767] [trunk] Revert r2764. It breaks ~230 tests as seen on continuous. Since no dataset is available, the issue 296 will be left open. Update issue 296 * [r2766] [trunk] User can now control source/target java version Fixes issue 303 * [r2764] [trunk] Import git commit fc884aee2b69c78500e65c3d05bf216791a9ea4a from ghostscript team Fixes issue 296 * [r2763] [trunk] Import git commit 99a6f1af177c15f4db475186b79d169c993494ef from ghostscript team Update issue 296 * [r2761] [trunk] Update big endian handling no such thing as WORDS_BIGENDIAN (prefer OPJ_BIG_ENDIAN) Update issue 302 * [r2756] [trunk] Now that dataset from issue 297 have been imported, run test suite. None of the dataset triggered any buffer overflow. Recent changes in trunk handle all those cases. Update issue 297 2014-03-17 Mathieu Malaterre * [r2754] [trunk] Explicitely reject file4/file6 scenario Update issue 286 * [r2751] [trunk] Update BSD-4 copyright into a BSD-3 copyright Fixes issue 300 2014-03-14 Mathieu Malaterre * [r2748] [trunk] Since r2747 we are now able to track which files are missing from the test_suite. Add them. * [r2747] [trunk] add mecanism to track of addition of new regression files in svn/data. It will report when a J2K files is added but no test is found in the test_suite file * [r2746] [trunk] Remove duplicate content from test_inline.c Thanks to Matthieu Darbois for report (and patch) Fixes issue 285 * [r2745] [trunk] rework code from r2463. Really there has been some code duplication from r2413 Thanks to John Rogers (oracle.com) for report * [r2744] [trunk] rework code from r2463. Really there has been some code duplication from r2413 Thanks to John Rogers (oracle.com) for report * [r2743] [trunk] Now that issue 165 dataset is in non regression repository, activate code to reject them Fixes issue 165 * [r2741] [trunk] Fix issue with & vs && Fixes issue 277 * [r2740] [trunk] Add internal implementation to dump all tiles/comp info Eg: opj_dump -f 8 -i input.j2k Update issue 3 * [r2739] [trunk] Prevent a leak when reading PPT markers Update issue 295 * [r2735] [trunk] Move INLINE definition within openjpeg.h header since application may use it * [r2733] [trunk] Apply final missing patch from sumatrapdf team: http://bugs.ghostscript.com/show_bug.cgi?id=694893 Update issue 231 * [r2732] [trunk] Rework r2731 since it breaks non-regression testing * [r2731] [trunk] Be more verbose about failure. Update issue 294 * [r2730] [trunk] Add a temporary work around for issue 293 As described in the bug report the default allocation mecanism for codeblock data is too small for those dataset (16bits). We would need a finer (more granular) mecanism to reallocated only on demand. For now this help the two failing tests to pass. Fixes issue 293 * [r2726] [trunk] Mark OpenJPEG to be ABI incompatible with previous one, move to SONAME 7 Also declare this is 2.1.0 (or very close) * [r2722] [trunk] Remove warnings about unused values introduced in r2710 Thanks to Matthieu Darbois for patch Fixes issue 290 2014-03-13 Mathieu Malaterre * [r2720] [trunk] Add some sanity checks when reading Ippm(i) segments Update issue 288 * [r2719] [trunk] Make sure to reallocate ppm data buffer when multiple Ippm(i) buffer are found This handle the case where remaining data is exactly Nppm(i) Fixes issue 287 * [r2715] [trunk] Add documentation to the checkmd5refs cmake module (used for regression testing) * [r2714] [trunk] Always report when decompression failed as return code value * [r2713] [trunk] Fix test NR-DEC-issue171.jp2-71-decode-md5 after recent code change * [r2712] [trunk] Add a double check for user input * [r2711] [trunk] Fix compilation on VS2010 (snprintf is not C89). C++11 should avoid this in the future * [r2710] [trunk] Just in case this would be helpful for other, here is the code used to track issue 80 Update issue 80 * [r2709] [trunk] Tweak documentation in t2.c. Be more verbose in case of failure. * [r2708] [trunk] Add some documention in the pi code * [r2707] [trunk] Add debug code to extract decompressed image right before PCLR handling Update issue 235 * [r2705] [trunk] Add a small helper to spli ppm into 3 pgm files Update issue 235 2014-03-12 Mathieu Malaterre * [r2703] [trunk] Make sure to use 8bits buffer when applying the ICC profile. Fixes issue 281 * [r2701] [trunk] Add debug info to be able to test integration with littlecms * [r2695] [trunk] TIFF files in test suite can have 1 or 3 components * [r2694] [trunk] Simplify code when reading in TIFF images * [r2692] [trunk] Make sure when reading POC that number of layers (layer end) is within acceptable bound. Fixes issue 80 2014-03-11 Mathieu Malaterre * [r2691] [trunk] Re-active old warning about missing SOP marker * [r2690] [trunk] Add debug info to track issue 80 Update issue 80 * [r2688] [trunk] Rework assertion to work on 32bits system * [r2687] [trunk] Fix remainings warnings on linux/32bits arch * [r2686] [trunk] Rework fseek ifdefs blockers, it breaks the 64bits behavior for fseeko * [r2685] [trunk] Fix compilation errors when JPWL and/or MJ2 are build 2014-03-10 Mathieu Malaterre * [r2683] [trunk] Another final round of fixes for sign conversion warnings. Fixes issue 256 * [r2682] [trunk] Another round of fixes for sign conversion warnings. Update issue 256 * [r2681] [trunk] Another round of fixes for sign conversion warnings. Update issue 256 * [r2680] [trunk] Another round of fixes for sign conversion warnings. Update issue 256 * [r2679] [trunk] Remove old warnings about deprecated API * [r2677] [trunk] Remove a set of warning about sign conversion Update issue 266 * [r2676] [trunk] Remove warning about sign conversion in color.c Update issue 256 * [r2672] [trunk] Run richter test suite, correct a regression introduced in r2668 * [r2670] [trunk] Tweak JP2 conformance test suite add documentation * [r2668] [trunk] Properly handle number of components to run kakadu test suite. Update issue 266 * [r2664] [trunk] Fix simple sign conversion warnings only visible on 32bits arch * [r2663] [trunk] Handle multi components files with PGM outputs * [r2661] [trunk] Properly handle PGM file generation when fullpath is specified in the cmd line This will break a very old behavior (since 2005), but avoid writing in un-expected places for users This also make the behavior similar with PGX file generation * [r2660] [trunk] Fix inversion in code convention * [r2659] [trunk] Fix typo in the code * [r2658] [trunk] rework actual code to handle DOS/UNIX end of lines in a transparent manner. This will help cross compilation cases * [r2657] [trunk] First pass to cleanup compare_dump_files * [r2656] [trunk] Fix compilation when TIFF lib is neither found nor compiled * [r2655] [trunk] Make sure to always initialize variable * [r2654] [trunk] Fix warnings about shadow variables * [r2653] [trunk] remove a warning when using strict prototype * [r2652] [trunk] Remove 2 warnings about set but not used variables 2014-03-07 Mathieu Malaterre * [r2651] [trunk] Upon failure, need to return proper return code * [r2650] [trunk] Add new test suite that run on kakadu conformance images * [r2644] [trunk] Cleanup commit. Rename compare family since comparePGX now support TIFF. Rename compareRAWimage for clarity since it merely compare files (not images). * [r2643] [trunk] Use C-style comments * [r2642] [trunk] Rework the code to simplify cleanup code * [r2638] [trunk] Also override the default error handler for TIFF files * [r2636] [trunk] Another round of fixes for sign conversion warnings. Update issue 256 * [r2635] [trunk] Another round of fixes for sign conversion warnings. Update issue 256 * [r2634] [trunk] Rework r2597, make sure test suite is passing now. Update issue 256 * [r2633] [trunk] Another round of fixes for sign conversion warnings. Update issue 256 * [r2632] [trunk] Another round of fixes for sign conversion warnings. Update issue 256 * [r2631] [trunk] Another round of fixes for sign conversion warnings. Update issue 256 * [r2630] [trunk] Another round of fixes for sign conversion warnings. Update issue 256 * [r2629] [trunk] Another round of fixes for sign conversion warnings. Update issue 256 * [r2628] [trunk] Redo r2623, and remove guilty section Update issue 256 * [r2627] [trunk] Revert r2623 for now * [r2626] [trunk] Another round of fixes for sign conversion warnings. Update issue 256 * [r2625] [trunk] Another round of fixes for sign conversion warnings. Update issue 256 * [r2624] [trunk] Another round of fixes for sign conversion warnings. Update issue 256 * [r2623] [trunk] Another round of fixes for sign conversion warnings. Update issue 256 * [r2622] [trunk] Another round of fixes for sign conversion warnings. Update issue 256 * [r2621] [trunk] Another round of fixes for sign conversion warnings. Update issue 256 * [r2620] [trunk] Another round of fixes for sign conversion warnings. Update issue 256 * [r2619] [trunk] As reported by clang analyzer thoses values were never read * [r2618] [trunk] Remove mem leak and warning reported by clang * [r2617] [trunk] Remove simple warnings about format * [r2616] [trunk] Remove simple warning about functions not used * [r2615] [trunk] Another round of fixes for sign conversion warnings. Update issue 256 * [r2614] [trunk] Another round of fixes for sign conversion warnings. Update issue 256 * [r2613] [trunk] Fix simple warning about sign conversion Update issue 256 * [r2612] [trunk] Another of fixes for warning about sign conversion Update issue 256 * [r2611] [trunk] Fix warning about sign conversion Update issue 256 * [r2610] [trunk] un-deprecated opj_stream_destroy API, import patch manually In some case user still want to be able to call opj_stream_destroy. Fixes issue 227 * [r2609] [trunk] Update memory management mecanism Fixes issue 253 * [r2608] [trunk] Remove self-assignement. Fixes issue 273 * [r2605] [trunk] Fix compilation in visual studio, inline cannot be used directly. Fixes issue 272 * [r2604] [trunk] Remove warning about implicitly defined function * [r2601] [trunk] Remove TIFF warning handler. This help test suite run smoothly on windows by removing the message box. Fixes issue 276 * [r2600] [trunk] Fix mem leaks reported by cppcheck * [r2599] [trunk] Simplify code and remove bogus out of bound check 2014-03-06 Mathieu Malaterre * [r2598] [trunk] Revert r2597 for now, since it breaks a lot of tests * [r2597] [trunk] Remove warning about sign conversion. Update issue 256 * [r2595] [trunk] Remove some easy warnings * [r2594] [trunk] Remove warning about sign conversion. Update issue 256 * [r2593] [trunk] Remove warning about sign conversion. Update issue 256 * [r2592] [trunk] Remove warning about sign conversion. Update issue 256 * [r2591] [trunk] Remove warning about sign conversion. Update issue 256 * [r2590] [trunk] Remove warning about sign conversion. Update issue 256 * [r2589] [trunk] Remove some easy warnings about sign compare reported by gcc * [r2588] [trunk] Remove out of bound access in code and simplify code. this is a test tool, security is not an issue here. * [r2587] [trunk] Remove simple warning about unused variables * [r2586] [trunk] Make sure that all output files from the test suite are using a different output name Fixes issue 271 2014-03-05 Mathieu Malaterre * [r2577] [trunk] Handle cmap where direct use is specified (issue235_cmapsubbox.jp2) I doubt the old code ever work. The new code copy the old codestream bytes into the new components (instead of copying the pointer). Technically the issue235.jp2 file should be handled since I.5.3.5 specifies that: ... If the JP2 Header box does not contain a Component Mapping box, the components shall be mapped directly to channels, such that component i is mapped to channel i. ... Update issue 235 2014-03-04 Mathieu Malaterre * [r2572] [trunk] Make sure to reject images such as 1336.pdf.asan.47.376.jp2 Fixes issue 267 * [r2571] [trunk] remove more conversion warning in multi-lines macro. C allow simple tricks such as to find those: gcc -E tcd.c | sed '/^\#/d' | indent -st -i2 > clean.c Update issue 256 * [r2570] [trunk] Remove some conversion warnings reported by gcc Update issue 256 * [r2569] [trunk] Remove another warning. ftell returns long int Update issue 256 * [r2568] [trunk] Remove more conversion warnings. Update issue 256 * [r2567] [trunk] Remove warning about conversion. Update issue 256 * [r2566] [trunk] Add a TIFF compare function (PEAK/MSE) Fixes issue 100 * [r2565] [trunk] Revert portion of r2562, need to investigate issue. Update issue 269 2014-03-03 Mathieu Malaterre * [r2562] [trunk] Remove remaining conversion issues in mqc.c * [r2561] [trunk] Remove remainings conversion issues in t2.c + clock.c * [r2560] [trunk] Remove a simple warning about int -> float conversion * [r2559] [trunk] rework code to avoid a warning. this also remove a division and prefer bit-shift * [r2558] [trunk] Remove some more warnings about conversion * [r2557] [trunk] Prefer compile time constant to avoid conversion double -> int * [r2556] [trunk] Review warning about types conversion, and add cast when needed * [r2553] [trunk] Remove some simple warnings about conversion * [r2552] [trunk] fgets takes an int as parameter * [r2551] [trunk] Remove warning about cast double -> int. Instead use bit-shifting (compile time computation) * [r2550] [trunk] Remove easy to fix warnings about conversion * [r2549] [trunk] Import left over from patch submitted as issue 225 (comment #14) Update issue 225 * [r2548] [trunk] remove some simple warnings about unused params * [r2547] [trunk] remove all api with invalid FILE* parameters which could leads to issues when applications are compiled with different flags from openjpeg. Fixes issue 198 * [r2546] [trunk] Explicitely trigger issue 229, there may be an impact in code execution. The assert may get removed afterward Update issue 229 * [r2545] [trunk] Remove simple warnings * [r2544] [trunk] Remove 3635.pdf.asan.77.2930.jp2 from opj_dump tests Update issue 250 * [r2539] [trunk] Avoid conflicting declarion for fseek in openjp2 vs fseek in openjpip * [r2538] [trunk] Fix md5 values for decode-md5 tests. Update issue 250 * [r2537] [trunk] Remove deprecated functions. Update issue 268 * [r2536] [trunk] Remove warning about unused function Update issue 268 * [r2535] [trunk] Remove deprecated functions (not called anywhere in the code base). Update issue 268 * [r2533] [trunk] Remove unused variables from test 2014-03-02 Mathieu Malaterre * [r2532] [trunk] Remove some simple warnings about var being set but not used * [r2531] [trunk] Remove warning about -2147483648 (aka INT_MIN), causing this decimal constant is unsigned only in ISO C90 * [r2530] [trunk] Remove simple warnings about comments, missing case in switch statement 2014-03-01 Mathieu Malaterre * [r2529] [trunk] Fix compilation on MSVC compiler 2014-02-28 Mathieu Malaterre * [r2528] [trunk] Partially rework r2506, original patch from issue 171 was totally bogus (untested?) and did break most of the test (eg. p1_04 family) convert.c duplicate a lot of code, this patch only adresses the PGX codec section of the code. Update issue 171 Update issue 264 * [r2527] [trunk] Make sure to run *-decode-md5 only after *-decode tests. Update md5 since recent code change. * [r2526] [trunk] Remove easy uint32 <-> int32 conversions * [r2525] [trunk] Re-import chunk from r2458 that made textGBR.jp2 to fail otherwise Update issue 225 * [r2524] [trunk] Rework r2458, instead we should reject 451.pdf.SIGSEGV.ce9.3723 since tile-parts are out of order (as per kakadu behavior). Update issue 225 * [r2523] [trunk] Mark a file as being invalid for opj_dump * [r2522] [trunk] Fix JPIP test with updated md5sum * [r2521] [trunk] Really apply r2460 this time, but fix the original typo in the submitted patch Update issue 225 * [r2520] [trunk] final round of minor cleanups * [r2519] [trunk] Remove PNG generation code for now * [r2518] [trunk] Prefer strcpy since it copies trailing 0 directly * [r2517] [trunk] Simplify code to centralize code cleanup * [r2516] [trunk] Some code cleanup add sentinels * [r2515] [trunk] Remove a simple warning, and use static to detect unused functions. Simplify function declarations. * [r2513] [trunk] run test suite on dataset from issue 171 Fixes issue 171 * [r2511] [trunk] Remove some simple warnings in opj_dump * [r2510] [trunk] Merge final patch from issue 171 with code simplification. also handles signed case properly. Fixes issue 171 * [r2508] [trunk] Fix find_path behavior within cross-compilation execution 2014-02-27 Mathieu Malaterre * [r2507] [trunk] Import patch from issue 218. No dataset to check, so blindly applied it. Fixes issue 218 * [r2506] [trunk] Import patch from issue 171. Only the imagetoraw part was not applied. Update issue 171 * [r2505] [trunk] Try to run test suite on invalid dataset from sumatrapdf team Update issue 225 * [r2503] [trunk] run test suite to illustrate patch from r2458 * [r2501] [trunk] Make sure that opj_decompress only output a single component Update issue 110 * [r2496] [trunk] add issue 46 to the test suite Fixes issue 46 * [r2495] [trunk] improve command line parser syntax checking * [r2493] [trunk] add a sentinel in debug code * [r2492] [trunk] simplify code using for loop 2014-02-26 Mathieu Malaterre * [r2491] [trunk] Import test case from issue 208. This appears to be fixed now. Fixes issue 208 * [r2489] [trunk] Run test suite on dataset from issue 211. Test is now passing nicely. Fixes issue 211 * [r2487] [trunk] run test suite on dataset from issue 135. Add fake md5sum to make sure tests is failing. Update issue 135 * [r2485] [trunk] Update missing md5sums * [r2484] [trunk] kakadu does not support 451.pdf.SIGSEGV.ce9.372 we should not pretend to be able to decompress it Update issue 225 * [r2483] [trunk] Run test suite on issue 141. Add a fake dataset to report that test is failing. Update issue 141 * [r2481] [trunk] Add more details in case test fails * [r2480] [trunk] run test suite on input dataset from issue 134 Fixes issue 134 * [r2478] [trunk] fixes test NR-DEC-file409752.jp2-40-decode, use proper naming convention (need to keep file extension) * [r2477] [trunk] add test suite for issue 142 Fixes issue 142 * [r2476] [trunk] When no output PGX file is found, report an error * [r2474] [trunk] Add missing include dir for wx app * [r2473] [trunk] Remove some simple warnings about cast, and unused functions * [r2471] [trunk] Remove a simple warning about a cast * [r2470] [trunk] revert r2460 since it breaks ETS-C1P0-p0_03.j2k-decode. Update issue 225 * [r2469] [trunk] Revert r2453 since it breaks conformance test ETS-C1P1-p1_06.j2k-decode * [r2468] [trunk] Import patch from sumatrapdf team. This handle testcase 1336.pdf.asan.47.376 Update issue 225 * [r2467] [trunk] Import patch from sumatrapdf team. This handle testcase 1888.pdf.asan.35.988 Update issue 225 * [r2466] [trunk] Import patch from sumatrapdf team. This handle testcase 1851.pdf.SIGSEGV.ce9.948 Update issue 225 * [r2465] [trunk] Import patch from sumatrapdf team. Start using new color space when found. Update issue 225 * [r2464] [trunk] Import patch from sumatrapdf team. This handle some Part-2 compliant file, by being more tolerant in COLR box. No testcase for now. Fixes issue 247 * [r2463] [trunk] Import patch from sumatrapdf team. This handle some testcase with no input dataset, but changes looks ok. Update issue 225 * [r2462] [trunk] Import patch from sumatrapdf team. This handle testcase 2977.pdf.asan.67.2198 Update issue 225 * [r2461] [trunk] Import (ugly) patch from sumatrapdf team. This feels like a hack rather than a solution. Fixes issue 226 * [r2460] [trunk] Import patch from sumatrapdf team. This handle testcase 3635.pdf.asan.77.2930 Update issue 225 * [r2459] [trunk] Import patch from sumatrapdf team. Original commit is 5b0c9985e3359aca9b3fcfd94424166aa61a141a. Update issue 225 * [r2458] [trunk] Import patch from sumatrapdf team. This handle testcase 451.pdf.SIGSEGV.ce9.3723 Update issue 225 * [r2457] [trunk] Import patch from sumatrapdf team. This handle testcase 2.pdf.SIGFPE.706.1112 Update issue 225 * [r2456] [trunk] Import patch from sumatrapdf team. This handle testcase 1610.pdf.SIGSEGV.59c.681 Update issue 225 * [r2455] [trunk] Import patch from sumatrapdf team. This handle testcase 2539.pdf.SIGFPE.706.1712 Update issue 225 * [r2454] [trunk] Import patch from sumatrapdf team. This handle testcase 4035.pdf.SIGSEGV.d8b.3375 Update issue 225 * [r2453] [trunk] Import patch from sumatrapdf team. Add detection for testcase 1802.pdf.SIGSEGV.36e.894 Update issue 225 * [r2452] [trunk] Import patch from sumatrapdf team. Add a new function to check color box. Update issue 225 * [r2451] [trunk] Import patch from sumatrapdf team. This patch adds new colorspace handling. Update issue 225 * [r2450] [trunk] Import patch from sumatrapdf team. This adds alpha handling. This patch changes ABI. Update issue 225 * [r2449] [trunk] Update file extension function to handle cases where filename containes multiples dots. Update issue 250 * [r2447] [trunk] Clearly indicate that mem-b2ace68c-1381.jp2 should not be decompressed. Update issue 250 * [r2446] [trunk] Fix TestJPIP1 on case sensitive system * [r2445] [trunk] regex would not be used to remove java deprecation warning from dashboard * [r2444] [trunk] Remove simple warnings about unused functions * [r2443] [trunk] Properly store and use value returned by fread. Also invert nmemb and size in fread call. Fixes issue 262 * [r2442] [trunk] Fix invalid write access in JPIP code. Fixes issue 261 2014-02-25 Mathieu Malaterre * [r2436] [trunk] Run decoder on input dataset from issue 254. Add fake md5sum to make sure the test is failing. Update issue 254 * [r2433] [trunk] deprecationg warning issued by java compiler should be ignored * [r2432] [trunk] Create a new static *_impl function to avoid a warning triggered by the deprecation mecanism Fixes issue 257 * [r2430] [trunk] New decoded files are passing. Adding reference files. Update issue 225 * [r2428] [trunk] For now assume any provided stream should not get decompressed. Update issue 225 * [r2427] [trunk] Run decoder on issue 229 test cases Update issue 229 * [r2419] [trunk] Revert r2415 for now since it introduce large regression * [r2418] [trunk] Import commit 87b08a096bb8ad61f9dbe4811e208d9c9d7fe63b from ghostpdl don't define lrintf for MSVC 2013 (fix compilation breakage) Update issue 225 * [r2417] [trunk] Import commit 4cee6ceab21025079f439bb152fb9d8ae8c5c832 from ghostpdl Bug 694906: fix potential heap overflow in opj_t2_read_packet_header Update issue 225 * [r2416] [trunk] import commit 83dad6a76536222a3a51146f942e733a2e90ec52 from ghostpdl fix potential NULL-pointer dereference caused by testing the wrong variable after opj_realloc (happens only in OOM situations) Update issue 225 * [r2415] [trunk] Import commit fc884aee2b69c78500e65c3d05bf216791a9ea4a from ghostpdl prevent heap overflow in opj_t2_read_packet_header Also prevent a double-free of segment data under OOM conditions. Problem found in a test file, 1802.pdf.SIGSEGV.36e.894 supplied by Mateusz "j00ru" Jurczyk and Gynvael Coldwind of the Google Security Team using Address Sanitizer. Many thanks! Update issue 225 * [r2414] [trunk] Import commit 8ec8321df613986e8642e2975f7182072eb4be62 from ghostpdl make opj_stream_set_user_data accept a NULL stream for consistency with opj_stream_set_* which does so. Update issue 225 * [r2413] [trunk] Import commit f4139d702559649e577a5df9cfd64b0ca6107a7a from ghostpdl Several functions accept a buffer size but never actually check whether the buffer overflows during reading/writing. This fixes all cases where a size variable has explicitly been marked as unused (through a (void) cast). This was discovered while investigating an assertion caused by 7cc691f332f26802c64cdc47e17bff8b_signal_sigabrt_7ffff6d59425_2247_2509.pdf among others. Thanks to Mateusz Jurczyk and Gynvael Coldwind of the Google Security Team for providing the example files. * [r2411] [trunk] Clarify raw input in openjpeg. LSB vs MSB are now documented. Fixes issue 62 * [r2410] [trunk] Run test case for issue 228. Output has been validated. Fixes issue 228 * [r2407] [trunk] Run sumatrapdf test cases 2014-02-24 Mathieu Malaterre * [r2404] [trunk] add missing private lib. Update issue 223 * [r2402] [trunk] Make sure to always output pgx file. Handle case where multiple pgx files are generated. Fixes all tests. * [r2401] [trunk] add test demonstrating a regression in 1.5.0 and up. Update issue 205 * [r2399] [trunk] improve test suite by checking against a reference md5 * [r2398] [trunk] Fix a simple mem leak * [r2397] [trunk] Fix two simple warnings about sign mismatch * [r2395] [trunk] Fix warning about signed/unsigned mismatch * [r2394] [trunk] Make sure to handle ret value, and properly initialize output file * [r2393] [trunk] Make sure to handle ret value in test * [r2392] [trunk] Prefer the new style cmake: add_test command Fixes issues 258 * [r2388] [trunk] Fix a warning about type conversion. Use a trick where unsigned wrapping is legal 2014-02-12 Antonin Descampe * [r2375] [trunk] replaced fprintf with event_mgr in cinema-related stuff in j2k.c * [r2374] [trunk] moved logic related to cinema profiles in library (was in opj_compress.c). This enables one using the library with its own executable to easily ask for cinema profiles. * [r2373] [trunk] added a warning when tif conversion changes input image bitdepth * [r2372] [trunk]re-indenting convert.c 2014-02-07 Mathieu Malaterre * [r2371] Update kakadu cmake module 2014-01-23 Antonin Descampe * [r2369] [trunk] added some tests for Cinema2k 48fps and Cinema 4k 24 fps. Fixed a bug in comparePGXimages.c leading to huge Test.xml file uploaded to DashBoard * [r2367] [trunk] fixed another DCI compliance bug 2014-01-22 Antonin Descampe * [r2366] [trunk] uncomment tests mistakenly commented in previous commit * [r2365] [trunk] fixed several bugs in cinema mode (2K 24/48 fps, and 4K). Trunk now produces compliant DCI code-streams. 2014-01-16 Antonin Descampe * [r2364] [trunk] fixed indentation in opj_compress.c, renamed 2 internal functions, added some comments 2014-01-16 Antonin Descampe * [r2363] [trunk] fixed DCI-compliant codestream generation (-cinema2K and - 2013-10-30 Antonin Descampe * [r2352] trunk: fixed cmake config so as to be able to link opj_jpip_server with FCGI. * [r2351] trunk: fixed cmake config so as to be able to link opj_jpip_server with FCGI. 2013-10-28 Antonin Descampe * [r2350] trunk: disabling class-0 conformance tests for now (bad implentation of tests) 2013-10-15 Rex Dieter * [r2348] complete openjpeg2 pkgconfig support, bug #68 2013-09-26 Mathieu Malaterre * [r2347] [trunk] Import patch from bug #241 2013-07-11 Antonin Descampe * [r2344] test: modified class-0 conformance testing to comply with constraints 2013-03-25 Mickaël Savinaud * [r2322] [trunk] use the private version of opj_config to avoid compilation error into mj2 * [r2321] [trunk] use opj_config_private.h into the opj_inttypes.h * [r2320] [trunk] separate the opj_config file between public and private part to avoid expose unused variables into the public API. * [r2319] [trunk] update test suite because now illegalcolortransform.j2k could be decoded 2013-03-24 Mickaël Savinaud * [r2318] [trunk] enhance the support of sYCC into opj_decompress application (thanks winfried). * [r2317] [trunk] managed nicely the case where TPSot value is incorrect (thanks winfried). Update the test suite to check this case. Updates issue 202. Updates issue 206. Update issue 208 2013-03-17 Mickaël Savinaud * [r2315] [trunk] add access to opj_apps_config.h to old applications * [r2314] [trunk] manage correctly the case where meth value is not correct (thanks winfried) * [r2313] [trunk] correct issue 188 (thanks winfried) and add test about it. Fixes issue 188 * [r2308] [trunk] use OPJ_ prefix on HAVE variable also for tests * [r2307] [trunk]remove wrong code in mj2 library detected by winfried (thanks to you) * [r2306] [trunk] use everywhere the new opj_ prefix for HAVE variables and use the opj_apps_config file (thanks to winfried) 2013-03-13 Mickaël Savinaud * [r2304] [trunk] use the home made macro to ensure the existence of some include file * [r2303] [trunk] use the opj_ prefix for the HAVE_FSEEKO variable * [r2302] [trunk] correct missing variable in openjpeg config file 2013-03-03 Mickaël Savinaud * [r2301] [trunk] remove some unused variable from opj_config and rename other one with opj_ prefix * [r2300] [trunk] split into two config files config options related to the lib and to the application. 2013-02-18 Mickaël Savinaud * [r2298] [trunk] add the prefix opj_ to deprecated everywhere 2013-02-17 Mickaël Savinaud * [r2297] [trunk] update documentation of new functions _v3 and mark deprecated related functions * [r2296] [trunk] move to the new API for function opj_stream_create_default_file_stream. Use now opj_stream_create_default_file_stream_v3 (WIP) 2013-02-16 Mickaël Savinaud * [r2295] [trunk] move to the new API for function opj_stream_destroy. Use now opj_stream_destroy_v3 (WIP) * [r2294] [trunk] rename deprecated macro with opj_ prefix and use it for opj_stream_destroy function * [r2293] [trunk] add functions to avoid to use FILE* into the API (thanks winfried). Update issue 120 and update issue 198 2013-02-04 Mickaël Savinaud * [r2292] [trunk] add a test related to issue 202 2013-02-03 Mickaël Savinaud * [r2290] [trunk] update convert about png writing with additional metadata (thanks winfried) * [r2287] [trunk] update test suite for issue 5 and 62 * [r2285] [trunk] backout one part of the rev 2266 2013-01-03 Mathieu Malaterre * [r2272] [trunk] JP3D: Fix issue with Z handling in packet iterator * [r2271] [trunk] JP3D: Handles errors properly * [r2270] [trunk] JP3D: remove old debug 2013-01-02 Mathieu Malaterre * [r2269] [trunk] JP3D: convert from DOS to UNIX eol * [r2268] [trunk] JP3D: remove exe bit from source files 2012-12-18 Mickaël Savinaud * [r2266] [trunk] merge from branch 1.5 a correction about large code-block data (decoding part) and add tests about issue 5 and issue 62 2012-12-11 Mathieu Malaterre * [r2263] [trunk] remove left over from v2 transition * [r2262] [trunk] JP3D: completely redo the opj_tgt_create function. Take as input the initial opj_tgt_create as found in openjpeg 1.5, and extend with the 3rd dimension. 2012-12-07 Rex Dieter * [r2259] Doxyfile: HTML_TIMESTAMP = NO helps when comparing the output of multiple runs, and distros will appreciate avoiding multilib conflicts. 2012-12-04 Mickaël Savinaud * [r2255] [trunk] correct the new name of OPJ_HAVE_STDINT_H everywhere * [r2254] [trunk] remove SSIZE which is unused in openjpeg and rename HAVE_STDINT_H to OPJ_HAVE_STDINT_H * [r2253] [trunk] add openjpeg.h in some files of openjpip to use some opj type (thanks winfried) 2012-12-03 Mickaël Savinaud * [r2252] [trunk] move typedef from opj_stdint.h to openjpeg.h and add an include of stdio.h in openjpeg.h. Fixes issue 197 * [r2251] [trunk] correct the encoding of colr box information (thanks Winfried) * [r2250] [trunk]add the pkgconfig support for openjp2 (thanks Winfried) 2012-11-28 Mathieu Malaterre * [r2249] [trunk] JP3D codec was trying to pull information from the registration parameter in COM. This is non-standard. * [r2248] [trunk] As per T.809 code block are not shifted in JP3D Table A.7 3D code-block width, height and depth exponent values xcb = value, ycb = value or zcb = value. NOTE – This redefines Rec. ITU-T T.800 | ISO/IEC 15444-1 significantly! The 3D code-block width, height and depth are limited to powers of two with the minimum size being 20 and the maximum being 210. Further, the 3D code-block size is restricted so that 4 ≤ xcb+ycb+zcb ≤ 18. * [r2247] [trunk] JP3D: this is safe to write comment using Registration: ISO-8859-15 * [r2246] [trunk] JP3D fix issue with Registration value in COM marker. Move COM marker just before COD. * [r2245] [trunk] jp3d: fix command line parsing for subsampling * [r2244] [trunk] Fix issue with ITU-T T.809 (05/2011) - ZSI is now known as NSI (FF54) - NSI now stores Ndim (=3) - CAP extended marker was not set properly * [r2243] [trunk] Fix compilation issue where size_t would be undefined 2012-11-27 Mickaël Savinaud * [r2242] [test] update the list of files which will be gracefully rejected when they are dump * [r2241] [trunk] add empty test about the issue 197. Updates issue 197 2012-11-26 Mickaël Savinaud * [r2240] [trun[trunk] check if the dx and dy steps are not incorrect according to the JPEG2000 norm (thanks Even). Test associated to this issue should nicely fail. Fixes issue 194 * [r2239] [trunk] check if the number of tiles is not incorrect regarding the JPEG2000 norm (thanks Even). Test associated to this issue should nicely fail. Fixes issue 163 * [r2238] [trunk] test about issue 192 should nicely fail * [r2237] [trunk] check the index of the component in read_qcc (thanks Even). fixes issue 192 * [r2235] [trunk] update test suite with issue 191 to 194 and update patch for 191 which should fail properly openjpeg-2.1.0/CTestConfig.cmake000644 001750 001750 00000000352 12327650571 017635 0ustar00mathieumathieu000000 000000 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) openjpeg-2.1.0/doc/openjpip.dox.in000644 001750 001750 00000013471 12327650564 020205 0ustar00mathieumathieu000000 000000 /* * $Id: openjpip.dox.in 2835 2014-04-03 15:30:57Z antonin $ * * 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 implimented 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 */ openjpeg-2.1.0/doc/mainpage.dox.in000644 001750 001750 00000005355 12327650564 020144 0ustar00mathieumathieu000000 000000 /* * $Id: mainpage.dox.in 2835 2014-04-03 15:30:57Z antonin $ * * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2011, Mickael Savinaud, Communications & Systemes * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ /*! \mainpage OpenJPEG v@OPENJPEG_VERSION@ Documentation * * \section intro Introduction * This manual documents the low-level OpenJPEG C API.\n * The OpenJPEG library is an open-source JPEG 2000 library developed in order to promote the use of JPEG 2000.\n * This documents is focused on the main part of the library which try to implement Part 1 and Part 2 of the JPEG2000 norm.\n * * \section home Home page * * The Home Page of the OpenJPEG library can be found at: * * http://code.google.com/p/openjpeg/ * * More information about the OpenJPEG library is available here: * * http://www.openjpeg.org/ * * The OpenJPEG mailing list is located here: * * http://groups.google.com/group/openjpeg * * All the source code is online and can be retrieved using svn from here: * * http://openjpeg.googlecode.com/svn/ * * \section license License * This software is released under the BSD license, anybody can use or modify the library, even for commercial applications.\n * The only restriction is to retain the copyright in the sources or the binaries documentation.\n * Neither the author, nor the university accept any responsibility for any kind of error or data loss which may occur during usage. * * \author OpenJPEG Team * */ openjpeg-2.1.0/doc/CMakeLists.txt000644 001750 001750 00000004130 12327650564 017770 0ustar00mathieumathieu000000 000000 # 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() openjpeg-2.1.0/doc/man/man3/libopenjp2.3000644 001750 001750 00000025053 12327650564 021000 0ustar00mathieumathieu000000 000000 '\" 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 .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) openjpeg-2.1.0/doc/man/man1/opj_dump.1000644 001750 001750 00000002253 12327650564 020542 0ustar00mathieumathieu000000 000000 '\" 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 1.4.0" "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) openjpeg-2.1.0/doc/man/man1/opj_decompress.1000644 001750 001750 00000005472 12327650564 021747 0ustar00mathieumathieu000000 000000 '\" 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 1.4.0" "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 JPWL OPTIONS Options usable only if the library has been compiled with .B -DUSE_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) openjpeg-2.1.0/doc/man/man1/opj_compress.1000644 001750 001750 00000014157 12327650564 021436 0ustar00mathieumathieu000000 000000 '\" 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 1.4.0" "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<=type>, s<=method>, a=, z=, g=, p<=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) openjpeg-2.1.0/doc/jpip_architect.png000644 001750 001750 00000172161 12327650564 020740 0ustar00mathieumathieu000000 000000 PNG  IHDR - pHYsHHFk> vpAgYvIDATx]wX׾^HhYEZ@^D(+bA uUk+Zwu ғ8?" (3Lfܹs˹q'|RR/PJL&H$ 2 Ljժ>oaJF xLJRdrCW.o~a2#gaB*za?FS( ]U.7?d2YYY5E-F"X,ZVvڵ~EӦMhl6F] 0NTuV---JaZp8ΝCyyyHCV9rUV7ը K.?7p1~jz$Gx?Â݄RP(qqq˖-333:I$[paiqJEPjSHR?~ {1HRC&drYYYiiiBBǏϞ=`0ʆzҥ-[`ֶm=z^iBVu`P(TjYYBhgCW b>_=ju-Ǐw2~J€Nq\\Vud؜fqܤYsK=#B(++kȑwϧPx5QVy`fjD"!H_"HZZZ%%%l6!TVVTRihh8a„?ֱRT*/^xСt\ޮ]=zٳ].kkk+2Ly??^T=z'~{8T*+|0qL4#fd)0 h70r@&I T(Pb^CץV ű68lJIdѣt:?$pg2!]]ݯK+J CϫWt+"رcÆ KIIյV?c2b. P\|yϞ=W\AٳٙD"9T(d2YGG!VU*.\sCTC-6H@@RAJpAqqW x DbdW\իB8I $  eժUfff!!!`"!dϟwij5Pd JRg!ARIfjV֭>ʕ+,P/U==2hkkKӉI&|>BҥK*_^ti ŋ͛71ŋ-ZիL&q|BR(D"ÇYfݻO͚5kfkBB- E8ST~a:[;X&t!ŋI&eff>z(44&&&{z۷ꚚΝ;)))!!!T*PuV333X 罹dC~͛ΝԩӰa@tΝ;Cr "))f?x`Ĉ۷/..޹s'TKuND!F RTT*555?%%KBkaUvP<|WWכ7oFEEرcĈuFqlvFF֨\2~xЮ]ά7n\qqq}OR S(---w:wqFkkk׮͜9S(!JKKɓϟO0AOO/..BhbŊ x_ VA "H$(0H3 '@?( B: Nf*UtkNtoٌ8CK~ˇ6^sFGG#ܖ,Y"/_f׫WիWdٳgwuԩ1116m3gɓ'W^l2pj7oܹsJJwUVEDD̛7OV׏Fݽ{7<<<,,lϞ=K. OMMB8qԴ}gώ466 r… \n׮]CCC.]ڽ{fs $`HCR~͘1.\h]!\Bufa[@M01#>|ءCk׮ر#..k׮2._NϚ5k֭3gܶmÇB  IKKlt&Wr%%l6fD@RT2rbirrbTJVV)Wpq !>CK S(jD"Q(a V#PSTVrPd T* Bpee::%"zUT-Ԅ\Rua„ |>?---((uԨQ,D"ݾ}[$=zݴi <~X,?|d̙3'%%!tYӧ|>))), ð%KzyylZj5eJeXJ*aعs={Çcǎq8__ZZTj+x'OQ(!BCcǎխ{TCG"ؗuoQOfɠU(;v477Gի![[[dzLbiiGKKK gW^mӦ Cm-'ɥBɤ!#GHO`0,,-ۥ[H\NM2BF%L$bنrVp8uuuxS읝5lR`z'~ʘ1ĝ;SOB `ƌ7Si4DZZ'fOs9S^:wL&;|X\mmr Afkxzzd2Y&mٰAckiT* hΜtM7kFT*242GQ(mmm`~ ewVh׸*RI"D"Vi)BD"I$=H$!33˗/ꀀ/_ɓ' x< ˗={655U" 0.ý{x<^.]ϟre__߳gϦXG#GGӟ=~lnn>0(SeeE[ s/={>woԩCF8gσ{D/]Z" O73xp[7eJCDBað2hȈK͛2kL\&Fq۷C Twٷo--޾zAPttu)\.߾ysnvR,6{ܔ)/ٿ_,;qtdX;uJKIsr*2ofr9̸zʅ &͚ ; ?;w7ȁ}|f͛:}ʕ|P?hIb%`G*7nB:J ̌۶ ##*̜k{{#TZRR22$$",ڢm%+W^.Iɓ'fffBʪB\.w…I{1:>aWOWWWWWWb777J"N"޽[2_- J e/&&o߾!MmM~*---\EPB\qF>'O0 X 2l6ڵkQ=qDd:xB\bqV-ZT&+1*a!H4b^ںܑqt2ܲeKTԝVkoos:v9tԨ.]ݹD&jm+[[wT(H$\&{7oիuvmV*vK&^66){j@ ؽm[III^D"Qvry }܍zz\&aej!m RXPs'J [喕b&ɘ24Ӻp">K?|>Ç oРO=LLK$ u蠯ѣGv]:]V_?R'Oϛg١-;tiVϟ<%HyL0lаa~CT < 5Ҙ 6Fg"lbddN&0l8 f{ 7qY33 nbt#Ӭd{XxAfsIq%X\Bk֬o GGǼ)SBp;w<{իA oC yIJJ B2eN˖-6Jp?444_P( n|DwWCG6gNQQLe\ުukjq8RT*dRϧO9ZZ*D"ɤRT>`h}Xlm_~{#P*itT*jphvNN'-++ 9R( ֭m;v30mسgȈrѣBC_/q8b[1 TktҥK.p\e$8X 4q41U*W[2YkjS(=bbx8۷i!ggϟ|2##cڵ W4a˖-|捏ٳg RSS_R}'NիСCcǎ= TJT*Ac"v(G$C_ rHcpx4BO \|a)d2F"j:R"ht:F0NJK%)j5| gΜ.:Р!!Tm!&ON9uFQTmV\]=|V\R2x01&(h)'O2 :AkBL1 2H,KbD, D  *.*Z8{WED:ppJKK mmo^&wDV !L&J9Nii}^| }OTZ/,im-p/.*.MvV?/^8ީk׻n446wv\\ NrTD&IX(׬Y ' 'b4iPyYmrBe` 6m266DNP￉\GSrj_P5(L&/^xҥN";UL˗/_x-[rrrtrÇ 8e YcׄDb2d2Y"qtdkiɤR:.89b6hP JhC㵛7a6p3pZ=7<#ׯ\161A3Y"g"J[8Ŗm۵dJRGGg%&& E\VЩӌy^D"흜2Yv""[242ZbY3OpD&9:b;GG6l6n[Tӧ;;;w˗2 Reggs\---p*P*2:Iؿ2u%(A) @1> ޽{duf^mGRRR|}}Ϝ9d- I &Mٳ7nnٲm}"K\.Jup۷o&q;+nݺXG >}b߿>?|mbFPkii:ulԨQT*BmxS(Qii† ~tАM &,,--u%1J) XaT*5iT巣rrd*RTWbVeM?(  ff$2 }L&sppu떣gWx4j…<ݻR,))122 U8ռ搇r5kvQ Lc0e̙wNKK W"%ǏϞ= sAѣ .Ǐaعs .xzz>ݻPg4x`77>}ܾ}ɓٿݻwoܸS///`p_jթSӧo`>.|?DM׼?oZd2K&Q 5g m\T.W@tۄN\YF"=8Qlʷ*SQCZ6iF̛7Ʀ ??})--ر#D^v 0;;;Ǜ7o^vM6eee۷ *zXN`+ \;,Pꚜ +1,TڥFcbbXJ&E"ѣG  dhhSD ^EǏ'wI\._jՀuaX\\\N<<|кukGGǮ]]eTTlw(Ν;!aPfƎ۩S'Dd2//ҥK!@H #//!$ղE" ŪU~Wлw̙smaB0//&e2 A & c08Ʌ ~#F,\P&dp֭Ϝ9s-X]BP $5k|EL)U(pBHd``жmۨ<}ٳΝۺuׯ VǏC#ܴ P*G|||V^}Ʌ3g !еnBKrʱc2`wРAl6{ذa#GdΜ9VVV-݋JeFFIRRRvM;uqFkkׯO:!lٲb@hѢ* AyyymܸBbΝyfM:tݻNNNcǎ1 ###Ϟ=kjj N=<GO[[!Կ7v-[zj׮] G~~~NNN=zXlYrr2L.о}jۄ&|P">?6y2*r061{&k׮B2 І BpÄpQ8qښZ>ta'm1wJ1bĵk״ j,Jr޷W^u cbfjj|r 2}ӧO&%%r8>onnaÆ &''[ZZxbݿ[LL̉'$_:::]t9|@;v۷wڵk;vfm;;;.{/_ڵرc111[lMT?PTt:1cFDDGB.34e09Rq;y\?sL͖פlqG=z .۷/Pߺ cTPTZZϟ=CAADB.W)C8N*VnBJrw~Q(%btþ "!G A]y`Dyyy1"662tCp# BTaӧO#"",,,.>}r,*ڳgOP˖-Jׯ ׯ_/lmm5RСCGݲe˗/_BN KKKիWuuu-,,BJPZqq-0ղYR1"00… nb2@NPP/KNpW7t$+@D#Wl@^4R9MT~އw3w.3ƪO]*~TΞ* DT Il ʄ J?r9xh6>>>-=z۷oY,Ç-,,֭[RRRҵk#GL>>Py:wBT*۵kE .Xܾ}{[[[gϞ) tr ^ڵ۷7onubb ̌x;v1bPUo*|* Ƨ*_AY Dž%%Ba~^!u#b9򩸨pPpR4oՊa8 :tq,X'0pHg".+k 5A&ȴ?=(D2x}6aI MHM}?!Իwɓ'O:(++k֬YG ={,--}}}/\d2׬Yr!f6 q77C1 cXjz۶m$?,XNӭBYi4D"2dȭ[ VPc yxx̚5k˖-W\2t]’/ggJEL>wW[w>,ZZQT* &(.:bDnݦcٱc]ڶ-**8'80NPǎc}}EMbPe4%g(J*dDC.PO(ԉU&G88%˃||||.x>}Z,x_RlDBCY,D\BPf!"i$zHcGXoQyzm؍z["( @|>7p@}HReevvv""Rteeey%%K~E@{]t!T*a'T(#+_S-u.!蛡H-`>#  iDP 10`;M!VVW t:}͚5} HMMP($IGG}W*zZ͛7?WPP{YYY7oѣYfsٳgnnYQehHI6h A o߾dgJUR\3_?|He.\i4*<_qJ5PPu쯂w`iNb 2,666++g͛7;wn>P^^އ XX,f20BJ0S.Ji4rNß-NU`t7k֬>2V*ƈ_kJh"z5VxI]i&X$gϞ=7mD`j!ͼ] ]kBă ˥Ri@@u댍BJ'66$''x׮]buȑUzjzz (ݻ' E,߿ L^cUfOEϪ.ATիW!~K,BGzkz,?d2ÅW6U"g'/_>bl8y޽˗/\>|ҥKfͬn޼ z+V/22r˖-3g\ti׮]_=ztĈd2A)Hrhǩ4( F~vR""cbb޾}RtҵkWT=XeO>2J/YАpKU0Ν;W\qʪ_~aK7#D\ClPA֤GD'O5Νafff_j5Éiu^m!TRRbeeyӢE2ݻw8 ,Zmgg|>ׯ_#={6z/_Ç'n&zzz Bi RrsN?p@www;;0|swM5ZҥK~H$ӧO-O GR7l`0r9FKNNs֭#ɠf0OMM~͛7 UV=|q޼yQQQ Jҟ y5*l-%pè[n݀aLE`?re||Ylٺu233---={o߾>lݺL&7o|ʕ݉I&쀽699b&Jm"EBikk߿ճc| Œ CCCGGGzSNmfffyeddXXXTsΨ&eBA&=fw`{P]p⁞CT6͛'OtppH$0O}'n LzoIзǚZzB&+Q9k5VTͻ4MX-?:\.n?B rzZH$ğd-??s%$$]޺uѣP vd2&(((%%Bjժ^4`㓒2l0B^ r(J--?qIV dr6m@H$255ݰaC^~W##e˖^D"%&&rФ3g @-׻w??_rVAVTD&G !6msrr0rv%&&nÇN}:55uСp|]]ݻw/YtµH$?777ʄlw|5utu;tc.8p9d߾}{!ܰ e̘1DH&L3f cǂ;Pwqwwg0C }ŋBV255MMMvSj---P0W"+_PNB&~)aB/j5aU*5Ts![STҺ}\.lrt\NDfF*ET*5//oɫWD"QTm۶mѢZ&٫W/PV|~nnnFFƚ5kڴic``P8EI͒B$j(ZJk Zle˖(0ZO]_˖-ccc׮]b޾}[ZZںukkBiii&M+)?4[TRt: HIIqwwCCπ &_{ޱcG88E&+,x~5BhժX,>sLlllvvvnn'tҲT*u֬Y]vsVԸ8++[n-_ӧt:}ʔ){+8aUbccӻvzƍo>>>ðYf}jL&Kx1!.^fAy1 ɤ*kwww qLRt@REp4U>HP=eƌ yEsj:OL~_D@D"\d >%΀ $/Z[[/XX͈@*s8HPhCݽ{XBRT[[{޽mڴYn݄ dR:CȈ3_~H$L&4R6mWN=zs<Ł;Z>_'|F!(03_t)**^0pooo\޲eKЬYj*n:oիWUVkJ*((r' EIIRܰa͛O>M~<+'8xȑ`؃֦/,{ !F/^?888,\ŋ1bF:tҥKjjjǎB;T*U._>!!sCKRYQQQ3gδ9r!Ɍbcc׭[w%K\reݺu(FqH$6}ʕSնo^Im&HdT*BT>ǠS/ϦLYe ϯiDFz;pӑdoߞr)J~~~ZZZff&,233\BRhiiDp vUO<٥Km޽{3fJ:vX^V^sNMzU0PGM:5)) TS`m$+Ț0yt;;;`. Ͽzj6md2X#""nܸa``СCcP(c yx>hjkk1drqq1D:7H$v 0 xΝWOyI$IYրO=dUVȈb?qĎ;BCCɓcccw.T*xL͚5CU~¯\ŋ𤤤cǎ3(66111 B&pq<''GGG*`N'`1Zxʕ+ 2'N UDFrèfE?סp==m۶j`_`Ʊc0ѣ09rð9sT~zzzCBGA͝;Jmmm.EP888G^G_46AHJJJJJ }iNNNǎbbb<# H$Z@[W0 cEQQU"RZQ(9s5Ϗf׫>lW { \5qM8 jwppqu".L<O,￝;wu떫+a>|@=xH(ǎ۩S'H%H[nٲ9s,Xw_:85df޼ g| ֤@RiҬi ;wV&T.zhj*ZXPήJӧ+y_R Z޾}{\\cuBBw:w}ƍ={H$f*..{}xx8<իpŋw0ѣG9sfÆ ϟ?߾}{֭'N(9UӦMRtڵ\.w8qƍǎT#›drFFFDDĵkג5_D&Sd0jJPh4A4X\.DCSGT iht^ĉ;uԹsf{`,m۶usssrro޼g à$&&޻w9SN[f0 .lٲeVVVtt4ё}ϼy󲲲LE߿1&Lzj\\N-ZD!Rӧw-ZXbE_&%BR^xqr#=6zьYPq45&!--- Yn]Ν n[gtzLLL~fΜ{4:^K͍Z8cƌD~g nnn)`JP(R444JbOO_~ի9w*}ܹ3fݻ7BpC ={vnnnVB/^hL&۳g&8;;8p\N{!!ΞݺqSǎΞݬE EU+@Tx &֛ ~˳TOD)BAYlv5>w߿?qDömpvv>~@ ͝|HLLdGݿʕ+8X,&ϟ?'!#B޽`7ojWWW `0d2T")(,V|\Cr4<] 5SP*Jpf*((_[Ěm8})Swyҥ͛7_bŴiӬCBBΟ??~xoo0ǿ>99955ӧG%%%eeeӦMHw.((HJJ&O33}_aaaAAAVZbmqq1҈[dIBB‡Y3l;w^___}4l\ aNNN޿.].^طo_byIl+ 5 &߿M@''cǎ߿fY Yr Y$&&&77W[[J.СC!&}v^3..N3.Lv666|>___ɓfkk DXA_aDq겅 ٳ(2R$?Q* J]n {pDZ$h4Z^NǏۏ>maXqqqVViG'\bQQۃۣG @pƍׯiP,[ZZh!R)|`0Ћ׊kժս{RѦM0}||Μ93`C{yyᕒRgϞ9;;׫nGP5F)Uzf:!P&80>>~ nzR d6Ϟ={m>|8o޼t҅f"bz)m׮]BBoֺu'Om۶'8U*yJJ B֭[wޝ8qbzz:,`;v8q'cbbUA8O:bAv аabccpĉBalBBNvvemP?r<7Nڠc 2w͛7|p{{/Jlv͇ `0LLLƌƓ;whXXX\~}ʔ)ݲBGBn:##c}1)) %%P.?xF$Av"R);H ~~~iii:tի]]]&;wfeeX% uV;wy}?]9PaBXAyyyi:I8=d׭[7mڴ)CWJyBL):L& S[k G=0cd#if.Vt|\\eew=[>>.\xY#}vƍ{Beݹs猌 k׮oY瀷7nڼys?'M=]OTH$ڼy38eס43JJ%&f €}7!S፾pԹKyKxT*h1eX#mMri-[8ٳz g<{uG!B̙#oNI0Q(}}} rrr&Lp!LF,cbjG,kҋjLL0Dq=A t:|V@bf2j://O[[PU2Rw kkk p&33sÇ_xX,fX3O/)ٖQ b`dzOFAP(h4ڌ3B14֭ۓ'O"xIIP('tz|G0ǃMd2ǃ[eGpqxHH"SjYEQQQ׮]5Ό3*ND==˗K$Xɩf%ɥK|=`|ÇI)`ӧ<B/644۷~JTp豳p­[LfNٻv|25po/kB0BѼEwLL}%K+ a ]o&eC&*Xܹcoookk{mMI+V 7U)evOSV8Oh=<< <$)_Xãͯ.3YqְO+|Gy0fϞ}zuh"gQFYB~Aq_]P mnnniiiu]'PS8ybq`iVzR2icFy`99T*T*o߾mkk ؋T*==C hC+tS[B֖FƢJ,ak Ԓe<*,։SWqzԉG&"L RBA"4 uޠR8\#Gfqr) b |__T`,|BDL&SSkz5VB3R8O05w1y-J™3Bk6miD bU5 B͜+۷w>}͛7C>yTx}-_M$5*S\}I&| T*z$m4$@\!J|TH$ɝ;wjU@(x60ٴ1 BT*իuSN_\mJ;qCA)PO~@8+rD ^X)1HTZZj|TQ ZZZgΜ6bŋ<<cǮ^: zFFFP+KL$ ݻX&0JeggzbY&4KԂ """_WCpppPP) X\\(*fbUz~!2-S[:< Ξ=t={?~_~&&&[lWT߿W+J==)S,^ Ur޻wo߾!mmu֭[ԩSVVVk֬ׯ,xpWQ`$J;w;((hȑR oB<dreڇW$7ۃȵa׉*c vZLR.\ ˿[ WJ]v޽{AAϠA`1$d2XL#WR,..R_'8PTص<}T.] 6,00Jk֬IOO!]nnD|q̙H5000000//o۶m͚5>}:NgٕAIIIDDÇ޽{w&wC޽{aPa8};e7 _IB_{;R-[,--ݝBXLijlddz+Vx{{7vibcc/^lnn.Beeel6NtDb .Ti4ڻwVXd"(0r.]yzz̪VE"ѠAfϞe+ B033Zmhhaؙ3g.]c=+A&RÇ-,,;o>oo3f*cQz̘1[tiӃSѣG9PMh3gΌ1bo߆xlhaM9{… cccauosrNNR@Y cHL J Bmi)Ց#G@"}/ˍhV2|$!ϟ?s1jԨ3gƌ5J1JJݻjHk_pR*j?!!/_|+AF;zǏU*ѣ _nookMS(q㆝իW!@-?2Jepp7V^ݧOL*݄LH+›p8}}/oɓ'b7էʪ `8ιs֬YSs ,EEE\.ƍ!V~knݺuʕ;wvrr2d'a_jL&SՐ)ˣG^bŧ,IdBhժUU>p#/=z9%%jj!q}1|-p֭(Mn&t7JU)J}S&K.B1LFR 㫮57gi>5faڇc0&ܹsƍ5.O\2 ޽{KJfeeu޽7}}}YR򢢢caajժYB>muAy]]xgرcȑ]t fͪTVkii]t… >i4} Kê$rHpppcbbn'Mjg=ztPPӱcoggW', o̙wNKK鰮4tS5g.WPTxeeeBH,kkkd2 fݺuDplVM">&uP(@'}WWSN 0f(.. ٽ{wQQ@ y&0'uHHv\\W\NdbT{xx;vLE~ ԍ:1"akR\\yB.}vS&0TvIfB_+W֐!R\.,膛Bu% "^ {rB|D"ѩSFd{{{Y... u 'AVNҴW^F~~~)S;Fi~_byL"߿?88B[oڴi /_}~ a؅ ?>bĈ &lذF) #  &2d0&&J$;Mj}Νc߲E˖EE9YY2T*oTVVJ޶mی3B/㸩idd$Zx͛ՋЈx$.q\s$##H0;;!Cǟlhhzj{B2Ed25&7ӼiF'UB?WqBݻ6֭[/^RcƌiѢaW^~zΝ\.F\^١NA55h ///''~ z;9rφn/DmZ޿s!bEnVVG~sxe'W]Y@`֪U~n. 7KիWNNN\-HZhgBrƍ7oްXI&A =Bh۶m?~8p`iiiJJ tm۶ꚚΝ;)))!!!L"Zh!C{q@EP5kp|>۷\.wܸqC@fjjjNwSN1'%%yyyq8RIR۵kwoƻQ8 'nڴ`ƌΝ DiKMM]hQ~~a?~l``@P(U%qa5 i$P 988lrΜ9`k? 49s|bĉ%%%*Ņ͝;!tkk4XSSS׮] Z~#ߌN߿?$$Ç Ĝ_PLkVxGb/OܹS&a8?0L!tRUqD"BQPhZho.Yd{A;w.**ѣ/^r*J.8p --MKKkƌ޽޽ٳ ̙~ӦMo߾]z5 gg?PԾ}>~޽{:tR?<<'O|%K/_, ݻh"{{ӧOo޼YWW7!!AV'$$$&&*;wjmӸ99׮]uɈ;;իW<ɓ'qqqH#K`v 1)n"( ׮]{.]hjפ&TBSիK9[n.\ڵ{=z:w 2PÇB=zpzL6$(hҥwnkgw#=ĤN`%T*37<ٚJqܥoAABn4`JlajiJ7ڥV1d2B)--%Zߴi1C;~Z/@vvv>>>Ϟ=hrTܹSVVv} ,--.\ؼy7o,[ӓNfee=~X,ߺu k۷o/ 322 =zիΝ;+J---xСC켼޾}{y¡&&&NZbťKh4Z׮]tbnnoՋfkz,5XTm޽׵kז,Yr֭KB(fπ$eTZ qAAA/dȟFC7p@U QcǶjŅ`hނUJO1qvڂ |||€j!+BXR2`ȐA$30~Qi@|H$ՕB&MwVw2$,)T͝z͛qܤYgfegϟ?!$ɔJeiii޽Q BHRDP iǏ8p`VZ[[PL+---Fo><$k.11u666>|X,O0j ap6Bu!>>ֶcǎ:thÂ[nٲef͚{xxҟ :X*++o3bA֮];s;wnƍVVV@N]]T*TP(7o:tD"YXXDGGwѣG3f8tByynn\.9sfΝϞ=_I!΋ȏ斖qF:ɏVt:E-[v(1%%%5 6)f]OOW).}'*DH`jiә޻rz,]ϞEEGCFw޽{ʠP(o߾=}4J%ɐB" R)HR9KJJ###Jfff/_t˗/|>,ԲeصkײXo B|8B[nm۶m޼MLMMQy~Co1 p`YRRP(fΜg^KQLL̶mۆ*^cDD>ʘB\a8Q,3L&8'VR `{XeE8>}t^zKWWWWWW6500… nb20Cmsqw_toHKReWJ0&2rӚ5-LM aZqRLaad* ED7F"">X AJ\)N H$6H*ZYYϟN; ?b*vВ%Πj9 @!/۶m=zt-Yq a޾u5ӳҕ+*J7n篿Sn!E|oeR)@v:Ba`h8q„&U)W#k3b ~‹FbRRRB[l122.MjS5" |.SA]D %)`(--=zhvvA EfAhիWhbĜ§~ ;|ÇS(H8\ct'O=ڵkiii s΃&!T æMFZjaؔ)S t ^9Л =qJ~ib0* *9S%*HɢK.ݱcG,"h4ZQQBIzu߯N5a:::Ux9nN:\.׼U+P&Y*7`S @8B'$ҥK.]+JfybAd ,x974*rĬs@JrܸqڵsvvqƥK|`VMLLrJR*bB9\.kB]9drqq)SrO]Żw=zKN㸥Cx L0 Ț5ku%V___"899@M+ 0"lr?˵"J~T˄>J(E._+@RN0ѣG&&&w4hlk">ر~~#}\]^El 5hd\5๙)BMo ryAA>[%!DPΟ?cccC jt`piJ3@(l}}}Y BКaq߾}zzz+W4J%ccc gϞM֮]rٳg۶mXt)/))3gUƅZ .ҿ'߿&JPv ggLJs>} ߼y~w2dƌ@Zz]vY+ h{Μ9A\00[YYa剩+jJ*|UB.]%&&;99{xxPm"#@,[v0vҤ+V)HT@F( K H]A3'4uP߀5o<& G5`ZW6oHA :`ӦMpUnnܹs|ErL&kӦA;۲eq5޴uhW^u sEbfjj 6}ӧO&%%r8>onnaÆ &''[ZZxbݿ[LL̉'zQx )8~[nEGGwԉbYZZyĠQF]|9>>~999vJҨɓ';$$$--fXZbBBB^~Bшl+N7o߾};B?~}aaa\kX`R={DlRT~pֶ)BK`^|yС/xn p+++uMD2d8=:~Ann͛7׬YӦMM֯÷7T橫NǏϞ=]v&&&BP&0};v>> ͛76mz̙3a BCCCCCCkkk(D"Ν;mڴԩS׹s޾}|7>>>.\>laanݺ6mڔmڐ6BP(Zlٮ]7N6Lx6=jwUV9rݽY-WVwԩk׮]={?+& B[[x̘1;w1TmhgFtT{q. ?UZNL8~wpp0a`= $6oF{ۈq|=zIvv6JxWA p}IP™&|o0`4sIDAT믅 zyyX,777ܱcNj/RTbTvzҥ%T7n ;v)?qgׯ_KLM > 3ӧb1ǃtBBB^^Lxgφ3f -yyy!;Ss|b@([5C4++ D,X@ T--{D"J\ >-aIIIjѱW^zzzZZZM L'wP{g ٳ̙3/^"*R)J9x}jooJ;wjiik.,,ƍ{!/^{ xbXb .۶m:h"**bu%""ΎxJSwO>޽{nZ__ŋ>>>{ǎ1 +,,4h(--Ç} eeeӦM۷)StuuB'N`ىV:uɓ>~ϟ?$&&K\.9zhTTT=w޽nݺ䄆O9' :v[nuqĈ={E}-ZDFF={:lذ!99Y[[NӧOnݺU9 UHH .+FKOOh۷oD_[[Ɨj@į+z,Rm۶"(---//ŋSN=~? k10Xd2p;QT'5+++M~ZZZ0Ml8\.8qf Ґo̙wNKK ~ׁ6RB!;p;dmڴIHH VZxb _B<{lٲe?~R+I 1 4O*0::(BXXX4o!MܹsWZ뛓qUSSN:EFF.^ ***,,,""o„  f ׽{gϞu޽m۶j> VD P! &O9m* aъjӦM۶m+d̀&&a* *UZZի-ZPԻw{fC#xg v%KWoYYm.,d2իW tZ߇ӧO_dש3gSNs8@ HJKKk(@TKKK|%KziӦ/&( }bl? O|"!U8p{5&GN5RT) 0ӧO+ JU9LH$JQV"` =dȐ'nڴiժU ݻM6k׮8q"X e2YFFԩS_񴵵lw4qhLՐDp8o޼hٲ%ʧM6~~~'N[vm||]\\&LaNYYٿ/wt:ۄZ(,,LGGRرã]v%$$dggE,\0<|0vL 2d+4!&'[nmkkVsŐȑ#DѡC*<<3PĤmmm??VZ)qL&J4mСx133ʕ+T*u` r劶v^@DIJB"g̘ѼyիWX"58 Guqq!t?S鈚YV@ХKpm~~~F-??G!JXyvzUϟ/`˫O-Zl~L)͆NE"Zl D>CH$\`0`&, `'ἦ?1<U %Wt:Fjmmm###"2ʧ4A'{0aBVVT*IìY޼ySZZ _ wޝ`L<!t˗wdC?>33Ӡ_xXd2D"nÇutt6mbJJJd-0dӧO><,, ?b2}ҥVZV^|9cƌ۷>}zŊ4NS('Nٳgܸqjիڵk׮}]vGGGOOORgϞߏ1};vcpppNǏm۶JaΧRX,իW̙{}.{ΝtWWn1nnnի뗛+× xI$Rddd>}vuE~14:`o׮͘7I̯OV!fDSj2V[F Ref! <o* )B{0$::ϟ?_dСC}}}B UVR㹹wA*~`&HPɓ'-x˗/333rڵk NO@U*aa72333L^$RL&S.B##Ν;wرK.jzΝ LիWǏcǎϟ?D":t4+SN:{,*:j!WWכ7oٵh̙3kB L&gddXYY'%%P?'%%[YYedddL3BJb׮^uww_~ǶmET4:yWC0< TE/P ǟA 5A~H~iӦ***** +WkIh4ڋ/,Yd2J%tgg| X^^^hhcN<2dȰas۷oߺuR9|txI`ݻKڧjhbL}ţFrqq177,YrBԺukRi&p)ohh8c KKW^ysl6ʕ+}ԩǻ~zf͚7oډA&78p@(nTTBH*3g8::R۸FQԒT;::9sv ?$")ӣGv;:vF,hO al@6y?0@"v;99# ROȺB!&g}6J@LOOׯ;sϰnb*srr\bH$"ݻwO4 L˻y&B"!몟_AAO!<溪9&''_>77ƍB!DZpWZ5|𢢢oLE"iIB(ttuMIOimݻSz3KD͛7/_$ׯ'%%ر2=5qϿx"?5ArJ~~d)r9qƍ֭ڵ+$Z!!?={/lٲJE) uBaPD/_"PxFR sҥ˸qn޼yҥM6Ti?h4\?={?~ɓ|> 9s΁! ـd5֭mڴ˗W#σ A  `nݺ5k,ZhԨQ4M.Gf80!!oѢEppp||;wZl٣GgϮ^hԩsl45۷x<--sؐH$8oXX؝;wZn J1 Jݻ'Obcc333O]AJvr'OԌ @ъ(Jի~uQW/_)((hj!#Hott͛Je5.v†^ H4"~0 v>8c::r/<6R۷jت4ݧOݻ߾}`xP#XK@(*׾H c! b``YEVZj |gjn3_P%P(t:{}-#'\WWɓ'zzzf:v옭H$J/_l۶-cZ F̚[H$RXXӧjMiSNHLӍR ".RBʩL364p&[]#I$={:ujڴiK,8p`YY ߣ!f?~<**jɒ%d-,(;qټw9sFWOOXRD"W_pS>}:qo߾pPOfX[[[0U`>R HNN0ubf0$iB}QCqTD"//////Tcwndc3^SNDR{s7FGs6' 'J[A4uД4(..ɓ7n:.y\.W L4I*n޼Nݽaty99}ɓ~8qյK. ckkzg0ܹJ7G~ryFFƌ3Ǝ۠.b 77;w۷JBgZFRTɓ' 6߿lPc9';bcݺt{ИБld2kjP(t@|pU^L8˗FFF-[{LK!H:e **H`8IK`B Gt:}ӦM .\fM^Y2P(ڴi| ͆izt㗢RW2h `(..駟 \.2eʎ;v_ݽ{ðcǎ;v9v˗/O|%KƎ\޻wӧDFF B\Z?JE fll|ҥ۷s8cǎQԼ<֤9~cN $)!1Sg̙ceco.>B YfRTJB\. 1L&T:daarujJܹz޼yE_PPuh4sssX;xH$ fff7n!EURD ^\rǎqqq2~###0Q&C[_~Xv!w"/] @i&Pf׭[tRsskh4L&k߾cii)HdffiӦe˖^Z`Snn. :99ީS'333#CuAB$%%9s&22׷o߾z@RD"h46`0JJJnݺyʕŋ>ۚZ{Kϯ(/?}WڵkݺռO8!ɞ>}H&׭[aH$/FDϞ= 755ݶmJmٲU]k4%K,YL.Z derrrtzddd.]/_.˵T*uҥRtժU\.[nǏ={ӧϟ?g& ز`ww'Oxxx4J}HUF` BV7F(J5a3HVb~`tMA:::޺ukƌ fKҗ/_:;;?zhʔ)b833!tobڵ V 4ziӦرcݺu"!A^* v&OܩS'X ۶m.H ?/p F7=zhssscӫW/"F ddddddܿD"u}>>>ܴR-,ۺ~eGgg+_\q5שּׁAq8˗W244|>fƂorϞ=sݻw?8p`DDS.3}FDDܹĉGٸq?@&N8ڱcGPRRҫWWt…\.СCD"J;`wvڵ ""Ĥ3g411!v>*QF#pɭF"^Q=hի7oބ✰BrGA0O2ŋFb˖-[|%KLG[n9n8>O` ðL4i̙t:]*Μ9!ԵkaÆ(J##%KXZZ*۷.X`޼y۷d^Ytrܽ{7##cƍ3ZBVrM 䩲x4TjP8644hp6yn+jH"{ ndd?s̶mۂo%?}摛_#|||?&&&֭166NLL-..޼ysYYl͚5/^re``qt@ `ٸ`ӧOwԲeK=['JKKck Py5Hfi//>};wϞ=`lݺIԽ4+l۶ stttuu8JJJ!eͅ! o>m]vp8cB FgJRsssn5B?!LP$X,h>>>%%%YYY7nܨѽ{677b`W+0 3b8\F9vPs&mnnPXY{o߾ݶmۉ':;;WR,$%%}W6m}RTT^LL22-[{3~W333h42eʶmۺv5kTn۶->>~Ν999֭aիW>|\.WT8) 9>>RUn. !bPHG,PiFsڵ'OUppQ@iM8ɚ|snmm ZBp0ɴ$\s`i48fs\J;bL&_=F$*** <.ART&!vxBlP(W(vvtky;ŋ˖-[d\.?x ǫ;vlxx8&۴iҥKppptt-Zdcc XfMaae˞?>f BUNYfh4T߭[7pj4mH$NNNNJJx&L?`xϞ=߽{r LJԣo߀. J?@5}߸)AԆ@J6jsaBݪU+o4O2w!D g:zI)ڧYxQaJX,ZuR4\R(juGjyO4 JLd >QgQR]nchh_]TT7;wXXX_{6mmmm'NyzzݻwχZ&ɇ8p 0!1NAr뚨! X&ڿСlNl5L+T"ڿĉF,G TU*-ZRi߾}MMM e;_B16DߧO֭[w0a Juׯ_{zzBe7oތ92##)GGǟ~t:֭[/^hW^^СC=߭[Cօ 12l֭AAA0d2ʵb&i4Zqq~9]uֈHiOA "::zРAl6&8uTiik| Jg |a 4Tի_Ķ6nDaBU[VVvO@(LsϞ=cXl6[[gaa!l-) pӧOY,/_?Y,ݛ͛7QQQ޽Cp\̙fmy 6XB"?}tzzzff&Tpvv2dƍ]\\hi4.eb hر+`Q(Dz.+͍7Ο?ߩSX|ќ^z 6 !$ JP*_ p5i*!N,}C}4TJ=MwmFѶn 进Oe˖-湹۷o+lJ۷/BW^NNN=JG9999sF.?y!DG7XXX^z޽{...u`l#bT CjDA{_aZW*MkFBFݽ{Z}BKIIE@`8UUJ1}lо]V,|^ZTMj *ɍ$ǁ#V{¬-fff^^^i_\]py4 J믿]6n8Є `9ǏRP(Gݾ}ƍcǎ>!psڵk׮]|y5|/a......1[8"󢖇󥻴s?v w z);ur~J**ѣG㫳P iNQGQ'/ r;P@)dן9sfذa!!!pB ֭[_PPu֭[#C2 BE_TJ%fk+@dyyzA #ן뮉!)HJ$-ZD W~PاOBׯ✨&љ  !pkdPTF۷o͛SD7;w 1dWTTT.]eF _-NC7FRx69}b"j\=suVOP(ܱcʕ+WEU;Wk&[!D4j(@9~U3ALرc\.Ǐo߾}yyybbH ݛ?|pʀK.h}6 4M ={[*:gS_@` dF 'Oԗd2CBB@Vi8;;RL|J5vX(ѣ`17J%- |*aJCH4oС-e `(\>}L4۷۷#FѣL&߼y6hРÇ}&Lcll|۷i&''ÇJIIZ@WUA{%H* aNnZI8l38yd#uN% ExS} 6_.<==cbbXw},KsWOquA(V_=sss]\\FymȲ ؽ{w^^ȑ#wu "0 U3u;B?LjHh*hNt:]n$^[Pyd-lmm]:t:s]W/]ZVZjaiI"꫸ WŋwiٲI\\L&󋍍-**ZrkX#׮] +*++SSSܹ_>|!tȑgϞA!CAfv-Zhak-[ UѴ-LY T*Bi <mS([7oަMڶm+`l= A>gΜ7o8::Θ12&&VO(Ljii9|cǎedd8::!66V.0 666;;~A޽U*UyyÏ=zʕskJ$1Ǐ[ZZڽ~JkWzA0 juI$>}sIwʕׯ_?ٳg%%%۸qbbb<==JME&H$N=x=(: XK>+ĝ%P z0zk]x:4lTJBa9L##ZMR"(vov+z/ *ZPPgϞ_~e$ٳ#FxYyyӧ_xq0ϝ;7dȐgϞݹsXR?><<!ȑ#?J;Jǎ%S(rlBAq02", -Z5[T@ zqqq}ݰa>N xZݩSYfq8?s߾}066NOO FFFΝ;R͛˖-9rdEEٳgٳ⬬VZQ(@㴴4N??>p1c^aaa֭acŋY_+͖A"nЧ> +|___PAAyiӑt&ҥK>>>x"> pၐIX6*++-,,onii9fP8{7Օ10~X'¾;v!!jh>\5~%A"*Á ð⢢cx m۶۷o r>>>' B9sjF&ر㯿---MMM9,,,Bav|||wnkk ,;<0 +((HHHC&B!J<0ѣ;vx)|;W{lٲ$iǎnںuǏ |>vr5˔m4HTd2XF䲲2{{{*9}ƍ.^QFݸqGnӦd}`dd$ e2\.722޽366f2*N@T]-5SƨZu"Q#7QA+q7eKK_qN ss\n`dff=x!̜8taHD"IRTtرQFu}…*jȐ!/^ ~ǎ1 't>}&N ^z˗/%@ Ԩ &sSBA4*ֵk&]H$rӧO߰aBd!!!u)0((h۷/,,|ի Evvvbb;w.\ŋUV>iyyÇA*))i~~~.\|8bĈ?ޞB_СCwqwwG^ѣiii`!jժ@ʕ+SSSdH$ àӴo JJ0xiX`4055---~^z[ŋt:}߾}<gϞO>>jӦAoڶma~`0En͗/_ңG ^ ԙi:Q!"V^^yャQUD<7^*2dԨQ,|ܹsj+L>]+Bt:}ԩ9P%ic߸j4ZJx%^d4wvqq1vttx]tyڵL&ɓ'_zemmP( x߂aXYY8CNT@RRR@aʕcƌqvv]rrrQQ5L.))yUrr2 f/**w^@@@vAzzQb@jC"dee 6 ð1cƸ>6cbbbhHj^/~=%v1y"7L \8f 0&MZ=sH$͞/H޼yCR~GbX"ddd߿_$]zU[nקP(]VEDDp\|kI UǧK<WЁN0cii)ǃ& ھ}7oŠ]eUӋ )ʧi?'%tV Hx}uNlTV 52SW~h~!k֬Q*;v3fOR۷oa?ҦM6K}3<Ç>{1 + Yl\@ BaYȈp 51͐oz!M1@/k7Ú 7n 1Nggg6Z0U"CF"D;2AmFFFd2yĈ#F;%JժWЪ%i9l_aH+N;6] qF, 8L ^VZhŊ[0*%=xz1nk꠯T*u*PF`FZ׮]34?6H$a5 VT3 B*v?ʘCUgh3JUB@gR"$Iн,|9(DR-Zw*VJK<Б#"їY WpoX, "(**J/5 źvraVaرP1F,*r6mWBxA;1VPPw^**J}||ƌsQKKˁ\.$)R '"H J566X,ş ˇ=@ S(8lƌGh4R4mZ*.*raS$0iڴ2}`aMk5]d2ϟ!2B۷M/v## XO$XPP0a„~ ^x% |50 Ë|, Y;OOφ޽>66ŋ.\ HY/_ޢEwRԀ[[۲~ĄXZZ3++͛ i$(Q{mz\.wRƆjo62UGh4:xJ q~^`4BPA466F) 333g4LǢiLFi]mK5wH$B蘒УGu211a;vLHH055mݺM֭[G&w5rȞ={D=z$$$[nPeqƧO9r3fԋϙDx?XXZk%0F,=E/_\"Si4fA~ Z]VH$Pw8x&>SMe>jd2=>_3gܶm[yy9611ct/Db25gӠAH V>}<==>}ڻw]:w MHHزe nrmK.ر۷t:˽qFV{/_AUeJ666VVVwvqqyǃrsse2Yyy[XJtI&uڵ{ ߿?D2pJ7nMΩVB~xYYمx5MfF7GU^^nT ?y$8xCu_R\x177,a\>a„2Xlii`0J%d@5QYYI$655ݸq#JU( E |EhLJ***Pb$\a<O[Bwr9h4޽PnΝc0Z[ˏGL&mݺ5((H/bS*AAA666 B_CۺukDD>7s=;͛W?~N;99}REtj8VZ>}aAAAϟwٳ/]pBҀ ø\ܹsv͜9SDEE%''#wP(:w|aaa~~~3fPT+VRKJJZx1D2RԷP(j19 h4mzxx̘1cgΜiӦ޽{-Zڶm3<J x0Z]VV" `QpLee%hsdfeeaiee%j5fҋHa0C)Bfl6}ѱfiG%_hGn~E& Ӫ Jx d>x%)_~䔗ײeKPN;777ÇQBU`0vG۷ŋ0-绺".\K@i&6շo!qaжm}j*GG\] *ѥwh틠A !ƌsԩϟڵo8q\.wtt(**^)[V7nܱc*++3!JZƯ@& EwN"R)l 4 sΛ7K. Sߎ"Hu(X,޵kWaa;BϏEEEXGjf4r :u}|ӦMM&JB3g tRݓΝݻ7СCQQvqqAZ>PdBb&  ?$$ںlԩw 177WT'O^dرcB>>>SNN:ƍUlss󀀀Ƿj \bEEEň#֮]ݷo_/hWa Y Na`mmTU~ӋaG߸qsر?# ˄>8U*1h\~m(7oXJ.qÉߴiٳgY<== Njy {IIIF03KcXV[XXX":t:ʕ+ƮLPF%HPwZeiiy Ptt4\dٲebҥ F|;w$ɩeee4->>!1pY:H(C_ݻwu<<<Ξ=+N:%JRT=pCs\hjZWAuxPk/ :*n_~wĈўşCG~ƍ۶m{C@:J_JVʏ dӦMV$SRR~~)lU~FN]\\ m ї/__~z;;)STߔp 9`K:|HUaL&cjd2I5F׶!Ns8 fNA_EQmccV*o߾]f BHXYY4 oni4Zs @ш+VٳgӦMwIKK_~b\<11A*w޹s㓓1 S('Od0;vd_ӧOu֣G"""x<^RRRNNN^ HLL066vttҥ˞={rss?pcR*i4ۜMk֤/tR0)t6a} F[fMii5R(ׂj1t,MB*V'h4<!b8,,l̙j:,,lƍK,sιs'OL>|bPW-hb4JYFGҥKϟVt:];"Kh=t萕U@@վ6 iM*jԨQ666gΜIHHqO@|~YYٔ)S8εk<==.GQm8k732rlh(qhݚD& KK5V;%Nkh:wWRRbff&J;vhpcFA–-?>\*X֥cGFCPHdSLLL"BAdE}>B,X >>ɓ'{={ٳgw1bĈsΚ5PL _>x`„ ڵۻwoaa!ͦP(;v(++;vlv^ZTTTPP?Tvرc|'''yM !!!b899 )iT՞W^]nݐ!CqƉD"LV_`L& s΍:R EΝ{_r@2r'OfGu@ 4!C...@߽{p 2uJ>>>\.r $W?>Xf^FF۷ooݺnݺw=~X"<}T tuϟ?Ӝ'OxTPZZZ^^ɓΝ;ϛ7d+*ݡCp@>jԨ~X,2|mXѣW^ر6,???--7J-*,\v͛˅Bx)Sa, -Z/JP[ڵk! =, 63J=sL~~ǏE"Q^^^EE mŁ5sʕ֭[+ kk9sp.]L2ƍ/_NIIٶmŚ;wч .۷oߝ;w:;;3˗}ԩbَ>>>ݺu 7l6bt2TR(m۶>l# @J㰲ھ}7o3꽸/`0^{ʅBP(2I ׮]`XmڴҥK^`K/h B&Ϟ=T*tp={vy.ue.ޝiӦjH$n kժ#F377ONN2r1c8;;O:B$''q qJիWW^>f̘-Zp8P+wxh4X,?q͛7Ǐ|rT*q/ ڔ!D&+JKKr1N߼{7DqIӧsy<{Kk{o80&.nPpp@`KOO~zEEɓa13fٳg|>B{k׮MOO2dӯ^_ h4W>rHZZR=/a ŧU)-E"G][0*R qϟ?eʔk^vŋPRK.ઽcllϹs3t˗/|R,PF;U[Td22 P(p L5C$ =zԧO̟}MMMݸqJxbpp'nXշ[W/[vrR*0~w߾ +n]objji ri4b[ZZzҥ(܌]ׯ_СǏO<{n+HP(BBBf̘aggT*  1A4 !V˟ V ~)hFBfZ622ڰaҥK:f̘6m{vvvl6[(j۷}]VV֛7o<==?ryY>d Br[P"H4.8X,{&ƌ{7^^Z02! Op‹ &`ֵkW~0ۯ_~p5؆|˃+WT*Atĉݺu;x𠗗qyy9 2@ l*]xǏwppݻwpp0N=ݻC9/ TYPt(Z*|zfkܸqȑ:9w>~|=""NӬ[j(>>>ðq 0a âb i:_ ov#8NHHBhp ?R=}tºLTMMM^2y#G áRD2 E#HhwѣG'...PU  6A`wގ۷9rנ] \.7,, j5kցRSS `eenݺ .Ctxx8nHAƼmN,ZPrrrXXѼ_wd'NT @ NH1Æ81+Ϗx|>{^s io9 ~^]L8_+th72xYJHH s7)"3s󘸸RDQжTҴL&Cr* 0A0 EsV^scbֱZPUѪ(Fz ; |h…bR_Gр٤ 72)ZJ$V)~?^* ԣ2/ ^ӡƪuBkFZZ;;;d)*V/ZT* ) 9jQ^Mf+ QտH:5h-v |WQ;A @1y|O$U6F&}B /5f! "@A z0 ~ m6! T_Ti8H$3ssPQa!aL&SRA?-$Eut7mG=Zg-Z`X2LD\b X=aGRZo&F #U[)n!(Ww%{p#uq++"777}ET*522lBfL?vز2m`|k4ALPPɜ4mZ~^^EY[o`ؤiӘLsІF+6]^^N*秥ya/dH.uQ 4Dmuww0… d2D 4ŋW\@ZM00_OjbE,6!( aY'?6/o+-F""D,~-BYO oD:Y5vcΆ)LRg˓nA :̞=:=*d4HRݻgϞ5kR8Rm۶ݴi*@B( ?>'I$BiNō N!H\T 6D!$+|NѾk+Wi N+JåApS- ϟ?O&i4ZSq $''=Zm! HDPRB@S"ZxnK@T-CPIq1~_Vv:d2_yof6X,O?a S4C@쮞;wnРA>hh0Y4hA }"ɰڱs磬,Af)~h999 AR)drȐ!=!Q/x"HăG@-R)HX6Q`& ~ARA[ !dhaV yV @fw+6drA 3bh6>1fxhh4 ج!@| h @ A @_(DBA  @  @P4 A @/ "@| h @ A @_(qj+2u%tEXtdate:create2011-11-16T16:53:49+01:00'%tEXtdate:modify2011-11-16T16:46:50+01:00 eIENDB`openjpeg-2.1.0/doc/Doxyfile.dox.cmake.in000644 001750 001750 00000024073 12327650564 021223 0ustar00mathieumathieu000000 000000 # 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 openjpeg-2.1.0/doc/jpip_protocol.png000644 001750 001750 00000014350 12327650564 020626 0ustar00mathieumathieu000000 000000 PNG  IHDRXtp[IDATx=rJP*'gɽx?u2YlF|nD PA4 \$4WxM..ri!YdM5A@!YdM5A@>݁$Ŝ(ͿlgͫSW!ͩgԏ"m>1_˥SW ebbU鸿O6vNA@s koivLƎ"OWgBjo@n׌j~eΖܑؖHwBAdb|ۼ\gRE7Nb o{_>l?$BڙY4tj&z'| 6[}u[T]xYW'2oZ;&C\f?|>~FCshܰòuM? t~փ}a'pme>?}:K[ڹq}HjFYk=؉`xpā7AHu5NgKT]6W d;;ywyLl/NgTmwB,,'[>/%Mxϋd,!YdM5A@aGWX"uN5A@!YdM5A@!?|O * TnQvD]NZDߧt=P[tbg5nJMdR?|j9pWܘocG5[MScp=W ss2}ݾ:bƎU,lB~.fK8H$!O{2Νj#W[vABBYdb}Lg!~˔=GlW?ziO aG N&f}s5bW;{1sp5 i]] 6ޞ7ҁ(gYv:2x]}Fsי3 Qjs/hGp3xW[48+e:g ˜8İ?< sHSLgpYXDP:$M|'-!lď{(,˵3ekBf{^ ]/;fi`.Ō`.Ō B&Ț  k B&Ț  k B&Ț  k B&Ț  k B&;<(e< jXT-u9^BN&fiu\iURN &\qAQAՉßԵ<dYaP?3џu58t.o V[g^C *Z:5Éƞ6Ӭkl*씺 g"dXXYӵ2+@]3RvZXlvZWl g"XX!{*6 U8#Z$fق#@ nXEQ.- 3r"uHE(˗/_~f, U8>Ώ?:NeY-CVUU,vx޹ iOYoooeYEq>73~Lr#KX™ުRv_-CHA] gF@!YdM5A@!YdM5A@!YdM5A@!YdM5A@!Yd TQ2CS7goowsv7r }hWɀٛI*ֽ.A?ho٧3?봳yֿß6q[e0L]&r~kfϽ8AuI^;GMvgiyib|[a疧t=w7^!mwlla>Oe9(BQ-QO>BĞO' ɶEFcQ7V;cCY<\L Y(,˵'^PaS!C{-t4 Y -3#䬅–5A@!YdM5A@!YdM5A@!YdM5A@!YdM5A@!Yv5EQ?\.=99us~: l'{3. !_*9{c=_źžBp39[ 7v:,+EM\Ėf5x?s/9AYFv>;O9-N9t_ըEFcQpF*"!,}Y~,rN|96 \m'pHգ#0')_3R) g6CHEPXӺJEص絯{7vZW0R)dXWM:Ʈ plF*"u%uuGSWTE nBBt:gLC QuHEPXvNеBT]3R)wm@~#abBl֏ouo`7,RPW,X|VWFp"uRcUUө,KuV(,ʲ\;;رf-o6AWеcFvZRvZRȚ  k B&Ț  k B&Ț  k B&Ț  k B&Ț  k B`(f{SWl'λFKkw|O!vyiqpitgy5&>===??6c/,;wjӵzKö'y} ~^8֟}ڍ?ӹ?ՊTE jq۷o [pF*"ufMyIvbm9n 20|:fO׾ʰf3R)촮Va"(,RXB?TmU8#AauHȳGܯ ]Zf\~HEPXPŗ/_~*XU8 ǏUUN, d[aB]WUUDz,O=_&eVeQy@F!lϟ?߫Z;sHar#pfEҵ[a"uΌ B&Ț  k B&Ț  k B&Ț  k B&Ț  k B&;[QrMe?zK~~;[&ډ6CBn:~]mgpKH;"ldT $á7k44NG5MXsT'G>>[>>>kv4h}E~$`<،C^]&"(tR؏W^~89e'Bvzȇ٣qWTE ۯmpkWcЇ4 16 66뺇}6!-CH!új1p-wAu5HA]EI0uHEPX&$D^q4tUWTE jD1 ]+DU8#Aazx ˋ 70)+&Ćhׯ_VWFp"uł:eYguo`7,RPW,xnu>(,˵3ekBf{^ ]/;fi`.Ō`.Ō B&Ț  k B&Ț  k B&Ț  k B&Ț  k B&;lBQ29{~~;[&ڙ "cs vWanwN Bӳzcgv 8lja3NEuÐ-  76:frMyf~Lspٿҝ^;A?Tg,~0`0 9"tuq5p6Hopڔjo'<Չ{gt{!pR^iT0fO?ױ^^^ ãyJM!YF2ا?cFEq^J;[H]킑HA](D[-3R)(͚ጕf՞~͞m/KpF*" j0 |uUu5Hau%6nu #AaŠu-lܯ nElF-8~HEPXPEҢ0*pF*"(|WaƂܯe`}?~t:ev_ ;2D꺪xdD†~Y0w`J)7r gF[^)]/e)+RPWȚ  k B&Ț  k B&Ț  k B&Ț  k B&Ț  k B&.ɮZIENDB`openjpeg-2.1.0/CMakeLists.txt000644 001750 001750 00000031741 12327650571 017231 0ustar00mathieumathieu000000 000000 # 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) 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 0) 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 # 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 ${CMAKE_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() #----------------------------------------------------------------------------- # Big endian test: include (${CMAKE_ROOT}/Modules/TestBigEndian.cmake) TEST_BIG_ENDIAN(OPJ_BIG_ENDIAN) #----------------------------------------------------------------------------- # Setup file for setting custom ctest vars configure_file( ${CMAKE_SOURCE_DIR}/cmake/CTestCustom.cmake.in ${CMAKE_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(CMAKE_C_FLAGS_RELEASE "-ffast-math ${CMAKE_C_FLAGS_RELEASE}") 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) #----------------------------------------------------------------------------- # 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) #----------------------------------------------------------------------------- # 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 svn on the OpenJPEG google code project # svn checkout http://openjpeg.googlecode.com/svn/data (about 70 Mo) 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_SOURCE_DIR}/cmake/OpenJPEGConfig.cmake.in ${OPENJPEG_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() #----------------------------------------------------------------------------- openjpeg-2.1.0/README000644 001750 001750 00000004060 12327650571 015343 0ustar00mathieumathieu000000 000000 OPENJPEG LIBRARY and APPLICATIONS ---------------------------------- 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 'http://openjpeg.googlecode.com/svn/data' folder. * cmake: cmake related files see LICENSE for license and copyright information. see INSTALL for installation procedures. see NEWS for user visible changes in successive releases. see CHANGES for per-revision changes. ---------------- API/ABI OpenJPEG strives to provide a stable API/ABI for your applications. As such it only exposes a limited subset of its functions. It uses a mecanism of exporting/hiding functions. If you are unsure which functions you can use in your applications, you should compile OpenJPEG using something similar to gcc: -fvisibility=hidden compilation flag. See also: http://gcc.gnu.org/wiki/Visibility On windows, MSVC directly supports export/hidding function and as such the only API available is the one supported by OpenJPEG. openjpeg-2.1.0/wrapping/java/openjp2/JavaOpenJPEG.c000644 001750 001750 00000215314 12327650564 023135 0ustar00mathieumathieu000000 000000 /* * 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) 2007, Patrick Piscaglia (Telemis) * 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 #include #include #include #include #include "openjpeg.h" #include "opj_includes.h" #include "opj_getopt.h" #include "convert.h" #include "index.h" #include "dirent.h" #include "org_openJpeg_OpenJPEGJavaEncoder.h" #ifndef _WIN32 #define stricmp strcasecmp #define strnicmp strncasecmp #endif #include "format_defs.h" #define CINEMA_24_CS 1302083 /*Codestream length for 24fps*/ #define CINEMA_48_CS 651041 /*Codestream length for 48fps*/ #define COMP_24_CS 1041666 /*Maximum size per color component for 2K & 4K @ 24fps*/ #define COMP_48_CS 520833 /*Maximum size per color component for 2K @ 48fps*/ extern int get_file_format(char *filename); extern void error_callback(const char *msg, void *client_data); extern void warning_callback(const char *msg, void *client_data); extern void info_callback(const char *msg, void *client_data); typedef struct callback_variables { JNIEnv *env; /** 'jclass' object used to call a Java method from the C */ jobject *jobj; /** 'jclass' object used to call a Java method from the C */ jmethodID message_mid; jmethodID error_mid; } callback_variables_t; typedef struct dircnt{ /** Buffer for holding images read from Directory*/ char *filename_buf; /** Pointer to the buffer*/ char **filename; }dircnt_t; typedef struct img_folder{ /** The directory path of the folder containing input images*/ char *imgdirpath; /** Output format*/ char *out_format; /** Enable option*/ char set_imgdir; /** Enable Cod Format for output*/ char set_out_format; /** User specified rate stored in case of cinema option*/ float *rates; }img_fol_t; static void encode_help_display() { fprintf(stdout,"HELP\n----\n\n"); fprintf(stdout,"- the -h option displays this help information on screen\n\n"); /* UniPG>> */ fprintf(stdout,"List of parameters for the JPEG 2000 " #ifdef USE_JPWL "+ JPWL " #endif /* USE_JPWL */ "encoder:\n"); /* <> */ #ifdef USE_JPWL fprintf(stdout," * No JPWL protection\n"); #endif /* USE_JPWL */ /* < \n"); fprintf(stdout," Currently accepts PGM, PPM, PNM, PGX, BMP, TIF, RAW and TGA formats\n"); fprintf(stdout,"\n"); fprintf(stdout,"-i : source file (-i source.pnm also *.pgm, *.ppm, *.bmp, *.tif, *.raw, *.tga) \n"); fprintf(stdout," When using this option -o must be used\n"); fprintf(stdout,"\n"); fprintf(stdout,"-o : destination file (-o dest.j2k or .jp2) \n"); fprintf(stdout,"\n"); fprintf(stdout,"Optional Parameters:\n"); fprintf(stdout,"\n"); fprintf(stdout,"-h : display the help information \n "); fprintf(stdout,"\n"); fprintf(stdout,"-cinema2K : Digital Cinema 2K profile compliant codestream for 2K resolution.(-cinema2k 24 or 48) \n"); fprintf(stdout," Need to specify the frames per second for a 2K resolution. Only 24 or 48 fps is allowed\n"); fprintf(stdout,"\n"); fprintf(stdout,"-cinema4K : Digital Cinema 4K profile compliant codestream for 4K resolution \n"); fprintf(stdout," Frames per second not required. Default value is 24fps\n"); fprintf(stdout,"\n"); fprintf(stdout,"-r : different compression ratios for successive layers (-r 20,10,5)\n "); fprintf(stdout," - The rate specified for each quality level is the desired \n"); fprintf(stdout," compression factor.\n"); fprintf(stdout," Example: -r 20,10,1 means quality 1: compress 20x, \n"); fprintf(stdout," quality 2: compress 10x and quality 3: compress lossless\n"); fprintf(stdout,"\n"); fprintf(stdout," (options -r and -q cannot be used together)\n "); fprintf(stdout,"\n"); fprintf(stdout,"-q : different psnr for successive layers (-q 30,40,50) \n "); fprintf(stdout," (options -r and -q cannot be used together)\n "); fprintf(stdout,"\n"); fprintf(stdout,"-n : number of resolutions (-n 3) \n"); fprintf(stdout,"\n"); fprintf(stdout,"-b : size of code block (-b 32,32) \n"); fprintf(stdout,"\n"); fprintf(stdout,"-c : size of precinct (-c 128,128) \n"); fprintf(stdout,"\n"); fprintf(stdout,"-t : size of tile (-t 512,512) \n"); fprintf(stdout,"\n"); fprintf(stdout,"-p : progression order (-p LRCP) [LRCP, RLCP, RPCL, PCRL, CPRL] \n"); fprintf(stdout,"\n"); fprintf(stdout,"-s : subsampling factor (-s 2,2) [-s X,Y] \n"); fprintf(stdout," Remark: subsampling bigger than 2 can produce error\n"); fprintf(stdout,"\n"); fprintf(stdout,"-POC : Progression order change (-POC T1=0,0,1,5,3,CPRL/T1=5,0,1,6,3,CPRL) \n"); fprintf(stdout," Example: T1=0,0,1,5,3,CPRL \n"); fprintf(stdout," : Ttilenumber=Resolution num start,Component num start,Layer num end,Resolution num end,Component num end,Progression order\n"); fprintf(stdout,"\n"); fprintf(stdout,"-SOP : write SOP marker before each packet \n"); fprintf(stdout,"\n"); fprintf(stdout,"-EPH : write EPH marker after each header packet \n"); fprintf(stdout,"\n"); fprintf(stdout,"-M : mode switch (-M 3) [1=BYPASS(LAZY) 2=RESET 4=RESTART(TERMALL)\n"); fprintf(stdout," 8=VSC 16=ERTERM(SEGTERM) 32=SEGMARK(SEGSYM)] \n"); fprintf(stdout," Indicate multiple modes by adding their values. \n"); fprintf(stdout," ex: RESTART(4) + RESET(2) + SEGMARK(32) = -M 38\n"); fprintf(stdout,"\n"); fprintf(stdout,"-TP : devide packets of every tile into tile-parts (-TP R) [R, L, C]\n"); fprintf(stdout,"\n"); fprintf(stdout,"-x : create an index file *.Idx (-x index_name.Idx) \n"); fprintf(stdout,"\n"); fprintf(stdout,"-ROI : c=%%d,U=%%d : quantization indices upshifted \n"); fprintf(stdout," for component c=%%d [%%d = 0,1,2]\n"); fprintf(stdout," with a value of U=%%d [0 <= %%d <= 37] (i.e. -ROI c=0,U=25) \n"); fprintf(stdout,"\n"); fprintf(stdout,"-d : offset of the origin of the image (-d 150,300) \n"); fprintf(stdout,"\n"); fprintf(stdout,"-T : offset of the origin of the tiles (-T 100,75) \n"); fprintf(stdout,"\n"); fprintf(stdout,"-I : use the irreversible DWT 9-7 (-I) \n"); fprintf(stdout,"\n"); fprintf(stdout,"-jpip : write jpip codestream index box in JP2 output file\n"); fprintf(stdout," NOTICE: currently supports only RPCL order\n"); fprintf(stdout,"\n"); /* UniPG>> */ #ifdef USE_JPWL fprintf(stdout,"-W : adoption of JPWL (Part 11) capabilities (-W params)\n"); fprintf(stdout," The parameters can be written and repeated in any order:\n"); fprintf(stdout," [h<=type>,s<=method>,a=,...\n"); fprintf(stdout," ...,z=,g=,p<=type>]\n"); fprintf(stdout,"\n"); fprintf(stdout," h selects the header error protection (EPB): 'type' can be\n"); fprintf(stdout," [0=none 1,absent=predefined 16=CRC-16 32=CRC-32 37-128=RS]\n"); fprintf(stdout," if 'tilepart' is absent, it is for main and tile headers\n"); fprintf(stdout," if 'tilepart' is present, it applies from that tile\n"); fprintf(stdout," onwards, up to the next h<> spec, or to the last tilepart\n"); fprintf(stdout," in the codestream (max. %d specs)\n", JPWL_MAX_NO_TILESPECS); fprintf(stdout,"\n"); fprintf(stdout," p selects the packet error protection (EEP/UEP with EPBs)\n"); fprintf(stdout," to be applied to raw data: 'type' can be\n"); fprintf(stdout," [0=none 1,absent=predefined 16=CRC-16 32=CRC-32 37-128=RS]\n"); fprintf(stdout," if 'tilepart:pack' is absent, it is from tile 0, packet 0\n"); fprintf(stdout," if 'tilepart:pack' is present, it applies from that tile\n"); fprintf(stdout," and that packet onwards, up to the next packet spec\n"); fprintf(stdout," or to the last packet in the last tilepart in the stream\n"); fprintf(stdout," (max. %d specs)\n", JPWL_MAX_NO_PACKSPECS); fprintf(stdout,"\n"); fprintf(stdout," s enables sensitivity data insertion (ESD): 'method' can be\n"); fprintf(stdout," [-1=NO ESD 0=RELATIVE ERROR 1=MSE 2=MSE REDUCTION 3=PSNR\n"); fprintf(stdout," 4=PSNR INCREMENT 5=MAXERR 6=TSE 7=RESERVED]\n"); fprintf(stdout," if 'tilepart' is absent, it is for main header only\n"); fprintf(stdout," if 'tilepart' is present, it applies from that tile\n"); fprintf(stdout," onwards, up to the next s<> spec, or to the last tilepart\n"); fprintf(stdout," in the codestream (max. %d specs)\n", JPWL_MAX_NO_TILESPECS); fprintf(stdout,"\n"); fprintf(stdout," g determines the addressing mode: can be\n"); fprintf(stdout," [0=PACKET 1=BYTE RANGE 2=PACKET RANGE]\n"); fprintf(stdout,"\n"); fprintf(stdout," a determines the size of data addressing: can be\n"); fprintf(stdout," 2/4 bytes (small/large codestreams). If not set, auto-mode\n"); fprintf(stdout,"\n"); fprintf(stdout," z determines the size of sensitivity values: can be\n"); fprintf(stdout," 1/2 bytes, for the transformed pseudo-floating point value\n"); fprintf(stdout,"\n"); fprintf(stdout," ex.:\n"); fprintf(stdout," h,h0=64,h3=16,h5=32,p0=78,p0:24=56,p1,p3:0=0,p3:20=32,s=0,\n"); fprintf(stdout," s0=6,s3=-1,a=0,g=1,z=1\n"); fprintf(stdout," means\n"); fprintf(stdout," predefined EPB in MH, rs(64,32) from TPH 0 to TPH 2,\n"); fprintf(stdout," CRC-16 in TPH 3 and TPH 4, CRC-32 in remaining TPHs,\n"); fprintf(stdout," UEP rs(78,32) for packets 0 to 23 of tile 0,\n"); fprintf(stdout," UEP rs(56,32) for packs. 24 to the last of tilepart 0,\n"); fprintf(stdout," UEP rs default for packets of tilepart 1,\n"); fprintf(stdout," no UEP for packets 0 to 19 of tilepart 3,\n"); fprintf(stdout," UEP CRC-32 for packs. 20 of tilepart 3 to last tilepart,\n"); fprintf(stdout," relative sensitivity ESD for MH,\n"); fprintf(stdout," TSE ESD from TPH 0 to TPH 2, byte range with automatic\n"); fprintf(stdout," size of addresses and 1 byte for each sensitivity value\n"); fprintf(stdout,"\n"); fprintf(stdout," ex.:\n"); fprintf(stdout," h,s,p\n"); fprintf(stdout," means\n"); fprintf(stdout," default protection to headers (MH and TPHs) as well as\n"); fprintf(stdout," data packets, one ESD in MH\n"); fprintf(stdout,"\n"); fprintf(stdout," N.B.: use the following recommendations when specifying\n"); fprintf(stdout," the JPWL parameters list\n"); fprintf(stdout," - when you use UEP, always pair the 'p' option with 'h'\n"); fprintf(stdout," \n"); #endif /* USE_JPWL */ /* <tile_size_on = OPJ_FALSE; parameters->cp_tdx=1; parameters->cp_tdy=1; /*Tile part*/ parameters->tp_flag = 'C'; parameters->tp_on = 1; /*Tile and Image shall be at (0,0)*/ parameters->cp_tx0 = 0; parameters->cp_ty0 = 0; parameters->image_offset_x0 = 0; parameters->image_offset_y0 = 0; /*Codeblock size= 32*32*/ parameters->cblockw_init = 32; parameters->cblockh_init = 32; parameters->csty |= 0x01; /*The progression order shall be CPRL*/ parameters->prog_order = CPRL; /* No ROI */ parameters->roi_compno = -1; parameters->subsampling_dx = 1; parameters->subsampling_dy = 1; /* 9-7 transform */ parameters->irreversible = 1; } static void cinema_setup_encoder(opj_cparameters_t *parameters,opj_image_t *image, img_fol_t *img_fol){ int i; float temp_rate; opj_poc_t *POC = NULL; switch (parameters->cp_cinema){ case CINEMA2K_24: case CINEMA2K_48: if(parameters->numresolution > 6){ parameters->numresolution = 6; } if (!((image->comps[0].w == 2048) | (image->comps[0].h == 1080))){ fprintf(stdout,"Image coordinates %d x %d is not 2K compliant.\nJPEG Digital Cinema Profile-3" "(2K profile) compliance requires that at least one of coordinates match 2048 x 1080\n", image->comps[0].w,image->comps[0].h); parameters->cp_rsiz = STD_RSIZ; } break; case CINEMA4K_24: if(parameters->numresolution < 1){ parameters->numresolution = 1; }else if(parameters->numresolution > 7){ parameters->numresolution = 7; } if (!((image->comps[0].w == 4096) | (image->comps[0].h == 2160))){ fprintf(stdout,"Image coordinates %d x %d is not 4K compliant.\nJPEG Digital Cinema Profile-4" "(4K profile) compliance requires that at least one of coordinates match 4096 x 2160\n", image->comps[0].w,image->comps[0].h); parameters->cp_rsiz = STD_RSIZ; } parameters->numpocs = initialise_4K_poc(parameters->POC,parameters->numresolution); break; } switch (parameters->cp_cinema){ case CINEMA2K_24: case CINEMA4K_24: for(i=0 ; itcp_numlayers ; i++){ temp_rate = 0 ; if (img_fol->rates[i]== 0){ parameters->tcp_rates[0]= ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/ (CINEMA_24_CS * 8 * image->comps[0].dx * image->comps[0].dy); }else{ temp_rate =((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/ (img_fol->rates[i] * 8 * image->comps[0].dx * image->comps[0].dy); if (temp_rate > CINEMA_24_CS ){ parameters->tcp_rates[i]= ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/ (CINEMA_24_CS * 8 * image->comps[0].dx * image->comps[0].dy); }else{ parameters->tcp_rates[i]= img_fol->rates[i]; } } } parameters->max_comp_size = COMP_24_CS; break; case CINEMA2K_48: for(i=0 ; itcp_numlayers ; i++){ temp_rate = 0 ; if (img_fol->rates[i]== 0){ parameters->tcp_rates[0]= ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/ (CINEMA_48_CS * 8 * image->comps[0].dx * image->comps[0].dy); }else{ temp_rate =((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/ (img_fol->rates[i] * 8 * image->comps[0].dx * image->comps[0].dy); if (temp_rate > CINEMA_48_CS ){ parameters->tcp_rates[0]= ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/ (CINEMA_48_CS * 8 * image->comps[0].dx * image->comps[0].dy); }else{ parameters->tcp_rates[i]= img_fol->rates[i]; } } } parameters->max_comp_size = COMP_48_CS; break; } parameters->cp_disto_alloc = 1; } /* ------------------------------------------------------------------------------------ */ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters, img_fol_t *img_fol, char *indexfilename) { int i, j,totlen; opj_option_t long_option[]={ {"cinema2K",REQ_ARG, NULL ,'w'}, {"cinema4K",NO_ARG, NULL ,'y'}, {"ImgDir",REQ_ARG, NULL ,'z'}, {"TP",REQ_ARG, NULL ,'u'}, {"SOP",NO_ARG, NULL ,'S'}, {"EPH",NO_ARG, NULL ,'E'}, {"OutFor",REQ_ARG, NULL ,'O'}, {"POC",REQ_ARG, NULL ,'P'}, {"ROI",REQ_ARG, NULL ,'R'}, {"jpip",NO_ARG, NULL, 'J'} }; /* parse the command line */ /* UniPG>> */ const char optlist[] = "i:o:hr:q:n:b:c:t:p:s:SEM:x:R:d:T:If:P:C:F:u:" #ifdef USE_JPWL "W:" #endif /* USE_JPWL */ ; /*printf("C: parse_cmdline_encoder:"); for (i=0; iset_out_format=0; reset_options_reading(); while (1) { int c = opj_getopt_long(argc, argv, optlist,long_option,totlen); if (c == -1) break; switch (c) { /* ----------------------------------------------------- */ case 'o': /* output file */ { char *outfile = opj_optarg; parameters->cod_format = get_file_format(outfile); switch(parameters->cod_format) { case J2K_CFMT: case JP2_CFMT: break; default: fprintf(stderr, "Unknown output format image %s [only *.j2k, *.j2c or *.jp2]!! \n", outfile); return 1; } strncpy(parameters->outfile, outfile, sizeof(parameters->outfile)-1); } break; /* ----------------------------------------------------- */ case 'O': /* output format */ { char outformat[50]; char *of = opj_optarg; sprintf(outformat,".%s",of); img_fol->set_out_format = 1; parameters->cod_format = get_file_format(outformat); switch(parameters->cod_format) { case J2K_CFMT: case JP2_CFMT: img_fol->out_format = opj_optarg; break; default: fprintf(stderr, "Unknown output format image [only j2k, j2c, jp2]!! \n"); return 1; } } break; /* ----------------------------------------------------- */ case 'r': /* rates rates/distorsion */ { char *s = opj_optarg; while (sscanf(s, "%f", ¶meters->tcp_rates[parameters->tcp_numlayers]) == 1) { parameters->tcp_numlayers++; while (*s && *s != ',') { s++; } if (!*s) break; s++; } parameters->cp_disto_alloc = 1; } break; /* ----------------------------------------------------- */ case 'q': /* add fixed_quality */ { char *s = opj_optarg; while (sscanf(s, "%f", ¶meters->tcp_distoratio[parameters->tcp_numlayers]) == 1) { parameters->tcp_numlayers++; while (*s && *s != ',') { s++; } if (!*s) break; s++; } parameters->cp_fixed_quality = 1; } break; /* dda */ /* ----------------------------------------------------- */ case 'f': /* mod fixed_quality (before : -q) */ { int *row = NULL, *col = NULL; int numlayers = 0, numresolution = 0, matrix_width = 0; char *s = opj_optarg; sscanf(s, "%d", &numlayers); s++; if (numlayers > 9) s++; parameters->tcp_numlayers = numlayers; numresolution = parameters->numresolution; matrix_width = numresolution * 3; parameters->cp_matrice = (int *) opj_malloc(numlayers * matrix_width * sizeof(int)); s = s + 2; for (i = 0; i < numlayers; i++) { row = ¶meters->cp_matrice[i * matrix_width]; col = row; parameters->tcp_rates[i] = 1; sscanf(s, "%d,", &col[0]); s += 2; if (col[0] > 9) s++; col[1] = 0; col[2] = 0; for (j = 1; j < numresolution; j++) { col += 3; sscanf(s, "%d,%d,%d", &col[0], &col[1], &col[2]); s += 6; if (col[0] > 9) s++; if (col[1] > 9) s++; if (col[2] > 9) s++; } if (i < numlayers - 1) s++; } parameters->cp_fixed_alloc = 1; } break; /* ----------------------------------------------------- */ case 't': /* tiles */ { sscanf(opj_optarg, "%d,%d", ¶meters->cp_tdx, ¶meters->cp_tdy); parameters->tile_size_on = OPJ_TRUE; } break; /* ----------------------------------------------------- */ case 'n': /* resolution */ { sscanf(opj_optarg, "%d", ¶meters->numresolution); } break; /* ----------------------------------------------------- */ case 'c': /* precinct dimension */ { char sep; int res_spec = 0; char *s = opj_optarg; do { sep = 0; sscanf(s, "[%d,%d]%c", ¶meters->prcw_init[res_spec], ¶meters->prch_init[res_spec], &sep); parameters->csty |= 0x01; res_spec++; s = strpbrk(s, "]") + 2; } while (sep == ','); parameters->res_spec = res_spec; } break; /* ----------------------------------------------------- */ case 'b': /* code-block dimension */ { int cblockw_init = 0, cblockh_init = 0; sscanf(opj_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; } parameters->cblockw_init = cblockw_init; parameters->cblockh_init = cblockh_init; } break; /* ----------------------------------------------------- */ case 'x': /* creation of index file */ { char *index = opj_optarg; strncpy(indexfilename, index, OPJ_PATH_LEN); } break; /* ----------------------------------------------------- */ case 'p': /* progression order */ { char progression[4]; strncpy(progression, opj_optarg, 4); parameters->prog_order = give_progression(progression); if (parameters->prog_order == -1) { fprintf(stderr, "Unrecognized progression order " "[LRCP, RLCP, RPCL, PCRL, CPRL] !!\n"); return 1; } } break; /* ----------------------------------------------------- */ case 's': /* subsampling factor */ { if (sscanf(opj_optarg, "%d,%d", ¶meters->subsampling_dx, ¶meters->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(opj_optarg, "%d,%d", ¶meters->image_offset_x0, ¶meters->image_offset_y0) != 2) { fprintf(stderr, "-d 'coordonnate of the reference grid' argument " "error !! [-d x0,y0]\n"); return 1; } } break; /* ----------------------------------------------------- */ case 'h': /* display an help description */ encode_help_display(); return 1; /* ----------------------------------------------------- */ case 'P': /* POC */ { int numpocs = 0; /* number of progression order change (POC) default 0 */ opj_poc_t *POC = NULL; /* POC : used in case of Progression order change */ char *s = opj_optarg; POC = parameters->POC; while (sscanf(s, "T%d=%d,%d,%d,%d,%d,%4s", &POC[numpocs].tile, &POC[numpocs].resno0, &POC[numpocs].compno0, &POC[numpocs].layno1, &POC[numpocs].resno1, &POC[numpocs].compno1, &POC[numpocs].progorder) == 7) { POC[numpocs].prg1 = give_progression(POC[numpocs].progorder); numpocs++; while (*s && *s != '/') { s++; } if (!*s) { break; } s++; } parameters->numpocs = numpocs; } break; /* ------------------------------------------------------ */ case 'S': /* SOP marker */ { parameters->csty |= 0x02; } break; /* ------------------------------------------------------ */ case 'E': /* EPH marker */ { parameters->csty |= 0x04; } break; /* ------------------------------------------------------ */ case 'M': /* Mode switch pas tous au point !! */ { int value = 0; if (sscanf(opj_optarg, "%d", &value) == 1) { for (i = 0; i <= 5; i++) { int cache = value & (1 << i); if (cache) parameters->mode |= (1 << i); } } } break; /* ------------------------------------------------------ */ case 'R': /* ROI */ { if (sscanf(opj_optarg, "c=%d,U=%d", ¶meters->roi_compno, ¶meters->roi_shift) != 2) { fprintf(stderr, "ROI error !! [-ROI c='compno',U='shift']\n"); return 1; } } break; /* ------------------------------------------------------ */ case 'T': /* Tile offset */ { if (sscanf(opj_optarg, "%d,%d", ¶meters->cp_tx0, ¶meters->cp_ty0) != 2) { fprintf(stderr, "-T 'tile offset' argument error !! [-T X0,Y0]"); return 1; } } break; /* ------------------------------------------------------ */ case 'C': /* add a comment */ { parameters->cp_comment = (char*)opj_malloc(strlen(opj_optarg) + 1); if(parameters->cp_comment) { strcpy(parameters->cp_comment, opj_optarg); } } break; /* ------------------------------------------------------ */ case 'I': /* reversible or not */ { parameters->irreversible = 1; } break; /* ------------------------------------------------------ */ case 'u': /* Tile part generation*/ { parameters->tp_flag = opj_optarg[0]; parameters->tp_on = 1; } break; /* ------------------------------------------------------ */ case 'z': /* Image Directory path */ { img_fol->imgdirpath = (char*)opj_malloc(strlen(opj_optarg) + 1); strcpy(img_fol->imgdirpath,opj_optarg); img_fol->set_imgdir=1; } break; /* ------------------------------------------------------ */ case 'w': /* Digital Cinema 2K profile compliance*/ { int fps=0; sscanf(opj_optarg,"%d",&fps); if(fps == 24){ parameters->cp_cinema = CINEMA2K_24; }else if(fps == 48 ){ parameters->cp_cinema = CINEMA2K_48; }else { fprintf(stderr,"Incorrect value!! must be 24 or 48\n"); return 1; } fprintf(stdout,"CINEMA 2K compliant codestream\n"); parameters->cp_rsiz = CINEMA2K; } break; /* ------------------------------------------------------ */ case 'y': /* Digital Cinema 4K profile compliance*/ { parameters->cp_cinema = CINEMA4K_24; fprintf(stdout,"CINEMA 4K compliant codestream\n"); parameters->cp_rsiz = CINEMA4K; } break; /* ------------------------------------------------------ */ /* UniPG>> */ #ifdef USE_JPWL /* ------------------------------------------------------ */ case 'W': /* JPWL capabilities switched on */ { char *token = NULL; int hprot, pprot, sens, addr, size, range; /* we need to enable indexing */ if (!indexfilename) { strncpy(indexfilename, JPWL_PRIVATEINDEX_NAME, OPJ_PATH_LEN); } /* search for different protection methods */ /* break the option in comma points and parse the result */ token = strtok(opj_optarg, ","); while(token != NULL) { /* search header error protection method */ if (*token == 'h') { static int tile = 0, tilespec = 0, lasttileno = 0; hprot = 1; /* predefined method */ if(sscanf(token, "h=%d", &hprot) == 1) { /* Main header, specified */ if (!((hprot == 0) || (hprot == 1) || (hprot == 16) || (hprot == 32) || ((hprot >= 37) && (hprot <= 128)))) { fprintf(stderr, "ERROR -> invalid main header protection method h = %d\n", hprot); return 1; } parameters->jpwl_hprot_MH = hprot; } else if(sscanf(token, "h%d=%d", &tile, &hprot) == 2) { /* Tile part header, specified */ if (!((hprot == 0) || (hprot == 1) || (hprot == 16) || (hprot == 32) || ((hprot >= 37) && (hprot <= 128)))) { fprintf(stderr, "ERROR -> invalid tile part header protection method h = %d\n", hprot); return 1; } if (tile < 0) { fprintf(stderr, "ERROR -> invalid tile part number on protection method t = %d\n", tile); return 1; } if (tilespec < JPWL_MAX_NO_TILESPECS) { parameters->jpwl_hprot_TPH_tileno[tilespec] = lasttileno = tile; parameters->jpwl_hprot_TPH[tilespec++] = hprot; } } else if(sscanf(token, "h%d", &tile) == 1) { /* Tile part header, unspecified */ if (tile < 0) { fprintf(stderr, "ERROR -> invalid tile part number on protection method t = %d\n", tile); return 1; } if (tilespec < JPWL_MAX_NO_TILESPECS) { parameters->jpwl_hprot_TPH_tileno[tilespec] = lasttileno = tile; parameters->jpwl_hprot_TPH[tilespec++] = hprot; } } else if (!strcmp(token, "h")) { /* Main header, unspecified */ parameters->jpwl_hprot_MH = hprot; } else { fprintf(stderr, "ERROR -> invalid protection method selection = %s\n", token); return 1; }; } /* search packet error protection method */ if (*token == 'p') { static int pack = 0, tile = 0, packspec = 0, lastpackno = 0; pprot = 1; /* predefined method */ if (sscanf(token, "p=%d", &pprot) == 1) { /* Method for all tiles and all packets */ if (!((pprot == 0) || (pprot == 1) || (pprot == 16) || (pprot == 32) || ((pprot >= 37) && (pprot <= 128)))) { fprintf(stderr, "ERROR -> invalid default packet protection method p = %d\n", pprot); return 1; } parameters->jpwl_pprot_tileno[0] = 0; parameters->jpwl_pprot_packno[0] = 0; parameters->jpwl_pprot[0] = pprot; } else if (sscanf(token, "p%d=%d", &tile, &pprot) == 2) { /* method specified from that tile on */ if (!((pprot == 0) || (pprot == 1) || (pprot == 16) || (pprot == 32) || ((pprot >= 37) && (pprot <= 128)))) { fprintf(stderr, "ERROR -> invalid packet protection method p = %d\n", pprot); return 1; } if (tile < 0) { fprintf(stderr, "ERROR -> invalid tile part number on protection method p = %d\n", tile); return 1; } if (packspec < JPWL_MAX_NO_PACKSPECS) { parameters->jpwl_pprot_tileno[packspec] = tile; parameters->jpwl_pprot_packno[packspec] = 0; parameters->jpwl_pprot[packspec++] = pprot; } } else if (sscanf(token, "p%d:%d=%d", &tile, &pack, &pprot) == 3) { /* method fully specified from that tile and that packet on */ if (!((pprot == 0) || (pprot == 1) || (pprot == 16) || (pprot == 32) || ((pprot >= 37) && (pprot <= 128)))) { fprintf(stderr, "ERROR -> invalid packet protection method p = %d\n", pprot); return 1; } if (tile < 0) { fprintf(stderr, "ERROR -> invalid tile part number on protection method p = %d\n", tile); return 1; } if (pack < 0) { fprintf(stderr, "ERROR -> invalid packet number on protection method p = %d\n", pack); return 1; } if (packspec < JPWL_MAX_NO_PACKSPECS) { parameters->jpwl_pprot_tileno[packspec] = tile; parameters->jpwl_pprot_packno[packspec] = pack; parameters->jpwl_pprot[packspec++] = pprot; } } else if (sscanf(token, "p%d:%d", &tile, &pack) == 2) { /* default method from that tile and that packet on */ if (!((pprot == 0) || (pprot == 1) || (pprot == 16) || (pprot == 32) || ((pprot >= 37) && (pprot <= 128)))) { fprintf(stderr, "ERROR -> invalid packet protection method p = %d\n", pprot); return 1; } if (tile < 0) { fprintf(stderr, "ERROR -> invalid tile part number on protection method p = %d\n", tile); return 1; } if (pack < 0) { fprintf(stderr, "ERROR -> invalid packet number on protection method p = %d\n", pack); return 1; } if (packspec < JPWL_MAX_NO_PACKSPECS) { parameters->jpwl_pprot_tileno[packspec] = tile; parameters->jpwl_pprot_packno[packspec] = pack; parameters->jpwl_pprot[packspec++] = pprot; } } else if (sscanf(token, "p%d", &tile) == 1) { /* default from a tile on */ if (tile < 0) { fprintf(stderr, "ERROR -> invalid tile part number on protection method p = %d\n", tile); return 1; } if (packspec < JPWL_MAX_NO_PACKSPECS) { parameters->jpwl_pprot_tileno[packspec] = tile; parameters->jpwl_pprot_packno[packspec] = 0; parameters->jpwl_pprot[packspec++] = pprot; } } else if (!strcmp(token, "p")) { /* all default */ parameters->jpwl_pprot_tileno[0] = 0; parameters->jpwl_pprot_packno[0] = 0; parameters->jpwl_pprot[0] = pprot; } else { fprintf(stderr, "ERROR -> invalid protection method selection = %s\n", token); return 1; }; } /* search sensitivity method */ if (*token == 's') { static int tile = 0, tilespec = 0, lasttileno = 0; sens = 0; /* predefined: relative error */ if(sscanf(token, "s=%d", &sens) == 1) { /* Main header, specified */ if ((sens < -1) || (sens > 7)) { fprintf(stderr, "ERROR -> invalid main header sensitivity method s = %d\n", sens); return 1; } parameters->jpwl_sens_MH = sens; } else if(sscanf(token, "s%d=%d", &tile, &sens) == 2) { /* Tile part header, specified */ if ((sens < -1) || (sens > 7)) { fprintf(stderr, "ERROR -> invalid tile part header sensitivity method s = %d\n", sens); return 1; } if (tile < 0) { fprintf(stderr, "ERROR -> invalid tile part number on sensitivity method t = %d\n", tile); return 1; } if (tilespec < JPWL_MAX_NO_TILESPECS) { parameters->jpwl_sens_TPH_tileno[tilespec] = lasttileno = tile; parameters->jpwl_sens_TPH[tilespec++] = sens; } } else if(sscanf(token, "s%d", &tile) == 1) { /* Tile part header, unspecified */ if (tile < 0) { fprintf(stderr, "ERROR -> invalid tile part number on sensitivity method t = %d\n", tile); return 1; } if (tilespec < JPWL_MAX_NO_TILESPECS) { parameters->jpwl_sens_TPH_tileno[tilespec] = lasttileno = tile; parameters->jpwl_sens_TPH[tilespec++] = hprot; } } else if (!strcmp(token, "s")) { /* Main header, unspecified */ parameters->jpwl_sens_MH = sens; } else { fprintf(stderr, "ERROR -> invalid sensitivity method selection = %s\n", token); return 1; }; parameters->jpwl_sens_size = 2; /* 2 bytes for default size */ } /* search addressing size */ if (*token == 'a') { static int tile = 0, tilespec = 0, lasttileno = 0; addr = 0; /* predefined: auto */ if(sscanf(token, "a=%d", &addr) == 1) { /* Specified */ if ((addr != 0) && (addr != 2) && (addr != 4)) { fprintf(stderr, "ERROR -> invalid addressing size a = %d\n", addr); return 1; } parameters->jpwl_sens_addr = addr; } else if (!strcmp(token, "a")) { /* default */ parameters->jpwl_sens_addr = addr; /* auto for default size */ } else { fprintf(stderr, "ERROR -> invalid addressing selection = %s\n", token); return 1; }; } /* search sensitivity size */ if (*token == 'z') { static int tile = 0, tilespec = 0, lasttileno = 0; size = 1; /* predefined: 1 byte */ if(sscanf(token, "z=%d", &size) == 1) { /* Specified */ if ((size != 0) && (size != 1) && (size != 2)) { fprintf(stderr, "ERROR -> invalid sensitivity size z = %d\n", size); return 1; } parameters->jpwl_sens_size = size; } else if (!strcmp(token, "a")) { /* default */ parameters->jpwl_sens_size = size; /* 1 for default size */ } else { fprintf(stderr, "ERROR -> invalid size selection = %s\n", token); return 1; }; } /* search range method */ if (*token == 'g') { static int tile = 0, tilespec = 0, lasttileno = 0; range = 0; /* predefined: 0 (packet) */ if(sscanf(token, "g=%d", &range) == 1) { /* Specified */ if ((range < 0) || (range > 3)) { fprintf(stderr, "ERROR -> invalid sensitivity range method g = %d\n", range); return 1; } parameters->jpwl_sens_range = range; } else if (!strcmp(token, "g")) { /* default */ parameters->jpwl_sens_range = range; } else { fprintf(stderr, "ERROR -> invalid range selection = %s\n", token); return 1; }; } /* next token or bust */ token = strtok(NULL, ","); }; /* some info */ fprintf(stdout, "Info: JPWL capabilities enabled\n"); parameters->jpwl_epc_on = true; } break; #endif /* USE_JPWL */ /* < Command line not valid\n"); return 1; } } /* check for possible errors */ if (parameters->cp_cinema){ if(parameters->tcp_numlayers > 1){ parameters->cp_rsiz = STD_RSIZ; fprintf(stdout,"Warning: DC profiles do not allow more than one quality layer. The codestream created will not be compliant with the DC profile\n"); } } if ((parameters->cp_disto_alloc || parameters->cp_fixed_alloc || parameters->cp_fixed_quality) && (!(parameters->cp_disto_alloc ^ parameters->cp_fixed_alloc ^ parameters->cp_fixed_quality))) { fprintf(stderr, "Error: options -r -q and -f cannot be used together !!\n"); return 1; } /* mod fixed_quality */ /* if no rate entered, lossless by default */ if (parameters->tcp_numlayers == 0) { parameters->tcp_rates[0] = 0; /* MOD antonin : losslessbug */ parameters->tcp_numlayers++; parameters->cp_disto_alloc = 1; } if((parameters->cp_tx0 > parameters->image_offset_x0) || (parameters->cp_ty0 > parameters->image_offset_y0)) { fprintf(stderr, "Error: Tile offset dimension is unnappropriate --> TX0(%d)<=IMG_X0(%d) TYO(%d)<=IMG_Y0(%d) \n", parameters->cp_tx0, parameters->image_offset_x0, parameters->cp_ty0, parameters->image_offset_y0); return 1; } for (i = 0; i < parameters->numpocs; i++) { if (parameters->POC[i].prg == -1) { fprintf(stderr, "Unrecognized progression order in option -P (POC n %d) [LRCP, RLCP, RPCL, PCRL, CPRL] !!\n", i + 1); } } return 0; } /** Create the same index as j2k_create_index does, but in an int[] instead of in a file ==> easy to pass it back to Java, to transfer it etc. @param buffer_size, increased by the length of the compressed index, in number of bytes @return a pointer to a char[] Syntax of the index: one char for the version number (1): one byte because no problem with little endian, big endian etc. one int for each of the following informations: Image Width Image Height progression order Tile width Tile height Nb tiles in X Nb tiles in Y Nb of components Nb of layers Nb of resolutions for each resolution: Precinct width Precinct height End main header position codestream size For each tile: tile number tile start pos in codestream tile header end position tile end position in codestream For each LRCP, RLCP etc.: packet number tile number layer number resolution number component number precinct number start position in the codestream end position of this packet */ static char* create_index_into_byte_array(opj_codestream_info_t *cstr_info, int* buffer_size) { int tileno, compno, layno, resno, precno, pack_nb, x, y; char* buffer = NULL; int buffer_pos = 0; int prec_max = 0; prec_max = 0; for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) { for (resno = 0; resno < cstr_info->numdecompos[0] + 1; resno++) { prec_max = int_max(prec_max,cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno]); } } /* Compute the size of the index buffer, in number of bytes*/ *buffer_size = 1 /* version */ + (10 /* image_w until decomposition */ + (cstr_info->numdecompos[0]+1) * 2 /* pdx size for each tile */ + 2 /* main_head_end + codestream_size */ + cstr_info->tw * cstr_info->th * 4 /* tile info, without distorsion info */ + cstr_info->tw*cstr_info->th * cstr_info->numlayers * (cstr_info->numdecompos[0] + 1) * cstr_info->numcomps * prec_max *8 ) * sizeof(int); /*printf("C: index buffer size = %d bytes\n", *buffer_size);*/ buffer = (char*) opj_malloc(*buffer_size); if (!buffer) { /*opj_event_msg(j2k->cinfo, EVT_ERROR, "failed to allocate index buffer for writing %d int\n", *buffer_size);*/ fprintf(stderr, "failed to allocate index buffer for writing %d int\n", *buffer_size); return 0; } buffer[0] = 1; /* Version stored on a byte*/ buffer++; /* Remaining informations are stored on a int.*/ ((int*)buffer)[buffer_pos++] = cstr_info->image_w; ((int*)buffer)[buffer_pos++] = cstr_info->image_h; ((int*)buffer)[buffer_pos++] = cstr_info->prog; ((int*)buffer)[buffer_pos++] = cstr_info->tile_x; ((int*)buffer)[buffer_pos++] = cstr_info->tile_y; ((int*)buffer)[buffer_pos++] = cstr_info->tw; ((int*)buffer)[buffer_pos++] = cstr_info->th; ((int*)buffer)[buffer_pos++] = cstr_info->numcomps; ((int*)buffer)[buffer_pos++] = cstr_info->numlayers; ((int*)buffer)[buffer_pos++] = cstr_info->numdecompos[0]; for (resno = cstr_info->numdecompos[0]; resno >= 0; resno--) { /* based on tile 0 */ ((int*)buffer)[buffer_pos++] = (1 << cstr_info->tile[0].pdx[resno]); ((int*)buffer)[buffer_pos++] = (1 << cstr_info->tile[0].pdx[resno]); } ((int*)buffer)[buffer_pos++] = cstr_info->main_head_end; ((int*)buffer)[buffer_pos++] = cstr_info->codestream_size; for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) { ((int*)buffer)[buffer_pos++] = cstr_info->tile[tileno].tileno; ((int*)buffer)[buffer_pos++] = cstr_info->tile[tileno].start_pos; ((int*)buffer)[buffer_pos++] = cstr_info->tile[tileno].end_header; ((int*)buffer)[buffer_pos++] = cstr_info->tile[tileno].end_pos; } for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) { int start_pos, end_pos; 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]; } if (cstr_info->prog == LRCP) { /* LRCP */ 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_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos; ((int*)buffer)[buffer_pos++] = pack_nb; ((int*)buffer)[buffer_pos++] = tileno; ((int*)buffer)[buffer_pos++] = layno; ((int*)buffer)[buffer_pos++] = resno; ((int*)buffer)[buffer_pos++] = compno; ((int*)buffer)[buffer_pos++] = precno; ((int*)buffer)[buffer_pos++] = start_pos; ((int*)buffer)[buffer_pos++] = end_pos; pack_nb++; } } } } } /* LRCP */ else if (cstr_info->prog == RLCP) { /* RLCP */ 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_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos; ((int*)buffer)[buffer_pos++] = pack_nb; ((int*)buffer)[buffer_pos++] = tileno; ((int*)buffer)[buffer_pos++] = resno; ((int*)buffer)[buffer_pos++] = layno; ((int*)buffer)[buffer_pos++] = compno; ((int*)buffer)[buffer_pos++] = precno; ((int*)buffer)[buffer_pos++] = start_pos; ((int*)buffer)[buffer_pos++] = end_pos; pack_nb++; } } } } } /* RLCP */ else if (cstr_info->prog == RPCL) { /* RPCL */ for (resno = 0; resno < max_numdecompos + 1; resno++) { /* 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 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++) { 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 ); 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_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos; ((int*)buffer)[buffer_pos++] = pack_nb; ((int*)buffer)[buffer_pos++] = tileno; ((int*)buffer)[buffer_pos++] = resno; ((int*)buffer)[buffer_pos++] = precno; ((int*)buffer)[buffer_pos++] = compno; ((int*)buffer)[buffer_pos++] = layno; ((int*)buffer)[buffer_pos++] = start_pos; ((int*)buffer)[buffer_pos++] = end_pos; pack_nb++; } } }/* x = x0..x1 */ } } /* y = y0..y1 */ } /* precno */ } /* compno */ } /* resno */ } /* RPCL */ else if (cstr_info->prog == 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; for (compno = 0; compno < cstr_info->numcomps; compno++) { for (resno = 0; resno < max_numdecompos + 1; resno++) { 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++) { 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 ); 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_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos; ((int*)buffer)[buffer_pos++] = pack_nb; ((int*)buffer)[buffer_pos++] = tileno; ((int*)buffer)[buffer_pos++] = precno; ((int*)buffer)[buffer_pos++] = compno; ((int*)buffer)[buffer_pos++] = resno; ((int*)buffer)[buffer_pos++] = layno; ((int*)buffer)[buffer_pos++] = start_pos; ((int*)buffer)[buffer_pos++] = end_pos; pack_nb++; } } }/* x = x0..x1 */ } } /* y = y0..y1 */ } /* precno */ } /* resno */ } /* compno */ } /* PCRL */ else { /* CPRL */ 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 (resno = 0; resno < max_numdecompos + 1; resno++) { 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++) { 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 ); 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_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos; ((int*)buffer)[buffer_pos++] = pack_nb; ((int*)buffer)[buffer_pos++] = tileno; ((int*)buffer)[buffer_pos++] = compno; ((int*)buffer)[buffer_pos++] = precno; ((int*)buffer)[buffer_pos++] = resno; ((int*)buffer)[buffer_pos++] = layno; ((int*)buffer)[buffer_pos++] = start_pos; ((int*)buffer)[buffer_pos++] = end_pos; pack_nb++; } } }/* x = x0..x1 */ } } /* y = y0..y1 */ } /* precno */ } /* resno */ } /* compno */ } /* CPRL */ } /* tileno */ if (buffer_pos > *buffer_size) { /*opj_event_msg(j2k->cinfo, EVT_ERROR, "index creation: buffer_pos (%d) > buffer_size (%d)!\n", buffer_pos, *buffer_size);*/ fprintf(stderr, "index creation: buffer_pos (%d) > buffer_size (%d)!\n", buffer_pos, *buffer_size); return 0; } return --buffer; } /* -------------------------------------------------------------------------- ------------ Get the image byte[] from the Java object -------------------*/ static opj_image_t* loadImage(opj_cparameters_t *parameters, JNIEnv *env, jobject obj, jclass cls) { int i,max,shift,w,h,depth; opj_image_t * img = NULL; int compno, numcomps; opj_image_t * image = NULL; opj_image_comp_t *comp; opj_image_cmptparm_t cmptparm[3]; /* maximum of 3 components */ OPJ_COLOR_SPACE color_space; jfieldID fid; jint ji; jbyteArray jba; jshortArray jsa; jintArray jia; int len; jbyte *jbBody; jshort *jsBody; jint *jiBody; jboolean isCopy; /* Image width, height and depth*/ fid = (*env)->GetFieldID(env, cls,"width", "I"); ji = (*env)->GetIntField(env, obj, fid); w = ji; fid = (*env)->GetFieldID(env, cls,"height", "I"); ji = (*env)->GetIntField(env, obj, fid); h = ji; fid = (*env)->GetFieldID(env, cls,"depth", "I"); ji = (*env)->GetIntField(env, obj, fid); depth = ji; /* Read the image*/ if (depth <=16) { numcomps = 1; color_space = CLRSPC_GRAY; } else { numcomps = 3; color_space = CLRSPC_SRGB; } memset(&cmptparm[0], 0, numcomps * sizeof(opj_image_cmptparm_t)); if (numcomps == 1) { cmptparm[0].x0 = parameters->image_offset_x0; cmptparm[0].y0 = parameters->image_offset_y0; cmptparm[0].w = !cmptparm[0].x0 ? (w - 1) * parameters->subsampling_dx + 1 : cmptparm[0].x0 + (w - 1) * parameters->subsampling_dx + 1; cmptparm[0].h = !cmptparm[0].y0 ? (h - 1) * parameters->subsampling_dy + 1 : cmptparm[0].y0 + (h - 1) * parameters->subsampling_dy + 1; /* Java types are always signed but we use them as unsigned types (shift of the negative part of the pixels of the images in Telemis before entering the encoder).*/ cmptparm[0].sgnd = 0; if (depth<=16) cmptparm[0].prec=depth; else cmptparm[0].prec = 8; cmptparm[0].bpp = cmptparm[0].prec; cmptparm[0].dx = parameters->subsampling_dx; cmptparm[0].dy = parameters->subsampling_dy; /*printf("C: component 0 initialised: x0=%d, y0=%d, w=%d, h=%d, sgnd=%d, bpp=%d, dx=%d, dy=%d, color_space=%d\n", cmptparm[0].x0, cmptparm[0].y0, cmptparm[0].w, cmptparm[0].h, cmptparm[0].sgnd, cmptparm[0].bpp, cmptparm[0].dx, cmptparm[0].dy, color_space);*/ } else { for(i = 0; i < numcomps; i++) { cmptparm[i].prec = 8; cmptparm[i].bpp = 8; cmptparm[i].sgnd = 0; cmptparm[i].dx = parameters->subsampling_dx; cmptparm[i].dy = parameters->subsampling_dy; cmptparm[i].w = w; cmptparm[i].h = h; } } /* create the image */ image = opj_image_create(numcomps, &cmptparm[0], color_space); if (!image) return NULL; if (depth <=16) { image->numcomps=1; } else { image->numcomps = 3; } /* set image offset and reference grid */ image->x0 = cmptparm[0].x0; image->y0 = cmptparm[0].x0; image->x1 = cmptparm[0].w; image->y1 = cmptparm[0].h; /* set image data */ for (compno=0; compnocomps[compno]; max = -100000; if (depth == 8) { fid = (*env)->GetFieldID(env, cls,"image8", "[B"); /* byteArray []*/ jba = (*env)->GetObjectField(env, obj, fid); len = (*env)->GetArrayLength(env, jba); jbBody = (*env)->GetPrimitiveArrayCritical(env, jba, &isCopy); /*printf("C: before transfering 8 bpp image\n");*/ if (comp->sgnd) { for(i=0; i< len;i++) { comp->data[i] = (char) jbBody[i]; if (comp->data[i] > max) max = comp->data[i]; } } else { for(i=0; i< len;i++) { comp->data[i] = (unsigned char) jbBody[i]; if (comp->data[i] > max) max = comp->data[i]; } } (*env)->ReleasePrimitiveArrayCritical(env, jba, jbBody, 0); } else if(depth == 16) { fid = (*env)->GetFieldID(env, cls,"image16", "[S"); /* shortArray []*/ jsa = (*env)->GetObjectField(env, obj, fid); len = (*env)->GetArrayLength(env, jsa); jsBody = (*env)->GetPrimitiveArrayCritical(env, jsa, &isCopy); /*printf("C: before transfering 16 bpp image\n");*/ if (comp->sgnd) { /* Special behaviour to deal with signed elements ??*/ comp->data[i] = (short) jsBody[i]; for(i=0; i< len;i++) { if (comp->data[i] > max) max = comp->data[i]; } } else { for(i=0; i< len;i++) { comp->data[i] = (unsigned short) jsBody[i]; if (comp->data[i] > max) max = comp->data[i]; } } (*env)->ReleasePrimitiveArrayCritical(env, jsa, jsBody, 0); } else if (depth == 24) { fid = (*env)->GetFieldID(env, cls,"image24", "[I"); /* intArray []*/ jia = (*env)->GetObjectField(env, obj, fid); len = (*env)->GetArrayLength(env, jia); shift = compno*8; jiBody = (*env)->GetPrimitiveArrayCritical(env, jia, &isCopy); /*printf("C: before transfering 24 bpp image (component %d, signed = %d)\n", compno, comp->sgnd);*/ if (comp->sgnd) { /* Special behaviour to deal with signed elements ?? XXXXX*/ for(i=0; i< len;i++) { comp->data[i] = ( ((int) jiBody[i]) & (0xFF << shift) ) >> shift; if (comp->data[i] > max) max = comp->data[i]; } } else { for(i=0; i< len;i++) { comp->data[i] = ( ((unsigned int) jiBody[i]) & (0xFF << shift) ) >> shift; if (comp->data[i] > max) max = comp->data[i]; } } (*env)->ReleasePrimitiveArrayCritical(env, jia, jiBody, 0); } comp->bpp = int_floorlog2(max)+1; comp->prec = comp->bpp; /*printf("C: component %d: max %d, real bpp = %d\n", compno, max, comp->bpp);*/ } return image; } /* -------------------------------------------------------------------------- -------------------- MAIN METHOD, CALLED BY JAVA -----------------------*/ JNIEXPORT jlong JNICALL Java_org_openJpeg_OpenJPEGJavaEncoder_internalEncodeImageToJ2K(JNIEnv *env, jobject obj, jobjectArray javaParameters) { int argc; /* To simulate the command line parameters (taken from the javaParameters variable) and be able to re-use the */ char **argv; /* 'parse_cmdline_decoder' method taken from the j2k_to_image project */ opj_bool bSuccess; opj_cparameters_t parameters; /* compression parameters */ img_fol_t img_fol; opj_event_mgr_t event_mgr; /* event manager */ opj_image_t *image = NULL; int i,j,num_images; int imageno; opj_codestream_info_t cstr_info; /* Codestream information structure */ char indexfilename[OPJ_PATH_LEN]; /* index file name */ char* compressed_index = NULL; int compressed_index_size=-1; /* ==> Access variables to the Java member variables*/ jsize arraySize; jclass cls; jobject object; jboolean isCopy; jfieldID fid; jbyteArray jba; jbyte *jbBody; callback_variables_t msgErrorCallback_vars; /* <== access variable to the Java member variables.*/ /* For the encoding and storage into the file*/ opj_cinfo_t* cinfo; int codestream_length; opj_cio_t *cio = NULL; FILE *f = NULL; /* JNI reference to the calling class*/ cls = (*env)->GetObjectClass(env, obj); /* Pointers to be able to call a Java method for all the info and error messages*/ msgErrorCallback_vars.env = env; msgErrorCallback_vars.jobj = &obj; msgErrorCallback_vars.message_mid = (*env)->GetMethodID(env, cls, "logMessage", "(Ljava/lang/String;)V"); msgErrorCallback_vars.error_mid = (*env)->GetMethodID(env, cls, "logError", "(Ljava/lang/String;)V"); arraySize = (*env)->GetArrayLength(env, javaParameters); argc = (int) arraySize +1; argv = opj_malloc(argc*sizeof(char*)); argv[0] = "ProgramName.exe"; /* The program name: useless*/ j=0; for (i=1; iGetObjectArrayElement(env, javaParameters, i-1); argv[i] = (char*)(*env)->GetStringUTFChars(env, object, &isCopy); } /*printf("C: "); for (i=0; iReleaseStringUTFChars(env, (*env)->GetObjectArrayElement(env, javaParameters, i-1), argv[i]); return -1; } /* Release the Java arguments array*/ for (i=1; iReleaseStringUTFChars(env, (*env)->GetObjectArrayElement(env, javaParameters, i-1), argv[i]); if (parameters.cp_cinema){ cinema_parameters(¶meters); } /* Create comment for codestream */ if(parameters.cp_comment == NULL) { const char comment[] = "Created by JavaOpenJPEG version "; const size_t clen = strlen(comment); const char *version = opj_version(); /* UniPG>> */ #ifdef USE_JPWL parameters.cp_comment = (char*)opj_malloc(clen+strlen(version)+11); sprintf(parameters.cp_comment,"%s%s with JPWL", comment, version); #else parameters.cp_comment = (char*)opj_malloc(clen+strlen(version)+1); sprintf(parameters.cp_comment,"%s%s", comment, version); #endif /* <numcomps == 3 ? 1 : 0; if(parameters.cp_cinema){ cinema_setup_encoder(¶meters,image,&img_fol); } /* encode the destination image */ /* ---------------------------- */ /* get a J2K compressor handle */ if (parameters.cod_format == J2K_CFMT) { /* J2K format output */ cinfo = opj_create_compress(CODEC_J2K); } else { /* JP2 format output */ cinfo = opj_create_compress(CODEC_JP2); } /* catch events using our callbacks and give a local context */ opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, &msgErrorCallback_vars); /* setup the encoder parameters using the current image and user parameters */ opj_setup_encoder(cinfo, ¶meters, image); /* open a byte stream for writing */ /* allocate memory for all tiles */ cio = opj_cio_open((opj_common_ptr)cinfo, NULL, 0); /* encode the image */ bSuccess = opj_encode_with_info(cinfo, cio, image, &cstr_info); printf("C: after opj_encode_with_info\n"); if (!bSuccess) { opj_cio_close(cio); fprintf(stderr, "failed to encode image\n"); return -1; } codestream_length = cio_tell(cio); /* write the index on disk, if needed (-x 'filename') */ if (*indexfilename) { bSuccess = write_index_file(&cstr_info, indexfilename); if (bSuccess) { fprintf(stderr, "Failed to output index file into [%s]\n", indexfilename); } } compressed_index = create_index_into_byte_array(&cstr_info, &compressed_index_size); /* Allocates the Java compressedIndex byte[] and sends this index into the Java object */ fid = (*env)->GetFieldID(env, cls,"compressedIndex", "[B"); jba = (*env)->NewByteArray(env, compressed_index_size+1); jbBody = (*env)->GetPrimitiveArrayCritical(env, jba, 0); memcpy(jbBody, compressed_index, compressed_index_size); (*env)->ReleasePrimitiveArrayCritical(env, jba, jbBody, 0); (*env)->SetObjectField(env, obj, fid, jba); opj_free(compressed_index); /* write the generated codestream to disk ? */ if (parameters.outfile[0]!='\0') { f = fopen(parameters.outfile, "wb"); if (!f) { fprintf(stderr, "failed to open [%s] for writing\n", parameters.outfile); return -1; } fwrite(cio->buffer, 1, codestream_length, f); fclose(f); fprintf(stdout,"Generated outfile [%s]\n",parameters.outfile); } /* Write the generated codestream to the Java pre-allocated compressedStream byte[] */ fid = (*env)->GetFieldID(env, cls,"compressedStream", "[B"); jba = (*env)->GetObjectField(env, obj, fid); jbBody = (*env)->GetPrimitiveArrayCritical(env, jba, 0); memcpy(jbBody, cio->buffer, codestream_length); (*env)->ReleasePrimitiveArrayCritical(env, jba, jbBody, 0); /* close and free the byte stream */ opj_cio_close(cio); /* free remaining compression structures */ opj_destroy_compress(cinfo); opj_destroy_cstr_info(&cstr_info); /* free image data */ opj_image_destroy(image); } /* free user parameters structure */ if(parameters.cp_comment) opj_free(parameters.cp_comment); if(parameters.cp_matrice) opj_free(parameters.cp_matrice); return codestream_length; } openjpeg-2.1.0/wrapping/java/openjp2/index.c000644 001750 001750 00000036651 12327650564 022100 0ustar00mathieumathieu000000 000000 /* * 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 #include #include #include "openjpeg.h" #include "index.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 */ /* <tile[0].distotile) 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); /* <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++) { int 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 == 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 %6d %6d %7d", 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 == 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 %9d %9d %7d", 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 == 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 %9d %9d %7d", 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 == 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 %9d %9d %7d", 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 %9d %9d %7d", 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%9d %9d\n", cstr_info->marker[x].type, cstr_info->marker[x].pos, cstr_info->marker[x].len); } /* < /* Header for class org_openJpeg_OpenJPEGJavaEncoder */ #ifndef _Included_org_openJpeg_OpenJPEGJavaEncoder #define _Included_org_openJpeg_OpenJPEGJavaEncoder #ifdef __cplusplus extern "C" { #endif /* * Class: org_openJpeg_OpenJPEGJavaEncoder * Method: internalEncodeImageToJ2K * Signature: ([Ljava/lang/String;)J */ JNIEXPORT jlong JNICALL Java_org_openJpeg_OpenJPEGJavaEncoder_internalEncodeImageToJ2K (JNIEnv *, jobject, jobjectArray); #ifdef __cplusplus } #endif #endif openjpeg-2.1.0/wrapping/java/openjp2/JavaOpenJPEGDecoder.c000644 001750 001750 00000067662 12327650564 024436 0ustar00mathieumathieu000000 000000 /* * 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) 2007, Patrick Piscaglia (Telemis) * 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 #include #include #include #include #include "openjpeg.h" #include "opj_includes.h" #include "opj_getopt.h" #include "convert.h" #include "dirent.h" #include "org_openJpeg_OpenJPEGJavaDecoder.h" #ifndef _WIN32 #define stricmp strcasecmp #define strnicmp strncasecmp #endif #include "format_defs.h" typedef struct callback_variables { JNIEnv *env; /** 'jclass' object used to call a Java method from the C */ jobject *jobj; /** 'jclass' object used to call a Java method from the C */ jmethodID message_mid; jmethodID error_mid; } callback_variables_t; typedef struct dircnt{ /** Buffer for holding images read from Directory*/ char *filename_buf; /** Pointer to the buffer*/ char **filename; }dircnt_t; typedef struct img_folder{ /** The directory path of the folder containing input images*/ char *imgdirpath; /** Output format*/ char *out_format; /** Enable option*/ char set_imgdir; /** Enable Cod Format for output*/ char set_out_format; }img_fol_t; void decode_help_display() { fprintf(stdout,"HELP\n----\n\n"); fprintf(stdout,"- the -h option displays this help information on screen\n\n"); /* UniPG>> */ fprintf(stdout,"List of parameters for the JPEG 2000 " #ifdef USE_JPWL "+ JPWL " #endif /* USE_JPWL */ "decoder:\n"); /* < \n"); fprintf(stdout," Currently accepts PGM, PPM, PNM, PGX, BMP format\n"); fprintf(stdout," -i \n"); fprintf(stdout," REQUIRED only if an Input image directory not specified\n"); fprintf(stdout," Currently accepts J2K-files, JP2-files and JPT-files. The file type\n"); fprintf(stdout," is identified based on its suffix.\n"); fprintf(stdout," -o \n"); fprintf(stdout," REQUIRED\n"); fprintf(stdout," Currently accepts PGM-files, PPM-files, PNM-files, PGX-files and\n"); fprintf(stdout," BMP-files. Binary data is written to the file (not ascii). If a PGX\n"); fprintf(stdout," filename is given, there will be as many output files as there are\n"); fprintf(stdout," components: an indice starting from 0 will then be appended to the\n"); fprintf(stdout," output filename, just before the \"pgx\" extension. If a PGM filename\n"); fprintf(stdout," is given and there are more than one component, only the first component\n"); fprintf(stdout," will be written to the file.\n"); fprintf(stdout," -r \n"); fprintf(stdout," Set the number of highest resolution levels to be discarded. The\n"); fprintf(stdout," image resolution is effectively divided by 2 to the power of the\n"); fprintf(stdout," number of discarded levels. The reduce factor is limited by the\n"); fprintf(stdout," smallest total number of decomposition levels among tiles.\n"); fprintf(stdout," -l \n"); fprintf(stdout," Set the maximum number of quality layers to decode. If there are\n"); fprintf(stdout," less quality layers than the specified number, all the quality layers\n"); fprintf(stdout," are decoded.\n"); /* UniPG>> */ #ifdef USE_JPWL fprintf(stdout," -W \n"); fprintf(stdout," Activates the JPWL correction capability, if the codestream complies.\n"); fprintf(stdout," Options can be a comma separated list of tokens:\n"); fprintf(stdout," c, c=numcomps\n"); fprintf(stdout," numcomps is the number of expected components in the codestream\n"); fprintf(stdout," (search of first EPB rely upon this, default is %d)\n", JPWL_EXPECTED_COMPONENTS); #endif /* USE_JPWL */ /* <d_name)==0 || strcmp("..",content->d_name)==0 ) continue; num_images++; } return num_images; } int load_images(dircnt_t *dirptr, char *imgdirpath){ DIR *dir; struct dirent* content; int i = 0; /*Reading the input images from given input directory*/ dir= opendir(imgdirpath); if(!dir){ fprintf(stderr,"Could not open Folder %s\n",imgdirpath); return 1; }else { fprintf(stderr,"Folder opened successfully\n"); } while((content=readdir(dir))!=NULL){ if(strcmp(".",content->d_name)==0 || strcmp("..",content->d_name)==0 ) continue; strcpy(dirptr->filename[i],content->d_name); i++; } return 0; } int get_file_format(char *filename) { unsigned int i; static const char *extension[] = {"pgx", "pnm", "pgm", "ppm", "bmp","tif", "raw", "tga", "j2k", "jp2", "jpt", "j2c" }; static const int format[] = { PGX_DFMT, PXM_DFMT, PXM_DFMT, PXM_DFMT, BMP_DFMT, TIF_DFMT, RAW_DFMT, TGA_DFMT, J2K_CFMT, JP2_CFMT, JPT_CFMT, J2K_CFMT }; char * ext = strrchr(filename, '.'); if (ext == NULL) return -1; ext++; if(ext) { for(i = 0; i < sizeof(format)/sizeof(*format); i++) { if(strnicmp(ext, extension[i], 3) == 0) { return format[i]; } } } return -1; } /* -------------------------------------------------------------------------- */ int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters,img_fol_t *img_fol) { /* parse the command line */ int totlen; opj_option_t long_option[]={ {"ImgDir",REQ_ARG, NULL ,'y'}, {"OutFor",REQ_ARG, NULL ,'O'}, }; /* UniPG>> */ const char optlist[] = "i:o:r:l:hx:" #ifdef USE_JPWL "W:" #endif /* USE_JPWL */ ; /*for (i=0; iset_out_format = 0; reset_options_reading(); while (1) { int c = opj_getopt_long(argc, argv,optlist,long_option,totlen); if (c == -1) break; switch (c) { case 'i': /* input file */ { char *infile = opj_optarg; parameters->decod_format = get_file_format(infile); switch(parameters->decod_format) { case J2K_CFMT: case JP2_CFMT: case JPT_CFMT: break; default: fprintf(stderr, "!! Unrecognized format for infile : %s [accept only *.j2k, *.jp2, *.jpc or *.jpt] !!\n\n", infile); return 1; } strncpy(parameters->infile, infile, sizeof(parameters->infile)-1); } break; /* ----------------------------------------------------- */ case 'o': /* output file */ { char *outfile = opj_optarg; parameters->cod_format = get_file_format(outfile); switch(parameters->cod_format) { case PGX_DFMT: case PXM_DFMT: case BMP_DFMT: case TIF_DFMT: case RAW_DFMT: case TGA_DFMT: break; default: fprintf(stderr, "Unknown output format image %s [only *.pnm, *.pgm, *.ppm, *.pgx, *.bmp, *.tif, *.raw or *.tga]!! \n", outfile); return 1; } strncpy(parameters->outfile, outfile, sizeof(parameters->outfile)-1); } break; /* ----------------------------------------------------- */ case 'O': /* output format */ { char outformat[50]; char *of = opj_optarg; sprintf(outformat,".%s",of); img_fol->set_out_format = 1; parameters->cod_format = get_file_format(outformat); switch(parameters->cod_format) { case PGX_DFMT: img_fol->out_format = "pgx"; break; case PXM_DFMT: img_fol->out_format = "ppm"; break; case BMP_DFMT: img_fol->out_format = "bmp"; break; case TIF_DFMT: img_fol->out_format = "tif"; break; case RAW_DFMT: img_fol->out_format = "raw"; break; case TGA_DFMT: img_fol->out_format = "raw"; break; default: fprintf(stderr, "Unknown output format image %s [only *.pnm, *.pgm, *.ppm, *.pgx, *.bmp, *.tif, *.raw or *.tga]!! \n", outformat); return 1; break; } } break; /* ----------------------------------------------------- */ case 'r': /* reduce option */ { sscanf(opj_optarg, "%d", ¶meters->cp_reduce); } break; /* ----------------------------------------------------- */ case 'l': /* layering option */ { sscanf(opj_optarg, "%d", ¶meters->cp_layer); } break; /* ----------------------------------------------------- */ case 'h': /* display an help description */ decode_help_display(); return 1; /* ------------------------------------------------------ */ case 'y': /* Image Directory path */ { img_fol->imgdirpath = (char*)opj_malloc(strlen(opj_optarg) + 1); strcpy(img_fol->imgdirpath,opj_optarg); img_fol->set_imgdir=1; } break; /* ----------------------------------------------------- */ /* UniPG>> */ #ifdef USE_JPWL case 'W': /* activate JPWL correction */ { char *token = NULL; token = strtok(opj_optarg, ","); while(token != NULL) { /* search expected number of components */ if (*token == 'c') { static int compno; compno = JPWL_EXPECTED_COMPONENTS; /* predefined no. of components */ if(sscanf(token, "c=%d", &compno) == 1) { /* Specified */ if ((compno < 1) || (compno > 256)) { fprintf(stderr, "ERROR -> invalid number of components c = %d\n", compno); return 1; } parameters->jpwl_exp_comps = compno; } else if (!strcmp(token, "c")) { /* default */ parameters->jpwl_exp_comps = compno; /* auto for default size */ } else { fprintf(stderr, "ERROR -> invalid components specified = %s\n", token); return 1; }; } /* search maximum number of tiles */ if (*token == 't') { static int tileno; tileno = JPWL_MAXIMUM_TILES; /* maximum no. of tiles */ if(sscanf(token, "t=%d", &tileno) == 1) { /* Specified */ if ((tileno < 1) || (tileno > JPWL_MAXIMUM_TILES)) { fprintf(stderr, "ERROR -> invalid number of tiles t = %d\n", tileno); return 1; } parameters->jpwl_max_tiles = tileno; } else if (!strcmp(token, "t")) { /* default */ parameters->jpwl_max_tiles = tileno; /* auto for default size */ } else { fprintf(stderr, "ERROR -> invalid tiles specified = %s\n", token); return 1; }; } /* next token or bust */ token = strtok(NULL, ","); }; parameters->jpwl_correct = true; fprintf(stdout, "JPWL correction capability activated\n"); fprintf(stdout, "- expecting %d components\n", parameters->jpwl_exp_comps); } break; #endif /* USE_JPWL */ /* < this option is not valid \"-%c %s\"\n",c, opj_optarg); break; } } /* No check for possible errors before the -i and -o options are of course not mandatory*/ return 0; } /* -------------------------------------------------------------------------- */ /** error callback returning the message to Java andexpecting a callback_variables_t client object */ void error_callback(const char *msg, void *client_data) { callback_variables_t* vars = (callback_variables_t*) client_data; JNIEnv *env = vars->env; jstring jbuffer; jbuffer = (*env)->NewStringUTF(env, msg); (*env)->ExceptionClear(env); (*env)->CallVoidMethod(env, *(vars->jobj), vars->error_mid, jbuffer); if ((*env)->ExceptionOccurred(env)) { fprintf(stderr,"C: Exception during call back method\n"); (*env)->ExceptionDescribe(env); (*env)->ExceptionClear(env); } (*env)->DeleteLocalRef(env, jbuffer); } /** warning callback returning the message to Java andexpecting a callback_variables_t client object */ void warning_callback(const char *msg, void *client_data) { callback_variables_t* vars = (callback_variables_t*) client_data; JNIEnv *env = vars->env; jstring jbuffer; jbuffer = (*env)->NewStringUTF(env, msg); (*env)->ExceptionClear(env); (*env)->CallVoidMethod(env, *(vars->jobj), vars->message_mid, jbuffer); if ((*env)->ExceptionOccurred(env)) { fprintf(stderr,"C: Exception during call back method\n"); (*env)->ExceptionDescribe(env); (*env)->ExceptionClear(env); } (*env)->DeleteLocalRef(env, jbuffer); } /** information callback returning the message to Java andexpecting a callback_variables_t client object */ void info_callback(const char *msg, void *client_data) { callback_variables_t* vars = (callback_variables_t*) client_data; JNIEnv *env = vars->env; jstring jbuffer; jbuffer = (*env)->NewStringUTF(env, msg); (*env)->ExceptionClear(env); (*env)->CallVoidMethod(env, *(vars->jobj), vars->message_mid, jbuffer); if ((*env)->ExceptionOccurred(env)) { fprintf(stderr,"C: Exception during call back method\n"); (*env)->ExceptionDescribe(env); (*env)->ExceptionClear(env); } (*env)->DeleteLocalRef(env, jbuffer); } /* -------------------------------------------------------------------------- -------------------- MAIN METHOD, CALLED BY JAVA -----------------------*/ JNIEXPORT jint JNICALL Java_org_openJpeg_OpenJPEGJavaDecoder_internalDecodeJ2KtoImage(JNIEnv *env, jobject obj, jobjectArray javaParameters) { int argc; /* To simulate the command line parameters (taken from the javaParameters variable) and be able to re-use the */ char **argv; /* 'parse_cmdline_decoder' method taken from the j2k_to_image project */ opj_dparameters_t parameters; /* decompression parameters */ img_fol_t img_fol; opj_event_mgr_t event_mgr; /* event manager */ opj_image_t *image = NULL; FILE *fsrc = NULL; unsigned char *src = NULL; int file_length; int num_images; int i,j,imageno; opj_dinfo_t* dinfo = NULL; /* handle to a decompressor */ opj_cio_t *cio = NULL; int w,h; long min_value, max_value; short tempS; unsigned char tempUC, tempUC1, tempUC2; /* ==> Access variables to the Java member variables*/ jsize arraySize; jclass cls; jobject object; jboolean isCopy; jfieldID fid; jbyteArray jba; jshortArray jsa; jintArray jia; jbyte *jbBody, *ptrBBody; jshort *jsBody, *ptrSBody; jint *jiBody, *ptrIBody; callback_variables_t msgErrorCallback_vars; /* <=== access variable to Java member variables */ int *ptr, *ptr1, *ptr2; /* <== To transfer the decoded image to Java*/ /* configure the event callbacks */ memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); event_mgr.error_handler = error_callback; event_mgr.warning_handler = warning_callback; event_mgr.info_handler = info_callback; /* JNI reference to the calling class*/ cls = (*env)->GetObjectClass(env, obj); /* Pointers to be able to call a Java method for all the info and error messages*/ msgErrorCallback_vars.env = env; msgErrorCallback_vars.jobj = &obj; msgErrorCallback_vars.message_mid = (*env)->GetMethodID(env, cls, "logMessage", "(Ljava/lang/String;)V"); msgErrorCallback_vars.error_mid = (*env)->GetMethodID(env, cls, "logError", "(Ljava/lang/String;)V"); /* Get the String[] containing the parameters, and converts it into a char** to simulate command line arguments.*/ arraySize = (*env)->GetArrayLength(env, javaParameters); argc = (int) arraySize +1; argv = opj_malloc(argc*sizeof(char*)); argv[0] = "ProgramName.exe"; /* The program name: useless*/ j=0; for (i=1; iGetObjectArrayElement(env, javaParameters, i-1); argv[i] = (char*)(*env)->GetStringUTFChars(env, object, &isCopy); } /*printf("C: decoder params = "); for (i=0; iReleaseStringUTFChars(env, (*env)->GetObjectArrayElement(env, javaParameters, i-1), argv[i]); return -1; } /* Release the Java arguments array*/ for (i=1; iReleaseStringUTFChars(env, (*env)->GetObjectArrayElement(env, javaParameters, i-1), argv[i]); num_images=1; /* Get additional information from the Java object variables*/ fid = (*env)->GetFieldID(env, cls,"skippedResolutions", "I"); parameters.cp_reduce = (short) (*env)->GetIntField(env, obj, fid); /*Decoding image one by one*/ for(imageno = 0; imageno < num_images ; imageno++) { image = NULL; fprintf(stderr,"\n"); /* read the input file and put it in memory into the 'src' object, if the -i option is given in JavaParameters. Implemented for debug purpose. */ /* -------------------------------------------------------------- */ if (parameters.infile && parameters.infile[0]!='\0') { /*printf("C: opening [%s]\n", parameters.infile);*/ fsrc = fopen(parameters.infile, "rb"); if (!fsrc) { fprintf(stderr, "ERROR -> failed to open %s for reading\n", parameters.infile); return 1; } fseek(fsrc, 0, SEEK_END); file_length = ftell(fsrc); fseek(fsrc, 0, SEEK_SET); src = (unsigned char *) opj_malloc(file_length); fread(src, 1, file_length, fsrc); fclose(fsrc); /*printf("C: %d bytes read from file\n",file_length);*/ } else { /* Preparing the transfer of the codestream from Java to C*/ /*printf("C: before transfering codestream\n");*/ fid = (*env)->GetFieldID(env, cls,"compressedStream", "[B"); jba = (*env)->GetObjectField(env, obj, fid); file_length = (*env)->GetArrayLength(env, jba); jbBody = (*env)->GetByteArrayElements(env, jba, &isCopy); src = (unsigned char*)jbBody; } /* decode the code-stream */ /* ---------------------- */ switch(parameters.decod_format) { case J2K_CFMT: { /* JPEG-2000 codestream */ /* get a decoder handle */ dinfo = opj_create_decompress(CODEC_J2K); /* catch events using our callbacks and give a local context */ opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, &msgErrorCallback_vars); /* setup the decoder decoding parameters using user parameters */ opj_setup_decoder(dinfo, ¶meters); /* open a byte stream */ cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length); /* decode the stream and fill the image structure */ image = opj_decode(dinfo, cio); if(!image) { fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n"); opj_destroy_decompress(dinfo); opj_cio_close(cio); return 1; } /* close the byte stream */ opj_cio_close(cio); } break; case JP2_CFMT: { /* JPEG 2000 compressed image data */ /* get a decoder handle */ dinfo = opj_create_decompress(CODEC_JP2); /* catch events using our callbacks and give a local context */ opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, &msgErrorCallback_vars); /* setup the decoder decoding parameters using the current image and user parameters */ opj_setup_decoder(dinfo, ¶meters); /* open a byte stream */ cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length); /* decode the stream and fill the image structure */ image = opj_decode(dinfo, cio); if(!image) { fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n"); opj_destroy_decompress(dinfo); opj_cio_close(cio); return 1; } /* close the byte stream */ opj_cio_close(cio); } break; case JPT_CFMT: { /* JPEG 2000, JPIP */ /* get a decoder handle */ dinfo = opj_create_decompress(CODEC_JPT); /* catch events using our callbacks and give a local context */ opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, &msgErrorCallback_vars); /* setup the decoder decoding parameters using user parameters */ opj_setup_decoder(dinfo, ¶meters); /* open a byte stream */ cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length); /* decode the stream and fill the image structure */ image = opj_decode(dinfo, cio); if(!image) { fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n"); opj_destroy_decompress(dinfo); opj_cio_close(cio); return 1; } /* close the byte stream */ opj_cio_close(cio); } break; default: fprintf(stderr, "skipping file..\n"); continue; } /* free the memory containing the code-stream */ if (parameters.infile && parameters.infile[0]!='\0') { opj_free(src); } else { (*env)->ReleaseByteArrayElements(env, jba, jbBody, 0); } src = NULL; /* create output image. If the -o parameter is given in the JavaParameters, write the decoded version into a file. Implemented for debug purpose. */ /* ---------------------------------- */ switch (parameters.cod_format) { case PXM_DFMT: /* PNM PGM PPM */ if (imagetopnm(image, parameters.outfile)) { fprintf(stdout,"Outfile %s not generated\n",parameters.outfile); } else { fprintf(stdout,"Generated Outfile %s\n",parameters.outfile); } break; case PGX_DFMT: /* PGX */ if(imagetopgx(image, parameters.outfile)){ fprintf(stdout,"Outfile %s not generated\n",parameters.outfile); } else { fprintf(stdout,"Generated Outfile %s\n",parameters.outfile); } break; case BMP_DFMT: /* BMP */ if(imagetobmp(image, parameters.outfile)){ fprintf(stdout,"Outfile %s not generated\n",parameters.outfile); } else { fprintf(stdout,"Generated Outfile %s\n",parameters.outfile); } break; } /* ========= Return the image to the Java structure ===============*/ #ifdef CHECK_THRESHOLDS printf("C: checking thresholds\n"); #endif /* First compute the real with and height, in function of the resolutions decoded.*/ /*wr = (image->comps[0].w + (1 << image->comps[0].factor) -1) >> image->comps[0].factor;*/ /*hr = (image->comps[0].h + (1 << image->comps[0].factor) -1) >> image->comps[0].factor;*/ w = image->comps[0].w; h = image->comps[0].h; if (image->numcomps==3) { /* 3 components color image*/ ptr = image->comps[0].data; ptr1 = image->comps[1].data; ptr2 = image->comps[2].data; #ifdef CHECK_THRESHOLDS if (image->comps[0].sgnd) { min_value = -128; max_value = 127; } else { min_value = 0; max_value = 255; } #endif /* Get the pointer to the Java structure where the data must be copied*/ fid = (*env)->GetFieldID(env, cls,"image24", "[I"); jia = (*env)->GetObjectField(env, obj, fid); jiBody = (*env)->GetIntArrayElements(env, jia, 0); ptrIBody = jiBody; printf("C: transfering image24: %d int to Java pointer=%d\n",image->numcomps*w*h, ptrIBody); for (i=0; i max_value) tempUC=max_value; if (tempUC1 < min_value) tempUC1=min_value; else if (tempUC1 > max_value) tempUC1=max_value; if (tempUC2 < min_value) tempUC2=min_value; else if (tempUC2 > max_value) tempUC2=max_value; #endif *(ptrIBody++) = (int) ( (tempUC2<<16) + (tempUC1<<8) + tempUC ); } (*env)->ReleaseIntArrayElements(env, jia, jiBody, 0); } else { /* 1 component 8 or 16 bpp image*/ ptr = image->comps[0].data; printf("C: before transfering a %d bpp image to java (length = %d)\n",image->comps[0].prec ,w*h); if (image->comps[0].prec<=8) { fid = (*env)->GetFieldID(env, cls,"image8", "[B"); jba = (*env)->GetObjectField(env, obj, fid); jbBody = (*env)->GetByteArrayElements(env, jba, 0); ptrBBody = jbBody; #ifdef CHECK_THRESHOLDS if (image->comps[0].sgnd) { min_value = -128; max_value = 127; } else { min_value = 0; max_value = 255; } #endif /*printf("C: transfering %d shorts to Java image8 pointer = %d\n", wr*hr,ptrSBody);*/ for (i=0; i max_value) tempUC = max_value; #endif *(ptrBBody++) = tempUC; } (*env)->ReleaseByteArrayElements(env, jba, jbBody, 0); printf("C: image8 transfered to Java\n"); } else { fid = (*env)->GetFieldID(env, cls,"image16", "[S"); jsa = (*env)->GetObjectField(env, obj, fid); jsBody = (*env)->GetShortArrayElements(env, jsa, 0); ptrSBody = jsBody; #ifdef CHECK_THRESHOLDS if (image->comps[0].sgnd) { min_value = -32768; max_value = 32767; } else { min_value = 0; max_value = 65535; } printf("C: minValue = %d, maxValue = %d\n", min_value, max_value); #endif printf("C: transfering %d shorts to Java image16 pointer = %d\n", w*h,ptrSBody); for (i=0; i max_value) { printf("C: value %d truncated to %d\n", tempS, max_value); tempS = max_value; } #endif *(ptrSBody++) = tempS; } (*env)->ReleaseShortArrayElements(env, jsa, jsBody, 0); printf("C: image16 completely filled\n"); } } /* free remaining structures */ if(dinfo) { opj_destroy_decompress(dinfo); } /* free image data structure */ opj_image_destroy(image); } return 1; /* OK */ } /*end main*/ openjpeg-2.1.0/wrapping/java/openjp2/CMakeLists.txt000644 001750 001750 00000003722 12327650564 023356 0ustar00mathieumathieu000000 000000 #JavaOpenJPEG/CMakeLists.txt # First thing define the common source: set(openjpegjni_SRCS JavaOpenJPEGDecoder.c JavaOpenJPEG.c ${OPENJPEG_SOURCE_DIR}/src/bin/common/opj_getopt.c ${OPENJPEG_SOURCE_DIR}/src/bin/jp2/convert.c index.c ) # JNI binding: find_package(JNI REQUIRED) include_directories(${JNI_INCLUDE_DIRS}) # required header file: include_directories( ${OPENJPEG_BINARY_DIR}/src/lib/openjp2 # opj_config.h ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2 ${OPENJPEG_SOURCE_DIR}/src/bin/common ${OPENJPEG_SOURCE_DIR}/src/bin/jp2 ) add_library(openjpegjni MODULE ${openjpegjni_SRCS} ) # Java module should not have a SONAME: set_property(TARGET openjpegjni PROPERTY NO_SONAME 1) # FIXME (need to use old API): if(BUILD_MJ2) target_link_libraries(openjpegjni openmj2) endif() target_link_libraries(openjpegjni ${PNG_LIBNAME} ${TIFF_LIBNAME} ${LCMS_LIBNAME} ${Z_LIBNAME} ) if(UNIX) target_link_libraries(openjpegjni m) endif() install(TARGETS openjpegjni EXPORT OpenJPEGTargets LIBRARY DESTINATION ${OPENJPEG_INSTALL_JNI_DIR} COMPONENT Libraries ) # build jar: find_package(Java 1.5 REQUIRED) # javac, jar # build dep list: file(GLOB java_srcs "java-sources/org/openJpeg/*.java") # make sure target javac dir exists: file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/classes) # Build java add_custom_command( OUTPUT ${LIBRARY_OUTPUT_PATH}/openjpeg.jar COMMAND ${Java_JAVAC_EXECUTABLE} -sourcepath "${CMAKE_CURRENT_SOURCE_DIR}/java-sources" ${java_srcs} -d ${CMAKE_CURRENT_BINARY_DIR}/classes COMMAND ${Java_JAR_EXECUTABLE} cvf ${LIBRARY_OUTPUT_PATH}/openjpeg.jar org WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/classes DEPENDS ${java_srcs} COMMENT "javac *.java; jar cvf -> openjpeg.jar" ) # name the target add_custom_target(OpenJPEGJavaJar ALL DEPENDS ${LIBRARY_OUTPUT_PATH}/openjpeg.jar COMMENT "building openjpeg.jar" ) install(FILES ${LIBRARY_OUTPUT_PATH}/openjpeg.jar DESTINATION ${OPENJPEG_INSTALL_SHARE_DIR} COMPONENT JavaModule ) openjpeg-2.1.0/wrapping/java/openjp2/java-sources/org/openJpeg/OpenJPEGJavaEncoder.java000644 001750 001750 00000027756 12327650564 032107 0ustar00mathieumathieu000000 000000 /* * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2014, Professor Benoit Macq * Copyright (c) 2002-2007, Patrick Piscaglia, Telemis s.a. * 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. */ package org.openJpeg; import java.io.File; import java.util.Vector; /** This class encodes one image into the J2K format, * using the OpenJPEG.org library. * To be able to log messages, the called must register a IJavaJ2KEncoderLogger object. */ public class OpenJPEGJavaEncoder { public interface IJavaJ2KEncoderLogger { public void logEncoderMessage(String message); public void logEncoderError(String message); } private static boolean isInitialized = false; // ===== Compression parameters =============> // These value may be changed for each image private String[] encoder_arguments = null; /** number of resolutions decompositions */ private int nbResolutions = -1; /** the quality layers, expressed as compression rate */ private float[] ratioLayers = null; /** the quality layers, expressed as PSNR values. This variable, if defined, has priority over the ratioLayers variable */ private float[] psnrLayers = null; /** Contains the 8 bpp version of the image. May NOT be filled together with image16 or image24.

* We store the 8 or 16 bpp version of the original image while the encoder uses a 32 bpp version, because

    *
  • the storage capacity required is smaller *
  • the transfer Java --> C will be faster *
  • the conversion byte/short ==> int will be done faster by the C *
*/ private byte[] image8 = null; /** Contains the 16 bpp version of the image. May NOT be filled together with image8 or image24*/ private short[] image16 = null; /** Contains the 24 bpp version of the image. May NOT be filled together with image8 or image16 */ private int[] image24 = null; /** Holds the result of the compression, i.e. the J2K compressed bytecode */ private byte compressedStream[] = null; /** Holds the compressed stream length, which may be smaller than compressedStream.length if this byte[] is pre-allocated */ private long compressedStreamLength = -1; /** Holds the compressed version of the index file, returned by the encoder */ private byte compressedIndex[] = null; /** Width and Height of the image */ private int width = -1; private int height = -1; private int depth = -1; /** Tile size. We suppose the same size for the horizontal and vertical tiles. * If size == -1 ==> no tiling */ private int tileSize = -1; // <===== Compression parameters ============= private Vector loggers = new Vector(); public OpenJPEGJavaEncoder(String openJPEGlibraryFullPathAndName, IJavaJ2KEncoderLogger messagesAndErrorsLogger) throws ExceptionInInitializerError { this(openJPEGlibraryFullPathAndName); loggers.addElement(messagesAndErrorsLogger); } public OpenJPEGJavaEncoder(String openJPEGlibraryFullPathAndName) throws ExceptionInInitializerError { if (!isInitialized) { try { String absolutePath = (new File(openJPEGlibraryFullPathAndName)).getCanonicalPath(); System.load(absolutePath); isInitialized = true; } catch (Throwable t) { t.printStackTrace(); throw new ExceptionInInitializerError("OpenJPEG Java Encoder: probably impossible to find the C library"); } } } public void addLogger(IJavaJ2KEncoderLogger messagesAndErrorsLogger) { loggers.addElement(messagesAndErrorsLogger); } public void removeLogger(IJavaJ2KEncoderLogger messagesAndErrorsLogger) { loggers.removeElement(messagesAndErrorsLogger); } /** This method compresses the given image.

* It returns the compressed J2K codestream into the compressedStream byte[].

* It also returns the compression index as a compressed form, into the compressedIndex byte[].

* One of the image8, image16 or image24 arrays must be correctly initialized and filled.

* The width, height and depth variables must be correctly filled.

* The nbResolutions, nbLayers and if needed the float[] psnrLayers or ratioLayers must also be filled before calling this method. */ public void encodeImageToJ2K() { // Need to allocate / reallocate the compressed stream buffer ? (size = max possible size = original image size) if (compressedStream== null || (compressedStream.length != width*height*depth/8)) { logMessage("OpenJPEGJavaEncoder.encodeImageToJ2K: (re-)allocating " + (width*height*depth/8) + " bytes for the compressedStream"); compressedStream = new byte[width*height*depth/8]; } // Arguments = // - number of resolutions "-n 5" : 2 // - size of tile "-t 512,512" : 2 // // Image width, height, depth and pixels are directly fetched by C from the Java class int nbArgs = 2 + (tileSize == -1 ? 0 : 2) + (encoder_arguments != null ? encoder_arguments.length : 0); if (psnrLayers != null && psnrLayers.length>0 && psnrLayers[0] != 0) // If psnrLayers is defined and doesn't just express "lossless" nbArgs += 2; else if (ratioLayers != null && ratioLayers.length>0 && ratioLayers[0]!=0.0) nbArgs += 2; String[] arguments = new String[nbArgs]; int offset = 0; arguments[offset] = "-n"; arguments[offset+1] = "" + nbResolutions; offset += 2; if (tileSize!= -1) { arguments[offset++] = "-t"; arguments[offset++] = "" + tileSize + "," + tileSize; } // If PSNR layers are defined, use them to encode the images if (psnrLayers != null && psnrLayers.length>0 && psnrLayers[0]!=-1) { arguments[offset++] = "-q"; String s = ""; for (int i=0; i0 && ratioLayers[0]!=0.0) { // Specify quality ratioLayers, as compression ratios arguments[offset++] = "-r"; String s = ""; for (int i=0; i // These value may be changed for each image private String[] decoder_arguments = null; /** number of resolutions decompositions */ private int nbResolutions = -1; /** the quality layers */ private int[] layers = null; /** Contains the 8 bpp version of the image. May NOT be filled together with image16 or image24.

* We store in Java the 8 or 16 bpp version of the image while the decoder uses a 32 bpp version, because

    *
  • the storage capacity required is smaller *
  • the transfer Java <-- C will be faster *
  • the conversion byte/short ==> int will be done faster by the C *
*/ private byte[] image8 = null; /** Contains the 16 bpp version of the image. May NOT be filled together with image8 or image24*/ private short[] image16 = null; /** Contains the 24 bpp version of the image. May NOT be filled together with image8 or image16 */ private int[] image24 = null; /** Holds the J2K compressed bytecode to decode */ private byte compressedStream[] = null; /** Holds the compressed version of the index file, to be used by the decoder */ private byte compressedIndex[] = null; /** Width and Height of the image */ private int width = -1; private int height = -1; private int depth = -1; /** This parameter is never used in Java but is read by the C library to know the number of resolutions to skip when decoding, * i.e. if there are 5 resolutions and skipped=1 ==> decode until resolution 4. */ private int skippedResolutions = 0; private Vector loggers = new Vector(); public OpenJPEGJavaDecoder(String openJPEGlibraryFullPathAndName, IJavaJ2KDecoderLogger messagesAndErrorsLogger) throws ExceptionInInitializerError { this(openJPEGlibraryFullPathAndName); loggers.addElement(messagesAndErrorsLogger); } public OpenJPEGJavaDecoder(String openJPEGlibraryFullPathAndName) throws ExceptionInInitializerError { if (!isInitialized) { try { System.load(openJPEGlibraryFullPathAndName); isInitialized = true; } catch (Throwable t) { throw new ExceptionInInitializerError("OpenJPEG Java Decoder: probably impossible to find the C library"); } } } public void addLogger(IJavaJ2KDecoderLogger messagesAndErrorsLogger) { loggers.addElement(messagesAndErrorsLogger); } public void removeLogger(IJavaJ2KDecoderLogger messagesAndErrorsLogger) { loggers.removeElement(messagesAndErrorsLogger); } public int decodeJ2KtoImage() { if ((image16 == null || (image16 != null && image16.length != width*height)) && (depth==-1 || depth==16)) { image16 = new short[width*height]; logMessage("OpenJPEGJavaDecoder.decompressImage: image16 length = " + image16.length + " (" + width + " x " + height + ") "); } if ((image8 == null || (image8 != null && image8.length != width*height)) && (depth==-1 || depth==8)) { image8 = new byte[width*height]; logMessage("OpenJPEGJavaDecoder.decompressImage: image8 length = " + image8.length + " (" + width + " x " + height + ") "); } if ((image24 == null || (image24 != null && image24.length != width*height)) && (depth==-1 || depth==24)) { image24 = new int[width*height]; logMessage("OpenJPEGJavaDecoder.decompressImage: image24 length = " + image24.length + " (" + width + " x " + height + ") "); } String[] arguments = new String[0 + (decoder_arguments != null ? decoder_arguments.length : 0)]; int offset = 0; if (decoder_arguments != null) { for (int i=0; i /* Header for class org_openJpeg_OpenJPEGJavaDecoder */ #ifndef _Included_org_openJpeg_OpenJPEGJavaDecoder #define _Included_org_openJpeg_OpenJPEGJavaDecoder #ifdef __cplusplus extern "C" { #endif /* * Class: org_openJpeg_OpenJPEGJavaDecoder * Method: internalDecodeJ2KtoImage * Signature: ([Ljava/lang/String;)I */ JNIEXPORT jint JNICALL Java_org_openJpeg_OpenJPEGJavaDecoder_internalDecodeJ2KtoImage (JNIEnv *, jobject, jobjectArray); #ifdef __cplusplus } #endif #endif openjpeg-2.1.0/wrapping/java/CMakeLists.txt000644 001750 001750 00000000035 12327650564 021773 0ustar00mathieumathieu000000 000000 # add_subdirectory(openjp2) openjpeg-2.1.0/wrapping/CMakeLists.txt000644 001750 001750 00000000073 12327650564 021054 0ustar00mathieumathieu000000 000000 # wrapping if(BUILD_JAVA) add_subdirectory(java) endif() openjpeg-2.1.0/src/bin/mj2/opj_mj2_decompress.c000644 001750 001750 00000017143 12327650566 022454 0ustar00mathieumathieu000000 000000 /* * Copyright (c) 2003-2004, Francois-Olivier Devaux * Copyright (c) 2002-2004, 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 #include #include #include "opj_apps_config.h" #include "openjpeg.h" #include "j2k_lib.h" #include "cio.h" #include "j2k.h" #include "jp2.h" #include "mj2.h" #include "mj2_convert.h" #ifdef OPJ_HAVE_LIBLCMS2 #include #endif #ifdef OPJ_HAVE_LIBLCMS1 #include #endif #include "color.h" /* -------------------------------------------------------------------------- */ /** sample error callback expecting a FILE* client object */ static void error_callback(const char *msg, void *client_data) { FILE *stream = (FILE*)client_data; fprintf(stream, "[ERROR] %s", msg); } /** sample warning callback expecting a FILE* client object */ static void warning_callback(const char *msg, void *client_data) { FILE *stream = (FILE*)client_data; fprintf(stream, "[WARNING] %s", msg); } /* -------------------------------------------------------------------------- */ int main(int argc, char *argv[]) { mj2_dparameters_t mj2_parameters; /* decompression parameters */ opj_dinfo_t* dinfo; opj_event_mgr_t event_mgr; /* event manager */ opj_cio_t *cio = NULL; unsigned int tnum, snum; opj_mj2_t *movie; mj2_tk_t *track; mj2_sample_t *sample; unsigned char* frame_codestream; FILE *file, *outfile; char outfilename[50]; opj_image_t *img = NULL; unsigned int max_codstrm_size = 0; double total_time = 0; unsigned int numframes = 0; if (argc != 3) { printf("Usage: %s inputfile.mj2 outputfile.yuv\n",argv[0]); return 1; } file = fopen(argv[1], "rb"); if (!file) { fprintf(stderr, "failed to open %s for reading\n", argv[1]); return 1; } /* Checking output file */ outfile = fopen(argv[2], "w"); if (!file) { fprintf(stderr, "failed to open %s for writing\n", argv[2]); return 1; } fclose(outfile); /* configure the event callbacks (not required) setting of each callback is optionnal */ memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); event_mgr.error_handler = error_callback; event_mgr.warning_handler = warning_callback; event_mgr.info_handler = NULL; /* get a MJ2 decompressor handle */ dinfo = mj2_create_decompress(); movie = (opj_mj2_t*)dinfo->mj2_handle; /* catch events using our callbacks and give a local context */ opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr); memset(&mj2_parameters, 0, sizeof(mj2_dparameters_t)); /* set J2K decoding parameters to default values */ opj_set_default_decoder_parameters(&mj2_parameters.j2k_parameters); /* setup the decoder decoding parameters using user parameters */ mj2_setup_decoder(movie, &mj2_parameters); if (mj2_read_struct(file, movie)) /* Creating the movie structure */ return 1; /* Decode first video track */ for (tnum=0; tnum < (unsigned int)(movie->num_htk + movie->num_stk + movie->num_vtk); tnum++) { if (movie->tk[tnum].track_type == 0) break; } if (movie->tk[tnum].track_type != 0) { printf("Error. Movie does not contain any video track\n"); return 1; } track = &movie->tk[tnum]; /* Output info on first video tracl */ fprintf(stdout,"The first video track contains %d frames.\nWidth: %d, Height: %d \n\n", track->num_samples, track->w, track->h); max_codstrm_size = track->sample[0].sample_size-8; frame_codestream = (unsigned char*) malloc(max_codstrm_size * sizeof(unsigned char)); numframes = track->num_samples; for (snum=0; snum < numframes; snum++) { double init_time = opj_clock(); double elapsed_time; sample = &track->sample[snum]; if (sample->sample_size-8 > max_codstrm_size) { max_codstrm_size = sample->sample_size-8; if ((frame_codestream = (unsigned char*) realloc(frame_codestream, max_codstrm_size)) == NULL) { printf("Error reallocation memory\n"); return 1; }; } fseek(file,sample->offset+8,SEEK_SET); fread(frame_codestream, sample->sample_size-8, 1, file); /* Assuming that jp and ftyp markers size do */ /* open a byte stream */ cio = opj_cio_open((opj_common_ptr)dinfo, frame_codestream, sample->sample_size-8); img = opj_decode(dinfo, cio); /* Decode J2K to image */ #ifdef WANT_SYCC_TO_RGB if(img->color_space == CLRSPC_SYCC) { color_sycc_to_rgb(img); } #endif if(img->icc_profile_buf) { #if defined(OPJ_HAVE_LIBLCMS1) || defined(OPJ_HAVE_LIBLCMS2) color_apply_icc_profile(img); #endif free(img->icc_profile_buf); img->icc_profile_buf = NULL; img->icc_profile_len = 0; } if (((img->numcomps == 3) && (img->comps[0].dx == img->comps[1].dx / 2) && (img->comps[0].dx == img->comps[2].dx / 2 ) && (img->comps[0].dx == 1)) || (img->numcomps == 1)) { if (!imagetoyuv(img, argv[2])) /* Convert image to YUV */ return 1; } else if ((img->numcomps == 3) && (img->comps[0].dx == 1) && (img->comps[1].dx == 1)&& (img->comps[2].dx == 1))/* If YUV 4:4:4 input --> to bmp */ { fprintf(stdout,"The frames will be output in a bmp format (output_1.bmp, ...)\n"); sprintf(outfilename,"output_%d.bmp",snum); if (imagetobmp(img, outfilename)) /* Convert image to BMP */ return 1; } else { fprintf(stdout,"Image component dimensions are unknown. Unable to output image\n"); fprintf(stdout,"The frames will be output in a j2k file (output_1.j2k, ...)\n"); sprintf(outfilename,"output_%d.j2k",snum); outfile = fopen(outfilename, "wb"); if (!outfile) { fprintf(stderr, "failed to open %s for writing\n",outfilename); return 1; } fwrite(frame_codestream,sample->sample_size-8,1,outfile); fclose(outfile); } /* close the byte stream */ opj_cio_close(cio); /* free image data structure */ opj_image_destroy(img); elapsed_time = opj_clock()-init_time; fprintf(stderr, "Frame number %d/%d decoded in %.2f mseconds\n", snum + 1, numframes, elapsed_time*1000); total_time += elapsed_time; } free(frame_codestream); fclose(file); /* free remaining structures */ if(dinfo) { mj2_destroy_decompress((opj_mj2_t*)dinfo->mj2_handle); } free(dinfo); fprintf(stdout, "%d frame(s) correctly decompressed\n", snum); fprintf(stdout,"Total decoding time: %.2f seconds (%.1f fps)\n", total_time, (float)numframes/total_time); return 0; } openjpeg-2.1.0/src/bin/mj2/mj2_to_metadata.vcproj000644 001750 001750 00000017570 12327650566 023007 0ustar00mathieumathieu000000 000000 openjpeg-2.1.0/src/bin/mj2/meta_out.h000644 001750 001750 00000000665 12327650566 020513 0ustar00mathieumathieu000000 000000 /* meta_out.h */ /* Dump MJ2, JP2 metadata (partial so far) to xml file */ /* Callable from mj2_to_metadata */ /* Contributed to Open JPEG by Glenn Pearson, U.S. National Library of Medicine */ #define BOOL int #define FALSE 0 #define TRUE 1 void xml_write_init(BOOL n, BOOL t, BOOL r, BOOL d); int xml_write_struct(FILE *file, FILE *xmlout, opj_mj2_t * movie, unsigned int sampleframe, char* stringDTD, opj_event_mgr_t *event_mgr); openjpeg-2.1.0/src/bin/mj2/opj_mj2_wrap.c000644 001750 001750 00000036423 12327650566 021263 0ustar00mathieumathieu000000 000000 /* * 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 #include #include #include "openjpeg.h" #include "cio.h" #include "j2k.h" #include "jp2.h" #include "mj2.h" static int int_ceildiv(int a, int b) { return (a + b - 1) / b; } /** Size of memory first allocated for MOOV box */ #define TEMP_BUF 10000 #define J2K_CODESTREAM_MAGIC "\xff\x4f\xff\x51" /* -------------------------------------------------------------------------- */ static int test_image(const char *fname, mj2_cparameters_t *cp) { FILE *reader; opj_image_t *image; unsigned char *src; opj_dinfo_t *dinfo; opj_cio_t *cio; opj_dparameters_t dparameters; int success; long src_len; success = 0; if((reader = fopen(fname, "rb")) == NULL) return success; fseek(reader, 0, SEEK_END); src_len = ftell(reader); fseek(reader, 0, SEEK_SET); src = (unsigned char*) malloc(src_len); fread(src, 1, src_len, reader); fclose(reader); if(memcmp(src, J2K_CODESTREAM_MAGIC, 4) != 0) { free(src); return success; } memset(&dparameters, 0, sizeof(opj_dparameters_t)); opj_set_default_decoder_parameters(&dparameters); dinfo = opj_create_decompress(CODEC_J2K); opj_setup_decoder(dinfo, &dparameters); cio = opj_cio_open((opj_common_ptr)dinfo, src, src_len); image = opj_decode(dinfo, cio); free(src); cio->buffer = NULL; opj_cio_close(cio); if(image == NULL) goto fin; cp->numcomps = image->numcomps; cp->w = image->comps[0].w; cp->h = image->comps[0].h; cp->prec = image->comps[0].prec; if(image->numcomps > 2 ) { if((image->comps[0].dx == 1) && (image->comps[1].dx == 2) && (image->comps[2].dx == 2) && (image->comps[0].dy == 1) && (image->comps[1].dy == 2) && (image->comps[2].dy == 2))/* horizontal and vertical*/ { /* Y420*/ cp->enumcs = ENUMCS_SYCC; cp->CbCr_subsampling_dx = 2; cp->CbCr_subsampling_dy = 2; } else if((image->comps[0].dx == 1) && (image->comps[1].dx == 2) && (image->comps[2].dx == 2) && (image->comps[0].dy == 1) && (image->comps[1].dy == 1) && (image->comps[2].dy == 1))/* horizontal only*/ { /* Y422*/ cp->enumcs = ENUMCS_SYCC; cp->CbCr_subsampling_dx = 2; cp->CbCr_subsampling_dy = 1; } else if((image->comps[0].dx == 1) && (image->comps[1].dx == 1) && (image->comps[2].dx == 1) && (image->comps[0].dy == 1) && (image->comps[1].dy == 1) && (image->comps[2].dy == 1)) { /* Y444 or RGB */ if(image->color_space == CLRSPC_SRGB) { cp->enumcs = ENUMCS_SRGB; /* cp->CbCr_subsampling_dx = 0; */ /* cp->CbCr_subsampling_dy = 0; */ } else { cp->enumcs = ENUMCS_SYCC; cp->CbCr_subsampling_dx = 1; cp->CbCr_subsampling_dy = 1; } } else { goto fin; } } else { cp->enumcs = ENUMCS_GRAY; /* cp->CbCr_subsampling_dx = 0; */ /* cp->CbCr_subsampling_dy = 0; */ } if(image->icc_profile_buf) { cp->meth = 2; free(image->icc_profile_buf); image->icc_profile_buf = NULL; } else cp->meth = 1; success = 1; fin: if(dinfo) opj_destroy_decompress(dinfo); if(image) opj_image_destroy(image); return success; } /** sample error callback expecting a FILE* client object */ static void error_callback(const char *msg, void *client_data) { FILE *stream = (FILE*)client_data; fprintf(stream, "[ERROR] %s", msg); } /** sample warning callback expecting a FILE* client object */ static void warning_callback(const char *msg, void *client_data) { FILE *stream = (FILE*)client_data; fprintf(stream, "[WARNING] %s", msg); } /** sample debug callback expecting a FILE* client object */ static void info_callback(const char *msg, void *client_data) { FILE *stream = (FILE*)client_data; fprintf(stream, "[INFO] %s", msg); } /* -------------------------------------------------------------------------- */ static void read_siz_marker(FILE *file, opj_image_t *image) { int len,i; char buf, buf2[2]; unsigned char *siz_buffer; opj_cio_t *cio; fseek(file, 0, SEEK_SET); do { fread(&buf,1,1, file); if (buf==(char)0xff) fread(&buf,1,1, file); } while (!(buf==(char)0x51)); fread(buf2,2,1,file); /* Lsiz */ len = ((buf2[0])<<8) + buf2[1]; siz_buffer = (unsigned char*) malloc(len * sizeof(unsigned char)); fread(siz_buffer,len, 1, file); cio = opj_cio_open(NULL, siz_buffer, len); cio_read(cio, 2); /* Rsiz (capabilities) */ image->x1 = cio_read(cio, 4); /* Xsiz */ image->y1 = cio_read(cio, 4); /* Ysiz */ image->x0 = cio_read(cio, 4); /* X0siz */ image->y0 = cio_read(cio, 4); /* Y0siz */ cio_skip(cio, 16); /* XTsiz, YTsiz, XT0siz, YT0siz */ image->numcomps = cio_read(cio,2); /* Csiz */ image->comps = (opj_image_comp_t *) malloc(image->numcomps * sizeof(opj_image_comp_t)); for (i = 0; i < image->numcomps; i++) { int tmp; tmp = cio_read(cio,1); /* Ssiz_i */ image->comps[i].prec = (tmp & 0x7f) + 1; image->comps[i].sgnd = tmp >> 7; image->comps[i].dx = cio_read(cio,1); /* XRsiz_i */ image->comps[i].dy = cio_read(cio,1); /* YRsiz_i */ image->comps[i].resno_decoded = 0; /* number of resolution decoded */ image->comps[i].factor = 0; /* reducing factor by component */ } fseek(file, 0, SEEK_SET); opj_cio_close(cio); free(siz_buffer); } static void setparams(opj_mj2_t *movie, opj_image_t *image) { int i, depth_0, depth, sign; movie->tk[0].w = int_ceildiv(image->x1 - image->x0, image->comps[0].dx); movie->tk[0].h = int_ceildiv(image->y1 - image->y0, image->comps[0].dy); mj2_init_stdmovie(movie); movie->tk[0].depth = image->comps[0].prec; if (image->numcomps==3) { if ((image->comps[0].dx == 1) && (image->comps[1].dx == 1) && (image->comps[2].dx == 1)) movie->tk[0].CbCr_subsampling_dx = 1; else if ((image->comps[0].dx == 1) && (image->comps[1].dx == 2) && (image->comps[2].dx == 2)) movie->tk[0].CbCr_subsampling_dx = 2; else fprintf(stderr,"Image component sizes are incoherent\n"); if ((image->comps[0].dy == 1) && (image->comps[1].dy == 1) && (image->comps[2].dy == 1)) movie->tk[0].CbCr_subsampling_dy = 1; else if ((image->comps[0].dy == 1) && (image->comps[1].dy == 2) && (image->comps[2].dy == 2)) movie->tk[0].CbCr_subsampling_dy = 2; else fprintf(stderr,"Image component sizes are incoherent\n"); } movie->tk[0].sample_rate = 25; movie->tk[0].jp2_struct.numcomps = image->numcomps; /* NC */ /* Init Standard jp2 structure */ movie->tk[0].jp2_struct.comps = (opj_jp2_comps_t *) malloc(movie->tk[0].jp2_struct.numcomps * sizeof(opj_jp2_comps_t)); movie->tk[0].jp2_struct.precedence = 0; /* PRECEDENCE*/ movie->tk[0].jp2_struct.approx = 0; /* APPROX*/ movie->tk[0].jp2_struct.brand = JP2_JP2; /* BR */ movie->tk[0].jp2_struct.minversion = 0; /* MinV */ movie->tk[0].jp2_struct.numcl = 1; movie->tk[0].jp2_struct.cl = (unsigned int *) malloc(movie->tk[0].jp2_struct.numcl * sizeof(int)); movie->tk[0].jp2_struct.cl[0] = JP2_JP2; /* CL0 : JP2 */ movie->tk[0].jp2_struct.C = 7; /* C : Always 7*/ movie->tk[0].jp2_struct.UnkC = 0; /* UnkC, colorspace specified in colr box*/ movie->tk[0].jp2_struct.IPR = 0; /* IPR, no intellectual property*/ movie->tk[0].jp2_struct.w = int_ceildiv(image->x1 - image->x0, image->comps[0].dx); movie->tk[0].jp2_struct.h = int_ceildiv(image->y1 - image->y0, image->comps[0].dy); depth_0 = image->comps[0].prec - 1; sign = image->comps[0].sgnd; movie->tk[0].jp2_struct.bpc = depth_0 + (sign << 7); for (i = 1; i < image->numcomps; i++) { depth = image->comps[i].prec - 1; sign = image->comps[i].sgnd; if (depth_0 != depth) movie->tk[0].jp2_struct.bpc = 255; } for (i = 0; i < image->numcomps; i++) movie->tk[0].jp2_struct.comps[i].bpcc = image->comps[i].prec - 1 + (image->comps[i].sgnd << 7); if ((image->numcomps == 1 || image->numcomps == 3) && (movie->tk[0].jp2_struct.bpc != 255)) movie->tk[0].jp2_struct.meth = 1; else movie->tk[0].jp2_struct.meth = 2; if (image->numcomps == 1) movie->tk[0].jp2_struct.enumcs = 17; /* Grayscale */ else if ((image->comps[0].dx == 1) && (image->comps[1].dx == 1) && (image->comps[2].dx == 1) && (image->comps[0].dy == 1) && (image->comps[1].dy == 1) && (image->comps[2].dy == 1)) movie->tk[0].jp2_struct.enumcs = 16; /* RGB */ else if ((image->comps[0].dx == 1) && (image->comps[1].dx == 2) && (image->comps[2].dx == 2) && (image->comps[0].dy == 1) && (image->comps[1].dy == 2) && (image->comps[2].dy == 2)) movie->tk[0].jp2_struct.enumcs = 18; /* YUV */ else movie->tk[0].jp2_struct.enumcs = 0; /* Unkown profile */ } int main(int argc, char *argv[]) { opj_cinfo_t* cinfo; opj_event_mgr_t event_mgr; /* event manager */ unsigned int snum; opj_mj2_t *movie; mj2_sample_t *sample; unsigned char* frame_codestream; FILE *mj2file, *j2kfile; char *j2kfilename; unsigned char *buf; int offset, mdat_initpos; opj_image_t img; opj_cio_t *cio; mj2_cparameters_t parameters; if (argc != 3) { printf("Usage: %s source_location mj2_filename\n",argv[0]); printf("Example: %s input/input output.mj2\n",argv[0]); return 1; } mj2file = fopen(argv[2], "wb"); if (!mj2file) { fprintf(stderr, "failed to open %s for writing\n", argv[2]); return 1; } memset(&img, 0, sizeof(opj_image_t)); /* configure the event callbacks (not required) setting of each callback is optionnal */ memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); event_mgr.error_handler = error_callback; event_mgr.warning_handler = warning_callback; event_mgr.info_handler = info_callback; /* get a MJ2 decompressor handle */ cinfo = mj2_create_compress(); /* catch events using our callbacks and give a local context */ opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr); /* setup the decoder encoding parameters using user parameters */ memset(¶meters, 0, sizeof(mj2_cparameters_t)); movie = (opj_mj2_t*) cinfo->mj2_handle; j2kfilename = (char*)malloc(strlen(argv[1]) + 12);/* max. '%6d' */ sprintf(j2kfilename, "%s_00001.j2k",argv[1]); if(test_image(j2kfilename, ¶meters) == 0) goto fin; parameters.frame_rate = 25; /* DEFAULT */ mj2_setup_encoder(movie, ¶meters); /* Writing JP, FTYP and MDAT boxes Assuming that the JP and FTYP boxes won't be longer than 300 bytes */ buf = (unsigned char*) malloc (300 * sizeof(unsigned char)); cio = opj_cio_open(movie->cinfo, buf, 300); mj2_write_jp(cio); mj2_write_ftyp(movie, cio); mdat_initpos = cio_tell(cio); cio_skip(cio, 4); cio_write(cio,MJ2_MDAT, 4); fwrite(buf,cio_tell(cio),1,mj2file); free(buf); /* Insert each j2k codestream in a JP2C box */ snum=0; offset = 0; while(1) { mj2_sample_t * new_sample; mj2_chunk_t * new_chunk; sample = &movie->tk[0].sample[snum]; sprintf(j2kfilename,"%s_%05d.j2k",argv[1],snum); j2kfile = fopen(j2kfilename, "rb"); if (!j2kfile) { if (snum==0) { /* Could not open a single codestream */ fprintf(stderr, "failed to open %s for reading\n",j2kfilename); return 1; } else { /* Tried to open a inexistant codestream */ fprintf(stdout,"%d frames are being added to the MJ2 file\n",snum); break; } } /* Calculating offset for samples and chunks */ offset += cio_tell(cio); sample->offset = offset; movie->tk[0].chunk[snum].offset = offset; /* There will be one sample per chunk */ /* Calculating sample size */ fseek(j2kfile,0,SEEK_END); sample->sample_size = ftell(j2kfile) + 8; /* Sample size is codestream + JP2C box header */ fseek(j2kfile,0,SEEK_SET); /* Reading siz marker of j2k image for the first codestream */ if (snum==0) read_siz_marker(j2kfile, &img); /* Writing JP2C box header */ frame_codestream = (unsigned char*) malloc (sample->sample_size+8); cio = opj_cio_open(movie->cinfo, frame_codestream, sample->sample_size); cio_write(cio,sample->sample_size, 4); /* Sample size */ cio_write(cio,JP2_JP2C, 4); /* JP2C */ /* Writing codestream from J2K file to MJ2 file */ fread(frame_codestream+8,sample->sample_size-8,1,j2kfile); fwrite(frame_codestream,sample->sample_size,1,mj2file); cio_skip(cio, sample->sample_size-8); /* Ending loop */ fclose(j2kfile); snum++; new_sample = (mj2_sample_t*) realloc(movie->tk[0].sample, (snum+1) * sizeof(mj2_sample_t)); new_chunk = (mj2_chunk_t*) realloc(movie->tk[0].chunk, (snum+1) * sizeof(mj2_chunk_t)); if (new_sample && new_chunk) { movie->tk[0].sample = new_sample; movie->tk[0].chunk = new_chunk; } else { fprintf(stderr, "Failed to allocate enough memory to read %s\n", j2kfilename); return 1; } free(frame_codestream); } /* Writing the MDAT box length in header */ offset += cio_tell(cio); buf = (unsigned char*) malloc (4 * sizeof(unsigned char)); cio = opj_cio_open(movie->cinfo, buf, 4); cio_write(cio,offset-mdat_initpos,4); fseek(mj2file,(long)mdat_initpos,SEEK_SET); fwrite(buf,4,1,mj2file); fseek(mj2file,0,SEEK_END); free(buf); /* Setting movie parameters */ movie->tk[0].num_samples=snum; movie->tk[0].num_chunks=snum; setparams(movie, &img); /* Writing MOOV box */ buf = (unsigned char*) malloc ((TEMP_BUF+snum*20) * sizeof(unsigned char)); cio = opj_cio_open(movie->cinfo, buf, (TEMP_BUF+snum*20)); mj2_write_moov(movie, cio); fwrite(buf,cio_tell(cio),1,mj2file); /* Ending program */ free(img.comps); opj_cio_close(cio); fin: fclose(mj2file); mj2_destroy_compress(movie); free(j2kfilename); return 0; } openjpeg-2.1.0/src/bin/mj2/mj2_to_metadata.dtd000644 001750 001750 00000060536 12327650566 022257 0ustar00mathieumathieu000000 000000 openjpeg-2.1.0/src/bin/mj2/readme.txt000644 001750 001750 00000000226 12327650566 020514 0ustar00mathieumathieu000000 000000 Attention : the motion jpeg 2000 files currently only work with OpenJPEG v0.97 that you can find here : http://www.openjpeg.org/openjpeg_v097.tar.gzopenjpeg-2.1.0/src/bin/mj2/CMakeLists.txt000644 001750 001750 00000002173 12327650566 021261 0ustar00mathieumathieu000000 000000 # Makefile for the MJ2 codecs of the OpenJPEG library: frames_to_mj2, mj2_to_frames, extract_j2k_from_mj2 and wrap_j2k_in_mj2 set(common_SRCS ${OPENJPEG_SOURCE_DIR}/src/bin/common/opj_getopt.c) if(WIN32) if(BUILD_SHARED_LIBS) add_definitions(-DOPJ_EXPORTS) else() add_definitions(-DOPJ_STATIC) endif() 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/openmj2 ${OPENJPEG_SOURCE_DIR}/src/bin/common ${LCMS_INCLUDE_DIRNAME} ) foreach(exe opj_mj2_wrap opj_mj2_extract opj_mj2_decompress opj_mj2_compress ) add_definitions(-DOPJ_USE_LEGACY) add_executable(${exe} ${exe}.c ${common_SRCS} ${MJ2_SRCS} ${OPENJPEG_SOURCE_DIR}/src/bin/common/color.c ) set_property( TARGET ${exe} APPEND PROPERTY COMPILE_DEFINITIONS USE_MJ2 ) target_link_libraries(${exe} ${LCMS_LIBNAME} openmj2) if(UNIX) target_link_libraries(${exe} m) endif() install(TARGETS ${exe} DESTINATION ${OPENJPEG_INSTALL_BIN_DIR}) endforeach() openjpeg-2.1.0/src/bin/mj2/mj2_to_metadata.h000644 001750 001750 00000000355 12327650566 021724 0ustar00mathieumathieu000000 000000 /* mj2_to_metadata.h */ /* Dump MJ2, JP2 metadata (partial so far) to xml file */ /* Contributed to Open JPEG by Glenn Pearson, U.S. National Library of Medicine */ #define BOOL int #define FALSE 0 #define TRUE 1 #include "meta_out.h" openjpeg-2.1.0/src/bin/mj2/meta_out.c000644 001750 001750 00000333374 12327650566 020514 0ustar00mathieumathieu000000 000000 /* meta_out.c */ /* Dump MJ2, JP2 metadata (partial so far) to xml file */ /* Callable from mj2_to_metadata */ /* Contributed to Open JPEG by Glenn Pearson, contract software developer, U.S. National Library of Medicine. The base code in this file was developed by the author as part of a video archiving project for the U.S. National Library of Medicine, Bethesda, MD. It is the policy of NLM (and U.S. government) to not assert copyright. A non-exclusive copy of this code has been contributed to the Open JPEG project. Except for copyright, inclusion of the code within Open JPEG for distribution and use can be bound by the Open JPEG open-source license and disclaimer, expressed elsewhere. */ #include /* for time functions */ #include "opj_includes.h" #include "mj2.h" #include #include "meta_out.h" static BOOL notes = TRUE; static BOOL sampletables = FALSE; static BOOL raw = TRUE; static BOOL derived = TRUE; opj_tcp_t *j2k_default_tcp; /* Forwards */ int xml_write_overall_header(FILE *file, FILE *xmlout, opj_mj2_t * movie, unsigned int sampleframe, opj_event_mgr_t *event_mgr); int xml_write_moov(FILE *file, FILE *xmlout, opj_mj2_t * movie, unsigned int sampleframe, opj_event_mgr_t *event_mgr); void uint_to_chars(unsigned int value, char* buf); void xml_write_trak(FILE* file, FILE* xmlout, mj2_tk_t *track, unsigned int tnum, unsigned int sampleframe, opj_event_mgr_t *event_mgr); void xml_write_tkhd(FILE* file, FILE* xmlout, mj2_tk_t *track, unsigned int tnum); void xml_write_udta(FILE* file, FILE* xmlout, mj2_tk_t *track, unsigned int tnum); void xml_write_mdia(FILE* file, FILE* xmlout, mj2_tk_t *track, unsigned int tnum); void xml_write_stbl(FILE* file, FILE* xmlout, mj2_tk_t *track, unsigned int tnum); void UnixTimeToFileTime(time_t t, LPFILETIME pft); void UnixTimeToSystemTime(time_t t, LPSYSTEMTIME pst); void xml_time_out(FILE* xmlout, time_t t); void int16_to_3packedchars(short int value, char* buf); void xml_write_moov_udta(FILE* xmlout, opj_mj2_t * movie); void xml_write_free_and_skip(FILE* xmlout, opj_mj2_t * movie); void xml_write_uuid(FILE* xmlout, opj_mj2_t * movie); int xml_out_frame(FILE* file, FILE* xmlout, mj2_sample_t *sample, unsigned int snum, opj_event_mgr_t *event_mgr); void xml_out_frame_siz(FILE* xmlout, opj_image_t *img, opj_cp_t *cp); void xml_out_frame_cod(FILE* xmlout, opj_tcp_t *tcp); void xml_out_frame_coc(FILE* xmlout, opj_tcp_t *tcp, int numcomps); /* opj_image_t *img); */ BOOL same_component_style(opj_tccp_t *tccp1, opj_tccp_t *tccp2); void xml_out_frame_qcd(FILE* xmlout, opj_tcp_t *tcp); void xml_out_frame_qcc(FILE* xmlout, opj_tcp_t *tcp, int numcomps); /* opj_image_t *img); */ BOOL same_component_quantization(opj_tccp_t *tccp1, opj_tccp_t *tccp2); void xml_out_frame_rgn(FILE* xmlout, opj_tcp_t *tcp, int numcomps);/* opj_image_t *img);*/ void xml_out_frame_poc(FILE* xmlout, opj_tcp_t *tcp); void xml_out_frame_ppm(FILE* xmlout, opj_cp_t *cp); void xml_out_frame_ppt(FILE* xmlout, opj_tcp_t *tcp); void xml_out_frame_tlm(FILE* xmlout); /* j2k_default_tcp is passed globally */ /* NO-OP. TLM NOT SAVED IN DATA STRUCTURE */ void xml_out_frame_plm(FILE* xmlout); /* j2k_default_tcp is passed globally */ /* NO-OP. PLM NOT SAVED IN DATA STRUCTURE. opt in main; can be used in conjunction with PLT */ void xml_out_frame_plt(FILE* xmlout, opj_tcp_t *tcp); /* NO-OP. PLM NOT SAVED IN DATA STRUCTURE. opt in main; can be used in conjunction with PLT */ void xml_out_frame_crg(FILE* xmlout); /* j2k_default_tcp is passed globally */ /* opt in main; */ void xml_out_frame_com(FILE* xmlout, opj_tcp_t *tcp); /* NO-OP. COM NOT SAVED IN DATA STRUCTURE */ /* opt in main; */ void xml_out_dump_hex(FILE* xmlout, char *data, int data_len, char* s); void xml_out_dump_hex_and_ascii(FILE* xmlout, char *data, int data_len, char* s); void xml_out_frame_jp2h(FILE* xmlout, opj_jp2_t *jp2_struct); #ifdef NOTYET /* Shown with cp, extended, as data structure... but it could be a new different one */ void xml_out_frame_jp2i(FILE* xmlout, opj_cp_t *cp);/* IntellectualProperty 'jp2i' (no restrictions on location) */ void xml_out_frame_xml(FILE* xmlout, opj_cp_t *cp); /* XML 'xml\040' (0x786d6c20). Can appear multiply */ void xml_out_frame_uuid(FILE* xmlout, opj_cp_t *cp); /* UUID 'uuid' (top level only) */ void xml_out_frame_uinf(FILE* xmlout, opj_cp_t *cp); /* UUIDInfo 'uinf', includes UUIDList 'ulst' and URL 'url\40' */ void xml_out_frame_unknown_type(FILE* xmlout, opj_cp_t *cp); #endif void xml_write_init(BOOL n, BOOL t, BOOL r, BOOL d) { /* Init file globals */ notes = n; sampletables = t; raw = r; derived = d; } int xml_write_struct(FILE* file, FILE *xmlout, opj_mj2_t * movie, unsigned int sampleframe, char* stringDTD, opj_event_mgr_t *event_mgr) { if(stringDTD != NULL) { fprintf(xmlout,"\n"); /* stringDTD is known to start with "SYSTEM " or "PUBLIC " */ /* typical: SYSTEM mj2_to_metadata.dtd */ stringDTD[6] = '\0'; /* Break into two strings at space, so quotes can be inserted. */ fprintf(xmlout,"\n", stringDTD, stringDTD+7); stringDTD[6] = ' '; /* restore for sake of debugger or memory allocator */ } else fprintf(xmlout,"\n"); fprintf(xmlout, "\n"); xml_write_overall_header(file, xmlout, movie, sampleframe, event_mgr); fprintf(xmlout, ""); return 0; } /* ------------- */ int xml_write_overall_header(FILE *file, FILE *xmlout, opj_mj2_t * movie, unsigned int sampleframe, opj_event_mgr_t *event_mgr) { int i; char buf[5]; buf[4] = '\0'; fprintf(xmlout, " \n"); // Called after structure initialized by mj2_read_ftyp fprintf(xmlout, " \n"); uint_to_chars(movie->brand, buf); fprintf(xmlout, " %s\n", buf); /* 4 character; BR */ fprintf(xmlout, " %u\n", movie->minversion); /* 4 char; MinV */ fprintf(xmlout, " \n",movie->num_cl); for (i = movie->num_cl - 1; i > -1; i--) /* read routine stored in reverse order, so let's undo damage */ { uint_to_chars(movie->cl[i], buf); fprintf(xmlout, " %s\n", buf); /*4 characters, each CLi */ } fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); xml_write_moov(file, xmlout, movie, sampleframe, event_mgr); // To come? // This is the container for media data that can also be accessed through track structures, // so is redundant, and simply not of interest as metadata // // Allows incremental build up of movie. Probably not in Simple Profile xml_write_free_and_skip(xmlout, movie); /* NO OP so far */ /* May be a place where user squirrels metadata */ xml_write_uuid(xmlout, movie); /* NO OP so far */ /* May be a place where user squirrels metadata */ return 0; } /* ------------- */ int xml_write_moov(FILE *file, FILE *xmlout, opj_mj2_t * movie, unsigned int sampleframe, opj_event_mgr_t *event_mgr) { unsigned int tnum; mj2_tk_t *track; fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); if(raw) fprintf(xmlout, " %u\n", movie->creation_time); if(notes) fprintf(xmlout, " \n"); /* 2082844800 = seconds between 1/1/04 and 1/1/70 */ /* There's still a time zone offset problem not solved... but spec is ambigous as to whether stored time should be local or UTC */ if(derived) { fprintf(xmlout, " "); xml_time_out(xmlout, movie->creation_time - 2082844800); fprintf(xmlout,"\n"); } fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); if(raw) fprintf(xmlout, " %u\n", movie->modification_time); if(derived) { fprintf(xmlout, " "); xml_time_out(xmlout, movie->modification_time - 2082844800); fprintf(xmlout,"\n"); } fprintf(xmlout, " \n"); fprintf(xmlout, " %d\n", movie->timescale); if(notes) fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); /* Rate to play presentation (default = 0x00010000) */ if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } if(raw) fprintf(xmlout, " 0x%08x\n", movie->rate); if(derived) fprintf(xmlout, " %12.6f\n", (double)movie->rate/(double)0x00010000); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); if(raw) fprintf(xmlout, " %u\n", movie->duration); if(derived) fprintf(xmlout, " %12.3f\n", (double)movie->duration/(double)movie->timescale); // Make this double later to get fractional seconds fprintf(xmlout, " \n"); #ifdef CURRENTSTRUCT movie->volume = movie->volume << 8; #endif fprintf(xmlout, " \n"); if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } if(raw) fprintf(xmlout, " 0x%04x\n", movie->volume); if(derived) fprintf(xmlout, " %6.3f\n", (double)movie->volume/(double)0x0100); fprintf(xmlout, " \n"); #ifdef CURRENTSTRUCT if(notes) fprintf(xmlout, " \n"); movie->volume = movie->volume >> 8; #endif /* Transformation matrix for video */ fprintf(xmlout, " \n"); if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } fprintf(xmlout, " 0x%08x\n", movie->trans_matrix[0]); fprintf(xmlout, " 0x%08x\n", movie->trans_matrix[1]); fprintf(xmlout, " 0x%08x\n", movie->trans_matrix[2]); fprintf(xmlout, " 0x%08x\n", movie->trans_matrix[3]); fprintf(xmlout, " 0x%08x\n", movie->trans_matrix[4]); fprintf(xmlout, " 0x%08x\n", movie->trans_matrix[5]); fprintf(xmlout, " 0x%08x\n", movie->trans_matrix[6]); fprintf(xmlout, " 0x%08x\n", movie->trans_matrix[7]); fprintf(xmlout, " 0x%08x\n", movie->trans_matrix[8]); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n", movie->num_vtk); fprintf(xmlout, " \n", movie->num_stk); fprintf(xmlout, " %d\n", movie->num_htk); if(notes) fprintf(xmlout, " \n"); /* See Part 3 Amend 2 Section 4.2 for relation of MJ2 to Part 12 Sections 7 and 10 hints */ fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); /* Idea for the future: It would be possible to add code to verify that the file values: 1) are legal and self-consistent 2) comply with particular JP2 and/or MJ2 profiles. This could be reported here as additional XML elements */ // Find first video track tnum = 0; while (movie->tk[tnum].track_type != 0) tnum ++; track = &(movie->tk[tnum]); // For now, output info on first video track xml_write_trak(file, xmlout, track, tnum, sampleframe, event_mgr); // to come: // possibly not in Simple Profile xml_write_moov_udta(xmlout, movie); /* NO OP so far */ /* contains */ fprintf(xmlout, " \n"); return 0; } /* --------------- */ void uint_to_chars(unsigned int value, char* buf) { /* buf is at least char[5] */ int i; for (i = 3; i >= 0; i--) { buf[i] = (value & 0x000000ff); value = (value >> 8); } buf[4] = '\0'; /* Precautionary */ } /* ------------- */ /* WINDOWS SPECIFIC */ void UnixTimeToFileTime(time_t t, LPFILETIME pft) { /* Windows specific. From MS Q167296 */ /* 'time_t' represents seconds since midnight January 1, 1970 UTC (coordinated universal time). */ /* 64-bit FILETIME structure represents the number of 100-nanosecond intervals since January 1, 1601 UTC (coordinate universal time). */ LONGLONG ll; /* LONGLONG is a 64-bit value. */ ll = Int32x32To64(t, 10000000) + 116444736000000000; pft->dwLowDateTime = (DWORD)ll; /* pft->dwLowDateTime = (DWORD)(0x00000000ffffffff & ll); */ pft->dwHighDateTime = (DWORD)(ll >> 32); } // Once the UNIX time is converted to a FILETIME structure, // other Win32 time formats can be easily obtained by using Win32 functions such // as FileTimeToSystemTime() and FileTimeToDosDateTime(). /* ------------- */ void UnixTimeToSystemTime(time_t t, LPSYSTEMTIME pst) { /* Windows specific */ FILETIME ft; UnixTimeToFileTime(t, &ft); FileTimeToLocalFileTime( &ft, &ft ); /* Adjust from UTC to local time zone */ FileTimeToSystemTime(&ft, pst); } /* ------------- */ void xml_time_out(FILE* xmlout, time_t t) { /* Windows specific */ SYSTEMTIME st; char szLocalDate[255], szLocalTime[255]; UnixTimeToSystemTime( t, &st ); GetDateFormat( LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, szLocalDate, 255 ); GetTimeFormat( LOCALE_USER_DEFAULT, 0, &st, NULL, szLocalTime, 255 ); fprintf(xmlout, "%s %s", szLocalDate, szLocalTime ); } /* END WINDOWS SPECIFIC */ /* ------------- */ void xml_write_moov_udta(FILE* xmlout, opj_mj2_t * movie) { /* Compare with xml_write_udta */ #ifdef NOTYET /* NO-OP so far. Optional UserData 'udta' (zero or one in moov or each trak) can contain multiple Copyright 'cprt' with different language codes */ /* There may be nested non-standard boxes within udta */ IMAGINE movie->udta, movie->copyright_count, movie->copyright_language[i] (array of 16bit ints), movie->copyright_notice[i] (array of buffers) PROBABLY ALSO NEED movie->udta_len or special handler for non-standard boxes char buf[5]; int i; if(movie->udta != 1) return; /* Not present */ fprintf(xmlout, " \n"); for(i = 0; i < movie->copyright_count; i++) { fprintf(xmlout, " Instance=\"%d\">\n", i+1); int16_to_3packedchars((short int)movie->copyright_languages[i], buf); fprintf(xmlout, " %s\n", buf); /* 3 chars */ fprintf(xmlout, " %s\n",movie->copyright_notices[i]); fprintf(xmlout, " \n", i+1); } /* TO DO: Non-standard boxes */ fprintf(xmlout, " \n"); #endif } void xml_write_free_and_skip(FILE* xmlout, opj_mj2_t * movie) { #ifdef NOTYET /* NO-OP so far. There can be zero or more instances of free and/or skip at the top level of the file. This may be a place where the user squirrel's metadata. Let's assume unstructured, and do a dump */ IMAGINE movie->free_and_skip, movie->free_and_skip_count, movie->free_and_skip_content[i] (array of buffers), movie->free_and_skip_len[i] (array of ints), movie->is_skip[i] (array of BOOL) int i; if(movie->free_and_skip != 1) return; /* Not present */ for(i = 0; i < movie->free_and_skip_count; i++) { if(movie->is_skip[i]) fprintf(xmlout, " \n"); else fprintf(xmlout, " \n"); xml_out_dump_hex_and_ascii(xmlout, movie->free_and_skip_contents[i], movie->free_and_skip_len[i]); if(movie->is_skip[i]) fprintf(xmlout, " \n"); else fprintf(xmlout, " \n"); } #endif } void xml_write_uuid(FILE* xmlout, opj_mj2_t * movie) { /* Univeral Unique IDs of 16 bytes. */ #ifdef NOTYET /* NO-OP so far. There can be zero or more instances of private uuid boxes in a file. This function supports the top level of the file, but uuid may be elsewhere [not yet supported]. This may be a place where the user squirrel's metadata. Let's assume unstructured, and do a dump */ IMAGINE movie->uuid, movie->uuid_count, movie->uuid_content[i] (array of buffers), movie->uuid_len[i] (array of ints), movie->uuid_type[i] (array of 17-byte (16+null termination) buffers) int i; if(movie->uuid != 1) return; /* Not present */ for(i = 0; i < movie->uuid_count; i++) { fprintf(xmlout, " \n", movie->uuid_type[i]); // See Part III section 5.2.1, 6.1, 6.2 xml_out_dump_hex_and_ascii(xmlout, movie->uuid_contents[i], movie->uuid_len[i]); fprintf(xmlout, " \n"); } #endif } /* ------------- */ void xml_write_trak(FILE* file, FILE* xmlout, mj2_tk_t *track, unsigned int tnum, unsigned int sampleframe, opj_event_mgr_t *event_mgr) { fprintf(xmlout, " \n", tnum); xml_write_tkhd(file, xmlout, track, tnum); // TO DO: TrackReferenceContainer 'tref' just used in hint track // TO DO: EditListContainer 'edts', contains EditList 'elst' with media-time, segment-duration, media-rate xml_write_mdia(file, xmlout, track, tnum); xml_write_udta(file, xmlout, track, tnum); // NO-OP so far. Optional UserData 'udta', can contain multiple Copyright 'cprt' if(track->track_type==0) { /* Only do for visual track */ /* sampleframe is from user option -f. 1 = first frame */ /* sampleframe of 0 is a user requests: no jp2 header */ /* Treat out-of-bounds values in the same way */ if(sampleframe > 0 && sampleframe <= track->num_samples) { mj2_sample_t *sample; unsigned int snum; snum = sampleframe-1; // Someday maybe do a smart range scan... for (snum=0; snum < track->num_samples; snum++){ // fprintf(stdout,"Frame %d: ",snum+1); sample = &track->sample[snum]; if(xml_out_frame(file, xmlout, sample, snum, event_mgr)) return; /* Not great error handling here */ } } fprintf(xmlout, " \n"); } /* ------------- */ void xml_write_tkhd(FILE* file, FILE* xmlout, mj2_tk_t *track, unsigned int tnum) { fprintf(xmlout, " \n"); if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } fprintf(xmlout, " %u\n", track->track_ID); if(track->track_type==0) /* For visual track */ { fprintf(xmlout, " %d\n", track->layer); if(notes) fprintf(xmlout," \n"); } if(track->track_type!=0) /* volume irrelevant for visual track */ { #ifdef CURRENTSTRUCT track->volume = track->volume << 8; #endif fprintf(xmlout, " \n"); if(notes) { fprintf(xmlout," \n"); fprintf(xmlout," \n"); } if(raw) fprintf(xmlout," 0x%04x\n", track->volume); if(derived) fprintf(xmlout," %6.3f\n", (double)track->volume/(double)0x0100); fprintf(xmlout, " \n"); #ifdef CURRENTSTRUCT if(notes) fprintf(xmlout, " \n"); track->volume = track->volume >> 8; #endif } if(track->track_type==0) { /* Transformation matrix for video */ fprintf(xmlout, " \n"); if(notes) { fprintf(xmlout," \n"); fprintf(xmlout," \n"); } fprintf(xmlout, " 0x%08x\n", track->trans_matrix[0]); fprintf(xmlout, " 0x%08x\n", track->trans_matrix[1]); fprintf(xmlout, " 0x%08x\n", track->trans_matrix[2]); fprintf(xmlout, " 0x%08x\n", track->trans_matrix[3]); fprintf(xmlout, " 0x%08x\n", track->trans_matrix[4]); fprintf(xmlout, " 0x%08x\n", track->trans_matrix[5]); fprintf(xmlout, " 0x%08x\n", track->trans_matrix[6]); fprintf(xmlout, " 0x%08x\n", track->trans_matrix[7]); fprintf(xmlout, " 0x%08x\n", track->trans_matrix[8]); fprintf(xmlout, " \n"); } #ifdef CURRENTSTRUCT track->w = track->w << 16; track->h = track->h << 16; #endif if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } fprintf(xmlout, " \n"); if(raw) fprintf(xmlout, " 0x%08x\n", track->w); if(derived) fprintf(xmlout, " %12.6f\n", (double)track->w/(double)0x00010000); /* Rate to play presentation (default = 0x00010000) */ fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); if(raw) fprintf(xmlout, " 0x%08x\n", track->h); if(derived) fprintf(xmlout, " %12.6f\n", (double)track->h/(double)0x00010000); /* Rate to play presentation (default = 0x00010000) */ fprintf(xmlout, " \n"); #ifdef CURRENTSTRUCT if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } track->w = track->w >> 16; track->h = track->h >> 16; #endif fprintf(xmlout, " \n"); } /* ------------- */ void xml_write_udta(FILE* file, FILE* xmlout, mj2_tk_t *track, unsigned int tnum) { /* NO-OP so far. Optional UserData 'udta' (zero or one in moov or each trak) can contain multiple Copyright 'cprt' with different language codes */ /* There may be nested non-standard boxes within udta */ #ifdef NOTYET IMAGINE track->udta, track->copyright_count, track->copyright_language[i] (array of 16bit ints), track->copyright_notice[i] (array of buffers) PROBABLY ALSO NEED track->udta_len or special handler for non-standard boxes char buf[5]; int i; if(track->udta != 1) return; /* Not present */ fprintf(xmlout, " \n"); for(i = 0; i < track->copyright_count; i++) { fprintf(xmlout, " Instance=\"%d\">\n", i+1); int16_to_3packedchars((short int)track->copyright_languages[i], buf); fprintf(xmlout, " %s\n", buf); /* 3 chars */ fprintf(xmlout, " %s\n",track->copyright_notices[i]); fprintf(xmlout, " \n", i+1); } /* TO DO: Non-standard boxes */ fprintf(xmlout, " \n"); #endif } /* ------------- */ void xml_write_mdia(FILE* file, FILE* xmlout, mj2_tk_t *track, unsigned int tnum) { char buf[5]; int i, k; buf[4] = '\0'; fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); if(raw) fprintf(xmlout, " %u\n", track->creation_time); if(notes) fprintf(xmlout, " \n"); /* 2082844800 = seconds between 1/1/04 and 1/1/70 */ /* There's still a time zone offset problem not solved... but spec is ambigous as to whether stored time should be local or UTC */ if(derived) { fprintf(xmlout, " "); xml_time_out(xmlout, track->creation_time - 2082844800); fprintf(xmlout,"\n"); } fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); if(raw) fprintf(xmlout, " %u\n", track->modification_time); if(derived) { fprintf(xmlout, " "); xml_time_out(xmlout, track->modification_time - 2082844800); fprintf(xmlout,"\n"); } fprintf(xmlout, " \n"); fprintf(xmlout, " %d\n", track->timescale); if(notes) fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); if(raw) fprintf(xmlout, " %u\n", track->duration); if(derived) fprintf(xmlout, " %12.3f\n", (double)track->duration/(double)track->timescale); // Make this double later to get fractional seconds fprintf(xmlout, " \n"); int16_to_3packedchars((short int)track->language, buf); fprintf(xmlout, " %s\n", buf); /* 3 chars */ fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); switch(track->track_type) { case 0: fprintf(xmlout, " video media track\n"); break; case 1: fprintf(xmlout, " Sound\n"); break; case 2: fprintf(xmlout, " Hint\n"); break; } if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); switch(track->track_type) { case 0: fprintf(xmlout, " \n"); fprintf(xmlout, " 0x%02x\n", track->graphicsmode); if(notes) { fprintf(xmlout," \n"); fprintf(xmlout," \n"); fprintf(xmlout," \n"); fprintf(xmlout," \n"); /* fprintf(xmlout," \n"); This was evidently dropped upon amendment */ fprintf(xmlout," \n"); fprintf(xmlout," \n"); } fprintf(xmlout, " \n"); fprintf(xmlout, " 0x%02x\n", track->opcolor[0]); fprintf(xmlout, " 0x%02x\n",track->opcolor[1]); fprintf(xmlout, " 0x%02x\n",track->opcolor[2]); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); break; case 1: fprintf(xmlout, " \n"); #ifdef CURRENTSTRUCT track->balance = track->balance << 8; #endif fprintf(xmlout, " \n"); if(notes) { fprintf(xmlout," \n"); fprintf(xmlout," \n"); fprintf(xmlout," \n"); } if(raw) fprintf(xmlout," 0x%04x\n", track->balance); if(derived) fprintf(xmlout," %6.3f\n", (double)track->balance/(double)0x0100); fprintf(xmlout, " \n"); #ifdef CURRENTSTRUCT if(notes) fprintf(xmlout," \n"); track->balance = track->balance >> 8; #endif fprintf(xmlout, " \n"); break; case 2: fprintf(xmlout, " \n"); fprintf(xmlout, " %d\n", track->maxPDUsize); if(notes) fprintf(xmlout," \n"); fprintf(xmlout, " %d\n", track->avgPDUsize); if(notes) fprintf(xmlout," \n"); fprintf(xmlout, " %d\n", track->maxbitrate); if(notes) fprintf(xmlout," \n"); fprintf(xmlout, " %d\n", track->avgbitrate); if(notes) fprintf(xmlout," \n"); fprintf(xmlout, " %d\n", track->slidingavgbitrate); if(notes) fprintf(xmlout," \n"); fprintf(xmlout, " \n"); break; } fprintf(xmlout, " \n"); fprintf(xmlout, " \n", track->num_url, track->num_urn); // table w. flags, URLs, URNs // Data structure does not distinguish between single URL, single URN, or DREF table or URLs & URNs. // We could infer those, but for now just present everything as a DREF table. if(notes) fprintf(xmlout, " \n"); for(k = 0; k < track->num_url; k++) { fprintf(xmlout, " \n"); // table w. flags, URLs, URNs if(notes) fprintf(xmlout," \n"); for(i = 0; i < 4; i++) { uint_to_chars(track->url[track->num_url].location[i], buf); fprintf(xmlout, " %s\n"); } fprintf(xmlout, " \n"); // table w. flags, URLs, URNs } for(k = 0; k < track->num_urn; k++) { fprintf(xmlout," \n"); // table w. flags, URLs, URNs // Only the first 16 bytes are recorded in the data structure currently. if(notes) fprintf(xmlout," \n"); fprintf(xmlout, " "); for(i = 0; i < 4; i++) { uint_to_chars(track->urn[track->num_urn].name[i], buf); fprintf(xmlout,"%s", buf); } fprintf(xmlout, "\n"); fprintf(xmlout, " "); for(i = 0; i < 4; i++) { uint_to_chars(track->urn[track->num_urn].location[i], buf); fprintf(xmlout,"%s"); } fprintf(xmlout, "\n"); fprintf(xmlout, " \n"); } fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); xml_write_stbl(file, xmlout, track, tnum); /* SampleTable */ fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } /* ------------- */ void xml_write_stbl(FILE* file, FILE* xmlout, mj2_tk_t *track, unsigned int tnum) { char buf[5], buf33[33]; int i, len; buf[4] = '\0'; fprintf(xmlout, " \n"); if(notes) fprintf(xmlout, " \n"); switch(track->track_type) { case 0: // There could be multiple instances of this, but "entry_count" is just a local at read-time. // And it's used wrong, too, as count of just visual type, when it's really all 3 types. // This is referred to as "smj2" within mj2.c fprintf(xmlout, " \n"); if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } /* No shifting required. If CURRENTSTRUCT gets changed, then may need to revisit treatment of these */ fprintf(xmlout, " %d\n", track->w); fprintf(xmlout, " %d\n", track->h); // Horizresolution and vertresolution don't require shifting, already stored right in CURRENTSTRUCT if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } fprintf(xmlout, " \n"); if(raw) fprintf(xmlout, " 0x%08x\n", track->horizresolution); if(derived) fprintf(xmlout, " %12.6f\n", (double)track->horizresolution/(double)0x00010000); /* Rate to play presentation (default = 0x00010000) */ fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); if(raw) fprintf(xmlout, " 0x%08x\n", track->vertresolution); if(derived) fprintf(xmlout, " %12.6f\n", (double)track->vertresolution/(double)0x00010000); /* Rate to play presentation (default = 0x00010000) */ fprintf(xmlout, " \n"); buf33[0] = '\0'; for(i = 0; i < 8; i++) { uint_to_chars((unsigned int)track->compressorname[i], buf); strcat(buf33, buf); /* This loads up (4 * 8) + 1 chars, but trailing ones are usually junk */ } len = (int)buf33[0]; /* First byte has string length in bytes. There may be garbage beyond it. */ buf33[len+1] = '\0'; /* Suppress it */ fprintf(xmlout, " %s\n", buf33+1); /* Start beyond first byte */ if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } fprintf(xmlout, " 0x%02x\n",track->depth); if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } xml_out_frame_jp2h(xmlout, &(track->jp2_struct)); /* JP2 Header */ /* Following subboxes are optional */ fprintf(xmlout, " \n"); fprintf(xmlout, " %d\n", (unsigned int)track->fieldcount); /* uchar as 1 byte uint */ if(notes) fprintf(xmlout, " \n"); fprintf(xmlout, " %d\n", (unsigned int)track->fieldorder); /* uchar as 1 byte uint */ if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } fprintf(xmlout, " \n"); fprintf(xmlout, " \n",track->num_br); for (i = 0; i < track->num_br; i++) /* read routine stored in reverse order, so let's undo damage */ { uint_to_chars(track->br[i], buf); fprintf(xmlout, " %s\n", buf); /*4 characters, each CLi */ } fprintf(xmlout, " \n"); fprintf(xmlout, " \n",track->num_jp2x); for (i = 0; i < track->num_jp2x; i++) { // We'll probably need better formatting than this fprintf(xmlout, " 0x%02x\n", track->jp2xdata[i]); /* Each entry is single byte */ } fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); /* These values are all 1 byte */ if(notes) fprintf(xmlout, " \n"); fprintf(xmlout, " %d\n", track->hsub); fprintf(xmlout, " %d\n", track->vsub); fprintf(xmlout, " %d\n", track->hoff); fprintf(xmlout, " %d\n", track->voff); if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } fprintf(xmlout, " \n"); /* These values are all 1 byte */ fprintf(xmlout, " \n"); /* Part III Appx. 2 */ fprintf(xmlout, " %u\n", (unsigned int)track->or_fieldcount); /* uchar as 1-byte uint */ if(notes) fprintf(xmlout, " \n"); fprintf(xmlout, " %u\n", (unsigned int)track->or_fieldorder); /* uchar as 1-byte uint */ if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); break; case 1: case 2: if(notes) fprintf(xmlout, " \n"); break; } fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " %d\n", track->num_samples); if(notes) fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n", track->num_tts); for (i = 0; i < track->num_tts; i++) { fprintf(xmlout, " \n", i+1, track->tts[i].sample_count, track->tts[i].sample_delta); } fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n", track->num_samplestochunk); for (i = 0; i < track->num_samplestochunk; i++) { fprintf(xmlout, " %u\n",track->sampletochunk[i].first_chunk); /* 4 bytes */ fprintf(xmlout, " %u\n",track->sampletochunk[i].samples_per_chunk); /* 4 bytes */ fprintf(xmlout, " %u\n",track->sampletochunk[i].sample_descr_idx); /* 4 bytes */ } fprintf(xmlout, " \n"); // After reading this info in, track->num_chunks is calculated and a decompressed table established internally. fprintf(xmlout, " \n"); if(track->same_sample_size) { // all values in track->sample[i].sample_size are equal. Grab the first one. fprintf(xmlout, " %u\n", track->sample[0].sample_size); if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } } else { fprintf(xmlout, " 0\n"); if(notes) if(sampletables) fprintf(xmlout," \n"); else fprintf(xmlout," \n"); fprintf(xmlout, " %u\n", track->num_samples); if(sampletables) for (i = 0; i < (int)track->num_samples; i++) { fprintf(xmlout, " %u\n", i+1, track->sample[i].sample_size); } } fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); // Structure not yet - Variant ChunkLargeOffset 'co64' fprintf(xmlout, " %u\n", track->num_chunks); if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } if(sampletables) for (i = 0; i < (int)track->num_chunks; i++) fprintf(xmlout, " %u\n", i+1, track->chunk[i].offset); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } /* ------------- */ int xml_out_frame(FILE* file, FILE* xmlout, mj2_sample_t *sample, unsigned int snum, opj_event_mgr_t *event_mgr) { opj_dparameters_t parameters; /* decompression parameters */ opj_image_t *img; opj_cp_t *cp; int i; int numcomps; unsigned char* frame_codestream; opj_dinfo_t* dinfo = NULL; /* handle to a decompressor */ opj_cio_t *cio = NULL; opj_j2k_t *j2k; /* JPEG 2000 compressed image data */ /* get a decoder handle */ dinfo = opj_create_decompress(CODEC_J2K); /* catch events using our callbacks and give a local context */ opj_set_event_mgr((opj_common_ptr)dinfo, event_mgr, stderr); /* setup the decoder decoding parameters using the current image and user parameters */ parameters.cp_limit_decoding = DECODE_ALL_BUT_PACKETS; opj_setup_decoder(dinfo, ¶meters); frame_codestream = (unsigned char*) malloc (sample->sample_size-8); /* Skipping JP2C marker */ if(frame_codestream == NULL) return 1; fseek(file,sample->offset+8,SEEK_SET); fread(frame_codestream,sample->sample_size-8,1, file); /* Assuming that jp and ftyp markers size do */ /* open a byte stream */ cio = opj_cio_open((opj_common_ptr)dinfo, frame_codestream, sample->sample_size-8); /* Decode J2K to image: */ img = opj_decode(dinfo, cio); if (!img) { fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n"); opj_destroy_decompress(dinfo); opj_cio_close(cio); return 1; } j2k = (opj_j2k_t*)dinfo->j2k_handle; j2k_default_tcp = j2k->default_tcp; cp = j2k->cp; numcomps = img->numcomps; /* Alignments: " < To help maintain xml pretty-printing */ fprintf(xmlout, " \n", snum+1); fprintf(xmlout, " \n"); /* There can be multiple codestreams; a particular image is entirely within a single codestream */ /* TO DO: A frame can be represented by two I-guess-contigious codestreams if its interleaved. */ fprintf(xmlout, " \n"); /* "cp" stands for "coding parameter"; "tcp" is tile coding parameters, "tccp" is tile-component coding parameters */ xml_out_frame_siz(xmlout, img, cp); /* reqd in main */ xml_out_frame_cod(xmlout, j2k_default_tcp); /* reqd in main */ xml_out_frame_coc(xmlout, j2k_default_tcp, numcomps); /* opt in main, at most 1 per component */ xml_out_frame_qcd(xmlout, j2k_default_tcp); /* reqd in main */ xml_out_frame_qcc(xmlout, j2k_default_tcp, numcomps); /* opt in main, at most 1 per component */ xml_out_frame_rgn(xmlout, j2k_default_tcp, numcomps); /* opt, at most 1 per component */ xml_out_frame_poc(xmlout, j2k_default_tcp); /* opt (but reqd in main or tile for any progression order changes) */ /* Next four get j2k_default_tcp passed globally: */ #ifdef SUPPRESS_FOR_NOW xml_out_frame_ppm(xmlout, cp); /* opt (but either PPM or PPT [distributed in tile headers] or codestream packet header reqd) */ #endif xml_out_frame_tlm(xmlout); /* NO-OP. TLM NOT SAVED IN DATA STRUCTURE */ /* opt */ xml_out_frame_plm(xmlout); /* NO-OP. PLM NOT SAVED IN DATA STRUCTURE */ /* opt in main; can be used in conjunction with PLT */ xml_out_frame_crg(xmlout); /* NO-OP. CRG NOT SAVED IN DATA STRUCTURE */ /* opt in main; */ xml_out_frame_com(xmlout, j2k_default_tcp); /* NO-OP. COM NOT SAVED IN DATA STRUCTURE */ /* opt in main; */ fprintf(xmlout, " \n"); /* TO DO: all the tile headers (sigh) */ fprintf(xmlout, " \n", cp->tileno_size); /* size of the vector tileno */ for(i = 0; i < cp->tileno_size; i++) { /* I think cp->tileno_size will be same number as (cp->tw * cp->th) or as global j2k_curtileno */ // Standard seems to use zero-based # for tile-part. fprintf(xmlout, " \n", i, cp->tileno[i]); /* ID number of the tiles present in the codestream */ fprintf(xmlout, " \n"); /* All markers in tile-part headers (between SOT and SOD) are optional, unless structure requires. */ if(i == 0) { xml_out_frame_cod(xmlout, &(cp->tcps[i])); /* No more than 1 per tile */ xml_out_frame_coc(xmlout, &(cp->tcps[i]), numcomps); /* No more than 1 per component */ xml_out_frame_qcd(xmlout, &(cp->tcps[i])); /* No more than 1 per tile */ xml_out_frame_qcc(xmlout, &(cp->tcps[i]), numcomps); /* No more than 1 per component */ xml_out_frame_rgn(xmlout, &(cp->tcps[i]), numcomps); /* No more than 1 per component */ } xml_out_frame_poc(xmlout, &(cp->tcps[i])); /* Reqd only if any progression order changes different from main POC */ #ifdef SUPPRESS_FOR_NOW xml_out_frame_ppt(xmlout, &(cp->tcps[i])); /* Either PPT [distributed in tile headers] or PPM or codestream packet header reqd. */ #endif xml_out_frame_plt(xmlout, &(cp->tcps[i])); /* NO-OP. PLT NOT SAVED IN DATA STRUCTURE */ /* Can be used in conjunction with main's PLM */ xml_out_frame_com(xmlout, &(cp->tcps[i])); /* NO-OP. COM NOT SAVED IN DATA STRUCTURE */ /* opj_tcp_t * cp->tcps; "tile coding parameters" */ /* Maybe not: fprintf(xmlout, " <>%d, cp->matrice[i]; */ /* Fixed layer */ fprintf(xmlout, " \n"); if(notes) fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } fprintf(xmlout, " \n"); /* size of the vector tileno */ #ifdef NOTYET IMAGINE the cp object has data to support the following... but we could use an new different data structure instead /* I'm unclear if the span of the original fread(frame_codestream...) included the following items if they're trailing. */ /* ALSO TO DO, BUT DATA STRUCTURE DOESN'T HANDLE YET: boxes (anywhere in file except before the Filetype box): */ xml_out_frame_jp2i(xmlout, &cp); /* IntellectualProperty 'jp2i' (no restrictions on location) */ xml_out_frame_xml(xmlout, &cp); /* XML 'xml\040' (0x786d6c20). Can appear multiply */ xml_out_frame_uuid(xmlout, &cp); /* UUID 'uuid' (top level only) */ xml_out_frame_uinf(xmlout, &cp); /* UUIDInfo 'uinf', includes UUIDList 'ulst' and URL 'url\40' */ #endif fprintf(xmlout, " \n"); /* Extra commentary: */ if(notes) { fprintf(xmlout, " \n"); if (((img->numcomps == 3) && (img->comps[0].dx == img->comps[1].dx / 2) && (img->comps[0].dx == img->comps[2].dx / 2 ) && (img->comps[0].dx == 1)) || (img->numcomps == 1)) { fprintf(xmlout, " \n"); } else if ((img->numcomps == 3) && (img->comps[0].dx == 1) && (img->comps[1].dx == 1)&& (img->comps[2].dx == 1)) {// If YUV 4:4:4 input --> to bmp fprintf(xmlout, " \n"); } else { fprintf(xmlout, " \n"); } } opj_destroy_decompress(dinfo); opj_cio_close(cio); free(frame_codestream); return 0; } /* ------------- */ void int16_to_3packedchars(short int value, char* buf) { /* This is to retrieve the 3-letter ASCII language code */ /* Each char is packed into 5 bits, as difference from 0x60 */ int i; for (i = 2; i >= 0; i--) { buf[i] = (value & 0x001f) + 0x60; value = (value >>5); } buf[3] = '\0'; } /* ------------- */ void xml_out_frame_siz(FILE* xmlout, opj_image_t *img, opj_cp_t *cp) { opj_image_comp_t *comp; int i; fprintf(xmlout, " \n"); // This is similar to j2k.c's j2k_dump_image. // Not of interest: Lsiz, Rsiz fprintf(xmlout, " %d\n", img->x1); fprintf(xmlout, " %d\n", img->y1); if(notes) fprintf(xmlout, " \n"); fprintf(xmlout, " %d\n", img->x0); fprintf(xmlout, " %d\n", img->y0); if(notes) fprintf(xmlout, " \n"); fprintf(xmlout, " %d\n", cp->tdx); fprintf(xmlout, " %d\n", cp->tdy); if(notes) fprintf(xmlout, " \n"); fprintf(xmlout, " %d\n", cp->tx0); fprintf(xmlout, " %d\n", cp->ty0); if(notes) fprintf(xmlout, " \n"); fprintf(xmlout, " %d\n", img->numcomps); if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); //fprintf(xmlout," \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } for (i = 0; i < img->numcomps; i++) {/* image-components */ comp = &(img->comps[i]); fprintf(xmlout, " \n", i+1); fprintf(xmlout, " \n"); if(raw) fprintf(xmlout," 0x%02x\n", (comp->sgnd << 7) & (comp->prec - 1)); if(derived) { fprintf(xmlout," %d\n", comp->sgnd); fprintf(xmlout," %d\n", comp->prec); } fprintf(xmlout, " \n"); fprintf(xmlout, " %d\n", comp->dx); fprintf(xmlout, " %d\n", comp->dy); fprintf(xmlout, " %d\n", comp->w); fprintf(xmlout, " %d\n", comp->h); /* Rest of these aren't calculated when SIZ is read: fprintf(xmlout, " %d\n", comp->x0); fprintf(xmlout, " %d\n", comp->y0); if(notes) fprintf(xmlout," \n"); fprintf(xmlout, " %d\n", comp->bpp); fprintf(xmlout, " %d\n", comp->resno_decoded); */ // SUPPRESS: n/a to mj2_to_metadata. fprintf(xmlout," %dfactor); /* factor = number of division by 2 of the out image compare to the original size of image */ // TO DO comp->data: int *data; /* image-component data */ fprintf(xmlout, " \n"); } fprintf(xmlout, " \n"); } /* ------------- */ void xml_out_frame_cod(FILE* xmlout, opj_tcp_t *tcp) { /* Could be called with tcp = &j2k_default_tcp; /* Or, for tile-part header, with &j2k_cp->tcps[j2k_curtileno] /* Alignment for main:" < < < < To help maintain xml pretty-printing */ /* Alignment for tile:" < < < To help maintain xml pretty-printing */ opj_tccp_t *tccp; int i; char spaces[13] = " "; /* 12 spaces if tilepart*/ char* s = spaces; if(tcp == j2k_default_tcp) { s++;s++; /* shorten s to 10 spaces if main */ } tccp = &(tcp->tccps[0]); fprintf(xmlout, "%s\n",s); /* Required in main header */ /* Not retained or of interest: Lcod */ fprintf(xmlout, "%s 0x%02x\n", s, tcp->csty); /* 1 byte */ if(notes) { fprintf(xmlout, "%s \n",s); fprintf(xmlout, "%s \n",s); fprintf(xmlout, "%s \n",s); fprintf(xmlout, "%s \n",s); fprintf(xmlout, "%s \n",s); } fprintf(xmlout, "%s \n",s); fprintf(xmlout, "%s %d\n", s, tcp->prg); /* 1 byte, SGcod (A) */ if(notes) { fprintf(xmlout, "%s \n",s); fprintf(xmlout, "%s \n",s); fprintf(xmlout, "%s \n",s); } fprintf(xmlout, "%s %d\n", s, tcp->numlayers); /* 2 bytes, SGcod (B) */ fprintf(xmlout, "%s %d\n", s, tcp->mct); /* 1 byte, SGcod (C). More or less boolean */ if(notes) fprintf(xmlout, "%s \n",s); fprintf(xmlout, "%s \n",s); /* This code will compile only if declaration of j2k_default_tcp is changed from static (to implicit extern) in j2k.c */ fprintf(xmlout, "%s \n",s); /* Internal data structure tccp defines separate defaults for each component, but they all get the same values */ /* So we only have to report the first component's values here. */ /* Compare j2k_read_cox(...) */ fprintf(xmlout, "%s %d\n", s, tccp->numresolutions - 1); /* 1 byte, SPcox (D) */ fprintf(xmlout, "%s %d\n", s, tccp->cblkw - 2); /* 1 byte, SPcox (E) */ fprintf(xmlout, "%s %d\n", s, tccp->cblkh - 2); /* 1 byte, SPcox (F) */ if(notes) { fprintf(xmlout, "%s \n",s); fprintf(xmlout, "%s \n", s); } fprintf(xmlout, "%s 0x%02x\n", s, tccp->cblksty); /* 1 byte, SPcox (G) */ if(notes) { fprintf(xmlout, "%s \n",s); fprintf(xmlout, "%s \n",s); fprintf(xmlout, "%s \n",s); fprintf(xmlout, "%s \n",s); fprintf(xmlout, "%s \n",s); fprintf(xmlout, "%s \n",s); fprintf(xmlout, "%s \n",s); } fprintf(xmlout, "%s %d\n", s, tccp->qmfbid); /* 1 byte, SPcox (H) */ if(notes) fprintf(xmlout, "%s \n",s); if (tccp->csty & J2K_CP_CSTY_PRT) { fprintf(xmlout, "%s \n",s); /* 1 byte, SPcox (I_i) */ if(notes) fprintf(xmlout, "%s \n",s); for (i = 0; i < tccp->numresolutions; i++) { fprintf(xmlout, "%s \n", s, i); if(raw) fprintf(xmlout,"%s 0x%02x\n", s, (tccp->prch[i] << 4) | tccp->prcw[i]); /* packed into 1 byte, SPcox (G) */ if(derived) { fprintf(xmlout,"%s %d\n", s, tccp->prcw[i]); fprintf(xmlout,"%s %d\n", s, tccp->prch[i]); } fprintf(xmlout, "%s \n", s, i); } fprintf(xmlout, "%s \n",s); /* 1 byte, SPcox (I_i) */ } fprintf(xmlout, "%s \n",s); fprintf(xmlout, "%s\n",s); } /* ------------- */ void xml_out_frame_coc(FILE* xmlout, opj_tcp_t *tcp, int numcomps) /* Optional in main & tile-part headers */ { /* Uses global j2k_default_tcp */ opj_tccp_t *tccp, *firstcomp_tccp; int i, compno; char spaces[13] = " "; /* 12 spaces if tilepart*/ char* s = spaces; if(tcp == j2k_default_tcp) { s++;s++; /* shorten s to 10 spaces if main */ } firstcomp_tccp = &(tcp->tccps[0]); /* Internal data structure tccp defines separate defaults for each component, set from main */ /* default, then selectively overwritten. */ /* Compare j2k_read_cox(...) */ /* We don't really know which was the default, and which were not */ /* Let's pretend that [0] is the default and all others are not */ if(notes) { fprintf(xmlout, "%s\n", s); if(tcp == j2k_default_tcp) fprintf(xmlout, "%s\n", s); else fprintf(xmlout, "%s\n", s); } for (compno = 1; compno < numcomps; compno++) /* spec says components are zero-based */ { tccp = &tcp->tccps[compno]; if(same_component_style(firstcomp_tccp, tccp)) continue; /* Alignments: " < < < < < To help maintain xml pretty-printing */ fprintf(xmlout, "%s\n", s); /* Optional in main header, at most 1 per component */ if(notes) fprintf(xmlout, "%s \n", s); /* Overrides the main COD for the specific component */ /* Not retained or of interest: Lcod */ fprintf(xmlout, "%s 0x%02x\n", s, tccp->csty); /* 1 byte */ if(notes) { fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); } fprintf(xmlout, "%s %d\n", s, compno); /* 1 or 2 bytes */ /* Unfortunately compo isn't retained in j2k_read_coc: compno = cio_read(j2k_img->numcomps <= 256 ? 1 : 2); /* Ccoc */ /*if(j2k_img_numcomps <=256) component is 1 byte else compno is 2 byte */ /* This code will compile only if declaration of j2k_default_tcp is changed from static (to implicit extern) in j2k.c */ fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s %d\n", s, tccp->numresolutions - 1); /* 1 byte, SPcox (D) */ fprintf(xmlout, "%s %d\n", s, tccp->cblkw - 2); /* 1 byte, SPcox (E) */ fprintf(xmlout, "%s %d\n", s, tccp->cblkh - 2); /* 1 byte, SPcox (F) */ if(notes) { fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); } fprintf(xmlout, "%s 0x%02x\n", s, tccp->cblksty); /* 1 byte, SPcox (G) */ if(notes) { fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); } fprintf(xmlout, "%s %d\n", s, tccp->qmfbid); /* 1 byte, SPcox (H) */ if(notes) fprintf(xmlout, "%s \n", s); if (tccp->csty & J2K_CP_CSTY_PRT) { fprintf(xmlout, "%s \n", s); /* 1 byte, SPcox (I_i) */ if(notes) fprintf(xmlout, "%s \n", s); for (i = 0; i < tccp->numresolutions-1; i++) { /* subtract 1 to get # of decomposition levels */ fprintf(xmlout, "%s \n", s, i); if(raw) fprintf(xmlout,"%s 0x%02x\n", s, (tccp->prch[i] << 4) | tccp->prcw[i]); /* packed into 1 byte, SPcox (G) */ if(derived) { fprintf(xmlout,"%s %d\n", s, tccp->prcw[i]); fprintf(xmlout,"%s %d\n", s, tccp->prch[i]); } fprintf(xmlout, "%s \n", s, i); } fprintf(xmlout, "%s \n", s); /* 1 byte, SPcox (I_i) */ } fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s\n", s); } } /* ------------- */ BOOL same_component_style(opj_tccp_t *tccp1, opj_tccp_t *tccp2) { int i; if(tccp1->numresolutions != tccp2->numresolutions) return FALSE; if(tccp1->cblkw != tccp2->cblkw) return FALSE; if(tccp1->cblkh != tccp2->cblkh) return FALSE; if(tccp1->cblksty != tccp2->cblksty) return FALSE; if(tccp1->csty != tccp2->csty) return FALSE; if (tccp1->csty & J2K_CP_CSTY_PRT) { for (i = 0; i < tccp1->numresolutions; i++) { if(tccp1->prcw[i] != tccp2->prcw[i] || tccp1->prch[i] != tccp2->prch[i]) return FALSE; } } return TRUE; } /* ------------- */ void xml_out_frame_qcd(FILE* xmlout, opj_tcp_t *tcp) { /* This code will compile only if declaration of j2k_default_tcp is changed from static (to implicit extern) in j2k.c */ opj_tccp_t *tccp; int bandno, numbands; char spaces[13] = " "; /* 12 spaces if tilepart*/ char* s = spaces; if(tcp == j2k_default_tcp) { s++;s++; /* shorten s to 10 spaces if main */ } /* Compare j2k_read_qcx */ fprintf(xmlout, "%s\n", s); /* Required in main header, single occurrence */ tccp = &(tcp->tccps[0]); /* Not retained or of interest: Lqcd */ fprintf(xmlout, "%s \n", s); /* 1 byte */ if(notes) fprintf(xmlout, "%s \n", s); if(raw) fprintf(xmlout, "%s 0x%02x\n", s, (tccp->numgbits) << 5 | tccp->qntsty); if(derived) fprintf(xmlout, "%s %d\n", s, tccp->qntsty); if(notes) { fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); } if(derived) fprintf(xmlout, "%s %d\n", s, tccp->numgbits); if(notes) fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); /* Problem: numbands in some cases is calculated from len, which is not retained or available here at this time */ /* So we'll just dump all internal values */ /* We could calculate it, but I'm having trouble believing the length equations in the standard */ fprintf(xmlout, "%s \n", s); switch(tccp->qntsty) { case J2K_CCP_QNTSTY_NOQNT: /* no quantization */ /* This is what standard says, but I don't believe it: len = 4 + (3*decomp); */ numbands = J2K_MAXBANDS; /* should be: numbands = len - 1; */ /* Better: IMAGINE numbands = tccp->stepsize_numbands; */ /* Instead look for first zero exponent, quit there. Adequate? */ fprintf(xmlout, "%s \n", s); if(notes) { fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); } for (bandno = 0; bandno < numbands; bandno++) { if(tccp->stepsizes[bandno].expn == 0) break; /* Remove when we have real numbands */ fprintf(xmlout, "%s \n", s, bandno); if(raw) fprintf(xmlout,"%s 0x%02x\n", s, tccp->stepsizes[bandno].expn << 3); if(derived) fprintf(xmlout,"%s %d\n", s, tccp->stepsizes[bandno].expn); fprintf(xmlout, "%s \n", s); } fprintf(xmlout, "%s \n", s); break; case J2K_CCP_QNTSTY_SIQNT: /* scalar quantization derived */ /* This is what standard says. Should I believe it:: len = 5; /* numbands = 1; */ fprintf(xmlout, "%s \n", s); if(notes) fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); if(notes) fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); } for (bandno = 1; bandno < J2K_MAXBANDS; bandno++) { if(tccp->stepsizes[bandno].expn == 0) break; fprintf(xmlout, "%s %d\n", s, bandno, tccp->stepsizes[bandno].expn); } fprintf(xmlout, "%s \n", s); break; default: /* J2K_CCP_QNTSTY_SEQNT */ /* scalar quantization expounded */ /* This is what standard says, but should I believe it: len = 5 + 6*decomp; */ numbands = J2K_MAXBANDS; /* should be: (len - 1) / 2;*/ /* Better: IMAGINE numbands = tccp->stepsize_numbands; */ fprintf(xmlout, "%s \n", s); if(notes) { fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); } for (bandno = 0; bandno < numbands; bandno++) { if(tccp->stepsizes[bandno].expn == 0 && tccp->stepsizes[bandno].mant == 0) break; /* Remove when we have real numbands */ fprintf(xmlout, "%s \n", s, bandno); if(raw) fprintf(xmlout,"%s 0x%02x\n", s, (tccp->stepsizes[bandno].expn << 11) | tccp->stepsizes[bandno].mant); if(derived) { fprintf(xmlout,"%s %d\n", s, tccp->stepsizes[bandno].expn); fprintf(xmlout,"%s %d\n", s, tccp->stepsizes[bandno].mant); } fprintf(xmlout, "%s \n", s); } fprintf(xmlout, "%s \n", s); break; } /* switch */ fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s\n", s); /* Alignments: " < < < < < To help maintain xml pretty-printing */ } /* ------------- */ void xml_out_frame_qcc(FILE* xmlout, opj_tcp_t *tcp, int numcomps) { /* Uses global j2k_default_tcp */ /* This code will compile only if declaration of j2k_default_tcp is changed from static (to implicit extern) in j2k.c */ opj_tccp_t *tccp, *firstcomp_tccp; int bandno, numbands; int compno; char spaces[13] = " "; /* 12 spaces if tilepart*/ char* s = spaces; if(tcp == j2k_default_tcp) { s++;s++; /* shorten s to 10 spaces if main */ } firstcomp_tccp = &(tcp->tccps[0]); /* Internal data structure tccp defines separate defaults for each component, set from main */ /* default, then selectively overwritten. */ /* Compare j2k_read_qcx(...) */ /* We don't really know which was the default, and which were not */ /* Let's pretend that [0] is the default and all others are not */ if(notes) { fprintf(xmlout, "%s\n", s); if(tcp == j2k_default_tcp) fprintf(xmlout, "%s\n", s); else fprintf(xmlout, "%s\n", s); } for (compno = 1; compno < numcomps; compno++) /* spec says components are zero-based */ { tccp = &(tcp->tccps[compno]); if(same_component_quantization(firstcomp_tccp, tccp)) continue; /* Compare j2k_read_qcx */ fprintf(xmlout, "%s\n", s, compno); /* Required in main header, single occurrence */ tccp = &j2k_default_tcp->tccps[0]; /* Not retained or perhaps of interest: Lqcd It maybe can be calculated. */ fprintf(xmlout, "%s \n", s); /* 1 byte */ if(notes) fprintf(xmlout, "%s \n", s); if(raw) fprintf(xmlout, "%s 0x%02x\n", s, (tccp->numgbits) << 5 | tccp->qntsty); if(derived) fprintf(xmlout, "%s %d\n", s, tccp->qntsty); if(notes) { fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); } if(derived) fprintf(xmlout, "%s %d\n", s, tccp->numgbits); if(notes) fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); /* Problem: numbands in some cases is calculated from len, which is not retained or available here at this time */ /* So we'll just dump all internal values */ fprintf(xmlout, "%s \n", s); switch(tccp->qntsty) { case J2K_CCP_QNTSTY_NOQNT: numbands = J2K_MAXBANDS; /* should be: numbands = len - 1; */ /* Better: IMAGINE numbands = tccp->stepsize_numbands; */ /* Instead look for first zero exponent, quit there. Adequate? */ fprintf(xmlout, "%s \n", s); if(notes) { fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); } for (bandno = 0; bandno < numbands; bandno++) { if(tccp->stepsizes[bandno].expn == 0) break; /* Remove this once we have real numbands */ fprintf(xmlout, "%s \n", s, bandno); if(raw) fprintf(xmlout,"%s 0x%02x\n", s, tccp->stepsizes[bandno].expn << 3); if(derived) fprintf(xmlout,"%s %d\n", s, tccp->stepsizes[bandno].expn); fprintf(xmlout, "%s \n", s); } fprintf(xmlout, "%s \n", s); break; case J2K_CCP_QNTSTY_SIQNT: /* numbands = 1; */ fprintf(xmlout, "%s \n", s); if(notes) fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); if(notes) fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); } for (bandno = 1; bandno < J2K_MAXBANDS; bandno++) { if(tccp->stepsizes[bandno].expn == 0) break; fprintf(xmlout, "%s %d\n", s, bandno, tccp->stepsizes[bandno].expn); } fprintf(xmlout, "%s \n", s); break; default: /* J2K_CCP_QNTSTY_SEQNT */ numbands = J2K_MAXBANDS; /* should be: (len - 1) / 2;*/ /* Better: IMAGINE numbands = tccp->stepsize_numbands; */ fprintf(xmlout, "%s \n", s); if(notes) { fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s \n", s); } for (bandno = 0; bandno < numbands; bandno++) { if(tccp->stepsizes[bandno].expn == 0 && tccp->stepsizes[bandno].mant == 0) break; /* Remove this once we have real numbands count */ fprintf(xmlout, "%s \n", s, bandno); if(raw) fprintf(xmlout,"%s 0x%02x\n", s, (tccp->stepsizes[bandno].expn << 11) | tccp->stepsizes[bandno].mant); if(derived) { fprintf(xmlout,"%s %d\n", s, tccp->stepsizes[bandno].expn); fprintf(xmlout,"%s %d\n", s, tccp->stepsizes[bandno].mant); } fprintf(xmlout, "%s \n", s); } fprintf(xmlout, "%s \n", s); break; } /* switch */ fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s\n", s); } /* Alignments: " < < < < < To help maintain xml pretty-printing */ } /* ------------- */ BOOL same_component_quantization(opj_tccp_t *tccp1, opj_tccp_t *tccp2) { int bandno, numbands; if(tccp1->qntsty != tccp2->qntsty) return FALSE; if(tccp1->numgbits != tccp2->numgbits) return FALSE; switch(tccp1->qntsty) { case J2K_CCP_QNTSTY_NOQNT: numbands = J2K_MAXBANDS; /* should be: numbands = len - 1; */ /* Instead look for first zero exponent, quit there. Adequate? */ for (bandno = 0; bandno < numbands; bandno++) { if(tccp1->stepsizes[bandno].expn == 0) break; if(tccp1->stepsizes[bandno].expn != tccp2->stepsizes[bandno].expn) return FALSE; } break; case J2K_CCP_QNTSTY_SIQNT: /* numbands = 1; */ if(tccp1->stepsizes[0].expn != tccp2->stepsizes[0].expn || tccp1->stepsizes[0].mant != tccp2->stepsizes[0].mant) return FALSE; /* Don't need to check remainder, since they are calculated from [0] */ break; default: /* J2K_CCP_QNTSTY_SEQNT */ numbands = J2K_MAXBANDS; /* should be: (len - 1) / 2;*/ /* This comparison may cause us problems with trailing junk values. */ for (bandno = 0; bandno < numbands; bandno++) { if(tccp1->stepsizes[bandno].expn != tccp2->stepsizes[bandno].expn || tccp1->stepsizes[bandno].mant != tccp2->stepsizes[bandno].mant); return FALSE; } break; } /* switch */ return TRUE; } /* ------------- */ void xml_out_frame_rgn(FILE* xmlout, opj_tcp_t *tcp, int numcomps) { int compno, SPrgn; /* MJ2 files can have regions of interest if hybridized with JPX Part II */ char spaces[13] = " "; /* 12 spaces if tilepart*/ char* s = spaces; if(tcp == j2k_default_tcp) { s++;s++; /* shorten s to 10 spaces if main */ } for(compno = 0; compno < numcomps; compno++) { SPrgn = tcp->tccps[compno].roishift; /* 1 byte; SPrgn */ if(SPrgn == 0) continue; /* Yet another kludge */ fprintf(xmlout, "%s\n", s); /* Optional in main header, at most 1 per component */ if(notes) fprintf(xmlout, "%s\n", s); /* Not retained or of interest: Lrgd */ fprintf(xmlout, "%s 0\n", s); /* 1 byte */ if(notes) fprintf(xmlout, "%s \n", s); fprintf(xmlout, "%s %d\n", s, compno); /* 1 or 2 bytes */ fprintf(xmlout, "%s %d\n", s, SPrgn); /* 1 byte */ if(notes) fprintf(xmlout, "%s \n", s); fprintf(xmlout, "POC != 1) return; /* Not present */ fprintf(xmlout, "%s\n", s); /* Optional in main header, at most 1 per component */ /* j2k_read_poc seems to allow accumulation of default pocs from multiple POC segments, but does the spec really allow that? */ /* 2 bytes, not retained; Lpoc */ /* I probably didn't get this dump precisely right. */ for (i = 0; i < tcp->numpocs; i++) { poc = &tcp->pocs[i]; fprintf(xmlout, "%s \n", s, i+1); fprintf(xmlout, "%S %d\n", s, poc->resno0); /* 1 byte, RSpoc_i */ if(notes) fprintf(xmlout,"%s \n", s); fprintf(xmlout, "%s %d\n", s, poc->compno0);/* j2k_img->numcomps <= 256 ? 1 byte : 2 bytes; CSpoc_i */ if(notes) fprintf(xmlout,"%s \n", s); fprintf(xmlout, "%s %d\n", s, poc->layno1); /* int_min(cio_read(2), tcp->numlayers); /* 2 bytes; LYEpoc_i */ if(notes) fprintf(xmlout,"%s \n", s); fprintf(xmlout, "%s %d\n", s, poc->resno1); /*int_min(cio_read(1), tccp->numresolutions); /* REpoc_i */ if(notes) fprintf(xmlout,"%s \n", s); fprintf(xmlout, "%s %d\n", s, poc->compno1); /* int_min(cio_read(j2k_img->numcomps <= 256 ? 1 : 2), j2k_img->numcomps); /* CEpoc_i */ if(notes) fprintf(xmlout,"%s \n", s); fprintf(xmlout, "%s %d\n", s, poc->prg); /* 1 byte Ppoc_i */ if(notes) { fprintf(xmlout,"%s \n", s); fprintf(xmlout,"%s \n", s); fprintf(xmlout,"%s \n", s); } fprintf(xmlout, "%s \n", s); } fprintf(xmlout, "%sppm != 1) return; /* Not present */ /* Main header uses indent of 10 spaces */ fprintf(xmlout, " \n"); /* Optional in main header, but if not, must be in PPT or codestream */ /* 2 bytes Lppm not saved */ if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } /* 1 byte, not retained ; Zppm is sequence # of this PPM header */ /* 4 bytes, possibly overwritten multiple times in j2k_cp->ppm_previous: Nppm */ /* Use j symbol for index instead of i, to make comparable with j2k_read_ppm */ /* Not real clear whether to use ppm->store or ppm_len as upper bound */ fprintf(xmlout, " \n"); xml_out_dump_hex(xmlout, cp->ppm_data, cp->ppm_len); /* Dump packet headers 1 byte at a time: lppm[i][j] */ fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); /* Optional in main header, but if not, must be in PPT or codestream */ } /* ------------- */ void xml_out_frame_ppt(FILE *xmlout, opj_tcp_t *tcp) { /* For tile-part header, not main (which uses PPM instead). */ /* Either the PPM or PPT is required if the packet headers are not distributed in the bit stream */ /* Use of PPM and PPT are mutually exclusive. */ /* Compare j2k_read_ppt() */ int j; if(tcp->ppt != 1) return; /* Not present */ /* Tile-part indents are 12 spaces */ fprintf(xmlout, " \n"); /* Optional in main header, but if not, must be in PPT or codestream */ /* 2 bytes Lppm not saved */ if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } /* 1 byte, not retained ; Zppt is sequence # of this PPT header */ /* 4 bytes, possibly overwritten multiple times in j2k_cp->ppt_previous: Nppt */ /* Use j symbol for index instead of i, to make comparable with j2k_read_ppt */ /* Not real clear whether to use ppt->store or ppt_len as upper bound */ fprintf(xmlout, " \n"); xml_out_dump_hex(xmlout, tcp->ppt_data, tcp->ppt_len); /* Dump packet headers 1 byte at a time: lppt[i][j] */ fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); /* Optional in tile-part header, but if not, must be in PPM or codestream */ } #endif SUPPRESS_FOR_NOW /* ------------- */ void xml_out_frame_tlm(FILE* xmlout) { /* opt, main header only. May be multiple. */ /* Compare j2k_read_tlm()... which doesn't retain anything! */ /* Plan: Since this is only called from main header, not tilepart, use global j2k_default_tcp rather than parameter */ /* Main header indents are 10 spaces */ } /* ------------- */ void xml_out_frame_plm(FILE* xmlout) { /* opt, main header only; can be used in conjunction with tile-part's PLT */ /* NO-OP. PLM NOT SAVED IN DATA STRUCTURE */ /* Compare j2k_read_plm()... which doesn't retain anything! */ /* Plan: Since this is only called from main header, not tilepart, use global j2k_default_tcp rather than parameter */ /* Main header indents are 10 spaces */ } /* ------------- */ void xml_out_frame_plt(FILE* xmlout, opj_tcp_t *tcp) { /* opt, tile-part headers only; can be used in conjunction with main header's PLM */ /* NO-OP. PLT NOT SAVED IN DATA STRUCTURE */ /* Compare j2k_read_plt()... which doesn't retain anything! */ /* Tile-part header indents are 12 spaces */ } /* ------------- */ void xml_out_frame_crg(FILE* xmlout) { /* NO-OP. CRG NOT SAVED IN DATA STRUCTURE */ /* opt, main header only; */ /* Compare j2k_read_crg()... which doesn't retain anything! */ /* Plan: Since this is only called from main header, not tilepart, use global j2k_default_tcp rather than parameter */ #ifdef NOTYET THIS PSEUDOCODE IMAGINES THESE EXIST: j2k_default_tcp->crg, j2k_default_tcp->crg_i, j2k_default_tcp->crg_xcrg*, j2k_default_tcp->crg_ycrg* (POSSIBLY DON'T NEED crg_i, CAN GET NUMBER OR COMPONENTS FROM ELSEWHERE) if(j2k_default_tcp->crg != 1 || j2k_default_tcp->crg_i == 0) return; /* Not present */ /* Main header indents are 10 spaces */ fprintf(xmlout, " \n", j2k_default_tcp->crg_i); if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } /* This isn't the most compact form of table, but is OK when number of components is small, as is likely. */ for (i = 0; i < j2k_default_tcp->crg_i; i++) { fprintf(xmlout, " \n", i+1); fprintf(xmlout, " \n"); if(raw) fprintf(xmlout," %d\n", j2k_default_tcp->crg_xcrg[i]); if(derived) { /* Calculate n * 100%/65536; 4 digits after decimal point is sufficiently accurate */ fprintf(xmlout," %.4f\n", ((double)j2k_default_tcp->crg_xcrg[i])/655.36); /* We could do another calculation that include XRsiz[i]; maybe later. */ } fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); if(raw) fprintf(xmlout," %d\n", j2k_default_tcp->crg_ycrg[i]); if(derived) { fprintf(xmlout," %f\n", ((double)j2k_default_tcp->crg_ycrg[i])/655.36); } fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } fprintf(xmlout, " \n"); #endif } /* ------------- */ /* Regrettably from a metadata point of view, j2k_read_com() skips over any comments in main header or tile-part-header */ void xml_out_frame_com(FILE* xmlout, opj_tcp_t *tcp) { /* NO-OP. COM NOT SAVED IN DATA STRUCTURE */ /* opt in main or tile-part headers; */ /* Compare j2k_read_com()... which doesn't retain anything! */ #ifdef NOTYET char spaces[13] = " "; /* 12 spaces if tilepart*/ char* s = spaces; if(tcp == &j2k_default_tcp) { s++;s++; /* shorten s to 10 spaces if main */ } THIS PSEUDOCODE IMAGINES THESE EXIST: tcp->com, tcp->com_len, tcp->com_data array if(tcp->com != 1) return; /* Not present */ fprintf(xmlout, "%s\n", s); /* Optional in main or tile-part header */ xml_out_dump_hex_and_ascii(tcp->com_data, tcp->com_len, s); fprintf(xmlout, "%s\n", s); #endif } void xml_out_dump_hex(FILE* xmlout, char *data, int data_len, char* s) { /* s is a string of spaces for indent */ int i; /* This is called when raw is true, or there is no appropriate derived form */ fprintf(xmlout, "%s\n", s); fprintf(xmlout, "%s ", s); /* Inadequate for pretty printing */ for (i = 0; i < data_len; i++) { /* Dump packet headers */ fprintf(xmlout, "%02x", data[i]); } fprintf(xmlout, "%s\n", s); } /* Define this as an even number: */ #define BYTES_PER_DUMP_LINE 40 /* Current total width for Hex and ASCII is : 11 spaces lead + (3 * BPDL) + 2 spaces + BPDL */ void xml_out_dump_hex_and_ascii(FILE* xmlout, char *data, int data_len, char* s) { /* s is a string of spaces for indent */ int i,j; if(raw) xml_out_dump_hex(xmlout, data, data_len, s); if(derived) { fprintf(xmlout, "%s\n", s); for (i = 0; i < data_len; ) { fprintf(xmlout,"%s ", s); /* Additional leading space added in loop */ /* First column: hex */ for (j = 0; j < BYTES_PER_DUMP_LINE; j++) /* Dump bytes */ fprintf(xmlout," %02x", data[i+j]); /* Space between columns... */ fprintf(xmlout, " "); /* Second column: ASCII */ for (j = 0; j < BYTES_PER_DUMP_LINE; j++, i++) { if(isprint((int)data[i]) && i < data_len) fprintf(xmlout,"%c", data[i]); else fprintf(xmlout," "); } /* If we also wanted to output UCS-2 Unicode as a third column, then entire document must use fwprintf. Forget about it for now. As it stands, if data is UCS-2 format but still the ASCII set, then we'll be able to read every other byte as ASCII in column 2. If data is UTF-8 format but still ASCII, then we'll be able to read every byte as ASCII in column 2. */ } fprintf(xmlout, "%s\n", s); } } /* ------------- */ void xml_out_frame_jp2h(FILE* xmlout, opj_jp2_t *jp2_struct) { /* JP2 Header */ /* Compare jp2_read_jp2h(opj_jp2_t * jp2_struct) */ int i; fprintf(xmlout, " \n"); /* Compare jp2_read_ihdr(jp2_struct)) */ fprintf(xmlout, " \n"); fprintf(xmlout, " %d\n", jp2_struct->h); /* 4 bytes */ fprintf(xmlout, " %d\n", jp2_struct->w); /* 4 bytes */ if(notes) fprintf(xmlout, " \n"); fprintf(xmlout, " %d\n", jp2_struct->numcomps); /* 2 bytes */ if(notes) fprintf(xmlout, " \n"); /* 2 bytes */ fprintf(xmlout, " \n"); /* 1 byte */ if(jp2_struct->bpc == 255) { fprintf(xmlout, " 0x%02x\n", jp2_struct->bpc); /* 1 byte */ if(notes) fprintf(xmlout, " \n"); } else { /* Not 0xff */ if(raw) { fprintf(xmlout, " 0x%02x\n", jp2_struct->bpc); /* 1 byte */ if(notes) fprintf(xmlout," \n"); } if(derived) { fprintf(xmlout, " %d\n", jp2_struct->bpc & 0x7f); fprintf(xmlout, " %d\n", jp2_struct->bpc >> 7); } } fprintf(xmlout, " \n"); fprintf(xmlout, " %d\n", jp2_struct->C); /* 1 byte */ if(notes) fprintf(xmlout, " \n"); /* 2 bytes */ fprintf(xmlout, " %d\n", jp2_struct->UnkC); /* 1 byte */ if(notes) fprintf(xmlout, " \n"); /* 1 byte */ fprintf(xmlout, " %d\n", jp2_struct->IPR); /* 1 byte */ if(notes) fprintf(xmlout, " \n"); /* 2 bytes */ fprintf(xmlout, " \n"); if (jp2_struct->bpc == 255) { fprintf(xmlout, " \n"); if(notes) fprintf(xmlout, " \n"); /* Bits per pixel varies with components */ /* Compare jp2_read_bpcc(jp2_struct) */ for (i = 0; i < (int)jp2_struct->numcomps; i++) { if(raw) fprintf(xmlout," 0x%02x\n", jp2_struct->comps[i].bpcc); /* 1 byte */ if(derived) { fprintf(xmlout," %d\n", (jp2_struct->comps[i].bpcc & 0x7f)+1); fprintf(xmlout," %d\n", jp2_struct->comps[i].bpcc >> 7); } } fprintf(xmlout, " \n"); } /* Compare jp2_read_colr(jp2_struct) */ fprintf(xmlout, " \n"); fprintf(xmlout, " %d\n", jp2_struct->meth); /* 1 byte */ if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } fprintf(xmlout, " %d\n", jp2_struct->precedence); /* 1 byte */ if(notes) fprintf(xmlout, " \n"); fprintf(xmlout, " %d\n", jp2_struct->approx); /* 1 byte */ if(notes) fprintf(xmlout, " \n"); if (jp2_struct->meth == 1) { fprintf(xmlout, " %d\n", jp2_struct->enumcs); /* 4 bytes */ if(notes) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } } else if(notes) fprintf(xmlout, " \n"); /* only 1 byte is read and nothing stored */ fprintf(xmlout, " \n"); /* TO DO? No OpenJPEG support. Palette 'pclr' ComponentMapping 'cmap' ChannelDefinition 'cdef' Resolution 'res' */ fprintf(xmlout, " \n"); } /* ------------- */ #ifdef NOTYET IMAGE these use cp structure, extended... but we could use a new data structure instead void xml_out_frame_jp2i(FILE* xmlout, opj_cp_t *cp) { /* IntellectualProperty 'jp2i' (no restrictions on location) */ int i; IMAGE cp->jp2i, cp->jp2i_count, cp->jp2i_data (array of chars), cp->cp2i_len (array of ints) if(cp->jp2i != 1) return; /* Not present */ for(i = 0; i < cp->jp2i_count; i++) { fprintf(xmlout, " \n"); /* I think this can be anything, including binary, so do a dump */ /* Is it better to indent or not indent this content? Indent is better for reading, but worse for cut/paste. */ xml_out_dump_hex_and_ascii(xmlout, cp->jp2i_data[i], cp->jp2i_len[i]); fprintf(xmlout, " \n"); } } void xml_out_frame_xml(FILE* xmlout, opj_cp_t *cp) { /* XML 'xml\040' (0x786d6c20). Can appear multiply, before or after jp2c codestreams */ IMAGE cp->xml, cp->xml_count, cp->xml_data (array of chars) MAYBE WE DON'T NEED cp->xml_len (array of ints) IF WE ASSUME xml_data IS NULL-TERMINATED. ASSUME ASSUME EACH LINE IS ENDED BY \n. int i; if(cp->xml != 1) return; /* Not present */ for(i = 0; i < cp->xml_count; i++) { fprintf(xmlout, " \n", i+1); /* Is it better to indent or not indent this content? Indent is better for reading, but worse for cut/paste. Being lazy, didn't indent here. */ fprintf(xmlout,cp->xml_data[i]); /* May be multiple lines */ /* Could check if this is well-formed */ fprintf(xmlout, " \n"); } } void xml_out_frame_uuid(FILE* xmlout, opj_cp_t *cp) { /* UUID 'uuid' (top level only) */ /* Part I 1.7.2 says: may appear multiply in JP2 file, anywhere except before File Type box */ /* Part III 5.2.1 says: Private extensions shall be achieved through the 'uuid' type. */ /* A UUID is a 16-byte value. There is a conventional string representation for it: "0x12345678-9ABC-DEF0-1234-567890ABCDEF". Let's assume that is what is stored in uuid_value */ /* Part III 6.1 Any other MJ2 box type could be alternatively written as a 'uuid' box, with value given as : 0xXXXXXXXX-0011-0010-8000-00AA00389B71, where the Xs are the boxtype in hex. However, such a file is "not compliant; systems may choose to read [such] objects ... as equivalent to the box of the same type, or not." Here, we choose not to. */ int i; IMAGE cp->uuid, cp->uuid_count, cp->uuid_value (array of uuids... let's say fixed-length strings) cp->uuid_data (array of char buffers), cp->uuid_len (array of ints) if(cp->juuid != 1) return; /* Not present */ for(i = 0; i < cp->uuid_count; i++) { fprintf(xmlout, " fprintf(xmlout, " %s\n", cp->uuid_value[i]); fprintf(xmlout, " \n"); /* I think this can be anything, including binary, so do a dump */ /* Is it better to indent or not indent this content? Indent is better for reading, but worse for cut/paste. */ xml_out_dump_hex_and_ascii(xmlout, cp->uuid_data[i], cp->uuid_len[i]); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } } void xml_out_frame_uinf(FILE* xmlout, opj_cp_t *cp) { /* UUIDInfo 'uinf', includes UUIDList 'ulst' and URL 'url\40' */ /* Part I 1.7.3 says: may appear multiply in JP2 file, anywhere at the top level except before File Type box */ /* So there may be multiple ulst's, and each can have multiple UUIDs listed (with a single URL) */ /* This is not quite as vendor-specific as UUIDs, or at least is meant to be generally readable */ /* Assume UUIDs stored in canonical string format */ int i, j; IMAGE cp->uinf, cp->uinf_count, cp->uinf_ulst_nu (array of ints) cp->uinf_uuid (2 dimensional array of uuids... let's say fixed-length strings), cp->uinf_url (array of char buffers) if(cp->uinf != 1) return; /* Not present */ for(i = 0; i < cp->uuid_count; i++) { fprintf(xmlout, " \n"); fprintf(xmlout, " \n",cp->cp->uinf_ulst_nu[i]); for(j = 0; j < cp->uinf_ulst_nu[i]; j++) fprintf(xmlout, " %s\n", cp->uuif_uuid[i][j], j+1); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); /* Could add VERS and FLAG here */ fprintf(xmlout, " \n"); fprintf(xmlout, " %s",cp->uinf_url[i]); /* Probably single line, so indent works */ /* In theory, could check if this is well-formed, or good live link */ fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); fprintf(xmlout, " \n"); } } IMAGE these use cp structure, extended... but we could use a new data structure instead void xml_out_frame_unknown_type(FILE* xmlout, opj_cp_t *cp) { /* Part III 5.2.1 says "Type fields not defined here are reserved. Private extensions shall be acieved through the 'uuid' type." [This implies an unknown type would be an error, but then...] "Boxes not explicitly defined in this standard, or otherwise unrecognized by a reader, may be ignored." Also, it says "the following types are not and will not be used, or used only in their existing sense, in future versions of this specification, to avoid conflict with existing content using earlier pre-standard versions of this format: clip, crgn, matt, kmat, pnot, ctab, load, imap; track reference types tmcd, chap, sync,scpt, ssrc" [But good luck figuring out the mapping.] Part III Amend. 2 4.1 is stronger: "All these specifications [of this family, e.g., JP2 Part I, ISO Base format (Part 12) leading to MP4, Quicktime, and possibly including MJ2] require that readers ignore objects that are unrecognizable to them". */ int i; IMAGE cp->unknown_type, cp->unknown_type_count, cp->unknown_type_boxtype (array of buf[5]s), cp->unknown_type_data (array of chars), cp->unknown_type_len (array of ints) if(cp->unknown_type != 1) return; /* Not present */ for(i = 0; i < cp->unknown_type_count; i++) { fprintf(xmlout, " \n", cp->unknown_type_boxtype[i]); /* Can be anything, including binary, so do a dump */ /* Is it better to indent or not indent this content? Indent is better for reading, but worse for cut/paste. */ xml_out_dump_hex_and_ascii(xmlout, cp->unknown_type_data[i], cp->unknown_type_len[i]); fprintf(xmlout, " \n"); } } #endif openjpeg-2.1.0/src/bin/mj2/mj2_to_metadata.c000644 001750 001750 00000025265 12327650566 021726 0ustar00mathieumathieu000000 000000 /* mj2_to_metadata.c */ /* Dump MJ2, JP2 metadata (partial so far) to xml file */ /* Contributed to Open JPEG by Glenn Pearson, contract software developer, U.S. National Library of Medicine. The base code in this file was developed by the author as part of a video archiving project for the U.S. National Library of Medicine, Bethesda, MD. It is the policy of NLM (and U.S. government) to not assert copyright. A non-exclusive copy of this code has been contributed to the Open JPEG project. Except for copyright, inclusion of the code within Open JPEG for distribution and use can be bound by the Open JPEG open-source license and disclaimer, expressed elsewhere. */ #include "opj_includes.h" #include "mj2.h" #include "mj2_to_metadata.h" #include #include "opj_getopt.h" /* -------------------------------------------------------------------------- */ /** sample error callback expecting a FILE* client object */ void error_callback(const char *msg, void *client_data) { FILE *stream = (FILE*)client_data; fprintf(stream, "[ERROR] %s", msg); } /** sample warning callback expecting a FILE* client object */ void warning_callback(const char *msg, void *client_data) { FILE *stream = (FILE*)client_data; fprintf(stream, "[WARNING] %s", msg); } /** sample debug callback expecting a FILE* client object */ void info_callback(const char *msg, void *client_data) { FILE *stream = (FILE*)client_data; fprintf(stream, "[INFO] %s", msg); } /* -------------------------------------------------------------------------- */ /* ------------- */ void help_display() { /* "1234567890123456789012345678901234567890123456789012345678901234567890123456789" */ fprintf(stdout," Help for the 'mj2_to_metadata' Program\n"); fprintf(stdout," ======================================\n"); fprintf(stdout,"The -h option displays this information on screen.\n\n"); fprintf(stdout,"mj2_to_metadata generates an XML file from a Motion JPEG 2000 file.\n"); fprintf(stdout,"The generated XML shows the structural, but not (yet) curatorial,\n"); fprintf(stdout,"metadata from the movie header and from the JPEG 2000 image and tile\n"); fprintf(stdout,"headers of a sample frame. Excluded: low-level packed-bits image data.\n\n"); fprintf(stdout,"By Default\n"); fprintf(stdout,"----------\n"); fprintf(stdout,"The metadata includes the jp2 image and tile headers of the first frame.\n"); fprintf(stdout,"\n"); fprintf(stdout,"Metadata values are shown in 'raw' form (e.g., hexidecimal) as stored in the\n"); fprintf(stdout,"file, and, if apt, in a 'derived' form that is more quickly grasped.\n"); fprintf(stdout,"\n"); fprintf(stdout,"Notes explaining the XML are embedded as terse comments. These include\n"); fprintf(stdout," meaning of non-obvious tag abbreviations;\n"); fprintf(stdout," range and precision of valid values;\n"); fprintf(stdout," interpretations of values, such as enumerations; and\n"); fprintf(stdout," current implementation limitations.\n"); fprintf(stdout,"\n"); fprintf(stdout,"The sample-size and chunk-offset tables, each with 1 row per frame, are not reported.\n"); fprintf(stdout,"\n"); fprintf(stdout,"The file is self-contained and no verification (e.g., against a DTD) is requested.\n"); fprintf(stdout,"\n"); fprintf(stdout,"Required Parameters (except with -h)\n"); fprintf(stdout,"------------------------------------\n"); fprintf(stdout,"[Caution: file strings that contain spaces should be wrapped with quotes.]\n"); fprintf(stdout,"-i input.mj2 : where 'input' is any source file name or path.\n"); fprintf(stdout," MJ2 files created with 'frames_to_mj2' are supported so far.\n"); fprintf(stdout," These are silent, single-track, 'MJ2 Simple Profile' videos.\n"); fprintf(stdout,"-o output.xml : where 'output' is any destination file name or path.\n"); fprintf(stdout,"\n"); fprintf(stdout,"Optional Parameters\n"); fprintf(stdout,"-------------------\n"); fprintf(stdout,"-h : Display this help information.\n"); fprintf(stdout,"-n : Suppress all mj2_to_metadata notes.\n"); fprintf(stdout,"-t : Include sample-size and chunk-offset tables.\n"); fprintf(stdout,"-f n : where n > 0. Include jp2 header info for frame n [default=1].\n"); fprintf(stdout,"-f 0 : No jp2 header info.\n"); fprintf(stdout,"-r : Suppress all 'raw' data for which a 'derived' form exists.\n"); fprintf(stdout,"-d : Suppress all 'derived' data.\n"); fprintf(stdout," (If both -r and -d given, -r will be ignored.)\n"); fprintf(stdout,"-v string : Verify against the DTD file located by the string.\n"); fprintf(stdout," Prepend quoted 'string' with either SYSTEM or PUBLIC keyword.\n"); fprintf(stdout," Thus, for the distributed DTD placed in the same directory as\n"); fprintf(stdout," the output file: -v \"SYSTEM mj2_to_metadata.dtd\"\n"); fprintf(stdout," \"PUBLIC\" is used with an access protocol (e.g., http:) + URL.\n"); /* More to come */ fprintf(stdout,"\n"); /* "1234567890123456789012345678901234567890123456789012345678901234567890123456789" */ } /* ------------- */ int main(int argc, char *argv[]) { opj_dinfo_t* dinfo; opj_event_mgr_t event_mgr; /* event manager */ FILE *file, *xmlout; /* char xmloutname[50]; */ opj_mj2_t *movie; char* infile = 0; char* outfile = 0; char* s, S1, S2, S3; int len; unsigned int sampleframe = 1; /* First frame */ char* stringDTD = NULL; BOOL notes = TRUE; BOOL sampletables = FALSE; BOOL raw = TRUE; BOOL derived = TRUE; mj2_dparameters_t parameters; while (TRUE) { /* ':' after letter means it takes an argument */ int c = getopt(argc, argv, "i:o:f:v:hntrd"); /* FUTURE: Reserve 'p' for pruning file (which will probably make -t redundant) */ if (c == -1) break; switch (c) { case 'i': /* IN file */ infile = optarg; s = optarg; while (*s) { s++; } /* Run to filename end */ s--; S3 = *s; s--; S2 = *s; s--; S1 = *s; if ((S1 == 'm' && S2 == 'j' && S3 == '2') || (S1 == 'M' && S2 == 'J' && S3 == '2')) { break; } fprintf(stderr, "Input file name must have .mj2 extension, not .%c%c%c.\n", S1, S2, S3); return 1; /* ----------------------------------------------------- */ case 'o': /* OUT file */ outfile = optarg; while (*outfile) { outfile++; } /* Run to filename end */ outfile--; S3 = *outfile; outfile--; S2 = *outfile; outfile--; S1 = *outfile; outfile = optarg; if ((S1 == 'x' && S2 == 'm' && S3 == 'l') || (S1 == 'X' && S2 == 'M' && S3 == 'L')) break; fprintf(stderr, "Output file name must have .xml extension, not .%c%c%c\n", S1, S2, S3); return 1; /* ----------------------------------------------------- */ case 'f': /* Choose sample frame. 0 = none */ sscanf(optarg, "%u", &sampleframe); break; /* ----------------------------------------------------- */ case 'v': /* Verification by DTD. */ stringDTD = optarg; /* We will not insist upon last 3 chars being "dtd", since non-file access protocol may be used. */ if(strchr(stringDTD,'"') != NULL) { fprintf(stderr, "-D's string must not contain any embedded double-quote characters.\n"); return 1; } if (strncmp(stringDTD,"PUBLIC ",7) == 0 || strncmp(stringDTD,"SYSTEM ",7) == 0) break; fprintf(stderr, "-D's string must start with \"PUBLIC \" or \"SYSTEM \"\n"); return 1; /* ----------------------------------------------------- */ case 'n': /* Suppress comments */ notes = FALSE; break; /* ----------------------------------------------------- */ case 't': /* Show sample size and chunk offset tables */ sampletables = TRUE; break; /* ----------------------------------------------------- */ case 'h': /* Display an help description */ help_display(); return 0; /* ----------------------------------------------------- */ case 'r': /* Suppress raw data */ raw = FALSE; break; /* ----------------------------------------------------- */ case 'd': /* Suppress derived data */ derived = FALSE; break; /* ----------------------------------------------------- */ default: return 1; } /* switch */ } /* while */ if(!raw && !derived) raw = TRUE; /* At least one of 'raw' and 'derived' must be true */ /* Error messages */ /* -------------- */ if (!infile || !outfile) { fprintf(stderr,"Correct usage: mj2_to_metadata -i mj2-file -o xml-file (plus options)\n"); return 1; } /* was: if (argc != 3) { printf("Bad syntax: Usage: MJ2_to_metadata inputfile.mj2 outputfile.xml\n"); printf("Example: MJ2_to_metadata foreman.mj2 foreman.xml\n"); return 1; } */ len = strlen(infile); if(infile[0] == ' ') { infile++; /* There may be a leading blank if user put space after -i */ } file = fopen(infile, "rb"); /* was: argv[1] */ if (!file) { fprintf(stderr, "Failed to open %s for reading.\n", infile); /* was: argv[1] */ return 1; } len = strlen(outfile); if(outfile[0] == ' ') { outfile++; /* There may be a leading blank if user put space after -o */ } // Checking output file xmlout = fopen(outfile, "w"); /* was: argv[2] */ if (!xmlout) { fprintf(stderr, "Failed to open %s for writing.\n", outfile); /* was: argv[2] */ return 1; } // Leave it open /* configure the event callbacks (not required) setting of each callback is optionnal */ memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); event_mgr.error_handler = error_callback; event_mgr.warning_handler = warning_callback; event_mgr.info_handler = info_callback; /* get a MJ2 decompressor handle */ dinfo = mj2_create_decompress(); /* catch events using our callbacks and give a local context */ opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr); /* setup the decoder decoding parameters using user parameters */ movie = (opj_mj2_t*) dinfo->mj2_handle; mj2_setup_decoder(dinfo->mj2_handle, ¶meters); if (mj2_read_struct(file, movie)) // Creating the movie structure { fclose(xmlout); return 1; } xml_write_init(notes, sampletables, raw, derived); xml_write_struct(file, xmlout, movie, sampleframe, stringDTD, &event_mgr); fclose(xmlout); fprintf(stderr,"Metadata correctly extracted to XML file \n");; /* free remaining structures */ if(dinfo) { mj2_destroy_decompress((opj_mj2_t*)dinfo->mj2_handle); } return 0; } openjpeg-2.1.0/src/bin/mj2/opj_mj2_compress.c000644 001750 001750 00000065310 12327650566 022142 0ustar00mathieumathieu000000 000000 /* * Copyright (c) 2003-2004, Francois-Olivier Devaux * Copyright (c) 2002-2004, 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 #include #include #include "opj_apps_config.h" #include "openjpeg.h" #include "j2k_lib.h" #include "cio.h" #include "j2k.h" #include "jp2.h" #include "mj2.h" #include "mj2_convert.h" #include "opj_getopt.h" /** Size of memory first allocated for MOOV box */ #define TEMP_BUF 10000 /* -------------------------------------------------------------------------- */ /** sample error callback expecting a FILE* client object */ static void error_callback(const char *msg, void *client_data) { FILE *stream = (FILE*)client_data; fprintf(stream, "[ERROR] %s", msg); } /** sample warning callback expecting a FILE* client object */ static void warning_callback(const char *msg, void *client_data) { FILE *stream = (FILE*)client_data; fprintf(stream, "[WARNING] %s", msg); } /* -------------------------------------------------------------------------- */ static void help_display() { fprintf(stdout,"HELP for frames_to_mj2\n----\n\n"); fprintf(stdout,"- the -h option displays this help information on screen\n\n"); fprintf(stdout,"List of parameters for the MJ2 encoder:\n"); fprintf(stdout,"\n"); fprintf(stdout,"REMARKS:\n"); fprintf(stdout,"---------\n"); fprintf(stdout,"\n"); fprintf (stdout,"The markers written to the main_header are : SOC SIZ COD QCD COM.\n"); fprintf (stdout,"COD and QCD never appear in the tile_header.\n"); fprintf(stdout,"\n"); fprintf(stdout,"By default:\n"); fprintf(stdout,"------------\n"); fprintf(stdout,"\n"); fprintf(stdout," * Lossless\n"); fprintf(stdout," * 1 tile\n"); fprintf(stdout," * Size of precinct : 2^15 x 2^15 (means 1 precinct)\n"); fprintf(stdout," * Size of code-block : 64 x 64\n"); fprintf(stdout," * Number of resolutions: 6\n"); fprintf(stdout," * No SOP marker in the codestream\n"); fprintf(stdout," * No EPH marker in the codestream\n"); fprintf(stdout," * No sub-sampling in x or y direction\n"); fprintf(stdout," * No mode switch activated\n"); fprintf(stdout," * Progression order: LRCP\n"); fprintf(stdout," * No index file\n"); fprintf(stdout," * No ROI upshifted\n"); fprintf(stdout," * No offset of the origin of the image\n"); fprintf(stdout," * No offset of the origin of the tiles\n"); fprintf(stdout," * Reversible DWT 5-3\n"); fprintf(stdout,"\n"); fprintf(stdout,"Parameters:\n"); fprintf(stdout,"------------\n"); fprintf(stdout,"\n"); fprintf (stdout,"Required Parameters (except with -h):\n"); fprintf (stdout,"-i : source file (-i source.yuv) \n"); fprintf (stdout,"-o : destination file (-o dest.mj2) \n"); fprintf (stdout,"Optional Parameters:\n"); fprintf(stdout,"-h : display the help information \n"); fprintf(stdout,"-r : different compression ratios for successive layers (-r 20,10,5)\n"); fprintf(stdout," - The rate specified for each quality level is the desired \n"); fprintf(stdout," compression factor.\n"); fprintf(stdout," Example: -r 20,10,1 means quality 1: compress 20x, \n"); fprintf(stdout," quality 2: compress 10x and quality 3: compress lossless\n"); fprintf(stdout," (options -r and -q cannot be used together)\n"); fprintf(stdout,"-q : different psnr for successive layers (-q 30,40,50) \n"); fprintf(stdout," (options -r and -q cannot be used together)\n"); fprintf(stdout,"-n : number of resolutions (-n 3) \n"); fprintf(stdout,"-b : size of code block (-b 32,32) \n"); fprintf(stdout,"-c : size of precinct (-c 128,128) \n"); fprintf(stdout,"-t : size of tile (-t 512,512) \n"); fprintf (stdout,"-p : progression order (-p LRCP) [LRCP, RLCP, RPCL, PCRL, CPRL] \n"); fprintf (stdout,"-s : subsampling factor (-s 2,2) [-s X,Y] \n"); fprintf(stdout," Remark: subsampling bigger than 2 can produce error\n"); fprintf (stdout,"-S : write SOP marker before each packet \n"); fprintf (stdout,"-E : write EPH marker after each header packet \n"); fprintf (stdout,"-M : mode switch (-M 3) [1=BYPASS(LAZY) 2=RESET 4=RESTART(TERMALL)\n"); fprintf (stdout," 8=VSC 16=ERTERM(SEGTERM) 32=SEGMARK(SEGSYM)] \n"); fprintf (stdout," Indicate multiple modes by adding their values. \n"); fprintf (stdout," Example: RESTART(4) + RESET(2) + SEGMARK(32) = -M 38\n"); fprintf (stdout,"-R : c=%%d,U=%%d : quantization indices upshifted \n"); fprintf (stdout," for component c=%%d [%%d = 0,1,2]\n"); fprintf (stdout," with a value of U=%%d [0 <= %%d <= 37] (i.e. -ROI:c=0,U=25) \n"); fprintf (stdout,"-d : offset of the origin of the image (-d 150,300) \n"); fprintf (stdout,"-T : offset of the origin of the tiles (-T 100,75) \n"); fprintf(stdout,"-I : use the irreversible DWT 9-7 (-I) \n"); fprintf(stdout,"-W : image width, height and the dx and dy subsampling \n"); fprintf(stdout," of the Cb and Cr components for YUV files \n"); fprintf(stdout," (default is '352,288,2,2' for CIF format's 352x288 and 4:2:0)\n"); fprintf(stdout,"-F : video frame rate (set to 25 by default)\n"); fprintf(stdout,"-D : depth, precision in bits [8 .. 16]; default:8\n"); fprintf(stdout,"-C : comment\n"); fprintf(stdout,"\n"); fprintf(stdout,"IMPORTANT:\n"); fprintf(stdout,"-----------\n"); fprintf(stdout,"\n"); fprintf(stdout,"The index file has the structure below:\n"); fprintf(stdout,"---------------------------------------\n"); fprintf(stdout,"\n"); fprintf(stdout,"Image_height Image_width\n"); fprintf(stdout,"progression order\n"); fprintf(stdout,"Tiles_size_X Tiles_size_Y\n"); fprintf(stdout,"Components_nb\n"); fprintf(stdout,"Layers_nb\n"); fprintf(stdout,"decomposition_levels\n"); fprintf(stdout,"[Precincts_size_X_res_Nr Precincts_size_Y_res_Nr]...\n"); fprintf(stdout," [Precincts_size_X_res_0 Precincts_size_Y_res_0]\n"); fprintf(stdout,"Main_header_end_position\n"); fprintf(stdout,"Codestream_size\n"); fprintf(stdout,"Tile_0 start_pos end_Theader end_pos TotalDisto NumPix MaxMSE\n"); fprintf(stdout,"Tile_1 '' '' '' '' '' ''\n"); fprintf(stdout,"...\n"); fprintf(stdout,"Tile_Nt '' '' '' '' '' ''\n"); fprintf(stdout,"Tpacket_0 Tile layer res. comp. prec. start_pos end_pos disto\n"); fprintf(stdout,"...\n"); fprintf(stdout,"Tpacket_Np '' '' '' '' '' '' '' ''\n"); fprintf(stdout,"MaxDisto\n"); fprintf(stdout,"TotalDisto\n\n"); } static OPJ_PROG_ORDER give_progression(const char progression[5]) { if (progression[0] == 'L' && progression[1] == 'R' && progression[2] == 'C' && progression[3] == 'P') { return LRCP; } else { if (progression[0] == 'R' && progression[1] == 'L' && progression[2] == 'C' && progression[3] == 'P') { return RLCP; } else { if (progression[0] == 'R' && progression[1] == 'P' && progression[2] == 'C' && progression[3] == 'L') { return RPCL; } else { if (progression[0] == 'P' && progression[1] == 'C' && progression[2] == 'R' && progression[3] == 'L') { return PCRL; } else { if (progression[0] == 'C' && progression[1] == 'P' && progression[2] == 'R' && progression[3] == 'L') { return CPRL; } else { return PROG_UNKNOWN; } } } } } } int main(int argc, char **argv) { mj2_cparameters_t mj2_parameters; /* MJ2 compression parameters */ opj_cparameters_t *j2k_parameters; /* J2K compression parameters */ opj_event_mgr_t event_mgr; /* event manager */ opj_cio_t *cio; int value; opj_mj2_t *movie; opj_image_t *img; int i, j; char *s, S1, S2, S3; unsigned char *buf; int x1, y1, len; long mdat_initpos, offset; FILE *mj2file; int sampleno; opj_cinfo_t* cinfo; opj_bool bSuccess; int numframes; int prec = 8;/* DEFAULT */ double total_time = 0; memset(&mj2_parameters, 0, sizeof(mj2_cparameters_t)); /* default value */ /* ------------- */ mj2_parameters.w = 352; /* CIF default value*/ mj2_parameters.h = 288; /* CIF default value*/ mj2_parameters.CbCr_subsampling_dx = 2; /* CIF default value*/ mj2_parameters.CbCr_subsampling_dy = 2; /* CIF default value*/ mj2_parameters.frame_rate = 25; mj2_parameters.prec = 8; /* DEFAULT */ mj2_parameters.enumcs = ENUMCS_SYCC; /* FIXME: ENUMCS_YUV420 */ mj2_parameters.meth = 1; /* enumerated color space */ /* configure the event callbacks (not required) setting of each callback is optionnal */ memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); event_mgr.error_handler = error_callback; event_mgr.warning_handler = warning_callback; event_mgr.info_handler = NULL; /* set J2K encoding parameters to default values */ opj_set_default_encoder_parameters(&mj2_parameters.j2k_parameters); j2k_parameters = &mj2_parameters.j2k_parameters; /* Create comment for codestream */ if(j2k_parameters->cp_comment == NULL) { const char comment[] = "Created by OpenJPEG version "; const size_t clen = strlen(comment); const char *version = opj_version(); j2k_parameters->cp_comment = (char*)malloc(clen+strlen(version)+1); sprintf(j2k_parameters->cp_comment,"%s%s", comment, version); } while (1) { int c = opj_getopt(argc, argv, "i:o:r:q:f:t:n:c:b:p:s:d:P:S:E:M:R:T:C:I:W:F:D:h"); if (c == -1) break; switch (c) { case 'i': /* IN fill */ { char *infile = opj_optarg; s = opj_optarg; while (*s) { s++; } s--; S3 = *s; s--; S2 = *s; s--; S1 = *s; if ((S1 == 'y' && S2 == 'u' && S3 == 'v') || (S1 == 'Y' && S2 == 'U' && S3 == 'V')) { mj2_parameters.decod_format = YUV_DFMT; } else { fprintf(stderr, "!! Unrecognized format for infile : %c%c%c [accept only *.yuv] !!\n\n", S1, S2, S3); return 1; } strncpy(mj2_parameters.infile, infile, sizeof(mj2_parameters.infile)-1); } break; /* ----------------------------------------------------- */ case 'o': /* OUT fill */ { char *outfile = opj_optarg; while (*outfile) { outfile++; } outfile--; S3 = *outfile; outfile--; S2 = *outfile; outfile--; S1 = *outfile; outfile = opj_optarg; if ((S1 == 'm' && S2 == 'j' && S3 == '2') || (S1 == 'M' && S2 == 'J' && S3 == '2')) mj2_parameters.cod_format = MJ2_CFMT; else { fprintf(stderr, "Unknown output format image *.%c%c%c [only *.mj2]!! \n", S1, S2, S3); return 1; } strncpy(mj2_parameters.outfile, outfile, sizeof(mj2_parameters.outfile)-1); } break; /* ----------------------------------------------------- */ case 'r': /* rates rates/distorsion */ { float rate; s = opj_optarg; while (sscanf(s, "%f", &rate) == 1) { j2k_parameters->tcp_rates[j2k_parameters->tcp_numlayers] = rate * 2; j2k_parameters->tcp_numlayers++; while (*s && *s != ',') { s++; } if (!*s) break; s++; } j2k_parameters->cp_disto_alloc = 1; } break; /* ----------------------------------------------------- */ case 'q': /* add fixed_quality */ s = opj_optarg; while (sscanf(s, "%f", &j2k_parameters->tcp_distoratio[j2k_parameters->tcp_numlayers]) == 1) { j2k_parameters->tcp_numlayers++; while (*s && *s != ',') { s++; } if (!*s) break; s++; } j2k_parameters->cp_fixed_quality = 1; break; /* dda */ /* ----------------------------------------------------- */ case 'f': /* mod fixed_quality (before : -q) */ { int *row = NULL, *col = NULL; int numlayers = 0, numresolution = 0, matrix_width = 0; s = opj_optarg; sscanf(s, "%d", &numlayers); s++; if (numlayers > 9) s++; j2k_parameters->tcp_numlayers = numlayers; numresolution = j2k_parameters->numresolution; matrix_width = numresolution * 3; j2k_parameters->cp_matrice = (int *) malloc(numlayers * matrix_width * sizeof(int)); s = s + 2; for (i = 0; i < numlayers; i++) { row = &j2k_parameters->cp_matrice[i * matrix_width]; col = row; j2k_parameters->tcp_rates[i] = 1; sscanf(s, "%d,", &col[0]); s += 2; if (col[0] > 9) s++; col[1] = 0; col[2] = 0; for (j = 1; j < numresolution; j++) { col += 3; sscanf(s, "%d,%d,%d", &col[0], &col[1], &col[2]); s += 6; if (col[0] > 9) s++; if (col[1] > 9) s++; if (col[2] > 9) s++; } if (i < numlayers - 1) s++; } j2k_parameters->cp_fixed_alloc = 1; } break; /* ----------------------------------------------------- */ case 't': /* tiles */ sscanf(opj_optarg, "%d,%d", &j2k_parameters->cp_tdx, &j2k_parameters->cp_tdy); j2k_parameters->tile_size_on = OPJ_TRUE; break; /* ----------------------------------------------------- */ case 'n': /* resolution */ sscanf(opj_optarg, "%d", &j2k_parameters->numresolution); break; /* ----------------------------------------------------- */ case 'c': /* precinct dimension */ { char sep; int res_spec = 0; char *s = opj_optarg; do { sep = 0; sscanf(s, "[%d,%d]%c", &j2k_parameters->prcw_init[res_spec], &j2k_parameters->prch_init[res_spec], &sep); j2k_parameters->csty |= 0x01; res_spec++; s = strpbrk(s, "]") + 2; } while (sep == ','); j2k_parameters->res_spec = res_spec; } break; /* ----------------------------------------------------- */ case 'b': /* code-block dimension */ { int cblockw_init = 0, cblockh_init = 0; sscanf(opj_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; } j2k_parameters->cblockw_init = cblockw_init; j2k_parameters->cblockh_init = cblockh_init; } break; /* ----------------------------------------------------- */ case 'p': /* progression order */ { char progression[5]; strncpy(progression, opj_optarg, 5); j2k_parameters->prog_order = give_progression(progression); if (j2k_parameters->prog_order == -1) { fprintf(stderr, "Unrecognized progression order " "[LRCP, RLCP, RPCL, PCRL, CPRL] !!\n"); return 1; } } break; /* ----------------------------------------------------- */ case 's': /* subsampling factor */ { if (sscanf(opj_optarg, "%d,%d", &j2k_parameters->subsampling_dx, &j2k_parameters->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(opj_optarg, "%d,%d", &j2k_parameters->image_offset_x0, &j2k_parameters->image_offset_y0) != 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 */ { int numpocs = 0; /* number of progression order change (POC) default 0 */ opj_poc_t *POC = NULL; /* POC : used in case of Progression order change */ char *s = opj_optarg; POC = j2k_parameters->POC; while (sscanf(s, "T%d=%d,%d,%d,%d,%d,%4s", &POC[numpocs].tile, &POC[numpocs].resno0, &POC[numpocs].compno0, &POC[numpocs].layno1, &POC[numpocs].resno1, &POC[numpocs].compno1, POC[numpocs].progorder) == 7) { POC[numpocs].prg1 = give_progression(POC[numpocs].progorder); numpocs++; while (*s && *s != '/') { s++; } if (!*s) { break; } s++; } j2k_parameters->numpocs = numpocs; } break; /* ------------------------------------------------------ */ case 'S': /* SOP marker */ j2k_parameters->csty |= 0x02; break; /* ------------------------------------------------------ */ case 'E': /* EPH marker */ j2k_parameters->csty |= 0x04; break; /* ------------------------------------------------------ */ case 'M': /* Mode switch pas tous au point !! */ if (sscanf(opj_optarg, "%d", &value) == 1) { for (i = 0; i <= 5; i++) { int cache = value & (1 << i); if (cache) j2k_parameters->mode |= (1 << i); } } break; /* ------------------------------------------------------ */ case 'R': /* ROI */ { if (sscanf(opj_optarg, "OI:c=%d,U=%d", &j2k_parameters->roi_compno, &j2k_parameters->roi_shift) != 2) { fprintf(stderr, "ROI error !! [-ROI:c='compno',U='shift']\n"); return 1; } } break; /* ------------------------------------------------------ */ case 'T': /* Tile offset */ { if (sscanf(opj_optarg, "%d,%d", &j2k_parameters->cp_tx0, &j2k_parameters->cp_ty0) != 2) { fprintf(stderr, "-T 'tile offset' argument error !! [-T X0,Y0]"); return 1; } } break; /* ------------------------------------------------------ */ case 'C': /* Add a comment */ { j2k_parameters->cp_comment = (char*)malloc(strlen(opj_optarg) + 1); if(j2k_parameters->cp_comment) { strcpy(j2k_parameters->cp_comment, opj_optarg); } } break; /* ------------------------------------------------------ */ case 'I': /* reversible or not */ { j2k_parameters->irreversible = 1; } break; /* ------------------------------------------------------ */ case 'W': /* Width and Height and Cb and Cr subsampling in case of YUV format files */ if (sscanf (opj_optarg, "%d,%d,%d,%d", &mj2_parameters.w, &mj2_parameters.h, &mj2_parameters.CbCr_subsampling_dx, &mj2_parameters.CbCr_subsampling_dy) != 4) { fprintf(stderr, "-W argument error"); return 1; } break; /* ------------------------------------------------------ */ case 'F': /* Video frame rate */ if (sscanf(opj_optarg, "%d", &mj2_parameters.frame_rate) != 1) { fprintf(stderr, "-F argument error"); return 1; } break; /* ------------------------------------------------------ */ case 'D': /* Depth: the precision */ if(sscanf(opj_optarg, "%d", &prec) != 1) prec = 0; break; default: return 1; } } /* Error messages */ /* -------------- */ if (!mj2_parameters.cod_format || !mj2_parameters.decod_format) { fprintf(stderr, "Usage: %s -i yuv-file -o mj2-file (+ options)\n",argv[0]); return 1; } if(prec < 1 || prec > 16) { fprintf(stderr, "Error: Depth %d must be in the range 8 .. 16\n",prec); return 1; } if ((j2k_parameters->cp_disto_alloc || j2k_parameters->cp_fixed_alloc || j2k_parameters->cp_fixed_quality) && (!(j2k_parameters->cp_disto_alloc ^ j2k_parameters->cp_fixed_alloc ^ j2k_parameters->cp_fixed_quality))) { fprintf(stderr, "Error: options -r -q and -f cannot be used together !!\n"); return 1; } /* mod fixed_quality */ /* if no rate entered, lossless by default */ if (j2k_parameters->tcp_numlayers == 0) { j2k_parameters->tcp_rates[0] = 0; /* MOD antonin : losslessbug */ j2k_parameters->tcp_numlayers++; j2k_parameters->cp_disto_alloc = 1; } if((j2k_parameters->cp_tx0 > j2k_parameters->image_offset_x0) || (j2k_parameters->cp_ty0 > j2k_parameters->image_offset_y0)) { fprintf(stderr, "Error: Tile offset dimension is unnappropriate --> TX0(%d)<=IMG_X0(%d) TYO(%d)<=IMG_Y0(%d) \n", j2k_parameters->cp_tx0, j2k_parameters->image_offset_x0, j2k_parameters->cp_ty0, j2k_parameters->image_offset_y0); return 1; } for (i = 0; i < j2k_parameters->numpocs; i++) { if (j2k_parameters->POC[i].prg == -1) { fprintf(stderr, "Unrecognized progression order in option -P (POC n %d) [LRCP, RLCP, RPCL, PCRL, CPRL] !!\n", i + 1); } } if (j2k_parameters->cp_tdx > mj2_parameters.Dim[0] || j2k_parameters->cp_tdy > mj2_parameters.Dim[1]) { fprintf(stderr, "Error: Tile offset dimension is unnappropriate --> TX0(%d)<=IMG_X0(%d) TYO(%d)<=IMG_Y0(%d) \n", j2k_parameters->cp_tdx, mj2_parameters.Dim[0], j2k_parameters->cp_tdy, mj2_parameters.Dim[1]); return 1; } /* to respect profile - 0 */ /* ---------------------- */ x1 = !mj2_parameters.Dim[0] ? (mj2_parameters.w - 1) * j2k_parameters->subsampling_dx + 1 : mj2_parameters.Dim[0] + (mj2_parameters.w - 1) * j2k_parameters->subsampling_dx + 1; y1 = !mj2_parameters.Dim[1] ? (mj2_parameters.h - 1) * j2k_parameters->subsampling_dy + 1 : mj2_parameters.Dim[1] + (mj2_parameters.h - 1) * j2k_parameters->subsampling_dy + 1; mj2_parameters.numcomps = 3; /* YUV files only have 3 components */ mj2_parameters.prec = prec; j2k_parameters->tcp_mct = 0; mj2file = fopen(mj2_parameters.outfile, "wb"); if (!mj2file) { fprintf(stderr, "failed to open %s for writing\n", argv[2]); return 1; } /* get a MJ2 decompressor handle */ cinfo = mj2_create_compress(); movie = (opj_mj2_t*)cinfo->mj2_handle; /* catch events using our callbacks and give a local context */ opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr); /* setup encoder parameters */ mj2_setup_encoder(movie, &mj2_parameters); movie->tk[0].num_samples = yuv_num_frames(&movie->tk[0],mj2_parameters.infile); if (movie->tk[0].num_samples == 0) { return 1; } /* One sample per chunk*/ movie->tk[0].chunk = (mj2_chunk_t*) malloc(movie->tk[0].num_samples * sizeof(mj2_chunk_t)); movie->tk[0].sample = (mj2_sample_t*) malloc(movie->tk[0].num_samples * sizeof(mj2_sample_t)); if (mj2_init_stdmovie(movie)) { fprintf(stderr, "Error with movie initialization"); return 1; } /* Writing JP, FTYP and MDAT boxes */ /* Assuming that the JP and FTYP boxes won't be longer than 300 bytes:*/ buf = (unsigned char*) malloc (300 * sizeof(unsigned char)); cio = opj_cio_open((opj_common_ptr)movie->cinfo, buf, 300); mj2_write_jp(cio); mj2_write_ftyp(movie, cio); mdat_initpos = cio_tell(cio); cio_skip(cio, 4); cio_write(cio, MJ2_MDAT, 4); fwrite(buf,cio_tell(cio),1,mj2file); offset = cio_tell(cio); opj_cio_close(cio); free(buf); for(i = 0; i < movie->num_stk + movie->num_htk + movie->num_vtk; i++) { if(movie->tk[i].track_type != 0) { fprintf(stderr, "Unable to write sound or hint tracks\n"); } else { mj2_tk_t *tk; int buflen = 0; tk = &movie->tk[i]; tk->num_chunks = tk->num_samples; numframes = tk->num_samples; tk->depth = prec; fprintf(stderr, "Video Track number %d\n", i); img = mj2_image_create(tk, j2k_parameters); buflen = 2 * (tk->w * tk->h * 8); buf = (unsigned char *) malloc(buflen*sizeof(unsigned char)); for(sampleno = 0; sampleno < numframes; sampleno++) { double init_time = opj_clock(); double elapsed_time; if(yuvtoimage(tk, img, sampleno, j2k_parameters, mj2_parameters.infile)) { fprintf(stderr, "Error with frame number %d in YUV file\n", sampleno); return 1; } /* setup the encoder parameters using the current image and user parameters */ opj_setup_encoder(cinfo, j2k_parameters, img); cio = opj_cio_open((opj_common_ptr)movie->cinfo, buf, buflen); cio_skip(cio, 4); cio_write(cio, JP2_JP2C, 4); /* JP2C*/ /* encode the image */ bSuccess = opj_encode(cinfo, cio, img, NULL); if (!bSuccess) { opj_cio_close(cio); fprintf(stderr, "failed to encode image\n"); return 1; } len = cio_tell(cio) - 8; cio_seek(cio, 0); cio_write(cio, len+8,4); opj_cio_close(cio); tk->sample[sampleno].sample_size = len+8; tk->sample[sampleno].offset = offset; tk->chunk[sampleno].offset = offset; /* There is one sample per chunk */ fwrite(buf, 1, len+8, mj2file); offset += len+8; elapsed_time = opj_clock()-init_time; fprintf(stderr, "Frame number %d/%d encoded in %.2f mseconds\n", sampleno + 1, numframes, elapsed_time*1000); total_time += elapsed_time; } /* for(sampleno */ free(buf); opj_image_destroy(img); } }/* for(i */ fseek(mj2file, mdat_initpos, SEEK_SET); buf = (unsigned char*) malloc(4*sizeof(unsigned char)); /* Init a cio to write box length variable in a little endian way */ cio = opj_cio_open(NULL, buf, 4); cio_write(cio, offset - mdat_initpos, 4); fwrite(buf, 4, 1, mj2file); fseek(mj2file,0,SEEK_END); free(buf); /* Writing MOOV box */ buf = (unsigned char*) malloc ((TEMP_BUF+numframes*20) * sizeof(unsigned char)); cio = opj_cio_open(movie->cinfo, buf, (TEMP_BUF+numframes*20)); mj2_write_moov(movie, cio); fwrite(buf,cio_tell(cio),1,mj2file); free(buf); fprintf(stdout,"Total encoding time: %.2f s for %d frames (%.1f fps)\n", total_time, numframes, (float)numframes/total_time); /* Ending program */ fclose(mj2file); /* free remaining compression structures */ mj2_destroy_compress(movie); free(cinfo); if(j2k_parameters->cp_comment) free(j2k_parameters->cp_comment); if(j2k_parameters->cp_matrice) free(j2k_parameters->cp_matrice); opj_cio_close(cio); return 0; } openjpeg-2.1.0/src/bin/mj2/mj2_to_metadata.sln000644 001750 001750 00000002747 12327650566 022300 0ustar00mathieumathieu000000 000000  Microsoft Visual Studio Solution File, Format Version 9.00 # Visual Studio 2005 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mj2_to_metadata", "mj2_to_metadata.vcproj", "{69BE42AB-E7CE-4DA1-BBD2-39FEA2C91E0B}" ProjectSection(ProjectDependencies) = postProject {0B1B7713-35B6-40A7-9BFF-A7D0EB06A8BD} = {0B1B7713-35B6-40A7-9BFF-A7D0EB06A8BD} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LibOpenJPEG", "..\LibOpenJPEG.vcproj", "{0B1B7713-35B6-40A7-9BFF-A7D0EB06A8BD}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {69BE42AB-E7CE-4DA1-BBD2-39FEA2C91E0B}.Debug|Win32.ActiveCfg = Debug|Win32 {69BE42AB-E7CE-4DA1-BBD2-39FEA2C91E0B}.Debug|Win32.Build.0 = Debug|Win32 {69BE42AB-E7CE-4DA1-BBD2-39FEA2C91E0B}.Release|Win32.ActiveCfg = Release|Win32 {69BE42AB-E7CE-4DA1-BBD2-39FEA2C91E0B}.Release|Win32.Build.0 = Release|Win32 {0B1B7713-35B6-40A7-9BFF-A7D0EB06A8BD}.Debug|Win32.ActiveCfg = Debug|Win32 {0B1B7713-35B6-40A7-9BFF-A7D0EB06A8BD}.Debug|Win32.Build.0 = Debug|Win32 {0B1B7713-35B6-40A7-9BFF-A7D0EB06A8BD}.Release|Win32.ActiveCfg = Release|Win32 {0B1B7713-35B6-40A7-9BFF-A7D0EB06A8BD}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal openjpeg-2.1.0/src/bin/mj2/opj_mj2_extract.c000644 001750 001750 00000012022 12327650566 021751 0ustar00mathieumathieu000000 000000 /* * 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 #include #include #include "openjpeg.h" #include "cio.h" #include "j2k.h" #include "jp2.h" #include "mj2.h" /* -------------------------------------------------------------------------- */ /** sample error callback expecting a FILE* client object */ void error_callback(const char *msg, void *client_data) { FILE *stream = (FILE*)client_data; fprintf(stream, "[ERROR] %s", msg); } /** sample warning callback expecting a FILE* client object */ void warning_callback(const char *msg, void *client_data) { FILE *stream = (FILE*)client_data; fprintf(stream, "[WARNING] %s", msg); } /** sample debug callback expecting a FILE* client object */ void info_callback(const char *msg, void *client_data) { FILE *stream = (FILE*)client_data; fprintf(stream, "[INFO] %s", msg); } /* -------------------------------------------------------------------------- */ int main(int argc, char *argv[]) { opj_dinfo_t* dinfo; opj_event_mgr_t event_mgr; /* event manager */ int tnum; unsigned int snum; opj_mj2_t *movie; mj2_tk_t *track; mj2_sample_t *sample; unsigned char* frame_codestream; FILE *file, *outfile; char outfilename[50]; mj2_dparameters_t parameters; if (argc != 3) { printf("Usage: %s mj2filename output_location\n",argv[0]); printf("Example: %s foreman.mj2 output/foreman\n",argv[0]); return 1; } file = fopen(argv[1], "rb"); if (!file) { fprintf(stderr, "failed to open %s for reading\n", argv[1]); return 1; } /* configure the event callbacks (not required) setting of each callback is optionnal */ memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); event_mgr.error_handler = error_callback; event_mgr.warning_handler = warning_callback; event_mgr.info_handler = info_callback; /* get a MJ2 decompressor handle */ dinfo = mj2_create_decompress(); /* catch events using our callbacks and give a local context */ opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr); /* setup the decoder decoding parameters using user parameters */ memset(¶meters, 0, sizeof(mj2_dparameters_t)); movie = (opj_mj2_t*) dinfo->mj2_handle; mj2_setup_decoder(movie, ¶meters); if (mj2_read_struct(file, movie)) /* Creating the movie structure*/ return 1; /* Decode first video track */ tnum = 0; while (movie->tk[tnum].track_type != 0) tnum ++; track = &movie->tk[tnum]; fprintf(stdout,"Extracting %d frames from file...\n",track->num_samples); for (snum=0; snum < track->num_samples; snum++) { sample = &track->sample[snum]; frame_codestream = (unsigned char*) malloc (sample->sample_size-8); /* Skipping JP2C marker*/ fseek(file,sample->offset+8,SEEK_SET); fread(frame_codestream,sample->sample_size-8,1, file); /* Assuming that jp and ftyp markers size do*/ sprintf(outfilename,"%s_%05d.j2k",argv[2],snum); outfile = fopen(outfilename, "wb"); if (!outfile) { fprintf(stderr, "failed to open %s for writing\n",outfilename); return 1; } fwrite(frame_codestream,sample->sample_size-8,1,outfile); fclose(outfile); free(frame_codestream); } fclose(file); fprintf(stdout, "%d frames correctly extracted\n", snum); /* free remaining structures */ if(dinfo) { mj2_destroy_decompress((opj_mj2_t*)dinfo->mj2_handle); } return 0; } openjpeg-2.1.0/src/bin/mj2/mj2_to_metadata_Notes.doc000644 001750 001750 00000105000 12327650566 023403 0ustar00mathieumathieu000000 000000 ࡱ> >@?@ +bjbjFF (&,,+ 2222222F $ F$2 +$-$-$-$-$-$-$$%R0(|Q$2 Q$22 f$||| 2 2 +$| +$||"22# ۳m1 z ^"+$|$0$"( ((#FF2222(2#| 0* "|L h  Q$Q$FFfFFRelease Notes mj2_to_metadata within the Open JPEG Project v. 0.97 March 25, 2005 Glenn Pearson (at the US National Library of Medicine) In collaboration with Franois-Olivier Devaux (TELE/UCL) Synopsis "Mj2_to_metadata", under development, is a Windows command-line function that reads metadata from a Motion JPEG 2000 video file and generates an XML file with a representation of that content. So far, it is limited to reporting structural metadata, but descriptive metadata is planned. It is run from the command-line by: mj2_to_metadata -i input.mj2 -o output.xml Additional options are discussed further below. Acceptable Input So far, video input is limited to a file created by Open JPEG's "frames_to_mj2" function (because mj2_to_metadata uses the same data structures and parsing functions that the reverse function, "mj2_to_frames", does). Restrictions this imposes are: MJ2 Simple Profile only (self-contained file with 1 visual track, at most 1 sound track) No sound 1 field per frame (non-interleaved) 32-bit offsets (filesize under 2GB) Expected Output The output XML will contain essentially all the MJ2 header information that is saved in the existing openjpeg data structures, including the voluminous chunking tables if requested. Also, within the visual track, for a representative frame (the first unless otherwise specified), some portion of the JP2 header information is written. This is again limited to what is saved in existing openjpeg data structures. (Actually, towards overcoming these restrictions, v 0.97 has expanded certain data structures; the next step is to populate them during parsing.) Reporting of many of the optional "marker sequences" in the JP2 codestream are not yet implemented. The generated form of XML is unlikely be entirely definitive. Nevertheless, a preliminary DTD has been prepared for it. Build This is early alpha code, and only the Windows version has been built, embedded within an openjpeg project in a VC6 environment (at cul) or VC7 environment (at NLM). So you may find portability issues to resolve. The release contains these files, added to existing files within openjpeg\mj2: mj2_to_metadata.h, .c meta_out.h, .c mj2_to_metadata.dsw, .vcproj mj2_to_metadata.dtd After the build, it is recommended for convenience that you move or copy mj2_to_metadata.dtd to the same subdirectory as mj2_to_metadata.exe . The project preprocessor definitions includes NO_PACKETS_DECODING, which suppresses unused decoding of a frames jpeg-2000-encoded packet data. This suppression greatly speeds up execution. Runtime Options To run from the command-line: mj2_to_metadata -i input.mj2 -o output.xml To see options available: mj2_to_metadata -h Briefly, options are provided to: suppress generation of information, by categories that cuts across the xml hierarchy: interpretative notes (-n) raw-as-read values, whenever derived values are available (-r) derived values (-d) specify a jp2 frame to be analyzed, if any (-f n; n = 0 means no frame; default n = 1) permit verification against a DTD (-v SYSTEM_or_PUBLIC_string). generate detailed xml for the sample chunking tables, normally skipped (-t). Other options are foreseen, to further prune the voluminous output. This has only been tested on a few video files, so expect problems. Feedback Glenn_Pearson@nlm.nih.gov !">?FGOUVXeG M E s t v ƽҫ{wrmfbf^fZVfQ hB>5hdhB>hxrhw= hdhL hL 5 hd5h !h !h 5 h>f5 h 5 h !5 h5h !h !5h !h !5CJaJhE5CJaJh>f5CJaJhB>5CJaJhB>hB>5CJaJh5CJaJh>fh>f5CJ aJ h>fh5CJ aJ h>fh !5CJ aJ "X  D E u v - . > Ngd & F7$8$H$gdd 7$8$H$gdL $a$gd>f$a$gd !+  . > pNOU]c*,@Lyz{`a !$015PRÿ󥝙󕝕s h\NhCJOJQJ^JaJh\N h 5hhhEhh>fhmh !hh5h CJOJQJ^JaJh hL CJOJQJ^JaJhB>hB>hB>5 hdhdhL hdhL hxrhdhdhL 5-NOU{a !1OP}~'A & FgdE & FgdEgd`gdE 7$8$H$gdL Radenoq|}~%'@Sz럘ֈzzvrvrvnvvrrvfvfhw=hw=6hIHh\Nhw= h\NhE h\Nh\NhEmHsHhEh hEhEhEhmHsH+hEhE6CJOJQJ^JaJmHsH+hEh6CJOJQJ^JaJmHsH(hEhECJOJQJ^JaJmHsH(hEhCJOJQJ^JaJmHsH&.{|)*+gd gdgd\N & FgdE & FgdE &+,.67Hby|*+Źh h 5hmh hL hhIHhIH6 hIH6h\NhIHhEh>fh>f6h>fhw= hw=6!&1h:pkt?/ =!"#$%@@@ NormalCJ_HaJmH sH tH DA@D Default Paragraph FontRi@R  Table Normal4 l4a (k@(No List+ &"XDEuv -.>NOU{a ! 1 O P } ~ ' A . { |    ) * - 0000000000000000 0 0 0 00000000000000000000x0x0x0x0x00x0x0 0 00 0 0 0 0 000x0x00x0x000.>NOa |    ) - ^>00{\>00 |\>00\>00\>00^>00^>00^>00V~00\>0 |\>0 \>0 00.- R+ N+ + Q#Qd>Q#Gnn- Upp- B*urn:schemas-microsoft-com:office:smarttagscountry-region9*urn:schemas-microsoft-com:office:smarttagsplace8*urn:schemas-microsoft-com:office:smarttagsdate 2005253DayMonthYear*+9C!myR a b d e n o q r |  + - "(R ` z R | . 6 - 33333v.>OU! 1 ~ ' A  * - my- Yrt?X r;Nx$AD(Q|~u*V6sRZT{cV6h^`OJQJo(hHh^`OJQJ^Jo(hHohpp^p`OJQJo(hHh@ @ ^@ `OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHohPP^P`OJQJo(hH^`OJPJQJ^Jo(-^`OJQJ^Jo(hHo^`OJQJo(hHP P ^P `OJQJo(hH  ^ `OJQJ^Jo(hHo^`OJQJo(hH^`OJQJo(hH^`OJQJ^Jo(hHo``^``OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHohpp^p`OJQJo(hHh@ @ ^@ `OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHohPP^P`OJQJo(hHxXX^X`OJQJo(hHx^`OJQJ^Jo(hHox^`OJQJo(hHx  ^ `OJQJo(hHx^`OJQJ^Jo(hHoxXX^X`OJQJo(hHx((^(`OJQJo(hHx^`OJQJ^Jo(hHox^`OJQJo(hHxXX^X`OJPJQJ^Jo(-x^`OJQJ^Jo(hHox^`OJQJo(hHx  ^ `OJQJo(hHx^`OJQJ^Jo(hHoxXX^X`OJQJo(hHx((^(`OJQJo(hHx^`OJQJ^Jo(hHox^`OJQJo(hH^`o()   ^ `hH.  L ^ `LhH. xx^x`hH. HH^H`hH. L^`LhH. ^`hH. ^`hH. L^`LhH.xXX^X`OJPJQJ^Jo(-x^`OJQJ^Jo(hHox^`OJQJo(hHx  ^ `OJQJo(hHx^`OJQJ^Jo(hHoxXX^X`OJQJo(hHx((^(`OJQJo(hHx^`OJQJ^Jo(hHox^`OJQJo(hHNx$sRY?X ~u*T{cD(0         k                          k        tP        KS/oL{  !Wz8B>kt?IHd>f>mExr9 1xw=7)Lm\NL @zz.-sszz+ p@UnknownGz Times New Roman5Symbol3& z Arial?5 z Courier New;Wingdings"qh(\˓4 4 !24% %  3QH)? !Release Notes  Glenn Pearson Glenn Pearson(       Oh+'0 $ @ L Xdlt|Release Notes eleGlenn Pearsonlenlen Normal.dotoGlenn Pearson3enMicrosoft Word 10.0@Ԫ!@<@m14 ՜.+,0 hp|  nlm% O Release Notes Title  !"#$%&'(*+,-./02345678;Root Entry Fm1=1Table(WordDocument(&SummaryInformation()DocumentSummaryInformation81CompObjj  FMicrosoft Word Document MSWordDocWord.Document.89qRoot Entry FѢq1C1Table(WordDocument(&SummaryInformation()  !"#$%&'(*+,-./0BA _AdHocReviewCycleID_EmailSubject _AuthorEmail_AuthorEmailDisplayName b2 Yet more metagpearson@mail.nih.govPearson, Glenn (NIH/NLM/LHC)DocumentSummaryInformation8CompObjj  FMicrosoft Word Document MSWordDocWord.Document.89q՜.+,D՜.+,< hp|  nlm% O Release Notes Title@ 0dopenjpeg-2.1.0/src/bin/jp3d/opj_jp3d_compress.c000755 001750 001750 00000077437 12327650566 022502 0ustar00mathieumathieu000000 000000 /* * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2006, Mnica Dez Garca, Image Processing Laboratory, University of Valladolid, Spain * 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 #include #include #include "opj_config.h" #include "openjp3d.h" #include "opj_getopt.h" #include "convert.h" #ifdef _WIN32 #include #else #define stricmp strcasecmp #define strnicmp strncasecmp #endif /* _WIN32 */ /* ----------------------------------------------------------------------- */ void encode_help_display() { fprintf(stdout,"List of parameters for the JPEG2000 Part 10 encoder:\n"); fprintf(stdout,"------------\n"); fprintf(stdout,"\n"); fprintf(stdout,"Required Parameters (except with -h):\n"); fprintf(stdout,"\n"); fprintf(stdout,"-i : source file (-i source.bin or source*.pgx) \n"); fprintf(stdout,"\n"); fprintf(stdout,"-m : source characteristics file (-m imgfile.img) \n"); fprintf(stdout,"\n"); fprintf(stdout,"-o : destination file (-o dest.jp3d) \n"); fprintf(stdout,"\n"); fprintf(stdout,"Optional Parameters:\n"); fprintf(stdout,"\n"); fprintf(stdout,"-h : display the help information \n "); fprintf(stdout,"\n"); fprintf(stdout,"-n : number of resolutions (-n 3,3,3) \n"); fprintf(stdout,"\n"); fprintf(stdout,"-I : use the irreversible transforms: ICT + DWT 9-7 (-I) \n"); fprintf(stdout,"\n"); fprintf(stdout,"-C : coding algorithm (-C 2EB) [2EB, 3EB] \n"); fprintf(stdout,"\n"); fprintf(stdout,"-r : different compression ratios for successive layers (-r 20,10,5)\n "); fprintf(stdout," - The rate specified for each quality level is the desired compression factor.\n"); fprintf(stdout," - Rate 1 means lossless compression\n"); fprintf(stdout," (options -r and -q cannot be used together)\n "); fprintf(stdout,"\n"); fprintf(stdout,"-q : different psnr for successive layers (-q 30,40,50) \n "); fprintf(stdout," (options -r and -q cannot be used together)\n "); fprintf(stdout,"\n"); fprintf(stdout,"-b : size of code block (-b 32,32,32) \n"); fprintf(stdout,"\n"); fprintf(stdout,"-c : size of precinct (-c 128,128,128) \n"); fprintf(stdout,"\n"); fprintf(stdout,"-t : size of tile (-t 512,512,512) \n"); fprintf(stdout,"\n"); fprintf(stdout,"-p : progression order (-p LRCP) [LRCP, RLCP, RPCL, PCRL, CPRL] \n"); fprintf(stdout,"\n"); fprintf(stdout,"-s : subsampling factor (-s 2,2,2) [-s X,Y,Z] \n"); fprintf(stdout," - Remark: subsampling bigger than 2 can produce error\n"); fprintf(stdout,"\n"); fprintf(stdout,"-SOP : write SOP marker before each packet \n"); fprintf(stdout,"\n"); fprintf(stdout,"-EPH : write EPH marker after each header packet \n"); fprintf(stdout,"\n"); fprintf(stdout,"-M : code-block style (-M 0) [1=BYPASS(LAZY) 2=RESET 4=RESTART(TERMALL)\n"); fprintf(stdout," 8=VSC 16=PTERM 32=SEGSYM 64=3DCTXT] \n"); fprintf(stdout," Indicate multiple modes by adding their values. \n"); fprintf(stdout," ex: RESTART(4) + RESET(2) + SEGMARK(32) = -M 38\n"); fprintf(stdout,"\n"); fprintf(stdout,"-D : define DC offset (-D 12) \n"); fprintf(stdout,"\n"); fprintf(stdout,"-x : create an index file *.Idx (-x index_name.Idx) \n"); fprintf(stdout,"\n"); fprintf(stdout,"-ROI : c=%%d,U=%%d : quantization indices upshifted \n"); fprintf(stdout," for component c=%%d [%%d = 0,1,2]\n"); fprintf(stdout," with a value of U=%%d [0 <= %%d <= 37] (i.e. -ROI:c=0,U=25) \n"); fprintf(stdout,"\n"); fprintf(stdout,"-d : offset of the origin of the volume (-d 150,300,100) \n"); fprintf(stdout,"\n"); fprintf(stdout,"-l : offset of the origin of the tiles (-l 100,75,25) \n"); fprintf(stdout,"\n"); fprintf(stdout,"\n"); fprintf(stdout,"DEFAULT CODING:\n"); fprintf(stdout,"------------\n"); fprintf(stdout,"\n"); fprintf(stdout," * Lossless\n"); fprintf(stdout," * 1 tile\n"); fprintf(stdout," * Size of precinct : 2^15 x 2^15 x 2^15 (means 1 precinct)\n"); fprintf(stdout," * Size of code-block : 64 x 64 x 64\n"); fprintf(stdout," * Number of resolutions in x, y and z axis: 3\n"); fprintf(stdout," * No SOP marker in the codestream\n"); fprintf(stdout," * No EPH marker in the codestream\n"); fprintf(stdout," * No sub-sampling in x, y or z direction\n"); fprintf(stdout," * No mode switch activated\n"); fprintf(stdout," * Progression order: LRCP\n"); fprintf(stdout," * No index file\n"); fprintf(stdout," * No ROI upshifted\n"); fprintf(stdout," * No offset of the origin of the volume\n"); fprintf(stdout," * No offset of the origin of the tiles\n"); fprintf(stdout," * Reversible DWT 5-3 on each 2D slice\n"); fprintf(stdout," * Coding algorithm: 2D-EBCOT \n"); fprintf(stdout,"\n"); fprintf(stdout,"REMARKS:\n"); fprintf(stdout,"---------\n"); fprintf(stdout,"\n"); fprintf(stdout,"- The markers written to the main_header are : SOC SIZ COD QCD COM.\n"); fprintf(stdout,"- COD and QCD markers will never appear in the tile_header.\n"); fprintf(stdout,"\n"); fprintf(stdout,"- You need enough disk space memory (twice the original) to encode \n"); fprintf(stdout,"the volume,i.e. for a 1.5 GB volume you need a minimum of 3GB of disk memory)\n"); fprintf(stdout,"\n"); fprintf(stdout,"- When loading *.pgx files, a relative path to directory is needed for input argument \n"); fprintf(stdout," followed by the common prefix of the slices and a '*' character representing sequential numeration.\n"); fprintf(stdout,"( -i relativepath/slices*.pgx )\n"); fprintf(stdout,"\n"); fprintf(stdout," - The index file has the structure below:\n"); fprintf(stdout,"\n"); fprintf(stdout,"\t Image_height Image_width Image_depth\n"); fprintf(stdout,"\t Progression order: 0 (LRCP)\n"); fprintf(stdout,"\t Tiles_size_X Tiles_size_Y Tiles_size_Z\n"); fprintf(stdout,"\t Components_nb\n"); fprintf(stdout,"\t Layers_nb\n"); fprintf(stdout,"\t Decomposition_levels\n"); fprintf(stdout,"\t [Precincts_size_X_res_Nr Precincts_size_Y_res_Nr Precincts_size_Z_res_Nr]\n\t ...\n"); fprintf(stdout,"\t [Precincts_size_X_res_0 Precincts_size_Y_res_0 Precincts_size_Z_res_0]\n"); fprintf(stdout,"\t Main_header_end_position\n"); fprintf(stdout,"\t Codestream_size\n"); fprintf(stdout,"\t Tile_0 [start_pos end_header end_pos TotalDisto NumPix MaxMSE]\n"); fprintf(stdout,"\t ...\n"); fprintf(stdout,"\t Tile_Nt [ '' '' '' '' '' '' ]\n"); fprintf(stdout,"\t Tpacket_0 [Tile layer res. comp. prec. start_pos end_pos disto]\n"); fprintf(stdout,"\t ...\n"); fprintf(stdout,"\t Tpacket_Np ['' '' '' '' '' '' '' '' ]\n"); fprintf(stdout,"\t MaxDisto\n"); fprintf(stdout,"\t TotalDisto\n\n"); fprintf(stdout,"\n"); } OPJ_PROG_ORDER give_progression(char progression[4]) { if(strncmp(progression, "LRCP", 4) == 0) { return LRCP; } if(strncmp(progression, "RLCP", 4) == 0) { return RLCP; } if(strncmp(progression, "RPCL", 4) == 0) { return RPCL; } if(strncmp(progression, "PCRL", 4) == 0) { return PCRL; } if(strncmp(progression, "CPRL", 4) == 0) { return CPRL; } return PROG_UNKNOWN; } OPJ_TRANSFORM give_transform(char transform[4]) { if(strncmp(transform, "2DWT", 4) == 0) { return TRF_2D_DWT; } if(strncmp(transform, "3DWT", 4) == 0) { return TRF_3D_DWT; } return TRF_UNKNOWN; } OPJ_ENTROPY_CODING give_coding(char coding[3]) { if(strncmp(coding, "2EB", 3) == 0) { return ENCOD_2EB; } if(strncmp(coding, "3EB", 3) == 0) { return ENCOD_3EB; } /*if(strncmp(coding, "2GR", 3) == 0) { return ENCOD_2GR; } if(strncmp(coding, "3GR", 3) == 0) { return ENCOD_3GR; }*/ return ENCOD_UNKNOWN; } int get_file_format(char *filename) { int i; static const char *extension[] = {"pgx", "bin", "img", "j3d", "jp3d", "j2k"}; static const int format[] = { PGX_DFMT, BIN_DFMT, IMG_DFMT, J3D_CFMT, J3D_CFMT, J2K_CFMT}; char * ext = strrchr(filename, '.'); if (ext) { ext++; for(i = 0; i < sizeof(format)/sizeof(*format); i++) { if(strnicmp(ext, extension[i], 3) == 0) { return format[i]; } } } return -1; } /* ------------------------------------------------------------------------------------ */ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters) { int i, value; /* parse the command line */ while (1) { int c = opj_getopt(argc, argv, "i:m:o:r:q:f:t:n:c:b:x:p:s:d:hP:S:E:M:D:R:l:T:C:A:I"); if (c == -1) break; switch (c) { case 'i': /* input file */ { char *infile = opj_optarg; parameters->decod_format = get_file_format(infile); switch(parameters->decod_format) { case PGX_DFMT: case BIN_DFMT: case IMG_DFMT: break; default: fprintf(stdout, "[ERROR] Unrecognized format for infile : %s [accept only *.pgx or *.bin] !!\n\n", infile); return 1; break; } strncpy(parameters->infile, infile, MAX_PATH); fprintf(stdout, "[INFO] Infile: %s \n", parameters->infile); } break; /* ----------------------------------------------------- */ case 'm': /* input IMG file */ { char *imgfile = opj_optarg; int imgformat = get_file_format(imgfile); switch(imgformat) { case IMG_DFMT: break; default: fprintf(stdout, "[ERROR] Unrecognized format for imgfile : %s [accept only *.img] !!\n\n", imgfile); return 1; break; } strncpy(parameters->imgfile, imgfile, MAX_PATH); fprintf(stdout, "[INFO] Imgfile: %s Format: %d\n", parameters->imgfile, imgformat); } break; /* ----------------------------------------------------- */ case 'o': /* output file */ { char *outfile = opj_optarg; parameters->cod_format = get_file_format(outfile); switch(parameters->cod_format) { case J3D_CFMT: case J2K_CFMT: case LSE_CFMT: break; default: fprintf(stdout, "[ERROR] Unknown output format volume %s [only *.j2k, *.lse3d or *.jp3d]!! \n", outfile); return 1; break; } strncpy(parameters->outfile, outfile, MAX_PATH); fprintf(stdout, "[INFO] Outfile: %s \n", parameters->outfile); } break; /* ----------------------------------------------------- */ case 'r': /* define compression rates for each layer */ { char *s = opj_optarg; while (sscanf(s, "%f", ¶meters->tcp_rates[parameters->tcp_numlayers]) == 1) { parameters->tcp_numlayers++; while (*s && *s != ',') { s++; } if (!*s) break; s++; } parameters->cp_disto_alloc = 1; } break; /* ----------------------------------------------------- */ case 'q': /* define distorsion (PSNR) for each layer */ { char *s = opj_optarg; while (sscanf(s, "%f", ¶meters->tcp_distoratio[parameters->tcp_numlayers]) == 1) { parameters->tcp_numlayers++; while (*s && *s != ',') { s++; } if (!*s) break; s++; } parameters->cp_fixed_quality = 1; } break; /* ----------------------------------------------------- */ case 'f': { fprintf(stdout, "/---------------------------------------------------\\\n"); fprintf(stdout, "| Fixed layer allocation option not implemented !! |\n"); fprintf(stdout, "\\---------------------------------------------------/\n"); /*int *row = NULL, *col = NULL; int numlayers = 0, matrix_width = 0; char *s = opj_optarg; sscanf(s, "%d", &numlayers); s++; if (numlayers > 9) s++; parameters->tcp_numlayers = numlayers; matrix_width = parameters->numresolution[0] + parameters->numresolution[1] + parameters->numresolution[2]; parameters->cp_matrice = (int *) malloc(numlayers * matrix_width * sizeof(int)); s = s + 2; for (i = 0; i < numlayers; i++) { row = ¶meters->cp_matrice[i * matrix_width]; col = row; parameters->tcp_rates[i] = 1; sscanf(s, "%d,", &col[0]); s += 2; if (col[0] > 9) s++; col[1] = 0; col[2] = 0; for (j = 1; j < matrix_width; j++) { col += 3; j+=2; sscanf(s, "%d,%d,%d", &col[0], &col[1], &col[2]); s += 6; if (col[0] > 9) s++; if (col[1] > 9) s++; if (col[2] > 9) s++; } if (i < numlayers - 1) s++; } parameters->cp_fixed_alloc = 1; */ } break; /* ----------------------------------------------------- */ case 't': /* tiles */ { if (sscanf(opj_optarg, "%d,%d,%d", ¶meters->cp_tdx, ¶meters->cp_tdy, ¶meters->cp_tdz) !=3) { fprintf(stdout, "[ERROR] '-t' 'dimensions of tiles' argument error ! [-t tdx,tdy,tdz]\n"); return 1; } parameters->tile_size_on = true; } break; /* ----------------------------------------------------- */ case 'n': /* resolution */ { int aux; aux = sscanf(opj_optarg, "%d,%d,%d", ¶meters->numresolution[0], ¶meters->numresolution[1], ¶meters->numresolution[2]); if (aux == 2) parameters->numresolution[2] = 1; else if (aux == 1) { parameters->numresolution[1] = parameters->numresolution[0]; parameters->numresolution[2] = 1; }else if (aux == 0){ parameters->numresolution[0] = 1; parameters->numresolution[1] = 1; parameters->numresolution[2] = 1; } } break; /* ----------------------------------------------------- */ case 'c': /* precinct dimension */ { char sep; int res_spec = 0; int aux; char *s = opj_optarg; do { sep = 0; aux = sscanf(s, "[%d,%d,%d]%c", ¶meters->prct_init[0][res_spec], ¶meters->prct_init[1][res_spec], ¶meters->prct_init[2][res_spec], &sep); if (sep == ',' && aux != 4) { fprintf(stdout, "[ERROR] '-c' 'dimensions of precincts' argument error ! [-c [prcx_res0,prcy_res0,prcz_res0],...,[prcx_resN,prcy_resN,prcz_resN]]\n"); return 1; } parameters->csty |= 0x01; res_spec++; s = strpbrk(s, "]") + 2; } while (sep == ','); parameters->res_spec = res_spec; /* number of precinct size specifications */ } break; /* ----------------------------------------------------- */ case 'b': /* code-block dimension */ { int cblockw_init = 0, cblockh_init = 0, cblockl_init = 0; if (sscanf(opj_optarg, "%d,%d,%d", &cblockw_init, &cblockh_init, &cblockl_init) != 3) { fprintf(stdout, "[ERROR] '-b' 'dimensions of codeblocks' argument error ! [-b cblkx,cblky,cblkz]\n"); return 1; } if (cblockw_init * cblockh_init * cblockl_init > (1<<18) || cblockw_init > 1024 || cblockw_init < 4 || cblockh_init > 1024 || cblockh_init < 4 || cblockl_init > 1024 || cblockl_init < 4) { fprintf(stdout,"[ERROR] Size of code_block error (option -b) !!\n\nRestriction :\n * width*height*length<=4096\n * 4<=width,height,length<= 1024\n\n"); return 1; } parameters->cblock_init[0] = cblockw_init; parameters->cblock_init[1] = cblockh_init; parameters->cblock_init[2] = cblockl_init; } break; /* ----------------------------------------------------- */ case 'x': /* creation of index file */ { char *index = opj_optarg; strncpy(parameters->index, index, MAX_PATH); parameters->index_on = 1; } break; /* ----------------------------------------------------- */ case 'p': /* progression order */ { char progression[4]; strncpy(progression, opj_optarg, 4); parameters->prog_order = give_progression(progression); if (parameters->prog_order == -1) { fprintf(stdout, "[ERROR] Unrecognized progression order [LRCP, RLCP, RPCL, PCRL, CPRL] !!\n"); return 1; } } break; /* ----------------------------------------------------- */ case 's': /* subsampling factor */ { if (sscanf(opj_optarg, "%d,%d,%d", ¶meters->subsampling_dx, ¶meters->subsampling_dy, ¶meters->subsampling_dz) != 3) { fprintf(stdout, "[ERROR] '-s' sub-sampling argument error ! [-s dx,dy,dz]\n"); return 1; } } break; /* ----------------------------------------------------- */ case 'd': /* coordonnate of the reference grid */ { if (sscanf(opj_optarg, "%d,%d,%d", ¶meters->volume_offset_x0, ¶meters->volume_offset_y0, ¶meters->volume_offset_z0) != 3) { fprintf(stdout, "[ERROR] -d 'coordonnate of the reference grid' argument error !! [-d x0,y0,z0]\n"); return 1; } } break; /* ----------------------------------------------------- */ case 'h': /* display an help description */ { encode_help_display(); return 1; } break; /* ----------------------------------------------------- */ case 'P': /* POC */ { int numpocs = 0; /* number of progression order change (POC) default 0 */ opj_poc_t *POC = NULL; /* POC : used in case of Progression order change */ char *s = opj_optarg; POC = parameters->POC; fprintf(stdout, "/----------------------------------\\\n"); fprintf(stdout, "| POC option not fully tested !! |\n"); fprintf(stdout, "\\----------------------------------/\n"); 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++; } parameters->numpocs = numpocs; } break; /* ------------------------------------------------------ */ case 'S': /* SOP marker */ { parameters->csty |= 0x02; } break; /* ------------------------------------------------------ */ case 'E': /* EPH marker */ { parameters->csty |= 0x04; } break; /* ------------------------------------------------------ */ case 'M': /* Codification mode switch */ { fprintf(stdout, "[INFO] Mode switch option not fully tested !!\n"); value = 0; if (sscanf(opj_optarg, "%d", &value) == 1) { for (i = 0; i <= 6; i++) { int cache = value & (1 << i); if (cache) parameters->mode |= (1 << i); } } } break; /* ------------------------------------------------------ */ case 'D': /* DCO */ { if (sscanf(opj_optarg, "%d", ¶meters->dcoffset) != 1) { fprintf(stdout, "[ERROR] DC offset error !! [-D %d]\n",parameters->dcoffset); return 1; } } break; /* ------------------------------------------------------ */ case 'R': /* ROI */ { if (sscanf(opj_optarg, "OI:c=%d,U=%d", ¶meters->roi_compno, ¶meters->roi_shift) != 2) { fprintf(stdout, "[ERROR] ROI error !! [-ROI:c='compno',U='shift']\n"); return 1; } } break; /* ------------------------------------------------------ */ case 'l': /* Tile offset */ { if (sscanf(opj_optarg, "%d,%d,%d", ¶meters->cp_tx0, ¶meters->cp_ty0, ¶meters->cp_tz0) != 3) { fprintf(stdout, "[ERROR] -l 'tile offset' argument error !! [-l X0,Y0,Z0]"); return 1; } } break; /* ------------------------------------------------------ case 'T': // Tranformation of original data (2D-DWT/3D-DWT/3D-RLS/2D-DWT+1D-RLS) { char transform[4]; strncpy(transform, opj_optarg, 4); parameters->transform_format = give_transform(transform); if (parameters->transform_format == -1) { fprintf(stdout, "[ERROR] -T 'Transform domain' argument error !! [-T 2DWT, 3DWT, 3RLS or 3LSE only]"); return 1; } } break; ------------------------------------------------------ */ case 'C': /* Coding of transformed data */ { char coding[3]; strncpy(coding, opj_optarg, 3); parameters->encoding_format = give_coding(coding); if (parameters->encoding_format == -1) { fprintf(stdout, "[ERROR] -C 'Coding algorithm' argument error !! [-C 2EB, 3EB, 2GR, 3GR or GRI only]"); return 1; } } break; /* ------------------------------------------------------ */ case 'I': /* reversible or not */ { parameters->irreversible = 1; } break; default: fprintf(stdout, "[ERROR] This option is not valid \"-%c %s\"\n", c, opj_optarg); return 1; } } /* check for possible errors */ if((parameters->infile[0] == 0) || (parameters->outfile[0] == 0)) { fprintf(stdout, "usage: jp3d_vm_enc -i volume-file -o jp3d-file (+ options)\n"); return 1; } if((parameters->decod_format == BIN_DFMT) && (parameters->imgfile[0] == 0)) { fprintf(stdout, "usage: jp3d_vm_enc -i bin-volume-file -m img-file -o jp3d-file (+ options)\n"); return 1; } if((parameters->decod_format != BIN_DFMT) && (parameters->decod_format != PGX_DFMT) && (parameters->decod_format != IMG_DFMT)) { fprintf(stdout, "usage: jp3d_vm_enc -i input-volume-file [*.bin,*.pgx,*.img] -o jp3d-file [*.jp3d,*.j2k] (+ options)\n"); return 1; } if((parameters->cod_format != J3D_CFMT) && (parameters->cod_format != J2K_CFMT)) { fprintf(stdout, "usage: jp3d_vm_enc -i input-volume-file [*.bin,*.pgx,*.img] -o jp3d-file [*.jp3d,*.j2k] (+ options)\n"); return 1; } if((parameters->encoding_format == ENCOD_2GR || parameters->encoding_format == ENCOD_3GR) && parameters->transform_format != TRF_3D_LSE && parameters->transform_format != TRF_3D_RLS) { fprintf(stdout, "[ERROR] Entropy coding options -C [2GR,3GR] are only compatible with predictive-based transform algorithms: -T [3RLS,3LSE].\n"); return 1; } if (parameters->encoding_format == ENCOD_3EB) parameters->mode |= (1 << 6); if ((parameters->mode >> 6) & 1) { parameters->encoding_format = ENCOD_3EB; } if((parameters->numresolution[2] == 0 || (parameters->numresolution[1] == 0) || (parameters->numresolution[0] == 0))) { fprintf(stdout, "[ERROR] -n 'resolution levels' argument error ! Resolutions must be greater than 1 in order to perform DWT.\n"); return 1; } if (parameters->numresolution[1] != parameters->numresolution[0]) { fprintf(stdout, "[ERROR] -n 'resolution levels' argument error ! Resolutions in X and Y axis must be the same in this implementation.\n"); return 1; } if (parameters->numresolution[2] > parameters->numresolution[0]) { fprintf(stdout, "[ERROR] -n 'resolution levels' argument error ! Resolutions in Z axis must be lower than in X-Y axis.\n"); return 1; } if (parameters->dcoffset >= 128 && parameters->dcoffset <= -128) { fprintf(stdout, "[ERROR] -D 'DC offset' argument error ! Value must be -128<=DCO<=128.\n"); return 1; } if(parameters->numresolution[2] != 1) { parameters->transform_format = TRF_3D_DWT; /*fprintf(stdout, "[Warning] Resolution level in axial dim > 1 : 3D-DWT will be performed... \n");*/ } else if (parameters->numresolution[2] == 1) { parameters->transform_format = TRF_2D_DWT; /*fprintf(stdout, "[Warning] Resolution level in axial dim == 1 : 2D-DWT will be performed... \n");*/ } if ((parameters->cod_format == J2K_CFMT) && (parameters->transform_format != TRF_2D_DWT || parameters->encoding_format != ENCOD_2EB)) { fprintf(stdout, "[WARNING] Incompatible options -o *.j2k and defined transform or encoding algorithm. Latter will be ignored\n"); parameters->transform_format = TRF_2D_DWT; parameters->encoding_format = ENCOD_2EB; } if ((parameters->cp_disto_alloc || parameters->cp_fixed_alloc || parameters->cp_fixed_quality) && (!(parameters->cp_disto_alloc ^ parameters->cp_fixed_quality))) { fprintf(stdout, "[ERROR] Options -r and -q cannot be used together !!\n"); return 1; } /* mod fixed_quality */ /* if no rate entered, lossless by default */ if (parameters->tcp_numlayers == 0) { parameters->tcp_rates[0] = 0.0; /* MOD antonin : losslessbug */ parameters->tcp_numlayers++; parameters->cp_disto_alloc = 1; } if((parameters->cp_tx0 > parameters->volume_offset_x0) || (parameters->cp_ty0 > parameters->volume_offset_y0) || (parameters->cp_tz0 > parameters->volume_offset_z0)) { fprintf(stdout, "[ERROR] Tile offset dimension is unnappropriate --> TX0(%d)<=IMG_X0(%d) TYO(%d)<=IMG_Y0(%d) TZO(%d)<=IMG_Z0(%d)\n", parameters->cp_tx0, parameters->volume_offset_x0, parameters->cp_ty0, parameters->volume_offset_y0, parameters->cp_tz0, parameters->volume_offset_z0); return 1; } for (i = 0; i < parameters->numpocs; i++) { if (parameters->POC[i].prg == -1) { fprintf(stdout,"[ERROR] Unrecognized progression order in option -P (POC n %d) [LRCP, RLCP, RPCL, PCRL, CPRL] !!\n",i + 1); } } return 0; } /* -------------------------------------------------------------------------- */ /** sample error callback expecting a FILE* client object */ void error_callback(const char *msg, void *client_data) { FILE *stream = (FILE*)client_data; fprintf(stream, "[ERROR] %s", msg); } /** sample warning callback expecting a FILE* client object */ void warning_callback(const char *msg, void *client_data) { FILE *stream = (FILE*)client_data; fprintf(stream, "[WARNING] %s", msg); } /** sample debug callback expecting a FILE* client object */ void info_callback(const char *msg, void *client_data) { FILE *stream = (FILE*)client_data; fprintf(stream, "[INFO] %s", msg); } /* -------------------------------------------------------------------------- */ int main(int argc, char **argv) { bool bSuccess; bool delete_comment = true; opj_cparameters_t parameters; /* compression parameters */ opj_event_mgr_t event_mgr; /* event manager */ opj_volume_t *volume = NULL; /* configure the event callbacks (not required) setting of each callback is optionnal */ memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); event_mgr.error_handler = error_callback; event_mgr.warning_handler = warning_callback; event_mgr.info_handler = info_callback; /* set encoding parameters to default values */ opj_set_default_encoder_parameters(¶meters); /* parse input and get user encoding parameters */ if(parse_cmdline_encoder(argc, argv, ¶meters) == 1) { return 0; } if(parameters.cp_comment == NULL) { parameters.cp_comment = "Created by OpenJPEG version JP3D"; /* no need to delete parameters.cp_comment on exit */ delete_comment = false; } /* encode the destination volume */ /* ---------------------------- */ if (parameters.cod_format == J3D_CFMT || parameters.cod_format == J2K_CFMT) { int codestream_length, pixels, bitsin; opj_cio_t *cio = NULL; FILE *f = NULL; opj_cinfo_t* cinfo = NULL; /* decode the source volume */ /* ----------------------- */ switch (parameters.decod_format) { case PGX_DFMT: fprintf(stdout, "[INFO] Loading pgx file(s)\n"); volume = pgxtovolume(parameters.infile, ¶meters); if (!volume) { fprintf(stdout, "[ERROR] Unable to load pgx files\n"); return 1; } break; case BIN_DFMT: fprintf(stdout, "[INFO] Loading bin file\n"); volume = bintovolume(parameters.infile, parameters.imgfile, ¶meters); if (!volume) { fprintf(stdout, "[ERROR] Unable to load bin file\n"); return 1; } break; case IMG_DFMT: fprintf(stdout, "[INFO] Loading img file\n"); volume = imgtovolume(parameters.infile, ¶meters); if (!volume) { fprintf(stderr, "[ERROR] Unable to load img file\n"); return 1; } break; } /* get a JP3D or J2K compressor handle */ if (parameters.cod_format == J3D_CFMT) cinfo = opj_create_compress(CODEC_J3D); else if (parameters.cod_format == J2K_CFMT) cinfo = opj_create_compress(CODEC_J2K); /* catch events using our callbacks and give a local context */ opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stdout); /* setup the encoder parameters using the current volume and using user parameters */ opj_setup_encoder(cinfo, ¶meters, volume); /* open a byte stream for writing */ /* allocate memory for all tiles */ cio = opj_cio_open((opj_common_ptr)cinfo, NULL, 0); /* encode the volume */ /*fprintf(stdout, "[INFO] Encode the volume\n");*/ bSuccess = opj_encode(cinfo, cio, volume, parameters.index); if (!bSuccess) { opj_cio_close(cio); fprintf(stdout, "[ERROR] Failed to encode volume\n"); return 1; } codestream_length = cio_tell(cio); pixels =(volume->x1 - volume->x0) * (volume->y1 - volume->y0) * (volume->z1 - volume->z0); bitsin = pixels * volume->comps[0].prec; fprintf(stdout, "[RESULT] Volume: %d x %d x %d (x %d bpv)\n Codestream: %d B, Ratio: %5.3f bpv, (%5.3f : 1) \n", (volume->x1 - volume->x0),(volume->y1 - volume->y0),(volume->z1 - volume->z0),volume->comps[0].prec, codestream_length, ((double)codestream_length * 8.0/(double)pixels), ((double)bitsin/(8.0*(double)codestream_length))); /* write the buffer to disk */ f = fopen(parameters.outfile, "wb"); if (!f) { fprintf(stdout, "[ERROR] Failed to open %s for writing\n", parameters.outfile); return 1; } fwrite(cio->buffer, 1, codestream_length, f); fclose(f); /* close and free the byte stream */ opj_cio_close(cio); /* free remaining compression structures */ opj_destroy_compress(cinfo); } else { fprintf(stdout, "[ERROR] Cod_format != JP3d !!! \n"); return 1; } /* free user parameters structure */ if(delete_comment) { if(parameters.cp_comment) free(parameters.cp_comment); } if(parameters.cp_matrice) free(parameters.cp_matrice); /* free volume data */ opj_volume_destroy(volume); return 0; } openjpeg-2.1.0/src/bin/jp3d/opj_jp3d_decompress.c000755 001750 001750 00000046362 12327650566 023004 0ustar00mathieumathieu000000 000000 /* * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2006, Mnica Dez Garca, Image Processing Laboratory, University of Valladolid, Spain * 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 #include #include #include #include "opj_config.h" #include "openjp3d.h" #include "opj_getopt.h" #include "convert.h" #ifdef _WIN32 #include #else #define stricmp strcasecmp #define strnicmp strncasecmp #endif /* _WIN32 */ /* ----------------------------------------------------------------------- */ static double calc_PSNR(opj_volume_t *original, opj_volume_t *decoded) { int max, i, k, compno = 0, size; double sum, total = 0; int global = 1; max = (original->comps[compno].prec <= 8) ? 255 : (1 << original->comps[compno].prec) - 1; if (global) { size = (original->x1 - original->x0) * (original->y1 - original->y0) * (original->z1 - original->z0); for (compno = 0; compno < original->numcomps; compno++) { for(sum = 0, i = 0; i < size; ++i) { if ((decoded->comps[compno].data[i] < 0) || (decoded->comps[compno].data[i] > max)) fprintf(stdout,"[WARNING] Data out of range during PSNR computing...\n"); else sum += (original->comps[compno].data[i] - decoded->comps[compno].data[i]) * (original->comps[compno].data[i] - decoded->comps[compno].data[i]); } } sum /= size; total = ((sum==0.0) ? 0.0 : 10 * log10(max * max / sum)); } else { size = (original->x1 - original->x0) * (original->y1 - original->y0); for (k = 0; k < original->z1 - original->z0; k++) { int offset = k * size; for (sum = 0, compno = 0; compno < original->numcomps; compno++) { for(i = 0; i < size; ++i) { if ((decoded->comps[compno].data[i + offset] < 0) || (decoded->comps[compno].data[i + offset] > max)) fprintf(stdout,"[WARNING] Data out of range during PSNR computing...\n"); else sum += (original->comps[compno].data[i + offset] - decoded->comps[compno].data[i + offset]) * (original->comps[compno].data[i + offset] - decoded->comps[compno].data[i + offset]); } } sum /= size; total = total + ((sum==0.0) ? 0.0 : 10 * log10(max * max / sum)); } } if(total == 0) /* perfect reconstruction, PSNR should return infinity */ return -1.0; return total; /*return 20 * log10((max - 1) / sqrt(sum));*/ } static double calc_SSIM(opj_volume_t *original, opj_volume_t *decoded) { int max, i, compno = 0, size, sizeM; double sum; double mux = 0.0, muy = 0.0, sigmax = 0.0, sigmay = 0.0, sigmaxy = 0.0/*, structx = 0.0, structy = 0.0*/; double lcomp,ccomp,scomp; double C1,C2,C3; max = (original->comps[compno].prec <= 8) ? 255 : (1 << original->comps[compno].prec) - 1; size = (original->x1 - original->x0) * (original->y1 - original->y0) * (original->z1 - original->z0); /*MSSIM*/ /* sizeM = size / (original->z1 - original->z0);*/ sizeM = size; for(sum = 0, i = 0; i < sizeM; ++i) { /* First, the luminance of each signal is compared.*/ mux += original->comps[compno].data[i]; muy += decoded->comps[compno].data[i]; } mux /= sizeM; muy /= sizeM; /*We use the standard deviation (the square root of variance) as an estimate of the signal contrast.*/ for(sum = 0, i = 0; i < sizeM; ++i) { /* First, the luminance of each signal is compared.*/ sigmax += (original->comps[compno].data[i] - mux) * (original->comps[compno].data[i] - mux); sigmay += (decoded->comps[compno].data[i] - muy) * (decoded->comps[compno].data[i] - muy); sigmaxy += (original->comps[compno].data[i] - mux) * (decoded->comps[compno].data[i] - muy); } sigmax /= sizeM - 1; sigmay /= sizeM - 1; sigmaxy /= sizeM - 1; sigmax = sqrt(sigmax); sigmay = sqrt(sigmay); sigmaxy = sqrt(sigmaxy); /*Third, the signal is normalized (divided) by its own standard deviation, */ /*so that the two signals being compared have unit standard deviation.*/ /*Luminance comparison*/ C1 = (0.01 * max) * (0.01 * max); lcomp = ((2 * mux * muy) + C1)/((mux*mux) + (muy*mux) + C1); /*Constrast comparison*/ C2 = (0.03 * max) * (0.03 * max); ccomp = ((2 * sigmax * sigmay) + C2)/((sigmax*sigmax) + (sigmay*sigmay) + C2); /*Structure comparison*/ C3 = C2 / 2; scomp = (sigmaxy + C3) / (sigmax * sigmay + C3); /*Similarity measure*/ sum = lcomp * ccomp * scomp; return sum; } void decode_help_display() { fprintf(stdout,"HELP\n----\n\n"); fprintf(stdout,"- the -h option displays this help information on screen\n\n"); fprintf(stdout,"List of parameters for the JPEG 2000 encoder:\n"); fprintf(stdout,"\n"); fprintf(stdout," Required arguments \n"); fprintf(stdout," ---------------------------- \n"); fprintf(stdout," -i ( *.jp3d, *.j3d )\n"); fprintf(stdout," Currently accepts J3D-files. The file type is identified based on its suffix.\n"); fprintf(stdout," -o ( *.pgx, *.bin )\n"); fprintf(stdout," Currently accepts PGX-files and BIN-files. Binary data is written to the file (not ascii). \n"); fprintf(stdout," If a PGX filename is given, there will be as many output files as slices; \n"); fprintf(stdout," an indice starting from 0 will then be appended to the output filename,\n"); fprintf(stdout," just before the \"pgx\" extension.\n"); fprintf(stdout," -m ( *.img ) \n"); fprintf(stdout," Required only for BIN-files. Ascii data of volume characteristics is written. \n"); fprintf(stdout,"\n"); fprintf(stdout," Optional \n"); fprintf(stdout," ---------------------------- \n"); fprintf(stdout," -h \n "); fprintf(stdout," Display the help information\n"); fprintf(stdout," -r \n"); fprintf(stdout," Set the number of highest resolution levels to be discarded on each dimension. \n"); fprintf(stdout," The volume resolution is effectively divided by 2 to the power of the\n"); fprintf(stdout," number of discarded levels. The reduce factor is limited by the\n"); fprintf(stdout," smallest total number of decomposition levels among tiles.\n"); fprintf(stdout," -l \n"); fprintf(stdout," Set the maximum number of quality layers to decode. If there are\n"); fprintf(stdout," less quality layers than the specified number, all the quality layers\n"); fprintf(stdout," are decoded. \n"); fprintf(stdout," -O original-file \n"); fprintf(stdout," This option offers the possibility to compute some quality results \n"); fprintf(stdout," for the decompressed volume, like the PSNR value achieved or the global SSIM value. \n"); fprintf(stdout," Needs the original file in order to compare with the new one.\n"); fprintf(stdout," NOTE: Only valid when -r option is 0,0,0 (both original and decompressed volumes have same resolutions) \n"); fprintf(stdout," NOTE: If original file is .BIN file, the volume characteristics file shall be defined with the -m option. \n"); fprintf(stdout," (i.e. -O original-BIN-file -m original-IMG-file) \n"); fprintf(stdout," -BE \n"); fprintf(stdout," Define that the recovered volume data will be saved with big endian byte order.\n"); fprintf(stdout," By default, little endian byte order is used.\n"); fprintf(stdout,"\n"); } /* -------------------------------------------------------------------------- */ int get_file_format(char *filename) { int i; static const char *extension[] = {"pgx", "bin", "j3d", "jp3d", "j2k", "img"}; static const int format[] = { PGX_DFMT, BIN_DFMT, J3D_CFMT, J3D_CFMT, J2K_CFMT, IMG_DFMT}; char * ext = strrchr(filename, '.'); if(ext) { ext++; for(i = 0; i < sizeof(format) / sizeof(format[0]); i++) { if(strnicmp(ext, extension[i], 3) == 0) { return format[i]; } } } return -1; } /* -------------------------------------------------------------------------- */ int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters) { /* parse the command line */ while (1) { int c = opj_getopt(argc, argv, "i:o:O:r:l:B:m:h"); if (c == -1) break; switch (c) { case 'i': /* input file */ { char *infile = opj_optarg; parameters->decod_format = get_file_format(infile); switch(parameters->decod_format) { case J3D_CFMT: case J2K_CFMT: break; default: fprintf(stdout, "[ERROR] Unknown format for infile %s [only *.j3d]!! \n", infile); return 1; break; } strncpy(parameters->infile, infile, MAX_PATH); fprintf(stdout, "[INFO] Infile: %s \n", parameters->infile); } break; case 'm': /* img file */ { char *imgfile = opj_optarg; int imgformat = get_file_format(imgfile); switch(imgformat) { case IMG_DFMT: break; default: fprintf(stdout, "[ERROR] Unrecognized format for imgfile : %s [accept only *.img] !!\n\n", imgfile); return 1; break; } strncpy(parameters->imgfile, imgfile, MAX_PATH); fprintf(stdout, "[INFO] Imgfile: %s Format: %d\n", parameters->imgfile, imgformat); } break; /* ----------------------------------------------------- */ case 'o': /* output file */ { char *outfile = opj_optarg; parameters->cod_format = get_file_format(outfile); switch(parameters->cod_format) { case PGX_DFMT: case BIN_DFMT: break; default: fprintf(stdout, "[ERROR] Unrecognized format for outfile : %s [accept only *.pgx or *.bin] !!\n\n", outfile); return 1; break; } strncpy(parameters->outfile, outfile, MAX_PATH); fprintf(stdout, "[INFO] Outfile: %s \n", parameters->outfile); } break; /* ----------------------------------------------------- */ case 'O': /* Original image for PSNR computing */ { char *original = opj_optarg; parameters->orig_format = get_file_format(original); switch(parameters->orig_format) { case PGX_DFMT: case BIN_DFMT: break; default: fprintf(stdout, "[ERROR] Unrecognized format for original file : %s [accept only *.pgx or *.bin] !!\n\n", original); return 1; break; } strncpy(parameters->original, original, MAX_PATH); fprintf(stdout, "[INFO] Original file: %s \n", parameters->original); } break; /* ----------------------------------------------------- */ case 'r': /* reduce option */ { /*sscanf(opj_optarg, "%d, %d, %d", ¶meters->cp_reduce[0], ¶meters->cp_reduce[1], ¶meters->cp_reduce[2]);*/ int aux; aux = sscanf(opj_optarg, "%d,%d,%d", ¶meters->cp_reduce[0], ¶meters->cp_reduce[1], ¶meters->cp_reduce[2]); if (aux == 2) parameters->cp_reduce[2] = 0; else if (aux == 1) { parameters->cp_reduce[1] = parameters->cp_reduce[0]; parameters->cp_reduce[2] = 0; }else if (aux == 0){ parameters->cp_reduce[0] = 0; parameters->cp_reduce[1] = 0; parameters->cp_reduce[2] = 0; } } break; /* ----------------------------------------------------- */ case 'l': /* layering option */ { sscanf(opj_optarg, "%d", ¶meters->cp_layer); } break; /* ----------------------------------------------------- */ case 'B': /* BIGENDIAN vs. LITTLEENDIAN */ { parameters->bigendian = 1; } break; /* ----------------------------------------------------- */ case 'L': /* BIGENDIAN vs. LITTLEENDIAN */ { parameters->decod_format = LSE_CFMT; } break; /* ----------------------------------------------------- */ case 'h': /* display an help description */ { decode_help_display(); return 1; } break; /* ----------------------------------------------------- */ default: fprintf(stdout,"[WARNING] This option is not valid \"-%c %s\"\n",c, opj_optarg); break; } } /* check for possible errors */ if((parameters->infile[0] == 0) || (parameters->outfile[0] == 0)) { fprintf(stdout,"[ERROR] At least one required argument is missing\n Check jp3d_to_volume -help for usage information\n"); return 1; } return 0; } /* -------------------------------------------------------------------------- */ /** sample error callback expecting a FILE* client object */ void error_callback(const char *msg, void *client_data) { FILE *stream = (FILE*)client_data; fprintf(stream, "[ERROR] %s", msg); } /** sample warning callback expecting a FILE* client object */ void warning_callback(const char *msg, void *client_data) { FILE *stream = (FILE*)client_data; fprintf(stream, "[WARNING] %s", msg); } /** sample debug callback expecting no client object */ void info_callback(const char *msg, void *client_data) { fprintf(stdout, "[INFO] %s", msg); } /* -------------------------------------------------------------------------- */ int main(int argc, char **argv) { opj_dparameters_t parameters; /* decompression parameters */ opj_event_mgr_t event_mgr; /* event manager */ opj_volume_t *volume = NULL; opj_volume_t *original = NULL; opj_cparameters_t cparameters; /* original parameters */ FILE *fsrc = NULL; unsigned char *src = NULL; int file_length; int decodeok; double psnr, ssim; opj_dinfo_t* dinfo = NULL; /* handle to a decompressor */ opj_cio_t *cio = NULL; /* configure the event callbacks (not required) */ memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); event_mgr.error_handler = error_callback; event_mgr.warning_handler = warning_callback; event_mgr.info_handler = info_callback; /* set decoding parameters to default values */ opj_set_default_decoder_parameters(¶meters); /* parse input and get user decoding parameters */ strcpy(parameters.original,"NULL"); strcpy(parameters.imgfile,"NULL"); if(parse_cmdline_decoder(argc, argv, ¶meters) == 1) { return 0; } /* read the input file and put it in memory */ /* ---------------------------------------- */ fprintf(stdout, "[INFO] Loading %s file \n",parameters.decod_format==J3D_CFMT ? ".jp3d" : ".j2k"); fsrc = fopen(parameters.infile, "rb"); if (!fsrc) { fprintf(stdout, "[ERROR] Failed to open %s for reading\n", parameters.infile); return 1; } fseek(fsrc, 0, SEEK_END); file_length = ftell(fsrc); fseek(fsrc, 0, SEEK_SET); src = (unsigned char *) malloc(file_length); fread(src, 1, file_length, fsrc); fclose(fsrc); /* decode the code-stream */ /* ---------------------- */ if (parameters.decod_format == J3D_CFMT || parameters.decod_format == J2K_CFMT) { /* get a JP3D or J2K decoder handle */ if (parameters.decod_format == J3D_CFMT) dinfo = opj_create_decompress(CODEC_J3D); else if (parameters.decod_format == J2K_CFMT) dinfo = opj_create_decompress(CODEC_J2K); /* catch events using our callbacks and give a local context */ opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr); /* setup the decoder decoding parameters using user parameters */ opj_setup_decoder(dinfo, ¶meters); /* open a byte stream */ cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length); /* decode the stream and fill the volume structure */ volume = opj_decode(dinfo, cio); if(!volume) { fprintf(stdout, "[ERROR] jp3d_to_volume: failed to decode volume!\n"); opj_destroy_decompress(dinfo); opj_cio_close(cio); return 1; } /* close the byte stream */ opj_cio_close(cio); } /* free the memory containing the code-stream */ free(src); src = NULL; /* create output volume */ /* ------------------- */ switch (parameters.cod_format) { case PGX_DFMT: /* PGX */ decodeok = volumetopgx(volume, parameters.outfile); if (decodeok) fprintf(stdout,"[ERROR] Unable to write decoded volume into pgx files\n"); break; case BIN_DFMT: /* BMP */ decodeok = volumetobin(volume, parameters.outfile); if (decodeok) fprintf(stdout,"[ERROR] Unable to write decoded volume into pgx files\n"); break; } switch (parameters.orig_format) { case PGX_DFMT: /* PGX */ if (strcmp("NULL",parameters.original) != 0){ fprintf(stdout,"Loading original file %s \n",parameters.original); cparameters.subsampling_dx = 1; cparameters.subsampling_dy = 1; cparameters.subsampling_dz = 1; cparameters.volume_offset_x0 = 0;cparameters.volume_offset_y0 = 0;cparameters.volume_offset_z0 = 0; original = pgxtovolume(parameters.original,&cparameters); } break; case BIN_DFMT: /* BMP */ if (strcmp("NULL",parameters.original) != 0 && strcmp("NULL",parameters.imgfile) != 0){ fprintf(stdout,"Loading original file %s %s\n",parameters.original,parameters.imgfile); cparameters.subsampling_dx = 1; cparameters.subsampling_dy = 1; cparameters.subsampling_dz = 1; cparameters.volume_offset_x0 = 0;cparameters.volume_offset_y0 = 0;cparameters.volume_offset_z0 = 0; original = bintovolume(parameters.original,parameters.imgfile,&cparameters); } break; } fprintf(stdout, "[RESULT] Volume: %d x %d x %d (x %d bpv)\n ", (volume->comps[0].w >> volume->comps[0].factor[0]), (volume->comps[0].h >> volume->comps[0].factor[1]), (volume->comps[0].l >> volume->comps[0].factor[2]), volume->comps[0].prec); if(original){ psnr = calc_PSNR(original,volume); ssim = calc_SSIM(original,volume); if (psnr < 0.0) fprintf(stdout, " PSNR: Inf , SSMI %f -- Perfect reconstruction!\n",ssim); else fprintf(stdout, " PSNR: %f , SSIM %f \n",psnr,ssim); } /* free remaining structures */ if(dinfo) { opj_destroy_decompress(dinfo); } /* free volume data structure */ opj_volume_destroy(volume); return 0; } openjpeg-2.1.0/src/bin/jp3d/CMakeLists.txt000644 001750 001750 00000002001 12327650566 021417 0ustar00mathieumathieu000000 000000 # Build the demo app, small examples # First thing define the common source: SET(common_SRCS convert.c ${OPENJPEG_SOURCE_DIR}/src/bin/common/opj_getopt.c ) # Headers file are located here: include_directories( ${OPENJPEG_BINARY_DIR}/src/lib/openjp2 # opj_config.h ${OPENJPEG_SOURCE_DIR}/src/lib/openjp3d ${LCMS_INCLUDE_DIRNAME} ${OPENJPEG_SOURCE_DIR}/src/bin/common ${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_jp3d_compress opj_jp3d_decompress) ADD_EXECUTABLE(${exe} ${exe}.c ${common_SRCS}) TARGET_LINK_LIBRARIES(${exe} openjp3d) # On unix you need to link to the math library: IF(UNIX) TARGET_LINK_LIBRARIES(${exe} m) ENDIF(UNIX) # Install exe INSTALL(TARGETS ${exe} EXPORT OpenJP3DTargets DESTINATION ${OPENJPEG_INSTALL_BIN_DIR} COMPONENT Applications ) endforeach() openjpeg-2.1.0/src/bin/jp3d/convert.h000755 001750 001750 00000004626 12327650566 020532 0ustar00mathieumathieu000000 000000 /* * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2006, Mnica Dez Garca, Image Processing Laboratory, University of Valladolid, Spain * 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 __JP3D_CONVERT_H #define __JP3D_CONVERT_H /** Load a single volume component encoded in PGX file format @param filename Name of the PGX file to load @param parameters *List ?* @return Returns a greyscale volume if successful, returns NULL otherwise */ opj_volume_t* pgxtovolume(char *filename, opj_cparameters_t *parameters); int volumetopgx(opj_volume_t *volume, char *outfile); opj_volume_t* bintovolume(char *filename,char *fileimg, opj_cparameters_t *parameters); int volumetobin(opj_volume_t *volume, char *outfile); opj_volume_t* imgtovolume(char *fileimg, opj_cparameters_t *parameters); #endif /* __J2K_CONVERT_H */ openjpeg-2.1.0/src/bin/jp3d/getopt.c000755 001750 001750 00000010006 12327650566 020334 0ustar00mathieumathieu000000 000000 /* * 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. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * 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[] = "@(#)getopt.c 8.3 (Berkeley) 4/27/95"; #endif /* LIBC_SCCS and not lint */ #include #include #include int opterr = 1, /* if error message should be printed */ optind = 1, /* index into parent argv vector */ optopt, /* character checked for validity */ optreset; /* reset getopt */ char *optarg; /* argument associated with option */ #define BADCH (int)'?' #define BADARG (int)':' #define EMSG "" /* * getopt -- * Parse argc/argv argument vector. */ int getopt(int nargc, char *const *nargv, const char *ostr) { # define __progname nargv[0] /* program name */ static char *place = EMSG; /* option letter processing */ char *oli; /* option letter list index */ if (optreset || !*place) { /* update scanning pointer */ optreset = 0; if (optind >= nargc || *(place = nargv[optind]) != '-') { place = EMSG; return (-1); } if (place[1] && *++place == '-') { /* found "--" */ ++optind; place = EMSG; return (-1); } } /* option letter okay? */ if ((optopt = (int) *place++) == (int) ':' || !(oli = strchr(ostr, optopt))) { /* if the user didn't specify '-' as an option, assume it means -1. */ if (optopt == (int) '-') return (-1); if (!*place) ++optind; if (opterr && *ostr != ':') (void) fprintf(stdout,"[ERROR] %s: illegal option -- %c\n", __progname, optopt); return (BADCH); } if (*++oli != ':') { /* don't need argument */ optarg = NULL; if (!*place) ++optind; } else { /* need an argument */ if (*place) /* no white space */ optarg = place; else if (nargc <= ++optind) { /* no arg */ place = EMSG; if (*ostr == ':') return (BADARG); if (opterr) (void) fprintf(stdout, "[ERROR] %s: option requires an argument -- %c\n", __progname, optopt); return (BADCH); } else /* white space */ optarg = nargv[optind]; place = EMSG; ++optind; } return (optopt); /* dump back option letter */ } openjpeg-2.1.0/src/bin/jp3d/windirent.h000644 001750 001750 00000053455 12327650566 021056 0ustar00mathieumathieu000000 000000 /* * uce-dirent.h - operating system independent dirent implementation * * Copyright (C) 1998-2002 Toni Ronkko * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * ``Software''), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL TONI RONKKO BE LIABLE FOR ANY CLAIM, DAMAGES OR * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. * * * May 28 1998, Toni Ronkko * * $Id: uce-dirent.h,v 1.7 2002/05/13 10:48:35 tr Exp $ * * $Log: uce-dirent.h,v $ * Revision 1.7 2002/05/13 10:48:35 tr * embedded some source code directly to the header so that no source * modules need to be included in the MS Visual C project using the * interface, removed all the dependencies to other headers of the `uce' * library so that the header can be made public * * Revision 1.6 2002/04/12 16:22:04 tr * Unified Compiling Environment (UCE) replaced `std' library * * Revision 1.5 2001/07/20 16:33:40 tr * moved to `std' library and re-named defines accordingly * * Revision 1.4 2001/07/10 16:47:18 tronkko * revised comments * * Revision 1.3 2001/01/11 13:16:43 tr * using ``uce-machine.h'' for finding out defines such as `FREEBSD' * * Revision 1.2 2000/10/08 16:00:41 tr * copy of FreeBSD man page * * Revision 1.1 2000/07/10 05:53:16 tr * Initial revision * * Revision 1.2 1998/07/19 18:29:14 tr * Added error reporting capabilities and some asserts. * * Revision 1.1 1998/07/04 16:27:51 tr * Initial revision * * * MSVC 1.0 scans automatic dependencies incorrectly when your project * contains this very header. The problem is that MSVC cannot handle * include directives inside #if..#endif block those are never entered. * Since this header ought to compile in many different operating systems, * there had to be several conditional blocks that are compiled only in * operating systems for what they were designed for. MSVC 1.0 cannot * handle inclusion of sys/dir.h in a part that is compiled only in Apollo * operating system. To fix the problem you need to insert DIR.H into * SYSINCL.DAT located in MSVC\BIN directory and restart visual C++. * Consult manuals for more informaton about the problem. * * Since many UNIX systems have dirent.h we assume to have one also. * However, if your UNIX system does not have dirent.h you can download one * for example at: http://ftp.uni-mannheim.de/ftp/GNU/dirent/dirent.tar.gz. * You can also see if you have one of dirent.h, direct.h, dir.h, ndir.h, * sys/dir.h and sys/ndir.h somewhere. Try defining HAVE_DIRENT_H, * HAVE_DIRECT_H, HAVE_DIR_H, HAVE_NDIR_H, HAVE_SYS_DIR_H and * HAVE_SYS_NDIR_H according to the files found. */ #ifndef DIRENT_H #define DIRENT_H #define DIRENT_H_INCLUDED /* find out platform */ #if defined(MSDOS) /* MS-DOS */ #elif defined(__MSDOS__) /* Turbo C/Borland */ # define MSDOS #elif defined(__DOS__) /* Watcom */ # define MSDOS #endif #if defined(WIN32) /* MS-Windows */ #elif defined(__NT__) /* Watcom */ # define WIN32 #elif defined(_WIN32) /* Microsoft */ # define WIN32 #elif defined(__WIN32__) /* Borland */ # define WIN32 #endif /* * See what kind of dirent interface we have unless autoconf has already * determinated that. */ #if !defined(HAVE_DIRENT_H) && !defined(HAVE_DIRECT_H) && !defined(HAVE_SYS_DIR_H) && !defined(HAVE_NDIR_H) && !defined(HAVE_SYS_NDIR_H) && !defined(HAVE_DIR_H) # if defined(_MSC_VER) /* Microsoft C/C++ */ /* no dirent.h */ # elif defined(__MINGW32__) /* MinGW */ /* no dirent.h */ # elif defined(__BORLANDC__) /* Borland C/C++ */ # define HAVE_DIRENT_H # define VOID_CLOSEDIR # elif defined(__TURBOC__) /* Borland Turbo C */ /* no dirent.h */ # elif defined(__WATCOMC__) /* Watcom C/C++ */ # define HAVE_DIRECT_H # elif defined(__apollo) /* Apollo */ # define HAVE_SYS_DIR_H # elif defined(__hpux) /* HP-UX */ # define HAVE_DIRENT_H # elif defined(__alpha) || defined(__alpha__) /* Alpha OSF1 */ # error "not implemented" # elif defined(__sgi) /* Silicon Graphics */ # define HAVE_DIRENT_H # elif defined(sun) || defined(_sun) /* Sun Solaris */ # define HAVE_DIRENT_H # elif defined(__FreeBSD__) /* FreeBSD */ # define HAVE_DIRENT_H # elif defined(__linux__) /* Linux */ # define HAVE_DIRENT_H # elif defined(__GNUC__) /* GNU C/C++ */ # define HAVE_DIRENT_H # else # error "not implemented" # endif #endif /* include proper interface headers */ #if defined(HAVE_DIRENT_H) # include # ifdef FREEBSD # define NAMLEN(dp) ((int)((dp)->d_namlen)) # else # define NAMLEN(dp) ((int)(strlen((dp)->d_name))) # endif #elif defined(HAVE_NDIR_H) # include # define NAMLEN(dp) ((int)((dp)->d_namlen)) #elif defined(HAVE_SYS_NDIR_H) # include # define NAMLEN(dp) ((int)((dp)->d_namlen)) #elif defined(HAVE_DIRECT_H) # include # define NAMLEN(dp) ((int)((dp)->d_namlen)) #elif defined(HAVE_DIR_H) # include # define NAMLEN(dp) ((int)((dp)->d_namlen)) #elif defined(HAVE_SYS_DIR_H) # include # include # ifndef dirent # define dirent direct # endif # define NAMLEN(dp) ((int)((dp)->d_namlen)) #elif defined(MSDOS) || defined(WIN32) /* figure out type of underlaying directory interface to be used */ # if defined(WIN32) # define DIRENT_WIN32_INTERFACE # elif defined(MSDOS) # define DIRENT_MSDOS_INTERFACE # else # error "missing native dirent interface" # endif /*** WIN32 specifics ***/ # if defined(DIRENT_WIN32_INTERFACE) # include # if !defined(DIRENT_MAXNAMLEN) # define DIRENT_MAXNAMLEN (MAX_PATH) # endif /*** MS-DOS specifics ***/ # elif defined(DIRENT_MSDOS_INTERFACE) # include /* Borland defines file length macros in dir.h */ # if defined(__BORLANDC__) # include # if !defined(DIRENT_MAXNAMLEN) # define DIRENT_MAXNAMLEN ((MAXFILE)+(MAXEXT)) # endif # if !defined(_find_t) # define _find_t find_t # endif /* Turbo C defines ffblk structure in dir.h */ # elif defined(__TURBOC__) # include # if !defined(DIRENT_MAXNAMLEN) # define DIRENT_MAXNAMLEN ((MAXFILE)+(MAXEXT)) # endif # define DIRENT_USE_FFBLK /* MSVC */ # elif defined(_MSC_VER) # if !defined(DIRENT_MAXNAMLEN) # define DIRENT_MAXNAMLEN (12) # endif /* Watcom */ # elif defined(__WATCOMC__) # if !defined(DIRENT_MAXNAMLEN) # if defined(__OS2__) || defined(__NT__) # define DIRENT_MAXNAMLEN (255) # else # define DIRENT_MAXNAMLEN (12) # endif # endif # endif # endif /*** generic MS-DOS and MS-Windows stuff ***/ # if !defined(NAME_MAX) && defined(DIRENT_MAXNAMLEN) # define NAME_MAX DIRENT_MAXNAMLEN # endif # if NAME_MAX < DIRENT_MAXNAMLEN # error "assertion failed: NAME_MAX >= DIRENT_MAXNAMLEN" # endif /* * Substitute for real dirent structure. Note that `d_name' field is a * true character array although we have it copied in the implementation * dependent data. We could save some memory if we had declared `d_name' * as a pointer refering the name within implementation dependent data. * We have not done that since some code may rely on sizeof(d_name) to be * something other than four. Besides, directory entries are typically so * small that it takes virtually no time to copy them from place to place. */ typedef struct dirent { char d_name[NAME_MAX + 1]; /*** Operating system specific part ***/ # if defined(DIRENT_WIN32_INTERFACE) /*WIN32*/ WIN32_FIND_DATA data; # elif defined(DIRENT_MSDOS_INTERFACE) /*MSDOS*/ # if defined(DIRENT_USE_FFBLK) struct ffblk data; # else struct _find_t data; # endif # endif } dirent; /* DIR substitute structure containing directory name. The name is * essential for the operation of ``rewinndir'' function. */ typedef struct DIR { char *dirname; /* directory being scanned */ dirent current; /* current entry */ int dirent_filled; /* is current un-processed? */ /*** Operating system specific part ***/ # if defined(DIRENT_WIN32_INTERFACE) HANDLE search_handle; # elif defined(DIRENT_MSDOS_INTERFACE) # endif } DIR; # ifdef __cplusplus extern "C" { # endif /* supply prototypes for dirent functions */ static DIR *opendir (const char *dirname); static struct dirent *readdir (DIR *dirp); static int closedir (DIR *dirp); static void rewinddir (DIR *dirp); /* * Implement dirent interface as static functions so that the user does not * need to change his project in any way to use dirent function. With this * it is sufficient to include this very header from source modules using * dirent functions and the functions will be pulled in automatically. */ #include #include #include #include #include /* use ffblk instead of _find_t if requested */ #if defined(DIRENT_USE_FFBLK) # define _A_ARCH (FA_ARCH) # define _A_HIDDEN (FA_HIDDEN) # define _A_NORMAL (0) # define _A_RDONLY (FA_RDONLY) # define _A_SUBDIR (FA_DIREC) # define _A_SYSTEM (FA_SYSTEM) # define _A_VOLID (FA_LABEL) # define _dos_findnext(dest) findnext(dest) # define _dos_findfirst(name,flags,dest) findfirst(name,dest,flags) #endif static int _initdir (DIR *p); static const char *_getdirname (const struct dirent *dp); static void _setdirname (struct DIR *dirp); /* * * open directory stream for reading * DIR *opendir (const char *dirname); * * Open named directory stream for read and return pointer to the * internal working area that is used for retrieving individual directory * entries. The internal working area has no fields of your interest. * * Returns a pointer to the internal working area or NULL in case the * directory stream could not be opened. Global `errno' variable will set * in case of error as follows: * *
* [EACESS |Permission denied. * [EMFILE |Too many open files used by the process. * [ENFILE |Too many open files in system. * [ENOENT |Directory does not exist. * [ENOMEM |Insufficient memory. * [ENOTDIR |dirname does not refer to directory. This value is not * reliable on MS-DOS and MS-Windows platforms. Many * implementations return ENOENT even when the name refers to a * file.] *
* */ static DIR *opendir(const char *dirname) { DIR *dirp; assert (dirname != NULL); dirp = (DIR*)malloc (sizeof (struct DIR)); if (dirp != NULL) { char *p; /* allocate room for directory name */ dirp->dirname = (char*) malloc (strlen (dirname) + 1 + strlen ("\\*.*")); if (dirp->dirname == NULL) { /* failed to duplicate directory name. errno set by malloc() */ free (dirp); return NULL; } /* Copy directory name while appending directory separator and "*.*". * Directory separator is not appended if the name already ends with * drive or directory separator. Directory separator is assumed to be * '/' or '\' and drive separator is assumed to be ':'. */ strcpy (dirp->dirname, dirname); p = strchr (dirp->dirname, '\0'); if (dirp->dirname < p && *(p - 1) != '\\' && *(p - 1) != '/' && *(p - 1) != ':') { strcpy (p++, "\\"); } # ifdef DIRENT_WIN32_INTERFACE strcpy (p, "*"); /*scan files with and without extension in win32*/ # else strcpy (p, "*.*"); /*scan files with and without extension in DOS*/ # endif /* open stream */ if (_initdir (dirp) == 0) { /* initialization failed */ free (dirp->dirname); free (dirp); return NULL; } } return dirp; } /* * * read a directory entry * struct dirent *readdir (DIR *dirp); * * Read individual directory entry and return pointer to a structure * containing the name of the entry. Individual directory entries returned * include normal files, sub-directories, pseudo-directories "." and ".." * and also volume labels, hidden files and system files in MS-DOS and * MS-Windows. You might want to use stat(2) function to determinate which * one are you dealing with. Many dirent implementations already contain * equivalent information in dirent structure but you cannot depend on * this. * * The dirent structure contains several system dependent fields that * generally have no interest to you. The only interesting one is char * d_name[] that is also portable across different systems. The d_name * field contains the name of the directory entry without leading path. * While d_name is portable across different systems the actual storage * capacity of d_name varies from system to system and there is no portable * way to find out it at compile time as different systems define the * capacity of d_name with different macros and some systems do not define * capacity at all (besides actual declaration of the field). If you really * need to find out storage capacity of d_name then you might want to try * NAME_MAX macro. The NAME_MAX is defined in POSIX standard althought * there are many MS-DOS and MS-Windows implementations those do not define * it. There are also systems that declare d_name as "char d_name[1]" and * then allocate suitable amount of memory at run-time. Thanks to Alain * Decamps (Alain.Decamps@advalvas.be) for pointing it out to me. * * This all leads to the fact that it is difficult to allocate space * for the directory names when the very same program is being compiled on * number of operating systems. Therefore I suggest that you always * allocate space for directory names dynamically. * * * Returns a pointer to a structure containing name of the directory entry * in `d_name' field or NULL if there was an error. In case of an error the * global `errno' variable will set as follows: * * * [EBADF |dir parameter refers to an invalid directory stream. This value * is not set reliably on all implementations.] *
*
*/ static struct dirent * readdir (DIR *dirp) { assert(dirp != NULL); if (dirp == NULL) { errno = EBADF; return NULL; } #if defined(DIRENT_WIN32_INTERFACE) if (dirp->search_handle == INVALID_HANDLE_VALUE) { /* directory stream was opened/rewound incorrectly or it ended normally */ errno = EBADF; return NULL; } #endif if (dirp->dirent_filled != 0) { /* * Directory entry has already been retrieved and there is no need to * retrieve a new one. Directory entry will be retrieved in advance * when the user calls readdir function for the first time. This is so * because real dirent has separate functions for opening and reading * the stream whereas Win32 and DOS dirents open the stream * automatically when we retrieve the first file. Therefore, we have to * save the first file when opening the stream and later we have to * return the saved entry when the user tries to read the first entry. */ dirp->dirent_filled = 0; } else { /* fill in entry and return that */ #if defined(DIRENT_WIN32_INTERFACE) if (FindNextFile (dirp->search_handle, &dirp->current.data) == FALSE) { /* Last file has been processed or an error occured */ FindClose (dirp->search_handle); dirp->search_handle = INVALID_HANDLE_VALUE; errno = ENOENT; return NULL; } # elif defined(DIRENT_MSDOS_INTERFACE) if (_dos_findnext (&dirp->current.data) != 0) { /* _dos_findnext and findnext will set errno to ENOENT when no * more entries could be retrieved. */ return NULL; } # endif _setdirname (dirp); assert (dirp->dirent_filled == 0); } return &dirp->current; } /* * * close directory stream. * int closedir (DIR *dirp); * * Close directory stream opened by the `opendir' function. Close of * directory stream invalidates the DIR structure as well as previously read * dirent entry. * * The function typically returns 0 on success and -1 on failure but * the function may be declared to return void on same systems. At least * Borland C/C++ and some UNIX implementations use void as a return type. * The dirent wrapper tries to define VOID_CLOSEDIR whenever closedir is * known to return nothing. The very same definition is made by the GNU * autoconf if you happen to use it. * * The global `errno' variable will set to EBADF in case of error. * */ static int closedir (DIR *dirp) { int retcode = 0; /* make sure that dirp points to legal structure */ assert (dirp != NULL); if (dirp == NULL) { errno = EBADF; return -1; } /* free directory name and search handles */ if (dirp->dirname != NULL) free (dirp->dirname); #if defined(DIRENT_WIN32_INTERFACE) if (dirp->search_handle != INVALID_HANDLE_VALUE) { if (FindClose (dirp->search_handle) == FALSE) { /* Unknown error */ retcode = -1; errno = EBADF; } } #endif /* clear dirp structure to make sure that it cannot be used anymore*/ memset (dirp, 0, sizeof (*dirp)); # if defined(DIRENT_WIN32_INTERFACE) dirp->search_handle = INVALID_HANDLE_VALUE; # endif free (dirp); return retcode; } /* * * rewind directory stream to the beginning * void rewinddir (DIR *dirp); * * Rewind directory stream to the beginning so that the next call of * readdir() returns the very first directory entry again. However, note * that next call of readdir() may not return the same directory entry as it * did in first time. The directory stream may have been affected by newly * created files. * * Almost every dirent implementation ensure that rewinddir will update * the directory stream to reflect any changes made to the directory entries * since the previous ``opendir'' or ``rewinddir'' call. Keep an eye on * this if your program depends on the feature. I know at least one dirent * implementation where you are required to close and re-open the stream to * see the changes. * * Returns nothing. If something went wrong while rewinding, you will * notice it later when you try to retrieve the first directory entry. */ static void rewinddir (DIR *dirp) { /* make sure that dirp is legal */ assert (dirp != NULL); if (dirp == NULL) { errno = EBADF; return; } assert (dirp->dirname != NULL); /* close previous stream */ #if defined(DIRENT_WIN32_INTERFACE) if (dirp->search_handle != INVALID_HANDLE_VALUE) { if (FindClose (dirp->search_handle) == FALSE) { /* Unknown error */ errno = EBADF; } } #endif /* re-open previous stream */ if (_initdir (dirp) == 0) { /* initialization failed but we cannot deal with error. User will notice * error later when she tries to retrieve first directory enty. */ /*EMPTY*/; } } /* * Open native directory stream object and retrieve first file. * Be sure to close previous stream before opening new one. */ static int _initdir (DIR *dirp) { assert (dirp != NULL); assert (dirp->dirname != NULL); dirp->dirent_filled = 0; # if defined(DIRENT_WIN32_INTERFACE) /* Open stream and retrieve first file */ dirp->search_handle = FindFirstFile (dirp->dirname, &dirp->current.data); if (dirp->search_handle == INVALID_HANDLE_VALUE) { /* something went wrong but we don't know what. GetLastError() could * give us more information about the error, but then we should map * the error code into errno. */ errno = ENOENT; return 0; } # elif defined(DIRENT_MSDOS_INTERFACE) if (_dos_findfirst (dirp->dirname, _A_SUBDIR | _A_RDONLY | _A_ARCH | _A_SYSTEM | _A_HIDDEN, &dirp->current.data) != 0) { /* _dos_findfirst and findfirst will set errno to ENOENT when no * more entries could be retrieved. */ return 0; } # endif /* initialize DIR and it's first entry */ _setdirname (dirp); dirp->dirent_filled = 1; return 1; } /* * Return implementation dependent name of the current directory entry. */ static const char * _getdirname (const struct dirent *dp) { #if defined(DIRENT_WIN32_INTERFACE) return dp->data.cFileName; #elif defined(DIRENT_USE_FFBLK) return dp->data.ff_name; #else return dp->data.name; #endif } /* * Copy name of implementation dependent directory entry to the d_name field. */ static void _setdirname (struct DIR *dirp) { /* make sure that d_name is long enough */ assert (strlen (_getdirname (&dirp->current)) <= NAME_MAX); strncpy (dirp->current.d_name, _getdirname (&dirp->current), NAME_MAX); dirp->current.d_name[NAME_MAX] = '\0'; /*char d_name[NAME_MAX+1]*/ } # ifdef __cplusplus } # endif # define NAMLEN(dp) ((int)(strlen((dp)->d_name))) #else # error "missing dirent interface" #endif #endif /*DIRENT_H*/ openjpeg-2.1.0/src/bin/jp3d/tcltk/logoLPI.gif000755 001750 001750 00000012134 12327650566 022007 0ustar00mathieumathieu000000 000000 GIF89aQ  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~,Q H*\ȰÇ#JHŋ3joǏ ׭q΁ۆڵmܸm&3fϞE\V }!*m66r:(Ĉ7lq$ 6dacǏ ?RpdK.MP|Nڄ)RfU֬Xv#,2cc&-[oآz,{zSO֐lxc?x 9C ^ ^SUcqVd'G/z‰M :ỗ~Ƀ'NJ頖=xR5D3 6dS4, 2@̅Ŝ;P*P>3P?:<9h 4UC? r h%Go rGb`q(LO0Q3C>D4( C "|IHC8r'H #&,Rx|F}!XHFPH$"6.[nB6,<`H+#0 L 'A+X?̰:\#$0@IxN-o @dGB1xcE0}Tl@O4+h6P#$;]0&$?Tsf `!xMujx4\#R o-θxKvC2it0h!"N -X6x@u\:(3\qdY \X@Q`q>6e!\p[=d [i55^B:$HDgEXì[rAe"}>prh$4xJ.aiZ4h"9PUx&"k|xBx .V:xnmn$)2XE(DU#lF c"K Hg(7`JpA,kY:"/?qR\`d#]T=Pq9!Ba:(D"4ܠ C6P*]B? hG-VB/@]0q *80ALGHS'& )vZ#*Pft  :"(mn`>5PP^8A q~0aDڀZ4`ajЀ3V7 L(O+Ё2V ۦ<QЃD 83'jl(7TT`]cޮ A XϺO Ge~`5nPK4(ŴA% (A `yxx!\x3jdjpc @Z^.w@"!z%$,zI)) U(<mX (2^, "|K A;V/P07#s#"f~q C{r6}$Pj + ϧ ]倪3 &Gݠ~0STX@݀" >&g!0/0հ( 0  g xr+V`S 󰄴3|@1 v9P @  g ar`Ԡp -p y0. i` vpPrM02k  `@@8 *\ [0xHЎ2@P` ` ݠ > P! P#Kh0dr oaUeS0VG:703 + !   i P p ` p |p} siPcopipe _i0Y/*+-/-1P%4@ Dp&; P`\ gln@|P   ` @M7P`8#Wen u@qPx yP @ @ 9 0 0 @ P p` 0@ " p @ ݐ / P(0 < vQ;w *0[! sl `P 6P q 0@ V*@P `-p0@;p@;kFS@5*`BkVa`JE0Z(p5pa@Tp 7p7p & / w љ 1 =P P O ѐ . ` p p` px ֐ g ` 01Pǐ @ P p 0  @ t@e#@bʀn Pm@} a ^0@} Ap  M  0 h Q0r0,)0@5<=@ <K@^MH  0 P M@p /+F P  % P P ۰p p À! Ϡ ʰ P &AH( % l   P * P 'XD A p+ @ UPưբ{q"{@LHH4@\`JaxQ0#M[wq@}`! dy AP ̓P P"@  l@ ( a P %" ``c+ 0 (fӠ 6pǀvy q ʠ ʐ <@ 4 ~  ɀU P  `: zp` P M ,  0 Yg `B `J p pUJ X à|W oc 0 @ Jlɋд Чp ] w n@\^ z0  ` `p   @\@ İ  P P ݄ Őv0ѐːR G p ` p]zk ƀ w @ 0 @ڽZ\;openjpeg-2.1.0/src/bin/jp3d/tcltk/LPI_JP3D_VM.tcl000755 001750 001750 00000006076 12327650566 022335 0ustar00mathieumathieu000000 000000 #!/bin/sh # The next line is executed by /bin/sh, but not tcl \ exec wish "$0" ${1+"$@"} lappend auto_path /usr/share/tcltk/bwidget1.9.2 namespace eval jp3dVM { variable _progress 0 variable _afterid "" variable _status "Compute in progress..." variable notebook variable mainframe variable dataout "Process execution information" variable status variable prgtext variable prgindic set pwd [pwd] cd [file dirname [info script]] variable VMDIR [pwd] cd $pwd foreach script {encoder.tcl decoder.tcl} { namespace inscope :: source $VMDIR/$script } } proc jp3dVM::create { } { variable notebook variable mainframe variable dataout bind all { catch {console show} } # Menu description set descmenu { "&File" {} {} 0 { {command "E&xit" {} "Exit BWidget jp3dVM" {} -command exit} } "&Options" {} {} 0 { {command "&Encode" {} "Show encoder" {} -command {$jp3dVM::notebook raise [$jp3dVM::notebook page 0]} } {command "&Decode" {} "Show decoder" {} -command {$jp3dVM::notebook raise [$jp3dVM::notebook page 1]} } } "&Help" {} {} 0 { {command "&About authors..." {} "Show info about authors" {} -command {MessageDlg .msgdlg -parent . -title "About authors" -message " Copyright @ LPI-UVA 2006 " -type ok -icon info}} } } set mainframe [MainFrame .mainframe \ -menu $descmenu \ -textvariable jp3dVM::status \ -progressvar jp3dVM::prgindic] $mainframe addindicator -text "JP3D Verification Model 1.0.0" # NoteBook creation set frame [$mainframe getframe] set notebook [NoteBook $frame.nb] set logo [frame $frame.logo] #creo imagen logo image create photo LPIimg -file logoLPI.gif set logoimg [Label $logo.logoimg -image LPIimg] set f0 [VMEncoder::create $notebook] set f1 [VMDecoder::create $notebook] set tfinfo [TitleFrame $frame.codinfo -text "Program Execution"] set codinfo [$tfinfo getframe] set sw [ScrolledWindow $codinfo.sw -relief sunken -borderwidth 2 -scrollbar both] set sf [ScrollableFrame $codinfo.sf ] $sw setwidget $sf set subf [$sf getframe] set labinfo [label $subf.labinfo -textvariable jp3dVM::dataout -justify left] pack $labinfo -side left pack $sw $notebook compute_size $notebook raise [$notebook page 0] pack $logoimg -side left -fill x -expand yes pack $notebook -expand yes pack $logo $tfinfo -side left -expand yes pack $mainframe -fill both -expand yes update idletasks } proc jp3dVM::main {} { variable VMDIR lappend ::auto_path [file dirname $VMDIR] namespace inscope :: package require BWidget option add *TitleFrame.l.font {helvetica 11 bold italic} wm withdraw . wm title . "JP3D Verification Model @ LPI" jp3dVM::create BWidget::place . 0 0 center wm deiconify . raise . focus -force . } jp3dVM::main wm geom . [wm geom .] openjpeg-2.1.0/src/bin/jp3d/tcltk/README000644 001750 001750 00000000640 12327650566 020667 0ustar00mathieumathieu000000 000000 HOWTO USE THE TCL/TK APP IN 'jp3d/tcltk' ---------------------------------------- 1. Download the 'BWidget-1.9.2' http://www.sourceforge.net/projects/tcllib/ 2. Install it e.g. in '/usr/local/BWidget-1.9.2/' 3. Add the lappend command in line 4 to jp3d/tcltk/LPI_JP3D_VM.tcl: #!/bin/sh # The next line is executed by /bin/sh, but not tcl \ exec wish "$0" ${1+"$@"} lappend auto_path /usr/local/BWidget-1.9.2 openjpeg-2.1.0/src/bin/jp3d/tcltk/decoder.tcl000755 001750 001750 00000022542 12327650566 022130 0ustar00mathieumathieu000000 000000 namespace eval VMDecoder { variable var variable JP3Ddecoder "../bin/jp3d_to_volume.exe" #variable JP3Ddecoder "jp3d_to_volume.exe" } proc VMDecoder::create { nb } { variable var set frameD [$nb insert end VMDecoder -text "Decoder"] set topfD [frame $frameD.topfD] set medfD [frame $frameD.medfD] set bottomfD [frame $frameD.bottomfD] set srcfD [TitleFrame $topfD.srcfD -text "Source"] set dstfD [TitleFrame $topfD.dstfD -text "Destination"] set paramfD [TitleFrame $medfD.paramfD -text "Decoding parameters"] set infofD [TitleFrame $medfD.infofD -text "Distortion measures"] set frame1 [$srcfD getframe] _sourceD $frame1 set frame2 [$dstfD getframe] _destinationD $frame2 set frame3 [$infofD getframe] _originalD $frame3 set frame4 [$paramfD getframe] _paramsD $frame4 set butD [Button $bottomfD.butD -text "Decode!" \ -command "VMDecoder::_decode $frame1 $frame2 $frame3" \ -helptext "Decoding trigger button"] set butR [Button $bottomfD.butR -text "Save info" \ -command "VMDecoder::_save $frame3" \ -helptext "Save information"] pack $srcfD $dstfD -side left -fill both -padx 10 -ipadx 5 -expand yes pack $topfD -pady 4 -fill x pack $paramfD $infofD -side left -fill both -padx 10 -pady 2 -ipadx 5 -expand yes pack $medfD -pady 4 -fill x pack $butD $butR -side left -padx 4 -pady 5 -expand yes pack $bottomfD -pady 4 -fill x return $frameD } proc fileDialogD {w ent operation} { variable file if {$operation == "open"} { #-----Type names---------Extension(s)--- set types { {"JP3D Files" {.jp3d} } {"All files" *} } set file [tk_getOpenFile -filetypes $types -parent $w ] } elseif {$operation == "original"} { #-----Type names---------Extension(s)--- set types { {"BIN Raw Image Files" {.bin} } {"PGX Raw Image Files" {.pgx} } {"All files" *} } set file [tk_getOpenFile -filetypes $types -parent $w ] } else { #-----Type names---------Extension(s)--- set types { {"BIN Raw Image Files" {.bin} } {"PGX Raw Image Files" {.pgx} } {"All files" *} } set file [tk_getSaveFile -filetypes $types -parent $w -initialfile Untitled -defaultextension "*.bin"] } if {[string compare $file ""]} { $ent delete 0 end $ent insert end $file $ent xview moveto 1 } } proc VMDecoder::_sourceD { parent } { variable var set labsrcD [LabelFrame $parent.labsrcD -text "Select compressed file: " -side top \ -anchor w -relief flat -borderwidth 0] set subsrcD [$labsrcD getframe] set listD [entry $subsrcD.entrysrcD -width 40 -textvariable VMDecoder::var(sourceD)] set labbrw [LabelFrame $parent.labbrw -side top -anchor w -relief flat -borderwidth 0] set subbrw [$labbrw getframe] set butbrw [button $subbrw.butbrw -image [Bitmap::get open] \ -relief raised -borderwidth 1 -padx 1 -pady 1 \ -command "fileDialogD . $subsrcD.entrysrcD open"] pack $listD -side top pack $butbrw -side top pack $labsrcD $labbrw -side left -fill both -expand yes } proc VMDecoder::_destinationD { parent } { variable var set labdstD [LabelFrame $parent.labdstD -text "Save decompressed volume file(s) as: " -side top \ -anchor w -relief flat -borderwidth 0] set subdstD [$labdstD getframe] set listD [entry $subdstD.entrydstD -width 40 -textvariable VMDecoder::var(destinationD)] set labbrw [LabelFrame $parent.labbrw -side top -anchor w -relief flat -borderwidth 0] set subbrw [$labbrw getframe] set butbrw [button $subbrw.butbrw -image [Bitmap::get save] \ -relief raised -borderwidth 1 -padx 1 -pady 1 \ -command "fileDialogD . $subdstD.entrydstD save"] pack $listD -side top pack $butbrw -side top pack $labdstD $labbrw -side left -fill both -expand yes } proc VMDecoder::_originalD { parent } { variable var set laborgD [LabelFrame $parent.laborgD -text "Select original file: " -side top \ -anchor w -relief flat -borderwidth 0] set suborgD [$laborgD getframe] set listorgD [entry $suborgD.entryorgD -width 30 -textvariable VMDecoder::var(originalD)] set labbrw2 [LabelFrame $parent.labbrw2 -side top -anchor w -relief flat -borderwidth 0] set subbrw2 [$labbrw2 getframe] set butbrw2 [button $subbrw2.butbrw2 -image [Bitmap::get open] \ -relief raised -borderwidth 1 -padx 1 -pady 1 \ -command "fileDialogD . $suborgD.entryorgD original"] set infoD [Label $parent.infoD -relief sunken -textvariable VMDecoder::var(decodinfo) -justify left] pack $listorgD -side left -anchor n pack $butbrw2 -side left -anchor n pack $infoD -side bottom -anchor nw -pady 4 -ipadx 150 -ipady 20 -expand yes pack $laborgD $labbrw2 -side left -fill both } proc VMDecoder::_paramsD { parent } { variable var ########### DECODING ############# set labcod [LabelFrame $parent.labcod -side top -anchor w -relief sunken -borderwidth 1] set subcod [$labcod getframe] set frameres [frame $subcod.frameres -borderwidth 1] set labres [LabelEntry $frameres.labres -label "Resolutions to discard: " -labelwidth 20 -labelanchor w \ -textvariable VMDecoder::var(resdiscard) -editable 1 \ -helptext "Number of highest resolution levels to be discarded on each dimension" ] set VMDecoder::var(resdiscard) "0,0,0" set framelayer [frame $subcod.framelayer -borderwidth 1] set lablayer [LabelEntry $framelayer.lablayer -label "Layers to decode: " -labelwidth 20 -labelanchor w \ -textvariable VMDecoder::var(layer) -editable 1 \ -helptext "Maximum number of quality layers to decode" ] set VMDecoder::var(layer) "All" set framebe [frame $subcod.framebe -borderwidth 1] set chkbe [checkbutton $framebe.chkbe -text "Write decoded file with BigEndian byte order" \ -variable VMDecoder::var(be) -onvalue 1 -offvalue 0 ] pack $labres -side left -padx 2 -anchor n pack $lablayer -side left -padx 2 -anchor n pack $chkbe -side left -padx 2 -anchor w pack $frameres $framelayer $framebe -side top -anchor w pack $subcod -anchor n pack $labcod -side left -fill both -padx 4 -expand yes } proc VMDecoder::_decode { framesrc framedst frameinfo} { variable var set sourceD [$framesrc.labsrcD.f.entrysrcD get ] set destinationD [$framedst.labdstD.f.entrydstD get ] set originD [$frameinfo.laborgD.f.entryorgD get ] set cond1 [string match *.pgx [string tolower $destinationD]] set cond2 [string match *\**.pgx [string tolower $destinationD]] set cond3 [string match *.bin [string tolower $destinationD]] #comprobamos datos son correctos if {($cond1 == 1) && ($cond2 == 0)} { set pgx "*.pgx" set pattern [string range $destinationD 0 [expr [string length $destinationD]-5]] set destinationD $pattern$img } elseif {$sourceD == ""} { MessageDlg .msgdlg -parent . -message "Error : Source file is not defined !" -type ok -icon error } elseif {$destinationD == ""} { MessageDlg .msgdlg -parent . -message "Error : Destination file is not defined !" -type ok -icon error } else { #creamos datain a partir de los parametros de entrada #set dirJP3Ddecoder [mk_relativepath $VMDecoder::JP3Ddecoder] set dirJP3Ddecoder $VMDecoder::JP3Ddecoder set datain [concat " $dirJP3Ddecoder -i [mk_relativepath $sourceD] "] set datain [concat " $datain -o [mk_relativepath $destinationD] "] if {$originD != ""} { set datain [concat " $datain -O [mk_relativepath $originD] "] if {$cond3 == 1} { set img ".img" set pattern [string range $originD 0 [expr [string length $originD]-5]] set pattern $pattern$img if {[file exists $pattern]} { set datain [concat " $datain -m [mk_relativepath $pattern] "] } else { MessageDlg .msgdlg -parent . -message "Error : IMG file associated to original BIN volume file not found in same directory !" -type ok -icon info } } } if {$VMDecoder::var(resdiscard) != "0,0,0"} { set datain [concat " $datain -r $VMDecoder::var(resdiscard) "] } if {$VMDecoder::var(layer) != "All" && $VMDecoder::var(layer) > 0} { set datain [concat " $datain -l $VMDecoder::var(layer) "] } if {$VMDecoder::var(be) == 1} { set datain [concat " $datain -BE"] } set VMDecoder::var(progval) 10 ProgressDlg .progress -parent . -title "Wait..." \ -type infinite \ -width 20 \ -textvariable "Compute in progress..."\ -variable VMDecoder::progval \ -stop "Stop" \ -command {destroy .progress} after 200 set VMDecoder::var(progval) 2 set fp [open "| $datain " r+] fconfigure $fp -buffering line set jp3dVM::dataout [concat "EXECUTED PROGRAM:\n\t$datain"] while {-1 != [gets $fp tmp]} { set jp3dVM::dataout [concat "$jp3dVM::dataout\n$tmp"] } close $fp destroy .progress set cond [string first "ERROR" $jp3dVM::dataout] set cond2 [string first "PSNR" $jp3dVM::dataout] set cond3 [string first "RESULT" $jp3dVM::dataout] if {$cond != -1} { MessageDlg .msgdlg -parent . -message [string range $jp3dVM::dataout [expr $cond-1] end] -type ok -icon error } elseif {$cond3 != -1} { if {$cond2 != -1} { set VMDecoder::var(decodinfo) [string range $jp3dVM::dataout [expr $cond2-1] end] } MessageDlg .msgdlg -parent . -message [string range $jp3dVM::dataout [expr $cond3-1] end] -type ok -icon info } } } proc VMDecoder::_save { frameinfo } { } openjpeg-2.1.0/src/bin/jp3d/tcltk/Thumbs.db000755 001750 001750 00000045000 12327650566 021562 0ustar00mathieumathieu000000 000000 ࡱ>    !"#Root EntryPbr 1Catalog24 wJFIF``C     C   ``" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?Ϗ-=06t}Bʵ2V|NL|Kp֨Cg|@bpYԲXZSl>!Ωe$g泜_~o8f&N0ͫ^C TINђH"Ŀ[?TRa?T?+{M߉?s_{3'D⶛?Vl6hqܩ0129 Bx}uWWAx Sxt{cɆ`Z@.FpxugJM}nJUwO0zXIM3IM3ꌞ+|nJۥܰ^v;FEC`/$qS|o7[Ž8}f_'_ ?4'OiG4'OiU|߉Aç]_ճ ϗ4'Oi]'>%>,( m$Ŗ$J$i B9o7HV7ýN(WR@S %C3c9O-LFqסМg(Ť^dMŤ;xc?MiRjI4v#G (hO=S͍[MskTLUHNjζ1p[@UID̹积ik6 Z- d5BO Vmvpʹ#J|>+JqO"X|KlRC5}TgY+4WK`dhg>r|h'aX̞2$zW!0JgOVW:<Ш}CQ)Gf`^Jo.ʂ n fRA"w8jFŮeET.c{};U>'Yl[f.h:ךܠnWp9 t%%dlMu- 7rmv?sZl13Y>ą$hd.Cc'Z_ƞ4`r8%WơOIeel&Ot:`!T'e%67*>Эq5F6Tc9ls䞝3״9k_M.ajѧ̮CA#9'?SU[:qW9ka-?a#e2YONx=oH-i4? yGXt$J28w 1q4eym]?`?mϊ6V>)l0ܠdYے1*H H iܮ/~OJebn-D-o{ZKj6ʲJcwn5Nto*Nq&1,3s].4#ZEڪ6`}+χ5PjPTȚ3A־H;k?/ΨT Jd\9qջ_"$%2:~k:FlmGo~U׋!RI 6V&jYU$ WEfRb~ndrS+ʢ G~K *^I!ne"=ԑN{cu 퍯os?:Z=3J1$2v1OȨd$TmJl26)~\#5n1X G6[,زGis WJ 犚?qn=E2$iNH=MK~Qgxk6ƥeUUȆ,9=:9O)|zs2DSYN|BदCmgmՙ+P3qd\*6|sH*i8V5Ho4_8M[ݗM>#KZWe.cƟ,~~!aaH@z㢗G0]VA-xַ*]E7ײ:,LjH r #$\?lo}'?_>$e׿g߀DŽu OJُ|o$rb%Ix29;A!_?m/z]^K'+Bc:c|rWM^S}cW$m0oj!к}k_߲'>0ֿz|F-+]FocuuztKdp$€0HkO ?#ɷ?W͜3[Y ^H$4]f `Ϡ i3Ծ+k} _V077C ^Wܾ 1ுVD ~Ioabu(!gYGi<6OTtΓCoomi`,ET6c@%s@؟T?>WGUzw22>o,yZx+]֡l?W^ a?.&UcjU?/ɏ{?>)-2,5wV֣ĦIfHhk|ʣNF3ǥA ݎ.iMr\@1Qa$wf"xa9ٞ->{U`xQ)NOHIy;;4ㄭF(Ene]-"vuԋ6qO Ϸ}k'3ſ']3ſ'] #?%fj$6;XR3ש'ոz./kC~G_M4Ϗ_33ſ']ψc^hsi6t<7>IUvd`AIN $mն1ZR"v~g/  !"#$%&'()*+,-.o123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmn````r{A42CD7B6-E9B9-4D02-B7A6-288B71AD28BA}*yi ( JFIF``C     C   4`" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?Sjw_%M9xK YîjP_P%l4@Q؅Ȯ/Þ3Yb;RC 2>HE 0z?dj'bm!jg[DIlO~$벺n7Vڅ2 #e# n~/[Ekӭ q軜W'sCa ʬXc^O~:z0:oگÿ _>NRRϒu~M]|?|UFl#lWU:\?/ q[QZ>vଟ=gK 6;/ ߬z~ijclnW/~o@1SNe`Xz O[Ѵ[^;m6#UX@9C?;?WM+3P߷~({_~?#O}MH':ֿ:^}~)g&붡(pw$ S{BS>#g:znlācހ;j*R??t M6tĿ-ا%|ЊiIZ PJ>= gWo_X?g xLQ +Tn'Tp2S#=x5w_'ëO xK&{mf'wI `;%'u?^{k~!#k|+a=ֿjo_?ieRw,kO{ipP*GGu|Jψ<-j/|Guۘ IՁE9lí}ퟮ趾'>zO9mN7v4? +K&O'_G-w&֙}_1bvPq\Wơٳc#_LCw? Ï0%0,\閾4#Gl!~MCF|ӿu?agEO-~h7"t=s^G̳mg${f'c@Fy_vWV*j:-?0.+u41*($MS9{}Sa!,]Y"=p ?~V𼶓f=ZU/qnN#Pc^*|$zEֱQՏ##Gce琓^Yx/GiI*ܓgo,9oC@_鿵/»[[H|CfO1؈Ax.~-xTz&}}~Hܖ YӞXfop2.AMcΡa=|5=KX`W/z‹OCGybUI=3[>h&y\O N [0[*=$nlt=^5/<[K{mZLѬdf̕$( 9$bZw\Au}bG06* /$t[$d`(h|QJ~ CMrf#'N_ q n$JIsׂrEPz7Rvi&Mֿd+*dҝ4blX4y8ـGn}h.xV9.b_|AK99C])o CDTGk:(9 ?BֺL3@'GP??ay73o.gC ]{A2?JvQ?/7/}?0o 0o״Ugqzu $+"UϦKYe??gῗq_ϧ ?[ i`(]oϿoZҲԡԡm';w uϦE#A 7/{H]ē̤no>~%φjbhSdYS>@`8|MsomG;֫N]s.X:4#r߃5YLR'KƲ)8GZ}Ρw<=adTtC쟌 x<3CL}D$A XaZ-̋ih^yb |Gjk;#𢤷<I -͸=xPw#J޴-fZ#w-ԅ H$tGnEAsmZʃREf,%f# cp ?#i,IܗIZw+maqߞ*Ȧq{K!.+6>f9 Fⶋ (O=EϘ>XbIe8# 㯽X+2JL )Y<"w35^Xڜx͵O9"ְ⽒3'R T)CA۷K ݖ,rY2[+xzzT Akuj&@dg\8$dN3؜&㰭rLJ`7oP o t~xx}qZ[c\_~u{k7պDequ#}k[Hh.eawawkb]V8y-#)I .y\%ۦ3ywRX؏~>ytQ!H>ףEcͻ˒Mn9y_ 5lQ+.qnMtaצ/̉;cg?( 42$\|jލM[ݙb<Dɒ<9z`|>ɵOc ],P ֮jeG#{w{ I!L[{]%?,\֮[^j#cH>l `}ьq'=q2-$w`2rq5ptv۸}~`+4͟/7STMc4uxb < 3$n?J" edQ1Sl,Uk}B;n"YbiW#SohM'UIw2d}qkEp=@I?t_j߉;Ż!t.͜t;zp:m qqɶ4qi i ֺe񆈡:9b0Hwƴ5+}R>xs"qLD4ͧFȡmN:Cȯ:o bcXD*(F¿s>Z>#WVw扟ͯC¤:c*'1_C]|*F0tNk+^qQ|]5saǧjF+{kϙ .2Wy5>+*yI+Azω?~ZDt>tBx )-?(^9x,8a)F.bH<^2tv|c]?vcxo7:UFkL9-˞[q_Sm""^xP#y ;SշҼV>E1:-8||`A0uk7_Ni^䵎[? #&}_+t5%Ƌo=ؾOԚO(:tT?ں6y k5/^G%!˨+8ҽ*)b5pt+[>c\v92\ur=lZ6pܮ6cDJv仟JBz+|)֕B;WUlǗ-7}Rxտ1޹K5::'?/SY|#.| 2<?7A4u ̿by{VeHݹAnmxįoGO61L ~/,-,.K-o-c6[\2+YC) kOs\:XP|3gOW.c-W}gv͈poi߅C\ӯ Z&#nVdre?x3l/i[s=Z[ߛpX m\Bh.]aB1Ju9cjnހw<::/'bvdn=GZvlYaYF*aOC^2Xdl pB0hˏzg+RaU$Ow܅iQmfWbcf:Q\%t?)~d~@Ï &Dt|7`߅ZU#Xlq]@ X(j^kͧ^~m? e.sG,TҞBU&tBFr>aί×X,~DXd`a܎\ ԯ"hrAJsF~]1$j[WE:<ޕOFrm.xmRiGF_yeV9![_^1,?AD̡I#Ɨڛ7mkxKcLcexn5L܁޶ GY<@i6{vO7mMs;Gh-f[ f@rq k9KOK#og'i;{k92̎ KaXd`ߧ\oůj5+xPyaYu,ɜF:q\5&k~Sq~ JFIF``C     C   `_" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?@# cFYIU$c2\H8Z઱Rnq,R8ݫG[kngܱ+/YhM 5qE:9 ??vT񜢪lH̰8vq_(@N~o͑u'  4[F>K99C^o=NK/1qZYb0<_7G3o.Uq~TG_ϧ ?O u#֦Ѭ#Ml[u# g2{Q]3Oq$bchƟe??gῗy3o.gC]zxJ@Kjz7nSӃUMJ AKZor@~To_~g=$.IfR7 7?Z~5?r4D)h,dZ%\Ҹ SǦkf}@7_1?qҺ/dĎgp 3*=bh=R/Bb[;cJ&!`n呻5`pSǰڡiup#ƈ ?&P3SQ`V`YW g^Eg6Tp8 LrFr:CWK2G!ƠqЂ=r?/.ۣHǰ:;TֈVDºsGG0DO'=n;>EQ~ݧ9Fہ`b?e49ɫ0Eqwظ.= 03'2!MS\$z҈ OK& ;ͤYZA`O'úY8bskėvEmB-u$2@^[Id a`mnfsc*ү_>moJ< *$' Уwn01-f<=vLV.*uofn4`y_-џm^Xy"æj^{Y?ԟ\WCsJR+g,f?hFE?'o$?yRgAsMif? G&84F)}A8珧5rfkrܤ^{^!g]6#+O<21BB#y1N}ھ?U2ѵ]ZvgҨSH$^zSp,GHaסW+|&CEHĿ2{Kàe޴6/ Ȼ׬_ʯ%OP6:ؤZ R~u(u=%~?_= ͓D+:kNK{Ym-'rct?>zswJ޻[]zKcEN[E'{/Վ7Ԙ^OCq{:һVgj?z뇆w%T`JzW/IfGGZ?)~a?[+E󵭢 W h'׬>KMLa,&2fH mYU#v;}sG}=&Hn$)") S"WIfGG]XO__24Vhం%.rHX 9+γnX\Zm"8i?p{V@ X(j^kͧ^~m? e.sGzGO5—Y#WPr729jRKf\*0@stJ+F;kw$*Τ9gQ5OztS̽[Dg*_2éJF)9*rH%'1S'< )>ԉ"u`xSO~´>}+o+_~/_O+D%iXByrkȷ 0 } { set relpath "../$relpath" incr h -1 } } set h [llength $abspathcomps] while { $h > $i } { set relpath [concat $relpath[lindex $abspathcomps [expr [llength $abspathcomps]-$j]]/] incr h -1 incr j -1 } return [string trim $relpath {/}] } proc disable3RLS {flag atk resX resY resZ} { if {$flag == "3RLS"} { $atk configure -state disabled $resX configure -state disabled $resY configure -state disabled $resZ configure -state disabled } elseif {$flag == "2DWT"} { $atk configure -state normal $resX configure -state normal $resY configure -state normal $resZ configure -state disabled } elseif {$flag == "3DWT"} { $atk configure -state normal $resX configure -state normal $resY configure -state normal $resZ configure -state normal } } proc disableGR {flag labcblk progorder labrate chksop chkeph} { if {$flag == "2EB"} { $labcblk configure -state normal $progorder configure -state normal $labrate configure -state normal $chksop configure -state normal $chkeph configure -state normal set VMEncoder::var(cblksize) "64,64,64" set VMEncoder::var(tilesize) "512,512,512" } elseif {$flag == "3EB"} { $labcblk configure -state normal $progorder configure -state normal $labrate configure -state normal $chksop configure -state normal $chkeph configure -state normal set VMEncoder::var(cblksize) "64,64,64" set VMEncoder::var(tilesize) "512,512,512" } else { $labcblk configure -state disabled $progorder configure -state disabled $labrate configure -state disabled $chksop configure -state disabled $chkeph configure -state disabled } } openjpeg-2.1.0/src/bin/jp3d/convert.c000755 001750 001750 00000070034 12327650566 020521 0ustar00mathieumathieu000000 000000 /* * 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) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2006, Mnica Dez Garca, Image Processing Laboratory, University of Valladolid, Spain * 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 #include #include #include "openjp3d.h" #ifdef _WIN32 #include "windirent.h" #else #include #endif /* _WIN32 */ void dump_volume(FILE *fd, opj_volume_t * vol) { int compno; fprintf(fd, "volume {\n"); fprintf(fd, " x0=%d, y0=%d, z0=%d, x1=%d, y1=%d, z1=%d\n", vol->x0, vol->y0, vol->z0,vol->x1, vol->y1, vol->z1); fprintf(fd, " numcomps=%d\n", vol->numcomps); for (compno = 0; compno < vol->numcomps; compno++) { opj_volume_comp_t *comp = &vol->comps[compno]; fprintf(fd, " comp %d {\n", compno); fprintf(fd, " dx=%d, dy=%d, dz=%d\n", comp->dx, comp->dy, comp->dz); fprintf(fd, " prec=%d\n", comp->prec); fprintf(fd, " sgnd=%d\n", comp->sgnd); fprintf(fd, " }\n"); } fprintf(fd, "}\n"); } /* * Get logarithm of an integer and round downwards. * * log2(a) */ static int int_floorlog2(int a) { int l; for (l = 0; a > 1; l++) { a >>= 1; } return l; } /* * Divide an integer by a power of 2 and round upwards. * * a divided by 2^b */ static int int_ceildivpow2(int a, int b) { return (a + (1 << b) - 1) >> b; } /* * Divide an integer and round upwards. * * a divided by b */ static int int_ceildiv(int a, int b) { return (a + b - 1) / b; } /* -->> -->> -->> -->> 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; } /*****************************************/ static unsigned short ShortSwap(unsigned short v) { unsigned char c1, c2; c1 = v & 0xff; c2 = (v >> 8) & 0xff; return (c1 << 8) + c2; } static unsigned int LongSwap (unsigned int i) { unsigned char b1, b2, b3, b4; b1 = i & 255; b2 = ( i >> 8 ) & 255; b3 = ( i>>16 ) & 255; b4 = ( i>>24 ) & 255; return ((int)b1 << 24) + ((int)b2 << 16) + ((int)b3 << 8) + b4; } /*****************************************/ opj_volume_t* pgxtovolume(char *relpath, opj_cparameters_t *parameters) { FILE *f = NULL; int w, h, prec; unsigned long offset; int i, s, numcomps, maxvalue, sliceno, slicepos, maxslice = 0; OPJ_COLOR_SPACE color_space; opj_volume_cmptparm_t cmptparm; /* maximum of 1 component */ opj_volume_t * volume = NULL; char endian1,endian2,sign; char signtmp[32]; char temp[32]; opj_volume_comp_t *comp = NULL; DIR *dirp; struct dirent *direntp; char *tmp = NULL, *tmp2 = NULL, *point = NULL, *pgx = NULL; char tmpdirpath[MAX_PATH]; char dirpath[MAX_PATH]; char pattern[MAX_PATH]; char pgxfiles[MAX_SLICES][MAX_PATH]; int pgxslicepos[MAX_SLICES]; char tmpno[3]; numcomps = 1; color_space = CLRSPC_GRAY; sliceno = 0; maxvalue = 0; memset(pgxfiles, 0, MAX_SLICES * MAX_PATH * sizeof(char)); memset(&cmptparm, 0, sizeof(opj_volume_cmptparm_t)); /* Separacin del caso de un nico slice frente al de muchos */ if ((tmp = strrchr(relpath,'-')) == NULL){ /*fprintf(stdout,"[INFO] A volume of only one slice....\n");*/ sliceno = 1; maxslice = 1; strcpy(pgxfiles[0],relpath); } else { /*Fetch only the path */ strcpy(tmpdirpath,relpath); if ((tmp = strrchr(tmpdirpath,'/')) != NULL){ tmp++; *tmp='\0'; strcpy(dirpath,tmpdirpath); } else { strcpy(dirpath,"./"); } /*Fetch the pattern of the volume slices*/ if ((tmp = strrchr (relpath,'/')) != NULL) tmp++; else tmp = relpath; if ((tmp2 = strrchr(tmp,'-')) != NULL) *tmp2='\0'; else{ fprintf(stdout, "[ERROR] tmp2 ha dado null. no ha encontrado el * %s %s",tmp,relpath); return NULL; } strcpy(pattern,tmp); dirp = opendir( dirpath ); if (dirp == NULL){ fprintf(stdout, "[ERROR] Infile must be a .pgx file or a directory that contain pgx files"); return NULL; } /*Read all .pgx files of directory */ while ( (direntp = readdir( dirp )) != NULL ) { /* Found a directory, but ignore . and .. */ if(strcmp(".",direntp->d_name) == 0 || strcmp("..",direntp->d_name) == 0) continue; if( ((pgx = strstr(direntp->d_name,pattern)) != NULL) && ((tmp2 = strstr(direntp->d_name,".pgx")) != NULL) ){ strcpy(tmp,dirpath); tmp = strcat(tmp,direntp->d_name); /*Obtenemos el index de la secuencia de slices*/ if ((tmp2 = strpbrk (direntp->d_name, "0123456789")) == NULL) continue; i = 0; while (tmp2 != NULL) { tmpno[i++] = *tmp2; point = tmp2; tmp2 = strpbrk (tmp2+1,"0123456789"); }tmpno[i]='\0'; /*Comprobamos que no estamos leyendo algo raro como pattern.jp3d*/ if ((point = strpbrk (point,".")) == NULL){ break; } /*Slicepos --> index de slice; Sliceno --> no de slices hasta el momento*/ slicepos = atoi(tmpno); pgxslicepos[sliceno] = slicepos - 1; sliceno++; if (slicepos>maxslice) maxslice = slicepos; /*Colocamos el slices en su posicion correspondiente*/ strcpy(pgxfiles[slicepos-1],tmp); } } }/* else if pattern*.pgx */ if (!sliceno) { fprintf(stdout,"[ERROR] No slices with this pattern founded !! Please check input volume name\n"); return NULL; } /*if ( maxslice != sliceno) { fprintf(stdout,"[ERROR] Slices are not sequentially numbered !! Please rename them accordingly\n"); return NULL; }*/ for (s=0;svolume_offset_x0; cmptparm.y0 = parameters->volume_offset_y0; cmptparm.z0 = parameters->volume_offset_z0; cmptparm.w = !cmptparm.x0 ? (w - 1) * parameters->subsampling_dx + 1 : cmptparm.x0 + (w - 1) * parameters->subsampling_dx + 1; cmptparm.h = !cmptparm.y0 ? (h - 1) * parameters->subsampling_dy + 1 : cmptparm.y0 + (h - 1) * parameters->subsampling_dy + 1; cmptparm.l = !cmptparm.z0 ? (sliceno - 1) * parameters->subsampling_dz + 1 : cmptparm.z0 + (sliceno - 1) * parameters->subsampling_dz + 1; if (sign == '-') { cmptparm.sgnd = 1; } else { cmptparm.sgnd = 0; } cmptparm.prec = prec; cmptparm.bpp = prec; cmptparm.dcoffset = parameters->dcoffset; cmptparm.dx = parameters->subsampling_dx; cmptparm.dy = parameters->subsampling_dy; cmptparm.dz = parameters->subsampling_dz; /* create the volume */ volume = opj_volume_create(numcomps, &cmptparm, color_space); if(!volume) { fclose(f); return NULL; } /* set volume offset and reference grid */ volume->x0 = cmptparm.x0; volume->y0 = cmptparm.y0; volume->z0 = cmptparm.z0; volume->x1 = cmptparm.w; volume->y1 = cmptparm.h; volume->z1 = cmptparm.l; /* set volume data :only one component, that is a volume*/ comp = &volume->comps[0]; }/*if sliceno==1*/ offset = w * h * s; for (i = 0; i < w * h; i++) { int v; 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, cmptparm.bigendian); } else { v = (short) readushort(f, cmptparm.bigendian); } } else { if (!comp->sgnd) { v = readuint(f, cmptparm.bigendian); } else { v = (int) readuint(f, cmptparm.bigendian); } } if (v > maxvalue) maxvalue = v; comp->data[i + offset] = v; } fclose(f); } /* for s --> sliceno*/ comp->bpp = int_floorlog2(maxvalue) + 1; if (sliceno != 1) closedir( dirp ); /*dump_volume(stdout, volume);*/ return volume; } int volumetopgx(opj_volume_t * volume, char *outfile) { int w, wr, wrr, h, hr, hrr, l, lr, lrr; int i, j, compno, offset, sliceno; FILE *fdest = NULL; for (compno = 0; compno < volume->numcomps; compno++) { opj_volume_comp_t *comp = &volume->comps[compno]; char name[256]; int nbytes = 0; char *tmp = outfile; while (*tmp) { tmp++; } while (*tmp!='.') { tmp--; } *tmp='\0'; for(sliceno = 0; sliceno < volume->z1 - volume->z0; sliceno++) { if (volume->numcomps > 1) { sprintf(name, "%s%d-%d.pgx", outfile, sliceno+1, compno); } else if ((volume->z1 - volume->z0) > 1) { sprintf(name, "%s%d.pgx", outfile, sliceno+1); } else { sprintf(name, "%s.pgx", outfile); } fdest = fopen(name, "wb"); if (!fdest) { fprintf(stdout, "[ERROR] Failed to open %s for writing \n", name); return 1; } fprintf(stdout,"[INFO] Writing in %s (%s)\n",name,volume->comps[0].bigendian ? "Bigendian" : "Little-endian"); w = int_ceildiv(volume->x1 - volume->x0, volume->comps[compno].dx); wr = volume->comps[compno].w; wrr = int_ceildivpow2(volume->comps[compno].w, volume->comps[compno].factor[0]); h = int_ceildiv(volume->y1 - volume->y0, volume->comps[compno].dy); hr = volume->comps[compno].h; hrr = int_ceildivpow2(volume->comps[compno].h, volume->comps[compno].factor[1]); l = int_ceildiv(volume->z1 - volume->z0, volume->comps[compno].dz); lr = volume->comps[compno].l; lrr = int_ceildivpow2(volume->comps[compno].l, volume->comps[compno].factor[2]); fprintf(fdest, "PG %c%c %c%d %d %d\n", comp->bigendian ? 'M':'L', comp->bigendian ? 'L':'M',comp->sgnd ? '-' : '+', comp->prec, wr, hr); if (comp->prec <= 8) { nbytes = 1; } else if (comp->prec <= 16) { nbytes = 2; } else { nbytes = 4; } offset = (sliceno / lrr * l) + (sliceno % lrr); offset = wrr * hrr * offset; /*fprintf(stdout,"%d %d %d %d\n",offset,wrr*hrr,wrr,w);*/ for (i = 0; i < wrr * hrr; i++) { int v = volume->comps[0].data[(i / wrr * w) + (i % wrr) + offset]; if (volume->comps[0].bigendian) { for (j = nbytes - 1; j >= 0; j--) { char byte = (char) ((v >> (j * 8)) & 0xff); fwrite(&byte, 1, 1, fdest); } } else { for (j = 0; j <= nbytes - 1; j++) { char byte = (char) ((v >> (j * 8)) & 0xff); fwrite(&byte, 1, 1, fdest); } } } fclose(fdest); }/*for sliceno*/ }/*for compno*/ return 0; } /* -->> -->> -->> -->> BIN IMAGE FORMAT <<-- <<-- <<-- <<-- */ opj_volume_t* bintovolume(char *filename, char *fileimg, opj_cparameters_t *parameters) { int subsampling_dx = parameters->subsampling_dx; int subsampling_dy = parameters->subsampling_dy; int subsampling_dz = parameters->subsampling_dz; int i, compno, w, h, l, numcomps = 1; int prec, max = 0; /* char temp[32];*/ char line[100]; int bigendian; FILE *f = NULL; FILE *fimg = NULL; OPJ_COLOR_SPACE color_space; opj_volume_cmptparm_t cmptparm; /* maximum of 1 component */ opj_volume_t * volume = NULL; opj_volume_comp_t *comp = NULL; bigendian = 0; color_space = CLRSPC_GRAY; fimg = fopen(fileimg,"r"); if (!fimg) { fprintf(stdout, "[ERROR] Failed to open %s for reading !!\n", fileimg); return 0; } fseek(fimg, 0, SEEK_SET); while (!feof(fimg)) { fgets(line,100,fimg); /*fprintf(stdout,"%s %d \n",line,feof(fimg));*/ if (strncmp(line,"Bpp",3) == 0){ sscanf(line,"%*s%*[ \t]%d",&prec); } else if (strncmp(line,"Color",5) == 0){ sscanf(line, "%*s%*[ \t]%d",&color_space); } else if (strncmp(line,"Dim",3) == 0){ sscanf(line, "%*s%*[ \t]%d%*[ \t]%d%*[ \t]%d",&w,&h,&l); } } /*fscanf(fimg, "Bpp%[ \t]%d%[ \t\n]",temp,&prec,temp);*/ /*fscanf(fimg, "Color Map%[ \t]%d%[ \n\t]Dimensions%[ \t]%d%[ \t]%d%[ \t]%d%[ \n\t]",temp,&color_space,temp,temp,&w,temp,&h,temp,&l,temp);*/ /*fscanf(fimg, "Resolution(mm)%[ \t]%d%[ \t]%d%[ \t]%d%[ \n\t]",temp,&subsampling_dx,temp,&subsampling_dy,temp,&subsampling_dz,temp);*/ #ifdef VERBOSE fprintf(stdout, "[INFO] %d \t %d %d %d \t %3.2f %2.2f %2.2f \t %d \n",color_space,w,h,l,subsampling_dx,subsampling_dy,subsampling_dz,prec); #endif fclose(fimg); /* initialize volume components */ memset(&cmptparm, 0, sizeof(opj_volume_cmptparm_t)); cmptparm.prec = prec; cmptparm.bpp = prec; cmptparm.sgnd = 0; cmptparm.bigendian = bigendian; cmptparm.dcoffset = parameters->dcoffset; cmptparm.dx = subsampling_dx; cmptparm.dy = subsampling_dy; cmptparm.dz = subsampling_dz; cmptparm.w = w; cmptparm.h = h; cmptparm.l = l; /* create the volume */ volume = opj_volume_create(numcomps, &cmptparm, color_space); if(!volume) { fprintf(stdout,"[ERROR] Unable to create volume"); fclose(f); return NULL; } /* set volume offset and reference grid */ volume->x0 = parameters->volume_offset_x0; volume->y0 = parameters->volume_offset_y0; volume->z0 = parameters->volume_offset_z0; volume->x1 = parameters->volume_offset_x0 + (w - 1) * subsampling_dx + 1; volume->y1 = parameters->volume_offset_y0 + (h - 1) * subsampling_dy + 1; volume->z1 = parameters->volume_offset_z0 + (l - 1) * subsampling_dz + 1; /* set volume data */ f = fopen(filename, "rb"); if (!f) { fprintf(stdout, "[ERROR] Failed to open %s for reading !!\n", filename); return 0; } /* BINARY */ for (compno = 0; compno < volume->numcomps; compno++) { int whl = w * h * l; /* set volume data */ comp = &volume->comps[compno]; /*if (comp->prec <= 8) { if (!comp->sgnd) { unsigned char *data = (unsigned char *) malloc(whl * sizeof(unsigned char)); fread(data, 1, whl, f); for (i = 0; i < whl; i++) { comp->data[i] = data[i]; if (comp->data[i] > max) max = comp->data[i]; } free(data); } else { char *data = (char *) malloc(whl); fread(data, 1, whl, f); for (i = 0; i < whl; i++) { comp->data[i] = data[i]; if (comp->data[i] > max) max = comp->data[i]; } free(data); } } else if (comp->prec <= 16) { if (!comp->sgnd) { unsigned short *data = (unsigned short *) malloc(whl * sizeof(unsigned short)); int leido = fread(data, 2, whl, f); if (!leido) { free(data); fclose(f); return NULL; } for (i = 0; i < whl; i++) { if (bigendian) //(c1 << 8) + c2; comp->data[i] = data[i]; else{ //(c2 << 8) + c1; comp->data[i] = ShortSwap(data[i]); } if (comp->data[i] > max) max = comp->data[i]; } free(data); } else { short *data = (short *) malloc(whl); int leido = fread(data, 2, whl, f); if (!leido) { free(data); fclose(f); return NULL; } for (i = 0; i < whl; i++) { if (bigendian){ //(c1 << 8) + c2; comp->data[i] = data[i]; }else{ //(c2 << 8) + c1; comp->data[i] = (short) ShortSwap((unsigned short) data[i]); } if (comp->data[i] > max) max = comp->data[i]; } free(data); } } else { if (!comp->sgnd) { unsigned int *data = (unsigned int *) malloc(whl * sizeof(unsigned int)); int leido = fread(data, 4, whl, f); if (!leido) { free(data); fclose(f); return NULL; } for (i = 0; i < whl; i++) { if (!bigendian) comp->data[i] = LongSwap(data[i]); else comp->data[i] = data[i]; if (comp->data[i] > max) max = comp->data[i]; } free(data); } else { int leido = fread(comp->data, 4, whl, f); if (!leido) { fclose(f); return NULL; } for (i = 0; i < whl; i++) { if (!bigendian) comp->data[i] = (int) LongSwap((unsigned int) comp->data[i]); if (comp->data[i] > max) max = comp->data[i]; } } }*/ for (i = 0; i < whl; i++) { int v; 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; comp->data[i] = v; } comp->bpp = int_floorlog2(max) + 1; } fclose(f); return volume; } int volumetobin(opj_volume_t * volume, char *outfile) { int w, wr, wrr, h, hr, hrr, l, lr, lrr, max; int i,j, compno, nbytes; int offset, sliceno; FILE *fdest = NULL; FILE *fimgdest = NULL; /* char *imgtemp;*/ char name[256]; for (compno = 0; compno < 1; compno++) { /*Only one component*/ fdest = fopen(outfile, "wb"); if (!fdest) { fprintf(stdout, "[ERROR] Failed to open %s for writing\n", outfile); return 1; } fprintf(stdout,"[INFO] Writing outfile %s (%s) \n",outfile, volume->comps[0].bigendian ? "Bigendian" : "Little-endian"); w = int_ceildiv(volume->x1 - volume->x0, volume->comps[compno].dx); wr = volume->comps[compno].w; wrr = int_ceildivpow2(volume->comps[compno].w, volume->comps[compno].factor[0]); h = int_ceildiv(volume->y1 - volume->y0, volume->comps[compno].dy); hr = volume->comps[compno].h; hrr = int_ceildivpow2(volume->comps[compno].h, volume->comps[compno].factor[1]); l = int_ceildiv(volume->z1 - volume->z0, volume->comps[compno].dz); lr = volume->comps[compno].l; lrr = int_ceildivpow2(volume->comps[compno].l, volume->comps[compno].factor[2]); max = (volume->comps[compno].prec <= 8) ? 255 : (1 << volume->comps[compno].prec) - 1; volume->comps[compno].x0 = int_ceildivpow2(volume->comps[compno].x0 - int_ceildiv(volume->x0, volume->comps[compno].dx), volume->comps[compno].factor[0]); volume->comps[compno].y0 = int_ceildivpow2(volume->comps[compno].y0 - int_ceildiv(volume->y0, volume->comps[compno].dy), volume->comps[compno].factor[1]); volume->comps[compno].z0 = int_ceildivpow2(volume->comps[compno].z0 - int_ceildiv(volume->z0, volume->comps[compno].dz), volume->comps[compno].factor[2]); if (volume->comps[0].prec <= 8) { nbytes = 1; } else if (volume->comps[0].prec <= 16) { nbytes = 2; } else { nbytes = 4; } /*fprintf(stdout,"w %d wr %d wrr %d h %d hr %d hrr %d l %d lr %d lrr %d max %d nbytes %d\n Factor %d %d %d",w,wr,wrr,h,hr,hrr,l,lr,lrr,max,nbytes,volume->comps[compno].factor[0],volume->comps[compno].factor[1],volume->comps[compno].factor[2]);*/ for(sliceno = 0; sliceno < lrr; sliceno++) { offset = (sliceno / lrr * l) + (sliceno % lrr); offset = wrr * hrr * offset; for (i = 0; i < wrr * hrr; i++) { int v = volume->comps[0].data[(i / wrr * w) + (i % wrr) + offset]; if (volume->comps[0].bigendian) { for (j = nbytes - 1; j >= 0; j--) { char byte = (char) ((v >> (j * 8)) & 0xff); fwrite(&byte, 1, 1, fdest); } } else { for (j = 0; j <= nbytes - 1; j++) { char byte = (char) ((v >> (j * 8)) & 0xff); fwrite(&byte, 1, 1, fdest); } } } } } fclose(fdest); sprintf(name,"%s.img",outfile); fimgdest = fopen(name, "w"); if (!fimgdest) { fprintf(stdout, "[ERROR] Failed to open %s for writing\n", name); return 1; } fprintf(fimgdest, "Bpp\t%d\nColor Map\t2\nDimensions\t%d\t%d\t%d\nResolution(mm)\t%d\t%d\t%d\t\n", volume->comps[0].prec,wrr,hrr,lrr,volume->comps[0].dx,volume->comps[0].dy,volume->comps[0].dz); fclose(fimgdest); return 0; } /* -->> -->> -->> -->> IMG IMAGE FORMAT <<-- <<-- <<-- <<-- */ opj_volume_t* imgtovolume(char *fileimg, opj_cparameters_t *parameters) { int subsampling_dx = parameters->subsampling_dx; int subsampling_dy = parameters->subsampling_dy; int subsampling_dz = parameters->subsampling_dz; int i, compno, w, h, l, numcomps = 1; int prec, max = 0, min = 0; float dx, dy, dz; char filename[100], tmpdirpath[100], dirpath[100], *tmp; char line[100], datatype[100]; int bigendian; FILE *f = NULL; FILE *fimg = NULL; OPJ_COLOR_SPACE color_space; opj_volume_cmptparm_t cmptparm; /* maximum of 1 component */ opj_volume_t * volume = NULL; opj_volume_comp_t *comp = NULL; bigendian = 0; color_space = CLRSPC_GRAY; fimg = fopen(fileimg,"r"); if (!fimg) { fprintf(stderr, "[ERROR] Failed to open %s for reading !!\n", fileimg); return 0; } /*Fetch only the path */ strcpy(tmpdirpath,fileimg); if ((tmp = strrchr(tmpdirpath,'/')) != NULL){ tmp++; *tmp='\0'; strcpy(dirpath,tmpdirpath); } else { strcpy(dirpath,"./"); } fseek(fimg, 0, SEEK_SET); while (!feof(fimg)) { fgets(line,100,fimg); /*fprintf(stdout,"%s %d \n",line,feof(fimg));*/ if (strncmp(line,"Image",5) == 0){ sscanf(line,"%*s%*[ \t]%s",datatype); } else if (strncmp(line,"File",4) == 0){ sscanf(line,"%*s %*s%*[ \t]%s",filename); strcat(dirpath, filename); strcpy(filename,dirpath); } else if (strncmp(line,"Min",3) == 0){ sscanf(line,"%*s %*s%*[ \t]%d%*[ \t]%d",&min,&max); prec = int_floorlog2(max - min + 1); } else if (strncmp(line,"Bpp",3) == 0){ sscanf(line,"%*s%*[ \t]%d",&prec); } else if (strncmp(line,"Color",5) == 0){ sscanf(line, "%*s %*s%*[ \t]%d",&color_space); } else if (strncmp(line,"Dim",3) == 0){ sscanf(line, "%*s%*[ \t]%d%*[ \t]%d%*[ \t]%d",&w,&h,&l); } else if (strncmp(line,"Res",3) == 0){ sscanf(line,"%*s%*[ \t]%f%*[ \t]%f%*[ \t]%f",&dx,&dy,&dz); } } #ifdef VERBOSE fprintf(stdout, "[INFO] %s %d \t %d %d %d \t %f %f %f \t %d %d %d \n",filename,color_space,w,h,l,dx,dy,dz,max,min,prec); #endif fclose(fimg); /* error control */ if ( !prec || !w || !h || !l ){ fprintf(stderr,"[ERROR] Unable to read IMG file correctly. Found some null values."); return NULL; } /* initialize volume components */ memset(&cmptparm, 0, sizeof(opj_volume_cmptparm_t)); cmptparm.prec = prec; cmptparm.bpp = prec; cmptparm.sgnd = 0; cmptparm.bigendian = bigendian; cmptparm.dcoffset = parameters->dcoffset; cmptparm.dx = subsampling_dx; cmptparm.dy = subsampling_dy; cmptparm.dz = subsampling_dz; cmptparm.w = w; cmptparm.h = h; cmptparm.l = l; /* create the volume */ volume = opj_volume_create(numcomps, &cmptparm, color_space); if(!volume) { fprintf(stdout,"[ERROR] Unable to create volume"); return NULL; } /* set volume offset and reference grid */ volume->x0 = parameters->volume_offset_x0; volume->y0 = parameters->volume_offset_y0; volume->z0 = parameters->volume_offset_z0; volume->x1 = parameters->volume_offset_x0 + (w - 1) * subsampling_dx + 1; volume->y1 = parameters->volume_offset_y0 + (h - 1) * subsampling_dy + 1; volume->z1 = parameters->volume_offset_z0 + (l - 1) * subsampling_dz + 1; max = 0; /* set volume data */ f = fopen(filename, "rb"); if (!f) { fprintf(stderr, "[ERROR] Failed to open %s for reading !!\n", filename); fclose(f); return 0; } /* BINARY */ for (compno = 0; compno < volume->numcomps; compno++) { int whl = w * h * l; /* set volume data */ comp = &volume->comps[compno]; /*if (comp->prec <= 8) { if (!comp->sgnd) { unsigned char *data = (unsigned char *) malloc(whl * sizeof(unsigned char)); fread(data, 1, whl, f); for (i = 0; i < whl; i++) { comp->data[i] = data[i]; if (comp->data[i] > max) max = comp->data[i]; } free(data); } else { char *data = (char *) malloc(whl); fread(data, 1, whl, f); for (i = 0; i < whl; i++) { comp->data[i] = data[i]; if (comp->data[i] > max) max = comp->data[i]; } free(data); } } else if (comp->prec <= 16) { if (!comp->sgnd) { unsigned short *data = (unsigned short *) malloc(whl * sizeof(unsigned short)); int leido = fread(data, 2, whl, f); if (!leido) { free(data); fclose(f); return NULL; } for (i = 0; i < whl; i++) { if (bigendian) //(c1 << 8) + c2; comp->data[i] = data[i]; else{ //(c2 << 8) + c1; comp->data[i] = ShortSwap(data[i]); } if (comp->data[i] > max) max = comp->data[i]; } free(data); } else { short *data = (short *) malloc(whl); int leido = fread(data, 2, whl, f); if (!leido) { free(data); fclose(f); return NULL; } for (i = 0; i < whl; i++) { if (bigendian){ //(c1 << 8) + c2; comp->data[i] = data[i]; }else{ //(c2 << 8) + c1; comp->data[i] = (short) ShortSwap((unsigned short) data[i]); } if (comp->data[i] > max) max = comp->data[i]; } free(data); } } else { if (!comp->sgnd) { unsigned int *data = (unsigned int *) malloc(whl * sizeof(unsigned int)); int leido = fread(data, 4, whl, f); if (!leido) { free(data); fclose(f); return NULL; } for (i = 0; i < whl; i++) { if (!bigendian) comp->data[i] = LongSwap(data[i]); else comp->data[i] = data[i]; if (comp->data[i] > max) max = comp->data[i]; } free(data); } else { int leido = fread(comp->data, 4, whl, f); if (!leido) { fclose(f); return NULL; } for (i = 0; i < whl; i++) { if (!bigendian) comp->data[i] = (int) LongSwap((unsigned int) comp->data[i]); if (comp->data[i] > max) max = comp->data[i]; } } }*/ for (i = 0; i < whl; i++) { int v; 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; comp->data[i] = v; } comp->bpp = int_floorlog2(max) + 1; } fclose(f); return volume; } openjpeg-2.1.0/src/bin/jp3d/getopt.h000755 001750 001750 00000000441 12327650566 020343 0ustar00mathieumathieu000000 000000 /* last review : october 29th, 2002 */ #ifndef _GETOPT_H_ #define _GETOPT_H_ extern int opterr; extern int optind; extern int optopt; extern int optreset; extern char *optarg; extern int getopt(int nargc, char *const *nargv, const char *ostr); #endif /* _GETOPT_H_ */ openjpeg-2.1.0/src/bin/jpwl/index.c000644 001750 001750 00000037270 12327650567 020267 0ustar00mathieumathieu000000 000000 /* * 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 #include #include #include "openjpeg.h" #include "index.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 */ /* <tile[0].distotile) 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); /* <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++) { int 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 == 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 %6d %6d %7d", 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 == 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 %9d %9d %7d", 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 == 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 %9d %9d %7d", 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 == 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 %9d %9d %7d", 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 %9d %9d %7d", 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%9d %9d\n", cstr_info->marker[x].type, cstr_info->marker[x].pos, cstr_info->marker[x].len); } /* < #include #include #include #ifdef _WIN32 #include "windirent.h" #else #include #endif /* _WIN32 */ #ifdef _WIN32 #include #else #include #define _stricmp strcasecmp #define _strnicmp strncasecmp #endif /* _WIN32 */ #include "opj_apps_config.h" #include "openjpeg.h" #include "opj_getopt.h" #include "convert.h" #include "index.h" #ifdef OPJ_HAVE_LIBLCMS2 #include #endif #ifdef OPJ_HAVE_LIBLCMS1 #include #endif #include "color.h" #include "format_defs.h" typedef struct dircnt{ /** Buffer for holding images read from Directory*/ char *filename_buf; /** Pointer to the buffer*/ char **filename; }dircnt_t; typedef struct img_folder{ /** The directory path of the folder containing input images*/ char *imgdirpath; /** Output format*/ const char *out_format; /** Enable option*/ char set_imgdir; /** Enable Cod Format for output*/ char set_out_format; }img_fol_t; void decode_help_display(void) { fprintf(stdout,"HELP for j2k_to_image\n----\n\n"); fprintf(stdout,"- the -h option displays this help information on screen\n\n"); /* UniPG>> */ fprintf(stdout,"List of parameters for the JPEG 2000 " #ifdef USE_JPWL "+ JPWL " #endif /* USE_JPWL */ "decoder:\n"); /* < \n"); fprintf(stdout," Currently accepts PGM, PPM, PNM, PGX, PNG, BMP, TIF, RAW and TGA formats\n"); fprintf(stdout," -i \n"); fprintf(stdout," REQUIRED only if an Input image directory not specified\n"); fprintf(stdout," Currently accepts J2K-files, JP2-files and JPT-files. The file type\n"); fprintf(stdout," is identified based on its suffix.\n"); fprintf(stdout," -o \n"); fprintf(stdout," REQUIRED\n"); fprintf(stdout," Currently accepts PGM, PPM, PNM, PGX, PNG, BMP, TIF, RAW and TGA files\n"); fprintf(stdout," Binary data is written to the file (not ascii). If a PGX\n"); fprintf(stdout," filename is given, there will be as many output files as there are\n"); fprintf(stdout," components: an indice starting from 0 will then be appended to the\n"); fprintf(stdout," output filename, just before the \"pgx\" extension. If a PGM filename\n"); fprintf(stdout," is given and there are more than one component, only the first component\n"); fprintf(stdout," will be written to the file.\n"); fprintf(stdout," -r \n"); fprintf(stdout," Set the number of highest resolution levels to be discarded. The\n"); fprintf(stdout," image resolution is effectively divided by 2 to the power of the\n"); fprintf(stdout," number of discarded levels. The reduce factor is limited by the\n"); fprintf(stdout," smallest total number of decomposition levels among tiles.\n"); fprintf(stdout," -l \n"); fprintf(stdout," Set the maximum number of quality layers to decode. If there are\n"); fprintf(stdout," less quality layers than the specified number, all the quality layers\n"); fprintf(stdout," are decoded.\n"); fprintf(stdout," -x \n"); fprintf(stdout," Create an index file *.Idx (-x index_name.Idx) \n"); fprintf(stdout,"\n"); /* UniPG>> */ #ifdef USE_JPWL fprintf(stdout," -W \n"); fprintf(stdout," Activates the JPWL correction capability, if the codestream complies.\n"); fprintf(stdout," Options can be a comma separated list of tokens:\n"); fprintf(stdout," c, c=numcomps\n"); fprintf(stdout," numcomps is the number of expected components in the codestream\n"); fprintf(stdout," (search of first EPB rely upon this, default is %d)\n", JPWL_EXPECTED_COMPONENTS); #endif /* USE_JPWL */ /* <d_name)==0 || strcmp("..",content->d_name)==0 ) continue; num_images++; } return num_images; } int load_images(dircnt_t *dirptr, char *imgdirpath){ DIR *dir; struct dirent* content; int i = 0; /*Reading the input images from given input directory*/ dir= opendir(imgdirpath); if(!dir){ fprintf(stderr,"Could not open Folder %s\n",imgdirpath); return 1; }else { fprintf(stderr,"Folder opened successfully\n"); } while((content=readdir(dir))!=NULL){ if(strcmp(".",content->d_name)==0 || strcmp("..",content->d_name)==0 ) continue; strcpy(dirptr->filename[i],content->d_name); i++; } return 0; } int get_file_format(char *filename) { unsigned int i; static const char *extension[] = {"pgx", "pnm", "pgm", "ppm", "bmp","tif", "raw", "tga", "png", "j2k", "jp2", "jpt", "j2c", "jpc" }; static const int format[] = { PGX_DFMT, PXM_DFMT, PXM_DFMT, PXM_DFMT, BMP_DFMT, TIF_DFMT, RAW_DFMT, TGA_DFMT, PNG_DFMT, J2K_CFMT, JP2_CFMT, JPT_CFMT, J2K_CFMT, J2K_CFMT }; char * ext = strrchr(filename, '.'); if (ext == NULL) return -1; ext++; if(ext) { for(i = 0; i < sizeof(format)/sizeof(*format); i++) { if(_strnicmp(ext, extension[i], 3) == 0) { return format[i]; } } } return -1; } char get_next_file(int imageno,dircnt_t *dirptr,img_fol_t *img_fol, opj_dparameters_t *parameters){ char image_filename[OPJ_PATH_LEN], infilename[OPJ_PATH_LEN],outfilename[OPJ_PATH_LEN],temp_ofname[OPJ_PATH_LEN]; char *temp_p, temp1[OPJ_PATH_LEN]=""; strcpy(image_filename,dirptr->filename[imageno]); fprintf(stderr,"File Number %d \"%s\"\n",imageno,image_filename); parameters->decod_format = get_file_format(image_filename); if (parameters->decod_format == -1) return 1; sprintf(infilename,"%s/%s",img_fol->imgdirpath,image_filename); strncpy(parameters->infile, infilename, sizeof(infilename)); /*Set output file*/ strcpy(temp_ofname,strtok(image_filename,".")); while((temp_p = strtok(NULL,".")) != NULL){ strcat(temp_ofname,temp1); sprintf(temp1,".%s",temp_p); } if(img_fol->set_out_format==1){ sprintf(outfilename,"%s/%s.%s",img_fol->imgdirpath,temp_ofname,img_fol->out_format); strncpy(parameters->outfile, outfilename, sizeof(outfilename)); } return 0; } /* -------------------------------------------------------------------------- */ int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters,img_fol_t *img_fol, char *indexfilename) { /* parse the command line */ int totlen, c; opj_option_t long_option[]={ {"ImgDir",REQ_ARG, NULL ,'y'}, {"OutFor",REQ_ARG, NULL ,'O'}, }; const char optlist[] = "i:o:r:l:x:" /* UniPG>> */ #ifdef USE_JPWL "W:" #endif /* USE_JPWL */ /* <set_out_format = 0; do { c = opj_getopt_long(argc, argv,optlist,long_option,totlen); if (c == -1) break; switch (c) { case 'i': /* input file */ { char *infile = opj_optarg; parameters->decod_format = get_file_format(infile); switch(parameters->decod_format) { case J2K_CFMT: case JP2_CFMT: case JPT_CFMT: break; default: fprintf(stderr, "!! Unrecognized format for infile : %s [accept only *.j2k, *.jp2, *.jpc or *.jpt] !!\n\n", infile); return 1; } strncpy(parameters->infile, infile, sizeof(parameters->infile)-1); } break; /* ----------------------------------------------------- */ case 'o': /* output file */ { char *outfile = opj_optarg; parameters->cod_format = get_file_format(outfile); switch(parameters->cod_format) { case PGX_DFMT: case PXM_DFMT: case BMP_DFMT: case TIF_DFMT: case RAW_DFMT: case TGA_DFMT: case PNG_DFMT: break; default: fprintf(stderr, "Unknown output format image %s [only *.pnm, *.pgm, *.ppm, *.pgx, *.bmp, *.tif, *.raw or *.tga]!! \n", outfile); return 1; } strncpy(parameters->outfile, outfile, sizeof(parameters->outfile)-1); } break; /* ----------------------------------------------------- */ case 'O': /* output format */ { char outformat[50]; char *of = opj_optarg; sprintf(outformat,".%s",of); img_fol->set_out_format = 1; parameters->cod_format = get_file_format(outformat); switch(parameters->cod_format) { case PGX_DFMT: img_fol->out_format = "pgx"; break; case PXM_DFMT: img_fol->out_format = "ppm"; break; case BMP_DFMT: img_fol->out_format = "bmp"; break; case TIF_DFMT: img_fol->out_format = "tif"; break; case RAW_DFMT: img_fol->out_format = "raw"; break; case TGA_DFMT: img_fol->out_format = "raw"; break; case PNG_DFMT: img_fol->out_format = "png"; break; default: fprintf(stderr, "Unknown output format image %s [only *.pnm, *.pgm, *.ppm, *.pgx, *.bmp, *.tif, *.raw or *.tga]!! \n", outformat); return 1; break; } } break; /* ----------------------------------------------------- */ case 'r': /* reduce option */ { sscanf(opj_optarg, "%d", ¶meters->cp_reduce); } break; /* ----------------------------------------------------- */ case 'l': /* layering option */ { sscanf(opj_optarg, "%d", ¶meters->cp_layer); } break; /* ----------------------------------------------------- */ case 'h': /* display an help description */ decode_help_display(); return 1; /* ------------------------------------------------------ */ case 'y': /* Image Directory path */ { img_fol->imgdirpath = (char*)malloc(strlen(opj_optarg) + 1); strcpy(img_fol->imgdirpath,opj_optarg); img_fol->set_imgdir=1; } break; /* ----------------------------------------------------- */ case 'x': /* Creation of index file */ { char *index = opj_optarg; strncpy(indexfilename, index, OPJ_PATH_LEN); } break; /* ----------------------------------------------------- */ /* UniPG>> */ #ifdef USE_JPWL case 'W': /* activate JPWL correction */ { char *token = NULL; token = strtok(opj_optarg, ","); while(token != NULL) { /* search expected number of components */ if (*token == 'c') { static int compno; compno = JPWL_EXPECTED_COMPONENTS; /* predefined no. of components */ if(sscanf(token, "c=%d", &compno) == 1) { /* Specified */ if ((compno < 1) || (compno > 256)) { fprintf(stderr, "ERROR -> invalid number of components c = %d\n", compno); return 1; } parameters->jpwl_exp_comps = compno; } else if (!strcmp(token, "c")) { /* default */ parameters->jpwl_exp_comps = compno; /* auto for default size */ } else { fprintf(stderr, "ERROR -> invalid components specified = %s\n", token); return 1; }; } /* search maximum number of tiles */ if (*token == 't') { static int tileno; tileno = JPWL_MAXIMUM_TILES; /* maximum no. of tiles */ if(sscanf(token, "t=%d", &tileno) == 1) { /* Specified */ if ((tileno < 1) || (tileno > JPWL_MAXIMUM_TILES)) { fprintf(stderr, "ERROR -> invalid number of tiles t = %d\n", tileno); return 1; } parameters->jpwl_max_tiles = tileno; } else if (!strcmp(token, "t")) { /* default */ parameters->jpwl_max_tiles = tileno; /* auto for default size */ } else { fprintf(stderr, "ERROR -> invalid tiles specified = %s\n", token); return 1; }; } /* next token or bust */ token = strtok(NULL, ","); }; parameters->jpwl_correct = OPJ_TRUE; fprintf(stdout, "JPWL correction capability activated\n"); fprintf(stdout, "- expecting %d components\n", parameters->jpwl_exp_comps); } break; #endif /* USE_JPWL */ /* < this option is not valid \"-%c %s\"\n",c, opj_optarg); break; } }while(c != -1); /* check for possible errors */ if(img_fol->set_imgdir==1){ if(!(parameters->infile[0]==0)){ fprintf(stderr, "Error: options -ImgDir and -i cannot be used together !!\n"); return 1; } if(img_fol->set_out_format == 0){ fprintf(stderr, "Error: When -ImgDir is used, -OutFor must be used !!\n"); fprintf(stderr, "Only one format allowed! Valid format PGM, PPM, PNM, PGX, BMP, TIF, RAW and TGA!!\n"); return 1; } if(!((parameters->outfile[0] == 0))){ fprintf(stderr, "Error: options -ImgDir and -o cannot be used together !!\n"); return 1; } }else{ if((parameters->infile[0] == 0) || (parameters->outfile[0] == 0)) { fprintf(stderr, "Example: %s -i image.j2k -o image.pgm\n",argv[0]); fprintf(stderr, " Try: %s -h\n",argv[0]); return 1; } } return 0; } /* -------------------------------------------------------------------------- */ /** sample error callback expecting a FILE* client object */ void error_callback(const char *msg, void *client_data) { FILE *stream = (FILE*)client_data; fprintf(stream, "[ERROR] %s", msg); } /** sample warning callback expecting a FILE* client object */ void warning_callback(const char *msg, void *client_data) { FILE *stream = (FILE*)client_data; fprintf(stream, "[WARNING] %s", msg); } /** sample debug callback expecting no client object */ void info_callback(const char *msg, void *client_data) { (void)client_data; fprintf(stdout, "[INFO] %s", msg); } /* -------------------------------------------------------------------------- */ int main(int argc, char **argv) { opj_dparameters_t parameters; /* decompression parameters */ img_fol_t img_fol; opj_event_mgr_t event_mgr; /* event manager */ opj_image_t *image = NULL; FILE *fsrc = NULL; unsigned char *src = NULL; int file_length; int num_images; int i,imageno; dircnt_t *dirptr = NULL; opj_dinfo_t* dinfo = NULL; /* handle to a decompressor */ opj_cio_t *cio = NULL; opj_codestream_info_t cstr_info; /* Codestream information structure */ char indexfilename[OPJ_PATH_LEN]; /* index file name */ /* configure the event callbacks (not required) */ memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); event_mgr.error_handler = error_callback; event_mgr.warning_handler = warning_callback; event_mgr.info_handler = info_callback; /* set decoding parameters to default values */ opj_set_default_decoder_parameters(¶meters); /* Initialize indexfilename and img_fol */ *indexfilename = 0; memset(&img_fol,0,sizeof(img_fol_t)); /* parse input and get user encoding parameters */ if(parse_cmdline_decoder(argc, argv, ¶meters,&img_fol, indexfilename) == 1) { return 1; } /* Initialize reading of directory */ if(img_fol.set_imgdir==1){ num_images=get_num_images(img_fol.imgdirpath); dirptr=(dircnt_t*)malloc(sizeof(dircnt_t)); if(dirptr){ dirptr->filename_buf = (char*)malloc(num_images*OPJ_PATH_LEN*sizeof(char)); /* Stores at max 10 image file names*/ dirptr->filename = (char**) malloc(num_images*sizeof(char*)); if(!dirptr->filename_buf){ return 1; } for(i=0;ifilename[i] = dirptr->filename_buf + i*OPJ_PATH_LEN; } } if(load_images(dirptr,img_fol.imgdirpath)==1){ return 1; } if (num_images==0){ fprintf(stdout,"Folder is empty\n"); return 1; } }else{ num_images=1; } /*Encoding image one by one*/ for(imageno = 0; imageno < num_images ; imageno++) { image = NULL; fprintf(stderr,"\n"); if(img_fol.set_imgdir==1){ if (get_next_file(imageno, dirptr,&img_fol, ¶meters)) { fprintf(stderr,"skipping file...\n"); continue; } } /* read the input file and put it in memory */ /* ---------------------------------------- */ fsrc = fopen(parameters.infile, "rb"); if (!fsrc) { fprintf(stderr, "ERROR -> failed to open %s for reading\n", parameters.infile); return 1; } fseek(fsrc, 0, SEEK_END); file_length = ftell(fsrc); fseek(fsrc, 0, SEEK_SET); src = (unsigned char *) malloc(file_length); if (fread(src, 1, file_length, fsrc) != (size_t)file_length) { free(src); fclose(fsrc); fprintf(stderr, "\nERROR: fread return a number of element different from the expected.\n"); return 1; } fclose(fsrc); /* decode the code-stream */ /* ---------------------- */ switch(parameters.decod_format) { case J2K_CFMT: { /* JPEG-2000 codestream */ /* get a decoder handle */ dinfo = opj_create_decompress(CODEC_J2K); /* catch events using our callbacks and give a local context */ opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr); /* setup the decoder decoding parameters using user parameters */ opj_setup_decoder(dinfo, ¶meters); /* open a byte stream */ cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length); /* decode the stream and fill the image structure */ if (*indexfilename) /* If need to extract codestream information*/ image = opj_decode_with_info(dinfo, cio, &cstr_info); else image = opj_decode(dinfo, cio); if(!image) { fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n"); opj_destroy_decompress(dinfo); opj_cio_close(cio); free(src); return 1; } /* close the byte stream */ opj_cio_close(cio); /* Write the index to disk */ if (*indexfilename) { opj_bool bSuccess; bSuccess = write_index_file(&cstr_info, indexfilename); if (bSuccess) { fprintf(stderr, "Failed to output index file\n"); } } } break; case JP2_CFMT: { /* JPEG 2000 compressed image data */ /* get a decoder handle */ dinfo = opj_create_decompress(CODEC_JP2); /* catch events using our callbacks and give a local context */ opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr); /* setup the decoder decoding parameters using the current image and user parameters */ opj_setup_decoder(dinfo, ¶meters); /* open a byte stream */ cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length); /* decode the stream and fill the image structure */ if (*indexfilename) /* If need to extract codestream information*/ image = opj_decode_with_info(dinfo, cio, &cstr_info); else image = opj_decode(dinfo, cio); if(!image) { fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n"); opj_destroy_decompress(dinfo); opj_cio_close(cio); free(src); return 1; } /* close the byte stream */ opj_cio_close(cio); /* Write the index to disk */ if (*indexfilename) { opj_bool bSuccess; bSuccess = write_index_file(&cstr_info, indexfilename); if (bSuccess) { fprintf(stderr, "Failed to output index file\n"); } } } break; case JPT_CFMT: { /* JPEG 2000, JPIP */ /* get a decoder handle */ dinfo = opj_create_decompress(CODEC_JPT); /* catch events using our callbacks and give a local context */ opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr); /* setup the decoder decoding parameters using user parameters */ opj_setup_decoder(dinfo, ¶meters); /* open a byte stream */ cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length); /* decode the stream and fill the image structure */ if (*indexfilename) /* If need to extract codestream information*/ image = opj_decode_with_info(dinfo, cio, &cstr_info); else image = opj_decode(dinfo, cio); if(!image) { fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n"); opj_destroy_decompress(dinfo); opj_cio_close(cio); free(src); return 1; } /* close the byte stream */ opj_cio_close(cio); /* Write the index to disk */ if (*indexfilename) { opj_bool bSuccess; bSuccess = write_index_file(&cstr_info, indexfilename); if (bSuccess) { fprintf(stderr, "Failed to output index file\n"); } } } break; default: fprintf(stderr, "skipping file..\n"); continue; } /* free the memory containing the code-stream */ free(src); src = NULL; if(image->color_space == CLRSPC_SYCC) { color_sycc_to_rgb(image); } if(image->icc_profile_buf) { #if defined(OPJ_HAVE_LIBLCMS1) || defined(OPJ_HAVE_LIBLCMS2) color_apply_icc_profile(image); #endif free(image->icc_profile_buf); image->icc_profile_buf = NULL; image->icc_profile_len = 0; } /* create output image */ /* ------------------- */ switch (parameters.cod_format) { case PXM_DFMT: /* PNM PGM PPM */ if (imagetopnm(image, parameters.outfile)) { fprintf(stdout,"Outfile %s not generated\n",parameters.outfile); } else { fprintf(stdout,"Generated Outfile %s\n",parameters.outfile); } break; case PGX_DFMT: /* PGX */ if(imagetopgx(image, parameters.outfile)){ fprintf(stdout,"Outfile %s not generated\n",parameters.outfile); } else { fprintf(stdout,"Generated Outfile %s\n",parameters.outfile); } break; case BMP_DFMT: /* BMP */ if(imagetobmp(image, parameters.outfile)){ fprintf(stdout,"Outfile %s not generated\n",parameters.outfile); } else { fprintf(stdout,"Generated Outfile %s\n",parameters.outfile); } break; #ifdef OPJ_HAVE_LIBTIFF case TIF_DFMT: /* TIFF */ if(imagetotif(image, parameters.outfile)){ fprintf(stdout,"Outfile %s not generated\n",parameters.outfile); } else { fprintf(stdout,"Generated Outfile %s\n",parameters.outfile); } break; #endif /* OPJ_HAVE_LIBTIFF */ case RAW_DFMT: /* RAW */ if(imagetoraw(image, parameters.outfile)){ fprintf(stdout,"Error generating raw file. Outfile %s not generated\n",parameters.outfile); } else { fprintf(stdout,"Successfully generated Outfile %s\n",parameters.outfile); } break; case TGA_DFMT: /* TGA */ if(imagetotga(image, parameters.outfile)){ fprintf(stdout,"Error generating tga file. Outfile %s not generated\n",parameters.outfile); } else { fprintf(stdout,"Successfully generated Outfile %s\n",parameters.outfile); } break; #ifdef OPJ_HAVE_LIBPNG case PNG_DFMT: /* PNG */ if(imagetopng(image, parameters.outfile)){ fprintf(stdout,"Error generating png file. Outfile %s not generated\n",parameters.outfile); } else { fprintf(stdout,"Successfully generated Outfile %s\n",parameters.outfile); } break; #endif /* OPJ_HAVE_LIBPNG */ /* Can happen if output file is TIFF or PNG * and OPJ_HAVE_LIBTIF or OPJ_HAVE_LIBPNG is undefined */ default: fprintf(stderr,"Outfile %s not generated\n",parameters.outfile); } /* free remaining structures */ if(dinfo) { opj_destroy_decompress(dinfo); } /* free codestream information structure */ if (*indexfilename) opj_destroy_cstr_info(&cstr_info); /* free image data structure */ opj_image_destroy(image); } return 0; } /*end main*/ openjpeg-2.1.0/src/bin/jpwl/CMakeLists.txt000644 001750 001750 00000002666 12327650567 021555 0ustar00mathieumathieu000000 000000 # jpwl apps # First thing define the common source: set(common_SRCS convert.c index.c ${OPENJPEG_SOURCE_DIR}/src/bin/common/color.c ${OPENJPEG_SOURCE_DIR}/src/bin/common/opj_getopt.c ) # 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/openmj2 ${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() add_definitions(-DOPJ_USE_LEGACY) foreach(exe decompress compress) set(jpwl_exe opj_jpwl_${exe}) set(jp2_exe opj_${exe}) add_executable(${jpwl_exe} #../jp2/${jp2_exe}.c ${jpwl_exe}.c ${common_SRCS} ) set_property( TARGET ${jpwl_exe} APPEND PROPERTY COMPILE_DEFINITIONS USE_JPWL ) target_link_libraries(${jpwl_exe} openjpwl ${LCMS_LIBNAME} ${PNG_LIBNAME} ${TIFF_LIBNAME}) # To support universal exe: if(ZLIB_FOUND AND APPLE) target_link_libraries(${jpwl_exe} z) else(ZLIB_FOUND AND APPLE) target_link_libraries(${jpwl_exe} ${Z_LIBNAME}) endif() if(UNIX) target_link_libraries(${jpwl_exe} m) endif() install(TARGETS ${jpwl_exe} DESTINATION ${OPENJPEG_INSTALL_BIN_DIR} COMPONENT Applications ) endforeach() openjpeg-2.1.0/src/bin/jpwl/convert.h000644 001750 001750 00000007215 12327650567 020641 0ustar00mathieumathieu000000 000000 /* * 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 image encoding parameters */ /*@{*/ typedef struct raw_cparameters { /** width of the raw image */ int rawWidth; /** height of the raw image */ int rawHeight; /** components of the raw image */ int rawComp; /** bit depth of the raw image */ int rawBitDepth; /** signed/unsigned raw image */ opj_bool rawSigned; /*@}*/ } raw_cparameters_t; /* 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); /* RAW conversion */ int imagetoraw(opj_image_t * image, const char *outfile); opj_image_t* rawtoimage(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 */ openjpeg-2.1.0/src/bin/jpwl/opj_jpwl_compress.c000644 001750 001750 00000166506 12327650567 022724 0ustar00mathieumathieu000000 000000 /* * 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 #include #include #include #ifdef _WIN32 #include "windirent.h" #else #include #endif /* _WIN32 */ #ifdef _WIN32 #include #define strcasecmp _stricmp #define strncasecmp _strnicmp #else #include #endif /* _WIN32 */ #include "opj_apps_config.h" #include "openjpeg.h" #include "opj_getopt.h" #include "convert.h" #include "index.h" #include "format_defs.h" #define CINEMA_24_CS 1302083 /*Codestream length for 24fps*/ #define CINEMA_48_CS 651041 /*Codestream length for 48fps*/ #define COMP_24_CS 1041666 /*Maximum size per color component for 2K & 4K @ 24fps*/ #define COMP_48_CS 520833 /*Maximum size per color component for 2K @ 48fps*/ typedef struct dircnt{ /** Buffer for holding images read from Directory*/ char *filename_buf; /** Pointer to the buffer*/ char **filename; }dircnt_t; typedef struct img_folder{ /** The directory path of the folder containing input images*/ char *imgdirpath; /** Output format*/ char *out_format; /** Enable option*/ char set_imgdir; /** Enable Cod Format for output*/ char set_out_format; /** User specified rate stored in case of cinema option*/ float *rates; }img_fol_t; static void encode_help_display(void) { fprintf(stdout,"HELP for opj_jpwl_compress\n----\n\n"); fprintf(stdout,"- the -h option displays this help information on screen\n\n"); /* UniPG>> */ fprintf(stdout,"List of parameters for the JPEG 2000 " #ifdef USE_JPWL "+ JPWL " #endif /* USE_JPWL */ "encoder:\n"); /* <> */ #ifdef USE_JPWL fprintf(stdout," * No JPWL protection\n"); #endif /* USE_JPWL */ /* < \n"); fprintf(stdout," Currently accepts PBM, PGM, PPM, PNM, PAM, PGX, PNG, BMP, TIF, RAW and TGA formats\n"); fprintf(stdout,"\n"); fprintf(stdout,"-i : source file (-i source.pnm also *pbm, *.pgm, *.ppm, *.pam, *.pgx, *png, *.bmp, *.tif, *.raw, *.tga) \n"); fprintf(stdout," When using this option -o must be used\n"); fprintf(stdout,"\n"); fprintf(stdout,"-o : destination file (-o dest.j2k or .jp2) \n"); fprintf(stdout,"\n"); fprintf(stdout,"Optional Parameters:\n"); fprintf(stdout,"\n"); fprintf(stdout,"-h : display the help information \n "); fprintf(stdout,"\n"); fprintf(stdout,"-cinema2K : Digital Cinema 2K profile compliant codestream for 2K resolution.(-cinema2k 24 or 48) \n"); fprintf(stdout," Need to specify the frames per second for a 2K resolution. Only 24 or 48 fps is allowed\n"); fprintf(stdout,"\n"); fprintf(stdout,"-cinema4K : Digital Cinema 4K profile compliant codestream for 4K resolution \n"); fprintf(stdout," Frames per second not required. Default value is 24fps\n"); fprintf(stdout,"\n"); fprintf(stdout,"-r : different compression ratios for successive layers (-r 20,10,5)\n "); fprintf(stdout," - The rate specified for each quality level is the desired \n"); fprintf(stdout," compression factor.\n"); fprintf(stdout," Example: -r 20,10,1 means quality 1: compress 20x, \n"); fprintf(stdout," quality 2: compress 10x and quality 3: compress lossless\n"); fprintf(stdout,"\n"); fprintf(stdout," (options -r and -q cannot be used together)\n "); fprintf(stdout,"\n"); fprintf(stdout,"-q : different psnr for successive layers (-q 30,40,50) \n "); fprintf(stdout," (options -r and -q cannot be used together)\n "); fprintf(stdout,"\n"); fprintf(stdout,"-n : number of resolutions (-n 3) \n"); fprintf(stdout,"\n"); fprintf(stdout,"-b : size of code block (-b 32,32) \n"); fprintf(stdout,"\n"); fprintf(stdout,"-c : size of precinct (-c 128,128) \n"); fprintf(stdout,"\n"); fprintf(stdout,"-t : size of tile (-t 512,512) \n"); fprintf(stdout,"\n"); fprintf(stdout,"-p : progression order (-p LRCP) [LRCP, RLCP, RPCL, PCRL, CPRL] \n"); fprintf(stdout,"\n"); fprintf(stdout,"-s : subsampling factor (-s 2,2) [-s X,Y] \n"); fprintf(stdout," Remark: subsampling bigger than 2 can produce error\n"); fprintf(stdout,"\n"); fprintf(stdout,"-POC : Progression order change (-POC T1=0,0,1,5,3,CPRL/T1=5,0,1,6,3,CPRL) \n"); fprintf(stdout," Example: T1=0,0,1,5,3,CPRL \n"); fprintf(stdout," : Ttilenumber=Resolution num start,Component num start,Layer num end,Resolution num end,Component num end,Progression order\n"); fprintf(stdout,"\n"); fprintf(stdout,"-SOP : write SOP marker before each packet \n"); fprintf(stdout,"\n"); fprintf(stdout,"-EPH : write EPH marker after each header packet \n"); fprintf(stdout,"\n"); fprintf(stdout,"-M : mode switch (-M 3) [1=BYPASS(LAZY) 2=RESET 4=RESTART(TERMALL)\n"); fprintf(stdout," 8=VSC 16=ERTERM(SEGTERM) 32=SEGMARK(SEGSYM)] \n"); fprintf(stdout," Indicate multiple modes by adding their values. \n"); fprintf(stdout," ex: RESTART(4) + RESET(2) + SEGMARK(32) = -M 38\n"); fprintf(stdout,"\n"); fprintf(stdout,"-TP : devide packets of every tile into tile-parts (-TP R) [R, L, C]\n"); fprintf(stdout,"\n"); fprintf(stdout,"-x : create an index file *.Idx (-x index_name.Idx) \n"); fprintf(stdout,"\n"); fprintf(stdout,"-ROI : c=%%d,U=%%d : quantization indices upshifted \n"); fprintf(stdout," for component c=%%d [%%d = 0,1,2]\n"); fprintf(stdout," with a value of U=%%d [0 <= %%d <= 37] (i.e. -ROI c=0,U=25) \n"); fprintf(stdout,"\n"); fprintf(stdout,"-d : offset of the origin of the image (-d 150,300) \n"); fprintf(stdout,"\n"); fprintf(stdout,"-T : offset of the origin of the tiles (-T 100,75) \n"); fprintf(stdout,"\n"); fprintf(stdout,"-I : use the irreversible DWT 9-7 (-I) \n"); fprintf(stdout,"\n"); fprintf(stdout,"-F : characteristics of the raw input image\n"); fprintf(stdout," -F rawWidth,rawHeight,rawComp,rawBitDepth,s/u (Signed/Unsigned)\n"); fprintf(stdout," Example: -i lena.raw -o lena.j2k -F 512,512,3,8,u\n"); fprintf(stdout,"\n"); fprintf(stdout,"-jpip : write jpip codestream index box in JP2 output file\n"); fprintf(stdout," NOTICE: currently supports only RPCL order\n"); fprintf(stdout,"\n"); /* UniPG>> */ #ifdef USE_JPWL fprintf(stdout,"-W : adoption of JPWL (Part 11) capabilities (-W params)\n"); fprintf(stdout," The parameters can be written and repeated in any order:\n"); fprintf(stdout," [h<=type>,s<=method>,a=,...\n"); fprintf(stdout," ...,z=,g=,p<=type>]\n"); fprintf(stdout,"\n"); fprintf(stdout," h selects the header error protection (EPB): 'type' can be\n"); fprintf(stdout," [0=none 1,absent=predefined 16=CRC-16 32=CRC-32 37-128=RS]\n"); fprintf(stdout," if 'tilepart' is absent, it is for main and tile headers\n"); fprintf(stdout," if 'tilepart' is present, it applies from that tile\n"); fprintf(stdout," onwards, up to the next h<> spec, or to the last tilepart\n"); fprintf(stdout," in the codestream (max. %d specs)\n", JPWL_MAX_NO_TILESPECS); fprintf(stdout,"\n"); fprintf(stdout," p selects the packet error protection (EEP/UEP with EPBs)\n"); fprintf(stdout," to be applied to raw data: 'type' can be\n"); fprintf(stdout," [0=none 1,absent=predefined 16=CRC-16 32=CRC-32 37-128=RS]\n"); fprintf(stdout," if 'tilepart:pack' is absent, it is from tile 0, packet 0\n"); fprintf(stdout," if 'tilepart:pack' is present, it applies from that tile\n"); fprintf(stdout," and that packet onwards, up to the next packet spec\n"); fprintf(stdout," or to the last packet in the last tilepart in the stream\n"); fprintf(stdout," (max. %d specs)\n", JPWL_MAX_NO_PACKSPECS); fprintf(stdout,"\n"); fprintf(stdout," s enables sensitivity data insertion (ESD): 'method' can be\n"); fprintf(stdout," [-1=NO ESD 0=RELATIVE ERROR 1=MSE 2=MSE REDUCTION 3=PSNR\n"); fprintf(stdout," 4=PSNR INCREMENT 5=MAXERR 6=TSE 7=RESERVED]\n"); fprintf(stdout," if 'tilepart' is absent, it is for main header only\n"); fprintf(stdout," if 'tilepart' is present, it applies from that tile\n"); fprintf(stdout," onwards, up to the next s<> spec, or to the last tilepart\n"); fprintf(stdout," in the codestream (max. %d specs)\n", JPWL_MAX_NO_TILESPECS); fprintf(stdout,"\n"); fprintf(stdout," g determines the addressing mode: can be\n"); fprintf(stdout," [0=PACKET 1=BYTE RANGE 2=PACKET RANGE]\n"); fprintf(stdout,"\n"); fprintf(stdout," a determines the size of data addressing: can be\n"); fprintf(stdout," 2/4 bytes (small/large codestreams). If not set, auto-mode\n"); fprintf(stdout,"\n"); fprintf(stdout," z determines the size of sensitivity values: can be\n"); fprintf(stdout," 1/2 bytes, for the transformed pseudo-floating point value\n"); fprintf(stdout,"\n"); fprintf(stdout," ex.:\n"); fprintf(stdout," h,h0=64,h3=16,h5=32,p0=78,p0:24=56,p1,p3:0=0,p3:20=32,s=0,\n"); fprintf(stdout," s0=6,s3=-1,a=0,g=1,z=1\n"); fprintf(stdout," means\n"); fprintf(stdout," predefined EPB in MH, rs(64,32) from TPH 0 to TPH 2,\n"); fprintf(stdout," CRC-16 in TPH 3 and TPH 4, CRC-32 in remaining TPHs,\n"); fprintf(stdout," UEP rs(78,32) for packets 0 to 23 of tile 0,\n"); fprintf(stdout," UEP rs(56,32) for packs. 24 to the last of tilepart 0,\n"); fprintf(stdout," UEP rs default for packets of tilepart 1,\n"); fprintf(stdout," no UEP for packets 0 to 19 of tilepart 3,\n"); fprintf(stdout," UEP CRC-32 for packs. 20 of tilepart 3 to last tilepart,\n"); fprintf(stdout," relative sensitivity ESD for MH,\n"); fprintf(stdout," TSE ESD from TPH 0 to TPH 2, byte range with automatic\n"); fprintf(stdout," size of addresses and 1 byte for each sensitivity value\n"); fprintf(stdout,"\n"); fprintf(stdout," ex.:\n"); fprintf(stdout," h,s,p\n"); fprintf(stdout," means\n"); fprintf(stdout," default protection to headers (MH and TPHs) as well as\n"); fprintf(stdout," data packets, one ESD in MH\n"); fprintf(stdout,"\n"); fprintf(stdout," N.B.: use the following recommendations when specifying\n"); fprintf(stdout," the JPWL parameters list\n"); fprintf(stdout," - when you use UEP, always pair the 'p' option with 'h'\n"); fprintf(stdout," \n"); #endif /* USE_JPWL */ /* <d_name)==0 || strcmp("..",content->d_name)==0 ) continue; num_images++; } return num_images; } static int load_images(dircnt_t *dirptr, char *imgdirpath){ DIR *dir; struct dirent* content; int i = 0; /*Reading the input images from given input directory*/ dir= opendir(imgdirpath); if(!dir){ fprintf(stderr,"Could not open Folder %s\n",imgdirpath); return 1; }else { fprintf(stderr,"Folder opened successfully\n"); } while((content=readdir(dir))!=NULL){ if(strcmp(".",content->d_name)==0 || strcmp("..",content->d_name)==0 ) continue; strcpy(dirptr->filename[i],content->d_name); i++; } return 0; } static int get_file_format(char *filename) { unsigned int i; static const char *extension[] = { "pgx", "pnm", "pgm", "ppm", "pbm", "pam", "bmp", "tif", "raw", "tga", "png", "j2k", "jp2", "j2c", "jpc" }; static const int format[] = { PGX_DFMT, PXM_DFMT, PXM_DFMT, PXM_DFMT, PXM_DFMT, PXM_DFMT, BMP_DFMT, TIF_DFMT, RAW_DFMT, TGA_DFMT, PNG_DFMT, J2K_CFMT, JP2_CFMT, J2K_CFMT, J2K_CFMT }; char * ext = strrchr(filename, '.'); if (ext == NULL) return -1; ext++; for(i = 0; i < sizeof(format)/sizeof(*format); i++) { if(strcasecmp(ext, extension[i]) == 0) { return format[i]; } } return -1; } static char * get_file_name(char *name){ char *fname; fname= (char*)malloc(OPJ_PATH_LEN*sizeof(char)); fname= strtok(name,"."); return fname; } static char get_next_file(int imageno,dircnt_t *dirptr,img_fol_t *img_fol, opj_cparameters_t *parameters){ char image_filename[OPJ_PATH_LEN], infilename[OPJ_PATH_LEN],outfilename[OPJ_PATH_LEN],temp_ofname[OPJ_PATH_LEN]; char *temp_p, temp1[OPJ_PATH_LEN]=""; strcpy(image_filename,dirptr->filename[imageno]); fprintf(stderr,"File Number %d \"%s\"\n",imageno,image_filename); parameters->decod_format = get_file_format(image_filename); if (parameters->decod_format == -1) return 1; sprintf(infilename,"%s/%s",img_fol->imgdirpath,image_filename); strncpy(parameters->infile, infilename, sizeof(infilename)); /*Set output file*/ strcpy(temp_ofname,get_file_name(image_filename)); while((temp_p = strtok(NULL,".")) != NULL){ strcat(temp_ofname,temp1); sprintf(temp1,".%s",temp_p); } if(img_fol->set_out_format==1){ sprintf(outfilename,"%s/%s.%s",img_fol->imgdirpath,temp_ofname,img_fol->out_format); strncpy(parameters->outfile, outfilename, sizeof(outfilename)); } return 0; } static int initialise_4K_poc(opj_poc_t *POC, int numres){ POC[0].tile = 1; POC[0].resno0 = 0; POC[0].compno0 = 0; POC[0].layno1 = 1; POC[0].resno1 = numres-1; POC[0].compno1 = 3; POC[0].prg1 = CPRL; POC[1].tile = 1; POC[1].resno0 = numres-1; POC[1].compno0 = 0; POC[1].layno1 = 1; POC[1].resno1 = numres; POC[1].compno1 = 3; POC[1].prg1 = CPRL; return 2; } static void cinema_parameters(opj_cparameters_t *parameters){ parameters->tile_size_on = OPJ_FALSE; parameters->cp_tdx=1; parameters->cp_tdy=1; /*Tile part*/ parameters->tp_flag = 'C'; parameters->tp_on = 1; /*Tile and Image shall be at (0,0)*/ parameters->cp_tx0 = 0; parameters->cp_ty0 = 0; parameters->image_offset_x0 = 0; parameters->image_offset_y0 = 0; /*Codeblock size= 32*32*/ parameters->cblockw_init = 32; parameters->cblockh_init = 32; parameters->csty |= 0x01; /*The progression order shall be CPRL*/ parameters->prog_order = CPRL; /* No ROI */ parameters->roi_compno = -1; parameters->subsampling_dx = 1; parameters->subsampling_dy = 1; /* 9-7 transform */ parameters->irreversible = 1; } static void cinema_setup_encoder(opj_cparameters_t *parameters,opj_image_t *image, img_fol_t *img_fol){ int i; float temp_rate; switch (parameters->cp_cinema){ case CINEMA2K_24: case CINEMA2K_48: if(parameters->numresolution > 6){ parameters->numresolution = 6; } if (!((image->comps[0].w == 2048) | (image->comps[0].h == 1080))){ fprintf(stdout,"Image coordinates %d x %d is not 2K compliant.\nJPEG Digital Cinema Profile-3 " "(2K profile) compliance requires that at least one of coordinates match 2048 x 1080\n", image->comps[0].w,image->comps[0].h); parameters->cp_rsiz = STD_RSIZ; } break; case CINEMA4K_24: if(parameters->numresolution < 1){ parameters->numresolution = 1; }else if(parameters->numresolution > 7){ parameters->numresolution = 7; } if (!((image->comps[0].w == 4096) | (image->comps[0].h == 2160))){ fprintf(stdout,"Image coordinates %d x %d is not 4K compliant.\nJPEG Digital Cinema Profile-4" "(4K profile) compliance requires that at least one of coordinates match 4096 x 2160\n", image->comps[0].w,image->comps[0].h); parameters->cp_rsiz = STD_RSIZ; } parameters->numpocs = initialise_4K_poc(parameters->POC,parameters->numresolution); break; default : break; } switch (parameters->cp_cinema){ case CINEMA2K_24: case CINEMA4K_24: for(i=0 ; itcp_numlayers ; i++){ temp_rate = 0 ; if (img_fol->rates[i]== 0){ parameters->tcp_rates[0]= ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/ (CINEMA_24_CS * 8 * image->comps[0].dx * image->comps[0].dy); }else{ temp_rate =((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/ (img_fol->rates[i] * 8 * image->comps[0].dx * image->comps[0].dy); if (temp_rate > CINEMA_24_CS ){ parameters->tcp_rates[i]= ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/ (CINEMA_24_CS * 8 * image->comps[0].dx * image->comps[0].dy); }else{ parameters->tcp_rates[i]= img_fol->rates[i]; } } } parameters->max_comp_size = COMP_24_CS; break; case CINEMA2K_48: for(i=0 ; itcp_numlayers ; i++){ temp_rate = 0 ; if (img_fol->rates[i]== 0){ parameters->tcp_rates[0]= ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/ (CINEMA_48_CS * 8 * image->comps[0].dx * image->comps[0].dy); }else{ temp_rate =((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/ (img_fol->rates[i] * 8 * image->comps[0].dx * image->comps[0].dy); if (temp_rate > CINEMA_48_CS ){ parameters->tcp_rates[0]= ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/ (CINEMA_48_CS * 8 * image->comps[0].dx * image->comps[0].dy); }else{ parameters->tcp_rates[i]= img_fol->rates[i]; } } } parameters->max_comp_size = COMP_48_CS; break; default: break; } parameters->cp_disto_alloc = 1; } /* ------------------------------------------------------------------------------------ */ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters, img_fol_t *img_fol, raw_cparameters_t *raw_cp, char *indexfilename) { int i, j, totlen, c; opj_option_t long_option[]={ {"cinema2K",REQ_ARG, NULL ,'w'}, {"cinema4K",NO_ARG, NULL ,'y'}, {"ImgDir",REQ_ARG, NULL ,'z'}, {"TP",REQ_ARG, NULL ,'u'}, {"SOP",NO_ARG, NULL ,'S'}, {"EPH",NO_ARG, NULL ,'E'}, {"OutFor",REQ_ARG, NULL ,'O'}, {"POC",REQ_ARG, NULL ,'P'}, {"ROI",REQ_ARG, NULL ,'R'}, {"jpip",NO_ARG, NULL, 'J'} }; /* parse the command line */ const char optlist[] = "i:o:r:q:n:b:c:t:p:s:SEM:x:R:d:T:If:P:C:F:u:J" #ifdef USE_JPWL "W:" #endif /* USE_JPWL */ "h"; totlen=sizeof(long_option); img_fol->set_out_format=0; raw_cp->rawWidth = 0; do{ c = opj_getopt_long(argc, argv, optlist,long_option,totlen); if (c == -1) break; switch (c) { case 'i': /* input file */ { char *infile = opj_optarg; parameters->decod_format = get_file_format(infile); switch(parameters->decod_format) { case PGX_DFMT: case PXM_DFMT: case BMP_DFMT: case TIF_DFMT: case RAW_DFMT: case TGA_DFMT: case PNG_DFMT: break; default: fprintf(stderr, "!! Unrecognized format for infile : %s " "[accept only *.pnm, *.pgm, *.ppm, *.pgx, *png, *.bmp, *.tif, *.raw or *.tga] !!\n\n", infile); return 1; } strncpy(parameters->infile, infile, sizeof(parameters->infile)-1); } break; /* ----------------------------------------------------- */ case 'o': /* output file */ { char *outfile = opj_optarg; parameters->cod_format = get_file_format(outfile); switch(parameters->cod_format) { case J2K_CFMT: case JP2_CFMT: break; default: fprintf(stderr, "Unknown output format image %s [only *.j2k, *.j2c or *.jp2]!! \n", outfile); return 1; } strncpy(parameters->outfile, outfile, sizeof(parameters->outfile)-1); } break; /* ----------------------------------------------------- */ case 'O': /* output format */ { char outformat[50]; char *of = opj_optarg; sprintf(outformat,".%s",of); img_fol->set_out_format = 1; parameters->cod_format = get_file_format(outformat); switch(parameters->cod_format) { case J2K_CFMT: case JP2_CFMT: img_fol->out_format = opj_optarg; break; default: fprintf(stderr, "Unknown output format image [only j2k, j2c, jp2]!! \n"); return 1; } } break; /* ----------------------------------------------------- */ case 'r': /* rates rates/distorsion */ { char *s = opj_optarg; parameters->tcp_numlayers = 0; while (sscanf(s, "%f", ¶meters->tcp_rates[parameters->tcp_numlayers]) == 1) { parameters->tcp_numlayers++; while (*s && *s != ',') { s++; } if (!*s) break; s++; } parameters->cp_disto_alloc = 1; } break; /* ----------------------------------------------------- */ case 'F': /* Raw image format parameters */ { char signo; char *s = opj_optarg; if (sscanf(s, "%d,%d,%d,%d,%c", &raw_cp->rawWidth, &raw_cp->rawHeight, &raw_cp->rawComp, &raw_cp->rawBitDepth, &signo) == 5) { if (signo == 's') { raw_cp->rawSigned = OPJ_TRUE; fprintf(stdout,"\nRaw file parameters: %d,%d,%d,%d Signed\n", raw_cp->rawWidth, raw_cp->rawHeight, raw_cp->rawComp, raw_cp->rawBitDepth); } else if (signo == 'u') { raw_cp->rawSigned = OPJ_FALSE; fprintf(stdout,"\nRaw file parameters: %d,%d,%d,%d Unsigned\n", raw_cp->rawWidth, raw_cp->rawHeight, raw_cp->rawComp, raw_cp->rawBitDepth); } else { fprintf(stderr,"\nError: invalid raw image parameters: Unknown sign of raw file\n"); fprintf(stderr,"Please use the Format option -F:\n"); fprintf(stderr,"-F rawWidth,rawHeight,rawComp,rawBitDepth,s/u (Signed/Unsigned)\n"); fprintf(stderr,"Example: -i lena.raw -o lena.j2k -F 512,512,3,8,u\n"); fprintf(stderr,"Aborting\n"); } } else { fprintf(stderr,"\nError: invalid raw image parameters\n"); fprintf(stderr,"Please use the Format option -F:\n"); fprintf(stderr,"-F rawWidth,rawHeight,rawComp,rawBitDepth,s/u (Signed/Unsigned)\n"); fprintf(stderr,"Example: -i lena.raw -o lena.j2k -F 512,512,3,8,u\n"); fprintf(stderr,"Aborting\n"); return 1; } } break; /* ----------------------------------------------------- */ case 'q': /* add fixed_quality */ { char *s = opj_optarg; while (sscanf(s, "%f", ¶meters->tcp_distoratio[parameters->tcp_numlayers]) == 1) { parameters->tcp_numlayers++; while (*s && *s != ',') { s++; } if (!*s) break; s++; } parameters->cp_fixed_quality = 1; } break; /* dda */ /* ----------------------------------------------------- */ case 'f': /* mod fixed_quality (before : -q) */ { int *row = NULL, *col = NULL; int numlayers = 0, numresolution = 0, matrix_width = 0; char *s = opj_optarg; sscanf(s, "%d", &numlayers); s++; if (numlayers > 9) s++; parameters->tcp_numlayers = numlayers; numresolution = parameters->numresolution; matrix_width = numresolution * 3; parameters->cp_matrice = (int *) malloc(numlayers * matrix_width * sizeof(int)); s = s + 2; for (i = 0; i < numlayers; i++) { row = ¶meters->cp_matrice[i * matrix_width]; col = row; parameters->tcp_rates[i] = 1; sscanf(s, "%d,", &col[0]); s += 2; if (col[0] > 9) s++; col[1] = 0; col[2] = 0; for (j = 1; j < numresolution; j++) { col += 3; sscanf(s, "%d,%d,%d", &col[0], &col[1], &col[2]); s += 6; if (col[0] > 9) s++; if (col[1] > 9) s++; if (col[2] > 9) s++; } if (i < numlayers - 1) s++; } parameters->cp_fixed_alloc = 1; } break; /* ----------------------------------------------------- */ case 't': /* tiles */ { sscanf(opj_optarg, "%d,%d", ¶meters->cp_tdx, ¶meters->cp_tdy); parameters->tile_size_on = OPJ_TRUE; } break; /* ----------------------------------------------------- */ case 'n': /* resolution */ { sscanf(opj_optarg, "%d", ¶meters->numresolution); } break; /* ----------------------------------------------------- */ case 'c': /* precinct dimension */ { char sep; int res_spec = 0; char *s = opj_optarg; do { sep = 0; sscanf(s, "[%d,%d]%c", ¶meters->prcw_init[res_spec], ¶meters->prch_init[res_spec], &sep); parameters->csty |= 0x01; res_spec++; s = strpbrk(s, "]") + 2; } while (sep == ','); parameters->res_spec = res_spec; } break; /* ----------------------------------------------------- */ case 'b': /* code-block dimension */ { int cblockw_init = 0, cblockh_init = 0; sscanf(opj_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; } parameters->cblockw_init = cblockw_init; parameters->cblockh_init = cblockh_init; } break; /* ----------------------------------------------------- */ case 'x': /* creation of index file */ { char *index = opj_optarg; strncpy(indexfilename, index, OPJ_PATH_LEN); } break; /* ----------------------------------------------------- */ case 'p': /* progression order */ { char progression[4]; strncpy(progression, opj_optarg, 4); parameters->prog_order = give_progression(progression); if (parameters->prog_order == -1) { fprintf(stderr, "Unrecognized progression order " "[LRCP, RLCP, RPCL, PCRL, CPRL] !!\n"); return 1; } } break; /* ----------------------------------------------------- */ case 's': /* subsampling factor */ { if (sscanf(opj_optarg, "%d,%d", ¶meters->subsampling_dx, ¶meters->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(opj_optarg, "%d,%d", ¶meters->image_offset_x0, ¶meters->image_offset_y0) != 2) { fprintf(stderr, "-d 'coordonnate of the reference grid' argument " "error !! [-d x0,y0]\n"); return 1; } } break; /* ----------------------------------------------------- */ case 'h': /* display an help description */ encode_help_display(); return 1; /* ----------------------------------------------------- */ case 'P': /* POC */ { int numpocs = 0; /* number of progression order change (POC) default 0 */ opj_poc_t *POC = NULL; /* POC : used in case of Progression order change */ char *s = opj_optarg; POC = parameters->POC; while (sscanf(s, "T%d=%d,%d,%d,%d,%d,%4s", &POC[numpocs].tile, &POC[numpocs].resno0, &POC[numpocs].compno0, &POC[numpocs].layno1, &POC[numpocs].resno1, &POC[numpocs].compno1, POC[numpocs].progorder) == 7) { POC[numpocs].prg1 = give_progression(POC[numpocs].progorder); numpocs++; while (*s && *s != '/') { s++; } if (!*s) { break; } s++; } parameters->numpocs = numpocs; } break; /* ------------------------------------------------------ */ case 'S': /* SOP marker */ { parameters->csty |= 0x02; } break; /* ------------------------------------------------------ */ case 'E': /* EPH marker */ { parameters->csty |= 0x04; } break; /* ------------------------------------------------------ */ case 'M': /* Mode switch pas tous au point !! */ { int value = 0; if (sscanf(opj_optarg, "%d", &value) == 1) { for (i = 0; i <= 5; i++) { int cache = value & (1 << i); if (cache) parameters->mode |= (1 << i); } } } break; /* ------------------------------------------------------ */ case 'R': /* ROI */ { if (sscanf(opj_optarg, "c=%d,U=%d", ¶meters->roi_compno, ¶meters->roi_shift) != 2) { fprintf(stderr, "ROI error !! [-ROI c='compno',U='shift']\n"); return 1; } } break; /* ------------------------------------------------------ */ case 'T': /* Tile offset */ { if (sscanf(opj_optarg, "%d,%d", ¶meters->cp_tx0, ¶meters->cp_ty0) != 2) { fprintf(stderr, "-T 'tile offset' argument error !! [-T X0,Y0]"); return 1; } } break; /* ------------------------------------------------------ */ case 'C': /* add a comment */ { parameters->cp_comment = (char*)malloc(strlen(opj_optarg) + 1); if(parameters->cp_comment) { strcpy(parameters->cp_comment, opj_optarg); } } break; /* ------------------------------------------------------ */ case 'I': /* reversible or not */ { parameters->irreversible = 1; } break; /* ------------------------------------------------------ */ case 'u': /* Tile part generation*/ { parameters->tp_flag = opj_optarg[0]; parameters->tp_on = 1; } break; /* ------------------------------------------------------ */ case 'z': /* Image Directory path */ { img_fol->imgdirpath = (char*)malloc(strlen(opj_optarg) + 1); strcpy(img_fol->imgdirpath,opj_optarg); img_fol->set_imgdir=1; } break; /* ------------------------------------------------------ */ case 'w': /* Digital Cinema 2K profile compliance*/ { int fps=0; sscanf(opj_optarg,"%d",&fps); if(fps == 24){ parameters->cp_cinema = CINEMA2K_24; }else if(fps == 48 ){ parameters->cp_cinema = CINEMA2K_48; }else { fprintf(stderr,"Incorrect value!! must be 24 or 48\n"); return 1; } fprintf(stdout,"CINEMA 2K compliant codestream\n"); parameters->cp_rsiz = CINEMA2K; } break; /* ------------------------------------------------------ */ case 'y': /* Digital Cinema 4K profile compliance*/ { parameters->cp_cinema = CINEMA4K_24; fprintf(stdout,"CINEMA 4K compliant codestream\n"); parameters->cp_rsiz = CINEMA4K; } break; /* ------------------------------------------------------ */ /* UniPG>> */ #ifdef USE_JPWL /* ------------------------------------------------------ */ case 'W': /* JPWL capabilities switched on */ { char *token = NULL; int hprot, pprot, sens, addr, size, range; /* we need to enable indexing */ if (!indexfilename || !*indexfilename) { strncpy(indexfilename, JPWL_PRIVATEINDEX_NAME, OPJ_PATH_LEN); } /* search for different protection methods */ /* break the option in comma points and parse the result */ token = strtok(opj_optarg, ","); while(token != NULL) { /* search header error protection method */ if (*token == 'h') { static int tile = 0, tilespec = 0, lasttileno = 0; hprot = 1; /* predefined method */ if(sscanf(token, "h=%d", &hprot) == 1) { /* Main header, specified */ if (!((hprot == 0) || (hprot == 1) || (hprot == 16) || (hprot == 32) || ((hprot >= 37) && (hprot <= 128)))) { fprintf(stderr, "ERROR -> invalid main header protection method h = %d\n", hprot); return 1; } parameters->jpwl_hprot_MH = hprot; } else if(sscanf(token, "h%d=%d", &tile, &hprot) == 2) { /* Tile part header, specified */ if (!((hprot == 0) || (hprot == 1) || (hprot == 16) || (hprot == 32) || ((hprot >= 37) && (hprot <= 128)))) { fprintf(stderr, "ERROR -> invalid tile part header protection method h = %d\n", hprot); return 1; } if (tile < 0) { fprintf(stderr, "ERROR -> invalid tile part number on protection method t = %d\n", tile); return 1; } if (tilespec < JPWL_MAX_NO_TILESPECS) { parameters->jpwl_hprot_TPH_tileno[tilespec] = lasttileno = tile; parameters->jpwl_hprot_TPH[tilespec++] = hprot; } } else if(sscanf(token, "h%d", &tile) == 1) { /* Tile part header, unspecified */ if (tile < 0) { fprintf(stderr, "ERROR -> invalid tile part number on protection method t = %d\n", tile); return 1; } if (tilespec < JPWL_MAX_NO_TILESPECS) { parameters->jpwl_hprot_TPH_tileno[tilespec] = lasttileno = tile; parameters->jpwl_hprot_TPH[tilespec++] = hprot; } } else if (!strcmp(token, "h")) { /* Main header, unspecified */ parameters->jpwl_hprot_MH = hprot; } else { fprintf(stderr, "ERROR -> invalid protection method selection = %s\n", token); return 1; }; } /* search packet error protection method */ if (*token == 'p') { static int pack = 0, tile = 0, packspec = 0; pprot = 1; /* predefined method */ if (sscanf(token, "p=%d", &pprot) == 1) { /* Method for all tiles and all packets */ if (!((pprot == 0) || (pprot == 1) || (pprot == 16) || (pprot == 32) || ((pprot >= 37) && (pprot <= 128)))) { fprintf(stderr, "ERROR -> invalid default packet protection method p = %d\n", pprot); return 1; } parameters->jpwl_pprot_tileno[0] = 0; parameters->jpwl_pprot_packno[0] = 0; parameters->jpwl_pprot[0] = pprot; } else if (sscanf(token, "p%d=%d", &tile, &pprot) == 2) { /* method specified from that tile on */ if (!((pprot == 0) || (pprot == 1) || (pprot == 16) || (pprot == 32) || ((pprot >= 37) && (pprot <= 128)))) { fprintf(stderr, "ERROR -> invalid packet protection method p = %d\n", pprot); return 1; } if (tile < 0) { fprintf(stderr, "ERROR -> invalid tile part number on protection method p = %d\n", tile); return 1; } if (packspec < JPWL_MAX_NO_PACKSPECS) { parameters->jpwl_pprot_tileno[packspec] = tile; parameters->jpwl_pprot_packno[packspec] = 0; parameters->jpwl_pprot[packspec++] = pprot; } } else if (sscanf(token, "p%d:%d=%d", &tile, &pack, &pprot) == 3) { /* method fully specified from that tile and that packet on */ if (!((pprot == 0) || (pprot == 1) || (pprot == 16) || (pprot == 32) || ((pprot >= 37) && (pprot <= 128)))) { fprintf(stderr, "ERROR -> invalid packet protection method p = %d\n", pprot); return 1; } if (tile < 0) { fprintf(stderr, "ERROR -> invalid tile part number on protection method p = %d\n", tile); return 1; } if (pack < 0) { fprintf(stderr, "ERROR -> invalid packet number on protection method p = %d\n", pack); return 1; } if (packspec < JPWL_MAX_NO_PACKSPECS) { parameters->jpwl_pprot_tileno[packspec] = tile; parameters->jpwl_pprot_packno[packspec] = pack; parameters->jpwl_pprot[packspec++] = pprot; } } else if (sscanf(token, "p%d:%d", &tile, &pack) == 2) { /* default method from that tile and that packet on */ if (!((pprot == 0) || (pprot == 1) || (pprot == 16) || (pprot == 32) || ((pprot >= 37) && (pprot <= 128)))) { fprintf(stderr, "ERROR -> invalid packet protection method p = %d\n", pprot); return 1; } if (tile < 0) { fprintf(stderr, "ERROR -> invalid tile part number on protection method p = %d\n", tile); return 1; } if (pack < 0) { fprintf(stderr, "ERROR -> invalid packet number on protection method p = %d\n", pack); return 1; } if (packspec < JPWL_MAX_NO_PACKSPECS) { parameters->jpwl_pprot_tileno[packspec] = tile; parameters->jpwl_pprot_packno[packspec] = pack; parameters->jpwl_pprot[packspec++] = pprot; } } else if (sscanf(token, "p%d", &tile) == 1) { /* default from a tile on */ if (tile < 0) { fprintf(stderr, "ERROR -> invalid tile part number on protection method p = %d\n", tile); return 1; } if (packspec < JPWL_MAX_NO_PACKSPECS) { parameters->jpwl_pprot_tileno[packspec] = tile; parameters->jpwl_pprot_packno[packspec] = 0; parameters->jpwl_pprot[packspec++] = pprot; } } else if (!strcmp(token, "p")) { /* all default */ parameters->jpwl_pprot_tileno[0] = 0; parameters->jpwl_pprot_packno[0] = 0; parameters->jpwl_pprot[0] = pprot; } else { fprintf(stderr, "ERROR -> invalid protection method selection = %s\n", token); return 1; }; } /* search sensitivity method */ if (*token == 's') { static int tile = 0, tilespec = 0, lasttileno = 0; sens = 0; /* predefined: relative error */ if(sscanf(token, "s=%d", &sens) == 1) { /* Main header, specified */ if ((sens < -1) || (sens > 7)) { fprintf(stderr, "ERROR -> invalid main header sensitivity method s = %d\n", sens); return 1; } parameters->jpwl_sens_MH = sens; } else if(sscanf(token, "s%d=%d", &tile, &sens) == 2) { /* Tile part header, specified */ if ((sens < -1) || (sens > 7)) { fprintf(stderr, "ERROR -> invalid tile part header sensitivity method s = %d\n", sens); return 1; } if (tile < 0) { fprintf(stderr, "ERROR -> invalid tile part number on sensitivity method t = %d\n", tile); return 1; } if (tilespec < JPWL_MAX_NO_TILESPECS) { parameters->jpwl_sens_TPH_tileno[tilespec] = lasttileno = tile; parameters->jpwl_sens_TPH[tilespec++] = sens; } } else if(sscanf(token, "s%d", &tile) == 1) { /* Tile part header, unspecified */ if (tile < 0) { fprintf(stderr, "ERROR -> invalid tile part number on sensitivity method t = %d\n", tile); return 1; } if (tilespec < JPWL_MAX_NO_TILESPECS) { parameters->jpwl_sens_TPH_tileno[tilespec] = lasttileno = tile; parameters->jpwl_sens_TPH[tilespec++] = hprot; } } else if (!strcmp(token, "s")) { /* Main header, unspecified */ parameters->jpwl_sens_MH = sens; } else { fprintf(stderr, "ERROR -> invalid sensitivity method selection = %s\n", token); return 1; }; parameters->jpwl_sens_size = 2; /* 2 bytes for default size */ } /* search addressing size */ if (*token == 'a') { addr = 0; /* predefined: auto */ if(sscanf(token, "a=%d", &addr) == 1) { /* Specified */ if ((addr != 0) && (addr != 2) && (addr != 4)) { fprintf(stderr, "ERROR -> invalid addressing size a = %d\n", addr); return 1; } parameters->jpwl_sens_addr = addr; } else if (!strcmp(token, "a")) { /* default */ parameters->jpwl_sens_addr = addr; /* auto for default size */ } else { fprintf(stderr, "ERROR -> invalid addressing selection = %s\n", token); return 1; }; } /* search sensitivity size */ if (*token == 'z') { size = 1; /* predefined: 1 byte */ if(sscanf(token, "z=%d", &size) == 1) { /* Specified */ if ((size != 0) && (size != 1) && (size != 2)) { fprintf(stderr, "ERROR -> invalid sensitivity size z = %d\n", size); return 1; } parameters->jpwl_sens_size = size; } else if (!strcmp(token, "a")) { /* default */ parameters->jpwl_sens_size = size; /* 1 for default size */ } else { fprintf(stderr, "ERROR -> invalid size selection = %s\n", token); return 1; }; } /* search range method */ if (*token == 'g') { range = 0; /* predefined: 0 (packet) */ if(sscanf(token, "g=%d", &range) == 1) { /* Specified */ if ((range < 0) || (range > 3)) { fprintf(stderr, "ERROR -> invalid sensitivity range method g = %d\n", range); return 1; } parameters->jpwl_sens_range = range; } else if (!strcmp(token, "g")) { /* default */ parameters->jpwl_sens_range = range; } else { fprintf(stderr, "ERROR -> invalid range selection = %s\n", token); return 1; }; } /* next token or bust */ token = strtok(NULL, ","); }; /* some info */ fprintf(stdout, "Info: JPWL capabilities enabled\n"); parameters->jpwl_epc_on = OPJ_TRUE; } break; #endif /* USE_JPWL */ /* <jpip_on = OPJ_TRUE;*/ } break; /* ------------------------------------------------------ */ default: fprintf(stderr, "ERROR -> Command line not valid\n"); return 1; } }while(c != -1); /* check for possible errors */ if (parameters->cp_cinema){ if(parameters->tcp_numlayers > 1){ parameters->cp_rsiz = STD_RSIZ; fprintf(stdout,"Warning: DC profiles do not allow more than one quality layer. The codestream created will not be compliant with the DC profile\n"); } } if(img_fol->set_imgdir == 1){ if(!(parameters->infile[0] == 0)){ fprintf(stderr, "Error: options -ImgDir and -i cannot be used together !!\n"); return 1; } if(img_fol->set_out_format == 0){ fprintf(stderr, "Error: When -ImgDir is used, -OutFor must be used !!\n"); fprintf(stderr, "Only one format allowed! Valid formats are j2k and jp2!!\n"); return 1; } if(!((parameters->outfile[0] == 0))){ fprintf(stderr, "Error: options -ImgDir and -o cannot be used together !!\n"); fprintf(stderr, "Specify OutputFormat using -OutFor !!\n"); return 1; } }else{ if((parameters->infile[0] == 0) || (parameters->outfile[0] == 0)) { fprintf(stderr, "Example: %s -i image.ppm -o image.j2k\n",argv[0]); fprintf(stderr, " Try: %s -h\n",argv[0]); return 1; } } if (parameters->decod_format == RAW_DFMT && raw_cp->rawWidth == 0) { fprintf(stderr,"\nError: invalid raw image parameters\n"); fprintf(stderr,"Please use the Format option -F:\n"); fprintf(stderr,"-F rawWidth,rawHeight,rawComp,rawBitDepth,s/u (Signed/Unsigned)\n"); fprintf(stderr,"Example: -i lena.raw -o lena.j2k -F 512,512,3,8,u\n"); fprintf(stderr,"Aborting\n"); return 1; } if ((parameters->cp_disto_alloc || parameters->cp_fixed_alloc || parameters->cp_fixed_quality) && (!(parameters->cp_disto_alloc ^ parameters->cp_fixed_alloc ^ parameters->cp_fixed_quality))) { fprintf(stderr, "Error: options -r -q and -f cannot be used together !!\n"); return 1; } /* mod fixed_quality */ /* if no rate entered, lossless by default */ if (parameters->tcp_numlayers == 0) { parameters->tcp_rates[0] = 0; /* MOD antonin : losslessbug */ parameters->tcp_numlayers++; parameters->cp_disto_alloc = 1; } if((parameters->cp_tx0 > parameters->image_offset_x0) || (parameters->cp_ty0 > parameters->image_offset_y0)) { fprintf(stderr, "Error: Tile offset dimension is unnappropriate --> TX0(%d)<=IMG_X0(%d) TYO(%d)<=IMG_Y0(%d) \n", parameters->cp_tx0, parameters->image_offset_x0, parameters->cp_ty0, parameters->image_offset_y0); return 1; } for (i = 0; i < parameters->numpocs; i++) { if (parameters->POC[i].prg == -1) { fprintf(stderr, "Unrecognized progression order in option -P (POC n %d) [LRCP, RLCP, RPCL, PCRL, CPRL] !!\n", i + 1); } } return 0; } /* -------------------------------------------------------------------------- */ /** sample error callback expecting a FILE* client object */ static void error_callback(const char *msg, void *client_data) { FILE *stream = (FILE*)client_data; fprintf(stream, "[ERROR] %s", msg); } /** sample warning callback expecting a FILE* client object */ static void warning_callback(const char *msg, void *client_data) { FILE *stream = (FILE*)client_data; fprintf(stream, "[WARNING] %s", msg); } /** sample debug callback expecting a FILE* client object */ static void info_callback(const char *msg, void *client_data) { FILE *stream = (FILE*)client_data; fprintf(stream, "[INFO] %s", msg); } /* -------------------------------------------------------------------------- */ int main(int argc, char **argv) { opj_bool bSuccess; opj_cparameters_t parameters; /* compression parameters */ img_fol_t img_fol; opj_event_mgr_t event_mgr; /* event manager */ opj_image_t *image = NULL; int i,num_images; int imageno; dircnt_t *dirptr = NULL; raw_cparameters_t raw_cp; opj_codestream_info_t cstr_info; /* Codestream information structure */ char indexfilename[OPJ_PATH_LEN]; /* index file name */ /* configure the event callbacks (not required) setting of each callback is optionnal */ memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); event_mgr.error_handler = error_callback; event_mgr.warning_handler = warning_callback; event_mgr.info_handler = info_callback; /* set encoding parameters to default values */ opj_set_default_encoder_parameters(¶meters); /* Initialize indexfilename and img_fol */ *indexfilename = 0; memset(&img_fol,0,sizeof(img_fol_t)); /* parse input and get user encoding parameters */ if(parse_cmdline_encoder(argc, argv, ¶meters,&img_fol, &raw_cp, indexfilename) == 1) { return 1; } if (parameters.cp_cinema){ img_fol.rates = (float*)malloc(parameters.tcp_numlayers * sizeof(float)); for(i=0; i< parameters.tcp_numlayers; i++){ img_fol.rates[i] = parameters.tcp_rates[i]; } cinema_parameters(¶meters); } /* Create comment for codestream */ if(parameters.cp_comment == NULL) { const char comment[] = "Created by OpenJPEG version "; const size_t clen = strlen(comment); const char *version = opj_version(); /* UniPG>> */ #ifdef USE_JPWL parameters.cp_comment = (char*)malloc(clen+strlen(version)+11); sprintf(parameters.cp_comment,"%s%s with JPWL", comment, version); #else parameters.cp_comment = (char*)malloc(clen+strlen(version)+1); sprintf(parameters.cp_comment,"%s%s", comment, version); #endif /* <filename_buf = (char*)malloc(num_images*OPJ_PATH_LEN*sizeof(char)); /* Stores at max 10 image file names*/ dirptr->filename = (char**) malloc(num_images*sizeof(char*)); if(!dirptr->filename_buf){ return 0; } for(i=0;ifilename[i] = dirptr->filename_buf + i*OPJ_PATH_LEN; } } if(load_images(dirptr,img_fol.imgdirpath)==1){ return 0; } if (num_images==0){ fprintf(stdout,"Folder is empty\n"); return 0; } }else{ num_images=1; } /*Encoding image one by one*/ for(imageno=0;imagenonumcomps == 3 ? 1 : 0; if(parameters.cp_cinema){ cinema_setup_encoder(¶meters,image,&img_fol); } /* encode the destination image */ /* ---------------------------- */ if (parameters.cod_format == J2K_CFMT) { /* J2K format output */ int codestream_length; size_t res; opj_cio_t *cio = NULL; FILE *f = NULL; /* get a J2K compressor handle */ opj_cinfo_t* cinfo = opj_create_compress(CODEC_J2K); /* catch events using our callbacks and give a local context */ opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr); /* setup the encoder parameters using the current image and user parameters */ opj_setup_encoder(cinfo, ¶meters, image); /* open a byte stream for writing */ /* allocate memory for all tiles */ cio = opj_cio_open((opj_common_ptr)cinfo, NULL, 0); /* encode the image */ if (*indexfilename) /* If need to extract codestream information*/ bSuccess = opj_encode_with_info(cinfo, cio, image, &cstr_info); else bSuccess = opj_encode(cinfo, cio, image, NULL); if (!bSuccess) { opj_cio_close(cio); fprintf(stderr, "failed to encode image\n"); return 1; } codestream_length = cio_tell(cio); /* write the buffer to disk */ f = fopen(parameters.outfile, "wb"); if (!f) { fprintf(stderr, "failed to open %s for writing\n", parameters.outfile); return 1; } res = fwrite(cio->buffer, 1, codestream_length, f); if( res < (size_t)codestream_length ) { /* FIXME */ fprintf(stderr, "failed to write %d (%s)\n", codestream_length, parameters.outfile); return 1; } fclose(f); fprintf(stderr,"Generated outfile %s\n",parameters.outfile); /* close and free the byte stream */ opj_cio_close(cio); /* Write the index to disk */ if (*indexfilename) { bSuccess = write_index_file(&cstr_info, indexfilename); if (bSuccess) { fprintf(stderr, "Failed to output index file into [%s]\n", indexfilename); } } /* free remaining compression structures */ opj_destroy_compress(cinfo); if (*indexfilename) opj_destroy_cstr_info(&cstr_info); } else { /* JP2 format output */ int codestream_length; size_t res; opj_cio_t *cio = NULL; FILE *f = NULL; opj_cinfo_t *cinfo = NULL; /* get a JP2 compressor handle */ cinfo = opj_create_compress(CODEC_JP2); /* catch events using our callbacks and give a local context */ opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr); /* setup the encoder parameters using the current image and using user parameters */ opj_setup_encoder(cinfo, ¶meters, image); /* open a byte stream for writing */ /* allocate memory for all tiles */ cio = opj_cio_open((opj_common_ptr)cinfo, NULL, 0); /* encode the image */ if (*indexfilename /*|| parameters.jpip_on*/) /* If need to extract codestream information*/ bSuccess = opj_encode_with_info(cinfo, cio, image, &cstr_info); else bSuccess = opj_encode(cinfo, cio, image, NULL); if (!bSuccess) { opj_cio_close(cio); fprintf(stderr, "failed to encode image\n"); return 1; } codestream_length = cio_tell(cio); /* write the buffer to disk */ f = fopen(parameters.outfile, "wb"); if (!f) { fprintf(stderr, "failed to open %s for writing\n", parameters.outfile); return 1; } res = fwrite(cio->buffer, 1, codestream_length, f); if( res < (size_t)codestream_length ) { /* FIXME */ fprintf(stderr, "failed to write %d (%s)\n", codestream_length, parameters.outfile); return 1; } fclose(f); fprintf(stderr,"Generated outfile %s\n",parameters.outfile); /* close and free the byte stream */ opj_cio_close(cio); /* Write the index to disk */ if (*indexfilename) { bSuccess = write_index_file(&cstr_info, indexfilename); if (bSuccess) { fprintf(stderr, "Failed to output index file\n"); } } /* free remaining compression structures */ opj_destroy_compress(cinfo); if (*indexfilename) opj_destroy_cstr_info(&cstr_info); } /* free image data */ opj_image_destroy(image); } /* free user parameters structure */ if(parameters.cp_comment) free(parameters.cp_comment); if(parameters.cp_matrice) free(parameters.cp_matrice); return 0; } openjpeg-2.1.0/src/bin/jpwl/index.h000644 001750 001750 00000004162 12327650567 020266 0ustar00mathieumathieu000000 000000 /* * 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. */ #ifndef __J2K_INDEX_H #define __J2K_INDEX_H #ifdef __cplusplus extern "C" { #endif /** 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 */ openjpeg-2.1.0/src/bin/jpwl/windirent.h000644 001750 001750 00000053510 12327650567 021163 0ustar00mathieumathieu000000 000000 /* * uce-dirent.h - operating system independent dirent implementation * * Copyright (C) 1998-2002 Toni Ronkko * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * ``Software''), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL TONI RONKKO BE LIABLE FOR ANY CLAIM, DAMAGES OR * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. * * * May 28 1998, Toni Ronkko * * $Id: uce-dirent.h,v 1.7 2002/05/13 10:48:35 tr Exp $ * * $Log: uce-dirent.h,v $ * Revision 1.7 2002/05/13 10:48:35 tr * embedded some source code directly to the header so that no source * modules need to be included in the MS Visual C project using the * interface, removed all the dependencies to other headers of the `uce' * library so that the header can be made public * * Revision 1.6 2002/04/12 16:22:04 tr * Unified Compiling Environment (UCE) replaced `std' library * * Revision 1.5 2001/07/20 16:33:40 tr * moved to `std' library and re-named defines accordingly * * Revision 1.4 2001/07/10 16:47:18 tronkko * revised comments * * Revision 1.3 2001/01/11 13:16:43 tr * using ``uce-machine.h'' for finding out defines such as `FREEBSD' * * Revision 1.2 2000/10/08 16:00:41 tr * copy of FreeBSD man page * * Revision 1.1 2000/07/10 05:53:16 tr * Initial revision * * Revision 1.2 1998/07/19 18:29:14 tr * Added error reporting capabilities and some asserts. * * Revision 1.1 1998/07/04 16:27:51 tr * Initial revision * * * MSVC 1.0 scans automatic dependencies incorrectly when your project * contains this very header. The problem is that MSVC cannot handle * include directives inside #if..#endif block those are never entered. * Since this header ought to compile in many different operating systems, * there had to be several conditional blocks that are compiled only in * operating systems for what they were designed for. MSVC 1.0 cannot * handle inclusion of sys/dir.h in a part that is compiled only in Apollo * operating system. To fix the problem you need to insert DIR.H into * SYSINCL.DAT located in MSVC\BIN directory and restart visual C++. * Consult manuals for more informaton about the problem. * * Since many UNIX systems have dirent.h we assume to have one also. * However, if your UNIX system does not have dirent.h you can download one * for example at: http://ftp.uni-mannheim.de/ftp/GNU/dirent/dirent.tar.gz. * You can also see if you have one of dirent.h, direct.h, dir.h, ndir.h, * sys/dir.h and sys/ndir.h somewhere. Try defining HAVE_DIRENT_H, * HAVE_DIRECT_H, HAVE_DIR_H, HAVE_NDIR_H, HAVE_SYS_DIR_H and * HAVE_SYS_NDIR_H according to the files found. */ #ifndef DIRENT_H #define DIRENT_H #define DIRENT_H_INCLUDED /* find out platform */ #if defined(MSDOS) /* MS-DOS */ #elif defined(__MSDOS__) /* Turbo C/Borland */ # define MSDOS #elif defined(__DOS__) /* Watcom */ # define MSDOS #endif #if defined(WIN32) /* MS-Windows */ #elif defined(__NT__) /* Watcom */ # define WIN32 #elif defined(_WIN32) /* Microsoft */ # define WIN32 #elif defined(__WIN32__) /* Borland */ # define WIN32 #endif /* * See what kind of dirent interface we have unless autoconf has already * determinated that. */ #if !defined(HAVE_DIRENT_H) && !defined(HAVE_DIRECT_H) && !defined(HAVE_SYS_DIR_H) && !defined(HAVE_NDIR_H) && !defined(HAVE_SYS_NDIR_H) && !defined(HAVE_DIR_H) # if defined(_MSC_VER) /* Microsoft C/C++ */ /* no dirent.h */ # elif defined(__MINGW32__) /* MinGW */ /* no dirent.h */ # elif defined(__BORLANDC__) /* Borland C/C++ */ # define HAVE_DIRENT_H # define VOID_CLOSEDIR # elif defined(__TURBOC__) /* Borland Turbo C */ /* no dirent.h */ # elif defined(__WATCOMC__) /* Watcom C/C++ */ # define HAVE_DIRECT_H # elif defined(__apollo) /* Apollo */ # define HAVE_SYS_DIR_H # elif defined(__hpux) /* HP-UX */ # define HAVE_DIRENT_H # elif (defined(__alpha) || defined(__alpha__)) && !defined(__linux__) /* Alpha OSF1 */ # error "not implemented" # elif defined(__sgi) /* Silicon Graphics */ # define HAVE_DIRENT_H # elif defined(sun) || defined(__sun) /* Sun Solaris */ # define HAVE_DIRENT_H # elif defined(__FreeBSD__) /* FreeBSD */ # define HAVE_DIRENT_H # elif defined(__linux__) /* Linux */ # define HAVE_DIRENT_H # elif defined(__GNUC__) /* GNU C/C++ */ # define HAVE_DIRENT_H # else # error "not implemented" # endif #endif /* include proper interface headers */ #if defined(HAVE_DIRENT_H) # include # ifdef FREEBSD # define NAMLEN(dp) ((int)((dp)->d_namlen)) # else # define NAMLEN(dp) ((int)(strlen((dp)->d_name))) # endif #elif defined(HAVE_NDIR_H) # include # define NAMLEN(dp) ((int)((dp)->d_namlen)) #elif defined(HAVE_SYS_NDIR_H) # include # define NAMLEN(dp) ((int)((dp)->d_namlen)) #elif defined(HAVE_DIRECT_H) # include # define NAMLEN(dp) ((int)((dp)->d_namlen)) #elif defined(HAVE_DIR_H) # include # define NAMLEN(dp) ((int)((dp)->d_namlen)) #elif defined(HAVE_SYS_DIR_H) # include # include # ifndef dirent # define dirent direct # endif # define NAMLEN(dp) ((int)((dp)->d_namlen)) #elif defined(MSDOS) || defined(WIN32) /* figure out type of underlaying directory interface to be used */ # if defined(WIN32) # define DIRENT_WIN32_INTERFACE # elif defined(MSDOS) # define DIRENT_MSDOS_INTERFACE # else # error "missing native dirent interface" # endif /*** WIN32 specifics ***/ # if defined(DIRENT_WIN32_INTERFACE) # include # if !defined(DIRENT_MAXNAMLEN) # define DIRENT_MAXNAMLEN (MAX_PATH) # endif /*** MS-DOS specifics ***/ # elif defined(DIRENT_MSDOS_INTERFACE) # include /* Borland defines file length macros in dir.h */ # if defined(__BORLANDC__) # include # if !defined(DIRENT_MAXNAMLEN) # define DIRENT_MAXNAMLEN ((MAXFILE)+(MAXEXT)) # endif # if !defined(_find_t) # define _find_t find_t # endif /* Turbo C defines ffblk structure in dir.h */ # elif defined(__TURBOC__) # include # if !defined(DIRENT_MAXNAMLEN) # define DIRENT_MAXNAMLEN ((MAXFILE)+(MAXEXT)) # endif # define DIRENT_USE_FFBLK /* MSVC */ # elif defined(_MSC_VER) # if !defined(DIRENT_MAXNAMLEN) # define DIRENT_MAXNAMLEN (12) # endif /* Watcom */ # elif defined(__WATCOMC__) # if !defined(DIRENT_MAXNAMLEN) # if defined(__OS2__) || defined(__NT__) # define DIRENT_MAXNAMLEN (255) # else # define DIRENT_MAXNAMLEN (12) # endif # endif # endif # endif /*** generic MS-DOS and MS-Windows stuff ***/ # if !defined(NAME_MAX) && defined(DIRENT_MAXNAMLEN) # define NAME_MAX DIRENT_MAXNAMLEN # endif # if NAME_MAX < DIRENT_MAXNAMLEN # error "assertion failed: NAME_MAX >= DIRENT_MAXNAMLEN" # endif /* * Substitute for real dirent structure. Note that `d_name' field is a * true character array although we have it copied in the implementation * dependent data. We could save some memory if we had declared `d_name' * as a pointer refering the name within implementation dependent data. * We have not done that since some code may rely on sizeof(d_name) to be * something other than four. Besides, directory entries are typically so * small that it takes virtually no time to copy them from place to place. */ typedef struct dirent { char d_name[NAME_MAX + 1]; /*** Operating system specific part ***/ # if defined(DIRENT_WIN32_INTERFACE) /*WIN32*/ WIN32_FIND_DATA data; # elif defined(DIRENT_MSDOS_INTERFACE) /*MSDOS*/ # if defined(DIRENT_USE_FFBLK) struct ffblk data; # else struct _find_t data; # endif # endif } dirent; /* DIR substitute structure containing directory name. The name is * essential for the operation of ``rewinndir'' function. */ typedef struct DIR { char *dirname; /* directory being scanned */ dirent current; /* current entry */ int dirent_filled; /* is current un-processed? */ /*** Operating system specific part ***/ # if defined(DIRENT_WIN32_INTERFACE) HANDLE search_handle; # elif defined(DIRENT_MSDOS_INTERFACE) # endif } DIR; # ifdef __cplusplus extern "C" { # endif /* supply prototypes for dirent functions */ static DIR *opendir (const char *dirname); static struct dirent *readdir (DIR *dirp); static int closedir (DIR *dirp); static void rewinddir (DIR *dirp); /* * Implement dirent interface as static functions so that the user does not * need to change his project in any way to use dirent function. With this * it is sufficient to include this very header from source modules using * dirent functions and the functions will be pulled in automatically. */ #include #include #include #include #include /* use ffblk instead of _find_t if requested */ #if defined(DIRENT_USE_FFBLK) # define _A_ARCH (FA_ARCH) # define _A_HIDDEN (FA_HIDDEN) # define _A_NORMAL (0) # define _A_RDONLY (FA_RDONLY) # define _A_SUBDIR (FA_DIREC) # define _A_SYSTEM (FA_SYSTEM) # define _A_VOLID (FA_LABEL) # define _dos_findnext(dest) findnext(dest) # define _dos_findfirst(name,flags,dest) findfirst(name,dest,flags) #endif static int _initdir (DIR *p); static const char *_getdirname (const struct dirent *dp); static void _setdirname (struct DIR *dirp); /* * * open directory stream for reading * DIR *opendir (const char *dirname); * * Open named directory stream for read and return pointer to the * internal working area that is used for retrieving individual directory * entries. The internal working area has no fields of your interest. * * Returns a pointer to the internal working area or NULL in case the * directory stream could not be opened. Global `errno' variable will set * in case of error as follows: * * * [EACESS |Permission denied. * [EMFILE |Too many open files used by the process. * [ENFILE |Too many open files in system. * [ENOENT |Directory does not exist. * [ENOMEM |Insufficient memory. * [ENOTDIR |dirname does not refer to directory. This value is not * reliable on MS-DOS and MS-Windows platforms. Many * implementations return ENOENT even when the name refers to a * file.] *
*
*/ static DIR *opendir(const char *dirname) { DIR *dirp; assert (dirname != NULL); dirp = (DIR*)malloc (sizeof (struct DIR)); if (dirp != NULL) { char *p; /* allocate room for directory name */ dirp->dirname = (char*) malloc (strlen (dirname) + 1 + strlen ("\\*.*")); if (dirp->dirname == NULL) { /* failed to duplicate directory name. errno set by malloc() */ free (dirp); return NULL; } /* Copy directory name while appending directory separator and "*.*". * Directory separator is not appended if the name already ends with * drive or directory separator. Directory separator is assumed to be * '/' or '\' and drive separator is assumed to be ':'. */ strcpy (dirp->dirname, dirname); p = strchr (dirp->dirname, '\0'); if (dirp->dirname < p && *(p - 1) != '\\' && *(p - 1) != '/' && *(p - 1) != ':') { strcpy (p++, "\\"); } # ifdef DIRENT_WIN32_INTERFACE strcpy (p, "*"); /*scan files with and without extension in win32*/ # else strcpy (p, "*.*"); /*scan files with and without extension in DOS*/ # endif /* open stream */ if (_initdir (dirp) == 0) { /* initialization failed */ free (dirp->dirname); free (dirp); return NULL; } } return dirp; } /* * * read a directory entry * struct dirent *readdir (DIR *dirp); * * Read individual directory entry and return pointer to a structure * containing the name of the entry. Individual directory entries returned * include normal files, sub-directories, pseudo-directories "." and ".." * and also volume labels, hidden files and system files in MS-DOS and * MS-Windows. You might want to use stat(2) function to determinate which * one are you dealing with. Many dirent implementations already contain * equivalent information in dirent structure but you cannot depend on * this. * * The dirent structure contains several system dependent fields that * generally have no interest to you. The only interesting one is char * d_name[] that is also portable across different systems. The d_name * field contains the name of the directory entry without leading path. * While d_name is portable across different systems the actual storage * capacity of d_name varies from system to system and there is no portable * way to find out it at compile time as different systems define the * capacity of d_name with different macros and some systems do not define * capacity at all (besides actual declaration of the field). If you really * need to find out storage capacity of d_name then you might want to try * NAME_MAX macro. The NAME_MAX is defined in POSIX standard althought * there are many MS-DOS and MS-Windows implementations those do not define * it. There are also systems that declare d_name as "char d_name[1]" and * then allocate suitable amount of memory at run-time. Thanks to Alain * Decamps (Alain.Decamps@advalvas.be) for pointing it out to me. * * This all leads to the fact that it is difficult to allocate space * for the directory names when the very same program is being compiled on * number of operating systems. Therefore I suggest that you always * allocate space for directory names dynamically. * * * Returns a pointer to a structure containing name of the directory entry * in `d_name' field or NULL if there was an error. In case of an error the * global `errno' variable will set as follows: * * * [EBADF |dir parameter refers to an invalid directory stream. This value * is not set reliably on all implementations.] *
*
*/ static struct dirent * readdir (DIR *dirp) { assert(dirp != NULL); if (dirp == NULL) { errno = EBADF; return NULL; } #if defined(DIRENT_WIN32_INTERFACE) if (dirp->search_handle == INVALID_HANDLE_VALUE) { /* directory stream was opened/rewound incorrectly or it ended normally */ errno = EBADF; return NULL; } #endif if (dirp->dirent_filled != 0) { /* * Directory entry has already been retrieved and there is no need to * retrieve a new one. Directory entry will be retrieved in advance * when the user calls readdir function for the first time. This is so * because real dirent has separate functions for opening and reading * the stream whereas Win32 and DOS dirents open the stream * automatically when we retrieve the first file. Therefore, we have to * save the first file when opening the stream and later we have to * return the saved entry when the user tries to read the first entry. */ dirp->dirent_filled = 0; } else { /* fill in entry and return that */ #if defined(DIRENT_WIN32_INTERFACE) if (FindNextFile (dirp->search_handle, &dirp->current.data) == FALSE) { /* Last file has been processed or an error occured */ FindClose (dirp->search_handle); dirp->search_handle = INVALID_HANDLE_VALUE; errno = ENOENT; return NULL; } # elif defined(DIRENT_MSDOS_INTERFACE) if (_dos_findnext (&dirp->current.data) != 0) { /* _dos_findnext and findnext will set errno to ENOENT when no * more entries could be retrieved. */ return NULL; } # endif _setdirname (dirp); assert (dirp->dirent_filled == 0); } return &dirp->current; } /* * * close directory stream. * int closedir (DIR *dirp); * * Close directory stream opened by the `opendir' function. Close of * directory stream invalidates the DIR structure as well as previously read * dirent entry. * * The function typically returns 0 on success and -1 on failure but * the function may be declared to return void on same systems. At least * Borland C/C++ and some UNIX implementations use void as a return type. * The dirent wrapper tries to define VOID_CLOSEDIR whenever closedir is * known to return nothing. The very same definition is made by the GNU * autoconf if you happen to use it. * * The global `errno' variable will set to EBADF in case of error. * */ static int closedir (DIR *dirp) { int retcode = 0; /* make sure that dirp points to legal structure */ assert (dirp != NULL); if (dirp == NULL) { errno = EBADF; return -1; } /* free directory name and search handles */ if (dirp->dirname != NULL) free (dirp->dirname); #if defined(DIRENT_WIN32_INTERFACE) if (dirp->search_handle != INVALID_HANDLE_VALUE) { if (FindClose (dirp->search_handle) == FALSE) { /* Unknown error */ retcode = -1; errno = EBADF; } } #endif /* clear dirp structure to make sure that it cannot be used anymore*/ memset (dirp, 0, sizeof (*dirp)); # if defined(DIRENT_WIN32_INTERFACE) dirp->search_handle = INVALID_HANDLE_VALUE; # endif free (dirp); return retcode; } /* * * rewind directory stream to the beginning * void rewinddir (DIR *dirp); * * Rewind directory stream to the beginning so that the next call of * readdir() returns the very first directory entry again. However, note * that next call of readdir() may not return the same directory entry as it * did in first time. The directory stream may have been affected by newly * created files. * * Almost every dirent implementation ensure that rewinddir will update * the directory stream to reflect any changes made to the directory entries * since the previous ``opendir'' or ``rewinddir'' call. Keep an eye on * this if your program depends on the feature. I know at least one dirent * implementation where you are required to close and re-open the stream to * see the changes. * * Returns nothing. If something went wrong while rewinding, you will * notice it later when you try to retrieve the first directory entry. */ static void rewinddir (DIR *dirp) { /* make sure that dirp is legal */ assert (dirp != NULL); if (dirp == NULL) { errno = EBADF; return; } assert (dirp->dirname != NULL); /* close previous stream */ #if defined(DIRENT_WIN32_INTERFACE) if (dirp->search_handle != INVALID_HANDLE_VALUE) { if (FindClose (dirp->search_handle) == FALSE) { /* Unknown error */ errno = EBADF; } } #endif /* re-open previous stream */ if (_initdir (dirp) == 0) { /* initialization failed but we cannot deal with error. User will notice * error later when she tries to retrieve first directory enty. */ /*EMPTY*/; } } /* * Open native directory stream object and retrieve first file. * Be sure to close previous stream before opening new one. */ static int _initdir (DIR *dirp) { assert (dirp != NULL); assert (dirp->dirname != NULL); dirp->dirent_filled = 0; # if defined(DIRENT_WIN32_INTERFACE) /* Open stream and retrieve first file */ dirp->search_handle = FindFirstFile (dirp->dirname, &dirp->current.data); if (dirp->search_handle == INVALID_HANDLE_VALUE) { /* something went wrong but we don't know what. GetLastError() could * give us more information about the error, but then we should map * the error code into errno. */ errno = ENOENT; return 0; } # elif defined(DIRENT_MSDOS_INTERFACE) if (_dos_findfirst (dirp->dirname, _A_SUBDIR | _A_RDONLY | _A_ARCH | _A_SYSTEM | _A_HIDDEN, &dirp->current.data) != 0) { /* _dos_findfirst and findfirst will set errno to ENOENT when no * more entries could be retrieved. */ return 0; } # endif /* initialize DIR and it's first entry */ _setdirname (dirp); dirp->dirent_filled = 1; return 1; } /* * Return implementation dependent name of the current directory entry. */ static const char * _getdirname (const struct dirent *dp) { #if defined(DIRENT_WIN32_INTERFACE) return dp->data.cFileName; #elif defined(DIRENT_USE_FFBLK) return dp->data.ff_name; #else return dp->data.name; #endif } /* * Copy name of implementation dependent directory entry to the d_name field. */ static void _setdirname (struct DIR *dirp) { /* make sure that d_name is long enough */ assert (strlen (_getdirname (&dirp->current)) <= NAME_MAX); strncpy (dirp->current.d_name, _getdirname (&dirp->current), NAME_MAX); dirp->current.d_name[NAME_MAX] = '\0'; /*char d_name[NAME_MAX+1]*/ } # ifdef __cplusplus } # endif # define NAMLEN(dp) ((int)(strlen((dp)->d_name))) #else # error "missing dirent interface" #endif #endif /*DIRENT_H*/ openjpeg-2.1.0/src/bin/jpwl/convert.c000644 001750 001750 00000261117 12327650567 020637 0ustar00mathieumathieu000000 000000 /* * 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 #include #include #include #ifdef OPJ_HAVE_LIBTIFF #include #endif /* OPJ_HAVE_LIBTIFF */ #ifdef OPJ_HAVE_LIBPNG #include #include #endif /* OPJ_HAVE_LIBPNG */ #include "openjpeg.h" #include "convert.h" /* * Get logarithm of an integer and round downwards. * * log2(a) */ static int int_floorlog2(int a) { int l; for (l = 0; a > 1; l++) { a >>= 1; } return l; } /* -->> -->> -->> -->> TGA IMAGE FORMAT <<-- <<-- <<-- <<-- */ #ifdef INFORMATION_ONLY /* TGA header definition. */ struct tga_header { unsigned char id_length; /* Image id field length */ unsigned char colour_map_type; /* Colour map type */ unsigned char image_type; /* Image type */ /* ** Colour map specification */ unsigned short colour_map_index; /* First entry index */ unsigned short colour_map_length; /* Colour map length */ unsigned char colour_map_entry_size; /* Colour map entry size */ /* ** Image specification */ unsigned short x_origin; /* x origin of image */ unsigned short y_origin; /* u origin of image */ unsigned short image_width; /* Image width */ unsigned short image_height; /* Image height */ unsigned char pixel_depth; /* Pixel depth */ unsigned char image_desc; /* Image descriptor */ }; #endif /* INFORMATION_ONLY */ static unsigned short get_ushort(unsigned short val) { #ifdef OPJ_BIG_ENDIAN return( ((val & 0xff) << 8) + (val >> 8) ); #else return( val ); #endif } #define TGA_HEADER_SIZE 18 static int tga_readheader(FILE *fp, unsigned int *bits_per_pixel, unsigned int *width, unsigned int *height, int *flip_image) { int palette_size; unsigned char *tga ; unsigned char id_len, cmap_type, image_type; unsigned char pixel_depth, image_desc; unsigned short cmap_index, cmap_len, cmap_entry_size; unsigned short x_origin, y_origin, image_w, image_h; if (!bits_per_pixel || !width || !height || !flip_image) return 0; tga = (unsigned char*)malloc(18); if ( fread(tga, TGA_HEADER_SIZE, 1, fp) != 1 ) { fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); return 0 ; } id_len = (unsigned char)tga[0]; cmap_type = (unsigned char)tga[1]; image_type = (unsigned char)tga[2]; cmap_index = get_ushort(*(unsigned short*)(&tga[3])); cmap_len = get_ushort(*(unsigned short*)(&tga[5])); cmap_entry_size = (unsigned char)tga[7]; x_origin = get_ushort(*(unsigned short*)(&tga[8])); y_origin = get_ushort(*(unsigned short*)(&tga[10])); image_w = get_ushort(*(unsigned short*)(&tga[12])); image_h = get_ushort(*(unsigned short*)(&tga[14])); pixel_depth = (unsigned char)tga[16]; image_desc = (unsigned char)tga[17]; free(tga); *bits_per_pixel = (unsigned int)pixel_depth; *width = (unsigned int)image_w; *height = (unsigned int)image_h; /* Ignore tga identifier, if present ... */ if (id_len) { unsigned char *id = (unsigned char *) malloc(id_len); if ( !fread(id, id_len, 1, fp) ) { fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); free(id); return 0 ; } free(id); } /* Test for compressed formats ... not yet supported ... // Note :- 9 - RLE encoded palettized. // 10 - RLE encoded RGB. */ if (image_type > 8) { fprintf(stderr, "Sorry, compressed tga files are not currently supported.\n"); return 0 ; } *flip_image = !(image_desc & 32); /* Palettized formats are not yet supported, skip over the palette, if present ... */ palette_size = cmap_len * (cmap_entry_size/8); if (palette_size>0) { fprintf(stderr, "File contains a palette - not yet supported."); fseek(fp, palette_size, SEEK_CUR); } return 1; } #ifdef OPJ_BIG_ENDIAN static inline int16_t swap16(int16_t x) { return((((u_int16_t)x & 0x00ffU) << 8) | (((u_int16_t)x & 0xff00U) >> 8)); } #endif static int tga_writeheader(FILE *fp, int bits_per_pixel, int width, int height, opj_bool flip_image) { unsigned short image_w, image_h, us0; unsigned char uc0, image_type; unsigned char pixel_depth, image_desc; if (!bits_per_pixel || !width || !height) return 0; pixel_depth = 0; if ( bits_per_pixel < 256 ) pixel_depth = (unsigned char)bits_per_pixel; else{ fprintf(stderr,"ERROR: Wrong bits per pixel inside tga_header"); return 0; } uc0 = 0; if(fwrite(&uc0, 1, 1, fp) != 1) goto fails; /* id_length */ if(fwrite(&uc0, 1, 1, fp) != 1) goto fails; /* colour_map_type */ image_type = 2; /* Uncompressed. */ if(fwrite(&image_type, 1, 1, fp) != 1) goto fails; us0 = 0; if(fwrite(&us0, 2, 1, fp) != 1) goto fails; /* colour_map_index */ if(fwrite(&us0, 2, 1, fp) != 1) goto fails; /* colour_map_length */ if(fwrite(&uc0, 1, 1, fp) != 1) goto fails; /* colour_map_entry_size */ if(fwrite(&us0, 2, 1, fp) != 1) goto fails; /* x_origin */ if(fwrite(&us0, 2, 1, fp) != 1) goto fails; /* y_origin */ image_w = (unsigned short)width; image_h = (unsigned short) height; #ifndef OPJ_BIG_ENDIAN if(fwrite(&image_w, 2, 1, fp) != 1) goto fails; if(fwrite(&image_h, 2, 1, fp) != 1) goto fails; #else image_w = swap16(image_w); image_h = swap16(image_h); if(fwrite(&image_w, 2, 1, fp) != 1) goto fails; if(fwrite(&image_h, 2, 1, fp) != 1) goto fails; #endif if(fwrite(&pixel_depth, 1, 1, fp) != 1) goto fails; image_desc = 8; /* 8 bits per component. */ if (flip_image) image_desc |= 32; if(fwrite(&image_desc, 1, 1, fp) != 1) goto fails; return 1; fails: fputs("\nwrite_tgaheader: write ERROR\n", stderr); return 0; } opj_image_t* tgatoimage(const char *filename, opj_cparameters_t *parameters) { FILE *f; opj_image_t *image; unsigned int image_width, image_height, pixel_bit_depth; unsigned int x, y; int flip_image=0; opj_image_cmptparm_t cmptparm[4]; /* maximum 4 components */ int numcomps; OPJ_COLOR_SPACE color_space; opj_bool mono ; opj_bool save_alpha; int subsampling_dx, subsampling_dy; int i; f = fopen(filename, "rb"); if (!f) { fprintf(stderr, "Failed to open %s for reading !!\n", filename); return 0; } if (!tga_readheader(f, &pixel_bit_depth, &image_width, &image_height, &flip_image)) return NULL; /* We currently only support 24 & 32 bit tga's ... */ if (!((pixel_bit_depth == 24) || (pixel_bit_depth == 32))) return NULL; /* initialize image components */ memset(&cmptparm[0], 0, 4 * sizeof(opj_image_cmptparm_t)); mono = (pixel_bit_depth == 8) || (pixel_bit_depth == 16); /* Mono with & without alpha. */ save_alpha = (pixel_bit_depth == 16) || (pixel_bit_depth == 32); /* Mono with alpha, or RGB with alpha */ if (mono) { color_space = CLRSPC_GRAY; numcomps = save_alpha ? 2 : 1; } else { numcomps = save_alpha ? 4 : 3; color_space = CLRSPC_SRGB; } subsampling_dx = parameters->subsampling_dx; subsampling_dy = parameters->subsampling_dy; for (i = 0; i < numcomps; i++) { cmptparm[i].prec = 8; cmptparm[i].bpp = 8; cmptparm[i].sgnd = 0; cmptparm[i].dx = subsampling_dx; cmptparm[i].dy = subsampling_dy; cmptparm[i].w = image_width; cmptparm[i].h = image_height; } /* create the image */ image = opj_image_create(numcomps, &cmptparm[0], color_space); if (!image) return NULL; /* set image offset and reference grid */ image->x0 = parameters->image_offset_x0; image->y0 = parameters->image_offset_y0; image->x1 = !image->x0 ? (image_width - 1) * subsampling_dx + 1 : image->x0 + (image_width - 1) * subsampling_dx + 1; image->y1 = !image->y0 ? (image_height - 1) * subsampling_dy + 1 : image->y0 + (image_height - 1) * subsampling_dy + 1; /* set image data */ for (y=0; y < image_height; y++) { int index; if (flip_image) index = (image_height-y-1)*image_width; else index = y*image_width; if (numcomps==3) { for (x=0;xcomps[0].data[index]=r; image->comps[1].data[index]=g; image->comps[2].data[index]=b; index++; } } else if (numcomps==4) { for (x=0;xcomps[0].data[index]=r; image->comps[1].data[index]=g; image->comps[2].data[index]=b; image->comps[3].data[index]=a; index++; } } else { fprintf(stderr, "Currently unsupported bit depth : %s\n", filename); } } return image; } int imagetotga(opj_image_t * image, const char *outfile) { int width, height, bpp, x, y; opj_bool write_alpha; int i, adjustR, adjustG, adjustB; unsigned int alpha_channel; float r,g,b,a; unsigned char value; float scale; FILE *fdest; size_t res; fdest = fopen(outfile, "wb"); if (!fdest) { fprintf(stderr, "ERROR -> failed to open %s for writing\n", outfile); return 1; } for (i = 0; i < image->numcomps-1; i++) { if ((image->comps[0].dx != image->comps[i+1].dx) ||(image->comps[0].dy != image->comps[i+1].dy) ||(image->comps[0].prec != image->comps[i+1].prec)) { fprintf(stderr, "Unable to create a tga file with such J2K image charateristics."); return 1; } } width = image->comps[0].w; height = image->comps[0].h; /* Mono with alpha, or RGB with alpha. */ write_alpha = (image->numcomps==2) || (image->numcomps==4); /* Write TGA header */ bpp = write_alpha ? 32 : 24; if (!tga_writeheader(fdest, bpp, width , height, OPJ_TRUE)) return 1; alpha_channel = image->numcomps-1; scale = 255.0f / (float)((1<comps[0].prec)-1); adjustR = (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0); adjustG = (image->comps[1].sgnd ? 1 << (image->comps[1].prec - 1) : 0); adjustB = (image->comps[2].sgnd ? 1 << (image->comps[2].prec - 1) : 0); for (y=0; y < height; y++) { unsigned int index=y*width; for (x=0; x < width; x++, index++) { r = (float)(image->comps[0].data[index] + adjustR); if (image->numcomps>2) { g = (float)(image->comps[1].data[index] + adjustG); b = (float)(image->comps[2].data[index] + adjustB); } else {/* Greyscale ... */ g = r; b = r; } /* TGA format writes BGR ... */ value = (unsigned char)(b*scale); res = fwrite(&value,1,1,fdest); if( res < 1 ) { fprintf(stderr, "failed to write 1 byte for %s\n", outfile); return 1; } value = (unsigned char)(g*scale); res = fwrite(&value,1,1,fdest); if( res < 1 ) { fprintf(stderr, "failed to write 1 byte for %s\n", outfile); return 1; } value = (unsigned char)(r*scale); res = fwrite(&value,1,1,fdest); if( res < 1 ) { fprintf(stderr, "failed to write 1 byte for %s\n", outfile); return 1; } if (write_alpha) { a = (float)(image->comps[alpha_channel].data[index]); value = (unsigned char)(a*scale); res = fwrite(&value,1,1,fdest); if( res < 1 ) { fprintf(stderr, "failed to write 1 byte for %s\n", outfile); return 1; } } } } return 0; } /* -->> -->> -->> -->> BMP IMAGE FORMAT <<-- <<-- <<-- <<-- */ /* WORD defines a two byte word */ typedef unsigned short int WORD; /* DWORD defines a four byte word */ typedef unsigned int DWORD; typedef struct { WORD bfType; /* 'BM' for Bitmap (19776) */ DWORD bfSize; /* Size of the file */ WORD bfReserved1; /* Reserved : 0 */ WORD bfReserved2; /* Reserved : 0 */ DWORD bfOffBits; /* Offset */ } BITMAPFILEHEADER_t; typedef struct { DWORD biSize; /* Size of the structure in bytes */ DWORD biWidth; /* Width of the image in pixels */ DWORD biHeight; /* Heigth of the image in pixels */ WORD biPlanes; /* 1 */ WORD biBitCount; /* Number of color bits by pixels */ DWORD biCompression; /* Type of encoding 0: none 1: RLE8 2: RLE4 */ DWORD biSizeImage; /* Size of the image in bytes */ DWORD biXpelsPerMeter; /* Horizontal (X) resolution in pixels/meter */ DWORD biYpelsPerMeter; /* Vertical (Y) resolution in pixels/meter */ DWORD biClrUsed; /* Number of color used in the image (0: ALL) */ DWORD biClrImportant; /* Number of important color (0: ALL) */ } BITMAPINFOHEADER_t; opj_image_t* bmptoimage(const char *filename, opj_cparameters_t *parameters) { int subsampling_dx = parameters->subsampling_dx; int subsampling_dy = parameters->subsampling_dy; int i, numcomps, w, h; OPJ_COLOR_SPACE color_space; opj_image_cmptparm_t cmptparm[3]; /* maximum of 3 components */ opj_image_t * image = NULL; FILE *IN; BITMAPFILEHEADER_t File_h; BITMAPINFOHEADER_t Info_h; unsigned char *RGB; unsigned char *table_R, *table_G, *table_B; unsigned int j, PAD = 0; int x, y, index; int gray_scale = 1; int has_color; DWORD W, H; IN = fopen(filename, "rb"); if (!IN) { fprintf(stderr, "Failed to open %s for reading !!\n", filename); return NULL; } File_h.bfType = getc(IN); File_h.bfType = (getc(IN) << 8) + File_h.bfType; if (File_h.bfType != 19778) { fprintf(stderr,"Error, not a BMP file!\n"); fclose(IN); return NULL; } /* 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; if(Info_h.biSize != 40) { fprintf(stderr,"Error, unknown BMP header size %d\n", Info_h.biSize); fclose(IN); return NULL; } 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) { numcomps = 3; color_space = CLRSPC_SRGB; /* initialize image components */ memset(&cmptparm[0], 0, 3 * sizeof(opj_image_cmptparm_t)); for(i = 0; i < numcomps; i++) { cmptparm[i].prec = 8; cmptparm[i].bpp = 8; cmptparm[i].sgnd = 0; cmptparm[i].dx = subsampling_dx; cmptparm[i].dy = subsampling_dy; cmptparm[i].w = w; cmptparm[i].h = h; } /* create the image */ image = opj_image_create(numcomps, &cmptparm[0], color_space); if(!image) { fclose(IN); return NULL; } /* set image offset and reference grid */ image->x0 = parameters->image_offset_x0; image->y0 = parameters->image_offset_y0; image->x1 = !image->x0 ? (w - 1) * subsampling_dx + 1 : image->x0 + (w - 1) * subsampling_dx + 1; image->y1 = !image->y0 ? (h - 1) * subsampling_dy + 1 : image->y0 + (h - 1) * subsampling_dy + 1; /* set image data */ /* 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; /* PAD = 4 - (3 * W) % 4; */ /* PAD = (PAD == 4) ? 0 : PAD; */ PAD = (3 * W) % 4 ? 4 - (3 * W) % 4 : 0; RGB = (unsigned char *) malloc((3 * W + PAD) * H * sizeof(unsigned char)); if ( fread(RGB, sizeof(unsigned char), (3 * W + PAD) * H, IN) != (3 * W + PAD) * H ) { free(RGB); opj_image_destroy(image); fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); return NULL; } index = 0; for(y = 0; y < (int)H; y++) { unsigned char *scanline = RGB + (3 * W + PAD) * (H - 1 - y); for(x = 0; x < (int)W; x++) { unsigned char *pixel = &scanline[3 * x]; image->comps[0].data[index] = pixel[2]; /* R */ image->comps[1].data[index] = pixel[1]; /* G */ image->comps[2].data[index] = pixel[0]; /* B */ index++; } } free(RGB); }/* if (Info_h.biBitCount == 24) */ else if (Info_h.biBitCount == 8 && Info_h.biCompression == 0)/*RGB */ { if(Info_h.biClrUsed == 0) Info_h.biClrUsed = 256; else if(Info_h.biClrUsed > 256) Info_h.biClrUsed = 256; 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)); has_color = 0; for (j = 0; j < Info_h.biClrUsed; j++) { table_B[j] = (unsigned char)getc(IN); table_G[j] = (unsigned char)getc(IN); table_R[j] = (unsigned char)getc(IN); getc(IN); has_color += !(table_R[j] == table_G[j] && table_R[j] == table_B[j]); } if(has_color) 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++; numcomps = gray_scale ? 1 : 3; color_space = gray_scale ? CLRSPC_GRAY : CLRSPC_SRGB; /* initialize image components */ memset(&cmptparm[0], 0, 3 * sizeof(opj_image_cmptparm_t)); for(i = 0; i < numcomps; i++) { cmptparm[i].prec = 8; cmptparm[i].bpp = 8; cmptparm[i].sgnd = 0; cmptparm[i].dx = subsampling_dx; cmptparm[i].dy = subsampling_dy; cmptparm[i].w = w; cmptparm[i].h = h; } /* create the image */ image = opj_image_create(numcomps, &cmptparm[0], color_space); if(!image) { fclose(IN); free(table_R); free(table_G); free(table_B); return NULL; } /* set image offset and reference grid */ image->x0 = parameters->image_offset_x0; image->y0 = parameters->image_offset_y0; image->x1 = !image->x0 ? (w - 1) * subsampling_dx + 1 : image->x0 + (w - 1) * subsampling_dx + 1; image->y1 = !image->y0 ? (h - 1) * subsampling_dy + 1 : image->y0 + (h - 1) * subsampling_dy + 1; /* set image data */ RGB = (unsigned char *) malloc(W * H * sizeof(unsigned char)); if ( fread(RGB, sizeof(unsigned char), W * H, IN) != W * H ) { free(table_R); free(table_G); free(table_B); free(RGB); opj_image_destroy(image); fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); return NULL; } if (gray_scale) { index = 0; for (j = 0; j < W * H; j++) { if ((j % W < W - 1 && Info_h.biWidth % 2) || !(Info_h.biWidth % 2)) { image->comps[0].data[index] = table_R[RGB[W * H - ((j) / (W) + 1) * W + (j) % (W)]]; index++; } } } else { index = 0; for (j = 0; j < W * H; j++) { if ((j % W < W - 1 && Info_h.biWidth % 2) || !(Info_h.biWidth % 2)) { unsigned char pixel_index = RGB[W * H - ((j) / (W) + 1) * W + (j) % (W)]; image->comps[0].data[index] = table_R[pixel_index]; image->comps[1].data[index] = table_G[pixel_index]; image->comps[2].data[index] = table_B[pixel_index]; index++; } } } free(RGB); free(table_R); free(table_G); free(table_B); }/* RGB8 */ else if (Info_h.biBitCount == 8 && Info_h.biCompression == 1)/*RLE8*/ { unsigned char *pix, *beyond; int *gray, *red, *green, *blue; unsigned int x, y, max; int i, c, c1; unsigned char uc; if (Info_h.biClrUsed == 0) Info_h.biClrUsed = 256; else if (Info_h.biClrUsed > 256) Info_h.biClrUsed = 256; 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)); has_color = 0; for (j = 0; j < Info_h.biClrUsed; j++) { table_B[j] = (unsigned char)getc(IN); table_G[j] = (unsigned char)getc(IN); table_R[j] = (unsigned char)getc(IN); getc(IN); has_color += !(table_R[j] == table_G[j] && table_R[j] == table_B[j]); } if (has_color) gray_scale = 0; numcomps = gray_scale ? 1 : 3; color_space = gray_scale ? CLRSPC_GRAY : CLRSPC_SRGB; /* initialize image components */ memset(&cmptparm[0], 0, 3 * sizeof(opj_image_cmptparm_t)); for (i = 0; i < numcomps; i++) { cmptparm[i].prec = 8; cmptparm[i].bpp = 8; cmptparm[i].sgnd = 0; cmptparm[i].dx = subsampling_dx; cmptparm[i].dy = subsampling_dy; cmptparm[i].w = w; cmptparm[i].h = h; } /* create the image */ image = opj_image_create(numcomps, &cmptparm[0], color_space); if (!image) { fclose(IN); free(table_R); free(table_G); free(table_B); return NULL; } /* set image offset and reference grid */ image->x0 = parameters->image_offset_x0; image->y0 = parameters->image_offset_y0; image->x1 = !image->x0 ? (w - 1) * subsampling_dx + 1 : image->x0 + (w - 1) * subsampling_dx + 1; image->y1 = !image->y0 ? (h - 1) * subsampling_dy + 1 : image->y0 + (h - 1) * subsampling_dy + 1; /* set image data */ /* 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; RGB = (unsigned char *) calloc(1, W * H * sizeof(unsigned char)); beyond = RGB + W * H; pix = beyond - W; x = y = 0; while (y < H) { c = getc(IN); if (c) { c1 = getc(IN); for (i = 0; i < c && x < W && pix < beyond; i++, x++, pix++) *pix = (unsigned char)c1; } else { c = getc(IN); if (c == 0x00) /* EOL */ { x = 0; ++y; pix = RGB + x + (H - y - 1) * W; } else if (c == 0x01) /* EOP */ break; else if (c == 0x02) /* MOVE by dxdy */ { c = getc(IN); x += c; c = getc(IN); y += c; pix = RGB + (H - y - 1) * W + x; } else /* 03 .. 255 */ { i = 0; for (; i < c && x < W && pix < beyond; i++, x++, pix++) { c1 = getc(IN); *pix = (unsigned char)c1; } if (c & 1) /* skip padding byte */ getc(IN); } } }/* while() */ if (gray_scale) { gray = image->comps[0].data; pix = RGB; max = W * H; while (max--) { uc = *pix++; *gray++ = table_R[uc]; } } else { /*int *red, *green, *blue;*/ red = image->comps[0].data; green = image->comps[1].data; blue = image->comps[2].data; pix = RGB; max = W * H; while (max--) { uc = *pix++; *red++ = table_R[uc]; *green++ = table_G[uc]; *blue++ = table_B[uc]; } } free(RGB); free(table_R); free(table_G); free(table_B); }/* RLE8 */ else { fprintf(stderr, "Other system than 24 bits/pixels or 8 bits (no RLE coding) " "is not yet implemented [%d]\n", Info_h.biBitCount); } 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 precision: %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 = image->comps[0].w; h = image->comps[0].h; fprintf(fdest, "BM"); /* FILE HEADER */ /* ------------- */ fprintf(fdest, "%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(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", (unsigned char) ((w) & 0xff), (unsigned char) ((w) >> 8) & 0xff, (unsigned char) ((w) >> 16) & 0xff, (unsigned char) ((w) >> 24) & 0xff); fprintf(fdest, "%c%c%c%c", (unsigned char) ((h) & 0xff), (unsigned char) ((h) >> 8) & 0xff, (unsigned char) ((h) >> 16) & 0xff, (unsigned char) ((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", (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(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 = 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 = 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 = 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++) { unsigned char 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 = (unsigned char)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 = (unsigned char)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 = (unsigned char)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"); w = image->comps[0].w; h = image->comps[0].h; fprintf(fdest, "BM"); /* FILE HEADER */ /* ------------- */ fprintf(fdest, "%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(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", (unsigned char) ((w) & 0xff), (unsigned char) ((w) >> 8) & 0xff, (unsigned char) ((w) >> 16) & 0xff, (unsigned char) ((w) >> 24) & 0xff); fprintf(fdest, "%c%c%c%c", (unsigned char) ((h) & 0xff), (unsigned char) ((h) >> 8) & 0xff, (unsigned char) ((h) >> 16) & 0xff, (unsigned char) ((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", (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(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 = 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", (unsigned char)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; } /* -->> -->> -->> -->> PGX IMAGE FORMAT <<-- <<-- <<-- <<-- */ static unsigned char readuchar(FILE * f) { unsigned char c1; if ( !fread(&c1, 1, 1, f) ) { fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); return 0; } return c1; } static unsigned short readushort(FILE * f, int bigendian) { unsigned char c1, c2; if ( !fread(&c1, 1, 1, f) ) { fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); return 0; } if ( !fread(&c2, 1, 1, f) ) { fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); return 0; } if (bigendian) return (c1 << 8) + c2; else return (c2 << 8) + c1; } static unsigned int readuint(FILE * f, int bigendian) { unsigned char c1, c2, c3, c4; if ( !fread(&c1, 1, 1, f) ) { fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); return 0; } if ( !fread(&c2, 1, 1, f) ) { fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); return 0; } if ( !fread(&c3, 1, 1, f) ) { fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); return 0; } if ( !fread(&c4, 1, 1, f) ) { fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); return 0; } if (bigendian) return (c1 << 24) + (c2 << 16) + (c3 << 8) + c4; else return (c4 << 24) + (c3 << 16) + (c2 << 8) + c1; } opj_image_t* pgxtoimage(const char *filename, opj_cparameters_t *parameters) { FILE *f = NULL; int w, h, prec; int i, numcomps, max; OPJ_COLOR_SPACE color_space; opj_image_cmptparm_t cmptparm; /* maximum of 1 component */ opj_image_t * image = NULL; int adjustS, ushift, dshift, force8; char endian1,endian2,sign; char signtmp[32]; char temp[32]; int bigendian; opj_image_comp_t *comp = NULL; numcomps = 1; color_space = CLRSPC_GRAY; memset(&cmptparm, 0, sizeof(opj_image_cmptparm_t)); max = 0; f = fopen(filename, "rb"); if (!f) { fprintf(stderr, "Failed to open %s for reading !\n", filename); return NULL; } fseek(f, 0, SEEK_SET); if( fscanf(f, "PG%[ \t]%c%c%[ \t+-]%d%[ \t]%d%[ \t]%d",temp,&endian1,&endian2,signtmp,&prec,temp,&w,temp,&h) != 9){ fprintf(stderr, "ERROR: Failed to read the right number of element from the fscanf() function!\n"); return NULL; } i=0; sign='+'; while (signtmp[i]!='\0') { if (signtmp[i]=='-') sign='-'; i++; } fgetc(f); if (endian1=='M' && endian2=='L') { bigendian = 1; } else if (endian2=='M' && endian1=='L') { bigendian = 0; } else { fprintf(stderr, "Bad pgx header, please check input file\n"); return NULL; } /* initialize image component */ cmptparm.x0 = parameters->image_offset_x0; cmptparm.y0 = parameters->image_offset_y0; cmptparm.w = !cmptparm.x0 ? (w - 1) * parameters->subsampling_dx + 1 : cmptparm.x0 + (w - 1) * parameters->subsampling_dx + 1; cmptparm.h = !cmptparm.y0 ? (h - 1) * parameters->subsampling_dy + 1 : cmptparm.y0 + (h - 1) * parameters->subsampling_dy + 1; if (sign == '-') { cmptparm.sgnd = 1; } else { cmptparm.sgnd = 0; } if(prec < 8) { force8 = 1; ushift = 8 - prec; dshift = prec - ushift; if(cmptparm.sgnd) adjustS = (1<<(prec - 1)); else adjustS = 0; cmptparm.sgnd = 0; prec = 8; } else ushift = dshift = force8 = adjustS = 0; cmptparm.prec = prec; cmptparm.bpp = prec; cmptparm.dx = parameters->subsampling_dx; cmptparm.dy = parameters->subsampling_dy; /* create the image */ image = opj_image_create(numcomps, &cmptparm, color_space); if(!image) { fclose(f); return NULL; } /* set image offset and reference grid */ image->x0 = cmptparm.x0; image->y0 = cmptparm.x0; image->x1 = cmptparm.w; image->y1 = cmptparm.h; /* set image data */ comp = &image->comps[0]; for (i = 0; i < w * h; i++) { int v; if(force8) { v = readuchar(f) + adjustS; v = (v<>dshift); comp->data[i] = (unsigned char)v; if(v > max) max = v; continue; } 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; comp->data[i] = v; } fclose(f); comp->bpp = int_floorlog2(max) + 1; return image; } int imagetopgx(opj_image_t * image, const char *outfile) { int w, h; int i, j, compno; FILE *fdest = NULL; for (compno = 0; compno < image->numcomps; compno++) { opj_image_comp_t *comp = &image->comps[compno]; char bname[256]; /* buffer for name */ char *name = bname; /* pointer */ int nbytes = 0; size_t res; const size_t olen = strlen(outfile); const size_t dotpos = olen - 4; const size_t total = dotpos + 1 + 1 + 4; /* '-' + '[1-3]' + '.pgx' */ if( outfile[dotpos] != '.' ) { /* `pgx` was recognized but there is no dot at expected position */ fprintf(stderr, "ERROR -> Impossible happen." ); return 1; } if( total > 256 ) { name = (char*)malloc(total+1); } strncpy(name, outfile, dotpos); /*if (image->numcomps > 1) {*/ sprintf(name+dotpos, "_%d.pgx", compno); /*} else { strcpy(name+dotpos, ".pgx"); }*/ fdest = fopen(name, "wb"); if (!fdest) { fprintf(stderr, "ERROR -> failed to open %s for writing\n", name); return 1; } /* dont need name anymore */ if( total > 256 ) { free(name); } w = image->comps[compno].w; h = image->comps[compno].h; fprintf(fdest, "PG ML %c %d %d %d\n", comp->sgnd ? '-' : '+', comp->prec, w, h); if (comp->prec <= 8) { nbytes = 1; } else if (comp->prec <= 16) { nbytes = 2; } else { nbytes = 4; } for (i = 0; i < w * h; i++) { int v = image->comps[compno].data[i]; for (j = nbytes - 1; j >= 0; j--) { char byte = (char) (v >> (j * 8)); res = fwrite(&byte, 1, 1, fdest); if( res < 1 ) { fprintf(stderr, "failed to write 1 byte for %s\n", name); return 1; } } } fclose(fdest); } return 0; } /* -->> -->> -->> -->> PNM IMAGE FORMAT <<-- <<-- <<-- <<-- */ struct pnm_header { int width, height, maxval, depth, format; char rgb, rgba, gray, graya, bw; char ok; }; static char *skip_white(char *s) { while(*s) { if(*s == '\n' || *s == '\r') return NULL; if(isspace(*s)) { ++s; continue; } return s; } return NULL; } static char *skip_int(char *start, int *out_n) { char *s; char c; *out_n = 0; s = start; s = skip_white(start); if(s == NULL) return NULL; start = s; while(*s) { if( !isdigit(*s)) break; ++s; } c = *s; *s = 0; *out_n = atoi(start); *s = c; return s; } static char *skip_idf(char *start, char out_idf[256]) { char *s; char c; s = skip_white(start); if(s == NULL) return NULL; start = s; while(*s) { if(isalpha(*s) || *s == '_') { ++s; continue; } break; } c = *s; *s = 0; strncpy(out_idf, start, 255); *s = c; return s; } static void read_pnm_header(FILE *reader, struct pnm_header *ph) { char *s; int format, have_wh, end, ttype; char idf[256], type[256]; char line[256]; if (fgets(line, 250, reader) == NULL) { fprintf(stderr,"\nWARNING: fgets return a NULL value"); return; } if(line[0] != 'P') { fprintf(stderr,"read_pnm_header:PNM:magic P missing\n"); return; } format = atoi(line + 1); if(format < 1 || format > 7) { fprintf(stderr,"read_pnm_header:magic format %d invalid\n", format); return; } ph->format = format; ttype = end = have_wh = 0; while(fgets(line, 250, reader)) { if(*line == '#') continue; s = line; if(format == 7) { s = skip_idf(s, idf); if(s == NULL || *s == 0) return; if(strcmp(idf, "ENDHDR") == 0) { end = 1; break; } if(strcmp(idf, "WIDTH") == 0) { s = skip_int(s, &ph->width); if(s == NULL || *s == 0) return; continue; } if(strcmp(idf, "HEIGHT") == 0) { s = skip_int(s, &ph->height); if(s == NULL || *s == 0) return; continue; } if(strcmp(idf, "DEPTH") == 0) { s = skip_int(s, &ph->depth); if(s == NULL || *s == 0) return; continue; } if(strcmp(idf, "MAXVAL") == 0) { s = skip_int(s, &ph->maxval); if(s == NULL || *s == 0) return; continue; } if(strcmp(idf, "TUPLTYPE") == 0) { s = skip_idf(s, type); if(s == NULL || *s == 0) return; if(strcmp(type, "BLACKANDWHITE") == 0) { ph->bw = 1; ttype = 1; continue; } if(strcmp(type, "GRAYSCALE") == 0) { ph->gray = 1; ttype = 1; continue; } if(strcmp(type, "GRAYSCALE_ALPHA") == 0) { ph->graya = 1; ttype = 1; continue; } if(strcmp(type, "RGB") == 0) { ph->rgb = 1; ttype = 1; continue; } if(strcmp(type, "RGB_ALPHA") == 0) { ph->rgba = 1; ttype = 1; continue; } fprintf(stderr,"read_pnm_header:unknown P7 TUPLTYPE %s\n",type); return; } fprintf(stderr,"read_pnm_header:unknown P7 idf %s\n",idf); return; } /* if(format == 7) */ if( !have_wh) { s = skip_int(s, &ph->width); s = skip_int(s, &ph->height); have_wh = 1; if(format == 1 || format == 4) break; continue; } if(format == 2 || format == 3 || format == 5 || format == 6) { /* P2, P3, P5, P6: */ s = skip_int(s, &ph->maxval); if(ph->maxval > 65535) return; } break; }/* while(fgets( ) */ if(format == 2 || format == 3 || format > 4) { if(ph->maxval < 1 || ph->maxval > 65535) return; } if(ph->width < 1 || ph->height < 1) return; if(format == 7) { if(!end) { fprintf(stderr,"read_pnm_header:P7 without ENDHDR\n"); return; } if(ph->depth < 1 || ph->depth > 4) return; if(ph->width && ph->height && ph->depth & ph->maxval && ttype) ph->ok = 1; } else { if(format != 1 && format != 4) { if(ph->width && ph->height && ph->maxval) ph->ok = 1; } else { if(ph->width && ph->height) ph->ok = 1; ph->maxval = 255; } } } static int has_prec(int val) { if(val < 2) return 1; if(val < 4) return 2; if(val < 8) return 3; if(val < 16) return 4; if(val < 32) return 5; if(val < 64) return 6; if(val < 128) return 7; if(val < 256) return 8; if(val < 512) return 9; if(val < 1024) return 10; if(val < 2048) return 11; if(val < 4096) return 12; if(val < 8192) return 13; if(val < 16384) return 14; if(val < 32768) return 15; return 16; } opj_image_t* pnmtoimage(const char *filename, opj_cparameters_t *parameters) { int subsampling_dx = parameters->subsampling_dx; int subsampling_dy = parameters->subsampling_dy; FILE *fp = NULL; int i, compno, numcomps, w, h, prec, format; OPJ_COLOR_SPACE color_space; opj_image_cmptparm_t cmptparm[4]; /* RGBA: max. 4 components */ opj_image_t * image = NULL; struct pnm_header header_info; if((fp = fopen(filename, "rb")) == NULL) { fprintf(stderr, "pnmtoimage:Failed to open %s for reading!\n",filename); return NULL; } memset(&header_info, 0, sizeof(struct pnm_header)); read_pnm_header(fp, &header_info); if(!header_info.ok) { fclose(fp); return NULL; } format = header_info.format; switch(format) { case 1: /* ascii bitmap */ case 4: /* raw bitmap */ numcomps = 1; break; case 2: /* ascii greymap */ case 5: /* raw greymap */ numcomps = 1; break; case 3: /* ascii pixmap */ case 6: /* raw pixmap */ numcomps = 3; break; case 7: /* arbitrary map */ numcomps = header_info.depth; break; default: fclose(fp); return NULL; } if(numcomps < 3) color_space = CLRSPC_GRAY;/* GRAY, GRAYA */ else color_space = CLRSPC_SRGB;/* RGB, RGBA */ prec = has_prec(header_info.maxval); if(prec < 8) prec = 8; w = header_info.width; h = header_info.height; subsampling_dx = parameters->subsampling_dx; subsampling_dy = parameters->subsampling_dy; memset(&cmptparm[0], 0, numcomps * sizeof(opj_image_cmptparm_t)); for(i = 0; i < numcomps; i++) { cmptparm[i].prec = prec; cmptparm[i].bpp = prec; cmptparm[i].sgnd = 0; cmptparm[i].dx = subsampling_dx; cmptparm[i].dy = subsampling_dy; cmptparm[i].w = w; cmptparm[i].h = h; } image = opj_image_create(numcomps, &cmptparm[0], color_space); if(!image) { fclose(fp); return NULL; } /* set image offset and reference grid */ image->x0 = parameters->image_offset_x0; image->y0 = parameters->image_offset_y0; image->x1 = parameters->image_offset_x0 + (w - 1) * subsampling_dx + 1; image->y1 = parameters->image_offset_y0 + (h - 1) * subsampling_dy + 1; if((format == 2) || (format == 3)) /* ascii pixmap */ { unsigned int index; for (i = 0; i < w * h; i++) { for(compno = 0; compno < numcomps; compno++) { index = 0; if (fscanf(fp, "%u", &index) != 1) fprintf(stderr, "\nWARNING: fscanf return a number of element different from the expected.\n"); image->comps[compno].data[i] = (index * 255)/header_info.maxval; } } } else if((format == 5) || (format == 6) ||((format == 7) && ( header_info.gray || header_info.graya || header_info.rgb || header_info.rgba)))/* binary pixmap */ { unsigned char c0, c1, one; one = (prec < 9); for (i = 0; i < w * h; i++) { for(compno = 0; compno < numcomps; compno++) { if ( !fread(&c0, 1, 1, fp) ) fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); if(one) { image->comps[compno].data[i] = c0; } else { if ( !fread(&c1, 1, 1, fp) ) fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); /* netpbm: */ image->comps[compno].data[i] = ((c0<<8) | c1); } } } } else if(format == 1) /* ascii bitmap */ { for (i = 0; i < w * h; i++) { unsigned int index; if ( fscanf(fp, "%u", &index) != 1) fprintf(stderr, "\nWARNING: fscanf return a number of element different from the expected.\n"); image->comps[0].data[i] = (index?0:255); } } else if(format == 4) { int x, y, bit; unsigned char uc; i = 0; for(y = 0; y < h; ++y) { bit = -1; uc = 0; for(x = 0; x < w; ++x) { if(bit == -1) { bit = 7; uc = (unsigned char)getc(fp); } image->comps[0].data[i] = (((uc>>bit) & 1)?0:255); --bit; ++i; } } } else if((format == 7 && header_info.bw)) /*MONO*/ { unsigned char uc; for(i = 0; i < w * h; ++i) { if ( !fread(&uc, 1, 1, fp) ) fprintf(stderr, "\nError: fread return a number of element different from the expected.\n"); image->comps[0].data[i] = (uc & 1)?0:255; } } fclose(fp); return image; }/* pnmtoimage() */ int imagetopnm(opj_image_t * image, const char *outfile) { int *red, *green, *blue, *alpha; int wr, hr, max; int i, compno, ncomp; int adjustR, adjustG, adjustB, adjustA; int fails, two, want_gray, has_alpha, triple; int prec, v; FILE *fdest = NULL; const char *tmp = outfile; char *destname; alpha = NULL; if((prec = image->comps[0].prec) > 16) { fprintf(stderr,"%s:%d:imagetopnm\n\tprecision %d is larger than 16" "\n\t: refused.\n",__FILE__,__LINE__,prec); return 1; } two = has_alpha = 0; fails = 1; ncomp = image->numcomps; while (*tmp) ++tmp; tmp -= 2; want_gray = (*tmp == 'g' || *tmp == 'G'); ncomp = image->numcomps; if(want_gray) ncomp = 1; if (ncomp == 2 /* GRAYA */ || (ncomp > 2 /* RGB, RGBA */ && 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 )) { fdest = fopen(outfile, "wb"); if (!fdest) { fprintf(stderr, "ERROR -> failed to open %s for writing\n", outfile); return fails; } two = (prec > 8); triple = (ncomp > 2); wr = image->comps[0].w; hr = image->comps[0].h; max = (1<comps[0].data; if(triple) { green = image->comps[1].data; blue = image->comps[2].data; } else green = blue = NULL; if(has_alpha) { const char *tt = (triple?"RGB_ALPHA":"GRAYSCALE_ALPHA"); fprintf(fdest, "P7\n# OpenJPEG-%s\nWIDTH %d\nHEIGHT %d\nDEPTH %d\n" "MAXVAL %d\nTUPLTYPE %s\nENDHDR\n", opj_version(), wr, hr, ncomp, max, tt); alpha = image->comps[ncomp - 1].data; adjustA = (image->comps[ncomp - 1].sgnd ? 1 << (image->comps[ncomp - 1].prec - 1) : 0); } else { fprintf(fdest, "P6\n# OpenJPEG-%s\n%d %d\n%d\n", opj_version(), wr, hr, max); adjustA = 0; } adjustR = (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0); if(triple) { adjustG = (image->comps[1].sgnd ? 1 << (image->comps[1].prec - 1) : 0); adjustB = (image->comps[2].sgnd ? 1 << (image->comps[2].prec - 1) : 0); } else adjustG = adjustB = 0; for(i = 0; i < wr * hr; ++i) { if(two) { v = *red + adjustR; ++red; /* netpbm: */ fprintf(fdest, "%c%c",(unsigned char)(v>>8), (unsigned char)v); if(triple) { v = *green + adjustG; ++green; /* netpbm: */ fprintf(fdest, "%c%c",(unsigned char)(v>>8), (unsigned char)v); v = *blue + adjustB; ++blue; /* netpbm: */ fprintf(fdest, "%c%c",(unsigned char)(v>>8), (unsigned char)v); }/* if(triple) */ if(has_alpha) { v = *alpha + adjustA; ++alpha; /* netpbm: */ fprintf(fdest, "%c%c",(unsigned char)(v>>8), (unsigned char)v); } continue; } /* if(two) */ /* prec <= 8: */ fprintf(fdest, "%c", (unsigned char)*red++); if(triple) fprintf(fdest, "%c%c",(unsigned char)*green++, (unsigned char)*blue++); if(has_alpha) fprintf(fdest, "%c", (unsigned char)*alpha++); } /* for(i */ fclose(fdest); return 0; } /* YUV or MONO: */ if (image->numcomps > ncomp) { fprintf(stderr,"WARNING -> [PGM file] Only the first component\n"); fprintf(stderr," is written to the file\n"); } destname = (char*)malloc(strlen(outfile) + 8); for (compno = 0; compno < ncomp; compno++) { if (ncomp > 1) sprintf(destname, "%d.%s", compno, outfile); else sprintf(destname, "%s", outfile); fdest = fopen(destname, "wb"); if (!fdest) { fprintf(stderr, "ERROR -> failed to open %s for writing\n", destname); free(destname); return 1; } wr = image->comps[compno].w; hr = image->comps[compno].h; prec = image->comps[compno].prec; max = (1<comps[compno].data; adjustR = (image->comps[compno].sgnd ? 1 << (image->comps[compno].prec - 1) : 0); if(prec > 8) { for (i = 0; i < wr * hr; i++) { v = *red + adjustR; ++red; /* netpbm: */ fprintf(fdest, "%c%c",(unsigned char)(v>>8), (unsigned char)v); if(has_alpha) { v = *alpha++; /* netpbm: */ fprintf(fdest, "%c%c",(unsigned char)(v>>8), (unsigned char)v); } }/* for(i */ } else /* prec <= 8 */ { for(i = 0; i < wr * hr; ++i) { fprintf(fdest, "%c", (unsigned char)(*red + adjustR)); ++red; } } fclose(fdest); } /* for (compno */ free(destname); return 0; }/* imagetopnm() */ #ifdef OPJ_HAVE_LIBTIFF /* -->> -->> -->> -->> TIFF IMAGE FORMAT <<-- <<-- <<-- <<-- */ int imagetotif(opj_image_t * image, const char *outfile) { int width, height, imgsize; int bps,index,adjust, sgnd; int ushift, dshift, has_alpha, force16; TIFF *tif; tdata_t buf; tstrip_t strip; tsize_t strip_size; ushift = dshift = force16 = has_alpha = 0; bps = image->comps[0].prec; if(bps > 8 && bps < 16) { ushift = 16 - bps; dshift = bps - ushift; bps = 16; force16 = 1; } if(bps != 8 && bps != 16) { fprintf(stderr,"imagetotif: Bits=%d, Only 8 and 16 bits implemented\n", bps); fprintf(stderr,"\tAborting\n"); return 1; } tif = TIFFOpen(outfile, "wb"); if (!tif) { fprintf(stderr, "imagetotif:failed to open %s for writing\n", outfile); return 1; } sgnd = image->comps[0].sgnd; adjust = sgnd ? 1 << (image->comps[0].prec - 1) : 0; 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) { has_alpha = (image->numcomps == 4); width = image->comps[0].w; height = image->comps[0].h; imgsize = width * height ; TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, width); TIFFSetField(tif, TIFFTAG_IMAGELENGTH, height); TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 3 + has_alpha); TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, bps); TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, 1); strip_size = TIFFStripSize(tif); buf = _TIFFmalloc(strip_size); index=0; for(strip = 0; strip < TIFFNumberOfStrips(tif); strip++) { unsigned char *dat8; tsize_t i, ssize, last_i = 0; int step, restx; ssize = TIFFStripSize(tif); dat8 = (unsigned char*)buf; if(bps == 8) { step = 3 + has_alpha; restx = step - 1; for(i=0; i < ssize - restx; i += step) { int r, g, b, a = 0; if(index < imgsize) { r = image->comps[0].data[index]; g = image->comps[1].data[index]; b = image->comps[2].data[index]; if(has_alpha) a = image->comps[3].data[index]; if(sgnd) { r += adjust; g += adjust; b += adjust; if(has_alpha) a += adjust; } dat8[i+0] = r ; dat8[i+1] = g ; dat8[i+2] = b ; if(has_alpha) dat8[i+3] = a; index++; last_i = i + step; } else break; }/*for(i = 0;)*/ if(last_i < ssize) { for(i = last_i; i < ssize; i += step) { int r, g, b, a = 0; if(index < imgsize) { r = image->comps[0].data[index]; g = image->comps[1].data[index]; b = image->comps[2].data[index]; if(has_alpha) a = image->comps[3].data[index]; if(sgnd) { r += adjust; g += adjust; b += adjust; if(has_alpha) a += adjust; } dat8[i+0] = r ; if(i+1 < ssize) dat8[i+1] = g ; else break; if(i+2 < ssize) dat8[i+2] = b ; else break; if(has_alpha) { if(i+3 < ssize) dat8[i+3] = a ; else break; } index++; } else break; }/*for(i)*/ }/*if(last_i < ssize)*/ } /*if(bps == 8)*/ else if(bps == 16) { step = 6 + has_alpha + has_alpha; restx = step - 1; for(i = 0; i < ssize - restx ; i += step) { int r, g, b, a = 0; if(index < imgsize) { r = image->comps[0].data[index]; g = image->comps[1].data[index]; b = image->comps[2].data[index]; if(has_alpha) a = image->comps[3].data[index]; if(sgnd) { r += adjust; g += adjust; b += adjust; if(has_alpha) a += adjust; } if(force16) { r = (r<>dshift); g = (g<>dshift); b = (b<>dshift); if(has_alpha) a = (a<>dshift); } dat8[i+0] = r;/*LSB*/ dat8[i+1] = (r >> 8);/*MSB*/ dat8[i+2] = g; dat8[i+3] = (g >> 8); dat8[i+4] = b; dat8[i+5] = (b >> 8); if(has_alpha) { dat8[i+6] = a; dat8[i+7] = (a >> 8); } index++; last_i = i + step; } else break; }/*for(i = 0;)*/ if(last_i < ssize) { for(i = last_i ; i < ssize ; i += step) { int r, g, b, a = 0; if(index < imgsize) { r = image->comps[0].data[index]; g = image->comps[1].data[index]; b = image->comps[2].data[index]; if(has_alpha) a = image->comps[3].data[index]; if(sgnd) { r += adjust; g += adjust; b += adjust; if(has_alpha) a += adjust; } if(force16) { r = (r<>dshift); g = (g<>dshift); b = (b<>dshift); if(has_alpha) a = (a<>dshift); } dat8[i+0] = r;/*LSB*/ if(i+1 < ssize) dat8[i+1] = (r >> 8);else break;/*MSB*/ if(i+2 < ssize) dat8[i+2] = g; else break; if(i+3 < ssize) dat8[i+3] = (g >> 8);else break; if(i+4 < ssize) dat8[i+4] = b; else break; if(i+5 < ssize) dat8[i+5] = (b >> 8);else break; if(has_alpha) { if(i+6 < ssize) dat8[i+6] = a; else break; if(i+7 < ssize) dat8[i+7] = (a >> 8); else break; } index++; } else break; }/*for(i)*/ }/*if(last_i < ssize)*/ }/*if(bps == 16)*/ (void)TIFFWriteEncodedStrip(tif, strip, (void*)buf, strip_size); }/*for(strip = 0; )*/ _TIFFfree((void*)buf); TIFFClose(tif); return 0; }/*RGB(A)*/ if(image->numcomps == 1 /* GRAY */ || ( image->numcomps == 2 /* GRAY_ALPHA */ && image->comps[0].dx == image->comps[1].dx && image->comps[0].dy == image->comps[1].dy && image->comps[0].prec == image->comps[1].prec)) { int step; has_alpha = (image->numcomps == 2); width = image->comps[0].w; height = image->comps[0].h; imgsize = width * height; /* Set tags */ TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, width); TIFFSetField(tif, TIFFTAG_IMAGELENGTH, height); TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1 + has_alpha); TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, bps); TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK); TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, 1); /* Get a buffer for the data */ strip_size = TIFFStripSize(tif); buf = _TIFFmalloc(strip_size); index = 0; for(strip = 0; strip < TIFFNumberOfStrips(tif); strip++) { unsigned char *dat8; tsize_t i, ssize = TIFFStripSize(tif); dat8 = (unsigned char*)buf; if(bps == 8) { step = 1 + has_alpha; for(i=0; i < ssize; i += step) { if(index < imgsize) { int r, a = 0; r = image->comps[0].data[index]; if(has_alpha) a = image->comps[1].data[index]; if(sgnd) { r += adjust; if(has_alpha) a += adjust; } dat8[i+0] = r; if(has_alpha) dat8[i+1] = a; index++; } else break; }/*for(i )*/ }/*if(bps == 8*/ else if(bps == 16) { step = 2 + has_alpha + has_alpha; for(i=0; i < ssize; i += step) { if(index < imgsize) { int r, a = 0; r = image->comps[0].data[index]; if(has_alpha) a = image->comps[1].data[index]; if(sgnd) { r += adjust; if(has_alpha) a += adjust; } if(force16) { r = (r<>dshift); if(has_alpha) a = (a<>dshift); } dat8[i+0] = r;/*LSB*/ dat8[i+1] = r >> 8;/*MSB*/ if(has_alpha) { dat8[i+2] = a; dat8[i+3] = a >> 8; } index++; }/*if(index < imgsize)*/ else break; }/*for(i )*/ } (void)TIFFWriteEncodedStrip(tif, strip, (void*)buf, strip_size); }/*for(strip*/ _TIFFfree(buf); TIFFClose(tif); return 0; } TIFFClose(tif); fprintf(stderr,"imagetotif: Bad color format.\n" "\tOnly RGB(A) and GRAY(A) has been implemented\n"); fprintf(stderr,"\tFOUND: numcomps(%d)\n\tAborting\n", image->numcomps); return 1; }/* imagetotif() */ /* * libtiff/tif_getimage.c : 1,2,4,8,16 bitspersample accepted * CINEMA : 12 bit precision */ opj_image_t* tiftoimage(const char *filename, opj_cparameters_t *parameters) { int subsampling_dx = parameters->subsampling_dx; int subsampling_dy = parameters->subsampling_dy; TIFF *tif; tdata_t buf; tstrip_t strip; tsize_t strip_size; int j, numcomps, w, h,index; OPJ_COLOR_SPACE color_space; opj_image_cmptparm_t cmptparm[4]; /* RGBA */ opj_image_t *image = NULL; int imgsize = 0; int has_alpha = 0; unsigned short tiBps, tiPhoto, tiSf, tiSpp, tiPC; unsigned int tiWidth, tiHeight; tif = TIFFOpen(filename, "r"); if(!tif) { fprintf(stderr, "tiftoimage:Failed to open %s for reading\n", filename); return 0; } tiBps = tiPhoto = tiSf = tiSpp = tiPC = 0; tiWidth = tiHeight = 0; TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &tiWidth); TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &tiHeight); TIFFGetField(tif, TIFFTAG_BITSPERSAMPLE, &tiBps); TIFFGetField(tif, TIFFTAG_SAMPLEFORMAT, &tiSf); TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &tiSpp); TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &tiPhoto); TIFFGetField(tif, TIFFTAG_PLANARCONFIG, &tiPC); w= tiWidth; h= tiHeight; { unsigned short b = tiBps, p = tiPhoto; if(tiBps != 8 && tiBps != 16 && tiBps != 12) b = 0; if(tiPhoto != 1 && tiPhoto != 2) p = 0; if( !b || !p) { if( !b) fprintf(stderr,"imagetotif: Bits=%d, Only 8 and 16 bits" " implemented\n",tiBps); else if( !p) fprintf(stderr,"tiftoimage: Bad color format %d.\n\tOnly RGB(A)" " and GRAY(A) has been implemented\n",(int) tiPhoto); fprintf(stderr,"\tAborting\n"); TIFFClose(tif); return NULL; } } {/* From: tiff-4.0.x/libtiff/tif_getimage.c : */ uint16* sampleinfo; uint16 extrasamples; TIFFGetFieldDefaulted(tif, TIFFTAG_EXTRASAMPLES, &extrasamples, &sampleinfo); if(extrasamples >= 1) { switch(sampleinfo[0]) { case EXTRASAMPLE_UNSPECIFIED: /* Workaround for some images without correct info about alpha channel */ if(tiSpp > 3) has_alpha = 1; break; case EXTRASAMPLE_ASSOCALPHA: /* data pre-multiplied */ case EXTRASAMPLE_UNASSALPHA: /* data not pre-multiplied */ has_alpha = 1; break; } } else /* extrasamples == 0 */ if(tiSpp == 4 || tiSpp == 2) has_alpha = 1; } /* initialize image components */ memset(&cmptparm[0], 0, 4 * sizeof(opj_image_cmptparm_t)); if(tiPhoto == PHOTOMETRIC_RGB) /* RGB(A) */ { numcomps = 3 + has_alpha; color_space = CLRSPC_SRGB; for(j = 0; j < numcomps; j++) { if(parameters->cp_cinema) { cmptparm[j].prec = 12; cmptparm[j].bpp = 12; } else { cmptparm[j].prec = tiBps; cmptparm[j].bpp = tiBps; } cmptparm[j].dx = subsampling_dx; cmptparm[j].dy = subsampling_dy; cmptparm[j].w = w; cmptparm[j].h = h; } image = opj_image_create(numcomps, &cmptparm[0], color_space); if(!image) { TIFFClose(tif); return NULL; } /* set image offset and reference grid */ image->x0 = parameters->image_offset_x0; image->y0 = parameters->image_offset_y0; image->x1 = !image->x0 ? (w - 1) * subsampling_dx + 1 : image->x0 + (w - 1) * subsampling_dx + 1; image->y1 = !image->y0 ? (h - 1) * subsampling_dy + 1 : image->y0 + (h - 1) * subsampling_dy + 1; buf = _TIFFmalloc(TIFFStripSize(tif)); strip_size=TIFFStripSize(tif); index = 0; imgsize = image->comps[0].w * image->comps[0].h ; /* Read the Image components */ for(strip = 0; strip < TIFFNumberOfStrips(tif); strip++) { unsigned char *dat8; int step; tsize_t i, ssize; ssize = TIFFReadEncodedStrip(tif, strip, buf, strip_size); dat8 = (unsigned char*)buf; if(tiBps == 16) { step = 6 + has_alpha + has_alpha; for(i = 0; i < ssize; i += step) { if(index < imgsize) { image->comps[0].data[index] = ( dat8[i+1] << 8 ) | dat8[i+0]; /* R */ image->comps[1].data[index] = ( dat8[i+3] << 8 ) | dat8[i+2]; /* G */ image->comps[2].data[index] = ( dat8[i+5] << 8 ) | dat8[i+4]; /* B */ if(has_alpha) image->comps[3].data[index] = ( dat8[i+7] << 8 ) | dat8[i+6]; if(parameters->cp_cinema) { /* Rounding 16 to 12 bits */ image->comps[0].data[index] = (image->comps[0].data[index] + 0x08) >> 4 ; image->comps[1].data[index] = (image->comps[1].data[index] + 0x08) >> 4 ; image->comps[2].data[index] = (image->comps[2].data[index] + 0x08) >> 4 ; if(has_alpha) image->comps[3].data[index] = (image->comps[3].data[index] + 0x08) >> 4 ; } index++; } else break; }/*for(i = 0)*/ }/*if(tiBps == 16)*/ else if(tiBps == 8) { step = 3 + has_alpha; for(i = 0; i < ssize; i += step) { if(index < imgsize) { image->comps[0].data[index] = dat8[i+0];/* R */ image->comps[1].data[index] = dat8[i+1];/* G */ image->comps[2].data[index] = dat8[i+2];/* B */ if(has_alpha) image->comps[3].data[index] = dat8[i+3]; if(parameters->cp_cinema) { /* Rounding 8 to 12 bits */ image->comps[0].data[index] = image->comps[0].data[index] << 4 ; image->comps[1].data[index] = image->comps[1].data[index] << 4 ; image->comps[2].data[index] = image->comps[2].data[index] << 4 ; if(has_alpha) image->comps[3].data[index] = image->comps[3].data[index] << 4 ; } index++; }/*if(index*/ else break; }/*for(i )*/ }/*if( tiBps == 8)*/ else if(tiBps == 12)/* CINEMA file */ { step = 9; for(i = 0; i < ssize; i += step) { if((index < imgsize)&(index+1 < imgsize)) { image->comps[0].data[index] = ( dat8[i+0]<<4 ) |(dat8[i+1]>>4); image->comps[1].data[index] = ((dat8[i+1]& 0x0f)<< 8) | dat8[i+2]; image->comps[2].data[index] = ( dat8[i+3]<<4) |(dat8[i+4]>>4); image->comps[0].data[index+1] = ((dat8[i+4]& 0x0f)<< 8) | dat8[i+5]; image->comps[1].data[index+1] = ( dat8[i+6] <<4) |(dat8[i+7]>>4); image->comps[2].data[index+1] = ((dat8[i+7]& 0x0f)<< 8) | dat8[i+8]; index += 2; } else break; }/*for(i )*/ } }/*for(strip = 0; )*/ _TIFFfree(buf); TIFFClose(tif); return image; }/*RGB(A)*/ if(tiPhoto == PHOTOMETRIC_MINISBLACK) /* GRAY(A) */ { numcomps = 1 + has_alpha; color_space = CLRSPC_GRAY; for(j = 0; j < numcomps; ++j) { cmptparm[j].prec = tiBps; cmptparm[j].bpp = tiBps; cmptparm[j].dx = subsampling_dx; cmptparm[j].dy = subsampling_dy; cmptparm[j].w = w; cmptparm[j].h = h; } image = opj_image_create(numcomps, &cmptparm[0], color_space); if(!image) { TIFFClose(tif); return NULL; } /* set image offset and reference grid */ image->x0 = parameters->image_offset_x0; image->y0 = parameters->image_offset_y0; image->x1 = !image->x0 ? (w - 1) * subsampling_dx + 1 : image->x0 + (w - 1) * subsampling_dx + 1; image->y1 = !image->y0 ? (h - 1) * subsampling_dy + 1 : image->y0 + (h - 1) * subsampling_dy + 1; buf = _TIFFmalloc(TIFFStripSize(tif)); strip_size = TIFFStripSize(tif); index = 0; imgsize = image->comps[0].w * image->comps[0].h ; /* Read the Image components */ for(strip = 0; strip < TIFFNumberOfStrips(tif); strip++) { unsigned char *dat8; tsize_t i, ssize; int step; ssize = TIFFReadEncodedStrip(tif, strip, buf, strip_size); dat8 = (unsigned char*)buf; if(tiBps == 16) { step = 2 + has_alpha + has_alpha; for(i = 0; i < ssize; i += step) { if(index < imgsize) { image->comps[0].data[index] = ( dat8[i+1] << 8 ) | dat8[i+0]; if(has_alpha) image->comps[1].data[index] = ( dat8[i+3] << 8 ) | dat8[i+2]; index++; } else break; }/*for(i )*/ } else if(tiBps == 8) { step = 1 + has_alpha; for(i = 0; i < ssize; i += step) { if(index < imgsize) { image->comps[0].data[index] = dat8[i+0]; if(has_alpha) image->comps[1].data[index] = dat8[i+1]; index++; } else break; }/*for(i )*/ } }/*for(strip = 0;*/ _TIFFfree(buf); TIFFClose(tif); }/*GRAY(A)*/ return image; }/* tiftoimage() */ #endif /* OPJ_HAVE_LIBTIFF */ /* -->> -->> -->> -->> RAW IMAGE FORMAT <<-- <<-- <<-- <<-- */ opj_image_t* rawtoimage(const char *filename, opj_cparameters_t *parameters, raw_cparameters_t *raw_cp) { int subsampling_dx = parameters->subsampling_dx; int subsampling_dy = parameters->subsampling_dy; FILE *f = NULL; int i, compno, numcomps, w, h; OPJ_COLOR_SPACE color_space; opj_image_cmptparm_t *cmptparm; opj_image_t * image = NULL; unsigned short ch; if((! (raw_cp->rawWidth & raw_cp->rawHeight & raw_cp->rawComp & raw_cp->rawBitDepth)) == 0) { fprintf(stderr,"\nError: invalid raw image parameters\n"); fprintf(stderr,"Please use the Format option -F:\n"); fprintf(stderr,"-F rawWidth,rawHeight,rawComp,rawBitDepth,s/u (Signed/Unsigned)\n"); fprintf(stderr,"Example: -i lena.raw -o lena.j2k -F 512,512,3,8,u\n"); fprintf(stderr,"Aborting\n"); return NULL; } f = fopen(filename, "rb"); if (!f) { fprintf(stderr, "Failed to open %s for reading !!\n", filename); fprintf(stderr,"Aborting\n"); return NULL; } numcomps = raw_cp->rawComp; color_space = CLRSPC_SRGB; w = raw_cp->rawWidth; h = raw_cp->rawHeight; cmptparm = (opj_image_cmptparm_t*) malloc(numcomps * sizeof(opj_image_cmptparm_t)); /* initialize image components */ memset(&cmptparm[0], 0, numcomps * sizeof(opj_image_cmptparm_t)); for(i = 0; i < numcomps; i++) { cmptparm[i].prec = raw_cp->rawBitDepth; cmptparm[i].bpp = raw_cp->rawBitDepth; cmptparm[i].sgnd = raw_cp->rawSigned; cmptparm[i].dx = subsampling_dx; cmptparm[i].dy = subsampling_dy; cmptparm[i].w = w; cmptparm[i].h = h; } /* create the image */ image = opj_image_create(numcomps, &cmptparm[0], color_space); if(!image) { fclose(f); return NULL; } /* set image offset and reference grid */ image->x0 = parameters->image_offset_x0; image->y0 = parameters->image_offset_y0; image->x1 = parameters->image_offset_x0 + (w - 1) * subsampling_dx + 1; image->y1 = parameters->image_offset_y0 + (h - 1) * subsampling_dy + 1; if(raw_cp->rawBitDepth <= 8) { unsigned char value = 0; for(compno = 0; compno < numcomps; compno++) { for (i = 0; i < w * h; i++) { if (!fread(&value, 1, 1, f)) { fprintf(stderr,"Error reading raw file. End of file probably reached.\n"); return NULL; } image->comps[compno].data[i] = raw_cp->rawSigned?(char)value:value; } } } else if(raw_cp->rawBitDepth <= 16) { unsigned short value; for(compno = 0; compno < numcomps; compno++) { for (i = 0; i < w * h; i++) { unsigned char temp; if (!fread(&temp, 1, 1, f)) { fprintf(stderr,"Error reading raw file. End of file probably reached.\n"); return NULL; } value = temp << 8; if (!fread(&temp, 1, 1, f)) { fprintf(stderr,"Error reading raw file. End of file probably reached.\n"); return NULL; } value += temp; image->comps[compno].data[i] = raw_cp->rawSigned?(short)value:value; } } } else { fprintf(stderr,"OpenJPEG cannot encode raw components with bit depth higher than 16 bits.\n"); return NULL; } if (fread(&ch, 1, 1, f)) { fprintf(stderr,"Warning. End of raw file not reached... processing anyway\n"); } fclose(f); return image; } int imagetoraw(opj_image_t * image, const char *outfile) { FILE *rawFile = NULL; size_t res; int compno; int w, h; int line, row; int *ptr; if((image->numcomps * image->x1 * image->y1) == 0) { fprintf(stderr,"\nError: invalid raw image parameters\n"); return 1; } rawFile = fopen(outfile, "wb"); if (!rawFile) { fprintf(stderr, "Failed to open %s for writing !!\n", outfile); return 1; } fprintf(stdout,"Raw image characteristics: %d components\n", image->numcomps); for(compno = 0; compno < image->numcomps; compno++) { fprintf(stdout,"Component %d characteristics: %dx%dx%d %s\n", compno, image->comps[compno].w, image->comps[compno].h, image->comps[compno].prec, image->comps[compno].sgnd==1 ? "signed": "unsigned"); w = image->comps[compno].w; h = image->comps[compno].h; if(image->comps[compno].prec <= 8) { if(image->comps[compno].sgnd == 1) { signed char curr; int mask = (1 << image->comps[compno].prec) - 1; ptr = image->comps[compno].data; for (line = 0; line < h; line++) { for(row = 0; row < w; row++) { curr = (signed char) (*ptr & mask); res = fwrite(&curr, sizeof(signed char), 1, rawFile); if( res < 1 ) { fprintf(stderr, "failed to write 1 byte for %s\n", outfile); return 1; } ptr++; } } } else if(image->comps[compno].sgnd == 0) { unsigned char curr; int mask = (1 << image->comps[compno].prec) - 1; ptr = image->comps[compno].data; for (line = 0; line < h; line++) { for(row = 0; row < w; row++) { curr = (unsigned char) (*ptr & mask); res = fwrite(&curr, sizeof(unsigned char), 1, rawFile); if( res < 1 ) { fprintf(stderr, "failed to write 1 byte for %s\n", outfile); return 1; } ptr++; } } } } else if(image->comps[compno].prec <= 16) { if(image->comps[compno].sgnd == 1) { signed short int curr; int mask = (1 << image->comps[compno].prec) - 1; ptr = image->comps[compno].data; for (line = 0; line < h; line++) { for(row = 0; row < w; row++) { unsigned char temp; curr = (signed short int) (*ptr & mask); temp = (unsigned char) (curr >> 8); res = fwrite(&temp, 1, 1, rawFile); if( res < 1 ) { fprintf(stderr, "failed to write 1 byte for %s\n", outfile); return 1; } temp = (unsigned char) curr; res = fwrite(&temp, 1, 1, rawFile); if( res < 1 ) { fprintf(stderr, "failed to write 1 byte for %s\n", outfile); return 1; } ptr++; } } } else if(image->comps[compno].sgnd == 0) { unsigned short int curr; int mask = (1 << image->comps[compno].prec) - 1; ptr = image->comps[compno].data; for (line = 0; line < h; line++) { for(row = 0; row < w; row++) { unsigned char temp; curr = (unsigned short int) (*ptr & mask); temp = (unsigned char) (curr >> 8); res = fwrite(&temp, 1, 1, rawFile); if( res < 1 ) { fprintf(stderr, "failed to write 1 byte for %s\n", outfile); return 1; } temp = (unsigned char) curr; res = fwrite(&temp, 1, 1, rawFile); if( res < 1 ) { fprintf(stderr, "failed to write 1 byte for %s\n", outfile); return 1; } ptr++; } } } } else if (image->comps[compno].prec <= 32) { fprintf(stderr,"More than 16 bits per component no handled yet\n"); return 1; } else { fprintf(stderr,"Error: invalid precision: %d\n", image->comps[compno].prec); return 1; } } fclose(rawFile); return 0; } #ifdef OPJ_HAVE_LIBPNG #define PNG_MAGIC "\x89PNG\x0d\x0a\x1a\x0a" #define MAGIC_SIZE 8 /* PNG allows bits per sample: 1, 2, 4, 8, 16 */ opj_image_t *pngtoimage(const char *read_idf, opj_cparameters_t * params) { png_structp png; png_infop info; double gamma, display_exponent; int bit_depth, interlace_type,compression_type, filter_type; int unit; png_uint_32 resx, resy; unsigned int i, j; png_uint_32 width, height; int color_type, has_alpha, is16; unsigned char *s; FILE *reader; unsigned char **rows; /* j2k: */ opj_image_t *image; opj_image_cmptparm_t cmptparm[4]; int sub_dx, sub_dy; unsigned int nr_comp; int *r, *g, *b, *a; unsigned char sigbuf[8]; if((reader = fopen(read_idf, "rb")) == NULL) { fprintf(stderr,"pngtoimage: can not open %s\n",read_idf); return NULL; } image = NULL; png = NULL; rows = 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; } /* libpng-VERSION/example.c: * PC : screen_gamma = 2.2; * Mac: screen_gamma = 1.7 or 1.0; */ display_exponent = 2.2; 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); else if(color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) png_set_expand(png); if(png_get_valid(png, info, PNG_INFO_tRNS)) png_set_expand(png); is16 = (bit_depth == 16); /* GRAY => RGB; GRAY_ALPHA => RGBA */ if(color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) { png_set_gray_to_rgb(png); color_type = (color_type == PNG_COLOR_TYPE_GRAY? PNG_COLOR_TYPE_RGB: PNG_COLOR_TYPE_RGB_ALPHA); } if( !png_get_gAMA(png, info, &gamma)) gamma = 0.45455; png_set_gamma(png, display_exponent, gamma); png_read_update_info(png, info); png_get_pHYs(png, info, &resx, &resy, &unit); color_type = png_get_color_type(png, info); has_alpha = (color_type == PNG_COLOR_TYPE_RGB_ALPHA); nr_comp = 3 + has_alpha; bit_depth = png_get_bit_depth(png, info); rows = (unsigned char**)calloc(height+1, sizeof(unsigned char*)); for(i = 0; i < height; ++i) rows[i] = (unsigned char*)malloc(png_get_rowbytes(png,info)); png_read_image(png, rows); memset(&cmptparm, 0, 4 * sizeof(opj_image_cmptparm_t)); sub_dx = params->subsampling_dx; sub_dy = params->subsampling_dy; for(i = 0; i < nr_comp; ++i) { cmptparm[i].prec = bit_depth; /* bits_per_pixel: 8 or 16 */ cmptparm[i].bpp = bit_depth; cmptparm[i].sgnd = 0; cmptparm[i].dx = sub_dx; cmptparm[i].dy = sub_dy; cmptparm[i].w = width; cmptparm[i].h = height; } image = opj_image_create(nr_comp, &cmptparm[0], CLRSPC_SRGB); if(image == NULL) goto fin; image->x0 = params->image_offset_x0; image->y0 = params->image_offset_y0; image->x1 = image->x0 + (width - 1) * sub_dx + 1 + image->x0; image->y1 = image->y0 + (height - 1) * sub_dy + 1 + image->y0; r = image->comps[0].data; g = image->comps[1].data; b = image->comps[2].data; a = image->comps[3].data; for(i = 0; i < height; ++i) { s = rows[i]; for(j = 0; j < width; ++j) { if(is16) { *r++ = s[0]<<8|s[1]; s += 2; *g++ = s[0]<<8|s[1]; s += 2; *b++ = s[0]<<8|s[1]; s += 2; if(has_alpha) { *a++ = s[0]<<8|s[1]; s += 2; } continue; } *r++ = *s++; *g++ = *s++; *b++ = *s++; if(has_alpha) *a++ = *s++; } } fin: if(rows) { for(i = 0; i < height; ++i) free(rows[i]); free(rows); } if(png) png_destroy_read_struct(&png, &info, NULL); fclose(reader); return image; }/* pngtoimage() */ int imagetopng(opj_image_t * image, const char *write_idf) { FILE *writer; png_structp png; png_infop info; int *red, *green, *blue, *alpha; unsigned char *row_buf, *d; int has_alpha, width, height, nr_comp, color_type; int adjustR, adjustG, adjustB, adjustA, x, y, fails; int prec, ushift, dshift, is16, force16, force8; unsigned short mask = 0xffff; png_color_8 sig_bit; is16 = force16 = force8 = ushift = dshift = 0; fails = 1; prec = image->comps[0].prec; nr_comp = image->numcomps; if(prec > 8 && prec < 16) { ushift = 16 - prec; dshift = prec - ushift; prec = 16; force16 = 1; } else if(prec < 8 && nr_comp > 1)/* GRAY_ALPHA, RGB, RGB_ALPHA */ { ushift = 8 - prec; dshift = 8 - ushift; prec = 8; force8 = 1; } 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; info = NULL; has_alpha = 0; /* 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(prec == 16) mask = 0xffff; else if(prec == 8) mask = 0x00ff; else if(prec == 4) mask = 0x000f; else if(prec == 2) mask = 0x0003; else if(prec == 1) mask = 0x0001; if(nr_comp >= 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) { int v; has_alpha = (nr_comp > 3); is16 = (prec == 16); width = image->comps[0].w; height = image->comps[0].h; red = image->comps[0].data; green = image->comps[1].data; blue = image->comps[2].data; sig_bit.red = sig_bit.green = sig_bit.blue = prec; if(has_alpha) { sig_bit.alpha = prec; alpha = image->comps[3].data; color_type = PNG_COLOR_TYPE_RGB_ALPHA; adjustA = (image->comps[3].sgnd ? 1 << (image->comps[3].prec - 1) : 0); } else { sig_bit.alpha = 0; alpha = NULL; color_type = PNG_COLOR_TYPE_RGB; adjustA = 0; } png_set_sBIT(png, info, &sig_bit); png_set_IHDR(png, info, width, height, prec, color_type, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); /*=============================*/ png_write_info(png, info); /*=============================*/ if(prec < 8) { png_set_packing(png); } adjustR = (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0); adjustG = (image->comps[1].sgnd ? 1 << (image->comps[1].prec - 1) : 0); adjustB = (image->comps[2].sgnd ? 1 << (image->comps[2].prec - 1) : 0); row_buf = (unsigned char*)malloc(width * nr_comp * 2); for(y = 0; y < height; ++y) { d = row_buf; for(x = 0; x < width; ++x) { if(is16) { v = *red + adjustR; ++red; if(force16) { v = (v<>dshift); } *d++ = (unsigned char)(v>>8); *d++ = (unsigned char)v; v = *green + adjustG; ++green; if(force16) { v = (v<>dshift); } *d++ = (unsigned char)(v>>8); *d++ = (unsigned char)v; v = *blue + adjustB; ++blue; if(force16) { v = (v<>dshift); } *d++ = (unsigned char)(v>>8); *d++ = (unsigned char)v; if(has_alpha) { v = *alpha + adjustA; ++alpha; if(force16) { v = (v<>dshift); } *d++ = (unsigned char)(v>>8); *d++ = (unsigned char)v; } continue; }/* if(is16) */ v = *red + adjustR; ++red; if(force8) { v = (v<>dshift); } *d++ = (unsigned char)(v & mask); v = *green + adjustG; ++green; if(force8) { v = (v<>dshift); } *d++ = (unsigned char)(v & mask); v = *blue + adjustB; ++blue; if(force8) { v = (v<>dshift); } *d++ = (unsigned char)(v & mask); if(has_alpha) { v = *alpha + adjustA; ++alpha; if(force8) { v = (v<>dshift); } *d++ = (unsigned char)(v & mask); } } /* for(x) */ png_write_row(png, row_buf); } /* for(y) */ free(row_buf); }/* nr_comp >= 3 */ else if(nr_comp == 1 /* GRAY */ || ( nr_comp == 2 /* GRAY_ALPHA */ && image->comps[0].dx == image->comps[1].dx && image->comps[0].dy == image->comps[1].dy && image->comps[0].prec == image->comps[1].prec)) { int v; red = image->comps[0].data; sig_bit.gray = prec; sig_bit.red = sig_bit.green = sig_bit.blue = sig_bit.alpha = 0; alpha = NULL; adjustA = 0; color_type = PNG_COLOR_TYPE_GRAY; if(nr_comp == 2) { has_alpha = 1; sig_bit.alpha = prec; alpha = image->comps[1].data; color_type = PNG_COLOR_TYPE_GRAY_ALPHA; adjustA = (image->comps[1].sgnd ? 1 << (image->comps[1].prec - 1) : 0); } width = image->comps[0].w; height = image->comps[0].h; png_set_IHDR(png, info, width, height, sig_bit.gray, color_type, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); png_set_sBIT(png, info, &sig_bit); /*=============================*/ png_write_info(png, info); /*=============================*/ adjustR = (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0); if(prec < 8) { png_set_packing(png); } if(prec > 8) { row_buf = (unsigned char*) malloc(width * nr_comp * sizeof(unsigned short)); for(y = 0; y < height; ++y) { d = row_buf; for(x = 0; x < width; ++x) { v = *red + adjustR; ++red; if(force16) { v = (v<>dshift); } *d++ = (unsigned char)(v>>8); *d++ = (unsigned char)v; if(has_alpha) { v = *alpha++; if(force16) { v = (v<>dshift); } *d++ = (unsigned char)(v>>8); *d++ = (unsigned char)v; } }/* for(x) */ png_write_row(png, row_buf); } /* for(y) */ free(row_buf); } else /* prec <= 8 */ { row_buf = (unsigned char*)calloc(width, nr_comp * 2); for(y = 0; y < height; ++y) { d = row_buf; for(x = 0; x < width; ++x) { v = *red + adjustR; ++red; if(force8) { v = (v<>dshift); } *d++ = (unsigned char)(v & mask); if(has_alpha) { v = *alpha + adjustA; ++alpha; if(force8) { v = (v<>dshift); } *d++ = (unsigned char)(v & mask); } }/* for(x) */ png_write_row(png, row_buf); } /* for(y) */ free(row_buf); } } else { fprintf(stderr,"imagetopng: can not create %s\n",write_idf); goto fin; } png_write_end(png, info); fails = 0; fin: if(png) { png_destroy_write_struct(&png, &info); } fclose(writer); if(fails) remove(write_idf); return fails; }/* imagetopng() */ #endif /* OPJ_HAVE_LIBPNG */ openjpeg-2.1.0/src/bin/CMakeLists.txt000644 001750 001750 00000000526 12327650567 020572 0ustar00mathieumathieu000000 000000 # 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) openjpeg-2.1.0/src/bin/jpip/opj_jpip_addxml.c000644 001750 001750 00000012460 12327650566 022302 0ustar00mathieumathieu000000 000000 /* * $Id: addXMLinJP2.c 46 2011-02-17 14:50:55Z kaori $ * * 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. */ /*! \file * \brief addXMLinJP2 is a program to embed metadata into JP2 file * * \section impinst Implementing instructions * This program takes two arguments. \n * -# Input/output image file in JP2 format, this JP2 file is being modified * -# Input XML file with metadata contents\n * % ./addXMLinJP2 image.jp2 metadata.xml\n * * Currently, this program does not parse XML file, and the XML file contents is directly embedded as a XML Box.\n * The following is an example of XML file contents specifying Region Of Interests with target names.\n * \n * \n * \n * \n * \n * */ #include #include #include #include /** * Open JP2 file with the check of JP2 header * * @param[in] filename file name string * @return file descriptor */ FILE * open_jp2file( const char filename[]); /** * read xml file without any format check for the moment * * @param[in] filename file name string * @param[out] fsize file byte size * @return pointer to the xml file content buffer */ char * read_xmlfile( const char filename[], long *fsize); int main(int argc, char *argv[]) { FILE *fp; char *xmldata, type[]="xml "; long fsize, boxsize; if( argc<3){ fprintf( stderr, "USAGE: %s modifing.jp2 adding.xml\n", argv[0] ); return -1; } fp = open_jp2file( argv[1]); if( !fp) return -1; xmldata = read_xmlfile( argv[2], &fsize); if( fsize < 0 ) return -1; boxsize = fsize + 8; fputc( (boxsize>>24)&0xff, fp); fputc( (boxsize>>16)&0xff, fp); fputc( (boxsize>>8)&0xff, fp); fputc( boxsize&0xff, fp); fwrite( type, 4, 1, fp); fwrite( xmldata, (size_t)fsize, 1, fp); free( xmldata); fclose(fp); return 0; } FILE * open_jp2file( const char filename[]) { FILE *fp; char *data; if( !(fp = fopen( filename, "a+b"))){ fprintf( stderr, "Original JP2 %s not found\n", filename); return NULL; } /* Check resource is a JP family file. */ if( fseek( fp, 0, SEEK_SET)==-1){ fclose(fp); fprintf( stderr, "Original JP2 %s broken (fseek error)\n", filename); return NULL; } data = (char *)malloc( 12); /* size of header */ if( fread( data, 12, 1, fp) != 1){ free( data); fclose(fp); fprintf( stderr, "Original JP2 %s broken (read error)\n", filename); return NULL; } if( *data || *(data + 1) || *(data + 2) || *(data + 3) != 12 || strncmp (data + 4, "jP \r\n\x87\n", 8)){ free( data); fclose(fp); fprintf( stderr, "No JPEG 2000 Signature box in target %s\n", filename); return NULL; } free( data); return fp; } char * read_xmlfile( const char filename[], long *fsize) { FILE *fp; char *data; /* fprintf( stderr, "open %s\n", filename);*/ if(!(fp = fopen( filename, "r"))){ fprintf( stderr, "XML file %s not found\n", filename); return NULL; } if( fseek( fp, 0, SEEK_END) == -1){ fprintf( stderr, "XML file %s broken (seek error)\n", filename); fclose( fp); return NULL; } if( (*fsize = ftell( fp)) == -1){ fprintf( stderr, "XML file %s broken (seek error)\n", filename); fclose( fp); return NULL; } assert( *fsize >= 0 ); if( fseek( fp, 0, SEEK_SET) == -1){ fprintf( stderr, "XML file %s broken (seek error)\n", filename); fclose( fp); return NULL; } data = (char *)malloc( (size_t)*fsize); if( fread( data, (size_t)*fsize, 1, fp) != 1){ fprintf( stderr, "XML file %s broken (read error)\n", filename); free( data); fclose(fp); return NULL; } fclose( fp); return data; } openjpeg-2.1.0/src/bin/jpip/opj_jpip_test.c000644 001750 001750 00000004633 12327650566 022013 0ustar00mathieumathieu000000 000000 /* * $Id: test_index.c 46 2011-02-17 14:50:55Z kaori $ * * 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. */ /*! \file * \brief test_index is a program to test the index code format of a JP2 file * * \section impinst Implementing instructions * This program takes one argument, and print out text type index information to the terminal. \n * -# Input JP2 file\n * % ./test_index input.jp2\n */ #include #include #include #include #ifdef _WIN32 #include #else #include #endif #include "openjpip.h" int main(int argc, char *argv[]) { int fd; index_t *jp2idx; if( argc < 2 ) return 1; if( (fd = open( argv[1], O_RDONLY)) == -1){ fprintf( stderr, "Error: Target %s not found\n", argv[1]); return -1; } if( !(jp2idx = get_index_from_JP2file( fd))){ fprintf( stderr, "JP2 file broken\n"); return -1; } output_index( jp2idx); destroy_index( &jp2idx); close(fd); return 0; } /* main */ openjpeg-2.1.0/src/bin/jpip/CMakeLists.txt000644 001750 001750 00000012347 12327650566 021537 0ustar00mathieumathieu000000 000000 # Headers file are located here: include_directories( ${OPENJPEG_BINARY_DIR}/src/lib/openjp2 # opj_config.h ${OPENJPEG_SOURCE_DIR}/src/lib/openjp2 ${OPENJPEG_SOURCE_DIR}/src/bin/common # opj_getopt.h ${OPENJPEG_SOURCE_DIR}/src/bin/jp2 # convert.h ${OPENJPEG_SOURCE_DIR}/src/lib/openjpip ${FCGI_INCLUDE_DIRS} ) # Tool to embed metadata into JP2 file add_executable(opj_jpip_addxml opj_jpip_addxml.c) # Install exe install(TARGETS opj_jpip_addxml EXPORT OpenJPEGTargets DESTINATION ${OPENJPEG_INSTALL_BIN_DIR} COMPONENT Applications ) if(BUILD_JPIP_SERVER) set(OPJ_SERVER_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/opj_server.c ) # Build executable add_executable(opj_server ${OPJ_SERVER_SRCS}) target_link_libraries(opj_server ${FCGI_LIBRARIES} openjpip_server) set_property( TARGET opj_server APPEND PROPERTY COMPILE_DEFINITIONS SERVER QUIT_SIGNAL="quitJPIP" ) # On unix you need to link to the math library: if(UNIX) target_link_libraries(opj_server m) endif() # Install exe install(TARGETS opj_server EXPORT OpenJPEGTargets DESTINATION ${OPENJPEG_INSTALL_BIN_DIR} COMPONENT Applications ) endif() set(EXES opj_dec_server opj_jpip_transcode opj_jpip_test ) foreach(exe ${EXES}) add_executable(${exe} ${exe}.c) target_link_libraries(${exe} openjpip) install(TARGETS ${exe} EXPORT OpenJPEGTargets DESTINATION ${OPENJPEG_INSTALL_BIN_DIR} COMPONENT Applications ) endforeach() # Build the two java clients: find_package(Java 1.5 COMPONENTS Development) # javac, jar # User can override this: if(NOT DEFINED JAVA_SOURCE_VERSION) set(JAVA_SOURCE_VERSION 1.5) endif() if(NOT DEFINED JAVA_TARGET_VERSION) set(JAVA_TARGET_VERSION 1.5) endif() # Only build the java viewer if dev is found: if(Java_Development_FOUND AND Java_JAVAC_EXECUTABLE) set(jflags $ENV{JFLAGS}) # search for package org.apache.xerces.parsers find_file(APACHE_XERCES_JAR NAMES xerces-j2.jar xercesImpl.jar PATHS /usr/share/java/ NO_DEFAULT_PATH ) mark_as_advanced(APACHE_XERCES_JAR) # Decide to build the simple viewer or the xerces one: if(EXISTS ${APACHE_XERCES_JAR}) configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer_xerces/dist/manifest.txt.in ${CMAKE_CURRENT_BINARY_DIR}/opj_viewer_xerces/dist/manifest.txt @ONLY ) # build dep list: file(GLOB java2_srcs "opj_viewer_xerces/src/*.java") # Need some common files: list(APPEND java2_srcs ${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer/src/ImageManager.java ${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer/src/ImgdecClient.java ${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer/src/JPIPHttpClient.java ${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer/src/MML.java ${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer/src/PnmImage.java ${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer/src/RegimViewer.java ${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer/src/ResizeListener.java ) # make sure target javac dir exists: file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/classes2) # Build java add_custom_command( OUTPUT ${LIBRARY_OUTPUT_PATH}/opj_jpip_viewer.jar COMMAND ${Java_JAVAC_EXECUTABLE} ${jflags} -source ${JAVA_SOURCE_VERSION} -target ${JAVA_TARGET_VERSION} -classpath ${APACHE_XERCES_JAR} ${java2_srcs} -d ${CMAKE_CURRENT_BINARY_DIR}/classes2 COMMAND ${Java_JAR_EXECUTABLE} cfm ${LIBRARY_OUTPUT_PATH}/opj_jpip_viewer.jar ${CMAKE_CURRENT_BINARY_DIR}/opj_viewer_xerces/dist/manifest.txt -C ${CMAKE_CURRENT_BINARY_DIR}/classes2 . DEPENDS ${java2_srcs} ${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer_xerces/dist/manifest.txt.in COMMENT "javac *.java; jar cvf -> opj_viewer_xerces.jar" ) # name the target add_custom_target(OPJViewerXercesJar ALL DEPENDS ${LIBRARY_OUTPUT_PATH}/opj_jpip_viewer.jar COMMENT "building opj_jpip_viewer.jar (xerces)" ) install(FILES ${LIBRARY_OUTPUT_PATH}/opj_jpip_viewer.jar DESTINATION ${OPENJPEG_INSTALL_SHARE_DIR} COMPONENT JavaModule ) else() # opj_viewer (simple, no xerces) # build dep list: file(GLOB java1_srcs "opj_viewer/src/*.java") # make sure target javac dir exists: file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/classes1) # Build java add_custom_command( OUTPUT ${LIBRARY_OUTPUT_PATH}/opj_jpip_viewer.jar COMMAND ${Java_JAVAC_EXECUTABLE} ${jflags} -source ${JAVA_SOURCE_VERSION} -target ${JAVA_TARGET_VERSION} ${java1_srcs} -d ${CMAKE_CURRENT_BINARY_DIR}/classes1 COMMAND ${Java_JAR_EXECUTABLE} cfm ${LIBRARY_OUTPUT_PATH}/opj_jpip_viewer.jar ${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer/dist/manifest.txt -C ${CMAKE_CURRENT_BINARY_DIR}/classes1 . DEPENDS ${java1_srcs} ${CMAKE_CURRENT_SOURCE_DIR}/opj_viewer/dist/manifest.txt COMMENT "javac *.java; jar cvf -> opj_jpip_viewer.jar" ) # name the target add_custom_target(OPJViewerJar ALL DEPENDS ${LIBRARY_OUTPUT_PATH}/opj_jpip_viewer.jar COMMENT "building opj_jpip_viewer.jar (no xerces found)" ) install(FILES ${LIBRARY_OUTPUT_PATH}/opj_jpip_viewer.jar DESTINATION ${OPENJPEG_INSTALL_SHARE_DIR} COMPONENT JavaModule ) endif() else() message(WARNING "No java compiler found. Wont be able to build java viewer") endif() openjpeg-2.1.0/src/bin/jpip/README000644 001750 001750 00000013740 12327650566 017655 0ustar00mathieumathieu000000 000000 ======================================================================== OpenJPIP software 2.1 ReadMe OpenJPEG: http://www.openjpeg.org Written by: Kaori Hagihara UCL/SST/ICTM/ELEN February 18 2011 ======================================================================== Contents: 1. Introduction 2. License 3. System requirements 4. Implementing instructions 5. JP2 encoding instructions ---------- 1. Introduction ---------- OpenJPIP software is an implementation of JPEG 2000 Part9: Interactivity tools, APIs and protocols (JPIP). ( For more info about JPIP, check the website: http://www.jpeg.org/jpeg2000/j2kpart9.html) The current implementation uses some results from the 2KAN project (http://www.2kan.org). Version 2.1 covers: - JPT-stream (Tile) and JPP-stream (Precinct) media types - Session, channels, cache model managements - JPIP over HTTP, HTTP requests and TCP return - Indexing JPEG 2000 files - Embedding XML formatted metadata - Region Of Interest (ROI) requests - Access to JP2 files with their URL ---------- 2. License ---------- This software is released under the BSD license, anybody can use or modify the library, even for commercial applications. The only restriction is to retain the copyright in the sources or the binaries documentation. Neither the author, nor the university accept any responsibility for any kind of error or data loss which may occur during usage. ---------- 3. System requirements ---------- - FastCGI development kit (C libraries) at server (http://www.fastcgi.com) - libcURL library - Java application launcher at client - Xerces2 java XML parser on the client for accessing embedded image metadata (http://xerces.apache.org/xerces2-j) We tested this software with a virtual server running on the same Linux machine as the clients. ---------- 4. Building instructions ---------- A Makefile is available in the same directory as this README file. Simply type 'make' and it will build all the required C-executables. Concerning the java-based opj_viewer, simply type 'ant' in the corresponding directory (requires 'ant' utility of course) The documentation can be build this way (requires doxygen utility): cd doc doxygen Doxyfile ---------- 5. Usage ---------- Preliminary notes : * HTML documentation is available at http://www.openjpeg.org/jpip/doc/html * Example image is available at http://www.openjpeg.org/jpip/data/copenhague1.zip (20 Mb !) Webserver: You need a webserver running with the fastcgi module enabled and correctly configured. For Apache, add the following line to your /etc/apache2/mods-available/fastcgi.conf configuration file: FastCGIExternalServer /var/www/myFCGI -host localhost:3000 where /var/www is your DocumentRoot. Please refer to 'http://www.openjpeg.org/jpip/doc/ApacheFastCGITutorial.pdf' for more details. Server: 1. Store JP2 files in the same directory as opj_server 2. Launch opj_server from the server terminal: % spawn-fcgi -f ./opj_server -p 3000 -n For shutting down JPIP server: %GET http://hostname/myFCGI?quitJPIP Notice, http://hostname/myFCGI is the HTTP server URI (myFCGI refers to opj_server by the server setting) Requst message "quitJPIP" can be changed in Makfile, modify -DQUIT_SIGNAL=\"quitJPIP\" Client: 1. Launch image decoding server, and keep it alive as long as image viewers are open % ./opj_dec_server [portnumber (50000 by default)] You might prefer to implement this program from another directory since cache files are saved in the working directory. % mkdir cache % cd cache % ../opj_dec_server 2. Open image viewers (as many as needed) % java -jar opj_viewer.jar http://hostname/myFCGI path/filename.jp2 [hostname] [portnumber] [stateless/session] [jptstream/jppstream] [tcp/udp] ( The arguments - http://hostname/myFCGI is the HTTP server URI (myFCGI refers to opj_server by the server setting) - path/filename.jp2 is the server local path or URL of a JP2 file - host name of opj_dec_server, localhost by default - portnumber of opj_dec_server, 50000 by default - request type stateless for no caching, session (default) for caching - return media type, JPT-stream tile based stream, or JPP-stream (default) precinct based stream - auxiliary return protocol, tcp or udp (udp is not implemented yet), if not given, return data is filled in http chunk Image viewer GUI instructions: Scale up request: Enlarge the window ROI request: Select a region by mouse click and drag, then click inside the red frame of the selected region % java -jar opj_viewer_xerces.jar http://hostname/myFCGI JP2_filename.jp2 Annotate image with ROI information in XML metadata: Click button "Region Of Interest" Open a new window presenting an aligned image with a locally stored image: Click button "Image Registration" (Under Construction) 3. Quit the image decoding server through the telnet, be sure all image viewers are closed % telnet localhost 50000 quit ---------- 5. JP2 encoding instructions ---------- An example to encode a TIF image "copenhague1.tif" at resolution 4780x4050, 8bit/pixel, grayscale. % ./image_to_j2k -i copenhague1.tif -o copenhague1.jp2 -p RPCL -c [64,64] -t 640,480 -jpip -TP R options -jpip : embed index table 'cidx' box into the output JP2 file (obligation for JPIP) -TP R : partition a tile into tile parts of different resolution levels (obligation for JPT-stream)