From 85a87cd505f37027c4b74363b529a1e166e32651 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Tue, 4 May 2021 19:21:45 +0200 Subject: [PATCH] Remove obsolete components JPWL, JP3D and MJ2 --- CMakeLists.txt | 22 +- README.md | 12 +- src/bin/CMakeLists.txt | 9 - src/bin/jp3d/CMakeLists.txt | 41 - src/bin/jp3d/convert.c | 1051 ------ src/bin/jp3d/convert.h | 52 - src/bin/jp3d/getopt.c | 119 - src/bin/jp3d/getopt.h | 14 - src/bin/jp3d/opj_jp3d_compress.c | 989 ------ src/bin/jp3d/opj_jp3d_decompress.c | 601 ---- src/bin/jp3d/tcltk/LPI_JP3D_VM.tcl | 115 - src/bin/jp3d/tcltk/README | 13 - src/bin/jp3d/tcltk/Thumbs.db | Bin 18944 -> 0 bytes src/bin/jp3d/tcltk/decoder.tcl | 272 -- src/bin/jp3d/tcltk/encoder.tcl | 470 --- src/bin/jp3d/tcltk/logoLPI.gif | Bin 5212 -> 0 bytes src/bin/jp3d/windirent.h | 679 ---- src/bin/jpwl/CMakeLists.txt | 62 - src/bin/jpwl/convert.c | 3771 ---------------------- src/bin/jpwl/convert.h | 90 - src/bin/jpwl/index.c | 454 --- src/bin/jpwl/index.h | 54 - src/bin/jpwl/opj_jpwl_compress.c | 1965 ----------- src/bin/jpwl/opj_jpwl_decompress.c | 900 ------ src/bin/jpwl/windirent.h | 680 ---- src/bin/mj2/CMakeLists.txt | 47 - src/bin/mj2/meta_out.c | 2858 ---------------- src/bin/mj2/meta_out.h | 14 - src/bin/mj2/mj2_to_metadata.c | 350 -- src/bin/mj2/mj2_to_metadata.dtd | 425 --- src/bin/mj2/mj2_to_metadata.h | 9 - src/bin/mj2/mj2_to_metadata.sln | 29 - src/bin/mj2/mj2_to_metadata.vcproj | 349 -- src/bin/mj2/mj2_to_metadata_Notes.doc | Bin 35328 -> 0 bytes src/bin/mj2/opj_mj2_compress.c | 853 ----- src/bin/mj2/opj_mj2_decompress.c | 260 -- src/bin/mj2/opj_mj2_extract.c | 178 - src/bin/mj2/opj_mj2_wrap.c | 537 --- src/bin/mj2/readme.txt | 3 - src/lib/CMakeLists.txt | 10 - src/lib/openjp3d/CMakeLists.txt | 45 - src/lib/openjp3d/bio.c | 207 -- src/lib/openjp3d/bio.h | 137 - src/lib/openjp3d/cio.c | 240 -- src/lib/openjp3d/cio.h | 105 - src/lib/openjp3d/dwt.c | 1158 ------- src/lib/openjp3d/dwt.h | 106 - src/lib/openjp3d/event.c | 189 -- src/lib/openjp3d/event.h | 63 - src/lib/openjp3d/fix.h | 68 - src/lib/openjp3d/int.h | 138 - src/lib/openjp3d/jp3d.c | 2559 --------------- src/lib/openjp3d/jp3d.h | 525 --- src/lib/openjp3d/jp3d_lib.c | 85 - src/lib/openjp3d/jp3d_lib.h | 80 - src/lib/openjp3d/libopenjp3d.pc.cmake.in | 14 - src/lib/openjp3d/mct.c | 142 - src/lib/openjp3d/mct.h | 102 - src/lib/openjp3d/mqc.c | 585 ---- src/lib/openjp3d/mqc.h | 206 -- src/lib/openjp3d/openjp3d.c | 234 -- src/lib/openjp3d/openjp3d.h | 736 ----- src/lib/openjp3d/opj_includes.h | 83 - src/lib/openjp3d/pi.c | 709 ---- src/lib/openjp3d/pi.h | 150 - src/lib/openjp3d/raw.c | 96 - src/lib/openjp3d/raw.h | 104 - src/lib/openjp3d/t1.c | 1294 -------- src/lib/openjp3d/t1.h | 179 - src/lib/openjp3d/t1_3d.c | 1366 -------- src/lib/openjp3d/t1_3d.h | 173 - src/lib/openjp3d/t2.c | 731 ----- src/lib/openjp3d/t2.h | 108 - src/lib/openjp3d/tcd.c | 1948 ----------- src/lib/openjp3d/tcd.h | 343 -- src/lib/openjp3d/tgt.c | 271 -- src/lib/openjp3d/tgt.h | 131 - src/lib/openjp3d/volume.c | 101 - src/lib/openjp3d/volume.h | 48 - src/lib/openjpwl/CMakeLists.txt | 64 - src/lib/openjpwl/README.txt | 136 - src/lib/openjpwl/crc.c | 167 - src/lib/openjpwl/crc.h | 89 - src/lib/openjpwl/jpwl.c | 1458 --------- src/lib/openjpwl/jpwl.h | 438 --- src/lib/openjpwl/jpwl_lib.c | 1944 ----------- src/lib/openjpwl/libopenjpwl.pc.cmake.in | 15 - src/lib/openjpwl/rs.c | 625 ---- src/lib/openjpwl/rs.h | 113 - src/lib/openmj2/CMakeLists.txt | 64 - src/lib/openmj2/bio.c | 206 -- src/lib/openmj2/bio.h | 131 - src/lib/openmj2/cio.c | 214 -- src/lib/openmj2/cio.h | 100 - src/lib/openmj2/dwt.c | 965 ------ src/lib/openmj2/dwt.h | 119 - src/lib/openmj2/event.c | 137 - src/lib/openmj2/event.h | 64 - src/lib/openmj2/fix.h | 71 - src/lib/openmj2/image.c | 99 - src/lib/openmj2/image.h | 53 - src/lib/openmj2/int.h | 135 - src/lib/openmj2/j2k.c | 2778 ---------------- src/lib/openmj2/j2k.h | 456 --- src/lib/openmj2/j2k_lib.c | 65 - src/lib/openmj2/j2k_lib.h | 59 - src/lib/openmj2/jp2.c | 1215 ------- src/lib/openmj2/jp2.h | 234 -- src/lib/openmj2/jpt.c | 168 - src/lib/openmj2/jpt.h | 81 - src/lib/openmj2/mct.c | 198 -- src/lib/openmj2/mct.h | 104 - src/lib/openmj2/mj2.c | 3089 ------------------ src/lib/openmj2/mj2.h | 396 --- src/lib/openmj2/mj2_convert.c | 385 --- src/lib/openmj2/mj2_convert.h | 47 - src/lib/openmj2/mqc.c | 629 ---- src/lib/openmj2/mqc.h | 206 -- src/lib/openmj2/openjpeg.c | 389 --- src/lib/openmj2/openjpeg.h | 958 ------ src/lib/openmj2/opj_includes.h | 143 - src/lib/openmj2/opj_malloc.h | 166 - src/lib/openmj2/pi.c | 1056 ------ src/lib/openmj2/pi.h | 165 - src/lib/openmj2/raw.c | 98 - src/lib/openmj2/raw.h | 106 - src/lib/openmj2/t1.c | 1628 ---------- src/lib/openmj2/t1.h | 153 - src/lib/openmj2/t1_luts.h | 143 - src/lib/openmj2/t2.c | 884 ----- src/lib/openmj2/t2.h | 114 - src/lib/openmj2/tcd.c | 1663 ---------- src/lib/openmj2/tcd.h | 305 -- src/lib/openmj2/tgt.c | 231 -- src/lib/openmj2/tgt.h | 121 - wrapping/java/openjp2/CMakeLists.txt | 3 - 136 files changed, 7 insertions(+), 59752 deletions(-) delete mode 100644 src/bin/jp3d/CMakeLists.txt delete mode 100644 src/bin/jp3d/convert.c delete mode 100644 src/bin/jp3d/convert.h delete mode 100644 src/bin/jp3d/getopt.c delete mode 100644 src/bin/jp3d/getopt.h delete mode 100644 src/bin/jp3d/opj_jp3d_compress.c delete mode 100644 src/bin/jp3d/opj_jp3d_decompress.c delete mode 100755 src/bin/jp3d/tcltk/LPI_JP3D_VM.tcl delete mode 100644 src/bin/jp3d/tcltk/README delete mode 100755 src/bin/jp3d/tcltk/Thumbs.db delete mode 100755 src/bin/jp3d/tcltk/decoder.tcl delete mode 100755 src/bin/jp3d/tcltk/encoder.tcl delete mode 100755 src/bin/jp3d/tcltk/logoLPI.gif delete mode 100644 src/bin/jp3d/windirent.h delete mode 100644 src/bin/jpwl/CMakeLists.txt delete mode 100644 src/bin/jpwl/convert.c delete mode 100644 src/bin/jpwl/convert.h delete mode 100644 src/bin/jpwl/index.c delete mode 100644 src/bin/jpwl/index.h delete mode 100644 src/bin/jpwl/opj_jpwl_compress.c delete mode 100644 src/bin/jpwl/opj_jpwl_decompress.c delete mode 100644 src/bin/jpwl/windirent.h delete mode 100644 src/bin/mj2/CMakeLists.txt delete mode 100644 src/bin/mj2/meta_out.c delete mode 100644 src/bin/mj2/meta_out.h delete mode 100644 src/bin/mj2/mj2_to_metadata.c delete mode 100644 src/bin/mj2/mj2_to_metadata.dtd delete mode 100644 src/bin/mj2/mj2_to_metadata.h delete mode 100644 src/bin/mj2/mj2_to_metadata.sln delete mode 100644 src/bin/mj2/mj2_to_metadata.vcproj delete mode 100644 src/bin/mj2/mj2_to_metadata_Notes.doc delete mode 100644 src/bin/mj2/opj_mj2_compress.c delete mode 100644 src/bin/mj2/opj_mj2_decompress.c delete mode 100644 src/bin/mj2/opj_mj2_extract.c delete mode 100644 src/bin/mj2/opj_mj2_wrap.c delete mode 100644 src/bin/mj2/readme.txt delete mode 100644 src/lib/openjp3d/CMakeLists.txt delete mode 100644 src/lib/openjp3d/bio.c delete mode 100644 src/lib/openjp3d/bio.h delete mode 100644 src/lib/openjp3d/cio.c delete mode 100644 src/lib/openjp3d/cio.h delete mode 100644 src/lib/openjp3d/dwt.c delete mode 100644 src/lib/openjp3d/dwt.h delete mode 100644 src/lib/openjp3d/event.c delete mode 100644 src/lib/openjp3d/event.h delete mode 100644 src/lib/openjp3d/fix.h delete mode 100644 src/lib/openjp3d/int.h delete mode 100644 src/lib/openjp3d/jp3d.c delete mode 100644 src/lib/openjp3d/jp3d.h delete mode 100644 src/lib/openjp3d/jp3d_lib.c delete mode 100644 src/lib/openjp3d/jp3d_lib.h delete mode 100644 src/lib/openjp3d/libopenjp3d.pc.cmake.in delete mode 100644 src/lib/openjp3d/mct.c delete mode 100644 src/lib/openjp3d/mct.h delete mode 100644 src/lib/openjp3d/mqc.c delete mode 100644 src/lib/openjp3d/mqc.h delete mode 100644 src/lib/openjp3d/openjp3d.c delete mode 100644 src/lib/openjp3d/openjp3d.h delete mode 100644 src/lib/openjp3d/opj_includes.h delete mode 100644 src/lib/openjp3d/pi.c delete mode 100644 src/lib/openjp3d/pi.h delete mode 100644 src/lib/openjp3d/raw.c delete mode 100644 src/lib/openjp3d/raw.h delete mode 100644 src/lib/openjp3d/t1.c delete mode 100644 src/lib/openjp3d/t1.h delete mode 100644 src/lib/openjp3d/t1_3d.c delete mode 100644 src/lib/openjp3d/t1_3d.h delete mode 100644 src/lib/openjp3d/t2.c delete mode 100644 src/lib/openjp3d/t2.h delete mode 100644 src/lib/openjp3d/tcd.c delete mode 100644 src/lib/openjp3d/tcd.h delete mode 100644 src/lib/openjp3d/tgt.c delete mode 100644 src/lib/openjp3d/tgt.h delete mode 100644 src/lib/openjp3d/volume.c delete mode 100644 src/lib/openjp3d/volume.h delete mode 100644 src/lib/openjpwl/CMakeLists.txt delete mode 100644 src/lib/openjpwl/README.txt delete mode 100644 src/lib/openjpwl/crc.c delete mode 100644 src/lib/openjpwl/crc.h delete mode 100644 src/lib/openjpwl/jpwl.c delete mode 100644 src/lib/openjpwl/jpwl.h delete mode 100644 src/lib/openjpwl/jpwl_lib.c delete mode 100644 src/lib/openjpwl/libopenjpwl.pc.cmake.in delete mode 100644 src/lib/openjpwl/rs.c delete mode 100644 src/lib/openjpwl/rs.h delete mode 100644 src/lib/openmj2/CMakeLists.txt delete mode 100644 src/lib/openmj2/bio.c delete mode 100644 src/lib/openmj2/bio.h delete mode 100644 src/lib/openmj2/cio.c delete mode 100644 src/lib/openmj2/cio.h delete mode 100644 src/lib/openmj2/dwt.c delete mode 100644 src/lib/openmj2/dwt.h delete mode 100644 src/lib/openmj2/event.c delete mode 100644 src/lib/openmj2/event.h delete mode 100644 src/lib/openmj2/fix.h delete mode 100644 src/lib/openmj2/image.c delete mode 100644 src/lib/openmj2/image.h delete mode 100644 src/lib/openmj2/int.h delete mode 100644 src/lib/openmj2/j2k.c delete mode 100644 src/lib/openmj2/j2k.h delete mode 100644 src/lib/openmj2/j2k_lib.c delete mode 100644 src/lib/openmj2/j2k_lib.h delete mode 100644 src/lib/openmj2/jp2.c delete mode 100644 src/lib/openmj2/jp2.h delete mode 100644 src/lib/openmj2/jpt.c delete mode 100644 src/lib/openmj2/jpt.h delete mode 100644 src/lib/openmj2/mct.c delete mode 100644 src/lib/openmj2/mct.h delete mode 100644 src/lib/openmj2/mj2.c delete mode 100644 src/lib/openmj2/mj2.h delete mode 100644 src/lib/openmj2/mj2_convert.c delete mode 100644 src/lib/openmj2/mj2_convert.h delete mode 100644 src/lib/openmj2/mqc.c delete mode 100644 src/lib/openmj2/mqc.h delete mode 100644 src/lib/openmj2/openjpeg.c delete mode 100644 src/lib/openmj2/openjpeg.h delete mode 100644 src/lib/openmj2/opj_includes.h delete mode 100644 src/lib/openmj2/opj_malloc.h delete mode 100644 src/lib/openmj2/pi.c delete mode 100644 src/lib/openmj2/pi.h delete mode 100644 src/lib/openmj2/raw.c delete mode 100644 src/lib/openmj2/raw.h delete mode 100644 src/lib/openmj2/t1.c delete mode 100644 src/lib/openmj2/t1.h delete mode 100644 src/lib/openmj2/t1_luts.h delete mode 100644 src/lib/openmj2/t2.c delete mode 100644 src/lib/openmj2/t2.h delete mode 100644 src/lib/openmj2/tcd.c delete mode 100644 src/lib/openmj2/tcd.h delete mode 100644 src/lib/openmj2/tgt.c delete mode 100644 src/lib/openmj2/tgt.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 136d7287..299f74c3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -264,20 +264,16 @@ endif() #----------------------------------------------------------------------------- # 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) +if(BUILD_CODEC) # 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) @@ -367,14 +363,6 @@ if(BUILD_PKGCONFIG_FILES) ${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) @@ -383,14 +371,6 @@ if(BUILD_PKGCONFIG_FILES) 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() #----------------------------------------------------------------------------- diff --git a/README.md b/README.md index f703d0eb..7e9ae65f 100644 --- a/README.md +++ b/README.md @@ -29,18 +29,12 @@ The library is developed and maintained by the Image and Signal Processing Group * 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 @@ -57,6 +51,12 @@ See [INSTALL](https://github.com/uclouvain/openjpeg/blob/master/INSTALL.md) for See [NEWS](https://github.com/uclouvain/openjpeg/blob/master/NEWS.md) for user visible changes in successive releases. +## Deprecated components + +The openjpwl, openjp3d and openmj2 components have been removed after the +2.4.0 release. Their building and working state is unknown. People interested +in them should start from the 2.4.0 tag. + ## API/ABI An API/ABI timeline is automatically updated [here][link-api-timeline]. diff --git a/src/bin/CMakeLists.txt b/src/bin/CMakeLists.txt index edf85feb..292fe5a7 100644 --- a/src/bin/CMakeLists.txt +++ b/src/bin/CMakeLists.txt @@ -4,18 +4,9 @@ add_subdirectory(common) 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) diff --git a/src/bin/jp3d/CMakeLists.txt b/src/bin/jp3d/CMakeLists.txt deleted file mode 100644 index 3cac1a8f..00000000 --- a/src/bin/jp3d/CMakeLists.txt +++ /dev/null @@ -1,41 +0,0 @@ -# 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() diff --git a/src/bin/jp3d/convert.c b/src/bin/jp3d/convert.c deleted file mode 100644 index 4e4bea9c..00000000 --- a/src/bin/jp3d/convert.c +++ /dev/null @@ -1,1051 +0,0 @@ -/* - * 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, Mónica Díez García, 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)); - - /* Separación 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"); - closedir(dirp); - return NULL; - } - /*if ( maxslice != sliceno) { - fprintf(stdout,"[ERROR] Slices are not sequentially numbered !! Please rename them accordingly\n"); - return NULL; - }*/ - - for (s = 0; s < sliceno; s++) { - int pos = maxslice == sliceno ? s : pgxslicepos[s]; - f = fopen(pgxfiles[pos], "rb"); - if (!f) { - fprintf(stdout, "[ERROR] Failed to open %s for reading !\n", pgxfiles[s]); - return NULL; - } - fprintf(stdout, "[INFO] Loading %s \n", pgxfiles[pos]); - - fseek(f, 0, SEEK_SET); - fscanf(f, "PG%31[ \t]%c%c%31[ \t+-]%d%31[ \t]%d%31[ \t]%d", temp, &endian1, - &endian2, signtmp, &prec, temp, &w, temp, &h); - - i = 0; - sign = '+'; - while (signtmp[i] != '\0') { - if (signtmp[i] == '-') { - sign = '-'; - } - i++; - } - - fgetc(f); - if (endian1 == 'M' && endian2 == 'L') { - cmptparm.bigendian = 1; - } else if (endian2 == 'M' && endian1 == 'L') { - cmptparm.bigendian = 0; - } else { - fprintf(stdout, "[ERROR] Bad pgx header, please check input file\n"); - fclose(f); - closedir(dirp); - return NULL; - } - - if (s == 0) { - /* initialize volume component */ - - cmptparm.x0 = parameters->volume_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; - 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); - opj_free(volume); - 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); - - snprintf(name, sizeof(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); - opj_free(volume); - 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; -} - diff --git a/src/bin/jp3d/convert.h b/src/bin/jp3d/convert.h deleted file mode 100644 index 255717e1..00000000 --- a/src/bin/jp3d/convert.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * 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, Mónica Díez García, 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 */ - diff --git a/src/bin/jp3d/getopt.c b/src/bin/jp3d/getopt.c deleted file mode 100644 index 855b9ae5..00000000 --- a/src/bin/jp3d/getopt.c +++ /dev/null @@ -1,119 +0,0 @@ -/* - * 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 */ -} diff --git a/src/bin/jp3d/getopt.h b/src/bin/jp3d/getopt.h deleted file mode 100644 index 935171ba..00000000 --- a/src/bin/jp3d/getopt.h +++ /dev/null @@ -1,14 +0,0 @@ -/* 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_ */ diff --git a/src/bin/jp3d/opj_jp3d_compress.c b/src/bin/jp3d/opj_jp3d_compress.c deleted file mode 100644 index 901a14f8..00000000 --- a/src/bin/jp3d/opj_jp3d_compress.c +++ /dev/null @@ -1,989 +0,0 @@ -/* - * 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, Mónica Díez García, 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': // Transformation 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 optional - */ - 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; -} diff --git a/src/bin/jp3d/opj_jp3d_decompress.c b/src/bin/jp3d/opj_jp3d_decompress.c deleted file mode 100644 index eb7ebe8e..00000000 --- a/src/bin/jp3d/opj_jp3d_decompress.c +++ /dev/null @@ -1,601 +0,0 @@ -/* - * 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, Mónica Díez García, 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; -} - diff --git a/src/bin/jp3d/tcltk/LPI_JP3D_VM.tcl b/src/bin/jp3d/tcltk/LPI_JP3D_VM.tcl deleted file mode 100755 index 37657b27..00000000 --- a/src/bin/jp3d/tcltk/LPI_JP3D_VM.tcl +++ /dev/null @@ -1,115 +0,0 @@ -#!/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 .] diff --git a/src/bin/jp3d/tcltk/README b/src/bin/jp3d/tcltk/README deleted file mode 100644 index f4e2e359..00000000 --- a/src/bin/jp3d/tcltk/README +++ /dev/null @@ -1,13 +0,0 @@ -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 diff --git a/src/bin/jp3d/tcltk/Thumbs.db b/src/bin/jp3d/tcltk/Thumbs.db deleted file mode 100755 index 5d6ffdf99eb8ebe582a94fa45d711c3e0bb856ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18944 zcmeIZ2Urwcw!d2l2nZ5Hk|Y%nB}$gqB9cXvoO4EUj!pOgCAENnB9al1BstTPGf2)E zBtw%MXuAK!_syI+Gw0rOXU>^>?=#Oc8(yk+)$Xd=p*Cy%_Nt!)WDDsfcNT%aNfH1y zfW{C2*Z(KWD8@YUc2lN4YK*4h|&1Ga+YAG`jc zzofvm|ET}pd;O~mp#O9g-hb$7|F!T{{jcWWtLOIbz5Z4G`L8B#FkSV<)%QKX_P|VF z764KO8F?813p}Y2_yb_3!6w4KcJ1mHOgP{#EqFtDC!rrYCc-me#iRj?S*`q2ZCyvGIw?sl}z`mDOKs>l>T< z2Zu+;C#T4>^Q(Gc0oZ?3>pyDtH}xU|>vatW2O9_Ps$N*vJV3C?aB%POT)!px8qe5? z{623W{_STm=_O4BOnfQ`3KQqS8s)pFG|ataV+!=J#wTvAbf1_Zv1Tg9cql|83vCQOcJud=-ZQ#(hW9 zi_6j$3=lb%D`i>a`*dW-&xGRLk~&~YV)OTQn#y}eU_hpnLilY zvQHuxN85P66|UO{!2nTe^N5sn_>qb+2Ke#E4w7%kQwTfKhXJ940osP474^_d3_y$l z=HFoeWG$q`W#F9H&<6wXu|{T`WT02k&s&x%Kc^3z1TM`&S~cDXc3GW{InCs44?gBe zr{^t>7QPujF$8US<_SgnWnqA(ub(hLmz(B=W(Rmu#NH(`6$3=%NEUg{5!R`Cx>A<= zyfsbi3N^aWd0JS-CFAJX=QiAAIiaBBXMam!Pu=6RQhDt0q4yv(aYYLQg#L!W0H_Oj z3=piuhXG>O|Ld;J$Q1T{->Sq2`&xzR?3wSa21D+mlrqvYQbx(#%ucF}`OCe&utgLG zsBjR%093lo(aEL~!vNP&&Y{m5BEhmD!IAKA;iesP zTLKv~LZP%YvNXSiIii~6v-REg)B(>bg&B7o-qJ7%g~{z*yz4*@Xfz3(pSCo-{Pj>% zr8@cS;3>Z9XTpRZ11wT}ro!#Yc>|m;WSkPm(~pyWCR;vi%c?7{f`7^~V5m3CRBFqb zyNvGKxsHhb%5WaXA>GQS>hjOi0)vBkYu0j#8?9?U zPuL1J6Ta8soNT&l7XC{B77knNdv?&TOo+_Xpggdna!+{wF?+%Bx9*xXrkD{%g&qtL zg2c!1mDtb2t1b=30I>1t7WTFg1*h<`!|+Sx`&v_^zJ+KKRP@2HV#FI2DS_n-zxktB zwdD~@ylm|+47BY0F>{)V5k_WlR+bXZz8zNBti=F{u@(dIes2nI4fDG9Y1ruP?-81n z(f1xxuPW48?h#++XN@33u`z(M#wB#CR5Lz2TSV+N^sBtlHUc_H^qqs!!wF zEV$~jtVEK>#*=nRXVUPxM(j0LaTpvY@PxC&B6INDZ=Ac1u&~gZZNE`+<19+*BM@?K zzqV^v<9^zN4T*QrdBekZ*{ChiMc*32Y_(#>by+H9O2b-=0dy)1+fx`46UX_DoS#Jh zVxc|-j&o@>5$)-W zp_4$Jj9}P=nyK)cXqSnVlrMbA?IuW_l%p5p}f9d!vJ>rX{QjQ%5Mx1 zq}}2`xFDs5#G|3bu{Q;4RF9`;(#*7h=~$jlHo3biq;hwItXF1=inu?c{gp9*g1L$P z2ToM}!Sh5;hfA1Go{nOUjbL}F0=?-iyougvkI<$Tdxj2y-u0=rw(WzLu3HXlFP&B% z{N$+%<+#qb=@O$~nV#K36~@KCMa@+Cn@%~IH0jhgK_fr*fv_NfoL9v*uj17@llTH7 z=~74}r^gyozigr97FR`W=^;DZblqbo{kdu_L<(7E#d^Ycv`)y;x;n%A%q%^>mag%N z_#fLcHjCVz65Ae{l&9^iwl@Dl7kMDtjkoWkaq`W{js^pK1t+)lks_UbL}Dg?_(%>z zrfJ6dxaN7(XhT%8hoA2=gm~j+^b$u0!hy29FR$d6_njg=3%mPhaUxKfyJR%69B_79o3yFbpgw z2}>f{0(a<2aP$kmb0v)P&)tIQlL&z!X0Jm&f+Pc=@(_Uo6(Z>s9_Sw*nN z7~nVB#UvY;%^dAurOfIb4aD*HS1m!+2jaGch|?f37Gp05r^P}h#o_Gvi=HT<7tz>J z(Zc4EGs`r4YI|Z#`N~kw{b~Df-5PUkoV-)*2K)hs{_=X(#Rf&0+FLKVOkko()Mk;H z4Bm&+PN-1!%C8VI4Px@V2X(@Njmy-=8>)%?MsWvnTc#yE-9_dccTp!FShRvqiq*j7JCHbS&v)NS=%V$O*vV{rgZIZ{dcacu}9kx>@#>qf9u| zB+~E1HpslOlcjL@g#l8A{8JazGoy0$$0P2kV9VzEX2n>sSsaE^+;M z6yuD?p%4<0i%6X&@om0sg-o74W?uIgo*L!c&Rnx$<`lJ9JB5Qcyn^G8f-8anf4ya< zV}XY2q4ujhO}ScqcX7jI1()!OfN#1S6Q#0+)-Ju+WJH<@{S!2IiPyrDU=Sz!9P!$n z@5^-bm(vu5h0@=6nTK|)8D7dQlu?Q|C@F^isYza+r5vSLHh9_!wr88Ge}SrJp*us{ zIpPw!gvCWtn_=Hug>m7^i0s2hz60Ll7cRUQAobv)>pY%h<+-Z%%*!8*`M%F87qY%$ ztzE*T!i(+j%l9ne=!mvcb#8-5RYqSU54o4C?LsRVl`!Nhn>Rfz$H6m>RHn&u=CT&9TL{lfNC4uAg~ z^2maOvwOzIGjczINN{gG^$uUoNbEw!Ey=b#*4LQXk&J~7a(ZHqRn=21ZP9*V)0bYZ z6B;l5RP=LNq?{xGhXbGXg$;$=U1tI&=J9ns2I^Q3p&S{$4r#ni8$PNRfs-G#M zs#UY`4l;l_+U{|i!|ha?d*6T7)>cvk`=Nk>+p*VeR}J6Im$JT-c#Ix{lN`^}ZFpBj z_~PauWjNXO$7M1dOx@hP-?=K{M4LGlGQVpMcr3SVyRCc|0YNf#RY58=qxzEhbhT3n z4bDhsEr9EHjcx%0X+;BQ0_zJtnzWHd_ASa!b+t*heuRC7#~O&oLPAoP zYXsL$e;K4{&NLDsc@~NTHKv}!iTtVM9iYZIwI=Ou5ARu4)}&moiPcV#wWbjZSP)e1 zR3l3|N)4MQaRse8(E99;%aL+$u(LMeSO^+D%_5biQHvDBGL7Bseaf=p(*BfgB6UIS z2pW?OiI(`P`APPZdez0y-hemSqvkX@1jY;F&EJzKcgR>?;qZ#rnLYK~Ysy5Yg2vbo zd$|7ESbE7DiRv~YL9YHNHTZzUdm0XQkM zu>)p#Id)(I9vWkrW368g<%cbj`Nc@wa-TTo*|(* zuOGcsmXpu%5*5uFYv*77tx)E3-osgG`*HJM`r#X#J6TmhWBB)D+^ZwWs@-VTlJArz zjYQO)k_tMFDpTLxAE?^&vt_;DYl9!L&O;aU!Ka2X^RKhH=V&OZ0*WAj9x$CZV%I|u zENF{Zn?vS3L2S`)c{5r^DtzO4U92Oc)nck{4mo`md1T?Qq$p>!%pIKumXDdos7@>+ zpzF$wpa)S0K|^H!I;)^Hb0Xi?UYL5yf&n_CUj1NoUBm!^+=mZltmbSOw+AROz|T}a zaF;t2ly09-Q+*lYE1|jqk5pBp*$M7i= zK@cI3Cm_NgA|Rq5Vj$um5+D$ery!Cb&p@O=o`Xn($biU#$bra%D1az}yZ})Gc?qHn z@(ScNhzf`*h#H7Ghz5uzh!%)8hz^J@h#rVOhyjQph!Kb}hzW=(h#81Ehy}=%7HI`y z4Ppag3-SiU4#Xbhs{a2By_^(O`mg%k=s$5aCIXVujjps>AFze^!4{SRTSo|NDM7FY zq`_8w2Eqv*c@8`Vk8*-}A+Y4tQC_g!pZuQZ0rx!rJ^u{+;8_` z-?iYY>pcVq*uR4Q$p3Hs@lU$yzrOycnh~CtZ&R5>ndp&cIKxsHm8B$h*y&i35n0A) zgbO$sQb-7UDlXp8ZYi>P6=nE}uV*Jh=sSzJTT=M;Nnm@KP^5Mv zIpTPB+GMz8N_2WtB^QWgkh;q&aa~UO#$)f}Vus5Mh}jv`rZ|9sb)PuL#IEt4jpc>z zbNR5nH|g(`C$~%ecaNB>(Wu`}D9%9r4`-{ib_fI5!$Ze}V(O_hrb1?TTkf_n6=wf1 zXDY$D16-EvU;nbiNU#C7ANS|hT_2Nfh1xa_7v6@{P>@=Ro6{n0sfhf%cvDc6`{sOs zw|}O!O`vJT7pgb*z&gDq;~sYd;QyX++F{`-57xeF%S&^k+*`+5vED>CPHrmeejhB? z{bF#kDQYJ;b-gBOwV#YheMT$wsc`Y?fD~k3bQm;Emmrt;nn&^b`Dmr$cIXNFEOdkK z6&~Gu)!O!XQK$dIb)UqzceEJbU7;b4{}cqbkqMcpjMxiB`F-7-8bviKRb*kE${|_l zibSx-;K?GF1{fg7&%gH(0={S&gnqD9nJy-~1ShxNGGaDNBBbwCgGsT@o#UpFjC?y} zeES?FxgY&`;Yp((7mJc=D~{{q>z8dMrwP(sj5AST`2F8VZ(KTA~|10M(H5Vb*_ zB4aMtQbF?{p#lkk+;$~YN@3U+On0pfYK3z)oKEDhz|!9P&hK3>{uv&$)IGP8ZoMe4 zLx594^-4hke@2{`faWxfBm%lnJbz%R2|b}JK|2_RQe2Xvv@S~_marRJ=ZQh+yPjn) zV6VS_AS`588?t9rbL7prPN~||$t3P65S)R$IPpO4FBsCZw&W|{^bFck9Nc|S?PCYD ztXQy4dC1?0T%j{s3kOi5NEX&;HweRq0TqI{&L_jx|6Xl)Gn1|FNj`g-F?MOnC-JQ@ zxQ#=oVL1de@~zD?Q7Zeyg&vt(-2 z*e)$9l{R^o{w2^O1h}V>B=AGdZf;Bmf?^kb^eO+KZV84W zXEj91UT`8k+Q;!9?2moQ^{X;0se48!vLhKQJl;1 z{#HW4EBVBA_hGL6;%~RYFI<`oZdV{=Lyj&fd&@fP7#J*9*WMp87x|QxSg_WZKBbeX z@uF%q40lH}XlndKu?^aYeCnL$+@~!}gY1&bKR!OlAL=_Ujr{yJ;FycOTg>!AbiE4A z*0>K1+u`4W+?soT8e=0E;bfls7)vr9f2J_tIifpTJ&qHCFKv z|4EfQ{R{J1y}X^8+vkB#89Jvb!u_^-+|Ii*&qwTvt-~FsqS7Qn-7vtN1O6(Wk+`0*Ep<=3OI zX{JN5wJN*smwO91T;eWU2E~2|nOTcrf%)53cPt~1S?VHh-f13sQobX>^nOT|+_cYp zdF_2%*AIjEF>Oz7S?lsvXlN~c0l7TeOq`_yIyw!;fe@Y{agch-7-(3sJ-7j{;BKy~ ztJ2k#^OdqVQ0AFxn%xe#GU^=}DtjvL77)Y(mRHZFni4a=hhabIQA_W#_?d zzjnV$g#Q|r+|En_BZ3ZbQ~UdHiq_;WghjkVgyRNjIBy@8p(F{$UIz->%j`kjCj!*`qmQsmjzn&qs?l63- z>hhum^2y$rOw#nLS9MoB zu0Ph@BwNZUZ2un=p16fME4y#x`j3Pr6JZv50MjreI@gC ztcy8?#ZdWnm&2;@AZO{@uW-D>TKa@k+^rwfDviO-*vZ+VK1Y}V^>lGVUoZeZZdg3O z$F#yx(TP5;o0Vid@T)FPWy5U6^bcLt$1iI9p@x0J0#=yWD%2eQzaA7 z(rjoNAt+Pr6KvvUW2}l|cHawiPa{{{=b-nJm%<+c!@k%#)*g4B4=TDISUc4_(l9gf zR=U6e`-}Os(*Z^4+gN|?F#i#^-~jq2uRvdg3-lYTfA=5$@QSdnEbWf7797x$mje9< zYrqloHXJ~&!x{88t}OQ}zv+LI!1#lIIR4?vSN!~^_=_u_?SGT5;vcU3mn)y*?~Q+W z43>?!3SjytrK{`yIsKDP`464u&)2@%{zG2`3t##4SN<35Unc&;@Za$tzsI%w%llvF zhE0rkW+P(kIW{D@Vx8a&B{M+zRIaJK!ErNG26$AmKTjeZ(qJ^EHlrjkAeW_^h4$o3o|C&`Yp+yJi4GofjASnq53@Y@$dX|ycwkHx7v*iyeL`nI0#4Gds)mlYy3`Ji(R zT|2^u!Xd{YEacafkx&#CKK~`9e-gi3_h`{!=cd&2ifUptS=+pVtpJgPhaZJ+wnM^- zzZT}aJ=%G;wLMlF65rQ9gnq%7-}v(>D|YfV*|k??+ilRE`DVxpBo~y<6ZfINyo6AE zpv9RUV5UCgHr0ZILjBa178)j(dOW4Gz1?5yoXvY!mn=6$q+G+gAS#EBX0g4*Rq(Z z`5aJB9)3tlgUcCw-!WBD(WH}ze(Vs`7p zwM6*iJ}?!gI?o3SXdi)%)JPsX{vuU{Rk3mwx2(MsYvoZVaW}~mdRZO6{&bJL0WsL3 zxUrd>2{vcW^ayvCL1?%p@d(SnBddBRg0+bly178zGtJI4szq04dbdrpx@EcW& zS}E-`#_x3IW;uH!Zdt>u0^b^VnGkIKprKo<@V%6^iM6d0WkO_RRh6aBiP107$lu7~ z?5n00_q=#T=fRY!FjxMQ(;|pQXKMF4lSdrqNXYxRx|{Fhm|Ztz?WHAM>|XamXLcB+BdD3W)V!w=;h4G(Mj)N_WWC`4vs`c7AfE z!^sD~GDQ(~kBhp4T~GpPAxs!tAp>+RRYtrgcsRkRykBtI5G1}SJ@B!#Ttdr4-uwyE z-R0s2ttxh2g&!|M2p?(FiUl6uFY{>3a6{4H#7bkuWkqX z!J5Bkzvrf(lMWOSt!oPCVS!5(#L&-U{`qb`w#7oRwNazB zrJ+@o&&`3{H77Tw_kOmza#mdC#vaBV)bG!NY(JldnCLg)YdmS9_gaN>GCh)?S{kG% zC%MTL=#{6(GP^TB{guzlLnTZLIsqH>uaP+JMR|csZ6U9V-jSW4m+#5ppwSYj@l0vc z%)Yvw*fFIXJo_r)Hm{ByT#9%Wp&aCdV!OXl3EtBbo6uG5Ci8qTUL`Hstkxt{RNmY5`A<5t8 z=FXgWQ#qMEjCh@$I({DK9-R&ggiujN(6>6)rMbFKSC`iL`5VC#*!g#I`%)`6zH$p~ zZ>_?XFI1Ng`_z)B=alG9qD`au-8_d(Hdmqvy2M~xM=cD^1bnr#_{>%F_F18jT*i2X z`!~$Z-o4JcXysXpRQ>gaL*16v@0n<>{e5i{>-g~Ro0_;#ran~%Tq`Bkk5lSp^06Mg zW?+1upHrKyG|k&iN8*#&(~?W^Z%^eRuF!eIOPiSF`FBSVqHT3`Dcv-?_gu;PxKdC0 zl3nrPqTUEck<$WdySrshPPl~)^<9(C7#_yZ3~!Ed>6OsI0=iKh zXbGlsO$~~ww>cgsiND^ZHun{WW=J8nnzKYqFWANzSuc4ErSuslp^d4hO`vPMhQ32O zPwdMk^Vs$C%V5TXHruQMcIYjG0w?6_HedZAfhd>7lRV>$`Hmc$aT#_W+ksC+Tn8Du zGrXEXUf2Q)C#lyY*r(grs#?8Bo8^;Rme_MYkfy~-1}p=4o8E^zM+5I5EA%9n{yNZ& z=dKA7)Wfb@QO`W@KH}W(-D!9Sd1xSf=82t?c0_&7QTHT2!8rMm4A)MBNvhm2x9;7ttp~Utc3hWcdoiV>eqkTFCIFwE^AGN=39T6athI zFpWI$n>M_-IA~!XIi_>Xk65e|sEo#DS#FOgcWC%nDL&DtJd&gwdHAqS#1)QEgLG1n zEKJpY0QERQua4$=JaNj?KJCcKwgX>uFZ6T)v z=bovcZlPW|FZ;LHuwD9WZDOfMccX2UT~hRBCq*W;kcZ9lh*vAf;Owo0Ltj42gpMZV z<=fHInziq;W4KJCI5qvUEZu+M^}VfKb<9d$-gLmXrn)m9QeG&fH(Y#lQ)hGXLCrAJ zxP6hv>@s`qZ?5-|Jm{ImsW5i z!NnwwogP^@Xxdp7aZN7j#~42=;t2q#I~En(giUSi=K?Z4zKLOg4iOv?Xec*pMct^$ z7k6B>=XRxb7$0>PzPogpVpyo*F@0o<<~y!_0h7)+WzZ+-sbf!zokzIXuI z%+Cv5<2!tXMvY*L^C2H*bgtE^=Q0goqqU0PIO#KKzBU+EB{SGxZ0q&t#k> zj0Y(Ci(3-O&Y)9TFb@CcF;wH`a=gn$jX-J#+Dm%11KJd3N#WWv=PP#b8f66>HgqK^a3Ya}D8p9~*Vy zh6X%s91xNu{NbLFm1xO3&wJAmP4Y}Z=*zB+qxQt9&*&g9YU}h8+6=1@y2P~u<3YiQ zuMpc~Pp~#^r;4a|C&gz_3bg6b?DfMJLHMSl=AOg$7(n1f_I@O)zjr2ZYp(LHY&8Cu zw%8=aQ)|JU8J}eL0_FdFG9{Pg9Z^{;PK$Egt{c}Z0;irjJ9QBT*b4ttT#QF6qr#&U zcMDHxnR1IrmK{*BeU=+|=;-M3Vl=CDV&zv+AKTBuytKX11d7IBBX!K@{M^@bXe*|f zw1E=~uzM!F8ul{QUUp;T=t^Fd5phas$k!8ikUwmDmgv8(n&jjk_SZ5Os8IYn{lC!y zf7XAXpdR+Gu>NiY{9FI|UY)tZ^gHj7p4=0fy$v1g zg>NM)_U%I*P8S^2Do>hP=VtR85vO707ll-^bu}eHx=ptBzbqpuXG(JMHrctgYfCG~ zSFMheZv0vjIP7aZb&?hlrs={ZB!)ylvfb7C_xF=CzP*{3!vHb8-=Db0IiU>ClE+aG zJ5MOkgHK=jJCydt3|zY9vLXrB{z~;RNOV~06E9du_=N#pR>hAhwsVsO@pN?4Mjkk& z92YlWfLb^hHmFmkePRM%U0Y;4U>pG>y?c=GLoq`%4JbeSY!X6a!NJ#NWdG26LjTZv z8qzvjXw=)CIxxVuFVz?RY8asEkn!vcDT@lZObtaFwqbxzOYpxHVU#b4$e|11%Jsh6 zW(w2T*TI7Nb*730r5|romzSwQ8bX z+lp>aJ^8O+tXKz2%;fAT+nRBDCf$cqf?*f-nnV$?Zj(fi&H>lJ8>NbjPPfpIh>)n$L~;oh(WFT~gnxCj?r;Kk&&1-ZA2c z%*=Pc-sqj_1V+u5RoLEk3fgKuY1G!$mwr7$A(c5(4eZkWy6-X`)`ZHxO74c-6RW0p_;u{C<();CK>f^EJOHu0=5 zlW?n0ah0hJ?%jkr{K#jW&~GNXq7$YGJE;m|hj^LL`3EKU(1S*E_KB-8b+iJMMvgV~ zVX7V9*QU~~-5it;?5B6CKy*1)^w&^$9IuvQ7|$@ zEo*J96OybIZi}_S|W1rgt`F~72yMDe&MeC$EB2$(iQbii5?TxTt8MWk`~e8 z9~cRa=O6R2?(*IS*FKA*>nZ~8g(}rWL+e-T7*+L1z$fF3+57bJI~a!ib}N$ry|0W? zJbVBp6lElinxh}aqVCJmW<+4=U|oxqG*ZsIGk}<6ZK>6MGB9bf?t;2jZhHsbnwU@L zE^YU0r+|~eE%et;B6aA@>NGPk@6+XCgHc`i(UnoN>YK(;qY}F*dqks!%a>}?VKDTS zZKyc8-f;h7Ng{FC&Ou>FjNqh@t$T5?YJ|C@A)b{m@cqxsYaaINk9i`0HPF>@wpzr~ zi-{M-AG@RaUubY85VN^CSnOof9NCkcrlQaJjWB>0Xs2Zwa?YU#Qz;AW473^<+Pv;B zleT=d3H-cnKtbmdqYXifq|(6G-|K;aGPr9<%^|5^7lrVRmNgajL(3Qr41kAckqx?f zWm^S|dyvZ`t0wdz_>Q1Vqco&~wcX*InF@l$0gJqWE`YE*`=Ca&aZsR(qbT!EywgyBCXgVlAR= zohL76vO*1f4h`-hikB^;Q2K@If+#WO$ju#l71BG|Gi}zVJJLqHnBBQMC9L*}fDyt9_ ziJi#OiJ$HlD{PnMeOXNh2DRh&d#Q_m_wH^9QyAl@A1NOxP`RF@9dA+MVLrFLLP`Gc z35U;(vBpp+_@Z|c65beNiL+2 z2p=y+);=gCO3~iGbC)OZzOdaSD|6m#Je`pxYuo?@7}e}+CfIs--f)km(f zF4tr7^<+g-Nu^kNaLf+Wn~TPJd>btsz1{Zuz16<2>!7G?9R)ni-WX@Z3KN+f@Kr&p zm&Nnr2L*g)?>y{LGW|OF$SVDM`(pR5e-NWs{7kp93Nb&@ugttqiM}8%mzOwS8 zLfKp$aggq$zIX7cqG?sO^h;f7Rv+%sXrYmh2A#@M;J`kBhB!g#GJIemB13h#8l;vs zhv-I#_f}ZwcHg!K%WjgI(GS`hg%$6jZN^qj?)@sXyhYhjFb0s7)%mkSX$%SZk{Fbx z`-NTl-C;#x1|H+?4e;HkDZ*vVw`fAEIo9z42}Z>wCA=3y#v>dLD(j%UXp4sMDY+X3 zcB?zu3F=Jlt9Uu0e&o$AvVM!=59I8b!yj$me87#bB-11&`^xZOPvxA6@=aU@LpEHe@(2WuGFoxJsZb$rV+z# zW2pINsY)(Nf2dJveeugg3x zV&(y{*0nT_4bsntGtL3n)6upu{~N7Cdvs;>R3U0FuM;IhgYZMN@71*Pr6&8pezEs* zmQP5B6s`_Ek0AfWbo;Sa#QnGK@B5M1Yk0+oWwFR}SnIh>2$9=X#0J_Jvv9s9aexet4)13+J?C&V$uPNrXT=W_xs8p^jCvf1=dC+A1 z@TLfZm7lq>>kD%-S83BVM_W`q%)v97Dy2LNpl&{;>3FiaHGqPAwW{<0mkdYT@*nM) zoQ+NBxAu@3o>{+t>jB^kQ=b%_3sY*14hCle-QCXk;`jm_rX8>KxZ6J*N>FVP)~Mbm z`BV!nimpo^(Zu`D15;m1`7|85WcZ03X_!8Ul`sET=U>gb-e; zWKTi#m)WCfhqUx`0_^TTvHk&Z^wCKDAFCbJecs*lvdR|%&55DfOq#FSoP~&ag^O&a z7k?vdS5e%s&_hhHZ9ab5avg`k1?gJ2qj12!B@-@sVe7$6#@3&ehbK&fW4ZNOVEC5u zNp>|uiZ>`pxT zRn`Epn!As3B}U%ecQab^R83xk7AgBTHkV6`%pXxyfu_V3`nF#-e4QO!?1YY^*bVbL z(Ei-DhAYYy&>m#*A^XN0MdQ%UbJES+ZhV%nRn}Svth1D7ULDT18C4OTRpDa6CC^a# z<&L7n^9pSjs?eVr^Ps6xjC_p&2pST8>#=pAI*BYke3xOenU)MF6yZs|786m}^f-eY zunBP2R`t;?|I_r27ylH!gA0u3u>+%euF}T{{fZr Be`5du diff --git a/src/bin/jp3d/tcltk/decoder.tcl b/src/bin/jp3d/tcltk/decoder.tcl deleted file mode 100755 index 98edcde9..00000000 --- a/src/bin/jp3d/tcltk/decoder.tcl +++ /dev/null @@ -1,272 +0,0 @@ - -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 } { - -} - diff --git a/src/bin/jp3d/tcltk/encoder.tcl b/src/bin/jp3d/tcltk/encoder.tcl deleted file mode 100755 index 6c4a5083..00000000 --- a/src/bin/jp3d/tcltk/encoder.tcl +++ /dev/null @@ -1,470 +0,0 @@ - -namespace eval VMEncoder { - variable var - variable JP3Dencoder "../bin/bin/volume_to_jp3d" -} - -proc VMEncoder::create { nb } { - - set frame [$nb insert end VMEncoder -text "Encoder"] - set topf [frame $frame.topf] - set midf [frame $frame.midf] - set bottomf [frame $frame.bottomf] - set srcf [TitleFrame $topf.srcf -text "Source"] - set dstf [TitleFrame $topf.dstf -text "Destination"] - set Tparf [TitleFrame $midf.parfT -text "Transform Parameters"] - set Cparf [TitleFrame $midf.parfC -text "Coding Parameters"] - - set frame1 [$srcf getframe] - VMEncoder::_sourceE $frame1 - - set frame2 [$dstf getframe] - VMEncoder::_destinationE $frame2 - - set frame3 [$Tparf getframe] - VMEncoder::_transformE $frame3 - - set frame4 [$Cparf getframe] - VMEncoder::_codingE $frame4 - - set butE [Button $bottomf.butE -text "Encode!" \ - -command "VMEncoder::_encode $frame1 $frame2" \ - -helptext "Encoding trigger button"] - set butR [Button $bottomf.butR -text "Restore defaults" \ - -command "VMEncoder::_reset $frame1 $frame2 $frame3 $frame4" \ - -helptext "Reset to default values"] - - pack $srcf $dstf -side left -fill y -padx 4 -expand yes - pack $topf -pady 2 -fill x - - pack $Tparf $Cparf -side left -fill both -padx 4 -expand yes - pack $midf -pady 2 -fill x - - pack $butE $butR -side left -padx 40 -pady 5 -fill y -expand yes - pack $bottomf -pady 2 -fill x - - return $frame -} - -proc VMEncoder::_sourceE { parent } { - - variable var - - set labsrc [LabelFrame $parent.labsrc -text "Select volume file to encode: " -side top \ - -anchor w -relief flat -borderwidth 0] - set subsrc [$labsrc getframe] - set list [entry $subsrc.entrysrc -width 30 -textvariable VMDecoder::var(source)] - - 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 "fileDialogE . $subsrc.entrysrc open"] - - pack $list -side top - pack $butbrw -side top - pack $labsrc $labbrw -side left -fill both -expand yes -} - -proc VMEncoder::_destinationE { parent } { - - variable var - - set labdst [LabelFrame $parent.labdst -text "Save compressed volume as: " -side top \ - -anchor w -relief flat -borderwidth 0] - set subdst [$labdst getframe] - set list [entry $subdst.entrydst -width 30 -textvariable VMDecoder::var(destination)] - - 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 "fileDialogE . $subdst.entrydst save"] - - pack $list -side top - pack $butbrw -side top - pack $labdst $labbrw -side left -fill both -expand yes -} - -proc VMEncoder::_codingE { parent } { - - - ########### CODING ############# - set labcod [LabelFrame $parent.labcod -side top -anchor w -relief sunken -borderwidth 1] - set subcod [$labcod getframe] - - set framerate [frame $subcod.framerate -borderwidth 1] - set labrate [LabelEntry $framerate.labrate -label "Rates: " -labelwidth 9 -labelanchor w \ - -textvariable VMEncoder::var(rate) -editable 1 \ - -helptext "Compression ratios for different layers (R1, R2, R3,...). If R=1, lossless coding" ] - set VMEncoder::var(rate) "1" - - set framecblk [frame $subcod.framecblk -borderwidth 1] - set labcblk [LabelEntry $framecblk.labcblk -label "Codeblock: " -labelwidth 9 -labelanchor w \ - -textvariable VMEncoder::var(cblksize) -editable 1 \ - -helptext "Codeblock size (X, Y, Z)" ] - set VMEncoder::var(cblksize) "64,64,64" - - set frametile [frame $subcod.frametile -borderwidth 1] - set labtile [LabelEntry $frametile.labtile -label "Tile size: " -labelwidth 9 -labelanchor w \ - -textvariable VMEncoder::var(tilesize) -editable 1 \ - -helptext "Tile size (X, Y, Z)" ] - set VMEncoder::var(tilesize) "512,512,512" - - set framesop [frame $subcod.framesop -borderwidth 1] - set chksop [checkbutton $framesop.chksop -text "Write SOP marker" \ - -variable VMEncoder::var(sop) -onvalue 1 -offvalue 0 ] - set frameeph [frame $subcod.frameeph -borderwidth 1] - set chkeph [checkbutton $frameeph.chkeph -text "Write EPH marker" \ - -variable VMEncoder::var(eph) -onvalue 1 -offvalue 0 ] - - set framepoc [frame $subcod.framepoc -borderwidth 1] - set labpoc [label $framepoc.labpoc -text "Progression order: " ] - set progorder [ComboBox $framepoc.progorder \ - -text {Choose a progression order} \ - -width 10 \ - -textvariable VMEncoder::var(progorder) \ - -values {"LRCP" "RLCP" "RPCL" "PCRL" "CPRL"} \ - -helptext "Progression order"] - set VMEncoder::var(progorder) "LRCP" - - pack $labrate -side left -padx 2 -anchor n - pack $labcblk -side left -padx 2 -anchor n - pack $labpoc $progorder -side left -padx 2 -anchor w - #pack $labtile -side left -padx 2 -anchor n - pack $chksop -side left -padx 2 -anchor w - pack $chkeph -side left -padx 2 -anchor w - ########### ENTROPY CODING ############# - set labent [LabelFrame $parent.labent -text "Entropy Coding" -side top -anchor w -relief sunken -borderwidth 1] - set subent [$labent getframe] - foreach entval {2EB 3EB} entropy {2D_EBCOT 3D_EBCOT} { - set rad [radiobutton $subent.$entval \ - -text $entropy \ - -variable VMEncoder::var(encoding) \ - -command "disableGR $entval $labcblk $progorder $labrate $chksop $chkeph" \ - -value $entval ] - pack $rad -anchor w - } - $subent.2EB select - - pack $subent -padx 2 -anchor n - - pack $framerate $framecblk $framepoc $framesop $frameeph -side top -anchor w - pack $subcod -anchor n - - pack $labent $labcod -side left -fill both -padx 4 -expand yes - - -} - -proc VMEncoder::_transformE { parent } { - - variable var - - ########### TRANSFORM ############# - set labtrf [LabelFrame $parent.labtrf -text "Transform" -side top -anchor w -relief sunken -borderwidth 1] - set subtrf [$labtrf getframe] - set labres [LabelFrame $parent.labres -side top -anchor w -relief sunken -borderwidth 1] - set subres [$labres getframe] - - ########### ATK ############# - set frameatk [frame $subres.frameatk -borderwidth 1] - set labatk [label $frameatk.labatk -text "Wavelet kernel: " -anchor w] - set atk [ComboBox $frameatk.atk \ - -textvariable VMEncoder::var(atk) \ - -width 20 \ - -text {Choose a wavelet kernel} \ - -editable false \ - -values {"R5.3" "I9.7"} ] - set VMEncoder::var(atk) "R5.3" - pack $labatk $atk -side left -anchor w - ########### RESOLUTIONS ############# - set frameres1 [frame $subres.frameres1 -borderwidth 1] - set labresolution [label $frameres1.labresol -text "Resolutions: " -anchor w ] - set frameres2 [frame $subres.frameres2 -borderwidth 1] - set labresX [label $frameres2.labresX -text " X" -anchor w ] - set labresY [label $frameres2.labresY -text " Y" -anchor w ] - set labresZ [label $frameres2.labresZ -text " Z" -anchor w ] - - - set resX [SpinBox $frameres2.spinresX \ - -range {1 6 1} -textvariable VMEncoder::var(resX) \ - -helptext "Number of resolutions in X" \ - -width 3 \ - -editable false ] - set resY [SpinBox $frameres2.spinresY \ - -range {1 6 1} -textvariable VMEncoder::var(resY) \ - -helptext "Number of resolutions in Y" \ - -width 3 \ - -editable false ] - set resZ [SpinBox $frameres2.spinresZ \ - -range {1 6 1} -textvariable VMEncoder::var(resZ) \ - -helptext "Number of resolutions in Z" \ - -width 3 \ - -editable false \ - -state disabled ] - set VMEncoder::var(resX) 3 - set VMEncoder::var(resY) 3 - set VMEncoder::var(resZ) 3 - - ########### TRF ############# - foreach trfval {2DWT 3DWT} trf {2D-DWT 3D-DWT} { - set rad [radiobutton $subtrf.$trfval -text $trf \ - -variable VMEncoder::var(transform) \ - -command "disable3RLS $trfval $atk $resX $resY $resZ"\ - -value $trfval ] - pack $rad -anchor w - } - $subtrf.2DWT select - - pack $subtrf -side left -padx 2 -pady 4 - - pack $labresolution -padx 2 -side left -anchor w - pack $labresX $resX -padx 2 -side left -anchor w - pack $labresY $resY -padx 2 -side left -anchor w - pack $labresZ $resZ -padx 2 -side left -anchor w - - pack $frameres1 -side top -fill x - pack $frameres2 $frameatk -side top -padx 2 -pady 4 -anchor n - - pack $subres -side left -padx 2 -pady 4 - pack $labtrf $labres -side left -fill both -padx 4 -expand yes -} - - -proc VMEncoder::_encode { framesrc framedst } { - - variable var - - set source [$framesrc.labsrc.f.entrysrc get ] - set destination [$framedst.labdst.f.entrydst get ] - set cond1 [string match *.pgx [string tolower $source]] - set cond2 [string match *-*.pgx [string tolower $source]] - set cond3 [string match *.bin [string tolower $source]] - - set img ".img" - set pattern [string range $source 0 [expr [string length $source]-5]] - set pattern $pattern$img - set exist [file exists $pattern] - - #comprobamos datos son correctos - if {($cond1 == 1) && ($cond2 == 0)} { - MessageDlg .msgdlg -parent . -message "Info : Really want to encode an slice instead of a volume?.\n For a group of .pgx slices, name must contain a - denoting a sequential index!" -type ok -icon info - } - - if {$source == ""} { - MessageDlg .msgdlg -parent . -message "Error : Source file is not defined !" -type ok -icon error - } elseif {$destination == ""} { - MessageDlg .msgdlg -parent . -message "Error : Destination file is not defined !" -type ok -icon error - } elseif { ($VMEncoder::var(transform) != "3RLS") && ($VMEncoder::var(atk) == "Choose a wavelet transformation kernel") } { - MessageDlg .msgdlg -parent . -title "Info" -message "Please choose a wavelet transformation kernel"\ - -type ok -icon warning - } elseif {($exist == 0) && ($cond1 == 0) && ($cond3 == 1)} { - MessageDlg .msgdlg -parent . -message "Error : IMG file associated to BIN volume file not found in same directory !" -type ok -icon info - } else { - - #creamos datain a partir de los parametros de entrada -# set dirJP3Dencoder [mk_relativepath $VMEncoder::JP3Dencoder] - set dirJP3Dencoder $VMEncoder::JP3Dencoder - set datain [concat " $dirJP3Dencoder -i [mk_relativepath $source] "] - if {$cond3 == 1} { - set datain [concat " $datain -m [mk_relativepath $pattern] "] - } - set datain [concat " $datain -o [mk_relativepath $destination] "] - if {$VMEncoder::var(encoding) != "2EB"} { - set datain [concat " $datain -C $VMEncoder::var(encoding) "] - } - if {$VMEncoder::var(transform) == "2DWT"} { - set datain [concat " $datain -n $VMEncoder::var(resX),$VMEncoder::var(resY) "] - } elseif {$VMEncoder::var(transform) == "3DWT"} { - set datain [concat " $datain -n $VMEncoder::var(resX),$VMEncoder::var(resY),$VMEncoder::var(resZ) "] - } - - set datain [concat " $datain -r $VMEncoder::var(rate) "] - - if {$VMEncoder::var(atk) == "I9.7"} { - set datain [concat " $datain -I "] - } - if {$VMEncoder::var(sop) == 1} { - set datain [concat " $datain -SOP "] - } - if {$VMEncoder::var(eph) == 1} { - set datain [concat " $datain -EPH "] - } - if {$VMEncoder::var(progorder) != "LRCP"} { - set datain [concat " $datain -p $VMEncoder::var(progorder) "] - } - if {$VMEncoder::var(cblksize) != "64,64,64"} { - set datain [concat " $datain -b $VMEncoder::var(cblksize) "] - } - - - #Making this work would be great !!! - set VMEncoder::var(progval) 10 - ProgressDlg .progress -parent . -title "Wait..." \ - -type infinite \ - -width 20 \ - -textvariable "Compute in progress..."\ - -variable VMEncoder::progval \ - -stop "Stop" \ - -command {destroy .progress} - after 200 set VMEncoder::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"] - } - destroy .progress - set cond [string first "ERROR" $jp3dVM::dataout] - set cond2 [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 {$cond2 != -1} { - MessageDlg .msgdlg -parent . -message [string range $jp3dVM::dataout [expr $cond2+7] end] -type ok -icon info - close $fp - } else { - #Must do something with this !!! [pid $fp] - close $fp - } - } -} - -proc VMEncoder::_reset { framesrc framedst frametrf framecod} { - - variable var - - #Restore defaults values - set VMEncoder::var(transform) 2DWT - set VMEncoder::var(encoding) 2EB - set VMEncoder::var(atk) "R5.3" - set VMEncoder::var(progorder) "LRCP" - set atk $frametrf.labres.f.frameatk.atk - set resX $frametrf.labres.f.frameres2.spinresX - set resY $frametrf.labres.f.frameres2.spinresY - set resZ $frametrf.labres.f.frameres2.spinresZ - disable3RLS 2DWT $atk $resX $resY $resZ - set labcblk $framecod.labcod.f.framecblk.labcblk - set progorder $framecod.labcod.f.framepoc.progorder - set labrate $framecod.labcod.f.framerate.labrate - set chksop $framecod.labcod.f.framesop.chksop - set chkeph $framecod.labcod.f.frameeph.chkeph - disableGR 3EB $labcblk $progorder $labrate $chksop $chkeph - - $framesrc.labsrc.f.entrysrc delete 0 end - $framedst.labdst.f.entrydst delete 0 end -} - -proc fileDialogE {w ent operation} { - - variable file - variable i j - - if {$operation == "open"} { - set types { - {"Source Image Files" {.pgx .bin} } - {"All files" *} - } - set file [tk_getOpenFile -filetypes $types -parent $w] - if {[string compare $file ""]} { - $ent delete 0 end - $ent insert end $file - $ent xview moveto 1 - } - } else { - set types { - {"JP3D Files" {.jp3d} } - {"JPEG2000 Files" {.j2k} } - {"All files" *} - } - set file [tk_getSaveFile -filetypes $types -parent $w \ - -initialfile Untitled -defaultextension .jp3d] - if {[string compare $file ""]} { - $ent delete 0 end - $ent insert end $file - $ent xview moveto 1 - } - } -} - -proc mk_relativepath {abspath} { - - set mydir [split [string trimleft [pwd] {/}] {/}] - set abspathcomps [split [string trimleft $abspath {/}] {/}] - - set i 0 - while {$i<[llength $mydir]} { - if {![string compare [lindex $abspathcomps $i] [lindex $mydir $i]]} { - incr i - } else { - break - } - } - set h [expr [llength $mydir]-$i] - set j [expr [llength $abspathcomps]-$i] - - if {!$h} { - set relpath "./" - } else { - set relpath "" - while { $h > 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 - } -} diff --git a/src/bin/jp3d/tcltk/logoLPI.gif b/src/bin/jp3d/tcltk/logoLPI.gif deleted file mode 100755 index df79515057f4163e12943482993fc337eafe2002..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5212 zcmWmD`6CpK1IO{%d*|4hao>!il5>kFDMN~MO$VvuS<$UpdY;I zQc2?o>99IHU3wN3(NpUvQt^GhpFiO9)9W2Hd)DMBQOAIVz##DdaX1_x%F4>x+S3)8GBuV=F`v(LB%$PAFFfefD%$c)h%?b(%3JwmQJ$rUYNXVQy zbLP&SJ8#~+`Sa&5Sg?SisD%p`E?Tr`@#4ixmMjSk4GjwmTe@^fZTt4^3WZ|FjvYI9?%cI& z*Y4fB_w3oTckkYP`}WZ^osf`_n3$N9l%!ND_wV1IoSdAJl9HO5df>o;w6wJJ^z@93 zjDrUcW@ct)Wo4;Us_g9SLx&C>K79Ddkt0Ws9zAyK*zx1Xb8>P{oH%jvkiUA}zz z%9SfuuU`G@ufNo4b#ZZVNl8g*X=zzm*|lreu3x`?-O#26%`eC z?%b)Yth{^oF3Yl2RaMp1)ipIWwY9bP?%k`atE;cCZ)j+^fB$}CW8;Gd4<0^z_~_B2 z$B!R3H8p88n&#%_Cr_R{efsp-vuDqrKW}Mi`TOs`U%Ytn^5x4{uU@@={rb(DH?6I$ zZ{NQC=bwMHT5VffTYGzZM@PrIckkZ6fB)gbhtAHoH1z%Z_u=8;A3uKl{Q2|OuU{i0 zBcr3EF8?p!|1ALG5nvRw3|2E$Nn!)1hz9kUniSkVBsaJ?|6aPO$A*foEd}*igy=Ev z?<*GNah;D7UMD|#b#2p|@=c{$%XEJjK5BqQObd?{PQL9S57u)6{*!&H7*W~-k%@$ ziynLsc7DHcOmof1xPc(|oFmxI>H{X?c?V&iXMJtAkN;J0cklP^`$^-PtSi6wSCq~V z`N$m8OnaxOSv2WcpohfkWz6D(o=q-?k%^DVrw{kv%PlaRy8kkzbn2(xHBBGr^`QKQ zG`uFC?y~+&-@fw0=oIa`8p1O-bcR^uN5nS}nd|ZojL9^u4zk+vuu4QE0P#TiJ6TA)Y|TUNr>bB@!(5YKxj#^>RKU1^AJ;MaBv&HisT9$_puVsk*JmrF^5z*iRRY;P&;YuHE3t!hNZvHs5C zwY}MXPadl4d=5sipBrrK9U7{o>6RpSwxWN&WskAzmIvU=zLKZ4sFpNsi|MTk>ig6j zFyWUXdL~CI+N04d$%-Wf`CT0gJe}9&dKFXl4qx90%7KiLsVmjJdeX5Dhfe#IFVStS zS!1F6_NEV#0mjxNHBGh#IICzCwa)wFR;tz@%XEXH5VQ1*uwP^Z;#OPQ1+I_FZ}S!G zoNc2+GY(?H^OX}n2-ko9og-b>pXIyyNU@$@nTkCyoo{?8siX{Z zH4o48`Xcy__5-Gh{CwXvief#VP@FU0e}G8bGVq~0?;9|YmiU>7#kxBWmRJCW70uZS zWtGCLH)z}}7J4PAwP_vl|BNra+Z`(5WR=(ZCpUBXKixMhPC5a2v9QrEp7rv{NwZpt zlbp*th!GuM*ia|^C{gar;6-}j0a<~8?5>fSJRAR7?-E{w?XFQpy-~F;H|eR%Q-NP2#hu5gsIaz85O)ZH`T9vf^tf&z3orU zOlV#CEvWMGvH*6L0sI7;Pif^YJZ&RiMf<*qBfhX)6XE#mJ+f;4lkn7Oz!~8A`d*ue z-(LZCI&im((sD^x3~n@KBBxMmI**@%Hqd%;e1A;RoQyJ^6Z{^#0z%X3Ne%uFSD7ES z{HO_X3np%~7MDbE*U`4DBTi+=j7(kzIcx?FCTlzNl6&kMK8>qJ-f45Y=5|imrB%8; z1C~ms7LZR&-MP<*!~BuB6hpNNO&>}!^Ej^@Z?OnU`Hz{xWXxNs4p47&obxZc#5 zk{&uaaIQDtLWtEY&Z4<-Hpxtar@R~AnNtO(B&PZ$b9j-%hUdeLHi+Nv2b|6q5U&(f zHlE>ns!B3VKRde&rl$?eFtk)hM41fpf~oe>UD5!4q{-490xhpLXVvr}aw@@X!3>d{_G)(v6@K)=N+WrJ0IPw+K zTFqmOpqv%!TPFc`CN*0{Y65)nF5&weY6Pc(uLcfqQib%|+?hS$HJ4YY;&K1m=<0WN zs-dhssa%2SwT9`RZMrG(^Q+Cp4)}rbeI5D}!|P_Yw+S5s zL+#%Kv9ofC=p@>H}g&Yq7UdCLReXw5gE$yFA;ttj|Yz->$%Y#IHLp zb5VpW#vZTbqc>J^mH>veR^n+x6hAI!itXp~0mfa$*2&DxC?Cf_JAJ)W&o|5oNx=-S z9IDPKNxhP%4)6o35wmseP2%1l*D%%D0QYwqawQ-gii5JRUn=8h0H>3wS(ByymLqe6 zjM{a;Dl947F7Y5GbpAuxyW7fd!bD+ z!I5Ci8ApioFWgC}cIj~3Cm4eE?oi$d!ZN3Qphq$OfmajFfye`WOB zs~F)AhBw_ZU{xs#Oluwpz#t=>y>xyxAbPu3Hfb}Js+v=4>gjl|%)k2J7=kI}IRYjc zfBd4sCFH#Go^f*7Y-Y4w0cGerdY*X4-XzY4a{57h*7vm%|*j=CF0WZc{*t~}=#$Ia#4%7x4 zA?&Pyo6hMC)6mhHl?IHs`#pWJ4Lb+$Jy`J0*q~O1zgN1rrx{(s0^x>$nB=$8xLvB= z2#rirt1&Z2e2@@JX-Q=ZR<7n+^8o?D$yKeDDE684qVa%p z*md}_CSd#30G|LvfZ)_Ne9HNx#}pSN0YoGEgu`p|p)PGQ z9)*p>%XrTi`6wfCl>?xPQ^epqQuT(VVgnuErh?YXcu8uBMKgAf<)#4JdWx}3IR~c% zDe)$Q&Dbwp+C1sRjRf|cuo+aPkM`OO%CN5_){kclkl5YHSTBI-bZ8fi_OP%M0~oN} z2nPPjBnuMI6iw*yc{gB$+RAk->#(uP+|7tQP_M!hWXcvjL<7fwk zevqLZI0`+{Z;?q_8Du)aQBk&aTKKvax~PT9bkG%wXJ5*j!xgQQ3S-p5ctW&=7DlNA zp)7xO8-KA>5QYnabUYuL=Pl)V5IkoUN1_?wT~Q^P+rs8L!Ce}z(I6K32)G`)O2K6+ z_@)-hqrn_GcuWQ!m4in#;$)p@w_LPGC)!7d_tB!Q8sU0M7|jT`=!9~$aJ^i(nh^e` z6RejCc+1?K7_KwRb=7g*HC$IMcLK#7!*V?t9!c;6iqjZz1`eLYp>s5J7JyD_zycZggq$bvrjE%b+q3+o?Sj=>;bubg2Pul9 zPAPD41^}k1#kY2dGbr#h30)@Pat5xO0$-8Bcce%YDS1Ijn&bveGKrQ!byBRG1nou$ zUWy#PLn4iU59G+hSzNI9|XEp$BiYBZ?c2>RahqldQtpq1ZH@W(T~GeLLeo@uZJuK z)o_@GO9N@vPSzt@^n!**Qc$NX)$9!Rj1{@c1y#~BHBV9AbF817`a^#DD>-%JEUauX z)=OfyCt*&9uwEUilLc%HJIIa77?6d`OfwvkV#^)zA^GXslZyHQxoH%dN%EG+Ved{H zIEnvaut8nA4nXteJa0MlX)Io>68=NrUv%OT_ZujqMXs~kM;WB~gyiJ}fn16QbQnjXy^nBodckJIaDZx3UMfx1eI#h@1$t8mS<0k zo|3B?Y5wMZ?50x@DCkWDuuYs=wS*e(##tr z#Xr?(5rB=#krbWS{Tb#w3ru?@;&HG;8tfefnb*P@1URN$-A6-|7^$X;O&*{s0)MR* zSI8xA>-9S2@Z0Zj4Q;CdBuxy`s7Bg9nrW%5pXHLV{^-Ntvz<8lPJ{9t!7+d^S%X~A zp|SL}_k@_Gp%wzK0FYZ0;>3j+ouq)mz8yf1tKe~k!tfthV<2*kMPB+tmuSfaIo6Jg zk2=E-Na*K#BteZ7;i2~_ah+OZ@I1d|WY?X$adxFCci!y6yUDr1RcMb64fe!7kr7te zSdRvMS%rPnpgppXVJ+IJjT*!;#X{^$PvUo}{k$^l%ZjsxUn_gG7r&=sT{QMfjh4Pg zQ?^@lv2nc&`ia~#D#N;2>|ea7*%pdnMEN?bc8BCTY!aK7F-Xi?!%NzY7<5ZCk|r(trU5UgVQz85M-m)WNiJ%z>mm4&*!$_4vZFetDuomxrSSXW@z9t=H93bO#_f@ z`7K_RU?q;`G0i*ajXea^tpzIxypD$Ns=@7L@DUO@KpQ@lLS3Y|{MDW1cb-SIKId=% HVCw$>l!K-J diff --git a/src/bin/jp3d/windirent.h b/src/bin/jp3d/windirent.h deleted file mode 100644 index 4b1d9ff1..00000000 --- a/src/bin/jp3d/windirent.h +++ /dev/null @@ -1,679 +0,0 @@ -/* - * 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 referring 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 although - * 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 occurred */ - 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*/ diff --git a/src/bin/jpwl/CMakeLists.txt b/src/bin/jpwl/CMakeLists.txt deleted file mode 100644 index 5df225de..00000000 --- a/src/bin/jpwl/CMakeLists.txt +++ /dev/null @@ -1,62 +0,0 @@ -# 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() diff --git a/src/bin/jpwl/convert.c b/src/bin/jpwl/convert.c deleted file mode 100644 index b7fb5b5c..00000000 --- a/src/bin/jpwl/convert.c +++ /dev/null @@ -1,3771 +0,0 @@ -/* - * 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 -#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"); - free(tga); - 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 uint16_t swap16(uint16_t x) -{ - return (((x & 0x00ffU) << 8) | ((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; x < image_width; x++) { - unsigned char r, g, b; - - if (!fread(&b, 1, 1, f)) { - fprintf(stderr, - "\nError: fread return a number of element different from the expected.\n"); - opj_image_destroy(image); - return NULL; - } - if (!fread(&g, 1, 1, f)) { - fprintf(stderr, - "\nError: fread return a number of element different from the expected.\n"); - opj_image_destroy(image); - return NULL; - } - if (!fread(&r, 1, 1, f)) { - fprintf(stderr, - "\nError: fread return a number of element different from the expected.\n"); - opj_image_destroy(image); - return NULL; - } - - image->comps[0].data[index] = r; - image->comps[1].data[index] = g; - image->comps[2].data[index] = b; - index++; - } - } else if (numcomps == 4) { - for (x = 0; x < image_width; x++) { - unsigned char r, g, b, a; - if (!fread(&b, 1, 1, f)) { - fprintf(stderr, - "\nError: fread return a number of element different from the expected.\n"); - opj_image_destroy(image); - return NULL; - } - if (!fread(&g, 1, 1, f)) { - fprintf(stderr, - "\nError: fread return a number of element different from the expected.\n"); - opj_image_destroy(image); - return NULL; - } - if (!fread(&r, 1, 1, f)) { - fprintf(stderr, - "\nError: fread return a number of element different from the expected.\n"); - opj_image_destroy(image); - return NULL; - } - if (!fread(&a, 1, 1, f)) { - fprintf(stderr, - "\nError: fread return a number of element different from the expected.\n"); - opj_image_destroy(image); - return NULL; - } - - image->comps[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 = 0, adjustB = 0; - 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."); - fclose(fdest); - 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)) { - fclose(fdest); - return 1; - } - - alpha_channel = image->numcomps - 1; - - scale = 255.0f / (float)((1 << image->comps[0].prec) - 1); - - adjustR = (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0); - if (image->numcomps >= 3) { - 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); - fclose(fdest); - 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); - fclose(fdest); - 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); - fclose(fdest); - 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); - fclose(fdest); - return 1; - } - } - } - } - - fclose(fdest); - - 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; /* Height 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) { - fclose(IN); - 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) { - fclose(IN); - 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%31[ \t]%c%c%31[ \t+-]%d%31[ \t]%d%31[ \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"); - fclose(f); - 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"); - fclose(f); - 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 << ushift) + (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 (olen < 4 || 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); - free(name); - return 1; - } - /* don't 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); - fclose(fdest); - 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; - } - - /* This limitation could be removed by making sure to use size_t below */ - if (header_info.height != 0 && - header_info.width > INT_MAX / header_info.height) { - fprintf(stderr, "pnmtoimage:Image %dx%d too big!\n", - header_info.width, header_info.height); - 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 << prec) - 1; - has_alpha = (ncomp == 4 || ncomp == 2); - - red = image->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 << prec) - 1; - - fprintf(fdest, "P5\n#OpenJPEG-%s\n%d %d\n%d\n", - opj_version(), wr, hr, max); - - red = image->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 << ushift) + (r >> dshift); - g = (g << ushift) + (g >> dshift); - b = (b << ushift) + (b >> dshift); - if (has_alpha) { - a = (a << ushift) + (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 << ushift) + (r >> dshift); - g = (g << ushift) + (g >> dshift); - b = (b << ushift) + (b >> dshift); - if (has_alpha) { - a = (a << ushift) + (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 << ushift) + (r >> dshift); - if (has_alpha) { - a = (a << ushift) + (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"); - fclose(f); - 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"); - fclose(f); - return NULL; - } - value = temp << 8; - if (!fread(&temp, 1, 1, f)) { - fprintf(stderr, "Error reading raw file. End of file probably reached.\n"); - fclose(f); - 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"); - fclose(f); - 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 << ushift) + (v >> dshift); - } - - *d++ = (unsigned char)(v >> 8); - *d++ = (unsigned char)v; - - v = *green + adjustG; - ++green; - - if (force16) { - v = (v << ushift) + (v >> dshift); - } - - *d++ = (unsigned char)(v >> 8); - *d++ = (unsigned char)v; - - v = *blue + adjustB; - ++blue; - - if (force16) { - v = (v << ushift) + (v >> dshift); - } - - *d++ = (unsigned char)(v >> 8); - *d++ = (unsigned char)v; - - if (has_alpha) { - v = *alpha + adjustA; - ++alpha; - - if (force16) { - v = (v << ushift) + (v >> dshift); - } - - *d++ = (unsigned char)(v >> 8); - *d++ = (unsigned char)v; - } - continue; - }/* if(is16) */ - - v = *red + adjustR; - ++red; - - if (force8) { - v = (v << ushift) + (v >> dshift); - } - - *d++ = (unsigned char)(v & mask); - - v = *green + adjustG; - ++green; - - if (force8) { - v = (v << ushift) + (v >> dshift); - } - - *d++ = (unsigned char)(v & mask); - - v = *blue + adjustB; - ++blue; - - if (force8) { - v = (v << ushift) + (v >> dshift); - } - - *d++ = (unsigned char)(v & mask); - - if (has_alpha) { - v = *alpha + adjustA; - ++alpha; - - if (force8) { - v = (v << ushift) + (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 << ushift) + (v >> dshift); - } - - *d++ = (unsigned char)(v >> 8); - *d++ = (unsigned char)v; - - if (has_alpha) { - v = *alpha++; - - if (force16) { - v = (v << ushift) + (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 << ushift) + (v >> dshift); - } - - *d++ = (unsigned char)(v & mask); - - if (has_alpha) { - v = *alpha + adjustA; - ++alpha; - - if (force8) { - v = (v << ushift) + (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 */ diff --git a/src/bin/jpwl/convert.h b/src/bin/jpwl/convert.h deleted file mode 100644 index 7f1a5bc8..00000000 --- a/src/bin/jpwl/convert.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - * 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 */ - diff --git a/src/bin/jpwl/index.c b/src/bin/jpwl/index.c deleted file mode 100644 index 6c6c8fc0..00000000 --- a/src/bin/jpwl/index.c +++ /dev/null @@ -1,454 +0,0 @@ -/* - * 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 -#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 : divide 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 ; i < parameters->tcp_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 ; i < parameters->tcp_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 > 1024 || cblockw_init < 4 || - cblockh_init > 1024 || cblockh_init < 4 || - cblockw_init * cblockh_init > 4096) { - 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 optional - */ - 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*/ - if (!dirptr->filename_buf) { - free(parameters.cp_comment); - free(dirptr); - return 0; - } - dirptr->filename = (char**) malloc(num_images * sizeof(char*)); - if (!dirptr->filename) { - free(parameters.cp_comment); - free(dirptr); - return 0; - } - for (i = 0; i < num_images; i++) { - dirptr->filename[i] = dirptr->filename_buf + i * OPJ_PATH_LEN; - } - } - if (load_images(dirptr, img_fol.imgdirpath) == 1) { - free(parameters.cp_comment); - free(dirptr); - return 0; - } - if (num_images == 0) { - free(parameters.cp_comment); - free(dirptr); - fprintf(stdout, "Folder is empty\n"); - return 0; - } - } 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; - } - } - switch (parameters.decod_format) { - case PGX_DFMT: - break; - case PXM_DFMT: - break; - case BMP_DFMT: - break; - case TIF_DFMT: - break; - case RAW_DFMT: - break; - case TGA_DFMT: - break; - case PNG_DFMT: - break; - default: - fprintf(stderr, "skipping file...\n"); - continue; - } - - /* decode the source image */ - /* ----------------------- */ - - switch (parameters.decod_format) { - case PGX_DFMT: - image = pgxtoimage(parameters.infile, ¶meters); - if (!image) { - fprintf(stderr, "Unable to load pgx file\n"); - return 1; - } - break; - - case PXM_DFMT: - image = pnmtoimage(parameters.infile, ¶meters); - if (!image) { - fprintf(stderr, "Unable to load pnm file\n"); - return 1; - } - break; - - case BMP_DFMT: - image = bmptoimage(parameters.infile, ¶meters); - if (!image) { - fprintf(stderr, "Unable to load bmp file\n"); - return 1; - } - break; -#ifdef OPJ_HAVE_LIBTIFF - case TIF_DFMT: - image = tiftoimage(parameters.infile, ¶meters); - if (!image) { - fprintf(stderr, "Unable to load tiff file\n"); - return 1; - } - break; -#endif /* OPJ_HAVE_LIBTIFF */ - case RAW_DFMT: - image = rawtoimage(parameters.infile, ¶meters, &raw_cp); - if (!image) { - fprintf(stderr, "Unable to load raw file\n"); - return 1; - } - break; - - case TGA_DFMT: - image = tgatoimage(parameters.infile, ¶meters); - if (!image) { - fprintf(stderr, "Unable to load tga file\n"); - return 1; - } - break; -#ifdef OPJ_HAVE_LIBPNG - case PNG_DFMT: - image = pngtoimage(parameters.infile, ¶meters); - if (!image) { - fprintf(stderr, "Unable to load png file\n"); - return 1; - } - break; -#endif /* OPJ_HAVE_LIBPNG */ - } - /* Can happen if input file is TIFF or PNG - * and OPJ_HAVE_LIBTIF or OPJ_HAVE_LIBPNG is undefined - */ - if (!image) { - fprintf(stderr, "Unable to load file: got no image\n"); - return 1; - } - /* Decide if MCT should be used */ - parameters.tcp_mct = image->numcomps == 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); - fclose(f); - 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); - fclose(f); - 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; -} diff --git a/src/bin/jpwl/opj_jpwl_decompress.c b/src/bin/jpwl/opj_jpwl_decompress.c deleted file mode 100644 index a73be1c3..00000000 --- a/src/bin/jpwl/opj_jpwl_decompress.c +++ /dev/null @@ -1,900 +0,0 @@ -/* - * 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 -#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*/ - if (!dirptr->filename_buf) { - free(dirptr); - return 1; - } - dirptr->filename = (char**) malloc(num_images * sizeof(char*)); - if (!dirptr->filename) { - free(dirptr); - return 1; - } - - for (i = 0; i < num_images; i++) { - dirptr->filename[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*/ - - - - diff --git a/src/bin/jpwl/windirent.h b/src/bin/jpwl/windirent.h deleted file mode 100644 index b7ed9a3c..00000000 --- a/src/bin/jpwl/windirent.h +++ /dev/null @@ -1,680 +0,0 @@ - -/* - * 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 referring 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 although - * 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 occurred */ - 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*/ diff --git a/src/bin/mj2/CMakeLists.txt b/src/bin/mj2/CMakeLists.txt deleted file mode 100644 index 5d3e288b..00000000 --- a/src/bin/mj2/CMakeLists.txt +++ /dev/null @@ -1,47 +0,0 @@ -# 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() diff --git a/src/bin/mj2/meta_out.c b/src/bin/mj2/meta_out.c deleted file mode 100644 index 139b2704..00000000 --- a/src/bin/mj2/meta_out.c +++ /dev/null @@ -1,2858 +0,0 @@ -/* 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 ambiguous 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) -{ - /* Universal 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 ambiguous 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", buf); - } - 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", buf); - } - 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-contiguous 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 diff --git a/src/bin/mj2/meta_out.h b/src/bin/mj2/meta_out.h deleted file mode 100644 index 769ff391..00000000 --- a/src/bin/mj2/meta_out.h +++ /dev/null @@ -1,14 +0,0 @@ -/* 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); - diff --git a/src/bin/mj2/mj2_to_metadata.c b/src/bin/mj2/mj2_to_metadata.c deleted file mode 100644 index 27f164d7..00000000 --- a/src/bin/mj2/mj2_to_metadata.c +++ /dev/null @@ -1,350 +0,0 @@ -/* 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., hexadecimal) 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] */ - fclose(file); - return 1; - } - // Leave it open - - /* - configure the event callbacks (not required) - setting of each callback is optional - */ - 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; -} - - diff --git a/src/bin/mj2/mj2_to_metadata.dtd b/src/bin/mj2/mj2_to_metadata.dtd deleted file mode 100644 index 249de1a0..00000000 --- a/src/bin/mj2/mj2_to_metadata.dtd +++ /dev/null @@ -1,425 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/bin/mj2/mj2_to_metadata.h b/src/bin/mj2/mj2_to_metadata.h deleted file mode 100644 index f4c34919..00000000 --- a/src/bin/mj2/mj2_to_metadata.h +++ /dev/null @@ -1,9 +0,0 @@ -/* 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" diff --git a/src/bin/mj2/mj2_to_metadata.sln b/src/bin/mj2/mj2_to_metadata.sln deleted file mode 100644 index 32b926d4..00000000 --- a/src/bin/mj2/mj2_to_metadata.sln +++ /dev/null @@ -1,29 +0,0 @@ - -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 diff --git a/src/bin/mj2/mj2_to_metadata.vcproj b/src/bin/mj2/mj2_to_metadata.vcproj deleted file mode 100644 index b280bfe5..00000000 --- a/src/bin/mj2/mj2_to_metadata.vcproj +++ /dev/null @@ -1,349 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/bin/mj2/mj2_to_metadata_Notes.doc b/src/bin/mj2/mj2_to_metadata_Notes.doc deleted file mode 100644 index 05ccec2068dd5bff73cf83aab716406f6c1db099..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35328 zcmeHQdz2hSxv!ahWy4N(6OzpmK{_FXU9!7ug5fD)L*8+d4M~9D;gZbG^k$pPbPwG# zo82VpAY92Gf>A&~;22Z{g$wcO(RimguuE>oZ9yvTC;UIdHy}w^|S8vZ` zX0s0uh)yNHsjk;oRbPGe)mPOuvrqnJ;((2(AFzB|hl41JH`ohUVtU{$NDvt_xqg*{Aw@+|W@_o|(3zG8bXP}Du~+wUjmJmN{85K8X0Vs>1P z^as$6pq#39ZwEixkWTrd`vvm74*x#L0o}7Ge?5GL8KvrH8l93~<*WV`^W9Q|pQ;`e zqsp-!$|3v7_MLi+5NMh|{v8N&{`A0a@OzDjB2Muu-&gXeeAN&7->MSg)p0^R9H8Hg zaitsv^RY_iqYH~rAh#P=`Ydsv#DO3O*60a6>gd`kE3G@)SG60GSIpgzwl*a7bTl4K zM{kU5G15JTsik{#tuv*Y+KSbSmujnR>k2)V)_PmDw$`)HtX>(lV?Em3dCl6~wzhfI zT4ZTLH%)D|9oB_PsNJtw-P%e$Zo~{zZ;C88wV0Ji zM7u0o=F?caw#1H_uULlD(wQ)N4c*oj>AlfRpVqi;amV7*E?U^p6p5_uH?5RoIFT7E zb9*qOS<9Gl6pHJ;dcsO2bu-4Jq-CcKbCc$z?My74vB5{xwq~s> zlSU_dPfnJ7cktSGPVQJ04?3<$Z=)jueWr#RY-ZabRP9Vxk2%$+efh>cx(ESiCU=l2J3 zj+99U1vQGg&r~^VaV-VeC9jo0FuNzmHblt=QI*uJ&G6{E?SRb1E!}AXyVvL#D?>^Y z31BFUWXfXYU=cXIa>ZQjhP8+TFEFbpLN{ubndsLV9X-+ALa~TKF2O`fmz1G7kT)lT zu}|C4*yd&ptx8%>TAQOe7G&LxZi=k3+;C(L%IXR92tyzns5P3F*C>K zeQrw^1kUR2cJ#EPHL^Cx*s6PzXYSGqFv%A8r7-K!mQFePk#!IrR}iF>Z!r=H2$O8E zreoyIv=L39EBKJSW@mdaqtFh+?6&NrI|U?P!5N25L5j?)_Zg0qbqiYOij=-7e~>Ui z%vd55=NM6nd#yw!X_!_96S^m3ZkF+sF|fQFbLYwohC)t(1qsJ$maO#Z%4H`ShB+Rb zrkG3~-&j$%VT0Kj6O&fZ8Jl$oWtXl|Ky5z9^=`w24(rvywpECZgyEM zKhz~$aL9E@w+mFTM(N2eJlW5Y= ztcw?(c|_W(j+InRP`dqA2BXjqkw(KfGSMz0VWj)fdI!_RU345PA^EZnZ3Zi(z2MDq zsx+)+Qa6!TvbhigUpl24Q5{gNzYNOqoJgKVZtZE-T4NC|XB(hXR4{ijZ;d-!kgYey z{vSaho{nQ}>4sL5vPm|^)iP@9T;+5r(Ht&xpjS5yN*FR@a!FQTdXQ-`E7hOBVzh!f z`N5HsYlf5QibHy0X$x|Jq08@&-luD=QWn)AntX^?Yz--|Bf^cJbI+!8F zY=;pW4j|^}YVJep^+pZYehIFN1uT#r%rD!}yQ$BDb_RG#yMd!~PDJ%g*W|qLR60i(c8%5pQV%qPX1@$;;8$f~DA9NFY-f%emgd1Hps7 zio$U2->OrnG2~F5jV;}pd9G$^=V@)Q_o9%c8%&swl!Y75rHn;0iL^|g(-gt_4_i`0 z%dk#?1LTcdX|S9{rD_AgUTy8AYu7DaxxunGtiI@ij^ztCaD^~8HMK^RQUzfw2?_L! zeByNSW(BR7yv4T}+`>XnGr-wwq*5r<*pddZNGA%}IU@;5&?dUc^~yIIQ;;{go&;BT z&-|pWhoYtClxkI~PmB$16n0MQ*0%(VbBv8cwzx; zKLs8IehEAVJPzyw_5*(a-UXIc3$YSdjMF0rNCUmV7l6aB{C5AN5B^~Py$^o<=C540 z8N>62$Z9ba(H4nm%`mO)6wH8J@o5)9;*I{m*ZFSyS=BuIOcK7Up-0i$uH-n zOjUHe@WK_xizqO$zGvLxyI3L+A_51aSN^0LSiHAdAz!tAOW$mw;*A*~&4VVMW16BiT zfIl66>+r$14!-!i!v~)}xbNUEe)hfZ+;!(&hwpmp@LhM@deh;X?zri#Tfcnkb>G?X zoolXhgf^w;vQ=+FUmgzCiiIocMdymJxDdD;h$76jggLlsc={hP%*_;PQ~K2D^k1oe zUHWoLA$(o(_cAP}6xIlqb4x=vPje|QTrnB7mZ8=%)LMpG@e&AS<+Mf~PT694xGHeX z%2^%!)lRL6a?<;;G6ec+g_OBKgTB8qiWcf;HFg|_F9W-P2Z4P6$Ax2}#)IR~32+=f z1AG>^1-KQsA9w)R2b^-O5DS1T@NRHIy;C&sS}kNz5F~w z+KV?YUnXanoZFZU%1(5(ft=5nF>Xlanc&Xy2|*wt@RXQ71Bb5f(B#Nh7G&8I9CssBKMK2pT= zSz^x4p3pg|&FS;SiMyXXP1}9oyy?4lRm=cR+PSM@CUElZe-hT0x^V;tCW~4z3C6+g z@XP$vb}ZU|90-ecd85gVt`w_;C2WxtQISAY7-+!a(jYc03zbLVCzn-Y(X1{{18$k% z=OVG7{q2D}#UfEdy(L{eLb~V%#SCbsg(g{TG zl^U@QCAvUCNABEK9xtZ8i++9LnMx5FUzTtmDi9N8bXZ_pgWFV_+us>@h_|ZzmQ_hQ zn&=RQaAe)=uX4QUh^_T3hI!eOKJP@W2fhS620RYz2kKF9DzFGx3}k>_;94MyHe3Zf z54;4BZ!JJ8FdulT5~nD@Dpb}9Tm)=`68|!=3wRJvCvH)gcN%tW(}6iaC$Jj$4Deat z7T{KZ_t72z_5r7$`wIZ>@@@p)0JzKB25blR0uKQd=x-%Z3p4?z0xiHT=%2h4MnCI; z&u|}XT6T!~hDsZ%okNuyMH zm-WDB*$0+`z`DUexuNkm3@s6LFgEk4aqk$FUZhL241<%Ma5=9ns1Y>pME&mV^ZX+yQsFNaJ8 zW%utqwtia*)Hm937;PWCa%@tubycmMT=VkRI<9k<&kwaJzHuapXT!IPL)-4Cx(sPZ zl`fc8v)xV0FX!gWhFC7_m7@fB5`rf;tysBWTk^_P1=Cbp-1jT>&y3%1?>sj@WuUfB+`X!A=FeZ)yP#0oj~7jB6c_l=9sD3tb`^P@GBKP_G?l(uf$6S2bOTsfZV={feZhoTNQr2%>e=kF7* zx#j&Sk5-7#li|wC<(d2~?{}^U;YCnLSdHS^9%kOLjD&u4h-IhlWQ^++vEwAMT@^mD zT@@gU@F+>Ok;7-59#M`&ggY?qfl0_pxK>YPQ}dmaPY| zZ2cI!y81Yu;OgT*aP@IRc9oJg)swfNcdV4T10kQ-fe`r?a*5$^VFkXN2wV<8?n0u) zm9}h%81Y&z9jiIYMr})HnP64r< zQ^wfUjSW7*jSV2UvEk@lE$QD{=v$v}CH*^sRrSNxzfvs)1h~)DnVtc$e$aqePXl5- zUh0p)fKbF-wbW4Qi%3Hyh&5CWZ>|O`5=GF}zy}8nh=VjB4vx%#$R)OCP=NQ)fY>uK z140pVySii0fY?C;V#ml02u0BC>iUU3@77NQ!Sxf5u9k}Ot#PtXtZ_1kHBKJGsJ=I7 zK)go-;=Pd@5V>7_Y|wysj0VJG!!RHU2(W8F6cga$21Eg_mBhCszEF$qHtEP+&6vcO z`WJU0J*_+Fl{Ih!H*V0z97h{-oU}1v@8W<$G|6J+*&_>&mxZ6L_NV!?)hPUIHK+OD zmJh#CAX+7j@aK!sxTj{~H5~(T2YF8oXxvk?5#b<>utx(2hl8#6p4@iy4O)+Vv>yAU z^%$g4=FuqLmt})S<1!kJ%cRj5q)~pZpC$af08M9VdXsjuZ0xG7dE8f~NyYQb(&B3#i$# z>Ba&CN58ZeB{rI+y#TSXE$syej(%w`N^CSsdjVo@S4X?F7a-_%b%aYhk12WBCgs@s z;6Yh1%tO3jm|9xwGIK6t}acKF+fLfr?Gmga3Q=EkJVxM>kpu-ZA5iw1M_AEHGP9HG$VLVFy=Z_)Mq#uo6AqkxB8jOgo2&D^nHT zkeFgKV2LgGWUN=36ueyY`JTYNRTF&X`-G+SJ3%TOt}Lr4uLzfwU%ORkh|VfHvLZyR z!@Zp(?gQcOKW_5qs87S4Axqv~;#-_~pc57q6`^pbsxn-mq)Ig&IYgEpYehfGbfIJd zq0?u{+K;I$57QN`eF1JS8Mu?gGUv~eWva@m!{Lf>dC@WpQAb9W)A6ZVEyTH%vZZWH z&>hjzOHiYUdsA`GcaVDqgyqU{I~v5HCt&<8featU4f^UM3C&t479>8#V`aRqU$xf%t*A>Z-Y)$Srg-W(zSEM~l>T zk<+ifkmICgg^JJhm&st$p@CYw$Hb2}z6i|%<@>o}ph6iKkndPgvKI46mv`=>m}Tnb zUD}&-$7*g}5xh6$y*v~Dc)L%R_xl{kx{0^2#nar7Ds8Ci7+jOcK95<4)~l3>*4dw zejGmE;3wcy_oU(TYWjBgte72TB|$aiGM35(i2gC~=^~ff5Hw94K+1 z#DURpV5t3n_~|E}zPIz%zm` z0z5ao5#T=hc7S{IZvouD-v{8QS8yKY?)Q0aK-$j&!F@f?6!24Qa{o(u+y}EB`aCnE z-#Kl(tOJil{g0z^wwrCpKPRX`B4YvRvqZ_2I8fq1i324LlsHi0K#2n- z4wN`h;y{T5B@UE0@X_V~cemX4au3aYHuv$||MGo3-_`RyJ>Si9|IWQR-^=qII`{qD zM{}Rgclg}T^Y4J-%k^?k&wV;Crt!ksG~i>v@xTcH_t+-_8ZaH00h|QP1WpEK0jB`G z??IZpJvbX^23mkt;548OVESD6rvsk=<^g8_X98ydO#d5juJ_C^QF1N^cqh)1zr3{= zH*(UrdDah34d2z{_K4yoWvH^6(j>%Q`H7$I3b?xPLHU;v&qG|+i=Pwt?XE!9VLwg~ zVOc-rmhBi$LEg=HioykV33_ki&fFsSG2Fl7ok8_mV{VS2Kc}I7&LPEvp>q$W^6#e7 zRp5ppYvr%1k@w3{d$(*8W74?G$D2~c9lnPkZ|`vK4!8eJB*)1MS8+toN7kORJpPZQ z|8rQeSAR(G-eVGHh@H4)c?DBOTe^xN^nu<4TH1!v!Hu99Q)KA$h>BArg z|Fxb&82vIV@a%QI?&kWPcZY3}70d8XOi7zyCUM=r~y z5+5uFKFIYyd*{AyT#5UQ3(>_ajRm;U`aiPu*5%sZ=UCT&>i>_r{XZIweF6H-eSz8! z&|iSK(a`!Rmr?6Kr{i$MOto<*qN z!LA^IT~I&1!4*YqI`XrKsBq^y(QN@2M)%DZO{ zyl=1xbc5eRY4>~5ioKSB_O>FA1s=F%cxI9N&6Q@*4Ssi}5iMK}?wtm|L#%|~fzU#H zKl~rveHi;cj^T^^fGh3)Tt1BDGdQD1O6SA2|BKx}qIl%rKcfDr$h(vD$cL2ETU-3a6;+xP?NAlP5sh8W}^Q?^Dsbcv50TTQuj{pDw diff --git a/src/bin/mj2/opj_mj2_compress.c b/src/bin/mj2/opj_mj2_compress.c deleted file mode 100644 index 8386ba0e..00000000 --- a/src/bin/mj2/opj_mj2_compress.c +++ /dev/null @@ -1,853 +0,0 @@ -/* -* 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 optional - */ - 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) { - fclose(mj2file); - 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; -} diff --git a/src/bin/mj2/opj_mj2_decompress.c b/src/bin/mj2/opj_mj2_decompress.c deleted file mode 100644 index 6d1a9616..00000000 --- a/src/bin/mj2/opj_mj2_decompress.c +++ /dev/null @@ -1,260 +0,0 @@ -/* -* 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 (!outfile) { - fprintf(stderr, "failed to open %s for writing\n", argv[2]); - fclose(file); - return 1; - } - fclose(outfile); - - /* - configure the event callbacks (not required) - setting of each callback is optional - */ - 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"); - free(frame_codestream); - 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; -} diff --git a/src/bin/mj2/opj_mj2_extract.c b/src/bin/mj2/opj_mj2_extract.c deleted file mode 100644 index 74fbedaf..00000000 --- a/src/bin/mj2/opj_mj2_extract.c +++ /dev/null @@ -1,178 +0,0 @@ -/* - * 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[FILENAME_MAX]; - mj2_dparameters_t parameters; - - if (argc != 3) { - printf("Usage: %s mj2filename output_prefix\n", argv[0]); - printf("Example: %s foreman.mj2 output/foreman\n", argv[0]); - return 1; - } - - if (strlen(argv[2]) + 11 > sizeof(outfilename)) { - fprintf(stderr, "filename %d too long\n", strlen(argv[2]) + 11); - 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 optional - */ - 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*/ - - { - int num = snprintf(outfilename, sizeof(outfilename), - "%s_%05d.j2k", argv[2], - snum); - if (num >= sizeof(outfilename)) { - fprintf(stderr, "maximum length of output prefix exceeded\n"); - free(frame_codestream); - return 1; - } - } - - outfile = fopen(outfilename, "wb"); - if (!outfile) { - fprintf(stderr, "failed to open %s for writing\n", outfilename); - free(frame_codestream); - 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; -} diff --git a/src/bin/mj2/opj_mj2_wrap.c b/src/bin/mj2/opj_mj2_wrap.c deleted file mode 100644 index 84a066e2..00000000 --- a/src/bin/mj2/opj_mj2_wrap.c +++ /dev/null @@ -1,537 +0,0 @@ -/* - * 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; /* Unknown 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 optional - */ - 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 inexistent 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; -} diff --git a/src/bin/mj2/readme.txt b/src/bin/mj2/readme.txt deleted file mode 100644 index 9419d2a2..00000000 --- a/src/bin/mj2/readme.txt +++ /dev/null @@ -1,3 +0,0 @@ -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.gz \ No newline at end of file diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index da8846b6..212d9220 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -2,16 +2,6 @@ # Part 1 & 2: add_subdirectory(openjp2) -# optionals components: -if(BUILD_JPWL) - add_subdirectory(openjpwl) -endif() -if(BUILD_MJ2) - add_subdirectory(openmj2) -endif() if(BUILD_JPIP) add_subdirectory(openjpip) endif() -if(BUILD_JP3D) - add_subdirectory(openjp3d) -endif() diff --git a/src/lib/openjp3d/CMakeLists.txt b/src/lib/openjp3d/CMakeLists.txt deleted file mode 100644 index b0469af1..00000000 --- a/src/lib/openjp3d/CMakeLists.txt +++ /dev/null @@ -1,45 +0,0 @@ -# openjp3d -include_regular_expression("^.*$") - -include_directories( - ${OPENJPEG_BINARY_DIR}/src/lib/openjp2 # opj_config.h - ) - -set(OPENJP3D_LIBRARY_NAME openjp3d) -# Defines the source code for the library -set(OPENJP3D_SRCS -bio.c cio.c dwt.c event.c jp3d.c jp3d_lib.c mct.c mqc.c openjp3d.c -pi.c raw.c t1.c t1_3d.c t2.c tcd.c tgt.c volume.c -) - -# Build the library -if(WIN32) - if(BUILD_SHARED_LIBS) - add_definitions(-DOPJ_EXPORTS) - else() - add_definitions(-DOPJ_STATIC) - endif() -endif() - -# build jp3d lib: -add_library(${OPENJP3D_LIBRARY_NAME} ${OPENJP3D_SRCS}) -if(UNIX) - target_link_libraries(${OPENJP3D_LIBRARY_NAME} m) -endif() -set_target_properties(${OPENJP3D_LIBRARY_NAME} PROPERTIES ${OPENJPEG_LIBRARY_PROPERTIES}) -if(NOT ${CMAKE_VERSION} VERSION_LESS "2.8.12") - target_compile_options(${OPENJP3D_LIBRARY_NAME} PRIVATE ${OPENJPEG_LIBRARY_COMPILE_OPTIONS}) -endif() - -# Install library -install(TARGETS ${OPENJP3D_LIBRARY_NAME} - EXPORT OpenJP3DTargets - DESTINATION ${OPENJPEG_INSTALL_LIB_DIR} - COMPONENT Libraries -) - -# Install includes files -install(FILES openjp3d.h - DESTINATION ${OPENJPEG_INSTALL_INCLUDE_DIR} - COMPONENT Headers -) diff --git a/src/lib/openjp3d/bio.c b/src/lib/openjp3d/bio.c deleted file mode 100644 index 7e1cf7df..00000000 --- a/src/lib/openjp3d/bio.c +++ /dev/null @@ -1,207 +0,0 @@ -/* - * 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 - * 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_includes.h" - -/** @defgroup BIO BIO - Individual bit input-output stream */ -/*@{*/ - -/** @name Local static functions */ -/*@{*/ - -/** -Write a bit -@param bio BIO handle -@param b Bit to write (0 or 1) -*/ -static void bio_putbit(opj_bio_t *bio, int b); -/** -Read a bit -@param bio BIO handle -@return Returns the read bit -*/ -static int bio_getbit(opj_bio_t *bio); -/** -Write a byte -@param bio BIO handle -@return Returns 0 if successful, returns 1 otherwise -*/ -static int bio_byteout(opj_bio_t *bio); -/** -Read a byte -@param bio BIO handle -@return Returns 0 if successful, returns 1 otherwise -*/ -static int bio_bytein(opj_bio_t *bio); - -/*@}*/ - -/*@}*/ - - -/* -========================================================== - local functions -========================================================== -*/ - -static int bio_byteout(opj_bio_t *bio) -{ - bio->buf = (bio->buf << 8) & 0xffff; - bio->ct = bio->buf == 0xff00 ? 7 : 8; - if (bio->bp >= bio->end) { - return 1; - } - *bio->bp++ = bio->buf >> 8; - return 0; -} - -static int bio_bytein(opj_bio_t *bio) -{ - bio->buf = (bio->buf << 8) & 0xffff; - bio->ct = bio->buf == 0xff00 ? 7 : 8; - if (bio->bp >= bio->end) { - return 1; - } - bio->buf |= *bio->bp++; - return 0; -} - -static void bio_putbit(opj_bio_t *bio, int b) -{ - if (bio->ct == 0) { - bio_byteout(bio); - } - bio->ct--; - bio->buf |= b << bio->ct; -} - -/* MOD antonin */ -static int bio_getbit(opj_bio_t *bio) -{ - /* DOM */ - if (bio->ct == 0) { - bio_bytein(bio); - } - bio->ct--; - return (bio->buf >> bio->ct) & 1; -} - -/* -========================================================== - Bit Input/Output interface -========================================================== -*/ - -opj_bio_t* bio_create() -{ - opj_bio_t *bio = (opj_bio_t*)opj_malloc(sizeof(opj_bio_t)); - return bio; -} - -void bio_destroy(opj_bio_t *bio) -{ - if (bio) { - opj_free(bio); - } -} - -int bio_numbytes(opj_bio_t *bio) -{ - return (bio->bp - bio->start); -} - -void bio_init_enc(opj_bio_t *bio, unsigned char *bp, int len) -{ - bio->start = bp; - bio->end = bp + len; - bio->bp = bp; - bio->buf = 0; - bio->ct = 8; -} - -void bio_init_dec(opj_bio_t *bio, unsigned char *bp, int len) -{ - bio->start = bp; - bio->end = bp + len; - bio->bp = bp; - bio->buf = 0; - bio->ct = 0; -} - -void bio_write(opj_bio_t *bio, int v, int n) -{ - int i; - for (i = n - 1; i >= 0; i--) { - bio_putbit(bio, (v >> i) & 1); - } -} - -int bio_read(opj_bio_t *bio, int n) -{ - int i, v; - v = 0; - for (i = n - 1; i >= 0; i--) { - v += bio_getbit(bio) << i; - } - return v; -} - -int bio_flush(opj_bio_t *bio) -{ - bio->ct = 0; - if (bio_byteout(bio)) { - return 1; - } - if (bio->ct == 7) { - bio->ct = 0; - if (bio_byteout(bio)) { - return 1; - } - } - return 0; -} - -int bio_inalign(opj_bio_t *bio) -{ - bio->ct = 0; - if ((bio->buf & 0xff) == 0xff) { - if (bio_bytein(bio)) { - return 1; - } - bio->ct = 0; - } - return 0; -} diff --git a/src/lib/openjp3d/bio.h b/src/lib/openjp3d/bio.h deleted file mode 100644 index 1c26eb3c..00000000 --- a/src/lib/openjp3d/bio.h +++ /dev/null @@ -1,137 +0,0 @@ -/* - * 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 - * 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 __BIO_H -#define __BIO_H -/** -@file bio.h -@brief Implementation of an individual bit input-output (BIO) - -The functions in BIO.C have for goal to realize an individual bit input - output. -*/ - -/** @defgroup BIO BIO - Individual bit input-output stream */ -/*@{*/ - -/** -Individual bit input-output stream (BIO) -*/ -typedef struct opj_bio { - /** pointer to the start of the buffer */ - unsigned char *start; - /** pointer to the end of the buffer */ - unsigned char *end; - /** pointer to the present position in the buffer */ - unsigned char *bp; - /** temporary place where each byte is read or written */ - unsigned int buf; - /** coder : number of bits free to write. decoder : number of bits read */ - int ct; -} opj_bio_t; - -/** @name Funciones generales */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Create a new BIO handle -@return Returns a new BIO handle if successful, returns NULL otherwise -*/ -opj_bio_t* bio_create(void); -/** -Destroy a previously created BIO handle -@param bio BIO handle to destroy -*/ -void bio_destroy(opj_bio_t *bio); -/** -Number of bytes written. -@param bio BIO handle -@return Returns the number of bytes written -*/ -int bio_numbytes(opj_bio_t *bio); -/** -Init encoder -@param bio BIO handle -@param bp Output buffer -@param len Output buffer length -*/ -void bio_init_enc(opj_bio_t *bio, unsigned char *bp, int len); -/** -Init decoder -@param bio BIO handle -@param bp Input buffer -@param len Input buffer length -*/ -void bio_init_dec(opj_bio_t *bio, unsigned char *bp, int len); -/** -Write bits -@param bio BIO handle -@param v Value of bits -@param n Number of bits to write -*/ -void bio_write(opj_bio_t *bio, int v, int n); -/** -Read bits -@param bio BIO handle -@param n Number of bits to read -@return Returns the corresponding read number -*/ -int bio_read(opj_bio_t *bio, int n); -/** -Flush bits -@param bio BIO handle -@return Returns 1 if successful, returns 0 otherwise -*/ -int bio_flush(opj_bio_t *bio); -/** -Passes the ending bits (coming from flushing) -@param bio BIO handle -@return Returns 1 if successful, returns 0 otherwise -*/ -int bio_inalign(opj_bio_t *bio); -/** -Read a bit -@param bio BIO handle -@return Returns the read bit -*/ -/* MOD antonin */ -/*int bio_getbit(opj_bio_t *bio);*/ -/* DOM */ -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __BIO_H */ - diff --git a/src/lib/openjp3d/cio.c b/src/lib/openjp3d/cio.c deleted file mode 100644 index 99007d02..00000000 --- a/src/lib/openjp3d/cio.c +++ /dev/null @@ -1,240 +0,0 @@ -/* - * 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 - * 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_includes.h" - -/* ----------------------------------------------------------------------- */ - -opj_cio_t* OPJ_CALLCONV opj_cio_open(opj_common_ptr cinfo, - unsigned char *buffer, int length) -{ - opj_cp_t *cp = NULL; - opj_cio_t *cio = (opj_cio_t*)opj_malloc(sizeof(opj_cio_t)); - if (!cio) { - return NULL; - } - cio->cinfo = cinfo; - if (buffer && length) { - /* wrap a user buffer containing the encoded image */ - cio->openmode = OPJ_STREAM_READ; - cio->buffer = buffer; - cio->length = length; - } else if (!buffer && !length && cinfo) { - /* allocate a buffer for the encoded image */ - cio->openmode = OPJ_STREAM_WRITE; - switch (cinfo->codec_format) { - case CODEC_J3D: - case CODEC_J2K: - cp = ((opj_j3d_t*)cinfo->j3d_handle)->cp; - break; - default: - opj_free(cio); - return NULL; - } - cio->length = cp->tdx * cp->tdy * cp->tdz * cp->tw * cp->th * cp->tl * 4; - cio->buffer = (unsigned char *)opj_malloc(cio->length); - if (!cio->buffer) { - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error allocating memory for compressed bitstream\n"); - opj_free(cio); - return NULL; - } - } else { - opj_free(cio); - return NULL; - } - - /* Initialize byte IO */ - cio->start = cio->buffer; - cio->end = cio->buffer + cio->length; - cio->bp = cio->buffer; - - return cio; -} - -void OPJ_CALLCONV opj_cio_close(opj_cio_t *cio) -{ - if (cio) { - if (cio->openmode == OPJ_STREAM_WRITE) { - /* destroy the allocated buffer */ - opj_free(cio->buffer); - } - /* destroy the cio */ - opj_free(cio); - } -} - - -/* ----------------------------------------------------------------------- */ - -/* - * Get position in byte stream. - */ -int OPJ_CALLCONV cio_tell(opj_cio_t *cio) -{ - return cio->bp - cio->start; -} - -/* - * Set position in byte stream. - * - * pos : position, in number of bytes, from the beginning of the stream - */ -void OPJ_CALLCONV cio_seek(opj_cio_t *cio, int pos) -{ - cio->bp = cio->start + pos; -} - -/* - * Number of bytes left before the end of the stream. - */ -int cio_numbytesleft(opj_cio_t *cio) -{ - return cio->end - cio->bp; -} - -/* - * Get pointer to the current position in the stream. - */ -unsigned char *cio_getbp(opj_cio_t *cio) -{ - return cio->bp; -} - -/* - * Write a byte. - */ -static bool cio_byteout(opj_cio_t *cio, unsigned char v) -{ - if (cio->bp >= cio->end) { - opj_event_msg(cio->cinfo, EVT_ERROR, "write error\n"); - return false; - } - *cio->bp++ = v; - return true; -} - -/* - * Read a byte. - */ -static unsigned char cio_bytein(opj_cio_t *cio) -{ - if (cio->bp >= cio->end) { - opj_event_msg(cio->cinfo, EVT_ERROR, "read error\n"); - return 0; - } - return *cio->bp++; -} - -/* - * Write some bytes. - * - * v : value to write - * n : number of bytes to write - */ -unsigned int cio_write(opj_cio_t *cio, unsigned int v, int n) -{ - int i; - for (i = n - 1; i >= 0; i--) { - if (!cio_byteout(cio, (unsigned char)((v >> (i << 3)) & 0xff))) { - return 0; - } - } - return n; -} - -/* - * Read some bytes. - * - * n : number of bytes to read - * - * return : value of the n bytes read - */ -unsigned int cio_read(opj_cio_t *cio, int n) -{ - int i; - unsigned int v; - v = 0; - for (i = n - 1; i >= 0; i--) { - v += cio_bytein(cio) << (i << 3); - } - return v; -} - -/* - * Skip some bytes. - * - * n : number of bytes to skip - */ -void cio_skip(opj_cio_t *cio, int n) -{ - cio->bp += n; -} - -/* - * Write some bytes. - * - * v : value to write - * n : number of bytes to write - */ -int cio_write_int(opj_cio_t *cio, int v, int n) -{ - int i; - for (i = n - 1; i >= 0; i--) { - if (!cio_byteout(cio, (char)((v >> (i << 3)) & 0xff))) { - return 0; - } - } - return n; -} - -/* - * Read some bytes. - * - * n : number of bytes to read - * - * return : value of the n bytes read - */ -int cio_read_int(opj_cio_t *cio, int n) -{ - int i; - int v; - v = 0; - for (i = n - 1; i >= 0; i--) { - v += cio_bytein(cio) << (i << 3); - } - return v; -} - diff --git a/src/lib/openjp3d/cio.h b/src/lib/openjp3d/cio.h deleted file mode 100644 index ff7ae683..00000000 --- a/src/lib/openjp3d/cio.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * 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 - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __CIO_H -#define __CIO_H -/** -@file cio.h -@brief Implementation of a byte input-output process (CIO) - -The functions in CIO.C have for goal to realize a byte input / output process. -*/ - -/** @defgroup CIO CIO - byte input-output stream */ -/*@{*/ - -/** @name Funciones generales (see also openjp3d.h) */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Number of bytes left before the end of the stream -@param cio CIO handle -@return Returns the number of bytes before the end of the stream -*/ -int cio_numbytesleft(opj_cio_t *cio); -/** -Get pointer to the current position in the stream -@param cio CIO handle -@return Returns a pointer to the current position -*/ -unsigned char *cio_getbp(opj_cio_t *cio); -/** -Write some bytes -@param cio CIO handle -@param v Value to write -@param n Number of bytes to write -@return Returns the number of bytes written or 0 if an error occurred -*/ -unsigned int cio_write(opj_cio_t *cio, unsigned int v, int n); -/** -Read some bytes -@param cio CIO handle -@param n Number of bytes to read -@return Returns the value of the n bytes read -*/ -unsigned int cio_read(opj_cio_t *cio, int n); -/** -Skip some bytes -@param cio CIO handle -@param n Number of bytes to skip -*/ -void cio_skip(opj_cio_t *cio, int n); -/** -Write some bytes -@param cio CIO handle -@param v Signed integer value to write -@param n Number of bytes to write -@return Returns the number of bytes written or 0 if an error occurred -*/ -int cio_write_int(opj_cio_t *cio, int v, int n); -/** -Read some bytes -@param cio CIO handle -@param n Number of bytes to read -@return Returns the value of the n bytes read -*/ -int cio_read_int(opj_cio_t *cio, int n); -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __CIO_H */ - diff --git a/src/lib/openjp3d/dwt.c b/src/lib/openjp3d/dwt.c deleted file mode 100644 index 08674337..00000000 --- a/src/lib/openjp3d/dwt.c +++ /dev/null @@ -1,1158 +0,0 @@ -/* - * 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 - * Copyrigth (c) 2006, Mónica Díez, LPI-UVA, 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. - */ - -/* - * NOTE: - * This is a modified version of the openjpeg dwt.c file. - * Average speed improvement compared to the original file (measured on - * my own machine, a P4 running at 3.0 GHz): - * 5x3 wavelets about 2 times faster - * 9x7 wavelets about 3 times faster - * for both, encoding and decoding. - * - * The better performance is caused by doing the 1-dimensional DWT - * within a temporary buffer where the data can be accessed sequential - * for both directions, horizontal and vertical. The 2d vertical DWT was - * the major bottleneck in the former version. - * - * I have also removed the "Add Patrick" part because it is not longer - * needed. - * - * 6/6/2005 - * -Ive (aka Reiner Wahler) - * mail: ive@lilysoft.com - */ - -#include "opj_includes.h" - -/** @defgroup DWT DWT - Implementation of a discrete wavelet transform */ -/*@{*/ - -/** @name Local static functions */ -/*@{*/ -/*unsigned int ops;*/ -/** -Forward lazy transform (horizontal) -*/ -static void dwt_deinterleave_h(int *a, int *b, int dn, int sn, int cas); -/** -Forward lazy transform (vertical) -*/ -static void dwt_deinterleave_v(int *a, int *b, int dn, int sn, int x, int cas); -/** -Forward lazy transform (axial) -*/ -static void dwt_deinterleave_z(int *a, int *b, int dn, int sn, int xy, int cas); -/** -Inverse lazy transform (horizontal) -*/ -static void dwt_interleave_h(int *a, int *b, int dn, int sn, int cas); -/** -Inverse lazy transform (vertical) -*/ -static void dwt_interleave_v(int *a, int *b, int dn, int sn, int x, int cas); -/** -Inverse lazy transform (axial) -*/ -static void dwt_interleave_z(int *a, int *b, int dn, int sn, int xy, int cas); -/** -Forward 5-3 wavelet transform in 1-D -*/ -static void dwt_encode_53(int *a, int dn, int sn, int cas); -static void dwt_encode_97(int *a, int dn, int sn, int cas); -/** -Inverse 5-3 wavelet transform in 1-D -*/ -static void dwt_decode_53(int *a, int dn, int sn, int cas); -static void dwt_decode_97(int *a, int dn, int sn, int cas); -/** -Computing of wavelet transform L2 norms for arbitrary transforms -*/ -static double dwt_calc_wtnorms(int orient, int level[3], int dwtid[3], - opj_wtfilt_t *wtfiltx, opj_wtfilt_t *wtfilty, opj_wtfilt_t *wtfiltz); -/** -Encoding of quantification stepsize -*/ -static void dwt_encode_stepsize(int stepsize, int numbps, - opj_stepsize_t *bandno_stepsize); -/*@}*/ - -/*@}*/ - -#define S(i) a[(i)*2] -#define D(i) a[(1+(i)*2)] -#define S_(i) ((i)<0?S(0):((i)>=sn?S(sn-1):S(i))) -#define D_(i) ((i)<0?D(0):((i)>=dn?D(dn-1):D(i))) -/* new */ -#define SS_(i) ((i)<0?S(0):((i)>=dn?S(dn-1):S(i))) -#define DD_(i) ((i)<0?D(0):((i)>=sn?D(sn-1):D(i))) - -/* */ -/* This table contains the norms of the 5-3 wavelets for different bands. */ -/* */ -static double dwt_norm[10][10][10][8]; -static int flagnorm[10][10][10][8]; - -/*static const double dwt_norms[5][8][10] = { - {//ResZ=1 - {1.000, 1.500, 2.750, 5.375, 10.68, 21.34, 42.67, 85.33, 170.7, 341.3}, - {1.038, 1.592, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9}, - {1.038, 1.592, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9}, - {.7186, .9218, 1.586, 3.043, 6.019, 12.01, 24.00, 47.97, 95.93} - },{//ResZ=2 - {1.000, 1.8371, 2.750, 5.375, 10.68, 21.34, 42.67, 85.33, 170.7, 341.3}, - {1.2717, 1.592, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9}, - {1.2717, 1.592, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9}, - {.8803, .9218, 1.586, 3.043, 6.019, 12.01, 24.00, 47.97, 95.93}, - {1.2717}, - {.8803}, - {.8803}, - {.6093}, - },{ //ResZ=3 - {1.000, 1.8371, 4.5604, 5.375, 10.68, 21.34, 42.67, 85.33, 170.7, 341.3}, - {1.2717, 2.6403, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9}, - {1.2717, 2.6403, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9}, - {.8803, 1.5286, 1.586, 3.043, 6.019, 12.01, 24.00, 47.97, 95.93}, - {1.2717, 2.6403}, - {.8803, 1.5286}, - {.8803, 1.5286}, - {.6093, 0.8850}, - },{ //ResZ=4 - {1.000, 1.8371, 4.5604, 12.4614, 10.68, 21.34, 42.67, 85.33, 170.7, 341.3}, - {1.2717, 2.6403, 6.7691 , 5.703, 11.33, 22.64, 45.25, 90.48, 180.9}, - {1.2717, 2.6403, 6.7691 , 5.703, 11.33, 22.64, 45.25, 90.48, 180.9}, - {.8803, 1.5286, 3.6770 , 3.043, 6.019, 12.01, 24.00, 47.97, 95.93}, - {1.2717, 2.6403, 6.7691 }, - {.8803, 1.5286, 3.6770 }, - {.8803, 1.5286, 3.6770 }, - {.6093, 0.8850, 1.9974 }, - },{ //ResZ=5 - {1.000, 1.8371, 4.5604, 12.4614, 34.9025, 21.34, 42.67, 85.33, 170.7, 341.3}, - {1.2717, 2.6403, 6.7691 , 18.6304 , 11.33, 22.64, 45.25, 90.48, 180.9}, - {1.2717, 2.6403, 6.7691 , 18.6304, 11.33, 22.64, 45.25, 90.48, 180.9}, - {.8803, 1.5286, 3.6770 , 9.9446, 6.019, 12.01, 24.00, 47.97, 95.93}, - {1.2717, 2.6403, 6.7691, 18.6304}, - {.8803, 1.5286, 3.6770, 9.9446 }, - {.8803, 1.5286, 3.6770, 9.9446 }, - {.6093, 0.8850, 1.9974, 5.3083 }, - } -};*/ - -/* */ -/* This table contains the norms of the 9-7 wavelets for different bands. */ -/* */ -/*static const double dwt_norms_real[5][8][10] = { - {//ResZ==1 - {1.000, 1.9659, 4.1224, 8.4167, 16.9356, 33.9249, 67.8772, 135.7680, 271.5430, 543.0894}, - {1.0113, 1.9968, 4.1834, 8.5341, 17.1667, 34.3852, 68.7967, 137.6065, 275.2196}, - {1.0113, 1.9968, 4.1834, 8.5341, 17.1667, 34.3852, 68.7967, 137.6065, 275.2196}, - {0.5202, 0.9672, 2.0793, 4.3005, 8.6867, 17.4188, 34.8608, 69.7332, 139.4722} - }, { //ResZ==2 - {1.000, 2.7564, 4.1224, 8.4167, 16.9356, 33.9249, 67.8772, 135.7680, 271.5430, 543.0894}, - {1.4179, 1.9968, 4.1834, 8.5341, 17.1667, 34.3852, 68.7967, 137.6065, 275.2196}, - {1.4179, 1.9968, 4.1834, 8.5341, 17.1667, 34.3852, 68.7967, 137.6065, 275.2196}, - {0.7294, 0.9672, 2.0793, 4.3005, 8.6867, 17.4188, 34.8608, 69.7332, 139.4722}, - {1.4179}, - {0.7294}, - {0.7294}, - {0.3752} //HHH - },{ //ResZ==3 - {1.000, 2.7564, 8.3700, 8.4167, 16.9356, 33.9249, 67.8772, 135.7680, 271.5430, 543.0894}, - {1.4179, 4.0543, 4.1834, 8.5341, 17.1667, 34.3852, 68.7967, 137.6065, 275.2196}, - {1.4179, 4.0543, 4.1834, 8.5341, 17.1667, 34.3852, 68.7967, 137.6065, 275.2196}, - {0.7294, 1.9638, 2.0793, 4.3005, 8.6867, 17.4188, 34.8608, 69.7332, 139.4722}, - {1.4179, 4.0543}, - {0.7294, 1.9638}, - {0.7294, 1.9638}, - {0.3752, 0.9512} //HHH - },{ //ResZ==4 - {1.000, 2.7564, 8.3700, 24.4183, 16.9356, 33.9249, 67.8772, 135.7680, 271.5430, 543.0894}, - {1.4179, 4.0543, 12.1366, 8.5341, 17.1667, 34.3852, 68.7967, 137.6065, 275.2196}, - {1.4179, 4.0543, 12.1366, 8.5341, 17.1667, 34.3852, 68.7967, 137.6065, 275.2196}, - {0.7294, 1.9638, 6.0323, 4.3005, 8.6867, 17.4188, 34.8608, 69.7332, 139.4722}, - {1.4179, 4.0543, 12.1366}, - {0.7294, 1.9638, 6.0323}, - {0.7294, 1.9638, 6.0323}, - {0.3752, 0.9512, 2.9982} //HHH - },{ //ResZ==5 - {1.000, 2.7564, 8.3700, 24.4183, 69.6947, 33.9249, 67.8772, 135.7680, 271.5430, 543.0894}, - {1.4179, 4.0543, 12.1366, 35.1203, 17.1667, 34.3852, 68.7967, 137.6065, 275.2196}, - {1.4179, 4.0543, 12.1366, 35.1203, 17.1667, 34.3852, 68.7967, 137.6065, 275.2196}, - {0.7294, 1.9638, 6.0323, 17.6977, 8.6867, 17.4188, 34.8608, 69.7332, 139.4722}, - {1.4179, 4.0543, 12.1366, 35.1203}, - {0.7294, 1.9638, 6.0323, 17.6977}, - {0.7294, 1.9638, 6.0323, 17.6977}, - {0.3752, 0.9512, 2.9982, 8.9182} //HHH - } -};*/ - -static opj_atk_t atk_info_wt[] = { - {0, 1, J3D_ATK_WS, J3D_ATK_IRR, 0, J3D_ATK_WS, 1.230174104, 4, {0}, {0}, {0}, {1, 1, 1, 1}, {-1.586134342059924, -0.052980118572961, 0.882911075530934, 0.443506852043971}}, /* WT 9-7 IRR*/ - {1, 0, J3D_ATK_WS, J3D_ATK_REV, 0, J3D_ATK_WS, 0, 2, {0}, {1, 2}, {1, 2}, {1, 1}, {-1, 1}}, /* WT 5-3 REV*/ - {2, 0, J3D_ATK_ARB, J3D_ATK_REV, 0, J3D_ATK_CON, 0, 2, {0, 0}, {0, 1}, {0, 1}, {1, 1}, {{-1}, {1}}}, /* WT 2-2 REV*/ - {3, 0, J3D_ATK_ARB, J3D_ATK_REV, 1, J3D_ATK_CON, 0, 3, {0, 0, -1}, {0, 1, 2}, {0, 1, 2}, {1, 1, 3}, {{-1}, {1}, {1, 0, -1}}}, /* WT 2-6 REV*/ - {4, 0, J3D_ATK_ARB, J3D_ATK_REV, 1, J3D_ATK_CON, 0, 3, {0, 0, -2}, {0, 1, 6}, {0, 1, 32}, {1, 1, 5}, {{-1}, {1}, {-3, 22, 0, -22, 3}}}, /* WT 2-10 REV*/ - {5, 1, J3D_ATK_ARB, J3D_ATK_IRR, 1, J3D_ATK_WS, 1, 7, {0}, {0}, {0}, {1, 1, 2, 1, 2, 1, 3}, {{-1}, {1.58613434206}, {-0.460348209828, 0.460348209828}, {0.25}, {0.374213867768, -0.374213867768}, {-1.33613434206}, {0.29306717103, 0, -0.29306717103}}}, /* WT 6-10 IRR*/ - { - 6, 1, J3D_ATK_ARB, J3D_ATK_IRR, 0, J3D_ATK_WS, 1, 11, {0}, {0}, {0}, {1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 5}, {{-1}, {0, 99715069105}, {-1.00573127827, 1.00573127827}, {-0.27040357631}, {2.20509972343, -2.20509972343}, {0.08059995736}, - {-1.62682532350, 1.62682532350}, {0.52040357631}, {0.60404664250, -0.60404664250}, {-0.82775064841}, {-0.06615812964, 0.29402137720, 0, -0.29402137720, 0.06615812964} - } - }, /* WT 10-18 IRR*/ - {7, 1, J3D_ATK_WS, J3D_ATK_IRR, 0, J3D_ATK_WS, 1, 2, {0}, {0}, {0}, {1, 1}, {-0.5, 0.25}}, /* WT 5-3 IRR*/ - {8, 0, J3D_ATK_WS, J3D_ATK_REV, 0, J3D_ATK_WS, 0, 2, {0}, {4, 4}, {8, 8}, {2, 2}, {{-9, 1}, {5, -1}}} /* WT 13-7 REV*/ -}; -/* -========================================================== - local functions -========================================================== -*/ - -/* */ -/* Forward lazy transform (horizontal). */ -/* */ -static void dwt_deinterleave_h(int *a, int *b, int dn, int sn, int cas) -{ - int i; - for (i = 0; i < sn; i++) { - b[i] = a[2 * i + cas]; - } - for (i = 0; i < dn; i++) { - b[sn + i] = a[(2 * i + 1 - cas)]; - } -} - -/* */ -/* Forward lazy transform (vertical). */ -/* */ -static void dwt_deinterleave_v(int *a, int *b, int dn, int sn, int x, int cas) -{ - int i; - for (i = 0; i < sn; i++) { - b[i * x] = a[2 * i + cas]; - } - for (i = 0; i < dn; i++) { - b[(sn + i)*x] = a[(2 * i + 1 - cas)]; - } -} - -/* */ -/* Forward lazy transform (axial). */ -/* */ -static void dwt_deinterleave_z(int *a, int *b, int dn, int sn, int xy, int cas) -{ - int i; - for (i = 0; i < sn; i++) { - b[i * xy] = a[2 * i + cas]; - } - for (i = 0; i < dn; i++) { - b[(sn + i)*xy] = a[(2 * i + 1 - cas)]; - } -} - -/* */ -/* Inverse lazy transform (horizontal). */ -/* */ -static void dwt_interleave_h(int *a, int *b, int dn, int sn, int cas) -{ - int i; - int *ai = NULL; - int *bi = NULL; - ai = a; - bi = b + cas; - for (i = 0; i < sn; i++) { - *bi = *ai; - bi += 2; - ai++; - } - ai = a + sn; - bi = b + 1 - cas; - for (i = 0; i < dn; i++) { - *bi = *ai; - bi += 2; - ai++; - } -} - -/* */ -/* Inverse lazy transform (vertical). */ -/* */ -static void dwt_interleave_v(int *a, int *b, int dn, int sn, int x, int cas) -{ - int i; - int *ai = NULL; - int *bi = NULL; - ai = a; - bi = b + cas; - for (i = 0; i < sn; i++) { - *bi = *ai; - bi += 2; - ai += x; - } - ai = a + (sn * x); - bi = b + 1 - cas; - for (i = 0; i < dn; i++) { - *bi = *ai; - bi += 2; - ai += x; - } -} - -/* */ -/* Inverse lazy transform (axial). */ -/* */ -static void dwt_interleave_z(int *a, int *b, int dn, int sn, int xy, int cas) -{ - int i; - int *ai = NULL; - int *bi = NULL; - ai = a; - bi = b + cas; - for (i = 0; i < sn; i++) { - *bi = *ai; - bi += 2; - ai += xy; - } - ai = a + (sn * xy); - bi = b + 1 - cas; - for (i = 0; i < dn; i++) { - *bi = *ai; - bi += 2; - ai += xy; - } -} - - -/* */ -/* Forward 5-3 or 9-7 wavelet transform in 1-D. */ -/* */ -static void dwt_encode_53(int *a, int dn, int sn, int cas) -{ - int i; - - if (!cas) { - if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */ - /*for (i = 0; i < dn; i++) D(i) -= (S_(i) + S_(i + 1)) >> 1;*/ - /*for (i = 0; i < sn; i++) S(i) += (D_(i - 1) + D_(i) + 2) >> 2;*/ - for (i = 0; i < dn; i++) { - D(i) -= (S_(i) + S_(i + 1)) >> 1; - /*ops += 2;*/ - } - for (i = 0; i < sn; i++) { - S(i) += (D_(i - 1) + D_(i) + 2) >> 2; - /*ops += 3;*/ - } - } - } else { - /*if (!sn && dn == 1) - S(0) *= 2; - else { - for (i = 0; i < dn; i++) S(i) -= (DD_(i) + DD_(i - 1)) >> 1; - for (i = 0; i < sn; i++) D(i) += (SS_(i) + SS_(i + 1) + 2) >> 2; - }*/ - if (!sn && dn == 1) { - S(0) *= 2; - /*ops++;*/ - } else { - for (i = 0; i < dn; i++) { - S(i) -= (DD_(i) + DD_(i - 1)) >> 1; - /* ops += 2;*/ - } - for (i = 0; i < sn; i++) { - D(i) += (SS_(i) + SS_(i + 1) + 2) >> 2; - /* ops += 3;*/ - } - } - } -} -static void dwt_encode_97(int *a, int dn, int sn, int cas) -{ - int i; - - if (!cas) { - if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */ - for (i = 0; i < dn; i++) { - D(i) -= fix_mul(S_(i) + S_(i + 1), 12993); - } - for (i = 0; i < sn; i++) { - S(i) -= fix_mul(D_(i - 1) + D_(i), 434); - } - for (i = 0; i < dn; i++) { - D(i) += fix_mul(S_(i) + S_(i + 1), 7233); - } - for (i = 0; i < sn; i++) { - S(i) += fix_mul(D_(i - 1) + D_(i), 3633); - } - for (i = 0; i < dn; i++) { - D(i) = fix_mul(D(i), 5038); /*5038 */ - } - for (i = 0; i < sn; i++) { - S(i) = fix_mul(S(i), 6659); /*6660 */ - } - } - } else { - if ((sn > 0) || (dn > 1)) { /* NEW : CASE ONE ELEMENT */ - for (i = 0; i < dn; i++) { - S(i) -= fix_mul(DD_(i) + DD_(i - 1), 12993); - } - for (i = 0; i < sn; i++) { - D(i) -= fix_mul(SS_(i) + SS_(i + 1), 434); - } - for (i = 0; i < dn; i++) { - S(i) += fix_mul(DD_(i) + DD_(i - 1), 7233); - } - for (i = 0; i < sn; i++) { - D(i) += fix_mul(SS_(i) + SS_(i + 1), 3633); - } - for (i = 0; i < dn; i++) { - S(i) = fix_mul(S(i), 5038); /*5038 */ - } - for (i = 0; i < sn; i++) { - D(i) = fix_mul(D(i), 6659); /*6660 */ - } - } - } -} -/* */ -/* Inverse 5-3 or 9-7 wavelet transform in 1-D. */ -/* */ -static void dwt_decode_53(int *a, int dn, int sn, int cas) -{ - int i; - if (!cas) { - if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */ - for (i = 0; i < sn; i++) { - S(i) -= (D_(i - 1) + D_(i) + 2) >> 2; - } - for (i = 0; i < dn; i++) { - D(i) += (S_(i) + S_(i + 1)) >> 1; - } - } - } else { - if (!sn && dn == 1) { /* NEW : CASE ONE ELEMENT */ - S(0) /= 2; - } else { - for (i = 0; i < sn; i++) { - D(i) -= (SS_(i) + SS_(i + 1) + 2) >> 2; - } - for (i = 0; i < dn; i++) { - S(i) += (DD_(i) + DD_(i - 1)) >> 1; - } - } - } -} -static void dwt_decode_97(int *a, int dn, int sn, int cas) -{ - int i; - - if (!cas) { - if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */ - for (i = 0; i < sn; i++) { - S(i) = fix_mul(S(i), 10078); /* 10076 */ - } - for (i = 0; i < dn; i++) { - D(i) = fix_mul(D(i), 13318); /* 13320 */ - } - for (i = 0; i < sn; i++) { - S(i) -= fix_mul(D_(i - 1) + D_(i), 3633); - } - for (i = 0; i < dn; i++) { - D(i) -= fix_mul(S_(i) + S_(i + 1), 7233); - } - for (i = 0; i < sn; i++) { - S(i) += fix_mul(D_(i - 1) + D_(i), 434); - } - for (i = 0; i < dn; i++) { - D(i) += fix_mul(S_(i) + S_(i + 1), 12994); /* 12993 */ - } - } - } else { - if ((sn > 0) || (dn > 1)) { /* NEW : CASE ONE ELEMENT */ - for (i = 0; i < sn; i++) { - D(i) = fix_mul(D(i), 10078); /* 10076 */ - } - for (i = 0; i < dn; i++) { - S(i) = fix_mul(S(i), 13318); /* 13320 */ - } - for (i = 0; i < sn; i++) { - D(i) -= fix_mul(SS_(i) + SS_(i + 1), 3633); - } - for (i = 0; i < dn; i++) { - S(i) -= fix_mul(DD_(i) + DD_(i - 1), 7233); - } - for (i = 0; i < sn; i++) { - D(i) += fix_mul(SS_(i) + SS_(i + 1), 434); - } - for (i = 0; i < dn; i++) { - S(i) += fix_mul(DD_(i) + DD_(i - 1), 12994); /* 12993 */ - } - } - } -} - - -/* */ -/* Get norm of arbitrary wavelet transform. */ -/* */ -static int upandconv(double *nXPS, double *LPS, int lenXPS, int lenLPS) -{ - /* Perform the convolution of the vectors. */ - int i, j; - double *tmp = (double *)opj_malloc(2 * lenXPS * sizeof(double)); - /*Upsample*/ - memset(tmp, 0, 2 * lenXPS * sizeof(double)); - for (i = 0; i < lenXPS; i++) { - *(tmp + 2 * i) = *(nXPS + i); - *(nXPS + i) = 0; - } - /*Convolution*/ - for (i = 0; i < 2 * lenXPS; i++) { - for (j = 0; j < lenLPS; j++) { - *(nXPS + i + j) = *(nXPS + i + j) + *(tmp + i) * *(LPS + j); - /*fprintf(stdout,"*(tmp + %d) * *(LPS + %d) = %f * %f \n",i,j,*(tmp + i),*(LPS + j));*/ - } - } - free(tmp); - return 2 * lenXPS + lenLPS - 1; -} - -static double dwt_calc_wtnorms(int orient, int level[3], int dwtid[3], - opj_wtfilt_t *wtfiltX, opj_wtfilt_t *wtfiltY, opj_wtfilt_t *wtfiltZ) -{ - int i, lenLPS, lenHPS; - double Lx = 0, Ly = 0, Hx = 0, Hy = 0, Lz = 0, Hz = 0; - double *nLPSx, *nHPSx, *nLPSy, *nHPSy, *nLPSz, *nHPSz; - int levelx, levely, levelz; - - levelx = (orient == 0) ? level[0] - 1 : level[0]; - levely = (orient == 0) ? level[1] - 1 : level[1]; - levelz = (orient == 0) ? level[2] - 1 : level[2]; - - /*X axis*/ - lenLPS = wtfiltX->lenLPS; - lenHPS = wtfiltX->lenHPS; - for (i = 0; i < levelx; i++) { - lenLPS *= 2; - lenHPS *= 2; - lenLPS += wtfiltX->lenLPS - 1; - lenHPS += wtfiltX->lenLPS - 1; - } - nLPSx = (double *)opj_malloc(lenLPS * sizeof(double)); - nHPSx = (double *)opj_malloc(lenHPS * sizeof(double)); - - memcpy(nLPSx, wtfiltX->LPS, wtfiltX->lenLPS * sizeof(double)); - memcpy(nHPSx, wtfiltX->HPS, wtfiltX->lenHPS * sizeof(double)); - lenLPS = wtfiltX->lenLPS; - lenHPS = wtfiltX->lenHPS; - for (i = 0; i < levelx; i++) { - lenLPS = upandconv(nLPSx, wtfiltX->LPS, lenLPS, wtfiltX->lenLPS); - lenHPS = upandconv(nHPSx, wtfiltX->LPS, lenHPS, wtfiltX->lenLPS); - } - for (i = 0; i < lenLPS; i++) { - Lx += nLPSx[i] * nLPSx[i]; - } - for (i = 0; i < lenHPS; i++) { - Hx += nHPSx[i] * nHPSx[i]; - } - Lx = sqrt(Lx); - Hx = sqrt(Hx); - free(nLPSx); - free(nHPSx); - - /*Y axis*/ - if (dwtid[0] != dwtid[1] || level[0] != level[1]) { - lenLPS = wtfiltY->lenLPS; - lenHPS = wtfiltY->lenHPS; - for (i = 0; i < levely; i++) { - lenLPS *= 2; - lenHPS *= 2; - lenLPS += wtfiltY->lenLPS - 1; - lenHPS += wtfiltY->lenLPS - 1; - } - nLPSy = (double *)opj_malloc(lenLPS * sizeof(double)); - nHPSy = (double *)opj_malloc(lenHPS * sizeof(double)); - - memcpy(nLPSy, wtfiltY->LPS, wtfiltY->lenLPS * sizeof(double)); - memcpy(nHPSy, wtfiltY->HPS, wtfiltY->lenHPS * sizeof(double)); - lenLPS = wtfiltY->lenLPS; - lenHPS = wtfiltY->lenHPS; - for (i = 0; i < levely; i++) { - lenLPS = upandconv(nLPSy, wtfiltY->LPS, lenLPS, wtfiltY->lenLPS); - lenHPS = upandconv(nHPSy, wtfiltY->LPS, lenHPS, wtfiltY->lenLPS); - } - for (i = 0; i < lenLPS; i++) { - Ly += nLPSy[i] * nLPSy[i]; - } - for (i = 0; i < lenHPS; i++) { - Hy += nHPSy[i] * nHPSy[i]; - } - Ly = sqrt(Ly); - Hy = sqrt(Hy); - free(nLPSy); - free(nHPSy); - } else { - Ly = Lx; - Hy = Hx; - } - /*Z axis*/ - if (levelz >= 0) { - lenLPS = wtfiltZ->lenLPS; - lenHPS = wtfiltZ->lenHPS; - for (i = 0; i < levelz; i++) { - lenLPS *= 2; - lenHPS *= 2; - lenLPS += wtfiltZ->lenLPS - 1; - lenHPS += wtfiltZ->lenLPS - 1; - } - nLPSz = (double *)opj_malloc(lenLPS * sizeof(double)); - nHPSz = (double *)opj_malloc(lenHPS * sizeof(double)); - - memcpy(nLPSz, wtfiltZ->LPS, wtfiltZ->lenLPS * sizeof(double)); - memcpy(nHPSz, wtfiltZ->HPS, wtfiltZ->lenHPS * sizeof(double)); - lenLPS = wtfiltZ->lenLPS; - lenHPS = wtfiltZ->lenHPS; - for (i = 0; i < levelz; i++) { - lenLPS = upandconv(nLPSz, wtfiltZ->LPS, lenLPS, wtfiltZ->lenLPS); - lenHPS = upandconv(nHPSz, wtfiltZ->LPS, lenHPS, wtfiltZ->lenLPS); - } - for (i = 0; i < lenLPS; i++) { - Lz += nLPSz[i] * nLPSz[i]; - } - for (i = 0; i < lenHPS; i++) { - Hz += nHPSz[i] * nHPSz[i]; - } - Lz = sqrt(Lz); - Hz = sqrt(Hz); - free(nLPSz); - free(nHPSz); - } else { - Lz = 1.0; - Hz = 1.0; - } - switch (orient) { - case 0: - return Lx * Ly * Lz; - case 1: - return Lx * Hy * Lz; - case 2: - return Hx * Ly * Lz; - case 3: - return Hx * Hy * Lz; - case 4: - return Lx * Ly * Hz; - case 5: - return Lx * Hy * Hz; - case 6: - return Hx * Ly * Hz; - case 7: - return Hx * Hy * Hz; - default: - return -1; - } - -} -static void dwt_getwtfilters(opj_wtfilt_t *wtfilt, int dwtid) -{ - if (dwtid == 0) { /*DWT 9-7 */ - wtfilt->lenLPS = 7; - wtfilt->lenHPS = 9; - wtfilt->LPS = (double *)opj_malloc(wtfilt->lenLPS * sizeof(double)); - wtfilt->HPS = (double *)opj_malloc(wtfilt->lenHPS * sizeof(double)); - wtfilt->LPS[0] = -0.091271763114; - wtfilt->HPS[0] = 0.026748757411; - wtfilt->LPS[1] = -0.057543526228; - wtfilt->HPS[1] = 0.016864118443; - wtfilt->LPS[2] = 0.591271763114; - wtfilt->HPS[2] = -0.078223266529; - wtfilt->LPS[3] = 1.115087052457; - wtfilt->HPS[3] = -0.266864118443; - wtfilt->LPS[4] = 0.591271763114; - wtfilt->HPS[4] = 0.602949018236; - wtfilt->LPS[5] = -0.057543526228; - wtfilt->HPS[5] = -0.266864118443; - wtfilt->LPS[6] = -0.091271763114; - wtfilt->HPS[6] = -0.078223266529; - wtfilt->HPS[7] = 0.016864118443; - wtfilt->HPS[8] = 0.026748757411; - } else if (dwtid == 1) { /*DWT 5-3 */ - wtfilt->lenLPS = 3; - wtfilt->lenHPS = 5; - wtfilt->LPS = (double *)opj_malloc(wtfilt->lenLPS * sizeof(double)); - wtfilt->HPS = (double *)opj_malloc(wtfilt->lenHPS * sizeof(double)); - wtfilt->LPS[0] = 0.5; - wtfilt->HPS[0] = -0.125; - wtfilt->LPS[1] = 1; - wtfilt->HPS[1] = -0.25; - wtfilt->LPS[2] = 0.5; - wtfilt->HPS[2] = 0.75; - wtfilt->HPS[3] = -0.25; - wtfilt->HPS[4] = -0.125; - } else { - fprintf(stdout, - "[ERROR] Sorry, this wavelet hasn't been implemented so far ... Try another one :-)\n"); - exit(1); - } -} -/* */ -/* Encoding of quantization stepsize for each subband. */ -/* */ -static void dwt_encode_stepsize(int stepsize, int numbps, - opj_stepsize_t *bandno_stepsize) -{ - int p, n; - p = int_floorlog2(stepsize) - 13; - n = 11 - int_floorlog2(stepsize); - bandno_stepsize->mant = (n < 0 ? stepsize >> -n : stepsize << n) & 0x7ff; - bandno_stepsize->expn = numbps - p; - /*if J3D_CCP_QNTSTY_NOQNT --> stepsize = 8192.0 --> p = 0, n = -2 --> mant = 0; expn = (prec+gain)*/ - /*else --> bandno_stepsize = (1<<(numbps - expn)) + (1<<(numbps - expn - 11)) * Ub*/ -} - -/* -========================================================== - DWT interface -========================================================== -*/ -/* */ -/* Forward 5-3 wavelet transform in 3-D. */ -/* */ -void dwt_encode(opj_tcd_tilecomp_t * tilec, int dwtid[3]) -{ - int i, j, k; - int x, y, z; - int w, h, wh, d; - int level, levelx, levely, levelz, diff; - int *a = NULL; - int *aj = NULL; - int *bj = NULL; - int *cj = NULL; - - /*ops = 0;*/ - - memset(flagnorm, 0, 8000 * sizeof(int)); - w = tilec->x1 - tilec->x0; - h = tilec->y1 - tilec->y0; - d = tilec->z1 - tilec->z0; - wh = w * h; - levelx = tilec->numresolution[0] - 1; - levely = tilec->numresolution[1] - 1; - levelz = tilec->numresolution[2] - 1; - level = int_max(levelx, int_max(levely, levelz)); - diff = tilec->numresolution[0] - tilec->numresolution[2]; - - a = tilec->data; - - for (x = 0, y = 0, z = 0; (x < levelx) && (y < levely); x++, y++, z++) { - int rw; /* width of the resolution level computed */ - int rh; /* heigth of the resolution level computed */ - int rd; /* depth of the resolution level computed */ - int rw1; /* width of the resolution level once lower than computed one */ - int rh1; /* height of the resolution level once lower than computed one */ - int rd1; /* depth of the resolution level once lower than computed one */ - int cas_col; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */ - int cas_row; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering */ - int cas_axl; /* 0 = non inversion on axial filtering 1 = inversion between low-pass and high-pass filtering */ - int dn, sn; - - rw = tilec->resolutions[level - x].x1 - tilec->resolutions[level - x].x0; - rh = tilec->resolutions[level - y].y1 - tilec->resolutions[level - y].y0; - rd = tilec->resolutions[level - z].z1 - tilec->resolutions[level - z].z0; - rw1 = tilec->resolutions[level - x - 1].x1 - tilec->resolutions[level - x - - 1].x0; - rh1 = tilec->resolutions[level - y - 1].y1 - tilec->resolutions[level - y - - 1].y0; - rd1 = tilec->resolutions[level - z - 1].z1 - tilec->resolutions[level - z - - 1].z0; - - cas_col = tilec->resolutions[level - x].x0 % - 2; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */ - cas_row = tilec->resolutions[level - y].y0 % - 2; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering */ - cas_axl = tilec->resolutions[level - z].z0 % 2; - - /*fprintf(stdout," x %d y %d z %d \n",x,y,z); - fprintf(stdout," levelx %d levely %d levelz %d \n",levelx,levely,levelz); - fprintf(stdout," z1 %d z0 %d\n",tilec->resolutions[level - z].z1,tilec->resolutions[level - z].z0); - fprintf(stdout," rw %d rh %d rd %d \n rw1 %d rh1 %d rd1 %d \n",rw,rh,rd,rw1,rh1,rd1);*/ - - for (i = 0; i < rd; i++) { - - cj = a + (i * wh); - - /*Horizontal*/ - sn = rw1; - dn = rw - rw1; - bj = (int*)opj_malloc(rw * sizeof(int)); - if (dwtid[0] == 0) { - for (j = 0; j < rh; j++) { - aj = cj + j * w; - for (k = 0; k < rw; k++) { - bj[k] = aj[k]; - } - dwt_encode_97(bj, dn, sn, cas_row); - dwt_deinterleave_h(bj, aj, dn, sn, cas_row); - } - } else if (dwtid[0] == 1) { - for (j = 0; j < rh; j++) { - aj = cj + j * w; - for (k = 0; k < rw; k++) { - bj[k] = aj[k]; - } - dwt_encode_53(bj, dn, sn, cas_row); - dwt_deinterleave_h(bj, aj, dn, sn, cas_row); - } - } - opj_free(bj); - - /*Vertical*/ - sn = rh1; - dn = rh - rh1; - bj = (int*)opj_malloc(rh * sizeof(int)); - if (dwtid[1] == 0) { /*DWT 9-7*/ - for (j = 0; j < rw; j++) { - aj = cj + j; - for (k = 0; k < rh; k++) { - bj[k] = aj[k * w]; - } - dwt_encode_97(bj, dn, sn, cas_col); - dwt_deinterleave_v(bj, aj, dn, sn, w, cas_col); - } - } else if (dwtid[1] == 1) { /*DWT 5-3*/ - for (j = 0; j < rw; j++) { - aj = cj + j; - for (k = 0; k < rh; k++) { - bj[k] = aj[k * w]; - } - dwt_encode_53(bj, dn, sn, cas_col); - dwt_deinterleave_v(bj, aj, dn, sn, w, cas_col); - } - } - opj_free(bj); - } - - if (z < levelz) { - /*Axial fprintf(stdout,"Axial DWT Transform %d %d %d\n",z,rd,rd1);*/ - sn = rd1; - dn = rd - rd1; - bj = (int*)opj_malloc(rd * sizeof(int)); - if (dwtid[2] == 0) { - for (j = 0; j < (rw * rh); j++) { - aj = a + j; - for (k = 0; k < rd; k++) { - bj[k] = aj[k * wh]; - } - dwt_encode_97(bj, dn, sn, cas_axl); - dwt_deinterleave_z(bj, aj, dn, sn, wh, cas_axl); - } - } else if (dwtid[2] == 1) { - for (j = 0; j < (rw * rh); j++) { - aj = a + j; - for (k = 0; k < rd; k++) { - bj[k] = aj[k * wh]; - } - dwt_encode_53(bj, dn, sn, cas_axl); - dwt_deinterleave_z(bj, aj, dn, sn, wh, cas_axl); - } - } - opj_free(bj); - } - } - - /*fprintf(stdout,"[INFO] Ops: %d \n",ops);*/ -} - - -/* */ -/* Inverse 5-3 wavelet transform in 3-D. */ -/* */ -void dwt_decode(opj_tcd_tilecomp_t * tilec, int stops[3], int dwtid[3]) -{ - int i, j, k; - int x, y, z; - int w, h, wh, d; - int level, levelx, levely, levelz, diff; - int *a = NULL; - int *aj = NULL; - int *bj = NULL; - int *cj = NULL; - - a = tilec->data; - - w = tilec->x1 - tilec->x0; - h = tilec->y1 - tilec->y0; - d = tilec->z1 - tilec->z0; - wh = w * h; - levelx = tilec->numresolution[0] - 1; - levely = tilec->numresolution[1] - 1; - levelz = tilec->numresolution[2] - 1; - level = int_max(levelx, int_max(levely, levelz)); - diff = tilec->numresolution[0] - tilec->numresolution[2]; - - /* General lifting framework -- DCCS-LIWT */ - for (x = level - 1, y = level - 1, z = level - 1; (x >= stops[0]) && - (y >= stops[1]); x--, y--, z--) { - int rw; /* width of the resolution level computed */ - int rh; /* heigth of the resolution level computed */ - int rd; /* depth of the resolution level computed */ - int rw1; /* width of the resolution level once lower than computed one */ - int rh1; /* height of the resolution level once lower than computed one */ - int rd1; /* depth of the resolution level once lower than computed one */ - int cas_col; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */ - int cas_row; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering */ - int cas_axl; /* 0 = non inversion on axial filtering 1 = inversion between low-pass and high-pass filtering */ - int dn, sn; - - rw = tilec->resolutions[level - x].x1 - tilec->resolutions[level - x].x0; - rh = tilec->resolutions[level - y].y1 - tilec->resolutions[level - y].y0; - rd = tilec->resolutions[level - z].z1 - tilec->resolutions[level - z].z0; - rw1 = tilec->resolutions[level - x - 1].x1 - tilec->resolutions[level - x - - 1].x0; - rh1 = tilec->resolutions[level - y - 1].y1 - tilec->resolutions[level - y - - 1].y0; - rd1 = tilec->resolutions[level - z - 1].z1 - tilec->resolutions[level - z - - 1].z0; - - cas_col = tilec->resolutions[level - x].x0 % - 2; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */ - cas_row = tilec->resolutions[level - y].y0 % - 2; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering */ - cas_axl = tilec->resolutions[level - z].z0 % 2; - - /*fprintf(stdout," x %d y %d z %d \n",x,y,z); - fprintf(stdout," levelx %d levely %d levelz %d \n",levelx,levely,levelz); - fprintf(stdout," dwtid[0] %d [1] %d [2] %d \n",dwtid[0],dwtid[1],dwtid[2]); - fprintf(stdout," rw %d rh %d rd %d \n rw1 %d rh1 %d rd1 %d \n",rw,rh,rd,rw1,rh1,rd1); - fprintf(stdout,"IDWT Transform %d %d %d %d\n",level, z, rd,rd1);*/ - - if (z >= stops[2] && rd != rd1) { - /*fprintf(stdout,"Axial Transform %d %d %d %d\n",levelz, z, rd,rd1);*/ - sn = rd1; - dn = rd - rd1; - bj = (int*)opj_malloc(rd * sizeof(int)); - if (dwtid[2] == 0) { - for (j = 0; j < (rw * rh); j++) { - aj = a + j; - dwt_interleave_z(aj, bj, dn, sn, wh, cas_axl); - dwt_decode_97(bj, dn, sn, cas_axl); - for (k = 0; k < rd; k++) { - aj[k * wh] = bj[k]; - } - } - } else if (dwtid[2] == 1) { - for (j = 0; j < (rw * rh); j++) { - aj = a + j; - dwt_interleave_z(aj, bj, dn, sn, wh, cas_axl); - dwt_decode_53(bj, dn, sn, cas_axl); - for (k = 0; k < rd; k++) { - aj[k * wh] = bj[k]; - } - } - } - opj_free(bj); - } - - for (i = 0; i < rd; i++) { - /*Fetch corresponding slice for doing DWT-2D*/ - cj = tilec->data + (i * wh); - - /*Vertical*/ - sn = rh1; - dn = rh - rh1; - bj = (int*)opj_malloc(rh * sizeof(int)); - if (dwtid[1] == 0) { - for (j = 0; j < rw; j++) { - aj = cj + j; - dwt_interleave_v(aj, bj, dn, sn, w, cas_col); - dwt_decode_97(bj, dn, sn, cas_col); - for (k = 0; k < rh; k++) { - aj[k * w] = bj[k]; - } - } - } else if (dwtid[1] == 1) { - for (j = 0; j < rw; j++) { - aj = cj + j; - dwt_interleave_v(aj, bj, dn, sn, w, cas_col); - dwt_decode_53(bj, dn, sn, cas_col); - for (k = 0; k < rh; k++) { - aj[k * w] = bj[k]; - } - } - } - opj_free(bj); - - /*Horizontal*/ - sn = rw1; - dn = rw - rw1; - bj = (int*)opj_malloc(rw * sizeof(int)); - if (dwtid[0] == 0) { - for (j = 0; j < rh; j++) { - aj = cj + j * w; - dwt_interleave_h(aj, bj, dn, sn, cas_row); - dwt_decode_97(bj, dn, sn, cas_row); - for (k = 0; k < rw; k++) { - aj[k] = bj[k]; - } - } - } else if (dwtid[0] == 1) { - for (j = 0; j < rh; j++) { - aj = cj + j * w; - dwt_interleave_h(aj, bj, dn, sn, cas_row); - dwt_decode_53(bj, dn, sn, cas_row); - for (k = 0; k < rw; k++) { - aj[k] = bj[k]; - } - } - } - opj_free(bj); - - } - - } - -} - - -/* */ -/* Get gain of wavelet transform. */ -/* */ -int dwt_getgain(int orient, int reversible) -{ - if (reversible == 1) { - if (orient == 0) { - return 0; - } else if (orient == 1 || orient == 2 || orient == 4) { - return 1; - } else if (orient == 3 || orient == 5 || orient == 6) { - return 2; - } else { - return 3; - } - } - /*else if (reversible == 0){*/ - return 0; -} - -/* */ -/* Get norm of wavelet transform. */ -/* */ -double dwt_getnorm(int orient, int level[3], int dwtid[3]) -{ - int levelx = level[0]; - int levely = level[1]; - int levelz = (level[2] < 0) ? 0 : level[2]; - double norm; - - if (flagnorm[levelx][levely][levelz][orient] == 1) { - norm = dwt_norm[levelx][levely][levelz][orient]; - /*fprintf(stdout,"[INFO] Level: %d %d %d Orient %d Dwt_norm: %f \n",level[0],level[1],level[2],orient,norm);*/ - } else { - opj_wtfilt_t *wtfiltx = (opj_wtfilt_t *) opj_malloc(sizeof(opj_wtfilt_t)); - opj_wtfilt_t *wtfilty = (opj_wtfilt_t *) opj_malloc(sizeof(opj_wtfilt_t)); - opj_wtfilt_t *wtfiltz = (opj_wtfilt_t *) opj_malloc(sizeof(opj_wtfilt_t)); - /*Fetch equivalent filters for each dimension*/ - dwt_getwtfilters(wtfiltx, dwtid[0]); - dwt_getwtfilters(wtfilty, dwtid[1]); - dwt_getwtfilters(wtfiltz, dwtid[2]); - /*Calculate the corresponding norm */ - norm = dwt_calc_wtnorms(orient, level, dwtid, wtfiltx, wtfilty, wtfiltz); - /*Save norm in array (no recalculation)*/ - dwt_norm[levelx][levely][levelz][orient] = norm; - flagnorm[levelx][levely][levelz][orient] = 1; - /*Free reserved space*/ - opj_free(wtfiltx->LPS); - opj_free(wtfilty->LPS); - opj_free(wtfiltz->LPS); - opj_free(wtfiltx->HPS); - opj_free(wtfilty->HPS); - opj_free(wtfiltz->HPS); - opj_free(wtfiltx); - opj_free(wtfilty); - opj_free(wtfiltz); - /*fprintf(stdout,"[INFO] Dwtid: %d %d %d Level: %d %d %d Orient %d Norm: %f \n",dwtid[0],dwtid[1],dwtid[2],level[0],level[1],level[2],orient,norm);*/ - } - return norm; -} -/* */ -/* Calculate explicit stepsizes for DWT. */ -/* */ -void dwt_calc_explicit_stepsizes(opj_tccp_t * tccp, int prec) -{ - int totnumbands, bandno, diff; - - assert(tccp->numresolution[0] >= tccp->numresolution[2]); - diff = tccp->numresolution[0] - - tccp->numresolution[2]; /*if RESx=RESy != RESz */ - totnumbands = (7 * tccp->numresolution[0] - 6) - 4 * diff; /* 3-D */ - - for (bandno = 0; bandno < totnumbands; bandno++) { - double stepsize; - int resno, level[3], orient, gain; - - /* Bandno: 0 - LLL 1 - LHL - 2 - HLL 3 - HHL - 4 - LLH 5 - LHH - 6 - HLH 7 - HHH */ - - resno = (bandno == 0) ? 0 : ((bandno <= 3 * diff) ? ((bandno - 1) / 3 + 1) : (( - bandno + 4 * diff - 1) / 7 + 1)); - orient = (bandno == 0) ? 0 : ((bandno <= 3 * diff) ? ((bandno - 1) % 3 + 1) : (( - bandno + 4 * diff - 1) % 7 + 1)); - level[0] = tccp->numresolution[0] - 1 - resno; - level[1] = tccp->numresolution[1] - 1 - resno; - level[2] = tccp->numresolution[2] - 1 - resno; - - /* Gain: 0 - LLL 1 - LHL - 1 - HLL 2 - HHL - 1 - LLH 2 - LHH - 2 - HLH 3 - HHH */ - gain = (tccp->reversible == 0) ? 0 : ((orient == 0) ? 0 : - (((orient == 1) || (orient == 2) || (orient == 4)) ? 1 : - (((orient == 3) || (orient == 5) || (orient == 6)) ? 2 : 3))); - - if (tccp->qntsty == J3D_CCP_QNTSTY_NOQNT) { - stepsize = 1.0; - } else { - double norm = dwt_getnorm(orient, level, - tccp->dwtid); /*Fetch norms if irreversible transform (by the moment only I9.7)*/ - stepsize = (1 << (gain + 1)) / norm; - } - /*fprintf(stdout,"[INFO] Bandno: %d Orient: %d Level: %d %d %d Stepsize: %f\n",bandno,orient,level[0],level[1],level[2],stepsize);*/ - dwt_encode_stepsize((int) floor(stepsize * 8192.0), prec + gain, - &tccp->stepsizes[bandno]); - } -} - - - diff --git a/src/lib/openjp3d/dwt.h b/src/lib/openjp3d/dwt.h deleted file mode 100644 index 0d3eca2a..00000000 --- a/src/lib/openjp3d/dwt.h +++ /dev/null @@ -1,106 +0,0 @@ -/* - * 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 - * Copyrigth (c) 2006, Mónica Díez, LPI-UVA, 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 __DWT_H -#define __DWT_H -/** -@file dwt.h -@brief Implementation of a discrete wavelet transform (DWT) - -The functions in DWT.C have for goal to realize forward and inverse discret wavelet -transform with filter 5-3 (reversible) and filter 9-7 (irreversible). The functions in -DWT.C are used by some function in TCD.C. -*/ - -/** @defgroup DWT DWT - Implementation of a discrete wavelet transform */ -/*@{*/ - -/** -DCCS-LIWT properties -*/ - - -typedef struct opj_wtfilt { - double *LPS; - int lenLPS; - double *HPS; - int lenHPS; -} opj_wtfilt_t; -/** @name Funciones generales */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Forward 5-3 wavelet transform in 3-D. -Apply a reversible DWT transform to a component of an volume. -@param tilec Tile component information (current tile) -@param dwtid Number of identification of wavelet kernel(s) used in DWT in each direction -*/ -void dwt_encode(opj_tcd_tilecomp_t * tilec, int dwtid[3]); -/** -Inverse 5-3 wavelet transform in 3-D. -Apply a reversible inverse DWT transform to a component of an volume. -@param tilec Tile component information (current tile) -@param stops Number of decoded resolution levels in each dimension -@param dwtid Number of identification of wavelet kernel(s) used in DWT in each dimension -*/ -void dwt_decode(opj_tcd_tilecomp_t * tilec, int stops[3], int dwtid[3]); -/* ----------------------------------------------------------------------- */ -/** -Get the gain of a subband for the reversible 3-D DWT. -@param orient Number that identifies the subband (0->LLL, 1->HLL, 2->LHL, 3->HHL, 4->LLH, 5->HLH, 6->LHH, 7->HHH) -@param reversible Wavelet transformation type -@return Returns 0 if orient = 0, returns 1 if orient = 1,2 or 4, returns 2 if orient = 3,5 or 6, returns 3 otherwise -*/ -int dwt_getgain(int orient, int reversible); -/** -Get the norm of a wavelet function of a subband at a specified level for the reversible 5-3 DWT or irreversible 9-7 in 3-D. -@param orient Band of the wavelet function -@param level Levels of the wavelet function in X,Y,Z axis -@param dwtid Wavelet transformation identifier -@return Returns the norm of the wavelet function -*/ -double dwt_getnorm(int orient, int level[3], int dwtid[3]); -/* ----------------------------------------------------------------------- */ -/** -Calcula el valor del escalón de cuantificación correspondiente a cada subbanda. -@param tccp Tile component coding parameters -@param prec Precision of data -*/ -void dwt_calc_explicit_stepsizes(opj_tccp_t * tccp, int prec); -/*@}*/ -/*@}*/ - -#endif /* __DWT_H */ diff --git a/src/lib/openjp3d/event.c b/src/lib/openjp3d/event.c deleted file mode 100644 index 7b6a7672..00000000 --- a/src/lib/openjp3d/event.c +++ /dev/null @@ -1,189 +0,0 @@ -/* - * 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) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include "opj_includes.h" - -/* ========================================================== -// Utility functions -// ==========================================================*/ - -#ifndef _WIN32 -static char* -i2a(unsigned i, char *a, unsigned r) -{ - if (i / r > 0) { - a = i2a(i / r, a, r); - } - *a = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[i % r]; - return a + 1; -} - -/** - Transforms integer i into an ascii string and stores the result in a; - string is encoded in the base indicated by r. - @param i Number to be converted - @param a String result - @param r Base of value; must be in the range 2 - 36 - @return Returns a -*/ -static char * -_itoa(int i, char *a, int r) -{ - r = ((r < 2) || (r > 36)) ? 10 : r; - if (i < 0) { - *a = '-'; - *i2a(-i, a + 1, r) = 0; - } else { - *i2a(i, a, r) = 0; - } - return a; -} - -#endif /* !_WIN32 */ - -/* ----------------------------------------------------------------------- */ - -opj_event_mgr_t* OPJ_CALLCONV opj_set_event_mgr(opj_common_ptr cinfo, - opj_event_mgr_t *event_mgr, void *context) -{ - if (cinfo) { - opj_event_mgr_t *previous = cinfo->event_mgr; - cinfo->event_mgr = event_mgr; - cinfo->client_data = context; - return previous; - } - - return NULL; -} - -bool opj_event_msg(opj_common_ptr cinfo, int event_type, const char *fmt, ...) -{ -#define MSG_SIZE 512 /* 512 bytes should be more than enough for a short message */ - opj_msg_callback msg_handler = NULL; - - opj_event_mgr_t *event_mgr = cinfo->event_mgr; - if (event_mgr != NULL) { - switch (event_type) { - case EVT_ERROR: - msg_handler = event_mgr->error_handler; - break; - case EVT_WARNING: - msg_handler = event_mgr->warning_handler; - break; - case EVT_INFO: - msg_handler = event_mgr->info_handler; - break; - default: - break; - } - if (msg_handler == NULL) { - return false; - } - } else { - return false; - } - - if ((fmt != NULL) && (event_mgr != NULL)) { - va_list arg; - int str_length, i, j; - char message[MSG_SIZE]; - memset(message, 0, MSG_SIZE); - /* initialize the optional parameter list */ - va_start(arg, fmt); - /* check the length of the format string */ - str_length = (strlen(fmt) > MSG_SIZE) ? MSG_SIZE : strlen(fmt); - /* parse the format string and put the result in 'message' */ - for (i = 0, j = 0; i < str_length; ++i) { - if (fmt[i] == '%') { - if (i + 1 < str_length) { - switch (tolower(fmt[i + 1])) { - case '%' : - message[j++] = '%'; - break; - case 'o' : { /* octal numbers */ - char tmp[16]; - _itoa(va_arg(arg, int), tmp, 8); - strcat(message, tmp); - j += strlen(tmp); - ++i; - break; - } - case 'i' : /* decimal numbers */ - case 'd' : { - char tmp[16]; - _itoa(va_arg(arg, int), tmp, 10); - strcat(message, tmp); - j += strlen(tmp); - ++i; - break; - } - case 'x' : { /* hexadecimal numbers */ - char tmp[16]; - _itoa(va_arg(arg, int), tmp, 16); - strcat(message, tmp); - j += strlen(tmp); - ++i; - break; - } - case 's' : { /* strings */ - char *tmp = va_arg(arg, char*); - strcat(message, tmp); - j += strlen(tmp); - ++i; - break; - } - case 'f' : { /* floats */ - char tmp[16]; - double value = va_arg(arg, double); - sprintf(tmp, "%f", value); - strcat(message, tmp); - j += strlen(tmp); - ++i; - break; - } - }; - } else { - message[j++] = fmt[i]; - } - } else { - message[j++] = fmt[i]; - }; - } - /* deinitialize the optional parameter list */ - va_end(arg); - - /* output the message to the user program */ - msg_handler(message, cinfo->client_data); - } - - return true; -} - diff --git a/src/lib/openjp3d/event.h b/src/lib/openjp3d/event.h deleted file mode 100644 index e7523585..00000000 --- a/src/lib/openjp3d/event.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * 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) 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 __EVENT_H -#define __EVENT_H -/** -@file event.h -@brief Implementation of a event callback system - -The functions in EVENT.C have for goal to send output messages (errors, warnings, debug) to the user. -*/ - -#define EVT_ERROR 1 /**< Error event type */ -#define EVT_WARNING 2 /**< Warning event type */ -#define EVT_INFO 4 /**< Debug event type */ - -/** @defgroup EVENT EVENT - Implementation of a event callback system */ -/*@{*/ - -/** @name Funciones generales (see also openjp3d.h) */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Write formatted data to a string and send the string to a user callback. -@param cinfo Codec context info -@param event_type Event type or callback to use to send the message -@param fmt Format-control string (plus optional arguments) -@return Returns true if successful, returns false otherwise -*/ -bool opj_event_msg(opj_common_ptr cinfo, int event_type, const char *fmt, ...); -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __EVENT_H */ diff --git a/src/lib/openjp3d/fix.h b/src/lib/openjp3d/fix.h deleted file mode 100644 index 416fd0fd..00000000 --- a/src/lib/openjp3d/fix.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * 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 - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ -#ifndef __FIX_H -#define __FIX_H - -#if defined(_MSC_VER) || defined(__BORLANDC__) -#define int64 __int64 -#else -#define int64 long long -#endif - -/** -@file fix.h -@brief Implementation of operations of specific multiplication (FIX) - -The functions in FIX.H have for goal to realize specific multiplication. -*/ - -/** @defgroup FIX FIX - Implementation of operations of specific multiplication */ -/*@{*/ - -/** -Multiply two fixed-precision rational numbers. -@param a -@param b -@return Returns a * b -*/ -static int fix_mul(int a, int b) -{ - int64 temp = (int64) a * (int64) b >> 12; - return (int)((temp >> 1) + (temp & 1)) ; -} - -/*@}*/ - -#endif /* __FIX_H */ diff --git a/src/lib/openjp3d/int.h b/src/lib/openjp3d/int.h deleted file mode 100644 index fb0480b6..00000000 --- a/src/lib/openjp3d/int.h +++ /dev/null @@ -1,138 +0,0 @@ -/* - * 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 - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ -#ifndef __INT_H -#define __INT_H -/** -@file int.h -@brief Implementation of operations on integers (INT) - -The functions in INT.H have for goal to realize operations on integers. -*/ - -/** @defgroup INT INT - Implementation of operations on integers */ -/*@{*/ - -/** @name Funciones generales (see also openjp3d.h) */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Get the minimum of two integers -@return Returns a if a < b else b -*/ -static int int_min(int a, int b) -{ - return a < b ? a : b; -} -/** -Get the maximum of two integers -@return Returns a if a > b else b -*/ -static int int_max(int a, int b) -{ - return (a > b) ? a : b; -} -/** -Clamp an integer inside an interval -@return -
    -
  • Returns a if (min < a < max) -
  • Returns max if (a > max) -
  • Returns min if (a < min) -
-*/ -static int int_clamp(int a, int min, int max) -{ - if (a < min) { - return min; - } - if (a > max) { - return max; - } - return a; -} -/** -@return Get absolute value of integer -*/ -static int int_abs(int a) -{ - return a < 0 ? -a : a; -} - -static double dbl_abs(double a) -{ - return a < 0 ? -a : a; -} -/** -Divide an integer and round upwards -@return Returns a divided by b -*/ -static int int_ceildiv(int a, int b) -{ - return (a + b - 1) / b; -} -/** -Divide an integer by a power of 2 and round upwards -@return Returns a divided by 2^b -*/ -static int int_ceildivpow2(int a, int b) -{ - return (a + (1 << b) - 1) >> b; -} -/** -Divide an integer by a power of 2 and round downwards -@return Returns a divided by 2^b -*/ -static int int_floordivpow2(int a, int b) -{ - return a >> b; -} -/** -Get logarithm of an integer and round downwards -@return Returns log2(a) -*/ -static int int_floorlog2(int a) -{ - int l; - for (l = 0; a > 1; l++) { - a >>= 1; - } - return l; -} -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif diff --git a/src/lib/openjp3d/jp3d.c b/src/lib/openjp3d/jp3d.c deleted file mode 100644 index 410bca53..00000000 --- a/src/lib/openjp3d/jp3d.c +++ /dev/null @@ -1,2559 +0,0 @@ -/* - * 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, Mónica Díez García, 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 "opj_includes.h" - -/** @defgroup J3D J3D - JPEG-2000 PART 10 codestream reader/writer */ -/*@{*/ - -/** @name Funciones locales */ -/*@{*/ - -/** -Write the SOC marker (Start Of Codestream) -@param j3d J3D handle -*/ -static void j3d_write_soc(opj_j3d_t *j3d); -/** -Read the SOC marker (Start of Codestream) -@param j3d J3D handle -*/ -static void j3d_read_soc(opj_j3d_t *j3d); -/** -Write the SIZ marker (2D volume and tile size) -@param j3d J3D handle -*/ -static void j3d_write_siz(opj_j3d_t *j3d); -/** -Read the SIZ marker (2D volume and tile size) -@param j3d J3D handle -*/ -static void j3d_read_siz(opj_j3d_t *j3d); -/** -Write the NSI marker (3rd volume and tile size) -@param j3d J3D handle -*/ -static void j3d_write_nsi(opj_j3d_t *j3d); -/** -Read the NSI marker (3rd volume and tile size) -@param j3d J3D handle -*/ -static void j3d_read_nsi(opj_j3d_t *j3d); -/** -Write the COM marker (comment) -@param j3d J3D handle -*/ -static void j3d_write_com(opj_j3d_t *j3d); -/** -Read the COM marker (comment) -@param j3d J3D handle -*/ -static void j3d_read_com(opj_j3d_t *j3d); -/** -Write the value concerning the specified component in the marker COD and COC -@param j3d J3D handle -@param compno Number of the component concerned by the information written -*/ -static void j3d_write_cox(opj_j3d_t *j3d, int compno); -/** -Read the value concerning the specified component in the marker COD and COC -@param j3d J3D handle -@param compno Number of the component concerned by the information read -*/ -static void j3d_read_cox(opj_j3d_t *j3d, int compno); -/** -Write the COD marker (coding style default) -@param j3d J3D handle -*/ -static void j3d_write_cod(opj_j3d_t *j3d); -/** -Read the COD marker (coding style default) -@param j3d J3D handle -*/ -static void j3d_read_cod(opj_j3d_t *j3d); -/** -Write the COC marker (coding style component) -@param j3d J3D handle -@param compno Number of the component concerned by the information written -*/ -static void j3d_write_coc(opj_j3d_t *j3d, int compno); -/** -Read the COC marker (coding style component) -@param j3d J3D handle -*/ -static void j3d_read_coc(opj_j3d_t *j3d); -/** -Write the value concerning the specified component in the marker QCD and QCC -@param j3d J3D handle -@param compno Number of the component concerned by the information written -*/ -static void j3d_write_qcx(opj_j3d_t *j3d, int compno); -/** -Read the value concerning the specified component in the marker QCD and QCC -@param j3d J3D handle -@param compno Number of the component concern by the information read -@param len Length of the information in the QCX part of the marker QCD/QCC -*/ -static void j3d_read_qcx(opj_j3d_t *j3d, int compno, int len); -/** -Write the QCD marker (quantization default) -@param j3d J3D handle -*/ -static void j3d_write_qcd(opj_j3d_t *j3d); -/** -Read the QCD marker (quantization default) -@param j3d J3D handle -*/ -static void j3d_read_qcd(opj_j3d_t *j3d); -/** -Write the QCC marker (quantization component) -@param j3d J3D handle -@param compno Number of the component concerned by the information written -*/ -static void j3d_write_qcc(opj_j3d_t *j3d, int compno); -/** -Read the QCC marker (quantization component) -@param j3d J3D handle -*/ -static void j3d_read_qcc(opj_j3d_t *j3d); -/** -Write the POC marker (progression order change) -@param j3d J3D handle -*/ -static void j3d_write_poc(opj_j3d_t *j3d); -/** -Read the POC marker (progression order change) -@param j3d J3D handle -*/ -static void j3d_read_poc(opj_j3d_t *j3d); -/** -Read the CRG marker (component registration) -@param j3d J3D handle -*/ -static void j3d_read_crg(opj_j3d_t *j3d); -/** -Read the TLM marker (tile-part lengths) -@param j3d J3D handle -*/ -static void j3d_read_tlm(opj_j3d_t *j3d); -/** -Read the PLM marker (packet length, main header) -@param j3d J3D handle -*/ -static void j3d_read_plm(opj_j3d_t *j3d); -/** -Read the PLT marker (packet length, tile-part header) -@param j3d J3D handle -*/ -static void j3d_read_plt(opj_j3d_t *j3d); -/** -Read the PPM marker (packet packet headers, main header) -@param j3d J3D handle -*/ -static void j3d_read_ppm(opj_j3d_t *j3d); -/** -Read the PPT marker (packet packet headers, tile-part header) -@param j3d J3D handle -*/ -static void j3d_read_ppt(opj_j3d_t *j3d); -/** -Write the SOT marker (start of tile-part) -@param j3d J3D handle -*/ -static void j3d_write_sot(opj_j3d_t *j3d); -/** -Read the SOT marker (start of tile-part) -@param j3d J3D handle -*/ -static void j3d_read_sot(opj_j3d_t *j3d); -/** -Write the SOD marker (start of data) -@param j3d J3D handle -@param tile_coder Pointer to a TCD handle -*/ -static void j3d_write_sod(opj_j3d_t *j3d, void *tile_coder); -/** -Read the SOD marker (start of data) -@param j3d J3D handle -*/ -static void j3d_read_sod(opj_j3d_t *j3d); -/** -Write the RGN marker (region-of-interest) -@param j3d J3D handle -@param compno Number of the component concerned by the information written -@param tileno Number of the tile concerned by the information written -*/ -static void j3d_write_rgn(opj_j3d_t *j3d, int compno, int tileno); -/** -Read the RGN marker (region-of-interest) -@param j3d J3D handle -*/ -static void j3d_read_rgn(opj_j3d_t *j3d); -/** -Write the EOC marker (end of codestream) -@param j3d J3D handle -*/ -static void j3d_write_eoc(opj_j3d_t *j3d); -/** -Read the EOC marker (end of codestream) -@param j3d J3D handle -*/ -static void j3d_read_eoc(opj_j3d_t *j3d); -/** -Read an unknown marker -@param j3d J3D handle -*/ -static void j3d_read_unk(opj_j3d_t *j3d); -/** -Write the CAP marker (extended capabilities) -@param j3d J3D handle -*/ -static void j3d_write_cap(opj_j3d_t *j3d); -/** -Read the CAP marker (extended capabilities) -@param j3d J3D handle -*/ -static void j3d_read_cap(opj_j3d_t *j3d); -/** -Write the DCO marker (Variable DC offset) -@param j3d J3D handle -*/ -static void j3d_write_dco(opj_j3d_t *j3d); -/** -Read the DCO marker (Variable DC offset) -@param j3d J3D handle -*/ -static void j3d_read_dco(opj_j3d_t *j3d); -/** -Write the ATK marker (arbitrary transformation kernel) -@param j3d J3D handle -*/ -static void j3d_write_atk(opj_j3d_t *j3d); -/** -Read the ATK marker (arbitrary transformation kernel) -@param j3d J3D handle -*/ -static void j3d_read_atk(opj_j3d_t *j3d); -/** -Write the CBD marker (component bit depth definition) -@param j3d J3D handle -*/ -static void j3d_write_cbd(opj_j3d_t *j3d); -/** -Read the CBD marker (component bit depth definition) -@param j3d J3D handle -*/ -static void j3d_read_cbd(opj_j3d_t *j3d); -/** -Write the MCT marker (multiple component transfomation definition) -@param j3d J3D handle -*/ -static void j3d_write_mct(opj_j3d_t *j3d); -/** -Read the MCT marker (multiple component transfomation definition) -@param j3d J3D handle -*/ -static void j3d_read_mct(opj_j3d_t *j3d); -/** -Write the MCC marker (multiple component transfomation collection) -@param j3d J3D handle -*/ -static void j3d_write_mcc(opj_j3d_t *j3d); -/** -Read the MCC marker (multiple component transfomation collection) -@param j3d J3D handle -*/ -static void j3d_read_mcc(opj_j3d_t *j3d); -/** -Write the MCO marker (multiple component transfomation ordering) -@param j3d J3D handle -*/ -static void j3d_write_mco(opj_j3d_t *j3d); -/** -Read the MCO marker (multiple component transfomation ordering) -@param j3d J3D handle -*/ -static void j3d_read_mco(opj_j3d_t *j3d); -/** -Write the NLT marker (non-linearity point transformation) -@param j3d J3D handle -*/ -static void j3d_write_nlt(opj_j3d_t *j3d); -/** -Read the NLT marker (non-linearity point transformation) -@param j3d J3D handle -*/ -static void j3d_read_nlt(opj_j3d_t *j3d); -/*@}*/ - -/* ----------------------------------------------------------------------- */ - -static void j3d_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"); -} - -static void j3d_dump_cp(FILE *fd, opj_volume_t * vol, opj_cp_t * cp) -{ - int tileno, compno, layno, bandno, resno, numbands; - fprintf(fd, "coding parameters {\n"); - fprintf(fd, " tx0=%d, ty0=%d, tz0=%d\n", cp->tx0, cp->ty0, cp->tz0); - fprintf(fd, " tdx=%d, tdy=%d, tdz=%d\n", cp->tdx, cp->tdy, cp->tdz); - fprintf(fd, " tw=%d, th=%d, tl=%d\n", cp->tw, cp->th, cp->tl); - fprintf(fd, " transform format: %d\n", cp->transform_format); - fprintf(fd, " encoding format: %d\n", cp->encoding_format); - for (tileno = 0; tileno < cp->tw * cp->th * cp->tl; tileno++) { - opj_tcp_t *tcp = &cp->tcps[tileno]; - fprintf(fd, " tile %d {\n", tileno); - fprintf(fd, " csty=%x\n", tcp->csty); - fprintf(fd, " prg=%d\n", tcp->prg); - fprintf(fd, " numlayers=%d\n", tcp->numlayers); - fprintf(fd, " mct=%d\n", tcp->mct); - fprintf(fd, " rates="); - for (layno = 0; layno < tcp->numlayers; layno++) { - fprintf(fd, "%f ", tcp->rates[layno]); - } - fprintf(fd, "\n"); - fprintf(fd, " first=%d\n", tcp->first); - for (compno = 0; compno < vol->numcomps; compno++) { - opj_tccp_t *tccp = &tcp->tccps[compno]; - fprintf(fd, " comp %d {\n", compno); - fprintf(fd, " csty=%x\n", tccp->csty); - fprintf(fd, " numresx=%d, numresy=%d, numresz=%d\n", - tccp->numresolution[0], tccp->numresolution[1], tccp->numresolution[2]); - fprintf(fd, " cblkw=%d, cblkh=%d, cblkl=%d\n", tccp->cblk[0], - tccp->cblk[1], tccp->cblk[2]); - fprintf(fd, " cblksty=%x\n", tccp->cblksty); - fprintf(fd, " qntsty=%d\n", tccp->qntsty); - fprintf(fd, " numgbits=%d\n", tccp->numgbits); - fprintf(fd, " roishift=%d\n", tccp->roishift); - fprintf(fd, " reversible=%d\n", tccp->reversible); - fprintf(fd, " dwtidx=%d dwtidy=%d dwtidz=%d\n", tccp->dwtid[0], - tccp->dwtid[1], tccp->dwtid[2]); - if (tccp->atk != NULL) { - fprintf(fd, " atk.index=%d\n", tccp->atk->index); - fprintf(fd, " atk.coeff_typ=%d\n", tccp->atk->coeff_typ); - fprintf(fd, " atk.filt_cat=%d\n", tccp->atk->filt_cat); - fprintf(fd, " atk.exten=%d\n", tccp->atk->exten); - fprintf(fd, " atk.minit=%d\n", tccp->atk->minit); - fprintf(fd, " atk.wt_typ=%d\n", tccp->atk->wt_typ); - } - fprintf(fd, " stepsizes of bands="); - numbands = (tccp->qntsty == J3D_CCP_QNTSTY_SIQNT) ? 1 : - ((cp->transform_format == TRF_2D_DWT) ? (tccp->numresolution[0] * 3 - 2) : - (tccp->numresolution[0] * 7 - 6) - 4 * (tccp->numresolution[0] - - tccp->numresolution[2])); - for (bandno = 0; bandno < numbands; bandno++) { - fprintf(fd, "(%d,%d) ", tccp->stepsizes[bandno].mant, - tccp->stepsizes[bandno].expn); - } - fprintf(fd, "\n"); - - if (tccp->csty & J3D_CCP_CSTY_PRT) { - fprintf(fd, " prcw="); - for (resno = 0; resno < tccp->numresolution[0]; resno++) { - fprintf(fd, "%d ", tccp->prctsiz[0][resno]); - } - fprintf(fd, "\n"); - fprintf(fd, " prch="); - for (resno = 0; resno < tccp->numresolution[0]; resno++) { - fprintf(fd, "%d ", tccp->prctsiz[1][resno]); - } - fprintf(fd, "\n"); - fprintf(fd, " prcl="); - for (resno = 0; resno < tccp->numresolution[0]; resno++) { - fprintf(fd, "%d ", tccp->prctsiz[2][resno]); - } - fprintf(fd, "\n"); - } - fprintf(fd, " }\n"); - } - fprintf(fd, " }\n"); - } - fprintf(fd, "}\n"); -} - -/* ----------------------------------------------------------------------- -Extended capabilities -------------------------------------------------------------------------*/ - -static void j3d_write_cap(opj_j3d_t *j3d) -{ - int len, lenp; - - opj_cio_t *cio = j3d->cio; - cio_write(cio, J3D_MS_CAP, 2); /* CAP */ - lenp = cio_tell(cio); - cio_skip(cio, 2); - cio_write(cio, J3D_CAP_10, 4); - if (J3D_CAP_10) { - cio_write(cio, 0x0, 2); - } - len = cio_tell(cio) - lenp; - cio_seek(cio, lenp); - cio_write(cio, len, 2); /* Lsiz */ - cio_seek(cio, lenp + len); - -} -static void j3d_read_cap(opj_j3d_t *j3d) -{ - int len, Cap; - opj_cio_t *cio = j3d->cio; - /*cio_read(cio, 2); CAP */ - len = cio_read(cio, 2); - Cap = cio_read(cio, 4); - if (Cap) { - cio_read(cio, 2); - } - assert(len == 2 + 4 + 2); -} -static void j3d_write_nsi(opj_j3d_t *j3d) -{ - int i; - int lenp, len; - int ndim = 3; - - opj_cio_t *cio = j3d->cio; - opj_volume_t *volume = j3d->volume; - opj_cp_t *cp = j3d->cp; - - cio_write(cio, J3D_MS_NSI, 2); /* NSI */ - lenp = cio_tell(cio); - cio_skip(cio, 2); - cio_write(cio, ndim, 1); /* Ndim */ - cio_write(cio, volume->z1, 4); /* Zsiz */ - cio_write(cio, volume->z0, 4); /* Z0siz */ - cio_write(cio, cp->tdz, 4); /* ZTsiz */ - cio_write(cio, cp->tz0, 4); /* ZT0siz */ - for (i = 0; i < volume->numcomps; i++) { - cio_write(cio, volume->comps[i].dz, 1); /* ZRsiz_i */ - } - len = cio_tell(cio) - lenp; - cio_seek(cio, lenp); - cio_write(cio, len, 2); /* Lsiz */ - cio_seek(cio, lenp + len); -} - -static void j3d_read_nsi(opj_j3d_t *j3d) -{ - int ndim; - int len, i; - - opj_cio_t *cio = j3d->cio; - opj_volume_t *volume = j3d->volume; - opj_cp_t *cp = j3d->cp; - - len = cio_read(cio, 2); /* Lnsi */ - ndim = cio_read(cio, 1); /* Ndim */ - assert(ndim == 3); - volume->z1 = cio_read(cio, 4); /* Zsiz */ - volume->z0 = cio_read(cio, 4); /* Z0siz */ - cp->tdz = cio_read(cio, 4); /* ZTsiz */ - cp->tz0 = cio_read(cio, 4); /* ZT0siz */ - for (i = 0; i < volume->numcomps; i++) { - volume->comps[i].dz = cio_read(cio, 1); /* ZRsiz_i */ - } - - /*Initialization of volume*/ - cp->tw = int_ceildiv(volume->x1 - cp->tx0, cp->tdx); - cp->th = int_ceildiv(volume->y1 - cp->ty0, cp->tdy); - cp->tl = int_ceildiv(volume->z1 - cp->tz0, cp->tdz); - cp->tcps = (opj_tcp_t *) opj_malloc(cp->tw * cp->th * cp->tl * sizeof( - opj_tcp_t)); - cp->tileno = (int *) opj_malloc(cp->tw * cp->th * cp->tl * sizeof(int)); - cp->tileno_size = 0; - - for (i = 0; i < cp->tw * cp->th * cp->tl ; i++) { - cp->tcps[i].POC = 0; - cp->tcps[i].numpocs = 0; - cp->tcps[i].first = 1; - } - - /* Initialization for PPM marker (Packets header)*/ - cp->ppm = 0; - cp->ppm_data = NULL; - cp->ppm_data_first = NULL; - cp->ppm_previous = 0; - cp->ppm_store = 0; - - j3d->default_tcp->tccps = (opj_tccp_t *) opj_malloc(sizeof( - opj_tccp_t) * volume->numcomps); - for (i = 0; i < cp->tw * cp->th * cp->tl ; i++) { - cp->tcps[i].tccps = (opj_tccp_t *) opj_malloc(sizeof(opj_tccp_t) * - volume->numcomps); - } - j3d->tile_data = (unsigned char **) opj_malloc(cp->tw * cp->th * cp->tl * - sizeof(unsigned char *)); - j3d->tile_len = (int *) opj_malloc(cp->tw * cp->th * cp->tl * sizeof(int)); - j3d->state = J3D_STATE_MH; - -} -static void j3d_write_dco(opj_j3d_t *j3d) -{ - int lenp, len, i; - int dcotype; - - opj_cio_t *cio = j3d->cio; - opj_volume_t *volume = j3d->volume; - opj_cp_t *cp = j3d->cp; - - dcotype = 1; /* Offsets are 16bit signed integers Table A21 15444-2 */ - cio_write(cio, J3D_MS_DCO, 2); /* DCO */ - lenp = cio_tell(cio); - cio_skip(cio, 2); - cio_write(cio, dcotype, 1); - if (dcotype == 0) { - for (i = 0; i < volume->numcomps; i++) { - cio_write(cio, volume->comps[i].dcoffset, 1); /* SPdco_i */ - } - } else if (dcotype == 1) { - for (i = 0; i < volume->numcomps; i++) { - cio_write(cio, volume->comps[i].dcoffset, 1); /* SPdco_i */ - opj_event_msg(j3d->cinfo, EVT_INFO, "dcotype %d DCO %d \n", dcotype, - volume->comps[i].dcoffset); - } - } - len = cio_tell(cio) - lenp; - cio_seek(cio, lenp); - cio_write(cio, len, 2); /* Ldco */ - cio_seek(cio, lenp + len); - -} -static void j3d_read_dco(opj_j3d_t *j3d) -{ - int len, i; - int dcotype; - - opj_cio_t *cio = j3d->cio; - opj_volume_t *volume = j3d->volume; - opj_cp_t *cp = j3d->cp; - - len = cio_read(cio, 2); /* Lsiz */ - dcotype = cio_read(cio, 1); /*offset 8bit unsigned / 16bit signed integers*/ - if (dcotype == 0) { - for (i = 0; i < volume->numcomps; i++) { - volume->comps[i].dcoffset = cio_read(cio, 1); - if (volume->comps[i].dcoffset > 128) { - volume->comps[i].dcoffset = volume->comps[i].dcoffset - 256; - } - } - } else if (dcotype == 1) { - for (i = 0; i < volume->numcomps; i++) { - volume->comps[i].dcoffset = cio_read(cio, 1); - if (volume->comps[i].dcoffset > 128) { - volume->comps[i].dcoffset = volume->comps[i].dcoffset - 256; - } - } - } - -} -static void j3d_write_atk(opj_j3d_t *j3d) -{ - int lenp, len, s, k; - - opj_cio_t *cio = j3d->cio; - opj_volume_t *volume = j3d->volume; - opj_atk_t *atk = j3d->cp->tcps->tccps->atk; - - cio_write(cio, J3D_MS_ATK, 2); /* ATK */ - lenp = cio_tell(cio); - cio_skip(cio, 2); - cio_write(cio, atk->index + (atk->coeff_typ << 8) + (atk->filt_cat << 11) - + (atk->wt_typ << 12) + (atk->minit << 13) + (atk->exten << 14), - 2); /* Satk */ - if (atk->wt_typ == J3D_ATK_IRR) { - cio_write(cio, (unsigned int)(atk->Katk * 8192.0), 1 << atk->coeff_typ); - } - cio_write(cio, atk->Natk, 1); - for (s = 0; s < atk->Natk; s++) { - if (atk->filt_cat == J3D_ATK_ARB) { - cio_write(cio, atk->Oatk[s], 1); - } - if (atk->wt_typ == J3D_ATK_REV) { - cio_write(cio, atk->Eatk[s], 1); - cio_write(cio, atk->Batk[s], 1); - } - cio_write(cio, atk->LCatk[s], 1); - for (k = 0; k < atk->LCatk[s]; k++) { - cio_write(cio, (unsigned int)(atk->Aatk[s][k] * 8192.0), 1 << atk->coeff_typ); - } - } - len = cio_tell(cio) - lenp; - cio_seek(cio, lenp); - cio_write(cio, len, 2); /* Latk */ - cio_seek(cio, lenp + len); -} -static void j3d_read_atk(opj_j3d_t *j3d) -{ - int len, i, Satk, k; - - opj_cio_t *cio = j3d->cio; - opj_volume_t *volume = j3d->volume; - opj_cp_t *cp = j3d->cp; - opj_atk_t *atk = cp->tcps->tccps->atk; - - len = cio_read(cio, 2); /* Latk */ - Satk = cio_read(cio, 2); - atk->index = Satk & 0x00ff; - atk->coeff_typ = Satk >> 8 & 0x0007; - atk->filt_cat = Satk >> 11 & 0x0001; - atk->wt_typ = Satk >> 12 & 0x0001; - atk->minit = Satk >> 13 & 0x0001; - atk->exten = Satk >> 14 & 0x0001; - if (atk->wt_typ == J3D_ATK_IRR) { - atk->Katk = ((double) cio_read(cio, 1 << atk->coeff_typ) / 8192.0); - } - atk->Natk = cio_read(cio, 1); - for (i = 0; i < atk->Natk; i++) { - if (atk->filt_cat == J3D_ATK_ARB) { - atk->Oatk[i] = cio_read(cio, 1); - } - if (atk->wt_typ == J3D_ATK_REV) { - atk->Eatk[i] = cio_read(cio, 1); - atk->Batk[i] = cio_read(cio, 1); - } - atk->LCatk[i] = cio_read(cio, 1); - for (k = 0; k < atk->LCatk[i]; k++) { - atk->Aatk[i][k] = ((double) cio_read(cio, 1 << atk->coeff_typ) / 8192.0); - } - } -} -static void j3d_write_cbd(opj_j3d_t *j3d) -{ -} -static void j3d_read_cbd(opj_j3d_t *j3d) -{ -} -static void j3d_write_mct(opj_j3d_t *j3d) -{ -} -static void j3d_read_mct(opj_j3d_t *j3d) -{ -} -static void j3d_write_mcc(opj_j3d_t *j3d) -{ -} -static void j3d_read_mcc(opj_j3d_t *j3d) -{ -} -static void j3d_write_mco(opj_j3d_t *j3d) -{ -} -static void j3d_read_mco(opj_j3d_t *j3d) -{ -} -static void j3d_write_nlt(opj_j3d_t *j3d) -{ -} -static void j3d_read_nlt(opj_j3d_t *j3d) -{ -} -/* ----------------------------------------------------------------------- -15444-1 codestream syntax -------------------------------------------------------------------------*/ -static void j3d_write_soc(opj_j3d_t *j3d) -{ - opj_cio_t *cio = j3d->cio; - cio_write(cio, J3D_MS_SOC, 2); -} - -static void j3d_read_soc(opj_j3d_t *j3d) -{ - j3d->state = J3D_STATE_MHSIZ; -} - -static void j3d_write_siz(opj_j3d_t *j3d) -{ - int i; - int lenp, len; - int Rsiz; - - opj_cio_t *cio = j3d->cio; - opj_volume_t *volume = j3d->volume; - opj_cp_t *cp = j3d->cp; - - cio_write(cio, J3D_MS_SIZ, 2); /* SIZ */ - lenp = cio_tell(cio); - cio_skip(cio, 2); - /*cio_write(cio, 0, 2);*/ /* Rsiz (capabilities of 15444-1 only) */ - Rsiz = J3D_RSIZ_DCO | - J3D_RSIZ_ATK; /** | J3D_RSIZ_MCT | J3D_RSIZ_NONLT (not implemented yet)*/ - cio_write(cio, Rsiz, 2); /* capabilities of WDv5.2*/ - cio_write(cio, volume->x1, 4); /* Xsiz */ - cio_write(cio, volume->y1, 4); /* Ysiz */ - cio_write(cio, volume->x0, 4); /* X0siz */ - cio_write(cio, volume->y0, 4); /* Y0siz */ - cio_write(cio, cp->tdx, 4); /* XTsiz */ - cio_write(cio, cp->tdy, 4); /* YTsiz */ - cio_write(cio, cp->tx0, 4); /* XT0siz */ - cio_write(cio, cp->ty0, 4); /* YT0siz */ - cio_write(cio, volume->numcomps, 2); /* Csiz */ - for (i = 0; i < volume->numcomps; i++) { - cio_write(cio, volume->comps[i].prec - 1 + (volume->comps[i].sgnd << 7), - 1); /* Ssiz_i */ - cio_write(cio, volume->comps[i].dx, 1); /* XRsiz_i */ - cio_write(cio, volume->comps[i].dy, 1); /* YRsiz_i */ - } - len = cio_tell(cio) - lenp; - cio_seek(cio, lenp); - cio_write(cio, len, 2); /* Lsiz */ - cio_seek(cio, lenp + len); -} - -static void j3d_read_siz(opj_j3d_t *j3d) -{ - int len, i; - - opj_cio_t *cio = j3d->cio; - opj_volume_t *volume = j3d->volume; - opj_cp_t *cp = j3d->cp; - - len = cio_read(cio, 2); /* Lsiz */ - cp->rsiz = cio_read(cio, 2); /* Rsiz (capabilities) */ - volume->x1 = cio_read(cio, 4); /* Xsiz */ - volume->y1 = cio_read(cio, 4); /* Ysiz */ - volume->x0 = cio_read(cio, 4); /* X0siz */ - volume->y0 = cio_read(cio, 4); /* Y0siz */ - cp->tdx = cio_read(cio, 4); /* XTsiz */ - cp->tdy = cio_read(cio, 4); /* YTsiz */ - cp->tx0 = cio_read(cio, 4); /* XT0siz */ - cp->ty0 = cio_read(cio, 4); /* YT0siz */ - - volume->numcomps = cio_read(cio, 2); /* Csiz */ - volume->comps = (opj_volume_comp_t *) opj_malloc(volume->numcomps * sizeof( - opj_volume_comp_t)); - for (i = 0; i < volume->numcomps; i++) { - int tmp, j; - tmp = cio_read(cio, 1); /* Ssiz_i */ - volume->comps[i].prec = (tmp & 0x7f) + 1; - volume->comps[i].sgnd = tmp >> 7; - volume->comps[i].dx = cio_read(cio, 1); /* XRsiz_i */ - volume->comps[i].dy = cio_read(cio, 1); /* YRsiz_i */ - for (j = 0; j < 3; j++) { - volume->comps[i].resno_decoded[j] = 0; /* number of resolution decoded */ - volume->comps[i].factor[j] = 0; /* reducing factor per component */ - } - } - - if (j3d->cinfo->codec_format == CODEC_J2K) { - volume->z1 = 1; - volume->z0 = 0; - volume->numslices = 1; - cp->tdz = 1; - cp->tz0 = 0; - for (i = 0; i < volume->numcomps; i++) { - volume->comps[i].dz = 1; - } - - /*Initialization of volume*/ - cp->tw = int_ceildiv(volume->x1 - cp->tx0, cp->tdx); - cp->th = int_ceildiv(volume->y1 - cp->ty0, cp->tdy); - cp->tl = int_ceildiv(volume->z1 - cp->tz0, cp->tdz); - cp->tcps = (opj_tcp_t *) opj_malloc(cp->tw * cp->th * cp->tl * sizeof( - opj_tcp_t)); - cp->tileno = (int *) opj_malloc(cp->tw * cp->th * cp->tl * sizeof(int)); - cp->tileno_size = 0; - - for (i = 0; i < cp->tw * cp->th * cp->tl ; i++) { - cp->tcps[i].POC = 0; - cp->tcps[i].numpocs = 0; - cp->tcps[i].first = 1; - } - - /* Initialization for PPM marker (Packets header)*/ - cp->ppm = 0; - cp->ppm_data = NULL; - cp->ppm_data_first = NULL; - cp->ppm_previous = 0; - cp->ppm_store = 0; - - j3d->default_tcp->tccps = (opj_tccp_t *) opj_malloc(sizeof( - opj_tccp_t) * volume->numcomps); - for (i = 0; i < cp->tw * cp->th * cp->tl ; i++) { - cp->tcps[i].tccps = (opj_tccp_t *) opj_malloc(sizeof(opj_tccp_t) * - volume->numcomps); - } - j3d->tile_data = (unsigned char **) opj_malloc(cp->tw * cp->th * cp->tl * - sizeof(unsigned char *)); - j3d->tile_len = (int *) opj_malloc(cp->tw * cp->th * cp->tl * sizeof(int)); - j3d->state = J3D_STATE_MH; - } -} - - - -static void j3d_write_com(opj_j3d_t *j3d) -{ - unsigned int i; - int lenp, len; - - opj_cio_t *cio = j3d->cio; - - cio_write(cio, J3D_MS_COM, 2); - lenp = cio_tell(cio); - cio_skip(cio, 2); - cio_write(cio, 1, 2); - /*opj_event_msg(j3d->cinfo, EVT_INFO, "TRF %D ENCOD %d\n",j3d->cp->transform_format,j3d->cp->encoding_format);*/ - if (j3d->cp->comment != NULL) { - char *comment = j3d->cp->comment; - for (i = 0; i < strlen(comment); i++) { - cio_write(cio, comment[i], 1); - } - } - len = cio_tell(cio) - lenp; - cio_seek(cio, lenp); - cio_write(cio, len, 2); - cio_seek(cio, lenp + len); -} - -static void j3d_read_com(opj_j3d_t *j3d) -{ - int len; - opj_cio_t *cio = j3d->cio; - - len = cio_read(cio, 2); - cio_read(cio, 2); // read registration - - /*opj_event_msg(j3d->cinfo, EVT_INFO, "TRF %D ENCOD %d\n",j3d->cp->transform_format,j3d->cp->encoding_format);*/ - - cio_skip(cio, len - 4); /*possible comments*/ -} - -static void j3d_write_cox(opj_j3d_t *j3d, int compno) -{ - int i; - int shift = 2; - - opj_cp_t *cp = j3d->cp; - opj_tcp_t *tcp = &cp->tcps[j3d->curtileno]; - opj_tccp_t *tccp = &tcp->tccps[compno]; - opj_cio_t *cio = j3d->cio; - - cio_write(cio, tccp->numresolution[0] - 1, - 1); /* SPcox (D) No of decomposition levels in x-axis*/ - if (j3d->cinfo->codec_format == CODEC_J3D) { - cio_write(cio, tccp->numresolution[1] - 1, - 1); /* SPcox (E) No of decomposition levels in y-axis*/ - cio_write(cio, tccp->numresolution[2] - 1, - 1); /* SPcox (F) No of decomposition levels in z-axis*/ - } - if (j3d->cinfo->codec_format == CODEC_J3D) { - /* Table A.7 */ - shift = 0; - } - /* (cblkw - 2) + (cblkh - 2) + (cblkl - 2) <= 18*/ - cio_write(cio, tccp->cblk[0] - shift, - 1); /* SPcox (G) Cblk width entre 10 y 2 (8 y 0)*/ - cio_write(cio, tccp->cblk[1] - shift, - 1); /* SPcox (H) Cblk height*/ - if (j3d->cinfo->codec_format == CODEC_J3D) { - cio_write(cio, tccp->cblk[2] - shift, 1); /* SPcox (I) Cblk depth*/ - } - cio_write(cio, tccp->cblksty, 1); /* SPcox (J) Cblk style*/ - cio_write(cio, tccp->dwtid[0], - 1); /* SPcox (K) WT in x-axis 15444-2 Table A10*/ - if (j3d->cinfo->codec_format == CODEC_J3D) { - cio_write(cio, tccp->dwtid[1], - 1); /* SPcox (L) WT in y-axis 15444-2 Table A10*/ - cio_write(cio, tccp->dwtid[2], - 1); /* SPcox (M) WT in z-axis 15444-2 Table A10*/ - } - - if (tccp->csty & J3D_CCP_CSTY_PRT) { - for (i = 0; i < tccp->numresolution[0]; i++) { - if (i < tccp->numresolution[2]) { - cio_write(cio, tccp->prctsiz[0][i] + (tccp->prctsiz[1][i] << 4) + - (tccp->prctsiz[2][i] << 8), 2); /* SPcox (N_i) Table A9*/ - } else if (j3d->cinfo->codec_format == CODEC_J3D) { - cio_write(cio, tccp->prctsiz[0][i] + (tccp->prctsiz[1][i] << 4), - 2); /* SPcox (N_i) Table A9*/ - } else { - cio_write(cio, tccp->prctsiz[0][i] + (tccp->prctsiz[1][i] << 4), 1); - } /* SPcox (N_i) Table A9*/ - } - } -} - -static void j3d_read_cox(opj_j3d_t *j3d, int compno) -{ - int i; - int shift = 2; - - opj_cp_t *cp = j3d->cp; - opj_tcp_t *tcp = j3d->state == J3D_STATE_TPH ? &cp->tcps[j3d->curtileno] : - j3d->default_tcp; - opj_tccp_t *tccp = &tcp->tccps[compno]; - opj_cio_t *cio = j3d->cio; - - tccp->numresolution[0] = cio_read(cio, - 1) + 1; /* SPcox (D) No of decomposition levels in x-axis*/ - if (j3d->cinfo->codec_format == CODEC_J3D) { - tccp->numresolution[1] = cio_read(cio, - 1) + 1; /* SPcox (E) No of decomposition levels in y-axis*/ - tccp->numresolution[2] = cio_read(cio, - 1) + 1; /* SPcox (F) No of decomposition levels in z-axis*/ - } else if (j3d->cinfo->codec_format == CODEC_J2K) { - tccp->numresolution[1] = tccp->numresolution[0]; - tccp->numresolution[2] = 1; - } - /* check the reduce value */ - cp->reduce[0] = int_min((tccp->numresolution[0]) - 1, cp->reduce[0]); - cp->reduce[1] = int_min((tccp->numresolution[1]) - 1, cp->reduce[1]); - cp->reduce[2] = int_min((tccp->numresolution[2]) - 1, cp->reduce[2]); - - if (j3d->cinfo->codec_format == CODEC_J3D) { - /* Table A.7 */ - shift = 0; - } - tccp->cblk[0] = cio_read(cio, 1) + shift; /* SPcox (G) */ - tccp->cblk[1] = cio_read(cio, 1) + shift; /* SPcox (H) */ - if (j3d->cinfo->codec_format == CODEC_J3D) { - tccp->cblk[2] = cio_read(cio, 1) + shift; /* SPcox (I) */ - } else { - tccp->cblk[2] = tccp->cblk[0]; - } - - tccp->cblksty = cio_read(cio, 1); /* SPcox (J) */ - tccp->dwtid[0] = cio_read(cio, 1); /* SPcox (K) */ - if (j3d->cinfo->codec_format == CODEC_J3D) { - tccp->dwtid[1] = cio_read(cio, 1); /* SPcox (L) */ - tccp->dwtid[2] = cio_read(cio, 1); /* SPcox (M) */ - } else { - tccp->dwtid[1] = tccp->dwtid[0]; /* SPcox (L) */ - tccp->dwtid[2] = tccp->dwtid[0]; /* SPcox (M) */ - } - tccp->reversible = (tccp->dwtid[0] >= 1 && tccp->dwtid[1] >= 1 && - tccp->dwtid[2] >= 1); /*TODO: only valid for irreversible 9x7 WTs*/ - if (tccp->csty & J3D_CP_CSTY_PRT) { - for (i = 0; i < tccp->numresolution[0]; i++) { - int tmp = cio_read(cio, 2); /* SPcox (N_i) */ - tccp->prctsiz[0][i] = tmp & 0xf; - tccp->prctsiz[1][i] = tmp >> 4; - tccp->prctsiz[2][i] = tmp >> 8; - } - } -} - -static void j3d_write_cod(opj_j3d_t *j3d) -{ - opj_cp_t *cp = NULL; - opj_tcp_t *tcp = NULL; - int lenp, len; - - opj_cio_t *cio = j3d->cio; - - cio_write(cio, J3D_MS_COD, 2); /* COD */ - - lenp = cio_tell(cio); - cio_skip(cio, 2); - - cp = j3d->cp; - tcp = &cp->tcps[j3d->curtileno]; - - /* Scod : Table A-4*/ - cio_write(cio, tcp->csty, 1); /* Scod : Coding style parameters */ - /* SGcod : Table A-5*/ - cio_write(cio, tcp->prg, 1); /* SGcod (A) : Progression order */ - cio_write(cio, tcp->numlayers, 2); /* SGcod (B) : No of layers */ - cio_write(cio, tcp->mct, - 1); /* SGcod (C) : Multiple component transformation usage */ - /* SPcod : Table A-6*/ - j3d_write_cox(j3d, 0); - len = cio_tell(cio) - lenp; - cio_seek(cio, lenp); - cio_write(cio, len, 2); /* Lcod */ - cio_seek(cio, lenp + len); -} - -static void j3d_read_cod(opj_j3d_t *j3d) -{ - int len, i, pos; - - opj_cio_t *cio = j3d->cio; - opj_cp_t *cp = j3d->cp; - opj_tcp_t *tcp = j3d->state == J3D_STATE_TPH ? &cp->tcps[j3d->curtileno] : - j3d->default_tcp; - opj_volume_t *volume = j3d->volume; - - /* Lcod */ - len = cio_read(cio, 2); - /* Scod : Table A-4*/ - tcp->csty = cio_read(cio, 1); - /* SGcod : Table A-5*/ - tcp->prg = (OPJ_PROG_ORDER)cio_read(cio, 1); - tcp->numlayers = cio_read(cio, 2); - tcp->mct = cio_read(cio, 1); - - pos = cio_tell(cio); - for (i = 0; i < volume->numcomps; i++) { - tcp->tccps[i].csty = tcp->csty & J3D_CP_CSTY_PRT; - cio_seek(cio, pos); - j3d_read_cox(j3d, i); - } -} - -static void j3d_write_coc(opj_j3d_t *j3d, int compno) -{ - int lenp, len; - - opj_cp_t *cp = j3d->cp; - opj_tcp_t *tcp = &cp->tcps[j3d->curtileno]; - opj_volume_t *volume = j3d->volume; - opj_cio_t *cio = j3d->cio; - - cio_write(cio, J3D_MS_COC, 2); /* COC */ - lenp = cio_tell(cio); - cio_skip(cio, 2); - cio_write(cio, compno, volume->numcomps <= 256 ? 1 : 2); /* Ccoc */ - cio_write(cio, tcp->tccps[compno].csty, 1); /* Scoc */ - - j3d_write_cox(j3d, compno); - - len = cio_tell(cio) - lenp; - cio_seek(cio, lenp); - cio_write(cio, len, 2); /* Lcoc */ - cio_seek(cio, lenp + len); -} - -static void j3d_read_coc(opj_j3d_t *j3d) -{ - int len, compno; - - opj_cp_t *cp = j3d->cp; - opj_tcp_t *tcp = j3d->state == J3D_STATE_TPH ? &cp->tcps[j3d->curtileno] : - j3d->default_tcp; - opj_volume_t *volume = j3d->volume; - opj_cio_t *cio = j3d->cio; - - len = cio_read(cio, 2); /* Lcoc */ - compno = cio_read(cio, volume->numcomps <= 256 ? 1 : 2); /* Ccoc */ - tcp->tccps[compno].csty = cio_read(cio, 1); /* Scoc */ - j3d_read_cox(j3d, compno); -} - -static void j3d_write_qcx(opj_j3d_t *j3d, int compno) -{ - int bandno, numbands; - int expn, mant; - - opj_cp_t *cp = j3d->cp; - opj_tcp_t *tcp = &cp->tcps[j3d->curtileno]; - opj_tccp_t *tccp = &tcp->tccps[compno]; - opj_cio_t *cio = j3d->cio; - - cio_write(cio, tccp->qntsty + (tccp->numgbits << 5), - 1); /* Sqcx : Table A28 de 15444-1*/ - - numbands = 0; // compiler warning - if (j3d->cinfo->codec_format == CODEC_J2K) { - numbands = tccp->qntsty == J3D_CCP_QNTSTY_SIQNT ? 1 : tccp->numresolution[0] * 3 - - 2; - } else if (j3d->cinfo->codec_format == CODEC_J3D) { - int diff = tccp->numresolution[0] - tccp->numresolution[2]; - numbands = (tccp->qntsty == J3D_CCP_QNTSTY_SIQNT) ? 1 : - (tccp->numresolution[0] * 7 - 6) - 4 * diff; /* SIQNT vs. SEQNT */ - } - - for (bandno = 0; bandno < numbands; bandno++) { - expn = tccp->stepsizes[bandno].expn; - mant = tccp->stepsizes[bandno].mant; - - if (tccp->qntsty == J3D_CCP_QNTSTY_NOQNT) { - cio_write(cio, expn << 3, 1); /* SPqcx_i */ - } else { - cio_write(cio, (expn << 11) + mant, 2); /* SPqcx_i */ - } - } -} - -static void j3d_read_qcx(opj_j3d_t *j3d, int compno, int len) -{ - int tmp; - int bandno, numbands; - - opj_cp_t *cp = j3d->cp; - opj_tcp_t *tcp = j3d->state == J3D_STATE_TPH ? &cp->tcps[j3d->curtileno] : - j3d->default_tcp; - opj_tccp_t *tccp = &tcp->tccps[compno]; - opj_cio_t *cio = j3d->cio; - - tmp = cio_read(cio, 1); /* Sqcx */ - tccp->qntsty = tmp & 0x1f; - tccp->numgbits = tmp >> 5; - - /*Numbands = 1 si SIQNT - len - 1 si NOQNT - (len - 1) / 2 si SEQNT */ - numbands = tccp->qntsty == J3D_CCP_QNTSTY_SIQNT ? 1 : (( - tccp->qntsty == J3D_CCP_QNTSTY_NOQNT) ? len - 1 : (len - 1) / 2); - - for (bandno = 0; bandno < numbands; bandno++) { - int expn, mant; - if (tccp->qntsty == J3D_CCP_QNTSTY_NOQNT) { - expn = cio_read(cio, 1) >> 3; /* SPqcx_i */ - mant = 0; - } else { - tmp = cio_read(cio, 2); /* SPqcx_i */ - expn = tmp >> 11; - mant = tmp & 0x7ff; - } - tccp->stepsizes[bandno].expn = expn; - tccp->stepsizes[bandno].mant = mant; - } - - /* Add Antonin : if scalar_derived -> compute other stepsizes */ - if (tccp->qntsty == J3D_CCP_QNTSTY_SIQNT) { - for (bandno = 1; bandno < J3D_MAXBANDS; bandno++) { - int numbands = (cp->transform_format == TRF_2D_DWT) ? 3 : 7; - tccp->stepsizes[bandno].expn = tccp->stepsizes[0].expn - (( - bandno - 1) / numbands); - tccp->stepsizes[bandno].mant = tccp->stepsizes[0].mant; - } - } - /* ddA */ -} - -static void j3d_write_qcd(opj_j3d_t *j3d) -{ - int lenp, len; - - opj_cio_t *cio = j3d->cio; - - cio_write(cio, J3D_MS_QCD, 2); /* QCD */ - lenp = cio_tell(cio); - cio_skip(cio, 2); - j3d_write_qcx(j3d, 0); /* Sqcd*/ - len = cio_tell(cio) - lenp; - cio_seek(cio, lenp); - cio_write(cio, len, 2); /* Lqcd */ - cio_seek(cio, lenp + len); -} - -static void j3d_read_qcd(opj_j3d_t *j3d) -{ - int len, i, pos; - - opj_cio_t *cio = j3d->cio; - opj_volume_t *volume = j3d->volume; - - len = cio_read(cio, 2); /* Lqcd */ - pos = cio_tell(cio); - for (i = 0; i < volume->numcomps; i++) { - cio_seek(cio, pos); - j3d_read_qcx(j3d, i, len - 2); - } -} - -static void j3d_write_qcc(opj_j3d_t *j3d, int compno) -{ - int lenp, len; - - opj_cio_t *cio = j3d->cio; - - cio_write(cio, J3D_MS_QCC, 2); /* QCC */ - lenp = cio_tell(cio); - cio_skip(cio, 2); - cio_write(cio, compno, j3d->volume->numcomps <= 256 ? 1 : 2); /* Cqcc */ - j3d_write_qcx(j3d, compno); - len = cio_tell(cio) - lenp; - cio_seek(cio, lenp); - cio_write(cio, len, 2); /* Lqcc */ - cio_seek(cio, lenp + len); -} - -static void j3d_read_qcc(opj_j3d_t *j3d) -{ - int len, compno; - int numcomp = j3d->volume->numcomps; - opj_cio_t *cio = j3d->cio; - - len = cio_read(cio, 2); /* Lqcc */ - compno = cio_read(cio, numcomp <= 256 ? 1 : 2); /* Cqcc */ - j3d_read_qcx(j3d, compno, len - 2 - (numcomp <= 256 ? 1 : 2)); -} - -static void j3d_write_poc(opj_j3d_t *j3d) -{ - int len, numpchgs, i; - - int numcomps = j3d->volume->numcomps; - - opj_cp_t *cp = j3d->cp; - opj_tcp_t *tcp = &cp->tcps[j3d->curtileno]; - opj_tccp_t *tccp = &tcp->tccps[0]; - opj_cio_t *cio = j3d->cio; - - numpchgs = tcp->numpocs; - cio_write(cio, J3D_MS_POC, 2); /* POC */ - len = 2 + (5 + 2 * (numcomps <= 256 ? 1 : 2)) * numpchgs; - cio_write(cio, len, 2); /* Lpoc */ - for (i = 0; i < numpchgs; i++) { - opj_poc_t *poc = &tcp->pocs[i]; - cio_write(cio, poc->resno0, 1); /* RSpoc_i */ - cio_write(cio, poc->compno0, (numcomps <= 256 ? 1 : 2)); /* CSpoc_i */ - cio_write(cio, poc->layno1, 2); /* LYEpoc_i */ - poc->layno1 = int_min(poc->layno1, tcp->numlayers); - cio_write(cio, poc->resno1, 1); /* REpoc_i */ - poc->resno1 = int_min(poc->resno1, tccp->numresolution[0]); - cio_write(cio, poc->compno1, (numcomps <= 256 ? 1 : 2)); /* CEpoc_i */ - poc->compno1 = int_min(poc->compno1, numcomps); - cio_write(cio, poc->prg, 1); /* Ppoc_i */ - } -} - -static void j3d_read_poc(opj_j3d_t *j3d) -{ - int len, numpchgs, i, old_poc; - - int numcomps = j3d->volume->numcomps; - - opj_cp_t *cp = j3d->cp; - opj_tcp_t *tcp = j3d->state == J3D_STATE_TPH ? &cp->tcps[j3d->curtileno] : - j3d->default_tcp; - opj_tccp_t *tccp = &tcp->tccps[0]; - opj_cio_t *cio = j3d->cio; - - old_poc = tcp->POC ? tcp->numpocs + 1 : 0; - tcp->POC = 1; - len = cio_read(cio, 2); /* Lpoc */ - numpchgs = (len - 2) / (5 + 2 * (numcomps <= 256 ? 1 : 2)); - - for (i = old_poc; i < numpchgs + old_poc; i++) { - opj_poc_t *poc; - poc = &tcp->pocs[i]; - poc->resno0 = cio_read(cio, 1); /* RSpoc_i */ - poc->compno0 = cio_read(cio, numcomps <= 256 ? 1 : 2); /* CSpoc_i */ - poc->layno1 = int_min(cio_read(cio, 2), - (unsigned int) tcp->numlayers); /* LYEpoc_i */ - poc->resno1 = int_min(cio_read(cio, 1), - (unsigned int) tccp->numresolution[0]); /* REpoc_i */ - poc->compno1 = int_min( - cio_read(cio, numcomps <= 256 ? 1 : 2), - (unsigned int) numcomps); /* CEpoc_i */ - poc->prg = (OPJ_PROG_ORDER)cio_read(cio, 1); /* Ppoc_i */ - } - - tcp->numpocs = numpchgs + old_poc - 1; -} - -static void j3d_read_crg(opj_j3d_t *j3d) -{ - int len, i, Xcrg_i, Ycrg_i, Zcrg_i; - - opj_cio_t *cio = j3d->cio; - int numcomps = j3d->volume->numcomps; - - len = cio_read(cio, 2); /* Lcrg */ - for (i = 0; i < numcomps; i++) { - Xcrg_i = cio_read(cio, 2); /* Xcrg_i */ - Ycrg_i = cio_read(cio, 2); /* Ycrg_i */ - Zcrg_i = cio_read(cio, 2); /* Zcrg_i */ - } -} - -static void j3d_read_tlm(opj_j3d_t *j3d) -{ - int len, Ztlm, Stlm, ST, SP, tile_tlm, i; - long int Ttlm_i, Ptlm_i; - - opj_cio_t *cio = j3d->cio; - - len = cio_read(cio, 2); /* Ltlm */ - Ztlm = cio_read(cio, 1); /* Ztlm */ - Stlm = cio_read(cio, 1); /* Stlm */ - ST = ((Stlm >> 4) & 0x01) + ((Stlm >> 4) & 0x02); - SP = (Stlm >> 6) & 0x01; - tile_tlm = (len - 4) / ((SP + 1) * 2 + ST); - for (i = 0; i < tile_tlm; i++) { - Ttlm_i = cio_read(cio, ST); /* Ttlm_i */ - Ptlm_i = cio_read(cio, SP ? 4 : 2); /* Ptlm_i */ - } -} - -static void j3d_read_plm(opj_j3d_t *j3d) -{ - int len, i, Zplm, Nplm, add, packet_len = 0; - - opj_cio_t *cio = j3d->cio; - - len = cio_read(cio, 2); /* Lplm */ - Zplm = cio_read(cio, 1); /* Zplm */ - len -= 3; - while (len > 0) { - Nplm = cio_read(cio, 4); /* Nplm */ - len -= 4; - for (i = Nplm; i > 0; i--) { - add = cio_read(cio, 1); - len--; - packet_len = (packet_len << 7) + add; /* Iplm_ij */ - if ((add & 0x80) == 0) { - /* New packet */ - packet_len = 0; - } - if (len <= 0) { - break; - } - } - } -} - -static void j3d_read_plt(opj_j3d_t *j3d) -{ - int len, i, Zplt, packet_len = 0, add; - - opj_cio_t *cio = j3d->cio; - - len = cio_read(cio, 2); /* Lplt */ - Zplt = cio_read(cio, 1); /* Zplt */ - for (i = len - 3; i > 0; i--) { - add = cio_read(cio, 1); - packet_len = (packet_len << 7) + add; /* Iplt_i */ - if ((add & 0x80) == 0) { - /* New packet */ - packet_len = 0; - } - } -} - -static void j3d_read_ppm(opj_j3d_t *j3d) -{ - int len, Z_ppm, i, j; - int N_ppm; - - opj_cp_t *cp = j3d->cp; - opj_cio_t *cio = j3d->cio; - - len = cio_read(cio, 2); - cp->ppm = 1; - - Z_ppm = cio_read(cio, 1); /* Z_ppm */ - len -= 3; - while (len > 0) { - if (cp->ppm_previous == 0) { - N_ppm = cio_read(cio, 4); /* N_ppm */ - len -= 4; - } else { - N_ppm = cp->ppm_previous; - } - j = cp->ppm_store; - if (Z_ppm == 0) { /* First PPM marker */ - cp->ppm_data = (unsigned char *) opj_malloc(N_ppm * sizeof(unsigned char)); - cp->ppm_data_first = cp->ppm_data; - cp->ppm_len = N_ppm; - } else { /* NON-first PPM marker */ - cp->ppm_data = (unsigned char *) opj_realloc(cp->ppm_data, - (N_ppm + cp->ppm_store) * sizeof(unsigned char)); - cp->ppm_data_first = cp->ppm_data; - cp->ppm_len = N_ppm + cp->ppm_store; - } - for (i = N_ppm; i > 0; i--) { /* Read packet header */ - cp->ppm_data[j] = cio_read(cio, 1); - j++; - len--; - if (len == 0) { - break; /* Case of non-finished packet header in present marker but finished in next one */ - } - } - cp->ppm_previous = i - 1; - cp->ppm_store = j; - } -} - -static void j3d_read_ppt(opj_j3d_t *j3d) -{ - int len, Z_ppt, i, j = 0; - - opj_cp_t *cp = j3d->cp; - opj_tcp_t *tcp = cp->tcps + j3d->curtileno; - opj_cio_t *cio = j3d->cio; - - len = cio_read(cio, 2); - Z_ppt = cio_read(cio, 1); - tcp->ppt = 1; - if (Z_ppt == 0) { /* First PPT marker */ - tcp->ppt_data = (unsigned char *) opj_malloc((len - 3) * sizeof(unsigned char)); - tcp->ppt_data_first = tcp->ppt_data; - tcp->ppt_store = 0; - tcp->ppt_len = len - 3; - } else { /* NON-first PPT marker */ - tcp->ppt_data = (unsigned char *) opj_realloc(tcp->ppt_data, - (len - 3 + tcp->ppt_store) * sizeof(unsigned char)); - tcp->ppt_data_first = tcp->ppt_data; - tcp->ppt_len = len - 3 + tcp->ppt_store; - } - j = tcp->ppt_store; - for (i = len - 3; i > 0; i--) { - tcp->ppt_data[j] = cio_read(cio, 1); - j++; - } - tcp->ppt_store = j; -} - -static void j3d_write_sot(opj_j3d_t *j3d) -{ - int lenp, len; - - opj_cio_t *cio = j3d->cio; - - j3d->sot_start = cio_tell(cio); - cio_write(cio, J3D_MS_SOT, 2); /* SOT */ - lenp = cio_tell(cio); - cio_skip(cio, 2); /* Lsot (further) */ - cio_write(cio, j3d->curtileno, 2); /* Isot */ - cio_skip(cio, 4); /* Psot (further in j3d_write_sod) */ - cio_write(cio, 0, 1); /* TPsot */ - cio_write(cio, 1, - 1); /* TNsot (no of tile-parts of this tile in this codestream)*/ - len = cio_tell(cio) - lenp; - cio_seek(cio, lenp); - cio_write(cio, len, 2); /* Lsot */ - cio_seek(cio, lenp + len); -} - -static void j3d_read_sot(opj_j3d_t *j3d) -{ - int len, tileno, totlen, partno, numparts, i; - opj_tcp_t *tcp = NULL; - char status = 0; - - opj_cp_t *cp = j3d->cp; - opj_cio_t *cio = j3d->cio; - - len = cio_read(cio, 2); - tileno = cio_read(cio, 2); - - if (cp->tileno_size == 0) { - cp->tileno[cp->tileno_size] = tileno; - cp->tileno_size++; - } else { - i = 0; - while (i < cp->tileno_size && status == 0) { - status = cp->tileno[i] == tileno ? 1 : 0; - i++; - } - if (status == 0) { - cp->tileno[cp->tileno_size] = tileno; - cp->tileno_size++; - } - } - - totlen = cio_read(cio, 4); - if (!totlen) { - totlen = cio_numbytesleft(cio) + 8; - } - - partno = cio_read(cio, 1); - numparts = cio_read(cio, 1); - - j3d->curtileno = tileno; - j3d->eot = cio_getbp(cio) - 12 + totlen; - j3d->state = J3D_STATE_TPH; - tcp = &cp->tcps[j3d->curtileno]; - - if (tcp->first == 1) { - - /* Initialization PPT */ - opj_tccp_t *tmp = tcp->tccps; - memcpy(tcp, j3d->default_tcp, sizeof(opj_tcp_t)); - tcp->ppt = 0; - tcp->ppt_data = NULL; - tcp->ppt_data_first = NULL; - tcp->tccps = tmp; - - for (i = 0; i < j3d->volume->numcomps; i++) { - tcp->tccps[i] = j3d->default_tcp->tccps[i]; - } - cp->tcps[j3d->curtileno].first = 0; - } -} - -static void j3d_write_sod(opj_j3d_t *j3d, void *tile_coder) -{ - int l, layno; - int totlen; - opj_tcp_t *tcp = NULL; - opj_volume_info_t *volume_info = NULL; - - opj_tcd_t *tcd = (opj_tcd_t*) - tile_coder; /* cast is needed because of conflicts in header inclusions */ - opj_cp_t *cp = j3d->cp; - opj_cio_t *cio = j3d->cio; - - cio_write(cio, J3D_MS_SOD, 2); - if (j3d->curtileno == 0) { - j3d->sod_start = cio_tell(cio) + j3d->pos_correction; - } - - /* INDEX >> */ - volume_info = j3d->volume_info; - if (volume_info && volume_info->index_on) { - volume_info->tile[j3d->curtileno].end_header = cio_tell( - cio) + j3d->pos_correction - 1; - } - /* << INDEX */ - - tcp = &cp->tcps[j3d->curtileno]; - for (layno = 0; layno < tcp->numlayers; layno++) { - tcp->rates[layno] -= tcp->rates[layno] ? (j3d->sod_start / - (cp->th * cp->tw * cp->tl)) : 0; - } - - if (volume_info) { - volume_info->num = 0; - } - - l = tcd_encode_tile(tcd, j3d->curtileno, cio_getbp(cio), - cio_numbytesleft(cio) - 2, volume_info); - - /* Writing Psot in SOT marker */ - totlen = cio_tell(cio) + l - j3d->sot_start; - cio_seek(cio, j3d->sot_start + 6); - cio_write(cio, totlen, 4); - cio_seek(cio, j3d->sot_start + totlen); -} - -static void j3d_read_sod(opj_j3d_t *j3d) -{ - int len, truncate = 0, i; - unsigned char *data = NULL, *data_ptr = NULL; - - opj_cio_t *cio = j3d->cio; - int curtileno = j3d->curtileno; - - len = int_min(j3d->eot - cio_getbp(cio), cio_numbytesleft(cio) + 1); - - if (len == cio_numbytesleft(cio) + 1) { - truncate = 1; /* Case of a truncate codestream */ - } - - data = (unsigned char *) opj_malloc((j3d->tile_len[curtileno] + len) * sizeof( - unsigned char)); - - for (i = 0; i < j3d->tile_len[curtileno]; i++) { - data[i] = j3d->tile_data[curtileno][i]; - } - - data_ptr = data + j3d->tile_len[curtileno]; - for (i = 0; i < len; i++) { - data_ptr[i] = cio_read(cio, 1); - } - - j3d->tile_len[curtileno] += len; - opj_free(j3d->tile_data[curtileno]); - j3d->tile_data[curtileno] = data; - - if (!truncate) { - j3d->state = J3D_STATE_TPHSOT; - } else { - j3d->state = J3D_STATE_NEOC; /* RAJOUTE !! */ - } -} - -static void j3d_write_rgn(opj_j3d_t *j3d, int compno, int tileno) -{ - - opj_cp_t *cp = j3d->cp; - opj_tcp_t *tcp = &cp->tcps[tileno]; - opj_cio_t *cio = j3d->cio; - int numcomps = j3d->volume->numcomps; - - cio_write(cio, J3D_MS_RGN, 2); /* RGN */ - cio_write(cio, numcomps <= 256 ? 5 : 6, 2); /* Lrgn */ - cio_write(cio, compno, numcomps <= 256 ? 1 : 2); /* Crgn */ - cio_write(cio, 0, 1); /* Srgn */ - cio_write(cio, tcp->tccps[compno].roishift, 1); /* SPrgn */ -} - -static void j3d_read_rgn(opj_j3d_t *j3d) -{ - int len, compno, roisty; - - opj_cp_t *cp = j3d->cp; - opj_tcp_t *tcp = j3d->state == J3D_STATE_TPH ? &cp->tcps[j3d->curtileno] : - j3d->default_tcp; - opj_cio_t *cio = j3d->cio; - int numcomps = j3d->volume->numcomps; - - len = cio_read(cio, 2); /* Lrgn */ - compno = cio_read(cio, numcomps <= 256 ? 1 : 2); /* Crgn */ - roisty = cio_read(cio, 1); /* Srgn */ - tcp->tccps[compno].roishift = cio_read(cio, 1); /* SPrgn */ -} - -static void j3d_write_eoc(opj_j3d_t *j3d) -{ - opj_cio_t *cio = j3d->cio; - /* opj_event_msg(j3d->cinfo, "%.8x: EOC\n", cio_tell(cio) + j3d->pos_correction); */ - cio_write(cio, J3D_MS_EOC, 2); -} - -static void j3d_read_eoc(opj_j3d_t *j3d) -{ - int i, tileno; - -#ifndef NO_PACKETS_DECODING - opj_tcd_t *tcd = tcd_create(j3d->cinfo); - tcd_malloc_decode(tcd, j3d->volume, j3d->cp); - /*j3d_dump_volume(stdout, tcd->volume); - j3d_dump_cp(stdout, tcd->volume, tcd->cp);*/ - for (i = 0; i < j3d->cp->tileno_size; i++) { - tileno = j3d->cp->tileno[i]; - /*opj_event_msg(j3d->cinfo, EVT_INFO, "tcd_decode_tile \n");*/ - tcd_decode_tile(tcd, j3d->tile_data[tileno], j3d->tile_len[tileno], tileno); - opj_free(j3d->tile_data[tileno]); - j3d->tile_data[tileno] = NULL; - } - tcd_free_decode(tcd); - tcd_destroy(tcd); -#else - for (i = 0; i < j3d->cp->tileno_size; i++) { - tileno = j3d->cp->tileno[i]; - opj_free(j3d->tile_data[tileno]); - j3d->tile_data[tileno] = NULL; - } -#endif - - j3d->state = J3D_STATE_MT; -} - -static void j3d_read_unk(opj_j3d_t *j3d) -{ - opj_event_msg(j3d->cinfo, EVT_WARNING, "Unknown marker\n"); -} - -static opj_atk_t atk_info_wt[] = { - {0, 1, J3D_ATK_WS, J3D_ATK_IRR, 0, J3D_ATK_WS, 1.230174104, 4, {0}, {0}, {0}, {1, 1, 1, 1}, {-1.586134342059924, -0.052980118572961, 0.882911075530934, 0.443506852043971}}, /* WT 9-7 IRR*/ - {1, 0, J3D_ATK_WS, J3D_ATK_REV, 0, J3D_ATK_WS, 0, 2, {0}, {1, 2}, {1, 2}, {1, 1}, {-1.0, 1.0}}, /* WT 5-3 REV*/ - {2, 0, J3D_ATK_ARB, J3D_ATK_REV, 0, J3D_ATK_CON, 0, 2, {0, 0}, {0, 1}, {0, 1}, {1, 1}, {{-1.0}, {1.0}}}, /* WT 2-2 REV*/ - {3, 0, J3D_ATK_ARB, J3D_ATK_REV, 1, J3D_ATK_CON, 0, 3, {0, 0, -1}, {0, 1, 2}, {0, 1, 2}, {1, 1, 3}, {{-1.0}, {1.0}, {1.0, 0.0, -1.0}}}, /* WT 2-6 REV*/ - {4, 0, J3D_ATK_ARB, J3D_ATK_REV, 1, J3D_ATK_CON, 0, 3, {0, 0, -2}, {0, 1, 6}, {0, 1, 32}, {1, 1, 5}, {{-1}, {1}, {-3.0, 22.0, 0.0, -22.0, 3.0}}}, /* WT 2-10 REV*/ - {5, 1, J3D_ATK_ARB, J3D_ATK_IRR, 1, J3D_ATK_WS, 1, 7, {0}, {0}, {0}, {1, 1, 2, 1, 2, 1, 3}, {{-1}, {1.58613434206}, {-0.460348209828, 0.460348209828}, {0.25}, {0.374213867768, -0.374213867768}, {-1.33613434206}, {0.29306717103, 0, -0.29306717103}}}, /* WT 6-10 IRR*/ - { - 6, 1, J3D_ATK_ARB, J3D_ATK_IRR, 0, J3D_ATK_WS, 1, 11, {0}, {0}, {0}, {1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 5}, {{-1}, {0, 99715069105}, {-1.00573127827, 1.00573127827}, {-0.27040357631}, {2.20509972343, -2.20509972343}, {0.08059995736}, - {-1.62682532350, 1.62682532350}, {0.52040357631}, {0.60404664250, -0.60404664250}, {-0.82775064841}, {-0.06615812964, 0.29402137720, 0, -0.29402137720, 0.06615812964} - } - }, /* WT 10-18 IRR*/ - {7, 1, J3D_ATK_WS, J3D_ATK_IRR, 0, J3D_ATK_WS, 1, 2, {0}, {0}, {0}, {1, 1}, {-0.5, 0.25}}, /* WT 5-3 IRR*/ - {8, 0, J3D_ATK_WS, J3D_ATK_REV, 0, J3D_ATK_WS, 0, 2, {0}, {4, 4}, {8, 8}, {2, 2}, {{-9, 1}, {5, -1}}} /* WT 13-7 REV*/ -}; - -typedef struct opj_dec_mstabent { - /** marker value */ - int id; - /** value of the state when the marker can appear */ - int states; - /** action linked to the marker */ - void (*handler)(opj_j3d_t *j3d); -} opj_dec_mstabent_t; - -opj_dec_mstabent_t j3d_dec_mstab[] = { - {J3D_MS_SOC, J3D_STATE_MHSOC, j3d_read_soc}, - {J3D_MS_SOT, J3D_STATE_MH | J3D_STATE_TPHSOT, j3d_read_sot}, - {J3D_MS_SOD, J3D_STATE_TPH, j3d_read_sod}, - {J3D_MS_EOC, J3D_STATE_TPHSOT, j3d_read_eoc}, - {J3D_MS_CAP, J3D_STATE_MHSIZ, j3d_read_cap}, - {J3D_MS_SIZ, J3D_STATE_MHSIZ, j3d_read_siz}, - {J3D_MS_NSI, J3D_STATE_MHSIZ, j3d_read_nsi}, - {J3D_MS_COD, J3D_STATE_MH | J3D_STATE_TPH, j3d_read_cod}, - {J3D_MS_COC, J3D_STATE_MH | J3D_STATE_TPH, j3d_read_coc}, - {J3D_MS_RGN, J3D_STATE_MH | J3D_STATE_TPH, j3d_read_rgn}, - {J3D_MS_QCD, J3D_STATE_MH | J3D_STATE_TPH, j3d_read_qcd}, - {J3D_MS_QCC, J3D_STATE_MH | J3D_STATE_TPH, j3d_read_qcc}, - {J3D_MS_POC, J3D_STATE_MH | J3D_STATE_TPH, j3d_read_poc}, - {J3D_MS_TLM, J3D_STATE_MH, j3d_read_tlm}, - {J3D_MS_PLM, J3D_STATE_MH, j3d_read_plm}, - {J3D_MS_PLT, J3D_STATE_TPH, j3d_read_plt}, - {J3D_MS_PPM, J3D_STATE_MH, j3d_read_ppm}, - {J3D_MS_PPT, J3D_STATE_TPH, j3d_read_ppt}, - {J3D_MS_SOP, 0, 0}, - {J3D_MS_CRG, J3D_STATE_MH, j3d_read_crg}, - {J3D_MS_COM, J3D_STATE_MH | J3D_STATE_TPH, j3d_read_com}, - {J3D_MS_DCO, J3D_STATE_MH | J3D_STATE_TPH, j3d_read_dco}, - {J3D_MS_ATK, J3D_STATE_MH | J3D_STATE_TPH, j3d_read_atk}, - {0, J3D_STATE_MH | J3D_STATE_TPH, j3d_read_unk} - /*, -->must define the j3d_read functions - {J3D_MS_CBD, J3D_STATE_MH | J3D_STATE_TPH, j3d_read_cbd}, - {J3D_MS_MCT, J3D_STATE_MH | J3D_STATE_TPH, j3d_read_mct}, - {J3D_MS_MCC, J3D_STATE_MH | J3D_STATE_TPH, j3d_read_mcc}, - {J3D_MS_MCO, J3D_STATE_MH | J3D_STATE_TPH, j3d_read_mco}, - {J3D_MS_NLT, J3D_STATE_MH | J3D_STATE_TPH, j3d_read_nlt}, - {J3D_MS_VMS, J3D_STATE_MH, j3d_read_vms}, - {J3D_MS_DFS, J3D_STATE_MH, j3d_read_dfs}, - {J3D_MS_ADS, J3D_STATE_MH, j3d_read_ads}, - {J3D_MS_QPD, J3D_STATE_MH, j3d_read_qpd}, - {J3D_MS_QPC, J3D_STATE_TPH, j3d_read_qpc}*/ -}; - -/** -Read the lookup table containing all the marker, status and action -@param id Marker value -*/ -static opj_dec_mstabent_t *j3d_dec_mstab_lookup(int id) -{ - opj_dec_mstabent_t *e; - for (e = j3d_dec_mstab; e->id != 0; e++) { - if (e->id == id) { - break; - } - } - return e; -} - -/* ----------------------------------------------------------------------- */ -/* J3D / JPT decoder interface */ -/* ----------------------------------------------------------------------- */ - -opj_j3d_t* j3d_create_decompress(opj_common_ptr cinfo) -{ - opj_j3d_t *j3d = (opj_j3d_t*)opj_malloc(sizeof(opj_j3d_t)); - if (j3d) { - j3d->cinfo = cinfo; - j3d->default_tcp = (opj_tcp_t*)opj_malloc(sizeof(opj_tcp_t)); - if (!j3d->default_tcp) { - opj_free(j3d); - return NULL; - } - } - return j3d; -} - -void j3d_destroy_decompress(opj_j3d_t *j3d) -{ - int i = 0; - - if (j3d->tile_len != NULL) { - opj_free(j3d->tile_len); - } - if (j3d->tile_data != NULL) { - opj_free(j3d->tile_data); - } - if (j3d->default_tcp != NULL) { - opj_tcp_t *default_tcp = j3d->default_tcp; - if (default_tcp->ppt_data_first != NULL) { - opj_free(default_tcp->ppt_data_first); - } - if (j3d->default_tcp->tccps != NULL) { - opj_free(j3d->default_tcp->tccps); - } - opj_free(j3d->default_tcp); - } - if (j3d->cp != NULL) { - opj_cp_t *cp = j3d->cp; - if (cp->tcps != NULL) { - for (i = 0; i < cp->tw * cp->th * cp->tl; i++) { - if (cp->tcps[i].ppt_data_first != NULL) { - opj_free(cp->tcps[i].ppt_data_first); - } - if (cp->tcps[i].tccps != NULL) { - opj_free(cp->tcps[i].tccps); - } - } - opj_free(cp->tcps); - } - if (cp->ppm_data_first != NULL) { - opj_free(cp->ppm_data_first); - } - if (cp->tileno != NULL) { - opj_free(cp->tileno); - } - if (cp->comment != NULL) { - opj_free(cp->comment); - } - - opj_free(cp); - } - - opj_free(j3d); -} - -void j3d_setup_decoder(opj_j3d_t *j3d, opj_dparameters_t *parameters) -{ - if (j3d && parameters) { - /* create and initialize the coding parameters structure */ - opj_cp_t *cp = (opj_cp_t*)opj_malloc(sizeof(opj_cp_t)); - cp->reduce[0] = parameters->cp_reduce[0]; - cp->reduce[1] = parameters->cp_reduce[1]; - cp->reduce[2] = parameters->cp_reduce[2]; - cp->layer = parameters->cp_layer; - cp->bigendian = parameters->bigendian; - - /* MM: Settings of the following two member variables would take - place during j3d_read_com. FIXME */ - cp->encoding_format = ENCOD_3EB; - cp->transform_format = TRF_2D_DWT; - - /* keep a link to cp so that we can destroy it later in j3d_destroy_decompress */ - j3d->cp = cp; - } -} - -opj_volume_t* j3d_decode(opj_j3d_t *j3d, opj_cio_t *cio) -{ - opj_volume_t *volume = NULL; - - opj_common_ptr cinfo = j3d->cinfo; - - j3d->cio = cio; - - /* create an empty volume */ - volume = (opj_volume_t*)opj_malloc(sizeof(opj_volume_t)); - j3d->volume = volume; - - j3d->state = J3D_STATE_MHSOC; - - for (;;) { - opj_dec_mstabent_t *e; - int id = cio_read(cio, 2); - if (id >> 8 != 0xff) { - opj_volume_destroy(volume); - opj_event_msg(cinfo, EVT_ERROR, "%.8x: expected a marker instead of %x\n", - cio_tell(cio) - 2, id); - return 0; - } - e = j3d_dec_mstab_lookup(id); - /*opj_event_msg(cinfo, EVT_INFO, "MARKER %x PREVSTATE %d E->STATE %d\n",e->id,j3d->state,e->states);*/ - if (!(j3d->state & e->states)) { - opj_volume_destroy(volume); - opj_event_msg(cinfo, EVT_ERROR, "%.8x: unexpected marker %x\n", - cio_tell(cio) - 2, id); - return 0; - } - if (e->handler) { - (*e->handler)(j3d); - } - /*opj_event_msg(cinfo, EVT_INFO, "POSTSTATE %d\n",j3d->state);*/ - if (j3d->state == J3D_STATE_MT) { - break; - } - if (j3d->state == J3D_STATE_NEOC) { - break; - } - } - if (j3d->state == J3D_STATE_NEOC) { - j3d_read_eoc(j3d); - } - - if (j3d->state != J3D_STATE_MT) { - opj_event_msg(cinfo, EVT_WARNING, "Incomplete bitstream\n"); - } - - return volume; -} - -/* ----------------------------------------------------------------------- */ -/* J3D encoder interface */ -/* ----------------------------------------------------------------------- */ - -opj_j3d_t* j3d_create_compress(opj_common_ptr cinfo) -{ - opj_j3d_t *j3d = (opj_j3d_t*)opj_malloc(sizeof(opj_j3d_t)); - if (j3d) { - j3d->cinfo = cinfo; - } - return j3d; -} - -void j3d_destroy_compress(opj_j3d_t *j3d) -{ - int tileno; - - if (!j3d) { - return; - } - - if (j3d->volume_info != NULL) { - opj_volume_info_t *volume_info = j3d->volume_info; - if (volume_info->index_on && j3d->cp) { - opj_cp_t *cp = j3d->cp; - for (tileno = 0; tileno < cp->tw * cp->th; tileno++) { - opj_tile_info_t *tile_info = &volume_info->tile[tileno]; - opj_free(tile_info->thresh); - opj_free(tile_info->packet); - } - opj_free(volume_info->tile); - } - opj_free(volume_info); - } - if (j3d->cp != NULL) { - opj_cp_t *cp = j3d->cp; - - if (cp->comment) { - opj_free(cp->comment); - } - if (cp->matrice) { - opj_free(cp->matrice); - } - for (tileno = 0; tileno < cp->tw * cp->th; tileno++) { - opj_free(cp->tcps[tileno].tccps); - } - opj_free(cp->tcps); - opj_free(cp); - } - - opj_free(j3d); -} - -void j3d_setup_encoder(opj_j3d_t *j3d, opj_cparameters_t *parameters, - opj_volume_t *volume) -{ - int i, j, tileno, numpocs_tile; - opj_cp_t *cp = NULL; - - if (!j3d || !parameters || ! volume) { - return; - } - - /* create and initialize the coding parameters structure */ - cp = (opj_cp_t*)opj_malloc(sizeof(opj_cp_t)); - - /* keep a link to cp so that we can destroy it later in j3d_destroy_compress */ - j3d->cp = cp; - - /* set default values for cp */ - cp->tw = 1; - cp->th = 1; - cp->tl = 1; - - /* copy user encoding parameters */ - cp->disto_alloc = parameters->cp_disto_alloc; - cp->fixed_alloc = parameters->cp_fixed_alloc; - cp->fixed_quality = parameters->cp_fixed_quality; - - /* transform and coding method */ - cp->transform_format = parameters->transform_format; - cp->encoding_format = parameters->encoding_format; - - /* mod fixed_quality */ - if (parameters->cp_matrice) { - size_t array_size = parameters->tcp_numlayers * 3 * parameters->numresolution[0] - * sizeof(int); - cp->matrice = (int *) opj_malloc(array_size); - memcpy(cp->matrice, parameters->cp_matrice, array_size); - } - - /* creation of an index file ? */ - cp->index_on = parameters->index_on; - if (cp->index_on) { - j3d->volume_info = (opj_volume_info_t*)opj_malloc(sizeof(opj_volume_info_t)); - } - - /* tiles */ - cp->tdx = parameters->cp_tdx; - cp->tdy = parameters->cp_tdy; - cp->tdz = parameters->cp_tdz; - /* tile offset */ - cp->tx0 = parameters->cp_tx0; - cp->ty0 = parameters->cp_ty0; - cp->tz0 = parameters->cp_tz0; - /* comment string */ - if (parameters->cp_comment) { - cp->comment = (char*)opj_malloc(strlen(parameters->cp_comment) + 1); - if (cp->comment) { - strcpy(cp->comment, parameters->cp_comment); - } - } - - /*calculate other encoding parameters*/ - if (parameters->tile_size_on) { - cp->tw = int_ceildiv(volume->x1 - cp->tx0, cp->tdx); - cp->th = int_ceildiv(volume->y1 - cp->ty0, cp->tdy); - cp->tl = int_ceildiv(volume->z1 - cp->tz0, cp->tdz); - } else { - cp->tdx = volume->x1 - cp->tx0; - cp->tdy = volume->y1 - cp->ty0; - cp->tdz = volume->z1 - cp->tz0; - } - - /* initialize the multiple tiles */ - /* ---------------------------- */ - cp->tcps = (opj_tcp_t *) opj_malloc(cp->tw * cp->th * cp->tl * sizeof( - opj_tcp_t)); - - for (tileno = 0; tileno < cp->tw * cp->th * cp->tl; tileno++) { - opj_tcp_t *tcp = &cp->tcps[tileno]; - tcp->numlayers = parameters->tcp_numlayers; - for (j = 0; j < tcp->numlayers; j++) { - if (cp->fixed_quality) { /* add fixed_quality */ - tcp->distoratio[j] = parameters->tcp_distoratio[j]; - } else { - tcp->rates[j] = parameters->tcp_rates[j]; - } - } - tcp->csty = parameters->csty; - tcp->prg = parameters->prog_order; - tcp->mct = volume->numcomps == 3 ? 1 : 0; - - numpocs_tile = 0; - tcp->POC = 0; - if (parameters->numpocs) { - /* initialisation of POC */ - tcp->POC = 1; - for (i = 0; i < parameters->numpocs; i++) { - if ((tileno == parameters->POC[i].tile - 1) || - (parameters->POC[i].tile == -1)) { - opj_poc_t *tcp_poc = &tcp->pocs[numpocs_tile]; - tcp_poc->resno0 = parameters->POC[numpocs_tile].resno0; - tcp_poc->compno0 = parameters->POC[numpocs_tile].compno0; - tcp_poc->layno1 = parameters->POC[numpocs_tile].layno1; - tcp_poc->resno1 = parameters->POC[numpocs_tile].resno1; - tcp_poc->compno1 = parameters->POC[numpocs_tile].compno1; - tcp_poc->prg = parameters->POC[numpocs_tile].prg; - tcp_poc->tile = parameters->POC[numpocs_tile].tile; - numpocs_tile++; - } - } - } - tcp->numpocs = numpocs_tile; - - tcp->tccps = (opj_tccp_t *) opj_malloc(volume->numcomps * sizeof(opj_tccp_t)); - - for (i = 0; i < volume->numcomps; i++) { - opj_tccp_t *tccp = &tcp->tccps[i]; - tccp->csty = parameters->csty & - J3D_CCP_CSTY_PRT; /* 0 => standard precint || 1 => custom-defined precinct */ - tccp->numresolution[0] = parameters->numresolution[0]; - tccp->numresolution[1] = parameters->numresolution[1]; - tccp->numresolution[2] = parameters->numresolution[2]; - assert(parameters->cblock_init[0] <= T1_MAXCBLKW); - assert(parameters->cblock_init[0] >= T1_MINCBLKW); - assert(parameters->cblock_init[1] <= T1_MAXCBLKH); - assert(parameters->cblock_init[1] >= T1_MINCBLKH); - assert(parameters->cblock_init[2] <= T1_MAXCBLKD); - assert(parameters->cblock_init[2] >= T1_MINCBLKD); - tccp->cblk[0] = int_floorlog2(parameters->cblock_init[0]); - tccp->cblk[1] = int_floorlog2(parameters->cblock_init[1]); - tccp->cblk[2] = int_floorlog2(parameters->cblock_init[2]); - assert(tccp->cblk[0] + tccp->cblk[1] + tccp->cblk[1] <= T1_MAXWHD); - tccp->cblksty = parameters->mode; /*Codeblock style --> Table A.19 (default 0)*/ - - /*ATK / transform */ - tccp->reversible = parameters->irreversible ? 0 : - 1; /* 0 => DWT 9-7 || 1 => DWT 5-3 */ - for (j = 0; j < 3; j++) { - tccp->dwtid[j] = parameters->irreversible ? 0 : - 1; /* 0 => DWT 9-7 || 1 => DWT 5-3 */ - } - - /* Quantification: SEQNT (Scalar Expounded, value for each subband) / NOQNT (no quant)*/ - tccp->qntsty = parameters->irreversible ? J3D_CCP_QNTSTY_SEQNT : - J3D_CCP_QNTSTY_NOQNT; - tccp->numgbits = 2; - if (i == parameters->roi_compno) { - tccp->roishift = parameters->roi_shift; - } else { - tccp->roishift = 0; - } - /* Custom defined precints */ - if (parameters->csty & J3D_CCP_CSTY_PRT) { - int k; - for (k = 0; k < 3; k++) { - int p = 0; - for (j = tccp->numresolution[k] - 1; j >= 0; j--) { - if (p < parameters->res_spec) {/* p < number of precinct size specifications */ - if (parameters->prct_init[k][p] < 1) { - tccp->prctsiz[k][j] = 1; - } else { - tccp->prctsiz[k][j] = int_floorlog2(parameters->prct_init[k][p]); - } - } else { - int res_spec = parameters->res_spec; - int size_prct = parameters->prct_init[k][res_spec - 1] >> (p - (res_spec - 1)); - if (size_prct < 1) { - tccp->prctsiz[k][j] = 1; - } else { - tccp->prctsiz[k][j] = int_floorlog2(size_prct); - } - } - } - p++; - } - } else { - int k; - for (k = 0; k < 3; k++) { - for (j = 0; j < tccp->numresolution[k]; j++) { - tccp->prctsiz[k][j] = 15; - } - } - } - /*Calcular stepsize for each subband (if NOQNT -->stepsize = 1.0)*/ - dwt_calc_explicit_stepsizes(tccp, volume->comps[i].prec); - } - } -} - -/** -Create an index file -@param j3d -@param cio -@param volume_info -@param index Index filename -@return Returns 1 if successful, returns 0 otherwise -*/ -static int j3d_create_index(opj_j3d_t *j3d, opj_cio_t *cio, - opj_volume_info_t *volume_info, char *index) -{ - - int tileno, compno, layno, resno, precno, pack_nb, x, y, z; - FILE *stream = NULL; - double total_disto = 0; - - volume_info->codestream_size = cio_tell(cio) + - j3d->pos_correction; /* Correction 14/4/03 suite rmq de Patrick */ - - stream = fopen(index, "w"); - if (!stream) { - opj_event_msg(j3d->cinfo, EVT_ERROR, "failed to open %s for writing\n", index); - return 0; - } - - fprintf(stream, "w %d\t h %d\t l %d\n", volume_info->volume_w, - volume_info->volume_h, volume_info->volume_l); - fprintf(stream, "TRASNFORM\t%d\n", volume_info->transform_format); - fprintf(stream, "ENTROPY CODING\t%d\n", volume_info->encoding_format); - fprintf(stream, "PROG\t%d\n", volume_info->prog); - fprintf(stream, "TILE\tx %d y %d z %d\n", volume_info->tile_x, - volume_info->tile_y, volume_info->tile_z); - fprintf(stream, "NOTILE\tx %d y %d z %d\n", volume_info->tw, volume_info->th, - volume_info->tl); - fprintf(stream, "COMPONENTS\t%d\n", volume_info->comp); - fprintf(stream, "LAYER\t%d\n", volume_info->layer); - fprintf(stream, "RESOLUTIONS\tx %d y %d z %d\n", volume_info->decomposition[0], - volume_info->decomposition[1], volume_info->decomposition[2]); - - fprintf(stream, "Precint sizes for each resolution:\n"); - for (resno = volume_info->decomposition[0]; resno >= 0; resno--) { - fprintf(stream, "Resno %d \t [%d,%d,%d] \n", resno, - (1 << volume_info->tile[0].prctsiz[0][resno]), - (1 << volume_info->tile[0].prctsiz[0][resno]), - (1 << volume_info->tile[0].prctsiz[2][resno])); /* based on tile 0 */ - } - fprintf(stream, "HEADER_END\t%d\n", volume_info->main_head_end); - fprintf(stream, "CODESTREAM\t%d\n", volume_info->codestream_size); - fprintf(stream, - "Num_tile Start_pos End_header End_pos Distotile Nbpix Ratio\n"); - for (tileno = 0; tileno < (volume_info->tw * volume_info->th * volume_info->tl); - tileno++) { - fprintf(stream, "%4d\t%9d\t%9d\t%9d\t%9e\t%9d\t%9e\n", - volume_info->tile[tileno].num_tile, - volume_info->tile[tileno].start_pos, - volume_info->tile[tileno].end_header, - volume_info->tile[tileno].end_pos, - volume_info->tile[tileno].distotile, volume_info->tile[tileno].nbpix, - volume_info->tile[tileno].distotile / volume_info->tile[tileno].nbpix); - } - - for (tileno = 0; tileno < (volume_info->tw * volume_info->th * volume_info->tl); - tileno++) { - int start_pos, end_pos; - double disto = 0; - pack_nb = 0; - if (volume_info->prog == LRCP) { /* LRCP */ - fprintf(stream, - "pack_nb tileno layno resno compno precno start_pos end_pos disto\n"); - for (layno = 0; layno < volume_info->layer; layno++) { - for (resno = 0; resno < volume_info->decomposition[0] + 1; resno++) { - for (compno = 0; compno < volume_info->comp; compno++) { - int prec_max = volume_info->tile[tileno].prctno[0][resno] * - volume_info->tile[tileno].prctno[1][resno] * - volume_info->tile[tileno].prctno[2][resno]; - for (precno = 0; precno < prec_max; precno++) { - start_pos = volume_info->tile[tileno].packet[pack_nb].start_pos; - end_pos = volume_info->tile[tileno].packet[pack_nb].end_pos; - disto = volume_info->tile[tileno].packet[pack_nb].disto; - fprintf(stream, "%4d %6d %7d %5d %6d %6d %9d %9d %8e\n", pack_nb, tileno, layno, - resno, compno, precno, start_pos, end_pos, disto); - total_disto += disto; - pack_nb++; - } - } - } - } - } /* LRCP */ - else if (volume_info->prog == RLCP) { /* RLCP */ - /* - fprintf(stream, "pack_nb tileno resno layno compno precno start_pos end_pos disto"); - */ - for (resno = 0; resno < volume_info->decomposition[0] + 1; resno++) { - for (layno = 0; layno < volume_info->layer; layno++) { - for (compno = 0; compno < volume_info->comp; compno++) { - int prec_max = volume_info->tile[tileno].prctno[0][resno] * - volume_info->tile[tileno].prctno[1][resno] * - volume_info->tile[tileno].prctno[2][resno]; - for (precno = 0; precno < prec_max; precno++) { - start_pos = volume_info->tile[tileno].packet[pack_nb].start_pos; - end_pos = volume_info->tile[tileno].packet[pack_nb].end_pos; - disto = volume_info->tile[tileno].packet[pack_nb].disto; - fprintf(stream, "%4d %6d %5d %7d %6d %6d %9d %9d %8e\n", - pack_nb, tileno, resno, layno, compno, precno, start_pos, end_pos, disto); - total_disto += disto; - pack_nb++; - } - } - } - } - } /* RLCP */ - else if (volume_info->prog == RPCL) { /* RPCL */ - /* - fprintf(stream, "\npack_nb tileno resno precno compno layno start_pos end_pos disto\n"); - */ - for (resno = 0; resno < volume_info->decomposition[0] + 1; resno++) { - /* I suppose components have same XRsiz, YRsiz */ - /*int x0 = volume_info->tile_Ox + tileno - (int)floor( (float)tileno/(float)volume_info->tw ) * volume_info->tw * volume_info->tile_x;*/ - /*int y0 = volume_info->tile_Ox + (int)floor( (float)tileno/(float)volume_info->tw ) * volume_info->tile_y;*/ - int x0 = volume_info->tile_Ox + (int)floor((float)tileno / - (float)volume_info->tw) * volume_info->tile_x; - int y0 = volume_info->tile_Oy + (int)floor((float)tileno / - (float)volume_info->th) * volume_info->tile_y; - int z0 = volume_info->tile_Ox + (int)floor((float)tileno / - (float)volume_info->tl) * volume_info->tile_z; - int x1 = x0 + volume_info->tile_x; - int y1 = y0 + volume_info->tile_y; - int z1 = z0 + volume_info->tile_z; - for (z = z0; z < z1; z++) { - for (y = y0; y < y1; y++) { - for (x = x0; x < x1; x++) { - for (compno = 0; compno < volume_info->comp; compno++) { - int prec_max = volume_info->tile[tileno].prctno[0][resno] * - volume_info->tile[tileno].prctno[1][resno] * - volume_info->tile[tileno].prctno[2][resno]; - for (precno = 0; precno < prec_max; precno++) { - int pcnx = volume_info->tile[tileno].prctno[0][resno]; - int pcx = (int) pow(2, volume_info->tile[tileno].prctsiz[0][resno] + - volume_info->decomposition[0] - resno); - int pcy = (int) pow(2, volume_info->tile[tileno].prctsiz[1][resno] + - volume_info->decomposition[1] - resno); - int pcz = (int) pow(2, volume_info->tile[tileno].prctsiz[2][resno] + - volume_info->decomposition[2] - resno); - int precno_x = precno - (int) floor((float)precno / (float)pcnx) * pcnx; - int precno_y = (int) floor((float)precno / (float)pcnx); - if (precno_y * pcy == y) { - if (precno_x * pcx == x) { - for (layno = 0; layno < volume_info->layer; layno++) { - start_pos = volume_info->tile[tileno].packet[pack_nb].start_pos; - end_pos = volume_info->tile[tileno].packet[pack_nb].end_pos; - disto = volume_info->tile[tileno].packet[pack_nb].disto; - fprintf(stream, "%4d %6d %5d %6d %6d %7d %9d %9d %8e\n", - pack_nb, tileno, resno, precno, compno, layno, start_pos, end_pos, disto); - total_disto += disto; - pack_nb++; - } - } - } - } /* precno */ - } /* compno */ - } /* x = x0..x1 */ - } /* y = y0..y1 */ - } /* z = z0..z1 */ - } /* resno */ - } /* RPCL */ - else if (volume_info->prog == PCRL) { /* PCRL */ - /* I suppose components have same XRsiz, YRsiz */ - int x0 = volume_info->tile_Ox + tileno - (int)floor((float)tileno / - (float)volume_info->tw) * volume_info->tw * volume_info->tile_x; - int y0 = volume_info->tile_Ox + (int)floor((float)tileno / - (float)volume_info->tw) * volume_info->tile_y; - int z0 = volume_info->tile_Oz + (int)floor((float)tileno / - (float)volume_info->tw) * volume_info->tile_z; - int x1 = x0 + volume_info->tile_x; - int y1 = y0 + volume_info->tile_y; - int z1 = z0 + volume_info->tile_z; - /* - fprintf(stream, "\npack_nb tileno precno compno resno layno start_pos end_pos disto\n"); - */ - for (z = z0; z < z1; z++) { - for (y = y0; y < y1; y++) { - for (x = x0; x < x1; x++) { - for (compno = 0; compno < volume_info->comp; compno++) { - for (resno = 0; resno < volume_info->decomposition[0] + 1; resno++) { - int prec_max = volume_info->tile[tileno].prctno[0][resno] * - volume_info->tile[tileno].prctno[1][resno]; - for (precno = 0; precno < prec_max; precno++) { - int pcnx = volume_info->tile[tileno].prctno[0][resno]; - int pcx = (int) pow(2, volume_info->tile[tileno].prctsiz[0][resno] + - volume_info->decomposition[0] - resno); - int pcy = (int) pow(2, volume_info->tile[tileno].prctsiz[1][resno] + - volume_info->decomposition[1] - resno); - int pcz = (int) pow(2, volume_info->tile[tileno].prctsiz[2][resno] + - volume_info->decomposition[2] - resno); - int precno_x = precno - (int) floor((float)precno / (float)pcnx) * pcnx; - int precno_y = (int) floor((float)precno / (float)pcnx); - int precno_z = (int) floor((float)precno / (float)pcnx); - if (precno_z * pcz == z) { - if (precno_y * pcy == y) { - if (precno_x * pcx == x) { - for (layno = 0; layno < volume_info->layer; layno++) { - start_pos = volume_info->tile[tileno].packet[pack_nb].start_pos; - end_pos = volume_info->tile[tileno].packet[pack_nb].end_pos; - disto = volume_info->tile[tileno].packet[pack_nb].disto; - fprintf(stream, "%4d %6d %6d %6d %5d %7d %9d %9d %8e\n", - pack_nb, tileno, precno, compno, resno, layno, start_pos, end_pos, disto); - total_disto += disto; - pack_nb++; - } - } - } - } - } /* precno */ - } /* resno */ - } /* compno */ - } /* x = x0..x1 */ - } /* y = y0..y1 */ - } - } /* PCRL */ - else { /* CPRL */ - /* - fprintf(stream, "\npack_nb tileno compno precno resno layno start_pos end_pos disto\n"); - */ - for (compno = 0; compno < volume_info->comp; compno++) { - /* I suppose components have same XRsiz, YRsiz */ - int x0 = volume_info->tile_Ox + tileno - (int)floor((float)tileno / - (float)volume_info->tw) * volume_info->tw * volume_info->tile_x; - int y0 = volume_info->tile_Ox + (int)floor((float)tileno / - (float)volume_info->tw) * volume_info->tile_y; - int z0 = volume_info->tile_Oz + (int)floor((float)tileno / - (float)volume_info->tw) * volume_info->tile_z; - int x1 = x0 + volume_info->tile_x; - int y1 = y0 + volume_info->tile_y; - int z1 = z0 + volume_info->tile_z; - for (z = z0; z < z1; z++) { - for (y = y0; y < y1; y++) { - for (x = x0; x < x1; x++) { - for (resno = 0; resno < volume_info->decomposition[0] + 1; resno++) { - int prec_max = volume_info->tile[tileno].prctno[0][resno] * - volume_info->tile[tileno].prctno[1][resno] * - volume_info->tile[tileno].prctno[2][resno]; - for (precno = 0; precno < prec_max; precno++) { - int pcnx = volume_info->tile[tileno].prctno[0][resno]; - int pcny = volume_info->tile[tileno].prctno[1][resno]; - int pcx = (int) pow(2, volume_info->tile[tileno].prctsiz[0][resno] + - volume_info->decomposition[0] - resno); - int pcy = (int) pow(2, volume_info->tile[tileno].prctsiz[1][resno] + - volume_info->decomposition[1] - resno); - int pcz = (int) pow(2, volume_info->tile[tileno].prctsiz[2][resno] + - volume_info->decomposition[2] - resno); - int precno_x = precno - (int) floor((float)precno / (float)pcnx) * pcnx; - int precno_y = (int) floor((float)precno / (float)pcnx); - int precno_z = 0; /*???*/ - if (precno_z * pcz == z) { - if (precno_y * pcy == y) { - if (precno_x * pcx == x) { - for (layno = 0; layno < volume_info->layer; layno++) { - start_pos = volume_info->tile[tileno].packet[pack_nb].start_pos; - end_pos = volume_info->tile[tileno].packet[pack_nb].end_pos; - disto = volume_info->tile[tileno].packet[pack_nb].disto; - fprintf(stream, "%4d %6d %6d %6d %5d %7d %9d %9d %8e\n", - pack_nb, tileno, compno, precno, resno, layno, start_pos, end_pos, disto); - total_disto += disto; - pack_nb++; - } - } - } - } - } /* precno */ - } /* resno */ - } /* x = x0..x1 */ - } /* y = y0..y1 */ - } /* z = z0..z1 */ - } /* comno */ - } /* CPRL */ - } /* tileno */ - - fprintf(stream, "SE_MAX\t%8e\n", volume_info->D_max); /* SE max */ - fprintf(stream, "SE_TOTAL\t%.8e\n", total_disto); /* SE totale */ - - - fclose(stream); - - return 1; -} - -bool j3d_encode(opj_j3d_t *j3d, opj_cio_t *cio, opj_volume_t *volume, - char *index) -{ - int tileno, compno; - opj_volume_info_t *volume_info = NULL; - opj_cp_t *cp = NULL; - opj_tcd_t *tcd = NULL; /* TCD component */ - - j3d->cio = cio; - j3d->volume = volume; - cp = j3d->cp; - - /*j3d_dump_volume(stdout, volume); - j3d_dump_cp(stdout, volume, cp);*/ - - /* INDEX >> */ - volume_info = j3d->volume_info; - if (volume_info && cp->index_on) { - volume_info->index_on = cp->index_on; - volume_info->tile = (opj_tile_info_t *) opj_malloc(cp->tw * cp->th * cp->tl * - sizeof(opj_tile_info_t)); - volume_info->volume_w = volume->x1 - volume->x0; - volume_info->volume_h = volume->y1 - volume->y0; - volume_info->volume_l = volume->z1 - volume->z0; - volume_info->prog = (&cp->tcps[0])->prg; - volume_info->tw = cp->tw; - volume_info->th = cp->th; - volume_info->tl = cp->tl; - volume_info->tile_x = cp->tdx; /* new version parser */ - volume_info->tile_y = cp->tdy; /* new version parser */ - volume_info->tile_z = cp->tdz; /* new version parser */ - volume_info->tile_Ox = cp->tx0; /* new version parser */ - volume_info->tile_Oy = cp->ty0; /* new version parser */ - volume_info->tile_Oz = cp->tz0; /* new version parser */ - volume_info->transform_format = cp->transform_format; - volume_info->encoding_format = cp->encoding_format; - volume_info->comp = volume->numcomps; - volume_info->layer = (&cp->tcps[0])->numlayers; - volume_info->decomposition[0] = (&cp->tcps[0])->tccps->numresolution[0] - 1; - volume_info->decomposition[1] = (&cp->tcps[0])->tccps->numresolution[1] - 1; - volume_info->decomposition[2] = (&cp->tcps[0])->tccps->numresolution[2] - 1; - volume_info->D_max = 0; /* ADD Marcela */ - } - /* << INDEX */ - - j3d_write_soc(j3d); - j3d_write_siz(j3d); - if (j3d->cinfo->codec_format == CODEC_J3D) { - j3d_write_cap(j3d); - j3d_write_nsi(j3d); - } - - /*if (j3d->cp->transform_format != TRF_2D_DWT || j3d->cp->encoding_format != ENCOD_2EB)*/ - j3d_write_com(j3d); - - j3d_write_cod(j3d); - j3d_write_qcd(j3d); - for (compno = 0; compno < volume->numcomps; compno++) { - opj_tcp_t *tcp = &cp->tcps[0]; - if (tcp->tccps[compno].roishift) { - j3d_write_rgn(j3d, compno, 0); - } - } - /*Optional 15444-2 markers*/ - if (j3d->cp->tcps->tccps[0].atk != NULL) { - j3d_write_atk(j3d); - } - if (j3d->volume->comps[0].dcoffset != 0) { - j3d_write_dco(j3d); - } - - /* INDEX >> */ - if (volume_info && volume_info->index_on) { - volume_info->main_head_end = cio_tell(cio) - 1; - } - /* << INDEX */ - - /* create the tile encoder */ - tcd = tcd_create(j3d->cinfo); - - /* encode each tile */ - for (tileno = 0; tileno < cp->tw * cp->th * cp->tl; tileno++) { - opj_event_msg(j3d->cinfo, EVT_INFO, "tile number %d / %d\n", tileno + 1, - cp->tw * cp->th * cp->tl); - - j3d->curtileno = tileno; - - /* initialisation before tile encoding */ - if (tileno == 0) { - tcd_malloc_encode(tcd, volume, cp, j3d->curtileno); - } else { - tcd_init_encode(tcd, volume, cp, j3d->curtileno); - } - - /* INDEX >> */ - if (volume_info && volume_info->index_on) { - volume_info->tile[j3d->curtileno].num_tile = j3d->curtileno; - volume_info->tile[j3d->curtileno].start_pos = cio_tell(cio) + - j3d->pos_correction; - } - /* << INDEX */ - - j3d_write_sot(j3d); - - for (compno = 1; compno < volume->numcomps; compno++) { - j3d_write_coc(j3d, compno); - j3d_write_qcc(j3d, compno); - } - - if (cp->tcps[tileno].numpocs) { - j3d_write_poc(j3d); - } - j3d_write_sod(j3d, tcd); /*--> tcd_encode_tile*/ - - /* INDEX >> */ - if (volume_info && volume_info->index_on) { - volume_info->tile[j3d->curtileno].end_pos = cio_tell(cio) + j3d->pos_correction - - 1; - } - /* << INDEX */ - } - - /* destroy the tile encoder */ - tcd_free_encode(tcd); - tcd_destroy(tcd); - - j3d_write_eoc(j3d); - - /* Creation of the index file */ - if (volume_info && volume_info->index_on) { - if (!j3d_create_index(j3d, cio, volume_info, index)) { - opj_event_msg(j3d->cinfo, EVT_ERROR, "failed to create index file %s\n", index); - return false; - } - } - - return true; -} - -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - diff --git a/src/lib/openjp3d/jp3d.h b/src/lib/openjp3d/jp3d.h deleted file mode 100644 index 2f47ffe6..00000000 --- a/src/lib/openjp3d/jp3d.h +++ /dev/null @@ -1,525 +0,0 @@ -/* - * 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, Mónica Díez García, 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 __J3D_H -#define __J3D_H -/** -@file jp3d.h -@brief The JPEG-2000 Codestream Reader/Writer (J3D) - -The functions in J3D.C have for goal to read/write the several parts of the codestream: markers and data. -*/ - -/** @defgroup J3D J3D - JPEG-2000 PART 10 codestream reader/writer */ -/*@{*/ - -#define J3D_CP_CSTY_PRT 0x01 -#define J3D_CP_CSTY_SOP 0x02 -#define J3D_CP_CSTY_EPH 0x04 -#define J3D_CCP_CSTY_PRT 0x01 -/** Table A-8 */ -#define J3D_CCP_CBLKSTY_LAZY 0x01 /* Selective arithmetic coding bypass */ -#define J3D_CCP_CBLKSTY_RESET 0x02 /* Reset context probabilities on coding pass boundaries */ -#define J3D_CCP_CBLKSTY_TERMALL 0x04 /* Termination on each coding pass */ -#define J3D_CCP_CBLKSTY_VSC 0x08 /* Vertically causal context, add also hook for switching off and on 3D context models */ -#define J3D_CCP_CBLKSTY_PTERM 0x10 /* Predictable termination */ -#define J3D_CCP_CBLKSTY_SEGSYM 0x20 /* Segmentation symbols are used */ -#define J3D_CCP_CBLKSTY_3DCTXT 0x40 /* 3D context models (3D-EBCOT) vs 2D context models */ - -#define J3D_CCP_QNTSTY_NOQNT 0 /* Quantization style : no quantization */ -#define J3D_CCP_QNTSTY_SIQNT 1 /* Quantization style : scalar derived (values signalled only in LLL subband) */ -#define J3D_CCP_QNTSTY_SEQNT 2 /* Quantization style : scalar expounded (values signalled for each subband) */ - -/* ----------------------------------------------------------------------- */ - -#define J3D_MS_SOC 0xff4f /**< SOC marker value */ -#define J3D_MS_SOT 0xff90 /**< SOT marker value */ -#define J3D_MS_SOD 0xff93 /**< SOD marker value */ -#define J3D_MS_EOC 0xffd9 /**< EOC marker value */ -#define J3D_MS_CAP 0xff50 /**< CAP marker value */ -#define J3D_MS_SIZ 0xff51 /**< SIZ marker value */ -#define J3D_MS_NSI 0xff54 /**< NSI marker value */ -#define J3D_MS_COD 0xff52 /**< COD marker value */ -#define J3D_MS_COC 0xff53 /**< COC marker value */ -#define J3D_MS_RGN 0xff5e /**< RGN marker value */ -#define J3D_MS_QCD 0xff5c /**< QCD marker value */ -#define J3D_MS_QCC 0xff5d /**< QCC marker value */ -#define J3D_MS_POC 0xff5f /**< POC marker value */ -#define J3D_MS_TLM 0xff55 /**< TLM marker value */ -#define J3D_MS_PLM 0xff57 /**< PLM marker value */ -#define J3D_MS_PLT 0xff58 /**< PLT marker value */ -#define J3D_MS_PPM 0xff60 /**< PPM marker value */ -#define J3D_MS_PPT 0xff61 /**< PPT marker value */ -#define J3D_MS_SOP 0xff91 /**< SOP marker value */ -#define J3D_MS_EPH 0xff92 /**< EPH marker value */ -#define J3D_MS_CRG 0xff63 /**< CRG marker value */ -#define J3D_MS_COM 0xff64 /**< COM marker value */ -/*15444-2*/ -#define J3D_MS_DCO 0xff70 /**< DCO marker value */ -#define J3D_MS_VMS 0xff71 /**< VMS marker value */ -#define J3D_MS_DFS 0xff72 /**< DFS marker value */ -#define J3D_MS_ADS 0xff73 /**< ADS marker value */ -#define J3D_MS_ATK 0xff79 /**< ATK marker value */ -#define J3D_MS_CBD 0xff78 /**< CBD marker value */ -#define J3D_MS_MCT 0xff74 /**< MCT marker value */ -#define J3D_MS_MCC 0xff75 /**< MCC marker value */ -#define J3D_MS_MCO 0xff77 /**< MCO marker value */ -#define J3D_MS_NLT 0xff76 /**< NLT marker value */ -#define J3D_MS_QPD 0xff5a /**< QPD marker value */ -#define J3D_MS_QPC 0xff5b /**< QPC marker value */ - -/* ----------------------------------------------------------------------- */ -/* Capability RSIZ parameter, extended */ -#define J3D_RSIZ_BASIC 0x0000 - -#define J3D_RSIZ_DCO 0x8001 /* Required */ -#define J3D_RSIZ_VSQNT 0x8002 -#define J3D_RSIZ_TCQNT 0x8004 -#define J3D_RSIZ_VMASK 0x8008 -#define J3D_RSIZ_SSOVL 0x8010 -#define J3D_RSIZ_ADECS 0x8020 -#define J3D_RSIZ_ATK 0x8040 /*Required*/ -#define J3D_RSIZ_SSYMK 0x8080 -#define J3D_RSIZ_MCT 0x8100 /*Not compatible with DCO*/ -#define J3D_RSIZ_NLT 0x8200 /*Required*/ -#define J3D_RSIZ_ASHAP 0x8400 -#define J3D_RSIZ_PRQNT 0x8800 - -#define J3D_CAP_10 0x00400000 -/* Arbitrary transformation kernel, 15444-2 */ -#define J3D_ATK_IRR 0 -#define J3D_ATK_REV 1 -#define J3D_ATK_ARB 0 -#define J3D_ATK_WS 1 -#define J3D_ATK_CON 0 -/* ----------------------------------------------------------------------- */ - -/** -Values that specify the status of the decoding process when decoding the main header. -These values may be combined with a | operator. -*/ -typedef enum J3D_STATUS { - /**< a SOC marker is expected */ - J3D_STATE_MHSOC = 0x0001, - /**< a SIZ marker is expected */ - J3D_STATE_MHSIZ = 0x0002, - /**< the decoding process is in the main header */ - J3D_STATE_MH = 0x0004, - /**< the decoding process is in a tile part header and expects a SOT marker */ - J3D_STATE_TPHSOT = 0x0008, - /**< the decoding process is in a tile part header */ - J3D_STATE_TPH = 0x0010, - /**< the EOC marker has just been read */ - J3D_STATE_MT = 0x0020, - /**< the decoding process must not expect a EOC marker because the codestream is truncated */ - J3D_STATE_NEOC = 0x0040 -} J3D_STATUS; - - - -/** -Arbitrary transformation kernel -*/ -typedef struct opj_atk { - /** index of wavelet kernel */ - int index; - /** Numerical type of scaling factor and lifting step parameters */ - int coeff_typ; - /** Wavelet filter category */ - int filt_cat; - /** Wavelet transformation type (REV/IRR) */ - int wt_typ; - /** Initial odd/even subsequence */ - int minit; - /** Boundary extension method (constant CON / whole-sample symmetric WS) */ - int exten; - /** Scaling factor. Only for wt_typ=IRR */ - double Katk; - /** Number of lifting steps */ - int Natk; - /** Offset for lifting step s. Only for filt_cat=ARB */ - int Oatk[256]; - /** Base 2 scaling exponent for lifting step s. Only for wt_typ=REV */ - int Eatk[256]; - /** Additive residue for lifting step s. Only for wt_typ=REV */ - int Batk[256]; - /** Number of lifting coefficients signaled for lifting step s */ - int LCatk[256]; - /** Lifting coefficient k for lifting step s */ - double Aatk[256][256]; -} opj_atk_t; - - -/** -Quantization stepsize -*/ -typedef struct opj_stepsize { - /** exponent */ - int expn; - /** mantissa */ - int mant; -} opj_stepsize_t; - -/** -Tile-component coding parameters -*/ -typedef struct opj_tccp { - /** coding style */ - int csty; - /** number of resolutions of x, y and z-axis */ - int numresolution[3]; - /** code-blocks width height & depth*/ - int cblk[3]; - /** code-block coding style */ - int cblksty; - /** 0: no ATK (only 9-7 or 5-3) 1: ATK defined WT*/ - int atk_wt[3]; - /** Arbitrary transformation kernel (15444-2)*/ - opj_atk_t *atk; - /** DWT identifier for x, y and z-axis (0:WT9-7 1:WT5-3 >1:WT-atk->index) */ - int dwtid[3]; - /** reversible/irreversible wavelet transfomation (0:irrev 1:reversible)*/ - int reversible; - /** quantisation style */ - int qntsty; - /** stepsizes used for quantization */ - opj_stepsize_t stepsizes[J3D_MAXBANDS]; - /** number of guard bits. Table A28 de 15444-1*/ - int numgbits; - /** Region Of Interest shift */ - int roishift; - /** precinct width height & depth*/ - int prctsiz[3][J3D_MAXRLVLS]; -} opj_tccp_t; - -/** -Tile coding parameters : coding/decoding parameters common to all tiles -(information like COD, COC in main header) -*/ -typedef struct opj_tcp { - /** 1 : first part-tile of a tile */ - int first; - /** coding style */ - int csty; - /** progression order */ - OPJ_PROG_ORDER prg; - /** number of layers */ - int numlayers; - /** multi-component transform identifier */ - int mct; - /** rates of layers */ - float rates[100]; - /** number of progression order changes */ - int numpocs; - /** indicates if a POC marker has been used O:NO, 1:YES */ - int POC; - /** progression order changes */ - opj_poc_t pocs[J3D_MAXRLVLS - 1]; - /** add fixed_quality */ - float distoratio[100]; - /** tile-component coding parameters */ - opj_tccp_t *tccps; - /** packet header store there for futur use in t2_decode_packet */ - unsigned char *ppt_data; - /** pointer remaining on the first byte of the first header if ppt is used */ - unsigned char *ppt_data_first; - /** If ppt == 1 --> there was a PPT marker for the present tile */ - int ppt; - /** used in case of multiple marker PPT (number of info already stored) */ - int ppt_store; - int ppt_len; -} opj_tcp_t; - -/** -Coding parameters -*/ -typedef struct opj_cp { - /** transform format 0: 2DWT, 1: 2D1P, 2: 3DWT, 3: 3RLS */ - OPJ_TRANSFORM transform_format; - /** entropy coding format 0: 2EB, 1: 3EB, 2: 2GR, 3: 3GR, 4: GRI*/ - OPJ_ENTROPY_CODING encoding_format; - /** allocation by rate/distortion */ - int disto_alloc; - /** allocation by fixed layer */ - int fixed_alloc; - /** add fixed_quality */ - int fixed_quality; - /** Rsiz: capabilities */ - int rsiz; - /** if != 0, then original dimension divided by 2^(reduce); if == 0 or not used, volume is decoded to the full resolution */ - int reduce[3]; - /** if != 0, then only the first "layer" layers are decoded; if == 0 or not used, all the quality layers are decoded */ - int layer; - /** 0 = no index || 1 = index */ - int index_on; - /** Big-Endian/Little-endian order */ - int bigendian; - /** XTOsiz */ - int tx0; - /** YTOsiz */ - int ty0; - /** ZTOsiz */ - int tz0; - /** XTsiz */ - int tdx; - /** YTsiz */ - int tdy; - /** ZTsiz */ - int tdz; - /** comment for coding */ - char *comment; - /** number of tiles in width, height and depth */ - int tw; - int th; - int tl; - /** ID number of the tiles present in the codestream */ - int *tileno; - /** size of the vector tileno */ - int tileno_size; - /** tile coding parameters */ - opj_tcp_t *tcps; - /** fixed layer */ - int *matrice; - - /** packet header store there for futur use in t2_decode_packet */ - unsigned char *ppm_data; - /** pointer remaining on the first byte of the first header if ppm is used */ - unsigned char *ppm_data_first; - /** if ppm == 1 --> there was a PPM marker for the present tile */ - int ppm; - /** use in case of multiple marker PPM (number of info already store) */ - int ppm_store; - /** use in case of multiple marker PPM (case on non-finished previous info) */ - int ppm_previous; - int ppm_len; -} opj_cp_t; - -/** -Information concerning a packet inside tile -*/ -typedef struct opj_packet_info { - /** start position */ - int start_pos; - /** end position */ - int end_pos; - /** distorsion introduced */ - double disto; -} opj_packet_info_t; - -/** -Index structure : information regarding tiles inside volume -*/ -typedef struct opj_tile_info { - /** value of thresh for each layer by tile cfr. Marcela */ - double *thresh; - /** number of tile */ - int num_tile; - /** start position */ - int start_pos; - /** end position of the header */ - int end_header; - /** end position */ - int end_pos; - /** precinct number for each resolution level (width, height and depth) */ - int prctno[3][J3D_MAXRLVLS]; - /** precinct size (in power of 2), in X for each resolution level */ - int prctsiz[3][J3D_MAXRLVLS]; - /** information concerning packets inside tile */ - opj_packet_info_t *packet; - - /** add fixed_quality */ - int nbpix; - /** add fixed_quality */ - double distotile; -} opj_tile_info_t; - -/** -Index structure -*/ -typedef struct opj_volume_info { - - /** transform format 0: 2DWT, 1: 2D1P, 2: 3DWT, 3: 3RLS */ - OPJ_TRANSFORM transform_format; - /** output file format 0: 2EB, 1: 3EB, 2: 2GR, 3: 3GR, 4: GRI*/ - OPJ_ENTROPY_CODING encoding_format; /** 0 = no index || 1 = index */ - int index_on; - /** 0 = wt 9-7 || 1 = wt 5-3 || >=2 wt atk defined */ - int dwtid[3]; - /** maximum distortion reduction on the whole volume (add for Marcela) */ - double D_max; - /** packet number */ - int num; - /** writing the packet in the index with t2_encode_packets */ - int index_write; - /** volume width, height and depth */ - int volume_w; - int volume_h; - int volume_l; - /** progression order */ - OPJ_PROG_ORDER prog; - /** tile size in x, y and z */ - int tile_x; - int tile_y; - int tile_z; - /** tile origin in x, y and z */ - int tile_Ox; - int tile_Oy; - int tile_Oz; - /** number of tiles in X, Y and Z */ - int tw; - int th; - int tl; - /** component numbers */ - int comp; - /** number of layer */ - int layer; - /** number of decomposition in X, Y and Z*/ - int decomposition[3]; - /** DC offset (15444-2) */ - int dcoffset; - /** main header position */ - int main_head_end; - /** codestream's size */ - int codestream_size; - /** information regarding tiles inside volume */ - opj_tile_info_t *tile; -} opj_volume_info_t; - -/** -JPEG-2000 codestream reader/writer -*/ -typedef struct opj_j3d { - /** codec context */ - opj_common_ptr cinfo; - /** locate in which part of the codestream the decoder is (main header, tile header, end) */ - int state; - /** number of the tile currently concern by coding/decoding */ - int curtileno; - /** locate the position of the end of the tile in the codestream, used to detect a truncated codestream (in j3d_read_sod) */ - unsigned char *eot; - /** locate the start position of the SOT marker of the current coded tile: */ - int sot_start; - /* after encoding the tile, a jump (in j3d_write_sod) is done to the SOT marker to store the value of its length. */ - int sod_start; - /** as the J3D-file is written in several parts during encoding, it enables to make the right correction in position return by cio_tell */ - int pos_correction; - /** array used to store the data of each tile */ - unsigned char **tile_data; - /** array used to store the length of each tile */ - int *tile_len; - - /** decompression only : store decoding parameters common to all tiles */ - opj_tcp_t *default_tcp; - /** pointer to the encoded / decoded volume */ - opj_volume_t *volume; - /** pointer to the coding parameters */ - opj_cp_t *cp; - /** helper used to write the index file */ - opj_volume_info_t *volume_info; - /** pointer to the byte i/o stream */ - opj_cio_t *cio; -} opj_j3d_t; - -/** @name Funciones generales */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Creates a J3D decompression structure -@param cinfo Codec context info -@return Returns a handle to a J3D decompressor if successful, returns NULL otherwise -*/ -opj_j3d_t* j3d_create_decompress(opj_common_ptr cinfo); -/** -Destroy a J3D decompressor handle -@param j3d J3D decompressor handle to destroy -*/ -void j3d_destroy_decompress(opj_j3d_t *j3d); -/** -Setup the decoder decoding parameters using user parameters. -Decoding parameters are returned in j3d->cp. -@param j3d J3D decompressor handle -@param parameters decompression parameters -*/ -void j3d_setup_decoder(opj_j3d_t *j3d, opj_dparameters_t *parameters); -/** -Decode an volume from a JPEG-2000 codestream -@param j3d J3D decompressor handle -@param cio Input buffer stream -@return Returns a decoded volume if successful, returns NULL otherwise -*/ -opj_volume_t* j3d_decode(opj_j3d_t *j3d, opj_cio_t *cio); -/** -Decode an volume form a JPT-stream (JPEG 2000, JPIP) -@param j3d J3D decompressor handle -@param cio Input buffer stream -@return Returns a decoded volume if successful, returns NULL otherwise -*/ -opj_volume_t* j3d_decode_jpt_stream(opj_j3d_t *j3d, opj_cio_t *cio); -/** -Creates a J3D compression structure -@param cinfo Codec context info -@return Returns a handle to a J3D compressor if successful, returns NULL otherwise -*/ -opj_j3d_t* j3d_create_compress(opj_common_ptr cinfo); -/** -Destroy a J3D compressor handle -@param j3d J3D compressor handle to destroy -*/ -void j3d_destroy_compress(opj_j3d_t *j3d); -/** -Setup the encoder parameters using the current volume and using user parameters. -Coding parameters are returned in j3d->cp. -@param j3d J3D compressor handle -@param parameters compression parameters -@param volume input filled volume -*/ -void j3d_setup_encoder(opj_j3d_t *j3d, opj_cparameters_t *parameters, - opj_volume_t *volume); -/** -Encode an volume into a JPEG-2000 codestream -@param j3d J3D compressor handle -@param cio Output buffer stream -@param volume Volume to encode -@param index Name of the index file if required, NULL otherwise -@return Returns true if successful, returns false otherwise -*/ -bool j3d_encode(opj_j3d_t *j3d, opj_cio_t *cio, opj_volume_t *volume, - char *index); -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __J3D_H */ diff --git a/src/lib/openjp3d/jp3d_lib.c b/src/lib/openjp3d/jp3d_lib.c deleted file mode 100644 index bccb3fbc..00000000 --- a/src/lib/openjp3d/jp3d_lib.c +++ /dev/null @@ -1,85 +0,0 @@ -/* - * 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) 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. - */ - -#ifdef _WIN32 -#include -#else -#include -#include -#include -#endif /* _WIN32 */ -#include "opj_includes.h" - -double opj_clock() -{ -#ifdef _WIN32 - /* WIN32: use QueryPerformance (very accurate) */ - LARGE_INTEGER freq, t ; - /* freq is the clock speed of the CPU */ - QueryPerformanceFrequency(&freq) ; - /* cout << "freq = " << ((double) freq.QuadPart) << endl; */ - /* t is the high resolution performance counter (see MSDN) */ - QueryPerformanceCounter(& t) ; - return (t.QuadPart / (double) freq.QuadPart) ; -#else - /* Unix or Linux: use resource usage */ - struct rusage t; - double procTime; - /* (1) Get the rusage data structure at this moment (man getrusage) */ - getrusage(0, &t); - /* (2) What is the elapsed time ? - CPU time = User time + System time */ - /* (2a) Get the seconds */ - procTime = t.ru_utime.tv_sec + t.ru_stime.tv_sec; - /* (2b) More precisely! Get the microseconds part ! */ - return (procTime + (t.ru_utime.tv_usec + t.ru_stime.tv_usec) * 1e-6) ; -#endif /* _WIN32 */ -} - -void* opj_malloc(size_t size) -{ - void *memblock = malloc(size); - if (memblock) { - memset(memblock, 0, size); - } - return memblock; -} - -void* opj_realloc(void *memblock, size_t size) -{ - return realloc(memblock, size); -} - -void opj_free(void *memblock) -{ - free(memblock); -} - - diff --git a/src/lib/openjp3d/jp3d_lib.h b/src/lib/openjp3d/jp3d_lib.h deleted file mode 100644 index 3ca1cca6..00000000 --- a/src/lib/openjp3d/jp3d_lib.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * 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) 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 __J3D_LIB_H -#define __J3D_LIB_H -/** -@file jp3d_lib.h -@brief Internal functions - -The functions in JP3D_LIB.C are internal utilities mainly used for memory management. -*/ - -/** @defgroup MISC MISC - Miscellaneous internal functions */ -/*@{*/ - -/** @name Funciones generales */ -/*@{*/ -/* ----------------------------------------------------------------------- */ - -/** -Difference in successive opj_clock() calls tells you the elapsed time -@return Returns time in seconds -*/ -double opj_clock(void); - -/** -Allocate a memory block with elements initialized to 0 -@param size Bytes to allocate -@return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available -*/ -void* opj_malloc(size_t size); - -/** -Reallocate memory blocks. -@param memblock Pointer to previously allocated memory block -@param size New size in bytes -@return Returns a void pointer to the reallocated (and possibly moved) memory block -*/ -void* opj_realloc(void *memblock, size_t size); - -/** -Deallocates or frees a memory block. -@param memblock Previously allocated memory block to be freed -*/ -void opj_free(void *memblock); - -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __J3D_LIB_H */ - diff --git a/src/lib/openjp3d/libopenjp3d.pc.cmake.in b/src/lib/openjp3d/libopenjp3d.pc.cmake.in deleted file mode 100644 index e9b6c404..00000000 --- a/src/lib/openjp3d/libopenjp3d.pc.cmake.in +++ /dev/null @@ -1,14 +0,0 @@ -prefix=@CMAKE_INSTALL_PREFIX@ -bindir=${prefix}/@OPENJPEG_INSTALL_BIN_DIR@ -mandir=${prefix}/@OPENJPEG_INSTALL_MAN_DIR@ -docdir=${prefix}/@OPENJPEG_INSTALL_DOC_DIR@ -libdir=${prefix}/@OPENJPEG_INSTALL_LIB_DIR@ -includedir=${prefix}/@OPENJPEG_INSTALL_INCLUDE_DIR@ - -Name: openjp3d -Description: JPEG2000 Extensions for three-dimensional data (Part 10) -URL: http://www.openjpeg.org/ -Version: @OPENJPEG_VERSION@ -Libs: -L${libdir} -lopenjp3d -Libs.private: -lm -Cflags: -I${includedir} diff --git a/src/lib/openjp3d/mct.c b/src/lib/openjp3d/mct.c deleted file mode 100644 index 9acca193..00000000 --- a/src/lib/openjp3d/mct.c +++ /dev/null @@ -1,142 +0,0 @@ -/* - * 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 - * 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_includes.h" - -/* */ -/* This table contains the norms of the basis function of the reversible MCT. */ -/* */ -static const double mct_norms[3] = { 1.732, .8292, .8292 }; - -/* */ -/* This table contains the norms of the basis function of the irreversible MCT. */ -/* */ -static const double mct_norms_real[3] = { 1.732, 1.805, 1.573 }; - -/* */ -/* Forward reversible MCT. */ -/* */ -void mct_encode(int *c0, int *c1, int *c2, int n) -{ - int i; - for (i = 0; i < n; i++) { - int r, g, b, y, u, v; - r = c0[i]; - g = c1[i]; - b = c2[i]; - y = (r + (g << 1) + b) >> 2; - u = b - g; - v = r - g; - c0[i] = y; - c1[i] = u; - c2[i] = v; - } -} - -/* */ -/* Inverse reversible MCT. */ -/* */ -void mct_decode(int *c0, int *c1, int *c2, int n) -{ - int i; - for (i = 0; i < n; i++) { - int y, u, v, r, g, b; - y = c0[i]; - u = c1[i]; - v = c2[i]; - g = y - ((u + v) >> 2); - r = v + g; - b = u + g; - c0[i] = r; - c1[i] = g; - c2[i] = b; - } -} - -/* */ -/* Get norm of basis function of reversible MCT. */ -/* */ -double mct_getnorm(int compno) -{ - return mct_norms[compno]; -} - -/* */ -/* Forward irreversible MCT. */ -/* */ -void mct_encode_real(int *c0, int *c1, int *c2, int n) -{ - int i; - for (i = 0; i < n; i++) { - int r, g, b, y, u, v; - r = c0[i]; - g = c1[i]; - b = c2[i]; - y = fix_mul(r, 2449) + fix_mul(g, 4809) + fix_mul(b, 934); - u = -fix_mul(r, 1382) - fix_mul(g, 2714) + fix_mul(b, 4096); - v = fix_mul(r, 4096) - fix_mul(g, 3430) - fix_mul(b, 666); - c0[i] = y; - c1[i] = u; - c2[i] = v; - } -} - -/* */ -/* Inverse irreversible MCT. */ -/* */ -void mct_decode_real(int *c0, int *c1, int *c2, int n) -{ - int i; - for (i = 0; i < n; i++) { - int y, u, v, r, g, b; - y = c0[i]; - u = c1[i]; - v = c2[i]; - r = y + fix_mul(v, 11485); - g = y - fix_mul(u, 2819) - fix_mul(v, 5850); - b = y + fix_mul(u, 14516); - c0[i] = r; - c1[i] = g; - c2[i] = b; - } -} - -/* */ -/* Get norm of basis function of irreversible MCT. */ -/* */ -double mct_getnorm_real(int compno) -{ - return mct_norms_real[compno]; -} diff --git a/src/lib/openjp3d/mct.h b/src/lib/openjp3d/mct.h deleted file mode 100644 index 24463d4a..00000000 --- a/src/lib/openjp3d/mct.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - * 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 - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __MCT_H -#define __MCT_H -/** -@file mct.h -@brief Implementation of a multi-component transforms (MCT) - -The functions in MCT.C have for goal to realize reversible and irreversible multicomponent -transform. The functions in MCT.C are used by some function in TCD.C. -*/ - -/** @defgroup MCT MCT - Implementation of a multi-component transform */ -/*@{*/ - -/** @name Funciones generales */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Apply a reversible multi-component transform to an image -@param c0 Samples for red component -@param c1 Samples for green component -@param c2 Samples blue component -@param n Number of samples for each component -*/ -void mct_encode(int *c0, int *c1, int *c2, int n); -/** -Apply a reversible multi-component inverse transform to an image -@param c0 Samples for luminance component -@param c1 Samples for red chrominance component -@param c2 Samples for blue chrominance component -@param n Number of samples for each component -*/ -void mct_decode(int *c0, int *c1, int *c2, int n); -/** -Get norm of the basis function used for the reversible multi-component transform -@param compno Number of the component (0->Y, 1->U, 2->V) -@return -*/ -double mct_getnorm(int compno); - -/** -Apply an irreversible multi-component transform to an image -@param c0 Samples for red component -@param c1 Samples for green component -@param c2 Samples blue component -@param n Number of samples for each component -*/ -void mct_encode_real(int *c0, int *c1, int *c2, int n); -/** -Apply an irreversible multi-component inverse transform to an image -@param c0 Samples for luminance component -@param c1 Samples for red chrominance component -@param c2 Samples for blue chrominance component -@param n Number of samples for each component -*/ -void mct_decode_real(int *c0, int *c1, int *c2, int n); -/** -Get norm of the basis function used for the irreversible multi-component transform -@param compno Number of the component (0->Y, 1->U, 2->V) -@return -*/ -double mct_getnorm_real(int compno); -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __MCT_H */ diff --git a/src/lib/openjp3d/mqc.c b/src/lib/openjp3d/mqc.c deleted file mode 100644 index f23c0261..00000000 --- a/src/lib/openjp3d/mqc.c +++ /dev/null @@ -1,585 +0,0 @@ -/* - * 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 - * 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_includes.h" - -/** @defgroup MQC MQC - Implementation of an MQ-Coder */ -/*@{*/ - -/** @name Local static functions */ -/*@{*/ - -/** -Output a byte, doing bit-stuffing if necessary. -After a 0xff byte, the next byte must be smaller than 0x90. -@param mqc MQC handle -*/ -static void mqc_byteout(opj_mqc_t *mqc); -/** -Renormalize mqc->a and mqc->c while encoding, so that mqc->a stays between 0x8000 and 0x10000 -@param mqc MQC handle -*/ -static void mqc_renorme(opj_mqc_t *mqc); -/** -Encode the most probable symbol -@param mqc MQC handle -*/ -static void mqc_codemps(opj_mqc_t *mqc); -/** -Encode the most least symbol -@param mqc MQC handle -*/ -static void mqc_codelps(opj_mqc_t *mqc); -/** -Fill mqc->c with 1's for flushing -@param mqc MQC handle -*/ -static void mqc_setbits(opj_mqc_t *mqc); -/** -Exchange MPS with LPS -@param mqc MQC handle -@return -*/ -static int mqc_mpsexchange(opj_mqc_t *mqc); -/** -Exchange LPS with MPS -@param mqc MQC handle -@return -*/ -static int mqc_lpsexchange(opj_mqc_t *mqc); -/** -Input a byte -@param mqc MQC handle -*/ -static void mqc_bytein(opj_mqc_t *mqc); -/** -Renormalize mqc->a and mqc->c while decoding -@param mqc MQC handle -*/ -static void mqc_renormd(opj_mqc_t *mqc); - -/*@}*/ - -/*@}*/ - -/* */ -/* This array defines all the possible states for a context. */ -/* */ -static opj_mqc_state_t mqc_states[47 * 2] = { - {0x5601, 0, &mqc_states[2], &mqc_states[3]}, - {0x5601, 1, &mqc_states[3], &mqc_states[2]}, - {0x3401, 0, &mqc_states[4], &mqc_states[12]}, - {0x3401, 1, &mqc_states[5], &mqc_states[13]}, - {0x1801, 0, &mqc_states[6], &mqc_states[18]}, - {0x1801, 1, &mqc_states[7], &mqc_states[19]}, - {0x0ac1, 0, &mqc_states[8], &mqc_states[24]}, - {0x0ac1, 1, &mqc_states[9], &mqc_states[25]}, - {0x0521, 0, &mqc_states[10], &mqc_states[58]}, - {0x0521, 1, &mqc_states[11], &mqc_states[59]}, - {0x0221, 0, &mqc_states[76], &mqc_states[66]}, - {0x0221, 1, &mqc_states[77], &mqc_states[67]}, - {0x5601, 0, &mqc_states[14], &mqc_states[13]}, - {0x5601, 1, &mqc_states[15], &mqc_states[12]}, - {0x5401, 0, &mqc_states[16], &mqc_states[28]}, - {0x5401, 1, &mqc_states[17], &mqc_states[29]}, - {0x4801, 0, &mqc_states[18], &mqc_states[28]}, - {0x4801, 1, &mqc_states[19], &mqc_states[29]}, - {0x3801, 0, &mqc_states[20], &mqc_states[28]}, - {0x3801, 1, &mqc_states[21], &mqc_states[29]}, - {0x3001, 0, &mqc_states[22], &mqc_states[34]}, - {0x3001, 1, &mqc_states[23], &mqc_states[35]}, - {0x2401, 0, &mqc_states[24], &mqc_states[36]}, - {0x2401, 1, &mqc_states[25], &mqc_states[37]}, - {0x1c01, 0, &mqc_states[26], &mqc_states[40]}, - {0x1c01, 1, &mqc_states[27], &mqc_states[41]}, - {0x1601, 0, &mqc_states[58], &mqc_states[42]}, - {0x1601, 1, &mqc_states[59], &mqc_states[43]}, - {0x5601, 0, &mqc_states[30], &mqc_states[29]}, - {0x5601, 1, &mqc_states[31], &mqc_states[28]}, - {0x5401, 0, &mqc_states[32], &mqc_states[28]}, - {0x5401, 1, &mqc_states[33], &mqc_states[29]}, - {0x5101, 0, &mqc_states[34], &mqc_states[30]}, - {0x5101, 1, &mqc_states[35], &mqc_states[31]}, - {0x4801, 0, &mqc_states[36], &mqc_states[32]}, - {0x4801, 1, &mqc_states[37], &mqc_states[33]}, - {0x3801, 0, &mqc_states[38], &mqc_states[34]}, - {0x3801, 1, &mqc_states[39], &mqc_states[35]}, - {0x3401, 0, &mqc_states[40], &mqc_states[36]}, - {0x3401, 1, &mqc_states[41], &mqc_states[37]}, - {0x3001, 0, &mqc_states[42], &mqc_states[38]}, - {0x3001, 1, &mqc_states[43], &mqc_states[39]}, - {0x2801, 0, &mqc_states[44], &mqc_states[38]}, - {0x2801, 1, &mqc_states[45], &mqc_states[39]}, - {0x2401, 0, &mqc_states[46], &mqc_states[40]}, - {0x2401, 1, &mqc_states[47], &mqc_states[41]}, - {0x2201, 0, &mqc_states[48], &mqc_states[42]}, - {0x2201, 1, &mqc_states[49], &mqc_states[43]}, - {0x1c01, 0, &mqc_states[50], &mqc_states[44]}, - {0x1c01, 1, &mqc_states[51], &mqc_states[45]}, - {0x1801, 0, &mqc_states[52], &mqc_states[46]}, - {0x1801, 1, &mqc_states[53], &mqc_states[47]}, - {0x1601, 0, &mqc_states[54], &mqc_states[48]}, - {0x1601, 1, &mqc_states[55], &mqc_states[49]}, - {0x1401, 0, &mqc_states[56], &mqc_states[50]}, - {0x1401, 1, &mqc_states[57], &mqc_states[51]}, - {0x1201, 0, &mqc_states[58], &mqc_states[52]}, - {0x1201, 1, &mqc_states[59], &mqc_states[53]}, - {0x1101, 0, &mqc_states[60], &mqc_states[54]}, - {0x1101, 1, &mqc_states[61], &mqc_states[55]}, - {0x0ac1, 0, &mqc_states[62], &mqc_states[56]}, - {0x0ac1, 1, &mqc_states[63], &mqc_states[57]}, - {0x09c1, 0, &mqc_states[64], &mqc_states[58]}, - {0x09c1, 1, &mqc_states[65], &mqc_states[59]}, - {0x08a1, 0, &mqc_states[66], &mqc_states[60]}, - {0x08a1, 1, &mqc_states[67], &mqc_states[61]}, - {0x0521, 0, &mqc_states[68], &mqc_states[62]}, - {0x0521, 1, &mqc_states[69], &mqc_states[63]}, - {0x0441, 0, &mqc_states[70], &mqc_states[64]}, - {0x0441, 1, &mqc_states[71], &mqc_states[65]}, - {0x02a1, 0, &mqc_states[72], &mqc_states[66]}, - {0x02a1, 1, &mqc_states[73], &mqc_states[67]}, - {0x0221, 0, &mqc_states[74], &mqc_states[68]}, - {0x0221, 1, &mqc_states[75], &mqc_states[69]}, - {0x0141, 0, &mqc_states[76], &mqc_states[70]}, - {0x0141, 1, &mqc_states[77], &mqc_states[71]}, - {0x0111, 0, &mqc_states[78], &mqc_states[72]}, - {0x0111, 1, &mqc_states[79], &mqc_states[73]}, - {0x0085, 0, &mqc_states[80], &mqc_states[74]}, - {0x0085, 1, &mqc_states[81], &mqc_states[75]}, - {0x0049, 0, &mqc_states[82], &mqc_states[76]}, - {0x0049, 1, &mqc_states[83], &mqc_states[77]}, - {0x0025, 0, &mqc_states[84], &mqc_states[78]}, - {0x0025, 1, &mqc_states[85], &mqc_states[79]}, - {0x0015, 0, &mqc_states[86], &mqc_states[80]}, - {0x0015, 1, &mqc_states[87], &mqc_states[81]}, - {0x0009, 0, &mqc_states[88], &mqc_states[82]}, - {0x0009, 1, &mqc_states[89], &mqc_states[83]}, - {0x0005, 0, &mqc_states[90], &mqc_states[84]}, - {0x0005, 1, &mqc_states[91], &mqc_states[85]}, - {0x0001, 0, &mqc_states[90], &mqc_states[86]}, - {0x0001, 1, &mqc_states[91], &mqc_states[87]}, - {0x5601, 0, &mqc_states[92], &mqc_states[92]}, - {0x5601, 1, &mqc_states[93], &mqc_states[93]}, -}; - -/* -========================================================== - local functions -========================================================== -*/ - -static void mqc_byteout(opj_mqc_t *mqc) -{ - if (*mqc->bp == 0xff) { - mqc->bp++; - *mqc->bp = mqc->c >> 20; - mqc->c &= 0xfffff; - mqc->ct = 7; - } else { - if ((mqc->c & 0x8000000) == 0) { /* ((mqc->c&0x8000000)==0) CHANGE */ - mqc->bp++; - *mqc->bp = mqc->c >> 19; - mqc->c &= 0x7ffff; - mqc->ct = 8; - } else { - (*mqc->bp)++; - if (*mqc->bp == 0xff) { - mqc->c &= 0x7ffffff; - mqc->bp++; - *mqc->bp = mqc->c >> 20; - mqc->c &= 0xfffff; - mqc->ct = 7; - } else { - mqc->bp++; - *mqc->bp = mqc->c >> 19; - mqc->c &= 0x7ffff; - mqc->ct = 8; - } - } - } -} - -static void mqc_renorme(opj_mqc_t *mqc) -{ - do { - mqc->a <<= 1; - mqc->c <<= 1; - mqc->ct--; - if (mqc->ct == 0) { - mqc_byteout(mqc); - } - } while ((mqc->a & 0x8000) == 0); -} - -static void mqc_codemps(opj_mqc_t *mqc) -{ - mqc->a -= (*mqc->curctx)->qeval; - if ((mqc->a & 0x8000) == 0) { - if (mqc->a < (*mqc->curctx)->qeval) { - mqc->a = (*mqc->curctx)->qeval; - } else { - mqc->c += (*mqc->curctx)->qeval; - } - *mqc->curctx = (*mqc->curctx)->nmps; - mqc_renorme(mqc); - } else { - mqc->c += (*mqc->curctx)->qeval; - } -} - -static void mqc_codelps(opj_mqc_t *mqc) -{ - mqc->a -= (*mqc->curctx)->qeval; - if (mqc->a < (*mqc->curctx)->qeval) { - mqc->c += (*mqc->curctx)->qeval; - } else { - mqc->a = (*mqc->curctx)->qeval; - } - *mqc->curctx = (*mqc->curctx)->nlps; - mqc_renorme(mqc); -} - -static void mqc_setbits(opj_mqc_t *mqc) -{ - unsigned int tempc = mqc->c + mqc->a; - mqc->c |= 0xffff; - if (mqc->c >= tempc) { - mqc->c -= 0x8000; - } -} - -static int mqc_mpsexchange(opj_mqc_t *mqc) -{ - int d; - if (mqc->a < (*mqc->curctx)->qeval) { - d = 1 - (*mqc->curctx)->mps; - *mqc->curctx = (*mqc->curctx)->nlps; - } else { - d = (*mqc->curctx)->mps; - *mqc->curctx = (*mqc->curctx)->nmps; - } - - return d; -} - -static int mqc_lpsexchange(opj_mqc_t *mqc) -{ - int d; - if (mqc->a < (*mqc->curctx)->qeval) { - mqc->a = (*mqc->curctx)->qeval; - d = (*mqc->curctx)->mps; - *mqc->curctx = (*mqc->curctx)->nmps; - } else { - mqc->a = (*mqc->curctx)->qeval; - d = 1 - (*mqc->curctx)->mps; - *mqc->curctx = (*mqc->curctx)->nlps; - } - - return d; -} - -static void mqc_bytein(opj_mqc_t *mqc) -{ - if (mqc->bp != mqc->end) { - unsigned int c; - if (mqc->bp + 1 != mqc->end) { - c = *(mqc->bp + 1); - } else { - c = 0xff; - } - if (*mqc->bp == 0xff) { - if (c > 0x8f) { - mqc->c += 0xff00; - mqc->ct = 8; - } else { - mqc->bp++; - mqc->c += c << 9; - mqc->ct = 7; - } - } else { - mqc->bp++; - mqc->c += c << 8; - mqc->ct = 8; - } - } else { - mqc->c += 0xff00; - mqc->ct = 8; - } -} - -static void mqc_renormd(opj_mqc_t *mqc) -{ - do { - if (mqc->ct == 0) { - mqc_bytein(mqc); - } - mqc->a <<= 1; - mqc->c <<= 1; - mqc->ct--; - } while (mqc->a < 0x8000); -} - -/* -========================================================== - MQ-Coder interface -========================================================== -*/ - -opj_mqc_t* mqc_create() -{ - opj_mqc_t *mqc = (opj_mqc_t*)opj_malloc(sizeof(opj_mqc_t)); - return mqc; -} - -void mqc_destroy(opj_mqc_t *mqc) -{ - if (mqc) { - opj_free(mqc); - } -} - -int mqc_numbytes(opj_mqc_t *mqc) -{ - return mqc->bp - mqc->start; -} - -void mqc_init_enc(opj_mqc_t *mqc, unsigned char *bp) -{ - mqc_setcurctx(mqc, 0); - mqc->a = 0x8000; - mqc->c = 0; - mqc->bp = bp - 1; - mqc->ct = 12; - if (*mqc->bp == 0xff) { - mqc->ct = 13; - } - mqc->start = bp; -} - -void mqc_setcurctx(opj_mqc_t *mqc, int ctxno) -{ - mqc->curctx = &mqc->ctxs[ctxno]; -} - -void mqc_encode(opj_mqc_t *mqc, int d) -{ - if ((*mqc->curctx)->mps == d) { - mqc_codemps(mqc); - } else { - mqc_codelps(mqc); - } -} - -void mqc_flush(opj_mqc_t *mqc) -{ - mqc_setbits(mqc); - mqc->c <<= mqc->ct; - mqc_byteout(mqc); - mqc->c <<= mqc->ct; - mqc_byteout(mqc); - - if (*mqc->bp != 0xff) { - mqc->bp++; - } -} - -void mqc_bypass_init_enc(opj_mqc_t *mqc) -{ - mqc->c = 0; - mqc->ct = 8; - /*if (*mqc->bp == 0xff) { - mqc->ct = 7; - } */ -} - -void mqc_bypass_enc(opj_mqc_t *mqc, int d) -{ - mqc->ct--; - mqc->c = mqc->c + (d << mqc->ct); - if (mqc->ct == 0) { - mqc->bp++; - *mqc->bp = mqc->c; - mqc->ct = 8; - if (*mqc->bp == 0xff) { - mqc->ct = 7; - } - mqc->c = 0; - } -} - -int mqc_bypass_flush_enc(opj_mqc_t *mqc) -{ - unsigned char bit_padding; - - bit_padding = 0; - - if (mqc->ct != 0) { - while (mqc->ct > 0) { - mqc->ct--; - mqc->c += bit_padding << mqc->ct; - bit_padding = (bit_padding + 1) & 0x01; - } - mqc->bp++; - *mqc->bp = mqc->c; - mqc->ct = 8; - mqc->c = 0; - } - - return 1; -} - -void mqc_reset_enc(opj_mqc_t *mqc) -{ - mqc_resetstates(mqc); - mqc_setstate(mqc, 18, 0, 46); - mqc_setstate(mqc, 0, 0, 3); - mqc_setstate(mqc, 1, 0, 4); -} - -void mqc_reset_enc_3(opj_mqc_t *mqc) -{ - mqc_resetstates(mqc); - mqc_setstate(mqc, T1_3D_CTXNO_UNI, 0, 46); - mqc_setstate(mqc, T1_3D_CTXNO_AGG, 0, 3); - mqc_setstate(mqc, T1_3D_CTXNO_ZC, 0, 4); -} - -int mqc_restart_enc(opj_mqc_t *mqc) -{ - int correction = 1; - - /* */ - int n = 27 - 15 - mqc->ct; - mqc->c <<= mqc->ct; - while (n > 0) { - mqc_byteout(mqc); - n -= mqc->ct; - mqc->c <<= mqc->ct; - } - mqc_byteout(mqc); - - return correction; -} - -void mqc_restart_init_enc(opj_mqc_t *mqc) -{ - /* */ - mqc_setcurctx(mqc, 0); - mqc->a = 0x8000; - mqc->c = 0; - mqc->ct = 12; - mqc->bp--; - if (*mqc->bp == 0xff) { - mqc->ct = 13; - } -} - -void mqc_erterm_enc(opj_mqc_t *mqc) -{ - int k = 11 - mqc->ct + 1; - - while (k > 0) { - mqc->c <<= mqc->ct; - mqc->ct = 0; - mqc_byteout(mqc); - k -= mqc->ct; - } - - if (*mqc->bp != 0xff) { - mqc_byteout(mqc); - } -} - -void mqc_segmark_enc(opj_mqc_t *mqc) -{ - int i; - mqc_setcurctx(mqc, 18); - - for (i = 1; i < 5; i++) { - mqc_encode(mqc, i % 2); - } -} - -void mqc_init_dec(opj_mqc_t *mqc, unsigned char *bp, int len) -{ - mqc_setcurctx(mqc, 0); - mqc->start = bp; - mqc->end = bp + len; - mqc->bp = bp; - if (len == 0) { - mqc->c = 0xff << 16; - } else { - mqc->c = *mqc->bp << 16; - } - mqc_bytein(mqc); - mqc->c <<= 7; - mqc->ct -= 7; - mqc->a = 0x8000; -} - -int mqc_decode(opj_mqc_t *mqc) -{ - int d; - mqc->a -= (*mqc->curctx)->qeval; - if ((mqc->c >> 16) < (*mqc->curctx)->qeval) { - d = mqc_lpsexchange(mqc); - mqc_renormd(mqc); - } else { - mqc->c -= (*mqc->curctx)->qeval << 16; - if ((mqc->a & 0x8000) == 0) { - d = mqc_mpsexchange(mqc); - mqc_renormd(mqc); - } else { - d = (*mqc->curctx)->mps; - } - } - - return d; -} - -void mqc_resetstates(opj_mqc_t *mqc) -{ - int i; - for (i = 0; i < MQC_NUMCTXS; i++) { - mqc->ctxs[i] = mqc_states; - } -} - -void mqc_setstate(opj_mqc_t *mqc, int ctxno, int msb, int prob) -{ - mqc->ctxs[ctxno] = &mqc_states[msb + (prob << 1)]; -} - - diff --git a/src/lib/openjp3d/mqc.h b/src/lib/openjp3d/mqc.h deleted file mode 100644 index cff92f61..00000000 --- a/src/lib/openjp3d/mqc.h +++ /dev/null @@ -1,206 +0,0 @@ -/* - * 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 - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __MQC_H -#define __MQC_H -/** -@file mqc.h -@brief Implementation of an MQ-Coder (MQC) - -The functions in MQC.C have for goal to realize the MQ-coder operations. The functions -in MQC.C are used by some function in T1.C. -*/ - -/** @defgroup MQC MQC - Implementation of an MQ-Coder */ -/*@{*/ - -/** -This struct defines the state of a context. -*/ -typedef struct opj_mqc_state { - /** the probability of the Least Probable Symbol (0.75->0x8000, 1.5->0xffff) */ - unsigned int qeval; - /** the Most Probable Symbol (0 or 1) */ - int mps; - /** next state if the next encoded symbol is the MPS */ - struct opj_mqc_state *nmps; - /** next state if the next encoded symbol is the LPS */ - struct opj_mqc_state *nlps; -} opj_mqc_state_t; - -#define MQC_NUMCTXS 32 - -/** -MQ coder -*/ -typedef struct opj_mqc { - unsigned int c; - unsigned int a; - unsigned int ct; - unsigned char *bp; - unsigned char *start; - unsigned char *end; - opj_mqc_state_t *ctxs[MQC_NUMCTXS]; - opj_mqc_state_t **curctx; -} opj_mqc_t; - -/** @name Exported functions */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Create a new MQC handle -@return Returns a new MQC handle if successful, returns NULL otherwise -*/ -opj_mqc_t* mqc_create(void); -/** -Destroy a previously created MQC handle -@param mqc MQC handle to destroy -*/ -void mqc_destroy(opj_mqc_t *mqc); -/** -Return the number of bytes written/read since initialisation -@param mqc MQC handle -@return Returns the number of bytes already encoded -*/ -int mqc_numbytes(opj_mqc_t *mqc); -/** -Reset the states of all the context of the coder/decoder -(each context is set to a state where 0 and 1 are more or less equiprobable) -@param mqc MQC handle -*/ -void mqc_resetstates(opj_mqc_t *mqc); -/** -Set the state of a particular context -@param mqc MQC handle -@param ctxno Number that identifies the context -@param msb The MSB of the new state of the context -@param prob Number that identifies the probability of the symbols for the new state of the context -*/ -void mqc_setstate(opj_mqc_t *mqc, int ctxno, int msb, int prob); -/** -Initialize the encoder -@param mqc MQC handle -@param bp Pointer to the start of the buffer where the bytes will be written -*/ -void mqc_init_enc(opj_mqc_t *mqc, unsigned char *bp); -/** -Set the current context used for coding/decoding -@param mqc MQC handle -@param ctxno Number that identifies the context -*/ -void mqc_setcurctx(opj_mqc_t *mqc, int ctxno); -/** -Encode a symbol using the MQ-coder -@param mqc MQC handle -@param d The symbol to be encoded (0 or 1) -*/ -void mqc_encode(opj_mqc_t *mqc, int d); -/** -Flush the encoder, so that all remaining data is written -@param mqc MQC handle -*/ -void mqc_flush(opj_mqc_t *mqc); -/** -BYPASS mode switch, initialization operation. -JPEG 2000 p 505. -

Not fully implemented and tested !!

-@param mqc MQC handle -*/ -void mqc_bypass_init_enc(opj_mqc_t *mqc); -/** -BYPASS mode switch, coding operation. -JPEG 2000 p 505. -

Not fully implemented and tested !!

-@param mqc MQC handle -@param d The symbol to be encoded (0 or 1) -*/ -void mqc_bypass_enc(opj_mqc_t *mqc, int d); -/** -BYPASS mode switch, flush operation -

Not fully implemented and tested !!

-@param mqc MQC handle -@return Returns 1 (always) -*/ -int mqc_bypass_flush_enc(opj_mqc_t *mqc); -/** -RESET mode switch -@param mqc MQC handle -*/ -void mqc_reset_enc(opj_mqc_t *mqc); -/** -RESET mode switch -@param mqc MQC handle -*/ -void mqc_reset_enc_3(opj_mqc_t *mqc); -/** -RESTART mode switch (TERMALL) -@param mqc MQC handle -@return Returns 1 (always) -*/ -int mqc_restart_enc(opj_mqc_t *mqc); -/** -RESTART mode switch (TERMALL) reinitialisation -@param mqc MQC handle -*/ -void mqc_restart_init_enc(opj_mqc_t *mqc); -/** -ERTERM mode switch (PTERM) -@param mqc MQC handle -*/ -void mqc_erterm_enc(opj_mqc_t *mqc); -/** -SEGMARK mode switch (SEGSYM) -@param mqc MQC handle -*/ -void mqc_segmark_enc(opj_mqc_t *mqc); -/** -Initialize the decoder -@param mqc MQC handle -@param bp Pointer to the start of the buffer from which the bytes will be read -@param len Length of the input buffer -*/ -void mqc_init_dec(opj_mqc_t *mqc, unsigned char *bp, int len); -/** -Decode a symbol -@param mqc MQC handle -@return Returns the decoded symbol (0 or 1) -*/ -int mqc_decode(opj_mqc_t *mqc); -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __MQC_H */ diff --git a/src/lib/openjp3d/openjp3d.c b/src/lib/openjp3d/openjp3d.c deleted file mode 100644 index 3299a99d..00000000 --- a/src/lib/openjp3d/openjp3d.c +++ /dev/null @@ -1,234 +0,0 @@ -/* - * 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) 2005, Herve Drolon, FreeImage Team - * Copyright (c) 2006, Mónica Díez García, 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. - */ - -#ifdef _WIN32 -#include -#endif /* _WIN32 */ - -#include "opj_includes.h" -#include "openjp3d.h" -#define JP3D_VERSION "1.3.0" -/* ---------------------------------------------------------------------- */ -#ifdef _WIN32 -#ifndef OPJ_STATIC -BOOL APIENTRY -DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) -{ - switch (ul_reason_for_call) { - case DLL_PROCESS_ATTACH : - break; - case DLL_PROCESS_DETACH : - break; - case DLL_THREAD_ATTACH : - case DLL_THREAD_DETACH : - break; - } - - return TRUE; -} -#endif /* OPJ_STATIC */ -#endif /* _WIN32 */ - -/* ---------------------------------------------------------------------- */ - -const char* OPJ_CALLCONV opj_version() -{ - return JP3D_VERSION; -} -opj_dinfo_t* OPJ_CALLCONV opj_create_decompress(OPJ_CODEC_FORMAT format) -{ - opj_dinfo_t *dinfo = (opj_dinfo_t*)opj_malloc(sizeof(opj_dinfo_t)); - if (!dinfo) { - return NULL; - } - dinfo->is_decompressor = true; - switch (format) { - case CODEC_J3D: - case CODEC_J2K: - /* get a J3D decoder handle */ - dinfo->j3d_handle = (void*)j3d_create_decompress((opj_common_ptr)dinfo); - if (!dinfo->j3d_handle) { - opj_free(dinfo); - return NULL; - } - break; - default: - opj_free(dinfo); - return NULL; - } - - dinfo->codec_format = format; - - return dinfo; -} - -void OPJ_CALLCONV opj_destroy_decompress(opj_dinfo_t *dinfo) -{ - if (dinfo) { - /* destroy the codec */ - if (dinfo->codec_format != CODEC_UNKNOWN) { - j3d_destroy_decompress((opj_j3d_t*)dinfo->j3d_handle); - } - /* destroy the decompressor */ - opj_free(dinfo); - } -} - -void OPJ_CALLCONV opj_set_default_decoder_parameters(opj_dparameters_t - *parameters) -{ - if (parameters) { - memset(parameters, 0, sizeof(opj_dparameters_t)); - /* default decoding parameters */ - parameters->cp_layer = 0; - parameters->cp_reduce[0] = 0; - parameters->cp_reduce[1] = 0; - parameters->cp_reduce[2] = 0; - parameters->bigendian = 0; - - parameters->decod_format = -1; - parameters->cod_format = -1; - } -} - -void OPJ_CALLCONV opj_setup_decoder(opj_dinfo_t *dinfo, - opj_dparameters_t *parameters) -{ - if (dinfo && parameters) { - if (dinfo->codec_format != CODEC_UNKNOWN) { - j3d_setup_decoder((opj_j3d_t*)dinfo->j3d_handle, parameters); - } - } -} - -opj_volume_t* OPJ_CALLCONV opj_decode(opj_dinfo_t *dinfo, opj_cio_t *cio) -{ - if (dinfo && cio) { - if (dinfo->codec_format != CODEC_UNKNOWN) { - return j3d_decode((opj_j3d_t*)dinfo->j3d_handle, cio); - } - } - - return NULL; -} - -opj_cinfo_t* OPJ_CALLCONV opj_create_compress(OPJ_CODEC_FORMAT format) -{ - opj_cinfo_t *cinfo = (opj_cinfo_t*)opj_malloc(sizeof(opj_cinfo_t)); - if (!cinfo) { - return NULL; - } - cinfo->is_decompressor = false; - switch (format) { - case CODEC_J3D: - case CODEC_J2K: - /* get a J3D coder handle */ - cinfo->j3d_handle = (void*)j3d_create_compress((opj_common_ptr)cinfo); - if (!cinfo->j3d_handle) { - opj_free(cinfo); - return NULL; - } - break; - default: - opj_free(cinfo); - return NULL; - } - - cinfo->codec_format = format; - - return cinfo; -} - -void OPJ_CALLCONV opj_destroy_compress(opj_cinfo_t *cinfo) -{ - if (cinfo) { - /* destroy the codec */ - if (cinfo->codec_format != CODEC_UNKNOWN) { - j3d_destroy_compress((opj_j3d_t*)cinfo->j3d_handle); - } - /* destroy the decompressor */ - opj_free(cinfo); - } -} - -void OPJ_CALLCONV opj_set_default_encoder_parameters(opj_cparameters_t - *parameters) -{ - if (parameters) { - memset(parameters, 0, sizeof(opj_cparameters_t)); - /* default coding parameters */ - parameters->numresolution[0] = 3; - parameters->numresolution[1] = 3; - parameters->numresolution[2] = 1; - parameters->cblock_init[0] = 64; - parameters->cblock_init[1] = 64; - parameters->cblock_init[2] = 64; - parameters->prog_order = LRCP; - parameters->roi_compno = -1; /* no ROI */ - parameters->atk_wt[0] = 1; /* 5-3 WT */ - parameters->atk_wt[1] = 1; /* 5-3 WT */ - parameters->atk_wt[2] = 1; /* 5-3 WT */ - parameters->irreversible = 0; - parameters->subsampling_dx = 1; - parameters->subsampling_dy = 1; - parameters->subsampling_dz = 1; - - parameters->decod_format = -1; - parameters->cod_format = -1; - parameters->encoding_format = ENCOD_2EB; - parameters->transform_format = TRF_2D_DWT; - } -} - -void OPJ_CALLCONV opj_setup_encoder(opj_cinfo_t *cinfo, - opj_cparameters_t *parameters, opj_volume_t *volume) -{ - if (cinfo && parameters && volume) { - if (cinfo->codec_format != CODEC_UNKNOWN) { - j3d_setup_encoder((opj_j3d_t*)cinfo->j3d_handle, parameters, volume); - } - } -} - -bool OPJ_CALLCONV opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio, - opj_volume_t *volume, char *index) -{ - if (cinfo && cio && volume) { - if (cinfo->codec_format != CODEC_UNKNOWN) { - return j3d_encode((opj_j3d_t*)cinfo->j3d_handle, cio, volume, index); - } - } - - return false; -} - - diff --git a/src/lib/openjp3d/openjp3d.h b/src/lib/openjp3d/openjp3d.h deleted file mode 100644 index b61763e6..00000000 --- a/src/lib/openjp3d/openjp3d.h +++ /dev/null @@ -1,736 +0,0 @@ -/* - * 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, Mónica Díez García, 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 OPENJPEG_H -#define OPENJPEG_H - -/* -========================================================== - Compiler directives -========================================================== -*/ - -#if defined(OPJ_STATIC) || !defined(_WIN32) -/* http://gcc.gnu.org/wiki/Visibility */ -#if __GNUC__ >= 4 -#define OPJ_API __attribute__ ((visibility ("default"))) -#define OPJ_LOCAL __attribute__ ((visibility ("hidden"))) -#else -#define OPJ_API -#define OPJ_LOCAL -#endif -#define OPJ_CALLCONV -#else -#define OPJ_CALLCONV __stdcall - -/* -The following ifdef block is the standard way of creating macros which make exporting -from a DLL simpler. All files within this DLL are compiled with the OPJ_EXPORTS -symbol defined on the command line. this symbol should not be defined on any project -that uses this DLL. This way any other project whose source files include this file see -OPJ_API functions as being imported from a DLL, whereas this DLL sees symbols -defined with this macro as being exported. -*/ -#if defined(OPJ_EXPORTS) || defined(DLL_EXPORT) -#define OPJ_API __declspec(dllexport) -#else -#define OPJ_API __declspec(dllimport) -#endif /* OPJ_EXPORTS */ -#endif /* !OPJ_STATIC || !WIN32 */ - -#ifndef __cplusplus -#if defined(HAVE_STDBOOL_H) -/* -The C language implementation does correctly provide the standard header -file "stdbool.h". - */ -#include -#else -/* -The C language implementation does not provide the standard header file -"stdbool.h" as required by ISO/IEC 9899:1999. Try to compensate for this -braindamage below. -*/ -#if !defined(bool) -#define bool int -#endif -#if !defined(true) -#define true 1 -#endif -#if !defined(false) -#define false 0 -#endif -#endif -#endif /* __cplusplus */ - -/* -========================================================== - Useful constant definitions -========================================================== -*/ -#ifndef MAX_SLICES -#define MAX_SLICES 300 /**< Maximum allowed size for slices */ -#endif /* MAX_PATH */ - -#ifndef MAX_PATH -#define MAX_PATH 260 /**< Maximum allowed size for filenames */ -#endif /* MAX_PATH */ - -#define J3D_MAXRLVLS 32 /**< Number of maximum resolution level authorized */ -#define J3D_MAXBANDS (7*J3D_MAXRLVLS + 1) /**< Number of maximum sub-band linked to number of resolution level */ - -#define TINY 1.0E-20 -/* -========================================================== - enum definitions -========================================================== -*/ - -#define J2K_CFMT 0 -#define J3D_CFMT 1 -#define LSE_CFMT 2 - -#define BIN_DFMT 0 -#define PGX_DFMT 1 -#define IMG_DFMT 2 -/* ----------------------------------------------------------------------- */ - -/** Progression order */ -typedef enum PROG_ORDER { - /**< place-holder */ - PROG_UNKNOWN = -1, - /**< layer-resolution-component-precinct order */ - LRCP = 0, - /**< resolution-layer-component-precinct order */ - RLCP = 1, - /**< resolution-precinct-component-layer order */ - RPCL = 2, - /**< precinct-component-resolution-layer order */ - PCRL = 3, - /**< component-precinct-resolution-layer order */ - CPRL = 4 -} OPJ_PROG_ORDER; - -/** -Supported volume color spaces -*/ -typedef enum COLOR_SPACE { - /**< place-holder */ - CLRSPC_UNKNOWN = -1, - /**< sRGB */ - CLRSPC_SRGB = 1, - /**< grayscale */ - CLRSPC_GRAY = 2, - /**< YUV */ - CLRSPC_SYCC = 3 -} OPJ_COLOR_SPACE; - -/** -Supported codec -*/ -typedef enum CODEC_FORMAT { - /**< place-holder */ - CODEC_UNKNOWN = -1, - /**< JPEG-2000 codestream : read/write */ - CODEC_J2K = 0, - /**< JPEG-2000 Part 10 file format : read/write */ - CODEC_J3D = 1 -} OPJ_CODEC_FORMAT; - -/** -Supported entropy coding algorithms -*/ -typedef enum ENTROPY_CODING { - /**< place-holder */ - ENCOD_UNKNOWN = -1, - /**< 2D EBCOT encoding */ - ENCOD_2EB = 0, - /**< 3D EBCOT encoding */ - ENCOD_3EB = 1, - /**< Golomb-Rice coding with 2D context */ - ENCOD_2GR = 2, - /**< Golomb-Rice coding with 3D context */ - ENCOD_3GR = 3 -} OPJ_ENTROPY_CODING; - -/** -Supported transforms -*/ -typedef enum TRANSFORM { - /**< place-holder */ - TRF_UNKNOWN = -1, - /**< 2D DWT, no transform in axial dim */ - TRF_2D_DWT = 0, - /**< 3D DWT */ - TRF_3D_DWT = 1, - /**< 3D prediction*/ - TRF_3D_RLS = 2, - TRF_3D_LSE = 3 -} OPJ_TRANSFORM; -/* -========================================================== - event manager typedef definitions -========================================================== -*/ - -/** -Callback function prototype for events -@param msg Event message -@param client_data -*/ -typedef void (*opj_msg_callback)(const char *msg, void *client_data); - -/** -Message handler object -used for -
    -
  • Error messages -
  • Warning messages -
  • Debugging messages -
-*/ -typedef struct opj_event_mgr { - /** Error message callback if available, NULL otherwise */ - opj_msg_callback error_handler; - /** Warning message callback if available, NULL otherwise */ - opj_msg_callback warning_handler; - /** Debug message callback if available, NULL otherwise */ - opj_msg_callback info_handler; -} opj_event_mgr_t; - - -/* -========================================================== - codec typedef definitions -========================================================== -*/ - -/** -Progression order changes -*/ -typedef struct opj_poc { - int resno0, compno0; - int layno1, resno1, compno1; - OPJ_PROG_ORDER prg; - int tile; - char progorder[4]; -} opj_poc_t; - - -/** -Compression parameters -*/ -typedef struct opj_cparameters { - /** size of tile: tile_size_on = false (not in argument) or = true (in argument) */ - bool tile_size_on; - /** XTOsiz */ - int cp_tx0; - /** YTOsiz */ - int cp_ty0; - /** ZTOsiz */ - int cp_tz0; - - /** XTsiz */ - int cp_tdx; - /** YTsiz */ - int cp_tdy; - /** ZTsiz */ - int cp_tdz; - - /** allocation by rate/distortion */ - int cp_disto_alloc; - /** allocation by fixed layer */ - int cp_fixed_alloc; - /** add fixed_quality */ - int cp_fixed_quality; - /** fixed layer */ - int *cp_matrice; - /** number of layers */ - int tcp_numlayers; - /** rates for successive layers */ - float tcp_rates[100]; - /** psnr's for successive layers */ - float tcp_distoratio[100]; - /** comment for coding */ - char *cp_comment; - /** csty : coding style */ - int csty; - /** DC offset (DCO) */ - int dcoffset; - /** progression order (default LRCP) */ - OPJ_PROG_ORDER prog_order; - /** progression order changes */ - opj_poc_t POC[J3D_MAXRLVLS - 1]; - /** number of progression order changes (POC), default to 0 */ - int numpocs; - - /** number of resolutions */ - int numresolution[3]; - /** initial code block width, height and depth, default to 64 */ - int cblock_init[3]; - /** mode switch (1=BYPASS(LAZY) 2=RESET 4=RESTART(TERMALL) 8=VSC 16=ERTERM(SEGTERM) 32=SEGMARK(SEGSYM)) */ - int mode; - - /** 1 : use the irreversible DWT 9-7, 0 : use lossless compression (default) */ - int irreversible; - /** WT from ATK, default to 0 (false), no of atk used */ - int atk_wt[3]; - /** region of interest: affected component in [0..3], -1 means no ROI */ - int roi_compno; - /** region of interest: upshift value */ - int roi_shift; - - /* number of precinct size specifications */ - int res_spec; - /** initial precinct width */ - int prct_init[3][J3D_MAXRLVLS]; - - /** transform format 0: 0: 2DWT, 1: 2D1P, 2: 3DWT, 3: 3RLS */ - OPJ_TRANSFORM transform_format; - /** output file format 0: 2EB, 1: 3EB, 2: 2GR, 3: 3GR, 4: GRI */ - OPJ_ENTROPY_CODING encoding_format; - - /**@name command line encoder parameters (not used inside the library) */ - /*@{*/ - char infile[MAX_PATH]; /** input file name */ - char outfile[MAX_PATH]; /** output file name */ - char imgfile[MAX_PATH]; /** IMG file name for BIN volumes*/ - int index_on; /** creation of an index file, default to 0 (false) */ - char index[MAX_PATH]; /** index file name */ - - int volume_offset_x0; /** subvolume encoding: origin volume offset in x, y and z direction */ - int volume_offset_y0; - int volume_offset_z0; - - int subsampling_dx; /** subsampling value for dx */ - int subsampling_dy; - int subsampling_dz; - - int decod_format; /** input file format 0: BIN, 1: PGX */ - int cod_format; /** output file format 0: JP3D */ - /*@}*/ -} opj_cparameters_t; - -/** -Decompression parameters -*/ -typedef struct opj_dparameters { - /** Set the number of highest resolution levels to be discarded. if != 0, then original dimension divided by 2^(reduce); if == 0 or not used, volume is decoded to the full resolution */ - int cp_reduce[3]; - /** Set the maximum number of quality layers to decode. if != 0, then only the first "layer" layers are decoded; if == 0 or not used, all the quality layers are decoded */ - int cp_layer; - int bigendian; - - /**@name command line encoder parameters (not used inside the library) */ - /*@{*/ - /** input file name */ - char infile[MAX_PATH]; - /** output file name */ - char outfile[MAX_PATH]; - /** IMG file name for BIN volumes*/ - char imgfile[MAX_PATH]; - /** Original file name for PSNR measures*/ - char original[MAX_PATH]; - /** input file format 0: J2K, 1: JP3D */ - int decod_format; - /** input file format 0: BIN, 1: PGM */ - int cod_format; - /** original file format 0: BIN, 1: PGM */ - int orig_format; - /*@}*/ -} opj_dparameters_t; - -/** Common fields between JPEG-2000 compression and decompression master structs. */ -#define opj_common_fields \ - opj_event_mgr_t *event_mgr; /**< pointer to the event manager */\ - void * client_data; /**< Available for use by application */\ - bool is_decompressor; /**< So common code can tell which is which */\ - OPJ_CODEC_FORMAT codec_format; /**< selected codec */\ - OPJ_ENTROPY_CODING encoding_format; /**< selected entropy coding */\ - OPJ_TRANSFORM transform_format; /**< selected transform */\ - void *j3d_handle /**< pointer to the J3D codec */ - -/* Routines that are to be used by both halves of the library are declared - * to receive a pointer to this structure. There are no actual instances of - * opj_common_struct_t, only of opj_cinfo_t and opj_dinfo_t. - */ -typedef struct opj_common_struct { - opj_common_fields; /* Fields common to both master struct types */ - /* Additional fields follow in an actual opj_cinfo_t or - * opj_dinfo_t. All three structs must agree on these - * initial fields! (This would be a lot cleaner in C++.) - */ -} opj_common_struct_t; - -typedef opj_common_struct_t * opj_common_ptr; - -/** -Compression context info -*/ -typedef struct opj_cinfo { - /** Fields shared with opj_dinfo_t */ - opj_common_fields; - /* other specific fields go here */ -} opj_cinfo_t; - -/** -Decompression context info -*/ -typedef struct opj_dinfo { - /** Fields shared with opj_cinfo_t */ - opj_common_fields; - /* other specific fields go here */ -} opj_dinfo_t; - -/* -========================================================== - I/O stream typedef definitions -========================================================== -*/ - -/* - * Stream open flags. - */ -/** The stream was opened for reading. */ -#define OPJ_STREAM_READ 0x0001 -/** The stream was opened for writing. */ -#define OPJ_STREAM_WRITE 0x0002 - -/** -Byte input-output stream (CIO) -*/ -typedef struct opj_cio { - /** codec context */ - opj_common_ptr cinfo; - /** open mode (read/write) either OPJ_STREAM_READ or OPJ_STREAM_WRITE */ - int openmode; - /** pointer to the start of the buffer */ - unsigned char *buffer; - /** buffer size in bytes */ - int length; - /** pointer to the start of the stream */ - unsigned char *start; - /** pointer to the end of the stream */ - unsigned char *end; - /** pointer to the current position */ - unsigned char *bp; -} opj_cio_t; - -/* -========================================================== - volume typedef definitions -========================================================== -*/ - -/** -Defines a single volume component -*/ -typedef struct opj_volume_comp { - /** XRsiz: horizontal separation of a sample of ith component with respect to the reference grid */ - int dx; - /** YRsiz: vertical separation of a sample of ith component with respect to the reference grid */ - int dy; - /** ZRsiz: vertical separation of a sample of ith component with respect to the reference grid */ - int dz; - /** data width */ - int w; - /** data height */ - int h; - /** data length : no of slices */ - int l; - /** x component offset compared to the whole volume */ - int x0; - /** y component offset compared to the whole volume */ - int y0; - /** z component offset compared to the whole volume */ - int z0; - /** precision */ - int prec; - /** volume depth in bits */ - int bpp; - /** DC offset (15444-2) */ - int dcoffset; - /** signed (1) / unsigned (0) */ - int sgnd; - /** BE byte order (1) / LE byte order (0) */ - int bigendian; - /** number of decoded resolution */ - int resno_decoded[3]; - /** number of division by 2 of the out volume compared to the original size of volume */ - int factor[3]; - /** volume component data */ - int *data; -} opj_volume_comp_t; - -/** -Defines volume data and characteristics -*/ -typedef struct opj_volume { - /** XOsiz: horizontal offset from the origin of the reference grid to the left side of the volume area */ - int x0; - /** YOsiz: vertical offset from the origin of the reference grid to the top side of the volume area */ - int y0; - /** ZOsiz: vertical offset from the origin of the reference grid to the top side of the volume area */ - int z0; - /** Xsiz: width of the reference grid */ - int x1; - /** Ysiz: height of the reference grid */ - int y1; - /** Zsiz: length of the reference grid */ - int z1; - /** number of components in the volume */ - int numcomps; - /** number of slices in the volume */ - int numslices; - /** color space: sRGB, Greyscale or YUV */ - OPJ_COLOR_SPACE color_space; - /** volume components */ - opj_volume_comp_t *comps; -} opj_volume_t; - -/** -Component parameters structure used by the opj_volume_create function -*/ -typedef struct opj_volume_comptparm { - /** XRsiz: horizontal separation of a sample of ith component with respect to the reference grid */ - int dx; - /** YRsiz: vertical separation of a sample of ith component with respect to the reference grid */ - int dy; - /** ZRsiz: axial separation of a sample of ith component with respect to the reference grid */ - int dz; - /** data width */ - int w; - /** data height */ - int h; - /** data length */ - int l; - /** x component offset compared to the whole volume */ - int x0; - /** y component offset compared to the whole volume */ - int y0; - /** z component offset compared to the whole volume */ - int z0; - /** precision */ - int prec; - /** volume depth in bits */ - int bpp; - /** signed (1) / unsigned (0) */ - int sgnd; - /** DC offset*/ - int dcoffset; - /** BE byte order (1) / LE byte order (0) */ - int bigendian; -} opj_volume_cmptparm_t; - -#ifdef __cplusplus -extern "C" { -#endif - - -/* -========================================================== - openjpeg version -========================================================== -*/ - -OPJ_API const char * OPJ_CALLCONV opj_version(void); - -/* -========================================================== - volume functions definitions -========================================================== -*/ - -/** -Create an volume -@param numcmpts number of components -@param cmptparms components parameters -@param clrspc volume color space -@return returns a new volume structure if successful, returns NULL otherwise -*/ -OPJ_API opj_volume_t* OPJ_CALLCONV opj_volume_create(int numcmpts, - opj_volume_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc); - -/** -Deallocate any resources associated with an volume -@param volume volume to be destroyed -*/ -OPJ_API void OPJ_CALLCONV opj_volume_destroy(opj_volume_t *volume); - -/* -========================================================== - stream functions definitions -========================================================== -*/ - -/** -Open and allocate a memory stream for read / write. -On reading, the user must provide a buffer containing encoded data. The buffer will be -wrapped by the returned CIO handle. -On writing, buffer parameters must be set to 0: a buffer will be allocated by the library -to contain encoded data. -@param cinfo Codec context info -@param buffer Reading: buffer address. Writing: NULL -@param length Reading: buffer length. Writing: 0 -@return Returns a CIO handle if successful, returns NULL otherwise -*/ -OPJ_API opj_cio_t* OPJ_CALLCONV opj_cio_open(opj_common_ptr cinfo, - unsigned char *buffer, int length); - -/** -Close and free a CIO handle -@param cio CIO handle to free -*/ -OPJ_API void OPJ_CALLCONV opj_cio_close(opj_cio_t *cio); - -/** -Get position in byte stream -@param cio CIO handle -@return Returns the position in bytes -*/ -OPJ_API int OPJ_CALLCONV cio_tell(opj_cio_t *cio); -/** -Set position in byte stream -@param cio CIO handle -@param pos Position, in number of bytes, from the beginning of the stream -*/ -OPJ_API void OPJ_CALLCONV cio_seek(opj_cio_t *cio, int pos); - -/* -========================================================== - event manager functions definitions -========================================================== -*/ - -OPJ_API opj_event_mgr_t* OPJ_CALLCONV opj_set_event_mgr(opj_common_ptr cinfo, - opj_event_mgr_t *event_mgr, void *context); - -/* -========================================================== - codec functions definitions -========================================================== -*/ -/** -Creates a J3D decompression structure -@param format Decoder to select -@return Returns a handle to a decompressor if successful, returns NULL otherwise -*/ -OPJ_API opj_dinfo_t* OPJ_CALLCONV opj_create_decompress( - OPJ_CODEC_FORMAT format); -/** -Destroy a decompressor handle -@param dinfo decompressor handle to destroy -*/ -OPJ_API void OPJ_CALLCONV opj_destroy_decompress(opj_dinfo_t *dinfo); -/** -Set decoding parameters to default values -@param parameters Decompression parameters -*/ -OPJ_API void OPJ_CALLCONV opj_set_default_decoder_parameters( - opj_dparameters_t *parameters); -/** -Setup the decoder decoding parameters using user parameters. -Decoding parameters are returned in j3d->cp. -@param dinfo decompressor handle -@param parameters decompression parameters -*/ -OPJ_API void OPJ_CALLCONV opj_setup_decoder(opj_dinfo_t *dinfo, - opj_dparameters_t *parameters); -/** -Decode an volume from a JPEG-2000 codestream -@param dinfo decompressor handle -@param cio Input buffer stream -@return Returns a decoded volume if successful, returns NULL otherwise -*/ -OPJ_API opj_volume_t* OPJ_CALLCONV opj_decode(opj_dinfo_t *dinfo, - opj_cio_t *cio); -/** -Creates a J3D/JP2 compression structure -@param format Coder to select -@return Returns a handle to a compressor if successful, returns NULL otherwise -*/ -OPJ_API opj_cinfo_t* OPJ_CALLCONV opj_create_compress(OPJ_CODEC_FORMAT format); -/** -Destroy a compressor handle -@param cinfo compressor handle to destroy -*/ -OPJ_API void OPJ_CALLCONV opj_destroy_compress(opj_cinfo_t *cinfo); -/** -Set encoding parameters to default values, that means : -
    -
  • Lossless -
  • 1 tile -
  • Size of precinct : 2^15 x 2^15 (means 1 precinct) -
  • Size of code-block : 64 x 64 -
  • Number of resolutions: 6 -
  • No SOP marker in the codestream -
  • No EPH marker in the codestream -
  • No sub-sampling in x or y direction -
  • No mode switch activated -
  • Progression order: LRCP -
  • No index file -
  • No ROI upshifted -
  • No offset of the origin of the volume -
  • No offset of the origin of the tiles -
  • Reversible DWT 5-3 -
-@param parameters Compression parameters -*/ -OPJ_API void OPJ_CALLCONV opj_set_default_encoder_parameters( - opj_cparameters_t *parameters); -/** -Setup the encoder parameters using the current volume and using user parameters. -@param cinfo compressor handle -@param parameters compression parameters -@param volume input filled volume -*/ -OPJ_API void OPJ_CALLCONV opj_setup_encoder(opj_cinfo_t *cinfo, - opj_cparameters_t *parameters, opj_volume_t *volume); -/** -Encode an volume into a JPEG-2000 codestream -@param cinfo compressor handle -@param cio Output buffer stream -@param volume Volume to encode -@param index Name of the index file if required, NULL otherwise -@return Returns true if successful, returns false otherwise -*/ -OPJ_API bool OPJ_CALLCONV opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio, - opj_volume_t *volume, char *index); - -#ifdef __cplusplus -} -#endif - -#endif /* OPENJPEG_H */ diff --git a/src/lib/openjp3d/opj_includes.h b/src/lib/openjp3d/opj_includes.h deleted file mode 100644 index f917e2fa..00000000 --- a/src/lib/openjp3d/opj_includes.h +++ /dev/null @@ -1,83 +0,0 @@ -/* - * 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) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ -#ifndef OPJ_INCLUDES_H -#define OPJ_INCLUDES_H - -/* - ========================================================== - Standard includes used by the library - ========================================================== -*/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -/* - ========================================================== - OpenJPEG interface - ========================================================== - */ -#include "openjp3d.h" - -/* - ========================================================== - OpenJPEG modules - ========================================================== -*/ - -#include "jp3d_lib.h" -#include "event.h" -#include "cio.h" - -#include "volume.h" -#include "jp3d.h" - -#include "mqc.h" -#include "raw.h" -#include "bio.h" -#include "tgt.h" -#include "tcd.h" -#include "t1.h" -#include "t1_3d.h" -#include "dwt.h" -#include "pi.h" -#include "t2.h" -#include "mct.h" -#include "int.h" -#include "fix.h" - -#endif /* OPJ_INCLUDES_H */ diff --git a/src/lib/openjp3d/pi.c b/src/lib/openjp3d/pi.c deleted file mode 100644 index a58ebcc7..00000000 --- a/src/lib/openjp3d/pi.c +++ /dev/null @@ -1,709 +0,0 @@ -/* - * 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, Mónica Díez, LPI-UVA, 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 "opj_includes.h" - -/** @defgroup PI PI - Implementation of a packet iterator */ -/*@{*/ - -/** @name Funciones locales */ -/*@{*/ - -/** -Get next packet in layer-resolution-component-precinct order. -@param pi packet iterator to modify -@return returns false if pi pointed to the last packet or else returns true -*/ -static bool pi_next_lrcp(opj_pi_iterator_t * pi); -/** -Get next packet in resolution-layer-component-precinct order. -@param pi packet iterator to modify -@return returns false if pi pointed to the last packet or else returns true -*/ -static bool pi_next_rlcp(opj_pi_iterator_t * pi); -/** -Get next packet in resolution-precinct-component-layer order. -@param pi packet iterator to modify -@return returns false if pi pointed to the last packet or else returns true -*/ -static bool pi_next_rpcl(opj_pi_iterator_t * pi); -/** -Get next packet in precinct-component-resolution-layer order. -@param pi packet iterator to modify -@return returns false if pi pointed to the last packet or else returns true -*/ -static bool pi_next_pcrl(opj_pi_iterator_t * pi); -/** -Get next packet in component-precinct-resolution-layer order. -@param pi packet iterator to modify -@return returns false if pi pointed to the last packet or else returns true -*/ -static bool pi_next_cprl(opj_pi_iterator_t * pi); - -/*@}*/ - -/*@}*/ - -/* -========================================================== - local functions -========================================================== -*/ - -static bool pi_next_lrcp(opj_pi_iterator_t * pi) -{ - opj_pi_comp_t *comp = NULL; - opj_pi_resolution_t *res = NULL; - long index = 0; - - if (!pi->first) { - comp = &pi->comps[pi->compno]; - res = &comp->resolutions[pi->resno]; - goto LABEL_SKIP; - } else { - pi->first = 0; - } - - for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) { - for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) { - for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) { - comp = &pi->comps[pi->compno]; - if (pi->resno >= comp->numresolution[0]) { - continue; - } - res = &comp->resolutions[pi->resno]; - /*for (pi->precno = 0; pi->precno < (res->prctno[0] * res->prctno[1]); pi->precno++) {*/ - for (pi->precno = 0; - pi->precno < (res->prctno[0] * res->prctno[1] * res->prctno[2]); pi->precno++) { - index = pi->layno * pi->step_l - + pi->resno * pi->step_r - + pi->compno * pi->step_c - + pi->precno * pi->step_p; - if (!pi->include[index]) { - pi->include[index] = 1; - return true; - } -LABEL_SKIP: - ; - - } - } - } - } - - return false; -} - -static bool pi_next_rlcp(opj_pi_iterator_t * pi) -{ - opj_pi_comp_t *comp = NULL; - opj_pi_resolution_t *res = NULL; - long index = 0; - - if (!pi->first) { - comp = &pi->comps[pi->compno]; - res = &comp->resolutions[pi->resno]; - goto LABEL_SKIP; - } else { - pi->first = 0; - } - - for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) { - for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) { - for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) { - comp = &pi->comps[pi->compno]; - if (pi->resno >= comp->numresolution[0]) { - continue; - } - res = &comp->resolutions[pi->resno]; - /*for (pi->precno = 0; pi->precno < (res->prctno[0] * res->prctno[1]); pi->precno++) {*/ - for (pi->precno = 0; - pi->precno < (res->prctno[0] * res->prctno[1] * res->prctno[2]); pi->precno++) { - index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * - pi->step_c + pi->precno * pi->step_p; - if (!pi->include[index]) { - pi->include[index] = 1; - return true; - } -LABEL_SKIP: - ; - } - } - } - } - - return false; -} - -static bool pi_next_rpcl(opj_pi_iterator_t * pi) -{ - opj_pi_comp_t *comp = NULL; - opj_pi_resolution_t *res = NULL; - long index = 0; - - if (!pi->first) { - goto LABEL_SKIP; - } else { - int compno, resno; - pi->first = 0; - pi->dx = 0; - pi->dy = 0; - for (compno = 0; compno < pi->numcomps; compno++) { - comp = &pi->comps[compno]; - for (resno = 0; resno < comp->numresolution[0]; resno++) { - int dx, dy, dz; - res = &comp->resolutions[resno]; - dx = comp->dx * (1 << (res->pdx + comp->numresolution[0] - 1 - resno)); - dy = comp->dy * (1 << (res->pdy + comp->numresolution[1] - 1 - resno)); - dz = comp->dz * (1 << (res->pdz + comp->numresolution[2] - 1 - resno)); - pi->dx = !pi->dx ? dx : int_min(pi->dx, dx); - pi->dy = !pi->dy ? dy : int_min(pi->dy, dy); - pi->dz = !pi->dz ? dz : int_min(pi->dz, dz); - } - } - } - - for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) { - for (pi->z = pi->tz0; pi->z < pi->tz1; pi->z += pi->dz - (pi->z % pi->dz)) { - for (pi->y = pi->ty0; pi->y < pi->ty1; pi->y += pi->dy - (pi->y % pi->dy)) { - for (pi->x = pi->tx0; pi->x < pi->tx1; pi->x += pi->dx - (pi->x % pi->dx)) { - for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) { - int levelnox, levelnoy, levelnoz; - int trx0, try0, trz0; - int trx1, try1, trz1; - int rpx, rpy, rpz; - int prci, prcj, prck; - comp = &pi->comps[pi->compno]; - if (pi->resno >= comp->numresolution[0]) { - continue; - } - res = &comp->resolutions[pi->resno]; - levelnox = comp->numresolution[0] - 1 - pi->resno; - levelnoy = comp->numresolution[1] - 1 - pi->resno; - levelnoz = comp->numresolution[2] - 1 - pi->resno; - trx0 = int_ceildiv(pi->tx0, comp->dx << levelnox); - try0 = int_ceildiv(pi->ty0, comp->dy << levelnoy); - trz0 = int_ceildiv(pi->tz0, comp->dz << levelnoz); - trx1 = int_ceildiv(pi->tx1, comp->dx << levelnox); - try1 = int_ceildiv(pi->ty1, comp->dy << levelnoy); - trz1 = int_ceildiv(pi->tz1, comp->dz << levelnoz); - rpx = res->pdx + levelnox; - rpy = res->pdy + levelnoy; - rpz = res->pdz + levelnoz; - - /* To avoid divisions by zero / undefined behaviour on shift */ - if (rpx >= 31 || ((comp->dx << rpx) >> rpx) != comp->dx || - rpy >= 31 || ((comp->dy << rpy) >> rpy) != comp->dy || - rpz >= 31 || ((comp->dz << rpz) >> rpz) != comp->dz) { - continue; - } - - if ((!(pi->x % (comp->dx << rpx) == 0) || (pi->x == pi->tx0 && - (trx0 << levelnox) % (1 << rpx)))) { - continue; - } - if ((!(pi->y % (comp->dy << rpy) == 0) || (pi->y == pi->ty0 && - (try0 << levelnoy) % (1 << rpx)))) { - continue; - } - if ((!(pi->z % (comp->dz << rpz) == 0) || (pi->z == pi->tz0 && - (trz0 << levelnoz) % (1 << rpx)))) { - continue; - } - if ((res->prctno[0] == 0) || (res->prctno[1] == 0) || (res->prctno[2] == 0)) { - continue; - } - - if ((trx0 == trx1) || (try0 == try1) || (trz0 == trz1)) { - continue; - } - - prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelnox), res->pdx) - - int_floordivpow2(trx0, res->pdx); - prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelnoy), res->pdy) - - int_floordivpow2(try0, res->pdy); - prck = int_floordivpow2(int_ceildiv(pi->z, comp->dz << levelnoz), res->pdz) - - int_floordivpow2(trz0, res->pdz); - pi->precno = prci + prcj * res->prctno[0] + prck * res->prctno[0] * - res->prctno[1]; - for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) { - index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * - pi->step_c + pi->precno * pi->step_p; - if (!pi->include[index]) { - pi->include[index] = 1; - return true; - } -LABEL_SKIP: - ; - } - } - } - } - } - } - - return false; -} - -static bool pi_next_pcrl(opj_pi_iterator_t * pi) -{ - opj_pi_comp_t *comp = NULL; - opj_pi_resolution_t *res = NULL; - long index = 0; - - if (!pi->first) { - comp = &pi->comps[pi->compno]; - goto LABEL_SKIP; - } else { - int compno, resno; - pi->first = 0; - pi->dx = 0; - pi->dy = 0; - pi->dz = 0; - for (compno = 0; compno < pi->numcomps; compno++) { - comp = &pi->comps[compno]; - for (resno = 0; resno < comp->numresolution[0]; resno++) { - int dx, dy, dz; - res = &comp->resolutions[resno]; - dx = comp->dx * (1 << (res->pdx + comp->numresolution[0] - 1 - resno)); - dy = comp->dy * (1 << (res->pdy + comp->numresolution[1] - 1 - resno)); - dz = comp->dz * (1 << (res->pdy + comp->numresolution[2] - 1 - resno)); - pi->dx = !pi->dx ? dx : int_min(pi->dx, dx); - pi->dy = !pi->dy ? dy : int_min(pi->dy, dy); - pi->dz = !pi->dz ? dz : int_min(pi->dz, dz); - } - } - } - - for (pi->z = pi->tz0; pi->z < pi->tz1; pi->z += pi->dz - (pi->z % pi->dz)) { - for (pi->y = pi->ty0; pi->y < pi->ty1; pi->y += pi->dy - (pi->y % pi->dy)) { - for (pi->x = pi->tx0; pi->x < pi->tx1; pi->x += pi->dx - (pi->x % pi->dx)) { - for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) { - comp = &pi->comps[pi->compno]; - for (pi->resno = pi->poc.resno0; - pi->resno < int_min(pi->poc.resno1, comp->numresolution[0]); pi->resno++) { - int levelnox, levelnoy, levelnoz; - int trx0, try0, trz0; - int trx1, try1, trz1; - int rpx, rpy, rpz; - int prci, prcj, prck; - comp = &pi->comps[pi->compno]; - if (pi->resno >= comp->numresolution[0]) { - continue; - } - res = &comp->resolutions[pi->resno]; - levelnox = comp->numresolution[0] - 1 - pi->resno; - levelnoy = comp->numresolution[1] - 1 - pi->resno; - levelnoz = comp->numresolution[2] - 1 - pi->resno; - trx0 = int_ceildiv(pi->tx0, comp->dx << levelnox); - try0 = int_ceildiv(pi->ty0, comp->dy << levelnoy); - trz0 = int_ceildiv(pi->tz0, comp->dz << levelnoz); - trx1 = int_ceildiv(pi->tx1, comp->dx << levelnox); - try1 = int_ceildiv(pi->ty1, comp->dy << levelnoy); - trz1 = int_ceildiv(pi->tz1, comp->dz << levelnoz); - rpx = res->pdx + levelnox; - rpy = res->pdy + levelnoy; - rpz = res->pdz + levelnoz; - - /* To avoid divisions by zero / undefined behaviour on shift */ - if (rpx >= 31 || ((comp->dx << rpx) >> rpx) != comp->dx || - rpy >= 31 || ((comp->dy << rpy) >> rpy) != comp->dy || - rpz >= 31 || ((comp->dz << rpz) >> rpz) != comp->dz) { - continue; - } - - if ((!(pi->x % (comp->dx << rpx) == 0) || (pi->x == pi->tx0 && - (trx0 << levelnox) % (1 << rpx)))) { - continue; - } - if ((!(pi->y % (comp->dy << rpy) == 0) || (pi->y == pi->ty0 && - (try0 << levelnoy) % (1 << rpx)))) { - continue; - } - if ((!(pi->z % (comp->dz << rpz) == 0) || (pi->z == pi->tz0 && - (trz0 << levelnoz) % (1 << rpx)))) { - continue; - } - if ((res->prctno[0] == 0) || (res->prctno[1] == 0) || (res->prctno[2] == 0)) { - continue; - } - - if ((trx0 == trx1) || (try0 == try1) || (trz0 == trz1)) { - continue; - } - - prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelnox), res->pdx) - - int_floordivpow2(trx0, res->pdx); - prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelnoy), res->pdy) - - int_floordivpow2(try0, res->pdy); - prck = int_floordivpow2(int_ceildiv(pi->z, comp->dz << levelnoz), res->pdz) - - int_floordivpow2(trz0, res->pdz); - pi->precno = prci + prcj * res->prctno[0] + prck * res->prctno[0] * - res->prctno[1]; - for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) { - index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * - pi->step_c + pi->precno * pi->step_p; - if (!pi->include[index]) { - pi->include[index] = 1; - return true; - } -LABEL_SKIP: - ; - } - } - } - } - } - } - - return false; -} - -static bool pi_next_cprl(opj_pi_iterator_t * pi) -{ - opj_pi_comp_t *comp = NULL; - opj_pi_resolution_t *res = NULL; - long index = 0; - - if (!pi->first) { - comp = &pi->comps[pi->compno]; - goto LABEL_SKIP; - } else { - pi->first = 0; - } - - for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) { - int resno; - comp = &pi->comps[pi->compno]; - pi->dx = 0; - pi->dy = 0; - pi->dz = 0; - for (resno = 0; resno < comp->numresolution[0]; resno++) { - int dx, dy, dz; - res = &comp->resolutions[resno]; - dx = comp->dx * (1 << (res->pdx + comp->numresolution[0] - 1 - resno)); - dy = comp->dy * (1 << (res->pdy + comp->numresolution[1] - 1 - resno)); - dz = comp->dz * (1 << (res->pdz + comp->numresolution[2] - 1 - resno)); - pi->dx = !pi->dx ? dx : int_min(pi->dx, dx); - pi->dy = !pi->dy ? dy : int_min(pi->dy, dy); - pi->dz = !pi->dz ? dz : int_min(pi->dz, dz); - } - for (pi->z = pi->tz0; pi->z < pi->tz1; pi->z += pi->dz - (pi->z % pi->dz)) { - for (pi->y = pi->ty0; pi->y < pi->ty1; pi->y += pi->dy - (pi->y % pi->dy)) { - for (pi->x = pi->tx0; pi->x < pi->tx1; pi->x += pi->dx - (pi->x % pi->dx)) { - for (pi->resno = pi->poc.resno0; - pi->resno < int_min(pi->poc.resno1, comp->numresolution[0]); pi->resno++) { - int levelnox, levelnoy, levelnoz; - int trx0, try0, trz0; - int trx1, try1, trz1; - int rpx, rpy, rpz; - int prci, prcj, prck; - comp = &pi->comps[pi->compno]; - if (pi->resno >= comp->numresolution[0]) { - continue; - } - res = &comp->resolutions[pi->resno]; - levelnox = comp->numresolution[0] - 1 - pi->resno; - levelnoy = comp->numresolution[1] - 1 - pi->resno; - levelnoz = comp->numresolution[2] - 1 - pi->resno; - trx0 = int_ceildiv(pi->tx0, comp->dx << levelnox); - try0 = int_ceildiv(pi->ty0, comp->dy << levelnoy); - trz0 = int_ceildiv(pi->tz0, comp->dz << levelnoz); - trx1 = int_ceildiv(pi->tx1, comp->dx << levelnox); - try1 = int_ceildiv(pi->ty1, comp->dy << levelnoy); - trz1 = int_ceildiv(pi->tz1, comp->dz << levelnoz); - rpx = res->pdx + levelnox; - rpy = res->pdy + levelnoy; - rpz = res->pdz + levelnoz; - - /* To avoid divisions by zero / undefined behaviour on shift */ - if (rpx >= 31 || ((comp->dx << rpx) >> rpx) != comp->dx || - rpy >= 31 || ((comp->dy << rpy) >> rpy) != comp->dy || - rpz >= 31 || ((comp->dz << rpz) >> rpz) != comp->dz) { - continue; - } - - if ((!(pi->x % (comp->dx << rpx) == 0) || (pi->x == pi->tx0 && - (trx0 << levelnox) % (1 << rpx)))) { - continue; - } - if ((!(pi->y % (comp->dy << rpy) == 0) || (pi->y == pi->ty0 && - (try0 << levelnoy) % (1 << rpx)))) { - continue; - } - if ((!(pi->z % (comp->dz << rpz) == 0) || (pi->z == pi->tz0 && - (trz0 << levelnoz) % (1 << rpx)))) { - continue; - } - if ((res->prctno[0] == 0) || (res->prctno[1] == 0) || (res->prctno[2] == 0)) { - continue; - } - - if ((trx0 == trx1) || (try0 == try1) || (trz0 == trz1)) { - continue; - } - - prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelnox), res->pdx) - - int_floordivpow2(trx0, res->pdx); - prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelnoy), res->pdy) - - int_floordivpow2(try0, res->pdy); - prck = int_floordivpow2(int_ceildiv(pi->z, comp->dz << levelnoz), res->pdz) - - int_floordivpow2(trz0, res->pdz); - pi->precno = prci + prcj * res->prctno[0] + prck * res->prctno[0] * - res->prctno[1]; - for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) { - index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * - pi->step_c + pi->precno * pi->step_p; - if (!pi->include[index]) { - pi->include[index] = 1; - return true; - } -LABEL_SKIP: - ; - } - } - } - } - } - } - - return false; -} - -/* -========================================================== - Packet iterator interface -========================================================== -*/ - -opj_pi_iterator_t *pi_create(opj_volume_t *volume, opj_cp_t *cp, int tileno) -{ - int p, q, r; - int compno, resno, pino; - opj_pi_iterator_t *pi = NULL; - opj_tcp_t *tcp = NULL; - opj_tccp_t *tccp = NULL; - size_t array_size; - - tcp = &cp->tcps[tileno]; - - array_size = (tcp->numpocs + 1) * sizeof(opj_pi_iterator_t); - pi = (opj_pi_iterator_t *) opj_malloc(array_size); - if (!pi) { - fprintf(stdout, "[ERROR] Malloc of opj_pi_iterator failed \n"); - return NULL; - } - - for (pino = 0; pino < tcp->numpocs + 1; pino++) { /* change */ - int maxres = 0; - int maxprec = 0; - p = tileno % cp->tw; - q = tileno / cp->tw; - r = tileno / (cp->tw * cp->th); - - pi[pino].tx0 = int_max(cp->tx0 + p * cp->tdx, volume->x0); - pi[pino].ty0 = int_max(cp->ty0 + q * cp->tdy, volume->y0); - pi[pino].tz0 = int_max(cp->tz0 + r * cp->tdz, volume->z0); - pi[pino].tx1 = int_min(cp->tx0 + (p + 1) * cp->tdx, volume->x1); - pi[pino].ty1 = int_min(cp->ty0 + (q + 1) * cp->tdy, volume->y1); - pi[pino].tz1 = int_min(cp->tz0 + (r + 1) * cp->tdz, volume->z1); - pi[pino].numcomps = volume->numcomps; - - array_size = volume->numcomps * sizeof(opj_pi_comp_t); - pi[pino].comps = (opj_pi_comp_t *) opj_malloc(array_size); - if (!pi[pino].comps) { - fprintf(stdout, "[ERROR] Malloc of opj_pi_comp failed \n"); - pi_destroy(pi, cp, tileno); - return NULL; - } - memset(pi[pino].comps, 0, array_size); - - for (compno = 0; compno < pi->numcomps; compno++) { - int tcx0, tcx1, tcy0, tcy1, tcz0, tcz1; - int i; - opj_pi_comp_t *comp = &pi[pino].comps[compno]; - tccp = &tcp->tccps[compno]; - - comp->dx = volume->comps[compno].dx; - comp->dy = volume->comps[compno].dy; - comp->dz = volume->comps[compno].dz; - for (i = 0; i < 3; i++) { - comp->numresolution[i] = tccp->numresolution[i]; - if (comp->numresolution[i] > maxres) { - maxres = comp->numresolution[i]; - } - } - array_size = comp->numresolution[0] * sizeof(opj_pi_resolution_t); - comp->resolutions = (opj_pi_resolution_t *) opj_malloc(array_size); - if (!comp->resolutions) { - fprintf(stdout, "[ERROR] Malloc of opj_pi_resolution failed \n"); - pi_destroy(pi, cp, tileno); - return NULL; - } - - tcx0 = int_ceildiv(pi->tx0, comp->dx); - tcy0 = int_ceildiv(pi->ty0, comp->dy); - tcz0 = int_ceildiv(pi->tz0, comp->dz); - tcx1 = int_ceildiv(pi->tx1, comp->dx); - tcy1 = int_ceildiv(pi->ty1, comp->dy); - tcz1 = int_ceildiv(pi->tz1, comp->dz); - - for (resno = 0; resno < comp->numresolution[0]; resno++) { - int levelnox, levelnoy, levelnoz, diff; - int rx0, ry0, rz0, rx1, ry1, rz1; - int px0, py0, pz0, px1, py1, pz1; - opj_pi_resolution_t *res = &comp->resolutions[resno]; - if (tccp->csty & J3D_CCP_CSTY_PRT) { - res->pdx = tccp->prctsiz[0][resno]; - res->pdy = tccp->prctsiz[1][resno]; - res->pdz = tccp->prctsiz[2][resno]; - } else { - res->pdx = 15; - res->pdy = 15; - res->pdz = 15; - } - levelnox = comp->numresolution[0] - 1 - resno; - levelnoy = comp->numresolution[1] - 1 - resno; - levelnoz = comp->numresolution[2] - 1 - resno; - if (levelnoz < 0) { - levelnoz = 0; - } - diff = comp->numresolution[0] - comp->numresolution[2]; - - rx0 = int_ceildivpow2(tcx0, levelnox); - ry0 = int_ceildivpow2(tcy0, levelnoy); - rz0 = int_ceildivpow2(tcz0, levelnoz); - rx1 = int_ceildivpow2(tcx1, levelnox); - ry1 = int_ceildivpow2(tcy1, levelnoy); - rz1 = int_ceildivpow2(tcz1, levelnoz); - px0 = int_floordivpow2(rx0, res->pdx) << res->pdx; - py0 = int_floordivpow2(ry0, res->pdy) << res->pdy; - pz0 = int_floordivpow2(rz0, res->pdz) << res->pdz; - px1 = int_ceildivpow2(rx1, res->pdx) << res->pdx; - py1 = int_ceildivpow2(ry1, res->pdy) << res->pdy; - pz1 = int_ceildivpow2(rz1, res->pdz) << res->pdz; - res->prctno[0] = (rx0 == rx1) ? 0 : ((px1 - px0) >> res->pdx); - res->prctno[1] = (ry0 == ry1) ? 0 : ((py1 - py0) >> res->pdy); - res->prctno[2] = (rz0 == rz1) ? 0 : ((pz1 - pz0) >> res->pdz); - - if (res->prctno[0]*res->prctno[1]*res->prctno[2] > maxprec) { - maxprec = res->prctno[0] * res->prctno[1] * res->prctno[2]; - } - } - } - - tccp = &tcp->tccps[0]; - pi[pino].step_p = 1; - pi[pino].step_c = maxprec * pi[pino].step_p; - pi[pino].step_r = volume->numcomps * pi[pino].step_c; - pi[pino].step_l = maxres * pi[pino].step_r; - - if (pino == 0) { - array_size = volume->numcomps * maxres * tcp->numlayers * maxprec * sizeof( - short int); - pi[pino].include = (short int *) opj_malloc(array_size); - if (!pi[pino].include) { - fprintf(stdout, "[ERROR] Malloc of pi[pino].include failed \n"); - pi_destroy(pi, cp, tileno); - return NULL; - } - } else { - pi[pino].include = pi[pino - 1].include; - } - - if (tcp->POC == 0) { - pi[pino].first = 1; - pi[pino].poc.resno0 = 0; - pi[pino].poc.compno0 = 0; - pi[pino].poc.layno1 = tcp->numlayers; - pi[pino].poc.resno1 = maxres; - pi[pino].poc.compno1 = volume->numcomps; - pi[pino].poc.prg = tcp->prg; - } else { - pi[pino].first = 1; - pi[pino].poc.resno0 = tcp->pocs[pino].resno0; - pi[pino].poc.compno0 = tcp->pocs[pino].compno0; - pi[pino].poc.layno1 = tcp->pocs[pino].layno1; - pi[pino].poc.resno1 = tcp->pocs[pino].resno1; - pi[pino].poc.compno1 = tcp->pocs[pino].compno1; - pi[pino].poc.prg = tcp->pocs[pino].prg; - } - } - - return pi; -} - -void pi_destroy(opj_pi_iterator_t *pi, opj_cp_t *cp, int tileno) -{ - int compno, pino; - opj_tcp_t *tcp = &cp->tcps[tileno]; - if (pi) { - for (pino = 0; pino < tcp->numpocs + 1; pino++) { - if (pi[pino].comps) { - for (compno = 0; compno < pi->numcomps; compno++) { - opj_pi_comp_t *comp = &pi[pino].comps[compno]; - if (comp->resolutions) { - opj_free(comp->resolutions); - } - } - opj_free(pi[pino].comps); - } - } - if (pi->include) { - opj_free(pi->include); - } - opj_free(pi); - } -} - -bool pi_next(opj_pi_iterator_t * pi) -{ - switch (pi->poc.prg) { - case LRCP: - return pi_next_lrcp(pi); - case RLCP: - return pi_next_rlcp(pi); - case RPCL: - return pi_next_rpcl(pi); - case PCRL: - return pi_next_pcrl(pi); - case CPRL: - return pi_next_cprl(pi); - } - - return false; -} - diff --git a/src/lib/openjp3d/pi.h b/src/lib/openjp3d/pi.h deleted file mode 100644 index 6e6118dd..00000000 --- a/src/lib/openjp3d/pi.h +++ /dev/null @@ -1,150 +0,0 @@ -/* - * 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, Mónica Díez García, 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 __PI_H -#define __PI_H -/** -@file pi.h -@brief Implementation of a packet iterator (PI) - -The functions in PI.C have for goal to realize a packet iterator that permits to get the next -packet following the progression order and change of it. The functions in PI.C are used -by some function in T2.C. -*/ - -/** @defgroup PI PI - Implementation of a packet iterator */ -/*@{*/ - -/** -Packet iterator : resolution level information -*/ -typedef struct opj_pi_resolution { - /** Size of precints in horizontal axis */ - int pdx; - /** Size of precints in vertical axis */ - int pdy; - /** Size of precints in axial axis */ - int pdz; - /** Number of precints in each axis */ - int prctno[3]; -} opj_pi_resolution_t; - -/** -Packet iterator : component information -*/ -typedef struct opj_pi_comp { - /** Size in horizontal axis */ - int dx; - /** Size in vertical axis */ - int dy; - /** Size in axial axis */ - int dz; - /** Number of resolution levels */ - int numresolution[3]; - /** Packet iterator : resolution level information */ - opj_pi_resolution_t *resolutions; -} opj_pi_comp_t; - -/** -Packet iterator -*/ -typedef struct opj_pi_iterator { - /** precise if the packet has been already used (useful for progression order change) */ - short int *include; - /** layer step used to localize the packet in the include vector */ - int step_l; - /** resolution step used to localize the packet in the include vector */ - int step_r; - /** component step used to localize the packet in the include vector */ - int step_c; - /** precinct step used to localize the packet in the include vector */ - int step_p; - /** component that identify the packet */ - int compno; - /** resolution that identify the packet */ - int resno; - /** precinct that identify the packet */ - int precno; - /** layer that identify the packet */ - int layno; - /** 0 if the first packet */ - int first; - /** progression order change information */ - opj_poc_t poc; - /** Packet iterator : component information */ - opj_pi_comp_t *comps; - - int numcomps; - int tx0, ty0, tz0; - int tx1, ty1, tz1; - int x, y, z; - int dx, dy, dz; -} opj_pi_iterator_t; - -/** @name Funciones generales */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Create a packet iterator -@param volume Raw volume for which the packets will be listed -@param cp Coding parameters -@param tileno Number that identifies the tile for which to list the packets -@return Returns a packet iterator that points to the first packet of the tile -@see pi_destroy -*/ -opj_pi_iterator_t *pi_create(opj_volume_t * volume, opj_cp_t * cp, int tileno); - -/** -Destroy a packet iterator -@param pi Previously created packet iterator -@param cp Coding parameters -@param tileno Number that identifies the tile for which the packets were listed -@see pi_create -*/ -void pi_destroy(opj_pi_iterator_t *pi, opj_cp_t *cp, int tileno); - -/** -Modify the packet iterator to point to the next packet -@param pi Packet iterator to modify -@return Returns false if pi pointed to the last packet or else returns true -*/ -bool pi_next(opj_pi_iterator_t * pi); -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __PI_H */ diff --git a/src/lib/openjp3d/raw.c b/src/lib/openjp3d/raw.c deleted file mode 100644 index ab0c2d2b..00000000 --- a/src/lib/openjp3d/raw.c +++ /dev/null @@ -1,96 +0,0 @@ -/* - * 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) 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 - * 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_includes.h" - -/* -========================================================== - local functions -========================================================== -*/ - - -/* -========================================================== - RAW encoding interface -========================================================== -*/ - -opj_raw_t* raw_create() -{ - opj_raw_t *raw = (opj_raw_t*)opj_malloc(sizeof(opj_raw_t)); - return raw; -} - -void raw_destroy(opj_raw_t *raw) -{ - if (raw) { - opj_free(raw); - } -} - -int raw_numbytes(opj_raw_t *raw) -{ - return raw->bp - raw->start; -} - -void raw_init_dec(opj_raw_t *raw, unsigned char *bp, int len) -{ - raw->start = bp; - raw->lenmax = len; - raw->len = 0; - raw->c = 0; - raw->ct = 0; -} - -int raw_decode(opj_raw_t *raw) -{ - int d; - if (raw->ct == 0) { - raw->ct = 8; - if (raw->len == raw->lenmax) { - raw->c = 0xff; - } else { - if (raw->c == 0xff) { - raw->ct = 7; - } - raw->c = *(raw->start + raw->len); - raw->len++; - } - } - raw->ct--; - d = (raw->c >> raw->ct) & 0x01; - - return d; -} - diff --git a/src/lib/openjp3d/raw.h b/src/lib/openjp3d/raw.h deleted file mode 100644 index a9d7080a..00000000 --- a/src/lib/openjp3d/raw.h +++ /dev/null @@ -1,104 +0,0 @@ -/* - * 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) 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 - * 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 __RAW_H -#define __RAW_H -/** -@file raw.h -@brief Implementation of operations for raw encoding (RAW) - -The functions in RAW.C have for goal to realize the operation of raw encoding linked -with the corresponding mode switch. -*/ - -/** @defgroup RAW RAW - Implementation of operations for raw encoding */ -/*@{*/ - -/** -RAW encoding operations -*/ -typedef struct opj_raw { - /** Temporary buffer where bits are coded or decoded */ - unsigned char c; - /** Number of bits already read or free to write */ - unsigned int ct; - /** Maximum length to decode */ - unsigned int lenmax; - /** Length decoded */ - unsigned int len; - /** Pointer to the current position in the buffer */ - unsigned char *bp; - /** Pointer to the start of the buffer */ - unsigned char *start; - /** Pointer to the end of the buffer */ - unsigned char *end; -} opj_raw_t; - -/** @name Funciones generales */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Create a new RAW handle -@return Returns a new RAW handle if successful, returns NULL otherwise -*/ -opj_raw_t* raw_create(void); -/** -Destroy a previously created RAW handle -@param raw RAW handle to destroy -*/ -void raw_destroy(opj_raw_t *raw); -/** -Return the number of bytes written/read since initialisation -@param raw RAW handle to destroy -@return Returns the number of bytes already encoded -*/ -int raw_numbytes(opj_raw_t *raw); -/** -Initialize the decoder -@param raw RAW handle -@param bp Pointer to the start of the buffer from which the bytes will be read -@param len Length of the input buffer -*/ -void raw_init_dec(opj_raw_t *raw, unsigned char *bp, int len); -/** -Decode a symbol using raw-decoder. Cfr p.506 TAUBMAN -@param raw RAW handle -@return Returns the decoded symbol (0 or 1) -*/ -int raw_decode(opj_raw_t *raw); -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __RAW_H */ diff --git a/src/lib/openjp3d/t1.c b/src/lib/openjp3d/t1.c deleted file mode 100644 index a10ba5e4..00000000 --- a/src/lib/openjp3d/t1.c +++ /dev/null @@ -1,1294 +0,0 @@ -/* - * 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 - * 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_includes.h" - -/** @defgroup T1 T1 - Implementation of the tier-1 coding */ -/*@{*/ - -/** @name Local static functions */ -/*@{*/ - -static int t1_getctxno_zc(opj_t1_t *t1, int f, int orient); -static int t1_getctxno_sc(opj_t1_t *t1, int f); -static int t1_getctxno_mag(opj_t1_t *t1, int f); -static int t1_getspb(opj_t1_t *t1, int f); -static int t1_getnmsedec_sig(opj_t1_t *t1, int x, int bitpos); -static int t1_getnmsedec_ref(opj_t1_t *t1, int x, int bitpos); -static void t1_updateflags(int *fp, int s); -/** -Encode significant pass -*/ -static void t1_enc_sigpass_step(opj_t1_t *t1, int *fp, int *dp, int orient, - int bpno, int one, int *nmsedec, char type, int vsc); -/** -Decode significant pass -*/ -static void t1_dec_sigpass_step(opj_t1_t *t1, int *fp, int *dp, int orient, - int oneplushalf, char type, int vsc); -/** -Encode significant pass -*/ -static void t1_enc_sigpass(opj_t1_t *t1, int w, int h, int l, int bpno, - int orient, int *nmsedec, char type, int cblksty); -/** -Decode significant pass -*/ -static void t1_dec_sigpass(opj_t1_t *t1, int w, int h, int l, int bpno, - int orient, char type, int cblksty); -/** -Encode refinement pass -*/ -static void t1_enc_refpass_step(opj_t1_t *t1, int *fp, int *dp, int bpno, - int one, int *nmsedec, char type, int vsc); -/** -Decode refinement pass -*/ -static void t1_dec_refpass_step(opj_t1_t *t1, int *fp, int *dp, int poshalf, - int neghalf, char type, int vsc); -/** -Encode refinement pass -*/ -static void t1_enc_refpass(opj_t1_t *t1, int w, int h, int l, int bpno, - int *nmsedec, char type, int cblksty); -/** -Decode refinement pass -*/ -static void t1_dec_refpass(opj_t1_t *t1, int w, int h, int l, int bpno, - char type, int cblksty); -/** -Encode clean-up pass -*/ -static void t1_enc_clnpass_step(opj_t1_t *t1, int *fp, int *dp, int orient, - int bpno, int one, int *nmsedec, int partial, int vsc); -/** -Decode clean-up pass -*/ -static void t1_dec_clnpass_step(opj_t1_t *t1, int *fp, int *dp, int orient, - int oneplushalf, int partial, int vsc); -/** -Encode clean-up pass -*/ -static void t1_enc_clnpass(opj_t1_t *t1, int w, int h, int l, int bpno, - int orient, int *nmsedec, int cblksty); -/** -Decode clean-up pass -*/ -static void t1_dec_clnpass(opj_t1_t *t1, int w, int h, int l, int bpno, - int orient, int cblksty); -/** -Encode 1 code-block -@param t1 T1 handle -@param cblk Code-block coding parameters -@param orient -@param compno Component number -@param level -@param dwtid -@param stepsize -@param cblksty Code-block style -@param numcomps -@param tile -*/ -static void t1_encode_cblk(opj_t1_t *t1, opj_tcd_cblk_t * cblk, int orient, - int compno, int level[3], int dwtid[3], double stepsize, int cblksty, - int numcomps, opj_tcd_tile_t * tile); -/** -Decode 1 code-block -@param t1 T1 handle -@param cblk Code-block coding parameters -@param orient -@param roishift Region of interest shifting value -@param cblksty Code-block style -*/ -static void t1_decode_cblk(opj_t1_t *t1, opj_tcd_cblk_t * cblk, int orient, - int roishift, int cblksty); - -static int t1_init_ctxno_zc(int f, int orient); -static int t1_init_ctxno_sc(int f); -static int t1_init_ctxno_mag(int f); -static int t1_init_spb(int f); -/** -Initialize the look-up tables of the Tier-1 coder/decoder -@param t1 T1 handle -*/ -static void t1_init_luts(opj_t1_t *t1); - -/*@}*/ - -/*@}*/ - -/* ----------------------------------------------------------------------- */ - -static int t1_getctxno_zc(opj_t1_t *t1, int f, int orient) -{ - return t1->lut_ctxno_zc[(orient << 8) | (f & T1_SIG_OTH)]; -} - -static int t1_getctxno_sc(opj_t1_t *t1, int f) -{ - return t1->lut_ctxno_sc[(f & (T1_SIG_PRIM | T1_SGN)) >> 4]; -} - -static int t1_getctxno_mag(opj_t1_t *t1, int f) -{ - return t1->lut_ctxno_mag[(f & T1_SIG_OTH) | (((f & T1_REFINE) != 0) << 11)]; -} - -static int t1_getspb(opj_t1_t *t1, int f) -{ - return t1->lut_spb[(f & (T1_SIG_PRIM | T1_SGN)) >> 4]; -} - -static int t1_getnmsedec_sig(opj_t1_t *t1, int x, int bitpos) -{ - if (bitpos > T1_NMSEDEC_FRACBITS) { - return t1->lut_nmsedec_sig[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & (( - 1 << T1_NMSEDEC_BITS) - 1)]; - } - - return t1->lut_nmsedec_sig0[x & ((1 << T1_NMSEDEC_BITS) - 1)]; -} - -static int t1_getnmsedec_ref(opj_t1_t *t1, int x, int bitpos) -{ - if (bitpos > T1_NMSEDEC_FRACBITS) { - return t1->lut_nmsedec_ref[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & (( - 1 << T1_NMSEDEC_BITS) - 1)]; - } - - return t1->lut_nmsedec_ref0[x & ((1 << T1_NMSEDEC_BITS) - 1)]; -} - -static void t1_updateflags(int *fp, int s) -{ - int *np = fp - (T1_MAXCBLKW + 2); - int *sp = fp + (T1_MAXCBLKW + 2); - np[-1] |= T1_SIG_SE; - np[1] |= T1_SIG_SW; - sp[-1] |= T1_SIG_NE; - sp[1] |= T1_SIG_NW; - *np |= T1_SIG_S; - *sp |= T1_SIG_N; - fp[-1] |= T1_SIG_E; - fp[1] |= T1_SIG_W; - if (s) { - *np |= T1_SGN_S; - *sp |= T1_SGN_N; - fp[-1] |= T1_SGN_E; - fp[1] |= T1_SGN_W; - } -} - -static void t1_enc_sigpass_step(opj_t1_t *t1, int *fp, int *dp, int orient, - int bpno, int one, int *nmsedec, char type, int vsc) -{ - int v, flag; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - flag = vsc ? ((*fp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*fp); - if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) { - v = int_abs(*dp) & one ? 1 : 0; - if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */ - mqc_setcurctx(mqc, t1_getctxno_zc(t1, flag, orient)); /* ESSAI */ - mqc_bypass_enc(mqc, v); - } else { - mqc_setcurctx(mqc, t1_getctxno_zc(t1, flag, orient)); - mqc_encode(mqc, v); - } - if (v) { - v = *dp < 0 ? 1 : 0; - *nmsedec += t1_getnmsedec_sig(t1, int_abs(*dp), bpno + T1_NMSEDEC_FRACBITS); - if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */ - mqc_setcurctx(mqc, t1_getctxno_sc(t1, flag)); /* ESSAI */ - mqc_bypass_enc(mqc, v); - } else { - mqc_setcurctx(mqc, t1_getctxno_sc(t1, flag)); - mqc_encode(mqc, v ^ t1_getspb(t1, flag)); - } - t1_updateflags(fp, v); - *fp |= T1_SIG; - } - *fp |= T1_VISIT; - } -} - -static void t1_dec_sigpass_step(opj_t1_t *t1, int *fp, int *dp, int orient, - int oneplushalf, char type, int vsc) -{ - int v, flag; - - opj_raw_t *raw = t1->raw; /* RAW component */ - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - flag = vsc ? ((*fp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*fp); - if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) { - if (type == T1_TYPE_RAW) { - if (raw_decode(raw)) { - v = raw_decode(raw); /* ESSAI */ - *dp = v ? -oneplushalf : oneplushalf; - t1_updateflags(fp, v); - *fp |= T1_SIG; - } - } else { - mqc_setcurctx(mqc, t1_getctxno_zc(t1, flag, orient)); - if (mqc_decode(mqc)) { - mqc_setcurctx(mqc, t1_getctxno_sc(t1, flag)); - v = mqc_decode(mqc) ^ t1_getspb(t1, flag); - *dp = v ? -oneplushalf : oneplushalf; - t1_updateflags(fp, v); - *fp |= T1_SIG; - } - } - *fp |= T1_VISIT; - } -} /* VSC and BYPASS by Antonin */ - -static void t1_enc_sigpass(opj_t1_t *t1, int w, int h, int l, int bpno, - int orient, int *nmsedec, char type, int cblksty) -{ - int i, j, k, m, one, vsc; - *nmsedec = 0; - one = 1 << (bpno + T1_NMSEDEC_FRACBITS); - for (m = 0; m < l; m++) { - for (k = 0; k < h; k += 4) { - for (i = 0; i < w; i++) { - for (j = k; j < k + 4 && j < h; j++) { - vsc = ((cblksty & J3D_CCP_CBLKSTY_VSC) && (j == k + 3 || j == h - 1)) ? 1 : 0; - t1_enc_sigpass_step(t1, &t1->flags[1 + m][1 + j][1 + i], &t1->data[m][j][i], - orient, bpno, one, nmsedec, type, vsc); - } - } - } - } -} - -static void t1_dec_sigpass(opj_t1_t *t1, int w, int h, int l, int bpno, - int orient, char type, int cblksty) -{ - int i, j, k, m, one, half, oneplushalf, vsc; - one = 1 << bpno; - half = one >> 1; - oneplushalf = one | half; - for (m = 0; m < l; m++) { - for (k = 0; k < h; k += 4) { - for (i = 0; i < w; i++) { - for (j = k; j < k + 4 && j < h; j++) { - vsc = ((cblksty & J3D_CCP_CBLKSTY_VSC) && (j == k + 3 || j == h - 1)) ? 1 : 0; - t1_dec_sigpass_step(t1, &t1->flags[1 + m][1 + j][1 + i], &t1->data[m][j][i], - orient, oneplushalf, type, vsc); - } - } - } - } -} /* VSC and BYPASS by Antonin */ - -static void t1_enc_refpass_step(opj_t1_t *t1, int *fp, int *dp, int bpno, - int one, int *nmsedec, char type, int vsc) -{ - int v, flag; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - flag = vsc ? ((*fp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*fp); - if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) { - *nmsedec += t1_getnmsedec_ref(t1, int_abs(*dp), bpno + T1_NMSEDEC_FRACBITS); - v = int_abs(*dp) & one ? 1 : 0; - if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */ - mqc_setcurctx(mqc, t1_getctxno_mag(t1, flag)); /* ESSAI */ - mqc_bypass_enc(mqc, v); - } else { - mqc_setcurctx(mqc, t1_getctxno_mag(t1, flag)); - mqc_encode(mqc, v); - } - *fp |= T1_REFINE; - } -} - -static void t1_dec_refpass_step(opj_t1_t *t1, int *fp, int *dp, int poshalf, - int neghalf, char type, int vsc) -{ - int v, t, flag; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - opj_raw_t *raw = t1->raw; /* RAW component */ - - flag = vsc ? ((*fp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*fp); - if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) { - if (type == T1_TYPE_RAW) { - mqc_setcurctx(mqc, t1_getctxno_mag(t1, flag)); /* ESSAI */ - v = raw_decode(raw); - } else { - mqc_setcurctx(mqc, t1_getctxno_mag(t1, flag)); - v = mqc_decode(mqc); - } - t = v ? poshalf : neghalf; - *dp += *dp < 0 ? -t : t; - *fp |= T1_REFINE; - } -} /* VSC and BYPASS by Antonin */ - -static void t1_enc_refpass(opj_t1_t *t1, int w, int h, int l, int bpno, - int *nmsedec, char type, int cblksty) -{ - int i, j, k, m, one, vsc; - *nmsedec = 0; - one = 1 << (bpno + T1_NMSEDEC_FRACBITS); - for (m = 0; m < l; m++) { - for (k = 0; k < h; k += 4) { - for (i = 0; i < w; i++) { - for (j = k; j < k + 4 && j < h; j++) { - vsc = ((cblksty & J3D_CCP_CBLKSTY_VSC) && (j == k + 3 || j == h - 1)) ? 1 : 0; - t1_enc_refpass_step(t1, &t1->flags[1 + m][1 + j][1 + i], &t1->data[m][j][i], - bpno, one, nmsedec, type, vsc); - } - } - } - } -} - -static void t1_dec_refpass(opj_t1_t *t1, int w, int h, int l, int bpno, - char type, int cblksty) -{ - int i, j, k, m, one, poshalf, neghalf; - int vsc; - one = 1 << bpno; - poshalf = one >> 1; - neghalf = bpno > 0 ? -poshalf : -1; - for (m = 0; m < l; m++) { - for (k = 0; k < h; k += 4) { - for (i = 0; i < w; i++) { - for (j = k; j < k + 4 && j < h; j++) { - vsc = ((cblksty & J3D_CCP_CBLKSTY_VSC) && (j == k + 3 || j == h - 1)) ? 1 : 0; - t1_dec_refpass_step(t1, &t1->flags[1 + m][1 + j][1 + i], &t1->data[m][j][i], - poshalf, neghalf, type, vsc); - } - } - } - } -} /* VSC and BYPASS by Antonin */ - -static void t1_enc_clnpass_step(opj_t1_t *t1, int *fp, int *dp, int orient, - int bpno, int one, int *nmsedec, int partial, int vsc) -{ - int v, flag; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - flag = vsc ? ((*fp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*fp); - if (partial) { - goto LABEL_PARTIAL; - } - if (!(*fp & (T1_SIG | T1_VISIT))) { - mqc_setcurctx(mqc, t1_getctxno_zc(t1, flag, orient)); - v = int_abs(*dp) & one ? 1 : 0; - mqc_encode(mqc, v); - if (v) { -LABEL_PARTIAL: - *nmsedec += t1_getnmsedec_sig(t1, int_abs(*dp), bpno + T1_NMSEDEC_FRACBITS); - mqc_setcurctx(mqc, t1_getctxno_sc(t1, flag)); - v = *dp < 0 ? 1 : 0; - mqc_encode(mqc, v ^ t1_getspb(t1, flag)); - t1_updateflags(fp, v); - *fp |= T1_SIG; - } - } - *fp &= ~T1_VISIT; -} - -static void t1_dec_clnpass_step(opj_t1_t *t1, int *fp, int *dp, int orient, - int oneplushalf, int partial, int vsc) -{ - int v, flag; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - flag = vsc ? ((*fp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*fp); - if (partial) { - goto LABEL_PARTIAL; - } - if (!(flag & (T1_SIG | T1_VISIT))) { - mqc_setcurctx(mqc, t1_getctxno_zc(t1, flag, orient)); - if (mqc_decode(mqc)) { -LABEL_PARTIAL: - mqc_setcurctx(mqc, t1_getctxno_sc(t1, flag)); - v = mqc_decode(mqc) ^ t1_getspb(t1, flag); - *dp = v ? -oneplushalf : oneplushalf; - t1_updateflags(fp, v); - *fp |= T1_SIG; - } - } - *fp &= ~T1_VISIT; -} /* VSC and BYPASS by Antonin */ - -static void t1_enc_clnpass(opj_t1_t *t1, int w, int h, int l, int bpno, - int orient, int *nmsedec, int cblksty) -{ - int i, j, k, m, one, agg, runlen, vsc; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - *nmsedec = 0; - one = 1 << (bpno + T1_NMSEDEC_FRACBITS); - for (m = 0; m < l; m++) { - for (k = 0; k < h; k += 4) { - for (i = 0; i < w; i++) { - if (k + 3 < h) { - if (cblksty & J3D_CCP_CBLKSTY_VSC) { - agg = !(t1->flags[1 + m][1 + k][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || t1->flags[1 + m][1 + k + 1][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || t1->flags[1 + m][1 + k + 2][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || (t1->flags[1 + m][1 + k + 3][1 + i] - & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) & (T1_SIG | T1_VISIT | - T1_SIG_OTH)); - } else { - agg = !(t1->flags[1 + m][1 + k][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || t1->flags[1 + m][1 + k + 1][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || t1->flags[1 + m][1 + k + 2][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || t1->flags[1 + m][1 + k + 3][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH)); - } - } else { - agg = 0; - } - if (agg) { - for (runlen = 0; runlen < 4; runlen++) { - if (int_abs(t1->data[m][k + runlen][i]) & one) { - break; - } - } - mqc_setcurctx(mqc, T1_CTXNO_AGG); - mqc_encode(mqc, runlen != 4); - if (runlen == 4) { - continue; - } - mqc_setcurctx(mqc, T1_CTXNO_UNI); - mqc_encode(mqc, runlen >> 1); - mqc_encode(mqc, runlen & 1); - } else { - runlen = 0; - } - for (j = k + runlen; j < k + 4 && j < h; j++) { - vsc = ((cblksty & J3D_CCP_CBLKSTY_VSC) && (j == k + 3 || j == h - 1)) ? 1 : 0; - t1_enc_clnpass_step(t1, &(t1->flags[1 + m][1 + j][1 + i]), &(t1->data[m][j][i]), - orient, bpno, one, nmsedec, agg && (j == k + runlen), vsc); - } - } - } - } -} - -static void t1_dec_clnpass(opj_t1_t *t1, int w, int h, int l, int bpno, - int orient, int cblksty) -{ - int i, j, k, m, one, half, oneplushalf, agg, runlen, vsc; - int segsym = cblksty & J3D_CCP_CBLKSTY_SEGSYM; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - one = 1 << bpno; - half = one >> 1; - oneplushalf = one | half; - for (m = 0; m < l; m++) { - for (k = 0; k < h; k += 4) { - for (i = 0; i < w; i++) { - if (k + 3 < h) { - if (cblksty & J3D_CCP_CBLKSTY_VSC) { - agg = !(t1->flags[1 + m][1 + k][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || t1->flags[1 + m][1 + k + 1][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || t1->flags[1 + m][1 + k + 2][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || (t1->flags[1 + m][1 + k + 3][1 + i] - & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) & (T1_SIG | T1_VISIT | - T1_SIG_OTH)); - } else { - agg = !(t1->flags[1 + m][1 + k][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || t1->flags[1 + m][1 + k + 1][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || t1->flags[1 + m][1 + k + 2][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || t1->flags[1 + m][1 + k + 3][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH)); - } - } else { - agg = 0; - } - if (agg) { - mqc_setcurctx(mqc, T1_CTXNO_AGG); - if (!mqc_decode(mqc)) { - continue; - } - mqc_setcurctx(mqc, T1_CTXNO_UNI); - runlen = mqc_decode(mqc); - runlen = (runlen << 1) | mqc_decode(mqc); - } else { - runlen = 0; - } - for (j = k + runlen; j < k + 4 && j < h; j++) { - vsc = ((cblksty & J3D_CCP_CBLKSTY_VSC) && (j == k + 3 || j == h - 1)) ? 1 : 0; - t1_dec_clnpass_step(t1, &t1->flags[1 + m][1 + j][1 + i], &t1->data[m][j][i], - orient, oneplushalf, agg && (j == k + runlen), vsc); - } - } - } - } - if (segsym) { - int v = 0; - mqc_setcurctx(mqc, T1_CTXNO_UNI); - v = mqc_decode(mqc); - v = (v << 1) | mqc_decode(mqc); - v = (v << 1) | mqc_decode(mqc); - v = (v << 1) | mqc_decode(mqc); - /* - if (v!=0xa) { - opj_event_msg(t1->cinfo, EVT_WARNING, "Bad segmentation symbol %x\n", v); - } - */ - } -} /* VSC and BYPASS by Antonin */ - - -static void t1_encode_cblk(opj_t1_t *t1, opj_tcd_cblk_t * cblk, int orient, - int compno, int level[3], int dwtid[3], double stepsize, int cblksty, - int numcomps, opj_tcd_tile_t * tile) -{ - int i, j, k; - int w, h, l; - int passno; - int bpno, passtype; - int max; - int nmsedec = 0; - double cumwmsedec = 0; - char type = T1_TYPE_MQ; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - w = cblk->x1 - cblk->x0; - h = cblk->y1 - cblk->y0; - l = cblk->z1 - cblk->z0; - - max = 0; - for (k = 0; k < l; k++) { - for (j = 0; j < h; j++) { - for (i = 0; i < w; i++) { - max = int_max(max, int_abs(t1->data[k][j][i])); - } - } - } - for (k = 0; k <= l; k++) { - for (j = 0; j <= h; j++) { - for (i = 0; i <= w; i++) { - t1->flags[k][j][i] = 0; - } - } - } - - cblk->numbps = max ? (int_floorlog2(max) + 1) - T1_NMSEDEC_FRACBITS : 0; - - bpno = cblk->numbps - 1; - passtype = 2; - - mqc_reset_enc(mqc); - mqc_init_enc(mqc, cblk->data); - - for (passno = 0; bpno >= 0; passno++) { - opj_tcd_pass_t *pass = &cblk->passes[passno]; - int correction = 3; - double tmpwmsedec; - type = ((bpno < (cblk->numbps - 4)) && (passtype < 2) && - (cblksty & J3D_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ; - /*fprintf(stdout,"passno %d passtype %d w %d h %d l %d bpno %d orient %d type %d cblksty %d\n",passno,passtype,w,h,l,bpno,orient,type,cblksty);*/ - - switch (passtype) { - case 0: - t1_enc_sigpass(t1, w, h, l, bpno, orient, &nmsedec, type, cblksty); - break; - case 1: - t1_enc_refpass(t1, w, h, l, bpno, &nmsedec, type, cblksty); - break; - case 2: - /*fprintf(stdout,"w %d h %d l %d bpno %d orient %d \n",w,h,l,bpno,orient);*/ - t1_enc_clnpass(t1, w, h, l, bpno, orient, &nmsedec, cblksty); - /* code switch SEGMARK (i.e. SEGSYM) */ - if (cblksty & J3D_CCP_CBLKSTY_SEGSYM) { - mqc_segmark_enc(mqc); - } - break; - } - - /* fixed_quality */ - tmpwmsedec = t1_getwmsedec(nmsedec, compno, level, orient, bpno, stepsize, - numcomps, dwtid); - cumwmsedec += tmpwmsedec; - tile->distotile += tmpwmsedec; - - /* Code switch "RESTART" (i.e. TERMALL) */ - if ((cblksty & J3D_CCP_CBLKSTY_TERMALL) && !((passtype == 2) && - (bpno - 1 < 0))) { - if (type == T1_TYPE_RAW) { - mqc_flush(mqc); - correction = 1; - /* correction = mqc_bypass_flush_enc(); */ - } else { /* correction = mqc_restart_enc(); */ - mqc_flush(mqc); - correction = 1; - } - pass->term = 1; - } else { - if (((bpno < (cblk->numbps - 4) && (passtype > 0)) - || ((bpno == (cblk->numbps - 4)) && (passtype == 2))) && - (cblksty & J3D_CCP_CBLKSTY_LAZY)) { - if (type == T1_TYPE_RAW) { - mqc_flush(mqc); - correction = 1; - /* correction = mqc_bypass_flush_enc(); */ - } else { /* correction = mqc_restart_enc(); */ - mqc_flush(mqc); - correction = 1; - } - pass->term = 1; - } else { - pass->term = 0; - } - } - - if (++passtype == 3) { - passtype = 0; - bpno--; - } - - if (pass->term && bpno > 0) { - type = ((bpno < (cblk->numbps - 4)) && (passtype < 2) && - (cblksty & J3D_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ; - if (type == T1_TYPE_RAW) { - mqc_bypass_init_enc(mqc); - } else { - mqc_restart_init_enc(mqc); - } - } - - pass->distortiondec = cumwmsedec; - pass->rate = mqc_numbytes(mqc) + correction; /* FIXME */ - pass->len = pass->rate - (passno == 0 ? 0 : cblk->passes[passno - 1].rate); - - /* Code-switch "RESET" */ - if (cblksty & J3D_CCP_CBLKSTY_RESET) { - mqc_reset_enc(mqc); - } - } - - /* Code switch "ERTERM" (i.e. PTERM) */ - if (cblksty & J3D_CCP_CBLKSTY_PTERM) { - mqc_erterm_enc(mqc); - } else /* Default coding */ if (!(cblksty & J3D_CCP_CBLKSTY_LAZY)) { - mqc_flush(mqc); - } - - cblk->totalpasses = passno; -} - -static void t1_decode_cblk(opj_t1_t *t1, opj_tcd_cblk_t * cblk, int orient, - int roishift, int cblksty) -{ - int i, j, k, w, h, l; - int bpno, passtype; - int segno, passno; - char type = T1_TYPE_MQ; /* BYPASS mode */ - - opj_raw_t *raw = t1->raw; /* RAW component */ - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - w = cblk->x1 - cblk->x0; - h = cblk->y1 - cblk->y0; - l = cblk->z1 - cblk->z0; - - for (k = 0; k < l; k++) { - for (j = 0; j < h; j++) { - for (i = 0; i < w; i++) { - t1->data[k][j][i] = 0; - } - } - } - - for (k = 0; k <= l; k++) { - for (j = 0; j <= h; j++) { - for (i = 0; i <= w; i++) { - t1->flags[k][j][i] = 0; - } - } - } - - bpno = roishift + cblk->numbps - 1; - passtype = 2; - - mqc_reset_enc(mqc); - - for (segno = 0; segno < cblk->numsegs; segno++) { - opj_tcd_seg_t *seg = &cblk->segs[segno]; - - /* BYPASS mode */ - type = ((bpno <= (cblk->numbps - 1) - 4) && (passtype < 2) && - (cblksty & J3D_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ; - if (type == T1_TYPE_RAW) { - raw_init_dec(raw, seg->data, seg->len); - } else { - mqc_init_dec(mqc, seg->data, seg->len); - } - - for (passno = 0; passno < seg->numpasses; passno++) { - switch (passtype) { - case 0: - t1_dec_sigpass(t1, w, h, l, bpno + 1, orient, type, cblksty); - break; - case 1: - t1_dec_refpass(t1, w, h, l, bpno + 1, type, cblksty); - break; - case 2: - t1_dec_clnpass(t1, w, h, l, bpno + 1, orient, cblksty); - break; - } - - if ((cblksty & J3D_CCP_CBLKSTY_RESET) && type == T1_TYPE_MQ) { - mqc_reset_enc(mqc); - } - if (++passtype == 3) { - passtype = 0; - bpno--; - } - } - } -} - -static int t1_init_ctxno_zc(int f, int orient) -{ - int h, v, d, n, t, hv; - n = 0; - h = ((f & T1_SIG_W) != 0) + ((f & T1_SIG_E) != 0); - v = ((f & T1_SIG_N) != 0) + ((f & T1_SIG_S) != 0); - d = ((f & T1_SIG_NW) != 0) + ((f & T1_SIG_NE) != 0) + (( - f & T1_SIG_SE) != 0) + ((f & T1_SIG_SW) != 0); - - switch (orient) { - case 2: - t = h; - h = v; - v = t; - case 0: - case 1: - if (!h) { - if (!v) { - if (!d) { - n = 0; - } else if (d == 1) { - n = 1; - } else { - n = 2; - } - } else if (v == 1) { - n = 3; - } else { - n = 4; - } - } else if (h == 1) { - if (!v) { - if (!d) { - n = 5; - } else { - n = 6; - } - } else { - n = 7; - } - } else { - n = 8; - } - break; - case 3: - hv = h + v; - if (!d) { - if (!hv) { - n = 0; - } else if (hv == 1) { - n = 1; - } else { - n = 2; - } - } else if (d == 1) { - if (!hv) { - n = 3; - } else if (hv == 1) { - n = 4; - } else { - n = 5; - } - } else if (d == 2) { - if (!hv) { - n = 6; - } else { - n = 7; - } - } else { - n = 8; - } - break; - } - - return (T1_CTXNO_ZC + n); -} - -static int t1_init_ctxno_sc(int f) -{ - int hc, vc, n; - n = 0; - - hc = int_min(((f & (T1_SIG_E | T1_SGN_E)) == - T1_SIG_E) + ((f & (T1_SIG_W | T1_SGN_W)) == T1_SIG_W), - 1) - int_min(((f & (T1_SIG_E | T1_SGN_E)) == - (T1_SIG_E | T1_SGN_E)) + - ((f & (T1_SIG_W | T1_SGN_W)) == - (T1_SIG_W | T1_SGN_W)), 1); - - vc = int_min(((f & (T1_SIG_N | T1_SGN_N)) == - T1_SIG_N) + ((f & (T1_SIG_S | T1_SGN_S)) == T1_SIG_S), - 1) - int_min(((f & (T1_SIG_N | T1_SGN_N)) == - (T1_SIG_N | T1_SGN_N)) + - ((f & (T1_SIG_S | T1_SGN_S)) == - (T1_SIG_S | T1_SGN_S)), 1); - - if (hc < 0) { - hc = -hc; - vc = -vc; - } - if (!hc) { - if (vc == -1) { - n = 1; - } else if (!vc) { - n = 0; - } else { - n = 1; - } - } else if (hc == 1) { - if (vc == -1) { - n = 2; - } else if (!vc) { - n = 3; - } else { - n = 4; - } - } - - return (T1_CTXNO_SC + n); -} - -static int t1_init_ctxno_mag(int f) -{ - int n; - if (!(f & T1_REFINE)) { - n = (f & (T1_SIG_OTH)) ? 1 : 0; - } else { - n = 2; - } - - return (T1_CTXNO_MAG + n); -} - -static int t1_init_spb(int f) -{ - int hc, vc, n; - - hc = int_min(((f & (T1_SIG_E | T1_SGN_E)) == - T1_SIG_E) + ((f & (T1_SIG_W | T1_SGN_W)) == T1_SIG_W), - 1) - int_min(((f & (T1_SIG_E | T1_SGN_E)) == - (T1_SIG_E | T1_SGN_E)) + - ((f & (T1_SIG_W | T1_SGN_W)) == - (T1_SIG_W | T1_SGN_W)), 1); - - vc = int_min(((f & (T1_SIG_N | T1_SGN_N)) == - T1_SIG_N) + ((f & (T1_SIG_S | T1_SGN_S)) == T1_SIG_S), - 1) - int_min(((f & (T1_SIG_N | T1_SGN_N)) == - (T1_SIG_N | T1_SGN_N)) + - ((f & (T1_SIG_S | T1_SGN_S)) == - (T1_SIG_S | T1_SGN_S)), 1); - - if (!hc && !vc) { - n = 0; - } else { - n = (!(hc > 0 || (!hc && vc > 0))); - } - - return n; -} - -static void t1_init_luts(opj_t1_t *t1) -{ - int i, j; - double u, v, t; - for (j = 0; j < 4; j++) { - for (i = 0; i < 256; ++i) { - t1->lut_ctxno_zc[(j << 8) | i] = t1_init_ctxno_zc(i, j); - } - } - for (i = 0; i < 256; i++) { - t1->lut_ctxno_sc[i] = t1_init_ctxno_sc(i << 4); - } - for (j = 0; j < 2; j++) { - for (i = 0; i < 2048; ++i) { - t1->lut_ctxno_mag[(j << 11) + i] = t1_init_ctxno_mag((j ? T1_REFINE : 0) | i); - } - } - for (i = 0; i < 256; ++i) { - t1->lut_spb[i] = t1_init_spb(i << 4); - } - /* FIXME FIXME FIXME */ - /* fprintf(stdout,"nmsedec luts:\n"); */ - for (i = 0; i < (1 << T1_NMSEDEC_BITS); i++) { - t = i / pow(2, T1_NMSEDEC_FRACBITS); - u = t; - v = t - 1.5; - t1->lut_nmsedec_sig[i] = - int_max(0, - (int)(floor((u * u - v * v) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, - T1_NMSEDEC_FRACBITS) * 8192.0)); - t1->lut_nmsedec_sig0[i] = - int_max(0, - (int)(floor((u * u) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, - T1_NMSEDEC_FRACBITS) * 8192.0)); - u = t - 1.0; - if (i & (1 << (T1_NMSEDEC_BITS - 1))) { - v = t - 1.5; - } else { - v = t - 0.5; - } - t1->lut_nmsedec_ref[i] = - int_max(0, - (int)(floor((u * u - v * v) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, - T1_NMSEDEC_FRACBITS) * 8192.0)); - t1->lut_nmsedec_ref0[i] = - int_max(0, - (int)(floor((u * u) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, - T1_NMSEDEC_FRACBITS) * 8192.0)); - } -} - -/* ----------------------------------------------------------------------- */ - -opj_t1_t* t1_create(opj_common_ptr cinfo) -{ - opj_t1_t *t1 = (opj_t1_t*)opj_malloc(sizeof(opj_t1_t)); - if (t1) { - t1->cinfo = cinfo; - /* create MQC and RAW handles */ - t1->mqc = mqc_create(); - t1->raw = raw_create(); - /* initialize the look-up tables of the Tier-1 coder/decoder */ - t1_init_luts(t1); - } - return t1; -} - -void t1_destroy(opj_t1_t *t1) -{ - if (t1) { - /* destroy MQC and RAW handles */ - mqc_destroy(t1->mqc); - raw_destroy(t1->raw); - /*opj_free(t1->data);*/ - /*opj_free(t1->flags);*/ - opj_free(t1); - } -} - -void t1_encode_cblks(opj_t1_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp) -{ - int compno, resno, bandno, precno, cblkno; - int x, y, z, i, j, k, orient; - int n = 0; - int level[3]; - FILE *fid = NULL; - /* char filename[10];*/ - tile->distotile = 0; /* fixed_quality */ - - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - - for (resno = 0; resno < tilec->numresolution[0]; resno++) { - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - - /* Weighted first order entropy - sprintf(filename,"res%d.txt",resno); - if ((fid = fopen(filename,"w")) == 0){ - fprintf(stdout,"Error while opening %s\n", filename); - exit(1); - } - */ - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - for (precno = 0; precno < res->prctno[0] * res->prctno[1] * res->prctno[2]; - precno++) { - opj_tcd_precinct_t *prc = &band->precincts[precno]; - - for (cblkno = 0; cblkno < prc->cblkno[0] * prc->cblkno[1] * prc->cblkno[2]; - cblkno++) { - opj_tcd_cblk_t *cblk = &prc->cblks[cblkno]; - - /*fprintf(stdout,"Precno %d Cblkno %d \n",precno,cblkno);*/ - if (band->bandno == 0) { - x = cblk->x0 - band->x0; - y = cblk->y0 - band->y0; - z = cblk->z0 - band->z0; - } else if (band->bandno == 1) { - opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - x = pres->x1 - pres->x0 + cblk->x0 - band->x0; - y = cblk->y0 - band->y0; - z = cblk->z0 - band->z0; - } else if (band->bandno == 2) { - opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - x = cblk->x0 - band->x0; - y = pres->y1 - pres->y0 + cblk->y0 - band->y0; - z = cblk->z0 - band->z0; - } else if (band->bandno == 3) { - opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - x = pres->x1 - pres->x0 + cblk->x0 - band->x0; - y = pres->y1 - pres->y0 + cblk->y0 - band->y0; - z = cblk->z0 - band->z0; - } else if (band->bandno == 4) { - opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - x = cblk->x0 - band->x0; - y = cblk->y0 - band->y0; - z = pres->z1 - pres->z0 + cblk->z0 - band->z0; - } else if (band->bandno == 5) { - opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - x = pres->x1 - pres->x0 + cblk->x0 - band->x0; - y = cblk->y0 - band->y0; - z = pres->z1 - pres->z0 + cblk->z0 - band->z0; - } else if (band->bandno == 6) { - opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - x = cblk->x0 - band->x0; - y = pres->y1 - pres->y0 + cblk->y0 - band->y0; - z = pres->z1 - pres->z0 + cblk->z0 - band->z0; - } else if (band->bandno == 7) { - opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - x = pres->x1 - pres->x0 + cblk->x0 - band->x0; - y = pres->y1 - pres->y0 + cblk->y0 - band->y0; - z = pres->z1 - pres->z0 + cblk->z0 - band->z0; - } - - if (tcp->tccps[compno].reversible == 1) { - for (k = 0; k < cblk->z1 - cblk->z0; k++) { - for (j = 0; j < cblk->y1 - cblk->y0; j++) { - for (i = 0; i < cblk->x1 - cblk->x0; i++) { - t1->data[k][j][i] = - tilec->data[(x + i) + (y + j) * (tilec->x1 - tilec->x0) + (z + k) * - (tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0)] << T1_NMSEDEC_FRACBITS; - /*fprintf(fid," %d",t1->data[k][j][i]);*/ - } - } - } - } else if (tcp->tccps[compno].reversible == 0) { - for (k = 0; k < cblk->z1 - cblk->z0; k++) { - for (j = 0; j < cblk->y1 - cblk->y0; j++) { - for (i = 0; i < cblk->x1 - cblk->x0; i++) { - t1->data[k][j][i] = fix_mul( - tilec->data[(x + i) + (y + j) * (tilec->x1 - tilec->x0) + (z + k) * - (tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0)], - 8192 * 8192 / ((int) floor(band->stepsize * 8192))) >> (13 - - T1_NMSEDEC_FRACBITS); - } - } - } - } - - orient = band->bandno; /* FIXME */ - if (orient == 2) { - orient = 1; - } else if (orient == 1) { - orient = 2; - } - for (i = 0; i < 3; i++) { - level[i] = tilec->numresolution[i] - 1 - resno; - } - /*fprintf(stdout,"t1_encode_cblk(t1, cblk, %d, %d, %d %d %d, %d, %f, %d, %d, tile);\n", orient, compno, level[0], level[1], level[2], tcp->tccps[compno].reversible, band->stepsize, tcp->tccps[compno].cblksty, tile->numcomps);*/ - t1_encode_cblk(t1, cblk, orient, compno, level, tcp->tccps[compno].dwtid, - band->stepsize, tcp->tccps[compno].cblksty, tile->numcomps, tile); - - } /* cblkno */ - } /* precno */ - /*fprintf(fid,"\n");*/ - } /* bandno */ - /*fclose(fid);*/ - } /* resno */ - } /* compno */ -} - -void t1_decode_cblks(opj_t1_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp) -{ - int compno, resno, bandno, precno, cblkno; - - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - - for (resno = 0; resno < tilec->numresolution[0]; resno++) { - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - - for (precno = 0; precno < res->prctno[0] * res->prctno[1] * res->prctno[2]; - precno++) { - opj_tcd_precinct_t *prc = &band->precincts[precno]; - - for (cblkno = 0; cblkno < prc->cblkno[0] * prc->cblkno[1] * prc->cblkno[2]; - cblkno++) { - int x, y, k, i, j, z, orient; - opj_tcd_cblk_t *cblk = &prc->cblks[cblkno]; - - orient = band->bandno; /* FIXME */ - if (orient == 2) { - orient = 1; - } else if (orient == 1) { - orient = 2; - } - - t1_decode_cblk(t1, cblk, orient, tcp->tccps[compno].roishift, - tcp->tccps[compno].cblksty); - - if (band->bandno == 0) { - x = cblk->x0 - band->x0; - y = cblk->y0 - band->y0; - z = cblk->z0 - band->z0; - } else if (band->bandno == 1) { - opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - x = pres->x1 - pres->x0 + cblk->x0 - band->x0; - y = cblk->y0 - band->y0; - z = cblk->z0 - band->z0; - } else if (band->bandno == 2) { - opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - x = cblk->x0 - band->x0; - y = pres->y1 - pres->y0 + cblk->y0 - band->y0; - z = cblk->z0 - band->z0; - } else if (band->bandno == 3) { - opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - x = pres->x1 - pres->x0 + cblk->x0 - band->x0; - y = pres->y1 - pres->y0 + cblk->y0 - band->y0; - z = cblk->z0 - band->z0; - } else if (band->bandno == 4) { - opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - x = cblk->x0 - band->x0; - y = cblk->y0 - band->y0; - z = pres->z1 - pres->z0 + cblk->z0 - band->z0; - } else if (band->bandno == 5) { - opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - x = pres->x1 - pres->x0 + cblk->x0 - band->x0; - y = cblk->y0 - band->y0; - z = pres->z1 - pres->z0 + cblk->z0 - band->z0; - } else if (band->bandno == 6) { - opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - x = cblk->x0 - band->x0; - y = pres->y1 - pres->y0 + cblk->y0 - band->y0; - z = pres->z1 - pres->z0 + cblk->z0 - band->z0; - } else if (band->bandno == 7) { - opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - x = pres->x1 - pres->x0 + cblk->x0 - band->x0; - y = pres->y1 - pres->y0 + cblk->y0 - band->y0; - z = pres->z1 - pres->z0 + cblk->z0 - band->z0; - } - - if (tcp->tccps[compno].roishift) { - int thresh, val, mag; - thresh = 1 << tcp->tccps[compno].roishift; - for (k = 0; k < cblk->z1 - cblk->z0; k++) { - for (j = 0; j < cblk->y1 - cblk->y0; j++) { - for (i = 0; i < cblk->x1 - cblk->x0; i++) { - val = t1->data[k][j][i]; - mag = int_abs(val); - if (mag >= thresh) { - mag >>= tcp->tccps[compno].roishift; - t1->data[k][j][i] = val < 0 ? -mag : mag; - } - } - } - } - } - - if (tcp->tccps[compno].reversible == 1) { - for (k = 0; k < cblk->z1 - cblk->z0; k++) { - for (j = 0; j < cblk->y1 - cblk->y0; j++) { - for (i = 0; i < cblk->x1 - cblk->x0; i++) { - int tmp = t1->data[k][j][i]; - tilec->data[x + i + (y + j) * (tilec->x1 - tilec->x0) + (z + k) * - (tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0)] = tmp / 2; - } - } - } - } else { /* if (tcp->tccps[compno].reversible == 0) */ - for (k = 0; k < cblk->z1 - cblk->z0; k++) { - for (j = 0; j < cblk->y1 - cblk->y0; j++) { - for (i = 0; i < cblk->x1 - cblk->x0; i++) { - double tmp = (double)(t1->data[k][j][i] * band->stepsize * 4096.0); - if (t1->data[k][j][i] >> 1 == 0) { - tilec->data[x + i + (y + j) * (tilec->x1 - tilec->x0) + (z + k) * - (tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0)] = 0; - } else { - int tmp2 = ((int)(floor(fabs(tmp)))) + ((int) floor(fabs(tmp * 2)) % 2); - tilec->data[x + i + (y + j) * (tilec->x1 - tilec->x0) + (z + k) * - (tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0)] = ((tmp < 0) ? -tmp2 : tmp2); - } - } - } - } - } - } /* cblkno */ - } /* precno */ - } /* bandno */ - } /* resno */ - } /* compno */ -} - - -/** mod fixed_quality */ -double t1_getwmsedec(int nmsedec, int compno, int level[3], int orient, - int bpno, double stepsize, int numcomps, int dwtid[3]) -{ - double w1, w2, wmsedec; - - if (dwtid[0] == 1 || dwtid[1] == 1 || dwtid[2] == 1) { - w1 = (numcomps > 1) ? mct_getnorm_real(compno) : 1; - } else { - w1 = (numcomps > 1) ? mct_getnorm(compno) : 1; - } - w2 = dwt_getnorm(orient, level, dwtid); - - /*fprintf(stdout,"nmsedec %d level %d %d %d orient %d bpno %d stepsize %f \n",nmsedec ,level[0],level[1],level[2],orient,bpno,stepsize);*/ - wmsedec = w1 * w2 * stepsize * (1 << bpno); - wmsedec *= wmsedec * nmsedec / 8192.0; - - return wmsedec; -} -/** mod fixed_quality */ diff --git a/src/lib/openjp3d/t1.h b/src/lib/openjp3d/t1.h deleted file mode 100644 index a027382f..00000000 --- a/src/lib/openjp3d/t1.h +++ /dev/null @@ -1,179 +0,0 @@ -/* - * 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 - * 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 __T1_H -#define __T1_H -/** -@file t1.h -@brief Implementation of the tier-1 coding (coding of code-block coefficients) (T1) - -The functions in T1.C have for goal to realize the tier-1 coding operation. The functions -in T1.C are used by some function in TCD.C. -*/ - -/** @defgroup T1 T1 - Implementation of the tier-1 coding */ -/*@{*/ - -/* ----------------------------------------------------------------------- */ -#define T1_NMSEDEC_BITS 7 - -#define T1_MAXCBLKW 256 /*< Maximum size of code-block (width) */ -#define T1_MAXCBLKH 256 /*< Maximum size of code-block (height) */ -#define T1_MAXCBLKD 256 /*< Maximum size of code-block (depth) */ -#define T1_MINCBLKW 4 /*< Minimum size of code-block (width) */ -#define T1_MINCBLKH 4 /*< Minimum size of code-block (height) */ -#define T1_MINCBLKD 4 /*< Minimum size of code-block (depth) */ -#define T1_MAXWHD 18 -#define T1_CBLKW 256 -#define T1_CBLKH 256 -#define T1_CBLKD 256 - -#define T1_SIG_NE 0x0001 /*< Context orientation : North-East direction */ -#define T1_SIG_SE 0x0002 /*< Context orientation : South-East direction */ -#define T1_SIG_SW 0x0004 /*< Context orientation : South-West direction */ -#define T1_SIG_NW 0x0008 /*< Context orientation : North-West direction */ -#define T1_SIG_N 0x0010 /*< Context orientation : North direction */ -#define T1_SIG_E 0x0020 /*< Context orientation : East direction */ -#define T1_SIG_S 0x0040 /*< Context orientation : South direction */ -#define T1_SIG_W 0x0080 /*< Context orientation : West direction */ -#define T1_SIG_OTH (T1_SIG_N|T1_SIG_NE|T1_SIG_E|T1_SIG_SE|T1_SIG_S|T1_SIG_SW|T1_SIG_W|T1_SIG_NW) -#define T1_SIG_PRIM (T1_SIG_N|T1_SIG_E|T1_SIG_S|T1_SIG_W) - -#define T1_SGN_N 0x0100 -#define T1_SGN_E 0x0200 -#define T1_SGN_S 0x0400 -#define T1_SGN_W 0x0800 -#define T1_SGN (T1_SGN_N|T1_SGN_E|T1_SGN_S|T1_SGN_W) - -#define T1_SIG 0x1000 -#define T1_REFINE 0x2000 -#define T1_VISIT 0x4000 - -#define T1_NUMCTXS_AGG 1 -#define T1_NUMCTXS_ZC 9 -#define T1_NUMCTXS_MAG 3 -#define T1_NUMCTXS_SC 5 -#define T1_NUMCTXS_UNI 1 - -#define T1_CTXNO_AGG 0 -#define T1_CTXNO_ZC (T1_CTXNO_AGG+T1_NUMCTXS_AGG) -#define T1_CTXNO_MAG (T1_CTXNO_ZC+T1_NUMCTXS_ZC) -#define T1_CTXNO_SC (T1_CTXNO_MAG+T1_NUMCTXS_MAG) -#define T1_CTXNO_UNI (T1_CTXNO_SC+T1_NUMCTXS_SC) -#define T1_NUMCTXS (T1_CTXNO_UNI+T1_NUMCTXS_UNI) - -#define T1_NMSEDEC_FRACBITS (T1_NMSEDEC_BITS-1) - -#define T1_TYPE_MQ 0 /*< Normal coding using entropy coder */ -#define T1_TYPE_RAW 1 /*< No encoding the information is store under raw format in codestream (mode switch RAW)*/ - -/* ----------------------------------------------------------------------- */ - -/** -Tier-1 coding (coding of code-block coefficients) -*/ -typedef struct opj_t1 { - /** codec context */ - opj_common_ptr cinfo; - - /** MQC component */ - opj_mqc_t *mqc; - /** RAW component */ - opj_raw_t *raw; - /** LUTs for context-based coding */ - int lut_ctxno_zc[1024]; - int lut_ctxno_sc[256]; - int lut_ctxno_mag[4096]; - int lut_spb[256]; - /** LUTs for decoding normalised MSE */ - int lut_nmsedec_sig[1 << T1_NMSEDEC_BITS]; - int lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS]; - int lut_nmsedec_ref[1 << T1_NMSEDEC_BITS]; - int lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS]; - /** Codeblock data */ - int data[T1_CBLKD][T1_CBLKH][T1_CBLKW];/*int ***data;*/ - /** Context information for each voxel in codeblock */ - int flags[T1_CBLKD + 2][T1_CBLKH + 2][T1_CBLKH + 2];/*int ***flags;*/ -} opj_t1_t; - -/** @name Exported functions */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Create a new T1 handle -and initialize the look-up tables of the Tier-1 coder/decoder -@return Returns a new T1 handle if successful, returns NULL otherwise -@see t1_init_luts -*/ -opj_t1_t* t1_create(opj_common_ptr cinfo); -/** -Destroy a previously created T1 handle -@param t1 T1 handle to destroy -*/ -void t1_destroy(opj_t1_t *t1); -/** -Encode the code-blocks of a tile -@param t1 T1 handle -@param tile The tile to encode -@param tcp Tile coding parameters -*/ -void t1_encode_cblks(opj_t1_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp); -/** -Decode the code-blocks of a tile -@param t1 T1 handle -@param tile The tile to decode -@param tcp Tile coding parameters -*/ -void t1_decode_cblks(opj_t1_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp); -/** -Get weigths of MSE decoding -@param nmsedec The normalized MSE reduction -@param compno -@param level -@param orient -@param bpno -@param stepsize -@param numcomps -@param dwtid -returns MSE associated to decoding pass -*/ -double t1_getwmsedec(int nmsedec, int compno, int level[3], int orient, - int bpno, double stepsize, int numcomps, int dwtid[3]); - -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __T1_H */ diff --git a/src/lib/openjp3d/t1_3d.c b/src/lib/openjp3d/t1_3d.c deleted file mode 100644 index ce7e8db6..00000000 --- a/src/lib/openjp3d/t1_3d.c +++ /dev/null @@ -1,1366 +0,0 @@ -/* - * Copyrigth (c) 2006, Mónica Díez, LPI-UVA, 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 "opj_includes.h" - -/** @defgroup T1_3D T1_3D - Implementation of the tier-1 coding */ -/*@{*/ - -/** @name Local static functions */ -/*@{*/ - -static int t1_3d_getctxno_zc(unsigned int f, int orient); -static int t1_3d_getctxno_sc(unsigned int f); -static int t1_3d_getctxno_mag(unsigned int f, int fsvr); -static int t1_3d_getspb(unsigned int f); -static int t1_3d_getnmsedec_sig(opj_t1_3d_t *t1, int x, int bitpos); -static int t1_3d_getnmsedec_ref(opj_t1_3d_t *t1, int x, int bitpos); -static void t1_3d_updateflags(unsigned int *fp, int s); -/** -Encode significant pass -*/ -static void t1_3d_enc_sigpass_step(opj_t1_3d_t *t1, unsigned int *fp, int *fsvr, - int *dp, int orient, int bpno, int one, int *nmsedec, char type, int vsc); -/** -Decode significant pass -*/ -static void t1_3d_dec_sigpass_step(opj_t1_3d_t *t1, unsigned int *fp, int *fsvr, - int *dp, int orient, int oneplushalf, char type, int vsc); -/** -Encode significant pass -*/ -static void t1_3d_enc_sigpass(opj_t1_3d_t *t1, int w, int h, int l, int bpno, - int orient, int *nmsedec, char type, int cblksty); -/** -Decode significant pass -*/ -static void t1_3d_dec_sigpass(opj_t1_3d_t *t1, int w, int h, int l, int bpno, - int orient, char type, int cblksty); -/** -Encode refinement pass -*/ -static void t1_3d_enc_refpass_step(opj_t1_3d_t *t1, unsigned int *fp, int *fsvr, - int *dp, int bpno, int one, int *nmsedec, char type, int vsc); -/** -Decode refinement pass -*/ -static void t1_3d_dec_refpass_step(opj_t1_3d_t *t1, unsigned int *fp, int *fsvr, - int *dp, int poshalf, int neghalf, char type, int vsc); -/** -Encode refinement pass -*/ -static void t1_3d_enc_refpass(opj_t1_3d_t *t1, int w, int h, int l, int bpno, - int *nmsedec, char type, int cblksty); -/** -Decode refinement pass -*/ -static void t1_3d_dec_refpass(opj_t1_3d_t *t1, int w, int h, int l, int bpno, - char type, int cblksty); -/** -Encode clean-up pass -*/ -static void t1_3d_enc_clnpass_step(opj_t1_3d_t *t1, unsigned int *fp, int *fsvr, - int *dp, int orient, int bpno, int one, int *nmsedec, int partial, int vsc); -/** -Decode clean-up pass -*/ -static void t1_3d_dec_clnpass_step(opj_t1_3d_t *t1, unsigned int *fp, int *fsvr, - int *dp, int orient, int oneplushalf, int partial, int vsc); -/** -Encode clean-up pass -*/ -static void t1_3d_enc_clnpass(opj_t1_3d_t *t1, int w, int h, int l, int bpno, - int orient, int *nmsedec, int cblksty); -/** -Decode clean-up pass -*/ -static void t1_3d_dec_clnpass(opj_t1_3d_t *t1, int w, int h, int l, int bpno, - int orient, int cblksty); -/** -Encode 1 code-block -@param t1 T1 handle -@param cblk Code-block coding parameters -@param orient -@param compno Component number -@param level[3] -@param dwtid[3] -@param stepsize -@param cblksty Code-block style -@param numcomps -@param tile -*/ -static void t1_3d_encode_cblk(opj_t1_3d_t *t1, opj_tcd_cblk_t * cblk, - int orient, int compno, int level[3], int dwtid[3], double stepsize, - int cblksty, int numcomps, opj_tcd_tile_t * tile); -/** -Decode 1 code-block -@param t1 T1 handle -@param cblk Code-block coding parameters -@param orient -@param roishift Region of interest shifting value -@param cblksty Code-block style -*/ -static void t1_3d_decode_cblk(opj_t1_3d_t *t1, opj_tcd_cblk_t * cblk, - int orient, int roishift, int cblksty); -static int t1_3d_init_ctxno_zc(unsigned int f, int orient); -static int t1_3d_init_ctxno_sc(unsigned int f); -static int t1_3d_init_ctxno_mag(unsigned int f, int f2); -static int t1_3d_init_spb(unsigned int f); -/** -Initialize the look-up tables of the Tier-1 coder/decoder -@param t1 T1 handle -*/ -static void t1_3d_init_luts(opj_t1_3d_t *t1); - -/*@}*/ - -/*@}*/ - -/* ----------------------------------------------------------------------- */ - -static int t1_3d_getctxno_zc(unsigned int f, int orient) -{ - return t1_3d_init_ctxno_zc((f & T1_3D_SIG_OTH), orient); -} - -static int t1_3d_getctxno_sc(unsigned int f) -{ - return t1_3d_init_ctxno_sc((f & T1_3D_SIG_PRIM) | ((f >> 16) & T1_3D_SGN)); - /*return t1->lut_ctxno_sc[((f & T1_3D_SIG_PRIM) | ((f >> 16) & T1_3D_SGN)) >> 4];*/ -} - -static int t1_3d_getctxno_mag(unsigned int f, int fsvr) -{ - return t1_3d_init_ctxno_mag((f & T1_3D_SIG_OTH), fsvr); -} - -static int t1_3d_getspb(unsigned int f) -{ - return t1_3d_init_spb((f & T1_3D_SIG_PRIM) | ((f >> 16) & T1_3D_SGN)); - /*return t1->lut_spb[((f & T1_3D_SIG_PRIM) | ((f >> 16) & T1_3D_SGN)) >> 4];*/ -} - -static int t1_3d_getnmsedec_sig(opj_t1_3d_t *t1, int x, int bitpos) -{ - if (bitpos > T1_NMSEDEC_FRACBITS) { - return t1->lut_nmsedec_sig[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & (( - 1 << T1_NMSEDEC_BITS) - 1)]; - } - - return t1->lut_nmsedec_sig0[x & ((1 << T1_NMSEDEC_BITS) - 1)]; -} - -static int t1_3d_getnmsedec_ref(opj_t1_3d_t *t1, int x, int bitpos) -{ - if (bitpos > T1_NMSEDEC_FRACBITS) { - return t1->lut_nmsedec_ref[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & (( - 1 << T1_NMSEDEC_BITS) - 1)]; - } - - return t1->lut_nmsedec_ref0[x & ((1 << T1_NMSEDEC_BITS) - 1)]; -} - -static void t1_3d_updateflags(unsigned int *fp, int s) -{ - unsigned int *np = fp - (T1_MAXCBLKW + 2); - unsigned int *sp = fp + (T1_MAXCBLKW + 2); - - unsigned int *bwp = fp + ((T1_MAXCBLKW + 2) * (T1_MAXCBLKH + 2)); - unsigned int *bnp = bwp - (T1_MAXCBLKW + 2); - unsigned int *bsp = bwp + (T1_MAXCBLKW + 2); - - unsigned int *fwp = fp - ((T1_MAXCBLKW + 2) * (T1_MAXCBLKH + 2)); - unsigned int *fnp = fwp - (T1_MAXCBLKW + 2); - unsigned int *fsp = fwp + (T1_MAXCBLKW + 2); - - np[-1] |= T1_3D_SIG_SE; - np[1] |= T1_3D_SIG_SW; - sp[-1] |= T1_3D_SIG_NE; - sp[1] |= T1_3D_SIG_NW; - *np |= T1_3D_SIG_S; - *sp |= T1_3D_SIG_N; - fp[-1] |= T1_3D_SIG_E; - fp[1] |= T1_3D_SIG_W; - - *fwp |= T1_3D_SIG_FC; - *bwp |= T1_3D_SIG_BC; - - fnp[-1] |= T1_3D_SIG_FSE; - fnp[1] |= T1_3D_SIG_FSW; - fsp[-1] |= T1_3D_SIG_FNE; - fsp[1] |= T1_3D_SIG_FNW; - *fnp |= T1_3D_SIG_FS; - *fsp |= T1_3D_SIG_FN; - fwp[-1] |= T1_3D_SIG_FE; - fwp[1] |= T1_3D_SIG_FW; - - bnp[-1] |= T1_3D_SIG_BSE; - bnp[1] |= T1_3D_SIG_BSW; - bsp[-1] |= T1_3D_SIG_BNE; - bsp[1] |= T1_3D_SIG_BNW; - *bnp |= T1_3D_SIG_BS; - *bsp |= T1_3D_SIG_BN; - bwp[-1] |= T1_3D_SIG_BE; - bwp[1] |= T1_3D_SIG_BW; - - if (s) { - *np |= (T1_3D_SGN_S << 16); - *sp |= (T1_3D_SGN_N << 16); - fp[-1] |= (T1_3D_SGN_E << 16); - fp[1] |= (T1_3D_SGN_W << 16); - *fwp |= (T1_3D_SGN_F << 16); - *bwp |= (T1_3D_SGN_B << 16); - } -} - -static void t1_3d_enc_sigpass_step(opj_t1_3d_t *t1, unsigned int *fp, int *fsvr, - int *dp, int orient, int bpno, int one, int *nmsedec, char type, int vsc) -{ - int v, flagsvr; - unsigned int flag; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - flag = vsc ? ((*fp) & (~(T1_3D_SIG_S | T1_3D_SIG_SE | T1_3D_SIG_SW | - (T1_3D_SGN_S << 16)))) : (*fp); - flagsvr = (*fsvr); - if ((flag & T1_3D_SIG_OTH) && !(flagsvr & (T1_3D_SIG | T1_3D_VISIT))) { - v = int_abs(*dp) & one ? 1 : 0; - if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */ - mqc_setcurctx(mqc, t1_3d_getctxno_zc(flag, orient)); /* ESSAI */ - mqc_bypass_enc(mqc, v); - } else { - mqc_setcurctx(mqc, t1_3d_getctxno_zc(flag, orient)); - mqc_encode(mqc, v); - } - if (v) { - v = *dp < 0 ? 1 : 0; - *nmsedec += t1_3d_getnmsedec_sig(t1, int_abs(*dp), bpno + T1_NMSEDEC_FRACBITS); - if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */ - mqc_setcurctx(mqc, t1_3d_getctxno_sc(flag)); /* ESSAI */ - mqc_bypass_enc(mqc, v); - } else { - mqc_setcurctx(mqc, t1_3d_getctxno_sc(flag)); - mqc_encode(mqc, v ^ t1_3d_getspb(flag)); - } - t1_3d_updateflags(fp, v); - *fsvr |= T1_3D_SIG; - } - *fsvr |= T1_3D_VISIT; - } -} - -static void t1_3d_dec_sigpass_step(opj_t1_3d_t *t1, unsigned int *fp, int *fsvr, - int *dp, int orient, int oneplushalf, char type, int vsc) -{ - int v, flagsvr; - unsigned int flag; - - opj_raw_t *raw = t1->raw; /* RAW component */ - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - flag = vsc ? ((*fp) & (~(T1_3D_SIG_S | T1_3D_SIG_SE | T1_3D_SIG_SW | - (T1_3D_SGN_S << 16)))) : (*fp); - flagsvr = (*fsvr); - if ((flag & T1_3D_SIG_OTH) && !(flagsvr & (T1_3D_SIG | T1_3D_VISIT))) { - if (type == T1_TYPE_RAW) { - if (raw_decode(raw)) { - v = raw_decode(raw); /* ESSAI */ - *dp = v ? -oneplushalf : oneplushalf; - t1_3d_updateflags(fp, v); - *fsvr |= T1_3D_SIG; - } - } else { - mqc_setcurctx(mqc, t1_3d_getctxno_zc(flag, orient)); - if (mqc_decode(mqc)) { - mqc_setcurctx(mqc, t1_3d_getctxno_sc(flag)); - v = mqc_decode(mqc) ^ t1_3d_getspb(flag); - *dp = v ? -oneplushalf : oneplushalf; - t1_3d_updateflags(fp, v); - *fsvr |= T1_3D_SIG; - } - } - *fsvr |= T1_3D_VISIT; - } -} /* VSC and BYPASS by Antonin */ - -static void t1_3d_enc_sigpass(opj_t1_3d_t *t1, int w, int h, int l, int bpno, - int orient, int *nmsedec, char type, int cblksty) -{ - int i, j, k, m, one, vsc; - *nmsedec = 0; - one = 1 << (bpno + T1_NMSEDEC_FRACBITS); - for (m = 0; m < l; m++) { - for (k = 0; k < h; k += 4) { - for (i = 0; i < w; i++) { - for (j = k; j < k + 4 && j < h; j++) { - vsc = ((cblksty & J3D_CCP_CBLKSTY_VSC) && (j == k + 3 || j == h - 1)) ? 1 : 0; - t1_3d_enc_sigpass_step(t1, &t1->flags[1 + m][1 + j][1 + i], - &t1->flagSVR[1 + m][1 + j][1 + i], &t1->data[m][j][i], orient, bpno, one, - nmsedec, type, vsc); - } - } - } - } -} - -static void t1_3d_dec_sigpass(opj_t1_3d_t *t1, int w, int h, int l, int bpno, - int orient, char type, int cblksty) -{ - int i, j, k, m, one, half, oneplushalf, vsc; - one = 1 << bpno; - half = one >> 1; - oneplushalf = one | half; - for (m = 0; m < l; m++) { - for (k = 0; k < h; k += 4) { - for (i = 0; i < w; i++) { - for (j = k; j < k + 4 && j < h; j++) { - vsc = ((cblksty & J3D_CCP_CBLKSTY_VSC) && (j == k + 3 || j == h - 1)) ? 1 : 0; - t1_3d_dec_sigpass_step(t1, &t1->flags[1 + m][1 + j][1 + i], - &t1->flagSVR[1 + m][1 + j][1 + i], &t1->data[m][j][i], orient, oneplushalf, - type, vsc); - } - } - } - } -} /* VSC and BYPASS by Antonin */ - -static void t1_3d_enc_refpass_step(opj_t1_3d_t *t1, unsigned int *fp, int *fsvr, - int *dp, int bpno, int one, int *nmsedec, char type, int vsc) -{ - int v, flagsvr; - unsigned int flag; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - flag = vsc ? ((*fp) & (~(T1_3D_SIG_S | T1_3D_SIG_SE | T1_3D_SIG_SW | - (T1_3D_SGN_S << 16)))) : (*fp); - flagsvr = (*fsvr); - if ((flagsvr & (T1_3D_SIG | T1_3D_VISIT)) == T1_3D_SIG) { - *nmsedec += t1_3d_getnmsedec_ref(t1, int_abs(*dp), bpno + T1_NMSEDEC_FRACBITS); - v = int_abs(*dp) & one ? 1 : 0; - if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */ - mqc_setcurctx(mqc, t1_3d_getctxno_mag(flag, flagsvr)); /* ESSAI */ - mqc_bypass_enc(mqc, v); - } else { - mqc_setcurctx(mqc, t1_3d_getctxno_mag(flag, flagsvr)); - mqc_encode(mqc, v); - } - *fsvr |= T1_3D_REFINE; - } -} - -static void t1_3d_dec_refpass_step(opj_t1_3d_t *t1, unsigned int *fp, int *fsvr, - int *dp, int poshalf, int neghalf, char type, int vsc) -{ - int v, t, flagsvr; - unsigned int flag; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - opj_raw_t *raw = t1->raw; /* RAW component */ - - flag = vsc ? ((*fp) & (~(T1_3D_SIG_S | T1_3D_SIG_SE | T1_3D_SIG_SW | - (T1_3D_SGN_S << 16)))) : (*fp); - flagsvr = (*fsvr); - if ((flagsvr & (T1_3D_SIG | T1_3D_VISIT)) == T1_3D_SIG) { - if (type == T1_TYPE_RAW) { - mqc_setcurctx(mqc, t1_3d_getctxno_mag(flag, flagsvr)); /* ESSAI */ - v = raw_decode(raw); - } else { - mqc_setcurctx(mqc, t1_3d_getctxno_mag(flag, flagsvr)); - v = mqc_decode(mqc); - } - t = v ? poshalf : neghalf; - *dp += *dp < 0 ? -t : t; - *fsvr |= T1_3D_REFINE; - } -} /* VSC and BYPASS by Antonin */ - -static void t1_3d_enc_refpass(opj_t1_3d_t *t1, int w, int h, int l, int bpno, - int *nmsedec, char type, int cblksty) -{ - int i, j, k, m, one, vsc; - *nmsedec = 0; - one = 1 << (bpno + T1_NMSEDEC_FRACBITS); - for (m = 0; m < l; m++) { - for (k = 0; k < h; k += 4) { - for (i = 0; i < w; i++) { - for (j = k; j < k + 4 && j < h; j++) { - vsc = ((cblksty & J3D_CCP_CBLKSTY_VSC) && (j == k + 3 || j == h - 1)) ? 1 : 0; - t1_3d_enc_refpass_step(t1, &t1->flags[1 + m][1 + j][1 + i], - &t1->flagSVR[1 + m][1 + j][1 + i], &t1->data[m][j][i], bpno, one, nmsedec, type, - vsc); - } - } - } - } -} - -static void t1_3d_dec_refpass(opj_t1_3d_t *t1, int w, int h, int l, int bpno, - char type, int cblksty) -{ - int i, j, k, m, one, poshalf, neghalf; - int vsc; - one = 1 << bpno; - poshalf = one >> 1; - neghalf = bpno > 0 ? -poshalf : -1; - for (m = 0; m < l; m++) { - for (k = 0; k < h; k += 4) { - for (i = 0; i < w; i++) { - for (j = k; j < k + 4 && j < h; j++) { - vsc = ((cblksty & J3D_CCP_CBLKSTY_VSC) && (j == k + 3 || j == h - 1)) ? 1 : 0; - t1_3d_dec_refpass_step(t1, &t1->flags[1 + m][1 + j][1 + i], - &t1->flagSVR[1 + m][1 + j][1 + i], &t1->data[m][j][i], poshalf, neghalf, type, - vsc); - } - } - } - } -} /* VSC and BYPASS by Antonin */ - -static void t1_3d_enc_clnpass_step(opj_t1_3d_t *t1, unsigned int *fp, int *fsvr, - int *dp, int orient, int bpno, int one, int *nmsedec, int partial, int vsc) -{ - int v, flagsvr; - unsigned int flag; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - flag = vsc ? ((*fp) & (~(T1_3D_SIG_S | T1_3D_SIG_SE | T1_3D_SIG_SW | - (T1_3D_SGN_S << 16)))) : (*fp); - flagsvr = (*fsvr); - if (partial) { - goto LABEL_PARTIAL; - } - if (!(*fsvr & (T1_3D_SIG | T1_3D_VISIT))) { - mqc_setcurctx(mqc, t1_3d_getctxno_zc(flag, orient)); - v = int_abs(*dp) & one ? 1 : 0; - mqc_encode(mqc, v); - if (v) { -LABEL_PARTIAL: - *nmsedec += t1_3d_getnmsedec_sig(t1, int_abs(*dp), bpno + T1_NMSEDEC_FRACBITS); - mqc_setcurctx(mqc, t1_3d_getctxno_sc(flag)); - v = *dp < 0 ? 1 : 0; - mqc_encode(mqc, v ^ t1_3d_getspb(flag)); - t1_3d_updateflags(fp, v); - *fsvr |= T1_3D_SIG; - } - } - *fsvr &= ~T1_3D_VISIT; -} - -static void t1_3d_dec_clnpass_step(opj_t1_3d_t *t1, unsigned int *fp, int *fsvr, - int *dp, int orient, int oneplushalf, int partial, int vsc) -{ - int v, flagsvr; - unsigned int flag; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - flag = vsc ? ((*fp) & (~(T1_3D_SIG_S | T1_3D_SIG_SE | T1_3D_SIG_SW | - (T1_3D_SGN_S << 16)))) : (*fp); - flagsvr = (*fsvr); - if (partial) { - goto LABEL_PARTIAL; - } - if (!(flagsvr & (T1_3D_SIG | T1_3D_VISIT))) { - mqc_setcurctx(mqc, t1_3d_getctxno_zc(flag, orient)); - if (mqc_decode(mqc)) { -LABEL_PARTIAL: - mqc_setcurctx(mqc, t1_3d_getctxno_sc(flag)); - v = mqc_decode(mqc) ^ t1_3d_getspb(flag); - *dp = v ? -oneplushalf : oneplushalf; - t1_3d_updateflags(fp, v); - *fsvr |= T1_3D_SIG; - } - } - *fsvr &= ~T1_3D_VISIT; -} /* VSC and BYPASS by Antonin */ - -static void t1_3d_enc_clnpass(opj_t1_3d_t *t1, int w, int h, int l, int bpno, - int orient, int *nmsedec, int cblksty) -{ - int i, j, k, m, one, agg, runlen, vsc; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - *nmsedec = 0; - one = 1 << (bpno + T1_NMSEDEC_FRACBITS); - for (m = 0; m < l; m++) { - for (k = 0; k < h; k += 4) { - for (i = 0; i < w; i++) { - if (k + 3 < h) { - if (cblksty & J3D_CCP_CBLKSTY_VSC) { - agg = !(((t1->flagSVR[1 + m][1 + k][1 + i] | (T1_3D_SIG | T1_3D_VISIT)) & - (t1->flags[1 + m][1 + k][1 + i] & T1_3D_SIG_OTH)) - || ((t1->flagSVR[1 + m][1 + k + 1][1 + i] | (T1_3D_SIG | T1_3D_VISIT)) & - (t1->flags[1 + m][1 + k + 1][1 + i] & T1_3D_SIG_OTH)) - || ((t1->flagSVR[1 + m][1 + k + 2][1 + i] | (T1_3D_SIG | T1_3D_VISIT)) & - (t1->flags[1 + m][1 + k + 2][1 + i] & T1_3D_SIG_OTH)) - || ((t1->flagSVR[1 + m][1 + k + 3][1 + i] | (T1_3D_SIG | T1_3D_VISIT)) & (( - t1->flags[1 + m][1 + k + 3][1 + i] & (~(T1_3D_SIG_S | T1_3D_SIG_SE | - T1_3D_SIG_SW | (T1_3D_SGN_S << 16)))) & (T1_3D_SIG_OTH))) - ); - } else { - agg = !( - ((t1->flagSVR[1 + m][1 + k][1 + i] & (T1_3D_SIG | T1_3D_VISIT)) | - (t1->flags[1 + m][1 + k][1 + i] & T1_3D_SIG_OTH)) - || ((t1->flagSVR[1 + m][1 + k + 1][1 + i] & (T1_3D_SIG | T1_3D_VISIT)) | - (t1->flags[1 + m][1 + k + 1][1 + i] & T1_3D_SIG_OTH)) - || ((t1->flagSVR[1 + m][1 + k + 2][1 + i] & (T1_3D_SIG | T1_3D_VISIT)) | - (t1->flags[1 + m][1 + k + 2][1 + i] & T1_3D_SIG_OTH)) - || ((t1->flagSVR[1 + m][1 + k + 3][1 + i] & (T1_3D_SIG | T1_3D_VISIT)) | - (t1->flags[1 + m][1 + k + 3][1 + i] & T1_3D_SIG_OTH)) - ); - } - } else { - agg = 0; - } - if (agg) { - for (runlen = 0; runlen < 4; runlen++) { - if (int_abs(t1->data[m][k + runlen][i]) & one) { - break; - } - } - mqc_setcurctx(mqc, T1_CTXNO_AGG); - mqc_encode(mqc, runlen != 4); - if (runlen == 4) { - continue; - } - mqc_setcurctx(mqc, T1_CTXNO_UNI); - mqc_encode(mqc, runlen >> 1); - mqc_encode(mqc, runlen & 1); - } else { - runlen = 0; - } - for (j = k + runlen; j < k + 4 && j < h; j++) { - vsc = ((cblksty & J3D_CCP_CBLKSTY_VSC) && (j == k + 3 || j == h - 1)) ? 1 : 0; - t1_3d_enc_clnpass_step(t1, &t1->flags[1 + m][1 + j][1 + i], - &t1->flagSVR[1 + m][1 + j][1 + i], &t1->data[m][j][i], orient, bpno, one, - nmsedec, agg && (j == k + runlen), vsc); - } - } - } - } -} - -static void t1_3d_dec_clnpass(opj_t1_3d_t *t1, int w, int h, int l, int bpno, - int orient, int cblksty) -{ - int i, j, k, m, one, half, oneplushalf, agg, runlen, vsc; - int segsym = cblksty & J3D_CCP_CBLKSTY_SEGSYM; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - one = 1 << bpno; - half = one >> 1; - oneplushalf = one | half; - for (m = 0; m < l; m++) { - for (k = 0; k < h; k += 4) { - for (i = 0; i < w; i++) { - if (k + 3 < h) { - if (cblksty & J3D_CCP_CBLKSTY_VSC) { - agg = !( - ((t1->flagSVR[1 + m][1 + k][1 + i] & (T1_3D_SIG | T1_3D_VISIT)) | - (t1->flags[1 + m][1 + k][1 + i] & T1_3D_SIG_OTH)) - || ((t1->flagSVR[1 + m][1 + k + 1][1 + i] & (T1_3D_SIG | T1_3D_VISIT)) | - (t1->flags[1 + m][1 + k + 1][1 + i] & T1_3D_SIG_OTH)) - || ((t1->flagSVR[1 + m][1 + k + 2][1 + i] & (T1_3D_SIG | T1_3D_VISIT)) | - (t1->flags[1 + m][1 + k + 2][1 + i] & T1_3D_SIG_OTH)) - || ((t1->flagSVR[1 + m][1 + k + 3][1 + i] & (T1_3D_SIG | T1_3D_VISIT)) | (( - t1->flags[1 + m][1 + k + 3][1 + i] & (~(T1_3D_SIG_S | T1_3D_SIG_SE | - T1_3D_SIG_SW | (T1_3D_SGN_S << 16)))) & (T1_3D_SIG_OTH))) - ); - } else { - agg = !( - ((t1->flagSVR[1 + m][1 + k][1 + i] & (T1_3D_SIG | T1_3D_VISIT)) | - (t1->flags[1 + m][1 + k][1 + i] & T1_3D_SIG_OTH)) - || ((t1->flagSVR[1 + m][1 + k + 1][1 + i] & (T1_3D_SIG | T1_3D_VISIT)) | - (t1->flags[1 + m][1 + k + 1][1 + i] & T1_3D_SIG_OTH)) - || ((t1->flagSVR[1 + m][1 + k + 2][1 + i] & (T1_3D_SIG | T1_3D_VISIT)) | - (t1->flags[1 + m][1 + k + 2][1 + i] & T1_3D_SIG_OTH)) - || ((t1->flagSVR[1 + m][1 + k + 3][1 + i] & (T1_3D_SIG | T1_3D_VISIT)) | - (t1->flags[1 + m][1 + k + 3][1 + i] & T1_3D_SIG_OTH)) - ); - } - } else { - agg = 0; - } - if (agg) { - mqc_setcurctx(mqc, T1_CTXNO_AGG); - if (!mqc_decode(mqc)) { - continue; - } - mqc_setcurctx(mqc, T1_CTXNO_UNI); - runlen = mqc_decode(mqc); - runlen = (runlen << 1) | mqc_decode(mqc); - } else { - runlen = 0; - } - for (j = k + runlen; j < k + 4 && j < h; j++) { - vsc = ((cblksty & J3D_CCP_CBLKSTY_VSC) && (j == k + 3 || j == h - 1)) ? 1 : 0; - t1_3d_dec_clnpass_step(t1, &t1->flags[1 + m][1 + j][1 + i], - &t1->flagSVR[1 + m][1 + j][1 + i], &t1->data[m][j][i], orient, oneplushalf, - agg && (j == k + runlen), vsc); - } - } - } - } - if (segsym) { - int v = 0; - mqc_setcurctx(mqc, T1_CTXNO_UNI); - v = mqc_decode(mqc); - v = (v << 1) | mqc_decode(mqc); - v = (v << 1) | mqc_decode(mqc); - v = (v << 1) | mqc_decode(mqc); - /* - if (v!=0xa) { - opj_event_msg(t1->cinfo, EVT_WARNING, "Bad segmentation symbol %x\n", v); - } - */ - } -} /* VSC and BYPASS by Antonin */ - - -static void t1_3d_encode_cblk(opj_t1_3d_t *t1, opj_tcd_cblk_t * cblk, - int orient, int compno, int level[3], int dwtid[3], double stepsize, - int cblksty, int numcomps, opj_tcd_tile_t * tile) -{ - int i, j, k; - int w, h, l; - int passno; - int bpno, passtype; - int max; - int nmsedec = 0; - double cumwmsedec = 0; - char type = T1_TYPE_MQ; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - w = cblk->x1 - cblk->x0; - h = cblk->y1 - cblk->y0; - l = cblk->z1 - cblk->z0; - - max = 0; - for (k = 0; k < l; k++) { - for (j = 0; j < h; j++) { - for (i = 0; i < w; i++) { - max = int_max(max, int_abs(t1->data[k][j][i])); - } - } - } - for (k = 0; k <= l; k++) { - for (j = 0; j <= h; j++) { - for (i = 0; i <= w; i++) { - t1->flags[k][j][i] = 0; - t1->flagSVR[k][j][i] = 0; - } - } - } - - cblk->numbps = max ? (int_floorlog2(max) + 1) - T1_NMSEDEC_FRACBITS : 0; - - bpno = cblk->numbps - 1; - passtype = 2; - - mqc_reset_enc(mqc); - mqc_init_enc(mqc, cblk->data); - - for (passno = 0; bpno >= 0; passno++) { - opj_tcd_pass_t *pass = &cblk->passes[passno]; - int correction = 3; - double tmpwmsedec; - type = ((bpno < (cblk->numbps - 4)) && (passtype < 2) && - (cblksty & J3D_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ; - - switch (passtype) { - case 0: - t1_3d_enc_sigpass(t1, w, h, l, bpno, orient, &nmsedec, type, cblksty); - break; - case 1: - t1_3d_enc_refpass(t1, w, h, l, bpno, &nmsedec, type, cblksty); - break; - case 2: - t1_3d_enc_clnpass(t1, w, h, l, bpno, orient, &nmsedec, cblksty); - /* code switch SEGMARK (i.e. SEGSYM) */ - if (cblksty & J3D_CCP_CBLKSTY_SEGSYM) { - mqc_segmark_enc(mqc); - } - break; - } - - /* fixed_quality */ - tmpwmsedec = t1_getwmsedec(nmsedec, compno, level, orient, bpno, stepsize, - numcomps, dwtid); - cumwmsedec += tmpwmsedec; - tile->distotile += tmpwmsedec; - - /* Code switch "RESTART" (i.e. TERMALL) */ - if ((cblksty & J3D_CCP_CBLKSTY_TERMALL) && !((passtype == 2) && - (bpno - 1 < 0))) { - if (type == T1_TYPE_RAW) { - mqc_flush(mqc); - correction = 1; - /* correction = mqc_bypass_flush_enc(); */ - } else { /* correction = mqc_restart_enc(); */ - mqc_flush(mqc); - correction = 1; - } - pass->term = 1; - } else { - if (((bpno < (cblk->numbps - 4) && (passtype > 0)) - || ((bpno == (cblk->numbps - 4)) && (passtype == 2))) && - (cblksty & J3D_CCP_CBLKSTY_LAZY)) { - if (type == T1_TYPE_RAW) { - mqc_flush(mqc); - correction = 1; - } else { - mqc_flush(mqc); - correction = 1; - } - pass->term = 1; - } else { - pass->term = 0; - } - } - - if (++passtype == 3) { - passtype = 0; - bpno--; - } - - if (pass->term && bpno > 0) { - type = ((bpno < (cblk->numbps - 4)) && (passtype < 2) && - (cblksty & J3D_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ; - if (type == T1_TYPE_RAW) { - mqc_bypass_init_enc(mqc); - } else { - mqc_restart_init_enc(mqc); - } - } - - pass->distortiondec = cumwmsedec; - pass->rate = mqc_numbytes(mqc) + correction; /* FIXME */ - pass->len = pass->rate - (passno == 0 ? 0 : cblk->passes[passno - 1].rate); - - /* Code-switch "RESET" */ - if (cblksty & J3D_CCP_CBLKSTY_RESET) { - mqc_reset_enc(mqc); - } - } - - /* Code switch "ERTERM" (i.e. PTERM) */ - if (cblksty & J3D_CCP_CBLKSTY_PTERM) { - mqc_erterm_enc(mqc); - } else /* Default coding */ if (!(cblksty & J3D_CCP_CBLKSTY_LAZY)) { - mqc_flush(mqc); - } - - cblk->totalpasses = passno; -} - -static void t1_3d_decode_cblk(opj_t1_3d_t *t1, opj_tcd_cblk_t * cblk, - int orient, int roishift, int cblksty) -{ - int i, j, k; - int w, h, l; - int bpno, passtype; - int segno, passno; - char type = T1_TYPE_MQ; /* BYPASS mode */ - opj_raw_t *raw = t1->raw; /* RAW component */ - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - w = cblk->x1 - cblk->x0; - h = cblk->y1 - cblk->y0; - l = cblk->z1 - cblk->z0; - - for (k = 0; k < l; k++) { - for (j = 0; j < h; j++) { - for (i = 0; i < w; i++) { - t1->data[k][j][i] = 0; - } - } - } - - for (k = 0; k <= l; k++) { - for (j = 0; j <= h; j++) { - for (i = 0; i <= w; i++) { - t1->flags[k][j][i] = 0; - t1->flagSVR[k][j][i] = 0; - } - } - } - - - bpno = roishift + cblk->numbps - 1; - passtype = 2; - - mqc_reset_enc(mqc); - - for (segno = 0; segno < cblk->numsegs; segno++) { - opj_tcd_seg_t *seg = &cblk->segs[segno]; - - /* BYPASS mode */ - type = ((bpno <= (cblk->numbps - 1) - 4) && (passtype < 2) && - (cblksty & J3D_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ; - if (type == T1_TYPE_RAW) { - raw_init_dec(raw, seg->data, seg->len); - } else { - mqc_init_dec(mqc, seg->data, seg->len); - } - - for (passno = 0; passno < seg->numpasses; passno++) { - switch (passtype) { - case 0: - t1_3d_dec_sigpass(t1, w, h, l, bpno + 1, orient, type, cblksty); - break; - case 1: - t1_3d_dec_refpass(t1, w, h, l, bpno + 1, type, cblksty); - break; - case 2: - t1_3d_dec_clnpass(t1, w, h, l, bpno + 1, orient, cblksty); - break; - } - - if ((cblksty & J3D_CCP_CBLKSTY_RESET) && type == T1_TYPE_MQ) { - mqc_reset_enc(mqc); - } - if (++passtype == 3) { - passtype = 0; - bpno--; - } - - } - } -} - -static int t1_3d_init_ctxno_zc(unsigned int f, int orient) -{ - unsigned int h, v, c; - unsigned int d2xy, d2xz, d2yz, d3; - int n; - unsigned int hvc, hc, d2, d2xy2yz, d2xy2xz; - n = 0; - h = ((f & T1_3D_SIG_W) != 0) + ((f & T1_3D_SIG_E) != 0); - v = ((f & T1_3D_SIG_N) != 0) + ((f & T1_3D_SIG_S) != 0); - c = ((f & T1_3D_SIG_FC) != 0) + ((f & T1_3D_SIG_BC) != 0); - d2xy = ((f & T1_3D_SIG_NW) != 0) + ((f & T1_3D_SIG_NE) != 0) + (( - f & T1_3D_SIG_SE) != 0) + ((f & T1_3D_SIG_SW) != 0); - d2xz = ((f & T1_3D_SIG_FW) != 0) + ((f & T1_3D_SIG_BW) != 0) + (( - f & T1_3D_SIG_FE) != 0) + ((f & T1_3D_SIG_BE) != 0); - d2yz = ((f & T1_3D_SIG_FN) != 0) + ((f & T1_3D_SIG_FS) != 0) + (( - f & T1_3D_SIG_BN) != 0) + ((f & T1_3D_SIG_BS) != 0); - d3 = ((f & T1_3D_SIG_FNW) != 0) + ((f & T1_3D_SIG_FNE) != 0) + (( - f & T1_3D_SIG_FSE) != 0) + ((f & T1_3D_SIG_FSW) != 0) - + ((f & T1_3D_SIG_BNW) != 0) + ((f & T1_3D_SIG_BNE) != 0) + (( - f & T1_3D_SIG_BSE) != 0) + ((f & T1_3D_SIG_BSW) != 0); - - switch (orient) { - case 0: /*LLL*/ - case 7: /*HHH*/ - hvc = h + v + c; - d2 = d2xy + d2xz + d2yz; - if (!hvc) { - if (!d2) { - n = (!d3) ? 0 : 1; - } else if (d2 == 1) { - n = (!d3) ? 2 : 3; - } else { - n = (!d3) ? 4 : 5; - } - } else if (hvc == 1) { - if (!d2) { - n = (!d3) ? 6 : 7; - } else if (d2 == 1) { - n = (!d3) ? 8 : 9; - } else { - n = 10; - } - } else if (hvc == 2) { - if (!d2) { - n = (!d3) ? 11 : 12; - } else { - n = 13; - } - } else if (hvc == 3) { - n = 14; - } else { - n = 15; - } - break; - /*LHL, HLL, LLH*/ - case 1: - case 2: - case 4: - hc = h + c; - d2xy2yz = d2xy + d2yz; - if (!hc) { - if (!v) { - if (!d2xy) { - n = (!d2xy2yz) ? ((!d3) ? 0 : 1) : ((!d3) ? 2 : 3); - } else if (d2xy == 1) { - n = (!d2xy2yz) ? ((!d3) ? 4 : 5) : 6; - } else { /*>=2*/ - n = 7; - } - } else { - n = (v == 1) ? 8 : 9; /* =1 or =2*/ - } - } else if (hc == 1) { - n = (!v) ? ((!d2xy) ? ((!d2xy2yz) ? ((!d3) ? 10 : 11) : (12)) : (13)) : (14); - } else { /*if (hc >= 2)*/ - n = 15; - } - break; - /*HLH, HHL, LHH*/ - case 3: - case 5: - case 6: - hc = h + c; - d2xy2xz = d2xy + d2xz; - if (!v) { - if (!d2xz) { - if (!hc && !d2xy2xz) { - n = (!d3) ? 0 : 1; - } else if (hc == 1) { - n = (!d2xy2xz) ? 2 : 3; - } else { /*if >= 2*/ - n = 4; - } - } else if (d2xz >= 1 && !hc) { - n = 5; - } else if (hc >= 1) { - n = (d2xz == 1) ? 6 : 7; - } - } else if (v == 1) { - if (!d2xz) { - n = (!hc) ? 8 : 9; - } else if (d2xz == 1) { - n = (!hc) ? 10 : 11; - } else if (d2xz == 2) { - n = (!hc) ? 12 : 13; - } else { /* if (d2xz >= 3) {*/ - n = 14; - } - } else if (v == 2) { - n = 15; - } - break; - } - - return (T1_3D_CTXNO_ZC + n); -} - -static int t1_3d_init_ctxno_sc(unsigned int f) -{ - int hc, vc, cc; - int n = 0; - - hc = int_min(((f & (T1_3D_SIG_E | T1_3D_SGN_E)) == T1_3D_SIG_E) - + ((f & (T1_3D_SIG_W | T1_3D_SGN_W)) == T1_3D_SIG_W), 1) - - int_min(((f & (T1_3D_SIG_E | T1_3D_SGN_E)) == (T1_3D_SIG_E | T1_3D_SGN_E)) - + ((f & (T1_3D_SIG_W | T1_3D_SGN_W)) == (T1_3D_SIG_W | T1_3D_SGN_W)), 1); - - vc = int_min(((f & (T1_3D_SIG_N | T1_3D_SGN_N)) == T1_3D_SIG_N) - + ((f & (T1_3D_SIG_S | T1_3D_SGN_S)) == T1_3D_SIG_S), 1) - - int_min(((f & (T1_3D_SIG_N | T1_3D_SGN_N)) == (T1_3D_SIG_N | T1_3D_SGN_N)) - + ((f & (T1_3D_SIG_S | T1_3D_SGN_S)) == (T1_3D_SIG_S | T1_3D_SGN_S)), 1); - - cc = int_min(((f & (T1_3D_SIG_FC | T1_3D_SGN_F)) == T1_3D_SIG_FC) - + ((f & (T1_3D_SIG_BC | T1_3D_SGN_B)) == T1_3D_SIG_BC), 1) - - int_min(((f & (T1_3D_SIG_FC | T1_3D_SGN_F)) == (T1_3D_SIG_FC | T1_3D_SGN_F)) - + ((f & (T1_3D_SIG_BC | T1_3D_SGN_B)) == (T1_3D_SIG_BC | T1_3D_SGN_B)), 1); - if (hc < 0) { - hc = -hc; - vc = -vc; - cc = -cc; - } - - if (!hc) { - if (!vc) { - n = (!cc) ? 0 : 1; - } else if (vc == -1) { - n = (!cc) ? 1 : ((cc > 0) ? 2 : 4); - } else if (vc == 1) { - n = (!cc) ? 1 : ((cc < 0) ? 2 : 4); - } - } else if (hc == 1) { - if (!vc) { - n = (!cc) ? 1 : ((cc < 0) ? 2 : 4); - } else if (vc == 1) { - n = (!cc) ? 4 : ((cc > 0) ? 5 : 3); - } else if (vc == -1) { - n = (!cc) ? 2 : 3; - } - } else if (hc == -1) { - if (!vc) { - n = (!cc) ? 1 : ((cc > 0) ? 2 : 4); - } else if (vc == 1) { - n = (!cc) ? 2 : 3; - } else if (vc == -1) { - n = (!cc) ? 4 : ((cc < 0) ? 5 : 3); - } - } - - return (T1_3D_CTXNO_SC + n); -} - -static int t1_3d_init_ctxno_mag(unsigned int f, int f2) -{ - int n; - if (!(f2 & - T1_3D_REFINE)) { /*First refinement for this coefficient (no previous refinement)*/ - n = (f & (T1_3D_SIG_PRIM)) ? 1 : 0; - } else { - n = 2; - } - - return (T1_3D_CTXNO_MAG + n); -} - -static int t1_3d_init_spb(unsigned int f) -{ - int hc, vc, cc; - int n = 0; - - hc = int_min(((f & (T1_3D_SIG_E | T1_3D_SGN_E)) == T1_3D_SIG_E) - + ((f & (T1_3D_SIG_W | T1_3D_SGN_W)) == T1_3D_SIG_W), 1) - - int_min(((f & (T1_3D_SIG_E | T1_3D_SGN_E)) == (T1_3D_SIG_E | T1_3D_SGN_E)) - + ((f & (T1_3D_SIG_W | T1_3D_SGN_W)) == (T1_3D_SIG_W | T1_3D_SGN_W)), 1); - - vc = int_min(((f & (T1_3D_SIG_N | T1_3D_SGN_N)) == T1_3D_SIG_N) - + ((f & (T1_3D_SIG_S | T1_3D_SGN_S)) == T1_3D_SIG_S), 1) - - int_min(((f & (T1_3D_SIG_N | T1_3D_SGN_N)) == (T1_3D_SIG_N | T1_3D_SGN_N)) - + ((f & (T1_3D_SIG_S | T1_3D_SGN_S)) == (T1_3D_SIG_S | T1_3D_SGN_S)), 1); - - cc = int_min(((f & (T1_3D_SIG_FC | T1_3D_SGN_F)) == T1_3D_SIG_FC) - + ((f & (T1_3D_SIG_BC | T1_3D_SGN_B)) == T1_3D_SIG_BC), 1) - - int_min(((f & (T1_3D_SIG_FC | T1_3D_SGN_F)) == (T1_3D_SIG_FC | T1_3D_SGN_F)) - + ((f & (T1_3D_SIG_BC | T1_3D_SGN_B)) == (T1_3D_SIG_BC | T1_3D_SGN_B)), 1); - - n = ((hc + vc + cc) < 0); - - return n; -} - -static void t1_3d_init_luts(opj_t1_3d_t *t1) -{ - int i; - double u, v, t; - /*for (j = 0; j < 4; j++) { - for (i = 0; i < 256; ++i) { - t1->lut_ctxno_zc[(j << 8) | i] = t1_3d_init_ctxno_zc(i, j); - } - } - for (i = 0; i < 4096; i++) { - t1->lut_ctxno_sc[i] = t1_3d_init_ctxno_sc(i << 4); - } - for (j = 0; j < 2; j++) { - for (i = 0; i < 2048; ++i) { - t1->lut_ctxno_mag[(j << 11) + i] = t1_3d_init_ctxno_mag((j ? T1_3D_REFINE : 0) | i); - } - } - for (i = 0; i < 4096; ++i) { - t1->lut_spb[i] = t1_3d_init_spb(i << 4); - }*/ - /* FIXME FIXME FIXME */ - for (i = 0; i < (1 << T1_NMSEDEC_BITS); i++) { - t = i / pow(2, T1_NMSEDEC_FRACBITS); - u = t; - v = t - 1.5; - t1->lut_nmsedec_sig[i] = - int_max(0, - (int)(floor((u * u - v * v) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, - T1_NMSEDEC_FRACBITS) * 8192.0)); - t1->lut_nmsedec_sig0[i] = - int_max(0, - (int)(floor((u * u) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, - T1_NMSEDEC_FRACBITS) * 8192.0)); - u = t - 1.0; - if (i & (1 << (T1_NMSEDEC_BITS - 1))) { - v = t - 1.5; - } else { - v = t - 0.5; - } - t1->lut_nmsedec_ref[i] = - int_max(0, - (int)(floor((u * u - v * v) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, - T1_NMSEDEC_FRACBITS) * 8192.0)); - t1->lut_nmsedec_ref0[i] = - int_max(0, - (int)(floor((u * u) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, - T1_NMSEDEC_FRACBITS) * 8192.0)); - } -} - -/* ----------------------------------------------------------------------- */ - -opj_t1_3d_t* t1_3d_create(opj_common_ptr cinfo) -{ - opj_t1_3d_t *t1 = (opj_t1_3d_t*)opj_malloc(sizeof(opj_t1_3d_t)); - if (t1) { - t1->cinfo = cinfo; - /* create MQC and RAW handles */ - t1->mqc = mqc_create(); - t1->raw = raw_create(); - /* initialize the look-up tables of the Tier-1 coder/decoder */ - t1_3d_init_luts(t1); - } - return t1; -} - -void t1_3d_destroy(opj_t1_3d_t *t1) -{ - if (t1) { - /* destroy MQC and RAW handles */ - mqc_destroy(t1->mqc); - raw_destroy(t1->raw); - opj_free(t1); - } -} - -void t1_3d_encode_cblks(opj_t1_3d_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp) -{ - int compno, resno, bandno, precno, cblkno; - int x, y, z, i, j, k, orient; - int level[3]; - tile->distotile = 0; /* fixed_quality */ - - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - - for (resno = 0; resno < tilec->numresolution[0]; resno++) { - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - - for (precno = 0; precno < res->prctno[0] * res->prctno[1] * res->prctno[2]; - precno++) { - opj_tcd_precinct_t *prc = &band->precincts[precno]; - - for (cblkno = 0; cblkno < prc->cblkno[0] * prc->cblkno[1] * prc->cblkno[2]; - cblkno++) { - opj_tcd_cblk_t *cblk = &prc->cblks[cblkno]; - - if (band->bandno == 0) { - x = cblk->x0 - band->x0; - y = cblk->y0 - band->y0; - z = cblk->z0 - band->z0; - } else if (band->bandno == 1) { - opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - x = pres->x1 - pres->x0 + cblk->x0 - band->x0; - y = cblk->y0 - band->y0; - z = cblk->z0 - band->z0; - } else if (band->bandno == 2) { - opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - x = cblk->x0 - band->x0; - y = pres->y1 - pres->y0 + cblk->y0 - band->y0; - z = cblk->z0 - band->z0; - } else if (band->bandno == 3) { - opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - x = pres->x1 - pres->x0 + cblk->x0 - band->x0; - y = pres->y1 - pres->y0 + cblk->y0 - band->y0; - z = cblk->z0 - band->z0; - } else if (band->bandno == 4) { - opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - x = cblk->x0 - band->x0; - y = cblk->y0 - band->y0; - z = pres->z1 - pres->z0 + cblk->z0 - band->z0; - } else if (band->bandno == 5) { - opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - x = pres->x1 - pres->x0 + cblk->x0 - band->x0; - y = cblk->y0 - band->y0; - z = pres->z1 - pres->z0 + cblk->z0 - band->z0; - } else if (band->bandno == 6) { - opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - x = cblk->x0 - band->x0; - y = pres->y1 - pres->y0 + cblk->y0 - band->y0; - z = pres->z1 - pres->z0 + cblk->z0 - band->z0; - } else if (band->bandno == 7) { - opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - x = pres->x1 - pres->x0 + cblk->x0 - band->x0; - y = pres->y1 - pres->y0 + cblk->y0 - band->y0; - z = pres->z1 - pres->z0 + cblk->z0 - band->z0; - } - - if (tcp->tccps[compno].reversible == 1) { - for (k = 0; k < cblk->z1 - cblk->z0; k++) { - for (j = 0; j < cblk->y1 - cblk->y0; j++) { - for (i = 0; i < cblk->x1 - cblk->x0; i++) { - t1->data[k][j][i] = - tilec->data[(x + i) + (y + j) * (tilec->x1 - tilec->x0) + (z + k) * - (tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0)] << T1_NMSEDEC_FRACBITS; - } - } - } - } else if (tcp->tccps[compno].reversible == 0) { - for (k = 0; k < cblk->z1 - cblk->z0; k++) { - for (j = 0; j < cblk->y1 - cblk->y0; j++) { - for (i = 0; i < cblk->x1 - cblk->x0; i++) { - t1->data[k][j][i] = fix_mul( - tilec->data[(x + i) + (y + j) * (tilec->x1 - tilec->x0) + (z + k) * - (tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0)], - 8192 * 8192 / ((int) floor(band->stepsize * 8192))) >> (13 - - T1_NMSEDEC_FRACBITS); - } - } - } - } - orient = band->bandno; /* FIXME */ - for (i = 0; i < 3; i++) { - level[i] = tilec->numresolution[i] - 1 - resno; - } - - t1_3d_encode_cblk(t1, cblk, orient, compno, level, tcp->tccps[compno].dwtid, - band->stepsize, tcp->tccps[compno].cblksty, tile->numcomps, tile); - - } /* cblkno */ - } /* precno */ - } /* bandno */ - } /* resno */ - } /* compno */ -} - -void t1_3d_decode_cblks(opj_t1_3d_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp) -{ - int compno, resno, bandno, precno, cblkno; - - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - - for (resno = 0; resno < tilec->numresolution[0]; resno++) { - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - - for (precno = 0; precno < res->prctno[0] * res->prctno[1] * res->prctno[2]; - precno++) { - opj_tcd_precinct_t *prc = &band->precincts[precno]; - - for (cblkno = 0; cblkno < prc->cblkno[0] * prc->cblkno[1] * prc->cblkno[2]; - cblkno++) { - int x, y, z, i, j, k, orient; - opj_tcd_cblk_t *cblk = &prc->cblks[cblkno]; - - orient = band->bandno; /* FIXME */ - - /*fprintf(stdout,"[INFO] t1_3d_decode_cblk(t1, cblk, orient(%d), tcp->tccps[compno].roishift (%d), tcp->tccps[compno].cblksty (%d));\n",orient,tcp->tccps[compno].roishift, tcp->tccps[compno].cblksty);*/ - t1_3d_decode_cblk(t1, cblk, orient, tcp->tccps[compno].roishift, - tcp->tccps[compno].cblksty); - - if (band->bandno == 0) { - x = cblk->x0 - band->x0; - y = cblk->y0 - band->y0; - z = cblk->z0 - band->z0; - } else if (band->bandno == 1) { - opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - x = pres->x1 - pres->x0 + cblk->x0 - band->x0; - y = cblk->y0 - band->y0; - z = cblk->z0 - band->z0; - } else if (band->bandno == 2) { - opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - x = cblk->x0 - band->x0; - y = pres->y1 - pres->y0 + cblk->y0 - band->y0; - z = cblk->z0 - band->z0; - } else if (band->bandno == 3) { - opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - x = pres->x1 - pres->x0 + cblk->x0 - band->x0; - y = pres->y1 - pres->y0 + cblk->y0 - band->y0; - z = cblk->z0 - band->z0; - } else if (band->bandno == 4) { - opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - x = cblk->x0 - band->x0; - y = cblk->y0 - band->y0; - z = pres->z1 - pres->z0 + cblk->z0 - band->z0; - } else if (band->bandno == 5) { - opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - x = pres->x1 - pres->x0 + cblk->x0 - band->x0; - y = cblk->y0 - band->y0; - z = pres->z1 - pres->z0 + cblk->z0 - band->z0; - } else if (band->bandno == 6) { - opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - x = cblk->x0 - band->x0; - y = pres->y1 - pres->y0 + cblk->y0 - band->y0; - z = pres->z1 - pres->z0 + cblk->z0 - band->z0; - } else if (band->bandno == 7) { - opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - x = pres->x1 - pres->x0 + cblk->x0 - band->x0; - y = pres->y1 - pres->y0 + cblk->y0 - band->y0; - z = pres->z1 - pres->z0 + cblk->z0 - band->z0; - } - - if (tcp->tccps[compno].roishift) { - int thresh, val, mag; - thresh = 1 << tcp->tccps[compno].roishift; - for (k = 0; k < cblk->z1 - cblk->z0; k++) { - for (j = 0; j < cblk->y1 - cblk->y0; j++) { - for (i = 0; i < cblk->x1 - cblk->x0; i++) { - val = t1->data[k][j][i]; - mag = int_abs(val); - if (mag >= thresh) { - mag >>= tcp->tccps[compno].roishift; - t1->data[k][j][i] = val < 0 ? -mag : mag; - } - } - } - } - } - - if (tcp->tccps[compno].reversible == 1) { - for (k = 0; k < cblk->z1 - cblk->z0; k++) { - for (j = 0; j < cblk->y1 - cblk->y0; j++) { - for (i = 0; i < cblk->x1 - cblk->x0; i++) { - int tmp = t1->data[k][j][i]; - tilec->data[x + i + (y + j) * (tilec->x1 - tilec->x0) + (z + k) * - (tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0)] = tmp / 2; - } - } - } - } else { /* if (tcp->tccps[compno].reversible == 0) */ - for (k = 0; k < cblk->z1 - cblk->z0; k++) { - for (j = 0; j < cblk->y1 - cblk->y0; j++) { - for (i = 0; i < cblk->x1 - cblk->x0; i++) { - double tmp = (double)(t1->data[k][j][i] * band->stepsize * 4096.0); - if (t1->data[k][j][i] >> 1 == 0) { - tilec->data[x + i + (y + j) * (tilec->x1 - tilec->x0) + (z + k) * - (tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0)] = 0; - } else { - int tmp2 = ((int)(floor(fabs(tmp)))) + ((int) floor(fabs(tmp * 2)) % 2); - tilec->data[x + i + (y + j) * (tilec->x1 - tilec->x0) + (z + k) * - (tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0)] = ((tmp < 0) ? -tmp2 : tmp2); - } - } - } - } - } - } /* cblkno */ - } /* precno */ - } /* bandno */ - } /* resno */ - } /* compno */ -} diff --git a/src/lib/openjp3d/t1_3d.h b/src/lib/openjp3d/t1_3d.h deleted file mode 100644 index 4d0ad89c..00000000 --- a/src/lib/openjp3d/t1_3d.h +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyrigth (c) 2006, Mónica Díez, LPI-UVA, 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 __T1_3D_H -#define __T1_3D_H -/** -@file t1_3d.h -@brief Implementation of the tier-1 coding (coding of code-block coefficients) (T1) - -The functions in T1_3D.C have for goal to realize the tier-1 coding operation of 3D-EBCOT. -The functions in T1_3D.C are used by some function in TCD.C. -*/ - -/** @defgroup T1_3D T1_3D - Implementation of the tier-1 coding */ -/*@{*/ - -/* ----------------------------------------------------------------------- */ - -/* Neighbourhood of 3D EBCOT (Significance context)*/ -#define T1_3D_SIG_NE 0x00000001 /*< Context orientation : North-East direction */ -#define T1_3D_SIG_SE 0x00000002 /*< Context orientation : South-East direction */ -#define T1_3D_SIG_SW 0x00000004 /*< Context orientation : South-West direction */ -#define T1_3D_SIG_NW 0x00000008 /* Context orientation : North-West direction */ -#define T1_3D_SIG_N 0x00000010 /*< Context orientation : North direction */ -#define T1_3D_SIG_E 0x00000020 /*< Context orientation : East direction */ -#define T1_3D_SIG_S 0x00000040 /*< Context orientation : South direction */ -#define T1_3D_SIG_W 0x00000080 /*< Context orientation : West direction */ -#define T1_3D_SIG_FC 0x00000100 /*< Context orientation : Forward Central direction */ -#define T1_3D_SIG_BC 0x00000200 /*< Context orientation : Backward Central direction */ -#define T1_3D_SIG_FNE 0x00000400 /*< Context orientation : Forward North-East direction */ -#define T1_3D_SIG_FSE 0x00000800 /*< Context orientation : Forward South-East direction */ -#define T1_3D_SIG_FSW 0x00001000 /*< Context orientation : Forward South-West direction */ -#define T1_3D_SIG_FNW 0x00002000 /*< Context orientation : Forward North-West direction */ -#define T1_3D_SIG_FN 0x00004000 /*< Context orientation : Forward North direction */ -#define T1_3D_SIG_FE 0x00008000 /*< Context orientation : Forward East direction */ -#define T1_3D_SIG_FS 0x00010000 /*< Context orientation : Forward South direction */ -#define T1_3D_SIG_FW 0x00020000 /*< Context orientation : Forward West direction */ -#define T1_3D_SIG_BNE 0x00040000 /*< Context orientation : Backward North-East direction */ -#define T1_3D_SIG_BSE 0x00080000 /*< Context orientation : Backward South-East direction */ -#define T1_3D_SIG_BSW 0x00100000 /*< Context orientation : Backward South-West direction */ -#define T1_3D_SIG_BNW 0x00200000 /*< Context orientation : Backward North-West direction */ -#define T1_3D_SIG_BN 0x00400000 /*< Context orientation : Backward North direction */ -#define T1_3D_SIG_BE 0x00800000 /*< Context orientation : Backward East direction */ -#define T1_3D_SIG_BS 0x01000000 /*< Context orientation : Backward South direction */ -#define T1_3D_SIG_BW 0x02000000 /*< Context orientation : Backward West direction */ -#define T1_3D_SIG_COTH (T1_3D_SIG_N|T1_3D_SIG_NE|T1_3D_SIG_E|T1_3D_SIG_SE|T1_3D_SIG_S|T1_3D_SIG_SW|T1_3D_SIG_W|T1_3D_SIG_NW) -#define T1_3D_SIG_BOTH (T1_3D_SIG_BN|T1_3D_SIG_BNE|T1_3D_SIG_BE|T1_3D_SIG_BSE|T1_3D_SIG_BS|T1_3D_SIG_BSW|T1_3D_SIG_BW|T1_3D_SIG_BNW|T1_3D_SIG_BC) -#define T1_3D_SIG_FOTH (T1_3D_SIG_FN|T1_3D_SIG_FNE|T1_3D_SIG_FE|T1_3D_SIG_FSE|T1_3D_SIG_FS|T1_3D_SIG_FSW|T1_3D_SIG_FW|T1_3D_SIG_FNW|T1_3D_SIG_FC) -#define T1_3D_SIG_OTH (T1_3D_SIG_FOTH|T1_3D_SIG_BOTH|T1_3D_SIG_COTH) -#define T1_3D_SIG_PRIM (T1_3D_SIG_N|T1_3D_SIG_E|T1_3D_SIG_S|T1_3D_SIG_W|T1_3D_SIG_FC|T1_3D_SIG_BC) - -#define T1_3D_SGN_N 0x0400 -#define T1_3D_SGN_E 0x0800 -#define T1_3D_SGN_S 0x1000 -#define T1_3D_SGN_W 0x2000 -#define T1_3D_SGN_F 0x4000 -#define T1_3D_SGN_B 0x8000 -#define T1_3D_SGN (T1_3D_SGN_N|T1_3D_SGN_E|T1_3D_SGN_S|T1_3D_SGN_W|T1_3D_SGN_F|T1_3D_SGN_B) - -#define T1_3D_SIG 0x0001 /*Significance state*/ -#define T1_3D_REFINE 0x0002 /*Delayed significance*/ -#define T1_3D_VISIT 0x0004 /*First-pass membership*/ - -#define T1_3D_NUMCTXS_AGG 1 -#define T1_3D_NUMCTXS_ZC 16 -#define T1_3D_NUMCTXS_MAG 3 -#define T1_3D_NUMCTXS_SC 6 -#define T1_3D_NUMCTXS_UNI 1 - -#define T1_3D_CTXNO_AGG 0 -#define T1_3D_CTXNO_ZC (T1_3D_CTXNO_AGG+T1_3D_NUMCTXS_AGG) /*1*/ -#define T1_3D_CTXNO_MAG (T1_3D_CTXNO_ZC+T1_3D_NUMCTXS_ZC) /*17*/ -#define T1_3D_CTXNO_SC (T1_3D_CTXNO_MAG+T1_3D_NUMCTXS_MAG) /*20*/ -#define T1_3D_CTXNO_UNI (T1_3D_CTXNO_SC+T1_3D_NUMCTXS_SC) /*26*/ -#define T1_3D_NUMCTXS (T1_3D_CTXNO_UNI+T1_3D_NUMCTXS_UNI) /*27*/ - - -/* ----------------------------------------------------------------------- */ - -/** -Tier-1 coding (coding of code-block coefficients) -*/ -typedef struct opj_t1_3d { - /** Codec context */ - opj_common_ptr cinfo; - /** MQC component */ - opj_mqc_t *mqc; - /** RAW component */ - opj_raw_t *raw; - /** LUTs for decoding normalised MSE */ - int lut_nmsedec_sig[1 << T1_NMSEDEC_BITS]; - int lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS]; - int lut_nmsedec_ref[1 << T1_NMSEDEC_BITS]; - int lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS]; - /** Codeblock data */ - int data[T1_CBLKD][T1_CBLKH][T1_CBLKW]; - /** Context information for each voxel in codeblock */ - unsigned int flags[T1_CBLKD + 2][T1_CBLKH + 2][T1_CBLKH + 2]; - /** Voxel information (significance/visited/refined) */ - int flagSVR[T1_CBLKD + 2][T1_CBLKH + 2][T1_CBLKH + 2]; -} opj_t1_3d_t; - -/** @name Exported functions */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Create a new T1_3D handle -and initialize the look-up tables of the Tier-1 coder/decoder -@return Returns a new T1 handle if successful, returns NULL otherwise -@see t1_init_luts -*/ -opj_t1_3d_t* t1_3d_create(opj_common_ptr cinfo); -/** -Destroy a previously created T1_3D handle -@param t1 T1_3D handle to destroy -*/ -void t1_3d_destroy(opj_t1_3d_t *t1); -/** -Encode the code-blocks of a tile -@param t1 T1_3D handle -@param tile The tile to encode -@param tcp Tile coding parameters -*/ -void t1_3d_encode_cblks(opj_t1_3d_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp); -/** -Decode the code-blocks of a tile -@param t1 T1_3D handle -@param tile The tile to decode -@param tcp Tile coding parameters -*/ -void t1_3d_decode_cblks(opj_t1_3d_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp); -/** -Get weigths of MSE decoding -@param nmsedec The normalized MSE reduction -@param compno -@param level -@param orient -@param bpno -@param reversible -@param stepsize -@param numcomps -@param dwtid -returns MSE associated to decoding pass -double t1_3d_getwmsedec(int nmsedec, int compno, int levelxy, int levelz, int orient, int bpno, int reversible, double stepsize, int numcomps, int dwtid); -*/ -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __T1_H */ diff --git a/src/lib/openjp3d/t2.c b/src/lib/openjp3d/t2.c deleted file mode 100644 index 9856d1d9..00000000 --- a/src/lib/openjp3d/t2.c +++ /dev/null @@ -1,731 +0,0 @@ -/* - * 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 - * 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_includes.h" - -/** @defgroup T2 T2 - Implementation of a tier-2 coding */ -/*@{*/ - -/** @name Local static functions */ -/*@{*/ - -static void t2_putcommacode(opj_bio_t *bio, int n); -static int t2_getcommacode(opj_bio_t *bio); -/** -Variable length code for signalling delta Zil (truncation point) -@param bio Bit Input/Output component -@param n delta Zil -*/ -static void t2_putnumpasses(opj_bio_t *bio, int n); -static int t2_getnumpasses(opj_bio_t *bio); -/** -Encode a packet of a tile to a destination buffer -@param tile Tile for which to write the packets -@param tcp Tile coding parameters -@param pi Packet identity -@param dest Destination buffer -@param len Length of the destination buffer -@param volume_info Structure to create an index file -@param tileno Number of the tile encoded -@param cp Coding parameters -@return Number of bytes encoded from the packet -*/ -static int t2_encode_packet(opj_tcd_tile_t *tile, opj_tcp_t *tcp, - opj_pi_iterator_t *pi, unsigned char *dest, int len, - opj_volume_info_t *volume_info, int tileno, opj_cp_t *cp); -/** -Initialize the segment decoder -@param seg Segment instance -@param cblksty Codeblock style -@param first Is first segment -*/ -static void t2_init_seg(opj_tcd_seg_t *seg, int cblksty, int first); -/** -Decode a packet of a tile from a source buffer -@param t2 T2 handle -@param src Source buffer -@param len Length of the source buffer -@param tile Tile for which to write the packets -@param tcp Tile coding parameters -@param pi Packet identity -@return Number of bytes decoded from the packet -*/ -int t2_decode_packet(opj_t2_t* t2, unsigned char *src, int len, - opj_tcd_tile_t *tile, opj_tcp_t *tcp, opj_pi_iterator_t *pi); - -/*@}*/ - -/*@}*/ - -/* ----------------------------------------------------------------------- */ - -/* #define RESTART 0x04 */ -static void t2_putcommacode(opj_bio_t *bio, int n) -{ - while (--n >= 0) { - bio_write(bio, 1, 1); - } - bio_write(bio, 0, 1); -} - -static int t2_getcommacode(opj_bio_t *bio) -{ - int n; - for (n = 0; bio_read(bio, 1); n++) { - ; - } - return n; -} - -static void t2_putnumpasses(opj_bio_t *bio, int n) -{ - if (n == 1) { - bio_write(bio, 0, 1); - } else if (n == 2) { - bio_write(bio, 2, 2); - } else if (n <= 5) { - bio_write(bio, 0xc | (n - 3), 4); - } else if (n <= 36) { - bio_write(bio, 0x1e0 | (n - 6), 9); - } else if (n <= 164) { - bio_write(bio, 0xff80 | (n - 37), 16); - } -} - -static int t2_getnumpasses(opj_bio_t *bio) -{ - int n; - if (!bio_read(bio, 1)) { - return 1; - } - if (!bio_read(bio, 1)) { - return 2; - } - if ((n = bio_read(bio, 2)) != 3) { - return (3 + n); - } - if ((n = bio_read(bio, 5)) != 31) { - return (6 + n); - } - return (37 + bio_read(bio, 7)); -} - -static int t2_encode_packet(opj_tcd_tile_t * tile, opj_tcp_t * tcp, - opj_pi_iterator_t *pi, unsigned char *dest, int len, - opj_volume_info_t * volume_info, int tileno, opj_cp_t *cp) -{ - int bandno, cblkno; - unsigned char *sop = 0, *eph = 0; - unsigned char *c = dest; - - int compno = pi->compno; /* component value */ - int resno = pi->resno; /* resolution level value */ - int precno = pi->precno; /* precinct value */ - int layno = pi->layno; /* quality layer value */ - - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - - opj_bio_t *bio = NULL; /* BIO component */ - - /* */ - if ((tcp->csty & J3D_CP_CSTY_SOP)) { - sop = (unsigned char *) opj_malloc(6 * sizeof(unsigned char)); - sop[0] = 255; - sop[1] = 145; - sop[2] = 0; - sop[3] = 4; - sop[4] = (volume_info) ? (volume_info->num % 65536) / 256 : (0 % 65536) / 256 ; - sop[5] = (volume_info) ? (volume_info->num % 65536) % 256 : (0 % 65536) % 256 ; - memcpy(c, sop, 6); - opj_free(sop); - c += 6; - } - /* */ - - if (!layno) { - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - opj_tcd_precinct_t *prc = &band->precincts[precno]; - tgt_reset(prc->incltree); - tgt_reset(prc->imsbtree); - for (cblkno = 0; cblkno < prc->cblkno[0] * prc->cblkno[1] * prc->cblkno[2]; - cblkno++) { - opj_tcd_cblk_t *cblk = &prc->cblks[cblkno]; - cblk->numpasses = 0; - tgt_setvalue(prc->imsbtree, cblkno, band->numbps - cblk->numbps); - } - } - } - - bio = bio_create(); - bio_init_enc(bio, c, len); - bio_write(bio, 1, 1); /* Empty header bit */ - - /* Writing Packet header */ - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - opj_tcd_precinct_t *prc = &band->precincts[precno]; - for (cblkno = 0; cblkno < prc->cblkno[0] * prc->cblkno[1] * prc->cblkno[2]; - cblkno++) { - opj_tcd_cblk_t *cblk = &prc->cblks[cblkno]; - opj_tcd_layer_t *layer = &cblk->layers[layno]; - if (!cblk->numpasses && layer->numpasses) { - tgt_setvalue(prc->incltree, cblkno, layno); - } - } - - for (cblkno = 0; cblkno < prc->cblkno[0] * prc->cblkno[1] * prc->cblkno[2]; - cblkno++) { - opj_tcd_cblk_t *cblk = &prc->cblks[cblkno]; - opj_tcd_layer_t *layer = &cblk->layers[layno]; - int increment = 0; - int nump = 0; - int len = 0, passno; - /* cblk inclusion bits */ - if (!cblk->numpasses) { - tgt_encode(bio, prc->incltree, cblkno, layno + 1); - } else { - bio_write(bio, layer->numpasses != 0, 1); - } - /* if cblk not included, go to the next cblk */ - if (!layer->numpasses) { - continue; - } - /* if first instance of cblk --> zero bit-planes information */ - if (!cblk->numpasses) { - cblk->numlenbits = 3; - tgt_encode(bio, prc->imsbtree, cblkno, 999); - } - /* number of coding passes included */ - t2_putnumpasses(bio, layer->numpasses); - - /* computation of the increase of the length indicator and insertion in the header */ - for (passno = cblk->numpasses; passno < cblk->numpasses + layer->numpasses; - passno++) { - opj_tcd_pass_t *pass = &cblk->passes[passno]; - nump++; - len += pass->len; - if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) { - increment = int_max(increment, - int_floorlog2(len) + 1 - (cblk->numlenbits + int_floorlog2(nump))); - len = 0; - nump = 0; - } - } - t2_putcommacode(bio, increment); - - /* computation of the new Length indicator */ - cblk->numlenbits += increment; - - /* insertion of the codeword segment length */ - for (passno = cblk->numpasses; passno < cblk->numpasses + layer->numpasses; - passno++) { - opj_tcd_pass_t *pass = &cblk->passes[passno]; - nump++; - len += pass->len; - if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) { - bio_write(bio, len, cblk->numlenbits + int_floorlog2(nump)); - len = 0; - nump = 0; - } - } - - } - } - - - if (bio_flush(bio)) { - bio_destroy(bio); - return -999; /* modified to eliminate longjmp !! */ - } - - c += bio_numbytes(bio); - - bio_destroy(bio); - - /* */ - if (tcp->csty & J3D_CP_CSTY_EPH) { - eph = (unsigned char *) opj_malloc(2 * sizeof(unsigned char)); - eph[0] = 255; - eph[1] = 146; - memcpy(c, eph, 2); - opj_free(eph); - c += 2; - } - /* */ - - /* Writing the packet body */ - - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - opj_tcd_precinct_t *prc = &band->precincts[precno]; - for (cblkno = 0; cblkno < prc->cblkno[0] * prc->cblkno[1] * prc->cblkno[2]; - cblkno++) { - opj_tcd_cblk_t *cblk = &prc->cblks[cblkno]; - opj_tcd_layer_t *layer = &cblk->layers[layno]; - if (!layer->numpasses) { - continue; - } - if (c + layer->len > dest + len) { - return -999; - } - - memcpy(c, layer->data, layer->len); - cblk->numpasses += layer->numpasses; - c += layer->len; - /* ADD for index Cfr. Marcela --> delta disto by packet */ - if (volume_info && volume_info->index_write && volume_info->index_on) { - opj_tile_info_t *info_TL = &volume_info->tile[tileno]; - opj_packet_info_t *info_PK = &info_TL->packet[volume_info->num]; - info_PK->disto += layer->disto; - if (volume_info->D_max < info_PK->disto) { - volume_info->D_max = info_PK->disto; - } - } - /* */ - } - } - - return (c - dest); -} - -static void t2_init_seg(opj_tcd_seg_t * seg, int cblksty, int first) -{ - seg->numpasses = 0; - seg->len = 0; - if (cblksty & J3D_CCP_CBLKSTY_TERMALL) { - seg->maxpasses = 1; - } else if (cblksty & J3D_CCP_CBLKSTY_LAZY) { - if (first) { - seg->maxpasses = 10; - } else { - seg->maxpasses = (((seg - 1)->maxpasses == 1) || - ((seg - 1)->maxpasses == 10)) ? 2 : 1; - } - } else { - seg->maxpasses = 109; - } -} - -int t2_decode_packet(opj_t2_t* t2, unsigned char *src, int len, - opj_tcd_tile_t *tile, opj_tcp_t *tcp, opj_pi_iterator_t *pi) -{ - int bandno, cblkno; - unsigned char *c = src; - - opj_cp_t *cp = t2->cp; - - int compno = pi->compno; /* component value */ - int resno = pi->resno; /* resolution level value */ - int precno = pi->precno; /* precinct value */ - int layno = pi->layno; /* quality layer value */ - - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - - unsigned char *hd = NULL; - int present; - - opj_bio_t *bio = NULL; /* BIO component */ - - if (layno == 0) { - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - opj_tcd_precinct_t *prc = &band->precincts[precno]; - - if ((band->x1 - band->x0 == 0) || (band->y1 - band->y0 == 0) || - (band->z1 - band->z0 == 0)) { - continue; - } - - tgt_reset(prc->incltree); - tgt_reset(prc->imsbtree); - for (cblkno = 0; cblkno < prc->cblkno[0] * prc->cblkno[1] * prc->cblkno[2]; - cblkno++) { - opj_tcd_cblk_t *cblk = &prc->cblks[cblkno]; - cblk->numsegs = 0; - } - } - } - - /* SOP markers */ - - if (tcp->csty & J3D_CP_CSTY_SOP) { - if ((*c) != 0xff || (*(c + 1) != 0x91)) { - opj_event_msg(t2->cinfo, EVT_WARNING, "Expected SOP marker\n"); - } else { - c += 6; - } - - /** TODO : check the Nsop value */ - } - - /* - When the marker PPT/PPM is used the packet header are store in PPT/PPM marker - This part deal with this caracteristic - step 1: Read packet header in the saved structure - step 2: Return to codestream for decoding - */ - - bio = bio_create(); - - if (cp->ppm == 1) { /* PPM */ - hd = cp->ppm_data; - bio_init_dec(bio, hd, cp->ppm_len); - } else if (tcp->ppt == 1) { /* PPT */ - hd = tcp->ppt_data; - bio_init_dec(bio, hd, tcp->ppt_len); - } else { /* Normal Case */ - hd = c; - bio_init_dec(bio, hd, src + len - hd); - } - - present = bio_read(bio, 1); - - if (!present) { - bio_inalign(bio); - hd += bio_numbytes(bio); - bio_destroy(bio); - - /* EPH markers */ - - if (tcp->csty & J3D_CP_CSTY_EPH) { - if ((*hd) != 0xff || (*(hd + 1) != 0x92)) { - printf("Error : expected EPH marker\n"); - } else { - hd += 2; - } - } - - if (cp->ppm == 1) { /* PPM case */ - cp->ppm_len += cp->ppm_data - hd; - cp->ppm_data = hd; - return (c - src); - } - if (tcp->ppt == 1) { /* PPT case */ - tcp->ppt_len += tcp->ppt_data - hd; - tcp->ppt_data = hd; - return (c - src); - } - - return (hd - src); - } - - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - opj_tcd_precinct_t *prc = &band->precincts[precno]; - - if ((band->x1 - band->x0 == 0) || (band->y1 - band->y0 == 0) || - (band->z1 - band->z0 == 0)) { - continue; - } - - for (cblkno = 0; cblkno < prc->cblkno[0] * prc->cblkno[1] * prc->cblkno[2]; - cblkno++) { - int included, increment, n; - opj_tcd_cblk_t *cblk = &prc->cblks[cblkno]; - opj_tcd_seg_t *seg = NULL; - /* if cblk not yet included before --> inclusion tagtree */ - if (!cblk->numsegs) { - included = tgt_decode(bio, prc->incltree, cblkno, layno + 1); - /* else one bit */ - } else { - included = bio_read(bio, 1); - } - /* if cblk not included */ - if (!included) { - cblk->numnewpasses = 0; - continue; - } - /* if cblk not yet included --> zero-bitplane tagtree */ - if (!cblk->numsegs) { - int i, numimsbs; - for (i = 0; !tgt_decode(bio, prc->imsbtree, cblkno, i); i++); - numimsbs = i - 1; - cblk->numbps = band->numbps - numimsbs; - cblk->numlenbits = 3; - } - /* number of coding passes */ - cblk->numnewpasses = t2_getnumpasses(bio); - increment = t2_getcommacode(bio); - /* length indicator increment */ - cblk->numlenbits += increment; - if (!cblk->numsegs) { - seg = &cblk->segs[0]; - t2_init_seg(seg, tcp->tccps[compno].cblksty, 1); - } else { - seg = &cblk->segs[cblk->numsegs - 1]; - if (seg->numpasses == seg->maxpasses) { - t2_init_seg(++seg, tcp->tccps[compno].cblksty, 0); - } - } - n = cblk->numnewpasses; - - do { - seg->numnewpasses = int_min(seg->maxpasses - seg->numpasses, n); - seg->newlen = bio_read(bio, - cblk->numlenbits + int_floorlog2(seg->numnewpasses)); - n -= seg->numnewpasses; - if (n > 0) { - t2_init_seg(++seg, tcp->tccps[compno].cblksty, 0); - } - } while (n > 0); - } - } - - if (bio_inalign(bio)) { - bio_destroy(bio); - return -999; - } - - hd += bio_numbytes(bio); - bio_destroy(bio); - - /* EPH markers */ - if (tcp->csty & J3D_CP_CSTY_EPH) { - if ((*hd) != 0xff || (*(hd + 1) != 0x92)) { - opj_event_msg(t2->cinfo, EVT_ERROR, "Expected EPH marker\n"); - return -999; - } else { - hd += 2; - } - } - - if (cp->ppm == 1) { - cp->ppm_len += cp->ppm_data - hd; - cp->ppm_data = hd; - } else if (tcp->ppt == 1) { - tcp->ppt_len += tcp->ppt_data - hd; - tcp->ppt_data = hd; - } else { - c = hd; - } - - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - opj_tcd_precinct_t *prc = &band->precincts[precno]; - - if ((band->x1 - band->x0 == 0) || (band->y1 - band->y0 == 0) || - (band->z1 - band->z0 == 0)) { - continue; - } - - for (cblkno = 0; cblkno < prc->cblkno[0] * prc->cblkno[1] * prc->cblkno[2]; - cblkno++) { - opj_tcd_cblk_t *cblk = &prc->cblks[cblkno]; - opj_tcd_seg_t *seg = NULL; - if (!cblk->numnewpasses) { - continue; - } - if (!cblk->numsegs) { - seg = &cblk->segs[0]; - cblk->numsegs++; - cblk->len = 0; - } else { - seg = &cblk->segs[cblk->numsegs - 1]; - if (seg->numpasses == seg->maxpasses) { - seg++; - cblk->numsegs++; - } - } - - do { - if (c + seg->newlen > src + len) { - return -999; - } - - memcpy(cblk->data + cblk->len, c, seg->newlen); - if (seg->numpasses == 0) { - seg->data = cblk->data + cblk->len; - } - c += seg->newlen; - cblk->len += seg->newlen; - seg->len += seg->newlen; - seg->numpasses += seg->numnewpasses; - cblk->numnewpasses -= seg->numnewpasses; - if (cblk->numnewpasses > 0) { - seg++; - cblk->numsegs++; - } - } while (cblk->numnewpasses > 0); - } - } - - return (c - src); -} - -/* ----------------------------------------------------------------------- */ - -int t2_encode_packets(opj_t2_t* t2, int tileno, opj_tcd_tile_t *tile, - int maxlayers, unsigned char *dest, int len, opj_volume_info_t *volume_info) -{ - unsigned char *c = dest; - int e = 0; - opj_pi_iterator_t *pi = NULL; - int pino; - - opj_volume_t *volume = t2->volume; - opj_cp_t *cp = t2->cp; - - /* create a packet iterator */ - pi = pi_create(volume, cp, tileno); - if (!pi) { - fprintf(stdout, "[ERROR] Failed to create a pi structure\n"); - return -999; - } - - if (volume_info) { - volume_info->num = 0; - } - - for (pino = 0; pino <= cp->tcps[tileno].numpocs; pino++) { - while (pi_next(&pi[pino])) { - if (pi[pino].layno < maxlayers) { - e = t2_encode_packet(tile, &cp->tcps[tileno], &pi[pino], c, dest + len - c, - volume_info, tileno, cp); - /*opj_event_msg(t2->cinfo, EVT_INFO, " t2_encode_packet: %d bytes coded\n",e);*/ - if (e == -999) { - break; - } else { - c += e; - } - - /* INDEX >> */ - if (volume_info && volume_info->index_on) { - if (volume_info->index_write) { - opj_tile_info_t *info_TL = &volume_info->tile[tileno]; - opj_packet_info_t *info_PK = &info_TL->packet[volume_info->num]; - if (!volume_info->num) { - info_PK->start_pos = info_TL->end_header + 1; - } else { - info_PK->start_pos = info_TL->packet[volume_info->num - 1].end_pos + 1; - } - info_PK->end_pos = info_PK->start_pos + e - 1; - } - - volume_info->num++; - } - /* << INDEX */ - } - } - } - - /* don't forget to release pi */ - pi_destroy(pi, cp, tileno); - - if (e == -999) { - return e; - } - - return (c - dest); -} - -int t2_decode_packets(opj_t2_t *t2, unsigned char *src, int len, int tileno, - opj_tcd_tile_t *tile) -{ - unsigned char *c = src; - opj_pi_iterator_t *pi; - int pino, e = 0; - int n = 0, i; - - opj_volume_t *volume = t2->volume; - opj_cp_t *cp = t2->cp; - - /* create a packet iterator */ - pi = pi_create(volume, cp, tileno); - if (!pi) { - /* TODO: throw an error */ - return -999; - } - - for (pino = 0; pino <= cp->tcps[tileno].numpocs; pino++) { - while (pi_next(&pi[pino])) { - if ((cp->layer == 0) || (cp->layer >= ((pi[pino].layno) + 1))) { - e = t2_decode_packet(t2, c, src + len - c, tile, &cp->tcps[tileno], &pi[pino]); - } else { - e = 0; - } - - /* progression in resolution */ - for (i = 0; i < 3; i++) { - volume->comps[pi[pino].compno].resno_decoded[i] = (e > 0) ? int_max( - pi[pino].resno, volume->comps[pi[pino].compno].resno_decoded[i]) : - volume->comps[pi[pino].compno].resno_decoded[i]; - } - n++; - - if (e == -999) { /* ADD */ - break; - } else { - opj_event_msg(t2->cinfo, EVT_INFO, " t2_decode_packet: %d bytes decoded\n", e); - c += e; - } - } - } - - /* don't forget to release pi */ - pi_destroy(pi, cp, tileno); - - if (e == -999) { - return e; - } - - return (c - src); -} - -/* ----------------------------------------------------------------------- */ - -opj_t2_t* t2_create(opj_common_ptr cinfo, opj_volume_t *volume, opj_cp_t *cp) -{ - /* create the tcd structure */ - opj_t2_t *t2 = (opj_t2_t*)opj_malloc(sizeof(opj_t2_t)); - if (!t2) { - return NULL; - } - t2->cinfo = cinfo; - t2->volume = volume; - t2->cp = cp; - - return t2; -} - -void t2_destroy(opj_t2_t *t2) -{ - if (t2) { - opj_free(t2); - } -} - diff --git a/src/lib/openjp3d/t2.h b/src/lib/openjp3d/t2.h deleted file mode 100644 index 36733f95..00000000 --- a/src/lib/openjp3d/t2.h +++ /dev/null @@ -1,108 +0,0 @@ -/* - * 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, Mónica Díez García, 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 __T2_H -#define __T2_H -/** -@file t2.h -@brief Implementation of a tier-2 coding (packetization of code-block data) (T2) - -*/ - -/** @defgroup T2 T2 - Implementation of a tier-2 coding */ -/*@{*/ - -/** -Tier-2 coding -*/ -typedef struct opj_t2 { - /** Codec context */ - opj_common_ptr cinfo; - /** Encoding: pointer to the src volume. Decoding: pointer to the dst volume. */ - opj_volume_t *volume; - /** Pointer to the volume coding parameters */ - opj_cp_t *cp; -} opj_t2_t; - -/** @name Funciones generales */ -/*@{*/ -/* ----------------------------------------------------------------------- */ - -/** -Encode the packets of a tile to a destination buffer -@param t2 T2 handle -@param tileno number of the tile encoded -@param tile the tile for which to write the packets -@param maxlayers maximum number of layers -@param dest the destination buffer -@param len the length of the destination buffer -@param volume_info structure to create an index file -@return Number of bytes written from packets -*/ -int t2_encode_packets(opj_t2_t* t2, int tileno, opj_tcd_tile_t *tile, - int maxlayers, unsigned char *dest, int len, opj_volume_info_t *volume_info); - -/** -Decode the packets of a tile from a source buffer -@param t2 T2 handle -@param src the source buffer -@param len length of the source buffer -@param tileno number that identifies the tile for which to decode the packets -@param tile tile for which to decode the packets -@return Number of bytes read from packets - */ -int t2_decode_packets(opj_t2_t *t2, unsigned char *src, int len, int tileno, - opj_tcd_tile_t *tile); - -/** -Create a T2 handle -@param cinfo Codec context info -@param volume Source or destination volume -@param cp Volume coding parameters -@return Returns a new T2 handle if successful, returns NULL otherwise -*/ -opj_t2_t* t2_create(opj_common_ptr cinfo, opj_volume_t *volume, opj_cp_t *cp); -/** -Destroy a T2 handle -@param t2 T2 handle to destroy -*/ -void t2_destroy(opj_t2_t *t2); - -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __T2_H */ diff --git a/src/lib/openjp3d/tcd.c b/src/lib/openjp3d/tcd.c deleted file mode 100644 index 714a0565..00000000 --- a/src/lib/openjp3d/tcd.c +++ /dev/null @@ -1,1948 +0,0 @@ -/* - * 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, Mónica Díez, LPI-UVA, 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 "opj_includes.h" - -void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_volume_t * vol) -{ - int tileno, compno, resno, bandno, precno, cblkno; - - fprintf(fd, "volume {\n"); - fprintf(fd, " tw=%d, th=%d, tl=%d, x0=%d x1=%d y0=%d y1=%d z0=%d z1=%d\n", - vol->tw, vol->th, vol->tl, tcd->volume->x0, tcd->volume->x1, tcd->volume->y0, - tcd->volume->y1, tcd->volume->z0, tcd->volume->z1); - - for (tileno = 0; tileno < vol->th * vol->tw * vol->tl; tileno++) { - opj_tcd_tile_t *tile = &tcd->tcd_volume->tiles[tileno]; - fprintf(fd, " tile {\n"); - fprintf(fd, " x0=%d, y0=%d, z0=%d, x1=%d, y1=%d, z1=%d, numcomps=%d\n", - tile->x0, tile->y0, tile->z0, tile->x1, tile->y1, tile->z1, tile->numcomps); - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - fprintf(fd, " tilecomp %d {\n", compno); - fprintf(fd, - " x0=%d, y0=%d, z0=%d, x1=%d, y1=%d, z1=%d, numresx=%d, numresy=%d, numresz=%d\n", - tilec->x0, tilec->y0, tilec->z0, tilec->x1, tilec->y1, tilec->z1, - tilec->numresolution[0], tilec->numresolution[1], tilec->numresolution[2]); - for (resno = 0; resno < tilec->numresolution[0]; resno++) { - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - fprintf(fd, " res %d{\n", resno); - fprintf(fd, - " x0=%d, y0=%d, z0=%d, x1=%d, y1=%d, z1=%d, pw=%d, ph=%d, pl=%d, numbands=%d\n", - res->x0, res->y0, res->z0, res->x1, res->y1, res->z1, res->prctno[0], - res->prctno[1], res->prctno[2], res->numbands); - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - fprintf(fd, " band %d{\n", bandno); - fprintf(fd, - " x0=%d, y0=%d, z0=%d, x1=%d, y1=%d, z1=%d, stepsize=%f, numbps=%d\n", - band->x0, band->y0, band->z0, band->x1, band->y1, band->z1, band->stepsize, - band->numbps); - for (precno = 0; precno < (res->prctno[0] * res->prctno[1] * res->prctno[2]); - precno++) { - opj_tcd_precinct_t *prec = &band->precincts[precno]; - fprintf(fd, " prec %d{\n", precno); - fprintf(fd, - " x0=%d, y0=%d, z0=%d, x1=%d, y1=%d, z1=%d, cw=%d, ch=%d, cl=%d,\n", - prec->x0, prec->y0, prec->z0, prec->x1, prec->y1, prec->z1, prec->cblkno[0], - prec->cblkno[1], prec->cblkno[2]); - for (cblkno = 0; cblkno < (prec->cblkno[0] * prec->cblkno[1] * prec->cblkno[2]); - cblkno++) { - opj_tcd_cblk_t *cblk = &prec->cblks[cblkno]; - fprintf(fd, " cblk %d{\n", cblkno); - fprintf(fd, " x0=%d, y0=%d, z0=%d, x1=%d, y1=%d, z1=%d\n", cblk->x0, - cblk->y0, cblk->z0, cblk->x1, cblk->y1, cblk->z1); - fprintf(fd, " }\n"); - } - fprintf(fd, " }\n"); - } - fprintf(fd, " }\n"); - } - fprintf(fd, " }\n"); - } - fprintf(fd, " }\n"); - } - fprintf(fd, " }\n"); - } - fprintf(fd, "}\n"); -} - -static void tilec_dump(FILE *fd, opj_tcd_tilecomp_t *tilec) -{ - - int i = 0, k; - int datalen; - int *a; - - fprintf(fd, " tilecomp{\n"); - fprintf(fd, - " x0=%d, y0=%d, z0=%d, x1=%d, y1=%d, z1=%d, numresx=%d, numresy=%d, numresz=%d\n", - tilec->x0, tilec->y0, tilec->z0, tilec->x1, tilec->y1, tilec->z1, - tilec->numresolution[0], tilec->numresolution[1], tilec->numresolution[2]); - fprintf(fd, " data {\n"); - datalen = (tilec->z1 - tilec->z0) * (tilec->y1 - tilec->y0) * - (tilec->x1 - tilec->x0); - a = tilec->data; - for (k = 0; k < datalen; k++) { - if (!(k % tilec->x1)) { - fprintf(fd, "\n"); - } - if (!(k % (tilec->y1 * tilec->x1))) { - fprintf(fd, "Slice %d\n", i++); - } - fprintf(fd, " %d", a[k]); - - - } - fprintf(fd, " }\n"); - /*i=0; - fprintf(fd, "Slice %d\n"); - if (tilec->prediction->prederr) { - fprintf(fd, " prederror {\n"); - a = tilec->prediction->prederr; - for (k = 0; k < datalen; k++) { - fprintf(fd," %d",*(a++)); - if (!(k % (tilec->y1 - tilec->y0) * (tilec->x1 - tilec->x0))){ - fprintf(fd, "\n");fprintf(fd, "Slice %d\n",i++); - } - if (!(k % (tilec->x1 - tilec->x0))){ - fprintf(fd, "\n"); - } - } - } - fprintf(fd, " }\n");*/ - fprintf(fd, "}\n"); -} - -/* ----------------------------------------------------------------------- */ - -/** -Create a new TCD handle -*/ -opj_tcd_t* tcd_create(opj_common_ptr cinfo) -{ - /* create the tcd structure */ - opj_tcd_t *tcd = (opj_tcd_t*)opj_malloc(sizeof(opj_tcd_t)); - if (!tcd) { - return NULL; - } - tcd->cinfo = cinfo; - tcd->tcd_volume = (opj_tcd_volume_t*)opj_malloc(sizeof(opj_tcd_volume_t)); - if (!tcd->tcd_volume) { - opj_free(tcd); - return NULL; - } - - return tcd; -} - -/** -Destroy a previously created TCD handle -*/ -void tcd_destroy(opj_tcd_t *tcd) -{ - if (tcd) { - opj_free(tcd->tcd_volume); - opj_free(tcd); - } -} - -/* ----------------------------------------------------------------------- */ -void tcd_malloc_encode(opj_tcd_t *tcd, opj_volume_t * volume, opj_cp_t * cp, - int curtileno) -{ - int compno, resno, bandno, precno, cblkno, i, j;/*, k;*/ - - opj_tcd_tile_t *tile = NULL; /* pointer to tcd->tile */ - opj_tcd_tilecomp_t *tilec = NULL; /* pointer to tcd->tilec */ - opj_tcd_resolution_t *res = NULL; /* pointer to tcd->res */ - opj_tcd_band_t *band = NULL; /* pointer to tcd->band */ - opj_tcd_precinct_t *prc = NULL; /* pointer to tcd->prc */ - opj_tcd_cblk_t *cblk = NULL; /* pointer to tcd->cblk */ - opj_tcp_t *tcp = &cp->tcps[curtileno]; - int p, q, r; - - tcd->volume = volume; - tcd->cp = cp; - tcd->tcd_volume->tw = cp->tw; - tcd->tcd_volume->th = cp->th; - tcd->tcd_volume->tl = cp->tl; - tcd->tcd_volume->tiles = (opj_tcd_tile_t *) opj_malloc(sizeof(opj_tcd_tile_t)); - tcd->tile = tcd->tcd_volume->tiles; - tile = tcd->tile; - - - /* p61 ISO/IEC IS15444-1 : 2002 */ - /* curtileno --> raster scanned index of tiles */ - /* p,q,r --> matricial index of tiles */ - p = curtileno % cp->tw; - q = curtileno / cp->tw; - r = curtileno / (cp->tw * cp->th); /* extension to 3-D */ - - /* 4 borders of the tile rescale on the volume if necessary (B.3)*/ - tile->x0 = int_max(cp->tx0 + p * cp->tdx, volume->x0); - tile->y0 = int_max(cp->ty0 + q * cp->tdy, volume->y0); - tile->z0 = int_max(cp->tz0 + r * cp->tdz, volume->z0); - tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, volume->x1); - tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, volume->y1); - tile->z1 = int_min(cp->tz0 + (r + 1) * cp->tdz, volume->z1); - tile->numcomps = volume->numcomps; - - /* Modification of the RATE >> */ - for (j = 0; j < tcp->numlayers; j++) { - if (tcp->rates[j] <= 1) { - tcp->rates[j] = 0; - } else { - float num = (float)tile->numcomps * (tile->x1 - tile->x0) * - (tile->y1 - tile->y0) * (tile->z1 - tile->z0) * volume->comps[0].prec; - float den = 8.0f * volume->comps[0].dx * volume->comps[0].dy * - volume->comps[0].dz; - den = tcp->rates[j] * den; - tcp->rates[j] = (num + den - 1) / den; - } - /*tcp->rates[j] = tcp->rates[j] ? int_ceildiv( - tile->numcomps * (tile->x1 - tile->x0) * (tile->y1 - tile->y0) * (tile->z1 - tile->z0) * volume->comps[0].prec, - (tcp->rates[j] * 8 * volume->comps[0].dx * volume->comps[0].dy * volume->comps[0].dz)) : 0;*/ - if (tcp->rates[j]) { - if (j && tcp->rates[j] < tcp->rates[j - 1] + 10) { - tcp->rates[j] = tcp->rates[j - 1] + 20; - } else if (!j && tcp->rates[j] < 30) { - tcp->rates[j] = 30; - } - } - } - /* << Modification of the RATE */ - - tile->comps = (opj_tcd_tilecomp_t *) opj_malloc(volume->numcomps * sizeof( - opj_tcd_tilecomp_t)); - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tccp_t *tccp = &tcp->tccps[compno]; - int res_max; - int prevnumbands = 0; - - /* opj_tcd_tilecomp_t *tilec=&tile->comps[compno]; */ - tcd->tilec = &tile->comps[compno]; - tilec = tcd->tilec; - - /* border of each tile component (global) (B.3) */ - tilec->x0 = int_ceildiv(tile->x0, volume->comps[compno].dx); - tilec->y0 = int_ceildiv(tile->y0, volume->comps[compno].dy); - tilec->z0 = int_ceildiv(tile->z0, volume->comps[compno].dz); - tilec->x1 = int_ceildiv(tile->x1, volume->comps[compno].dx); - tilec->y1 = int_ceildiv(tile->y1, volume->comps[compno].dy); - tilec->z1 = int_ceildiv(tile->z1, volume->comps[compno].dz); - - tilec->data = (int *) opj_malloc((tilec->x1 - tilec->x0) * - (tilec->y1 - tilec->y0) * (tilec->z1 - tilec->z0) * sizeof(int)); - - res_max = 0; - for (i = 0; i < 3; i++) { - tilec->numresolution[i] = tccp->numresolution[i]; - /*Greater of 3 resolutions contains all information*/ - res_max = (tilec->numresolution[i] > res_max) ? tilec->numresolution[i] : - res_max; - } - - - tilec->resolutions = (opj_tcd_resolution_t *) opj_malloc(res_max * sizeof( - opj_tcd_resolution_t)); - for (resno = 0; resno < res_max; resno++) { - - int pdx, pdy, pdz; - int tlprcxstart, tlprcystart, tlprczstart; - int brprcxend, brprcyend, brprczend; - int tlcbgxstart, tlcbgystart, tlcbgzstart; - int brcbgxend, brcbgyend, brcbgzend; - int cbgwidthexpn, cbgheightexpn, cbglengthexpn; - int cblkwidthexpn, cblkheightexpn, cblklengthexpn; - - int diff = tccp->numresolution[0] - tccp->numresolution[2]; - int levelnox = tilec->numresolution[0] - 1 - resno; - int levelnoy = tilec->numresolution[1] - 1 - resno; - int levelnoz = tilec->numresolution[2] - 1 - ((resno <= diff) ? 0 : - (resno - diff)); - if (levelnoz < 0) { - levelnoz = 0; - } - - /* opj_tcd_resolution_t *res=&tilec->resolutions[resno]; */ - tcd->res = &tilec->resolutions[resno]; - res = tcd->res; - - /* border for each resolution level (global) (B.14)*/ - res->x0 = int_ceildivpow2(tilec->x0, levelnox); - res->y0 = int_ceildivpow2(tilec->y0, levelnoy); - res->z0 = int_ceildivpow2(tilec->z0, levelnoz); - res->x1 = int_ceildivpow2(tilec->x1, levelnox); - res->y1 = int_ceildivpow2(tilec->y1, levelnoy); - res->z1 = int_ceildivpow2(tilec->z1, levelnoz); - /*if (res->z1 < 0)fprintf(stdout,"Res: %d %d/%d --> %d\n",resno,tilec->z1, levelnoz, int_ceildivpow2(tilec->z1, levelnoz));*/ - - res->numbands = (resno == 0) ? 1 : (resno <= diff) ? 3 : 7; /* --> 3D */ - - /* p. 30, table A-13, ISO/IEC IS154444-1 : 2002 */ - if (tccp->csty & J3D_CCP_CSTY_PRT) { - pdx = tccp->prctsiz[0][resno]; - pdy = tccp->prctsiz[1][resno]; - pdz = tccp->prctsiz[2][resno]; - } else { - pdx = 15; - pdy = 15; - pdz = 15; - } - - /* p. 66, B.16, ISO/IEC IS15444-1 : 2002 */ - tlprcxstart = int_floordivpow2(res->x0, pdx) << pdx; - tlprcystart = int_floordivpow2(res->y0, pdy) << pdy; - tlprczstart = int_floordivpow2(res->z0, pdz) << pdz; - brprcxend = int_ceildivpow2(res->x1, pdx) << pdx; - brprcyend = int_ceildivpow2(res->y1, pdy) << pdy; - brprczend = int_ceildivpow2(res->z1, pdz) << pdz; - - res->prctno[0] = (brprcxend - tlprcxstart) >> pdx; - res->prctno[1] = (brprcyend - tlprcystart) >> pdy; - res->prctno[2] = (brprczend - tlprczstart) >> pdz; - if (res->prctno[2] == 0) { - res->prctno[2] = 1; - } - - /* p. 67, B.17 & B.18, ISO/IEC IS15444-1 : 2002 */ - if (resno == 0) { - tlcbgxstart = tlprcxstart; - tlcbgystart = tlprcystart; - tlcbgzstart = tlprczstart; - brcbgxend = brprcxend; - brcbgyend = brprcyend; - brcbgzend = brprczend; - cbgwidthexpn = pdx; - cbgheightexpn = pdy; - cbglengthexpn = pdz; - } else { - tlcbgxstart = int_ceildivpow2(tlprcxstart, 1); - tlcbgystart = int_ceildivpow2(tlprcystart, 1); - tlcbgzstart = int_ceildivpow2(tlprczstart, 1); - brcbgxend = int_ceildivpow2(brprcxend, 1); - brcbgyend = int_ceildivpow2(brprcyend, 1); - brcbgzend = int_ceildivpow2(brprczend, 1); - cbgwidthexpn = pdx - 1; - cbgheightexpn = pdy - 1; - cbglengthexpn = pdz - 1; - } - - cblkwidthexpn = int_min(tccp->cblk[0], cbgwidthexpn); /*6*/ - cblkheightexpn = int_min(tccp->cblk[1], cbgheightexpn); /*6*/ - cblklengthexpn = int_min(tccp->cblk[2], cbglengthexpn); /*6*/ - - res->bands = (opj_tcd_band_t *) opj_malloc(res->numbands * sizeof( - opj_tcd_band_t)); - for (bandno = 0; bandno < res->numbands; bandno++) { - int x0b, y0b, z0b, i; - int gain, numbps; - opj_stepsize_t *ss = NULL; - - tcd->band = &res->bands[bandno]; - band = tcd->band; - - band->bandno = (resno == 0) ? 0 : bandno + 1; - /* Bandno: 0 - LLL 2 - LHL - 1 - HLL 3 - HHL - 4 - LLH 6 - LHH - 5 - HLH 7 - HHH */ - x0b = (band->bandno == 1) || (band->bandno == 3) || (band->bandno == 5) || - (band->bandno == 7) ? 1 : 0; - y0b = (band->bandno == 2) || (band->bandno == 3) || (band->bandno == 6) || - (band->bandno == 7) ? 1 : 0; - z0b = (band->bandno == 4) || (band->bandno == 5) || (band->bandno == 6) || - (band->bandno == 7) ? 1 : 0; - - /* p. 65, B.15, ISO/IEC IS15444-1 : 2002 */ - if (band->bandno == 0) { - /* band border (global) */ - band->x0 = int_ceildivpow2(tilec->x0, levelnox); - band->y0 = int_ceildivpow2(tilec->y0, levelnoy); - band->z0 = int_ceildivpow2(tilec->z0, levelnoz); - band->x1 = int_ceildivpow2(tilec->x1, levelnox); - band->y1 = int_ceildivpow2(tilec->y1, levelnoy); - band->z1 = int_ceildivpow2(tilec->z1, levelnoz); - } else { - band->x0 = int_ceildivpow2(tilec->x0 - (1 << levelnox) * x0b, levelnox + 1); - band->y0 = int_ceildivpow2(tilec->y0 - (1 << levelnoy) * y0b, levelnoy + 1); - band->z0 = int_ceildivpow2(tilec->z0 - (1 << levelnoz) * z0b, - (resno <= diff) ? levelnoz : levelnoz + 1); - band->x1 = int_ceildivpow2(tilec->x1 - (1 << levelnox) * x0b, levelnox + 1); - band->y1 = int_ceildivpow2(tilec->y1 - (1 << levelnoy) * y0b, levelnoy + 1); - band->z1 = int_ceildivpow2(tilec->z1 - (1 << levelnoz) * z0b, - (resno <= diff) ? levelnoz : levelnoz + 1); - } - - ss = &tccp->stepsizes[(resno == 0) ? 0 : (prevnumbands + bandno + 1)]; - if (bandno == (res->numbands - 1)) { - prevnumbands += (resno == 0) ? 0 : res->numbands; - } - gain = dwt_getgain(band->bandno, tccp->reversible); - numbps = volume->comps[compno].prec + gain; - band->stepsize = (float)((1.0 + ss->mant / 2048.0) * pow(2.0, - numbps - ss->expn)); - band->numbps = ss->expn + tccp->numgbits - 1; /* WHY -1 ? */ - - band->precincts = (opj_tcd_precinct_t *) opj_malloc((res->prctno[0] * - res->prctno[1] * res->prctno[2]) * sizeof(opj_tcd_precinct_t)); - - for (i = 0; i < (res->prctno[0] * res->prctno[1] * res->prctno[2]); i++) { - band->precincts[i].imsbtree = NULL; - band->precincts[i].incltree = NULL; - } - - for (precno = 0; precno < (res->prctno[0] * res->prctno[1] * res->prctno[2]); - precno++) { - int tlcblkxstart, tlcblkystart, tlcblkzstart, brcblkxend, brcblkyend, - brcblkzend; - int cbgxstart, cbgystart, cbgzstart, cbgxend, cbgyend, cbgzend; - - cbgxstart = tlcbgxstart + (precno % res->prctno[0]) * (1 << cbgwidthexpn); - cbgystart = tlcbgystart + ((precno % (res->prctno[0] * res->prctno[1])) / - res->prctno[0]) * (1 << cbgheightexpn); - cbgzstart = tlcbgzstart + (precno / (res->prctno[0] * res->prctno[1])) * - (1 << cbglengthexpn); - cbgxend = cbgxstart + (1 << cbgwidthexpn); - cbgyend = cbgystart + (1 << cbgheightexpn); - cbgzend = cbgzstart + (1 << cbglengthexpn); - - tcd->prc = &band->precincts[precno]; - prc = tcd->prc; - - /* precinct size (global) */ - prc->x0 = int_max(cbgxstart, band->x0); - prc->y0 = int_max(cbgystart, band->y0); - prc->z0 = int_max(cbgzstart, band->z0); - prc->x1 = int_min(cbgxend, band->x1); - prc->y1 = int_min(cbgyend, band->y1); - prc->z1 = int_min(cbgzend, band->z1); - - tlcblkxstart = int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn; - tlcblkystart = int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn; - tlcblkzstart = int_floordivpow2(prc->z0, cblklengthexpn) << cblklengthexpn; - brcblkxend = int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn; - brcblkyend = int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn; - brcblkzend = int_ceildivpow2(prc->z1, cblklengthexpn) << cblklengthexpn; - prc->cblkno[0] = (brcblkxend - tlcblkxstart) >> cblkwidthexpn; - prc->cblkno[1] = (brcblkyend - tlcblkystart) >> cblkheightexpn; - prc->cblkno[2] = (brcblkzend - tlcblkzstart) >> cblklengthexpn; - prc->cblkno[2] = (prc->cblkno[2] == 0) ? 1 : prc->cblkno[2]; - - prc->cblks = (opj_tcd_cblk_t *) opj_malloc((prc->cblkno[0] * prc->cblkno[1] * - prc->cblkno[2]) * sizeof(opj_tcd_cblk_t)); - prc->incltree = tgt_create(prc->cblkno[0], prc->cblkno[1], prc->cblkno[2]); - prc->imsbtree = tgt_create(prc->cblkno[0], prc->cblkno[1], prc->cblkno[2]); - /*tgt_tree_dump(stdout,prc->incltree);*/ - for (cblkno = 0; cblkno < (prc->cblkno[0] * prc->cblkno[1] * prc->cblkno[2]); - cblkno++) { - int cblkxstart = tlcblkxstart + (cblkno % prc->cblkno[0]) * - (1 << cblkwidthexpn); - int cblkystart = tlcblkystart + ((cblkno % (prc->cblkno[0] * prc->cblkno[1])) / - prc->cblkno[0]) * (1 << cblkheightexpn); - int cblkzstart = tlcblkzstart + (cblkno / (prc->cblkno[0] * prc->cblkno[1])) * - (1 << cblklengthexpn); - int cblkxend = cblkxstart + (1 << cblkwidthexpn); - int cblkyend = cblkystart + (1 << cblkheightexpn); - int cblkzend = cblkzstart + (1 << cblklengthexpn); - int prec = ((tilec->bpp > 16) ? 3 : ((tilec->bpp > 8) ? 2 : 1)); - - tcd->cblk = &prc->cblks[cblkno]; - cblk = tcd->cblk; - - /* code-block size (global) */ - cblk->x0 = int_max(cblkxstart, prc->x0); - cblk->y0 = int_max(cblkystart, prc->y0); - cblk->z0 = int_max(cblkzstart, prc->z0); - cblk->x1 = int_min(cblkxend, prc->x1); - cblk->y1 = int_min(cblkyend, prc->y1); - cblk->z1 = int_min(cblkzend, prc->z1); - } - } - } - } - } - /*tcd_dump(stdout, tcd, tcd->tcd_volume);*/ - -} -void tcd_init_encode(opj_tcd_t *tcd, opj_volume_t * volume, opj_cp_t * cp, - int curtileno) -{ - int compno, resno, bandno, precno, cblkno; - int j, p, q, r; - - opj_tcd_tile_t *tile = NULL; /* pointer to tcd->tile */ - opj_tcd_tilecomp_t *tilec = NULL; /* pointer to tcd->tilec */ - opj_tcd_resolution_t *res = NULL; /* pointer to tcd->res */ - opj_tcd_band_t *band = NULL; /* pointer to tcd->band */ - opj_tcd_precinct_t *prc = NULL; /* pointer to tcd->prc */ - opj_tcd_cblk_t *cblk = NULL; /* pointer to tcd->cblk */ - opj_tcp_t *tcp = &cp->tcps[curtileno]; - - tcd->tile = tcd->tcd_volume->tiles; - tile = tcd->tile; - - /* p61 ISO/IEC IS15444-1 : 2002 */ - /* curtileno --> raster scanned index of tiles */ - /* p,q,r --> matricial index of tiles */ - p = curtileno % cp->tw; - q = curtileno / cp->tw; - r = curtileno / (cp->tw * cp->th); /* extension to 3-D */ - - /* 4 borders of the tile rescale on the volume if necessary (B.3)*/ - tile->x0 = int_max(cp->tx0 + p * cp->tdx, volume->x0); - tile->y0 = int_max(cp->ty0 + q * cp->tdy, volume->y0); - tile->z0 = int_max(cp->tz0 + r * cp->tdz, volume->z0); - tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, volume->x1); - tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, volume->y1); - tile->z1 = int_min(cp->tz0 + (r + 1) * cp->tdz, volume->z1); - tile->numcomps = volume->numcomps; - - /* Modification of the RATE >> */ - for (j = 0; j < tcp->numlayers; j++) { - if (tcp->rates[j] <= 1) { - tcp->rates[j] = 0; - } else { - float num = (float)tile->numcomps * (tile->x1 - tile->x0) * - (tile->y1 - tile->y0) * (tile->z1 - tile->z0) * volume->comps[0].prec; - float den = 8.0f * volume->comps[0].dx * volume->comps[0].dy * - volume->comps[0].dz; - den = tcp->rates[j] * den; - tcp->rates[j] = (num + den - 1) / den; - } - /*tcp->rates[j] = tcp->rates[j] ? int_ceildiv( - tile->numcomps * (tile->x1 - tile->x0) * (tile->y1 - tile->y0) * (tile->z1 - tile->z0) * volume->comps[0].prec, - (tcp->rates[j] * 8 * volume->comps[0].dx * volume->comps[0].dy * volume->comps[0].dz)) : 0;*/ - if (tcp->rates[j]) { - if (j && tcp->rates[j] < tcp->rates[j - 1] + 10) { - tcp->rates[j] = tcp->rates[j - 1] + 20; - } else if (!j && tcp->rates[j] < 30) { - tcp->rates[j] = 30; - } - } - } - /* << Modification of the RATE */ - - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tccp_t *tccp = &tcp->tccps[compno]; - int res_max, i; - int prevnumbands = 0; - - /* opj_tcd_tilecomp_t *tilec=&tile->comps[compno]; */ - tcd->tilec = &tile->comps[compno]; - tilec = tcd->tilec; - - /* border of each tile component (global) (B.3) */ - tilec->x0 = int_ceildiv(tile->x0, volume->comps[compno].dx); - tilec->y0 = int_ceildiv(tile->y0, volume->comps[compno].dy); - tilec->z0 = int_ceildiv(tile->z0, volume->comps[compno].dz); - tilec->x1 = int_ceildiv(tile->x1, volume->comps[compno].dx); - tilec->y1 = int_ceildiv(tile->y1, volume->comps[compno].dy); - tilec->z1 = int_ceildiv(tile->z1, volume->comps[compno].dz); - - tilec->data = (int *) opj_malloc((tilec->x1 - tilec->x0) * - (tilec->y1 - tilec->y0) * (tilec->z1 - tilec->z0) * sizeof(int)); - - res_max = 0; - for (i = 0; i < 3; i++) { - tilec->numresolution[i] = tccp->numresolution[i]; - /*Greater of 3 resolutions contains all information*/ - res_max = (tilec->numresolution[i] > res_max) ? tilec->numresolution[i] : - res_max; - } - - tilec->resolutions = (opj_tcd_resolution_t *) opj_malloc(res_max * sizeof( - opj_tcd_resolution_t)); - for (resno = 0; resno < res_max; resno++) { - int pdx, pdy, pdz; - int tlprcxstart, tlprcystart, tlprczstart, brprcxend, brprcyend, brprczend; - int tlcbgxstart, tlcbgystart, tlcbgzstart, brcbgxend, brcbgyend, brcbgzend; - int cbgwidthexpn, cbgheightexpn, cbglengthexpn; - int cblkwidthexpn, cblkheightexpn, cblklengthexpn; - - int levelnox = tilec->numresolution[0] - 1 - resno; - int levelnoy = tilec->numresolution[1] - 1 - resno; - int diff = tccp->numresolution[0] - tccp->numresolution[2]; - int levelnoz = tilec->numresolution[2] - 1 - ((resno <= diff) ? 0 : - (resno - diff)); - if (levelnoz < 0) { - levelnoz = 0; - } - - tcd->res = &tilec->resolutions[resno]; - res = tcd->res; - - /* border for each resolution level (global) (B.14)*/ - res->x0 = int_ceildivpow2(tilec->x0, levelnox); - res->y0 = int_ceildivpow2(tilec->y0, levelnoy); - res->z0 = int_ceildivpow2(tilec->z0, levelnoz); - res->x1 = int_ceildivpow2(tilec->x1, levelnox); - res->y1 = int_ceildivpow2(tilec->y1, levelnoy); - res->z1 = int_ceildivpow2(tilec->z1, levelnoz); - - /* res->numbands = resno == 0 ? 1 : 3; *//* --> 2D */ - - res->numbands = (resno == 0) ? 1 : (resno <= diff) ? 3 : 7; /* --> 3D */ - - /* p. 30, table A-13, ISO/IEC IS154444-1 : 2002 */ - if (tccp->csty & J3D_CCP_CSTY_PRT) { - pdx = tccp->prctsiz[0][resno]; - pdy = tccp->prctsiz[1][resno]; - pdz = tccp->prctsiz[2][resno]; - } else { - pdx = 15; - pdy = 15; - pdz = 15; - } - /* p. 66, B.16, ISO/IEC IS15444-1 : 2002 */ - tlprcxstart = int_floordivpow2(res->x0, pdx) << pdx; - tlprcystart = int_floordivpow2(res->y0, pdy) << pdy; - tlprczstart = int_floordivpow2(res->z0, pdz) << pdz; - brprcxend = int_ceildivpow2(res->x1, pdx) << pdx; - brprcyend = int_ceildivpow2(res->y1, pdy) << pdy; - brprczend = int_ceildivpow2(res->z1, pdz) << pdz; - - res->prctno[0] = (brprcxend - tlprcxstart) >> pdx; - res->prctno[1] = (brprcyend - tlprcystart) >> pdy; - res->prctno[2] = (brprczend - tlprczstart) >> pdz; - if (res->prctno[2] == 0) { - res->prctno[2] = 1; - } - - /* p. 67, B.17 & B.18, ISO/IEC IS15444-1 : 2002 */ - if (resno == 0) { - tlcbgxstart = tlprcxstart; - tlcbgystart = tlprcystart; - tlcbgzstart = tlprczstart; - brcbgxend = brprcxend; - brcbgyend = brprcyend; - brcbgzend = brprczend; - cbgwidthexpn = pdx; - cbgheightexpn = pdy; - cbglengthexpn = pdz; - } else { - tlcbgxstart = int_ceildivpow2(tlprcxstart, 1); - tlcbgystart = int_ceildivpow2(tlprcystart, 1); - tlcbgzstart = int_ceildivpow2(tlprczstart, 1); - brcbgxend = int_ceildivpow2(brprcxend, 1); - brcbgyend = int_ceildivpow2(brprcyend, 1); - brcbgzend = int_ceildivpow2(brprczend, 1); - cbgwidthexpn = pdx - 1; - cbgheightexpn = pdy - 1; - cbglengthexpn = pdz - 1; - } - - cblkwidthexpn = int_min(tccp->cblk[0], cbgwidthexpn); - cblkheightexpn = int_min(tccp->cblk[1], cbgheightexpn); - cblklengthexpn = int_min(tccp->cblk[2], cbglengthexpn); - - res->bands = (opj_tcd_band_t *) opj_malloc(res->numbands * sizeof( - opj_tcd_band_t)); - for (bandno = 0; bandno < res->numbands; bandno++) { - int x0b, y0b, z0b; - int gain, numbps; - opj_stepsize_t *ss = NULL; - - tcd->band = &res->bands[bandno]; - band = tcd->band; - - band->bandno = resno == 0 ? 0 : bandno + 1; - /* Bandno: 0 - LLL 2 - LHL - 1 - HLL 3 - HHL - 4 - LLH 6 - LHH - 5 - HLH 7 - HHH */ - x0b = (band->bandno == 1) || (band->bandno == 3) || (band->bandno == 5) || - (band->bandno == 7) ? 1 : 0; - y0b = (band->bandno == 2) || (band->bandno == 3) || (band->bandno == 6) || - (band->bandno == 7) ? 1 : 0; - z0b = (band->bandno == 4) || (band->bandno == 5) || (band->bandno == 6) || - (band->bandno == 7) ? 1 : 0; - - /* p. 65, B.15, ISO/IEC IS15444-1 : 2002 */ - if (band->bandno == 0) { - /* band border (global) */ - band->x0 = int_ceildivpow2(tilec->x0, levelnox); - band->y0 = int_ceildivpow2(tilec->y0, levelnoy); - band->z0 = int_ceildivpow2(tilec->z0, levelnoz); - band->x1 = int_ceildivpow2(tilec->x1, levelnox); - band->y1 = int_ceildivpow2(tilec->y1, levelnoy); - band->z1 = int_ceildivpow2(tilec->z1, levelnoz); - } else { - band->x0 = int_ceildivpow2(tilec->x0 - (1 << levelnox) * x0b, levelnox + 1); - band->y0 = int_ceildivpow2(tilec->y0 - (1 << levelnoy) * y0b, levelnoy + 1); - band->z0 = int_ceildivpow2(tilec->z0 - (1 << levelnoz) * z0b, - (resno <= diff) ? levelnoz : levelnoz + 1); - band->x1 = int_ceildivpow2(tilec->x1 - (1 << levelnox) * x0b, levelnox + 1); - band->y1 = int_ceildivpow2(tilec->y1 - (1 << levelnoy) * y0b, levelnoy + 1); - band->z1 = int_ceildivpow2(tilec->z1 - (1 << levelnoz) * z0b, - (resno <= diff) ? levelnoz : levelnoz + 1); - } - - ss = &tccp->stepsizes[(resno == 0) ? 0 : (prevnumbands + bandno + 1)]; - if (bandno == (res->numbands - 1)) { - prevnumbands += (resno == 0) ? 0 : res->numbands; - } - gain = dwt_getgain(band->bandno, tccp->reversible); - numbps = volume->comps[compno].prec + gain; - - band->stepsize = (float)((1.0 + ss->mant / 2048.0) * pow(2.0, - numbps - ss->expn)); - band->numbps = ss->expn + tccp->numgbits - 1; /* WHY -1 ? */ - - for (precno = 0; precno < res->prctno[0] * res->prctno[1] * res->prctno[2]; - precno++) { - int tlcblkxstart, tlcblkystart, tlcblkzstart, brcblkxend, brcblkyend, - brcblkzend; - - int cbgxstart = tlcbgxstart + (precno % res->prctno[0]) * (1 << cbgwidthexpn); - int cbgystart = tlcbgystart + ((precno / (res->prctno[0] * res->prctno[1])) / - res->prctno[0]) * (1 << cbgheightexpn); - int cbgzstart = tlcbgzstart + (precno / (res->prctno[0] * res->prctno[1])) * - (1 << cbglengthexpn); - int cbgxend = cbgxstart + (1 << cbgwidthexpn); - int cbgyend = cbgystart + (1 << cbgheightexpn); - int cbgzend = cbgzstart + (1 << cbglengthexpn); - - /* opj_tcd_precinct_t *prc=&band->precincts[precno]; */ - tcd->prc = &band->precincts[precno]; - prc = tcd->prc; - - /* precinct size (global) */ - prc->x0 = int_max(cbgxstart, band->x0); - prc->y0 = int_max(cbgystart, band->y0); - prc->z0 = int_max(cbgzstart, band->z0); - prc->x1 = int_min(cbgxend, band->x1); - prc->y1 = int_min(cbgyend, band->y1); - prc->z1 = int_min(cbgzend, band->z1); - - tlcblkxstart = int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn; - tlcblkystart = int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn; - tlcblkzstart = int_floordivpow2(prc->z0, cblklengthexpn) << cblklengthexpn; - brcblkxend = int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn; - brcblkyend = int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn; - brcblkzend = int_ceildivpow2(prc->z1, cblklengthexpn) << cblklengthexpn; - prc->cblkno[0] = (brcblkxend - tlcblkxstart) >> cblkwidthexpn; - prc->cblkno[1] = (brcblkyend - tlcblkystart) >> cblkheightexpn; - prc->cblkno[2] = (brcblkzend - tlcblkzstart) >> cblklengthexpn; - prc->cblkno[2] = (prc->cblkno[2] == 0) ? 1 : prc->cblkno[2]; - - opj_free(prc->cblks); - prc->cblks = (opj_tcd_cblk_t *) opj_malloc((prc->cblkno[0] * prc->cblkno[1] * - prc->cblkno[2]) * sizeof(opj_tcd_cblk_t)); - prc->incltree = tgt_create(prc->cblkno[0], prc->cblkno[1], prc->cblkno[2]); - prc->imsbtree = tgt_create(prc->cblkno[0], prc->cblkno[1], prc->cblkno[2]); - - for (cblkno = 0; cblkno < (prc->cblkno[0] * prc->cblkno[1] * prc->cblkno[2]); - cblkno++) { - int cblkxstart = tlcblkxstart + (cblkno % prc->cblkno[0]) * - (1 << cblkwidthexpn); - int cblkystart = tlcblkystart + ((cblkno % (prc->cblkno[0] * prc->cblkno[1])) / - prc->cblkno[0]) * (1 << cblkheightexpn); - int cblkzstart = tlcblkzstart + (cblkno / (prc->cblkno[0] * prc->cblkno[1])) * - (1 << cblklengthexpn); - int cblkxend = cblkxstart + (1 << cblkwidthexpn); - int cblkyend = cblkystart + (1 << cblkheightexpn); - int cblkzend = cblkzstart + (1 << cblklengthexpn); - int prec = ((tilec->bpp > 16) ? 3 : ((tilec->bpp > 8) ? 2 : 1)); - - tcd->cblk = &prc->cblks[cblkno]; - cblk = tcd->cblk; - - /* code-block size (global) */ - cblk->x0 = int_max(cblkxstart, prc->x0); - cblk->y0 = int_max(cblkystart, prc->y0); - cblk->z0 = int_max(cblkzstart, prc->z0); - cblk->x1 = int_min(cblkxend, prc->x1); - cblk->y1 = int_min(cblkyend, prc->y1); - cblk->z1 = int_min(cblkzend, prc->z1); - } - } /* precno */ - } /* bandno */ - } /* resno */ - } /* compno */ - /*tcd_dump(stdout, tcd, tcd->tcd_volume);*/ -} - - -void tcd_free_encode(opj_tcd_t *tcd) -{ - int tileno, compno, resno, bandno, precno; - - opj_tcd_tile_t *tile = NULL; /* pointer to tcd->tile */ - /* opj_tcd_slice_t *slice = NULL; */ /* pointer to tcd->slice */ - opj_tcd_tilecomp_t *tilec = NULL; /* pointer to tcd->tilec */ - opj_tcd_resolution_t *res = NULL; /* pointer to tcd->res */ - opj_tcd_band_t *band = NULL; /* pointer to tcd->band */ - opj_tcd_precinct_t *prc = NULL; /* pointer to tcd->prc */ - - for (tileno = 0; tileno < 1; tileno++) { - tcd->tile = tcd->tcd_volume->tiles; - tile = tcd->tile; - - for (compno = 0; compno < tile->numcomps; compno++) { - tcd->tilec = &tile->comps[compno]; - tilec = tcd->tilec; - - for (resno = 0; resno < tilec->numresolution[0]; resno++) { - tcd->res = &tilec->resolutions[resno]; - res = tcd->res; - - for (bandno = 0; bandno < res->numbands; bandno++) { - tcd->band = &res->bands[bandno]; - band = tcd->band; - - for (precno = 0; precno < res->prctno[0] * res->prctno[1] * res->prctno[2]; - precno++) { - tcd->prc = &band->precincts[precno]; - prc = tcd->prc; - - if (prc->incltree != NULL) { - tgt_destroy(prc->incltree); - prc->incltree = NULL; - } - if (prc->imsbtree != NULL) { - tgt_destroy(prc->imsbtree); - prc->imsbtree = NULL; - } - opj_free(prc->cblks); - prc->cblks = NULL; - } /* for (precno */ - opj_free(band->precincts); - band->precincts = NULL; - } /* for (bandno */ - } /* for (resno */ - opj_free(tilec->resolutions); - tilec->resolutions = NULL; - } /* for (compno */ - opj_free(tile->comps); - tile->comps = NULL; - } /* for (tileno */ - opj_free(tcd->tcd_volume->tiles); - tcd->tcd_volume->tiles = NULL; -} - -/* ----------------------------------------------------------------------- */ -void tcd_malloc_decode(opj_tcd_t *tcd, opj_volume_t * volume, opj_cp_t * cp) -{ - int tileno, compno, resno, bandno, precno, cblkno, res_max, - i, j, p, q, r; - unsigned int x0 = 0, y0 = 0, z0 = 0, - x1 = 0, y1 = 0, z1 = 0, - w, h, l; - - tcd->volume = volume; - tcd->cp = cp; - tcd->tcd_volume->tw = cp->tw; - tcd->tcd_volume->th = cp->th; - tcd->tcd_volume->tl = cp->tl; - tcd->tcd_volume->tiles = (opj_tcd_tile_t *) opj_malloc(cp->tw * cp->th * cp->tl - * sizeof(opj_tcd_tile_t)); - - for (i = 0; i < cp->tileno_size; i++) { - opj_tcp_t *tcp = &(cp->tcps[cp->tileno[i]]); - opj_tcd_tile_t *tile = &(tcd->tcd_volume->tiles[cp->tileno[i]]); - - /* p61 ISO/IEC IS15444-1 : 2002 */ - /* curtileno --> raster scanned index of tiles */ - /* p,q,r --> matricial index of tiles */ - tileno = cp->tileno[i]; - p = tileno % cp->tw; - q = tileno / cp->tw; - r = tileno / (cp->tw * cp->th); /* extension to 3-D */ - - /* 4 borders of the tile rescale on the volume if necessary (B.3)*/ - tile->x0 = int_max(cp->tx0 + p * cp->tdx, volume->x0); - tile->y0 = int_max(cp->ty0 + q * cp->tdy, volume->y0); - tile->z0 = int_max(cp->tz0 + r * cp->tdz, volume->z0); - tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, volume->x1); - tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, volume->y1); - tile->z1 = int_min(cp->tz0 + (r + 1) * cp->tdz, volume->z1); - tile->numcomps = volume->numcomps; - - tile->comps = (opj_tcd_tilecomp_t *) opj_malloc(volume->numcomps * sizeof( - opj_tcd_tilecomp_t)); - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tccp_t *tccp = &tcp->tccps[compno]; - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - int prevnumbands = 0; - - /* border of each tile component (global) */ - tilec->x0 = int_ceildiv(tile->x0, volume->comps[compno].dx); - tilec->y0 = int_ceildiv(tile->y0, volume->comps[compno].dy); - tilec->z0 = int_ceildiv(tile->z0, volume->comps[compno].dz); - tilec->x1 = int_ceildiv(tile->x1, volume->comps[compno].dx); - tilec->y1 = int_ceildiv(tile->y1, volume->comps[compno].dy); - tilec->z1 = int_ceildiv(tile->z1, volume->comps[compno].dz); - - tilec->data = (int *) opj_malloc((tilec->x1 - tilec->x0) * - (tilec->y1 - tilec->y0) * (tilec->z1 - tilec->z0) * sizeof(int)); - - res_max = 0; - for (i = 0; i < 3; i++) { - tilec->numresolution[i] = tccp->numresolution[i]; - /*Greater of 3 resolutions contains all information*/ - res_max = (tilec->numresolution[i] > res_max) ? tilec->numresolution[i] : - res_max; - } - - tilec->resolutions = (opj_tcd_resolution_t *) opj_malloc(res_max * sizeof( - opj_tcd_resolution_t)); - - for (resno = 0; resno < res_max; resno++) { - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - int pdx, pdy, pdz; - int tlprcxstart, tlprcystart, tlprczstart, brprcxend, brprcyend, brprczend; - int tlcbgxstart, tlcbgystart, tlcbgzstart, brcbgxend, brcbgyend, brcbgzend; - int cbgwidthexpn, cbgheightexpn, cbglengthexpn; - int cblkwidthexpn, cblkheightexpn, cblklengthexpn; - int levelnox = tilec->numresolution[0] - 1 - resno; - int levelnoy = tilec->numresolution[1] - 1 - resno; - int diff = tccp->numresolution[0] - tccp->numresolution[2]; - int levelnoz = tilec->numresolution[2] - 1 - ((resno <= diff) ? 0 : - (resno - diff)); - if (levelnoz < 0) { - levelnoz = 0; - } - - /* border for each resolution level (global) */ - res->x0 = int_ceildivpow2(tilec->x0, levelnox); - res->y0 = int_ceildivpow2(tilec->y0, levelnoy); - res->z0 = int_ceildivpow2(tilec->z0, levelnoz); - res->x1 = int_ceildivpow2(tilec->x1, levelnox); - res->y1 = int_ceildivpow2(tilec->y1, levelnoy); - res->z1 = int_ceildivpow2(tilec->z1, levelnoz); - res->numbands = (resno == 0) ? 1 : (resno <= diff) ? 3 : 7; /* --> 3D */ - - /* p. 30, table A-13, ISO/IEC IS154444-1 : 2002 */ - if (tccp->csty & J3D_CCP_CSTY_PRT) { - pdx = tccp->prctsiz[0][resno]; - pdy = tccp->prctsiz[1][resno]; - pdz = tccp->prctsiz[2][resno]; - } else { - pdx = 15; - pdy = 15; - pdz = 15; - } - - /* p. 66, B.16, ISO/IEC IS15444-1 : 2002 */ - tlprcxstart = int_floordivpow2(res->x0, pdx) << pdx; - tlprcystart = int_floordivpow2(res->y0, pdy) << pdy; - tlprczstart = int_floordivpow2(res->z0, pdz) << pdz; - brprcxend = int_ceildivpow2(res->x1, pdx) << pdx; - brprcyend = int_ceildivpow2(res->y1, pdy) << pdy; - brprczend = int_ceildivpow2(res->z1, pdz) << pdz; - - res->prctno[0] = (brprcxend - tlprcxstart) >> pdx; - res->prctno[1] = (brprcyend - tlprcystart) >> pdy; - res->prctno[2] = (brprczend - tlprczstart) >> pdz; - - /* p. 67, B.17 & B.18, ISO/IEC IS15444-1 : 2002 */ - if (resno == 0) { - tlcbgxstart = tlprcxstart;/*0*/ - tlcbgystart = tlprcystart; - tlcbgzstart = tlprczstart; - brcbgxend = brprcxend;/*1*/ - brcbgyend = brprcyend; - brcbgzend = brprczend; - cbgwidthexpn = pdx; /*15*/ - cbgheightexpn = pdy; - cbglengthexpn = pdz; - } else { - tlcbgxstart = int_ceildivpow2(tlprcxstart, 1); - tlcbgystart = int_ceildivpow2(tlprcystart, 1); - tlcbgzstart = int_ceildivpow2(tlprczstart, 1); - brcbgxend = int_ceildivpow2(brprcxend, 1); - brcbgyend = int_ceildivpow2(brprcyend, 1); - brcbgzend = int_ceildivpow2(brprczend, 1); - cbgwidthexpn = pdx - 1; - cbgheightexpn = pdy - 1; - cbglengthexpn = pdz - 1; - } - - cblkwidthexpn = int_min(tccp->cblk[0], cbgwidthexpn); /*6*/ - cblkheightexpn = int_min(tccp->cblk[1], cbgheightexpn); /*6*/ - cblklengthexpn = int_min(tccp->cblk[2], cbglengthexpn); /*6*/ - - res->bands = (opj_tcd_band_t *) opj_malloc(res->numbands * sizeof( - opj_tcd_band_t)); - for (bandno = 0; bandno < res->numbands; bandno++) { - int x0b, y0b, z0b; - int gain, numbps; - opj_stepsize_t *ss = NULL; - - opj_tcd_band_t *band = &res->bands[bandno]; - band->bandno = resno == 0 ? 0 : bandno + 1; - /* Bandno: 0 - LLL 2 - LHL - 1 - HLL 3 - HHL - 4 - LLH 6 - LHH - 5 - HLH 7 - HHH */ - x0b = (band->bandno == 1) || (band->bandno == 3) || (band->bandno == 5) || - (band->bandno == 7) ? 1 : 0; - y0b = (band->bandno == 2) || (band->bandno == 3) || (band->bandno == 6) || - (band->bandno == 7) ? 1 : 0; - z0b = (band->bandno == 4) || (band->bandno == 5) || (band->bandno == 6) || - (band->bandno == 7) ? 1 : 0; - - /* p. 65, B.15, ISO/IEC IS15444-1 : 2002 */ - if (band->bandno == 0) { - /* band border (global) */ - band->x0 = int_ceildivpow2(tilec->x0, levelnox); - band->y0 = int_ceildivpow2(tilec->y0, levelnoy); - band->z0 = int_ceildivpow2(tilec->z0, levelnoz); - band->x1 = int_ceildivpow2(tilec->x1, levelnox); - band->y1 = int_ceildivpow2(tilec->y1, levelnoy); - band->z1 = int_ceildivpow2(tilec->z1, levelnoz); - } else { - band->x0 = int_ceildivpow2(tilec->x0 - (1 << levelnox) * x0b, levelnox + 1); - band->y0 = int_ceildivpow2(tilec->y0 - (1 << levelnoy) * y0b, levelnoy + 1); - band->z0 = int_ceildivpow2(tilec->z0 - (1 << levelnoz) * z0b, - (resno <= diff) ? levelnoz : levelnoz + 1); - band->x1 = int_ceildivpow2(tilec->x1 - (1 << levelnox) * x0b, levelnox + 1); - band->y1 = int_ceildivpow2(tilec->y1 - (1 << levelnoy) * y0b, levelnoy + 1); - band->z1 = int_ceildivpow2(tilec->z1 - (1 << levelnoz) * z0b, - (resno <= diff) ? levelnoz : levelnoz + 1); - } - - ss = &tccp->stepsizes[(resno == 0) ? 0 : (prevnumbands + bandno + 1)]; - if (bandno == (res->numbands - 1)) { - prevnumbands += (resno == 0) ? 0 : res->numbands; - } - gain = dwt_getgain(band->bandno, tccp->reversible); - numbps = volume->comps[compno].prec + gain; - - band->stepsize = (float)((1.0 + ss->mant / 2048.0) * pow(2.0, - numbps - ss->expn)); - band->numbps = ss->expn + tccp->numgbits - 1; /* WHY -1 ? */ - - band->precincts = (opj_tcd_precinct_t *) opj_malloc(res->prctno[0] * - res->prctno[1] * res->prctno[2] * sizeof(opj_tcd_precinct_t)); - - for (precno = 0; precno < res->prctno[0] * res->prctno[1] * res->prctno[2]; - precno++) { - int tlcblkxstart, tlcblkystart, tlcblkzstart, brcblkxend, brcblkyend, - brcblkzend; - - int cbgxstart = tlcbgxstart + (precno % res->prctno[0]) * (1 << cbgwidthexpn); - int cbgystart = tlcbgystart + (precno / res->prctno[0]) * (1 << cbgheightexpn); - int cbgzstart = tlcbgzstart + (precno / (res->prctno[0] * res->prctno[1])) * - (1 << cbglengthexpn); - int cbgxend = cbgxstart + (1 << cbgwidthexpn); - int cbgyend = cbgystart + (1 << cbgheightexpn); - int cbgzend = cbgzstart + (1 << cbglengthexpn); - - opj_tcd_precinct_t *prc = &band->precincts[precno]; - /* precinct size (global) */ - prc->x0 = int_max(cbgxstart, band->x0); - prc->y0 = int_max(cbgystart, band->y0); - prc->z0 = int_max(cbgzstart, band->z0); - prc->x1 = int_min(cbgxend, band->x1); - prc->y1 = int_min(cbgyend, band->y1); - prc->z1 = int_min(cbgzend, band->z1); - - tlcblkxstart = int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn; - tlcblkystart = int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn; - tlcblkzstart = int_floordivpow2(prc->z0, cblklengthexpn) << cblklengthexpn; - brcblkxend = int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn; - brcblkyend = int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn; - brcblkzend = int_ceildivpow2(prc->z1, cblklengthexpn) << cblklengthexpn; - prc->cblkno[0] = (brcblkxend - tlcblkxstart) >> cblkwidthexpn; - prc->cblkno[1] = (brcblkyend - tlcblkystart) >> cblkheightexpn; - prc->cblkno[2] = (brcblkzend - tlcblkzstart) >> cblklengthexpn; - prc->cblkno[2] = (prc->cblkno[2] == 0) ? 1 : prc->cblkno[2]; - - prc->cblks = (opj_tcd_cblk_t *) opj_malloc((prc->cblkno[0] * prc->cblkno[1] * - prc->cblkno[2]) * sizeof(opj_tcd_cblk_t)); - prc->incltree = tgt_create(prc->cblkno[0], prc->cblkno[1], prc->cblkno[2]); - prc->imsbtree = tgt_create(prc->cblkno[0], prc->cblkno[1], prc->cblkno[2]); - - for (cblkno = 0; cblkno < prc->cblkno[0] * prc->cblkno[1] * prc->cblkno[2]; - cblkno++) { - int cblkxstart = tlcblkxstart + (cblkno % prc->cblkno[0]) * - (1 << cblkwidthexpn); - int cblkystart = tlcblkystart + ((cblkno % (prc->cblkno[0] * prc->cblkno[1])) / - prc->cblkno[0]) * (1 << cblkheightexpn); - int cblkzstart = tlcblkzstart + (cblkno / (prc->cblkno[0] * prc->cblkno[1])) * - (1 << cblklengthexpn); - int cblkxend = cblkxstart + (1 << cblkwidthexpn); - int cblkyend = cblkystart + (1 << cblkheightexpn); - int cblkzend = cblkzstart + (1 << cblklengthexpn); - int prec = ((tilec->bpp > 16) ? 3 : ((tilec->bpp > 8) ? 2 : 1)); - /* code-block size (global) */ - opj_tcd_cblk_t *cblk = &prc->cblks[cblkno]; - - /* code-block size (global) */ - cblk->x0 = int_max(cblkxstart, prc->x0); - cblk->y0 = int_max(cblkystart, prc->y0); - cblk->z0 = int_max(cblkzstart, prc->z0); - cblk->x1 = int_min(cblkxend, prc->x1); - cblk->y1 = int_min(cblkyend, prc->y1); - cblk->z1 = int_min(cblkzend, prc->z1); - } - } /* precno */ - } /* bandno */ - } /* resno */ - } /* compno */ - } /* i = 0..cp->tileno_size */ - - /*tcd_dump(stdout, tcd, tcd->tcd_volume);*/ - - /* - Allocate place to store the decoded data = final volume - Place limited by the tile really present in the codestream - */ - - for (i = 0; i < volume->numcomps; i++) { - for (j = 0; j < cp->tileno_size; j++) { - tileno = cp->tileno[j]; - x0 = (j == 0) ? tcd->tcd_volume->tiles[tileno].comps[i].x0 : int_min(x0, - (unsigned int) tcd->tcd_volume->tiles[tileno].comps[i].x0); - y0 = (j == 0) ? tcd->tcd_volume->tiles[tileno].comps[i].y0 : int_min(y0, - (unsigned int) tcd->tcd_volume->tiles[tileno].comps[i].y0); - z0 = (j == 0) ? tcd->tcd_volume->tiles[tileno].comps[i].z0 : int_min(z0, - (unsigned int) tcd->tcd_volume->tiles[tileno].comps[i].z0); - x1 = (j == 0) ? tcd->tcd_volume->tiles[tileno].comps[i].x1 : int_max(x1, - (unsigned int) tcd->tcd_volume->tiles[tileno].comps[i].x1); - y1 = (j == 0) ? tcd->tcd_volume->tiles[tileno].comps[i].y1 : int_max(y1, - (unsigned int) tcd->tcd_volume->tiles[tileno].comps[i].y1); - z1 = (j == 0) ? tcd->tcd_volume->tiles[tileno].comps[i].z1 : int_max(z1, - (unsigned int) tcd->tcd_volume->tiles[tileno].comps[i].z1); - } - - w = x1 - x0; - h = y1 - y0; - l = z1 - z0; - - volume->comps[i].data = (int *) opj_malloc(w * h * l * sizeof(int)); - volume->comps[i].w = w; - volume->comps[i].h = h; - volume->comps[i].l = l; - volume->comps[i].x0 = x0; - volume->comps[i].y0 = y0; - volume->comps[i].z0 = z0; - volume->comps[i].bigendian = cp->bigendian; - } -} - -void tcd_free_decode(opj_tcd_t *tcd) -{ - int tileno, compno, resno, bandno, precno; - - opj_tcd_volume_t *tcd_volume = tcd->tcd_volume; - - for (tileno = 0; tileno < tcd_volume->tw * tcd_volume->th * tcd_volume->tl; - tileno++) { - opj_tcd_tile_t *tile = &tcd_volume->tiles[tileno]; - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - for (resno = 0; resno < tilec->numresolution[0]; resno++) { - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - for (precno = 0; precno < res->prctno[1] * res->prctno[0] * res->prctno[2]; - precno++) { - opj_tcd_precinct_t *prec = &band->precincts[precno]; - if (prec->cblks != NULL) { - opj_free(prec->cblks); - } - if (prec->imsbtree != NULL) { - tgt_destroy(prec->imsbtree); - } - if (prec->incltree != NULL) { - tgt_destroy(prec->incltree); - } - /*for (treeno = 0; treeno < prec->numtrees; treeno++){ - if (prec->imsbtree[treeno] != NULL) tgt_destroy(prec->imsbtree[treeno]); - if (prec->incltree[treeno] != NULL) tgt_destroy(prec->incltree[treeno]); - }*/ - } - if (band->precincts != NULL) { - opj_free(band->precincts); - } - } - } - if (tilec->resolutions != NULL) { - opj_free(tilec->resolutions); - } - } - if (tile->comps != NULL) { - opj_free(tile->comps); - } - } - - if (tcd_volume->tiles != NULL) { - opj_free(tcd_volume->tiles); - } -} - - - -/* ----------------------------------------------------------------------- */ -void tcd_makelayer_fixed(opj_tcd_t *tcd, int layno, int final) -{ - int compno, resno, bandno, precno, cblkno; - int value; /*, matrice[tcd_tcp->numlayers][tcd_tile->comps[0].numresolution[0]][3]; */ - int matrice[10][10][3]; - int i, j, k; - - opj_cp_t *cp = tcd->cp; - opj_tcd_tile_t *tcd_tile = tcd->tcd_tile; - opj_tcp_t *tcd_tcp = tcd->tcp; - - /*matrice=(int*)opj_malloc(tcd_tcp->numlayers*tcd_tile->comps[0].numresolution[0]*3*sizeof(int)); */ - - for (compno = 0; compno < tcd_tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno]; - for (i = 0; i < tcd_tcp->numlayers; i++) { - for (j = 0; j < tilec->numresolution[0]; j++) { - for (k = 0; k < 3; k++) { - matrice[i][j][k] = - (int)(cp->matrice[i * tilec->numresolution[0] * 3 + j * 3 + k] - * (float)(tcd->volume->comps[compno].prec / 16.0)); - } - } - } - - for (resno = 0; resno < tilec->numresolution[0]; resno++) { - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - for (precno = 0; precno < res->prctno[0] * res->prctno[1] * res->prctno[2]; - precno++) { - opj_tcd_precinct_t *prc = &band->precincts[precno]; - for (cblkno = 0; cblkno < prc->cblkno[0] * prc->cblkno[1] * prc->cblkno[2]; - cblkno++) { - opj_tcd_cblk_t *cblk = &prc->cblks[cblkno]; - opj_tcd_layer_t *layer = &cblk->layers[layno]; - int n; - int imsb = tcd->volume->comps[compno].prec - - cblk->numbps; /* number of bit-plan equal to zero */ - /* Correction of the matrix of coefficient to include the IMSB information */ - if (layno == 0) { - value = matrice[layno][resno][bandno]; - if (imsb >= value) { - value = 0; - } else { - value -= imsb; - } - } else { - value = matrice[layno][resno][bandno] - matrice[layno - 1][resno][bandno]; - if (imsb >= matrice[layno - 1][resno][bandno]) { - value -= (imsb - matrice[layno - 1][resno][bandno]); - if (value < 0) { - value = 0; - } - } - } - - if (layno == 0) { - cblk->numpassesinlayers = 0; - } - - n = cblk->numpassesinlayers; - if (cblk->numpassesinlayers == 0) { - if (value != 0) { - n = 3 * value - 2 + cblk->numpassesinlayers; - } else { - n = cblk->numpassesinlayers; - } - } else { - n = 3 * value + cblk->numpassesinlayers; - } - - layer->numpasses = n - cblk->numpassesinlayers; - - if (!layer->numpasses) { - continue; - } - - if (cblk->numpassesinlayers == 0) { - layer->len = cblk->passes[n - 1].rate; - layer->data = cblk->data; - } else { - layer->len = cblk->passes[n - 1].rate - cblk->passes[cblk->numpassesinlayers - - 1].rate; - layer->data = cblk->data + cblk->passes[cblk->numpassesinlayers - 1].rate; - } - if (final) { - cblk->numpassesinlayers = n; - } - } - } - } - } - } -} - -void tcd_rateallocate_fixed(opj_tcd_t *tcd) -{ - int layno; - for (layno = 0; layno < tcd->tcp->numlayers; layno++) { - tcd_makelayer_fixed(tcd, layno, 1); - } -} - -void tcd_makelayer(opj_tcd_t *tcd, int layno, double thresh, int final) -{ - int compno, resno, bandno, precno, cblkno, passno; - - opj_tcd_tile_t *tcd_tile = tcd->tcd_tile; - - tcd_tile->distolayer[layno] = 0; /* fixed_quality */ - - for (compno = 0; compno < tcd_tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno]; - for (resno = 0; resno < tilec->numresolution[0]; resno++) { - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - for (precno = 0; precno < res->prctno[0] * res->prctno[1] * res->prctno[2]; - precno++) { - opj_tcd_precinct_t *prc = &band->precincts[precno]; - for (cblkno = 0; cblkno < prc->cblkno[0] * prc->cblkno[1] * prc->cblkno[2]; - cblkno++) { - opj_tcd_cblk_t *cblk = &prc->cblks[cblkno]; - opj_tcd_layer_t *layer = &cblk->layers[layno]; - - int n; - if (layno == 0) { - cblk->numpassesinlayers = 0; - } - n = cblk->numpassesinlayers; - for (passno = cblk->numpassesinlayers; passno < cblk->totalpasses; passno++) { - int dr; - double dd; - opj_tcd_pass_t *pass = &cblk->passes[passno]; - if (n == 0) { - dr = pass->rate; - dd = pass->distortiondec; - } else { - dr = pass->rate - cblk->passes[n - 1].rate; - dd = pass->distortiondec - cblk->passes[n - 1].distortiondec; - } - if (!dr) { - if (dd) { - n = passno + 1; - } - continue; - } - if (dd / dr >= thresh) { - n = passno + 1; - } - } - layer->numpasses = n - cblk->numpassesinlayers; - - if (!layer->numpasses) { - layer->disto = 0; - continue; - } - if (cblk->numpassesinlayers == 0) { - layer->len = cblk->passes[n - 1].rate; - layer->data = cblk->data; - layer->disto = cblk->passes[n - 1].distortiondec; - } else { - layer->len = cblk->passes[n - 1].rate - cblk->passes[cblk->numpassesinlayers - - 1].rate; - layer->data = cblk->data + cblk->passes[cblk->numpassesinlayers - 1].rate; - layer->disto = cblk->passes[n - 1].distortiondec - - cblk->passes[cblk->numpassesinlayers - 1].distortiondec; - } - - tcd_tile->distolayer[layno] += layer->disto; /* fixed_quality */ - - if (final) { - cblk->numpassesinlayers = n; - } - - /* fprintf(stdout,"MakeLayer : %d %f %d %d \n",layer->len, layer->disto, layer->numpasses, n);*/ - } - } - } - } - } -} - -bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len, - opj_volume_info_t * volume_info) -{ - int compno, resno, bandno, precno, cblkno, passno, layno; - double min, max; - double cumdisto[100]; /* fixed_quality */ - const double K = 1; /* 1.1; // fixed_quality */ - double maxSE = 0; - - opj_cp_t *cp = tcd->cp; - opj_tcd_tile_t *tcd_tile = tcd->tcd_tile; - opj_tcp_t *tcd_tcp = tcd->tcp; - - min = DBL_MAX; - max = 0; - - tcd_tile->nbpix = 0; /* fixed_quality */ - - for (compno = 0; compno < tcd_tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno]; - tilec->nbpix = 0; - for (resno = 0; resno < tilec->numresolution[0]; resno++) { - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - for (precno = 0; precno < res->prctno[0] * res->prctno[1] * res->prctno[2]; - precno++) { - opj_tcd_precinct_t *prc = &band->precincts[precno]; - for (cblkno = 0; cblkno < prc->cblkno[0] * prc->cblkno[1] * prc->cblkno[2]; - cblkno++) { - opj_tcd_cblk_t *cblk = &prc->cblks[cblkno]; - for (passno = 0; passno < cblk->totalpasses; passno++) { - opj_tcd_pass_t *pass = &cblk->passes[passno]; - int dr; - double dd, rdslope; - if (passno == 0) { - dr = pass->rate; - dd = pass->distortiondec; - } else { - dr = pass->rate - cblk->passes[passno - 1].rate; - dd = pass->distortiondec - cblk->passes[passno - 1].distortiondec; - } - if (dr == 0) { - continue; - } - rdslope = dd / dr; - if (rdslope < min) { - min = rdslope; - } - if (rdslope > max) { - max = rdslope; - } - - } /* passno */ - - /* fixed_quality */ - tcd_tile->nbpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0) * - (cblk->z1 - cblk->z0)); - tilec->nbpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0) * - (cblk->z1 - cblk->z0)); - } /* cbklno */ - } /* precno */ - } /* bandno */ - } /* resno */ - - maxSE += (((double)(1 << tcd->volume->comps[compno].prec) - 1.0) - * ((double)(1 << tcd->volume->comps[compno].prec) - 1.0)) - * ((double)(tilec->nbpix)); - } /* compno */ - - /* add antonin index */ - if (volume_info && volume_info->index_on) { - opj_tile_info_t *info_TL = &volume_info->tile[tcd->tcd_tileno]; - info_TL->nbpix = tcd_tile->nbpix; - info_TL->distotile = tcd_tile->distotile; - info_TL->thresh = (double *) opj_malloc(tcd_tcp->numlayers * sizeof(double)); - } - /* dda */ - - for (layno = 0; layno < tcd_tcp->numlayers; layno++) { - double lo = min; - double hi = max; - int success = 0; - int maxlen = tcd_tcp->rates[layno] ? int_min(((int) tcd_tcp->rates[layno]), - len) : len; - double goodthresh; - double distotarget; /* fixed_quality */ - int i = 0; - - /* fixed_quality */ - distotarget = tcd_tile->distotile - ((K * maxSE) / pow((float)10, - tcd_tcp->distoratio[layno] / 10)); - - if ((tcd_tcp->rates[layno]) || (cp->disto_alloc == 0)) { - opj_t2_t *t2 = t2_create(tcd->cinfo, tcd->volume, cp); - int oldl = 0, oldoldl = 0; - for (i = 0; i < 128; i++) { - double thresh = (lo + hi) / 2; - int l = 0; - double distoachieved = 0; /* fixed_quality -q */ - - tcd_makelayer(tcd, layno, thresh, 0); - - if (cp->fixed_quality) { /* fixed_quality -q */ - distoachieved = (layno == 0) ? tcd_tile->distolayer[0] : cumdisto[layno - 1] + - tcd_tile->distolayer[layno]; - if (distoachieved < distotarget) { - hi = thresh; - continue; - } - lo = thresh; - } else { /* disto_alloc -r, fixed_alloc -f */ - l = t2_encode_packets(t2, tcd->tcd_tileno, tcd_tile, layno + 1, dest, maxlen, - volume_info); - /*fprintf(stdout, "layno %d i %d len=%d max=%d \n",layno,i,l,maxlen);*/ - if (l == -999) { - lo = thresh; - continue; - } else if (l == oldl && oldl == oldoldl && tcd_tile->distolayer[layno] > 0.0 && - i > 32) { - break; - } - hi = thresh; - oldoldl = oldl; - oldl = l; - } - success = 1; - goodthresh = thresh; - } - t2_destroy(t2); - } else { - success = 1; - goodthresh = min; - } - if (!success) { - return false; - } - - if (volume_info && volume_info->index_on) { /* Threshold for Marcela Index */ - volume_info->tile[tcd->tcd_tileno].thresh[layno] = goodthresh; - } - tcd_makelayer(tcd, layno, goodthresh, 1); - - /* fixed_quality */ - cumdisto[layno] = (layno == 0) ? tcd_tile->distolayer[0] : cumdisto[layno - 1] + - tcd_tile->distolayer[layno]; - } - - return true; -} - -/* ----------------------------------------------------------------------- */ -int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len, - opj_volume_info_t * volume_info) -{ - int compno; - int l = 0, i, npck = 0; - double encoding_time; - - opj_tcd_tile_t *tile = NULL; - opj_tcp_t *tcd_tcp = NULL; - opj_cp_t *cp = NULL; - - opj_tcp_t *tcp = &tcd->cp->tcps[0]; - opj_tccp_t *tccp = &tcp->tccps[0]; - opj_volume_t *volume = tcd->volume; - opj_t2_t *t2 = NULL; /* T2 component */ - - tcd->tcd_tileno = tileno; /* current encoded/decoded tile */ - - tcd->tcd_tile = tcd->tcd_volume->tiles; /* tile information */ - tile = tcd->tcd_tile; - - tcd->tcp = &tcd->cp->tcps[tileno]; /* coding/decoding params of tileno */ - tcd_tcp = tcd->tcp; - - cp = tcd->cp; /* coding parameters */ - - /* INDEX >> */ - if (volume_info && volume_info->index_on) { - opj_tcd_tilecomp_t *tilec_idx = &tile->comps[0]; /* based on component 0 */ - for (i = 0; i < tilec_idx->numresolution[0]; i++) { - opj_tcd_resolution_t *res_idx = &tilec_idx->resolutions[i]; - - volume_info->tile[tileno].prctno[0][i] = res_idx->prctno[0]; - volume_info->tile[tileno].prctno[1][i] = res_idx->prctno[1]; - volume_info->tile[tileno].prctno[2][i] = res_idx->prctno[2]; - - npck += res_idx->prctno[0] * res_idx->prctno[1] * res_idx->prctno[2]; - - volume_info->tile[tileno].prctsiz[0][i] = tccp->prctsiz[0][i]; - volume_info->tile[tileno].prctsiz[1][i] = tccp->prctsiz[1][i]; - volume_info->tile[tileno].prctsiz[2][i] = tccp->prctsiz[2][i]; - } - volume_info->tile[tileno].packet = (opj_packet_info_t *) opj_malloc( - volume_info->comp * volume_info->layer * npck * sizeof(opj_packet_info_t)); - } - /* << INDEX */ - - /*---------------TILE-------------------*/ - encoding_time = opj_clock(); /* time needed to encode a tile */ - - for (compno = 0; compno < tile->numcomps; compno++) { - int x, y, z; - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - - int adjust; - int offset_x = int_ceildiv(volume->x0, - volume->comps[compno].dx); /*ceil(x0 / subsampling_dx)*/ - int offset_y = int_ceildiv(volume->y0, volume->comps[compno].dy); - int offset_z = int_ceildiv(volume->z0, volume->comps[compno].dz); - - int tw = tilec->x1 - tilec->x0; - int w = int_ceildiv(volume->x1 - volume->x0, volume->comps[compno].dx); - int th = tilec->y1 - tilec->y0; - int h = int_ceildiv(volume->y1 - volume->y0, volume->comps[compno].dy); - int tl = tilec->z1 - tilec->z0; - int l = int_ceildiv(volume->z1 - volume->z0, volume->comps[compno].dz); - - - - /* extract tile data from volume.comps[0].data to tile.comps[0].data */ - /*fprintf(stdout,"[INFO] Extract tile data\n");*/ - if (tcd->cp->transform_format == TRF_3D_RLS || - tcd->cp->transform_format == TRF_3D_LSE) { - adjust = 0; - } else { - adjust = volume->comps[compno].sgnd ? 0 : 1 << (volume->comps[compno].prec - - 1); /*sign=='+' --> 2^(prec-1)*/ - if (volume->comps[compno].dcoffset != 0) { - adjust += volume->comps[compno].dcoffset; - fprintf(stdout, "[INFO] DC Offset applied: DCO = %d -> adjust = %d\n", - volume->comps[compno].dcoffset, adjust); - } - } - - if (tcd_tcp->tccps[compno].reversible == - 1) { /*IF perfect reconstruction (DWT.5-3)*/ - for (z = tilec->z0; z < tilec->z1; z++) { - for (y = tilec->y0; y < tilec->y1; y++) { - /* start of the src tile scanline */ - int *data = &volume->comps[compno].data[(tilec->x0 - offset_x) + - (y - offset_y) * w + (z - offset_z) * w * h]; - /* start of the dst tile scanline */ - int *tile_data = &tilec->data[(y - tilec->y0) * tw + (z - tilec->z0) * tw * th]; - for (x = tilec->x0; x < tilec->x1; x++) { - *tile_data++ = *data++ - adjust; - } - } - } - } else if (tcd_tcp->tccps[compno].reversible == 0) { /*IF not (DWT.9-7)*/ - for (z = tilec->z0; z < tilec->z1; z++) { - for (y = tilec->y0; y < tilec->y1; y++) { - /* start of the src tile scanline */ - int *data = &volume->comps[compno].data[(tilec->x0 - offset_x) + - (y - offset_y) * w + (z - offset_z) * w * h]; - /* start of the dst tile scanline */ - int *tile_data = &tilec->data[(y - tilec->y0) * tw + (z - tilec->z0) * tw * th]; - for (x = tilec->x0; x < tilec->x1; x++) { - *tile_data++ = (*data++ - adjust) << 13; - } - } - } - } - - } - - /*----------------MCT-------------------*/ - if (tcd_tcp->mct) { - int samples = (tile->comps[0].x1 - tile->comps[0].x0) * - (tile->comps[0].y1 - tile->comps[0].y0) * (tile->comps[0].z1 - - tile->comps[0].z0); - fprintf(stdout, "[INFO] Tcd_encode_tile: mct\n"); - if (tcd_tcp->tccps[0].reversible == 0) { - mct_encode_real(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data, - samples); - } else { - mct_encode(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data, - samples); - } - } - /*----------------TRANSFORM---------------------------------*/ - fprintf(stdout, "[INFO] Tcd_encode_tile: Transform\n"); - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - dwt_encode(tilec, tcd_tcp->tccps[compno].dwtid); - } - - /*-------------------ENTROPY CODING-----------------------------*/ - fprintf(stdout, "[INFO] Tcd_encode_tile: Entropy coding\n"); - if ((cp->encoding_format == ENCOD_2EB) || (cp->encoding_format == ENCOD_3EB)) { - if (cp->encoding_format == ENCOD_2EB) { - opj_t1_t *t1 = NULL; - t1 = t1_create(tcd->cinfo); - t1_encode_cblks(t1, tile, tcd_tcp); - t1_destroy(t1); - } else if (cp->encoding_format == ENCOD_3EB) { - opj_t1_3d_t *t1 = NULL; - t1 = t1_3d_create(tcd->cinfo); - t1_3d_encode_cblks(t1, tile, tcd_tcp); - t1_3d_destroy(t1); - } - /*-----------RATE-ALLOCATE------------------*/ - /* INDEX */ - if (volume_info) { - volume_info->index_write = 0; - } - if (cp->disto_alloc || cp->fixed_quality) { - fprintf(stdout, "[INFO] Tcd_encode_tile: Rate-allocate\n"); - tcd_rateallocate(tcd, dest, len, - volume_info); /* Normal Rate/distortion allocation */ - } else {/* fixed_alloc */ - fprintf(stdout, "[INFO] Tcd_encode_tile: Rate-allocate fixed\n"); - tcd_rateallocate_fixed( - tcd); /* Fixed layer allocation */ - } - - /*--------------TIER2------------------*/ - /* INDEX */ - if (volume_info) { - volume_info->index_write = 1; - } - fprintf(stdout, "[INFO] Tcd_encode_tile: Tier - 2\n"); - t2 = t2_create(tcd->cinfo, volume, cp); - l = t2_encode_packets(t2, tileno, tile, tcd_tcp->numlayers, dest, len, - volume_info); - t2_destroy(t2); - } else if ((cp->encoding_format == ENCOD_2GR) || - (cp->encoding_format == ENCOD_3GR)) { - /*if(volume_info) { - volume_info->index_write = 1; - } - gr = golomb_create(tcd->cinfo, volume, cp); - l = golomb_encode(gr, tileno, tile, dest, len, volume_info); - golomb_destroy(gr);*/ - } - - - /*---------------CLEAN-------------------*/ - fprintf(stdout, "[INFO] Tcd_encode_tile: %d bytes coded\n", l); - encoding_time = opj_clock() - encoding_time; - opj_event_msg(tcd->cinfo, EVT_INFO, "- tile encoded in %f s\n", encoding_time); - - /* cleaning memory */ - for (compno = 0; compno < tile->numcomps; compno++) { - tcd->tilec = &tile->comps[compno]; - opj_free(tcd->tilec->data); - } - - if (l == -999) { - fprintf(stdout, "[ERROR] Unable to perform T2 tier. Return -999.\n"); - return 0; - } - - return l; -} - - -bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, int tileno) -{ - int l, i; - int compno, eof = 0; - double tile_time, t1_time, dwt_time; - - opj_tcd_tile_t *tile = NULL; - opj_t2_t *t2 = NULL; /* T2 component */ - - tcd->tcd_tileno = tileno; - tcd->tcd_tile = &(tcd->tcd_volume->tiles[tileno]); - tcd->tcp = &(tcd->cp->tcps[tileno]); - tile = tcd->tcd_tile; - - tile_time = opj_clock(); /* time needed to decode a tile */ - opj_event_msg(tcd->cinfo, EVT_INFO, "tile %d / %d\n", tileno + 1, - tcd->cp->tw * tcd->cp->th * tcd->cp->tl); - - if ((tcd->cp->encoding_format == ENCOD_2EB) || - (tcd->cp->encoding_format == ENCOD_3EB)) { - /*--------------TIER2------------------*/ - t2 = t2_create(tcd->cinfo, tcd->volume, tcd->cp); - l = t2_decode_packets(t2, src, len, tileno, tile); - t2_destroy(t2); - opj_event_msg(tcd->cinfo, EVT_INFO, "Tcd_decode_tile: %d bytes decoded\n", l); - - if (l == -999) { - eof = 1; - opj_event_msg(tcd->cinfo, EVT_ERROR, "Tcd_decode_tile: incomplete bitstream\n"); - } - - /*------------------TIER1-----------------*/ - opj_event_msg(tcd->cinfo, EVT_INFO, "Tcd_decode_tile: Entropy decoding %d \n", - tcd->cp->encoding_format); - t1_time = opj_clock(); /* time needed to decode a tile */ - if (tcd->cp->encoding_format == ENCOD_2EB) { - opj_t1_t *t1 = NULL; /* T1 component */ - t1 = t1_create(tcd->cinfo); - t1_decode_cblks(t1, tile, tcd->tcp); - t1_destroy(t1); - } else if (tcd->cp->encoding_format == ENCOD_3EB) { - opj_t1_3d_t *t1 = NULL; /* T1 component */ - t1 = t1_3d_create(tcd->cinfo); - t1_3d_decode_cblks(t1, tile, tcd->tcp); - t1_3d_destroy(t1); - } - - t1_time = opj_clock() - t1_time; -#ifdef VERBOSE - opj_event_msg(tcd->cinfo, EVT_INFO, "- tier-1 took %f s\n", t1_time); -#endif - } else if ((tcd->cp->encoding_format == ENCOD_2GR) || - (tcd->cp->encoding_format == ENCOD_3GR)) { - opj_event_msg(tcd->cinfo, EVT_INFO, - "Tcd_decode_tile: Entropy decoding -- Does nothing :-D\n"); - /* - gr = golomb_create(tcd->cinfo, tcd->volume, tcd->cp); - l = golomb_decode(gr, tileno, tile, src, len); - golomb_destroy(gr); - if (l == -999) { - eof = 1; - opj_event_msg(tcd->cinfo, EVT_ERROR, "Tcd_decode_tile: incomplete bitstream\n"); - } - */ - } - - /*----------------DWT---------------------*/ - fprintf(stdout, "[INFO] Tcd_decode_tile: Inverse DWT\n"); - dwt_time = opj_clock(); /* time needed to decode a tile */ - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - int stops[3], dwtid[3]; - - for (i = 0; i < 3; i++) { - if (tcd->cp->reduce[i] != 0) { - tcd->volume->comps[compno].resno_decoded[i] = - tile->comps[compno].numresolution[i] - tcd->cp->reduce[i] - 1; - } - stops[i] = tilec->numresolution[i] - 1 - - tcd->volume->comps[compno].resno_decoded[i]; - if (stops[i] < 0) { - stops[i] = 0; - } - dwtid[i] = tcd->cp->tcps->tccps[compno].dwtid[i]; - } - - dwt_decode(tilec, stops, dwtid); - - for (i = 0; i < 3; i++) { - if (tile->comps[compno].numresolution[i] > 0) { - tcd->volume->comps[compno].factor[i] = tile->comps[compno].numresolution[i] - - (tcd->volume->comps[compno].resno_decoded[i] + 1); - if ((tcd->volume->comps[compno].factor[i]) < 0) { - tcd->volume->comps[compno].factor[i] = 0; - } - } - } - } - dwt_time = opj_clock() - dwt_time; -#ifdef VERBOSE - opj_event_msg(tcd->cinfo, EVT_INFO, "- dwt took %f s\n", dwt_time); -#endif - - /*----------------MCT-------------------*/ - - if (tcd->tcp->mct) { - if (tcd->tcp->tccps[0].reversible == 1) { - mct_decode(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data, - (tile->comps[0].x1 - tile->comps[0].x0) * (tile->comps[0].y1 - - tile->comps[0].y0) * (tile->comps[0].z1 - tile->comps[0].z0)); - } else { - mct_decode_real(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data, - (tile->comps[0].x1 - tile->comps[0].x0) * (tile->comps[0].y1 - - tile->comps[0].y0) * (tile->comps[0].z1 - tile->comps[0].z0)); - } - } - - /*---------------TILE-------------------*/ - - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - opj_tcd_resolution_t *res = - &tilec->resolutions[tcd->volume->comps[compno].resno_decoded[0]]; - int adjust; - int minval = tcd->volume->comps[compno].sgnd ? -(1 << - (tcd->volume->comps[compno].prec - 1)) : 0; - int maxval = tcd->volume->comps[compno].sgnd ? (1 << - (tcd->volume->comps[compno].prec - 1)) - 1 : (1 << - tcd->volume->comps[compno].prec) - 1; - - int tw = tilec->x1 - tilec->x0; - int w = tcd->volume->comps[compno].w; - int th = tilec->y1 - tilec->y0; - int h = tcd->volume->comps[compno].h; - - int i, j, k; - int offset_x = int_ceildivpow2(tcd->volume->comps[compno].x0, - tcd->volume->comps[compno].factor[0]); - int offset_y = int_ceildivpow2(tcd->volume->comps[compno].y0, - tcd->volume->comps[compno].factor[1]); - int offset_z = int_ceildivpow2(tcd->volume->comps[compno].z0, - tcd->volume->comps[compno].factor[2]); - - if (tcd->cp->transform_format == TRF_3D_RLS || - tcd->cp->transform_format == TRF_3D_LSE) { - adjust = 0; - } else { - adjust = tcd->volume->comps[compno].sgnd ? 0 : 1 << - (tcd->volume->comps[compno].prec - 1); /*sign=='+' --> 2^(prec-1)*/ - if (tcd->volume->comps[compno].dcoffset != 0) { - adjust += tcd->volume->comps[compno].dcoffset; - fprintf(stdout, "[INFO] DC Offset applied: DCO = %d -> adjust = %d\n", - tcd->volume->comps[compno].dcoffset, adjust); - } - } - - for (k = res->z0; k < res->z1; k++) { - for (j = res->y0; j < res->y1; j++) { - for (i = res->x0; i < res->x1; i++) { - int v; - float tmp = (float)((tilec->data[i - res->x0 + (j - res->y0) * tw + - (k - res->z0) * tw * th]) / 8192.0); - - if (tcd->tcp->tccps[compno].reversible == 1) { - v = tilec->data[i - res->x0 + (j - res->y0) * tw + (k - res->z0) * tw * th]; - } else { - int tmp2 = ((int)(floor(fabs(tmp)))) + ((int) floor(fabs(tmp * 2)) % 2); - v = ((tmp < 0) ? -tmp2 : tmp2); - } - v += adjust; - - tcd->volume->comps[compno].data[(i - offset_x) + (j - offset_y) * w + - (k - offset_z) * w * h] = int_clamp(v, minval, maxval); - } - } - } - } - - tile_time = opj_clock() - tile_time; /* time needed to decode a tile */ - opj_event_msg(tcd->cinfo, EVT_INFO, "- tile decoded in %f s\n", tile_time); - - for (compno = 0; compno < tile->numcomps; compno++) { - opj_free(tcd->tcd_volume->tiles[tileno].comps[compno].data); - tcd->tcd_volume->tiles[tileno].comps[compno].data = NULL; - } - - if (eof) { - return false; - } - - return true; -} - diff --git a/src/lib/openjp3d/tcd.h b/src/lib/openjp3d/tcd.h deleted file mode 100644 index bac5cd06..00000000 --- a/src/lib/openjp3d/tcd.h +++ /dev/null @@ -1,343 +0,0 @@ -/* - * 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, Mónica Díez García, 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 __TCD_H -#define __TCD_H -/** -@file tcd.h -@brief Implementation of a tile coder/decoder (TCD) - -The functions in TCD.C have for goal to encode or decode each tile independently from -each other. The functions in TCD.C are used by some function in JP3D.C. -*/ - -/** @defgroup TCD TCD - Implementation of a tile coder/decoder */ -/*@{*/ - -/** -Tile coder/decoder: segment instance -*/ -typedef struct opj_tcd_seg { - /** Number of passes in the segment */ - int numpasses; - /** Length of information */ - int len; - /** Data */ - unsigned char *data; - /** Number of passes possible for the segment */ - int maxpasses; - /** Number of passes added to the segment */ - int numnewpasses; - /** New length after inclusion of segments */ - int newlen; -} opj_tcd_seg_t; - -/** -Tile coder/decoder: pass instance -*/ -typedef struct opj_tcd_pass { - /** Rate obtained in the pass*/ - int rate; - /** Distorsion obtained in the pass*/ - double distortiondec; - int term; - /** Length of information */ - int len; -} opj_tcd_pass_t; - -/** -Tile coder/decoder: layer instance -*/ -typedef struct opj_tcd_layer { - /** Number of passes in the layer */ - int numpasses; - /** Length of information */ - int len; - /** Distortion within layer */ - double disto; /* add for index (Cfr. Marcela) */ - unsigned char *data; /* data */ -} opj_tcd_layer_t; - -/** -Tile coder/decoder: codeblock instance -*/ -typedef struct opj_tcd_cblk { - /** Dimension of the code-blocks : left upper corner (x0, y0, z0) */ - int x0, y0, z0; - /** Dimension of the code-blocks : right low corner (x1,y1,z1) */ - int x1, y1, z1; - /** Number of bits per simbol in codeblock */ - int numbps; - int numlenbits; - int len; /* length */ - /** Number of pass already done for the code-blocks */ - int numpasses; - /** number of pass added to the code-blocks */ - int numnewpasses; - /** Number of segments */ - int numsegs; - /** Segments information */ - opj_tcd_seg_t segs[100]; - /** Number of passes in the layer */ - int numpassesinlayers; - /** Layer information */ - opj_tcd_layer_t layers[100]; - /** Total number of passes */ - int totalpasses; - /** Information about the passes */ - opj_tcd_pass_t passes[100]; - /* Data */ - unsigned char data[524288]; - /*unsigned char *data;*/ -} opj_tcd_cblk_t; - -/** -Tile coder/decoder: precint instance -*/ -typedef struct opj_tcd_precinct { - /** Dimension of the precint : left upper corner (x0, y0, z0) */ - int x0, y0, z0; - /** Dimension of the precint : right low corner (x1,y1,z1) */ - int x1, y1, z1; - /** Number of codeblocks in precinct in width and height and length*/ - int cblkno[3]; - /** Information about the codeblocks */ - opj_tcd_cblk_t *cblks; - /** Inclusion tree */ - opj_tgt_tree_t *incltree; - /** Missing MSBs tree */ - opj_tgt_tree_t *imsbtree; -} opj_tcd_precinct_t; - -/** -Tile coder/decoder: subband instance -*/ -typedef struct opj_tcd_band { - /** Dimension of the subband : left upper corner (x0, y0, z0) */ - int x0, y0, z0; - /** Dimension of the subband : right low corner (x1,y1,z1) */ - int x1, y1, z1; - /** Information about the precints */ - opj_tcd_precinct_t *precincts; /* precinct information */ - /** Number of bits per symbol in band */ - int numbps; - /** Quantization stepsize associated */ - float stepsize; - /** Band orientation (O->LLL,...,7->HHH) */ - int bandno; -} opj_tcd_band_t; - -/** -Tile coder/decoder: resolution instance -*/ -typedef struct opj_tcd_resolution { - /** Dimension of the resolution level : left upper corner (x0, y0, z0) */ - int x0, y0, z0; - /** Dimension of the resolution level : right low corner (x1,y1,z1) */ - int x1, y1, z1; - /** Number of precints in each dimension for the resolution level */ - int prctno[3]; - /** Number of subbands for the resolution level */ - int numbands; - /** Subband information */ - opj_tcd_band_t *bands; -} opj_tcd_resolution_t; - -/** -Tile coder/decoder: component instance -*/ -typedef struct opj_tcd_tilecomp { - /** Dimension of the component : left upper corner (x0, y0, z0) */ - int x0, y0, z0; - /** Dimension of the component : right low corner (x1,y1,z1) */ - int x1, y1, z1; - /** Number of resolutions level if DWT transform*/ - int numresolution[3]; - /** Resolution information */ - opj_tcd_resolution_t *resolutions; - /** Data of the component */ - int *data; - /** Fixed_quality related */ - int nbpix; - /** Number of bits per voxel in component */ - int bpp; -} opj_tcd_tilecomp_t; - -/** -Tile coder/decoder: tile instance -*/ -typedef struct opj_tcd_tile { - /** Dimension of the tile : left upper corner (x0, y0, z0) */ - int x0, y0, z0; - /** Dimension of the tile : right low corner (x1,y1,z1) */ - int x1, y1, z1; - /** Number of components in tile */ - int numcomps; - /** Components information */ - opj_tcd_tilecomp_t *comps; - /** Fixed_quality related : no of bytes of data*/ - int nbpix; - /** Fixed_quality related : distortion achieved in tile */ - double distotile; - /** Fixed_quality related : distortion achieved in each layer */ - double distolayer[100]; -} opj_tcd_tile_t; - -/** -Tile coder/decoder: volume instance -*/ -typedef struct opj_tcd_volume { - /** Number of tiles in width and height and length */ - int tw, th, tl; - /** Tiles information */ - opj_tcd_tile_t *tiles; -} opj_tcd_volume_t; - -/** -Tile coder/decoder -*/ -typedef struct opj_tcd { - /** Codec context */ - opj_common_ptr cinfo; - /** Volume information */ - opj_volume_t *volume; - /** Coding parameters */ - opj_cp_t *cp; - /** Coding/decoding parameters common to all tiles */ - opj_tcp_t *tcp; - /** Info on each volume tile */ - opj_tcd_volume_t *tcd_volume; - /** Pointer to the current encoded/decoded tile */ - opj_tcd_tile_t *tcd_tile; - /** Current encoded/decoded tile */ - int tcd_tileno; - - /**@name working variables */ - /*@{*/ - opj_tcd_tile_t *tile; - opj_tcd_tilecomp_t *tilec; - opj_tcd_resolution_t *res; - opj_tcd_band_t *band; - opj_tcd_precinct_t *prc; - opj_tcd_cblk_t *cblk; - /*@}*/ -} opj_tcd_t; - -/** @name Funciones generales */ -/*@{*/ -/* ----------------------------------------------------------------------- */ - -/** -Dump the content of a tcd structure -*/ -void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_volume_t *img); -/** -Create a new TCD handle -@param cinfo Codec context info -@return Returns a new TCD handle if successful returns NULL otherwise -*/ -opj_tcd_t* tcd_create(opj_common_ptr cinfo); -/** -Destroy a previously created TCD handle -@param tcd TCD handle to destroy -*/ -void tcd_destroy(opj_tcd_t *tcd); -/** -Initialize the tile coder (allocate the memory) -@param tcd TCD handle -@param volume Raw volume -@param cp Coding parameters -@param curtileno Number that identifies the tile that will be encoded -*/ -void tcd_malloc_encode(opj_tcd_t *tcd, opj_volume_t * volume, opj_cp_t * cp, - int curtileno); -/** -Initialize the tile coder (reuses the memory allocated by tcd_malloc_encode)(for 3D-DWT) -@param tcd TCD handle -@param volume Raw volume -@param cp Coding parameters -@param curtileno Number that identifies the tile that will be encoded -*/ -void tcd_init_encode(opj_tcd_t *tcd, opj_volume_t * volume, opj_cp_t * cp, - int curtileno); -/** -Free the memory allocated for encoding -@param tcd TCD handle -*/ -void tcd_free_encode(opj_tcd_t *tcd); -/** -Initialize the tile decoder -@param tcd TCD handle -@param volume Raw volume -@param cp Coding parameters -*/ -void tcd_malloc_decode(opj_tcd_t *tcd, opj_volume_t * volume, opj_cp_t * cp); - -void tcd_makelayer_fixed(opj_tcd_t *tcd, int layno, int final); -void tcd_rateallocate_fixed(opj_tcd_t *tcd); -void tcd_makelayer(opj_tcd_t *tcd, int layno, double thresh, int final); -bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len, - opj_volume_info_t * volume_info); -/** -Encode a tile from the raw volume into a buffer -@param tcd TCD handle -@param tileno Number that identifies one of the tiles to be encoded -@param dest Destination buffer -@param len Length of destination buffer -@param volume_info Creation of index file -@return -*/ -int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len, - opj_volume_info_t * volume_info); -/** -Decode a tile from a buffer into a raw volume -@param tcd TCD handle -@param src Source buffer -@param len Length of source buffer -@param tileno Number that identifies one of the tiles to be decoded -*/ -bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, int tileno); -/** -Free the memory allocated for decoding -@param tcd TCD handle -*/ -void tcd_free_decode(opj_tcd_t *tcd); - -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __TCD_H */ diff --git a/src/lib/openjp3d/tgt.c b/src/lib/openjp3d/tgt.c deleted file mode 100644 index fc1222d8..00000000 --- a/src/lib/openjp3d/tgt.c +++ /dev/null @@ -1,271 +0,0 @@ -/* - * 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 - * 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_includes.h" - -/* -========================================================== - Tag-tree coder interface -========================================================== -*/ -void tgt_tree_dump(FILE *fd, opj_tgt_tree_t * tree) -{ - int nodesno; - - fprintf(fd, "TGT_TREE {\n"); - fprintf(fd, " numnodes: %d \n", tree->numnodes); - fprintf(fd, " numleafsh: %d, numleafsv: %d, numleafsz: %d,\n", tree->numleafsh, - tree->numleafsv, tree->numleafsz); - - for (nodesno = 0; nodesno < tree->numnodes; nodesno++) { - fprintf(fd, "tgt_node %d {\n", nodesno); - fprintf(fd, " value: %d \n", tree->nodes[nodesno].value); - fprintf(fd, " low: %d \n", tree->nodes[nodesno].low); - fprintf(fd, " known: %d \n", tree->nodes[nodesno].known); - if (tree->nodes[nodesno].parent) { - fprintf(fd, " parent.value: %d \n", tree->nodes[nodesno].parent->value); - fprintf(fd, " parent.low: %d \n", tree->nodes[nodesno].parent->low); - fprintf(fd, " parent.known: %d \n", tree->nodes[nodesno].parent->known); - } - fprintf(fd, "}\n"); - - } - fprintf(fd, "}\n"); - -} - - -opj_tgt_tree_t *tgt_create(int numleafsh, int numleafsv, int numleafsz) -{ - - int nplh[32]; - int nplv[32]; - int nplz[32]; - opj_tgt_node_t *node = NULL; - opj_tgt_node_t *parentnode = NULL; - opj_tgt_node_t *parentnode0 = NULL; - opj_tgt_node_t *parentnode1 = NULL; - opj_tgt_tree_t *tree = NULL; - int i, j, k, p, p0; - int numlvls; - int n, z = 0; - - tree = (opj_tgt_tree_t *) opj_malloc(sizeof(opj_tgt_tree_t)); - if (!tree) { - return NULL; - } - tree->numleafsh = numleafsh; - tree->numleafsv = numleafsv; - tree->numleafsz = numleafsz; - - numlvls = 0; - nplh[0] = numleafsh; - nplv[0] = numleafsv; - nplz[0] = numleafsz; - tree->numnodes = 0; - do { - n = nplh[numlvls] * nplv[numlvls] * nplz[numlvls]; - nplh[numlvls + 1] = (nplh[numlvls] + 1) / 2; - nplv[numlvls + 1] = (nplv[numlvls] + 1) / 2; - nplz[numlvls + 1] = (nplz[numlvls] + 1) / 2; - tree->numnodes += n; - ++numlvls; - } while (n > 1); - - if (tree->numnodes == 0) { - opj_free(tree); - return NULL; - } - - tree->nodes = (opj_tgt_node_t *) opj_malloc(tree->numnodes * sizeof( - opj_tgt_node_t)); - if (!tree->nodes) { - opj_free(tree); - return NULL; - } - - node = tree->nodes; - parentnode = &tree->nodes[tree->numleafsh * tree->numleafsv * tree->numleafsz]; - parentnode0 = parentnode; - parentnode1 = parentnode; - /*fprintf(stdout,"\nH %d V %d Z %d numlvls %d nodes %d\n",tree->numleafsh,tree->numleafsv,tree->numleafsz,numlvls,tree->numnodes);*/ - for (i = 0; i < numlvls - 1; ++i) { - for (z = 0; z < nplz[i]; ++z) { - for (j = 0; j < nplv[i]; ++j) { - k = nplh[i]; - while (--k >= 0) { - node->parent = - parentnode; /*fprintf(stdout,"node[%d].parent = node[%d]\n",n,p);*/ - ++node; - if (--k >= 0) { - node->parent = - parentnode; /*fprintf(stdout,"node[%d].parent = node[%d]\n",n,p);*/ - ++node; - } - ++parentnode; - } - if ((j & 1) || j == nplv[i] - 1) { - parentnode0 = parentnode; - } else { - parentnode = parentnode0; - } - } - if ((z & 1) || z == nplz[i] - 1) { - parentnode1 = parentnode; - } else { - parentnode0 = parentnode1; - parentnode = parentnode1; - } - } - } - node->parent = 0; - - - tgt_reset(tree); - - return tree; -} - -void tgt_destroy(opj_tgt_tree_t *tree) -{ - opj_free(tree->nodes); - opj_free(tree); -} - -void tgt_reset(opj_tgt_tree_t *tree) -{ - int i; - - if (NULL == tree) { - return; - } - - for (i = 0; i < tree->numnodes; i++) { - tree->nodes[i].value = 999; - tree->nodes[i].low = 0; - tree->nodes[i].known = 0; - } -} - -void tgt_setvalue(opj_tgt_tree_t *tree, int leafno, int value) -{ - opj_tgt_node_t *node; - node = &tree->nodes[leafno]; - while (node && node->value > value) { - node->value = value; - node = node->parent; - } -} - -void tgt_encode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, - int threshold) -{ - opj_tgt_node_t *stk[31]; - opj_tgt_node_t **stkptr; - opj_tgt_node_t *node; - int low; - - stkptr = stk; - node = &tree->nodes[leafno]; - while (node->parent) { - *stkptr++ = node; - node = node->parent; - } - - low = 0; - for (;;) { - if (low > node->low) { - node->low = low; - } else { - low = node->low; - } - - while (low < threshold) { - if (low >= node->value) { - if (!node->known) { - bio_write(bio, 1, 1); - node->known = 1; - } - break; - } - bio_write(bio, 0, 1); - ++low; - } - - node->low = low; - if (stkptr == stk) { - break; - } - node = *--stkptr; - } -} - -int tgt_decode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold) -{ - opj_tgt_node_t *stk[31]; - opj_tgt_node_t **stkptr; - opj_tgt_node_t *node; - int low; - - stkptr = stk; - node = &tree->nodes[leafno]; - while (node->parent) { - *stkptr++ = node; - node = node->parent; - } - - low = 0; - for (;;) { - if (low > node->low) { - node->low = low; - } else { - low = node->low; - } - while (low < threshold && low < node->value) { - if (bio_read(bio, 1)) { - node->value = low; - } else { - ++low; - } - } - node->low = low; - if (stkptr == stk) { - break; - } - node = *--stkptr; - } - - return (node->value < threshold) ? 1 : 0; -} diff --git a/src/lib/openjp3d/tgt.h b/src/lib/openjp3d/tgt.h deleted file mode 100644 index ae937191..00000000 --- a/src/lib/openjp3d/tgt.h +++ /dev/null @@ -1,131 +0,0 @@ -/* - * 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 - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __TGT_H -#define __TGT_H -/** -@file tgt.h -@brief Implementation of a tag-tree coder (TGT) - -The functions in TGT.C have for goal to realize a tag-tree coder. The functions in TGT.C -are used by some function in T2.C. -*/ - -/** @defgroup TGT TGT - Implementation of a tag-tree coder */ -/*@{*/ - -/** -Tag node -*/ -typedef struct opj_tgt_node { - /** Node parent reference */ - struct opj_tgt_node *parent; - /** */ - int value; - /** */ - int low; - /** */ - int known; -} opj_tgt_node_t; - -/** -Tag tree -*/ -typedef struct opj_tgt_tree { - /** Number of leaves from horizontal axis */ - int numleafsh; - /** Number of leaves from vertical axis */ - int numleafsv; - /** Number of leaves from axial axis */ - int numleafsz; - /** Number of nodes */ - int numnodes; - /** Reference to each node instance */ - opj_tgt_node_t *nodes; -} opj_tgt_tree_t; - -/** @name Funciones generales */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Create a tag-tree -@param numleafsh Width of the array of leafs of the tree -@param numleafsv Height of the array of leafs of the tree -@param numleafsz Depth of the array of leafs of the tree -@return Returns a new tag-tree if successful, returns NULL otherwise -*/ -opj_tgt_tree_t *tgt_create(int numleafsh, int numleafsv, int numleafsz); -/** -Destroy a tag-tree, liberating memory -@param tree Tag-tree to destroy -*/ -void tgt_destroy(opj_tgt_tree_t *tree); -/** -Reset a tag-tree (set all leaves to 0) -@param tree Tag-tree to reset -*/ -void tgt_reset(opj_tgt_tree_t *tree); -/** -Set the value of a leaf of a tag-tree -@param tree Tag-tree to modify -@param leafno Number that identifies the leaf to modify -@param value New value of the leaf -*/ -void tgt_setvalue(opj_tgt_tree_t *tree, int leafno, int value); -/** -Encode the value of a leaf of the tag-tree up to a given threshold -@param bio Pointer to a BIO handle -@param tree Tag-tree to modify -@param leafno Number that identifies the leaf to encode -@param threshold Threshold to use when encoding value of the leaf -*/ -void tgt_encode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, - int threshold); -/** -Decode the value of a leaf of the tag-tree up to a given threshold -@param bio Pointer to a BIO handle -@param tree Tag-tree to decode -@param leafno Number that identifies the leaf to decode -@param threshold Threshold to use when decoding value of the leaf -@return Returns 1 if the node's value < threshold, returns 0 otherwise -*/ -int tgt_decode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold); - -/*@}*/ -/* ----------------------------------------------------------------------- */ -void tgt_tree_dump(FILE *fd, opj_tgt_tree_t * tree); -/*@}*/ - -#endif /* __TGT_H */ diff --git a/src/lib/openjp3d/volume.c b/src/lib/openjp3d/volume.c deleted file mode 100644 index 7cd327ec..00000000 --- a/src/lib/openjp3d/volume.c +++ /dev/null @@ -1,101 +0,0 @@ -/* - * 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) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include "opj_includes.h" -#include "volume.h" -#include "openjp3d.h" - -opj_volume_t* OPJ_CALLCONV opj_volume_create(int numcmpts, - opj_volume_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc) -{ - int compno; - opj_volume_t *volume = NULL; - - volume = (opj_volume_t*)opj_malloc(sizeof(opj_volume_t)); - if (volume) { - volume->color_space = clrspc; - volume->numcomps = numcmpts; - /* allocate memory for the per-component information */ - volume->comps = (opj_volume_comp_t*)opj_malloc(volume->numcomps * sizeof( - opj_volume_comp_t)); - if (!volume->comps) { - opj_volume_destroy(volume); - return NULL; - } - /* create the individual volume components */ - for (compno = 0; compno < numcmpts; compno++) { - opj_volume_comp_t *comp = &volume->comps[compno]; - comp->dx = cmptparms[compno].dx; - comp->dy = cmptparms[compno].dy; - comp->dz = cmptparms[compno].dz; - comp->w = cmptparms[compno].w; - comp->h = cmptparms[compno].h; - comp->l = cmptparms[compno].l; - comp->x0 = cmptparms[compno].x0; - comp->y0 = cmptparms[compno].y0; - comp->z0 = cmptparms[compno].z0; - comp->prec = cmptparms[compno].prec; - comp->bpp = cmptparms[compno].bpp; - comp->sgnd = cmptparms[compno].sgnd; - comp->bigendian = cmptparms[compno].bigendian; - comp->dcoffset = cmptparms[compno].dcoffset; - comp->data = (int*)opj_malloc(comp->w * comp->h * comp->l * sizeof(int)); - if (!comp->data) { - fprintf(stdout, "Unable to malloc comp->data (%d x %d x %d x bytes)", comp->w, - comp->h, comp->l); - opj_volume_destroy(volume); - return NULL; - } - /*fprintf(stdout,"%d %d %d %d %d %d %d %d %d", comp->w,comp->h, comp->l, comp->dx, comp->dy, comp->dz, comp->prec, comp->bpp, comp->sgnd);*/ - } - } - - return volume; -} - -void OPJ_CALLCONV opj_volume_destroy(opj_volume_t *volume) -{ - int i; - if (volume) { - if (volume->comps) { - /* volume components */ - for (i = 0; i < volume->numcomps; i++) { - opj_volume_comp_t *volume_comp = &volume->comps[i]; - if (volume_comp->data) { - opj_free(volume_comp->data); - } - } - opj_free(volume->comps); - } - opj_free(volume); - } -} - diff --git a/src/lib/openjp3d/volume.h b/src/lib/openjp3d/volume.h deleted file mode 100644 index ae7fdc22..00000000 --- a/src/lib/openjp3d/volume.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * 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) 2005, Herve Drolon, FreeImage Team - * Copyright (c) 2006, Mónica Díez García, 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 __VOLUME_H -#define __VOLUME_H -/** -@file volume.h -@brief Implementation of operations on volumes (VOLUME) - -The functions in VOLUME.C have for goal to realize operations on volumes. -*/ - -/** @defgroup VOLUME VOLUME - Implementation of operations on volumes */ -/*@{*/ - - -/*@}*/ - -#endif /* __VOLUME_H */ - diff --git a/src/lib/openjpwl/CMakeLists.txt b/src/lib/openjpwl/CMakeLists.txt deleted file mode 100644 index 1b33adbe..00000000 --- a/src/lib/openjpwl/CMakeLists.txt +++ /dev/null @@ -1,64 +0,0 @@ -# Makefile for the main JPWL OpenJPEG codecs: JPWL_ j2k_to_image and JPWL_image_to_j2k - -add_definitions(-DUSE_JPWL) - -set(OPENJPEG_SRCS - ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/bio.c - ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/cio.c - ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/dwt.c - ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/event.c - ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/image.c - ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/j2k.c - ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/jp2.c - ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/jpt.c - ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/mct.c - ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/mqc.c - ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/openjpeg.c - ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/j2k_lib.c - ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/pi.c - ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/raw.c - ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/t1.c - ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/t2.c - ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/tcd.c - ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/tgt.c -) - -set(JPWL_SRCS crc.c jpwl.c jpwl_lib.c rs.c) -if(APPLE) - set_source_files_properties( - rs.c - PROPERTIES - COMPILE_FLAGS -fno-common) -endif() - -include_directories( - ${OPENJPEG_BINARY_DIR}/src/lib/openjp2 # opj_config.h - ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2 - ${OPENJPEG_SOURCE_DIR}/src/lib/openjpwl - ) - -# Build the library -if(WIN32) - if(BUILD_SHARED_LIBS) - add_definitions(-DOPJ_EXPORTS) - else() - add_definitions(-DOPJ_STATIC) - endif() -endif() -add_library(openjpwl ${JPWL_SRCS} ${OPENJPEG_SRCS}) -if(UNIX) - target_link_libraries(openjpwl m) -endif() -set_target_properties(openjpwl - PROPERTIES ${OPENJPEG_LIBRARY_PROPERTIES}) -if(NOT ${CMAKE_VERSION} VERSION_LESS "2.8.12") - target_compile_options(openjpwl PRIVATE ${OPENJPEG_LIBRARY_COMPILE_OPTIONS}) -endif() - -# Install library -install(TARGETS openjpwl - EXPORT OpenJPEGTargets - RUNTIME DESTINATION ${OPENJPEG_INSTALL_BIN_DIR} COMPONENT Applications - LIBRARY DESTINATION ${OPENJPEG_INSTALL_LIB_DIR} COMPONENT Libraries - ARCHIVE DESTINATION ${OPENJPEG_INSTALL_LIB_DIR} COMPONENT Libraries -) diff --git a/src/lib/openjpwl/README.txt b/src/lib/openjpwl/README.txt deleted file mode 100644 index e289e9e4..00000000 --- a/src/lib/openjpwl/README.txt +++ /dev/null @@ -1,136 +0,0 @@ -=============================================================================== - JPEG2000 Part 11 (ISO/IEC 15444-11 JPWL) Software - - - - Version 20061213 -=============================================================================== - - - - - -1. Scope -============= - -This document describes the installation and use of the JPWL module in the framework of OpenJPEG library. - -This implementation has been developed from OpenJPEG implementation of JPEG2000 standard, and for this reason it is written in C language. - -If you find some bugs or if you have problems using the encoder/decoder, please send an e-mail to jpwl@diei.unipg.it - - -2. Installing the code -========================== - -The JPWL code is integrated with the standard OpenJPEG library and codecs: it is activated by setting the macro USE_JPWL to defined in the preprocessor configuration options of your preferred C compiler. - -2.1. Compiling the source code in Windows -------------------------------------------- - -The "jpwl" directory is already populated with a couple of Visual C++ 6.0 workspaces - - * JPWL_image_to_j2k.dsw - Creates the encoder with JPWL functionalities - * JPWL_j2k_to_image.dsw - Creates the decoder with JPWL functionalities - -2.2. Compiling the source code in Unix-like systems ------------------------------------------------------ - -Under linux, enter the jpwl directory and type "make clean" and "make". - - -3. Running the JPWL software -========================= - -The options available at the command line are exactly the same of the base OpenJPEG codecs. In addition, there is a "-W" switch that activates JPWL functionalities. - -3.1. JPWL Encoder -------------------- - --W : adoption of JPWL (Part 11) capabilities (-W params) - The parameters can be written and repeated in any order: - [h<=type>,s<=method>,a=,z=,g=,... - ...,p<=type>] - - h selects the header error protection (EPB): 'type' can be - [0=none 1,absent=predefined 16=CRC-16 32=CRC-32 37-128=RS] - if 'tile' is absent, it applies to main and tile headers - if 'tile' is present, it applies from that tile - onwards, up to the next h spec, or to the last tile - in the codestream (max. 16 specs) - - p selects the packet error protection (EEP/UEP with EPBs) - to be applied to raw data: 'type' can be - [0=none 1,absent=predefined 16=CRC-16 32=CRC-32 37-128=RS] - if 'tile:pack' is absent, it starts from tile 0, packet 0 - if 'tile:pack' 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 tile in the codestream - (max. 16 specs) - - s enables sensitivity data insertion (ESD): 'method' 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 'tile' is absent, it applies to main header only - if 'tile' is present, it applies from that tile - onwards, up to the next s spec, or to the last tile - in the codestream (max. 16 specs) - - g determines the addressing mode: can be - [0=PACKET 1=BYTE RANGE 2=PACKET RANGE] - - a determines the size of data addressing: can be - 2/4 bytes (small/large codestreams). If not set, auto-mode - - z determines the size of sensitivity values: can be - 1/2 bytes, for the transformed pseudo-floating point value - - ex.: - h,h0=64,h3=16,h5=32,p0=78,p0:24=56,p1,p3:0=0,p3:20=32,s=0,s0=6,s3=-1,a=0,g=1,z=1 - means - predefined EPB in MH, rs(64,32) from TPH 0 to TPH 2, - CRC-16 in TPH 3 and TPH 4, CRC-32 in remaining TPHs, - UEP rs(78,32) for packets 0 to 23 of tile 0, - UEP rs(56,32) for packets 24 to the last of tile 0, - UEP rs default for packets of tile 1, - no UEP for packets 0 to 19 of tile 3, - UEP CRC-32 for packets 20 of tile 3 to last tile, - relative sensitivity ESD for MH, - TSE ESD from TPH 0 to TPH 2, byte range with automatic - size of addresses and 1 byte for each sensitivity value - - ex.: - h,s,p - means - default protection to headers (MH and TPHs) as well as - data packets, one ESD in MH - - N.B.: use the following recommendations when specifying - the JPWL parameters list - - when you use UEP, always pair the 'p' option with 'h' - -3.2. JPWL Decoder -------------------- - - -W - Activates the JPWL correction capability, if the codestream complies. - Options can be a comma separated list of tokens: - c, c=numcomps - numcomps is the number of expected components in the codestream - (search of first EPB rely upon this, default is 3) - - -4. Known bugs and limitations -=============================== - -4.1. Bugs ------------ - -* It is not possible to save a JPWL encoded codestream using the wrapped file format (i.e. JP2): only raw file format (i.e. J2K) is working - -4.2. Limitations ------------------- - -* When specifying an UEP protection, you need to activate even TPH protection for those tiles where there is a protection of the packets -* RED insertion is not currently implemented at the decoder -* JPWL at entropy coding level is not implemented diff --git a/src/lib/openjpwl/crc.c b/src/lib/openjpwl/crc.c deleted file mode 100644 index 96924a30..00000000 --- a/src/lib/openjpwl/crc.c +++ /dev/null @@ -1,167 +0,0 @@ -/* - * 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) 2005-2006, Dept. of Electronic and Information Engineering, Universita' degli Studi di Perugia, Italy - * 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. - */ - -#ifdef USE_JPWL - -#include "crc.h" - -/** -@file crc.c -@brief Functions used to compute the 16- and 32-bit CRC of byte arrays - -*/ - -/** file: CRC16.CPP - * - * CRC - Cyclic Redundancy Check (16-bit) - * - * A CRC-checksum is used to be sure, the data hasn't changed or is false. - * To create a CRC-checksum, initialise a check-variable (unsigned short), - * and set this to zero. Than call for every byte in the file (e.g.) the - * procedure updateCRC16 with this check-variable as the first parameter, - * and the byte as the second. At the end, the check-variable contains the - * CRC-checksum. - * - * implemented by Michael Neumann, 14.06.1998 - * - */ -const unsigned short CRC16_table[256] = { - 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, - 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, - 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, - 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, - 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, - 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, - 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, - 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, - 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, - 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, - 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, - 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, - 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, - 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, - 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, - 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, - 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, - 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, - 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, - 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, - 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, - 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, - 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, - 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, - 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, - 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, - 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, - 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, - 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, - 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, - 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, - 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 -}; - -void updateCRC16(unsigned short *crc, unsigned char data) -{ - *crc = CRC16_table[(*crc >> 8) & 0xFF] ^ (*crc << 8) ^ data; -} - - -/** file: CRC32.CPP - * - * CRC - Cyclic Redundancy Check (32-bit) - * - * A CRC-checksum is used to be sure, the data hasn't changed or is false. - * To create a CRC-checksum, initialise a check-variable (unsigned long), - * and set this to zero. Than call for every byte in the file (e.g.) the - * procedure updateCRC32 with this check-variable as the first parameter, - * and the byte as the second. At the end, the check-variable contains the - * CRC-checksum. - * - * implemented by Michael Neumann, 14.06.1998 - * - */ -const unsigned long CRC32_table[256] = { - 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, - 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, - 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, - 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, - 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, - 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, - 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, - 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, - 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, - 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, - 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, - 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, - 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, - 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, - 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, - 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, - 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, - 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, - 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, - 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, - 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, - 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, - 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, - 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, - 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, - 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, - 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, - 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, - 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, - 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, - 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, - 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, - 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, - 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, - 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, - 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, - 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, - 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, - 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, - 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, - 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, - 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, - 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d -}; - -void updateCRC32(unsigned long *crc, unsigned char data) -{ - *crc = CRC32_table[(unsigned char) * crc ^ data] ^ ((*crc >> 8) & 0x00FFFFFF); -} - -#endif /* USE_JPWL */ diff --git a/src/lib/openjpwl/crc.h b/src/lib/openjpwl/crc.h deleted file mode 100644 index ea399822..00000000 --- a/src/lib/openjpwl/crc.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * 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) 2005-2006, Dept. of Electronic and Information Engineering, Universita' degli Studi di Perugia, Italy - * 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. - */ - -#ifdef USE_JPWL - -/** -@file crc.h -@brief Functions used to compute the 16- and 32-bit CRC of byte arrays - -*/ - -#ifndef __CRC16_HEADER__ -#define __CRC16_HEADER__ - -/** file: CRC16.HPP - * - * CRC - Cyclic Redundancy Check (16-bit) - * - * A CRC-checksum is used to be sure, the data hasn't changed or is false. - * To create a CRC-checksum, initialise a check-variable (unsigned short), - * and set this to zero. Than call for every byte in the file (e.g.) the - * procedure updateCRC16 with this check-variable as the first parameter, - * and the byte as the second. At the end, the check-variable contains the - * CRC-checksum. - * - * implemented by Michael Neumann, 14.06.1998 - * - */ -void updateCRC16(unsigned short *, unsigned char); - -#endif /* __CRC16_HEADER__ */ - - -#ifndef __CRC32_HEADER__ -#define __CRC32_HEADER__ - -/** file: CRC32.HPP - * - * CRC - Cyclic Redundancy Check (32-bit) - * - * A CRC-checksum is used to be sure, the data hasn't changed or is false. - * To create a CRC-checksum, initialise a check-variable (unsigned short), - * and set this to zero. Than call for every byte in the file (e.g.) the - * procedure updateCRC32 with this check-variable as the first parameter, - * and the byte as the second. At the end, the check-variable contains the - * CRC-checksum. - * - * implemented by Michael Neumann, 14.06.1998 - * - */ -void updateCRC32(unsigned long *, unsigned char); - -#endif /* __CRC32_HEADER__ */ - - -#endif /* USE_JPWL */ diff --git a/src/lib/openjpwl/jpwl.c b/src/lib/openjpwl/jpwl.c deleted file mode 100644 index 3cd74ad7..00000000 --- a/src/lib/openjpwl/jpwl.c +++ /dev/null @@ -1,1458 +0,0 @@ -/* - * 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) 2005-2006, Dept. of Electronic and Information Engineering, Universita' degli Studi di Perugia, Italy - * 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_includes.h" - -#ifdef USE_JPWL - -/** @defgroup JPWL JPWL - JPEG-2000 Part11 (JPWL) codestream manager */ -/*@{*/ - -/** @name Local static variables */ -/*@{*/ - -/** number of JPWL prepared markers */ -static int jwmarker_num; -/** properties of JPWL markers to insert */ -static jpwl_marker_t jwmarker[JPWL_MAX_NO_MARKERS]; - -/*@}*/ - -/*@}*/ - -/** @name Local static functions */ -/*@{*/ - -/** create an EPC marker segment -@param j2k J2K compressor handle -@param esd_on true if ESD is activated -@param red_on true if RED is activated -@param epb_on true if EPB is activated -@param info_on true if informative techniques are activated -@return returns the freshly created EPC -*/ -jpwl_epc_ms_t *jpwl_epc_create(opj_j2k_t *j2k, opj_bool esd_on, opj_bool red_on, - opj_bool epb_on, opj_bool info_on); - -/*@}*/ - -/** create an EPC marker segment -@param j2k J2K compressor handle -@param comps considered component (-1=average, 0/1/2/...=component no.) -@param addrm addressing mode (0=packet, 1=byte range, 2=packet range, 3=reserved) -@param ad_size size of addresses (2/4 bytes) -@param senst sensitivity type -@param se_size sensitivity values size (1/2 bytes) -@param tileno tile where this ESD lies (-1 means MH) -@param svalnum number of sensitivity values (if 0, they will be automatically filled) -@param sensval pointer to an array of sensitivity values (if NULL, they will be automatically filled) -@return returns the freshly created ESD -*/ -jpwl_esd_ms_t *jpwl_esd_create(opj_j2k_t *j2k, int comps, - unsigned char addrm, unsigned char ad_size, - unsigned char senst, int se_size, int tileno, - unsigned long int svalnum, void *sensval); - -/** this function is used to compare two JPWL markers based on -their relevant wishlist position -@param arg1 pointer to first marker -@param arg2 pointer to second marker -@return 1 if arg1>arg2, 0 if arg1=arg2, -1 if arg1pos_correction = 0; - -} - -opj_bool j2k_add_marker(opj_codestream_info_t *cstr_info, - unsigned short int type, int pos, int len) -{ - - if (!cstr_info) { - return OPJ_FALSE; - } - - /* expand the list? */ - if ((cstr_info->marknum + 1) > cstr_info->maxmarknum) { - opj_marker_info_t* new_marker; - cstr_info->maxmarknum += 100; - new_marker = (opj_marker_info_t*)opj_realloc(cstr_info->marker, - cstr_info->maxmarknum * sizeof(opj_marker_info_t)); - if (! new_marker) { - opj_free(cstr_info->marker); - cstr_info->marker = 0; - cstr_info->marknum = 0; - cstr_info->maxmarknum = 0; - /* opj_event_msg_v2(p_manager, EVT_ERROR, "Not enough memory to add a marker\n"); */ - /* TODO_test_add_marker_result;*/ - return OPJ_FALSE; - } - cstr_info->marker = new_marker; - } - - /* add the marker */ - cstr_info->marker[cstr_info->marknum].type = type; - cstr_info->marker[cstr_info->marknum].pos = pos; - cstr_info->marker[cstr_info->marknum].len = len; - cstr_info->marknum++; - return OPJ_TRUE; - -} - -void jpwl_prepare_marks(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image) -{ - - unsigned short int socsiz_len = 0; - int ciopos = cio_tell(cio), soc_pos = j2k->cstr_info->main_head_start; - unsigned char *socp = NULL; - - int tileno, acc_tpno, tpno, tilespec, hprot, sens, pprot, packspec, lastileno, - packno; - - jpwl_epb_ms_t *epb_mark; - jpwl_epc_ms_t *epc_mark; - jpwl_esd_ms_t *esd_mark; - (void)image; - - /* find (SOC + SIZ) length */ - /* I assume SIZ is always the first marker after SOC */ - cio_seek(cio, soc_pos + 4); - socsiz_len = (unsigned short int) cio_read(cio, - 2) + 4; /* add the 2 marks length itself */ - cio_seek(cio, soc_pos + 0); - socp = cio_getbp(cio); /* pointer to SOC */ - - /* - EPC MS for Main Header: if we are here it's required - */ - /* create the EPC */ - if ((epc_mark = jpwl_epc_create( - j2k, - j2k->cp->esd_on, /* is ESD present? */ - j2k->cp->red_on, /* is RED present? */ - j2k->cp->epb_on, /* is EPB present? */ - OPJ_FALSE /* are informative techniques present? */ - ))) { - - /* Add this marker to the 'insertanda' list */ - if (epc_mark) { - jwmarker[jwmarker_num].id = J2K_MS_EPC; /* its type */ - jwmarker[jwmarker_num].m.epcmark = epc_mark; /* the EPC */ - jwmarker[jwmarker_num].pos = soc_pos + socsiz_len; /* after SIZ */ - jwmarker[jwmarker_num].dpos = (double) jwmarker[jwmarker_num].pos + - 0.1; /* not so first */ - jwmarker[jwmarker_num].len = epc_mark->Lepc; /* its length */ - jwmarker[jwmarker_num].len_ready = OPJ_TRUE; /* ready */ - jwmarker[jwmarker_num].pos_ready = OPJ_TRUE; /* ready */ - jwmarker[jwmarker_num].parms_ready = OPJ_FALSE; /* not ready */ - jwmarker[jwmarker_num].data_ready = OPJ_TRUE; /* ready */ - jwmarker_num++; - }; - - opj_event_msg(j2k->cinfo, EVT_INFO, - "MH EPC : setting %s%s%s\n", - j2k->cp->esd_on ? "ESD, " : "", - j2k->cp->red_on ? "RED, " : "", - j2k->cp->epb_on ? "EPB, " : "" - ); - - } else { - /* ooops, problems */ - opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not create MH EPC\n"); - }; - - /* - ESD MS for Main Header - */ - /* first of all, must MH have an ESD MS? */ - if (j2k->cp->esd_on && (j2k->cp->sens_MH >= 0)) { - - /* Create the ESD */ - if ((esd_mark = jpwl_esd_create( - j2k, /* this encoder handle */ - -1, /* we are averaging over all components */ - (unsigned char) j2k->cp->sens_range, /* range method */ - (unsigned char) j2k->cp->sens_addr, /* sensitivity addressing */ - (unsigned char) j2k->cp->sens_MH, /* sensitivity method */ - j2k->cp->sens_size, /* sensitivity size */ - -1, /* this ESD is in main header */ - 0 /*j2k->cstr_info->num*/, /* number of packets in codestream */ - NULL /*sensval*/ /* pointer to sensitivity data of packets */ - ))) { - - /* Add this marker to the 'insertanda' list */ - if (jwmarker_num < JPWL_MAX_NO_MARKERS) { - jwmarker[jwmarker_num].id = J2K_MS_ESD; /* its type */ - jwmarker[jwmarker_num].m.esdmark = esd_mark; /* the EPB */ - jwmarker[jwmarker_num].pos = soc_pos + - socsiz_len; /* we choose to place it after SIZ */ - jwmarker[jwmarker_num].dpos = (double) jwmarker[jwmarker_num].pos + - 0.2; /* not first at all! */ - jwmarker[jwmarker_num].len = esd_mark->Lesd; /* its length */ - jwmarker[jwmarker_num].len_ready = OPJ_TRUE; /* not ready, yet */ - jwmarker[jwmarker_num].pos_ready = OPJ_TRUE; /* ready */ - jwmarker[jwmarker_num].parms_ready = OPJ_TRUE; /* not ready */ - jwmarker[jwmarker_num].data_ready = OPJ_FALSE; /* not ready */ - jwmarker_num++; - } - - opj_event_msg(j2k->cinfo, EVT_INFO, - "MH ESDs: method %d\n", - j2k->cp->sens_MH - ); - - } else { - /* ooops, problems */ - opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not create MH ESD\n"); - }; - - } - - /* - ESD MSs for Tile Part Headers - */ - /* cycle through tiles */ - sens = -1; /* default spec: no ESD */ - tilespec = 0; /* first tile spec */ - acc_tpno = 0; - for (tileno = 0; tileno < j2k->cstr_info->tw * j2k->cstr_info->th; tileno++) { - - opj_event_msg(j2k->cinfo, EVT_INFO, - "Tile %d has %d tile part(s)\n", - tileno, j2k->cstr_info->tile[tileno].num_tps - ); - - /* for every tile part in the tile */ - for (tpno = 0; tpno < j2k->cstr_info->tile[tileno].num_tps; - tpno++, acc_tpno++) { - - int sot_len, Psot, Psotp, mm; - unsigned long sot_pos, post_sod_pos; - - unsigned long int left_THmarks_len; - - /******* sot_pos = j2k->cstr_info->tile[tileno].start_pos; */ - sot_pos = j2k->cstr_info->tile[tileno].tp[tpno].tp_start_pos; - cio_seek(cio, sot_pos + 2); - sot_len = cio_read(cio, 2); /* SOT Len */ - cio_skip(cio, 2); - Psotp = cio_tell(cio); - Psot = cio_read(cio, 4); /* tile length */ - - /******* post_sod_pos = j2k->cstr_info->tile[tileno].end_header + 1; */ - post_sod_pos = j2k->cstr_info->tile[tileno].tp[tpno].tp_end_header + 1; - left_THmarks_len = post_sod_pos - sot_pos; - - /* add all the lengths of the markers which are len-ready and stay within SOT and SOD */ - for (mm = 0; mm < jwmarker_num; mm++) { - if ((jwmarker[mm].pos >= sot_pos) && (jwmarker[mm].pos < post_sod_pos)) { - if (jwmarker[mm].len_ready) { - left_THmarks_len += jwmarker[mm].len + 2; - } else { - opj_event_msg(j2k->cinfo, EVT_ERROR, - "MS %x in %f is not len-ready: could not set up TH EPB\n", - jwmarker[mm].id, jwmarker[mm].dpos); - exit(1); - } - } - } - - /******* if ((tilespec < JPWL_MAX_NO_TILESPECS) && (j2k->cp->sens_TPH_tileno[tilespec] == tileno)) */ - if ((tilespec < JPWL_MAX_NO_TILESPECS) && - (j2k->cp->sens_TPH_tileno[tilespec] == acc_tpno)) - /* we got a specification from this tile onwards */ - { - sens = j2k->cp->sens_TPH[tilespec++]; - } - - /* must this TPH have an ESD MS? */ - if (j2k->cp->esd_on && (sens >= 0)) { - - /* Create the ESD */ - if ((esd_mark = jpwl_esd_create( - j2k, /* this encoder handle */ - -1, /* we are averaging over all components */ - (unsigned char) j2k->cp->sens_range, /* range method */ - (unsigned char) j2k->cp->sens_addr, /* sensitivity addressing size */ - (unsigned char) sens, /* sensitivity method */ - j2k->cp->sens_size, /* sensitivity value size */ - tileno, /* this ESD is in a tile */ - 0, /* number of packets in codestream */ - NULL /* pointer to sensitivity data of packets */ - ))) { - - /* Add this marker to the 'insertanda' list */ - if (jwmarker_num < JPWL_MAX_NO_MARKERS) { - jwmarker[jwmarker_num].id = J2K_MS_ESD; /* its type */ - jwmarker[jwmarker_num].m.esdmark = esd_mark; /* the EPB */ - /****** jwmarker[jwmarker_num].pos = j2k->cstr_info->tile[tileno].start_pos + sot_len + 2; */ /* after SOT */ - jwmarker[jwmarker_num].pos = j2k->cstr_info->tile[tileno].tp[tpno].tp_start_pos - + sot_len + 2; /* after SOT */ - jwmarker[jwmarker_num].dpos = (double) jwmarker[jwmarker_num].pos + - 0.2; /* not first at all! */ - jwmarker[jwmarker_num].len = esd_mark->Lesd; /* its length */ - jwmarker[jwmarker_num].len_ready = OPJ_TRUE; /* ready, yet */ - jwmarker[jwmarker_num].pos_ready = OPJ_TRUE; /* ready */ - jwmarker[jwmarker_num].parms_ready = OPJ_TRUE; /* not ready */ - jwmarker[jwmarker_num].data_ready = OPJ_FALSE; /* ready */ - jwmarker_num++; - } - - /* update Psot of the tile */ - cio_seek(cio, Psotp); - cio_write(cio, Psot + esd_mark->Lesd + 2, 4); - - opj_event_msg(j2k->cinfo, EVT_INFO, - /******* "TPH ESDs: tile %02d, method %d\n", */ - "TPH ESDs: tile %02d, part %02d, method %d\n", - /******* tileno, */ - tileno, tpno, - sens - ); - - } else { - /* ooops, problems */ - /***** opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not create TPH ESD #%d\n", tileno); */ - opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not create TPH ESD #%d,%d\n", - tileno, tpno); - }; - - } - - } - - }; - - /* - EPB MS for Main Header - */ - /* first of all, must MH have an EPB MS? */ - if (j2k->cp->epb_on && (j2k->cp->hprot_MH > 0)) { - - int mm; - - /* position of SOT */ - unsigned int sot_pos = j2k->cstr_info->main_head_end + 1; - - /* how much space is there between end of SIZ and beginning of SOT? */ - int left_MHmarks_len = sot_pos - socsiz_len; - - /* add all the lengths of the markers which are len-ready and stay within SOC and SOT */ - for (mm = 0; mm < jwmarker_num; mm++) { - if (jwmarker[mm].pos < sot_pos) { /* jwmarker[mm].pos >=0 since ulong */ - if (jwmarker[mm].len_ready) { - left_MHmarks_len += jwmarker[mm].len + 2; - } else { - opj_event_msg(j2k->cinfo, EVT_ERROR, - "MS %x in %f is not len-ready: could not set up MH EPB\n", - jwmarker[mm].id, jwmarker[mm].dpos); - exit(1); - } - } - } - - /* Create the EPB */ - if ((epb_mark = jpwl_epb_create( - j2k, /* this encoder handle */ - OPJ_TRUE, /* is it the latest? */ - OPJ_TRUE, /* is it packed? not for now */ - -1, /* we are in main header */ - 0, /* its index is 0 (first) */ - j2k->cp->hprot_MH, /* protection type parameters of data */ - socsiz_len, /* pre-data: only SOC+SIZ */ - left_MHmarks_len /* post-data: from SOC to SOT, and all JPWL markers within */ - ))) { - - /* Add this marker to the 'insertanda' list */ - if (jwmarker_num < JPWL_MAX_NO_MARKERS) { - jwmarker[jwmarker_num].id = J2K_MS_EPB; /* its type */ - jwmarker[jwmarker_num].m.epbmark = epb_mark; /* the EPB */ - jwmarker[jwmarker_num].pos = soc_pos + socsiz_len; /* after SIZ */ - jwmarker[jwmarker_num].dpos = (double) - jwmarker[jwmarker_num].pos; /* first first first! */ - jwmarker[jwmarker_num].len = epb_mark->Lepb; /* its length */ - jwmarker[jwmarker_num].len_ready = OPJ_TRUE; /* ready */ - jwmarker[jwmarker_num].pos_ready = OPJ_TRUE; /* ready */ - jwmarker[jwmarker_num].parms_ready = OPJ_TRUE; /* ready */ - jwmarker[jwmarker_num].data_ready = OPJ_FALSE; /* not ready */ - jwmarker_num++; - } - - opj_event_msg(j2k->cinfo, EVT_INFO, - "MH EPB : prot. %d\n", - j2k->cp->hprot_MH - ); - - } else { - /* ooops, problems */ - opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not create MH EPB\n"); - }; - } - - /* - EPB MSs for Tile Parts - */ - /* cycle through TPHs */ - hprot = j2k->cp->hprot_MH; /* default spec */ - tilespec = 0; /* first tile spec */ - lastileno = 0; - packspec = 0; - pprot = -1; - acc_tpno = 0; - for (tileno = 0; tileno < j2k->cstr_info->tw * j2k->cstr_info->th; tileno++) { - - opj_event_msg(j2k->cinfo, EVT_INFO, - "Tile %d has %d tile part(s)\n", - tileno, j2k->cstr_info->tile[tileno].num_tps - ); - - /* for every tile part in the tile */ - for (tpno = 0; tpno < j2k->cstr_info->tile[tileno].num_tps; - tpno++, acc_tpno++) { - - int sot_len, Psot, Psotp, mm, epb_index = 0, prot_len = 0; - unsigned long sot_pos, post_sod_pos; - unsigned long int left_THmarks_len/*, epbs_len = 0*/; - int startpack = 0, stoppack = j2k->cstr_info->packno; - int first_tp_pack, last_tp_pack; - jpwl_epb_ms_t *tph_epb = NULL; - - /****** sot_pos = j2k->cstr_info->tile[tileno].start_pos; */ - sot_pos = j2k->cstr_info->tile[tileno].tp[tpno].tp_start_pos; - cio_seek(cio, sot_pos + 2); - sot_len = cio_read(cio, 2); /* SOT Len */ - cio_skip(cio, 2); - Psotp = cio_tell(cio); - Psot = cio_read(cio, 4); /* tile length */ - - /* a-priori length of the data dwelling between SOT and SOD */ - /****** post_sod_pos = j2k->cstr_info->tile[tileno].end_header + 1; */ - post_sod_pos = j2k->cstr_info->tile[tileno].tp[tpno].tp_end_header + 1; - left_THmarks_len = post_sod_pos - (sot_pos + sot_len + 2); - - /* add all the lengths of the JPWL markers which are len-ready and stay within SOT and SOD */ - for (mm = 0; mm < jwmarker_num; mm++) { - if ((jwmarker[mm].pos >= sot_pos) && (jwmarker[mm].pos < post_sod_pos)) { - if (jwmarker[mm].len_ready) { - left_THmarks_len += jwmarker[mm].len + 2; - } else { - opj_event_msg(j2k->cinfo, EVT_ERROR, - "MS %x in %f is not len-ready: could not set up TH EPB\n", - jwmarker[mm].id, jwmarker[mm].dpos); - exit(1); - } - } - } - - /****** if ((tilespec < JPWL_MAX_NO_TILESPECS) && (j2k->cp->hprot_TPH_tileno[tilespec] == tileno)) */ - if ((tilespec < JPWL_MAX_NO_TILESPECS) && - (j2k->cp->hprot_TPH_tileno[tilespec] == acc_tpno)) - /* we got a specification from this tile part onwards */ - { - hprot = j2k->cp->hprot_TPH[tilespec++]; - } - - /* must this TPH have an EPB MS? */ - if (j2k->cp->epb_on && (hprot > 0)) { - - /* Create the EPB */ - if ((epb_mark = jpwl_epb_create( - j2k, /* this encoder handle */ - OPJ_FALSE, /* is it the latest? in TPH, no for now (if huge data size in TPH, we'd need more) */ - OPJ_TRUE, /* is it packed? yes for now */ - tileno, /* we are in TPH */ - epb_index++, /* its index is 0 (first) */ - hprot, /* protection type parameters of following data */ - sot_len + 2, /* pre-data length: only SOT */ - left_THmarks_len /* post-data length: from SOT end to SOD inclusive */ - ))) { - - /* Add this marker to the 'insertanda' list */ - if (jwmarker_num < JPWL_MAX_NO_MARKERS) { - jwmarker[jwmarker_num].id = J2K_MS_EPB; /* its type */ - jwmarker[jwmarker_num].m.epbmark = epb_mark; /* the EPB */ - /****** jwmarker[jwmarker_num].pos = j2k->cstr_info->tile[tileno].start_pos + sot_len + 2; */ /* after SOT */ - jwmarker[jwmarker_num].pos = j2k->cstr_info->tile[tileno].tp[tpno].tp_start_pos - + sot_len + 2; /* after SOT */ - jwmarker[jwmarker_num].dpos = (double) - jwmarker[jwmarker_num].pos; /* first first first! */ - jwmarker[jwmarker_num].len = epb_mark->Lepb; /* its length */ - jwmarker[jwmarker_num].len_ready = OPJ_TRUE; /* ready */ - jwmarker[jwmarker_num].pos_ready = OPJ_TRUE; /* ready */ - jwmarker[jwmarker_num].parms_ready = OPJ_TRUE; /* ready */ - jwmarker[jwmarker_num].data_ready = OPJ_FALSE; /* not ready */ - jwmarker_num++; - } - - /* update Psot of the tile */ - Psot += epb_mark->Lepb + 2; - - opj_event_msg(j2k->cinfo, EVT_INFO, - /***** "TPH EPB : tile %02d, prot. %d\n", */ - "TPH EPB : tile %02d, part %02d, prot. %d\n", - /***** tileno, */ - tileno, tpno, - hprot - ); - - /* save this TPH EPB address */ - tph_epb = epb_mark; - - } else { - /* ooops, problems */ - /****** opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not create TPH EPB #%d\n", tileno); */ - opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not create TPH EPB in #%d,d\n", - tileno, tpno); - }; - - } - - startpack = 0; - /* EPB MSs for UEP packet data protection in Tile Parts */ - /****** for (packno = 0; packno < j2k->cstr_info->num; packno++) { */ - /*first_tp_pack = (tpno > 0) ? (first_tp_pack + j2k->cstr_info->tile[tileno].tp[tpno - 1].tp_numpacks) : 0;*/ - first_tp_pack = j2k->cstr_info->tile[tileno].tp[tpno].tp_start_pack; - last_tp_pack = first_tp_pack + j2k->cstr_info->tile[tileno].tp[tpno].tp_numpacks - - 1; - for (packno = 0; packno < j2k->cstr_info->tile[tileno].tp[tpno].tp_numpacks; - packno++) { - - /******** if ((packspec < JPWL_MAX_NO_PACKSPECS) && - (j2k->cp->pprot_tileno[packspec] == tileno) && (j2k->cp->pprot_packno[packspec] == packno)) { */ - if ((packspec < JPWL_MAX_NO_PACKSPECS) && - (j2k->cp->pprot_tileno[packspec] == acc_tpno) && - (j2k->cp->pprot_packno[packspec] == packno)) { - - /* we got a specification from this tile and packet onwards */ - /* print the previous spec */ - if (packno > 0) { - stoppack = packno - 1; - opj_event_msg(j2k->cinfo, EVT_INFO, - /***** "UEP EPBs: tile %02d, packs. %02d-%02d (B %d-%d), prot. %d\n", */ - "UEP EPBs: tile %02d, part %02d, packs. %02d-%02d (B %d-%d), prot. %d\n", - /***** tileno, */ - tileno, tpno, - startpack, - stoppack, - /***** j2k->cstr_info->tile[tileno].packet[startpack].start_pos, */ - j2k->cstr_info->tile[tileno].packet[first_tp_pack + startpack].start_pos, - /***** j2k->cstr_info->tile[tileno].packet[stoppack].end_pos, */ - j2k->cstr_info->tile[tileno].packet[first_tp_pack + stoppack].end_pos, - pprot); - - /***** prot_len = j2k->cstr_info->tile[tileno].packet[stoppack].end_pos + 1 - - j2k->cstr_info->tile[tileno].packet[startpack].start_pos; */ - prot_len = j2k->cstr_info->tile[tileno].packet[first_tp_pack + stoppack].end_pos - + 1 - - j2k->cstr_info->tile[tileno].packet[first_tp_pack + startpack].start_pos; - - /* - particular case: if this is the last header and the last packet, - then it is better to protect even the EOC marker - */ - /****** if ((tileno == ((j2k->cstr_info->tw * j2k->cstr_info->th) - 1)) && - (stoppack == (j2k->cstr_info->num - 1))) */ - if ((tileno == ((j2k->cstr_info->tw * j2k->cstr_info->th) - 1)) && - (tpno == (j2k->cstr_info->tile[tileno].num_tps - 1)) && - (stoppack == last_tp_pack)) - /* add the EOC len */ - { - prot_len += 2; - } - - /* let's add the EPBs */ - Psot += jpwl_epbs_add( - j2k, /* J2K handle */ - jwmarker, /* pointer to JPWL markers list */ - &jwmarker_num, /* pointer to the number of current markers */ - OPJ_FALSE, /* latest */ - OPJ_TRUE, /* packed */ - OPJ_FALSE, /* inside MH */ - &epb_index, /* pointer to EPB index */ - pprot, /* protection type */ - /****** (double) (j2k->cstr_info->tile[tileno].start_pos + sot_len + 2) + 0.0001, */ /* position */ - (double)(j2k->cstr_info->tile[tileno].tp[tpno].tp_start_pos + sot_len + 2) + - 0.0001, /* position */ - tileno, /* number of tile */ - 0, /* length of pre-data */ - prot_len /*4000*/ /* length of post-data */ - ); - } - - startpack = packno; - pprot = j2k->cp->pprot[packspec++]; - } - - /*printf("Tile %02d, pack %02d ==> %d\n", tileno, packno, pprot);*/ - - } - - /* we are at the end: print the remaining spec */ - stoppack = packno - 1; - if (pprot >= 0) { - - opj_event_msg(j2k->cinfo, EVT_INFO, - /**** "UEP EPBs: tile %02d, packs. %02d-%02d (B %d-%d), prot. %d\n", */ - "UEP EPBs: tile %02d, part %02d, packs. %02d-%02d (B %d-%d), prot. %d\n", - /**** tileno, */ - tileno, tpno, - startpack, - stoppack, - /***** j2k->image_info->tile[tileno].packet[startpack].start_pos, - j2k->image_info->tile[tileno].packet[stoppack].end_pos, */ - j2k->cstr_info->tile[tileno].packet[first_tp_pack + startpack].start_pos, - j2k->cstr_info->tile[tileno].packet[first_tp_pack + stoppack].end_pos, - pprot); - - /***** prot_len = j2k->cstr_info->tile[tileno].packet[stoppack].end_pos + 1 - - j2k->cstr_info->tile[tileno].packet[startpack].start_pos; */ - prot_len = j2k->cstr_info->tile[tileno].packet[first_tp_pack + stoppack].end_pos - + 1 - - j2k->cstr_info->tile[tileno].packet[first_tp_pack + startpack].start_pos; - - /* - particular case: if this is the last header and the last packet, - then it is better to protect even the EOC marker - */ - /***** if ((tileno == ((j2k->cstr_info->tw * j2k->cstr_info->th) - 1)) && - (stoppack == (j2k->cstr_info->num - 1))) */ - if ((tileno == ((j2k->cstr_info->tw * j2k->cstr_info->th) - 1)) && - (tpno == (j2k->cstr_info->tile[tileno].num_tps - 1)) && - (stoppack == last_tp_pack)) - /* add the EOC len */ - { - prot_len += 2; - } - - /* let's add the EPBs */ - Psot += jpwl_epbs_add( - j2k, /* J2K handle */ - jwmarker, /* pointer to JPWL markers list */ - &jwmarker_num, /* pointer to the number of current markers */ - OPJ_TRUE, /* latest */ - OPJ_TRUE, /* packed */ - OPJ_FALSE, /* inside MH */ - &epb_index, /* pointer to EPB index */ - pprot, /* protection type */ - /***** (double) (j2k->cstr_info->tile[tileno].start_pos + sot_len + 2) + 0.0001,*/ /* position */ - (double)(j2k->cstr_info->tile[tileno].tp[tpno].tp_start_pos + sot_len + 2) + - 0.0001, /* position */ - tileno, /* number of tile */ - 0, /* length of pre-data */ - prot_len /*4000*/ /* length of post-data */ - ); - } - - /* we can now check if the TPH EPB was really the last one */ - if (tph_epb && (epb_index == 1)) { - /* set the TPH EPB to be the last one in current header */ - tph_epb->Depb |= (unsigned char)((OPJ_TRUE & 0x0001) << 6); - tph_epb = NULL; - } - - /* write back Psot */ - cio_seek(cio, Psotp); - cio_write(cio, Psot, 4); - - } - - }; - - /* reset the position */ - cio_seek(cio, ciopos); - -} - -void jpwl_dump_marks(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image) -{ - - int mm; - unsigned long int old_size = j2k->cstr_info->codestream_size; - unsigned long int new_size = old_size; - int /*ciopos = cio_tell(cio),*/ soc_pos = j2k->cstr_info->main_head_start; - unsigned char *jpwl_buf, *orig_buf; - unsigned long int orig_pos; - double epbcoding_time = 0.0, esdcoding_time = 0.0; - (void)image; - - /* Order JPWL markers according to their wishlist position */ - qsort((void *) jwmarker, (size_t) jwmarker_num, sizeof(jpwl_marker_t), - jpwl_markcomp); - - /* compute markers total size */ - for (mm = 0; mm < jwmarker_num; mm++) { - /*printf("%x, %d, %.10f, %d long\n", jwmarker[mm].id, jwmarker[mm].pos, - jwmarker[mm].dpos, jwmarker[mm].len);*/ - new_size += jwmarker[mm].len + 2; - } - - /* allocate a new buffer of proper size */ - if (!(jpwl_buf = (unsigned char *) opj_malloc((size_t)(new_size + soc_pos) * - sizeof(unsigned char)))) { - opj_event_msg(j2k->cinfo, EVT_ERROR, - "Could not allocate room for JPWL codestream buffer\n"); - exit(1); - }; - - /* copy the jp2 part, if any */ - orig_buf = jpwl_buf; - memcpy(jpwl_buf, cio->buffer, soc_pos); - jpwl_buf += soc_pos; - - /* cycle through markers */ - orig_pos = soc_pos + 0; /* start from the beginning */ - cio_seek(cio, soc_pos + 0); /* rewind the original */ - for (mm = 0; mm < jwmarker_num; mm++) { - - /* - need to copy a piece of the original codestream - if there is such - */ - memcpy(jpwl_buf, cio_getbp(cio), jwmarker[mm].pos - orig_pos); - jpwl_buf += jwmarker[mm].pos - orig_pos; - orig_pos = jwmarker[mm].pos; - cio_seek(cio, orig_pos); - - /* - then write down the marker - */ - switch (jwmarker[mm].id) { - - case J2K_MS_EPB: - jpwl_epb_write(j2k, jwmarker[mm].m.epbmark, jpwl_buf); - break; - - case J2K_MS_EPC: - jpwl_epc_write(j2k, jwmarker[mm].m.epcmark, jpwl_buf); - break; - - case J2K_MS_ESD: - jpwl_esd_write(j2k, jwmarker[mm].m.esdmark, jpwl_buf); - break; - - case J2K_MS_RED: - memset(jpwl_buf, 0, jwmarker[mm].len + 2); /* placeholder */ - break; - - default: - break; - }; - - /* we update the markers struct */ - if (j2k->cstr_info) { - j2k->cstr_info->marker[j2k->cstr_info->marknum - 1].pos = - (jpwl_buf - orig_buf); - } - - /* we set the marker dpos to the new position in the JPWL codestream */ - jwmarker[mm].dpos = (double)(jpwl_buf - orig_buf); - - /* advance JPWL buffer position */ - jpwl_buf += jwmarker[mm].len + 2; - - } - - /* finish remaining original codestream */ - memcpy(jpwl_buf, cio_getbp(cio), old_size - (orig_pos - soc_pos)); - jpwl_buf += old_size - (orig_pos - soc_pos); - cio_seek(cio, soc_pos + old_size); - - /* - update info file based on added markers - */ - if (!jpwl_update_info(j2k, jwmarker, jwmarker_num)) { - opj_event_msg(j2k->cinfo, EVT_ERROR, - "Could not update OPJ cstr_info structure\n"); - } - - /* now we need to repass some markers and fill their data fields */ - - /* first of all, DL and Pcrc in EPCs */ - for (mm = 0; mm < jwmarker_num; mm++) { - - /* find the EPCs */ - if (jwmarker[mm].id == J2K_MS_EPC) { - - int epc_pos = (int) jwmarker[mm].dpos, pp; - unsigned short int mycrc = 0x0000; - - /* fix and fill the DL field */ - jwmarker[mm].m.epcmark->DL = new_size; - orig_buf[epc_pos + 6] = (unsigned char)(jwmarker[mm].m.epcmark->DL >> 24); - orig_buf[epc_pos + 7] = (unsigned char)(jwmarker[mm].m.epcmark->DL >> 16); - orig_buf[epc_pos + 8] = (unsigned char)(jwmarker[mm].m.epcmark->DL >> 8); - orig_buf[epc_pos + 9] = (unsigned char)(jwmarker[mm].m.epcmark->DL >> 0); - - /* compute the CRC field (excluding itself) */ - for (pp = 0; pp < 4; pp++) { - jpwl_updateCRC16(&mycrc, orig_buf[epc_pos + pp]); - } - for (pp = 6; pp < (jwmarker[mm].len + 2); pp++) { - jpwl_updateCRC16(&mycrc, orig_buf[epc_pos + pp]); - } - - /* fix and fill the CRC */ - jwmarker[mm].m.epcmark->Pcrc = mycrc; - orig_buf[epc_pos + 4] = (unsigned char)(jwmarker[mm].m.epcmark->Pcrc >> 8); - orig_buf[epc_pos + 5] = (unsigned char)(jwmarker[mm].m.epcmark->Pcrc >> 0); - - } - } - - /* then, sensitivity data in ESDs */ - esdcoding_time = opj_clock(); - for (mm = 0; mm < jwmarker_num; mm++) { - - /* find the ESDs */ - if (jwmarker[mm].id == J2K_MS_ESD) { - - /* remember that they are now in a new position (dpos) */ - int esd_pos = (int) jwmarker[mm].dpos; - - jpwl_esd_fill(j2k, jwmarker[mm].m.esdmark, &orig_buf[esd_pos]); - - } - - } - esdcoding_time = opj_clock() - esdcoding_time; - if (j2k->cp->esd_on) { - opj_event_msg(j2k->cinfo, EVT_INFO, "ESDs sensitivities computed in %f s\n", - esdcoding_time); - } - - /* finally, RS or CRC parity in EPBs */ - epbcoding_time = opj_clock(); - for (mm = 0; mm < jwmarker_num; mm++) { - - /* find the EPBs */ - if (jwmarker[mm].id == J2K_MS_EPB) { - - /* remember that they are now in a new position (dpos) */ - int nn, accum_len; - - /* let's see how many EPBs are following this one, included itself */ - /* for this to work, we suppose that the markers are correctly ordered */ - /* and, overall, that they are in packed mode inside headers */ - accum_len = 0; - for (nn = mm; (nn < jwmarker_num) && (jwmarker[nn].id == J2K_MS_EPB) && - (jwmarker[nn].pos == jwmarker[mm].pos); nn++) { - accum_len += jwmarker[nn].m.epbmark->Lepb + 2; - } - - /* fill the current (first) EPB with post-data starting from the computed position */ - jpwl_epb_fill(j2k, jwmarker[mm].m.epbmark, &orig_buf[(int) jwmarker[mm].dpos], - &orig_buf[(int) jwmarker[mm].dpos + accum_len]); - - /* fill the remaining EPBs in the header with post-data starting from the last position */ - for (nn = mm + 1; (nn < jwmarker_num) && (jwmarker[nn].id == J2K_MS_EPB) && - (jwmarker[nn].pos == jwmarker[mm].pos); nn++) { - jpwl_epb_fill(j2k, jwmarker[nn].m.epbmark, &orig_buf[(int) jwmarker[nn].dpos], - NULL); - } - - /* skip all the processed EPBs */ - mm = nn - 1; - } - - } - epbcoding_time = opj_clock() - epbcoding_time; - if (j2k->cp->epb_on) { - opj_event_msg(j2k->cinfo, EVT_INFO, "EPBs redundancy computed in %f s\n", - epbcoding_time); - } - - /* free original cio buffer and set it to the JPWL one */ - opj_free(cio->buffer); - cio->cinfo = cio->cinfo; /* no change */ - cio->openmode = cio->openmode; /* no change */ - cio->buffer = orig_buf; - cio->length = new_size + soc_pos; - cio->start = cio->buffer; - cio->end = cio->buffer + cio->length; - cio->bp = cio->buffer; - cio_seek(cio, soc_pos + new_size); - -} - - -void j2k_read_epc(opj_j2k_t *j2k) -{ - unsigned long int DL, Lepcp, Pcrcp, l; - unsigned short int Lepc, Pcrc = 0x0000; - unsigned char Pepc; - opj_cio_t *cio = j2k->cio; - const char *ans1; - - /* Simply read the EPC parameters */ - Lepcp = cio_tell(cio); - Lepc = cio_read(cio, 2); - Pcrcp = cio_tell(cio); - cio_skip(cio, 2); /* Pcrc */ - DL = cio_read(cio, 4); - Pepc = cio_read(cio, 1); - - /* compute Pcrc */ - cio_seek(cio, Lepcp - 2); - - /* Marker */ - jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1)); - jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1)); - - /* Length */ - jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1)); - jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1)); - - /* skip Pcrc */ - cio_skip(cio, 2); - - /* read all remaining */ - for (l = 4; l < Lepc; l++) { - jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1)); - } - - /* check Pcrc with the result */ - cio_seek(cio, Pcrcp); - ans1 = (Pcrc == (unsigned short int) cio_read(cio, 2)) ? "crc-ok" : "crc-ko"; - - /* now we write them to screen */ - opj_event_msg(j2k->cinfo, EVT_INFO, - "EPC(%u,%d): %s, DL=%d%s %s %s\n", - Lepcp - 2, - Lepc, - ans1, - DL, /* data length this EPC is referring to */ - (Pepc & 0x10) ? ", esd" : "", /* ESD is present */ - (Pepc & 0x20) ? ", red" : "", /* RED is present */ - (Pepc & 0x40) ? ", epb" : ""); /* EPB is present */ - - cio_seek(cio, Lepcp + Lepc); -} - -#if 0 -void j2k_write_epc(opj_j2k_t *j2k) -{ - - unsigned long int DL, Lepcp, Pcrcp, l; - unsigned short int Lepc, Pcrc; - unsigned char Pepc; - - opj_cio_t *cio = j2k->cio; - - cio_write(cio, J2K_MS_EPC, 2); /* EPC */ - Lepcp = cio_tell(cio); - cio_skip(cio, 2); - - /* CRC-16 word of the EPC */ - Pcrc = 0x0000; /* initialize */ - Pcrcp = cio_tell(cio); - cio_write(cio, Pcrc, 2); /* Pcrc placeholder*/ - - /* data length of the EPC protection domain */ - DL = 0x00000000; /* we leave this set to 0, as if the information is not available */ - cio_write(cio, DL, 4); /* DL */ - - /* jpwl capabilities */ - Pepc = 0x00; - cio_write(cio, Pepc, 1); /* Pepc */ - - /* ID section */ - /* no ID's, as of now */ - - Lepc = (unsigned short)(cio_tell(cio) - Lepcp); - cio_seek(cio, Lepcp); - cio_write(cio, Lepc, 2); /* Lepc */ - - /* compute Pcrc */ - cio_seek(cio, Lepcp - 2); - - /* Marker */ - jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1)); - jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1)); - - /* Length */ - jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1)); - jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1)); - - /* skip Pcrc */ - cio_skip(cio, 2); - - /* read all remaining */ - for (l = 4; l < Lepc; l++) { - jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1)); - } - - /* fill Pcrc with the result */ - cio_seek(cio, Pcrcp); - cio_write(cio, Pcrc, 2); - - cio_seek(cio, Lepcp + Lepc); - - /* marker struct update */ - j2k_add_marker(j2k->cstr_info, J2K_MS_EPC, Lepcp - 2, Lepc + 2); - -} -#endif - -void j2k_read_epb(opj_j2k_t *j2k) -{ - unsigned long int LDPepb, Pepb; - unsigned short int Lepb; - unsigned char Depb; - char str1[25] = ""; - opj_bool status; - static opj_bool first_in_tph = OPJ_TRUE; - int type, pre_len, post_len; - static unsigned char *redund = NULL; - - opj_cio_t *cio = j2k->cio; - - /* B/W = 45, RGB = 51 */ - /* SIZ SIZ_FIELDS SIZ_COMPS FOLLOWING_MARKER */ - int skipnum = 2 + 38 + 3 * j2k->cp->exp_comps + 2; - - if (j2k->cp->correct) { - - /* go back to EPB marker value */ - cio_seek(cio, cio_tell(cio) - 2); - - /* we need to understand where we are */ - if (j2k->state == J2K_STATE_MH) { - /* we are in MH */ - type = 0; /* MH */ - pre_len = skipnum; /* SOC+SIZ */ - post_len = -1; /* auto */ - - } else if ((j2k->state == J2K_STATE_TPH) && first_in_tph) { - /* we are in TPH */ - type = 1; /* TPH */ - pre_len = 12; /* SOC+SIZ */ - first_in_tph = OPJ_FALSE; - post_len = -1; /* auto */ - - } else { - /* we are elsewhere */ - type = 2; /* other */ - pre_len = 0; /* nada */ - post_len = -1; /* auto */ - - } - - /* call EPB corrector */ - /*printf("before %x, ", redund);*/ - status = jpwl_epb_correct(j2k, /* J2K decompressor handle */ - cio->bp, /* pointer to EPB in codestream buffer */ - type, /* EPB type: MH */ - pre_len, /* length of pre-data */ - post_len, /* length of post-data: -1 means auto */ - NULL, /* do everything auto */ - &redund - ); - /*printf("after %x\n", redund);*/ - - /* Read the (possibly corrected) EPB parameters */ - cio_skip(cio, 2); - Lepb = cio_read(cio, 2); - Depb = cio_read(cio, 1); - LDPepb = cio_read(cio, 4); - Pepb = cio_read(cio, 4); - - if (!status) { - - opj_event_msg(j2k->cinfo, EVT_ERROR, - "JPWL correction could not be performed\n"); - - /* advance to EPB endpoint */ - cio_skip(cio, Lepb + 2); - - return; - } - - /* last in current header? */ - if (Depb & 0x40) { - redund = NULL; /* reset the pointer to L4 buffer */ - first_in_tph = OPJ_TRUE; - } - - /* advance to EPB endpoint */ - cio_skip(cio, Lepb - 11); - - } else { - - /* Simply read the EPB parameters */ - Lepb = cio_read(cio, 2); - Depb = cio_read(cio, 1); - LDPepb = cio_read(cio, 4); - Pepb = cio_read(cio, 4); - - /* What does Pepb tells us about the protection method? */ - if (((Pepb & 0xF0000000) >> 28) == 0) { - sprintf(str1, "pred"); /* predefined */ - } else if (((Pepb & 0xF0000000) >> 28) == 1) { - sprintf(str1, "crc-%lu", 16 * ((Pepb & 0x00000001) + 1)); /* CRC mode */ - } else if (((Pepb & 0xF0000000) >> 28) == 2) { - sprintf(str1, "rs(%lu,32)", (Pepb & 0x0000FF00) >> 8); /* RS mode */ - } else if (Pepb == 0xFFFFFFFF) { - sprintf(str1, "nometh"); /* RS mode */ - } else { - sprintf(str1, "unknown"); /* unknown */ - } - - /* Now we write them to screen */ - opj_event_msg(j2k->cinfo, EVT_INFO, - "EPB(%d): (%sl, %sp, %u), %lu, %s\n", - cio_tell(cio) - 13, - (Depb & 0x40) ? "" : "n", /* latest EPB or not? */ - (Depb & 0x80) ? "" : "n", /* packed or unpacked EPB? */ - (Depb & 0x3F), /* EPB index value */ - LDPepb, /*length of the data protected by the EPB */ - str1); /* protection method */ - - cio_skip(cio, Lepb - 11); - } -} - -void j2k_write_epb(opj_j2k_t *j2k) -{ - unsigned long int LDPepb, Pepb, Lepbp; - unsigned short int Lepb; - unsigned char Depb; - - opj_cio_t *cio = j2k->cio; - - cio_write(cio, J2K_MS_EPB, 2); /* EPB */ - Lepbp = cio_tell(cio); - cio_skip(cio, 2); - - /* EPB style */ - Depb = 0x00; /* test */ - cio_write(cio, Depb, 1); /* Depb */ - - /* length of the data to be protected by this EPB */ - LDPepb = 0x00000000; /* test */ - cio_write(cio, LDPepb, 4); /* LDPepb */ - - /* next error correction tool */ - Pepb = 0x00000000; /* test */ - cio_write(cio, Pepb, 4); /* Pepb */ - - /* EPB data */ - /* no data, as of now */ - - Lepb = (unsigned short)(cio_tell(cio) - Lepbp); - cio_seek(cio, Lepbp); - cio_write(cio, Lepb, 2); /* Lepb */ - - cio_seek(cio, Lepbp + Lepb); - - /* marker struct update */ - j2k_add_marker(j2k->cstr_info, J2K_MS_EPB, Lepbp - 2, Lepb + 2); -} - -void j2k_read_esd(opj_j2k_t *j2k) -{ - unsigned short int Lesd, Cesd; - unsigned char Pesd; - - int cesdsize = (j2k->image->numcomps >= 257) ? 2 : 1; - - char str1[4][4] = {"p", "br", "pr", "res"}; - char str2[8][8] = {"res", "mse", "mse-r", "psnr", "psnr-i", "maxerr", "tse", "res"}; - - opj_cio_t *cio = j2k->cio; - - /* Simply read the ESD parameters */ - Lesd = cio_read(cio, 2); - Cesd = cio_read(cio, cesdsize); - Pesd = cio_read(cio, 1); - - /* Now we write them to screen */ - opj_event_msg(j2k->cinfo, EVT_INFO, - "ESD(%d): c%d, %s, %s, %s, %s, %s\n", - cio_tell(cio) - (5 + cesdsize), - Cesd, /* component number for this ESD */ - str1[(Pesd & (unsigned char) 0xC0) >> 6], /* addressing mode */ - str2[(Pesd & (unsigned char) 0x38) >> 3], /* sensitivity type */ - ((Pesd & (unsigned char) 0x04) >> 2) ? "2Bs" : "1Bs", - ((Pesd & (unsigned char) 0x02) >> 1) ? "4Ba" : "2Ba", - (Pesd & (unsigned char) 0x01) ? "avgc" : ""); - - cio_skip(cio, Lesd - (3 + cesdsize)); -} - -void j2k_read_red(opj_j2k_t *j2k) -{ - unsigned short int Lred; - unsigned char Pred; - char str1[4][4] = {"p", "br", "pr", "res"}; - - opj_cio_t *cio = j2k->cio; - - /* Simply read the RED parameters */ - Lred = cio_read(cio, 2); - Pred = cio_read(cio, 1); - - /* Now we write them to screen */ - opj_event_msg(j2k->cinfo, EVT_INFO, - "RED(%d): %s, %dc, %s, %s\n", - cio_tell(cio) - 5, - str1[(Pred & (unsigned char) 0xC0) >> 6], /* addressing mode */ - (Pred & (unsigned char) 0x38) >> 3, /* corruption level */ - ((Pred & (unsigned char) 0x02) >> 1) ? "4Ba" : "2Ba", /* address range */ - (Pred & (unsigned char) 0x01) ? "errs" : "free"); /* error free? */ - - cio_skip(cio, Lred - 3); -} - -opj_bool jpwl_check_tile(opj_j2k_t *j2k, opj_tcd_t *tcd, int tileno) -{ - -#ifdef oerhgierhgvhreit4u - /* - we navigate through the tile and find possible invalid parameters: - this saves a lot of crashes!!!!! - */ - int compno, resno, precno, /*layno,*/ bandno, blockno; - int numprecincts, numblocks; - - /* this is the selected tile */ - opj_tcd_tile_t *tile = &(tcd->tcd_image->tiles[tileno]); - - /* will keep the component */ - opj_tcd_tilecomp_t *comp = NULL; - - /* will keep the resolution */ - opj_tcd_resolution_t *res; - - /* will keep the subband */ - opj_tcd_band_t *band; - - /* will keep the precinct */ - opj_tcd_precinct_t *prec; - - /* will keep the codeblock */ - opj_tcd_cblk_t *block; - - /* check all tile components */ - for (compno = 0; compno < tile->numcomps; compno++) { - comp = &(tile->comps[compno]); - - /* check all component resolutions */ - for (resno = 0; resno < comp->numresolutions; resno++) { - res = &(comp->resolutions[resno]); - numprecincts = res->pw * res->ph; - - /* check all the subbands */ - for (bandno = 0; bandno < res->numbands; bandno++) { - band = &(res->bands[bandno]); - - /* check all the precincts */ - for (precno = 0; precno < numprecincts; precno++) { - prec = &(band->precincts[precno]); - numblocks = prec->ch * prec->cw; - - /* check all the codeblocks */ - for (blockno = 0; blockno < numblocks; blockno++) { - block = &(prec->cblks[blockno]); - - /* x-origin is invalid */ - if ((block->x0 < prec->x0) || (block->x0 > prec->x1)) { - opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR, - "JPWL: wrong x-cord of block origin %d => x-prec is (%d, %d)\n", - block->x0, prec->x0, prec->x1); - if (!JPWL_ASSUME) { - return OPJ_FALSE; - } - }; - } - } - } - } - } - -#else - (void)j2k; - (void)tcd; - (void)tileno; -#endif - - return OPJ_TRUE; -} - -/*@}*/ - -#endif /* USE_JPWL */ - - -#ifdef USE_JPSEC - -/** @defgroup JPSEC JPSEC - JPEG-2000 Part 8 (JPSEC) codestream manager */ -/*@{*/ - - -/** @name Local static functions */ -/*@{*/ - -void j2k_read_sec(opj_j2k_t *j2k) -{ - unsigned short int Lsec; - - opj_cio_t *cio = j2k->cio; - - /* Simply read the SEC length */ - Lsec = cio_read(cio, 2); - - /* Now we write them to screen */ - opj_event_msg(j2k->cinfo, EVT_INFO, - "SEC(%d)\n", - cio_tell(cio) - 2 - ); - - cio_skip(cio, Lsec - 2); -} - -void j2k_write_sec(opj_j2k_t *j2k) -{ - unsigned short int Lsec = 24; - int i; - - opj_cio_t *cio = j2k->cio; - - cio_write(cio, J2K_MS_SEC, 2); /* SEC */ - cio_write(cio, Lsec, 2); - - /* write dummy data */ - for (i = 0; i < Lsec - 2; i++) { - cio_write(cio, 0, 1); - } -} - -void j2k_read_insec(opj_j2k_t *j2k) -{ - unsigned short int Linsec; - - opj_cio_t *cio = j2k->cio; - - /* Simply read the INSEC length */ - Linsec = cio_read(cio, 2); - - /* Now we write them to screen */ - opj_event_msg(j2k->cinfo, EVT_INFO, - "INSEC(%d)\n", - cio_tell(cio) - 2 - ); - - cio_skip(cio, Linsec - 2); -} - - -/*@}*/ - -/*@}*/ - -#endif /* USE_JPSEC */ - diff --git a/src/lib/openjpwl/jpwl.h b/src/lib/openjpwl/jpwl.h deleted file mode 100644 index ed8a57e6..00000000 --- a/src/lib/openjpwl/jpwl.h +++ /dev/null @@ -1,438 +0,0 @@ -/* - * 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) 2005-2006, Dept. of Electronic and Information Engineering, Universita' degli Studi di Perugia, Italy - * 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 __JPWL_H -#define __JPWL_H - -#ifdef USE_JPWL - -#include "crc.h" -#include "rs.h" - -/** -@file jpwl.h -@brief The JPEG-2000 Part11 (JPWL) marker segments manager - -The functions in JPWL.C have for goal to read/write the markers added by JPWL. -*/ - -/** @defgroup JPWL JPWL - JPEG-2000 Part11 (JPWL) codestream manager */ -/*@{*/ - -/** -Assume a basic codestream structure, so you can resort better from uncorrected errors -*/ -#define JPWL_ASSUME OPJ_TRUE - -/** -EPB (Error Protection Block) Marker segment -*/ -typedef struct jpwl_epb_ms { - /**@name Private fields set by epb_create */ - /*@{*/ - /** is the latest in header? */ - opj_bool latest; - /** is it in packed mode? */ - opj_bool packed; - /** TH where this marker has been placed (-1 means MH) */ - int tileno; - /** index in current header (0-63) */ - unsigned char index; - /** error protection method [-1=absent 0=none 1=predefined 16=CRC-16 32=CRC-32 37-128=RS] */ - int hprot; - /** message word length of pre-data */ - int k_pre; - /** code word length of pre-data */ - int n_pre; - /** length of pre-data */ - int pre_len; - /** message word length of post-data */ - int k_post; - /** code word length of post-data */ - int n_post; - /** length of post-data */ - int post_len; - /*@}*/ - /**@name Marker segment fields */ - /*@{*/ - /** two bytes for the length of EPB MS, exluding the marker itself (11 to 65535 bytes) */ - unsigned short int Lepb; - /** single byte for the style */ - unsigned char Depb; - /** four bytes, from 0 to 2^31-1 */ - unsigned long int LDPepb; - /** four bytes, next error management method */ - unsigned long int Pepb; - /** EPB data, variable size */ - unsigned char *data; - /*@}*/ -} jpwl_epb_ms_t; - -/** -EPC (Error Protection Capability) Marker segment -*/ -typedef struct jpwl_epc_ms { - /** is ESD active? */ - opj_bool esd_on; - /** is RED active? */ - opj_bool red_on; - /** is EPB active? */ - opj_bool epb_on; - /** are informative techniques active? */ - opj_bool info_on; - /**@name Marker segment fields */ - /*@{*/ - /** two bytes for the length of EPC MS, exluding the marker itself (9 to 65535 bytes) */ - unsigned short int Lepc; - /** two bytes, CRC for the EPC, excluding Pcrc itself */ - unsigned short int Pcrc; - /** four bytes, the codestream length from SOC to EOC */ - unsigned long int DL; - /** one byte, signals JPWL techniques adoption */ - unsigned char Pepc; - /** EPC data, variable length */ - unsigned char *data; - /*@}*/ -} jpwl_epc_ms_t; - -/** -ESD (Error Sensitivity Descriptor) Marker segment -*/ -typedef struct jpwl_esd_ms { - /** codestream addressing mode [0=packet, 1=byte range, 2=packet range, 3=reserved] */ - unsigned char addrm; - /** size of codestream addresses [2/4 bytes] */ - unsigned char ad_size; - /** type of sensitivity - [0=relative error, 1=MSE, 2=MSE reduction, 3=PSNR, 4=PSNR increment, - 5=MAXERR (absolute peak error), 6=TSE (total squared error), 7=reserved */ - unsigned char senst; - /** size of sensitivity data (1/2 bytes) */ - unsigned char se_size; - /**@name Marker segment fields */ - /*@{*/ - /** two bytes for the length of ESD MS, exluding the marker itself (4 to 65535 bytes) */ - unsigned short int Lesd; - /** two bytes, component of error sensitivity */ - unsigned short int Cesd; - /** one byte, signals JPWL techniques adoption */ - unsigned char Pesd; - /** ESD data, variable length */ - unsigned char *data; - /*@}*/ - /**@name Fields set by esd_create (only internal use) */ - /*@{*/ - /** number of components in the image */ - int numcomps; - /** tile where this marker has been placed (-1 means MH) */ - int tileno; - /** number of sensitivity values */ - unsigned long int svalnum; - /** size of a single sensitivity pair (address+value) */ - size_t sensval_size; - /*@}*/ -} jpwl_esd_ms_t; - -/** -RED (Residual Error Descriptor) Marker segment -*/ -typedef struct jpwl_red_ms { - /** two bytes for the length of RED MS, exluding the marker itself (3 to 65535 bytes) */ - unsigned short int Lred; - /** one byte, signals JPWL techniques adoption */ - unsigned char Pred; - /** RED data, variable length */ - unsigned char *data; -} jpwl_red_ms_t; - -/** -Structure used to store JPWL markers temporary position and readyness -*/ -typedef struct jpwl_marker { - /** marker value (J2K_MS_EPC, etc.) */ - int id; - /** union keeping the pointer to the real marker struct */ - union jpwl_marks { - /** pointer to EPB marker */ - jpwl_epb_ms_t *epbmark; - /** pointer to EPC marker */ - jpwl_epc_ms_t *epcmark; - /** pointer to ESD marker */ - jpwl_esd_ms_t *esdmark; - /** pointer to RED marker */ - jpwl_red_ms_t *redmark; - } m; - /** position where the marker should go, in the pre-JPWL codestream */ - unsigned long int pos; - /** same as before, only written as a double, so we can sort it better */ - double dpos; - /** length of the marker segment (marker excluded) */ - unsigned short int len; - /** the marker length is ready or not? */ - opj_bool len_ready; - /** the marker position is ready or not? */ - opj_bool pos_ready; - /** the marker parameters are ready or not? */ - opj_bool parms_ready; - /** are the written data ready or not */ - opj_bool data_ready; -} jpwl_marker_t; - -/** -Encode according to JPWL specs -@param j2k J2K handle -@param cio codestream handle -@param image image handle -*/ -void jpwl_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image); - -/** -Prepare the list of JPWL markers, after the Part 1 codestream -has been finalized (index struct is full) -@param j2k J2K handle -@param cio codestream handle -@param image image handle -*/ -void jpwl_prepare_marks(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image); - -/** -Dump the list of JPWL markers, after it has been prepared -@param j2k J2K handle -@param cio codestream handle -@param image image handle -*/ -void jpwl_dump_marks(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image); - -/** -Read the EPC marker (Error Protection Capability) -@param j2k J2K handle -*/ -void j2k_read_epc(opj_j2k_t *j2k); - -/** -Write the EPC marker (Error Protection Capability), BUT the DL field is always set to 0 -(this simplifies the management of EPBs and it is openly stated in the standard -as a possible value, mening that the information is not available) and the informative techniques -are not yet implemented -@param j2k J2K handle -*/ -#if 0 -void j2k_write_epc(opj_j2k_t *j2k); -#endif - -/** -Read the EPB marker (Error Protection Block) -@param j2k J2K handle -*/ -void j2k_read_epb(opj_j2k_t *j2k); - -/** -Write the EPB marker (Error Protection Block) -@param j2k J2K handle -*/ -void j2k_write_epb(opj_j2k_t *j2k); - -/** -Read the ESD marker (Error Sensitivity Descriptor) -@param j2k J2K handle -*/ -void j2k_read_esd(opj_j2k_t *j2k); - -/** -Read the RED marker (Residual Error Descriptor) -@param j2k J2K handle -*/ -void j2k_read_red(opj_j2k_t *j2k); - -/** create an EPB marker segment -@param j2k J2K compressor handle -@param latest it is the latest EPB in the header -@param packed EPB is in packed style -@param tileno tile number where the marker has been placed (-1 means MH) -@param idx current EPB running index -@param hprot applied protection type (-1/0,1,16,32,37-128) -@param pre_len length of pre-protected data -@param post_len length of post-protected data -@return returns the freshly created EPB -*/ -jpwl_epb_ms_t *jpwl_epb_create(opj_j2k_t *j2k, opj_bool latest, opj_bool packed, - int tileno, int idx, int hprot, - unsigned long int pre_len, unsigned long int post_len); - -/** add a number of EPB marker segments -@param j2k J2K compressor handle -@param jwmarker pointer to the JPWL markers list -@param jwmarker_num pointer to the number of JPWL markers (gets updated) -@param latest it is the latest group of EPBs in the header -@param packed EPBs are in packed style -@param insideMH it is in the MH -@param idx pointer to the starting EPB running index (gets updated) -@param hprot applied protection type (-1/0,1,16,32,37-128) -@param place_pos place in original codestream where EPBs should go -@param tileno tile number of these EPBs -@param pre_len length of pre-protected data -@param post_len length of post-protected data -@return returns the length of all added markers -*/ -int jpwl_epbs_add(opj_j2k_t *j2k, jpwl_marker_t *jwmarker, int *jwmarker_num, - opj_bool latest, opj_bool packed, opj_bool insideMH, int *idx, int hprot, - double place_pos, int tileno, - unsigned long int pre_len, unsigned long int post_len); - -/** add a number of ESD marker segments -@param j2k J2K compressor handle -@param jwmarker pointer to the JPWL markers list -@param jwmarker_num pointer to the number of JPWL markers (gets updated) -@param comps considered component (-1=average, 0/1/2/...=component no.) -@param addrm addressing mode (0=packet, 1=byte range, 2=packet range, 3=reserved) -@param ad_size size of addresses (2/4 bytes) -@param senst sensitivity type -@param se_size sensitivity values size (1/2 bytes) -@param place_pos place in original codestream where EPBs should go -@param tileno tile number of these EPBs -@return returns the length of all added markers -*/ -int jpwl_esds_add(opj_j2k_t *j2k, jpwl_marker_t *jwmarker, int *jwmarker_num, - int comps, unsigned char addrm, unsigned char ad_size, - unsigned char senst, unsigned char se_size, - double place_pos, int tileno); - -/** updates the information structure by modifying the positions and lengths -@param j2k J2K compressor handle -@param jwmarker pointer to JPWL markers list -@param jwmarker_num number of JPWL markers -@return returns true in case of success -*/ -opj_bool jpwl_update_info(opj_j2k_t *j2k, jpwl_marker_t *jwmarker, - int jwmarker_num); - - -opj_bool jpwl_esd_fill(opj_j2k_t *j2k, jpwl_esd_ms_t *esdmark, - unsigned char *buf); - -opj_bool jpwl_epb_fill(opj_j2k_t *j2k, jpwl_epb_ms_t *epbmark, - unsigned char *buf, unsigned char *post_buf); - -opj_bool j2k_add_marker(opj_codestream_info_t *cstr_info, - unsigned short int type, int pos, int len); - -/** corrects the data in the JPWL codestream -@param j2k J2K compressor handle -@return true if correction is performed correctly -*/ -opj_bool jpwl_correct(opj_j2k_t *j2k); - -/** corrects the data protected by an EPB -@param j2k J2K compressor handle -@param buffer pointer to the EPB position -@param type type of EPB: 0=MH, 1=TPH, 2=other, 3=auto -@param pre_len length of pre-data -@param post_len length of post_data -@param conn is a pointer to the length of all connected (packed) EPBs -@param L4_bufp is a pointer to the buffer pointer of redundancy data -@return returns true if correction could be successfully performed -*/ -opj_bool jpwl_epb_correct(opj_j2k_t *j2k, unsigned char *buffer, int type, - int pre_len, int post_len, int *conn, - unsigned char **L4_bufp); - -/** check that a tile and its children have valid data -@param j2k J2K decompressor handle -@param tcd Tile decompressor handle -@param tileno number of the tile to check -*/ -opj_bool jpwl_check_tile(opj_j2k_t *j2k, opj_tcd_t *tcd, int tileno); - -/** Macro functions for CRC computation */ - -/** -Computes the CRC-16, as stated in JPWL specs -@param CRC two bytes containing the CRC value (must be initialized with 0x0000) -@param DATA byte for which the CRC is computed; call this on every byte of the sequence -and get the CRC at the end -*/ -#define jpwl_updateCRC16(CRC, DATA) updateCRC16(CRC, DATA) - -/** -Computes the CRC-32, as stated in JPWL specs -@param CRC four bytes containing the CRC value (must be initialized with 0x00000000) -@param DATA byte for which the CRC is computed; call this on every byte of the sequence -and get the CRC at the end -*/ -#define jpwl_updateCRC32(CRC, DATA) updateCRC32(CRC, DATA) - -/** -Computes the minimum between two integers -@param a first integer to compare -@param b second integer to compare -@return returns the minimum integer between a and b -*/ -#ifndef min -#define min(a,b) (((a) < (b)) ? (a) : (b)) -#endif /* min */ - -/*@}*/ - -#endif /* USE_JPWL */ - -#ifdef USE_JPSEC - -/** @defgroup JPSEC JPSEC - JPEG-2000 Part 8 (JPSEC) codestream manager */ -/*@{*/ - -/** -Read the SEC marker (SEcured Codestream) -@param j2k J2K handle -*/ -void j2k_read_sec(opj_j2k_t *j2k); - -/** -Write the SEC marker (SEcured Codestream) -@param j2k J2K handle -*/ -void j2k_write_sec(opj_j2k_t *j2k); - -/** -Read the INSEC marker (SEcured Codestream) -@param j2k J2K handle -*/ -void j2k_read_insec(opj_j2k_t *j2k); - -/*@}*/ - -#endif /* USE_JPSEC */ - -#endif /* __JPWL_H */ - diff --git a/src/lib/openjpwl/jpwl_lib.c b/src/lib/openjpwl/jpwl_lib.c deleted file mode 100644 index 66416a11..00000000 --- a/src/lib/openjpwl/jpwl_lib.c +++ /dev/null @@ -1,1944 +0,0 @@ -/* - * 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) 2005-2006, Dept. of Electronic and Information Engineering, Universita' degli Studi di Perugia, Italy - * 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. - */ - -#ifdef USE_JPWL - -#include "opj_includes.h" -#include - -/** Minimum and maximum values for the double->pfp conversion */ -#define MIN_V1 0.0 -#define MAX_V1 17293822569102704640.0 -#define MIN_V2 0.000030517578125 -#define MAX_V2 131040.0 - -/** conversion between a double precision floating point -number and the corresponding pseudo-floating point used -to represent sensitivity values -@param V the double precision value -@param bytes the number of bytes of the representation -@return the pseudo-floating point value (cast accordingly) -*/ -unsigned short int jpwl_double_to_pfp(double V, int bytes); - -/** conversion between a pseudo-floating point used -to represent sensitivity values and the corresponding -double precision floating point number -@param em the pseudo-floating point value (cast accordingly) -@param bytes the number of bytes of the representation -@return the double precision value -*/ -double jpwl_pfp_to_double(unsigned short int em, int bytes); - -/*-------------------------------------------------------------*/ - -int jpwl_markcomp(const void *arg1, const void *arg2) -{ - /* Compare the two markers' positions */ - double diff = (((jpwl_marker_t *) arg1)->dpos - ((jpwl_marker_t *) arg2)->dpos); - - if (diff == 0.0) { - return (0); - } else if (diff < 0) { - return (-1); - } else { - return (+1); - } -} - -int jpwl_epbs_add(opj_j2k_t *j2k, jpwl_marker_t *jwmarker, int *jwmarker_num, - opj_bool latest, opj_bool packed, opj_bool insideMH, int *idx, int hprot, - double place_pos, int tileno, - unsigned long int pre_len, unsigned long int post_len) -{ - - jpwl_epb_ms_t *epb_mark = NULL; - - int k_pre, k_post, n_pre, n_post; - - unsigned long int L1, L2, dL4, max_postlen, epbs_len = 0; - - /* We find RS(n,k) for EPB parms and pre-data, if any */ - if (insideMH && (*idx == 0)) { - /* First EPB in MH */ - k_pre = 64; - n_pre = 160; - } else if (!insideMH && (*idx == 0)) { - /* First EPB in TH */ - k_pre = 25; - n_pre = 80; - } else { - /* Following EPBs in MH or TH */ - k_pre = 13; - n_pre = 40; - }; - - /* Find lengths, Figs. B3 and B4 */ - /* size of pre data: pre_buf(pre_len) + EPB(2) + Lepb(2) + Depb(1) + LDPepb(4) + Pepb(4) */ - L1 = pre_len + 13; - - /* size of pre-data redundancy */ - /* (redundancy per codeword) * (number of codewords, rounded up) */ - L2 = (n_pre - k_pre) * (unsigned long int) ceil((double) L1 / (double) k_pre); - - /* Find protection type for post data and its associated redundancy field length*/ - if ((hprot == 16) || (hprot == 32)) { - /* there is a CRC for post-data */ - k_post = post_len; - n_post = post_len + (hprot >> 3); - /*L3 = hprot >> 3;*/ /* 2 (CRC-16) or 4 (CRC-32) bytes */ - - } else if ((hprot >= 37) && (hprot <= 128)) { - /* there is a RS for post-data */ - k_post = 32; - n_post = hprot; - - } else { - /* Use predefined codes */ - n_post = n_pre; - k_post = k_pre; - }; - - /* Create the EPB(s) */ - while (post_len > 0) { - - /* maximum postlen in order to respect EPB size - (we use JPWL_MAXIMUM_EPB_ROOM instead of 65535 for keeping room for EPB parms)*/ - /* (message word size) * (number of containable parity words) */ - max_postlen = k_post * (unsigned long int) floor((double) - JPWL_MAXIMUM_EPB_ROOM / (double)(n_post - k_post)); - - /* maximum postlen in order to respect EPB size */ - if (*idx == 0) - /* (we use (JPWL_MAXIMUM_EPB_ROOM - L2) instead of 65535 for keeping room for EPB parms + pre-data) */ - /* (message word size) * (number of containable parity words) */ - { - max_postlen = k_post * (unsigned long int) floor((double)( - JPWL_MAXIMUM_EPB_ROOM - L2) / (double)(n_post - k_post)); - } - - else - /* (we use JPWL_MAXIMUM_EPB_ROOM instead of 65535 for keeping room for EPB parms) */ - /* (message word size) * (number of containable parity words) */ - { - max_postlen = k_post * (unsigned long int) floor((double) - JPWL_MAXIMUM_EPB_ROOM / (double)(n_post - k_post)); - } - - /* null protection case */ - /* the max post length can be as large as the LDPepb field can host */ - if (hprot == 0) { - max_postlen = INT_MAX; - } - - /* length to use */ - dL4 = min(max_postlen, post_len); - - if ((epb_mark = jpwl_epb_create( - j2k, /* this encoder handle */ - latest ? (dL4 < max_postlen) : OPJ_FALSE, /* is it the latest? */ - packed, /* is it packed? */ - tileno, /* we are in TPH */ - *idx, /* its index */ - hprot, /* protection type parameters of following data */ - 0, /* pre-data: nothing for now */ - dL4 /* post-data: the stub computed previously */ - ))) { - - /* Add this marker to the 'insertanda' list */ - if (*jwmarker_num < JPWL_MAX_NO_MARKERS) { - jwmarker[*jwmarker_num].id = J2K_MS_EPB; /* its type */ - jwmarker[*jwmarker_num].m.epbmark = epb_mark; /* the EPB */ - jwmarker[*jwmarker_num].pos = (int) place_pos; /* after SOT */ - jwmarker[*jwmarker_num].dpos = place_pos + 0.0000001 * (double)( - *idx); /* not very first! */ - jwmarker[*jwmarker_num].len = epb_mark->Lepb; /* its length */ - jwmarker[*jwmarker_num].len_ready = OPJ_TRUE; /* ready */ - jwmarker[*jwmarker_num].pos_ready = OPJ_TRUE; /* ready */ - jwmarker[*jwmarker_num].parms_ready = OPJ_TRUE; /* ready */ - jwmarker[*jwmarker_num].data_ready = OPJ_FALSE; /* not ready */ - (*jwmarker_num)++; - } - - /* increment epb index */ - (*idx)++; - - /* decrease postlen */ - post_len -= dL4; - - /* increase the total length of EPBs */ - epbs_len += epb_mark->Lepb + 2; - - } else { - /* ooops, problems */ - opj_event_msg(j2k->cinfo, EVT_ERROR, - "Could not create TPH EPB for UEP in tile %d\n", tileno); - }; - } - - return epbs_len; -} - - -jpwl_epb_ms_t *jpwl_epb_create(opj_j2k_t *j2k, opj_bool latest, opj_bool packed, - int tileno, int idx, int hprot, - unsigned long int pre_len, unsigned long int post_len) -{ - - jpwl_epb_ms_t *epb = NULL; - /*unsigned short int data_len = 0;*/ - unsigned short int L2, L3; - unsigned long int L1, L4; - /*unsigned char *predata_in = NULL;*/ - - opj_bool insideMH = (tileno == -1); - - /* Alloc space */ - if (!(epb = (jpwl_epb_ms_t *) opj_malloc((size_t) 1 * sizeof(jpwl_epb_ms_t)))) { - opj_event_msg(j2k->cinfo, EVT_ERROR, - "Could not allocate room for one EPB MS\n"); - return NULL; - }; - - /* We set RS(n,k) for EPB parms and pre-data, if any */ - if (insideMH && (idx == 0)) { - /* First EPB in MH */ - epb->k_pre = 64; - epb->n_pre = 160; - } else if (!insideMH && (idx == 0)) { - /* First EPB in TH */ - epb->k_pre = 25; - epb->n_pre = 80; - } else { - /* Following EPBs in MH or TH */ - epb->k_pre = 13; - epb->n_pre = 40; - }; - - /* Find lengths, Figs. B3 and B4 */ - /* size of pre data: pre_buf(pre_len) + EPB(2) + Lepb(2) + Depb(1) + LDPepb(4) + Pepb(4) */ - L1 = pre_len + 13; - epb->pre_len = pre_len; - - /* size of pre-data redundancy */ - /* (redundancy per codeword) * (number of codewords, rounded up) */ - L2 = (epb->n_pre - epb->k_pre) * (unsigned short int) ceil((double) L1 / - (double) epb->k_pre); - - /* length of post-data */ - L4 = post_len; - epb->post_len = post_len; - - /* Find protection type for post data and its associated redundancy field length*/ - if ((hprot == 16) || (hprot == 32)) { - /* there is a CRC for post-data */ - epb->Pepb = 0x10000000 | ((unsigned long int) hprot >> - 5); /* 0=CRC-16, 1=CRC-32 */ - epb->k_post = post_len; - epb->n_post = post_len + (hprot >> 3); - /*L3 = hprot >> 3;*/ /* 2 (CRC-16) or 4 (CRC-32) bytes */ - - } else if ((hprot >= 37) && (hprot <= 128)) { - /* there is a RS for post-data */ - epb->Pepb = 0x20000020 | (((unsigned long int) hprot & 0x000000FF) << 8); - epb->k_post = 32; - epb->n_post = hprot; - - } else if (hprot == 1) { - /* Use predefined codes */ - epb->Pepb = (unsigned long int) 0x00000000; - epb->n_post = epb->n_pre; - epb->k_post = epb->k_pre; - - } else if (hprot == 0) { - /* Placeholder EPB: only protects its parameters, no protection method */ - epb->Pepb = (unsigned long int) 0xFFFFFFFF; - epb->n_post = 1; - epb->k_post = 1; - - } else { - opj_event_msg(j2k->cinfo, EVT_ERROR, - "Invalid protection value for EPB h = %d\n", hprot); - return NULL; - } - - epb->hprot = hprot; - - /* (redundancy per codeword) * (number of codewords, rounded up) */ - L3 = (epb->n_post - epb->k_post) * (unsigned short int) ceil((double) L4 / - (double) epb->k_post); - - /* private fields */ - epb->tileno = tileno; - - /* Fill some fields of the EPB */ - - /* total length of the EPB MS (less the EPB marker itself): */ - /* Lepb(2) + Depb(1) + LDPepb(4) + Pepb(4) + pre_redundancy + post-redundancy */ - epb->Lepb = 11 + L2 + L3; - - /* EPB style */ - epb->Depb = ((packed & 0x0001) << 7) | ((latest & 0x0001) << 6) | - (idx & 0x003F); - - /* length of data protected by EPB: */ - epb->LDPepb = L1 + L4; - - return epb; -} - -void jpwl_epb_write(opj_j2k_t *j2k, jpwl_epb_ms_t *epb, unsigned char *buf) -{ - - /* Marker */ - *(buf++) = (unsigned char)(J2K_MS_EPB >> 8); - *(buf++) = (unsigned char)(J2K_MS_EPB >> 0); - - /* Lepb */ - *(buf++) = (unsigned char)(epb->Lepb >> 8); - *(buf++) = (unsigned char)(epb->Lepb >> 0); - - /* Depb */ - *(buf++) = (unsigned char)(epb->Depb >> 0); - - /* LDPepb */ - *(buf++) = (unsigned char)(epb->LDPepb >> 24); - *(buf++) = (unsigned char)(epb->LDPepb >> 16); - *(buf++) = (unsigned char)(epb->LDPepb >> 8); - *(buf++) = (unsigned char)(epb->LDPepb >> 0); - - /* Pepb */ - *(buf++) = (unsigned char)(epb->Pepb >> 24); - *(buf++) = (unsigned char)(epb->Pepb >> 16); - *(buf++) = (unsigned char)(epb->Pepb >> 8); - *(buf++) = (unsigned char)(epb->Pepb >> 0); - - /* Data */ - /*memcpy(buf, epb->data, (size_t) epb->Lepb - 11);*/ - memset(buf, 0, (size_t) epb->Lepb - 11); - - /* update markers struct */ - j2k_add_marker(j2k->cstr_info, J2K_MS_EPB, -1, epb->Lepb + 2); - -} - - -jpwl_epc_ms_t *jpwl_epc_create(opj_j2k_t *j2k, opj_bool esd_on, opj_bool red_on, - opj_bool epb_on, opj_bool info_on) -{ - - jpwl_epc_ms_t *epc = NULL; - - /* Alloc space */ - if (!(epc = (jpwl_epc_ms_t *) opj_malloc((size_t) 1 * sizeof(jpwl_epc_ms_t)))) { - opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not allocate room for EPC MS\n"); - return NULL; - }; - - /* Set the EPC parameters */ - epc->esd_on = esd_on; - epc->epb_on = epb_on; - epc->red_on = red_on; - epc->info_on = info_on; - - /* Fill the EPC fields with default values */ - epc->Lepc = 9; - epc->Pcrc = 0x0000; - epc->DL = 0x00000000; - epc->Pepc = ((j2k->cp->esd_on & 0x0001) << 4) | ((j2k->cp->red_on & 0x0001) << - 5) | - ((j2k->cp->epb_on & 0x0001) << 6) | ((j2k->cp->info_on & 0x0001) << 7); - - return (epc); -} - -opj_bool jpwl_epb_fill(opj_j2k_t *j2k, jpwl_epb_ms_t *epb, unsigned char *buf, - unsigned char *post_buf) -{ - - unsigned long int L1, L2, L3, L4; - int remaining; - unsigned long int P, NN_P; - - /* Operating buffer */ - static unsigned char codeword[NN], *parityword; - - unsigned char *L1_buf, *L2_buf; - /* these ones are static, since we need to keep memory of - the exact place from one call to the other */ - static unsigned char *L3_buf, *L4_buf; - - /* some consistency check */ - if (!buf) { - opj_event_msg(j2k->cinfo, EVT_ERROR, "There is no operating buffer for EPBs\n"); - return OPJ_FALSE; - } - - if (!post_buf && !L4_buf) { - opj_event_msg(j2k->cinfo, EVT_ERROR, - "There is no operating buffer for EPBs data\n"); - return OPJ_FALSE; - } - - /* - * Compute parity bytes on pre-data, ALWAYS present (at least only for EPB parms) - */ - - /* Initialize RS structures */ - P = epb->n_pre - epb->k_pre; - NN_P = NN - P; - memset(codeword, 0, NN); - parityword = codeword + NN_P; - init_rs(NN_P); - - /* pre-data begins pre_len bytes before of EPB buf */ - L1_buf = buf - epb->pre_len; - L1 = epb->pre_len + 13; - - /* redundancy for pre-data begins immediately after EPB parms */ - L2_buf = buf + 13; - L2 = (epb->n_pre - epb->k_pre) * (unsigned short int) ceil((double) L1 / - (double) epb->k_pre); - - /* post-data - the position of L4 buffer can be: - 1) passed as a parameter: in that case use it - 2) null: in that case use the previous (static) one - */ - if (post_buf) { - L4_buf = post_buf; - } - L4 = epb->post_len; - - /* post-data redundancy begins immediately after pre-data redundancy */ - L3_buf = L2_buf + L2; - L3 = (epb->n_post - epb->k_post) * (unsigned short int) ceil((double) L4 / - (double) epb->k_post); - - /* let's check whether EPB length is sufficient to contain all these data */ - if (epb->Lepb < (11 + L2 + L3)) { - opj_event_msg(j2k->cinfo, EVT_ERROR, - "There is no room in EPB data field for writing redundancy data\n"); - } - /*printf("Env. %d, nec. %d (%d + %d)\n", epb->Lepb - 11, L2 + L3, L2, L3);*/ - - /* Compute redundancy of pre-data message words */ - remaining = L1; - while (remaining) { - - /* copy message data into codeword buffer */ - if (remaining < epb->k_pre) { - /* the last message word is zero-padded */ - memset(codeword, 0, NN); - memcpy(codeword, L1_buf, remaining); - L1_buf += remaining; - remaining = 0; - - } else { - memcpy(codeword, L1_buf, epb->k_pre); - L1_buf += epb->k_pre; - remaining -= epb->k_pre; - - } - - /* Encode the buffer and obtain parity bytes */ - if (encode_rs(codeword, parityword)) - opj_event_msg(j2k->cinfo, EVT_WARNING, - "Possible encoding error in codeword @ position #%d\n", - (L1_buf - buf) / epb->k_pre); - - /* copy parity bytes only in redundancy buffer */ - memcpy(L2_buf, parityword, P); - - /* advance parity buffer */ - L2_buf += P; - } - - /* - * Compute parity bytes on post-data, may be absent if there are no data - */ - /*printf("Hprot is %d (tileno=%d, k_pre=%d, n_pre=%d, k_post=%d, n_post=%d, pre_len=%d, post_len=%d)\n", - epb->hprot, epb->tileno, epb->k_pre, epb->n_pre, epb->k_post, epb->n_post, epb->pre_len, - epb->post_len);*/ - if (epb->hprot < 0) { - - /* there should be no EPB */ - - } else if (epb->hprot == 0) { - - /* no protection for the data */ - /* advance anyway */ - L4_buf += epb->post_len; - - } else if (epb->hprot == 16) { - - /* CRC-16 */ - unsigned short int mycrc = 0x0000; - - /* compute the CRC field (excluding itself) */ - remaining = L4; - while (remaining--) { - jpwl_updateCRC16(&mycrc, *(L4_buf++)); - } - - /* write the CRC field */ - *(L3_buf++) = (unsigned char)(mycrc >> 8); - *(L3_buf++) = (unsigned char)(mycrc >> 0); - - } else if (epb->hprot == 32) { - - /* CRC-32 */ - unsigned long int mycrc = 0x00000000; - - /* compute the CRC field (excluding itself) */ - remaining = L4; - while (remaining--) { - jpwl_updateCRC32(&mycrc, *(L4_buf++)); - } - - /* write the CRC field */ - *(L3_buf++) = (unsigned char)(mycrc >> 24); - *(L3_buf++) = (unsigned char)(mycrc >> 16); - *(L3_buf++) = (unsigned char)(mycrc >> 8); - *(L3_buf++) = (unsigned char)(mycrc >> 0); - - } else { - - /* RS */ - - /* Initialize RS structures */ - P = epb->n_post - epb->k_post; - NN_P = NN - P; - memset(codeword, 0, NN); - parityword = codeword + NN_P; - init_rs(NN_P); - - /* Compute redundancy of post-data message words */ - remaining = L4; - while (remaining) { - - /* copy message data into codeword buffer */ - if (remaining < epb->k_post) { - /* the last message word is zero-padded */ - memset(codeword, 0, NN); - memcpy(codeword, L4_buf, remaining); - L4_buf += remaining; - remaining = 0; - - } else { - memcpy(codeword, L4_buf, epb->k_post); - L4_buf += epb->k_post; - remaining -= epb->k_post; - - } - - /* Encode the buffer and obtain parity bytes */ - if (encode_rs(codeword, parityword)) - opj_event_msg(j2k->cinfo, EVT_WARNING, - "Possible encoding error in codeword @ position #%d\n", - (L4_buf - buf) / epb->k_post); - - /* copy parity bytes only in redundancy buffer */ - memcpy(L3_buf, parityword, P); - - /* advance parity buffer */ - L3_buf += P; - } - - } - - return OPJ_TRUE; -} - - -opj_bool jpwl_correct(opj_j2k_t *j2k) -{ - - opj_cio_t *cio = j2k->cio; - opj_bool status; - static opj_bool mh_done = OPJ_FALSE; - int mark_pos, id, len, skips, sot_pos; - unsigned long int Psot = 0; - - /* go back to marker position */ - mark_pos = cio_tell(cio) - 2; - cio_seek(cio, mark_pos); - - if ((j2k->state == J2K_STATE_MHSOC) && !mh_done) { - - int mark_val = 0, skipnum = 0; - - /* - COLOR IMAGE - first thing to do, if we are here, is to look whether - 51 (skipnum) positions ahead there is an EPB, in case of MH - */ - /* - B/W IMAGE - first thing to do, if we are here, is to look whether - 45 (skipnum) positions ahead there is an EPB, in case of MH - */ - /* SIZ SIZ_FIELDS SIZ_COMPS FOLLOWING_MARKER */ - skipnum = 2 + 38 + 3 * j2k->cp->exp_comps + 2; - if ((cio->bp + skipnum) < cio->end) { - - cio_skip(cio, skipnum); - - /* check that you are not going beyond the end of codestream */ - - /* call EPB corrector */ - status = jpwl_epb_correct(j2k, /* J2K decompressor handle */ - cio->bp, /* pointer to EPB in codestream buffer */ - 0, /* EPB type: MH */ - skipnum, /* length of pre-data */ - -1, /* length of post-data: -1 means auto */ - NULL, - NULL - ); - - /* read the marker value */ - mark_val = (*(cio->bp) << 8) | *(cio->bp + 1); - - if (status && (mark_val == J2K_MS_EPB)) { - /* we found it! */ - mh_done = OPJ_TRUE; - return OPJ_TRUE; - } - - /* Disable correction in case of missing or bad head EPB */ - /* We can't do better! */ - /* PATCHED: 2008-01-25 */ - /* MOVED UP: 2008-02-01 */ - if (!status) { - j2k->cp->correct = OPJ_FALSE; - opj_event_msg(j2k->cinfo, EVT_WARNING, - "Couldn't find the MH EPB: disabling JPWL\n"); - } - - } - - } - - if (OPJ_TRUE /*(j2k->state == J2K_STATE_TPHSOT) || (j2k->state == J2K_STATE_TPH)*/) { - /* else, look if 12 positions ahead there is an EPB, in case of TPH */ - cio_seek(cio, mark_pos); - if ((cio->bp + 12) < cio->end) { - - cio_skip(cio, 12); - - /* call EPB corrector */ - status = jpwl_epb_correct(j2k, /* J2K decompressor handle */ - cio->bp, /* pointer to EPB in codestream buffer */ - 1, /* EPB type: TPH */ - 12, /* length of pre-data */ - -1, /* length of post-data: -1 means auto */ - NULL, - NULL - ); - if (status) - /* we found it! */ - { - return OPJ_TRUE; - } - } - } - - return OPJ_FALSE; - - /* for now, don't use this code */ - - /* else, look if here is an EPB, in case of other */ - if (mark_pos > 64) { - /* it cannot stay before the first MH EPB */ - cio_seek(cio, mark_pos); - cio_skip(cio, 0); - - /* call EPB corrector */ - status = jpwl_epb_correct(j2k, /* J2K decompressor handle */ - cio->bp, /* pointer to EPB in codestream buffer */ - 2, /* EPB type: TPH */ - 0, /* length of pre-data */ - -1, /* length of post-data: -1 means auto */ - NULL, - NULL - ); - if (status) - /* we found it! */ - { - return OPJ_TRUE; - } - } - - /* nope, no EPBs probably, or they are so damaged that we can give up */ - return OPJ_FALSE; - - return OPJ_TRUE; - - /* AN ATTEMPT OF PARSER */ - /* NOT USED ACTUALLY */ - - /* go to the beginning of the file */ - cio_seek(cio, 0); - - /* let's begin */ - j2k->state = J2K_STATE_MHSOC; - - /* cycle all over the markers */ - while (cio_tell(cio) < cio->length) { - - /* read the marker */ - mark_pos = cio_tell(cio); - id = cio_read(cio, 2); - - /* details */ - printf("Marker@%d: %X\n", cio_tell(cio) - 2, id); - - /* do an action in response to the read marker */ - switch (id) { - - /* short markers */ - - /* SOC */ - case J2K_MS_SOC: - j2k->state = J2K_STATE_MHSIZ; - len = 0; - skips = 0; - break; - - /* EOC */ - case J2K_MS_EOC: - j2k->state = J2K_STATE_MT; - len = 0; - skips = 0; - break; - - /* particular case of SOD */ - case J2K_MS_SOD: - len = Psot - (mark_pos - sot_pos) - 2; - skips = len; - break; - - /* long markers */ - - /* SOT */ - case J2K_MS_SOT: - j2k->state = J2K_STATE_TPH; - sot_pos = mark_pos; /* position of SOT */ - len = cio_read(cio, 2); /* read the length field */ - cio_skip(cio, 2); /* this field is unnecessary */ - Psot = cio_read(cio, 4); /* tile length */ - skips = len - 8; - break; - - /* remaining */ - case J2K_MS_SIZ: - j2k->state = J2K_STATE_MH; - /* read the length field */ - len = cio_read(cio, 2); - skips = len - 2; - break; - - /* remaining */ - default: - /* read the length field */ - len = cio_read(cio, 2); - skips = len - 2; - break; - - } - - /* skip to marker's end */ - cio_skip(cio, skips); - - } - - -} - -opj_bool jpwl_epb_correct(opj_j2k_t *j2k, unsigned char *buffer, int type, - int pre_len, int post_len, int *conn, - unsigned char **L4_bufp) -{ - - /* Operating buffer */ - unsigned char codeword[NN], *parityword; - - unsigned long int P, NN_P; - unsigned long int L1, L4; - int remaining, n_pre, k_pre, n_post, k_post; - - int status, tt; - - int orig_pos = cio_tell(j2k->cio); - - unsigned char *L1_buf, *L2_buf; - unsigned char *L3_buf, *L4_buf; - - unsigned long int LDPepb, Pepb; - unsigned short int Lepb; - unsigned char Depb; - char str1[25] = ""; - int myconn, errnum = 0; - opj_bool errflag = OPJ_FALSE; - - opj_cio_t *cio = j2k->cio; - - /* check for common errors */ - if (!buffer) { - opj_event_msg(j2k->cinfo, EVT_ERROR, "The EPB pointer is a NULL buffer\n"); - return OPJ_FALSE; - } - - /* set bignesses */ - L1 = pre_len + 13; - - /* pre-data correction */ - switch (type) { - - case 0: - /* MH EPB */ - k_pre = 64; - n_pre = 160; - break; - - case 1: - /* TPH EPB */ - k_pre = 25; - n_pre = 80; - break; - - case 2: - /* other EPBs */ - k_pre = 13; - n_pre = 40; - break; - - case 3: - /* automatic setup */ - opj_event_msg(j2k->cinfo, EVT_ERROR, "Auto. setup not yet implemented\n"); - return OPJ_FALSE; - break; - - default: - /* unknown type */ - opj_event_msg(j2k->cinfo, EVT_ERROR, "Unknown expected EPB type\n"); - return OPJ_FALSE; - break; - - } - - /* Initialize RS structures */ - P = n_pre - k_pre; - NN_P = NN - P; - tt = (int) floor((float) P / 2.0F); /* correction capability of the code */ - memset(codeword, 0, NN); - parityword = codeword + NN_P; - init_rs(NN_P); - - /* Correct pre-data message words */ - L1_buf = buffer - pre_len; - L2_buf = buffer + 13; - remaining = L1; - while (remaining) { - - /* always zero-pad codewords */ - /* (this is required, since after decoding the zeros in the long codeword - could change, and keep unchanged in subsequent calls) */ - memset(codeword, 0, NN); - - /* copy codeword buffer into message bytes */ - if (remaining < k_pre) { - memcpy(codeword, L1_buf, remaining); - } else { - memcpy(codeword, L1_buf, k_pre); - } - - /* copy redundancy buffer in parity bytes */ - memcpy(parityword, L2_buf, P); - - /* Decode the buffer and possibly obtain corrected bytes */ - status = eras_dec_rs(codeword, NULL, 0); - if (status == -1) { - /*if (conn == NULL) - opj_event_msg(j2k->cinfo, EVT_WARNING, - "Possible decoding error in codeword @ position #%d\n", (L1_buf - buffer) / k_pre);*/ - errflag = OPJ_TRUE; - /* we can try to safely get out from the function: - if we are here, either this is not an EPB or the first codeword - is too damaged to be helpful */ - /*return OPJ_FALSE;*/ - - } else if (status == 0) { - /*if (conn == NULL) - opj_event_msg(j2k->cinfo, EVT_INFO, "codeword is correctly decoded\n");*/ - - } else if (status <= tt) { - /* it has corrected 0 <= errs <= tt */ - /*if (conn == NULL) - opj_event_msg(j2k->cinfo, EVT_WARNING, "%d errors corrected in codeword\n", status);*/ - errnum += status; - - } else { - /*if (conn == NULL) - opj_event_msg(j2k->cinfo, EVT_WARNING, "EPB correction capability exceeded\n"); - return OPJ_FALSE;*/ - errflag = OPJ_TRUE; - } - - - /* advance parity buffer */ - if ((status >= 0) && (status <= tt)) - /* copy back corrected parity only if all is OK */ - { - memcpy(L2_buf, parityword, P); - } - L2_buf += P; - - /* advance message buffer */ - if (remaining < k_pre) { - if ((status >= 0) && (status <= tt)) - /* copy back corrected data only if all is OK */ - { - memcpy(L1_buf, codeword, remaining); - } - L1_buf += remaining; - remaining = 0; - - } else { - if ((status >= 0) && (status <= tt)) - /* copy back corrected data only if all is OK */ - { - memcpy(L1_buf, codeword, k_pre); - } - L1_buf += k_pre; - remaining -= k_pre; - - } - } - - /* print summary */ - if (!conn) { - - /*if (errnum) - opj_event_msg(j2k->cinfo, EVT_INFO, "+ %d symbol errors corrected (Ps=%.1e)\n", errnum, - (float) errnum / ((float) n_pre * (float) L1 / (float) k_pre));*/ - if (errflag) { - /*opj_event_msg(j2k->cinfo, EVT_INFO, "+ there were unrecoverable errors\n");*/ - return OPJ_FALSE; - } - - } - - /* presumably, now, EPB parameters are correct */ - /* let's get them */ - - /* Simply read the EPB parameters */ - if (conn) { - cio->bp = buffer; - } - cio_skip(cio, 2); /* the marker */ - Lepb = cio_read(cio, 2); - Depb = cio_read(cio, 1); - LDPepb = cio_read(cio, 4); - Pepb = cio_read(cio, 4); - - /* What does Pepb tells us about the protection method? */ - if (((Pepb & 0xF0000000) >> 28) == 0) { - sprintf(str1, "pred"); /* predefined */ - } else if (((Pepb & 0xF0000000) >> 28) == 1) { - sprintf(str1, "crc-%lu", 16 * ((Pepb & 0x00000001) + 1)); /* CRC mode */ - } else if (((Pepb & 0xF0000000) >> 28) == 2) { - sprintf(str1, "rs(%lu,32)", (Pepb & 0x0000FF00) >> 8); /* RS mode */ - } else if (Pepb == 0xFFFFFFFF) { - sprintf(str1, "nometh"); /* RS mode */ - } else { - sprintf(str1, "unknown"); /* unknown */ - } - - /* Now we write them to screen */ - if (!conn && post_len) - opj_event_msg(j2k->cinfo, EVT_INFO, - "EPB(%d): (%sl, %sp, %u), %lu, %s\n", - cio_tell(cio) - 13, - (Depb & 0x40) ? "" : "n", /* latest EPB or not? */ - (Depb & 0x80) ? "" : "n", /* packed or unpacked EPB? */ - (Depb & 0x3F), /* EPB index value */ - LDPepb, /*length of the data protected by the EPB */ - str1); /* protection method */ - - - /* well, we need to investigate how long is the connected length of packed EPBs */ - myconn = Lepb + 2; - if ((Depb & 0x40) == 0) /* not latest in header */ - jpwl_epb_correct(j2k, /* J2K decompressor handle */ - buffer + Lepb + 2, /* pointer to next EPB in codestream buffer */ - 2, /* EPB type: should be of other type */ - 0, /* only EPB fields */ - 0, /* do not look after */ - &myconn, - NULL - ); - if (conn) { - *conn += myconn; - } - - /*if (!conn) - printf("connected = %d\n", myconn);*/ - - /*cio_seek(j2k->cio, orig_pos); - return OPJ_TRUE;*/ - - /* post-data - the position of L4 buffer is at the end of currently connected EPBs - */ - if (!(L4_bufp)) { - L4_buf = buffer + myconn; - } else if (!(*L4_bufp)) { - L4_buf = buffer + myconn; - } else { - L4_buf = *L4_bufp; - } - if (post_len == -1) { - L4 = LDPepb - pre_len - 13; - } else if (post_len == 0) { - L4 = 0; - } else { - L4 = post_len; - } - - L3_buf = L2_buf; - - /* Do a further check here on the read parameters */ - if (L4 > (unsigned long) cio_numbytesleft(j2k->cio)) - /* overflow */ - { - return OPJ_FALSE; - } - - /* we are ready for decoding the remaining data */ - if (((Pepb & 0xF0000000) >> 28) == 1) { - /* CRC here */ - if ((16 * ((Pepb & 0x00000001) + 1)) == 16) { - - /* CRC-16 */ - unsigned short int mycrc = 0x0000, filecrc = 0x0000; - - /* compute the CRC field */ - remaining = L4; - while (remaining--) { - jpwl_updateCRC16(&mycrc, *(L4_buf++)); - } - - /* read the CRC field */ - filecrc = *(L3_buf++) << 8; - filecrc |= *(L3_buf++); - - /* check the CRC field */ - if (mycrc == filecrc) { - if (conn == NULL) { - opj_event_msg(j2k->cinfo, EVT_INFO, "- CRC is OK\n"); - } - } else { - if (conn == NULL) { - opj_event_msg(j2k->cinfo, EVT_WARNING, "- CRC is KO (r=%d, c=%d)\n", filecrc, - mycrc); - } - errflag = OPJ_TRUE; - } - } - - if ((16 * ((Pepb & 0x00000001) + 1)) == 32) { - - /* CRC-32 */ - unsigned long int mycrc = 0x00000000, filecrc = 0x00000000; - - /* compute the CRC field */ - remaining = L4; - while (remaining--) { - jpwl_updateCRC32(&mycrc, *(L4_buf++)); - } - - /* read the CRC field */ - filecrc = *(L3_buf++) << 24; - filecrc |= *(L3_buf++) << 16; - filecrc |= *(L3_buf++) << 8; - filecrc |= *(L3_buf++); - - /* check the CRC field */ - if (mycrc == filecrc) { - if (conn == NULL) { - opj_event_msg(j2k->cinfo, EVT_INFO, "- CRC is OK\n"); - } - } else { - if (conn == NULL) { - opj_event_msg(j2k->cinfo, EVT_WARNING, "- CRC is KO (r=%d, c=%d)\n", filecrc, - mycrc); - } - errflag = OPJ_TRUE; - } - } - - } else if (Pepb == 0xFFFFFFFF) { - /* no method */ - - /* advance without doing anything */ - remaining = L4; - while (remaining--) { - L4_buf++; - } - - } else if ((((Pepb & 0xF0000000) >> 28) == 2) || - (((Pepb & 0xF0000000) >> 28) == 0)) { - /* RS coding here */ - - if (((Pepb & 0xF0000000) >> 28) == 0) { - - k_post = k_pre; - n_post = n_pre; - - } else { - - k_post = 32; - n_post = (Pepb & 0x0000FF00) >> 8; - } - - /* Initialize RS structures */ - P = n_post - k_post; - NN_P = NN - P; - tt = (int) floor((float) P / 2.0F); /* again, correction capability */ - memset(codeword, 0, NN); - parityword = codeword + NN_P; - init_rs(NN_P); - - /* Correct post-data message words */ - /*L4_buf = buffer + Lepb + 2;*/ - L3_buf = L2_buf; - remaining = L4; - while (remaining) { - - /* always zero-pad codewords */ - /* (this is required, since after decoding the zeros in the long codeword - could change, and keep unchanged in subsequent calls) */ - memset(codeword, 0, NN); - - /* copy codeword buffer into message bytes */ - if (remaining < k_post) { - memcpy(codeword, L4_buf, remaining); - } else { - memcpy(codeword, L4_buf, k_post); - } - - /* copy redundancy buffer in parity bytes */ - memcpy(parityword, L3_buf, P); - - /* Decode the buffer and possibly obtain corrected bytes */ - status = eras_dec_rs(codeword, NULL, 0); - if (status == -1) { - /*if (conn == NULL) - opj_event_msg(j2k->cinfo, EVT_WARNING, - "Possible decoding error in codeword @ position #%d\n", (L4_buf - (buffer + Lepb + 2)) / k_post);*/ - errflag = OPJ_TRUE; - - } else if (status == 0) { - /*if (conn == NULL) - opj_event_msg(j2k->cinfo, EVT_INFO, "codeword is correctly decoded\n");*/ - - } else if (status <= tt) { - /*if (conn == NULL) - opj_event_msg(j2k->cinfo, EVT_WARNING, "%d errors corrected in codeword\n", status);*/ - errnum += status; - - } else { - /*if (conn == NULL) - opj_event_msg(j2k->cinfo, EVT_WARNING, "EPB correction capability exceeded\n"); - return OPJ_FALSE;*/ - errflag = OPJ_TRUE; - } - - - /* advance parity buffer */ - if ((status >= 0) && (status <= tt)) - /* copy back corrected data only if all is OK */ - { - memcpy(L3_buf, parityword, P); - } - L3_buf += P; - - /* advance message buffer */ - if (remaining < k_post) { - if ((status >= 0) && (status <= tt)) - /* copy back corrected data only if all is OK */ - { - memcpy(L4_buf, codeword, remaining); - } - L4_buf += remaining; - remaining = 0; - - } else { - if ((status >= 0) && (status <= tt)) - /* copy back corrected data only if all is OK */ - { - memcpy(L4_buf, codeword, k_post); - } - L4_buf += k_post; - remaining -= k_post; - - } - } - } - - /* give back the L4_buf address */ - if (L4_bufp) { - *L4_bufp = L4_buf; - } - - /* print summary */ - if (!conn) { - - if (errnum) - opj_event_msg(j2k->cinfo, EVT_INFO, "- %d symbol errors corrected (Ps=%.1e)\n", - errnum, - (float) errnum / (float) LDPepb); - if (errflag) { - opj_event_msg(j2k->cinfo, EVT_INFO, "- there were unrecoverable errors\n"); - } - - } - - cio_seek(j2k->cio, orig_pos); - - return OPJ_TRUE; -} - -void jpwl_epc_write(opj_j2k_t *j2k, jpwl_epc_ms_t *epc, unsigned char *buf) -{ - - /* Marker */ - *(buf++) = (unsigned char)(J2K_MS_EPC >> 8); - *(buf++) = (unsigned char)(J2K_MS_EPC >> 0); - - /* Lepc */ - *(buf++) = (unsigned char)(epc->Lepc >> 8); - *(buf++) = (unsigned char)(epc->Lepc >> 0); - - /* Pcrc */ - *(buf++) = (unsigned char)(epc->Pcrc >> 8); - *(buf++) = (unsigned char)(epc->Pcrc >> 0); - - /* DL */ - *(buf++) = (unsigned char)(epc->DL >> 24); - *(buf++) = (unsigned char)(epc->DL >> 16); - *(buf++) = (unsigned char)(epc->DL >> 8); - *(buf++) = (unsigned char)(epc->DL >> 0); - - /* Pepc */ - *(buf++) = (unsigned char)(epc->Pepc >> 0); - - /* Data */ - /*memcpy(buf, epc->data, (size_t) epc->Lepc - 9);*/ - memset(buf, 0, (size_t) epc->Lepc - 9); - - /* update markers struct */ - j2k_add_marker(j2k->cstr_info, J2K_MS_EPC, -1, epc->Lepc + 2); - -} - -int jpwl_esds_add(opj_j2k_t *j2k, jpwl_marker_t *jwmarker, int *jwmarker_num, - int comps, unsigned char addrm, unsigned char ad_size, - unsigned char senst, unsigned char se_size, - double place_pos, int tileno) -{ - - return 0; -} - -jpwl_esd_ms_t *jpwl_esd_create(opj_j2k_t *j2k, int comp, - unsigned char addrm, unsigned char ad_size, - unsigned char senst, int se_size, int tileno, - unsigned long int svalnum, void *sensval) -{ - - jpwl_esd_ms_t *esd = NULL; - - /* Alloc space */ - if (!(esd = (jpwl_esd_ms_t *) opj_malloc((size_t) 1 * sizeof(jpwl_esd_ms_t)))) { - opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not allocate room for ESD MS\n"); - return NULL; - }; - - /* if relative sensitivity, activate byte range mode */ - if (senst == 0) { - addrm = 1; - } - - /* size of sensval's ... */ - if ((ad_size != 0) && (ad_size != 2) && (ad_size != 4)) { - opj_event_msg(j2k->cinfo, EVT_ERROR, - "Address size %d for ESD MS is forbidden\n", ad_size); - return NULL; - } - if ((se_size != 1) && (se_size != 2)) { - opj_event_msg(j2k->cinfo, EVT_ERROR, - "Sensitivity size %d for ESD MS is forbidden\n", se_size); - return NULL; - } - - /* ... depends on the addressing mode */ - switch (addrm) { - - /* packet mode */ - case (0): - ad_size = 0; /* as per the standard */ - esd->sensval_size = (unsigned int)se_size; - break; - - /* byte range */ - case (1): - /* auto sense address size */ - if (ad_size == 0) - /* if there are more than 66% of (2^16 - 1) bytes, switch to 4 bytes - (we keep space for possible EPBs being inserted) */ - { - ad_size = (j2k->cstr_info->codestream_size > (1 * 65535 / 3)) ? 4 : 2; - } - esd->sensval_size = ad_size + ad_size + se_size; - break; - - /* packet range */ - case (2): - /* auto sense address size */ - if (ad_size == 0) - /* if there are more than 2^16 - 1 packets, switch to 4 bytes */ - { - ad_size = (j2k->cstr_info->packno > 65535) ? 4 : 2; - } - esd->sensval_size = ad_size + ad_size + se_size; - break; - - case (3): - opj_event_msg(j2k->cinfo, EVT_ERROR, - "Address mode %d for ESD MS is unimplemented\n", addrm); - return NULL; - - default: - opj_event_msg(j2k->cinfo, EVT_ERROR, - "Address mode %d for ESD MS is forbidden\n", addrm); - return NULL; - } - - /* set or unset sensitivity values */ - if (svalnum <= 0) { - - switch (senst) { - - /* just based on the portions of a codestream */ - case (0): - /* MH + no. of THs + no. of packets */ - svalnum = 1 + (j2k->cstr_info->tw * j2k->cstr_info->th) * - (1 + j2k->cstr_info->packno); - break; - - /* all the ones that are based on the packets */ - default: - if (tileno < 0) - /* MH: all the packets and all the tiles info is written */ - { - svalnum = j2k->cstr_info->tw * j2k->cstr_info->th * j2k->cstr_info->packno; - } else - /* TPH: only that tile info is written */ - { - svalnum = j2k->cstr_info->packno; - } - break; - - } - } - - /* fill private fields */ - esd->senst = senst; - esd->ad_size = ad_size; - esd->se_size = se_size; - esd->addrm = addrm; - esd->svalnum = svalnum; - esd->numcomps = j2k->image->numcomps; - esd->tileno = tileno; - - /* Set the ESD parameters */ - /* length, excluding data field */ - if (esd->numcomps < 257) { - esd->Lesd = 4 + (unsigned short int)(esd->svalnum * esd->sensval_size); - } else { - esd->Lesd = 5 + (unsigned short int)(esd->svalnum * esd->sensval_size); - } - - /* component data field */ - if (comp >= 0) { - esd->Cesd = comp; - } else - /* we are averaging */ - { - esd->Cesd = 0; - } - - /* Pesd field */ - esd->Pesd = 0x00; - esd->Pesd |= (esd->addrm & 0x03) << 6; /* addressing mode */ - esd->Pesd |= (esd->senst & 0x07) << 3; /* sensitivity type */ - esd->Pesd |= ((esd->se_size >> 1) & 0x01) << 2; /* sensitivity size */ - esd->Pesd |= ((esd->ad_size >> 2) & 0x01) << 1; /* addressing size */ - esd->Pesd |= (comp < 0) ? 0x01 : 0x00; /* averaging components */ - - /* if pointer to sensval is NULL, we can fill data field by ourselves */ - if (!sensval) { - - /* old code moved to jpwl_esd_fill() */ - esd->data = NULL; - - } else { - /* we set the data field as the sensitivity values pointer passed to the function */ - esd->data = (unsigned char *) sensval; - } - - return (esd); -} - -opj_bool jpwl_esd_fill(opj_j2k_t *j2k, jpwl_esd_ms_t *esd, unsigned char *buf) -{ - - int i; - unsigned long int vv; - unsigned long int addr1 = 0L, addr2 = 0L; - double dvalue = 0.0, Omax2, tmp, TSE = 0.0, MSE, oldMSE = 0.0, PSNR, - oldPSNR = 0.0; - unsigned short int pfpvalue; - unsigned long int addrmask = 0x00000000; - opj_bool doneMH = OPJ_FALSE, doneTPH = OPJ_FALSE; - - /* sensitivity values in image info are as follows: - - for each tile, distotile is the starting distortion for that tile, sum of all components - - for each packet in a tile, disto is the distortion reduction caused by that packet to that tile - - the TSE for a single tile should be given by distotile - sum(disto) , for all components - - the MSE for a single tile is given by TSE / nbpix , for all components - - the PSNR for a single tile is given by 10*log10( Omax^2 / MSE) , for all components - (Omax is given by 2^bpp - 1 for unsigned images and by 2^(bpp - 1) - 1 for signed images - */ - - /* browse all components and find Omax */ - Omax2 = 0.0; - for (i = 0; i < j2k->image->numcomps; i++) { - tmp = pow(2.0, (double)(j2k->image->comps[i].sgnd ? - (j2k->image->comps[i].bpp - 1) : (j2k->image->comps[i].bpp))) - 1; - if (tmp > Omax2) { - Omax2 = tmp; - } - } - Omax2 = Omax2 * Omax2; - - /* if pointer of esd->data is not null, simply write down all the values byte by byte */ - if (esd->data) { - for (i = 0; i < (int) esd->svalnum; i++) { - *(buf++) = esd->data[i]; - } - return OPJ_TRUE; - } - - /* addressing mask */ - if (esd->ad_size == 2) { - addrmask = 0x0000FFFF; /* two bytes */ - } else { - addrmask = 0xFFFFFFFF; /* four bytes */ - } - - /* set on precise point where sensitivity starts */ - if (esd->numcomps < 257) { - buf += 6; - } else { - buf += 7; - } - - /* let's fill the data fields */ - for (vv = (esd->tileno < 0) ? 0 : (j2k->cstr_info->packno * esd->tileno); - vv < esd->svalnum; vv++) { - - int thistile = vv / j2k->cstr_info->packno, - thispacket = vv % j2k->cstr_info->packno; - - /* skip for the hack some lines below */ - if (thistile == j2k->cstr_info->tw * j2k->cstr_info->th) { - break; - } - - /* starting tile distortion */ - if (thispacket == 0) { - TSE = j2k->cstr_info->tile[thistile].distotile; - oldMSE = TSE / j2k->cstr_info->tile[thistile].numpix; - oldPSNR = 10.0 * log10(Omax2 / oldMSE); - } - - /* TSE */ - TSE -= j2k->cstr_info->tile[thistile].packet[thispacket].disto; - - /* MSE */ - MSE = TSE / j2k->cstr_info->tile[thistile].numpix; - - /* PSNR */ - PSNR = 10.0 * log10(Omax2 / MSE); - - /* fill the address range */ - switch (esd->addrm) { - - /* packet mode */ - case (0): - /* nothing, there is none */ - break; - - /* byte range */ - case (1): - /* start address of packet */ - addr1 = (j2k->cstr_info->tile[thistile].packet[thispacket].start_pos) & - addrmask; - /* end address of packet */ - addr2 = (j2k->cstr_info->tile[thistile].packet[thispacket].end_pos) & addrmask; - break; - - /* packet range */ - case (2): - /* not implemented here */ - opj_event_msg(j2k->cinfo, EVT_WARNING, - "Addressing mode packet_range is not implemented\n"); - break; - - /* unknown addressing method */ - default: - /* not implemented here */ - opj_event_msg(j2k->cinfo, EVT_WARNING, "Unknown addressing mode\n"); - break; - - } - - /* hack for writing relative sensitivity of MH and TPHs */ - if ((esd->senst == 0) && (thispacket == 0)) { - - /* possible MH */ - if ((thistile == 0) && !doneMH) { - /* we have to manage MH addresses */ - addr1 = 0; /* start of MH */ - addr2 = j2k->cstr_info->main_head_end; /* end of MH */ - /* set special dvalue for this MH */ - dvalue = -10.0; - doneMH = OPJ_TRUE; /* don't come here anymore */ - vv--; /* wrap back loop counter */ - - } else if (!doneTPH) { - /* we have to manage TPH addresses */ - addr1 = j2k->cstr_info->tile[thistile].start_pos; - addr2 = j2k->cstr_info->tile[thistile].end_header; - /* set special dvalue for this TPH */ - dvalue = -1.0; - doneTPH = OPJ_TRUE; /* don't come here till the next tile */ - vv--; /* wrap back loop counter */ - } - - } else { - doneTPH = OPJ_FALSE; /* reset TPH counter */ - } - - /* write the addresses to the buffer */ - switch (esd->ad_size) { - - case (0): - /* do nothing */ - break; - - case (2): - /* two bytes */ - *(buf++) = (unsigned char)(addr1 >> 8); - *(buf++) = (unsigned char)(addr1 >> 0); - *(buf++) = (unsigned char)(addr2 >> 8); - *(buf++) = (unsigned char)(addr2 >> 0); - break; - - case (4): - /* four bytes */ - *(buf++) = (unsigned char)(addr1 >> 24); - *(buf++) = (unsigned char)(addr1 >> 16); - *(buf++) = (unsigned char)(addr1 >> 8); - *(buf++) = (unsigned char)(addr1 >> 0); - *(buf++) = (unsigned char)(addr2 >> 24); - *(buf++) = (unsigned char)(addr2 >> 16); - *(buf++) = (unsigned char)(addr2 >> 8); - *(buf++) = (unsigned char)(addr2 >> 0); - break; - - default: - /* do nothing */ - break; - } - - - /* let's fill the value field */ - switch (esd->senst) { - - /* relative sensitivity */ - case (0): - /* we just write down the packet ordering */ - if (dvalue == -10) - /* MH */ - { - dvalue = MAX_V1 + 1000.0; /* this will cause pfpvalue set to 0xFFFF */ - } else if (dvalue == -1) - /* TPH */ - { - dvalue = MAX_V1 + 1000.0; /* this will cause pfpvalue set to 0xFFFF */ - } else - /* packet: first is most important, and then in decreasing order - down to the last, which counts for 1 */ - { - dvalue = jpwl_pfp_to_double((unsigned short)(j2k->cstr_info->packno - - thispacket), esd->se_size); - } - break; - - /* MSE */ - case (1): - /* !!! WRONG: let's put here disto field of packets !!! */ - dvalue = MSE; - break; - - /* MSE reduction */ - case (2): - dvalue = oldMSE - MSE; - oldMSE = MSE; - break; - - /* PSNR */ - case (3): - dvalue = PSNR; - break; - - /* PSNR increase */ - case (4): - dvalue = PSNR - oldPSNR; - oldPSNR = PSNR; - break; - - /* MAXERR */ - case (5): - dvalue = 0.0; - opj_event_msg(j2k->cinfo, EVT_WARNING, - "MAXERR sensitivity mode is not implemented\n"); - break; - - /* TSE */ - case (6): - dvalue = TSE; - break; - - /* reserved */ - case (7): - dvalue = 0.0; - opj_event_msg(j2k->cinfo, EVT_WARNING, - "Reserved sensitivity mode is not implemented\n"); - break; - - default: - dvalue = 0.0; - break; - } - - /* compute the pseudo-floating point value */ - pfpvalue = jpwl_double_to_pfp(dvalue, esd->se_size); - - /* write the pfp value to the buffer */ - switch (esd->se_size) { - - case (1): - /* one byte */ - *(buf++) = (unsigned char)(pfpvalue >> 0); - break; - - case (2): - /* two bytes */ - *(buf++) = (unsigned char)(pfpvalue >> 8); - *(buf++) = (unsigned char)(pfpvalue >> 0); - break; - } - - } - - return OPJ_TRUE; -} - -opj_bool jpwl_esd_write(opj_j2k_t *j2k, jpwl_esd_ms_t *esd, unsigned char *buf) -{ - - /* Marker */ - *(buf++) = (unsigned char)(J2K_MS_ESD >> 8); - *(buf++) = (unsigned char)(J2K_MS_ESD >> 0); - - /* Lesd */ - *(buf++) = (unsigned char)(esd->Lesd >> 8); - *(buf++) = (unsigned char)(esd->Lesd >> 0); - - /* Cesd */ - if (esd->numcomps >= 257) { - *(buf++) = (unsigned char)(esd->Cesd >> 8); - } - *(buf++) = (unsigned char)(esd->Cesd >> 0); - - /* Pesd */ - *(buf++) = (unsigned char)(esd->Pesd >> 0); - - /* Data */ - if (esd->numcomps < 257) { - memset(buf, 0xAA, (size_t) esd->Lesd - 4); - } - /*memcpy(buf, esd->data, (size_t) esd->Lesd - 4);*/ - else { - memset(buf, 0xAA, (size_t) esd->Lesd - 5); - } - /*memcpy(buf, esd->data, (size_t) esd->Lesd - 5);*/ - - /* update markers struct */ - j2k_add_marker(j2k->cstr_info, J2K_MS_ESD, -1, esd->Lesd + 2); - - return OPJ_TRUE; -} - -unsigned short int jpwl_double_to_pfp(double V, int bytes) -{ - - unsigned short int em, e, m; - - switch (bytes) { - - case (1): - - if (V < MIN_V1) { - e = 0x0000; - m = 0x0000; - } else if (V > MAX_V1) { - e = 0x000F; - m = 0x000F; - } else { - e = (unsigned short int)(floor(log(V) * 1.44269504088896) / 4.0); - m = (unsigned short int)(0.5 + (V / (pow(2.0, (double)(4 * e))))); - } - em = ((e & 0x000F) << 4) + (m & 0x000F); - break; - - case (2): - - if (V < MIN_V2) { - e = 0x0000; - m = 0x0000; - } else if (V > MAX_V2) { - e = 0x001F; - m = 0x07FF; - } else { - e = (unsigned short int) floor(log(V) * 1.44269504088896) + 15; - m = (unsigned short int)(0.5 + 2048.0 * ((V / (pow(2.0, - (double) e - 15.0))) - 1.0)); - } - em = ((e & 0x001F) << 11) + (m & 0x07FF); - break; - - default: - - em = 0x0000; - break; - }; - - return em; -} - -double jpwl_pfp_to_double(unsigned short int em, int bytes) -{ - - double V; - - switch (bytes) { - - case 1: - V = (double)(em & 0x0F) * pow(2.0, (double)(em & 0xF0)); - break; - - case 2: - - V = pow(2.0, (double)((em & 0xF800) >> 11) - 15.0) * (1.0 + (double)( - em & 0x07FF) / 2048.0); - break; - - default: - V = 0.0; - break; - - } - - return V; - -} - -opj_bool jpwl_update_info(opj_j2k_t *j2k, jpwl_marker_t *jwmarker, - int jwmarker_num) -{ - - int mm; - unsigned long int addlen; - - opj_codestream_info_t *info = j2k->cstr_info; - int tileno, tpno, packno, numtiles = info->th * info->tw, - numpacks = info->packno; - - if (!j2k || !jwmarker) { - opj_event_msg(j2k->cinfo, EVT_ERROR, - "J2K handle or JPWL markers list badly allocated\n"); - return OPJ_FALSE; - } - - /* main_head_end: how many markers are there before? */ - addlen = 0; - for (mm = 0; mm < jwmarker_num; mm++) - if (jwmarker[mm].pos < (unsigned long int) info->main_head_end) { - addlen += jwmarker[mm].len + 2; - } - info->main_head_end += addlen; - - /* codestream_size: always increment with all markers */ - addlen = 0; - for (mm = 0; mm < jwmarker_num; mm++) { - addlen += jwmarker[mm].len + 2; - } - info->codestream_size += addlen; - - /* navigate through all the tiles */ - for (tileno = 0; tileno < numtiles; tileno++) { - - /* start_pos: increment with markers before SOT */ - addlen = 0; - for (mm = 0; mm < jwmarker_num; mm++) - if (jwmarker[mm].pos < (unsigned long int) info->tile[tileno].start_pos) { - addlen += jwmarker[mm].len + 2; - } - info->tile[tileno].start_pos += addlen; - - /* end_header: increment with markers before of it */ - addlen = 0; - for (mm = 0; mm < jwmarker_num; mm++) - if (jwmarker[mm].pos < (unsigned long int) info->tile[tileno].end_header) { - addlen += jwmarker[mm].len + 2; - } - info->tile[tileno].end_header += addlen; - - /* end_pos: increment with markers before the end of this tile */ - /* code is disabled, since according to JPWL no markers can be beyond TPH */ - addlen = 0; - for (mm = 0; mm < jwmarker_num; mm++) - if (jwmarker[mm].pos < (unsigned long int) info->tile[tileno].end_pos) { - addlen += jwmarker[mm].len + 2; - } - info->tile[tileno].end_pos += addlen; - - /* navigate through all the tile parts */ - for (tpno = 0; tpno < info->tile[tileno].num_tps; tpno++) { - - /* start_pos: increment with markers before SOT */ - addlen = 0; - for (mm = 0; mm < jwmarker_num; mm++) - if (jwmarker[mm].pos < (unsigned long int) - info->tile[tileno].tp[tpno].tp_start_pos) { - addlen += jwmarker[mm].len + 2; - } - info->tile[tileno].tp[tpno].tp_start_pos += addlen; - - /* end_header: increment with markers before of it */ - addlen = 0; - for (mm = 0; mm < jwmarker_num; mm++) - if (jwmarker[mm].pos < (unsigned long int) - info->tile[tileno].tp[tpno].tp_end_header) { - addlen += jwmarker[mm].len + 2; - } - info->tile[tileno].tp[tpno].tp_end_header += addlen; - - /* end_pos: increment with markers before the end of this tile part */ - addlen = 0; - for (mm = 0; mm < jwmarker_num; mm++) - if (jwmarker[mm].pos < (unsigned long int) - info->tile[tileno].tp[tpno].tp_end_pos) { - addlen += jwmarker[mm].len + 2; - } - info->tile[tileno].tp[tpno].tp_end_pos += addlen; - - } - - /* navigate through all the packets in this tile */ - for (packno = 0; packno < numpacks; packno++) { - - /* start_pos: increment with markers before the packet */ - /* disabled for the same reason as before */ - addlen = 0; - for (mm = 0; mm < jwmarker_num; mm++) - if (jwmarker[mm].pos <= (unsigned long int) - info->tile[tileno].packet[packno].start_pos) { - addlen += jwmarker[mm].len + 2; - } - info->tile[tileno].packet[packno].start_pos += addlen; - - /* end_ph_pos: increment with markers before the packet */ - /* disabled for the same reason as before */ - /*addlen = 0; - for (mm = 0; mm < jwmarker_num; mm++) - if (jwmarker[mm].pos < (unsigned long int) info->tile[tileno].packet[packno].end_ph_pos) - addlen += jwmarker[mm].len + 2;*/ - info->tile[tileno].packet[packno].end_ph_pos += addlen; - - /* end_pos: increment if marker is before the end of packet */ - /* disabled for the same reason as before */ - /*addlen = 0; - for (mm = 0; mm < jwmarker_num; mm++) - if (jwmarker[mm].pos < (unsigned long int) info->tile[tileno].packet[packno].end_pos) - addlen += jwmarker[mm].len + 2;*/ - info->tile[tileno].packet[packno].end_pos += addlen; - - } - } - - /* reorder the markers list */ - - return OPJ_TRUE; -} - -#endif /* USE_JPWL */ diff --git a/src/lib/openjpwl/libopenjpwl.pc.cmake.in b/src/lib/openjpwl/libopenjpwl.pc.cmake.in deleted file mode 100644 index b1244197..00000000 --- a/src/lib/openjpwl/libopenjpwl.pc.cmake.in +++ /dev/null @@ -1,15 +0,0 @@ -prefix=@CMAKE_INSTALL_PREFIX@ -bindir=${prefix}/@OPENJPEG_INSTALL_BIN_DIR@ -mandir=${prefix}/@OPENJPEG_INSTALL_MAN_DIR@ -docdir=${prefix}/@OPENJPEG_INSTALL_DOC_DIR@ -libdir=${prefix}/@OPENJPEG_INSTALL_LIB_DIR@ -includedir=${prefix}/@OPENJPEG_INSTALL_INCLUDE_DIR@ - -Name: openjpwl -Description: JPEG2000 Wireless library (Part 11) -URL: http://www.openjpeg.org/ -Version: @OPENJPEG_VERSION@ -Requires: libopenjp2 -Libs: -L${libdir} -lopenjpwl -Libs.private: -lm -Cflags: -I${includedir} diff --git a/src/lib/openjpwl/rs.c b/src/lib/openjpwl/rs.c deleted file mode 100644 index 793fd330..00000000 --- a/src/lib/openjpwl/rs.c +++ /dev/null @@ -1,625 +0,0 @@ -/* -* 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) 2005-2006, Dept. of Electronic and Information Engineering, Universita' degli Studi di Perugia, Italy -* 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. -*/ - -#ifdef USE_JPWL - -/** -@file rs.c -@brief Functions used to compute the Reed-Solomon parity and check of byte arrays - -*/ - -/** - * Reed-Solomon coding and decoding - * Phil Karn (karn@ka9q.ampr.org) September 1996 - * - * This file is derived from the program "new_rs_erasures.c" by Robert - * Morelos-Zaragoza (robert@spectra.eng.hawaii.edu) and Hari Thirumoorthy - * (harit@spectra.eng.hawaii.edu), Aug 1995 - * - * I've made changes to improve performance, clean up the code and make it - * easier to follow. Data is now passed to the encoding and decoding functions - * through arguments rather than in global arrays. The decode function returns - * the number of corrected symbols, or -1 if the word is uncorrectable. - * - * This code supports a symbol size from 2 bits up to 16 bits, - * implying a block size of 3 2-bit symbols (6 bits) up to 65535 - * 16-bit symbols (1,048,560 bits). The code parameters are set in rs.h. - * - * Note that if symbols larger than 8 bits are used, the type of each - * data array element switches from unsigned char to unsigned int. The - * caller must ensure that elements larger than the symbol range are - * not passed to the encoder or decoder. - * - */ -#include -#include -#include "rs.h" - -/* This defines the type used to store an element of the Galois Field - * used by the code. Make sure this is something larger than a char if - * if anything larger than GF(256) is used. - * - * Note: unsigned char will work up to GF(256) but int seems to run - * faster on the Pentium. - */ -typedef int gf; - -/* KK = number of information symbols */ -static int KK; - -/* Primitive polynomials - see Lin & Costello, Appendix A, - * and Lee & Messerschmitt, p. 453. - */ -#if(MM == 2)/* Admittedly silly */ -int Pp[MM + 1] = { 1, 1, 1 }; - -#elif(MM == 3) -/* 1 + x + x^3 */ -int Pp[MM + 1] = { 1, 1, 0, 1 }; - -#elif(MM == 4) -/* 1 + x + x^4 */ -int Pp[MM + 1] = { 1, 1, 0, 0, 1 }; - -#elif(MM == 5) -/* 1 + x^2 + x^5 */ -int Pp[MM + 1] = { 1, 0, 1, 0, 0, 1 }; - -#elif(MM == 6) -/* 1 + x + x^6 */ -int Pp[MM + 1] = { 1, 1, 0, 0, 0, 0, 1 }; - -#elif(MM == 7) -/* 1 + x^3 + x^7 */ -int Pp[MM + 1] = { 1, 0, 0, 1, 0, 0, 0, 1 }; - -#elif(MM == 8) -/* 1+x^2+x^3+x^4+x^8 */ -int Pp[MM + 1] = { 1, 0, 1, 1, 1, 0, 0, 0, 1 }; - -#elif(MM == 9) -/* 1+x^4+x^9 */ -int Pp[MM + 1] = { 1, 0, 0, 0, 1, 0, 0, 0, 0, 1 }; - -#elif(MM == 10) -/* 1+x^3+x^10 */ -int Pp[MM + 1] = { 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1 }; - -#elif(MM == 11) -/* 1+x^2+x^11 */ -int Pp[MM + 1] = { 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 }; - -#elif(MM == 12) -/* 1+x+x^4+x^6+x^12 */ -int Pp[MM + 1] = { 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1 }; - -#elif(MM == 13) -/* 1+x+x^3+x^4+x^13 */ -int Pp[MM + 1] = { 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 }; - -#elif(MM == 14) -/* 1+x+x^6+x^10+x^14 */ -int Pp[MM + 1] = { 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1 }; - -#elif(MM == 15) -/* 1+x+x^15 */ -int Pp[MM + 1] = { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }; - -#elif(MM == 16) -/* 1+x+x^3+x^12+x^16 */ -int Pp[MM + 1] = { 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1 }; - -#else -#error "MM must be in range 2-16" -#endif - -/* Alpha exponent for the first root of the generator polynomial */ -#define B0 0 /* Different from the default 1 */ - -/* index->polynomial form conversion table */ -gf Alpha_to[NN + 1]; - -/* Polynomial->index form conversion table */ -gf Index_of[NN + 1]; - -/* No legal value in index form represents zero, so - * we need a special value for this purpose - */ -#define A0 (NN) - -/* Generator polynomial g(x) - * Degree of g(x) = 2*TT - * has roots @**B0, @**(B0+1), ... ,@^(B0+2*TT-1) - */ -/*gf Gg[NN - KK + 1];*/ -gf Gg[NN - 1]; - -/* Compute x % NN, where NN is 2**MM - 1, - * without a slow divide - */ -static /*inline*/ gf -modnn(int x) -{ - while (x >= NN) { - x -= NN; - x = (x >> MM) + (x & NN); - } - return x; -} - -/*#define min(a,b) ((a) < (b) ? (a) : (b))*/ - -#define CLEAR(a,n) {\ - int ci;\ - for(ci=(n)-1;ci >=0;ci--)\ - (a)[ci] = 0;\ - } - -#define COPY(a,b,n) {\ - int ci;\ - for(ci=(n)-1;ci >=0;ci--)\ - (a)[ci] = (b)[ci];\ - } -#define COPYDOWN(a,b,n) {\ - int ci;\ - for(ci=(n)-1;ci >=0;ci--)\ - (a)[ci] = (b)[ci];\ - } - -void init_rs(int k) -{ - KK = k; - if (KK >= NN) { - printf("KK must be less than 2**MM - 1\n"); - exit(1); - } - - generate_gf(); - gen_poly(); -} - -/* generate GF(2**m) from the irreducible polynomial p(X) in p[0]..p[m] - lookup tables: index->polynomial form alpha_to[] contains j=alpha**i; - polynomial form -> index form index_of[j=alpha**i] = i - alpha=2 is the primitive element of GF(2**m) - HARI's COMMENT: (4/13/94) alpha_to[] can be used as follows: - Let @ represent the primitive element commonly called "alpha" that - is the root of the primitive polynomial p(x). Then in GF(2^m), for any - 0 <= i <= 2^m-2, - @^i = a(0) + a(1) @ + a(2) @^2 + ... + a(m-1) @^(m-1) - where the binary vector (a(0),a(1),a(2),...,a(m-1)) is the representation - of the integer "alpha_to[i]" with a(0) being the LSB and a(m-1) the MSB. Thus for - example the polynomial representation of @^5 would be given by the binary - representation of the integer "alpha_to[5]". - Similarly, index_of[] can be used as follows: - As above, let @ represent the primitive element of GF(2^m) that is - the root of the primitive polynomial p(x). In order to find the power - of @ (alpha) that has the polynomial representation - a(0) + a(1) @ + a(2) @^2 + ... + a(m-1) @^(m-1) - we consider the integer "i" whose binary representation with a(0) being LSB - and a(m-1) MSB is (a(0),a(1),...,a(m-1)) and locate the entry - "index_of[i]". Now, @^index_of[i] is that element whose polynomial - representation is (a(0),a(1),a(2),...,a(m-1)). - NOTE: - The element alpha_to[2^m-1] = 0 always signifying that the - representation of "@^infinity" = 0 is (0,0,0,...,0). - Similarly, the element index_of[0] = A0 always signifying - that the power of alpha which has the polynomial representation - (0,0,...,0) is "infinity". - -*/ - -void -generate_gf(void) -{ - register int i, mask; - - mask = 1; - Alpha_to[MM] = 0; - for (i = 0; i < MM; i++) { - Alpha_to[i] = mask; - Index_of[Alpha_to[i]] = i; - /* If Pp[i] == 1 then, term @^i occurs in poly-repr of @^MM */ - if (Pp[i] != 0) { - Alpha_to[MM] ^= mask; /* Bit-wise EXOR operation */ - } - mask <<= 1; /* single left-shift */ - } - Index_of[Alpha_to[MM]] = MM; - /* - * Have obtained poly-repr of @^MM. Poly-repr of @^(i+1) is given by - * poly-repr of @^i shifted left one-bit and accounting for any @^MM - * term that may occur when poly-repr of @^i is shifted. - */ - mask >>= 1; - for (i = MM + 1; i < NN; i++) { - if (Alpha_to[i - 1] >= mask) { - Alpha_to[i] = Alpha_to[MM] ^ ((Alpha_to[i - 1] ^ mask) << 1); - } else { - Alpha_to[i] = Alpha_to[i - 1] << 1; - } - Index_of[Alpha_to[i]] = i; - } - Index_of[0] = A0; - Alpha_to[NN] = 0; -} - - -/* - * Obtain the generator polynomial of the TT-error correcting, length - * NN=(2**MM -1) Reed Solomon code from the product of (X+@**(B0+i)), i = 0, - * ... ,(2*TT-1) - * - * Examples: - * - * If B0 = 1, TT = 1. deg(g(x)) = 2*TT = 2. - * g(x) = (x+@) (x+@**2) - * - * If B0 = 0, TT = 2. deg(g(x)) = 2*TT = 4. - * g(x) = (x+1) (x+@) (x+@**2) (x+@**3) - */ -void -gen_poly(void) -{ - register int i, j; - - Gg[0] = Alpha_to[B0]; - Gg[1] = 1; /* g(x) = (X+@**B0) initially */ - for (i = 2; i <= NN - KK; i++) { - Gg[i] = 1; - /* - * Below multiply (Gg[0]+Gg[1]*x + ... +Gg[i]x^i) by - * (@**(B0+i-1) + x) - */ - for (j = i - 1; j > 0; j--) - if (Gg[j] != 0) { - Gg[j] = Gg[j - 1] ^ Alpha_to[modnn((Index_of[Gg[j]]) + B0 + i - 1)]; - } else { - Gg[j] = Gg[j - 1]; - } - /* Gg[0] can never be zero */ - Gg[0] = Alpha_to[modnn((Index_of[Gg[0]]) + B0 + i - 1)]; - } - /* convert Gg[] to index form for quicker encoding */ - for (i = 0; i <= NN - KK; i++) { - Gg[i] = Index_of[Gg[i]]; - } -} - - -/* - * take the string of symbols in data[i], i=0..(k-1) and encode - * systematically to produce NN-KK parity symbols in bb[0]..bb[NN-KK-1] data[] - * is input and bb[] is output in polynomial form. Encoding is done by using - * a feedback shift register with appropriate connections specified by the - * elements of Gg[], which was generated above. Codeword is c(X) = - * data(X)*X**(NN-KK)+ b(X) - */ -int -encode_rs(dtype *data, dtype *bb) -{ - register int i, j; - gf feedback; - - CLEAR(bb, NN - KK); - for (i = KK - 1; i >= 0; i--) { -#if (MM != 8) - if (data[i] > NN) { - return -1; /* Illegal symbol */ - } -#endif - feedback = Index_of[data[i] ^ bb[NN - KK - 1]]; - if (feedback != A0) { /* feedback term is non-zero */ - for (j = NN - KK - 1; j > 0; j--) - if (Gg[j] != A0) { - bb[j] = bb[j - 1] ^ Alpha_to[modnn(Gg[j] + feedback)]; - } else { - bb[j] = bb[j - 1]; - } - bb[0] = Alpha_to[modnn(Gg[0] + feedback)]; - } else { - /* feedback term is zero. encoder becomes a - * single-byte shifter */ - for (j = NN - KK - 1; j > 0; j--) { - bb[j] = bb[j - 1]; - } - bb[0] = 0; - } - } - return 0; -} - -/* - * Performs ERRORS+ERASURES decoding of RS codes. If decoding is successful, - * writes the codeword into data[] itself. Otherwise data[] is unaltered. - * - * Return number of symbols corrected, or -1 if codeword is illegal - * or uncorrectable. - * - * First "no_eras" erasures are declared by the calling program. Then, the - * maximum # of errors correctable is t_after_eras = floor((NN-KK-no_eras)/2). - * If the number of channel errors is not greater than "t_after_eras" the - * transmitted codeword will be recovered. Details of algorithm can be found - * in R. Blahut's "Theory ... of Error-Correcting Codes". - */ -int -eras_dec_rs(dtype *data, int *eras_pos, int no_eras) -{ - int deg_lambda, el, deg_omega; - int i, j, r; - gf u, q, tmp, num1, num2, den, discr_r; - gf recd[NN]; - /* Err+Eras Locator poly and syndrome poly */ - /*gf lambda[NN-KK + 1], s[NN-KK + 1]; - gf b[NN-KK + 1], t[NN-KK + 1], omega[NN-KK + 1]; - gf root[NN-KK], reg[NN-KK + 1], loc[NN-KK];*/ - gf lambda[NN + 1], s[NN + 1]; - gf b[NN + 1], t[NN + 1], omega[NN + 1]; - gf root[NN], reg[NN + 1], loc[NN]; - int syn_error, count; - - /* data[] is in polynomial form, copy and convert to index form */ - for (i = NN - 1; i >= 0; i--) { -#if (MM != 8) - if (data[i] > NN) { - return -1; /* Illegal symbol */ - } -#endif - recd[i] = Index_of[data[i]]; - } - /* first form the syndromes; i.e., evaluate recd(x) at roots of g(x) - * namely @**(B0+i), i = 0, ... ,(NN-KK-1) - */ - syn_error = 0; - for (i = 1; i <= NN - KK; i++) { - tmp = 0; - for (j = 0; j < NN; j++) - if (recd[j] != A0) { /* recd[j] in index form */ - tmp ^= Alpha_to[modnn(recd[j] + (B0 + i - 1) * j)]; - } - syn_error |= tmp; /* set flag if non-zero syndrome => - * error */ - /* store syndrome in index form */ - s[i] = Index_of[tmp]; - } - if (!syn_error) { - /* - * if syndrome is zero, data[] is a codeword and there are no - * errors to correct. So return data[] unmodified - */ - return 0; - } - CLEAR(&lambda[1], NN - KK); - lambda[0] = 1; - if (no_eras > 0) { - /* Init lambda to be the erasure locator polynomial */ - lambda[1] = Alpha_to[eras_pos[0]]; - for (i = 1; i < no_eras; i++) { - u = eras_pos[i]; - for (j = i + 1; j > 0; j--) { - tmp = Index_of[lambda[j - 1]]; - if (tmp != A0) { - lambda[j] ^= Alpha_to[modnn(u + tmp)]; - } - } - } -#ifdef ERASURE_DEBUG - /* find roots of the erasure location polynomial */ - for (i = 1; i <= no_eras; i++) { - reg[i] = Index_of[lambda[i]]; - } - count = 0; - for (i = 1; i <= NN; i++) { - q = 1; - for (j = 1; j <= no_eras; j++) - if (reg[j] != A0) { - reg[j] = modnn(reg[j] + j); - q ^= Alpha_to[reg[j]]; - } - if (!q) { - /* store root and error location - * number indices - */ - root[count] = i; - loc[count] = NN - i; - count++; - } - } - if (count != no_eras) { - printf("\n lambda(x) is WRONG\n"); - return -1; - } -#ifndef NO_PRINT - printf("\n Erasure positions as determined by roots of Eras Loc Poly:\n"); - for (i = 0; i < count; i++) { - printf("%d ", loc[i]); - } - printf("\n"); -#endif -#endif - } - for (i = 0; i < NN - KK + 1; i++) { - b[i] = Index_of[lambda[i]]; - } - - /* - * Begin Berlekamp-Massey algorithm to determine error+erasure - * locator polynomial - */ - r = no_eras; - el = no_eras; - while (++r <= NN - KK) { /* r is the step number */ - /* Compute discrepancy at the r-th step in poly-form */ - discr_r = 0; - for (i = 0; i < r; i++) { - if ((lambda[i] != 0) && (s[r - i] != A0)) { - discr_r ^= Alpha_to[modnn(Index_of[lambda[i]] + s[r - i])]; - } - } - discr_r = Index_of[discr_r]; /* Index form */ - if (discr_r == A0) { - /* 2 lines below: B(x) <-- x*B(x) */ - COPYDOWN(&b[1], b, NN - KK); - b[0] = A0; - } else { - /* 7 lines below: T(x) <-- lambda(x) - discr_r*x*b(x) */ - t[0] = lambda[0]; - for (i = 0 ; i < NN - KK; i++) { - if (b[i] != A0) { - t[i + 1] = lambda[i + 1] ^ Alpha_to[modnn(discr_r + b[i])]; - } else { - t[i + 1] = lambda[i + 1]; - } - } - if (2 * el <= r + no_eras - 1) { - el = r + no_eras - el; - /* - * 2 lines below: B(x) <-- inv(discr_r) * - * lambda(x) - */ - for (i = 0; i <= NN - KK; i++) { - b[i] = (lambda[i] == 0) ? A0 : modnn(Index_of[lambda[i]] - discr_r + NN); - } - } else { - /* 2 lines below: B(x) <-- x*B(x) */ - COPYDOWN(&b[1], b, NN - KK); - b[0] = A0; - } - COPY(lambda, t, NN - KK + 1); - } - } - - /* Convert lambda to index form and compute deg(lambda(x)) */ - deg_lambda = 0; - for (i = 0; i < NN - KK + 1; i++) { - lambda[i] = Index_of[lambda[i]]; - if (lambda[i] != A0) { - deg_lambda = i; - } - } - /* - * Find roots of the error+erasure locator polynomial. By Chien - * Search - */ - COPY(®[1], &lambda[1], NN - KK); - count = 0; /* Number of roots of lambda(x) */ - for (i = 1; i <= NN; i++) { - q = 1; - for (j = deg_lambda; j > 0; j--) - if (reg[j] != A0) { - reg[j] = modnn(reg[j] + j); - q ^= Alpha_to[reg[j]]; - } - if (!q) { - /* store root (index-form) and error location number */ - root[count] = i; - loc[count] = NN - i; - count++; - } - } - -#ifdef DEBUG - printf("\n Final error positions:\t"); - for (i = 0; i < count; i++) { - printf("%d ", loc[i]); - } - printf("\n"); -#endif - if (deg_lambda != count) { - /* - * deg(lambda) unequal to number of roots => uncorrectable - * error detected - */ - return -1; - } - /* - * Compute err+eras evaluator poly omega(x) = s(x)*lambda(x) (modulo - * x**(NN-KK)). in index form. Also find deg(omega). - */ - deg_omega = 0; - for (i = 0; i < NN - KK; i++) { - tmp = 0; - j = (deg_lambda < i) ? deg_lambda : i; - for (; j >= 0; j--) { - if ((s[i + 1 - j] != A0) && (lambda[j] != A0)) { - tmp ^= Alpha_to[modnn(s[i + 1 - j] + lambda[j])]; - } - } - if (tmp != 0) { - deg_omega = i; - } - omega[i] = Index_of[tmp]; - } - omega[NN - KK] = A0; - - /* - * Compute error values in poly-form. num1 = omega(inv(X(l))), num2 = - * inv(X(l))**(B0-1) and den = lambda_pr(inv(X(l))) all in poly-form - */ - for (j = count - 1; j >= 0; j--) { - num1 = 0; - for (i = deg_omega; i >= 0; i--) { - if (omega[i] != A0) { - num1 ^= Alpha_to[modnn(omega[i] + i * root[j])]; - } - } - num2 = Alpha_to[modnn(root[j] * (B0 - 1) + NN)]; - den = 0; - - /* lambda[i+1] for i even is the formal derivative lambda_pr of lambda[i] */ - for (i = min(deg_lambda, NN - KK - 1) & ~1; i >= 0; i -= 2) { - if (lambda[i + 1] != A0) { - den ^= Alpha_to[modnn(lambda[i + 1] + i * root[j])]; - } - } - if (den == 0) { -#ifdef DEBUG - printf("\n ERROR: denominator = 0\n"); -#endif - return -1; - } - /* Apply error to data */ - if (num1 != 0) { - data[loc[j]] ^= Alpha_to[modnn(Index_of[num1] + Index_of[num2] + NN - - Index_of[den])]; - } - } - return count; -} - - -#endif /* USE_JPWL */ diff --git a/src/lib/openjpwl/rs.h b/src/lib/openjpwl/rs.h deleted file mode 100644 index 009437cd..00000000 --- a/src/lib/openjpwl/rs.h +++ /dev/null @@ -1,113 +0,0 @@ -/* - * 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) 2005-2006, Dept. of Electronic and Information Engineering, Universita' degli Studi di Perugia, Italy - * 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. - */ - -#ifdef USE_JPWL - -/** -@file rs.h -@brief Functions used to compute Reed-Solomon parity and check of byte arrays - -*/ - -#ifndef __RS_HEADER__ -#define __RS_HEADER__ - -/** Global definitions for Reed-Solomon encoder/decoder - * Phil Karn KA9Q, September 1996 - * - * The parameters MM and KK specify the Reed-Solomon code parameters. - * - * Set MM to be the size of each code symbol in bits. The Reed-Solomon - * block size will then be NN = 2**M - 1 symbols. Supported values are - * defined in rs.c. - * - * Set KK to be the number of data symbols in each block, which must be - * less than the block size. The code will then be able to correct up - * to NN-KK erasures or (NN-KK)/2 errors, or combinations thereof with - * each error counting as two erasures. - */ -#define MM 8 /* RS code over GF(2**MM) - change to suit */ - -/* KK defined in rs.c */ - -#define NN ((1 << MM) - 1) - -#if (MM <= 8) -typedef unsigned char dtype; -#else -typedef unsigned int dtype; -#endif - -/** Initialization function */ -void init_rs(int); - -/** These two functions *must* be called in this order (e.g., - * by init_rs()) before any encoding/decoding - */ -void generate_gf(void); /* Generate Galois Field */ -void gen_poly(void); /* Generate generator polynomial */ - -/** Reed-Solomon encoding - * data[] is the input block, parity symbols are placed in bb[] - * bb[] may lie past the end of the data, e.g., for (255,223): - * encode_rs(&data[0],&data[223]); - */ -int encode_rs(dtype data[], dtype bb[]); - -/** Reed-Solomon erasures-and-errors decoding - * The received block goes into data[], and a list of zero-origin - * erasure positions, if any, goes in eras_pos[] with a count in no_eras. - * - * The decoder corrects the symbols in place, if possible and returns - * the number of corrected symbols. If the codeword is illegal or - * uncorrectible, the data array is unchanged and -1 is returned - */ -int eras_dec_rs(dtype data[], int eras_pos[], int no_eras); - -/** -Computes the minimum between two integers -@param a first integer to compare -@param b second integer to compare -@return returns the minimum integer between a and b -*/ -#ifndef min -#define min(a,b) (((a) < (b)) ? (a) : (b)) -#endif /* min */ - -#endif /* __RS_HEADER__ */ - - -#endif /* USE_JPWL */ diff --git a/src/lib/openmj2/CMakeLists.txt b/src/lib/openmj2/CMakeLists.txt deleted file mode 100644 index 25294b20..00000000 --- a/src/lib/openmj2/CMakeLists.txt +++ /dev/null @@ -1,64 +0,0 @@ -# openmj2: -set(OPENMJ2_LIBRARY_NAME openmj2) - -include_directories( - ${OPENJPEG_BINARY_DIR}/src/lib/openjp2 # opj_config.h - ) - -set(OPENMJ2_SRCS - mj2.c - mj2_convert.c -# FIXME: legacy - j2k_lib.c - cio.c - jp2.c - j2k.c - tcd.c - mct.c - t1.c - t2.c - pi.c - bio.c - mqc.c - tgt.c - dwt.c - event.c - image.c - jpt.c - raw.c - openjpeg.c -) - -# Build the library -if(WIN32) - if(BUILD_SHARED_LIBS) - add_definitions(-DOPJ_EXPORTS) - else() - add_definitions(-DOPJ_STATIC) - endif() -endif() - -# build mj2 lib: -add_library(${OPENMJ2_LIBRARY_NAME} ${OPENMJ2_SRCS}) -# FIXME: We are using an openjpeg 1.5 copy: -#target_link_libraries(${OPENMJ2_LIBRARY_NAME} openjp2) -if(UNIX) - target_link_libraries(${OPENMJ2_LIBRARY_NAME} m) -endif() -set_target_properties(${OPENMJ2_LIBRARY_NAME} PROPERTIES ${OPENJPEG_LIBRARY_PROPERTIES}) -if(NOT ${CMAKE_VERSION} VERSION_LESS "2.8.12") - target_compile_options(${OPENMJ2_LIBRARY_NAME} PRIVATE ${OPENJPEG_LIBRARY_COMPILE_OPTIONS}) -endif() - -# Install library -install(TARGETS ${OPENMJ2_LIBRARY_NAME} - EXPORT OpenMJ2Targets - DESTINATION ${OPENJPEG_INSTALL_LIB_DIR} - COMPONENT Libraries -) - -# Install includes files -#install(FILES mj2.h -# DESTINATION ${OPENJPEG_INSTALL_INCLUDE_DIR}/${subdir} -# COMPONENT Headers -#) diff --git a/src/lib/openmj2/bio.c b/src/lib/openmj2/bio.c deleted file mode 100644 index 91596d8b..00000000 --- a/src/lib/openmj2/bio.c +++ /dev/null @@ -1,206 +0,0 @@ -/* - * The copyright in this software is being made available under the 2-clauses - * BSD License, included below. This software may be subject to other third - * party and contributor rights, including patent rights, and no such rights - * are granted under this license. - * - * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2014, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux - * Copyright (c) 2003-2014, Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include "opj_includes.h" - -/** @defgroup BIO BIO - Individual bit input-output stream */ -/*@{*/ - -/** @name Local static functions */ -/*@{*/ - -/** -Write a bit -@param bio BIO handle -@param b Bit to write (0 or 1) -*/ -static void bio_putbit(opj_bio_t *bio, int b); -/** -Read a bit -@param bio BIO handle -@return Returns the read bit -*/ -static int bio_getbit(opj_bio_t *bio); -/** -Write a byte -@param bio BIO handle -@return Returns 0 if successful, returns 1 otherwise -*/ -static int bio_byteout(opj_bio_t *bio); -/** -Read a byte -@param bio BIO handle -@return Returns 0 if successful, returns 1 otherwise -*/ -static int bio_bytein(opj_bio_t *bio); - -/*@}*/ - -/*@}*/ - -/* -========================================================== - local functions -========================================================== -*/ - -static int bio_byteout(opj_bio_t *bio) -{ - bio->buf = (bio->buf << 8) & 0xffff; - bio->ct = bio->buf == 0xff00 ? 7 : 8; - if (bio->bp >= bio->end) { - return 1; - } - *bio->bp++ = bio->buf >> 8; - return 0; -} - -static int bio_bytein(opj_bio_t *bio) -{ - bio->buf = (bio->buf << 8) & 0xffff; - bio->ct = bio->buf == 0xff00 ? 7 : 8; - if (bio->bp >= bio->end) { - return 1; - } - bio->buf |= *bio->bp++; - return 0; -} - -static void bio_putbit(opj_bio_t *bio, int b) -{ - if (bio->ct == 0) { - bio_byteout(bio); - } - bio->ct--; - bio->buf |= b << bio->ct; -} - -static int bio_getbit(opj_bio_t *bio) -{ - if (bio->ct == 0) { - bio_bytein(bio); - } - bio->ct--; - return (bio->buf >> bio->ct) & 1; -} - -/* -========================================================== - Bit Input/Output interface -========================================================== -*/ - -opj_bio_t* bio_create(void) -{ - opj_bio_t *bio = (opj_bio_t*)opj_malloc(sizeof(opj_bio_t)); - return bio; -} - -void bio_destroy(opj_bio_t *bio) -{ - if (bio) { - opj_free(bio); - } -} - -int bio_numbytes(opj_bio_t *bio) -{ - return (bio->bp - bio->start); -} - -void bio_init_enc(opj_bio_t *bio, unsigned char *bp, int len) -{ - bio->start = bp; - bio->end = bp + len; - bio->bp = bp; - bio->buf = 0; - bio->ct = 8; -} - -void bio_init_dec(opj_bio_t *bio, unsigned char *bp, int len) -{ - bio->start = bp; - bio->end = bp + len; - bio->bp = bp; - bio->buf = 0; - bio->ct = 0; -} - -void bio_write(opj_bio_t *bio, int v, int n) -{ - int i; - for (i = n - 1; i >= 0; i--) { - bio_putbit(bio, (v >> i) & 1); - } -} - -int bio_read(opj_bio_t *bio, int n) -{ - int i, v; - v = 0; - for (i = n - 1; i >= 0; i--) { - v += bio_getbit(bio) << i; - } - return v; -} - -int bio_flush(opj_bio_t *bio) -{ - bio->ct = 0; - if (bio_byteout(bio)) { - return 1; - } - if (bio->ct == 7) { - bio->ct = 0; - if (bio_byteout(bio)) { - return 1; - } - } - return 0; -} - -int bio_inalign(opj_bio_t *bio) -{ - bio->ct = 0; - if ((bio->buf & 0xff) == 0xff) { - if (bio_bytein(bio)) { - return 1; - } - bio->ct = 0; - } - return 0; -} diff --git a/src/lib/openmj2/bio.h b/src/lib/openmj2/bio.h deleted file mode 100644 index 48de33b4..00000000 --- a/src/lib/openmj2/bio.h +++ /dev/null @@ -1,131 +0,0 @@ -/* - * 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 __BIO_H -#define __BIO_H -/** -@file bio.h -@brief Implementation of an individual bit input-output (BIO) - -The functions in BIO.C have for goal to realize an individual bit input - output. -*/ - -/** @defgroup BIO BIO - Individual bit input-output stream */ -/*@{*/ - -/** -Individual bit input-output stream (BIO) -*/ -typedef struct opj_bio { - /** pointer to the start of the buffer */ - unsigned char *start; - /** pointer to the end of the buffer */ - unsigned char *end; - /** pointer to the present position in the buffer */ - unsigned char *bp; - /** temporary place where each byte is read or written */ - unsigned int buf; - /** coder : number of bits free to write. decoder : number of bits read */ - int ct; -} opj_bio_t; - -/** @name Exported functions */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Create a new BIO handle -@return Returns a new BIO handle if successful, returns NULL otherwise -*/ -opj_bio_t* bio_create(void); -/** -Destroy a previously created BIO handle -@param bio BIO handle to destroy -*/ -void bio_destroy(opj_bio_t *bio); -/** -Number of bytes written. -@param bio BIO handle -@return Returns the number of bytes written -*/ -int bio_numbytes(opj_bio_t *bio); -/** -Init encoder -@param bio BIO handle -@param bp Output buffer -@param len Output buffer length -*/ -void bio_init_enc(opj_bio_t *bio, unsigned char *bp, int len); -/** -Init decoder -@param bio BIO handle -@param bp Input buffer -@param len Input buffer length -*/ -void bio_init_dec(opj_bio_t *bio, unsigned char *bp, int len); -/** -Write bits -@param bio BIO handle -@param v Value of bits -@param n Number of bits to write -*/ -void bio_write(opj_bio_t *bio, int v, int n); -/** -Read bits -@param bio BIO handle -@param n Number of bits to read -@return Returns the corresponding read number -*/ -int bio_read(opj_bio_t *bio, int n); -/** -Flush bits -@param bio BIO handle -@return Returns 1 if successful, returns 0 otherwise -*/ -int bio_flush(opj_bio_t *bio); -/** -Passes the ending bits (coming from flushing) -@param bio BIO handle -@return Returns 1 if successful, returns 0 otherwise -*/ -int bio_inalign(opj_bio_t *bio); -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __BIO_H */ - diff --git a/src/lib/openmj2/cio.c b/src/lib/openmj2/cio.c deleted file mode 100644 index 433d3aac..00000000 --- a/src/lib/openmj2/cio.c +++ /dev/null @@ -1,214 +0,0 @@ -/* - * The copyright in this software is being made available under the 2-clauses - * BSD License, included below. This software may be subject to other third - * party and contributor rights, including patent rights, and no such rights - * are granted under this license. - * - * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2014, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux - * Copyright (c) 2003-2014, Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include "opj_includes.h" - -/* ----------------------------------------------------------------------- */ - -opj_cio_t* OPJ_CALLCONV opj_cio_open(opj_common_ptr cinfo, - unsigned char *buffer, int length) -{ - opj_cp_t *cp = NULL; - opj_cio_t *cio = (opj_cio_t*)opj_malloc(sizeof(opj_cio_t)); - if (!cio) { - return NULL; - } - cio->cinfo = cinfo; - if (buffer && length) { - /* wrap a user buffer containing the encoded image */ - cio->openmode = OPJ_STREAM_READ; - cio->buffer = buffer; - cio->length = length; - } else if (!buffer && !length && cinfo) { - /* allocate a buffer for the encoded image */ - cio->openmode = OPJ_STREAM_WRITE; - switch (cinfo->codec_format) { - case CODEC_J2K: - cp = ((opj_j2k_t*)cinfo->j2k_handle)->cp; - break; - case CODEC_JP2: - cp = ((opj_jp2_t*)cinfo->jp2_handle)->j2k->cp; - break; - default: - opj_free(cio); - return NULL; - } - cio->length = (unsigned int)(0.1625 * cp->img_size + - 2000); /* 0.1625 = 1.3/8 and 2000 bytes as a minimum for headers */ - cio->buffer = (unsigned char *)opj_malloc(cio->length); - if (!cio->buffer) { - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error allocating memory for compressed bitstream\n"); - opj_free(cio); - return NULL; - } - } else { - opj_free(cio); - return NULL; - } - - /* Initialize byte IO */ - cio->start = cio->buffer; - cio->end = cio->buffer + cio->length; - cio->bp = cio->buffer; - - return cio; -} - -void OPJ_CALLCONV opj_cio_close(opj_cio_t *cio) -{ - if (cio) { - if (cio->openmode == OPJ_STREAM_WRITE) { - /* destroy the allocated buffer */ - opj_free(cio->buffer); - } - /* destroy the cio */ - opj_free(cio); - } -} - - -/* ----------------------------------------------------------------------- */ - -/* - * Get position in byte stream. - */ -int OPJ_CALLCONV cio_tell(opj_cio_t *cio) -{ - return cio->bp - cio->start; -} - -/* - * Set position in byte stream. - * - * pos : position, in number of bytes, from the beginning of the stream - */ -void OPJ_CALLCONV cio_seek(opj_cio_t *cio, int pos) -{ - cio->bp = cio->start + pos; -} - -/* - * Number of bytes left before the end of the stream. - */ -int cio_numbytesleft(opj_cio_t *cio) -{ - return cio->end - cio->bp; -} - -/* - * Get pointer to the current position in the stream. - */ -unsigned char *cio_getbp(opj_cio_t *cio) -{ - return cio->bp; -} - -/* - * Write a byte. - */ -opj_bool cio_byteout(opj_cio_t *cio, unsigned char v) -{ - if (cio->bp >= cio->end) { - opj_event_msg(cio->cinfo, EVT_ERROR, "write error\n"); - return OPJ_FALSE; - } - *cio->bp++ = v; - return OPJ_TRUE; -} - -/* - * Read a byte. - */ -unsigned char cio_bytein(opj_cio_t *cio) -{ - if (cio->bp >= cio->end) { - opj_event_msg(cio->cinfo, EVT_ERROR, - "read error: passed the end of the codestream (start = %d, current = %d, end = %d\n", - cio->start, cio->bp, cio->end); - return 0; - } - return *cio->bp++; -} - -/* - * Write some bytes. - * - * v : value to write - * n : number of bytes to write - */ -unsigned int OPJ_CALLCONV cio_write(opj_cio_t *cio, unsigned int64 v, int n) -{ - int i; - for (i = n - 1; i >= 0; i--) { - if (!cio_byteout(cio, (unsigned char)((v >> (i << 3)) & 0xff))) { - return 0; - } - } - return n; -} - -/* - * Read some bytes. - * - * n : number of bytes to read - * - * return : value of the n bytes read - */ -unsigned int OPJ_CALLCONV cio_read(opj_cio_t *cio, int n) -{ - int i; - unsigned int v; - v = 0; - for (i = n - 1; i >= 0; i--) { - v += cio_bytein(cio) << (i << 3); - } - return v; -} - -/* - * Skip some bytes. - * - * n : number of bytes to skip - */ -void OPJ_CALLCONV cio_skip(opj_cio_t *cio, int n) -{ - cio->bp += n; -} - - - diff --git a/src/lib/openmj2/cio.h b/src/lib/openmj2/cio.h deleted file mode 100644 index fd0e7166..00000000 --- a/src/lib/openmj2/cio.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - * 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 __CIO_H -#define __CIO_H - -#if defined(_MSC_VER) || defined(__BORLANDC__) -#define int64 __int64 -#else -#define int64 long long -#endif - -/** -@file cio.h -@brief Implementation of a byte input-output process (CIO) - -The functions in CIO.C have for goal to realize a byte input / output process. -*/ - -/** @defgroup CIO CIO - byte input-output stream */ -/*@{*/ - -/** @name Exported functions (see also openjpeg.h) */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Number of bytes left before the end of the stream -@param cio CIO handle -@return Returns the number of bytes before the end of the stream -*/ -int cio_numbytesleft(opj_cio_t *cio); -/** -Get pointer to the current position in the stream -@param cio CIO handle -@return Returns a pointer to the current position -*/ -unsigned char *cio_getbp(opj_cio_t *cio); -/** -Write some bytes -@param cio CIO handle -@param v Value to write -@param n Number of bytes to write -@return Returns the number of bytes written or 0 if an error occurred -*/ -OPJ_API unsigned int OPJ_CALLCONV cio_write(opj_cio_t *cio, unsigned int64 v, - int n); -/** -Read some bytes -@param cio CIO handle -@param n Number of bytes to read -@return Returns the value of the n bytes read -*/ -OPJ_API unsigned int OPJ_CALLCONV cio_read(opj_cio_t *cio, int n); -/** -Skip some bytes -@param cio CIO handle -@param n Number of bytes to skip -*/ -OPJ_API void OPJ_CALLCONV cio_skip(opj_cio_t *cio, int n); -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __CIO_H */ - diff --git a/src/lib/openmj2/dwt.c b/src/lib/openmj2/dwt.c deleted file mode 100644 index 8c7ed137..00000000 --- a/src/lib/openmj2/dwt.c +++ /dev/null @@ -1,965 +0,0 @@ -/* - * 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) 2007, Jonathan Ballard - * Copyright (c) 2007, Callum Lerwick - * 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. - */ - -#ifdef __SSE__ -#include -#endif - -#include "opj_includes.h" - -/** @defgroup DWT DWT - Implementation of a discrete wavelet transform */ -/*@{*/ - -#define WS(i) v->mem[(i)*2] -#define WD(i) v->mem[(1+(i)*2)] - -/** @name Local data structures */ -/*@{*/ - -typedef struct dwt_local { - int* mem; - int dn; - int sn; - int cas; -} dwt_t; - -typedef union { - float f[4]; -} v4; - -typedef struct v4dwt_local { - v4* wavelet ; - int dn ; - int sn ; - int cas ; -} v4dwt_t ; - -static const float dwt_alpha = 1.586134342f; /* 12994 */ -static const float dwt_beta = 0.052980118f; /* 434 */ -static const float dwt_gamma = -0.882911075f; /* -7233 */ -static const float dwt_delta = -0.443506852f; /* -3633 */ - -static const float K = 1.230174105f; /* 10078 */ -/* FIXME: What is this constant? */ -static const float c13318 = 1.625732422f; - -/*@}*/ - -/** -Virtual function type for wavelet transform in 1-D -*/ -typedef void (*DWT1DFN)(dwt_t* v); - -/** @name Local static functions */ -/*@{*/ - -/** -Forward lazy transform (horizontal) -*/ -static void dwt_deinterleave_h(int *a, int *b, int dn, int sn, int cas); -/** -Forward lazy transform (vertical) -*/ -static void dwt_deinterleave_v(int *a, int *b, int dn, int sn, int x, int cas); -/** -Inverse lazy transform (horizontal) -*/ -static void dwt_interleave_h(dwt_t* h, int *a); -/** -Inverse lazy transform (vertical) -*/ -static void dwt_interleave_v(dwt_t* v, int *a, int x); -/** -Forward 5-3 wavelet transform in 1-D -*/ -static void dwt_encode_1(int *a, int dn, int sn, int cas); -/** -Inverse 5-3 wavelet transform in 1-D -*/ -static void dwt_decode_1(dwt_t *v); -/** -Forward 9-7 wavelet transform in 1-D -*/ -static void dwt_encode_1_real(int *a, int dn, int sn, int cas); -/** -Explicit calculation of the Quantization Stepsizes -*/ -static void dwt_encode_stepsize(int stepsize, int numbps, - opj_stepsize_t *bandno_stepsize); -/** -Inverse wavelet transform in 2-D. -*/ -static void dwt_decode_tile(opj_tcd_tilecomp_t* tilec, int i, DWT1DFN fn); - -/*@}*/ - -/*@}*/ - -#define S(i) a[(i)*2] -#define D(i) a[(1+(i)*2)] -#define S_(i) ((i)<0?S(0):((i)>=sn?S(sn-1):S(i))) -#define D_(i) ((i)<0?D(0):((i)>=dn?D(dn-1):D(i))) -/* new */ -#define SS_(i) ((i)<0?S(0):((i)>=dn?S(dn-1):S(i))) -#define DD_(i) ((i)<0?D(0):((i)>=sn?D(sn-1):D(i))) - -/* */ -/* This table contains the norms of the 5-3 wavelets for different bands. */ -/* */ -static const double dwt_norms[4][10] = { - {1.000, 1.500, 2.750, 5.375, 10.68, 21.34, 42.67, 85.33, 170.7, 341.3}, - {1.038, 1.592, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9}, - {1.038, 1.592, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9}, - {.7186, .9218, 1.586, 3.043, 6.019, 12.01, 24.00, 47.97, 95.93} -}; - -/* */ -/* This table contains the norms of the 9-7 wavelets for different bands. */ -/* */ -static const double dwt_norms_real[4][10] = { - {1.000, 1.965, 4.177, 8.403, 16.90, 33.84, 67.69, 135.3, 270.6, 540.9}, - {2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0}, - {2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0}, - {2.080, 3.865, 8.307, 17.18, 34.71, 69.59, 139.3, 278.6, 557.2} -}; - -/* -========================================================== - local functions -========================================================== -*/ - -/* */ -/* Forward lazy transform (horizontal). */ -/* */ -static void dwt_deinterleave_h(int *a, int *b, int dn, int sn, int cas) -{ - int i; - for (i = 0; i < sn; i++) { - b[i] = a[2 * i + cas]; - } - for (i = 0; i < dn; i++) { - b[sn + i] = a[(2 * i + 1 - cas)]; - } -} - -/* */ -/* Forward lazy transform (vertical). */ -/* */ -static void dwt_deinterleave_v(int *a, int *b, int dn, int sn, int x, int cas) -{ - int i; - for (i = 0; i < sn; i++) { - b[i * x] = a[2 * i + cas]; - } - for (i = 0; i < dn; i++) { - b[(sn + i)*x] = a[(2 * i + 1 - cas)]; - } -} - -/* */ -/* Inverse lazy transform (horizontal). */ -/* */ -static void dwt_interleave_h(dwt_t* h, int *a) -{ - int *ai = a; - int *bi = h->mem + h->cas; - int i = h->sn; - while (i--) { - *bi = *(ai++); - bi += 2; - } - ai = a + h->sn; - bi = h->mem + 1 - h->cas; - i = h->dn ; - while (i--) { - *bi = *(ai++); - bi += 2; - } -} - -/* */ -/* Inverse lazy transform (vertical). */ -/* */ -static void dwt_interleave_v(dwt_t* v, int *a, int x) -{ - int *ai = a; - int *bi = v->mem + v->cas; - int i = v->sn; - while (i--) { - *bi = *ai; - bi += 2; - ai += x; - } - ai = a + (v->sn * x); - bi = v->mem + 1 - v->cas; - i = v->dn ; - while (i--) { - *bi = *ai; - bi += 2; - ai += x; - } -} - - -/* */ -/* Forward 5-3 wavelet transform in 1-D. */ -/* */ -static void dwt_encode_1(int *a, int dn, int sn, int cas) -{ - int i; - - if (!cas) { - if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */ - for (i = 0; i < dn; i++) { - D(i) -= (S_(i) + S_(i + 1)) >> 1; - } - for (i = 0; i < sn; i++) { - S(i) += (D_(i - 1) + D_(i) + 2) >> 2; - } - } - } else { - if (!sn && dn == 1) { /* NEW : CASE ONE ELEMENT */ - S(0) *= 2; - } else { - for (i = 0; i < dn; i++) { - S(i) -= (DD_(i) + DD_(i - 1)) >> 1; - } - for (i = 0; i < sn; i++) { - D(i) += (SS_(i) + SS_(i + 1) + 2) >> 2; - } - } - } -} - -/* */ -/* Inverse 5-3 wavelet transform in 1-D. */ -/* */ -static void dwt_decode_1_(int *a, int dn, int sn, int cas) -{ - int i; - - if (!cas) { - if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */ - for (i = 0; i < sn; i++) { - S(i) -= (D_(i - 1) + D_(i) + 2) >> 2; - } - for (i = 0; i < dn; i++) { - D(i) += (S_(i) + S_(i + 1)) >> 1; - } - } - } else { - if (!sn && dn == 1) { /* NEW : CASE ONE ELEMENT */ - S(0) /= 2; - } else { - for (i = 0; i < sn; i++) { - D(i) -= (SS_(i) + SS_(i + 1) + 2) >> 2; - } - for (i = 0; i < dn; i++) { - S(i) += (DD_(i) + DD_(i - 1)) >> 1; - } - } - } -} - -/* */ -/* Inverse 5-3 wavelet transform in 1-D. */ -/* */ -static void dwt_decode_1(dwt_t *v) -{ - dwt_decode_1_(v->mem, v->dn, v->sn, v->cas); -} - -/* */ -/* Forward 9-7 wavelet transform in 1-D. */ -/* */ -static void dwt_encode_1_real(int *a, int dn, int sn, int cas) -{ - int i; - if (!cas) { - if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */ - for (i = 0; i < dn; i++) { - D(i) -= fix_mul(S_(i) + S_(i + 1), 12993); - } - for (i = 0; i < sn; i++) { - S(i) -= fix_mul(D_(i - 1) + D_(i), 434); - } - for (i = 0; i < dn; i++) { - D(i) += fix_mul(S_(i) + S_(i + 1), 7233); - } - for (i = 0; i < sn; i++) { - S(i) += fix_mul(D_(i - 1) + D_(i), 3633); - } - for (i = 0; i < dn; i++) { - D(i) = fix_mul(D(i), 5038); /*5038 */ - } - for (i = 0; i < sn; i++) { - S(i) = fix_mul(S(i), 6659); /*6660 */ - } - } - } else { - if ((sn > 0) || (dn > 1)) { /* NEW : CASE ONE ELEMENT */ - for (i = 0; i < dn; i++) { - S(i) -= fix_mul(DD_(i) + DD_(i - 1), 12993); - } - for (i = 0; i < sn; i++) { - D(i) -= fix_mul(SS_(i) + SS_(i + 1), 434); - } - for (i = 0; i < dn; i++) { - S(i) += fix_mul(DD_(i) + DD_(i - 1), 7233); - } - for (i = 0; i < sn; i++) { - D(i) += fix_mul(SS_(i) + SS_(i + 1), 3633); - } - for (i = 0; i < dn; i++) { - S(i) = fix_mul(S(i), 5038); /*5038 */ - } - for (i = 0; i < sn; i++) { - D(i) = fix_mul(D(i), 6659); /*6660 */ - } - } - } -} - -static void dwt_encode_stepsize(int stepsize, int numbps, - opj_stepsize_t *bandno_stepsize) -{ - int p, n; - p = int_floorlog2(stepsize) - 13; - n = 11 - int_floorlog2(stepsize); - bandno_stepsize->mant = (n < 0 ? stepsize >> -n : stepsize << n) & 0x7ff; - bandno_stepsize->expn = numbps - p; -} - -/* -========================================================== - DWT interface -========================================================== -*/ - -/* */ -/* Forward 5-3 wavelet transform in 2-D. */ -/* */ -void dwt_encode(opj_tcd_tilecomp_t * tilec) -{ - int i, j, k; - int *a = NULL; - int *aj = NULL; - int *bj = NULL; - int w, l; - - w = tilec->x1 - tilec->x0; - l = tilec->numresolutions - 1; - a = tilec->data; - - for (i = 0; i < l; i++) { - int rw; /* width of the resolution level computed */ - int rh; /* height of the resolution level computed */ - int rw1; /* width of the resolution level once lower than computed one */ - int rh1; /* height of the resolution level once lower than computed one */ - int cas_col; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */ - int cas_row; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering */ - int dn, sn; - - rw = tilec->resolutions[l - i].x1 - tilec->resolutions[l - i].x0; - rh = tilec->resolutions[l - i].y1 - tilec->resolutions[l - i].y0; - rw1 = tilec->resolutions[l - i - 1].x1 - tilec->resolutions[l - i - 1].x0; - rh1 = tilec->resolutions[l - i - 1].y1 - tilec->resolutions[l - i - 1].y0; - - cas_row = tilec->resolutions[l - i].x0 % 2; - cas_col = tilec->resolutions[l - i].y0 % 2; - - sn = rh1; - dn = rh - rh1; - bj = (int*)opj_malloc(rh * sizeof(int)); - for (j = 0; j < rw; j++) { - aj = a + j; - for (k = 0; k < rh; k++) { - bj[k] = aj[k * w]; - } - dwt_encode_1(bj, dn, sn, cas_col); - dwt_deinterleave_v(bj, aj, dn, sn, w, cas_col); - } - opj_free(bj); - - sn = rw1; - dn = rw - rw1; - bj = (int*)opj_malloc(rw * sizeof(int)); - for (j = 0; j < rh; j++) { - aj = a + j * w; - for (k = 0; k < rw; k++) { - bj[k] = aj[k]; - } - dwt_encode_1(bj, dn, sn, cas_row); - dwt_deinterleave_h(bj, aj, dn, sn, cas_row); - } - opj_free(bj); - } -} - - -/* */ -/* Inverse 5-3 wavelet transform in 2-D. */ -/* */ -void dwt_decode(opj_tcd_tilecomp_t* tilec, int numres) -{ - dwt_decode_tile(tilec, numres, &dwt_decode_1); -} - - -/* */ -/* Get gain of 5-3 wavelet transform. */ -/* */ -int dwt_getgain(int orient) -{ - if (orient == 0) { - return 0; - } - if (orient == 1 || orient == 2) { - return 1; - } - return 2; -} - -/* */ -/* Get norm of 5-3 wavelet. */ -/* */ -double dwt_getnorm(int level, int orient) -{ - return dwt_norms[orient][level]; -} - -/* */ -/* Forward 9-7 wavelet transform in 2-D. */ -/* */ - -void dwt_encode_real(opj_tcd_tilecomp_t * tilec) -{ - int i, j, k; - int *a = NULL; - int *aj = NULL; - int *bj = NULL; - int w, l; - - w = tilec->x1 - tilec->x0; - l = tilec->numresolutions - 1; - a = tilec->data; - - for (i = 0; i < l; i++) { - int rw; /* width of the resolution level computed */ - int rh; /* height of the resolution level computed */ - int rw1; /* width of the resolution level once lower than computed one */ - int rh1; /* height of the resolution level once lower than computed one */ - int cas_col; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */ - int cas_row; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering */ - int dn, sn; - - rw = tilec->resolutions[l - i].x1 - tilec->resolutions[l - i].x0; - rh = tilec->resolutions[l - i].y1 - tilec->resolutions[l - i].y0; - rw1 = tilec->resolutions[l - i - 1].x1 - tilec->resolutions[l - i - 1].x0; - rh1 = tilec->resolutions[l - i - 1].y1 - tilec->resolutions[l - i - 1].y0; - - cas_row = tilec->resolutions[l - i].x0 % 2; - cas_col = tilec->resolutions[l - i].y0 % 2; - - sn = rh1; - dn = rh - rh1; - bj = (int*)opj_malloc(rh * sizeof(int)); - for (j = 0; j < rw; j++) { - aj = a + j; - for (k = 0; k < rh; k++) { - bj[k] = aj[k * w]; - } - dwt_encode_1_real(bj, dn, sn, cas_col); - dwt_deinterleave_v(bj, aj, dn, sn, w, cas_col); - } - opj_free(bj); - - sn = rw1; - dn = rw - rw1; - bj = (int*)opj_malloc(rw * sizeof(int)); - for (j = 0; j < rh; j++) { - aj = a + j * w; - for (k = 0; k < rw; k++) { - bj[k] = aj[k]; - } - dwt_encode_1_real(bj, dn, sn, cas_row); - dwt_deinterleave_h(bj, aj, dn, sn, cas_row); - } - opj_free(bj); - } -} - - -/* */ -/* Get gain of 9-7 wavelet transform. */ -/* */ -int dwt_getgain_real(int orient) -{ - (void)orient; - return 0; -} - -/* */ -/* Get norm of 9-7 wavelet. */ -/* */ -double dwt_getnorm_real(int level, int orient) -{ - return dwt_norms_real[orient][level]; -} - -void dwt_calc_explicit_stepsizes(opj_tccp_t * tccp, int prec) -{ - int numbands, bandno; - numbands = 3 * tccp->numresolutions - 2; - for (bandno = 0; bandno < numbands; bandno++) { - double stepsize; - int resno, level, orient, gain; - - resno = (bandno == 0) ? 0 : ((bandno - 1) / 3 + 1); - orient = (bandno == 0) ? 0 : ((bandno - 1) % 3 + 1); - level = tccp->numresolutions - 1 - resno; - gain = (tccp->qmfbid == 0) ? 0 : ((orient == 0) ? 0 : (((orient == 1) || - (orient == 2)) ? 1 : 2)); - if (tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) { - stepsize = 1.0; - } else { - double norm = dwt_norms_real[orient][level]; - stepsize = (1 << (gain)) / norm; - } - dwt_encode_stepsize((int) floor(stepsize * 8192.0), prec + gain, - &tccp->stepsizes[bandno]); - } -} - - -/* */ -/* Determine maximum computed resolution level for inverse wavelet transform */ -/* */ -static int dwt_decode_max_resolution(opj_tcd_resolution_t* restrict r, int i) -{ - int mr = 1; - int w; - while (--i) { - r++; - if (mr < (w = r->x1 - r->x0)) { - mr = w ; - } - if (mr < (w = r->y1 - r->y0)) { - mr = w ; - } - } - return mr ; -} - - -/* */ -/* Inverse wavelet transform in 2-D. */ -/* */ -static void dwt_decode_tile(opj_tcd_tilecomp_t* tilec, int numres, - DWT1DFN dwt_1D) -{ - dwt_t h; - dwt_t v; - - opj_tcd_resolution_t* tr = tilec->resolutions; - - int rw = tr->x1 - tr->x0; /* width of the resolution level computed */ - int rh = tr->y1 - tr->y0; /* height of the resolution level computed */ - - int w = tilec->x1 - tilec->x0; - - h.mem = (int*)opj_aligned_malloc(dwt_decode_max_resolution(tr, - numres) * sizeof(int)); - v.mem = h.mem; - - while (--numres) { - int * restrict tiledp = tilec->data; - int j; - - ++tr; - h.sn = rw; - v.sn = rh; - - rw = tr->x1 - tr->x0; - rh = tr->y1 - tr->y0; - - h.dn = rw - h.sn; - h.cas = tr->x0 % 2; - - for (j = 0; j < rh; ++j) { - dwt_interleave_h(&h, &tiledp[j * w]); - (dwt_1D)(&h); - memcpy(&tiledp[j * w], h.mem, rw * sizeof(int)); - } - - v.dn = rh - v.sn; - v.cas = tr->y0 % 2; - - for (j = 0; j < rw; ++j) { - int k; - dwt_interleave_v(&v, &tiledp[j], w); - (dwt_1D)(&v); - for (k = 0; k < rh; ++k) { - tiledp[k * w + j] = v.mem[k]; - } - } - } - opj_aligned_free(h.mem); -} - -static void v4dwt_interleave_h(v4dwt_t* restrict w, float* restrict a, int x, - int size) -{ - float* restrict bi = (float*)(w->wavelet + w->cas); - int count = w->sn; - int i, k; - for (k = 0; k < 2; ++k) { - if (count + 3 * x < size && ((size_t) a & 0x0f) == 0 && - ((size_t) bi & 0x0f) == 0 && (x & 0x0f) == 0) { - /* Fast code path */ - for (i = 0; i < count; ++i) { - int j = i; - bi[i * 8 ] = a[j]; - j += x; - bi[i * 8 + 1] = a[j]; - j += x; - bi[i * 8 + 2] = a[j]; - j += x; - bi[i * 8 + 3] = a[j]; - } - } else { - /* Slow code path */ - for (i = 0; i < count; ++i) { - int j = i; - bi[i * 8 ] = a[j]; - j += x; - if (j > size) { - continue; - } - bi[i * 8 + 1] = a[j]; - j += x; - if (j > size) { - continue; - } - bi[i * 8 + 2] = a[j]; - j += x; - if (j > size) { - continue; - } - bi[i * 8 + 3] = a[j]; - } - } - bi = (float*)(w->wavelet + 1 - w->cas); - a += w->sn; - size -= w->sn; - count = w->dn; - } -} - -static void v4dwt_interleave_v(v4dwt_t* restrict v, float* restrict a, int x) -{ - v4* restrict bi = v->wavelet + v->cas; - int i; - for (i = 0; i < v->sn; ++i) { - memcpy(&bi[i * 2], &a[i * x], 4 * sizeof(float)); - } - a += v->sn * x; - bi = v->wavelet + 1 - v->cas; - for (i = 0; i < v->dn; ++i) { - memcpy(&bi[i * 2], &a[i * x], 4 * sizeof(float)); - } -} - -#ifdef __SSE__ - -static void v4dwt_decode_step1_sse(v4* w, int count, const __m128 c) -{ - __m128* restrict vw = (__m128*) w; - int i; - /* 4x unrolled loop */ - for (i = 0; i < count >> 2; ++i) { - *vw = _mm_mul_ps(*vw, c); - vw += 2; - *vw = _mm_mul_ps(*vw, c); - vw += 2; - *vw = _mm_mul_ps(*vw, c); - vw += 2; - *vw = _mm_mul_ps(*vw, c); - vw += 2; - } - count &= 3; - for (i = 0; i < count; ++i) { - *vw = _mm_mul_ps(*vw, c); - vw += 2; - } -} - -static void v4dwt_decode_step2_sse(v4* l, v4* w, int k, int m, __m128 c) -{ - __m128* restrict vl = (__m128*) l; - __m128* restrict vw = (__m128*) w; - int i; - __m128 tmp1, tmp2, tmp3; - tmp1 = vl[0]; - for (i = 0; i < m; ++i) { - tmp2 = vw[-1]; - tmp3 = vw[ 0]; - vw[-1] = _mm_add_ps(tmp2, _mm_mul_ps(_mm_add_ps(tmp1, tmp3), c)); - tmp1 = tmp3; - vw += 2; - } - vl = vw - 2; - if (m >= k) { - return; - } - c = _mm_add_ps(c, c); - c = _mm_mul_ps(c, vl[0]); - for (; m < k; ++m) { - __m128 tmp = vw[-1]; - vw[-1] = _mm_add_ps(tmp, c); - vw += 2; - } -} - -#else - -static void v4dwt_decode_step1(v4* w, int count, const float c) -{ - float* restrict fw = (float*) w; - int i; - for (i = 0; i < count; ++i) { - float tmp1 = fw[i * 8 ]; - float tmp2 = fw[i * 8 + 1]; - float tmp3 = fw[i * 8 + 2]; - float tmp4 = fw[i * 8 + 3]; - fw[i * 8 ] = tmp1 * c; - fw[i * 8 + 1] = tmp2 * c; - fw[i * 8 + 2] = tmp3 * c; - fw[i * 8 + 3] = tmp4 * c; - } -} - -static void v4dwt_decode_step2(v4* l, v4* w, int k, int m, float c) -{ - float* restrict fl = (float*) l; - float* restrict fw = (float*) w; - int i; - for (i = 0; i < m; ++i) { - float tmp1_1 = fl[0]; - float tmp1_2 = fl[1]; - float tmp1_3 = fl[2]; - float tmp1_4 = fl[3]; - float tmp2_1 = fw[-4]; - float tmp2_2 = fw[-3]; - float tmp2_3 = fw[-2]; - float tmp2_4 = fw[-1]; - float tmp3_1 = fw[0]; - float tmp3_2 = fw[1]; - float tmp3_3 = fw[2]; - float tmp3_4 = fw[3]; - fw[-4] = tmp2_1 + ((tmp1_1 + tmp3_1) * c); - fw[-3] = tmp2_2 + ((tmp1_2 + tmp3_2) * c); - fw[-2] = tmp2_3 + ((tmp1_3 + tmp3_3) * c); - fw[-1] = tmp2_4 + ((tmp1_4 + tmp3_4) * c); - fl = fw; - fw += 8; - } - if (m < k) { - float c1; - float c2; - float c3; - float c4; - c += c; - c1 = fl[0] * c; - c2 = fl[1] * c; - c3 = fl[2] * c; - c4 = fl[3] * c; - for (; m < k; ++m) { - float tmp1 = fw[-4]; - float tmp2 = fw[-3]; - float tmp3 = fw[-2]; - float tmp4 = fw[-1]; - fw[-4] = tmp1 + c1; - fw[-3] = tmp2 + c2; - fw[-2] = tmp3 + c3; - fw[-1] = tmp4 + c4; - fw += 8; - } - } -} - -#endif - -/* */ -/* Inverse 9-7 wavelet transform in 1-D. */ -/* */ -static void v4dwt_decode(v4dwt_t* restrict dwt) -{ - int a, b; - if (dwt->cas == 0) { - if (!((dwt->dn > 0) || (dwt->sn > 1))) { - return; - } - a = 0; - b = 1; - } else { - if (!((dwt->sn > 0) || (dwt->dn > 1))) { - return; - } - a = 1; - b = 0; - } -#ifdef __SSE__ - v4dwt_decode_step1_sse(dwt->wavelet + a, dwt->sn, _mm_set1_ps(K)); - v4dwt_decode_step1_sse(dwt->wavelet + b, dwt->dn, _mm_set1_ps(c13318)); - v4dwt_decode_step2_sse(dwt->wavelet + b, dwt->wavelet + a + 1, dwt->sn, - int_min(dwt->sn, dwt->dn - a), _mm_set1_ps(dwt_delta)); - v4dwt_decode_step2_sse(dwt->wavelet + a, dwt->wavelet + b + 1, dwt->dn, - int_min(dwt->dn, dwt->sn - b), _mm_set1_ps(dwt_gamma)); - v4dwt_decode_step2_sse(dwt->wavelet + b, dwt->wavelet + a + 1, dwt->sn, - int_min(dwt->sn, dwt->dn - a), _mm_set1_ps(dwt_beta)); - v4dwt_decode_step2_sse(dwt->wavelet + a, dwt->wavelet + b + 1, dwt->dn, - int_min(dwt->dn, dwt->sn - b), _mm_set1_ps(dwt_alpha)); -#else - v4dwt_decode_step1(dwt->wavelet + a, dwt->sn, K); - v4dwt_decode_step1(dwt->wavelet + b, dwt->dn, c13318); - v4dwt_decode_step2(dwt->wavelet + b, dwt->wavelet + a + 1, dwt->sn, - int_min(dwt->sn, dwt->dn - a), dwt_delta); - v4dwt_decode_step2(dwt->wavelet + a, dwt->wavelet + b + 1, dwt->dn, - int_min(dwt->dn, dwt->sn - b), dwt_gamma); - v4dwt_decode_step2(dwt->wavelet + b, dwt->wavelet + a + 1, dwt->sn, - int_min(dwt->sn, dwt->dn - a), dwt_beta); - v4dwt_decode_step2(dwt->wavelet + a, dwt->wavelet + b + 1, dwt->dn, - int_min(dwt->dn, dwt->sn - b), dwt_alpha); -#endif -} - -/* */ -/* Inverse 9-7 wavelet transform in 2-D. */ -/* */ -void dwt_decode_real(opj_tcd_tilecomp_t* restrict tilec, int numres) -{ - v4dwt_t h; - v4dwt_t v; - - opj_tcd_resolution_t* res = tilec->resolutions; - - int rw = res->x1 - res->x0; /* width of the resolution level computed */ - int rh = res->y1 - res->y0; /* height of the resolution level computed */ - - int w = tilec->x1 - tilec->x0; - - h.wavelet = (v4*) opj_aligned_malloc((dwt_decode_max_resolution(res, - numres) + 5) * sizeof(v4)); - v.wavelet = h.wavelet; - - while (--numres) { - float * restrict aj = (float*) tilec->data; - int bufsize = (tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0); - int j; - - h.sn = rw; - v.sn = rh; - - ++res; - - rw = res->x1 - res->x0; /* width of the resolution level computed */ - rh = res->y1 - res->y0; /* height of the resolution level computed */ - - h.dn = rw - h.sn; - h.cas = res->x0 % 2; - - for (j = rh; j > 3; j -= 4) { - int k; - v4dwt_interleave_h(&h, aj, w, bufsize); - v4dwt_decode(&h); - for (k = rw; --k >= 0;) { - aj[k ] = h.wavelet[k].f[0]; - aj[k + w ] = h.wavelet[k].f[1]; - aj[k + w * 2] = h.wavelet[k].f[2]; - aj[k + w * 3] = h.wavelet[k].f[3]; - } - aj += w * 4; - bufsize -= w * 4; - } - if (rh & 0x03) { - int k; - j = rh & 0x03; - v4dwt_interleave_h(&h, aj, w, bufsize); - v4dwt_decode(&h); - for (k = rw; --k >= 0;) { - switch (j) { - case 3: - aj[k + w * 2] = h.wavelet[k].f[2]; - case 2: - aj[k + w ] = h.wavelet[k].f[1]; - case 1: - aj[k ] = h.wavelet[k].f[0]; - } - } - } - - v.dn = rh - v.sn; - v.cas = res->y0 % 2; - - aj = (float*) tilec->data; - for (j = rw; j > 3; j -= 4) { - int k; - v4dwt_interleave_v(&v, aj, w); - v4dwt_decode(&v); - for (k = 0; k < rh; ++k) { - memcpy(&aj[k * w], &v.wavelet[k], 4 * sizeof(float)); - } - aj += 4; - } - if (rw & 0x03) { - int k; - j = rw & 0x03; - v4dwt_interleave_v(&v, aj, w); - v4dwt_decode(&v); - for (k = 0; k < rh; ++k) { - memcpy(&aj[k * w], &v.wavelet[k], j * sizeof(float)); - } - } - } - - opj_aligned_free(h.wavelet); -} - diff --git a/src/lib/openmj2/dwt.h b/src/lib/openmj2/dwt.h deleted file mode 100644 index 50bd3d02..00000000 --- a/src/lib/openmj2/dwt.h +++ /dev/null @@ -1,119 +0,0 @@ -/* - * 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 __DWT_H -#define __DWT_H -/** -@file dwt.h -@brief Implementation of a discrete wavelet transform (DWT) - -The functions in DWT.C have for goal to realize forward and inverse discret wavelet -transform with filter 5-3 (reversible) and filter 9-7 (irreversible). The functions in -DWT.C are used by some function in TCD.C. -*/ - -/** @defgroup DWT DWT - Implementation of a discrete wavelet transform */ -/*@{*/ - - -/** @name Exported functions */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Forward 5-3 wavelet transform in 2-D. -Apply a reversible DWT transform to a component of an image. -@param tilec Tile component information (current tile) -*/ -void dwt_encode(opj_tcd_tilecomp_t * tilec); -/** -Inverse 5-3 wavelet transform in 2-D. -Apply a reversible inverse DWT transform to a component of an image. -@param tilec Tile component information (current tile) -@param numres Number of resolution levels to decode -*/ -void dwt_decode(opj_tcd_tilecomp_t* tilec, int numres); -/** -Get the gain of a subband for the reversible 5-3 DWT. -@param orient Number that identifies the subband (0->LL, 1->HL, 2->LH, 3->HH) -@return Returns 0 if orient = 0, returns 1 if orient = 1 or 2, returns 2 otherwise -*/ -int dwt_getgain(int orient); -/** -Get the norm of a wavelet function of a subband at a specified level for the reversible 5-3 DWT. -@param level Level of the wavelet function -@param orient Band of the wavelet function -@return Returns the norm of the wavelet function -*/ -double dwt_getnorm(int level, int orient); -/** -Forward 9-7 wavelet transform in 2-D. -Apply an irreversible DWT transform to a component of an image. -@param tilec Tile component information (current tile) -*/ -void dwt_encode_real(opj_tcd_tilecomp_t * tilec); -/** -Inverse 9-7 wavelet transform in 2-D. -Apply an irreversible inverse DWT transform to a component of an image. -@param tilec Tile component information (current tile) -@param numres Number of resolution levels to decode -*/ -void dwt_decode_real(opj_tcd_tilecomp_t* tilec, int numres); -/** -Get the gain of a subband for the irreversible 9-7 DWT. -@param orient Number that identifies the subband (0->LL, 1->HL, 2->LH, 3->HH) -@return Returns the gain of the 9-7 wavelet transform -*/ -int dwt_getgain_real(int orient); -/** -Get the norm of a wavelet function of a subband at a specified level for the irreversible 9-7 DWT -@param level Level of the wavelet function -@param orient Band of the wavelet function -@return Returns the norm of the 9-7 wavelet -*/ -double dwt_getnorm_real(int level, int orient); -/** -Explicit calculation of the Quantization Stepsizes -@param tccp Tile-component coding parameters -@param prec Precint analyzed -*/ -void dwt_calc_explicit_stepsizes(opj_tccp_t * tccp, int prec); -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __DWT_H */ diff --git a/src/lib/openmj2/event.c b/src/lib/openmj2/event.c deleted file mode 100644 index 7eebfaa4..00000000 --- a/src/lib/openmj2/event.c +++ /dev/null @@ -1,137 +0,0 @@ -/* - * 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) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include "opj_includes.h" - -/* ========================================================== - Utility functions - ==========================================================*/ - -#ifdef OPJ_CODE_NOT_USED -#ifndef _WIN32 -static char* -i2a(unsigned i, char *a, unsigned r) -{ - if (i / r > 0) { - a = i2a(i / r, a, r); - } - *a = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[i % r]; - return a + 1; -} - -/** - Transforms integer i into an ascii string and stores the result in a; - string is encoded in the base indicated by r. - @param i Number to be converted - @param a String result - @param r Base of value; must be in the range 2 - 36 - @return Returns a -*/ -static char * -_itoa(int i, char *a, int r) -{ - r = ((r < 2) || (r > 36)) ? 10 : r; - if (i < 0) { - *a = '-'; - *i2a(-i, a + 1, r) = 0; - } else { - *i2a(i, a, r) = 0; - } - return a; -} - -#endif /* !_WIN32 */ -#endif -/* ----------------------------------------------------------------------- */ - -opj_event_mgr_t* OPJ_CALLCONV opj_set_event_mgr(opj_common_ptr cinfo, - opj_event_mgr_t *event_mgr, void *context) -{ - if (cinfo) { - opj_event_mgr_t *previous = cinfo->event_mgr; - cinfo->event_mgr = event_mgr; - cinfo->client_data = context; - return previous; - } - - return NULL; -} - -opj_bool opj_event_msg(opj_common_ptr cinfo, int event_type, const char *fmt, - ...) -{ -#define MSG_SIZE 512 /* 512 bytes should be more than enough for a short message */ - opj_msg_callback msg_handler = NULL; - - opj_event_mgr_t *event_mgr = cinfo->event_mgr; - if (event_mgr != NULL) { - switch (event_type) { - case EVT_ERROR: - msg_handler = event_mgr->error_handler; - break; - case EVT_WARNING: - msg_handler = event_mgr->warning_handler; - break; - case EVT_INFO: - msg_handler = event_mgr->info_handler; - break; - default: - break; - } - if (msg_handler == NULL) { - return OPJ_FALSE; - } - } else { - return OPJ_FALSE; - } - - if ((fmt != NULL) && (event_mgr != NULL)) { - va_list arg; - int str_length/*, i, j*/; /* UniPG */ - char message[MSG_SIZE]; - /* initialize the optional parameter list */ - va_start(arg, fmt); - /* parse the format string and put the result in 'message' */ - str_length = vsnprintf(message, MSG_SIZE, fmt, arg); /* UniPG */ - /* deinitialize the optional parameter list */ - va_end(arg); - - /* output the message to the user program */ - if (str_length > -1 && str_length < MSG_SIZE) { - msg_handler(message, cinfo->client_data); - } else { - return OPJ_FALSE; - } - } - - return OPJ_TRUE; -} - diff --git a/src/lib/openmj2/event.h b/src/lib/openmj2/event.h deleted file mode 100644 index 64c737c9..00000000 --- a/src/lib/openmj2/event.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * 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) 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 __EVENT_H -#define __EVENT_H -/** -@file event.h -@brief Implementation of a event callback system - -The functions in EVENT.C have for goal to send output messages (errors, warnings, debug) to the user. -*/ - -#define EVT_ERROR 1 /**< Error event type */ -#define EVT_WARNING 2 /**< Warning event type */ -#define EVT_INFO 4 /**< Debug event type */ - -/** @defgroup EVENT EVENT - Implementation of a event callback system */ -/*@{*/ - -/** @name Exported functions (see also openjpeg.h) */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Write formatted data to a string and send the string to a user callback. -@param cinfo Codec context info -@param event_type Event type or callback to use to send the message -@param fmt Format-control string (plus optional arguments) -@return Returns true if successful, returns false otherwise -*/ -opj_bool opj_event_msg(opj_common_ptr cinfo, int event_type, const char *fmt, - ...); -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __EVENT_H */ diff --git a/src/lib/openmj2/fix.h b/src/lib/openmj2/fix.h deleted file mode 100644 index e67b1267..00000000 --- a/src/lib/openmj2/fix.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - * 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 __FIX_H -#define __FIX_H - -#if defined(_MSC_VER) || defined(__BORLANDC__) -#define int64 __int64 -#else -#define int64 long long -#endif - -/** -@file fix.h -@brief Implementation of operations of specific multiplication (FIX) - -The functions in FIX.H have for goal to realize specific multiplication. -*/ - -/** @defgroup FIX FIX - Implementation of operations of specific multiplication */ -/*@{*/ - -/** -Multiply two fixed-precision rational numbers. -@param a -@param b -@return Returns a * b -*/ -static INLINE int fix_mul(int a, int b) -{ - int64 temp = (int64) a * (int64) b ; - temp += temp & 4096; - return (int)(temp >> 13) ; -} - -/*@}*/ - -#endif /* __FIX_H */ diff --git a/src/lib/openmj2/image.c b/src/lib/openmj2/image.c deleted file mode 100644 index 163ab8b8..00000000 --- a/src/lib/openmj2/image.c +++ /dev/null @@ -1,99 +0,0 @@ -/* - * 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) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include "opj_includes.h" - -opj_image_t* opj_image_create0(void) -{ - opj_image_t *image = (opj_image_t*)opj_calloc(1, sizeof(opj_image_t)); - return image; -} - -opj_image_t* OPJ_CALLCONV opj_image_create(int numcmpts, - opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc) -{ - int compno; - opj_image_t *image = NULL; - - image = (opj_image_t*) opj_calloc(1, sizeof(opj_image_t)); - if (image) { - image->color_space = clrspc; - image->numcomps = numcmpts; - /* allocate memory for the per-component information */ - image->comps = (opj_image_comp_t*)opj_malloc(image->numcomps * sizeof( - opj_image_comp_t)); - if (!image->comps) { - fprintf(stderr, "Unable to allocate memory for image.\n"); - opj_image_destroy(image); - return NULL; - } - /* create the individual image components */ - for (compno = 0; compno < numcmpts; compno++) { - opj_image_comp_t *comp = &image->comps[compno]; - comp->dx = cmptparms[compno].dx; - comp->dy = cmptparms[compno].dy; - comp->w = cmptparms[compno].w; - comp->h = cmptparms[compno].h; - comp->x0 = cmptparms[compno].x0; - comp->y0 = cmptparms[compno].y0; - comp->prec = cmptparms[compno].prec; - comp->bpp = cmptparms[compno].bpp; - comp->sgnd = cmptparms[compno].sgnd; - comp->data = (int*) opj_calloc(comp->w * comp->h, sizeof(int)); - if (!comp->data) { - fprintf(stderr, "Unable to allocate memory for image.\n"); - opj_image_destroy(image); - return NULL; - } - } - } - - return image; -} - -void OPJ_CALLCONV opj_image_destroy(opj_image_t *image) -{ - int i; - if (image) { - if (image->comps) { - /* image components */ - for (i = 0; i < image->numcomps; i++) { - opj_image_comp_t *image_comp = &image->comps[i]; - if (image_comp->data) { - opj_free(image_comp->data); - } - } - opj_free(image->comps); - } - opj_free(image); - } -} - diff --git a/src/lib/openmj2/image.h b/src/lib/openmj2/image.h deleted file mode 100644 index dd432150..00000000 --- a/src/lib/openmj2/image.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * 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) 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 __IMAGE_H -#define __IMAGE_H -/** -@file image.h -@brief Implementation of operations on images (IMAGE) - -The functions in IMAGE.C have for goal to realize operations on images. -*/ - -/** @defgroup IMAGE IMAGE - Implementation of operations on images */ -/*@{*/ - -/** -Create an empty image -@todo this function should be removed -@return returns an empty image if successful, returns NULL otherwise -*/ -opj_image_t* opj_image_create0(void); - -/*@}*/ - -#endif /* __IMAGE_H */ - diff --git a/src/lib/openmj2/int.h b/src/lib/openmj2/int.h deleted file mode 100644 index 641fc7b4..00000000 --- a/src/lib/openmj2/int.h +++ /dev/null @@ -1,135 +0,0 @@ -/* - * 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 __INT_H -#define __INT_H -/** -@file int.h -@brief Implementation of operations on integers (INT) - -The functions in INT.H have for goal to realize operations on integers. -*/ - -/** @defgroup INT INT - Implementation of operations on integers */ -/*@{*/ - -/** @name Exported functions (see also openjpeg.h) */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Get the minimum of two integers -@return Returns a if a < b else b -*/ -static INLINE int int_min(int a, int b) -{ - return a < b ? a : b; -} -/** -Get the maximum of two integers -@return Returns a if a > b else b -*/ -static INLINE int int_max(int a, int b) -{ - return (a > b) ? a : b; -} -/** -Clamp an integer inside an interval -@return -
    -
  • Returns a if (min < a < max) -
  • Returns max if (a > max) -
  • Returns min if (a < min) -
-*/ -static INLINE int int_clamp(int a, int min, int max) -{ - if (a < min) { - return min; - } - if (a > max) { - return max; - } - return a; -} -/** -@return Get absolute value of integer -*/ -static INLINE int int_abs(int a) -{ - return a < 0 ? -a : a; -} -/** -Divide an integer and round upwards -@return Returns a divided by b -*/ -static INLINE int int_ceildiv(int a, int b) -{ - return (a + b - 1) / b; -} -/** -Divide an integer by a power of 2 and round upwards -@return Returns a divided by 2^b -*/ -static INLINE int int_ceildivpow2(int a, int b) -{ - return (a + (1 << b) - 1) >> b; -} -/** -Divide an integer by a power of 2 and round downwards -@return Returns a divided by 2^b -*/ -static INLINE int int_floordivpow2(int a, int b) -{ - return a >> b; -} -/** -Get logarithm of an integer and round downwards -@return Returns log2(a) -*/ -static INLINE int int_floorlog2(int a) -{ - int l; - for (l = 0; a > 1; l++) { - a >>= 1; - } - return l; -} -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif diff --git a/src/lib/openmj2/j2k.c b/src/lib/openmj2/j2k.c deleted file mode 100644 index daf13f80..00000000 --- a/src/lib/openmj2/j2k.c +++ /dev/null @@ -1,2778 +0,0 @@ -/* - * The copyright in this software is being made available under the 2-clauses - * BSD License, included below. This software may be subject to other third - * party and contributor rights, including patent rights, and no such rights - * are granted under this license. - * - * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2014, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux - * Copyright (c) 2003-2014, Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * Copyright (c) 2006-2007, Parvatha Elangovan - * Copyright (c) 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. - */ - -#include "opj_includes.h" - -/** @defgroup J2K J2K - JPEG-2000 codestream reader/writer */ -/*@{*/ - -/** @name Local static functions */ -/*@{*/ - -/** -Write the SOC marker (Start Of Codestream) -@param j2k J2K handle -*/ -static void j2k_write_soc(opj_j2k_t *j2k); -/** -Read the SOC marker (Start of Codestream) -@param j2k J2K handle -*/ -static void j2k_read_soc(opj_j2k_t *j2k); -/** -Write the SIZ marker (image and tile size) -@param j2k J2K handle -*/ -static void j2k_write_siz(opj_j2k_t *j2k); -/** -Read the SIZ marker (image and tile size) -@param j2k J2K handle -*/ -static void j2k_read_siz(opj_j2k_t *j2k); -/** -Write the COM marker (comment) -@param j2k J2K handle -*/ -static void j2k_write_com(opj_j2k_t *j2k); -/** -Read the COM marker (comment) -@param j2k J2K handle -*/ -static void j2k_read_com(opj_j2k_t *j2k); -/** -Write the value concerning the specified component in the marker COD and COC -@param j2k J2K handle -@param compno Number of the component concerned by the information written -*/ -static void j2k_write_cox(opj_j2k_t *j2k, int compno); -/** -Read the value concerning the specified component in the marker COD and COC -@param j2k J2K handle -@param compno Number of the component concerned by the information read -*/ -static void j2k_read_cox(opj_j2k_t *j2k, int compno); -/** -Write the COD marker (coding style default) -@param j2k J2K handle -*/ -static void j2k_write_cod(opj_j2k_t *j2k); -/** -Read the COD marker (coding style default) -@param j2k J2K handle -*/ -static void j2k_read_cod(opj_j2k_t *j2k); -/** -Write the COC marker (coding style component) -@param j2k J2K handle -@param compno Number of the component concerned by the information written -*/ -static void j2k_write_coc(opj_j2k_t *j2k, int compno); -/** -Read the COC marker (coding style component) -@param j2k J2K handle -*/ -static void j2k_read_coc(opj_j2k_t *j2k); -/** -Write the value concerning the specified component in the marker QCD and QCC -@param j2k J2K handle -@param compno Number of the component concerned by the information written -*/ -static void j2k_write_qcx(opj_j2k_t *j2k, int compno); -/** -Read the value concerning the specified component in the marker QCD and QCC -@param j2k J2K handle -@param compno Number of the component concern by the information read -@param len Length of the information in the QCX part of the marker QCD/QCC -*/ -static void j2k_read_qcx(opj_j2k_t *j2k, int compno, int len); -/** -Write the QCD marker (quantization default) -@param j2k J2K handle -*/ -static void j2k_write_qcd(opj_j2k_t *j2k); -/** -Read the QCD marker (quantization default) -@param j2k J2K handle -*/ -static void j2k_read_qcd(opj_j2k_t *j2k); -/** -Write the QCC marker (quantization component) -@param j2k J2K handle -@param compno Number of the component concerned by the information written -*/ -static void j2k_write_qcc(opj_j2k_t *j2k, int compno); -/** -Read the QCC marker (quantization component) -@param j2k J2K handle -*/ -static void j2k_read_qcc(opj_j2k_t *j2k); -/** -Write the POC marker (progression order change) -@param j2k J2K handle -*/ -static void j2k_write_poc(opj_j2k_t *j2k); -/** -Read the POC marker (progression order change) -@param j2k J2K handle -*/ -static void j2k_read_poc(opj_j2k_t *j2k); -/** -Read the CRG marker (component registration) -@param j2k J2K handle -*/ -static void j2k_read_crg(opj_j2k_t *j2k); -/** -Read the TLM marker (tile-part lengths) -@param j2k J2K handle -*/ -static void j2k_read_tlm(opj_j2k_t *j2k); -/** -Read the PLM marker (packet length, main header) -@param j2k J2K handle -*/ -static void j2k_read_plm(opj_j2k_t *j2k); -/** -Read the PLT marker (packet length, tile-part header) -@param j2k J2K handle -*/ -static void j2k_read_plt(opj_j2k_t *j2k); -/** -Read the PPM marker (packet packet headers, main header) -@param j2k J2K handle -*/ -static void j2k_read_ppm(opj_j2k_t *j2k); -/** -Read the PPT marker (packet packet headers, tile-part header) -@param j2k J2K handle -*/ -static void j2k_read_ppt(opj_j2k_t *j2k); -/** -Write the TLM marker (Mainheader) -@param j2k J2K handle -*/ -static void j2k_write_tlm(opj_j2k_t *j2k); -/** -Write the SOT marker (start of tile-part) -@param j2k J2K handle -*/ -static void j2k_write_sot(opj_j2k_t *j2k); -/** -Read the SOT marker (start of tile-part) -@param j2k J2K handle -*/ -static void j2k_read_sot(opj_j2k_t *j2k); -/** -Write the SOD marker (start of data) -@param j2k J2K handle -@param tile_coder Pointer to a TCD handle -*/ -static void j2k_write_sod(opj_j2k_t *j2k, void *tile_coder); -/** -Read the SOD marker (start of data) -@param j2k J2K handle -*/ -static void j2k_read_sod(opj_j2k_t *j2k); -/** -Write the RGN marker (region-of-interest) -@param j2k J2K handle -@param compno Number of the component concerned by the information written -@param tileno Number of the tile concerned by the information written -*/ -static void j2k_write_rgn(opj_j2k_t *j2k, int compno, int tileno); -/** -Read the RGN marker (region-of-interest) -@param j2k J2K handle -*/ -static void j2k_read_rgn(opj_j2k_t *j2k); -/** -Write the EOC marker (end of codestream) -@param j2k J2K handle -*/ -static void j2k_write_eoc(opj_j2k_t *j2k); -/** -Read the EOC marker (end of codestream) -@param j2k J2K handle -*/ -static void j2k_read_eoc(opj_j2k_t *j2k); -/** -Read an unknown marker -@param j2k J2K handle -*/ -static void j2k_read_unk(opj_j2k_t *j2k); -/** -Add main header marker information -@param cstr_info Codestream information structure -@param type marker type -@param pos byte offset of marker segment -@param len length of marker segment - */ -static void j2k_add_mhmarker(opj_codestream_info_t *cstr_info, - unsigned short int type, int pos, int len); -/** -Add tile header marker information -@param tileno tile index number -@param cstr_info Codestream information structure -@param type marker type -@param pos byte offset of marker segment -@param len length of marker segment - */ -static void j2k_add_tlmarker(int tileno, opj_codestream_info_t *cstr_info, - unsigned short int type, int pos, int len); - -/*@}*/ - -/*@}*/ - -/* ----------------------------------------------------------------------- */ -typedef struct j2k_prog_order { - OPJ_PROG_ORDER enum_prog; - char str_prog[5]; -} j2k_prog_order_t; - -j2k_prog_order_t j2k_prog_order_list[] = { - {CPRL, "CPRL"}, - {LRCP, "LRCP"}, - {PCRL, "PCRL"}, - {RLCP, "RLCP"}, - {RPCL, "RPCL"}, - {(OPJ_PROG_ORDER) - 1, ""} -}; - -char *j2k_convert_progression_order(OPJ_PROG_ORDER prg_order) -{ - j2k_prog_order_t *po; - for (po = j2k_prog_order_list; po->enum_prog != -1; po++) { - if (po->enum_prog == prg_order) { - break; - } - } - return po->str_prog; -} - -/* ----------------------------------------------------------------------- */ -static int j2k_get_num_tp(opj_cp_t *cp, int pino, int tileno) -{ - char *prog; - int i; - int tpnum = 1, tpend = 0; - opj_tcp_t *tcp = &cp->tcps[tileno]; - prog = j2k_convert_progression_order(tcp->prg); - - if (cp->tp_on == 1) { - for (i = 0; i < 4; i++) { - if (tpend != 1) { - if (cp->tp_flag == prog[i]) { - tpend = 1; - cp->tp_pos = i; - } - switch (prog[i]) { - case 'C': - tpnum = tpnum * tcp->pocs[pino].compE; - break; - case 'R': - tpnum = tpnum * tcp->pocs[pino].resE; - break; - case 'P': - tpnum = tpnum * tcp->pocs[pino].prcE; - break; - case 'L': - tpnum = tpnum * tcp->pocs[pino].layE; - break; - } - } - } - } else { - tpnum = 1; - } - return tpnum; -} - -/** mem allocation for TLM marker*/ -static int j2k_calculate_tp(opj_cp_t *cp, int img_numcomp, opj_image_t *image, - opj_j2k_t *j2k) -{ - int pino, tileno, totnum_tp = 0; - - OPJ_ARG_NOT_USED(img_numcomp); - - j2k->cur_totnum_tp = (int *) opj_malloc(sizeof(int) * cp->tw * cp->th); - for (tileno = 0; tileno < cp->tw * cp->th; tileno++) { - int cur_totnum_tp = 0; - opj_tcp_t *tcp = &cp->tcps[tileno]; - for (pino = 0; pino <= tcp->numpocs; pino++) { - int tp_num = 0; - opj_pi_iterator_t *pi = pi_initialise_encode(image, cp, tileno, FINAL_PASS); - if (!pi) { - return -1; - } - tp_num = j2k_get_num_tp(cp, pino, tileno); - totnum_tp = totnum_tp + tp_num; - cur_totnum_tp = cur_totnum_tp + tp_num; - pi_destroy(pi, cp, tileno); - } - j2k->cur_totnum_tp[tileno] = cur_totnum_tp; - /* INDEX >> */ - if (j2k->cstr_info) { - j2k->cstr_info->tile[tileno].num_tps = cur_totnum_tp; - j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_malloc( - cur_totnum_tp * sizeof(opj_tp_info_t)); - } - /* << INDEX */ - } - return totnum_tp; -} - -static void j2k_write_soc(opj_j2k_t *j2k) -{ - opj_cio_t *cio = j2k->cio; - cio_write(cio, J2K_MS_SOC, 2); - - if (j2k->cstr_info) { - j2k_add_mhmarker(j2k->cstr_info, J2K_MS_SOC, cio_tell(cio), 0); - } - - /* UniPG>> */ -#ifdef USE_JPWL - - /* update markers struct */ - j2k_add_marker(j2k->cstr_info, J2K_MS_SOC, cio_tell(cio) - 2, 2); -#endif /* USE_JPWL */ - /* <state = J2K_STATE_MHSIZ; - /* Index */ - if (j2k->cstr_info) { - j2k->cstr_info->main_head_start = cio_tell(j2k->cio) - 2; - j2k->cstr_info->codestream_size = cio_numbytesleft(j2k->cio) + 2 - - j2k->cstr_info->main_head_start; - } -} - -static void j2k_write_siz(opj_j2k_t *j2k) -{ - int i; - int lenp, len; - - opj_cio_t *cio = j2k->cio; - opj_image_t *image = j2k->image; - opj_cp_t *cp = j2k->cp; - - cio_write(cio, J2K_MS_SIZ, 2); /* SIZ */ - lenp = cio_tell(cio); - cio_skip(cio, 2); - cio_write(cio, cp->rsiz, 2); /* Rsiz (capabilities) */ - cio_write(cio, image->x1, 4); /* Xsiz */ - cio_write(cio, image->y1, 4); /* Ysiz */ - cio_write(cio, image->x0, 4); /* X0siz */ - cio_write(cio, image->y0, 4); /* Y0siz */ - cio_write(cio, cp->tdx, 4); /* XTsiz */ - cio_write(cio, cp->tdy, 4); /* YTsiz */ - cio_write(cio, cp->tx0, 4); /* XT0siz */ - cio_write(cio, cp->ty0, 4); /* YT0siz */ - cio_write(cio, image->numcomps, 2); /* Csiz */ - for (i = 0; i < image->numcomps; i++) { - cio_write(cio, image->comps[i].prec - 1 + (image->comps[i].sgnd << 7), - 1); /* Ssiz_i */ - cio_write(cio, image->comps[i].dx, 1); /* XRsiz_i */ - cio_write(cio, image->comps[i].dy, 1); /* YRsiz_i */ - } - len = cio_tell(cio) - lenp; - cio_seek(cio, lenp); - cio_write(cio, len, 2); /* Lsiz */ - cio_seek(cio, lenp + len); - - if (j2k->cstr_info) { - j2k_add_mhmarker(j2k->cstr_info, J2K_MS_SIZ, lenp, len); - } -} - -static void j2k_read_siz(opj_j2k_t *j2k) -{ - int len, i; - - opj_cio_t *cio = j2k->cio; - opj_image_t *image = j2k->image; - opj_cp_t *cp = j2k->cp; - - len = cio_read(cio, 2); /* Lsiz */ - 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 */ - cp->tdx = cio_read(cio, 4); /* XTsiz */ - cp->tdy = cio_read(cio, 4); /* YTsiz */ - cp->tx0 = cio_read(cio, 4); /* XT0siz */ - cp->ty0 = cio_read(cio, 4); /* YT0siz */ - - if ((image->x0 < 0) || (image->x1 < 0) || (image->y0 < 0) || (image->y1 < 0)) { - opj_event_msg(j2k->cinfo, EVT_ERROR, - "%s: invalid image size (x0:%d, x1:%d, y0:%d, y1:%d)\n", - image->x0, image->x1, image->y0, image->y1); - return; - } - - image->numcomps = cio_read(cio, 2); /* Csiz */ - -#ifdef USE_JPWL - if (j2k->cp->correct) { - /* if JPWL is on, we check whether TX errors have damaged - too much the SIZ parameters */ - if (!(image->x1 * image->y1)) { - opj_event_msg(j2k->cinfo, EVT_ERROR, - "JPWL: bad image size (%d x %d)\n", - image->x1, image->y1); - if (!JPWL_ASSUME || JPWL_ASSUME) { - opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); - return; - } - } - if (image->numcomps != ((len - 38) / 3)) { - opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR, - "JPWL: Csiz is %d => space in SIZ only for %d comps.!!!\n", - image->numcomps, ((len - 38) / 3)); - if (!JPWL_ASSUME) { - opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); - return; - } - /* we try to correct */ - opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust this\n"); - if (image->numcomps < ((len - 38) / 3)) { - len = 38 + 3 * image->numcomps; - opj_event_msg(j2k->cinfo, EVT_WARNING, - "- setting Lsiz to %d => HYPOTHESIS!!!\n", - len); - } else { - image->numcomps = ((len - 38) / 3); - opj_event_msg(j2k->cinfo, EVT_WARNING, - "- setting Csiz to %d => HYPOTHESIS!!!\n", - image->numcomps); - } - } - - /* update components number in the jpwl_exp_comps filed */ - cp->exp_comps = image->numcomps; - } -#endif /* USE_JPWL */ - - /* prevent division by zero */ - if (!(cp->tdx * cp->tdy)) { - opj_event_msg(j2k->cinfo, EVT_ERROR, - "JPWL: invalid tile size (tdx: %d, tdy: %d)\n", cp->tdx, cp->tdy); - return; - } - - image->comps = (opj_image_comp_t*) opj_calloc(image->numcomps, - sizeof(opj_image_comp_t)); - for (i = 0; i < image->numcomps; i++) { - int tmp, w, h; - 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 */ - -#ifdef USE_JPWL - if (j2k->cp->correct) { - /* if JPWL is on, we check whether TX errors have damaged - too much the SIZ parameters, again */ - if (!(image->comps[i].dx * image->comps[i].dy)) { - opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR, - "JPWL: bad XRsiz_%d/YRsiz_%d (%d x %d)\n", - i, i, image->comps[i].dx, image->comps[i].dy); - if (!JPWL_ASSUME) { - opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); - return; - } - /* we try to correct */ - opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust them\n"); - if (!image->comps[i].dx) { - image->comps[i].dx = 1; - opj_event_msg(j2k->cinfo, EVT_WARNING, - "- setting XRsiz_%d to %d => HYPOTHESIS!!!\n", - i, image->comps[i].dx); - } - if (!image->comps[i].dy) { - image->comps[i].dy = 1; - opj_event_msg(j2k->cinfo, EVT_WARNING, - "- setting YRsiz_%d to %d => HYPOTHESIS!!!\n", - i, image->comps[i].dy); - } - } - - } -#endif /* USE_JPWL */ - - /* prevent division by zero */ - if (!(image->comps[i].dx * image->comps[i].dy)) { - opj_event_msg(j2k->cinfo, EVT_ERROR, - "JPWL: invalid component size (dx: %d, dy: %d)\n", image->comps[i].dx, - image->comps[i].dy); - return; - } - - /* TODO: unused ? */ - w = int_ceildiv(image->x1 - image->x0, image->comps[i].dx); - h = int_ceildiv(image->y1 - image->y0, image->comps[i].dy); - - image->comps[i].resno_decoded = 0; /* number of resolution decoded */ - image->comps[i].factor = cp->reduce; /* reducing factor per component */ - } - - cp->tw = int_ceildiv(image->x1 - cp->tx0, cp->tdx); - cp->th = int_ceildiv(image->y1 - cp->ty0, cp->tdy); - -#ifdef USE_JPWL - if (j2k->cp->correct) { - /* if JPWL is on, we check whether TX errors have damaged - too much the SIZ parameters */ - if ((cp->tw < 1) || (cp->th < 1) || (cp->tw > cp->max_tiles) || - (cp->th > cp->max_tiles)) { - opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR, - "JPWL: bad number of tiles (%d x %d)\n", - cp->tw, cp->th); - if (!JPWL_ASSUME) { - opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); - return; - } - /* we try to correct */ - opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust them\n"); - if (cp->tw < 1) { - cp->tw = 1; - opj_event_msg(j2k->cinfo, EVT_WARNING, - "- setting %d tiles in x => HYPOTHESIS!!!\n", - cp->tw); - } - if (cp->tw > cp->max_tiles) { - cp->tw = 1; - opj_event_msg(j2k->cinfo, EVT_WARNING, - "- too large x, increase expectance of %d\n" - "- setting %d tiles in x => HYPOTHESIS!!!\n", - cp->max_tiles, cp->tw); - } - if (cp->th < 1) { - cp->th = 1; - opj_event_msg(j2k->cinfo, EVT_WARNING, - "- setting %d tiles in y => HYPOTHESIS!!!\n", - cp->th); - } - if (cp->th > cp->max_tiles) { - cp->th = 1; - opj_event_msg(j2k->cinfo, EVT_WARNING, - "- too large y, increase expectance of %d to continue\n", - "- setting %d tiles in y => HYPOTHESIS!!!\n", - cp->max_tiles, cp->th); - } - } - } -#endif /* USE_JPWL */ - - cp->tcps = (opj_tcp_t*) opj_calloc(cp->tw * cp->th, sizeof(opj_tcp_t)); - if (cp->tcps == NULL) { - opj_event_msg(j2k->cinfo, EVT_ERROR, "Out of memory\n"); - return; - } - cp->tileno = (int*) opj_malloc(sizeof(int) * cp->tw * cp->th); - if (cp->tileno == NULL) { - opj_event_msg(j2k->cinfo, EVT_ERROR, "Out of memory\n"); - return; - } - cp->tileno_size = 0; - -#ifdef USE_JPWL - if (j2k->cp->correct) { - if (!cp->tcps) { - opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR, - "JPWL: could not alloc tcps field of cp\n"); - if (!JPWL_ASSUME || JPWL_ASSUME) { - opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); - return; - } - } - } -#endif /* USE_JPWL */ - - for (i = 0; i < cp->tw * cp->th; i++) { - cp->tcps[i].POC = 0; - cp->tcps[i].numpocs = 0; - cp->tcps[i].first = 1; - } - - /* Initialization for PPM marker */ - cp->ppm = 0; - cp->ppm_data = NULL; - cp->ppm_data_first = NULL; - cp->ppm_previous = 0; - cp->ppm_store = 0; - - j2k->default_tcp->tccps = (opj_tccp_t*) opj_calloc(image->numcomps, - sizeof(opj_tccp_t)); - for (i = 0; i < cp->tw * cp->th; i++) { - cp->tcps[i].tccps = (opj_tccp_t*) opj_malloc(image->numcomps * sizeof( - opj_tccp_t)); - } - j2k->tile_data = (unsigned char**) opj_calloc(cp->tw * cp->th, - sizeof(unsigned char*)); - j2k->tile_len = (int*) opj_calloc(cp->tw * cp->th, sizeof(int)); - j2k->state = J2K_STATE_MH; - - /* Index */ - if (j2k->cstr_info) { - opj_codestream_info_t *cstr_info = j2k->cstr_info; - cstr_info->image_w = image->x1 - image->x0; - cstr_info->image_h = image->y1 - image->y0; - cstr_info->numcomps = image->numcomps; - cstr_info->tw = cp->tw; - cstr_info->th = cp->th; - cstr_info->tile_x = cp->tdx; - cstr_info->tile_y = cp->tdy; - cstr_info->tile_Ox = cp->tx0; - cstr_info->tile_Oy = cp->ty0; - cstr_info->tile = (opj_tile_info_t*) opj_calloc(cp->tw * cp->th, - sizeof(opj_tile_info_t)); - } -} - -static void j2k_write_com(opj_j2k_t *j2k) -{ - unsigned int i; - int lenp, len; - - if (j2k->cp->comment) { - opj_cio_t *cio = j2k->cio; - char *comment = j2k->cp->comment; - - cio_write(cio, J2K_MS_COM, 2); - lenp = cio_tell(cio); - cio_skip(cio, 2); - cio_write(cio, 1, 2); /* General use (IS 8859-15:1999 (Latin) values) */ - for (i = 0; i < strlen(comment); i++) { - cio_write(cio, comment[i], 1); - } - len = cio_tell(cio) - lenp; - cio_seek(cio, lenp); - cio_write(cio, len, 2); - cio_seek(cio, lenp + len); - - - if (j2k->cstr_info) { - j2k_add_mhmarker(j2k->cstr_info, J2K_MS_COM, lenp, len); - } - - } -} - -static void j2k_read_com(opj_j2k_t *j2k) -{ - int len; - - opj_cio_t *cio = j2k->cio; - - len = cio_read(cio, 2); - cio_skip(cio, len - 2); -} - -static void j2k_write_cox(opj_j2k_t *j2k, int compno) -{ - int i; - - opj_cp_t *cp = j2k->cp; - opj_tcp_t *tcp = &cp->tcps[j2k->curtileno]; - opj_tccp_t *tccp = &tcp->tccps[compno]; - opj_cio_t *cio = j2k->cio; - - cio_write(cio, tccp->numresolutions - 1, 1); /* SPcox (D) */ - cio_write(cio, tccp->cblkw - 2, 1); /* SPcox (E) */ - cio_write(cio, tccp->cblkh - 2, 1); /* SPcox (F) */ - cio_write(cio, tccp->cblksty, 1); /* SPcox (G) */ - cio_write(cio, tccp->qmfbid, 1); /* SPcox (H) */ - - if (tccp->csty & J2K_CCP_CSTY_PRT) { - for (i = 0; i < tccp->numresolutions; i++) { - cio_write(cio, tccp->prcw[i] + (tccp->prch[i] << 4), 1); /* SPcox (I_i) */ - } - } -} - -static void j2k_read_cox(opj_j2k_t *j2k, int compno) -{ - int i; - - opj_cp_t *cp = j2k->cp; - opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : - j2k->default_tcp; - opj_tccp_t *tccp = &tcp->tccps[compno]; - opj_cio_t *cio = j2k->cio; - - tccp->numresolutions = cio_read(cio, 1) + 1; /* SPcox (D) */ - - /* If user wants to remove more resolutions than the codestream contains, return error*/ - if (cp->reduce >= tccp->numresolutions) { - opj_event_msg(j2k->cinfo, EVT_ERROR, - "Error decoding component %d.\nThe number of resolutions to remove is higher than the number " - "of resolutions of this component\nModify the cp_reduce parameter.\n\n", - compno); - j2k->state |= J2K_STATE_ERR; - } - if (tccp->numresolutions > J2K_MAXRLVLS) { - opj_event_msg(j2k->cinfo, EVT_ERROR, - "Error decoding component %d.\nThe number of resolutions is too big: %d vs max= %d. Truncating.\n\n", - compno, tccp->numresolutions, J2K_MAXRLVLS); - j2k->state |= J2K_STATE_ERR; - tccp->numresolutions = J2K_MAXRLVLS; - } - - tccp->cblkw = cio_read(cio, 1) + 2; /* SPcox (E) */ - tccp->cblkh = cio_read(cio, 1) + 2; /* SPcox (F) */ - tccp->cblksty = cio_read(cio, 1); /* SPcox (G) */ - tccp->qmfbid = cio_read(cio, 1); /* SPcox (H) */ - if (tccp->csty & J2K_CP_CSTY_PRT) { - for (i = 0; i < tccp->numresolutions; i++) { - int tmp = cio_read(cio, 1); /* SPcox (I_i) */ - tccp->prcw[i] = tmp & 0xf; - tccp->prch[i] = tmp >> 4; - } - } - - /* INDEX >> */ - if (j2k->cstr_info && compno == 0) { - for (i = 0; i < tccp->numresolutions; i++) { - if (tccp->csty & J2K_CP_CSTY_PRT) { - j2k->cstr_info->tile[j2k->curtileno].pdx[i] = tccp->prcw[i]; - j2k->cstr_info->tile[j2k->curtileno].pdy[i] = tccp->prch[i]; - } else { - j2k->cstr_info->tile[j2k->curtileno].pdx[i] = 15; - j2k->cstr_info->tile[j2k->curtileno].pdx[i] = 15; - } - } - } - /* << INDEX */ -} - -static void j2k_write_cod(opj_j2k_t *j2k) -{ - opj_cp_t *cp = NULL; - opj_tcp_t *tcp = NULL; - int lenp, len; - - opj_cio_t *cio = j2k->cio; - - cio_write(cio, J2K_MS_COD, 2); /* COD */ - - lenp = cio_tell(cio); - cio_skip(cio, 2); - - cp = j2k->cp; - tcp = &cp->tcps[j2k->curtileno]; - - cio_write(cio, tcp->csty, 1); /* Scod */ - cio_write(cio, tcp->prg, 1); /* SGcod (A) */ - cio_write(cio, tcp->numlayers, 2); /* SGcod (B) */ - cio_write(cio, tcp->mct, 1); /* SGcod (C) */ - - j2k_write_cox(j2k, 0); - len = cio_tell(cio) - lenp; - cio_seek(cio, lenp); - cio_write(cio, len, 2); /* Lcod */ - cio_seek(cio, lenp + len); - - if (j2k->cstr_info) { - j2k_add_mhmarker(j2k->cstr_info, J2K_MS_COD, lenp, len); - } - -} - -static void j2k_read_cod(opj_j2k_t *j2k) -{ - int len, i, pos; - - opj_cio_t *cio = j2k->cio; - opj_cp_t *cp = j2k->cp; - opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : - j2k->default_tcp; - opj_image_t *image = j2k->image; - - len = cio_read(cio, 2); /* Lcod */ - tcp->csty = cio_read(cio, 1); /* Scod */ - tcp->prg = (OPJ_PROG_ORDER)cio_read(cio, 1); /* SGcod (A) */ - tcp->numlayers = cio_read(cio, 2); /* SGcod (B) */ - tcp->mct = cio_read(cio, 1); /* SGcod (C) */ - - pos = cio_tell(cio); - for (i = 0; i < image->numcomps; i++) { - tcp->tccps[i].csty = tcp->csty & J2K_CP_CSTY_PRT; - cio_seek(cio, pos); - j2k_read_cox(j2k, i); - } - - /* Index */ - if (j2k->cstr_info) { - opj_codestream_info_t *cstr_info = j2k->cstr_info; - cstr_info->prog = tcp->prg; - cstr_info->numlayers = tcp->numlayers; - cstr_info->numdecompos = (int*) opj_malloc(image->numcomps * sizeof(int)); - for (i = 0; i < image->numcomps; i++) { - cstr_info->numdecompos[i] = tcp->tccps[i].numresolutions - 1; - } - } -} - -static void j2k_write_coc(opj_j2k_t *j2k, int compno) -{ - int lenp, len; - - opj_cp_t *cp = j2k->cp; - opj_tcp_t *tcp = &cp->tcps[j2k->curtileno]; - opj_image_t *image = j2k->image; - opj_cio_t *cio = j2k->cio; - - cio_write(cio, J2K_MS_COC, 2); /* COC */ - lenp = cio_tell(cio); - cio_skip(cio, 2); - cio_write(cio, compno, image->numcomps <= 256 ? 1 : 2); /* Ccoc */ - cio_write(cio, tcp->tccps[compno].csty, 1); /* Scoc */ - j2k_write_cox(j2k, compno); - len = cio_tell(cio) - lenp; - cio_seek(cio, lenp); - cio_write(cio, len, 2); /* Lcoc */ - cio_seek(cio, lenp + len); -} - -static void j2k_read_coc(opj_j2k_t *j2k) -{ - int len, compno; - - opj_cp_t *cp = j2k->cp; - opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : - j2k->default_tcp; - opj_image_t *image = j2k->image; - opj_cio_t *cio = j2k->cio; - - len = cio_read(cio, 2); /* Lcoc */ - compno = cio_read(cio, image->numcomps <= 256 ? 1 : 2); /* Ccoc */ - if (compno >= image->numcomps) { - opj_event_msg(j2k->cinfo, EVT_ERROR, - "bad component number in COC (%d out of a maximum of %d)\n", - compno, image->numcomps); - return; - } - tcp->tccps[compno].csty = cio_read(cio, 1); /* Scoc */ - j2k_read_cox(j2k, compno); -} - -static void j2k_write_qcx(opj_j2k_t *j2k, int compno) -{ - int bandno, numbands; - int expn, mant; - - opj_cp_t *cp = j2k->cp; - opj_tcp_t *tcp = &cp->tcps[j2k->curtileno]; - opj_tccp_t *tccp = &tcp->tccps[compno]; - opj_cio_t *cio = j2k->cio; - - cio_write(cio, tccp->qntsty + (tccp->numgbits << 5), 1); /* Sqcx */ - numbands = tccp->qntsty == J2K_CCP_QNTSTY_SIQNT ? 1 : tccp->numresolutions * 3 - - 2; - - for (bandno = 0; bandno < numbands; bandno++) { - expn = tccp->stepsizes[bandno].expn; - mant = tccp->stepsizes[bandno].mant; - - if (tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) { - cio_write(cio, expn << 3, 1); /* SPqcx_i */ - } else { - cio_write(cio, (expn << 11) + mant, 2); /* SPqcx_i */ - } - } -} - -static void j2k_read_qcx(opj_j2k_t *j2k, int compno, int len) -{ - int tmp; - int bandno, numbands; - - opj_cp_t *cp = j2k->cp; - opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : - j2k->default_tcp; - opj_tccp_t *tccp = &tcp->tccps[compno]; - opj_cio_t *cio = j2k->cio; - - tmp = cio_read(cio, 1); /* Sqcx */ - tccp->qntsty = tmp & 0x1f; - tccp->numgbits = tmp >> 5; - numbands = (tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? - 1 : ((tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) ? len - 1 : (len - 1) / 2); - -#ifdef USE_JPWL - if (j2k->cp->correct) { - - /* if JPWL is on, we check whether there are too many subbands */ - if ((numbands < 0) || (numbands >= J2K_MAXBANDS)) { - opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR, - "JPWL: bad number of subbands in Sqcx (%d)\n", - numbands); - if (!JPWL_ASSUME) { - opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); - return; - } - /* we try to correct */ - numbands = 1; - opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust them\n" - "- setting number of bands to %d => HYPOTHESIS!!!\n", - numbands); - }; - - }; - -#else - /* We check whether there are too many subbands */ - if ((numbands < 0) || (numbands >= J2K_MAXBANDS)) { - opj_event_msg(j2k->cinfo, EVT_WARNING, - "bad number of subbands in Sqcx (%d) regarding to J2K_MAXBANDS (%d) \n" - "- limiting number of bands to J2K_MAXBANDS and try to move to the next markers\n", - numbands, J2K_MAXBANDS); - } - -#endif /* USE_JPWL */ - - for (bandno = 0; bandno < numbands; bandno++) { - int expn, mant; - if (tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) { - expn = cio_read(cio, 1) >> 3; /* SPqcx_i */ - mant = 0; - } else { - tmp = cio_read(cio, 2); /* SPqcx_i */ - expn = tmp >> 11; - mant = tmp & 0x7ff; - } - if (bandno < J2K_MAXBANDS) { - tccp->stepsizes[bandno].expn = expn; - tccp->stepsizes[bandno].mant = mant; - } - } - - /* Add Antonin : if scalar_derived -> compute other stepsizes */ - if (tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) { - for (bandno = 1; bandno < J2K_MAXBANDS; bandno++) { - tccp->stepsizes[bandno].expn = - ((tccp->stepsizes[0].expn) - ((bandno - 1) / 3) > 0) ? - (tccp->stepsizes[0].expn) - ((bandno - 1) / 3) : 0; - tccp->stepsizes[bandno].mant = tccp->stepsizes[0].mant; - } - } - /* ddA */ -} - -static void j2k_write_qcd(opj_j2k_t *j2k) -{ - int lenp, len; - - opj_cio_t *cio = j2k->cio; - - cio_write(cio, J2K_MS_QCD, 2); /* QCD */ - lenp = cio_tell(cio); - cio_skip(cio, 2); - j2k_write_qcx(j2k, 0); - len = cio_tell(cio) - lenp; - cio_seek(cio, lenp); - cio_write(cio, len, 2); /* Lqcd */ - cio_seek(cio, lenp + len); - - if (j2k->cstr_info) { - j2k_add_mhmarker(j2k->cstr_info, J2K_MS_QCD, lenp, len); - } -} - -static void j2k_read_qcd(opj_j2k_t *j2k) -{ - int len, i, pos; - - opj_cio_t *cio = j2k->cio; - opj_image_t *image = j2k->image; - - len = cio_read(cio, 2); /* Lqcd */ - pos = cio_tell(cio); - for (i = 0; i < image->numcomps; i++) { - cio_seek(cio, pos); - j2k_read_qcx(j2k, i, len - 2); - } -} - -static void j2k_write_qcc(opj_j2k_t *j2k, int compno) -{ - int lenp, len; - - opj_cio_t *cio = j2k->cio; - - cio_write(cio, J2K_MS_QCC, 2); /* QCC */ - lenp = cio_tell(cio); - cio_skip(cio, 2); - cio_write(cio, compno, j2k->image->numcomps <= 256 ? 1 : 2); /* Cqcc */ - j2k_write_qcx(j2k, compno); - len = cio_tell(cio) - lenp; - cio_seek(cio, lenp); - cio_write(cio, len, 2); /* Lqcc */ - cio_seek(cio, lenp + len); -} - -static void j2k_read_qcc(opj_j2k_t *j2k) -{ - int len, compno; - int numcomp = j2k->image->numcomps; - opj_cio_t *cio = j2k->cio; - - len = cio_read(cio, 2); /* Lqcc */ - compno = cio_read(cio, numcomp <= 256 ? 1 : 2); /* Cqcc */ - -#ifdef USE_JPWL - if (j2k->cp->correct) { - - static int backup_compno = 0; - - /* compno is negative or larger than the number of components!!! */ - if ((compno < 0) || (compno >= numcomp)) { - opj_event_msg(j2k->cinfo, EVT_ERROR, - "JPWL: bad component number in QCC (%d out of a maximum of %d)\n", - compno, numcomp); - if (!JPWL_ASSUME) { - opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); - return; - } - /* we try to correct */ - compno = backup_compno % numcomp; - opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust this\n" - "- setting component number to %d\n", - compno); - } - - /* keep your private count of tiles */ - backup_compno++; - } -#endif /* USE_JPWL */ - - if ((compno < 0) || (compno >= numcomp)) { - opj_event_msg(j2k->cinfo, EVT_ERROR, - "bad component number in QCC (%d out of a maximum of %d)\n", - compno, j2k->image->numcomps); - return; - } - - j2k_read_qcx(j2k, compno, len - 2 - (numcomp <= 256 ? 1 : 2)); -} - -static void j2k_write_poc(opj_j2k_t *j2k) -{ - int len, numpchgs, i; - - int numcomps = j2k->image->numcomps; - - opj_cp_t *cp = j2k->cp; - opj_tcp_t *tcp = &cp->tcps[j2k->curtileno]; - opj_tccp_t *tccp = &tcp->tccps[0]; - opj_cio_t *cio = j2k->cio; - - numpchgs = 1 + tcp->numpocs; - cio_write(cio, J2K_MS_POC, 2); /* POC */ - len = 2 + (5 + 2 * (numcomps <= 256 ? 1 : 2)) * numpchgs; - cio_write(cio, len, 2); /* Lpoc */ - for (i = 0; i < numpchgs; i++) { - opj_poc_t *poc = &tcp->pocs[i]; - cio_write(cio, poc->resno0, 1); /* RSpoc_i */ - cio_write(cio, poc->compno0, (numcomps <= 256 ? 1 : 2)); /* CSpoc_i */ - cio_write(cio, poc->layno1, 2); /* LYEpoc_i */ - poc->layno1 = int_min(poc->layno1, tcp->numlayers); - cio_write(cio, poc->resno1, 1); /* REpoc_i */ - poc->resno1 = int_min(poc->resno1, tccp->numresolutions); - cio_write(cio, poc->compno1, (numcomps <= 256 ? 1 : 2)); /* CEpoc_i */ - poc->compno1 = int_min(poc->compno1, numcomps); - cio_write(cio, poc->prg, 1); /* Ppoc_i */ - } -} - -static void j2k_read_poc(opj_j2k_t *j2k) -{ - int len, numpchgs, i, old_poc; - - int numcomps = j2k->image->numcomps; - - opj_cp_t *cp = j2k->cp; - opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : - j2k->default_tcp; - opj_cio_t *cio = j2k->cio; - - old_poc = tcp->POC ? tcp->numpocs + 1 : 0; - tcp->POC = 1; - len = cio_read(cio, 2); /* Lpoc */ - numpchgs = (len - 2) / (5 + 2 * (numcomps <= 256 ? 1 : 2)); - - for (i = old_poc; i < numpchgs + old_poc; i++) { - opj_poc_t *poc; - poc = &tcp->pocs[i]; - poc->resno0 = cio_read(cio, 1); /* RSpoc_i */ - poc->compno0 = cio_read(cio, numcomps <= 256 ? 1 : 2); /* CSpoc_i */ - poc->layno1 = cio_read(cio, 2); /* LYEpoc_i */ - poc->resno1 = cio_read(cio, 1); /* REpoc_i */ - poc->compno1 = int_min( - cio_read(cio, numcomps <= 256 ? 1 : 2), - (unsigned int) numcomps); /* CEpoc_i */ - poc->prg = (OPJ_PROG_ORDER)cio_read(cio, 1); /* Ppoc_i */ - } - - tcp->numpocs = numpchgs + old_poc - 1; -} - -static void j2k_read_crg(opj_j2k_t *j2k) -{ - int len, i, Xcrg_i, Ycrg_i; - - opj_cio_t *cio = j2k->cio; - int numcomps = j2k->image->numcomps; - - len = cio_read(cio, 2); /* Lcrg */ - for (i = 0; i < numcomps; i++) { - Xcrg_i = cio_read(cio, 2); /* Xcrg_i */ - Ycrg_i = cio_read(cio, 2); /* Ycrg_i */ - } -} - -static void j2k_read_tlm(opj_j2k_t *j2k) -{ - int len, Ztlm, Stlm, ST, SP, tile_tlm, i; - long int Ttlm_i, Ptlm_i; - - opj_cio_t *cio = j2k->cio; - - len = cio_read(cio, 2); /* Ltlm */ - Ztlm = cio_read(cio, 1); /* Ztlm */ - Stlm = cio_read(cio, 1); /* Stlm */ - ST = ((Stlm >> 4) & 0x01) + ((Stlm >> 4) & 0x02); - SP = (Stlm >> 6) & 0x01; - tile_tlm = (len - 4) / ((SP + 1) * 2 + ST); - for (i = 0; i < tile_tlm; i++) { - Ttlm_i = cio_read(cio, ST); /* Ttlm_i */ - Ptlm_i = cio_read(cio, SP ? 4 : 2); /* Ptlm_i */ - } -} - -static void j2k_read_plm(opj_j2k_t *j2k) -{ - int len, i, Zplm, Nplm, add, packet_len = 0; - - opj_cio_t *cio = j2k->cio; - - len = cio_read(cio, 2); /* Lplm */ - Zplm = cio_read(cio, 1); /* Zplm */ - len -= 3; - while (len > 0) { - Nplm = cio_read(cio, 4); /* Nplm */ - len -= 4; - for (i = Nplm; i > 0; i--) { - add = cio_read(cio, 1); - len--; - packet_len = (packet_len << 7) + add; /* Iplm_ij */ - if ((add & 0x80) == 0) { - /* New packet */ - packet_len = 0; - } - if (len <= 0) { - break; - } - } - } -} - -static void j2k_read_plt(opj_j2k_t *j2k) -{ - int len, i, Zplt, packet_len = 0, add; - - opj_cio_t *cio = j2k->cio; - - len = cio_read(cio, 2); /* Lplt */ - Zplt = cio_read(cio, 1); /* Zplt */ - for (i = len - 3; i > 0; i--) { - add = cio_read(cio, 1); - packet_len = (packet_len << 7) + add; /* Iplt_i */ - if ((add & 0x80) == 0) { - /* New packet */ - packet_len = 0; - } - } -} - -static void j2k_read_ppm(opj_j2k_t *j2k) -{ - int len, Z_ppm, i, j; - int N_ppm; - - opj_cp_t *cp = j2k->cp; - opj_cio_t *cio = j2k->cio; - - len = cio_read(cio, 2); - cp->ppm = 1; - - Z_ppm = cio_read(cio, 1); /* Z_ppm */ - len -= 3; - while (len > 0) { - if (cp->ppm_previous == 0) { - N_ppm = cio_read(cio, 4); /* N_ppm */ - len -= 4; - } else { - N_ppm = cp->ppm_previous; - } - j = cp->ppm_store; - if (Z_ppm == 0) { /* First PPM marker */ - cp->ppm_data = (unsigned char *) opj_malloc(N_ppm * sizeof(unsigned char)); - cp->ppm_data_first = cp->ppm_data; - cp->ppm_len = N_ppm; - } else { /* NON-first PPM marker */ - cp->ppm_data = (unsigned char *) opj_realloc(cp->ppm_data, - (N_ppm + cp->ppm_store) * sizeof(unsigned char)); - -#ifdef USE_JPWL - /* this memory allocation check could be done even in non-JPWL cases */ - if (cp->correct) { - if (!cp->ppm_data) { - opj_event_msg(j2k->cinfo, EVT_ERROR, - "JPWL: failed memory allocation during PPM marker parsing (pos. %x)\n", - cio_tell(cio)); - if (!JPWL_ASSUME || JPWL_ASSUME) { - opj_free(cp->ppm_data); - opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); - return; - } - } - } -#endif - - cp->ppm_data_first = cp->ppm_data; - cp->ppm_len = N_ppm + cp->ppm_store; - } - for (i = N_ppm; i > 0; i--) { /* Read packet header */ - cp->ppm_data[j] = cio_read(cio, 1); - j++; - len--; - if (len == 0) { - break; /* Case of non-finished packet header in present marker but finished in next one */ - } - } - cp->ppm_previous = i - 1; - cp->ppm_store = j; - } -} - -static void j2k_read_ppt(opj_j2k_t *j2k) -{ - int len, Z_ppt, i, j = 0; - - opj_cp_t *cp = j2k->cp; - opj_tcp_t *tcp = cp->tcps + j2k->curtileno; - opj_cio_t *cio = j2k->cio; - - len = cio_read(cio, 2); - Z_ppt = cio_read(cio, 1); - tcp->ppt = 1; - if (Z_ppt == 0) { /* First PPT marker */ - tcp->ppt_data = (unsigned char *) opj_malloc((len - 3) * sizeof(unsigned char)); - tcp->ppt_data_first = tcp->ppt_data; - tcp->ppt_store = 0; - tcp->ppt_len = len - 3; - } else { /* NON-first PPT marker */ - tcp->ppt_data = (unsigned char *) opj_realloc(tcp->ppt_data, - (len - 3 + tcp->ppt_store) * sizeof(unsigned char)); - tcp->ppt_data_first = tcp->ppt_data; - tcp->ppt_len = len - 3 + tcp->ppt_store; - } - j = tcp->ppt_store; - for (i = len - 3; i > 0; i--) { - tcp->ppt_data[j] = cio_read(cio, 1); - j++; - } - tcp->ppt_store = j; -} - -static void j2k_write_tlm(opj_j2k_t *j2k) -{ - int lenp; - opj_cio_t *cio = j2k->cio; - j2k->tlm_start = cio_tell(cio); - cio_write(cio, J2K_MS_TLM, 2);/* TLM */ - lenp = 4 + (5 * j2k->totnum_tp); - cio_write(cio, lenp, 2); /* Ltlm */ - cio_write(cio, 0, 1); /* Ztlm=0*/ - cio_write(cio, 80, - 1); /* Stlm ST=1(8bits-255 tiles max),SP=1(Ptlm=32bits) */ - cio_skip(cio, 5 * j2k->totnum_tp); -} - -static void j2k_write_sot(opj_j2k_t *j2k) -{ - int lenp, len; - - opj_cio_t *cio = j2k->cio; - - j2k->sot_start = cio_tell(cio); - cio_write(cio, J2K_MS_SOT, 2); /* SOT */ - lenp = cio_tell(cio); - cio_skip(cio, 2); /* Lsot (further) */ - cio_write(cio, j2k->curtileno, 2); /* Isot */ - cio_skip(cio, 4); /* Psot (further in j2k_write_sod) */ - cio_write(cio, j2k->cur_tp_num, 1); /* TPsot */ - cio_write(cio, j2k->cur_totnum_tp[j2k->curtileno], 1); /* TNsot */ - len = cio_tell(cio) - lenp; - cio_seek(cio, lenp); - cio_write(cio, len, 2); /* Lsot */ - cio_seek(cio, lenp + len); - - /* UniPG>> */ -#ifdef USE_JPWL - /* update markers struct */ - j2k_add_marker(j2k->cstr_info, J2K_MS_SOT, j2k->sot_start, len + 2); -#endif /* USE_JPWL */ - /* <cstr_info && j2k->cur_tp_num == 0) { - j2k_add_tlmarker(j2k->curtileno, j2k->cstr_info, J2K_MS_SOT, lenp, len); - } -} - -static void j2k_read_sot(opj_j2k_t *j2k) -{ - int len, tileno, totlen, partno, numparts, i; - opj_tcp_t *tcp = NULL; - char status = 0; - - opj_cp_t *cp = j2k->cp; - opj_cio_t *cio = j2k->cio; - - len = cio_read(cio, 2); - tileno = cio_read(cio, 2); - -#ifdef USE_JPWL - if (j2k->cp->correct) { - - static int backup_tileno = 0; - - /* tileno is negative or larger than the number of tiles!!! */ - if ((tileno < 0) || (tileno >= (cp->tw * cp->th))) { - opj_event_msg(j2k->cinfo, EVT_ERROR, - "JPWL: bad tile number (%d out of a maximum of %d)\n", - tileno, (cp->tw * cp->th)); - if (!JPWL_ASSUME) { - opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); - return; - } - /* we try to correct */ - tileno = backup_tileno; - opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust this\n" - "- setting tile number to %d\n", - tileno); - } - - /* keep your private count of tiles */ - backup_tileno++; - } else -#endif /* USE_JPWL */ - { - /* tileno is negative or larger than the number of tiles!!! */ - if ((tileno < 0) || (tileno >= (cp->tw * cp->th))) { - opj_event_msg(j2k->cinfo, EVT_ERROR, - "JPWL: bad tile number (%d out of a maximum of %d)\n", - tileno, (cp->tw * cp->th)); - return; - } - } - - if (cp->tileno_size == 0) { - cp->tileno[cp->tileno_size] = tileno; - cp->tileno_size++; - } else { - i = 0; - while (i < cp->tileno_size && status == 0) { - status = cp->tileno[i] == tileno ? 1 : 0; - i++; - } - if (status == 0) { - cp->tileno[cp->tileno_size] = tileno; - cp->tileno_size++; - } - } - - totlen = cio_read(cio, 4); - -#ifdef USE_JPWL - if (j2k->cp->correct) { - - /* totlen is negative or larger than the bytes left!!! */ - if ((totlen < 0) || (totlen > (cio_numbytesleft(cio) + 8))) { - opj_event_msg(j2k->cinfo, EVT_ERROR, - "JPWL: bad tile byte size (%d bytes against %d bytes left)\n", - totlen, cio_numbytesleft(cio) + 8); - if (!JPWL_ASSUME) { - opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); - return; - } - /* we try to correct */ - totlen = 0; - opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust this\n" - "- setting Psot to %d => assuming it is the last tile\n", - totlen); - } - - } else -#endif /* USE_JPWL */ - { - /* totlen is negative or larger than the bytes left!!! */ - if ((totlen < 0) || (totlen > (cio_numbytesleft(cio) + 8))) { - opj_event_msg(j2k->cinfo, EVT_ERROR, - "JPWL: bad tile byte size (%d bytes against %d bytes left)\n", - totlen, cio_numbytesleft(cio) + 8); - return; - } - } - - if (!totlen) { - totlen = cio_numbytesleft(cio) + 8; - } - - partno = cio_read(cio, 1); - numparts = cio_read(cio, 1); - - if (partno >= numparts) { - opj_event_msg(j2k->cinfo, EVT_WARNING, - "SOT marker inconsistency in tile %d: tile-part index greater (%d) than number of tile-parts (%d)\n", - tileno, partno, numparts); - numparts = partno + 1; - } - - j2k->curtileno = tileno; - j2k->cur_tp_num = partno; - j2k->eot = cio_getbp(cio) - 12 + totlen; - j2k->state = J2K_STATE_TPH; - tcp = &cp->tcps[j2k->curtileno]; - - /* Index */ - if (j2k->cstr_info) { - if (tcp->first) { - if (tileno == 0) { - j2k->cstr_info->main_head_end = cio_tell(cio) - 13; - } - j2k->cstr_info->tile[tileno].tileno = tileno; - j2k->cstr_info->tile[tileno].start_pos = cio_tell(cio) - 12; - j2k->cstr_info->tile[tileno].end_pos = j2k->cstr_info->tile[tileno].start_pos + - totlen - 1; - } else { - j2k->cstr_info->tile[tileno].end_pos += totlen; - } - j2k->cstr_info->tile[tileno].num_tps = numparts; - if (numparts) { - j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_realloc( - j2k->cstr_info->tile[tileno].tp, numparts * sizeof(opj_tp_info_t)); - } else { - j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_realloc( - j2k->cstr_info->tile[tileno].tp, 10 * sizeof(opj_tp_info_t)); /* Fixme (10)*/ - } - j2k->cstr_info->tile[tileno].tp[partno].tp_start_pos = cio_tell(cio) - 12; - j2k->cstr_info->tile[tileno].tp[partno].tp_end_pos = - j2k->cstr_info->tile[tileno].tp[partno].tp_start_pos + totlen - 1; - } - - if (tcp->first == 1) { - /* Initialization PPT */ - opj_tccp_t *tmp = tcp->tccps; - memcpy(tcp, j2k->default_tcp, sizeof(opj_tcp_t)); - tcp->ppt = 0; - tcp->ppt_data = NULL; - tcp->ppt_data_first = NULL; - tcp->tccps = tmp; - - for (i = 0; i < j2k->image->numcomps; i++) { - tcp->tccps[i] = j2k->default_tcp->tccps[i]; - } - cp->tcps[j2k->curtileno].first = 0; - } -} - -static void j2k_write_sod(opj_j2k_t *j2k, void *tile_coder) -{ - int l, layno; - int totlen; - opj_tcp_t *tcp = NULL; - opj_codestream_info_t *cstr_info = NULL; - - opj_tcd_t *tcd = (opj_tcd_t*) - tile_coder; /* cast is needed because of conflicts in header inclusions */ - opj_cp_t *cp = j2k->cp; - opj_cio_t *cio = j2k->cio; - - tcd->tp_num = j2k->tp_num ; - tcd->cur_tp_num = j2k->cur_tp_num; - - cio_write(cio, J2K_MS_SOD, 2); - - if (j2k->cstr_info && j2k->cur_tp_num == 0) { - j2k_add_tlmarker(j2k->curtileno, j2k->cstr_info, J2K_MS_SOD, cio_tell(cio), 0); - } - - if (j2k->curtileno == 0) { - j2k->sod_start = cio_tell(cio) + j2k->pos_correction; - } - - /* INDEX >> */ - cstr_info = j2k->cstr_info; - if (cstr_info) { - if (!j2k->cur_tp_num) { - cstr_info->tile[j2k->curtileno].end_header = cio_tell(cio) + j2k->pos_correction - - 1; - j2k->cstr_info->tile[j2k->curtileno].tileno = j2k->curtileno; - } else { - if (cstr_info->tile[j2k->curtileno].packet[cstr_info->packno - 1].end_pos < - cio_tell(cio)) { - cstr_info->tile[j2k->curtileno].packet[cstr_info->packno].start_pos = cio_tell( - cio); - } - } - /* UniPG>> */ -#ifdef USE_JPWL - /* update markers struct */ - j2k_add_marker(j2k->cstr_info, J2K_MS_SOD, j2k->sod_start, 2); -#endif /* USE_JPWL */ - /* <tcps[j2k->curtileno]; - for (layno = 0; layno < tcp->numlayers; layno++) { - if (tcp->rates[layno] > (j2k->sod_start / (cp->th * cp->tw))) { - tcp->rates[layno] -= (j2k->sod_start / (cp->th * cp->tw)); - } else if (tcp->rates[layno]) { - tcp->rates[layno] = 1; - } - } - if (j2k->cur_tp_num == 0) { - tcd->tcd_image->tiles->packno = 0; - if (cstr_info) { - cstr_info->packno = 0; - } - } - - l = tcd_encode_tile(tcd, j2k->curtileno, cio_getbp(cio), - cio_numbytesleft(cio) - 2, cstr_info); - - /* Writing Psot in SOT marker */ - totlen = cio_tell(cio) + l - j2k->sot_start; - cio_seek(cio, j2k->sot_start + 6); - cio_write(cio, totlen, 4); - cio_seek(cio, j2k->sot_start + totlen); - /* Writing Ttlm and Ptlm in TLM marker */ - if (cp->cinema) { - cio_seek(cio, j2k->tlm_start + 6 + (5 * j2k->cur_tp_num)); - cio_write(cio, j2k->curtileno, 1); - cio_write(cio, totlen, 4); - } - cio_seek(cio, j2k->sot_start + totlen); -} - -static void j2k_read_sod(opj_j2k_t *j2k) -{ - int len, truncate = 0, i; - unsigned char *data = NULL, *data_ptr = NULL; - - opj_cio_t *cio = j2k->cio; - int curtileno = j2k->curtileno; - - /* Index */ - if (j2k->cstr_info) { - j2k->cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_end_header = - cio_tell(cio) + j2k->pos_correction - 1; - if (j2k->cur_tp_num == 0) { - j2k->cstr_info->tile[j2k->curtileno].end_header = cio_tell( - cio) + j2k->pos_correction - 1; - } - j2k->cstr_info->packno = 0; - } - - len = int_min(j2k->eot - cio_getbp(cio), cio_numbytesleft(cio) + 1); - - if (len == cio_numbytesleft(cio) + 1) { - truncate = 1; /* Case of a truncate codestream */ - } - - data = j2k->tile_data[curtileno]; - data = (unsigned char*) opj_realloc(data, - (j2k->tile_len[curtileno] + len) * sizeof(unsigned char)); - - data_ptr = data + j2k->tile_len[curtileno]; - for (i = 0; i < len; i++) { - data_ptr[i] = cio_read(cio, 1); - } - - j2k->tile_len[curtileno] += len; - j2k->tile_data[curtileno] = data; - - if (!truncate) { - j2k->state = J2K_STATE_TPHSOT; - } else { - j2k->state = J2K_STATE_NEOC; /* RAJOUTE !! */ - } - j2k->cur_tp_num++; -} - -static void j2k_write_rgn(opj_j2k_t *j2k, int compno, int tileno) -{ - opj_cp_t *cp = j2k->cp; - opj_tcp_t *tcp = &cp->tcps[tileno]; - opj_cio_t *cio = j2k->cio; - int numcomps = j2k->image->numcomps; - - cio_write(cio, J2K_MS_RGN, 2); /* RGN */ - cio_write(cio, numcomps <= 256 ? 5 : 6, 2); /* Lrgn */ - cio_write(cio, compno, numcomps <= 256 ? 1 : 2); /* Crgn */ - cio_write(cio, 0, 1); /* Srgn */ - cio_write(cio, tcp->tccps[compno].roishift, 1); /* SPrgn */ -} - -static void j2k_read_rgn(opj_j2k_t *j2k) -{ - int len, compno, roisty; - - opj_cp_t *cp = j2k->cp; - opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : - j2k->default_tcp; - opj_cio_t *cio = j2k->cio; - int numcomps = j2k->image->numcomps; - - len = cio_read(cio, 2); /* Lrgn */ - compno = cio_read(cio, numcomps <= 256 ? 1 : 2); /* Crgn */ - roisty = cio_read(cio, 1); /* Srgn */ - -#ifdef USE_JPWL - if (j2k->cp->correct) { - /* totlen is negative or larger than the bytes left!!! */ - if (compno >= numcomps) { - opj_event_msg(j2k->cinfo, EVT_ERROR, - "JPWL: bad component number in RGN (%d when there are only %d)\n", - compno, numcomps); - if (!JPWL_ASSUME || JPWL_ASSUME) { - opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n"); - return; - } - } - }; -#endif /* USE_JPWL */ - - if (compno >= numcomps) { - opj_event_msg(j2k->cinfo, EVT_ERROR, - "bad component number in RGN (%d out of a maximum of %d)\n", - compno, j2k->image->numcomps); - return; - } - - tcp->tccps[compno].roishift = cio_read(cio, 1); /* SPrgn */ -} - -static void j2k_write_eoc(opj_j2k_t *j2k) -{ - opj_cio_t *cio = j2k->cio; - /* opj_event_msg(j2k->cinfo, "%.8x: EOC\n", cio_tell(cio) + j2k->pos_correction); */ - cio_write(cio, J2K_MS_EOC, 2); - - /* UniPG>> */ -#ifdef USE_JPWL - /* update markers struct */ - j2k_add_marker(j2k->cstr_info, J2K_MS_EOC, cio_tell(cio) - 2, 2); -#endif /* USE_JPWL */ - /* <cp->limit_decoding != DECODE_ALL_BUT_PACKETS) { - opj_tcd_t *tcd = tcd_create(j2k->cinfo); - tcd_malloc_decode(tcd, j2k->image, j2k->cp); - for (i = 0; i < j2k->cp->tileno_size; i++) { - tcd_malloc_decode_tile(tcd, j2k->image, j2k->cp, i, j2k->cstr_info); - if (j2k->cp->tileno[i] != -1) { - tileno = j2k->cp->tileno[i]; - success = tcd_decode_tile(tcd, j2k->tile_data[tileno], j2k->tile_len[tileno], - tileno, j2k->cstr_info); - opj_free(j2k->tile_data[tileno]); - j2k->tile_data[tileno] = NULL; - tcd_free_decode_tile(tcd, i); - } else { - success = OPJ_FALSE; - } - if (success == OPJ_FALSE) { - j2k->state |= J2K_STATE_ERR; - break; - } - } - tcd_free_decode(tcd); - tcd_destroy(tcd); - } - /* if packets should not be decoded */ - else { - for (i = 0; i < j2k->cp->tileno_size; i++) { - tileno = j2k->cp->tileno[i]; - opj_free(j2k->tile_data[tileno]); - j2k->tile_data[tileno] = NULL; - } - } - if (j2k->state & J2K_STATE_ERR) { - j2k->state = J2K_STATE_MT + J2K_STATE_ERR; - } else { - j2k->state = J2K_STATE_MT; - } -} - -typedef struct opj_dec_mstabent { - /** marker value */ - int id; - /** value of the state when the marker can appear */ - int states; - /** action linked to the marker */ - void (*handler)(opj_j2k_t *j2k); -} opj_dec_mstabent_t; - -opj_dec_mstabent_t j2k_dec_mstab[] = { - {J2K_MS_SOC, J2K_STATE_MHSOC, j2k_read_soc}, - {J2K_MS_SOT, J2K_STATE_MH | J2K_STATE_TPHSOT, j2k_read_sot}, - {J2K_MS_SOD, J2K_STATE_TPH, j2k_read_sod}, - {J2K_MS_EOC, J2K_STATE_TPHSOT, j2k_read_eoc}, - {J2K_MS_SIZ, J2K_STATE_MHSIZ, j2k_read_siz}, - {J2K_MS_COD, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_cod}, - {J2K_MS_COC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_coc}, - {J2K_MS_RGN, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_rgn}, - {J2K_MS_QCD, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_qcd}, - {J2K_MS_QCC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_qcc}, - {J2K_MS_POC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_poc}, - {J2K_MS_TLM, J2K_STATE_MH, j2k_read_tlm}, - {J2K_MS_PLM, J2K_STATE_MH, j2k_read_plm}, - {J2K_MS_PLT, J2K_STATE_TPH, j2k_read_plt}, - {J2K_MS_PPM, J2K_STATE_MH, j2k_read_ppm}, - {J2K_MS_PPT, J2K_STATE_TPH, j2k_read_ppt}, - {J2K_MS_SOP, 0, 0}, - {J2K_MS_CRG, J2K_STATE_MH, j2k_read_crg}, - {J2K_MS_COM, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_com}, - -#ifdef USE_JPWL - {J2K_MS_EPC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_epc}, - {J2K_MS_EPB, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_epb}, - {J2K_MS_ESD, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_esd}, - {J2K_MS_RED, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_red}, -#endif /* USE_JPWL */ -#ifdef USE_JPSEC - {J2K_MS_SEC, J2K_STATE_MH, j2k_read_sec}, - {J2K_MS_INSEC, 0, j2k_read_insec}, -#endif /* USE_JPSEC */ - - {0, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_unk} -}; - -static void j2k_read_unk(opj_j2k_t *j2k) -{ - opj_event_msg(j2k->cinfo, EVT_WARNING, "Unknown marker\n"); - -#ifdef USE_JPWL - if (j2k->cp->correct) { - int m = 0, id, i; - int min_id = 0, min_dist = 17, cur_dist = 0, tmp_id; - cio_seek(j2k->cio, cio_tell(j2k->cio) - 2); - id = cio_read(j2k->cio, 2); - opj_event_msg(j2k->cinfo, EVT_ERROR, - "JPWL: really don't know this marker %x\n", - id); - if (!JPWL_ASSUME) { - opj_event_msg(j2k->cinfo, EVT_ERROR, - "- possible synch loss due to uncorrectable codestream errors => giving up\n"); - return; - } - /* OK, activate this at your own risk!!! */ - /* we look for the marker at the minimum hamming distance from this */ - while (j2k_dec_mstab[m].id) { - - /* 1's where they differ */ - tmp_id = j2k_dec_mstab[m].id ^ id; - - /* compute the hamming distance between our id and the current */ - cur_dist = 0; - for (i = 0; i < 16; i++) { - if ((tmp_id >> i) & 0x0001) { - cur_dist++; - } - } - - /* if current distance is smaller, set the minimum */ - if (cur_dist < min_dist) { - min_dist = cur_dist; - min_id = j2k_dec_mstab[m].id; - } - - /* jump to the next marker */ - m++; - } - - /* do we substitute the marker? */ - if (min_dist < JPWL_MAXIMUM_HAMMING) { - opj_event_msg(j2k->cinfo, EVT_ERROR, - "- marker %x is at distance %d from the read %x\n", - min_id, min_dist, id); - opj_event_msg(j2k->cinfo, EVT_ERROR, - "- trying to substitute in place and crossing fingers!\n"); - cio_seek(j2k->cio, cio_tell(j2k->cio) - 2); - cio_write(j2k->cio, min_id, 2); - - /* rewind */ - cio_seek(j2k->cio, cio_tell(j2k->cio) - 2); - - } - - }; -#endif /* USE_JPWL */ - -} - -/** -Read the lookup table containing all the marker, status and action -@param id Marker value -*/ -static opj_dec_mstabent_t *j2k_dec_mstab_lookup(int id) -{ - opj_dec_mstabent_t *e; - for (e = j2k_dec_mstab; e->id != 0; e++) { - if (e->id == id) { - break; - } - } - return e; -} - -/* ----------------------------------------------------------------------- */ -/* J2K / JPT decoder interface */ -/* ----------------------------------------------------------------------- */ - -opj_j2k_t* j2k_create_decompress(opj_common_ptr cinfo) -{ - opj_j2k_t *j2k = (opj_j2k_t*) opj_calloc(1, sizeof(opj_j2k_t)); - if (!j2k) { - return NULL; - } - - j2k->default_tcp = (opj_tcp_t*) opj_calloc(1, sizeof(opj_tcp_t)); - if (!j2k->default_tcp) { - opj_free(j2k); - return NULL; - } - - j2k->cinfo = cinfo; - j2k->tile_data = NULL; - - return j2k; -} - -void j2k_destroy_decompress(opj_j2k_t *j2k) -{ - int i = 0; - - if (j2k->tile_len != NULL) { - opj_free(j2k->tile_len); - } - if (j2k->tile_data != NULL) { - if (j2k->cp != NULL) { - for (i = 0; i < j2k->cp->tileno_size; i++) { - int tileno = j2k->cp->tileno[i]; - opj_free(j2k->tile_data[tileno]); - j2k->tile_data[tileno] = NULL; - } - } - - opj_free(j2k->tile_data); - } - if (j2k->default_tcp != NULL) { - opj_tcp_t *default_tcp = j2k->default_tcp; - if (default_tcp->ppt_data_first != NULL) { - opj_free(default_tcp->ppt_data_first); - } - if (j2k->default_tcp->tccps != NULL) { - opj_free(j2k->default_tcp->tccps); - } - opj_free(j2k->default_tcp); - } - if (j2k->cp != NULL) { - opj_cp_t *cp = j2k->cp; - if (cp->tcps != NULL) { - for (i = 0; i < cp->tw * cp->th; i++) { - if (cp->tcps[i].ppt_data_first != NULL) { - opj_free(cp->tcps[i].ppt_data_first); - } - if (cp->tcps[i].tccps != NULL) { - opj_free(cp->tcps[i].tccps); - } - } - opj_free(cp->tcps); - } - if (cp->ppm_data_first != NULL) { - opj_free(cp->ppm_data_first); - } - if (cp->tileno != NULL) { - opj_free(cp->tileno); - } - if (cp->comment != NULL) { - opj_free(cp->comment); - } - - opj_free(cp); - } - opj_free(j2k); -} - -void j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters) -{ - if (j2k && parameters) { - /* create and initialize the coding parameters structure */ - opj_cp_t *cp = (opj_cp_t*) opj_calloc(1, sizeof(opj_cp_t)); - cp->reduce = parameters->cp_reduce; - cp->layer = parameters->cp_layer; - cp->limit_decoding = parameters->cp_limit_decoding; - -#ifdef USE_JPWL - cp->correct = parameters->jpwl_correct; - cp->exp_comps = parameters->jpwl_exp_comps; - cp->max_tiles = parameters->jpwl_max_tiles; -#endif /* USE_JPWL */ - - - /* keep a link to cp so that we can destroy it later in j2k_destroy_decompress */ - j2k->cp = cp; - } -} - -opj_image_t* j2k_decode(opj_j2k_t *j2k, opj_cio_t *cio, - opj_codestream_info_t *cstr_info) -{ - opj_image_t *image = NULL; - - opj_common_ptr cinfo = j2k->cinfo; - - j2k->cio = cio; - j2k->cstr_info = cstr_info; - if (cstr_info) { - memset(cstr_info, 0, sizeof(opj_codestream_info_t)); - } - - /* create an empty image */ - image = opj_image_create0(); - j2k->image = image; - - j2k->state = J2K_STATE_MHSOC; - - for (;;) { - opj_dec_mstabent_t *e; - int id = cio_read(cio, 2); - -#ifdef USE_JPWL - /* we try to honor JPWL correction power */ - if (j2k->cp->correct) { - - int orig_pos = cio_tell(cio); - opj_bool status; - - /* call the corrector */ - status = jpwl_correct(j2k); - - /* go back to where you were */ - cio_seek(cio, orig_pos - 2); - - /* re-read the marker */ - id = cio_read(cio, 2); - - /* check whether it begins with ff */ - if (id >> 8 != 0xff) { - opj_event_msg(cinfo, EVT_ERROR, - "JPWL: possible bad marker %x at %d\n", - id, cio_tell(cio) - 2); - if (!JPWL_ASSUME) { - opj_image_destroy(image); - opj_event_msg(cinfo, EVT_ERROR, "JPWL: giving up\n"); - return 0; - } - /* we try to correct */ - id = id | 0xff00; - cio_seek(cio, cio_tell(cio) - 2); - cio_write(cio, id, 2); - opj_event_msg(cinfo, EVT_WARNING, "- trying to adjust this\n" - "- setting marker to %x\n", - id); - } - - } -#endif /* USE_JPWL */ - - if (id >> 8 != 0xff) { - if (cio_numbytesleft(cio) != 0) { /* not end of file reached and no EOC */ - opj_event_msg(cinfo, EVT_ERROR, "%.8x: expected a marker instead of %x\n", - cio_tell(cio) - 2, id); - opj_image_destroy(image); - return 0; - } - opj_event_msg(cinfo, EVT_WARNING, "%.8x: expected a marker instead of %x\n", - cio_tell(cio) - 2, id); - j2k->state = J2K_STATE_NEOC; - break; - } - e = j2k_dec_mstab_lookup(id); - /* Check if the marker is known*/ - if (!(j2k->state & e->states)) { - opj_image_destroy(image); - opj_event_msg(cinfo, EVT_ERROR, "%.8x: unexpected marker %x\n", - cio_tell(cio) - 2, id); - return 0; - } - /* Check if the decoding is limited to the main header*/ - if (e->id == J2K_MS_SOT && j2k->cp->limit_decoding == LIMIT_TO_MAIN_HEADER) { - opj_event_msg(cinfo, EVT_INFO, "Main Header decoded.\n"); - return image; - } - - if (e->handler) { - (*e->handler)(j2k); - } - if (j2k->state & J2K_STATE_ERR) { - opj_image_destroy(image); - return NULL; - } - - if (j2k->state == J2K_STATE_MT) { - break; - } - if (j2k->state == J2K_STATE_NEOC) { - break; - } - } - if (j2k->state == J2K_STATE_NEOC) { - j2k_read_eoc(j2k); - } - - if (j2k->state != J2K_STATE_MT) { - opj_event_msg(cinfo, EVT_WARNING, "Incomplete bitstream\n"); - } - return image; -} - -/* -* Read a JPT-stream and decode file -* -*/ -opj_image_t* j2k_decode_jpt_stream(opj_j2k_t *j2k, opj_cio_t *cio, - opj_codestream_info_t *cstr_info) -{ - opj_image_t *image = NULL; - opj_jpt_msg_header_t header; - int position; - opj_common_ptr cinfo = j2k->cinfo; - - OPJ_ARG_NOT_USED(cstr_info); - - j2k->cio = cio; - - /* create an empty image */ - image = opj_image_create0(); - j2k->image = image; - - j2k->state = J2K_STATE_MHSOC; - - /* Initialize the header */ - jpt_init_msg_header(&header); - /* Read the first header of the message */ - jpt_read_msg_header(cinfo, cio, &header); - - position = cio_tell(cio); - if (header.Class_Id != 6) { /* 6 : Main header data-bin message */ - opj_image_destroy(image); - opj_event_msg(cinfo, EVT_ERROR, - "[JPT-stream] : Expecting Main header first [class_Id %d] !\n", - header.Class_Id); - return 0; - } - - for (;;) { - opj_dec_mstabent_t *e = NULL; - int id; - - if (!cio_numbytesleft(cio)) { - j2k_read_eoc(j2k); - return image; - } - /* data-bin read -> need to read a new header */ - if ((unsigned int)(cio_tell(cio) - position) == header.Msg_length) { - jpt_read_msg_header(cinfo, cio, &header); - position = cio_tell(cio); - if (header.Class_Id != 4) { /* 4 : Tile data-bin message */ - opj_image_destroy(image); - opj_event_msg(cinfo, EVT_ERROR, "[JPT-stream] : Expecting Tile info !\n"); - return 0; - } - } - - id = cio_read(cio, 2); - if (id >> 8 != 0xff) { - if (cio_numbytesleft(cio) != 0) { /* no end of file reached and no EOC */ - opj_event_msg(cinfo, EVT_ERROR, "%.8x: expected a marker instead of %x\n", - cio_tell(cio) - 2, id); - opj_image_destroy(image); - return 0; - } - opj_event_msg(cinfo, EVT_WARNING, "%.8x: expected a marker instead of %x\n", - cio_tell(cio) - 2, id); - j2k->state = J2K_STATE_NEOC; - break; - } - e = j2k_dec_mstab_lookup(id); - if (!(j2k->state & e->states)) { - opj_image_destroy(image); - opj_event_msg(cinfo, EVT_ERROR, "%.8x: unexpected marker %x\n", - cio_tell(cio) - 2, id); - return 0; - } - if (e->handler) { - (*e->handler)(j2k); - } - if (j2k->state == J2K_STATE_MT) { - break; - } - if (j2k->state == J2K_STATE_NEOC) { - break; - } - } - if (j2k->state == J2K_STATE_NEOC) { - j2k_read_eoc(j2k); - } - - if (j2k->state != J2K_STATE_MT) { - opj_event_msg(cinfo, EVT_WARNING, "Incomplete bitstream\n"); - } - - return image; -} - -/* ----------------------------------------------------------------------- */ -/* J2K encoder interface */ -/* ----------------------------------------------------------------------- */ - -opj_j2k_t* j2k_create_compress(opj_common_ptr cinfo) -{ - opj_j2k_t *j2k = (opj_j2k_t*) opj_calloc(1, sizeof(opj_j2k_t)); - if (j2k) { - j2k->cinfo = cinfo; - } - return j2k; -} - -void j2k_destroy_compress(opj_j2k_t *j2k) -{ - int tileno; - - if (!j2k) { - return; - } - if (j2k->cp != NULL) { - opj_cp_t *cp = j2k->cp; - - if (cp->comment) { - opj_free(cp->comment); - } - if (cp->matrice) { - opj_free(cp->matrice); - } - for (tileno = 0; tileno < cp->tw * cp->th; tileno++) { - opj_free(cp->tcps[tileno].tccps); - } - opj_free(cp->tcps); - opj_free(cp); - } - - opj_free(j2k); -} - -void j2k_setup_encoder(opj_j2k_t *j2k, opj_cparameters_t *parameters, - opj_image_t *image) -{ - int i, j, tileno, numpocs_tile; - opj_cp_t *cp = NULL; - - if (!j2k || !parameters || ! image) { - return; - } - - /* create and initialize the coding parameters structure */ - cp = (opj_cp_t*) opj_calloc(1, sizeof(opj_cp_t)); - - /* keep a link to cp so that we can destroy it later in j2k_destroy_compress */ - j2k->cp = cp; - - /* set default values for cp */ - cp->tw = 1; - cp->th = 1; - - /* - copy user encoding parameters - */ - cp->cinema = parameters->cp_cinema; - cp->max_comp_size = parameters->max_comp_size; - cp->rsiz = parameters->cp_rsiz; - cp->disto_alloc = parameters->cp_disto_alloc; - cp->fixed_alloc = parameters->cp_fixed_alloc; - cp->fixed_quality = parameters->cp_fixed_quality; - - /* mod fixed_quality */ - if (parameters->cp_matrice) { - size_t array_size = parameters->tcp_numlayers * parameters->numresolution * 3 * - sizeof(int); - cp->matrice = (int *) opj_malloc(array_size); - memcpy(cp->matrice, parameters->cp_matrice, array_size); - } - - /* tiles */ - cp->tdx = parameters->cp_tdx; - cp->tdy = parameters->cp_tdy; - - /* tile offset */ - cp->tx0 = parameters->cp_tx0; - cp->ty0 = parameters->cp_ty0; - - /* comment string */ - if (parameters->cp_comment) { - cp->comment = (char*)opj_malloc(strlen(parameters->cp_comment) + 1); - if (cp->comment) { - strcpy(cp->comment, parameters->cp_comment); - } - } - - /* - calculate other encoding parameters - */ - - if (parameters->tile_size_on) { - cp->tw = int_ceildiv(image->x1 - cp->tx0, cp->tdx); - cp->th = int_ceildiv(image->y1 - cp->ty0, cp->tdy); - } else { - cp->tdx = image->x1 - cp->tx0; - cp->tdy = image->y1 - cp->ty0; - } - - if (parameters->tp_on) { - cp->tp_flag = parameters->tp_flag; - cp->tp_on = 1; - } - - cp->img_size = 0; - for (i = 0; i < image->numcomps ; i++) { - cp->img_size += (image->comps[i].w * image->comps[i].h * image->comps[i].prec); - } - - -#ifdef USE_JPWL - /* - calculate JPWL encoding parameters - */ - - if (parameters->jpwl_epc_on) { - int i; - - /* set JPWL on */ - cp->epc_on = OPJ_TRUE; - cp->info_on = OPJ_FALSE; /* no informative technique */ - - /* set EPB on */ - if ((parameters->jpwl_hprot_MH > 0) || (parameters->jpwl_hprot_TPH[0] > 0)) { - cp->epb_on = OPJ_TRUE; - - cp->hprot_MH = parameters->jpwl_hprot_MH; - for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) { - cp->hprot_TPH_tileno[i] = parameters->jpwl_hprot_TPH_tileno[i]; - cp->hprot_TPH[i] = parameters->jpwl_hprot_TPH[i]; - } - /* if tile specs are not specified, copy MH specs */ - if (cp->hprot_TPH[0] == -1) { - cp->hprot_TPH_tileno[0] = 0; - cp->hprot_TPH[0] = parameters->jpwl_hprot_MH; - } - for (i = 0; i < JPWL_MAX_NO_PACKSPECS; i++) { - cp->pprot_tileno[i] = parameters->jpwl_pprot_tileno[i]; - cp->pprot_packno[i] = parameters->jpwl_pprot_packno[i]; - cp->pprot[i] = parameters->jpwl_pprot[i]; - } - } - - /* set ESD writing */ - if ((parameters->jpwl_sens_size == 1) || (parameters->jpwl_sens_size == 2)) { - cp->esd_on = OPJ_TRUE; - - cp->sens_size = parameters->jpwl_sens_size; - cp->sens_addr = parameters->jpwl_sens_addr; - cp->sens_range = parameters->jpwl_sens_range; - - cp->sens_MH = parameters->jpwl_sens_MH; - for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) { - cp->sens_TPH_tileno[i] = parameters->jpwl_sens_TPH_tileno[i]; - cp->sens_TPH[i] = parameters->jpwl_sens_TPH[i]; - } - } - - /* always set RED writing to false: we are at the encoder */ - cp->red_on = OPJ_FALSE; - - } else { - cp->epc_on = OPJ_FALSE; - } -#endif /* USE_JPWL */ - - - /* initialize the multiple tiles */ - /* ---------------------------- */ - cp->tcps = (opj_tcp_t*) opj_calloc(cp->tw * cp->th, sizeof(opj_tcp_t)); - - for (tileno = 0; tileno < cp->tw * cp->th; tileno++) { - opj_tcp_t *tcp = &cp->tcps[tileno]; - tcp->numlayers = parameters->tcp_numlayers; - for (j = 0; j < tcp->numlayers; j++) { - if (cp->cinema) { - if (cp->fixed_quality) { - tcp->distoratio[j] = parameters->tcp_distoratio[j]; - } - tcp->rates[j] = parameters->tcp_rates[j]; - } else { - if (cp->fixed_quality) { /* add fixed_quality */ - tcp->distoratio[j] = parameters->tcp_distoratio[j]; - } else { - tcp->rates[j] = parameters->tcp_rates[j]; - } - } - } - tcp->csty = parameters->csty; - tcp->prg = parameters->prog_order; - tcp->mct = parameters->tcp_mct; - - numpocs_tile = 0; - tcp->POC = 0; - if (parameters->numpocs) { - /* initialisation of POC */ - tcp->POC = 1; - for (i = 0; i < parameters->numpocs; i++) { - if ((tileno == parameters->POC[i].tile - 1) || - (parameters->POC[i].tile == -1)) { - opj_poc_t *tcp_poc = &tcp->pocs[numpocs_tile]; - tcp_poc->resno0 = parameters->POC[numpocs_tile].resno0; - tcp_poc->compno0 = parameters->POC[numpocs_tile].compno0; - tcp_poc->layno1 = parameters->POC[numpocs_tile].layno1; - tcp_poc->resno1 = parameters->POC[numpocs_tile].resno1; - tcp_poc->compno1 = parameters->POC[numpocs_tile].compno1; - tcp_poc->prg1 = parameters->POC[numpocs_tile].prg1; - tcp_poc->tile = parameters->POC[numpocs_tile].tile; - numpocs_tile++; - } - } - tcp->numpocs = numpocs_tile - 1 ; - } else { - tcp->numpocs = 0; - } - - tcp->tccps = (opj_tccp_t*) opj_calloc(image->numcomps, sizeof(opj_tccp_t)); - - for (i = 0; i < image->numcomps; i++) { - opj_tccp_t *tccp = &tcp->tccps[i]; - tccp->csty = parameters->csty & - 0x01; /* 0 => one precinct || 1 => custom precinct */ - tccp->numresolutions = parameters->numresolution; - tccp->cblkw = int_floorlog2(parameters->cblockw_init); - tccp->cblkh = int_floorlog2(parameters->cblockh_init); - tccp->cblksty = parameters->mode; - tccp->qmfbid = parameters->irreversible ? 0 : 1; - tccp->qntsty = parameters->irreversible ? J2K_CCP_QNTSTY_SEQNT : - J2K_CCP_QNTSTY_NOQNT; - tccp->numgbits = 2; - if (i == parameters->roi_compno) { - tccp->roishift = parameters->roi_shift; - } else { - tccp->roishift = 0; - } - - if (parameters->cp_cinema) { - /*Precinct size for lowest frequency subband=128*/ - tccp->prcw[0] = 7; - tccp->prch[0] = 7; - /*Precinct size at all other resolutions = 256*/ - for (j = 1; j < tccp->numresolutions; j++) { - tccp->prcw[j] = 8; - tccp->prch[j] = 8; - } - } else { - if (parameters->csty & J2K_CCP_CSTY_PRT) { - int p = 0; - for (j = tccp->numresolutions - 1; j >= 0; j--) { - if (p < parameters->res_spec) { - - if (parameters->prcw_init[p] < 1) { - tccp->prcw[j] = 1; - } else { - tccp->prcw[j] = int_floorlog2(parameters->prcw_init[p]); - } - - if (parameters->prch_init[p] < 1) { - tccp->prch[j] = 1; - } else { - tccp->prch[j] = int_floorlog2(parameters->prch_init[p]); - } - - } else { - int res_spec = parameters->res_spec; - int size_prcw = parameters->prcw_init[res_spec - 1] >> (p - (res_spec - 1)); - int size_prch = parameters->prch_init[res_spec - 1] >> (p - (res_spec - 1)); - - if (size_prcw < 1) { - tccp->prcw[j] = 1; - } else { - tccp->prcw[j] = int_floorlog2(size_prcw); - } - - if (size_prch < 1) { - tccp->prch[j] = 1; - } else { - tccp->prch[j] = int_floorlog2(size_prch); - } - } - p++; - /*printf("\nsize precinct for level %d : %d,%d\n", j,tccp->prcw[j], tccp->prch[j]); */ - } /*end for*/ - } else { - for (j = 0; j < tccp->numresolutions; j++) { - tccp->prcw[j] = 15; - tccp->prch[j] = 15; - } - } - } - - dwt_calc_explicit_stepsizes(tccp, image->comps[i].prec); - } - } -} - -opj_bool j2k_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image, - opj_codestream_info_t *cstr_info) -{ - int tileno, compno; - opj_cp_t *cp = NULL; - - opj_tcd_t *tcd = NULL; /* TCD component */ - - j2k->cio = cio; - j2k->image = image; - - cp = j2k->cp; - - /* INDEX >> */ - j2k->cstr_info = cstr_info; - if (cstr_info) { - int compno; - cstr_info->tile = (opj_tile_info_t *) opj_malloc(cp->tw * cp->th * sizeof( - opj_tile_info_t)); - cstr_info->image_w = image->x1 - image->x0; - cstr_info->image_h = image->y1 - image->y0; - cstr_info->prog = (&cp->tcps[0])->prg; - cstr_info->tw = cp->tw; - cstr_info->th = cp->th; - cstr_info->tile_x = cp->tdx; /* new version parser */ - cstr_info->tile_y = cp->tdy; /* new version parser */ - cstr_info->tile_Ox = cp->tx0; /* new version parser */ - cstr_info->tile_Oy = cp->ty0; /* new version parser */ - cstr_info->numcomps = image->numcomps; - cstr_info->numlayers = (&cp->tcps[0])->numlayers; - cstr_info->numdecompos = (int*) opj_malloc(image->numcomps * sizeof(int)); - for (compno = 0; compno < image->numcomps; compno++) { - cstr_info->numdecompos[compno] = (&cp->tcps[0])->tccps->numresolutions - 1; - } - cstr_info->D_max = 0.0; /* ADD Marcela */ - cstr_info->main_head_start = cio_tell(cio); /* position of SOC */ - cstr_info->maxmarknum = 100; - cstr_info->marker = (opj_marker_info_t *) opj_malloc(cstr_info->maxmarknum * - sizeof(opj_marker_info_t)); - cstr_info->marknum = 0; - } - /* << INDEX */ - - j2k_write_soc(j2k); - j2k_write_siz(j2k); - j2k_write_cod(j2k); - j2k_write_qcd(j2k); - - if (cp->cinema) { - for (compno = 1; compno < image->numcomps; compno++) { - j2k_write_coc(j2k, compno); - j2k_write_qcc(j2k, compno); - } - } - - for (compno = 0; compno < image->numcomps; compno++) { - opj_tcp_t *tcp = &cp->tcps[0]; - if (tcp->tccps[compno].roishift) { - j2k_write_rgn(j2k, compno, 0); - } - } - if (cp->comment != NULL) { - j2k_write_com(j2k); - } - - j2k->totnum_tp = j2k_calculate_tp(cp, image->numcomps, image, j2k); - /* TLM Marker*/ - if (cp->cinema) { - j2k_write_tlm(j2k); - if (cp->cinema == CINEMA4K_24) { - j2k_write_poc(j2k); - } - } - - /* uncomment only for testing JPSEC marker writing */ - /* j2k_write_sec(j2k); */ - - /* INDEX >> */ - if (cstr_info) { - cstr_info->main_head_end = cio_tell(cio) - 1; - } - /* << INDEX */ - /**** Main Header ENDS here ***/ - - /* create the tile encoder */ - tcd = tcd_create(j2k->cinfo); - - /* encode each tile */ - for (tileno = 0; tileno < cp->tw * cp->th; tileno++) { - int pino; - int tilepartno = 0; - /* UniPG>> */ - int acc_pack_num = 0; - /* <tcps[tileno]; - opj_event_msg(j2k->cinfo, EVT_INFO, "tile number %d / %d\n", tileno + 1, - cp->tw * cp->th); - - j2k->curtileno = tileno; - j2k->cur_tp_num = 0; - tcd->cur_totnum_tp = j2k->cur_totnum_tp[j2k->curtileno]; - /* initialisation before tile encoding */ - if (tileno == 0) { - tcd_malloc_encode(tcd, image, cp, j2k->curtileno); - } else { - tcd_init_encode(tcd, image, cp, j2k->curtileno); - } - - /* INDEX >> */ - if (cstr_info) { - cstr_info->tile[j2k->curtileno].start_pos = cio_tell(cio) + j2k->pos_correction; - cstr_info->tile[j2k->curtileno].maxmarknum = 10; - cstr_info->tile[j2k->curtileno].marker = (opj_marker_info_t *) opj_malloc( - cstr_info->tile[j2k->curtileno].maxmarknum * sizeof(opj_marker_info_t)); - cstr_info->tile[j2k->curtileno].marknum = 0; - } - /* << INDEX */ - - for (pino = 0; pino <= tcp->numpocs; pino++) { - int tot_num_tp; - tcd->cur_pino = pino; - - /*Get number of tile parts*/ - tot_num_tp = j2k_get_num_tp(cp, pino, tileno); - tcd->tp_pos = cp->tp_pos; - - for (tilepartno = 0; tilepartno < tot_num_tp ; tilepartno++) { - j2k->tp_num = tilepartno; - /* INDEX >> */ - if (cstr_info) - cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_start_pos = - cio_tell(cio) + j2k->pos_correction; - /* << INDEX */ - j2k_write_sot(j2k); - - if (j2k->cur_tp_num == 0 && cp->cinema == 0) { - for (compno = 1; compno < image->numcomps; compno++) { - j2k_write_coc(j2k, compno); - j2k_write_qcc(j2k, compno); - } - if (cp->tcps[tileno].numpocs) { - j2k_write_poc(j2k); - } - } - - /* INDEX >> */ - if (cstr_info) - cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_end_header = - cio_tell(cio) + j2k->pos_correction + 1; - /* << INDEX */ - - j2k_write_sod(j2k, tcd); - - /* INDEX >> */ - if (cstr_info) { - cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_end_pos = - cio_tell(cio) + j2k->pos_correction - 1; - cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_start_pack = - acc_pack_num; - cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_numpacks = - cstr_info->packno - acc_pack_num; - acc_pack_num = cstr_info->packno; - } - /* << INDEX */ - - j2k->cur_tp_num++; - } - } - if (cstr_info) { - cstr_info->tile[j2k->curtileno].end_pos = cio_tell(cio) + j2k->pos_correction - - 1; - } - - - /* - if (tile->PPT) { // BAD PPT !!! - FILE *PPT_file; - int i; - PPT_file=fopen("PPT","rb"); - fprintf(stderr,"%c%c%c%c",255,97,tile->len_ppt/256,tile->len_ppt%256); - for (i=0;ilen_ppt;i++) { - unsigned char elmt; - fread(&elmt, 1, 1, PPT_file); - fwrite(&elmt,1,1,f); - } - fclose(PPT_file); - unlink("PPT"); - } - */ - - } - - /* destroy the tile encoder */ - tcd_free_encode(tcd); - tcd_destroy(tcd); - - opj_free(j2k->cur_totnum_tp); - - j2k_write_eoc(j2k); - - if (cstr_info) { - cstr_info->codestream_size = cio_tell(cio) + j2k->pos_correction; - /* UniPG>> */ - /* The following adjustment is done to adjust the codestream size */ - /* if SOD is not at 0 in the buffer. Useful in case of JP2, where */ - /* the first bunch of bytes is not in the codestream */ - cstr_info->codestream_size -= cstr_info->main_head_start; - /* <epc_on) { - - /* encode according to JPWL */ - jpwl_encode(j2k, cio, image); - - } -#endif /* USE_JPWL */ - - return OPJ_TRUE; -} - -static void j2k_add_mhmarker(opj_codestream_info_t *cstr_info, - unsigned short int type, int pos, int len) -{ - - if (!cstr_info) { - return; - } - - /* expand the list? */ - if ((cstr_info->marknum + 1) > cstr_info->maxmarknum) { - cstr_info->maxmarknum = 100 + (int)((float) cstr_info->maxmarknum * 1.0F); - cstr_info->marker = (opj_marker_info_t*)opj_realloc(cstr_info->marker, - cstr_info->maxmarknum); - } - - /* add the marker */ - cstr_info->marker[cstr_info->marknum].type = type; - cstr_info->marker[cstr_info->marknum].pos = pos; - cstr_info->marker[cstr_info->marknum].len = len; - cstr_info->marknum++; - -} - -static void j2k_add_tlmarker(int tileno, opj_codestream_info_t *cstr_info, - unsigned short int type, int pos, int len) -{ - - opj_marker_info_t *marker; - - if (!cstr_info) { - return; - } - - /* expand the list? */ - if ((cstr_info->tile[tileno].marknum + 1) > - cstr_info->tile[tileno].maxmarknum) { - cstr_info->tile[tileno].maxmarknum = 100 + (int)((float) - cstr_info->tile[tileno].maxmarknum * 1.0F); - cstr_info->tile[tileno].marker = (opj_marker_info_t*)opj_realloc( - cstr_info->tile[tileno].marker, cstr_info->maxmarknum); - } - - marker = &(cstr_info->tile[tileno].marker[cstr_info->tile[tileno].marknum]); - - /* add the marker */ - marker->type = type; - marker->pos = pos; - marker->len = len; - cstr_info->tile[tileno].marknum++; -} diff --git a/src/lib/openmj2/j2k.h b/src/lib/openmj2/j2k.h deleted file mode 100644 index 2dc43119..00000000 --- a/src/lib/openmj2/j2k.h +++ /dev/null @@ -1,456 +0,0 @@ -/* - * 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. - */ -#ifndef __J2K_H -#define __J2K_H -/** -@file j2k.h -@brief The JPEG-2000 Codestream Reader/Writer (J2K) - -The functions in J2K.C have for goal to read/write the several parts of the codestream: markers and data. -*/ - -/** @defgroup J2K J2K - JPEG-2000 codestream reader/writer */ -/*@{*/ - -#define J2K_CP_CSTY_PRT 0x01 -#define J2K_CP_CSTY_SOP 0x02 -#define J2K_CP_CSTY_EPH 0x04 -#define J2K_CCP_CSTY_PRT 0x01 -#define J2K_CCP_CBLKSTY_LAZY 0x01 /**< Selective arithmetic coding bypass */ -#define J2K_CCP_CBLKSTY_RESET 0x02 /**< Reset context probabilities on coding pass boundaries */ -#define J2K_CCP_CBLKSTY_TERMALL 0x04 /**< Termination on each coding pass */ -#define J2K_CCP_CBLKSTY_VSC 0x08 /**< Vertically stripe causal context */ -#define J2K_CCP_CBLKSTY_PTERM 0x10 /**< Predictable termination */ -#define J2K_CCP_CBLKSTY_SEGSYM 0x20 /**< Segmentation symbols are used */ -#define J2K_CCP_QNTSTY_NOQNT 0 -#define J2K_CCP_QNTSTY_SIQNT 1 -#define J2K_CCP_QNTSTY_SEQNT 2 - -/* ----------------------------------------------------------------------- */ - -#define J2K_MS_SOC 0xff4f /**< SOC marker value */ -#define J2K_MS_SOT 0xff90 /**< SOT marker value */ -#define J2K_MS_SOD 0xff93 /**< SOD marker value */ -#define J2K_MS_EOC 0xffd9 /**< EOC marker value */ -#define J2K_MS_SIZ 0xff51 /**< SIZ marker value */ -#define J2K_MS_COD 0xff52 /**< COD marker value */ -#define J2K_MS_COC 0xff53 /**< COC marker value */ -#define J2K_MS_RGN 0xff5e /**< RGN marker value */ -#define J2K_MS_QCD 0xff5c /**< QCD marker value */ -#define J2K_MS_QCC 0xff5d /**< QCC marker value */ -#define J2K_MS_POC 0xff5f /**< POC marker value */ -#define J2K_MS_TLM 0xff55 /**< TLM marker value */ -#define J2K_MS_PLM 0xff57 /**< PLM marker value */ -#define J2K_MS_PLT 0xff58 /**< PLT marker value */ -#define J2K_MS_PPM 0xff60 /**< PPM marker value */ -#define J2K_MS_PPT 0xff61 /**< PPT marker value */ -#define J2K_MS_SOP 0xff91 /**< SOP marker value */ -#define J2K_MS_EPH 0xff92 /**< EPH marker value */ -#define J2K_MS_CRG 0xff63 /**< CRG marker value */ -#define J2K_MS_COM 0xff64 /**< COM marker value */ -/* UniPG>> */ -#ifdef USE_JPWL -#define J2K_MS_EPC 0xff68 /**< EPC marker value (Part 11: JPEG 2000 for Wireless) */ -#define J2K_MS_EPB 0xff66 /**< EPB marker value (Part 11: JPEG 2000 for Wireless) */ -#define J2K_MS_ESD 0xff67 /**< ESD marker value (Part 11: JPEG 2000 for Wireless) */ -#define J2K_MS_RED 0xff69 /**< RED marker value (Part 11: JPEG 2000 for Wireless) */ -#endif /* USE_JPWL */ -#ifdef USE_JPSEC -#define J2K_MS_SEC 0xff65 /**< SEC marker value (Part 8: Secure JPEG 2000) */ -#define J2K_MS_INSEC 0xff94 /**< INSEC marker value (Part 8: Secure JPEG 2000) */ -#endif /* USE_JPSEC */ -/* < there was a PPT marker for the present tile */ - int ppt; - /** used in case of multiple marker PPT (number of info already stored) */ - int ppt_store; - /** ppmbug1 */ - int ppt_len; - /** add fixed_quality */ - float distoratio[100]; - /** tile-component coding parameters */ - opj_tccp_t *tccps; -} opj_tcp_t; - -/** -Coding parameters -*/ -typedef struct opj_cp { - /** Digital cinema profile*/ - OPJ_CINEMA_MODE cinema; - /** Maximum rate for each component. If == 0, component size limitation is not considered */ - int max_comp_size; - /** Size of the image in bits*/ - int img_size; - /** Rsiz*/ - OPJ_RSIZ_CAPABILITIES rsiz; - /** Enabling Tile part generation*/ - char tp_on; - /** Flag determining tile part generation*/ - char tp_flag; - /** Position of tile part flag in progression order*/ - int tp_pos; - /** allocation by rate/distortion */ - int disto_alloc; - /** allocation by fixed layer */ - int fixed_alloc; - /** add fixed_quality */ - int fixed_quality; - /** if != 0, then original dimension divided by 2^(reduce); if == 0 or not used, image is decoded to the full resolution */ - int reduce; - /** if != 0, then only the first "layer" layers are decoded; if == 0 or not used, all the quality layers are decoded */ - int layer; - /** if == NO_LIMITATION, decode entire codestream; if == LIMIT_TO_MAIN_HEADER then only decode the main header */ - OPJ_LIMIT_DECODING limit_decoding; - /** XTOsiz */ - int tx0; - /** YTOsiz */ - int ty0; - /** XTsiz */ - int tdx; - /** YTsiz */ - int tdy; - /** comment for coding */ - char *comment; - /** number of tiles in width */ - int tw; - /** number of tiles in height */ - int th; - /** ID number of the tiles present in the codestream */ - int *tileno; - /** size of the vector tileno */ - int tileno_size; - /** packet header store there for futur use in t2_decode_packet */ - unsigned char *ppm_data; - /** pointer remaining on the first byte of the first header if ppm is used */ - unsigned char *ppm_data_first; - /** if ppm == 1 --> there was a PPM marker for the present tile */ - int ppm; - /** use in case of multiple marker PPM (number of info already store) */ - int ppm_store; - /** use in case of multiple marker PPM (case on non-finished previous info) */ - int ppm_previous; - /** ppmbug1 */ - int ppm_len; - /** tile coding parameters */ - opj_tcp_t *tcps; - /** fixed layer */ - int *matrice; - /* UniPG>> */ -#ifdef USE_JPWL - /** enables writing of EPC in MH, thus activating JPWL */ - opj_bool epc_on; - /** enables writing of EPB, in case of activated JPWL */ - opj_bool epb_on; - /** enables writing of ESD, in case of activated JPWL */ - opj_bool esd_on; - /** enables writing of informative techniques of ESD, in case of activated JPWL */ - opj_bool info_on; - /** enables writing of RED, in case of activated JPWL */ - opj_bool red_on; - /** error protection method for MH (0,1,16,32,37-128) */ - int hprot_MH; - /** tile number of header protection specification (>=0) */ - int hprot_TPH_tileno[JPWL_MAX_NO_TILESPECS]; - /** error protection methods for TPHs (0,1,16,32,37-128) */ - int hprot_TPH[JPWL_MAX_NO_TILESPECS]; - /** tile number of packet protection specification (>=0) */ - int pprot_tileno[JPWL_MAX_NO_PACKSPECS]; - /** packet number of packet protection specification (>=0) */ - int pprot_packno[JPWL_MAX_NO_PACKSPECS]; - /** error protection methods for packets (0,1,16,32,37-128) */ - int pprot[JPWL_MAX_NO_PACKSPECS]; - /** enables writing of ESD, (0/2/4 bytes) */ - int sens_size; - /** sensitivity addressing size (0=auto/2/4 bytes) */ - int sens_addr; - /** sensitivity range (0-3) */ - int sens_range; - /** sensitivity method for MH (-1,0-7) */ - int sens_MH; - /** tile number of sensitivity specification (>=0) */ - int sens_TPH_tileno[JPWL_MAX_NO_TILESPECS]; - /** sensitivity methods for TPHs (-1,0-7) */ - int sens_TPH[JPWL_MAX_NO_TILESPECS]; - /** enables JPWL correction at the decoder */ - opj_bool correct; - /** expected number of components at the decoder */ - int exp_comps; - /** maximum number of tiles at the decoder */ - int max_tiles; -#endif /* USE_JPWL */ - /* <cp. -@param j2k J2K decompressor handle -@param parameters decompression parameters -*/ -void j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters); -/** -Decode an image from a JPEG-2000 codestream -@param j2k J2K decompressor handle -@param cio Input buffer stream -@param cstr_info Codestream information structure if required, NULL otherwise -@return Returns a decoded image if successful, returns NULL otherwise -*/ -opj_image_t* j2k_decode(opj_j2k_t *j2k, opj_cio_t *cio, - opj_codestream_info_t *cstr_info); -/** -Decode an image form a JPT-stream (JPEG 2000, JPIP) -@param j2k J2K decompressor handle -@param cio Input buffer stream -@param cstr_info Codestream information structure if required, NULL otherwise -@return Returns a decoded image if successful, returns NULL otherwise -*/ -opj_image_t* j2k_decode_jpt_stream(opj_j2k_t *j2k, opj_cio_t *cio, - opj_codestream_info_t *cstr_info); -/** -Creates a J2K compression structure -@param cinfo Codec context info -@return Returns a handle to a J2K compressor if successful, returns NULL otherwise -*/ -opj_j2k_t* j2k_create_compress(opj_common_ptr cinfo); -/** -Destroy a J2K compressor handle -@param j2k J2K compressor handle to destroy -*/ -void j2k_destroy_compress(opj_j2k_t *j2k); -/** -Setup the encoder parameters using the current image and using user parameters. -Coding parameters are returned in j2k->cp. -@param j2k J2K compressor handle -@param parameters compression parameters -@param image input filled image -*/ -void j2k_setup_encoder(opj_j2k_t *j2k, opj_cparameters_t *parameters, - opj_image_t *image); -/** -Converts an enum type progression order to string type -*/ -char *j2k_convert_progression_order(OPJ_PROG_ORDER prg_order); -/** -Encode an image into a JPEG-2000 codestream -@param j2k J2K compressor handle -@param cio Output buffer stream -@param image Image to encode -@param cstr_info Codestream information structure if required, NULL otherwise -@return Returns true if successful, returns false otherwise -*/ -opj_bool j2k_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image, - opj_codestream_info_t *cstr_info); - -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __J2K_H */ diff --git a/src/lib/openmj2/j2k_lib.c b/src/lib/openmj2/j2k_lib.c deleted file mode 100644 index 7c96ca34..00000000 --- a/src/lib/openmj2/j2k_lib.c +++ /dev/null @@ -1,65 +0,0 @@ -/* - * 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) 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. - */ - -#ifdef _WIN32 -#include -#else -#include -#include -#include -#endif /* _WIN32 */ -#include "opj_includes.h" - -double OPJ_CALLCONV opj_clock(void) -{ -#ifdef _WIN32 - /* _WIN32: use QueryPerformance (very accurate) */ - LARGE_INTEGER freq, t ; - /* freq is the clock speed of the CPU */ - QueryPerformanceFrequency(&freq) ; - /* cout << "freq = " << ((double) freq.QuadPart) << endl; */ - /* t is the high resolution performance counter (see MSDN) */ - QueryPerformanceCounter(& t) ; - return (t.QuadPart / (double) freq.QuadPart) ; -#else - /* Unix or Linux: use resource usage */ - struct rusage t; - double procTime; - /* (1) Get the rusage data structure at this moment (man getrusage) */ - getrusage(0, &t); - /* (2) What is the elapsed time ? - CPU time = User time + System time */ - /* (2a) Get the seconds */ - procTime = t.ru_utime.tv_sec + t.ru_stime.tv_sec; - /* (2b) More precisely! Get the microseconds part ! */ - return (procTime + (t.ru_utime.tv_usec + t.ru_stime.tv_usec) * 1e-6) ; -#endif -} - diff --git a/src/lib/openmj2/j2k_lib.h b/src/lib/openmj2/j2k_lib.h deleted file mode 100644 index 33559a73..00000000 --- a/src/lib/openmj2/j2k_lib.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * 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) 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_LIB_H -#define __J2K_LIB_H -/** -@file j2k_lib.h -@brief Internal functions - -The functions in J2K_LIB.C are internal utilities mainly used for timing. -*/ - -/** @defgroup MISC MISC - Miscellaneous internal functions */ -/*@{*/ - -/** @name Exported functions */ -/*@{*/ -/* ----------------------------------------------------------------------- */ - -/** -Difference in successive opj_clock() calls tells you the elapsed time -@return Returns time in seconds -*/ -OPJ_API double OPJ_CALLCONV opj_clock(void); - -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __J2K_LIB_H */ - diff --git a/src/lib/openmj2/jp2.c b/src/lib/openmj2/jp2.c deleted file mode 100644 index acf64b9a..00000000 --- a/src/lib/openmj2/jp2.c +++ /dev/null @@ -1,1215 +0,0 @@ -/* - * 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) 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. - */ -#include "opj_includes.h" - -/** @defgroup JP2 JP2 - JPEG-2000 file format reader/writer */ -/*@{*/ - -/** @name Local static functions */ -/*@{*/ - -/** -Read box headers -@param cinfo Codec context info -@param cio Input stream -@param box -@return Returns true if successful, returns false otherwise -*/ -static opj_bool jp2_read_boxhdr(opj_common_ptr cinfo, opj_cio_t *cio, - opj_jp2_box_t *box); -/*static void jp2_write_url(opj_cio_t *cio, char *Idx_file);*/ -/** -Read the IHDR box - Image Header box -@param jp2 JP2 handle -@param cio Input buffer stream -@return Returns true if successful, returns false otherwise -*/ -static opj_bool jp2_read_ihdr(opj_jp2_t *jp2, opj_cio_t *cio); -static void jp2_write_ihdr(opj_jp2_t *jp2, opj_cio_t *cio); -static void jp2_write_bpcc(opj_jp2_t *jp2, opj_cio_t *cio); -static opj_bool jp2_read_bpcc(opj_jp2_t *jp2, opj_cio_t *cio); -static void jp2_write_colr(opj_jp2_t *jp2, opj_cio_t *cio); -/** -Write the FTYP box - File type box -@param jp2 JP2 handle -@param cio Output buffer stream -*/ -static void jp2_write_ftyp(opj_jp2_t *jp2, opj_cio_t *cio); -/** -Read the FTYP box - File type box -@param jp2 JP2 handle -@param cio Input buffer stream -@return Returns true if successful, returns false otherwise -*/ -static opj_bool jp2_read_ftyp(opj_jp2_t *jp2, opj_cio_t *cio); -static int jp2_write_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, - opj_codestream_info_t *cstr_info); -static opj_bool jp2_read_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, - unsigned int *j2k_codestream_length, unsigned int *j2k_codestream_offset); -static void jp2_write_jp(opj_cio_t *cio); -/** -Read the JP box - JPEG 2000 signature -@param jp2 JP2 handle -@param cio Input buffer stream -@return Returns true if successful, returns false otherwise -*/ -static opj_bool jp2_read_jp(opj_jp2_t *jp2, opj_cio_t *cio); -/** -Decode the structure of a JP2 file -@param jp2 JP2 handle -@param cio Input buffer stream -@param color Collector for profile, cdef and pclr data -@return Returns true if successful, returns false otherwise -*/ -static opj_bool jp2_read_struct(opj_jp2_t *jp2, opj_cio_t *cio, - opj_jp2_color_t *color); -/** -Apply collected palette data -@param color Collector for profile, cdef and pclr data -@param image -*/ -static void jp2_apply_pclr(opj_jp2_color_t *color, opj_image_t *image, - opj_common_ptr cinfo); -/** -Collect palette data -@param jp2 JP2 handle -@param cio Input buffer stream -@param box -@param color Collector for profile, cdef and pclr data -@return Returns true if successful, returns false otherwise -*/ -static opj_bool jp2_read_pclr(opj_jp2_t *jp2, opj_cio_t *cio, - opj_jp2_box_t *box, opj_jp2_color_t *color); -/** -Collect component mapping data -@param jp2 JP2 handle -@param cio Input buffer stream -@param box -@param color Collector for profile, cdef and pclr data -@return Returns true if successful, returns false otherwise -*/ -static opj_bool jp2_read_cmap(opj_jp2_t *jp2, opj_cio_t *cio, - opj_jp2_box_t *box, opj_jp2_color_t *color); -/** -Collect colour specification data -@param jp2 JP2 handle -@param cio Input buffer stream -@param box -@param color Collector for profile, cdef and pclr data -@return Returns true if successful, returns false otherwise -*/ -static opj_bool jp2_read_colr(opj_jp2_t *jp2, opj_cio_t *cio, - opj_jp2_box_t *box, opj_jp2_color_t *color); -/*@}*/ - -/*@}*/ - -/* ----------------------------------------------------------------------- */ - -static opj_bool jp2_read_boxhdr(opj_common_ptr cinfo, opj_cio_t *cio, - opj_jp2_box_t *box) -{ - box->init_pos = cio_tell(cio); - box->length = cio_read(cio, 4); - box->type = cio_read(cio, 4); - if (box->length == 1) { - if (cio_read(cio, 4) != 0) { - opj_event_msg(cinfo, EVT_ERROR, "Cannot handle box sizes higher than 2^32\n"); - return OPJ_FALSE; - } - box->length = cio_read(cio, 4); - if (box->length == 0) { - box->length = cio_numbytesleft(cio) + 12; - } - } else if (box->length == 0) { - box->length = cio_numbytesleft(cio) + 8; - } - if (box->length < 0) { - opj_event_msg(cinfo, EVT_ERROR, "Integer overflow in box->length\n"); - return OPJ_FALSE; /* TODO: actually check jp2_read_boxhdr's return value */ - } - - return OPJ_TRUE; -} - -#if 0 -static void jp2_write_url(opj_cio_t *cio, char *Idx_file) -{ - unsigned int i; - opj_jp2_box_t box; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, JP2_URL, 4); /* DBTL */ - cio_write(cio, 0, 1); /* VERS */ - cio_write(cio, 0, 3); /* FLAG */ - - if (Idx_file) { - for (i = 0; i < strlen(Idx_file); i++) { - cio_write(cio, Idx_file[i], 1); - } - } - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} -#endif - -static opj_bool jp2_read_ihdr(opj_jp2_t *jp2, opj_cio_t *cio) -{ - opj_jp2_box_t box; - - opj_common_ptr cinfo = jp2->cinfo; - - if (jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE) { - opj_event_msg(cinfo, EVT_ERROR, "Failed to read boxhdr\n"); - return OPJ_FALSE; - } - if (JP2_IHDR != box.type) { - opj_event_msg(cinfo, EVT_ERROR, "Expected IHDR Marker\n"); - return OPJ_FALSE; - } - - jp2->h = cio_read(cio, 4); /* HEIGHT */ - jp2->w = cio_read(cio, 4); /* WIDTH */ - jp2->numcomps = cio_read(cio, 2); /* NC */ - jp2->comps = (opj_jp2_comps_t*) opj_malloc(jp2->numcomps * sizeof( - opj_jp2_comps_t)); - - jp2->bpc = cio_read(cio, 1); /* BPC */ - - jp2->C = cio_read(cio, 1); /* C */ - jp2->UnkC = cio_read(cio, 1); /* UnkC */ - jp2->IPR = cio_read(cio, 1); /* IPR */ - - if (cio_tell(cio) - box.init_pos != box.length) { - opj_event_msg(cinfo, EVT_ERROR, "Error with IHDR Box\n"); - return OPJ_FALSE; - } - - return OPJ_TRUE; -} - -static void jp2_write_ihdr(opj_jp2_t *jp2, opj_cio_t *cio) -{ - opj_jp2_box_t box; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, JP2_IHDR, 4); /* IHDR */ - - cio_write(cio, jp2->h, 4); /* HEIGHT */ - cio_write(cio, jp2->w, 4); /* WIDTH */ - cio_write(cio, jp2->numcomps, 2); /* NC */ - - cio_write(cio, jp2->bpc, 1); /* BPC */ - - cio_write(cio, jp2->C, 1); /* C : Always 7 */ - cio_write(cio, jp2->UnkC, 1); /* UnkC, colorspace unknown */ - cio_write(cio, jp2->IPR, 1); /* IPR, no intellectual property */ - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} - -static void jp2_write_bpcc(opj_jp2_t *jp2, opj_cio_t *cio) -{ - unsigned int i; - opj_jp2_box_t box; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, JP2_BPCC, 4); /* BPCC */ - - for (i = 0; i < jp2->numcomps; i++) { - cio_write(cio, jp2->comps[i].bpcc, 1); - } - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} - - -static opj_bool jp2_read_bpcc(opj_jp2_t *jp2, opj_cio_t *cio) -{ - unsigned int i; - opj_jp2_box_t box; - - opj_common_ptr cinfo = jp2->cinfo; - - if (jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE) { - opj_event_msg(cinfo, EVT_ERROR, "Failed to read boxhdr\n"); - return OPJ_FALSE; - } - if (JP2_BPCC != box.type) { - opj_event_msg(cinfo, EVT_ERROR, "Expected BPCC Marker\n"); - return OPJ_FALSE; - } - - for (i = 0; i < jp2->numcomps; i++) { - jp2->comps[i].bpcc = cio_read(cio, 1); - } - - if (cio_tell(cio) - box.init_pos != box.length) { - opj_event_msg(cinfo, EVT_ERROR, "Error with BPCC Box\n"); - return OPJ_FALSE; - } - - return OPJ_TRUE; -} - -static void jp2_write_colr(opj_jp2_t *jp2, opj_cio_t *cio) -{ - opj_jp2_box_t box; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, JP2_COLR, 4); /* COLR */ - - cio_write(cio, jp2->meth, 1); /* METH */ - cio_write(cio, jp2->precedence, 1); /* PRECEDENCE */ - cio_write(cio, jp2->approx, 1); /* APPROX */ - - if (jp2->meth == 2) { - jp2->enumcs = 0; - } - - cio_write(cio, jp2->enumcs, 4); /* EnumCS */ - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} - -static void jp2_free_pclr(opj_jp2_color_t *color) -{ - opj_free(color->jp2_pclr->channel_sign); - opj_free(color->jp2_pclr->channel_size); - opj_free(color->jp2_pclr->entries); - - if (color->jp2_pclr->cmap) { - opj_free(color->jp2_pclr->cmap); - } - - opj_free(color->jp2_pclr); - color->jp2_pclr = NULL; -} - -static void free_color_data(opj_jp2_color_t *color) -{ - if (color->jp2_pclr) { - jp2_free_pclr(color); - } - if (color->jp2_cdef) { - if (color->jp2_cdef->info) { - opj_free(color->jp2_cdef->info); - } - opj_free(color->jp2_cdef); - } - if (color->icc_profile_buf) { - opj_free(color->icc_profile_buf); - } -} - -static void jp2_apply_pclr(opj_jp2_color_t *color, opj_image_t *image, - opj_common_ptr cinfo) -{ - opj_image_comp_t *old_comps, *new_comps; - unsigned char *channel_size, *channel_sign; - unsigned int *entries; - opj_jp2_cmap_comp_t *cmap; - int *src, *dst; - unsigned int j, max; - unsigned short i, nr_channels, cmp, pcol; - int k, top_k; - - channel_size = color->jp2_pclr->channel_size; - channel_sign = color->jp2_pclr->channel_sign; - entries = color->jp2_pclr->entries; - cmap = color->jp2_pclr->cmap; - nr_channels = color->jp2_pclr->nr_channels; - - old_comps = image->comps; - new_comps = (opj_image_comp_t*) - opj_malloc(nr_channels * sizeof(opj_image_comp_t)); - - for (i = 0; i < nr_channels; ++i) { - pcol = cmap[i].pcol; - cmp = cmap[i].cmp; - - if (pcol < nr_channels) { - new_comps[pcol] = old_comps[cmp]; - } else { - opj_event_msg(cinfo, EVT_ERROR, - "Error with pcol value %d (max: %d). skipping\n", pcol, nr_channels); - continue; - } - - if (cmap[i].mtyp == 0) { /* Direct use */ - old_comps[cmp].data = NULL; - continue; - } - /* Palette mapping: */ - new_comps[pcol].data = (int*) - opj_malloc(sizeof(int) * old_comps[cmp].w * old_comps[cmp].h); - new_comps[pcol].prec = channel_size[i]; - new_comps[pcol].sgnd = channel_sign[i]; - } - top_k = color->jp2_pclr->nr_entries - 1; - - for (i = 0; i < nr_channels; ++i) { - /* Direct use: */ - if (cmap[i].mtyp == 0) { - continue; - } - - /* Palette mapping: */ - cmp = cmap[i].cmp; - pcol = cmap[i].pcol; - src = old_comps[cmp].data; - dst = new_comps[pcol].data; - max = new_comps[pcol].w * new_comps[pcol].h; - - for (j = 0; j < max; ++j) { - /* The index */ - if ((k = src[j]) < 0) { - k = 0; - } else if (k > top_k) { - k = top_k; - } - /* The colour */ - dst[j] = entries[k * nr_channels + pcol]; - } - } - max = image->numcomps; - for (i = 0; i < max; ++i) { - if (old_comps[i].data) { - opj_free(old_comps[i].data); - } - } - opj_free(old_comps); - image->comps = new_comps; - image->numcomps = nr_channels; - - jp2_free_pclr(color); - -}/* apply_pclr() */ - -static opj_bool jp2_read_pclr(opj_jp2_t *jp2, opj_cio_t *cio, - opj_jp2_box_t *box, opj_jp2_color_t *color) -{ - opj_jp2_pclr_t *jp2_pclr; - unsigned char *channel_size, *channel_sign; - unsigned int *entries; - unsigned short nr_entries, nr_channels; - unsigned short i, j; - unsigned char uc; - - OPJ_ARG_NOT_USED(box); - OPJ_ARG_NOT_USED(jp2); - - /* Part 1, I.5.3.4: 'There shall be at most one Palette box inside - * a JP2 Header box' : - */ - if (color->jp2_pclr) { - return OPJ_FALSE; - } - - nr_entries = (unsigned short)cio_read(cio, 2); /* NE */ - nr_channels = (unsigned short)cio_read(cio, 1);/* NPC */ - - entries = (unsigned int*) - opj_malloc(sizeof(unsigned int) * nr_channels * nr_entries); - channel_size = (unsigned char*)opj_malloc(nr_channels); - channel_sign = (unsigned char*)opj_malloc(nr_channels); - - jp2_pclr = (opj_jp2_pclr_t*)opj_malloc(sizeof(opj_jp2_pclr_t)); - jp2_pclr->channel_sign = channel_sign; - jp2_pclr->channel_size = channel_size; - jp2_pclr->entries = entries; - jp2_pclr->nr_entries = nr_entries; - jp2_pclr->nr_channels = nr_channels; - jp2_pclr->cmap = NULL; - - color->jp2_pclr = jp2_pclr; - - for (i = 0; i < nr_channels; ++i) { - uc = cio_read(cio, 1); /* Bi */ - channel_size[i] = (uc & 0x7f) + 1; - channel_sign[i] = (uc & 0x80) ? 1 : 0; - } - - for (j = 0; j < nr_entries; ++j) { - for (i = 0; i < nr_channels; ++i) { - /* Cji */ - *entries++ = cio_read(cio, (channel_size[i] + 7) >> 3); - } - } - - return OPJ_TRUE; -}/* jp2_read_pclr() */ - -static opj_bool jp2_read_cmap(opj_jp2_t *jp2, opj_cio_t *cio, - opj_jp2_box_t *box, opj_jp2_color_t *color) -{ - opj_jp2_cmap_comp_t *cmap; - unsigned short i, nr_channels; - - OPJ_ARG_NOT_USED(box); - OPJ_ARG_NOT_USED(jp2); - - /* Need nr_channels: */ - if (color->jp2_pclr == NULL) { - return OPJ_FALSE; - } - - /* Part 1, I.5.3.5: 'There shall be at most one Component Mapping box - * inside a JP2 Header box' : - */ - if (color->jp2_pclr->cmap) { - return OPJ_FALSE; - } - - nr_channels = color->jp2_pclr->nr_channels; - cmap = (opj_jp2_cmap_comp_t*) - opj_malloc(nr_channels * sizeof(opj_jp2_cmap_comp_t)); - - for (i = 0; i < nr_channels; ++i) { - cmap[i].cmp = (unsigned short)cio_read(cio, 2); - cmap[i].mtyp = cio_read(cio, 1); - cmap[i].pcol = cio_read(cio, 1); - - } - color->jp2_pclr->cmap = cmap; - - return OPJ_TRUE; -}/* jp2_read_cmap() */ - -static void jp2_apply_cdef(opj_image_t *image, opj_jp2_color_t *color) -{ - opj_jp2_cdef_info_t *info; - int color_space; - unsigned short i, n, cn, typ, asoc, acn; - - color_space = image->color_space; - info = color->jp2_cdef->info; - n = color->jp2_cdef->n; - - for (i = 0; i < n; ++i) { - /* WATCH: acn = asoc - 1 ! */ - if ((asoc = info[i].asoc) == 0) { - continue; - } - - cn = info[i].cn; - typ = info[i].typ; - acn = asoc - 1; - - if (cn != acn) { - opj_image_comp_t saved; - - memcpy(&saved, &image->comps[cn], sizeof(opj_image_comp_t)); - memcpy(&image->comps[cn], &image->comps[acn], sizeof(opj_image_comp_t)); - memcpy(&image->comps[acn], &saved, sizeof(opj_image_comp_t)); - - info[i].asoc = cn + 1; - info[acn].asoc = info[acn].cn + 1; - } - } - if (color->jp2_cdef->info) { - opj_free(color->jp2_cdef->info); - } - - opj_free(color->jp2_cdef); - color->jp2_cdef = NULL; - -}/* jp2_apply_cdef() */ - -static opj_bool jp2_read_cdef(opj_jp2_t *jp2, opj_cio_t *cio, - opj_jp2_box_t *box, opj_jp2_color_t *color) -{ - opj_jp2_cdef_info_t *info; - unsigned short i, n; - - OPJ_ARG_NOT_USED(box); - OPJ_ARG_NOT_USED(jp2); - - /* Part 1, I.5.3.6: 'The shall be at most one Channel Definition box - * inside a JP2 Header box.' - */ - if (color->jp2_cdef) { - return OPJ_FALSE; - } - - if ((n = (unsigned short)cio_read(cio, 2)) == 0) { - return OPJ_FALSE; /* szukw000: FIXME */ - } - - info = (opj_jp2_cdef_info_t*) - opj_malloc(n * sizeof(opj_jp2_cdef_info_t)); - - color->jp2_cdef = (opj_jp2_cdef_t*)opj_malloc(sizeof(opj_jp2_cdef_t)); - color->jp2_cdef->info = info; - color->jp2_cdef->n = n; - - for (i = 0; i < n; ++i) { - info[i].cn = (unsigned short)cio_read(cio, 2); - info[i].typ = (unsigned short)cio_read(cio, 2); - info[i].asoc = (unsigned short)cio_read(cio, 2); - - } - return OPJ_TRUE; -}/* jp2_read_cdef() */ - -static opj_bool jp2_read_colr(opj_jp2_t *jp2, opj_cio_t *cio, - opj_jp2_box_t *box, opj_jp2_color_t *color) -{ - int skip_len; - opj_common_ptr cinfo; - - /* Part 1, I.5.3.3 : 'A conforming JP2 reader shall ignore all Colour - * Specification boxes after the first.' - */ - if (color->jp2_has_colr) { - return OPJ_FALSE; - } - - cinfo = jp2->cinfo; - - jp2->meth = cio_read(cio, 1); /* METH */ - jp2->precedence = cio_read(cio, 1); /* PRECEDENCE */ - jp2->approx = cio_read(cio, 1); /* APPROX */ - - if (jp2->meth == 1) { - jp2->enumcs = cio_read(cio, 4); /* EnumCS */ - } else if (jp2->meth == 2) { - /* skip PROFILE */ - skip_len = box->init_pos + box->length - cio_tell(cio); - if (skip_len < 0) { - opj_event_msg(cinfo, EVT_ERROR, "Error with COLR box size\n"); - return OPJ_FALSE; - } - if (skip_len > 0) { - unsigned char *start; - - start = cio_getbp(cio); - color->icc_profile_buf = (unsigned char*)opj_malloc(skip_len); - color->icc_profile_len = skip_len; - - cio_skip(cio, box->init_pos + box->length - cio_tell(cio)); - - memcpy(color->icc_profile_buf, start, skip_len); - } - } - - if (cio_tell(cio) - box->init_pos != box->length) { - opj_event_msg(cinfo, EVT_ERROR, "Error with COLR Box\n"); - return OPJ_FALSE; - } - color->jp2_has_colr = 1; - - return OPJ_TRUE; -}/* jp2_read_colr() */ - -opj_bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio, opj_jp2_color_t *color) -{ - opj_jp2_box_t box; - int jp2h_end; - - opj_common_ptr cinfo = jp2->cinfo; - - if (jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE) { - return OPJ_FALSE; - } - do { - if (JP2_JP2H != box.type) { - if (box.type == JP2_JP2C) { - opj_event_msg(cinfo, EVT_ERROR, "Expected JP2H Marker\n"); - return OPJ_FALSE; - } - if (box.length <= 8) { - return OPJ_FALSE; - } - cio_skip(cio, box.length - 8); - - if (cio->bp >= cio->end) { - return OPJ_FALSE; - } - - if (jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE) { - return OPJ_FALSE; - } - } - } while (JP2_JP2H != box.type); - - if (!jp2_read_ihdr(jp2, cio)) { - return OPJ_FALSE; - } - jp2h_end = box.init_pos + box.length; - - if (jp2->bpc == 255) { - if (!jp2_read_bpcc(jp2, cio)) { - return OPJ_FALSE; - } - } - if (jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE) { - return OPJ_FALSE; - } - - while (cio_tell(cio) < jp2h_end) { - if (box.type == JP2_COLR) { - if (!jp2_read_colr(jp2, cio, &box, color)) { - if (box.length <= 8) { - return OPJ_FALSE; - } - cio_seek(cio, box.init_pos + 8); - cio_skip(cio, box.length - 8); - } - if (jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE) { - return OPJ_FALSE; - } - continue; - } - if (box.type == JP2_CDEF && !jp2->ignore_pclr_cmap_cdef) { - if (!jp2_read_cdef(jp2, cio, &box, color)) { - if (box.length <= 8) { - return OPJ_FALSE; - } - cio_seek(cio, box.init_pos + 8); - cio_skip(cio, box.length - 8); - } - if (jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE) { - return OPJ_FALSE; - } - continue; - } - if (box.type == JP2_PCLR && !jp2->ignore_pclr_cmap_cdef) { - if (!jp2_read_pclr(jp2, cio, &box, color)) { - if (box.length <= 8) { - return OPJ_FALSE; - } - cio_seek(cio, box.init_pos + 8); - cio_skip(cio, box.length - 8); - } - if (jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE) { - return OPJ_FALSE; - } - continue; - } - if (box.type == JP2_CMAP && !jp2->ignore_pclr_cmap_cdef) { - if (!jp2_read_cmap(jp2, cio, &box, color)) { - if (box.length <= 8) { - return OPJ_FALSE; - } - cio_seek(cio, box.init_pos + 8); - cio_skip(cio, box.length - 8); - } - if (jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE) { - return OPJ_FALSE; - } - continue; - } - if (box.length <= 8) { - return OPJ_FALSE; - } - cio_seek(cio, box.init_pos + 8); - cio_skip(cio, box.length - 8); - if (jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE) { - return OPJ_FALSE; - } - - }/* while(cio_tell(cio) < box_end) */ - - cio_seek(cio, jp2h_end); - - /* Part 1, I.5.3.3 : 'must contain at least one' */ - return (color->jp2_has_colr == 1); - -}/* jp2_read_jp2h() */ - -opj_image_t* opj_jp2_decode(opj_jp2_t *jp2, opj_cio_t *cio, - opj_codestream_info_t *cstr_info) -{ - opj_common_ptr cinfo; - opj_image_t *image = NULL; - opj_jp2_color_t color; - - if (!jp2 || !cio) { - return NULL; - } - memset(&color, 0, sizeof(opj_jp2_color_t)); - cinfo = jp2->cinfo; - - /* JP2 decoding */ - if (!jp2_read_struct(jp2, cio, &color)) { - free_color_data(&color); - opj_event_msg(cinfo, EVT_ERROR, "Failed to decode jp2 structure\n"); - return NULL; - } - - /* J2K decoding */ - image = j2k_decode(jp2->j2k, cio, cstr_info); - - if (!image) { - free_color_data(&color); - opj_event_msg(cinfo, EVT_ERROR, "Failed to decode J2K image\n"); - return NULL; - } - - if (!jp2->ignore_pclr_cmap_cdef) { - - /* Set Image Color Space */ - if (jp2->enumcs == 16) { - image->color_space = CLRSPC_SRGB; - } else if (jp2->enumcs == 17) { - image->color_space = CLRSPC_GRAY; - } else if (jp2->enumcs == 18) { - image->color_space = CLRSPC_SYCC; - } else { - image->color_space = CLRSPC_UNKNOWN; - } - - if (color.jp2_cdef) { - jp2_apply_cdef(image, &color); - } - if (color.jp2_pclr) { - /* Part 1, I.5.3.4: Either both or none : */ - if (!color.jp2_pclr->cmap) { - jp2_free_pclr(&color); - } else { - jp2_apply_pclr(&color, image, cinfo); - } - } - if (color.icc_profile_buf) { - image->icc_profile_buf = color.icc_profile_buf; - color.icc_profile_buf = NULL; - image->icc_profile_len = color.icc_profile_len; - } - } - - return image; - -}/* opj_jp2_decode() */ - - -void jp2_write_jp2h(opj_jp2_t *jp2, opj_cio_t *cio) -{ - opj_jp2_box_t box; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, JP2_JP2H, 4); /* JP2H */ - - jp2_write_ihdr(jp2, cio); - - if (jp2->bpc == 255) { - jp2_write_bpcc(jp2, cio); - } - jp2_write_colr(jp2, cio); - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} - -static void jp2_write_ftyp(opj_jp2_t *jp2, opj_cio_t *cio) -{ - unsigned int i; - opj_jp2_box_t box; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, JP2_FTYP, 4); /* FTYP */ - - cio_write(cio, jp2->brand, 4); /* BR */ - cio_write(cio, jp2->minversion, 4); /* MinV */ - - for (i = 0; i < jp2->numcl; i++) { - cio_write(cio, jp2->cl[i], 4); /* CL */ - } - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} - -static opj_bool jp2_read_ftyp(opj_jp2_t *jp2, opj_cio_t *cio) -{ - int i; - opj_jp2_box_t box; - - opj_common_ptr cinfo = jp2->cinfo; - - if (jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE) { - opj_event_msg(cinfo, EVT_ERROR, "Failed to read boxhdr\n"); - return OPJ_FALSE; - } - if (JP2_FTYP != box.type) { - opj_event_msg(cinfo, EVT_ERROR, "Expected FTYP Marker\n"); - return OPJ_FALSE; - } - - jp2->brand = cio_read(cio, 4); /* BR */ - jp2->minversion = cio_read(cio, 4); /* MinV */ - jp2->numcl = (box.length - 16) / 4; - jp2->cl = (unsigned int *) opj_malloc(jp2->numcl * sizeof(unsigned int)); - - for (i = 0; i < (int)jp2->numcl; i++) { - jp2->cl[i] = cio_read(cio, 4); /* CLi */ - } - - if (cio_tell(cio) - box.init_pos != box.length) { - opj_event_msg(cinfo, EVT_ERROR, "Error with FTYP Box\n"); - return OPJ_FALSE; - } - - return OPJ_TRUE; -} - -static int jp2_write_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, - opj_codestream_info_t *cstr_info) -{ - unsigned int j2k_codestream_offset, j2k_codestream_length; - opj_jp2_box_t box; - - opj_j2k_t *j2k = jp2->j2k; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, JP2_JP2C, 4); /* JP2C */ - - /* J2K encoding */ - j2k_codestream_offset = cio_tell(cio); - if (!j2k_encode(j2k, cio, image, cstr_info)) { - opj_event_msg(j2k->cinfo, EVT_ERROR, "Failed to encode image\n"); - return 0; - } - j2k_codestream_length = cio_tell(cio) - j2k_codestream_offset; - - jp2->j2k_codestream_offset = j2k_codestream_offset; - jp2->j2k_codestream_length = j2k_codestream_length; - - box.length = 8 + jp2->j2k_codestream_length; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); - - return box.length; -} - -static opj_bool jp2_read_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, - unsigned int *j2k_codestream_length, unsigned int *j2k_codestream_offset) -{ - opj_jp2_box_t box; - - opj_common_ptr cinfo = jp2->cinfo; - - if (jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE) { - opj_event_msg(cinfo, EVT_ERROR, "Failed to read boxhdr\n"); - return OPJ_FALSE; - } - do { - if (JP2_JP2C != box.type) { - if (box.length <= 8) { - return OPJ_FALSE; - } - cio_skip(cio, box.length - 8); - if (jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE) { - return OPJ_FALSE; - } - } - } while (JP2_JP2C != box.type); - - *j2k_codestream_offset = cio_tell(cio); - if (box.length <= 8) { - return OPJ_FALSE; - } - *j2k_codestream_length = box.length - 8; - - return OPJ_TRUE; -} - -static void jp2_write_jp(opj_cio_t *cio) -{ - opj_jp2_box_t box; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, JP2_JP, 4); /* JP2 signature */ - cio_write(cio, 0x0d0a870a, 4); - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} - -static opj_bool jp2_read_jp(opj_jp2_t *jp2, opj_cio_t *cio) -{ - opj_jp2_box_t box; - - opj_common_ptr cinfo = jp2->cinfo; - - if (jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE) { - opj_event_msg(cinfo, EVT_ERROR, "Failed to read boxhdr\n"); - return OPJ_FALSE; - } - if (JP2_JP != box.type) { - opj_event_msg(cinfo, EVT_ERROR, "Expected JP Marker\n"); - return OPJ_FALSE; - } - if (0x0d0a870a != cio_read(cio, 4)) { - opj_event_msg(cinfo, EVT_ERROR, "Error with JP Marker\n"); - return OPJ_FALSE; - } - if (cio_tell(cio) - box.init_pos != box.length) { - opj_event_msg(cinfo, EVT_ERROR, "Error with JP Box size\n"); - return OPJ_FALSE; - } - - return OPJ_TRUE; -} - - -static opj_bool jp2_read_struct(opj_jp2_t *jp2, opj_cio_t *cio, - opj_jp2_color_t *color) -{ - if (!jp2_read_jp(jp2, cio)) { - return OPJ_FALSE; - } - if (!jp2_read_ftyp(jp2, cio)) { - return OPJ_FALSE; - } - if (!jp2_read_jp2h(jp2, cio, color)) { - return OPJ_FALSE; - } - if (!jp2_read_jp2c(jp2, cio, &jp2->j2k_codestream_length, - &jp2->j2k_codestream_offset)) { - return OPJ_FALSE; - } - - return OPJ_TRUE; -} - - - - -/* ----------------------------------------------------------------------- */ -/* JP2 decoder interface */ -/* ----------------------------------------------------------------------- */ - -opj_jp2_t* jp2_create_decompress(opj_common_ptr cinfo) -{ - opj_jp2_t *jp2 = (opj_jp2_t*) opj_calloc(1, sizeof(opj_jp2_t)); - if (jp2) { - jp2->cinfo = cinfo; - /* create the J2K codec */ - jp2->j2k = j2k_create_decompress(cinfo); - if (jp2->j2k == NULL) { - jp2_destroy_decompress(jp2); - return NULL; - } - } - return jp2; -} - -void jp2_destroy_decompress(opj_jp2_t *jp2) -{ - if (jp2) { - /* destroy the J2K codec */ - j2k_destroy_decompress(jp2->j2k); - - if (jp2->comps) { - opj_free(jp2->comps); - } - if (jp2->cl) { - opj_free(jp2->cl); - } - opj_free(jp2); - } -} - -void jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters) -{ - /* setup the J2K codec */ - j2k_setup_decoder(jp2->j2k, parameters); - /* further JP2 initializations go here */ - jp2->ignore_pclr_cmap_cdef = parameters->flags & - OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG; -} - -/* ----------------------------------------------------------------------- */ -/* JP2 encoder interface */ -/* ----------------------------------------------------------------------- */ - -opj_jp2_t* jp2_create_compress(opj_common_ptr cinfo) -{ - opj_jp2_t *jp2 = (opj_jp2_t*)opj_malloc(sizeof(opj_jp2_t)); - if (jp2) { - jp2->cinfo = cinfo; - /* create the J2K codec */ - jp2->j2k = j2k_create_compress(cinfo); - if (jp2->j2k == NULL) { - jp2_destroy_compress(jp2); - return NULL; - } - } - return jp2; -} - -void jp2_destroy_compress(opj_jp2_t *jp2) -{ - if (jp2) { - /* destroy the J2K codec */ - j2k_destroy_compress(jp2->j2k); - - if (jp2->comps) { - opj_free(jp2->comps); - } - if (jp2->cl) { - opj_free(jp2->cl); - } - opj_free(jp2); - } -} - -void jp2_setup_encoder(opj_jp2_t *jp2, opj_cparameters_t *parameters, - opj_image_t *image) -{ - int i; - int depth_0, sign; - - if (!jp2 || !parameters || !image) { - return; - } - - /* setup the J2K codec */ - /* ------------------- */ - - /* Check if number of components respects standard */ - if (image->numcomps < 1 || image->numcomps > 16384) { - opj_event_msg(jp2->cinfo, EVT_ERROR, - "Invalid number of components specified while setting up JP2 encoder\n"); - return; - } - - j2k_setup_encoder(jp2->j2k, parameters, image); - - /* setup the JP2 codec */ - /* ------------------- */ - - /* Profile box */ - - jp2->brand = JP2_JP2; /* BR */ - jp2->minversion = 0; /* MinV */ - jp2->numcl = 1; - jp2->cl = (unsigned int*) opj_malloc(jp2->numcl * sizeof(unsigned int)); - jp2->cl[0] = JP2_JP2; /* CL0 : JP2 */ - - /* Image Header box */ - - jp2->numcomps = image->numcomps; /* NC */ - jp2->comps = (opj_jp2_comps_t*) opj_malloc(jp2->numcomps * sizeof( - opj_jp2_comps_t)); - jp2->h = image->y1 - image->y0; /* HEIGHT */ - jp2->w = image->x1 - image->x0; /* WIDTH */ - /* BPC */ - depth_0 = image->comps[0].prec - 1; - sign = image->comps[0].sgnd; - jp2->bpc = depth_0 + (sign << 7); - for (i = 1; i < image->numcomps; i++) { - int depth = image->comps[i].prec - 1; - sign = image->comps[i].sgnd; - if (depth_0 != depth) { - jp2->bpc = 255; - } - } - jp2->C = 7; /* C : Always 7 */ - jp2->UnkC = 0; /* UnkC, colorspace specified in colr box */ - jp2->IPR = 0; /* IPR, no intellectual property */ - - /* BitsPerComponent box */ - - for (i = 0; i < image->numcomps; i++) { - jp2->comps[i].bpcc = image->comps[i].prec - 1 + (image->comps[i].sgnd << 7); - } - jp2->meth = 1; - if (image->color_space == 1) { - jp2->enumcs = 16; /* sRGB as defined by IEC 61966-2.1 */ - } else if (image->color_space == 2) { - jp2->enumcs = 17; /* greyscale */ - } else if (image->color_space == 3) { - jp2->enumcs = 18; /* YUV */ - } - jp2->precedence = 0; /* PRECEDENCE */ - jp2->approx = 0; /* APPROX */ -} - -opj_bool opj_jp2_encode(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, - opj_codestream_info_t *cstr_info) -{ - - int pos_iptr, pos_jp2c, len_jp2c; - pos_jp2c = pos_iptr = -1; /* remove a warning */ - - /* JP2 encoding */ - - /* JPEG 2000 Signature box */ - jp2_write_jp(cio); - /* File Type box */ - jp2_write_ftyp(jp2, cio); - /* JP2 Header box */ - jp2_write_jp2h(jp2, cio); - - /* J2K encoding */ - if (!(len_jp2c = jp2_write_jp2c(jp2, cio, image, cstr_info))) { - opj_event_msg(jp2->cinfo, EVT_ERROR, "Failed to encode image\n"); - return OPJ_FALSE; - } - - return OPJ_TRUE; -} diff --git a/src/lib/openmj2/jp2.h b/src/lib/openmj2/jp2.h deleted file mode 100644 index 582fb50c..00000000 --- a/src/lib/openmj2/jp2.h +++ /dev/null @@ -1,234 +0,0 @@ -/* - * 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) 2002-2003, Yannick Verschueren - * 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 __JP2_H -#define __JP2_H -/** -@file jp2.h -@brief The JPEG-2000 file format Reader/Writer (JP2) - -*/ - -/** @defgroup JP2 JP2 - JPEG-2000 file format reader/writer */ -/*@{*/ - -#define JP2_JP 0x6a502020 /**< JPEG 2000 signature box */ -#define JP2_FTYP 0x66747970 /**< File type box */ -#define JP2_JP2H 0x6a703268 /**< JP2 header box */ -#define JP2_IHDR 0x69686472 /**< Image header box */ -#define JP2_COLR 0x636f6c72 /**< Colour specification box */ -#define JP2_JP2C 0x6a703263 /**< Contiguous codestream box */ -#define JP2_URL 0x75726c20 /**< URL box */ -#define JP2_DTBL 0x6474626c /**< Data Reference box */ -#define JP2_BPCC 0x62706363 /**< Bits per component box */ -#define JP2_JP2 0x6a703220 /**< File type fields */ -#define JP2_PCLR 0x70636c72 /**< Palette box */ -#define JP2_CMAP 0x636d6170 /**< Component Mapping box */ -#define JP2_CDEF 0x63646566 /**< Channel Definition box */ - -/* ----------------------------------------------------------------------- */ -/** -Channel description: channel index, type, association -*/ -typedef struct opj_jp2_cdef_info { - unsigned short cn, typ, asoc; -} opj_jp2_cdef_info_t; - -/** -Channel descriptions and number of descriptions -*/ -typedef struct opj_jp2_cdef { - opj_jp2_cdef_info_t *info; - unsigned short n; -} opj_jp2_cdef_t; - -/** -Component mappings: channel index, mapping type, palette index -*/ -typedef struct opj_jp2_cmap_comp { - unsigned short cmp; - unsigned char mtyp, pcol; -} opj_jp2_cmap_comp_t; - -/** -Palette data: table entries, palette columns -*/ -typedef struct opj_jp2_pclr { - unsigned int *entries; - unsigned char *channel_sign; - unsigned char *channel_size; - opj_jp2_cmap_comp_t *cmap; - unsigned short nr_entries, nr_channels; -} opj_jp2_pclr_t; - -/** -Collector for ICC profile, palette, component mapping, channel description -*/ -typedef struct opj_jp2_color { - unsigned char *icc_profile_buf; - int icc_profile_len; - - opj_jp2_cdef_t *jp2_cdef; - opj_jp2_pclr_t *jp2_pclr; - unsigned char jp2_has_colr; -} opj_jp2_color_t; - -/** -JP2 component -*/ -typedef struct opj_jp2_comps { - int depth; - int sgnd; - int bpcc; -} opj_jp2_comps_t; - -/** -JPEG-2000 file format reader/writer -*/ -typedef struct opj_jp2 { - /** codec context */ - opj_common_ptr cinfo; - /** handle to the J2K codec */ - opj_j2k_t *j2k; - unsigned int w; - unsigned int h; - unsigned int numcomps; - unsigned int bpc; - unsigned int C; - unsigned int UnkC; - unsigned int IPR; - unsigned int meth; - unsigned int approx; - unsigned int enumcs; - unsigned int precedence; - unsigned int brand; - unsigned int minversion; - unsigned int numcl; - unsigned int *cl; - opj_jp2_comps_t *comps; - unsigned int j2k_codestream_offset; - unsigned int j2k_codestream_length; - opj_bool ignore_pclr_cmap_cdef; -} opj_jp2_t; - -/** -JP2 Box -*/ -typedef struct opj_jp2_box { - int length; - int type; - int init_pos; -} opj_jp2_box_t; - -/** @name Exported functions */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Write the JP2H box - JP2 Header box (used in MJ2) -@param jp2 JP2 handle -@param cio Output buffer stream -*/ -void jp2_write_jp2h(opj_jp2_t *jp2, opj_cio_t *cio); -/** -Read the JP2H box - JP2 Header box (used in MJ2) -@param jp2 JP2 handle -@param cio Input buffer stream -@param ext Collector for profile, cdef and pclr data -@return Returns true if successful, returns false otherwise -*/ -opj_bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio, opj_jp2_color_t *color); -/** -Creates a JP2 decompression structure -@param cinfo Codec context info -@return Returns a handle to a JP2 decompressor if successful, returns NULL otherwise -*/ -opj_jp2_t* jp2_create_decompress(opj_common_ptr cinfo); -/** -Destroy a JP2 decompressor handle -@param jp2 JP2 decompressor handle to destroy -*/ -void jp2_destroy_decompress(opj_jp2_t *jp2); -/** -Setup the decoder decoding parameters using user parameters. -Decoding parameters are returned in jp2->j2k->cp. -@param jp2 JP2 decompressor handle -@param parameters decompression parameters -*/ -void jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters); -/** -Decode an image from a JPEG-2000 file stream -@param jp2 JP2 decompressor handle -@param cio Input buffer stream -@param cstr_info Codestream information structure if required, NULL otherwise -@return Returns a decoded image if successful, returns NULL otherwise -*/ -opj_image_t* opj_jp2_decode(opj_jp2_t *jp2, opj_cio_t *cio, - opj_codestream_info_t *cstr_info); -/** -Creates a JP2 compression structure -@param cinfo Codec context info -@return Returns a handle to a JP2 compressor if successful, returns NULL otherwise -*/ -opj_jp2_t* jp2_create_compress(opj_common_ptr cinfo); -/** -Destroy a JP2 compressor handle -@param jp2 JP2 compressor handle to destroy -*/ -void jp2_destroy_compress(opj_jp2_t *jp2); -/** -Setup the encoder parameters using the current image and using user parameters. -Coding parameters are returned in jp2->j2k->cp. -@param jp2 JP2 compressor handle -@param parameters compression parameters -@param image input filled image -*/ -void jp2_setup_encoder(opj_jp2_t *jp2, opj_cparameters_t *parameters, - opj_image_t *image); -/** -Encode an image into a JPEG-2000 file stream -@param jp2 JP2 compressor handle -@param cio Output buffer stream -@param image Image to encode -@param cstr_info Codestream information structure if required, NULL otherwise -@return Returns true if successful, returns false otherwise -*/ -opj_bool opj_jp2_encode(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, - opj_codestream_info_t *cstr_info); - -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __JP2_H */ - diff --git a/src/lib/openmj2/jpt.c b/src/lib/openmj2/jpt.c deleted file mode 100644 index 8e94583c..00000000 --- a/src/lib/openmj2/jpt.c +++ /dev/null @@ -1,168 +0,0 @@ -/* - * 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) 2002-2003, Yannick Verschueren - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include "opj_includes.h" - -/* - * Read the information contains in VBAS [JPP/JPT stream message header] - * Store information (7 bits) in value - * - */ -static unsigned int jpt_read_VBAS_info(opj_cio_t *cio, unsigned int value) -{ - unsigned char elmt; - - elmt = cio_read(cio, 1); - while ((elmt >> 7) == 1) { - value = (value << 7); - value |= (elmt & 0x7f); - elmt = cio_read(cio, 1); - } - value = (value << 7); - value |= (elmt & 0x7f); - - return value; -} - -/* - * Initialize the value of the message header structure - * - */ -void jpt_init_msg_header(opj_jpt_msg_header_t * header) -{ - header->Id = 0; /* In-class Identifier */ - header->last_byte = 0; /* Last byte information */ - header->Class_Id = 0; /* Class Identifier */ - header->CSn_Id = 0; /* CSn : index identifier */ - header->Msg_offset = 0; /* Message offset */ - header->Msg_length = 0; /* Message length */ - header->Layer_nb = 0; /* Auxiliary for JPP case */ -} - -/* - * Re-initialize the value of the message header structure - * - * Only parameters always present in message header - * - */ -static void jpt_reinit_msg_header(opj_jpt_msg_header_t * header) -{ - header->Id = 0; /* In-class Identifier */ - header->last_byte = 0; /* Last byte information */ - header->Msg_offset = 0; /* Message offset */ - header->Msg_length = 0; /* Message length */ -} - -/* - * Read the message header for a JPP/JPT - stream - * - */ -void jpt_read_msg_header(opj_common_ptr cinfo, opj_cio_t *cio, - opj_jpt_msg_header_t *header) -{ - unsigned char elmt, Class = 0, CSn = 0; - jpt_reinit_msg_header(header); - - /* ------------- */ - /* VBAS : Bin-ID */ - /* ------------- */ - elmt = cio_read(cio, 1); - - /* See for Class and CSn */ - switch ((elmt >> 5) & 0x03) { - case 0: - opj_event_msg(cinfo, EVT_ERROR, - "Forbidden value encounter in message header !!\n"); - break; - case 1: - Class = 0; - CSn = 0; - break; - case 2: - Class = 1; - CSn = 0; - break; - case 3: - Class = 1; - CSn = 1; - break; - default: - break; - } - - /* see information on bits 'c' [p 10 : A.2.1 general, ISO/IEC FCD 15444-9] */ - if (((elmt >> 4) & 0x01) == 1) { - header->last_byte = 1; - } - - /* In-class identifier */ - header->Id |= (elmt & 0x0f); - if ((elmt >> 7) == 1) { - header->Id = jpt_read_VBAS_info(cio, header->Id); - } - - /* ------------ */ - /* VBAS : Class */ - /* ------------ */ - if (Class == 1) { - header->Class_Id = 0; - header->Class_Id = jpt_read_VBAS_info(cio, header->Class_Id); - } - - /* ---------- */ - /* VBAS : CSn */ - /* ---------- */ - if (CSn == 1) { - header->CSn_Id = 0; - header->CSn_Id = jpt_read_VBAS_info(cio, header->CSn_Id); - } - - /* ----------------- */ - /* VBAS : Msg_offset */ - /* ----------------- */ - header->Msg_offset = jpt_read_VBAS_info(cio, header->Msg_offset); - - /* ----------------- */ - /* VBAS : Msg_length */ - /* ----------------- */ - header->Msg_length = jpt_read_VBAS_info(cio, header->Msg_length); - - /* ---------- */ - /* VBAS : Aux */ - /* ---------- */ - if ((header->Class_Id & 0x01) == 1) { - header->Layer_nb = 0; - header->Layer_nb = jpt_read_VBAS_info(cio, header->Layer_nb); - } -} diff --git a/src/lib/openmj2/jpt.h b/src/lib/openmj2/jpt.h deleted file mode 100644 index 9b039c87..00000000 --- a/src/lib/openmj2/jpt.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - * 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) 2002-2003, Yannick Verschueren - * 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 __JPT_H -#define __JPT_H -/** -@file jpt.h -@brief JPT-stream reader (JPEG 2000, JPIP) - -JPT-stream functions are implemented in J2K.C. -*/ - -/** -Message Header JPT stream structure -*/ -typedef struct opj_jpt_msg_header { - /** In-class Identifier */ - unsigned int Id; - /** Last byte information */ - unsigned int last_byte; - /** Class Identifier */ - unsigned int Class_Id; - /** CSn : index identifier */ - unsigned int CSn_Id; - /** Message offset */ - unsigned int Msg_offset; - /** Message length */ - unsigned int Msg_length; - /** Auxiliary for JPP case */ - unsigned int Layer_nb; -} opj_jpt_msg_header_t; - -/* ----------------------------------------------------------------------- */ - -/** -Initialize the value of the message header structure -@param header Message header structure -*/ -void jpt_init_msg_header(opj_jpt_msg_header_t * header); - -/** -Read the message header for a JPP/JPT - stream -@param cinfo Codec context info -@param cio CIO handle -@param header Message header structure -*/ -void jpt_read_msg_header(opj_common_ptr cinfo, opj_cio_t *cio, - opj_jpt_msg_header_t *header); - -#endif diff --git a/src/lib/openmj2/mct.c b/src/lib/openmj2/mct.c deleted file mode 100644 index 2d3a36c2..00000000 --- a/src/lib/openmj2/mct.c +++ /dev/null @@ -1,198 +0,0 @@ -/* - * 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. - */ - -#ifdef __SSE__ -#include -#endif - -#include "opj_includes.h" - -/* */ -/* This table contains the norms of the basis function of the reversible MCT. */ -/* */ -static const double mct_norms[3] = { 1.732, .8292, .8292 }; - -/* */ -/* This table contains the norms of the basis function of the irreversible MCT. */ -/* */ -static const double mct_norms_real[3] = { 1.732, 1.805, 1.573 }; - -/* */ -/* Forward reversible MCT. */ -/* */ -void mct_encode( - int* restrict c0, - int* restrict c1, - int* restrict c2, - int n) -{ - int i; - for (i = 0; i < n; ++i) { - int r = c0[i]; - int g = c1[i]; - int b = c2[i]; - int y = (r + (g * 2) + b) >> 2; - int u = b - g; - int v = r - g; - c0[i] = y; - c1[i] = u; - c2[i] = v; - } -} - -/* */ -/* Inverse reversible MCT. */ -/* */ -void mct_decode( - int* restrict c0, - int* restrict c1, - int* restrict c2, - int n) -{ - int i; - for (i = 0; i < n; ++i) { - int y = c0[i]; - int u = c1[i]; - int v = c2[i]; - int g = y - ((u + v) >> 2); - int r = v + g; - int b = u + g; - c0[i] = r; - c1[i] = g; - c2[i] = b; - } -} - -/* */ -/* Get norm of basis function of reversible MCT. */ -/* */ -double mct_getnorm(int compno) -{ - return mct_norms[compno]; -} - -/* */ -/* Forward irreversible MCT. */ -/* */ -void mct_encode_real( - int* restrict c0, - int* restrict c1, - int* restrict c2, - int n) -{ - int i; - for (i = 0; i < n; ++i) { - int r = c0[i]; - int g = c1[i]; - int b = c2[i]; - int y = fix_mul(r, 2449) + fix_mul(g, 4809) + fix_mul(b, 934); - int u = -fix_mul(r, 1382) - fix_mul(g, 2714) + fix_mul(b, 4096); - int v = fix_mul(r, 4096) - fix_mul(g, 3430) - fix_mul(b, 666); - c0[i] = y; - c1[i] = u; - c2[i] = v; - } -} - -/* */ -/* Inverse irreversible MCT. */ -/* */ -void mct_decode_real( - float* restrict c0, - float* restrict c1, - float* restrict c2, - int n) -{ - int i; -#ifdef __SSE__ - __m128 vrv, vgu, vgv, vbu; - vrv = _mm_set1_ps(1.402f); - vgu = _mm_set1_ps(0.34413f); - vgv = _mm_set1_ps(0.71414f); - vbu = _mm_set1_ps(1.772f); - for (i = 0; i < (n >> 3); ++i) { - __m128 vy, vu, vv; - __m128 vr, vg, vb; - - vy = _mm_load_ps(c0); - vu = _mm_load_ps(c1); - vv = _mm_load_ps(c2); - vr = _mm_add_ps(vy, _mm_mul_ps(vv, vrv)); - vg = _mm_sub_ps(_mm_sub_ps(vy, _mm_mul_ps(vu, vgu)), _mm_mul_ps(vv, vgv)); - vb = _mm_add_ps(vy, _mm_mul_ps(vu, vbu)); - _mm_store_ps(c0, vr); - _mm_store_ps(c1, vg); - _mm_store_ps(c2, vb); - c0 += 4; - c1 += 4; - c2 += 4; - - vy = _mm_load_ps(c0); - vu = _mm_load_ps(c1); - vv = _mm_load_ps(c2); - vr = _mm_add_ps(vy, _mm_mul_ps(vv, vrv)); - vg = _mm_sub_ps(_mm_sub_ps(vy, _mm_mul_ps(vu, vgu)), _mm_mul_ps(vv, vgv)); - vb = _mm_add_ps(vy, _mm_mul_ps(vu, vbu)); - _mm_store_ps(c0, vr); - _mm_store_ps(c1, vg); - _mm_store_ps(c2, vb); - c0 += 4; - c1 += 4; - c2 += 4; - } - n &= 7; -#endif - for (i = 0; i < n; ++i) { - float y = c0[i]; - float u = c1[i]; - float v = c2[i]; - float r = y + (v * 1.402f); - float g = y - (u * 0.34413f) - (v * (0.71414f)); - float b = y + (u * 1.772f); - c0[i] = r; - c1[i] = g; - c2[i] = b; - } -} - -/* */ -/* Get norm of basis function of irreversible MCT. */ -/* */ -double mct_getnorm_real(int compno) -{ - return mct_norms_real[compno]; -} diff --git a/src/lib/openmj2/mct.h b/src/lib/openmj2/mct.h deleted file mode 100644 index 3c1e1b79..00000000 --- a/src/lib/openmj2/mct.h +++ /dev/null @@ -1,104 +0,0 @@ -/* - * 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 __MCT_H -#define __MCT_H -/** -@file mct.h -@brief Implementation of a multi-component transforms (MCT) - -The functions in MCT.C have for goal to realize reversible and irreversible multicomponent -transform. The functions in MCT.C are used by some function in TCD.C. -*/ - -/** @defgroup MCT MCT - Implementation of a multi-component transform */ -/*@{*/ - -/** @name Exported functions */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Apply a reversible multi-component transform to an image -@param c0 Samples for red component -@param c1 Samples for green component -@param c2 Samples blue component -@param n Number of samples for each component -*/ -void mct_encode(int *c0, int *c1, int *c2, int n); -/** -Apply a reversible multi-component inverse transform to an image -@param c0 Samples for luminance component -@param c1 Samples for red chrominance component -@param c2 Samples for blue chrominance component -@param n Number of samples for each component -*/ -void mct_decode(int *c0, int *c1, int *c2, int n); -/** -Get norm of the basis function used for the reversible multi-component transform -@param compno Number of the component (0->Y, 1->U, 2->V) -@return -*/ -double mct_getnorm(int compno); - -/** -Apply an irreversible multi-component transform to an image -@param c0 Samples for red component -@param c1 Samples for green component -@param c2 Samples blue component -@param n Number of samples for each component -*/ -void mct_encode_real(int *c0, int *c1, int *c2, int n); -/** -Apply an irreversible multi-component inverse transform to an image -@param c0 Samples for luminance component -@param c1 Samples for red chrominance component -@param c2 Samples for blue chrominance component -@param n Number of samples for each component -*/ -void mct_decode_real(float* c0, float* c1, float* c2, int n); -/** -Get norm of the basis function used for the irreversible multi-component transform -@param compno Number of the component (0->Y, 1->U, 2->V) -@return -*/ -double mct_getnorm_real(int compno); -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __MCT_H */ diff --git a/src/lib/openmj2/mj2.c b/src/lib/openmj2/mj2.c deleted file mode 100644 index 3cbf83f5..00000000 --- a/src/lib/openmj2/mj2.c +++ /dev/null @@ -1,3089 +0,0 @@ -/* - * 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 "opj_includes.h" -#include "mj2.h" - -/** @defgroup JP2 JP2 - JPEG-2000 file format reader/writer */ -/*@{*/ - -/** @name Local static functions */ -/*@{*/ - -/* -* -* Read box headers -* -*/ - -int mj2_read_boxhdr(mj2_box_t * box, opj_cio_t *cio) -{ - box->init_pos = cio_tell(cio); - box->length = cio_read(cio, 4); - box->type = cio_read(cio, 4); - if (box->length == 1) { - if (cio_read(cio, 4) != 0) { - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error: Cannot handle box sizes higher than 2^32\n"); - return 1; - }; - box->length = cio_read(cio, 4); - if (box->length == 0) { - box->length = cio_numbytesleft(cio) + 12; - } - } else if (box->length == 0) { - box->length = cio_numbytesleft(cio) + 8; - } - return 0; -} - -/* -* -* Initialisation of a Standard Movie, given a simple movie structure defined by the user -* The movie will have one sample per chunk -* -* Arguments: opj_mj2_t * movie -* Several variables of "movie" must be defined in order to enable a correct execution of -* this function: -* - The number of tracks of each type (movie->num_vtk, movie->num_stk, movie->num_htk) -* - The memory for each must be allocated (movie->tk) -* - For each track: -* The track type (tk->track_type) -* The number of sample (tk->num_samples) -* The sample rate (tk->sample_rate) -* -*/ - -int OPJ_CALLCONV mj2_init_stdmovie(opj_mj2_t * movie) -{ - mj2_tk_t *tk0; - int i, w, h, prec; - unsigned int j; - time_t ltime; - - movie->brand = MJ2_MJ2; - movie->minversion = 0; - movie->num_cl = 2; - movie->cl = (unsigned int*) opj_malloc(movie->num_cl * sizeof(unsigned int)); - - movie->cl[0] = MJ2_MJ2; - movie->cl[1] = MJ2_MJ2S; - time(<ime); /* Time since 1/1/70 */ - movie->creation_time = (unsigned int) ltime + - 2082844800; /* Seconds between 1/1/04 and 1/1/70 */ - movie->timescale = 1000; - - movie->rate = 1 << - 16; /* Rate to play presentation (default = 0x00010000) */ - movie->volume = 1 << - 8; /* Movie volume (default = 0x0100) */ - movie->trans_matrix[0] = - 0x00010000; /* Transformation matrix for video */ - movie->trans_matrix[1] = - 0; /* Unity is { 0x00010000,0,0,0,0x00010000,0,0,0,0x40000000 } */ - movie->trans_matrix[2] = 0; - movie->trans_matrix[3] = 0; - movie->trans_matrix[4] = 0x00010000; - movie->trans_matrix[5] = 0; - movie->trans_matrix[6] = 0; - movie->trans_matrix[7] = 0; - movie->trans_matrix[8] = 0x40000000; - movie->next_tk_id = 1; - - tk0 = &movie->tk[0]; - w = tk0->w; - h = tk0->h; - prec = tk0->depth; - - for (i = 0; i < movie->num_htk + movie->num_stk + movie->num_vtk; i++) { - mj2_tk_t *tk = &movie->tk[i]; - - movie->next_tk_id++; - tk->jp2_struct.comps = NULL; - tk->jp2_struct.cl = NULL; - - if (tk->track_type == 0) { /* no sound or hint track */ - if (tk->num_samples == 0) { - return 1; - } - - tk->w = w; - tk->h = h; - tk->depth = prec; - tk->Dim[0] = 0; - tk->Dim[1] = 0; - - tk->timescale = - 1000; /* Timescale = 1 ms */ - - tk->chunk[0].num_samples = 1; - tk->chunk[0].sample_descr_idx = 1; - - tk->same_sample_size = 0; - - tk->num_samplestochunk = 1; /* One sample per chunk */ - tk->sampletochunk = (mj2_sampletochunk_t*) opj_malloc(tk->num_samplestochunk * - sizeof(mj2_sampletochunk_t)); - tk->sampletochunk[0].first_chunk = 1; - tk->sampletochunk[0].samples_per_chunk = 1; - tk->sampletochunk[0].sample_descr_idx = 1; - - if (tk->sample_rate == 0) { - opj_event_msg(tk->cinfo, EVT_ERROR, - "Error while initializing MJ2 movie: Sample rate of track" - " %d must be different from zero\n", tk->track_ID); - return 1; - } - - for (j = 0; j < tk->num_samples; j++) { - tk->sample[j].sample_delta = tk->timescale / tk->sample_rate; - } - - tk->num_tts = 1; - tk->tts = (mj2_tts_t*) opj_malloc(tk->num_tts * sizeof(mj2_tts_t)); - tk->tts[0].sample_count = tk->num_samples; - tk->tts[0].sample_delta = tk->timescale / tk->sample_rate; - - tk->horizresolution = - 0x00480000; /* Horizontal resolution (typically 72) */ - tk->vertresolution = - 0x00480000; /* Vertical resolution (typically 72) */ - tk->compressorname[0] = - 0x0f4d6f74; /* Compressor Name[]: Motion JPEG2000 */ - tk->compressorname[1] = 0x696f6e20; - tk->compressorname[2] = 0x4a504547; - tk->compressorname[3] = 0x32303030; - tk->compressorname[4] = 0x00120000; - tk->compressorname[5] = 0; - tk->compressorname[6] = 0x00000042; - tk->compressorname[7] = 0x000000DC; - tk->num_url = - 0; /* Number of URL */ - tk->num_urn = - 0; /* Number of URN */ - tk->graphicsmode = - 0; /* Graphicsmode */ - tk->opcolor[0] = - 0; /* OpColor */ - tk->opcolor[1] = - 0; /* OpColor */ - tk->opcolor[2] = - 0; /* OpColor */ - tk->creation_time = - movie->creation_time; /* Seconds between 1/1/04 and 1/1/70 */ - tk->language = 0; /* Language (undefined) */ - tk->layer = 0; - tk->volume = 1 << 8; /* Movie volume (default = 0x0100) */ - tk->trans_matrix[0] = 0x00010000; /* Transformation matrix for track */ - tk->trans_matrix[1] = - 0; /* Unity is { 0x00010000,0,0,0,0x00010000,0,0,0,0x40000000 } */ - tk->trans_matrix[2] = 0; - tk->trans_matrix[3] = 0; - tk->trans_matrix[4] = 0x00010000; - tk->trans_matrix[5] = 0; - tk->trans_matrix[6] = 0; - tk->trans_matrix[7] = 0; - tk->trans_matrix[8] = 0x40000000; - tk->fieldcount = 1; - tk->fieldorder = 0; - tk->or_fieldcount = 1; - tk->or_fieldorder = 0; - tk->num_br = 2; - tk->br = (unsigned int*) opj_malloc(tk->num_br * sizeof(unsigned int)); - tk->br[0] = MJ2_JP2; - tk->br[1] = MJ2_J2P0; - tk->num_jp2x = 0; - tk->hsub = - 2; /* 4:2:0 */ - tk->vsub = - 2; /* 4:2:0 */ - tk->hoff = 0; - tk->voff = 0; - tk->visual_w = tk->w << 16; - tk->visual_h = tk->h << 16; - } else { - tk->num_br = 0; - tk->jp2xdata = NULL; - } - } - return 0; -} - -/* -* Time To Sample box Decompact -* -*/ -void mj2_tts_decompact(mj2_tk_t * tk) -{ - int i, j; - tk->num_samples = 0; - for (i = 0; i < tk->num_tts; i++) { - tk->num_samples += tk->tts[i].sample_count; - } - - tk->sample = (mj2_sample_t*) opj_malloc(tk->num_samples * sizeof(mj2_sample_t)); - - for (i = 0; i < tk->num_tts; i++) { - for (j = 0; j < tk->tts[i].sample_count; j++) { - tk->sample[j].sample_delta = tk->tts[i].sample_delta; - } - } -} - -/* -* Sample To Chunk box Decompact -* -*/ -void mj2_stsc_decompact(mj2_tk_t * tk) -{ - unsigned int i, j, k, sampleno = 0; - - if (tk->num_samplestochunk == 1) { - tk->num_chunks = - (unsigned int) ceil((double) tk->num_samples / - (double) tk->sampletochunk[0].samples_per_chunk); - tk->chunk = (mj2_chunk_t*) opj_malloc(tk->num_chunks * sizeof(mj2_chunk_t)); - for (k = 0; k < tk->num_chunks; k++) { - tk->chunk[k].num_samples = tk->sampletochunk[0].samples_per_chunk; - } - - } else { - tk->chunk = (mj2_chunk_t*) opj_malloc(tk->num_samples * sizeof(mj2_chunk_t)); - tk->num_chunks = 0; - for (i = 0; i < tk->num_samplestochunk - 1 ; i++) { - for (j = tk->sampletochunk[i].first_chunk - 1; - j < tk->sampletochunk[i + 1].first_chunk - 1; j++) { - tk->chunk[j].num_samples = tk->sampletochunk[i].samples_per_chunk; - tk->num_chunks++; - sampleno += tk->chunk[j].num_samples; - } - } - tk->num_chunks += (int)(tk->num_samples - sampleno) / - tk->sampletochunk[tk->num_samplestochunk - 1].samples_per_chunk; - for (k = tk->sampletochunk[tk->num_samplestochunk - 1].first_chunk - 1; - k < tk->num_chunks; k++) { - tk->chunk[k].num_samples = - tk->sampletochunk[tk->num_samplestochunk - 1].samples_per_chunk; - } - tk->chunk = (mj2_chunk_t*) - opj_realloc(tk->chunk, tk->num_chunks * sizeof(mj2_chunk_t)); - } - -} - - -/* -* Chunk offset box Decompact -* -*/ -void mj2_stco_decompact(mj2_tk_t * tk) -{ - unsigned int i, j, k = 0; - unsigned int intra_chunk_offset; - - for (i = 0; i < tk->num_chunks; i++) { - intra_chunk_offset = 0; - for (j = 0; j < tk->chunk[i].num_samples; j++) { - tk->sample[k].offset = intra_chunk_offset + tk->chunk[i].offset; - intra_chunk_offset += tk->sample[k].sample_size; - k++; - } - } -} - -/* -* Write the JP box -* -* JP Signature box -* -*/ -void OPJ_CALLCONV mj2_write_jp(opj_cio_t *cio) -{ - mj2_box_t box; - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - - cio_write(cio, MJ2_JP, 4); /* JP */ - cio_write(cio, 0x0d0a870a, 4); /* 0x0d0a870a required in a JP box */ - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); - cio_seek(cio, box.init_pos + box.length); -} - -/* -* Read the JP box -* -* JPEG 2000 signature -* -*/ -int mj2_read_jp(opj_cio_t *cio) -{ - mj2_box_t box; - - mj2_read_boxhdr(&box, cio); - if (MJ2_JP != box.type) { /* Check Marker */ - opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected JP Marker\n"); - return 1; - } - if (0x0d0a870a != cio_read(cio, - 4)) { /* read the 0x0d0a870a required in a JP box */ - opj_event_msg(cio->cinfo, EVT_ERROR, "Error with JP Marker\n"); - return 1; - } - if (cio_tell(cio) - box.init_pos != box.length) { /* Check box length */ - opj_event_msg(cio->cinfo, EVT_ERROR, "Error with JP Box size \n"); - return 1; - } - return 0; - -} - -/* -* Write the FTYP box -* -* File type box -* -*/ -void OPJ_CALLCONV mj2_write_ftyp(opj_mj2_t * movie, opj_cio_t *cio) -{ - int i; - mj2_box_t box; - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - - cio_write(cio, MJ2_FTYP, 4); /* FTYP */ - cio_write(cio, movie->brand, 4); /* BR */ - cio_write(cio, movie->minversion, 4); /* MinV */ - - for (i = 0; i < movie->num_cl; i++) { - cio_write(cio, movie->cl[i], 4); /* CL */ - } - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* Length */ - cio_seek(cio, box.init_pos + box.length); -} - -/* -* Read the FTYP box -* -* File type box -* -*/ -int mj2_read_ftyp(opj_mj2_t * movie, opj_cio_t *cio) -{ - int i; - mj2_box_t box; - - mj2_read_boxhdr(&box, cio); /* Box Size */ - if (MJ2_FTYP != box.type) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected FTYP Marker\n"); - return 1; - } - - movie->brand = cio_read(cio, 4); /* BR */ - movie->minversion = cio_read(cio, 4); /* MinV */ - movie->num_cl = (box.length - 16) / 4; - movie->cl = (unsigned int*) opj_malloc(movie->num_cl * sizeof(unsigned int)); - - for (i = movie->num_cl - 1; i > -1; i--) { - movie->cl[i] = cio_read(cio, 4); /* CLi */ - } - - if (cio_tell(cio) - box.init_pos != box.length) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error with FTYP Box\n"); - return 1; - } - return 0; -} - - -/* -* Write the STCO box -* -* Chunk Offset Box -* -*/ -void mj2_write_stco(mj2_tk_t * tk, opj_cio_t *cio) -{ - mj2_box_t box; - unsigned int i; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, MJ2_STCO, 4); /* STCO */ - - cio_write(cio, 0, 4); /* Version = 0, flags = 0 */ - - cio_write(cio, tk->num_chunks, 4); /* Entry Count */ - - for (i = 0; i < tk->num_chunks; i++) { - cio_write(cio, tk->chunk[i].offset, 4); /* Entry offset */ - } - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} - -/* -* Read the STCO box -* -* Chunk Offset Box -* -*/ -int mj2_read_stco(mj2_tk_t * tk, opj_cio_t *cio) -{ - unsigned int i; - mj2_box_t box; - - mj2_read_boxhdr(&box, cio); /* Box Size */ - if (MJ2_STCO != box.type) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected STCO Marker\n"); - return 1; - } - - if (0 != cio_read(cio, 1)) { /* Version = 0 */ - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error: Only Version 0 handled in STCO box\n"); - return 1; - } - - if (0 != cio_read(cio, 3)) { /* Flags = 0 */ - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error with flag in STCO box. Expected flag 0\n"); - return 1; - } - - - if (cio_read(cio, 4) != tk->num_chunks) { - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error in STCO box: expecting same amount of entry-count as chunks \n"); - } else { - for (i = 0; i < tk->num_chunks; i++) { - tk->chunk[i].offset = cio_read(cio, 4); /* Entry offset */ - } - } - - mj2_stco_decompact(tk); - - - if (cio_tell(cio) - box.init_pos != box.length) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error with STCO Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the STSZ box -* -* Sample size box -* -*/ -void mj2_write_stsz(mj2_tk_t * tk, opj_cio_t *cio) -{ - mj2_box_t box; - unsigned int i; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, MJ2_STSZ, 4); /* STSZ */ - - cio_write(cio, 0, 4); /* Version = 0, flags = 0 */ - - if (tk->same_sample_size == 1) { /* If they all have the same size */ - cio_write(cio, tk->sample[0].sample_size, 4); /* Size */ - - cio_write(cio, 1, 4); /* Entry count = 1 */ - } - - else { - cio_write(cio, 0, - 4); /* Sample Size = 0 because they all have different sizes */ - - cio_write(cio, tk->num_samples, 4); /* Sample Count */ - - for (i = 0; i < tk->num_samples; i++) { - cio_write(cio, tk->sample[i].sample_size, 4); - } - } - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} - -/* -* Read the STSZ box -* -* Sample size box -* -*/ -int mj2_read_stsz(mj2_tk_t * tk, opj_cio_t *cio) -{ - int sample_size; - unsigned int i; - mj2_box_t box; - - mj2_read_boxhdr(&box, cio); /* Box Size */ - if (MJ2_STSZ != box.type) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected STSZ Marker\n"); - return 1; - } - - - if (0 != cio_read(cio, 1)) { /* Version = 0 */ - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error: Only Version 0 handled in STSZ box\n"); - return 1; - } - - if (0 != cio_read(cio, 3)) { /* Flags = 0 */ - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error with flag in STSZ box. Expected flag 0\n"); - return 1; - } - - sample_size = cio_read(cio, 4); - - if (sample_size != 0) { /* Samples do have the same size */ - tk->same_sample_size = 1; - for (i = 0; i < tk->num_samples; i++) { - tk->sample[i].sample_size = sample_size; - } - cio_skip(cio, 4); /* Sample count = 1 */ - } else { - tk->same_sample_size = 0; - if (tk->num_samples != cio_read(cio, 4)) { /* Sample count */ - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error in STSZ box. Expected that sample-count is number of samples in track\n"); - return 1; - } - for (i = 0; i < tk->num_samples; i++) { - tk->sample[i].sample_size = cio_read(cio, 4); /* Sample Size */ - } - - if (cio_tell(cio) - box.init_pos != box.length) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error with STSZ Box size\n"); - return 1; - } - } - return 0; - -} - -/* -* Write the STSC box -* -* Sample to Chunk -* -*/ -void mj2_write_stsc(mj2_tk_t * tk, opj_cio_t *cio) -{ - unsigned int i; - mj2_box_t box; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, MJ2_STSC, 4); /* STSC */ - - cio_write(cio, 0, 4); /* Version = 0, flags = 0 */ - - cio_write(cio, tk->num_samplestochunk, 4); /* Entry Count */ - - for (i = 0; i < tk->num_samplestochunk; i++) { - cio_write(cio, tk->sampletochunk[i].first_chunk, 4); /* First Chunk */ - cio_write(cio, tk->sampletochunk[i].samples_per_chunk, - 4); /* Samples per chunk */ - cio_write(cio, tk->sampletochunk[i].sample_descr_idx, - 4); /* Samples description index */ - } - - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} - -/* -* Read the STSC box -* -* Sample to Chunk -* -*/ -int mj2_read_stsc(mj2_tk_t * tk, opj_cio_t *cio) -{ - unsigned int i; - mj2_box_t box; - - mj2_read_boxhdr(&box, cio); /* Box Size */ - if (MJ2_STSC != box.type) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected STSC Marker\n"); - return 1; - } - - - if (0 != cio_read(cio, 1)) { /* Version = 0 */ - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error: Only Version 0 handled in STSC box\n"); - return 1; - } - - if (0 != cio_read(cio, 3)) { /* Flags = 0 */ - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error with flag in STSC box. Expected flag 0\n"); - return 1; - } - - tk->num_samplestochunk = cio_read(cio, 4); - - tk->sampletochunk = (mj2_sampletochunk_t*) opj_malloc(tk->num_samplestochunk * - sizeof(mj2_sampletochunk_t)); - - for (i = 0; i < tk->num_samplestochunk; i++) { - tk->sampletochunk[i].first_chunk = cio_read(cio, 4); - tk->sampletochunk[i].samples_per_chunk = cio_read(cio, 4); - tk->sampletochunk[i].sample_descr_idx = cio_read(cio, 4); - } - - mj2_stsc_decompact(tk); /* decompact sample to chunk box */ - - - if (cio_tell(cio) - box.init_pos != box.length) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error with STSC Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the STTS box -* -* Time to Sample Box -* -*/ -void mj2_write_stts(mj2_tk_t * tk, opj_cio_t *cio) -{ - - int i; - mj2_box_t box; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, MJ2_STTS, 4); /* STTS */ - - cio_write(cio, 0, 4); /* Version = 0, flags = 0 */ - - cio_write(cio, tk->num_tts, 4); /* entry_count */ - for (i = 0; i < tk->num_tts; i++) { - cio_write(cio, tk->tts[i].sample_count, 4); /* Sample-count */ - cio_write(cio, tk->tts[i].sample_delta, 4); /* Sample-Delta */ - } - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} - -/* -* Read the STTS box -* -* -* -*/ -int mj2_read_stts(mj2_tk_t * tk, opj_cio_t *cio) -{ - int i; - - mj2_box_t box; - - mj2_read_boxhdr(&box, cio); - if (MJ2_STTS != box.type) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected STTS Marker\n"); - return 1; - } - - - if (0 != cio_read(cio, 1)) { /* Version = 0 */ - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error: Only Version 0 handled in STTS box\n"); - return 1; - } - - if (0 != cio_read(cio, 3)) { /* Flags = 0 */ - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error with flag in STTS box. Expected flag 0\n"); - return 1; - } - - tk->num_tts = cio_read(cio, 4); - - tk->tts = (mj2_tts_t*) opj_malloc(tk->num_tts * sizeof(mj2_tts_t)); - - for (i = 0; i < tk->num_tts; i++) { - tk->tts[i].sample_count = cio_read(cio, 4); - tk->tts[i].sample_delta = cio_read(cio, 4); - } - - mj2_tts_decompact(tk); - - if (cio_tell(cio) - box.init_pos != box.length) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error with STTS Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the FIEL box -* -* Field coding Box -* -*/ -void mj2_write_fiel(mj2_tk_t * tk, opj_cio_t *cio) -{ - - mj2_box_t box; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, MJ2_FIEL, 4); /* STTS */ - - cio_write(cio, tk->fieldcount, 1); /* Field count */ - cio_write(cio, tk->fieldorder, 1); /* Field order */ - - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} - -/* -* Read the FIEL box -* -* Field coding Box -* -*/ -int mj2_read_fiel(mj2_tk_t * tk, opj_cio_t *cio) -{ - - mj2_box_t box; - - mj2_read_boxhdr(&box, cio); - if (MJ2_FIEL != box.type) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected FIEL Marker\n"); - return 1; - } - - - tk->fieldcount = cio_read(cio, 1); - tk->fieldorder = cio_read(cio, 1); - - if (cio_tell(cio) - box.init_pos != box.length) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error with FIEL Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the ORFO box -* -* Original Format Box -* -*/ -void mj2_write_orfo(mj2_tk_t * tk, opj_cio_t *cio) -{ - mj2_box_t box; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, MJ2_ORFO, 4); - - cio_write(cio, tk->or_fieldcount, 1); /* Original Field count */ - cio_write(cio, tk->or_fieldorder, 1); /* Original Field order */ - - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} - -/* -* Read the ORFO box -* -* Original Format Box -* -*/ -int mj2_read_orfo(mj2_tk_t * tk, opj_cio_t *cio) -{ - - mj2_box_t box; - - mj2_read_boxhdr(&box, cio); - if (MJ2_ORFO != box.type) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected ORFO Marker\n"); - return 1; - } - - - tk->or_fieldcount = cio_read(cio, 1); - tk->or_fieldorder = cio_read(cio, 1); - - if (cio_tell(cio) - box.init_pos != box.length) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error with ORFO Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the JP2P box -* -* MJP2 Profile Box -* -*/ -void mj2_write_jp2p(mj2_tk_t * tk, opj_cio_t *cio) -{ - - int i; - mj2_box_t box; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, MJ2_JP2P, 4); - - cio_write(cio, 0, 4); /* Version 0, flags =0 */ - - for (i = 0; i < tk->num_br; i++) { - cio_write(cio, tk->br[i], 4); - } - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} - -/* -* Read the JP2P box -* -* MJP2 Profile Box -* -*/ -int mj2_read_jp2p(mj2_tk_t * tk, opj_cio_t *cio) -{ - int i; - - mj2_box_t box; - - mj2_read_boxhdr(&box, cio); - if (MJ2_JP2P != box.type) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected JP2P Marker\n"); - return 1; - } - - if (0 != cio_read(cio, 1)) { /* Version = 0 */ - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error: Only Version 0 handled in JP2P box\n"); - return 1; - } - - if (0 != cio_read(cio, 3)) { /* Flags = 0 */ - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error with flag in JP2P box. Expected flag 0\n"); - return 1; - } - - - tk->num_br = (box.length - 12) / 4; - tk->br = (unsigned int*) opj_malloc(tk->num_br * sizeof(unsigned int)); - - for (i = 0; i < tk->num_br; i++) { - tk->br[i] = cio_read(cio, 4); - } - - if (cio_tell(cio) - box.init_pos != box.length) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error with JP2P Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the JP2X box -* -* MJP2 Prefix Box -* -*/ -void mj2_write_jp2x(mj2_tk_t * tk, opj_cio_t *cio) -{ - - int i; - mj2_box_t box; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, MJ2_JP2X, 4); - - for (i = 0; i < tk->num_jp2x; i++) { - cio_write(cio, tk->jp2xdata[i], 1); - } - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} - -/* -* Read the JP2X box -* -* MJP2 Prefix Box -* -*/ -int mj2_read_jp2x(mj2_tk_t * tk, opj_cio_t *cio) -{ - unsigned int i; - - mj2_box_t box; - - mj2_read_boxhdr(&box, cio); - if (MJ2_JP2X != box.type) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected JP2X Marker\n"); - return 1; - } - - - tk->num_jp2x = (box.length - 8); - tk->jp2xdata = (unsigned char*) opj_malloc(tk->num_jp2x * sizeof( - unsigned char)); - - for (i = 0; i < tk->num_jp2x; i++) { - tk->jp2xdata[i] = cio_read(cio, 1); - } - - if (cio_tell(cio) - box.init_pos != box.length) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error with JP2X Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the JSUB box -* -* MJP2 Subsampling Box -* -*/ -void mj2_write_jsub(mj2_tk_t * tk, opj_cio_t *cio) -{ - - mj2_box_t box; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, MJ2_JSUB, 4); - - cio_write(cio, tk->hsub, 1); - cio_write(cio, tk->vsub, 1); - cio_write(cio, tk->hoff, 1); - cio_write(cio, tk->voff, 1); - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} - -/* -* Read the JSUB box -* -* MJP2 Subsampling Box -* -*/ -int mj2_read_jsub(mj2_tk_t * tk, opj_cio_t *cio) -{ - mj2_box_t box; - - mj2_read_boxhdr(&box, cio); - if (MJ2_JSUB != box.type) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected JSUB Marker\n"); - return 1; - } - - tk->hsub = cio_read(cio, 1); - tk->vsub = cio_read(cio, 1); - tk->hoff = cio_read(cio, 1);; - tk->voff = cio_read(cio, 1); - - if (cio_tell(cio) - box.init_pos != box.length) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error with JSUB Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the SMJ2 box -* -* Visual Sample Entry Description -* -*/ -void mj2_write_smj2(mj2_tk_t * tk, opj_cio_t *cio) -{ - mj2_box_t box; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, MJ2_MJ2, 4); /* MJ2 */ - - cio_write(cio, 0, 4); /* Version = 0, flags = 0 */ - - cio_write(cio, 1, 4); - - cio_write(cio, 0, 2); /* Pre-defined */ - - cio_write(cio, 0, 2); /* Reserved */ - - cio_write(cio, 0, 4); /* Pre-defined */ - cio_write(cio, 0, 4); /* Pre-defined */ - cio_write(cio, 0, 4); /* Pre-defined */ - - cio_write(cio, tk->w, 2); /* Width */ - cio_write(cio, tk->h, 2); /* Height */ - - cio_write(cio, tk->horizresolution, 4); /* Horizontal resolution */ - cio_write(cio, tk->vertresolution, 4); /* Vertical resolution */ - - cio_write(cio, 0, 4); /* Reserved */ - - cio_write(cio, 1, 2); /* Pre-defined = 1 */ - - cio_write(cio, tk->compressorname[0], 4); /* Compressor Name */ - cio_write(cio, tk->compressorname[1], 4); - cio_write(cio, tk->compressorname[2], 4); - cio_write(cio, tk->compressorname[3], 4); - cio_write(cio, tk->compressorname[4], 4); - cio_write(cio, tk->compressorname[5], 4); - cio_write(cio, tk->compressorname[6], 4); - cio_write(cio, tk->compressorname[7], 4); - - cio_write(cio, tk->depth, 2); /* Depth */ - - cio_write(cio, 0xffff, 2); /* Pre-defined = -1 */ - - jp2_write_jp2h(&tk->jp2_struct, cio); - - mj2_write_fiel(tk, cio); - - if (tk->num_br != 0) { - mj2_write_jp2p(tk, cio); - } - if (tk->num_jp2x != 0) { - mj2_write_jp2x(tk, cio); - } - - mj2_write_jsub(tk, cio); - mj2_write_orfo(tk, cio); - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} - -/* -* Read the SMJ2 box -* -* Visual Sample Entry Description -* -*/ -int mj2_read_smj2(opj_image_t * img, mj2_tk_t * tk, opj_cio_t *cio) -{ - mj2_box_t box; - mj2_box_t box2; - opj_jp2_color_t color; - int i; - opj_bool ok; - - mj2_read_boxhdr(&box, cio); - - if (MJ2_MJ2 != box.type) { - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error in SMJ2 box: Expected MJ2 Marker\n"); - return 1; - } - - if (0 != cio_read(cio, 1)) { /* Version = 0 */ - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error: Only Version 0 handled in MJP2 box\n"); - return 1; - } - - if (0 != cio_read(cio, 3)) { /* Flags = 0 */ - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error with flag in MJP2 box. Expected flag 0\n"); - return 1; - } - - cio_skip(cio, 4); - - cio_skip(cio, 2); /* Pre-defined */ - - cio_skip(cio, 2); /* Reserved */ - - cio_skip(cio, 4); /* Pre-defined */ - cio_skip(cio, 4); /* Pre-defined */ - cio_skip(cio, 4); /* Pre-defined */ - - tk->w = cio_read(cio, 2); /* Width */ - tk->h = cio_read(cio, 2); /* Height */ - - tk->horizresolution = cio_read(cio, 4); /* Horizontal resolution */ - tk->vertresolution = cio_read(cio, 4); /* Vertical resolution */ - - cio_skip(cio, 4); /* Reserved */ - - cio_skip(cio, 2); /* Pre-defined = 1 */ - - tk->compressorname[0] = cio_read(cio, 4); /* Compressor Name */ - tk->compressorname[1] = cio_read(cio, 4); - tk->compressorname[2] = cio_read(cio, 4); - tk->compressorname[3] = cio_read(cio, 4); - tk->compressorname[4] = cio_read(cio, 4); - tk->compressorname[5] = cio_read(cio, 4); - tk->compressorname[6] = cio_read(cio, 4); - tk->compressorname[7] = cio_read(cio, 4); - - tk->depth = cio_read(cio, 2); /* Depth */ - - /* Init std value */ - tk->num_jp2x = 0; - tk->fieldcount = 1; - tk->fieldorder = 0; - tk->or_fieldcount = 1; - tk->or_fieldorder = 0; - - cio_skip(cio, 2); /* Pre-defined = -1 */ - memset(&color, 0, sizeof(opj_jp2_color_t)); - tk->jp2_struct.cinfo = tk->cinfo; - - ok = jp2_read_jp2h(&tk->jp2_struct, cio, &color); - - tk->jp2_struct.cinfo = NULL; - - if (ok == OPJ_FALSE) { - opj_event_msg(tk->cinfo, EVT_ERROR, "Error reading JP2H Box\n"); - return 1; - } - - tk->jp2_struct.comps = (opj_jp2_comps_t*) opj_malloc(tk->jp2_struct.numcomps * - sizeof(opj_jp2_comps_t)); - tk->jp2_struct.cl = (unsigned int*) opj_malloc(sizeof(unsigned int)); - - tk->num_br = 0; - tk->num_jp2x = 0; - - for (i = 0; cio_tell(cio) - box.init_pos < box.length; i++) { - mj2_read_boxhdr(&box2, cio); - cio_seek(cio, box2.init_pos); - switch (box2.type) { - case MJ2_FIEL: - if (mj2_read_fiel(tk, cio)) { - return 1; - } - break; - - case MJ2_JP2P: - if (mj2_read_jp2p(tk, cio)) { - return 1; - } - break; - - case MJ2_JP2X: - if (mj2_read_jp2x(tk, cio)) { - return 1; - } - break; - - case MJ2_JSUB: - if (mj2_read_jsub(tk, cio)) { - return 1; - } - break; - - case MJ2_ORFO: - if (mj2_read_orfo(tk, cio)) { - return 1; - } - break; - - default: - opj_event_msg(cio->cinfo, EVT_ERROR, "Error with MJP2 Box size\n"); - return 1; - break; - - } - } - return 0; -} - - -/* -* Write the STSD box -* -* Sample Description -* -*/ -void mj2_write_stsd(mj2_tk_t * tk, opj_cio_t *cio) -{ - mj2_box_t box; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, MJ2_STSD, 4); /* STSD */ - - cio_write(cio, 0, 4); /* Version = 0, flags = 0 */ - - cio_write(cio, 1, - 4); /* entry_count = 1 (considering same JP2 headerboxes) */ - - if (tk->track_type == 0) { - mj2_write_smj2(tk, cio); - } else if (tk->track_type == 1) { - /* Not implemented*/ - } - if (tk->track_type == 2) { - /* Not implemented*/ - } - - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} - -/* -* Read the STSD box -* -* Sample Description -* -*/ -int mj2_read_stsd(mj2_tk_t * tk, opj_image_t * img, opj_cio_t *cio) -{ - int i; - int entry_count, len_2skip; - - mj2_box_t box; - - mj2_read_boxhdr(&box, cio); - - if (MJ2_STSD != box.type) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected STSD Marker\n"); - return 1; - } - - if (0 != cio_read(cio, 1)) { /* Version = 0 */ - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error: Only Version 0 handled in STSD box\n"); - return 1; - } - - if (0 != cio_read(cio, 3)) { /* Flags = 0 */ - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error with flag in STSD box. Expected flag 0\n"); - return 1; - } - - entry_count = cio_read(cio, 4); - - if (tk->track_type == 0) { - for (i = 0; i < entry_count; i++) { - if (mj2_read_smj2(img, tk, cio)) { - return 1; - } - } - } else if (tk->track_type == 1) { - len_2skip = cio_read(cio, 4); /* Not implemented -> skipping box*/ - cio_skip(cio, len_2skip - 4); - } else if (tk->track_type == 2) { - len_2skip = cio_read(cio, 4); /* Not implemented -> skipping box*/ - cio_skip(cio, len_2skip - 4); - } - - - if (cio_tell(cio) - box.init_pos != box.length) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error with STSD Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the STBL box -* -* Sample table box box -* -*/ -void mj2_write_stbl(mj2_tk_t * tk, opj_cio_t *cio) -{ - mj2_box_t box; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, MJ2_STBL, 4); /* STBL */ - - mj2_write_stsd(tk, cio); - mj2_write_stts(tk, cio); - mj2_write_stsc(tk, cio); - mj2_write_stsz(tk, cio); - mj2_write_stco(tk, cio); - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} - -/* -* Read the STBL box -* -* Sample table box box -* -*/ -int mj2_read_stbl(mj2_tk_t * tk, opj_image_t * img, opj_cio_t *cio) -{ - mj2_box_t box; - - mj2_read_boxhdr(&box, cio); - if (MJ2_STBL != box.type) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected STBL Marker\n"); - return 1; - } - - if (mj2_read_stsd(tk, img, cio)) { - return 1; - } - if (mj2_read_stts(tk, cio)) { - return 1; - } - if (mj2_read_stsc(tk, cio)) { - return 1; - } - if (mj2_read_stsz(tk, cio)) { - return 1; - } - if (mj2_read_stco(tk, cio)) { - return 1; - } - - if (cio_tell(cio) - box.init_pos != box.length) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error with STBL Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the URL box -* -* URL box -* -*/ -void mj2_write_url(mj2_tk_t * tk, int url_num, opj_cio_t *cio) -{ - mj2_box_t box; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, MJ2_URL, 4); /* URL */ - - if (url_num == 0) { - cio_write(cio, 1, - 4); /* Version = 0, flags = 1 because stored in same file */ - } else { - cio_write(cio, 0, 4); /* Version = 0, flags = 0 */ - cio_write(cio, tk->url[url_num - 1].location[0], 4); - cio_write(cio, tk->url[url_num - 1].location[1], 4); - cio_write(cio, tk->url[url_num - 1].location[2], 4); - cio_write(cio, tk->url[url_num - 1].location[3], 4); - } - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} - -/* -* Read the URL box -* -* URL box -* -*/ -int mj2_read_url(mj2_tk_t * tk, int urn_num, opj_cio_t *cio) -{ - mj2_box_t box; - - mj2_read_boxhdr(&box, cio); - if (MJ2_URL != box.type) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected URL Marker\n"); - return 1; - } - - if (0 != cio_read(cio, 1)) { /* Version = 0 */ - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error: Only Version 0 handled in URL box\n"); - return 1; - } - - if (1 != cio_read(cio, 3)) { /* If flags = 1 --> media data in file */ - tk->url[urn_num].location[0] = cio_read(cio, 4); - tk->url[urn_num].location[1] = cio_read(cio, 4); - tk->url[urn_num].location[2] = cio_read(cio, 4); - tk->url[urn_num].location[3] = cio_read(cio, 4); - } else { - tk->num_url--; - } - - - if (cio_tell(cio) - box.init_pos != box.length) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error with URL Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the URN box -* -* URN box -* -*/ -void mj2_write_urn(mj2_tk_t * tk, int urn_num, opj_cio_t *cio) -{ - mj2_box_t box; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, MJ2_URN, 4); /* URN */ - - cio_write(cio, 0, 4); /* Version = 0, flags = 0 */ - - cio_write(cio, tk->urn[urn_num].name[0], 4); - cio_write(cio, tk->urn[urn_num].name[1], 4); - cio_write(cio, tk->urn[urn_num].name[2], 4); - cio_write(cio, tk->urn[urn_num].name[3], 4); - cio_write(cio, tk->urn[urn_num].location[0], 4); - cio_write(cio, tk->urn[urn_num].location[1], 4); - cio_write(cio, tk->urn[urn_num].location[2], 4); - cio_write(cio, tk->urn[urn_num].location[3], 4); - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} - -/* -* Read the URN box -* -* URN box -* -*/ -int mj2_read_urn(mj2_tk_t * tk, int urn_num, opj_cio_t *cio) -{ - - mj2_box_t box; - - mj2_read_boxhdr(&box, cio); - if (MJ2_URN != box.type) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected URN Marker\n"); - return 1; - } - - if (0 != cio_read(cio, 1)) { /* Version = 0 */ - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error: Only Version 0 handled in URN box\n"); - return 1; - } - - if (1 != cio_read(cio, 3)) { /* If flags = 1 --> media data in file */ - tk->urn[urn_num].name[0] = cio_read(cio, 4); - tk->urn[urn_num].name[1] = cio_read(cio, 4); - tk->urn[urn_num].name[2] = cio_read(cio, 4); - tk->urn[urn_num].name[3] = cio_read(cio, 4); - tk->urn[urn_num].location[0] = cio_read(cio, 4); - tk->urn[urn_num].location[1] = cio_read(cio, 4); - tk->urn[urn_num].location[2] = cio_read(cio, 4); - tk->urn[urn_num].location[3] = cio_read(cio, 4); - } - - - if (cio_tell(cio) - box.init_pos != box.length) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error with URN Box size\n"); - return 1; - } - return 0; -} - - -/* -* Write the DREF box -* -* Data reference box -* -*/ -void mj2_write_dref(mj2_tk_t * tk, opj_cio_t *cio) -{ - int i; - mj2_box_t box; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, MJ2_DREF, 4); /* DREF */ - - cio_write(cio, 0, 4); /* Version = 0, flags = 0 */ - - if (tk->num_url + tk->num_urn == 0) { /* Media data in same file */ - cio_write(cio, 1, 4); /* entry_count = 1 */ - mj2_write_url(tk, 0, cio); - } else { - cio_write(cio, tk->num_url + tk->num_urn, 4); /* entry_count */ - - for (i = 0; i < tk->num_url; i++) { - mj2_write_url(tk, i + 1, cio); - } - - for (i = 0; i < tk->num_urn; i++) { - mj2_write_urn(tk, i, cio); - } - } - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} - -/* -* Read the DREF box -* -* Data reference box -* -*/ -int mj2_read_dref(mj2_tk_t * tk, opj_cio_t *cio) -{ - - int i; - int entry_count, marker; - mj2_box_t box; - - mj2_read_boxhdr(&box, cio); - if (MJ2_DREF != box.type) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected DREF Marker\n"); - return 1; - } - - if (0 != cio_read(cio, 1)) { /* Version = 0 */ - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error: Only Version 0 handled in DREF box\n"); - return 1; - } - - if (0 != cio_read(cio, 3)) { /* Flags = 0 */ - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error with flag in DREF box. Expected flag 0\n"); - return 1; - } - - entry_count = cio_read(cio, 4); - tk->num_url = 0; - tk->num_urn = 0; - - for (i = 0; i < entry_count; i++) { - cio_skip(cio, 4); - marker = cio_read(cio, 4); - if (marker == MJ2_URL) { - cio_skip(cio, -8); - tk->num_url++; - if (mj2_read_url(tk, tk->num_url, cio)) { - return 1; - } - } else if (marker == MJ2_URN) { - cio_skip(cio, -8); - tk->num_urn++; - if (mj2_read_urn(tk, tk->num_urn, cio)) { - return 1; - } - } else { - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error with in DREF box. Expected URN or URL box\n"); - return 1; - } - - } - - - if (cio_tell(cio) - box.init_pos != box.length) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error with DREF Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the DINF box -* -* Data information box -* -*/ -void mj2_write_dinf(mj2_tk_t * tk, opj_cio_t *cio) -{ - mj2_box_t box; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, MJ2_DINF, 4); /* DINF */ - - mj2_write_dref(tk, cio); - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} - -/* -* Read the DINF box -* -* Data information box -* -*/ -int mj2_read_dinf(mj2_tk_t * tk, opj_cio_t *cio) -{ - mj2_box_t box; - - mj2_read_boxhdr(&box, cio); - if (MJ2_DINF != box.type) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected DINF Marker\n"); - return 1; - } - - if (mj2_read_dref(tk, cio)) { - return 1; - } - - if (cio_tell(cio) - box.init_pos != box.length) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error with DINF Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the VMHD box -* -* Video Media information box -* -*/ -void mj2_write_vmhd(mj2_tk_t * tk, opj_cio_t *cio) -{ - mj2_box_t box; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, MJ2_VMHD, 4); /* VMHD */ - - cio_write(cio, 1, 4); /* Version = 0, flags = 1 */ - - cio_write(cio, tk->graphicsmode, 2); - cio_write(cio, tk->opcolor[0], 2); - cio_write(cio, tk->opcolor[1], 2); - cio_write(cio, tk->opcolor[2], 2); - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} - -/* -* Read the VMHD box -* -* Video Media information box -* -*/ -int mj2_read_vmhd(mj2_tk_t * tk, opj_cio_t *cio) -{ - mj2_box_t box; - - mj2_read_boxhdr(&box, cio); - if (MJ2_VMHD != box.type) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected VMHD Marker\n"); - return 1; - } - - if (0 != cio_read(cio, 1)) { /* Version = 0 */ - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error: Only Version 0 handled in VMHD box\n"); - return 1; - } - - if (1 != cio_read(cio, 3)) { /* Flags = 1 */ - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error with flag in VMHD box. Expected flag 1\n"); - return 1; - } - - tk->track_type = 0; - tk->graphicsmode = cio_read(cio, 2); - tk->opcolor[0] = cio_read(cio, 2); - tk->opcolor[1] = cio_read(cio, 2); - tk->opcolor[2] = cio_read(cio, 2); - - if (cio_tell(cio) - box.init_pos != box.length) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error with VMHD Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the SMHD box -* -* Sound Media information box -* -*/ -void mj2_write_smhd(mj2_tk_t * tk, opj_cio_t *cio) -{ - mj2_box_t box; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, MJ2_SMHD, 4); /* SMHD */ - - cio_write(cio, 0, 4); /* Version = 0, flags = 0 */ - - cio_write(cio, tk->balance, 2); - - cio_write(cio, 0, 2); /* Reserved */ - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} - -/* -* Read the SMHD box -* -* Sound Media information box -* -*/ -int mj2_read_smhd(mj2_tk_t * tk, opj_cio_t *cio) -{ - mj2_box_t box; - - mj2_read_boxhdr(&box, cio); - if (MJ2_SMHD != box.type) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected SMHD Marker\n"); - return 1; - } - - if (0 != cio_read(cio, 1)) { /* Version = 0 */ - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error: Only Version 0 handled in SMHD box\n"); - return 1; - } - - if (0 != cio_read(cio, 3)) { /* Flags = 0 */ - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error with flag in SMHD box. Expected flag 0\n"); - return 1; - } - - tk->track_type = 1; - tk->balance = cio_read(cio, 2); - - /* Init variables to zero to avoid problems when freeeing memory - The values will possibly be overidded when decoding the track structure */ - tk->num_br = 0; - tk->num_url = 0; - tk->num_urn = 0; - tk->num_chunks = 0; - tk->num_tts = 0; - tk->num_samplestochunk = 0; - tk->num_samples = 0; - - cio_skip(cio, 2); /* Reserved */ - - if (cio_tell(cio) - box.init_pos != box.length) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error with SMHD Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the HMHD box -* -* Hint Media information box -* -*/ -void mj2_write_hmhd(mj2_tk_t * tk, opj_cio_t *cio) -{ - mj2_box_t box; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, MJ2_HMHD, 4); /* HMHD */ - - cio_write(cio, 0, 4); /* Version = 0, flags = 0 */ - - cio_write(cio, tk->maxPDUsize, 2); - cio_write(cio, tk->avgPDUsize, 2); - cio_write(cio, tk->maxbitrate, 4); - cio_write(cio, tk->avgbitrate, 4); - cio_write(cio, tk->slidingavgbitrate, 4); - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} - -/* -* Read the HMHD box -* -* Hint Media information box -* -*/ -int mj2_read_hmhd(mj2_tk_t * tk, opj_cio_t *cio) -{ - mj2_box_t box; - - mj2_read_boxhdr(&box, cio); - if (MJ2_HMHD != box.type) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected HMHD Marker\n"); - return 1; - } - - if (0 != cio_read(cio, 1)) { /* Version = 0 */ - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error: Only Version 0 handled in HMHD box\n"); - return 1; - } - - if (0 != cio_read(cio, 3)) { /* Flags = 0 */ - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error with flag in HMHD box. Expected flag 0\n"); - return 1; - } - - tk->track_type = 2; - tk->maxPDUsize = cio_read(cio, 2); - tk->avgPDUsize = cio_read(cio, 2); - tk->maxbitrate = cio_read(cio, 4); - tk->avgbitrate = cio_read(cio, 4); - tk->slidingavgbitrate = cio_read(cio, 4); - - /* Init variables to zero to avoid problems when freeeing memory - The values will possibly be overidded when decoding the track structure */ - tk->num_br = 0; - tk->num_url = 0; - tk->num_urn = 0; - tk->num_chunks = 0; - tk->num_tts = 0; - tk->num_samplestochunk = 0; - tk->num_samples = 0; - - - if (cio_tell(cio) - box.init_pos != box.length) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error with HMHD Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the MINF box -* -* Media information box -* -*/ -void mj2_write_minf(mj2_tk_t * tk, opj_cio_t *cio) -{ - mj2_box_t box; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, MJ2_MINF, 4); /* MINF */ - - if (tk->track_type == 0) { - mj2_write_vmhd(tk, cio); - } else if (tk->track_type == 1) { - mj2_write_smhd(tk, cio); - } else if (tk->track_type == 2) { - mj2_write_hmhd(tk, cio); - } - - mj2_write_dinf(tk, cio); - mj2_write_stbl(tk, cio); - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} - -/* -* Read the MINF box -* -* Media information box -* -*/ -int mj2_read_minf(mj2_tk_t * tk, opj_image_t * img, opj_cio_t *cio) -{ - - unsigned int box_type; - mj2_box_t box; - - mj2_read_boxhdr(&box, cio); - if (MJ2_MINF != box.type) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected MINF Marker\n"); - return 1; - } - - cio_skip(cio, 4); - box_type = cio_read(cio, 4); - cio_skip(cio, -8); - - if (box_type == MJ2_VMHD) { - if (mj2_read_vmhd(tk, cio)) { - return 1; - } - } else if (box_type == MJ2_SMHD) { - if (mj2_read_smhd(tk, cio)) { - return 1; - } - } else if (box_type == MJ2_HMHD) { - if (mj2_read_hmhd(tk, cio)) { - return 1; - } - } else { - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error in MINF box expected vmhd, smhd or hmhd\n"); - return 1; - } - - if (mj2_read_dinf(tk, cio)) { - return 1; - } - - if (mj2_read_stbl(tk, img, cio)) { - return 1; - } - - if (cio_tell(cio) - box.init_pos != box.length) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error with MINF Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the HDLR box -* -* Handler reference box -* -*/ -void mj2_write_hdlr(mj2_tk_t * tk, opj_cio_t *cio) -{ - mj2_box_t box; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, MJ2_HDLR, 4); /* HDLR */ - - cio_write(cio, 0, 4); /* Version = 0, flags = 0 */ - - cio_write(cio, 0, 4); /* Predefine */ - - tk->name = - 0; /* The track name is immediately determined by the track type */ - - if (tk->track_type == 0) { - tk->handler_type = 0x76696465; /* Handler type: vide */ - cio_write(cio, tk->handler_type, 4); - - cio_write(cio, 0, 4); - cio_write(cio, 0, 4); - cio_write(cio, 0, 4); /* Reserved */ - - cio_write(cio, 0x76696465, 4); - cio_write(cio, 0x6F206d65, 4); - cio_write(cio, 0x64696120, 4); - cio_write(cio, 0x74726163, 4); - cio_write(cio, 0x6b00, 2); /* String: video media track */ - } else if (tk->track_type == 1) { - tk->handler_type = 0x736F756E; /* Handler type: soun */ - cio_write(cio, tk->handler_type, 4); - - cio_write(cio, 0, 4); - cio_write(cio, 0, 4); - cio_write(cio, 0, 4); /* Reserved */ - - cio_write(cio, 0x536F756E, 4); - cio_write(cio, 0x6400, 2); /* String: Sound */ - } else if (tk->track_type == 2) { - tk->handler_type = 0x68696E74; /* Handler type: hint */ - cio_write(cio, tk->handler_type, 4); - - cio_write(cio, 0, 4); - cio_write(cio, 0, 4); - cio_write(cio, 0, 4); /* Reserved */ - - cio_write(cio, 0x48696E74, 4); - cio_write(cio, 0, 2); /* String: Hint */ - } - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} - -/* -* Read the HDLR box -* -* Handler reference box -* -*/ -int mj2_read_hdlr(mj2_tk_t * tk, opj_cio_t *cio) -{ - int i; - mj2_box_t box; - - mj2_read_boxhdr(&box, cio); - if (MJ2_HDLR != box.type) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected HDLR Marker\n"); - return 1; - } - - - if (0 != cio_read(cio, 1)) { /* Version = 0 */ - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error: Only Version 0 handled in HDLR box\n"); - return 1; - } - - if (0 != cio_read(cio, 3)) { /* Flags = 0 */ - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error with flag in HDLR box. Expected flag 0\n"); - return 1; - } - - cio_skip(cio, 4); /* Reserved */ - - tk->handler_type = cio_read(cio, 4); - cio_skip(cio, 12); /* Reserved */ - - tk->name_size = box.length - 32; - - tk->name = (char*) opj_malloc(tk->name_size * sizeof(char)); - for (i = 0; i < tk->name_size; i++) { - tk->name[i] = cio_read(cio, 1); /* Name */ - } - - if (cio_tell(cio) - box.init_pos != box.length) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error with HDLR Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the MDHD box -* -* Media Header Box -* -*/ -void mj2_write_mdhd(mj2_tk_t * tk, opj_cio_t *cio) -{ - mj2_box_t box; - unsigned int i; - time_t ltime; - unsigned int modification_time; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, MJ2_MDHD, 4); /* MDHD */ - - cio_write(cio, 0, 4); /* Version = 0, flags = 0 */ - - cio_write(cio, tk->creation_time, 4); /* Creation Time */ - - time(<ime); /* Time since 1/1/70 */ - modification_time = (unsigned int)ltime + - 2082844800; /* Seoonds between 1/1/04 and 1/1/70 */ - - cio_write(cio, modification_time, 4); /* Modification Time */ - - cio_write(cio, tk->timescale, 4); /* Timescale */ - - tk->duration = 0; - - for (i = 0; i < tk->num_samples; i++) { - tk->duration += tk->sample[i].sample_delta; - } - - cio_write(cio, tk->duration, 4); /* Duration */ - - cio_write(cio, tk->language, 2); /* Language */ - - cio_write(cio, 0, 2); /* Predefined */ - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} - -/* -* Read the MDHD box -* -* Media Header Box -* -*/ -int mj2_read_mdhd(mj2_tk_t * tk, opj_cio_t *cio) -{ - mj2_box_t box; - - mj2_read_boxhdr(&box, cio); - if (!(MJ2_MHDR == box.type || - MJ2_MDHD == box.type)) { /* Kakadu writes MHDR instead of MDHD*/ - opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected MDHD Marker\n"); - return 1; - } - - if (0 != cio_read(cio, 1)) { /* Version = 0 */ - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error: Only Version 0 handled in MDHD box\n"); - return 1; - } - - if (0 != cio_read(cio, 3)) { /* Flags = 0 */ - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error with flag in MDHD box. Expected flag 0\n"); - return 1; - } - - - tk->creation_time = cio_read(cio, 4); /* Creation Time */ - - tk->modification_time = cio_read(cio, 4); /* Modification Time */ - - tk->timescale = cio_read(cio, 4); /* Timescale */ - - tk->duration = cio_read(cio, 4); /* Duration */ - - tk->language = cio_read(cio, 2); /* Language */ - - cio_skip(cio, 2); /* Predefined */ - - if (cio_tell(cio) - box.init_pos != box.length) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error with MDHD Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the MDIA box -* -* Media box -* -*/ -void mj2_write_mdia(mj2_tk_t * tk, opj_cio_t *cio) -{ - mj2_box_t box; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, MJ2_MDIA, 4); /* MDIA */ - - mj2_write_mdhd(tk, cio); - mj2_write_hdlr(tk, cio); - mj2_write_minf(tk, cio); - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} - -/* -* Read the MDIA box -* -* Media box -* -*/ -int mj2_read_mdia(mj2_tk_t * tk, opj_image_t * img, opj_cio_t *cio) -{ - mj2_box_t box; - - mj2_read_boxhdr(&box, cio); - if (MJ2_MDIA != box.type) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected MDIA Marker\n"); - return 1; - } - - if (mj2_read_mdhd(tk, cio)) { - return 1; - } - if (mj2_read_hdlr(tk, cio)) { - return 1; - } - if (mj2_read_minf(tk, img, cio)) { - return 1; - } - - if (cio_tell(cio) - box.init_pos != box.length) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error with MDIA Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the TKHD box -* -* Track Header box -* -*/ -void mj2_write_tkhd(mj2_tk_t * tk, opj_cio_t *cio) -{ - mj2_box_t box; - unsigned int i; - time_t ltime; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - - cio_write(cio, MJ2_TKHD, 4); /* TKHD */ - - cio_write(cio, 3, 4); /* Version=0, flags=3 */ - - time(<ime); /* Time since 1/1/70 */ - tk->modification_time = (unsigned int)ltime + - 2082844800; /* Seoonds between 1/1/04 and 1/1/70 */ - - cio_write(cio, tk->creation_time, 4); /* Creation Time */ - - cio_write(cio, tk->modification_time, 4); /* Modification Time */ - - cio_write(cio, tk->track_ID, 4); /* Track ID */ - - cio_write(cio, 0, 4); /* Reserved */ - - tk->duration = 0; - - for (i = 0; i < tk->num_samples; i++) { - tk->duration += tk->sample[i].sample_delta; - } - - cio_write(cio, tk->duration, 4); /* Duration */ - - cio_write(cio, 0, 4); /* Reserved */ - cio_write(cio, 0, 4); /* Reserved */ - - cio_write(cio, tk->layer, 2); /* Layer */ - - cio_write(cio, 0, 2); /* Predefined */ - - cio_write(cio, tk->volume, 2); /* Volume */ - - cio_write(cio, 0, 2); /* Reserved */ - - cio_write(cio, tk->trans_matrix[0], 4); /* Transformation matrix for track */ - cio_write(cio, tk->trans_matrix[1], 4); - cio_write(cio, tk->trans_matrix[2], 4); - cio_write(cio, tk->trans_matrix[3], 4); - cio_write(cio, tk->trans_matrix[4], 4); - cio_write(cio, tk->trans_matrix[5], 4); - cio_write(cio, tk->trans_matrix[6], 4); - cio_write(cio, tk->trans_matrix[7], 4); - cio_write(cio, tk->trans_matrix[8], 4); - - cio_write(cio, tk->visual_w, 4); /* Video Visual Width */ - - cio_write(cio, tk->visual_h, 4); /* Video Visual Height */ - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} - -/* -* Read the TKHD box -* -* Track Header box -* -*/ -int mj2_read_tkhd(mj2_tk_t * tk, opj_cio_t *cio) -{ - int flag; - - mj2_box_t box; - - mj2_read_boxhdr(&box, cio); - - if (MJ2_TKHD != box.type) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected TKHD Marker\n"); - return 1; - } - - if (0 != cio_read(cio, 1)) { /* Version = 0 */ - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error: Only Version 0 handled in TKHD box\n"); - return 1; - } - - flag = cio_read(cio, 3); - - if (!(flag == 1 || flag == 2 || flag == 3 || - flag == 4)) { /* Flags = 1,2,3 or 4 */ - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error with flag in TKHD box: Expected flag 1,2,3 or 4\n"); - return 1; - } - - tk->creation_time = cio_read(cio, 4); /* Creation Time */ - - tk->modification_time = cio_read(cio, 4); /* Modification Time */ - - tk->track_ID = cio_read(cio, 4); /* Track ID */ - - cio_skip(cio, 4); /* Reserved */ - - tk->duration = cio_read(cio, 4); /* Duration */ - - cio_skip(cio, 8); /* Reserved */ - - tk->layer = cio_read(cio, 2); /* Layer */ - - cio_read(cio, 2); /* Predefined */ - - tk->volume = cio_read(cio, 2); /* Volume */ - - cio_skip(cio, 2); /* Reserved */ - - tk->trans_matrix[0] = cio_read(cio, 4); /* Transformation matrix for track */ - tk->trans_matrix[1] = cio_read(cio, 4); - tk->trans_matrix[2] = cio_read(cio, 4); - tk->trans_matrix[3] = cio_read(cio, 4); - tk->trans_matrix[4] = cio_read(cio, 4); - tk->trans_matrix[5] = cio_read(cio, 4); - tk->trans_matrix[6] = cio_read(cio, 4); - tk->trans_matrix[7] = cio_read(cio, 4); - tk->trans_matrix[8] = cio_read(cio, 4); - - tk->visual_w = cio_read(cio, 4); /* Video Visual Width */ - - tk->visual_h = cio_read(cio, 4); /* Video Visual Height */ - - if (cio_tell(cio) - box.init_pos != box.length) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error with TKHD Box size\n"); - return 1; - } - return 0; -} - -/* -* Write the TRAK box -* -* Track box -* -*/ -void mj2_write_trak(mj2_tk_t * tk, opj_cio_t *cio) -{ - mj2_box_t box; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - - cio_write(cio, MJ2_TRAK, 4); /* TRAK */ - - mj2_write_tkhd(tk, cio); - mj2_write_mdia(tk, cio); - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} - -/* -* Read the TRAK box -* -* Track box -* -*/ -int mj2_read_trak(mj2_tk_t * tk, opj_image_t * img, opj_cio_t *cio) -{ - mj2_box_t box; - - mj2_read_boxhdr(&box, cio); - if (MJ2_TRAK != box.type) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected TRAK Marker\n"); - return 1; - } - if (mj2_read_tkhd(tk, cio)) { - return 1; - } - if (mj2_read_mdia(tk, img, cio)) { - return 1; - } - if (cio_tell(cio) - box.init_pos != box.length) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error with TRAK Box\n"); - return 1; - } - return 0; -} - -/* -* Write the MVHD box -* -* Movie header Box -* -*/ -void mj2_write_mvhd(opj_mj2_t * movie, opj_cio_t *cio) -{ - int i; - mj2_box_t box; - unsigned j; - time_t ltime; - int max_tk_num = 0; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, MJ2_MVHD, 4); /* MVHD */ - - cio_write(cio, 0, 4); /* Version = 0, flags = 0 */ - - time(<ime); /* Time since 1/1/70 */ - movie->modification_time = (unsigned int)ltime + - 2082844800; /* Seoonds between 1/1/04 and 1/1/70 */ - - cio_write(cio, movie->creation_time, 4); /* Creation Time */ - - cio_write(cio, movie->modification_time, 4); /* Modification Time */ - - cio_write(cio, movie->timescale, 4); /* Timescale */ - - movie->duration = 0; - - for (i = 0; i < (movie->num_stk + movie->num_htk + movie->num_vtk); i++) { - mj2_tk_t *tk = &movie->tk[i]; - - for (j = 0; j < tk->num_samples; j++) { - movie->duration += tk->sample[j].sample_delta; - } - } - - cio_write(cio, movie->duration, 4); - - cio_write(cio, movie->rate, 4); /* Rate to play presentation */ - - cio_write(cio, movie->volume, 2); /* Volume */ - - cio_write(cio, 0, 2); /* Reserved */ - cio_write(cio, 0, 4); /* Reserved */ - cio_write(cio, 0, 4); /* Reserved */ - - cio_write(cio, movie->trans_matrix[0], - 4); /* Transformation matrix for video */ - cio_write(cio, movie->trans_matrix[1], 4); - cio_write(cio, movie->trans_matrix[2], 4); - cio_write(cio, movie->trans_matrix[3], 4); - cio_write(cio, movie->trans_matrix[4], 4); - cio_write(cio, movie->trans_matrix[5], 4); - cio_write(cio, movie->trans_matrix[6], 4); - cio_write(cio, movie->trans_matrix[7], 4); - cio_write(cio, movie->trans_matrix[8], 4); - - cio_write(cio, 0, 4); /* Pre-defined */ - cio_write(cio, 0, 4); /* Pre-defined */ - cio_write(cio, 0, 4); /* Pre-defined */ - cio_write(cio, 0, 4); /* Pre-defined */ - cio_write(cio, 0, 4); /* Pre-defined */ - cio_write(cio, 0, 4); /* Pre-defined */ - - - for (i = 0; i < movie->num_htk + movie->num_stk + movie->num_vtk; i++) { - if (max_tk_num < movie->tk[i].track_ID) { - max_tk_num = movie->tk[i].track_ID; - } - } - - movie->next_tk_id = max_tk_num + 1; - - cio_write(cio, movie->next_tk_id, 4); /* ID of Next track to be added */ - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} - -/* -* Read the MVHD box -* -* Movie header Box -* -*/ -int mj2_read_mvhd(opj_mj2_t * movie, opj_cio_t *cio) -{ - mj2_box_t box; - - mj2_read_boxhdr(&box, cio); - if (MJ2_MVHD != box.type) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected MVHD Marker\n"); - return 1; - } - - - if (0 != cio_read(cio, 4)) { /* Version = 0, flags = 0 */ - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error: Only Version 0 handled in MVHD box\n"); - } - - movie->creation_time = cio_read(cio, 4); /* Creation Time */ - - movie->modification_time = cio_read(cio, 4); /* Modification Time */ - - movie->timescale = cio_read(cio, 4); /* Timescale */ - - movie->duration = cio_read(cio, 4); /* Duration */ - - movie->rate = cio_read(cio, 4); /* Rate to play presentation */ - - movie->volume = cio_read(cio, 2); /* Volume */ - - cio_skip(cio, 10); /* Reserved */ - - movie->trans_matrix[0] = cio_read(cio, - 4); /* Transformation matrix for video */ - movie->trans_matrix[1] = cio_read(cio, 4); - movie->trans_matrix[2] = cio_read(cio, 4); - movie->trans_matrix[3] = cio_read(cio, 4); - movie->trans_matrix[4] = cio_read(cio, 4); - movie->trans_matrix[5] = cio_read(cio, 4); - movie->trans_matrix[6] = cio_read(cio, 4); - movie->trans_matrix[7] = cio_read(cio, 4); - movie->trans_matrix[8] = cio_read(cio, 4); - - cio_skip(cio, 24); /* Pre-defined */ - - movie->next_tk_id = cio_read(cio, 4); /* ID of Next track to be added */ - - if (cio_tell(cio) - box.init_pos != box.length) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error with MVHD Box Size\n"); - return 1; - } - return 0; -} - - -/* -* Write the MOOV box -* -* Movie Box -* -*/ -void OPJ_CALLCONV mj2_write_moov(opj_mj2_t * movie, opj_cio_t *cio) -{ - int i; - mj2_box_t box; - - box.init_pos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, MJ2_MOOV, 4); /* MOOV */ - - mj2_write_mvhd(movie, cio); - - for (i = 0; i < (movie->num_stk + movie->num_htk + movie->num_vtk); i++) { - mj2_write_trak(&movie->tk[i], cio); - } - - box.length = cio_tell(cio) - box.init_pos; - cio_seek(cio, box.init_pos); - cio_write(cio, box.length, 4); /* L */ - cio_seek(cio, box.init_pos + box.length); -} - -/* -* Read the MOOV box -* -* Movie Box -* -*/ -int mj2_read_moov(opj_mj2_t * movie, opj_image_t * img, opj_cio_t *cio) -{ - unsigned int i; - mj2_box_t box; - mj2_box_t box2; - - mj2_read_boxhdr(&box, cio); - if (MJ2_MOOV != box.type) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected MOOV Marker\n"); - return 1; - } - - if (mj2_read_mvhd(movie, cio)) { - return 1; - } - - movie->tk = (mj2_tk_t*) opj_malloc((movie->next_tk_id - 1) * sizeof(mj2_tk_t)); - - for (i = 0; cio_tell(cio) - box.init_pos < box.length; i++) { - mj2_tk_t *tk = &movie->tk[i]; - tk->cinfo = movie->cinfo; - mj2_read_boxhdr(&box2, cio); - if (box2.type == MJ2_TRAK) { - cio_seek(cio, box2.init_pos); - if (mj2_read_trak(tk, img, cio)) { - return 1; - } - - if (tk->track_type == 0) { - movie->num_vtk++; - } else if (tk->track_type == 1) { - movie->num_stk++; - } else if (tk->track_type == 2) { - movie->num_htk++; - } - } else if (box2.type == MJ2_MVEX) { - cio_seek(cio, box2.init_pos); - cio_skip(cio, box2.length); - i--; - } else { - opj_event_msg(cio->cinfo, EVT_ERROR, - "Error with MOOV Box: Expected TRAK or MVEX box\n"); - return 1; - } - } - return 0; -} - -int OPJ_CALLCONV mj2_read_struct(FILE *file, opj_mj2_t *movie) -{ - mj2_box_t box; - opj_image_t img; - unsigned char * src; - int fsresult; - int foffset; - opj_cio_t *cio; - - /* open a byte stream for reading */ - src = (unsigned char*) opj_malloc(300 * sizeof(unsigned char)); - - /* Assuming that jp and ftyp markers size do - not exceed 300 bytes */ - fread(src, 300, 1, file); - - cio = opj_cio_open((opj_common_ptr)movie->cinfo, src, 300); - - if (mj2_read_jp(cio)) { - return 1; - } - if (mj2_read_ftyp(movie, cio)) { - return 1; - } - - fsresult = fseek(file, cio_tell(cio), SEEK_SET); - if (fsresult) { - opj_event_msg(cio->cinfo, EVT_ERROR, - "End of file reached while trying to read data after FTYP box\n"); - return 1; - } - - foffset = cio_tell(cio); - - box.type = 0; - - fread(src, 30, 1, file); - cio = opj_cio_open((opj_common_ptr)movie->cinfo, src, 300); - mj2_read_boxhdr(&box, cio); - - while (box.type != MJ2_MOOV) { - - switch (box.type) { - case MJ2_MDAT: - fsresult = fseek(file, foffset + box.length, SEEK_SET); - if (fsresult) { - opj_event_msg(cio->cinfo, EVT_ERROR, - "End of file reached while trying to read MDAT box\n"); - return 1; - } - foffset += box.length; - break; - - case MJ2_MOOF: - fsresult = fseek(file, foffset + box.length, SEEK_SET); - if (fsresult) { - opj_event_msg(cio->cinfo, EVT_ERROR, - "End of file reached while trying to read MOOF box\n"); - return 1; - } - foffset += box.length; - break; - case MJ2_FREE: - fsresult = fseek(file, foffset + box.length, SEEK_SET); - if (fsresult) { - opj_event_msg(cio->cinfo, EVT_ERROR, - "End of file reached while trying to read FREE box\n"); - return 1; - } - foffset += box.length; - break; - case MJ2_SKIP: - fsresult = fseek(file, foffset + box.length, SEEK_SET); - if (fsresult) { - opj_event_msg(cio->cinfo, EVT_ERROR, - "End of file reached while trying to read SKIP box\n"); - return 1; - } - foffset += box.length; - break; - default: - opj_event_msg(cio->cinfo, EVT_ERROR, "Unknown box in MJ2 stream\n"); - fsresult = fseek(file, foffset + box.length, SEEK_SET); - if (fsresult) { - opj_event_msg(cio->cinfo, EVT_ERROR, - "End of file reached while trying to read end of unknown box\n"); - return 1; - } - foffset += box.length; - break; - } - fsresult = fread(src, 8, 1, file); - if (fsresult != 1) { - opj_event_msg(cio->cinfo, EVT_ERROR, "MOOV box not found in file\n"); - return 1; - } - cio = opj_cio_open((opj_common_ptr)movie->cinfo, src, 8); - mj2_read_boxhdr(&box, cio); - } - - fseek(file, foffset, SEEK_SET); - src = (unsigned char*)opj_realloc(src, box.length); - if (src == NULL) { - opj_event_msg(cio->cinfo, EVT_ERROR, "Error reallocation memory\n"); - opj_free(src); - return 1; - } - - fsresult = fread(src, box.length, 1, file); - if (fsresult != 1) { - opj_event_msg(cio->cinfo, EVT_ERROR, - "End of file reached while trying to read MOOV box\n"); - opj_free(src); - return 1; - } - - cio = opj_cio_open((opj_common_ptr)movie->cinfo, src, box.length); - - if (mj2_read_moov(movie, &img, cio)) { - opj_free(src); - return 1; - } - - opj_free(src); - return 0; -} - -/* ----------------------------------------------------------------------- */ -/* MJ2 decoder interface */ -/* ----------------------------------------------------------------------- */ - -opj_dinfo_t* OPJ_CALLCONV mj2_create_decompress() -{ - opj_mj2_t* mj2; - opj_dinfo_t *dinfo = (opj_dinfo_t*) opj_calloc(1, sizeof(opj_dinfo_t)); - if (!dinfo) { - return NULL; - } - - dinfo->is_decompressor = OPJ_TRUE; - - mj2 = (opj_mj2_t*) opj_calloc(1, sizeof(opj_mj2_t)); - dinfo->mj2_handle = mj2; - if (mj2) { - mj2->cinfo = (opj_common_ptr)dinfo; - } - mj2->j2k = j2k_create_decompress((opj_common_ptr)dinfo); - dinfo->j2k_handle = mj2->j2k; - - return dinfo; -} - -void OPJ_CALLCONV mj2_setup_decoder(opj_mj2_t *movie, - mj2_dparameters_t *mj2_parameters) -{ - movie->num_vtk = 0; - movie->num_stk = 0; - movie->num_htk = 0; - - /* setup the J2K decoder parameters */ - j2k_setup_decoder((opj_j2k_t*)movie->cinfo->j2k_handle, - &mj2_parameters->j2k_parameters); - -} - -void OPJ_CALLCONV mj2_destroy_decompress(opj_mj2_t *movie) -{ - if (movie) { - int i; - mj2_tk_t *tk = NULL; - - if (movie->cinfo->j2k_handle) { - j2k_destroy_compress(movie->j2k); - } - - if (movie->num_cl != 0) { - opj_free(movie->cl); - } - - for (i = 0; i < movie->num_vtk + movie->num_stk + movie->num_htk; i++) { - tk = &movie->tk[i]; - if (tk->name_size != 0) { - opj_free(tk->name); - } - if (tk->track_type == 0) {/* Video track*/ - if (tk->jp2_struct.comps != NULL) { - opj_free(tk->jp2_struct.comps); - } - if (tk->jp2_struct.cl != NULL) { - opj_free(tk->jp2_struct.cl); - } - if (tk->num_jp2x != 0) { - opj_free(tk->jp2xdata); - } - - } - if (tk->num_url != 0) { - opj_free(tk->url); - } - if (tk->num_urn != 0) { - opj_free(tk->urn); - } - if (tk->num_br != 0) { - opj_free(tk->br); - } - if (tk->num_tts != 0) { - opj_free(tk->tts); - } - if (tk->num_chunks != 0) { - opj_free(tk->chunk); - } - if (tk->num_samplestochunk != 0) { - opj_free(tk->sampletochunk); - } - if (tk->num_samples != 0) { - opj_free(tk->sample); - } - } - - opj_free(movie->tk); - } - opj_free(movie); -} - -/* ----------------------------------------------------------------------- */ -/* MJ2 encoder interface */ -/* ----------------------------------------------------------------------- */ - -opj_cinfo_t* OPJ_CALLCONV mj2_create_compress() -{ - opj_mj2_t* mj2; - opj_cinfo_t *cinfo = (opj_cinfo_t*) opj_calloc(1, sizeof(opj_cinfo_t)); - if (!cinfo) { - return NULL; - } - - mj2 = (opj_mj2_t*) opj_calloc(1, sizeof(opj_mj2_t)); - cinfo->mj2_handle = mj2; - if (mj2) { - mj2->cinfo = (opj_common_ptr)cinfo; - } - - mj2->j2k = j2k_create_compress(mj2->cinfo); - cinfo->j2k_handle = mj2->j2k; - - return cinfo; -} - -void OPJ_CALLCONV mj2_setup_encoder(opj_mj2_t *movie, - mj2_cparameters_t *parameters) -{ - if (movie && parameters) { - opj_jp2_t *jp2_struct; - - movie->num_htk = 0; /* No hint tracks*/ - movie->num_stk = 0; /* No sound tracks*/ - movie->num_vtk = 1; /* One video track*/ - - movie->brand = MJ2_MJ2; /* One brand: MJ2*/ - movie->num_cl = 2; /* Two compatible brands: MJ2 and MJ2S*/ - movie->cl = (unsigned int*) opj_malloc(movie->num_cl * sizeof(unsigned int)); - movie->cl[0] = MJ2_MJ2; - movie->cl[1] = MJ2_MJ2S; - movie->minversion = 0; /* Minimum version: 0 */ - - movie->tk = (mj2_tk_t*) opj_malloc(sizeof( - mj2_tk_t)); /*Memory allocation for the video track*/ - movie->tk[0].track_ID = 1; /* Track ID = 1 */ - movie->tk[0].track_type = 0; /* Video track */ - movie->tk[0].Dim[0] = parameters->Dim[0]; - movie->tk[0].Dim[1] = parameters->Dim[1]; - movie->tk[0].w = parameters->w; - movie->tk[0].h = parameters->h; - movie->tk[0].CbCr_subsampling_dx = parameters->CbCr_subsampling_dx; - movie->tk[0].CbCr_subsampling_dy = parameters->CbCr_subsampling_dy; - movie->tk[0].sample_rate = parameters->frame_rate; - movie->tk[0].name_size = 0; - movie->tk[0].chunk = (mj2_chunk_t*) opj_malloc(sizeof(mj2_chunk_t)); - movie->tk[0].sample = (mj2_sample_t*) opj_malloc(sizeof(mj2_sample_t)); - movie->tk[0].depth = parameters->prec; - - jp2_struct = &movie->tk[0].jp2_struct; - jp2_struct->numcomps = parameters->numcomps; /* NC */ - jp2_struct->comps = (opj_jp2_comps_t*) opj_malloc(jp2_struct->numcomps * sizeof( - opj_jp2_comps_t)); - jp2_struct->precedence = 0; /* PRECEDENCE*/ - jp2_struct->approx = 0; /* APPROX*/ - jp2_struct->brand = JP2_JP2; /* BR */ - jp2_struct->minversion = 0; /* MinV */ - jp2_struct->numcl = 1; - jp2_struct->cl = (unsigned int*) opj_malloc(jp2_struct->numcl * sizeof( - unsigned int)); - jp2_struct->cl[0] = JP2_JP2; /* CL0 : JP2 */ - jp2_struct->C = 7; /* C : Always 7*/ - jp2_struct->UnkC = 0; /* UnkC, colorspace specified in colr box*/ - jp2_struct->IPR = 0; /* IPR, no intellectual property*/ - jp2_struct->w = parameters->w; - jp2_struct->h = parameters->h; - jp2_struct->bpc = 7; - jp2_struct->meth = parameters->meth; - jp2_struct->enumcs = parameters->enumcs; - } -} - -void OPJ_CALLCONV mj2_destroy_compress(opj_mj2_t *movie) -{ - if (movie) { - int i; - mj2_tk_t *tk = NULL; - - if (movie->cinfo->j2k_handle) { - j2k_destroy_compress(movie->j2k); - } - - if (movie->num_cl != 0) { - opj_free(movie->cl); - } - - for (i = 0; i < movie->num_vtk + movie->num_stk + movie->num_htk; i++) { - tk = &movie->tk[i]; - if (tk->name_size != 0) { - opj_free(tk->name); - } - if (tk->track_type == 0) {/* Video track*/ - if (tk->jp2_struct.comps != NULL) { - opj_free(tk->jp2_struct.comps); - } - if (tk->jp2_struct.cl != NULL) { - opj_free(tk->jp2_struct.cl); - } - if (tk->num_jp2x != 0) { - opj_free(tk->jp2xdata); - } - - } - if (tk->num_url != 0) { - opj_free(tk->url); - } - if (tk->num_urn != 0) { - opj_free(tk->urn); - } - if (tk->num_br != 0) { - opj_free(tk->br); - } - if (tk->num_tts != 0) { - opj_free(tk->tts); - } - if (tk->num_chunks != 0) { - opj_free(tk->chunk); - } - if (tk->num_samplestochunk != 0) { - opj_free(tk->sampletochunk); - } - if (tk->num_samples != 0) { - opj_free(tk->sample); - } - } - - opj_free(movie->tk); - } - opj_free(movie); -} - -/*@}*/ - -/*@}*/ - diff --git a/src/lib/openmj2/mj2.h b/src/lib/openmj2/mj2.h deleted file mode 100644 index 8e08f0b5..00000000 --- a/src/lib/openmj2/mj2.h +++ /dev/null @@ -1,396 +0,0 @@ -/* -* Copyright (c) 2003-2004, Francois-Olivier Devaux -* Copyright (c) 2003-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. - */ - -#ifndef __MJ2_H -#define __MJ2_H -/** -@file mj2.h -@brief The Motion JPEG 2000 file format Reader/Writer (MJ22) - -*/ - -/** @defgroup MJ2 MJ2 - Motion JPEG 2000 file format reader/writer */ -/*@{*/ - -#define MJ2_JP 0x6a502020 -#define MJ2_FTYP 0x66747970 -#define MJ2_MJ2 0x6d6a7032 -#define MJ2_MJ2S 0x6d6a3273 -#define MJ2_MDAT 0x6d646174 -#define MJ2_MOOV 0x6d6f6f76 -#define MJ2_MVHD 0x6d766864 -#define MJ2_TRAK 0x7472616b -#define MJ2_TKHD 0x746b6864 -#define MJ2_MDIA 0x6d646961 -#define MJ2_MDHD 0x6d646864 -#define MJ2_MHDR 0x6d686472 -#define MJ2_HDLR 0x68646C72 -#define MJ2_MINF 0x6d696e66 -#define MJ2_VMHD 0x766d6864 -#define MJ2_SMHD 0x736d6864 -#define MJ2_HMHD 0x686d6864 -#define MJ2_DINF 0x64696e66 -#define MJ2_DREF 0x64726566 -#define MJ2_URL 0x75726c20 -#define MJ2_URN 0x75726e20 -#define MJ2_STBL 0x7374626c -#define MJ2_STSD 0x73747364 -#define MJ2_STTS 0x73747473 -#define MJ2_STSC 0x73747363 -#define MJ2_STSZ 0x7374737a -#define MJ2_STCO 0x7374636f -#define MJ2_MOOF 0x6d6f6f66 -#define MJ2_FREE 0x66726565 -#define MJ2_SKIP 0x736b6970 -#define MJ2_JP2C 0x6a703263 -#define MJ2_FIEL 0x6669656c -#define MJ2_JP2P 0x6a703270 -#define MJ2_JP2X 0x6a703278 -#define MJ2_JSUB 0x6a737562 -#define MJ2_ORFO 0x6f72666f -#define MJ2_MVEX 0x6d766578 -#define MJ2_JP2 0x6a703220 -#define MJ2_J2P0 0x4a325030 - -/** -Decompressed format used in parameters -YUV = 0 -*/ -#define YUV_DFMT 1 - -/** -Compressed format used in parameters -MJ2 = 0 -*/ -#define MJ2_CFMT 2 - - -/* ----------------------------------------------------------------------- */ - -/** -Time To Sample -*/ -typedef struct mj2_tts { - int sample_count; - int sample_delta; -} mj2_tts_t; - -/** -Chunk -*/ -typedef struct mj2_chunk { - unsigned int num_samples; - int sample_descr_idx; - int offset; -} mj2_chunk_t; - -/** -Sample to chunk -*/ -typedef struct mj2_sampletochunk { - unsigned int first_chunk; - unsigned int samples_per_chunk; - int sample_descr_idx; -} mj2_sampletochunk_t; - -/** -Sample -*/ -typedef struct mj2_sample { - unsigned int sample_size; - unsigned int offset; - unsigned int sample_delta; -} mj2_sample_t; - -/** -URL -*/ -typedef struct mj2_url { - int location[4]; -} mj2_url_t; - -/** -URN -*/ -typedef struct mj2_urn { - int name[2]; - int location[4]; -} mj2_urn_t; - -/** -Video Track Parameters -*/ -typedef struct mj2_tk { - /** codec context */ - opj_common_ptr cinfo; - int track_ID; - int track_type; - unsigned int creation_time; - unsigned int modification_time; - int duration; - int timescale; - int layer; - int volume; - int language; - int balance; - int maxPDUsize; - int avgPDUsize; - int maxbitrate; - int avgbitrate; - int slidingavgbitrate; - int graphicsmode; - int opcolor[3]; - int num_url; - mj2_url_t *url; - int num_urn; - mj2_urn_t *urn; - int Dim[2]; - int w; - int h; - int visual_w; - int visual_h; - int CbCr_subsampling_dx; - int CbCr_subsampling_dy; - int sample_rate; - int sample_description; - int horizresolution; - int vertresolution; - int compressorname[8]; - int depth; - unsigned char fieldcount; - unsigned char fieldorder; - unsigned char or_fieldcount; - unsigned char or_fieldorder; - int num_br; - unsigned int *br; - unsigned char num_jp2x; - unsigned char *jp2xdata; - unsigned char hsub; - unsigned char vsub; - unsigned char hoff; - unsigned char voff; - int trans_matrix[9]; - /** Number of samples */ - unsigned int num_samples; - int transorm; - int handler_type; - int name_size; - unsigned char same_sample_size; - int num_tts; - /** Time to sample */ - mj2_tts_t *tts; - unsigned int num_chunks; - mj2_chunk_t *chunk; - unsigned int num_samplestochunk; - mj2_sampletochunk_t *sampletochunk; - char *name; - opj_jp2_t jp2_struct; - /** Sample parameters */ - mj2_sample_t *sample; -} mj2_tk_t; - -/** -MJ2 box -*/ -typedef struct mj2_box { - int length; - int type; - int init_pos; -} mj2_box_t; - -/** -MJ2 Movie -*/ -typedef struct opj_mj2 { - /** codec context */ - opj_common_ptr cinfo; - /** handle to the J2K codec */ - opj_j2k_t *j2k; - unsigned int brand; - unsigned int minversion; - int num_cl; - unsigned int *cl; - unsigned int creation_time; - unsigned int modification_time; - int timescale; - unsigned int duration; - int rate; - int num_vtk; - int num_stk; - int num_htk; - int volume; - int trans_matrix[9]; - int next_tk_id; - /** Track Parameters */ - mj2_tk_t *tk; -} opj_mj2_t; - -/** -Decompression parameters -*/ -typedef struct mj2_dparameters { - /**@name command line encoder parameters (not used inside the library) */ - /*@{*/ - /** input file name */ - char infile[OPJ_PATH_LEN]; - /** output file name */ - char outfile[OPJ_PATH_LEN]; - /** J2K decompression parameters */ - opj_dparameters_t j2k_parameters; -} mj2_dparameters_t; - -/** -Compression parameters -*/ -typedef struct mj2_cparameters { - /**@name command line encoder parameters (not used inside the library) */ - /*@{*/ - /** J2K compression parameters */ - opj_cparameters_t j2k_parameters; - /** input file name */ - char infile[OPJ_PATH_LEN]; - /** output file name */ - char outfile[OPJ_PATH_LEN]; - /** input file format 0:MJ2 */ - int decod_format; - /** output file format 0:YUV */ - int cod_format; - /** Portion of the image coded */ - int Dim[2]; - /** YUV Frame width */ - int w; - /** YUV Frame height */ - int h; - /* Sample rate of YUV 4:4:4, 4:2:2 or 4:2:0 */ - int CbCr_subsampling_dx; - /* Sample rate of YUV 4:4:4, 4:2:2 or 4:2:0 */ - int CbCr_subsampling_dy; - /* Video Frame Rate */ - int frame_rate; - /* In YUV files, numcomps always considered as 3 */ - int numcomps; - /* In YUV files, precision always considered as 8 */ - int prec; - unsigned int meth; - unsigned int enumcs; -} mj2_cparameters_t; - - -/** @name Exported functions */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Write the JP box -*/ -OPJ_API void OPJ_CALLCONV mj2_write_jp(opj_cio_t *cio); -/** -Write the FTYP box -@param movie MJ2 movie -@param cio Output buffer stream -*/ -OPJ_API void OPJ_CALLCONV mj2_write_ftyp(opj_mj2_t *movie, opj_cio_t *cio); -/** -Creates an MJ2 decompression structure -@return Returns a handle to a MJ2 decompressor if successful, returns NULL otherwise -*/ -OPJ_API opj_dinfo_t* OPJ_CALLCONV mj2_create_decompress(); -/** -Destroy a MJ2 decompressor handle -@param movie MJ2 decompressor handle to destroy -*/ -OPJ_API void OPJ_CALLCONV mj2_destroy_decompress(opj_mj2_t *movie); -/** -Setup the decoder decoding parameters using user parameters. -Decoding parameters are returned in mj2->j2k->cp. -@param movie MJ2 decompressor handle -@param mj2_parameters decompression parameters -*/ -OPJ_API void OPJ_CALLCONV mj2_setup_decoder(opj_mj2_t *movie, - mj2_dparameters_t *mj2_parameters); -/** -Decode an image from a JPEG-2000 file stream -@param movie MJ2 decompressor handle -@param cio Input buffer stream -@return Returns a decoded image if successful, returns NULL otherwise -*/ -opj_image_t* mj2_decode(opj_mj2_t *movie, opj_cio_t *cio); -/** -Creates a MJ2 compression structure -@return Returns a handle to a MJ2 compressor if successful, returns NULL otherwise -*/ -OPJ_API opj_cinfo_t* OPJ_CALLCONV mj2_create_compress(); -/** -Destroy a MJ2 compressor handle -@param movie MJ2 compressor handle to destroy -*/ -OPJ_API void OPJ_CALLCONV mj2_destroy_compress(opj_mj2_t *movie); -/** -Setup the encoder parameters using the current image and using user parameters. -Coding parameters are returned in mj2->j2k->cp. -@param movie MJ2 compressor handle -@param parameters compression parameters -*/ -OPJ_API void OPJ_CALLCONV mj2_setup_encoder(opj_mj2_t *movie, - mj2_cparameters_t *parameters); -/** -Encode an image into a JPEG-2000 file stream -@param movie MJ2 compressor handle -@param cio Output buffer stream -@param image Image to encode -@param index Name of the index file if required, NULL otherwise -@return Returns true if successful, returns false otherwise -*/ -opj_bool mj2_encode(opj_mj2_t *movie, opj_cio_t *cio, opj_image_t *image, - char *index); - -/** -Init a Standard MJ2 movie -@param movie MJ2 Movie -@return Returns 0 if successful, returns 1 otherwise -*/ -OPJ_API int OPJ_CALLCONV mj2_init_stdmovie(opj_mj2_t *movie); -/** -Read the structure of an MJ2 file -@param file MJ2 input File -@param mj2 J2 movie structure -@return Returns 0 if successful, returns 1 otherwise -*/ -OPJ_API int OPJ_CALLCONV mj2_read_struct(FILE *file, opj_mj2_t *mj2); -/** -Write the MOOV box to an output buffer stream -@param movie MJ2 movie structure -@param cio Output buffer stream -*/ -OPJ_API void OPJ_CALLCONV mj2_write_moov(opj_mj2_t *movie, opj_cio_t *cio); - - -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __MJ2_H */ diff --git a/src/lib/openmj2/mj2_convert.c b/src/lib/openmj2/mj2_convert.c deleted file mode 100644 index 0d7816b8..00000000 --- a/src/lib/openmj2/mj2_convert.c +++ /dev/null @@ -1,385 +0,0 @@ -/* -* Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium -* Copyright (c) 2002-2014, Professor Benoit Macq -* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe -* All rights reserved. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* 1. Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* 2. Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' -* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -* POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "opj_includes.h" -#include "mj2_convert.h" - -/* ----------------------- */ -/* */ -/* */ -/* Count the number of frames */ -/* in a YUV file */ -/* */ -/* ----------------------- */ - -unsigned int OPJ_CALLCONV yuv_num_frames(mj2_tk_t * tk, char *infile) -{ - unsigned int prec_size; - long end_of_f, frame_size; - FILE *f; - - f = fopen(infile, "rb"); - if (!f) { - fprintf(stderr, "failed to open %s for reading\n", infile); - return 0; - } - prec_size = (tk->depth + 7) / 8; /* bytes of precision */ - - frame_size = (long)(tk->w * tk->h * (1.0 + (double) 2 / (double)( - tk->CbCr_subsampling_dx * - tk->CbCr_subsampling_dy))); /* Calculate frame size */ - frame_size *= prec_size; - - fseek(f, 0, SEEK_END); - end_of_f = ftell(f); /* Calculate file size */ - - if (end_of_f < frame_size) { - fprintf(stderr, - "YUV does not contains any frame of %d x %d size\n", tk->w, - tk->h); - fclose(f); - return 0; - } - fclose(f); - - return (unsigned int)(end_of_f / frame_size); -} - -/* ----------------------- */ -/* */ -/* */ -/* YUV to IMAGE */ -/* */ -/* ----------------------- */ - -opj_image_t * OPJ_CALLCONV mj2_image_create(mj2_tk_t * tk, - opj_cparameters_t *parameters) -{ - opj_image_cmptparm_t cmptparm[3]; - opj_image_t * img; - int i; - int numcomps = 3; - int subsampling_dx = parameters->subsampling_dx; - int subsampling_dy = parameters->subsampling_dy; - - /* initialize image components */ - memset(&cmptparm[0], 0, 3 * sizeof(opj_image_cmptparm_t)); - for (i = 0; i < numcomps; i++) { - cmptparm[i].prec = tk->depth; - cmptparm[i].bpp = tk->depth; - cmptparm[i].sgnd = 0; - cmptparm[i].dx = i ? subsampling_dx * tk->CbCr_subsampling_dx : subsampling_dx; - cmptparm[i].dy = i ? subsampling_dy * tk->CbCr_subsampling_dy : subsampling_dy; - cmptparm[i].w = tk->w; - cmptparm[i].h = tk->h; - } - /* create the image */ - img = opj_image_create(numcomps, cmptparm, CLRSPC_SRGB); - return img; -} - -char OPJ_CALLCONV yuvtoimage(mj2_tk_t * tk, opj_image_t * img, int frame_num, - opj_cparameters_t *parameters, char* infile) -{ - int i, compno; - int offset, size, max, prec_bytes, is_16, v; - long end_of_f, position; - int numcomps = 3; - int subsampling_dx = parameters->subsampling_dx; - int subsampling_dy = parameters->subsampling_dy; - FILE *yuvfile; - int *data; - unsigned char uc; - - yuvfile = fopen(infile, "rb"); - if (!yuvfile) { - fprintf(stderr, "failed to open %s for readings\n", parameters->infile); - return 1; - } - is_16 = (tk->depth > 8); - prec_bytes = (is_16 ? 2 : 1); - - offset = (int)((double)(frame_num * tk->w * tk->h) * (1.0 + - 1.0 * (double) 2 / (double)(tk->CbCr_subsampling_dx * - tk->CbCr_subsampling_dy))); - offset *= prec_bytes; - - fseek(yuvfile, 0, SEEK_END); - end_of_f = ftell(yuvfile); - fseek(yuvfile, sizeof(unsigned char) * offset, SEEK_SET); - position = ftell(yuvfile); - if (position >= end_of_f) { - fprintf(stderr, "Cannot reach frame number %d in yuv file !!\n", - frame_num); - fclose(yuvfile); - return 1; - } - - img->x0 = tk->Dim[0]; - img->y0 = tk->Dim[1]; - img->x1 = !tk->Dim[0] ? (tk->w - 1) * subsampling_dx + 1 : tk->Dim[0] + - (tk->w - 1) * subsampling_dx + 1; - img->y1 = !tk->Dim[1] ? (tk->h - 1) * subsampling_dy + 1 : tk->Dim[1] + - (tk->h - 1) * subsampling_dy + 1; - - size = tk->w * tk->h * prec_bytes; - - for (compno = 0; compno < numcomps; compno++) { - max = size / (img->comps[compno].dx * img->comps[compno].dy); - data = img->comps[compno].data; - - for (i = 0; i < max && !feof(yuvfile); i++) { - v = 0; - fread(&uc, 1, 1, yuvfile); - v = uc; - - if (is_16) { - fread(&uc, 1, 1, yuvfile); - v |= (uc << 8); - } - *data++ = v; - } - } - fclose(yuvfile); - - return 0; -} - - - -/* ----------------------- */ -/* */ -/* */ -/* IMAGE to YUV */ -/* */ -/* ----------------------- */ - - -opj_bool OPJ_CALLCONV imagetoyuv(opj_image_t * img, char *outfile) -{ - FILE *f; - int *data; - int i, v, is_16, prec_bytes; - unsigned char buf[2]; - - if (img->numcomps == 3) { - if (img->comps[0].dx != img->comps[1].dx / 2 - || img->comps[1].dx != img->comps[2].dx) { - fprintf(stderr, - "Error with the input image components size: cannot create yuv file)\n"); - return OPJ_FALSE; - } - } else if (!(img->numcomps == 1)) { - fprintf(stderr, - "Error with the number of image components(must be one or three)\n"); - return OPJ_FALSE; - } - - f = fopen(outfile, "a+b"); - if (!f) { - fprintf(stderr, "failed to open %s for writing\n", outfile); - return OPJ_FALSE; - } - is_16 = (img->comps[0].prec > 8); - prec_bytes = (is_16 ? 2 : 1); - data = img->comps[0].data; - - for (i = 0; i < (img->comps[0].w * img->comps[0].h); i++) { - v = *data++; - buf[0] = (unsigned char)v; - - if (is_16) { - buf[1] = (unsigned char)(v >> 8); - } - - fwrite(buf, 1, prec_bytes, f); - } - - - if (img->numcomps == 3) { - data = img->comps[1].data; - - for (i = 0; i < (img->comps[1].w * img->comps[1].h); i++) { - v = *data++; - buf[0] = (unsigned char)v; - - if (is_16) { - buf[1] = (unsigned char)(v >> 8); - } - - fwrite(buf, 1, prec_bytes, f); - } - data = img->comps[2].data; - - for (i = 0; i < (img->comps[2].w * img->comps[2].h); i++) { - v = *data++; - buf[0] = (unsigned char)v; - - if (is_16) { - buf[1] = (unsigned char)(v >> 8); - } - - fwrite(buf, 1, prec_bytes, f); - } - } else if (img->numcomps == 1) { - /* fake CbCr values */ - if (is_16) { - buf[0] = 255; - if (img->comps[0].prec == 10) { - buf[1] = 1; - } else if (img->comps[0].prec == 12) { - buf[1] = 3; - } else { - buf[1] = 125; - } - } else { - buf[0] = 125; - } - - for (i = 0; i < (img->comps[0].w * img->comps[0].h * 0.25); i++) { - fwrite(buf, 1, prec_bytes, f); - } - - - for (i = 0; i < (img->comps[0].w * img->comps[0].h * 0.25); i++) { - fwrite(buf, 1, prec_bytes, f); - } - } - fclose(f); - return OPJ_TRUE; -} - -/* ----------------------- */ -/* */ -/* */ -/* IMAGE to BMP */ -/* */ -/* ----------------------- */ - -int OPJ_CALLCONV imagetobmp(opj_image_t * img, char *outfile) -{ - int w, wr, h, hr, i, pad; - FILE *f; - - if (img->numcomps == 3 && img->comps[0].dx == img->comps[1].dx - && img->comps[1].dx == img->comps[2].dx - && img->comps[0].dy == img->comps[1].dy - && img->comps[1].dy == img->comps[2].dy - && img->comps[0].prec == img->comps[1].prec - && img->comps[1].prec == img->comps[2].prec) { - /* -->> -->> -->> -->> - - 24 bits color - - <<-- <<-- <<-- <<-- */ - - f = fopen(outfile, "wb"); - if (!f) { - fprintf(stderr, "failed to open %s for writing\n", outfile); - return 1; - } - - w = img->comps[0].w; - wr = int_ceildivpow2(img->comps[0].w, img->comps[0].factor); - - h = img->comps[0].h; - hr = int_ceildivpow2(img->comps[0].h, img->comps[0].factor); - - fprintf(f, "BM"); - - /* FILE HEADER */ - /* ------------- */ - fprintf(f, "%c%c%c%c", - (unsigned char)(hr * wr * 3 + 3 * hr * (wr % 2) + - 54) & 0xff, - (unsigned char)((hr * wr * 3 + 3 * hr * (wr % 2) + 54) - >> 8) & 0xff, - (unsigned char)((hr * wr * 3 + 3 * hr * (wr % 2) + 54) - >> 16) & 0xff, - (unsigned char)((hr * wr * 3 + 3 * hr * (wr % 2) + 54) - >> 24) & 0xff); - fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, - ((0) >> 16) & 0xff, ((0) >> 24) & 0xff); - fprintf(f, "%c%c%c%c", (54) & 0xff, ((54) >> 8) & 0xff, - ((54) >> 16) & 0xff, ((54) >> 24) & 0xff); - - /* INFO HEADER */ - /* ------------- */ - fprintf(f, "%c%c%c%c", (40) & 0xff, ((40) >> 8) & 0xff, - ((40) >> 16) & 0xff, ((40) >> 24) & 0xff); - fprintf(f, "%c%c%c%c", (unsigned char)((wr) & 0xff), - (unsigned char)((wr) >> 8) & 0xff, - (unsigned char)((wr) >> 16) & 0xff, - (unsigned char)((wr) >> 24) & 0xff); - fprintf(f, "%c%c%c%c", (unsigned char)((hr) & 0xff), - (unsigned char)((hr) >> 8) & 0xff, - (unsigned char)((hr) >> 16) & 0xff, - (unsigned char)((hr) >> 24) & 0xff); - fprintf(f, "%c%c", (1) & 0xff, ((1) >> 8) & 0xff); - fprintf(f, "%c%c", (24) & 0xff, ((24) >> 8) & 0xff); - fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, - ((0) >> 16) & 0xff, ((0) >> 24) & 0xff); - fprintf(f, "%c%c%c%c", - (unsigned char)(3 * hr * wr + - 3 * hr * (wr % 2)) & 0xff, - (unsigned char)((hr * wr * 3 + 3 * hr * (wr % 2)) >> - 8) & 0xff, - (unsigned char)((hr * wr * 3 + 3 * hr * (wr % 2)) >> - 16) & 0xff, - (unsigned char)((hr * wr * 3 + 3 * hr * (wr % 2)) >> - 24) & 0xff); - fprintf(f, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff, - ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff); - fprintf(f, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff, - ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff); - fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, - ((0) >> 16) & 0xff, ((0) >> 24) & 0xff); - fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, - ((0) >> 16) & 0xff, ((0) >> 24) & 0xff); - - for (i = 0; i < wr * hr; i++) { - unsigned char R, G, B; - /* a modifier */ - /* R = img->comps[0].data[w * h - ((i) / (w) + 1) * w + (i) % (w)];*/ - R = img->comps[0].data[w * hr - ((i) / (wr) + 1) * w + (i) % (wr)]; - /* G = img->comps[1].data[w * h - ((i) / (w) + 1) * w + (i) % (w)];*/ - G = img->comps[1].data[w * hr - ((i) / (wr) + 1) * w + (i) % (wr)]; - /* B = img->comps[2].data[w * h - ((i) / (w) + 1) * w + (i) % (w)];*/ - B = img->comps[2].data[w * hr - ((i) / (wr) + 1) * w + (i) % (wr)]; - fprintf(f, "%c%c%c", B, G, R); - - if ((i + 1) % wr == 0) { - for (pad = (3 * wr) % 4 ? 4 - (3 * wr) % 4 : 0; pad > 0; pad--) { /* ADD */ - fprintf(f, "%c", 0); - } - } - } - fclose(f); - } - return 0; -} diff --git a/src/lib/openmj2/mj2_convert.h b/src/lib/openmj2/mj2_convert.h deleted file mode 100644 index e5c18cdb..00000000 --- a/src/lib/openmj2/mj2_convert.h +++ /dev/null @@ -1,47 +0,0 @@ -/* -* 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 "mj2.h" - -#ifndef __MJ2_CONVERT_H -#define __MJ2_CONVERT_H - -OPJ_API int OPJ_CALLCONV imagetoyuv(opj_image_t * img, char *outfile); - -OPJ_API int OPJ_CALLCONV imagetobmp(opj_image_t * img, char *outfile); - -OPJ_API opj_image_t * OPJ_CALLCONV mj2_image_create(mj2_tk_t * tk, - opj_cparameters_t *parameters); - -OPJ_API char OPJ_CALLCONV yuvtoimage(mj2_tk_t * tk, opj_image_t * img, - int frame_num, opj_cparameters_t *parameters, char* infile); - -OPJ_API unsigned int OPJ_CALLCONV yuv_num_frames(mj2_tk_t * tk, char *infile); - - -#endif diff --git a/src/lib/openmj2/mqc.c b/src/lib/openmj2/mqc.c deleted file mode 100644 index 60d05724..00000000 --- a/src/lib/openmj2/mqc.c +++ /dev/null @@ -1,629 +0,0 @@ -/* - * The copyright in this software is being made available under the 2-clauses - * BSD License, included below. This software may be subject to other third - * party and contributor rights, including patent rights, and no such rights - * are granted under this license. - * - * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2014, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux - * Copyright (c) 2003-2014, Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include "opj_includes.h" - -/** @defgroup MQC MQC - Implementation of an MQ-Coder */ -/*@{*/ - -/** @name Local static functions */ -/*@{*/ - -/** -Output a byte, doing bit-stuffing if necessary. -After a 0xff byte, the next byte must be smaller than 0x90. -@param mqc MQC handle -*/ -static void mqc_byteout(opj_mqc_t *mqc); -/** -Renormalize mqc->a and mqc->c while encoding, so that mqc->a stays between 0x8000 and 0x10000 -@param mqc MQC handle -*/ -static void mqc_renorme(opj_mqc_t *mqc); -/** -Encode the most probable symbol -@param mqc MQC handle -*/ -static void mqc_codemps(opj_mqc_t *mqc); -/** -Encode the most least symbol -@param mqc MQC handle -*/ -static void mqc_codelps(opj_mqc_t *mqc); -/** -Fill mqc->c with 1's for flushing -@param mqc MQC handle -*/ -static void mqc_setbits(opj_mqc_t *mqc); -/** -FIXME: documentation ??? -@param mqc MQC handle -@return -*/ -static INLINE int mqc_mpsexchange(opj_mqc_t *const mqc); -/** -FIXME: documentation ??? -@param mqc MQC handle -@return -*/ -static INLINE int mqc_lpsexchange(opj_mqc_t *const mqc); -/** -Input a byte -@param mqc MQC handle -*/ -static INLINE void mqc_bytein(opj_mqc_t *const mqc); -/** -Renormalize mqc->a and mqc->c while decoding -@param mqc MQC handle -*/ -static INLINE void mqc_renormd(opj_mqc_t *const mqc); -/*@}*/ - -/*@}*/ - -/* */ -/* This array defines all the possible states for a context. */ -/* */ -static opj_mqc_state_t mqc_states[47 * 2] = { - {0x5601, 0, &mqc_states[2], &mqc_states[3]}, - {0x5601, 1, &mqc_states[3], &mqc_states[2]}, - {0x3401, 0, &mqc_states[4], &mqc_states[12]}, - {0x3401, 1, &mqc_states[5], &mqc_states[13]}, - {0x1801, 0, &mqc_states[6], &mqc_states[18]}, - {0x1801, 1, &mqc_states[7], &mqc_states[19]}, - {0x0ac1, 0, &mqc_states[8], &mqc_states[24]}, - {0x0ac1, 1, &mqc_states[9], &mqc_states[25]}, - {0x0521, 0, &mqc_states[10], &mqc_states[58]}, - {0x0521, 1, &mqc_states[11], &mqc_states[59]}, - {0x0221, 0, &mqc_states[76], &mqc_states[66]}, - {0x0221, 1, &mqc_states[77], &mqc_states[67]}, - {0x5601, 0, &mqc_states[14], &mqc_states[13]}, - {0x5601, 1, &mqc_states[15], &mqc_states[12]}, - {0x5401, 0, &mqc_states[16], &mqc_states[28]}, - {0x5401, 1, &mqc_states[17], &mqc_states[29]}, - {0x4801, 0, &mqc_states[18], &mqc_states[28]}, - {0x4801, 1, &mqc_states[19], &mqc_states[29]}, - {0x3801, 0, &mqc_states[20], &mqc_states[28]}, - {0x3801, 1, &mqc_states[21], &mqc_states[29]}, - {0x3001, 0, &mqc_states[22], &mqc_states[34]}, - {0x3001, 1, &mqc_states[23], &mqc_states[35]}, - {0x2401, 0, &mqc_states[24], &mqc_states[36]}, - {0x2401, 1, &mqc_states[25], &mqc_states[37]}, - {0x1c01, 0, &mqc_states[26], &mqc_states[40]}, - {0x1c01, 1, &mqc_states[27], &mqc_states[41]}, - {0x1601, 0, &mqc_states[58], &mqc_states[42]}, - {0x1601, 1, &mqc_states[59], &mqc_states[43]}, - {0x5601, 0, &mqc_states[30], &mqc_states[29]}, - {0x5601, 1, &mqc_states[31], &mqc_states[28]}, - {0x5401, 0, &mqc_states[32], &mqc_states[28]}, - {0x5401, 1, &mqc_states[33], &mqc_states[29]}, - {0x5101, 0, &mqc_states[34], &mqc_states[30]}, - {0x5101, 1, &mqc_states[35], &mqc_states[31]}, - {0x4801, 0, &mqc_states[36], &mqc_states[32]}, - {0x4801, 1, &mqc_states[37], &mqc_states[33]}, - {0x3801, 0, &mqc_states[38], &mqc_states[34]}, - {0x3801, 1, &mqc_states[39], &mqc_states[35]}, - {0x3401, 0, &mqc_states[40], &mqc_states[36]}, - {0x3401, 1, &mqc_states[41], &mqc_states[37]}, - {0x3001, 0, &mqc_states[42], &mqc_states[38]}, - {0x3001, 1, &mqc_states[43], &mqc_states[39]}, - {0x2801, 0, &mqc_states[44], &mqc_states[38]}, - {0x2801, 1, &mqc_states[45], &mqc_states[39]}, - {0x2401, 0, &mqc_states[46], &mqc_states[40]}, - {0x2401, 1, &mqc_states[47], &mqc_states[41]}, - {0x2201, 0, &mqc_states[48], &mqc_states[42]}, - {0x2201, 1, &mqc_states[49], &mqc_states[43]}, - {0x1c01, 0, &mqc_states[50], &mqc_states[44]}, - {0x1c01, 1, &mqc_states[51], &mqc_states[45]}, - {0x1801, 0, &mqc_states[52], &mqc_states[46]}, - {0x1801, 1, &mqc_states[53], &mqc_states[47]}, - {0x1601, 0, &mqc_states[54], &mqc_states[48]}, - {0x1601, 1, &mqc_states[55], &mqc_states[49]}, - {0x1401, 0, &mqc_states[56], &mqc_states[50]}, - {0x1401, 1, &mqc_states[57], &mqc_states[51]}, - {0x1201, 0, &mqc_states[58], &mqc_states[52]}, - {0x1201, 1, &mqc_states[59], &mqc_states[53]}, - {0x1101, 0, &mqc_states[60], &mqc_states[54]}, - {0x1101, 1, &mqc_states[61], &mqc_states[55]}, - {0x0ac1, 0, &mqc_states[62], &mqc_states[56]}, - {0x0ac1, 1, &mqc_states[63], &mqc_states[57]}, - {0x09c1, 0, &mqc_states[64], &mqc_states[58]}, - {0x09c1, 1, &mqc_states[65], &mqc_states[59]}, - {0x08a1, 0, &mqc_states[66], &mqc_states[60]}, - {0x08a1, 1, &mqc_states[67], &mqc_states[61]}, - {0x0521, 0, &mqc_states[68], &mqc_states[62]}, - {0x0521, 1, &mqc_states[69], &mqc_states[63]}, - {0x0441, 0, &mqc_states[70], &mqc_states[64]}, - {0x0441, 1, &mqc_states[71], &mqc_states[65]}, - {0x02a1, 0, &mqc_states[72], &mqc_states[66]}, - {0x02a1, 1, &mqc_states[73], &mqc_states[67]}, - {0x0221, 0, &mqc_states[74], &mqc_states[68]}, - {0x0221, 1, &mqc_states[75], &mqc_states[69]}, - {0x0141, 0, &mqc_states[76], &mqc_states[70]}, - {0x0141, 1, &mqc_states[77], &mqc_states[71]}, - {0x0111, 0, &mqc_states[78], &mqc_states[72]}, - {0x0111, 1, &mqc_states[79], &mqc_states[73]}, - {0x0085, 0, &mqc_states[80], &mqc_states[74]}, - {0x0085, 1, &mqc_states[81], &mqc_states[75]}, - {0x0049, 0, &mqc_states[82], &mqc_states[76]}, - {0x0049, 1, &mqc_states[83], &mqc_states[77]}, - {0x0025, 0, &mqc_states[84], &mqc_states[78]}, - {0x0025, 1, &mqc_states[85], &mqc_states[79]}, - {0x0015, 0, &mqc_states[86], &mqc_states[80]}, - {0x0015, 1, &mqc_states[87], &mqc_states[81]}, - {0x0009, 0, &mqc_states[88], &mqc_states[82]}, - {0x0009, 1, &mqc_states[89], &mqc_states[83]}, - {0x0005, 0, &mqc_states[90], &mqc_states[84]}, - {0x0005, 1, &mqc_states[91], &mqc_states[85]}, - {0x0001, 0, &mqc_states[90], &mqc_states[86]}, - {0x0001, 1, &mqc_states[91], &mqc_states[87]}, - {0x5601, 0, &mqc_states[92], &mqc_states[92]}, - {0x5601, 1, &mqc_states[93], &mqc_states[93]}, -}; - -/* -========================================================== - local functions -========================================================== -*/ - -static void mqc_byteout(opj_mqc_t *mqc) -{ - if (*mqc->bp == 0xff) { - mqc->bp++; - *mqc->bp = mqc->c >> 20; - mqc->c &= 0xfffff; - mqc->ct = 7; - } else { - if ((mqc->c & 0x8000000) == 0) { /* ((mqc->c&0x8000000)==0) CHANGE */ - mqc->bp++; - *mqc->bp = mqc->c >> 19; - mqc->c &= 0x7ffff; - mqc->ct = 8; - } else { - (*mqc->bp)++; - if (*mqc->bp == 0xff) { - mqc->c &= 0x7ffffff; - mqc->bp++; - *mqc->bp = mqc->c >> 20; - mqc->c &= 0xfffff; - mqc->ct = 7; - } else { - mqc->bp++; - *mqc->bp = mqc->c >> 19; - mqc->c &= 0x7ffff; - mqc->ct = 8; - } - } - } -} - -static void mqc_renorme(opj_mqc_t *mqc) -{ - do { - mqc->a <<= 1; - mqc->c <<= 1; - mqc->ct--; - if (mqc->ct == 0) { - mqc_byteout(mqc); - } - } while ((mqc->a & 0x8000) == 0); -} - -static void mqc_codemps(opj_mqc_t *mqc) -{ - mqc->a -= (*mqc->curctx)->qeval; - if ((mqc->a & 0x8000) == 0) { - if (mqc->a < (*mqc->curctx)->qeval) { - mqc->a = (*mqc->curctx)->qeval; - } else { - mqc->c += (*mqc->curctx)->qeval; - } - *mqc->curctx = (*mqc->curctx)->nmps; - mqc_renorme(mqc); - } else { - mqc->c += (*mqc->curctx)->qeval; - } -} - -static void mqc_codelps(opj_mqc_t *mqc) -{ - mqc->a -= (*mqc->curctx)->qeval; - if (mqc->a < (*mqc->curctx)->qeval) { - mqc->c += (*mqc->curctx)->qeval; - } else { - mqc->a = (*mqc->curctx)->qeval; - } - *mqc->curctx = (*mqc->curctx)->nlps; - mqc_renorme(mqc); -} - -static void mqc_setbits(opj_mqc_t *mqc) -{ - unsigned int tempc = mqc->c + mqc->a; - mqc->c |= 0xffff; - if (mqc->c >= tempc) { - mqc->c -= 0x8000; - } -} - -static INLINE int mqc_mpsexchange(opj_mqc_t *const mqc) -{ - int d; - if (mqc->a < (*mqc->curctx)->qeval) { - d = 1 - (*mqc->curctx)->mps; - *mqc->curctx = (*mqc->curctx)->nlps; - } else { - d = (*mqc->curctx)->mps; - *mqc->curctx = (*mqc->curctx)->nmps; - } - - return d; -} - -static INLINE int mqc_lpsexchange(opj_mqc_t *const mqc) -{ - int d; - if (mqc->a < (*mqc->curctx)->qeval) { - mqc->a = (*mqc->curctx)->qeval; - d = (*mqc->curctx)->mps; - *mqc->curctx = (*mqc->curctx)->nmps; - } else { - mqc->a = (*mqc->curctx)->qeval; - d = 1 - (*mqc->curctx)->mps; - *mqc->curctx = (*mqc->curctx)->nlps; - } - - return d; -} - -#ifdef MQC_PERF_OPT -static INLINE void mqc_bytein(opj_mqc_t *const mqc) -{ - unsigned int i = *((unsigned int *) mqc->bp); - mqc->c += i & 0xffff00; - mqc->ct = i & 0x0f; - mqc->bp += (i >> 2) & 0x04; -} -#else -static void mqc_bytein(opj_mqc_t *const mqc) -{ - if (mqc->bp != mqc->end) { - unsigned int c; - if (mqc->bp + 1 != mqc->end) { - c = *(mqc->bp + 1); - } else { - c = 0xff; - } - if (*mqc->bp == 0xff) { - if (c > 0x8f) { - mqc->c += 0xff00; - mqc->ct = 8; - } else { - mqc->bp++; - mqc->c += c << 9; - mqc->ct = 7; - } - } else { - mqc->bp++; - mqc->c += c << 8; - mqc->ct = 8; - } - } else { - mqc->c += 0xff00; - mqc->ct = 8; - } -} -#endif - -static INLINE void mqc_renormd(opj_mqc_t *const mqc) -{ - do { - if (mqc->ct == 0) { - mqc_bytein(mqc); - } - mqc->a <<= 1; - mqc->c <<= 1; - mqc->ct--; - } while (mqc->a < 0x8000); -} - -/* -========================================================== - MQ-Coder interface -========================================================== -*/ - -opj_mqc_t* mqc_create(void) -{ - opj_mqc_t *mqc = (opj_mqc_t*)opj_malloc(sizeof(opj_mqc_t)); -#ifdef MQC_PERF_OPT - mqc->buffer = NULL; -#endif - return mqc; -} - -void mqc_destroy(opj_mqc_t *mqc) -{ - if (mqc) { -#ifdef MQC_PERF_OPT - if (mqc->buffer) { - opj_free(mqc->buffer); - } -#endif - opj_free(mqc); - } -} - -int mqc_numbytes(opj_mqc_t *mqc) -{ - return mqc->bp - mqc->start; -} - -void mqc_init_enc(opj_mqc_t *mqc, unsigned char *bp) -{ - mqc_setcurctx(mqc, 0); - mqc->a = 0x8000; - mqc->c = 0; - mqc->bp = bp - 1; - mqc->ct = 12; - if (*mqc->bp == 0xff) { - mqc->ct = 13; - } - mqc->start = bp; -} - -void mqc_encode(opj_mqc_t *mqc, int d) -{ - if ((*mqc->curctx)->mps == d) { - mqc_codemps(mqc); - } else { - mqc_codelps(mqc); - } -} - -void mqc_flush(opj_mqc_t *mqc) -{ - mqc_setbits(mqc); - mqc->c <<= mqc->ct; - mqc_byteout(mqc); - mqc->c <<= mqc->ct; - mqc_byteout(mqc); - - if (*mqc->bp != 0xff) { - mqc->bp++; - } -} - -void mqc_bypass_init_enc(opj_mqc_t *mqc) -{ - mqc->c = 0; - mqc->ct = 8; - /*if (*mqc->bp == 0xff) { - mqc->ct = 7; - } */ -} - -void mqc_bypass_enc(opj_mqc_t *mqc, int d) -{ - mqc->ct--; - mqc->c = mqc->c + (d << mqc->ct); - if (mqc->ct == 0) { - mqc->bp++; - *mqc->bp = mqc->c; - mqc->ct = 8; - if (*mqc->bp == 0xff) { - mqc->ct = 7; - } - mqc->c = 0; - } -} - -int mqc_bypass_flush_enc(opj_mqc_t *mqc) -{ - unsigned char bit_padding; - - bit_padding = 0; - - if (mqc->ct != 0) { - while (mqc->ct > 0) { - mqc->ct--; - mqc->c += bit_padding << mqc->ct; - bit_padding = (bit_padding + 1) & 0x01; - } - mqc->bp++; - *mqc->bp = mqc->c; - mqc->ct = 8; - mqc->c = 0; - } - - return 1; -} - -void mqc_reset_enc(opj_mqc_t *mqc) -{ - mqc_resetstates(mqc); - mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46); - mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3); - mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4); -} - -int mqc_restart_enc(opj_mqc_t *mqc) -{ - int correction = 1; - - /* */ - int n = 27 - 15 - mqc->ct; - mqc->c <<= mqc->ct; - while (n > 0) { - mqc_byteout(mqc); - n -= mqc->ct; - mqc->c <<= mqc->ct; - } - mqc_byteout(mqc); - - return correction; -} - -void mqc_restart_init_enc(opj_mqc_t *mqc) -{ - /* */ - mqc_setcurctx(mqc, 0); - mqc->a = 0x8000; - mqc->c = 0; - mqc->ct = 12; - mqc->bp--; - if (*mqc->bp == 0xff) { - mqc->ct = 13; - } -} - -void mqc_erterm_enc(opj_mqc_t *mqc) -{ - int k = 11 - mqc->ct + 1; - - while (k > 0) { - mqc->c <<= mqc->ct; - mqc->ct = 0; - mqc_byteout(mqc); - k -= mqc->ct; - } - - if (*mqc->bp != 0xff) { - mqc_byteout(mqc); - } -} - -void mqc_segmark_enc(opj_mqc_t *mqc) -{ - int i; - mqc_setcurctx(mqc, 18); - - for (i = 1; i < 5; i++) { - mqc_encode(mqc, i % 2); - } -} - -void mqc_init_dec(opj_mqc_t *mqc, unsigned char *bp, int len) -{ - mqc_setcurctx(mqc, 0); - mqc->start = bp; - mqc->end = bp + len; - mqc->bp = bp; - if (len == 0) { - mqc->c = 0xff << 16; - } else { - mqc->c = *mqc->bp << 16; - } - -#ifdef MQC_PERF_OPT - { - unsigned int c; - unsigned int *ip; - unsigned char *end = mqc->end - 1; - mqc->buffer = opj_realloc(mqc->buffer, (len + 1) * sizeof(unsigned int)); - ip = (unsigned int *) mqc->buffer; - - while (bp < end) { - c = *(bp + 1); - if (*bp == 0xff) { - if (c > 0x8f) { - break; - } else { - *ip = 0x00000017 | (c << 9); - } - } else { - *ip = 0x00000018 | (c << 8); - } - bp++; - ip++; - } - - /* Handle last byte of data */ - c = 0xff; - if (*bp == 0xff) { - *ip = 0x0000ff18; - } else { - bp++; - *ip = 0x00000018 | (c << 8); - } - ip++; - - *ip = 0x0000ff08; - mqc->bp = mqc->buffer; - } -#endif - mqc_bytein(mqc); - mqc->c <<= 7; - mqc->ct -= 7; - mqc->a = 0x8000; -} - -int mqc_decode(opj_mqc_t *const mqc) -{ - int d; - mqc->a -= (*mqc->curctx)->qeval; - if ((mqc->c >> 16) < (*mqc->curctx)->qeval) { - d = mqc_lpsexchange(mqc); - mqc_renormd(mqc); - } else { - mqc->c -= (*mqc->curctx)->qeval << 16; - if ((mqc->a & 0x8000) == 0) { - d = mqc_mpsexchange(mqc); - mqc_renormd(mqc); - } else { - d = (*mqc->curctx)->mps; - } - } - - return d; -} - -void mqc_resetstates(opj_mqc_t *mqc) -{ - int i; - for (i = 0; i < MQC_NUMCTXS; i++) { - mqc->ctxs[i] = mqc_states; - } -} - -void mqc_setstate(opj_mqc_t *mqc, int ctxno, int msb, int prob) -{ - mqc->ctxs[ctxno] = &mqc_states[msb + (prob << 1)]; -} - - diff --git a/src/lib/openmj2/mqc.h b/src/lib/openmj2/mqc.h deleted file mode 100644 index 8966e55b..00000000 --- a/src/lib/openmj2/mqc.h +++ /dev/null @@ -1,206 +0,0 @@ -/* - * 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 __MQC_H -#define __MQC_H -/** -@file mqc.h -@brief Implementation of an MQ-Coder (MQC) - -The functions in MQC.C have for goal to realize the MQ-coder operations. The functions -in MQC.C are used by some function in T1.C. -*/ - -/** @defgroup MQC MQC - Implementation of an MQ-Coder */ -/*@{*/ - -/** -This struct defines the state of a context. -*/ -typedef struct opj_mqc_state { - /** the probability of the Least Probable Symbol (0.75->0x8000, 1.5->0xffff) */ - unsigned int qeval; - /** the Most Probable Symbol (0 or 1) */ - int mps; - /** next state if the next encoded symbol is the MPS */ - struct opj_mqc_state *nmps; - /** next state if the next encoded symbol is the LPS */ - struct opj_mqc_state *nlps; -} opj_mqc_state_t; - -#define MQC_NUMCTXS 19 - -/** -MQ coder -*/ -typedef struct opj_mqc { - unsigned int c; - unsigned int a; - unsigned int ct; - unsigned char *bp; - unsigned char *start; - unsigned char *end; - opj_mqc_state_t *ctxs[MQC_NUMCTXS]; - opj_mqc_state_t **curctx; -#ifdef MQC_PERF_OPT - unsigned char *buffer; -#endif -} opj_mqc_t; - -/** @name Exported functions */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Create a new MQC handle -@return Returns a new MQC handle if successful, returns NULL otherwise -*/ -opj_mqc_t* mqc_create(void); -/** -Destroy a previously created MQC handle -@param mqc MQC handle to destroy -*/ -void mqc_destroy(opj_mqc_t *mqc); -/** -Return the number of bytes written/read since initialisation -@param mqc MQC handle -@return Returns the number of bytes already encoded -*/ -int mqc_numbytes(opj_mqc_t *mqc); -/** -Reset the states of all the context of the coder/decoder -(each context is set to a state where 0 and 1 are more or less equiprobable) -@param mqc MQC handle -*/ -void mqc_resetstates(opj_mqc_t *mqc); -/** -Set the state of a particular context -@param mqc MQC handle -@param ctxno Number that identifies the context -@param msb The MSB of the new state of the context -@param prob Number that identifies the probability of the symbols for the new state of the context -*/ -void mqc_setstate(opj_mqc_t *mqc, int ctxno, int msb, int prob); -/** -Initialize the encoder -@param mqc MQC handle -@param bp Pointer to the start of the buffer where the bytes will be written -*/ -void mqc_init_enc(opj_mqc_t *mqc, unsigned char *bp); -/** -Set the current context used for coding/decoding -@param mqc MQC handle -@param ctxno Number that identifies the context -*/ -#define mqc_setcurctx(mqc, ctxno) (mqc)->curctx = &(mqc)->ctxs[(int)(ctxno)] -/** -Encode a symbol using the MQ-coder -@param mqc MQC handle -@param d The symbol to be encoded (0 or 1) -*/ -void mqc_encode(opj_mqc_t *mqc, int d); -/** -Flush the encoder, so that all remaining data is written -@param mqc MQC handle -*/ -void mqc_flush(opj_mqc_t *mqc); -/** -BYPASS mode switch, initialization operation. -JPEG 2000 p 505. -

Not fully implemented and tested !!

-@param mqc MQC handle -*/ -void mqc_bypass_init_enc(opj_mqc_t *mqc); -/** -BYPASS mode switch, coding operation. -JPEG 2000 p 505. -

Not fully implemented and tested !!

-@param mqc MQC handle -@param d The symbol to be encoded (0 or 1) -*/ -void mqc_bypass_enc(opj_mqc_t *mqc, int d); -/** -BYPASS mode switch, flush operation -

Not fully implemented and tested !!

-@param mqc MQC handle -@return Returns 1 (always) -*/ -int mqc_bypass_flush_enc(opj_mqc_t *mqc); -/** -RESET mode switch -@param mqc MQC handle -*/ -void mqc_reset_enc(opj_mqc_t *mqc); -/** -RESTART mode switch (TERMALL) -@param mqc MQC handle -@return Returns 1 (always) -*/ -int mqc_restart_enc(opj_mqc_t *mqc); -/** -RESTART mode switch (TERMALL) reinitialisation -@param mqc MQC handle -*/ -void mqc_restart_init_enc(opj_mqc_t *mqc); -/** -ERTERM mode switch (PTERM) -@param mqc MQC handle -*/ -void mqc_erterm_enc(opj_mqc_t *mqc); -/** -SEGMARK mode switch (SEGSYM) -@param mqc MQC handle -*/ -void mqc_segmark_enc(opj_mqc_t *mqc); -/** -Initialize the decoder -@param mqc MQC handle -@param bp Pointer to the start of the buffer from which the bytes will be read -@param len Length of the input buffer -*/ -void mqc_init_dec(opj_mqc_t *mqc, unsigned char *bp, int len); -/** -Decode a symbol -@param mqc MQC handle -@return Returns the decoded symbol (0 or 1) -*/ -int mqc_decode(opj_mqc_t *const mqc); -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __MQC_H */ diff --git a/src/lib/openmj2/openjpeg.c b/src/lib/openmj2/openjpeg.c deleted file mode 100644 index a0cce5da..00000000 --- a/src/lib/openmj2/openjpeg.c +++ /dev/null @@ -1,389 +0,0 @@ -/* - * 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) 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. - */ - -#ifdef _WIN32 -#include -#endif /* _WIN32 */ - -#include "opj_config_private.h" -#include "opj_includes.h" - -/* ---------------------------------------------------------------------- */ -#ifdef _WIN32 -#ifndef OPJ_STATIC -BOOL APIENTRY -DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) -{ - - OPJ_ARG_NOT_USED(lpReserved); - OPJ_ARG_NOT_USED(hModule); - - switch (ul_reason_for_call) { - case DLL_PROCESS_ATTACH : - break; - case DLL_PROCESS_DETACH : - break; - case DLL_THREAD_ATTACH : - case DLL_THREAD_DETACH : - break; - } - - return TRUE; -} -#endif /* OPJ_STATIC */ -#endif /* _WIN32 */ - -/* ---------------------------------------------------------------------- */ - - -const char* OPJ_CALLCONV opj_version(void) -{ - return OPJ_PACKAGE_VERSION; -} - -opj_dinfo_t* OPJ_CALLCONV opj_create_decompress(OPJ_CODEC_FORMAT format) -{ - opj_dinfo_t *dinfo = (opj_dinfo_t*)opj_calloc(1, sizeof(opj_dinfo_t)); - if (!dinfo) { - return NULL; - } - dinfo->is_decompressor = OPJ_TRUE; - switch (format) { - case CODEC_J2K: - case CODEC_JPT: - /* get a J2K decoder handle */ - dinfo->j2k_handle = (void*)j2k_create_decompress((opj_common_ptr)dinfo); - if (!dinfo->j2k_handle) { - opj_free(dinfo); - return NULL; - } - break; - case CODEC_JP2: - /* get a JP2 decoder handle */ - dinfo->jp2_handle = (void*)jp2_create_decompress((opj_common_ptr)dinfo); - if (!dinfo->jp2_handle) { - opj_free(dinfo); - return NULL; - } - break; - case CODEC_UNKNOWN: - default: - opj_free(dinfo); - return NULL; - } - - dinfo->codec_format = format; - - return dinfo; -} - -void OPJ_CALLCONV opj_destroy_decompress(opj_dinfo_t *dinfo) -{ - if (dinfo) { - /* destroy the codec */ - switch (dinfo->codec_format) { - case CODEC_J2K: - case CODEC_JPT: - j2k_destroy_decompress((opj_j2k_t*)dinfo->j2k_handle); - break; - case CODEC_JP2: - jp2_destroy_decompress((opj_jp2_t*)dinfo->jp2_handle); - break; - case CODEC_UNKNOWN: - default: - break; - } - /* destroy the decompressor */ - opj_free(dinfo); - } -} - -void OPJ_CALLCONV opj_set_default_decoder_parameters(opj_dparameters_t - *parameters) -{ - if (parameters) { - memset(parameters, 0, sizeof(opj_dparameters_t)); - /* default decoding parameters */ - parameters->cp_layer = 0; - parameters->cp_reduce = 0; - parameters->cp_limit_decoding = NO_LIMITATION; - - parameters->decod_format = -1; - parameters->cod_format = -1; - parameters->flags = 0; - /* UniPG>> */ -#ifdef USE_JPWL - parameters->jpwl_correct = OPJ_FALSE; - parameters->jpwl_exp_comps = JPWL_EXPECTED_COMPONENTS; - parameters->jpwl_max_tiles = JPWL_MAXIMUM_TILES; -#endif /* USE_JPWL */ - /* <codec_format) { - case CODEC_J2K: - case CODEC_JPT: - j2k_setup_decoder((opj_j2k_t*)dinfo->j2k_handle, parameters); - break; - case CODEC_JP2: - jp2_setup_decoder((opj_jp2_t*)dinfo->jp2_handle, parameters); - break; - case CODEC_UNKNOWN: - default: - break; - } - } -} - -opj_image_t* OPJ_CALLCONV opj_decode(opj_dinfo_t *dinfo, opj_cio_t *cio) -{ - return opj_decode_with_info(dinfo, cio, NULL); -} - -opj_image_t* OPJ_CALLCONV opj_decode_with_info(opj_dinfo_t *dinfo, - opj_cio_t *cio, opj_codestream_info_t *cstr_info) -{ - if (dinfo && cio) { - switch (dinfo->codec_format) { - case CODEC_J2K: - return j2k_decode((opj_j2k_t*)dinfo->j2k_handle, cio, cstr_info); - case CODEC_JPT: - return j2k_decode_jpt_stream((opj_j2k_t*)dinfo->j2k_handle, cio, cstr_info); - case CODEC_JP2: - return opj_jp2_decode((opj_jp2_t*)dinfo->jp2_handle, cio, cstr_info); - case CODEC_UNKNOWN: - default: - break; - } - } - return NULL; -} - -opj_cinfo_t* OPJ_CALLCONV opj_create_compress(OPJ_CODEC_FORMAT format) -{ - opj_cinfo_t *cinfo = (opj_cinfo_t*)opj_calloc(1, sizeof(opj_cinfo_t)); - if (!cinfo) { - return NULL; - } - cinfo->is_decompressor = OPJ_FALSE; - switch (format) { - case CODEC_J2K: - /* get a J2K coder handle */ - cinfo->j2k_handle = (void*)j2k_create_compress((opj_common_ptr)cinfo); - if (!cinfo->j2k_handle) { - opj_free(cinfo); - return NULL; - } - break; - case CODEC_JP2: - /* get a JP2 coder handle */ - cinfo->jp2_handle = (void*)jp2_create_compress((opj_common_ptr)cinfo); - if (!cinfo->jp2_handle) { - opj_free(cinfo); - return NULL; - } - break; - case CODEC_JPT: - case CODEC_UNKNOWN: - default: - opj_free(cinfo); - return NULL; - } - - cinfo->codec_format = format; - - return cinfo; -} - -void OPJ_CALLCONV opj_destroy_compress(opj_cinfo_t *cinfo) -{ - if (cinfo) { - /* destroy the codec */ - switch (cinfo->codec_format) { - case CODEC_J2K: - j2k_destroy_compress((opj_j2k_t*)cinfo->j2k_handle); - break; - case CODEC_JP2: - jp2_destroy_compress((opj_jp2_t*)cinfo->jp2_handle); - break; - case CODEC_JPT: - case CODEC_UNKNOWN: - default: - break; - } - /* destroy the decompressor */ - opj_free(cinfo); - } -} - -void OPJ_CALLCONV opj_set_default_encoder_parameters(opj_cparameters_t - *parameters) -{ - if (parameters) { - memset(parameters, 0, sizeof(opj_cparameters_t)); - /* default coding parameters */ - parameters->cp_cinema = OFF; - parameters->max_comp_size = 0; - parameters->numresolution = 6; - parameters->cp_rsiz = STD_RSIZ; - parameters->cblockw_init = 64; - parameters->cblockh_init = 64; - parameters->prog_order = LRCP; - parameters->roi_compno = -1; /* no ROI */ - parameters->subsampling_dx = 1; - parameters->subsampling_dy = 1; - parameters->tp_on = 0; - parameters->decod_format = -1; - parameters->cod_format = -1; - parameters->tcp_rates[0] = 0; - parameters->tcp_numlayers = 0; - parameters->cp_disto_alloc = 0; - parameters->cp_fixed_alloc = 0; - parameters->cp_fixed_quality = 0; - /* UniPG>> */ -#ifdef USE_JPWL - parameters->jpwl_epc_on = OPJ_FALSE; - parameters->jpwl_hprot_MH = -1; /* -1 means unassigned */ - { - int i; - for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) { - parameters->jpwl_hprot_TPH_tileno[i] = -1; /* unassigned */ - parameters->jpwl_hprot_TPH[i] = 0; /* absent */ - } - }; - { - int i; - for (i = 0; i < JPWL_MAX_NO_PACKSPECS; i++) { - parameters->jpwl_pprot_tileno[i] = -1; /* unassigned */ - parameters->jpwl_pprot_packno[i] = -1; /* unassigned */ - parameters->jpwl_pprot[i] = 0; /* absent */ - } - }; - parameters->jpwl_sens_size = 0; /* 0 means no ESD */ - parameters->jpwl_sens_addr = 0; /* 0 means auto */ - parameters->jpwl_sens_range = 0; /* 0 means packet */ - parameters->jpwl_sens_MH = -1; /* -1 means unassigned */ - { - int i; - for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) { - parameters->jpwl_sens_TPH_tileno[i] = -1; /* unassigned */ - parameters->jpwl_sens_TPH[i] = -1; /* absent */ - } - }; -#endif /* USE_JPWL */ - /* <codec_format) { - case CODEC_J2K: - j2k_setup_encoder((opj_j2k_t*)cinfo->j2k_handle, parameters, image); - break; - case CODEC_JP2: - jp2_setup_encoder((opj_jp2_t*)cinfo->jp2_handle, parameters, image); - break; - case CODEC_JPT: - case CODEC_UNKNOWN: - default: - break; - } - } -} - -opj_bool OPJ_CALLCONV opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio, - opj_image_t *image, char *index) -{ - if (index != NULL) - opj_event_msg((opj_common_ptr)cinfo, EVT_WARNING, - "Set index to NULL when calling the opj_encode function.\n" - "To extract the index, use the opj_encode_with_info() function.\n" - "No index will be generated during this encoding\n"); - return opj_encode_with_info(cinfo, cio, image, NULL); -} - -opj_bool OPJ_CALLCONV opj_encode_with_info(opj_cinfo_t *cinfo, opj_cio_t *cio, - opj_image_t *image, opj_codestream_info_t *cstr_info) -{ - if (cinfo && cio && image) { - switch (cinfo->codec_format) { - case CODEC_J2K: - return j2k_encode((opj_j2k_t*)cinfo->j2k_handle, cio, image, cstr_info); - case CODEC_JP2: - return opj_jp2_encode((opj_jp2_t*)cinfo->jp2_handle, cio, image, cstr_info); - case CODEC_JPT: - case CODEC_UNKNOWN: - default: - break; - } - } - return OPJ_FALSE; -} - -void OPJ_CALLCONV opj_destroy_cstr_info(opj_codestream_info_t *cstr_info) -{ - if (cstr_info) { - int tileno; - for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) { - opj_tile_info_t *tile_info = &cstr_info->tile[tileno]; - opj_free(tile_info->thresh); - opj_free(tile_info->packet); - opj_free(tile_info->tp); - opj_free(tile_info->marker); - } - opj_free(cstr_info->tile); - opj_free(cstr_info->marker); - opj_free(cstr_info->numdecompos); - } -} - -void* OPJ_CALLCONV opj_image_data_alloc(size_t size) -{ - /* NOTE: this defers from libopenjp2 where we use opj_aligned_malloc */ - void* ret = opj_malloc(size); - /* printf("opj_image_data_alloc %p\n", ret); */ - return ret; -} - -void OPJ_CALLCONV opj_image_data_free(void* ptr) -{ - /* NOTE: this defers from libopenjp2 where we use opj_aligned_free */ - /* printf("opj_image_data_free %p\n", ptr); */ - opj_free(ptr); -} diff --git a/src/lib/openmj2/openjpeg.h b/src/lib/openmj2/openjpeg.h deleted file mode 100644 index 10fccf1e..00000000 --- a/src/lib/openmj2/openjpeg.h +++ /dev/null @@ -1,958 +0,0 @@ -/* -* The copyright in this software is being made available under the 2-clauses -* BSD License, included below. This software may be subject to other third -* party and contributor rights, including patent rights, and no such rights -* are granted under this license. -* -* Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium -* Copyright (c) 2002-2014, Professor Benoit Macq -* Copyright (c) 2001-2003, David Janssens -* Copyright (c) 2002-2003, Yannick Verschueren -* Copyright (c) 2003-2007, Francois-Olivier Devaux -* Copyright (c) 2003-2014, Antonin Descampe -* Copyright (c) 2005, Herve Drolon, FreeImage Team -* Copyright (c) 2006-2007, Parvatha Elangovan -* Copyright (c) 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. -*/ -#ifndef OPENJPEG_H -#define OPENJPEG_H - -/* -========================================================== - Compiler directives -========================================================== -*/ - -#if defined(OPJ_STATIC) || !defined(_WIN32) -/* http://gcc.gnu.org/wiki/Visibility */ -#if __GNUC__ >= 4 -#define OPJ_API __attribute__ ((visibility ("default"))) -#define OPJ_LOCAL __attribute__ ((visibility ("hidden"))) -#else -#define OPJ_API -#define OPJ_LOCAL -#endif -#define OPJ_CALLCONV -#else -#define OPJ_CALLCONV __stdcall -/* -The following ifdef block is the standard way of creating macros which make exporting -from a DLL simpler. All files within this DLL are compiled with the OPJ_EXPORTS -symbol defined on the command line. this symbol should not be defined on any project -that uses this DLL. This way any other project whose source files include this file see -OPJ_API functions as being imported from a DLL, whereas this DLL sees symbols -defined with this macro as being exported. -*/ -#if defined(OPJ_EXPORTS) || defined(DLL_EXPORT) -#define OPJ_API __declspec(dllexport) -#else -#define OPJ_API __declspec(dllimport) -#endif /* OPJ_EXPORTS */ -#endif /* !OPJ_STATIC || !_WIN32 */ - -typedef int opj_bool; -#define OPJ_TRUE 1 -#define OPJ_FALSE 0 - -/* Avoid compile-time warning because parameter is not used */ -#define OPJ_ARG_NOT_USED(x) (void)(x) -/* -========================================================== - Useful constant definitions -========================================================== -*/ - -#define OPJ_PATH_LEN 4096 /**< Maximum allowed size for filenames */ - -#define J2K_MAXRLVLS 33 /**< Number of maximum resolution level authorized */ -#define J2K_MAXBANDS (3*J2K_MAXRLVLS-2) /**< Number of maximum sub-band linked to number of resolution level */ - -/* UniPG>> */ -#define JPWL_MAX_NO_TILESPECS 16 /**< Maximum number of tile parts expected by JPWL: increase at your will */ -#define JPWL_MAX_NO_PACKSPECS 16 /**< Maximum number of packet parts expected by JPWL: increase at your will */ -#define JPWL_MAX_NO_MARKERS 512 /**< Maximum number of JPWL markers: increase at your will */ -#define JPWL_PRIVATEINDEX_NAME "jpwl_index_privatefilename" /**< index file name used when JPWL is on */ -#define JPWL_EXPECTED_COMPONENTS 3 /**< Expect this number of components, so you'll find better the first EPB */ -#define JPWL_MAXIMUM_TILES 8192 /**< Expect this maximum number of tiles, to avoid some crashes */ -#define JPWL_MAXIMUM_HAMMING 2 /**< Expect this maximum number of bit errors in marker id's */ -#define JPWL_MAXIMUM_EPB_ROOM 65450 /**< Expect this maximum number of bytes for composition of EPBs */ -/* < -
  • Error messages -
  • Warning messages -
  • Debugging messages - -*/ -typedef struct opj_event_mgr { - /** Error message callback if available, NULL otherwise */ - opj_msg_callback error_handler; - /** Warning message callback if available, NULL otherwise */ - opj_msg_callback warning_handler; - /** Debug message callback if available, NULL otherwise */ - opj_msg_callback info_handler; -} opj_event_mgr_t; - - -/* -========================================================== - codec typedef definitions -========================================================== -*/ - -/** -Progression order changes -*/ -typedef struct opj_poc { - /** Resolution num start, Component num start, given by POC */ - int resno0, compno0; - /** Layer num end,Resolution num end, Component num end, given by POC */ - int layno1, resno1, compno1; - /** Layer num start,Precinct num start, Precinct num end */ - int layno0, precno0, precno1; - /** Progression order enum*/ - OPJ_PROG_ORDER prg1, prg; - /** Progression order string*/ - char progorder[5]; - /** Tile number */ - int tile; - /** Start and end values for Tile width and height*/ - int tx0, tx1, ty0, ty1; - /** Start value, initialised in pi_initialise_encode*/ - int layS, resS, compS, prcS; - /** End value, initialised in pi_initialise_encode */ - int layE, resE, compE, prcE; - /** Start and end values of Tile width and height, initialised in pi_initialise_encode*/ - int txS, txE, tyS, tyE, dx, dy; - /** Temporary values for Tile parts, initialised in pi_create_encode */ - int lay_t, res_t, comp_t, prc_t, tx0_t, ty0_t; -} opj_poc_t; - -/** -Compression parameters -*/ -typedef struct opj_cparameters { - /** size of tile: tile_size_on = false (not in argument) or = true (in argument) */ - opj_bool tile_size_on; - /** XTOsiz */ - int cp_tx0; - /** YTOsiz */ - int cp_ty0; - /** XTsiz */ - int cp_tdx; - /** YTsiz */ - int cp_tdy; - /** allocation by rate/distortion */ - int cp_disto_alloc; - /** allocation by fixed layer */ - int cp_fixed_alloc; - /** add fixed_quality */ - int cp_fixed_quality; - /** fixed layer */ - int *cp_matrice; - /** comment for coding */ - char *cp_comment; - /** csty : coding style */ - int csty; - /** progression order (default LRCP) */ - OPJ_PROG_ORDER prog_order; - /** progression order changes */ - opj_poc_t POC[32]; - /** number of progression order changes (POC), default to 0 */ - int numpocs; - /** number of layers */ - int tcp_numlayers; - /** rates of layers */ - float tcp_rates[100]; - /** different psnr for successive layers */ - float tcp_distoratio[100]; - /** number of resolutions */ - int numresolution; - /** initial code block width, default to 64 */ - int cblockw_init; - /** initial code block height, default to 64 */ - int cblockh_init; - /** mode switch (cblk_style) */ - int mode; - /** 1 : use the irreversible DWT 9-7, 0 : use lossless compression (default) */ - int irreversible; - /** region of interest: affected component in [0..3], -1 means no ROI */ - int roi_compno; - /** region of interest: upshift value */ - int roi_shift; - /* number of precinct size specifications */ - int res_spec; - /** initial precinct width */ - int prcw_init[J2K_MAXRLVLS]; - /** initial precinct height */ - int prch_init[J2K_MAXRLVLS]; - - /**@name command line encoder parameters (not used inside the library) */ - /*@{*/ - /** input file name */ - char infile[OPJ_PATH_LEN]; - /** output file name */ - char outfile[OPJ_PATH_LEN]; - /** DEPRECATED. Index generation is now handeld with the opj_encode_with_info() function. Set to NULL */ - int index_on; - /** DEPRECATED. Index generation is now handeld with the opj_encode_with_info() function. Set to NULL */ - char index[OPJ_PATH_LEN]; - /** subimage encoding: origin image offset in x direction */ - int image_offset_x0; - /** subimage encoding: origin image offset in y direction */ - int image_offset_y0; - /** subsampling value for dx */ - int subsampling_dx; - /** subsampling value for dy */ - int subsampling_dy; - /** input file format 0: PGX, 1: PxM, 2: BMP 3:TIF*/ - int decod_format; - /** output file format 0: J2K, 1: JP2, 2: JPT */ - int cod_format; - /*@}*/ - - /* UniPG>> */ - /**@name JPWL encoding parameters */ - /*@{*/ - /** enables writing of EPC in MH, thus activating JPWL */ - opj_bool jpwl_epc_on; - /** error protection method for MH (0,1,16,32,37-128) */ - int jpwl_hprot_MH; - /** tile number of header protection specification (>=0) */ - int jpwl_hprot_TPH_tileno[JPWL_MAX_NO_TILESPECS]; - /** error protection methods for TPHs (0,1,16,32,37-128) */ - int jpwl_hprot_TPH[JPWL_MAX_NO_TILESPECS]; - /** tile number of packet protection specification (>=0) */ - int jpwl_pprot_tileno[JPWL_MAX_NO_PACKSPECS]; - /** packet number of packet protection specification (>=0) */ - int jpwl_pprot_packno[JPWL_MAX_NO_PACKSPECS]; - /** error protection methods for packets (0,1,16,32,37-128) */ - int jpwl_pprot[JPWL_MAX_NO_PACKSPECS]; - /** enables writing of ESD, (0=no/1/2 bytes) */ - int jpwl_sens_size; - /** sensitivity addressing size (0=auto/2/4 bytes) */ - int jpwl_sens_addr; - /** sensitivity range (0-3) */ - int jpwl_sens_range; - /** sensitivity method for MH (-1=no,0-7) */ - int jpwl_sens_MH; - /** tile number of sensitivity specification (>=0) */ - int jpwl_sens_TPH_tileno[JPWL_MAX_NO_TILESPECS]; - /** sensitivity methods for TPHs (-1=no,0-7) */ - int jpwl_sens_TPH[JPWL_MAX_NO_TILESPECS]; - /*@}*/ - /* <> */ - /**@name JPWL decoding parameters */ - /*@{*/ - /** activates the JPWL correction capabilities */ - opj_bool jpwl_correct; - /** expected number of components */ - int jpwl_exp_comps; - /** maximum number of tiles */ - int jpwl_max_tiles; - /*@}*/ - /* <> */ -/** -Marker structure -*/ -typedef struct opj_marker_info_t { - /** marker type */ - unsigned short int type; - /** position in codestream */ - int pos; - /** length, marker val included */ - int len; -} opj_marker_info_t; -/* <> */ - /** number of markers */ - int marknum; - /** list of markers */ - opj_marker_info_t *marker; - /** actual size of markers array */ - int maxmarknum; - /* <comps[].data - * To be paired with opj_image_data_free. - * - * @param size number of bytes to allocate - * - * @return a new pointer if successful, NULL otherwise. - * @since 2.2.0 -*/ -OPJ_API void* OPJ_CALLCONV opj_image_data_alloc(size_t size); - -/** - * Destructor for opj_image_t->comps[].data - * To be paired with opj_image_data_alloc. - * - * @param ptr Pointer to free - * - * @since 2.2.0 -*/ -OPJ_API void OPJ_CALLCONV opj_image_data_free(void* ptr); - -/* -========================================================== - stream functions definitions -========================================================== -*/ - -/** -Open and allocate a memory stream for read / write. -On reading, the user must provide a buffer containing encoded data. The buffer will be -wrapped by the returned CIO handle. -On writing, buffer parameters must be set to 0: a buffer will be allocated by the library -to contain encoded data. -@param cinfo Codec context info -@param buffer Reading: buffer address. Writing: NULL -@param length Reading: buffer length. Writing: 0 -@return Returns a CIO handle if successful, returns NULL otherwise -*/ -OPJ_API opj_cio_t* OPJ_CALLCONV opj_cio_open(opj_common_ptr cinfo, - unsigned char *buffer, int length); - -/** -Close and free a CIO handle -@param cio CIO handle to free -*/ -OPJ_API void OPJ_CALLCONV opj_cio_close(opj_cio_t *cio); - -/** -Get position in byte stream -@param cio CIO handle -@return Returns the position in bytes -*/ -OPJ_API int OPJ_CALLCONV cio_tell(opj_cio_t *cio); -/** -Set position in byte stream -@param cio CIO handle -@param pos Position, in number of bytes, from the beginning of the stream -*/ -OPJ_API void OPJ_CALLCONV cio_seek(opj_cio_t *cio, int pos); - -/* -========================================================== - event manager functions definitions -========================================================== -*/ - -OPJ_API opj_event_mgr_t* OPJ_CALLCONV opj_set_event_mgr(opj_common_ptr cinfo, - opj_event_mgr_t *event_mgr, void *context); - -/* -========================================================== - codec functions definitions -========================================================== -*/ -/** -Creates a J2K/JPT/JP2 decompression structure -@param format Decoder to select -@return Returns a handle to a decompressor if successful, returns NULL otherwise -*/ -OPJ_API opj_dinfo_t* OPJ_CALLCONV opj_create_decompress( - OPJ_CODEC_FORMAT format); -/** -Destroy a decompressor handle -@param dinfo decompressor handle to destroy -*/ -OPJ_API void OPJ_CALLCONV opj_destroy_decompress(opj_dinfo_t *dinfo); -/** -Set decoding parameters to default values -@param parameters Decompression parameters -*/ -OPJ_API void OPJ_CALLCONV opj_set_default_decoder_parameters( - opj_dparameters_t *parameters); -/** -Setup the decoder decoding parameters using user parameters. -Decoding parameters are returned in j2k->cp. -@param dinfo decompressor handle -@param parameters decompression parameters -*/ -OPJ_API void OPJ_CALLCONV opj_setup_decoder(opj_dinfo_t *dinfo, - opj_dparameters_t *parameters); -/** -Decode an image from a JPEG-2000 codestream -@param dinfo decompressor handle -@param cio Input buffer stream -@return Returns a decoded image if successful, returns NULL otherwise -*/ -OPJ_API opj_image_t* OPJ_CALLCONV opj_decode(opj_dinfo_t *dinfo, - opj_cio_t *cio); - -/** -Decode an image from a JPEG-2000 codestream and extract the codestream information -@param dinfo decompressor handle -@param cio Input buffer stream -@param cstr_info Codestream information structure if needed afterwards, NULL otherwise -@return Returns a decoded image if successful, returns NULL otherwise -*/ -OPJ_API opj_image_t* OPJ_CALLCONV opj_decode_with_info(opj_dinfo_t *dinfo, - opj_cio_t *cio, opj_codestream_info_t *cstr_info); -/** -Creates a J2K/JP2 compression structure -@param format Coder to select -@return Returns a handle to a compressor if successful, returns NULL otherwise -*/ -OPJ_API opj_cinfo_t* OPJ_CALLCONV opj_create_compress(OPJ_CODEC_FORMAT format); -/** -Destroy a compressor handle -@param cinfo compressor handle to destroy -*/ -OPJ_API void OPJ_CALLCONV opj_destroy_compress(opj_cinfo_t *cinfo); -/** -Set encoding parameters to default values, that means : -
      -
    • Lossless -
    • 1 tile -
    • Size of precinct : 2^15 x 2^15 (means 1 precinct) -
    • Size of code-block : 64 x 64 -
    • Number of resolutions: 6 -
    • No SOP marker in the codestream -
    • No EPH marker in the codestream -
    • No sub-sampling in x or y direction -
    • No mode switch activated -
    • Progression order: LRCP -
    • No index file -
    • No ROI upshifted -
    • No offset of the origin of the image -
    • No offset of the origin of the tiles -
    • Reversible DWT 5-3 -
    -@param parameters Compression parameters -*/ -OPJ_API void OPJ_CALLCONV opj_set_default_encoder_parameters( - opj_cparameters_t *parameters); -/** -Setup the encoder parameters using the current image and using user parameters. -@param cinfo Compressor handle -@param parameters Compression parameters -@param image Input filled image -*/ -OPJ_API void OPJ_CALLCONV opj_setup_encoder(opj_cinfo_t *cinfo, - opj_cparameters_t *parameters, opj_image_t *image); -/** -Encode an image into a JPEG-2000 codestream -3@param cinfo compressor handle -@param cio Output buffer stream -@param image Image to encode -@param index Deprecated -> Set to NULL. To extract index, used opj_encode_wci() -@return Returns true if successful, returns false otherwise -*/ -OPJ_API opj_bool OPJ_CALLCONV opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio, - opj_image_t *image, char *index); -/** -Encode an image into a JPEG-2000 codestream and extract the codestream information -@param cinfo compressor handle -@param cio Output buffer stream -@param image Image to encode -@param cstr_info Codestream information structure if needed afterwards, NULL otherwise -@return Returns true if successful, returns false otherwise -*/ -OPJ_API opj_bool OPJ_CALLCONV opj_encode_with_info(opj_cinfo_t *cinfo, - opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info); -/** -Destroy Codestream information after compression or decompression -@param cstr_info Codestream information structure -*/ -OPJ_API void OPJ_CALLCONV opj_destroy_cstr_info(opj_codestream_info_t - *cstr_info); - - -#ifdef __cplusplus -} -#endif - -#endif /* OPENJPEG_H */ diff --git a/src/lib/openmj2/opj_includes.h b/src/lib/openmj2/opj_includes.h deleted file mode 100644 index 340e8a91..00000000 --- a/src/lib/openmj2/opj_includes.h +++ /dev/null @@ -1,143 +0,0 @@ -/* - * 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) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ -#ifndef OPJ_INCLUDES_H -#define OPJ_INCLUDES_H - -/* - ========================================================== - Standard includes used by the library - ========================================================== -*/ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* - ========================================================== - OpenJPEG interface - ========================================================== - */ -#include "openjpeg.h" - -/* - ========================================================== - OpenJPEG modules - ========================================================== -*/ - -/* Ignore GCC attributes if this is not GCC */ -#ifndef __GNUC__ -#define __attribute__(x) /* __attribute__(x) */ -#endif - -/* -The inline keyword is supported by C99 but not by C90. -Most compilers implement their own version of this keyword ... -*/ -#ifndef INLINE -#if defined(_MSC_VER) -#define INLINE __forceinline -#elif defined(__GNUC__) -#define INLINE __inline__ -#elif defined(__MWERKS__) -#define INLINE inline -#else -/* add other compilers here ... */ -#define INLINE -#endif /* defined() */ -#endif /* INLINE */ - -/* Are restricted pointers available? (C99) */ -#if (__STDC_VERSION__ != 199901L) -/* Not a C99 compiler */ -#ifdef __GNUC__ -#define restrict __restrict__ -#else -#define restrict /* restrict */ -#endif -#endif - -/* MSVC and Borland C do not have lrintf */ -#if defined(_MSC_VER) || defined(__BORLANDC__) -static INLINE long lrintf(float f) -{ -#ifdef _M_X64 - return (long)((f > 0.0f) ? (f + 0.5f) : (f - 0.5f)); -#else - int i; - - _asm{ - fld f - fistp i - }; - - return i; -#endif -} -#endif - -#include "j2k_lib.h" -#include "opj_malloc.h" -#include "event.h" -#include "bio.h" -#include "cio.h" - -#include "image.h" -#include "j2k.h" -#include "jp2.h" -#include "jpt.h" - -#include "mqc.h" -#include "raw.h" -#include "bio.h" -#include "tgt.h" -#include "pi.h" -#include "tcd.h" -#include "t1.h" -#include "dwt.h" -#include "t2.h" -#include "mct.h" -#include "int.h" -#include "fix.h" - -/* JPWL>> */ -#ifdef USE_JPWL -#include "jpwl.h" -#endif /* USE_JPWL */ -/* < - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ -#ifndef __OPJ_MALLOC_H -#define __OPJ_MALLOC_H -/** -@file opj_malloc.h -@brief Internal functions - -The functions in opj_malloc.h are internal utilities used for memory management. -*/ - -/** @defgroup MISC MISC - Miscellaneous internal functions */ -/*@{*/ - -/** @name Exported functions */ -/*@{*/ -/* ----------------------------------------------------------------------- */ - -/** -Allocate an uninitialized memory block -@param size Bytes to allocate -@return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available -*/ -#ifdef ALLOC_PERF_OPT -void * OPJ_CALLCONV opj_malloc(size_t size); -#else -#define opj_malloc(size) malloc(size) -#endif - -/** -Allocate a memory block with elements initialized to 0 -@param num Blocks to allocate -@param size Bytes per block to allocate -@return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available -*/ -#ifdef ALLOC_PERF_OPT -void * OPJ_CALLCONV opj_calloc(size_t _NumOfElements, size_t _SizeOfElements); -#else -#define opj_calloc(num, size) calloc(num, size) -#endif - -/** -Allocate memory aligned to a 16 byte boundary -@param size Bytes to allocate -@return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available -*/ -/* FIXME: These should be set with cmake tests, but we're currently not requiring use of cmake */ -#ifdef _WIN32 -/* Someone should tell the mingw people that their malloc.h ought to provide _mm_malloc() */ -#ifdef __GNUC__ -#include -#define HAVE_MM_MALLOC -#else /* MSVC, Intel C++ */ -#include -#ifdef _mm_malloc -#define HAVE_MM_MALLOC -#endif -#endif -#else /* Not _WIN32 */ -#if defined(__sun) -#define HAVE_MEMALIGN -#elif defined(__FreeBSD__) -#define HAVE_POSIX_MEMALIGN -/* Linux x86_64 and OSX always align allocations to 16 bytes */ -#elif !defined(__amd64__) && !defined(__APPLE__) && !defined(_AIX) -#define HAVE_MEMALIGN -#include -#endif -#endif - -#define opj_aligned_malloc(size) malloc(size) -#define opj_aligned_free(m) free(m) - -#ifdef HAVE_MM_MALLOC -#undef opj_aligned_malloc -#define opj_aligned_malloc(size) _mm_malloc(size, 16) -#undef opj_aligned_free -#define opj_aligned_free(m) _mm_free(m) -#endif - -#ifdef HAVE_MEMALIGN -extern void* memalign(size_t, size_t); -#undef opj_aligned_malloc -#define opj_aligned_malloc(size) memalign(16, (size)) -#undef opj_aligned_free -#define opj_aligned_free(m) free(m) -#endif - -#ifdef HAVE_POSIX_MEMALIGN -#undef opj_aligned_malloc -extern int posix_memalign(void**, size_t, size_t); - -static INLINE void* __attribute__((malloc)) opj_aligned_malloc(size_t size) -{ - void* mem = NULL; - posix_memalign(&mem, 16, size); - return mem; -} -#undef opj_aligned_free -#define opj_aligned_free(m) free(m) -#endif - -#ifdef ALLOC_PERF_OPT -#undef opj_aligned_malloc -#define opj_aligned_malloc(size) opj_malloc(size) -#undef opj_aligned_free -#define opj_aligned_free(m) opj_free(m) -#endif - -/** -Reallocate memory blocks. -@param m Pointer to previously allocated memory block -@param s New size in bytes -@return Returns a void pointer to the reallocated (and possibly moved) memory block -*/ -#ifdef ALLOC_PERF_OPT -void * OPJ_CALLCONV opj_realloc(void * m, size_t s); -#else -#define opj_realloc(m, s) realloc(m, s) -#endif - -/** -Deallocates or frees a memory block. -@param m Previously allocated memory block to be freed -*/ -#ifdef ALLOC_PERF_OPT -void OPJ_CALLCONV opj_free(void * m); -#else -#define opj_free(m) free(m) -#endif - -#ifdef __GNUC__ -#pragma GCC poison malloc calloc realloc free -#endif - -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __OPJ_MALLOC_H */ - diff --git a/src/lib/openmj2/pi.c b/src/lib/openmj2/pi.c deleted file mode 100644 index ce9c16e4..00000000 --- a/src/lib/openmj2/pi.c +++ /dev/null @@ -1,1056 +0,0 @@ -/* - * 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_includes.h" - -/** @defgroup PI PI - Implementation of a packet iterator */ -/*@{*/ - -/** @name Local static functions */ -/*@{*/ - -/** -Get next packet in layer-resolution-component-precinct order. -@param pi packet iterator to modify -@return returns false if pi pointed to the last packet or else returns true -*/ -static opj_bool pi_next_lrcp(opj_pi_iterator_t * pi); -/** -Get next packet in resolution-layer-component-precinct order. -@param pi packet iterator to modify -@return returns false if pi pointed to the last packet or else returns true -*/ -static opj_bool pi_next_rlcp(opj_pi_iterator_t * pi); -/** -Get next packet in resolution-precinct-component-layer order. -@param pi packet iterator to modify -@return returns false if pi pointed to the last packet or else returns true -*/ -static opj_bool pi_next_rpcl(opj_pi_iterator_t * pi); -/** -Get next packet in precinct-component-resolution-layer order. -@param pi packet iterator to modify -@return returns false if pi pointed to the last packet or else returns true -*/ -static opj_bool pi_next_pcrl(opj_pi_iterator_t * pi); -/** -Get next packet in component-precinct-resolution-layer order. -@param pi packet iterator to modify -@return returns false if pi pointed to the last packet or else returns true -*/ -static opj_bool pi_next_cprl(opj_pi_iterator_t * pi); - -/*@}*/ - -/*@}*/ - -/* -========================================================== - local functions -========================================================== -*/ - -static opj_bool pi_next_lrcp(opj_pi_iterator_t * pi) -{ - opj_pi_comp_t *comp = NULL; - opj_pi_resolution_t *res = NULL; - long index = 0; - - if (!pi->first) { - comp = &pi->comps[pi->compno]; - res = &comp->resolutions[pi->resno]; - goto LABEL_SKIP; - } else { - pi->first = 0; - } - - for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) { - for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; - pi->resno++) { - for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) { - comp = &pi->comps[pi->compno]; - if (pi->resno >= comp->numresolutions) { - continue; - } - res = &comp->resolutions[pi->resno]; - if (!pi->tp_on) { - pi->poc.precno1 = res->pw * res->ph; - } - for (pi->precno = pi->poc.precno0; pi->precno < pi->poc.precno1; pi->precno++) { - index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * - pi->step_c + pi->precno * pi->step_p; - if (!pi->include[index]) { - pi->include[index] = 1; - return OPJ_TRUE; - } -LABEL_SKIP: - ; - } - } - } - } - - return OPJ_FALSE; -} - -static opj_bool pi_next_rlcp(opj_pi_iterator_t * pi) -{ - opj_pi_comp_t *comp = NULL; - opj_pi_resolution_t *res = NULL; - long index = 0; - - if (!pi->first) { - comp = &pi->comps[pi->compno]; - res = &comp->resolutions[pi->resno]; - goto LABEL_SKIP; - } else { - pi->first = 0; - } - - for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) { - for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) { - for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) { - comp = &pi->comps[pi->compno]; - if (pi->resno >= comp->numresolutions) { - continue; - } - res = &comp->resolutions[pi->resno]; - if (!pi->tp_on) { - pi->poc.precno1 = res->pw * res->ph; - } - for (pi->precno = pi->poc.precno0; pi->precno < pi->poc.precno1; pi->precno++) { - index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * - pi->step_c + pi->precno * pi->step_p; - if (!pi->include[index]) { - pi->include[index] = 1; - return OPJ_TRUE; - } -LABEL_SKIP: - ; - } - } - } - } - - return OPJ_FALSE; -} - -static opj_bool pi_next_rpcl(opj_pi_iterator_t * pi) -{ - opj_pi_comp_t *comp = NULL; - opj_pi_resolution_t *res = NULL; - long index = 0; - - if (!pi->first) { - goto LABEL_SKIP; - } else { - int compno, resno; - pi->first = 0; - pi->dx = 0; - pi->dy = 0; - for (compno = 0; compno < pi->numcomps; compno++) { - comp = &pi->comps[compno]; - for (resno = 0; resno < comp->numresolutions; resno++) { - int dx, dy; - res = &comp->resolutions[resno]; - dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno)); - dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno)); - pi->dx = !pi->dx ? dx : int_min(pi->dx, dx); - pi->dy = !pi->dy ? dy : int_min(pi->dy, dy); - } - } - } - if (!pi->tp_on) { - pi->poc.ty0 = pi->ty0; - pi->poc.tx0 = pi->tx0; - pi->poc.ty1 = pi->ty1; - pi->poc.tx1 = pi->tx1; - } - for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) { - for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; - pi->y += pi->dy - (pi->y % pi->dy)) { - for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1; - pi->x += pi->dx - (pi->x % pi->dx)) { - for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) { - int levelno; - int trx0, try0; - int trx1, try1; - int rpx, rpy; - int prci, prcj; - comp = &pi->comps[pi->compno]; - if (pi->resno >= comp->numresolutions) { - continue; - } - res = &comp->resolutions[pi->resno]; - levelno = comp->numresolutions - 1 - pi->resno; - trx0 = int_ceildiv(pi->tx0, comp->dx << levelno); - try0 = int_ceildiv(pi->ty0, comp->dy << levelno); - trx1 = int_ceildiv(pi->tx1, comp->dx << levelno); - try1 = int_ceildiv(pi->ty1, comp->dy << levelno); - rpx = res->pdx + levelno; - rpy = res->pdy + levelno; - - /* To avoid divisions by zero / undefined behaviour on shift */ - if (rpx >= 31 || ((comp->dx << rpx) >> rpx) != comp->dx || - rpy >= 31 || ((comp->dy << rpy) >> rpy) != comp->dy) { - continue; - } - - if (!((pi->y % (comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && - ((try0 << levelno) % (1 << rpy))))) { - continue; - } - if (!((pi->x % (comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && - ((trx0 << levelno) % (1 << rpx))))) { - continue; - } - - if ((res->pw == 0) || (res->ph == 0)) { - continue; - } - - if ((trx0 == trx1) || (try0 == try1)) { - continue; - } - - prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx) - - int_floordivpow2(trx0, res->pdx); - prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy) - - int_floordivpow2(try0, res->pdy); - pi->precno = prci + prcj * res->pw; - for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) { - index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * - pi->step_c + pi->precno * pi->step_p; - if (!pi->include[index]) { - pi->include[index] = 1; - return OPJ_TRUE; - } -LABEL_SKIP: - ; - } - } - } - } - } - - return OPJ_FALSE; -} - -static opj_bool pi_next_pcrl(opj_pi_iterator_t * pi) -{ - opj_pi_comp_t *comp = NULL; - opj_pi_resolution_t *res = NULL; - long index = 0; - - if (!pi->first) { - comp = &pi->comps[pi->compno]; - goto LABEL_SKIP; - } else { - int compno, resno; - pi->first = 0; - pi->dx = 0; - pi->dy = 0; - for (compno = 0; compno < pi->numcomps; compno++) { - comp = &pi->comps[compno]; - for (resno = 0; resno < comp->numresolutions; resno++) { - int dx, dy; - res = &comp->resolutions[resno]; - dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno)); - dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno)); - pi->dx = !pi->dx ? dx : int_min(pi->dx, dx); - pi->dy = !pi->dy ? dy : int_min(pi->dy, dy); - } - } - } - if (!pi->tp_on) { - pi->poc.ty0 = pi->ty0; - pi->poc.tx0 = pi->tx0; - pi->poc.ty1 = pi->ty1; - pi->poc.tx1 = pi->tx1; - } - for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; - pi->y += pi->dy - (pi->y % pi->dy)) { - for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1; - pi->x += pi->dx - (pi->x % pi->dx)) { - for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) { - comp = &pi->comps[pi->compno]; - for (pi->resno = pi->poc.resno0; - pi->resno < int_min(pi->poc.resno1, comp->numresolutions); pi->resno++) { - int levelno; - int trx0, try0; - int trx1, try1; - int rpx, rpy; - int prci, prcj; - res = &comp->resolutions[pi->resno]; - levelno = comp->numresolutions - 1 - pi->resno; - trx0 = int_ceildiv(pi->tx0, comp->dx << levelno); - try0 = int_ceildiv(pi->ty0, comp->dy << levelno); - trx1 = int_ceildiv(pi->tx1, comp->dx << levelno); - try1 = int_ceildiv(pi->ty1, comp->dy << levelno); - rpx = res->pdx + levelno; - rpy = res->pdy + levelno; - - /* To avoid divisions by zero / undefined behaviour on shift */ - if (rpx >= 31 || ((comp->dx << rpx) >> rpx) != comp->dx || - rpy >= 31 || ((comp->dy << rpy) >> rpy) != comp->dy) { - continue; - } - - if (!((pi->y % (comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && - ((try0 << levelno) % (1 << rpy))))) { - continue; - } - if (!((pi->x % (comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && - ((trx0 << levelno) % (1 << rpx))))) { - continue; - } - - if ((res->pw == 0) || (res->ph == 0)) { - continue; - } - - if ((trx0 == trx1) || (try0 == try1)) { - continue; - } - - prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx) - - int_floordivpow2(trx0, res->pdx); - prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy) - - int_floordivpow2(try0, res->pdy); - pi->precno = prci + prcj * res->pw; - for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) { - index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * - pi->step_c + pi->precno * pi->step_p; - if (!pi->include[index]) { - pi->include[index] = 1; - return OPJ_TRUE; - } -LABEL_SKIP: - ; - } - } - } - } - } - - return OPJ_FALSE; -} - -static opj_bool pi_next_cprl(opj_pi_iterator_t * pi) -{ - opj_pi_comp_t *comp = NULL; - opj_pi_resolution_t *res = NULL; - long index = 0; - - if (!pi->first) { - comp = &pi->comps[pi->compno]; - goto LABEL_SKIP; - } else { - pi->first = 0; - } - - for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) { - int resno; - comp = &pi->comps[pi->compno]; - pi->dx = 0; - pi->dy = 0; - for (resno = 0; resno < comp->numresolutions; resno++) { - int dx, dy; - res = &comp->resolutions[resno]; - dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno)); - dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno)); - pi->dx = !pi->dx ? dx : int_min(pi->dx, dx); - pi->dy = !pi->dy ? dy : int_min(pi->dy, dy); - } - if (!pi->tp_on) { - pi->poc.ty0 = pi->ty0; - pi->poc.tx0 = pi->tx0; - pi->poc.ty1 = pi->ty1; - pi->poc.tx1 = pi->tx1; - } - for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; - pi->y += pi->dy - (pi->y % pi->dy)) { - for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1; - pi->x += pi->dx - (pi->x % pi->dx)) { - for (pi->resno = pi->poc.resno0; - pi->resno < int_min(pi->poc.resno1, comp->numresolutions); pi->resno++) { - int levelno; - int trx0, try0; - int trx1, try1; - int rpx, rpy; - int prci, prcj; - res = &comp->resolutions[pi->resno]; - levelno = comp->numresolutions - 1 - pi->resno; - trx0 = int_ceildiv(pi->tx0, comp->dx << levelno); - try0 = int_ceildiv(pi->ty0, comp->dy << levelno); - trx1 = int_ceildiv(pi->tx1, comp->dx << levelno); - try1 = int_ceildiv(pi->ty1, comp->dy << levelno); - rpx = res->pdx + levelno; - rpy = res->pdy + levelno; - - /* To avoid divisions by zero / undefined behaviour on shift */ - if (rpx >= 31 || ((comp->dx << rpx) >> rpx) != comp->dx || - rpy >= 31 || ((comp->dy << rpy) >> rpy) != comp->dy) { - continue; - } - - if (!((pi->y % (comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && - ((try0 << levelno) % (1 << rpy))))) { - continue; - } - if (!((pi->x % (comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && - ((trx0 << levelno) % (1 << rpx))))) { - continue; - } - - if ((res->pw == 0) || (res->ph == 0)) { - continue; - } - - if ((trx0 == trx1) || (try0 == try1)) { - continue; - } - - prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx) - - int_floordivpow2(trx0, res->pdx); - prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy) - - int_floordivpow2(try0, res->pdy); - pi->precno = prci + prcj * res->pw; - for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) { - index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * - pi->step_c + pi->precno * pi->step_p; - if (!pi->include[index]) { - pi->include[index] = 1; - return OPJ_TRUE; - } -LABEL_SKIP: - ; - } - } - } - } - } - - return OPJ_FALSE; -} - -/* -========================================================== - Packet iterator interface -========================================================== -*/ - -opj_pi_iterator_t *pi_create_decode(opj_image_t *image, opj_cp_t *cp, - int tileno) -{ - int p, q; - int compno, resno, pino; - opj_pi_iterator_t *pi = NULL; - opj_tcp_t *tcp = NULL; - opj_tccp_t *tccp = NULL; - - tcp = &cp->tcps[tileno]; - - pi = (opj_pi_iterator_t*) opj_calloc((tcp->numpocs + 1), - sizeof(opj_pi_iterator_t)); - if (!pi) { - /* TODO: throw an error */ - return NULL; - } - - for (pino = 0; pino < tcp->numpocs + 1; pino++) { /* change */ - int maxres = 0; - int maxprec = 0; - p = tileno % cp->tw; - q = tileno / cp->tw; - - pi[pino].tx0 = int_max(cp->tx0 + p * cp->tdx, image->x0); - pi[pino].ty0 = int_max(cp->ty0 + q * cp->tdy, image->y0); - pi[pino].tx1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1); - pi[pino].ty1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1); - pi[pino].numcomps = image->numcomps; - - pi[pino].comps = (opj_pi_comp_t*) opj_calloc(image->numcomps, - sizeof(opj_pi_comp_t)); - if (!pi[pino].comps) { - /* TODO: throw an error */ - pi_destroy(pi, cp, tileno); - return NULL; - } - - for (compno = 0; compno < pi->numcomps; compno++) { - int tcx0, tcy0, tcx1, tcy1; - opj_pi_comp_t *comp = &pi[pino].comps[compno]; - tccp = &tcp->tccps[compno]; - comp->dx = image->comps[compno].dx; - comp->dy = image->comps[compno].dy; - comp->numresolutions = tccp->numresolutions; - - comp->resolutions = (opj_pi_resolution_t*) opj_calloc(comp->numresolutions, - sizeof(opj_pi_resolution_t)); - if (!comp->resolutions) { - /* TODO: throw an error */ - pi_destroy(pi, cp, tileno); - return NULL; - } - - tcx0 = int_ceildiv(pi->tx0, comp->dx); - tcy0 = int_ceildiv(pi->ty0, comp->dy); - tcx1 = int_ceildiv(pi->tx1, comp->dx); - tcy1 = int_ceildiv(pi->ty1, comp->dy); - if (comp->numresolutions > maxres) { - maxres = comp->numresolutions; - } - - for (resno = 0; resno < comp->numresolutions; resno++) { - int levelno; - int rx0, ry0, rx1, ry1; - int px0, py0, px1, py1; - opj_pi_resolution_t *res = &comp->resolutions[resno]; - if (tccp->csty & J2K_CCP_CSTY_PRT) { - res->pdx = tccp->prcw[resno]; - res->pdy = tccp->prch[resno]; - } else { - res->pdx = 15; - res->pdy = 15; - } - levelno = comp->numresolutions - 1 - resno; - rx0 = int_ceildivpow2(tcx0, levelno); - ry0 = int_ceildivpow2(tcy0, levelno); - rx1 = int_ceildivpow2(tcx1, levelno); - ry1 = int_ceildivpow2(tcy1, levelno); - px0 = int_floordivpow2(rx0, res->pdx) << res->pdx; - py0 = int_floordivpow2(ry0, res->pdy) << res->pdy; - px1 = int_ceildivpow2(rx1, res->pdx) << res->pdx; - py1 = int_ceildivpow2(ry1, res->pdy) << res->pdy; - res->pw = (rx0 == rx1) ? 0 : ((px1 - px0) >> res->pdx); - res->ph = (ry0 == ry1) ? 0 : ((py1 - py0) >> res->pdy); - - if (res->pw * res->ph > maxprec) { - maxprec = res->pw * res->ph; - } - - } - } - - tccp = &tcp->tccps[0]; - pi[pino].step_p = 1; - pi[pino].step_c = maxprec * pi[pino].step_p; - pi[pino].step_r = image->numcomps * pi[pino].step_c; - pi[pino].step_l = maxres * pi[pino].step_r; - - if (pino == 0) { - pi[pino].include = (short int*) opj_calloc(image->numcomps * maxres * - tcp->numlayers * maxprec, sizeof(short int)); - if (!pi[pino].include) { - /* TODO: throw an error */ - pi_destroy(pi, cp, tileno); - return NULL; - } - } else { - pi[pino].include = pi[pino - 1].include; - } - - if (tcp->POC == 0) { - pi[pino].first = 1; - pi[pino].poc.resno0 = 0; - pi[pino].poc.compno0 = 0; - pi[pino].poc.layno1 = tcp->numlayers; - pi[pino].poc.resno1 = maxres; - pi[pino].poc.compno1 = image->numcomps; - pi[pino].poc.prg = tcp->prg; - } else { - pi[pino].first = 1; - pi[pino].poc.resno0 = tcp->pocs[pino].resno0; - pi[pino].poc.compno0 = tcp->pocs[pino].compno0; - pi[pino].poc.layno1 = tcp->pocs[pino].layno1; - pi[pino].poc.resno1 = tcp->pocs[pino].resno1; - pi[pino].poc.compno1 = tcp->pocs[pino].compno1; - pi[pino].poc.prg = tcp->pocs[pino].prg; - } - pi[pino].poc.layno0 = 0; - pi[pino].poc.precno0 = 0; - pi[pino].poc.precno1 = maxprec; - - } - - return pi; -} - - -opj_pi_iterator_t *pi_initialise_encode(opj_image_t *image, opj_cp_t *cp, - int tileno, J2K_T2_MODE t2_mode) -{ - int p, q, pino; - int compno, resno; - int maxres = 0; - int maxprec = 0; - opj_pi_iterator_t *pi = NULL; - opj_tcp_t *tcp = NULL; - opj_tccp_t *tccp = NULL; - - tcp = &cp->tcps[tileno]; - - pi = (opj_pi_iterator_t*) opj_calloc((tcp->numpocs + 1), - sizeof(opj_pi_iterator_t)); - if (!pi) { - return NULL; - } - pi->tp_on = cp->tp_on; - - for (pino = 0; pino < tcp->numpocs + 1 ; pino ++) { - p = tileno % cp->tw; - q = tileno / cp->tw; - - pi[pino].tx0 = int_max(cp->tx0 + p * cp->tdx, image->x0); - pi[pino].ty0 = int_max(cp->ty0 + q * cp->tdy, image->y0); - pi[pino].tx1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1); - pi[pino].ty1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1); - pi[pino].numcomps = image->numcomps; - - pi[pino].comps = (opj_pi_comp_t*) opj_calloc(image->numcomps, - sizeof(opj_pi_comp_t)); - if (!pi[pino].comps) { - pi_destroy(pi, cp, tileno); - return NULL; - } - - for (compno = 0; compno < pi[pino].numcomps; compno++) { - int tcx0, tcy0, tcx1, tcy1; - opj_pi_comp_t *comp = &pi[pino].comps[compno]; - tccp = &tcp->tccps[compno]; - comp->dx = image->comps[compno].dx; - comp->dy = image->comps[compno].dy; - comp->numresolutions = tccp->numresolutions; - - comp->resolutions = (opj_pi_resolution_t*) opj_malloc(comp->numresolutions * - sizeof(opj_pi_resolution_t)); - if (!comp->resolutions) { - pi_destroy(pi, cp, tileno); - return NULL; - } - - tcx0 = int_ceildiv(pi[pino].tx0, comp->dx); - tcy0 = int_ceildiv(pi[pino].ty0, comp->dy); - tcx1 = int_ceildiv(pi[pino].tx1, comp->dx); - tcy1 = int_ceildiv(pi[pino].ty1, comp->dy); - if (comp->numresolutions > maxres) { - maxres = comp->numresolutions; - } - - for (resno = 0; resno < comp->numresolutions; resno++) { - int levelno; - int rx0, ry0, rx1, ry1; - int px0, py0, px1, py1; - opj_pi_resolution_t *res = &comp->resolutions[resno]; - if (tccp->csty & J2K_CCP_CSTY_PRT) { - res->pdx = tccp->prcw[resno]; - res->pdy = tccp->prch[resno]; - } else { - res->pdx = 15; - res->pdy = 15; - } - levelno = comp->numresolutions - 1 - resno; - rx0 = int_ceildivpow2(tcx0, levelno); - ry0 = int_ceildivpow2(tcy0, levelno); - rx1 = int_ceildivpow2(tcx1, levelno); - ry1 = int_ceildivpow2(tcy1, levelno); - px0 = int_floordivpow2(rx0, res->pdx) << res->pdx; - py0 = int_floordivpow2(ry0, res->pdy) << res->pdy; - px1 = int_ceildivpow2(rx1, res->pdx) << res->pdx; - py1 = int_ceildivpow2(ry1, res->pdy) << res->pdy; - res->pw = (rx0 == rx1) ? 0 : ((px1 - px0) >> res->pdx); - res->ph = (ry0 == ry1) ? 0 : ((py1 - py0) >> res->pdy); - - if (res->pw * res->ph > maxprec) { - maxprec = res->pw * res->ph; - } - } - } - - tccp = &tcp->tccps[0]; - pi[pino].step_p = 1; - pi[pino].step_c = maxprec * pi[pino].step_p; - pi[pino].step_r = image->numcomps * pi[pino].step_c; - pi[pino].step_l = maxres * pi[pino].step_r; - - for (compno = 0; compno < pi->numcomps; compno++) { - opj_pi_comp_t *comp = &pi->comps[compno]; - for (resno = 0; resno < comp->numresolutions; resno++) { - int dx, dy; - opj_pi_resolution_t *res = &comp->resolutions[resno]; - dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno)); - dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno)); - pi[pino].dx = !pi->dx ? dx : int_min(pi->dx, dx); - pi[pino].dy = !pi->dy ? dy : int_min(pi->dy, dy); - } - } - - if (pino == 0) { - pi[pino].include = (short int*) opj_calloc(tcp->numlayers * pi[pino].step_l, - sizeof(short int)); - if (!pi[pino].include) { - pi_destroy(pi, cp, tileno); - return NULL; - } - } else { - pi[pino].include = pi[pino - 1].include; - } - - /* Generation of boundaries for each prog flag*/ - if (tcp->POC && (cp->cinema || ((!cp->cinema) && (t2_mode == FINAL_PASS)))) { - tcp->pocs[pino].compS = tcp->pocs[pino].compno0; - tcp->pocs[pino].compE = tcp->pocs[pino].compno1; - tcp->pocs[pino].resS = tcp->pocs[pino].resno0; - tcp->pocs[pino].resE = tcp->pocs[pino].resno1; - tcp->pocs[pino].layE = tcp->pocs[pino].layno1; - tcp->pocs[pino].prg = tcp->pocs[pino].prg1; - if (pino > 0) { - tcp->pocs[pino].layS = (tcp->pocs[pino].layE > tcp->pocs[pino - 1].layE) ? - tcp->pocs[pino - 1].layE : 0; - } - } else { - tcp->pocs[pino].compS = 0; - tcp->pocs[pino].compE = image->numcomps; - tcp->pocs[pino].resS = 0; - tcp->pocs[pino].resE = maxres; - tcp->pocs[pino].layS = 0; - tcp->pocs[pino].layE = tcp->numlayers; - tcp->pocs[pino].prg = tcp->prg; - } - tcp->pocs[pino].prcS = 0; - tcp->pocs[pino].prcE = maxprec;; - tcp->pocs[pino].txS = pi[pino].tx0; - tcp->pocs[pino].txE = pi[pino].tx1; - tcp->pocs[pino].tyS = pi[pino].ty0; - tcp->pocs[pino].tyE = pi[pino].ty1; - tcp->pocs[pino].dx = pi[pino].dx; - tcp->pocs[pino].dy = pi[pino].dy; - } - return pi; -} - - - -void pi_destroy(opj_pi_iterator_t *pi, opj_cp_t *cp, int tileno) -{ - int compno, pino; - opj_tcp_t *tcp = &cp->tcps[tileno]; - if (pi) { - for (pino = 0; pino < tcp->numpocs + 1; pino++) { - if (pi[pino].comps) { - for (compno = 0; compno < pi->numcomps; compno++) { - opj_pi_comp_t *comp = &pi[pino].comps[compno]; - if (comp->resolutions) { - opj_free(comp->resolutions); - } - } - opj_free(pi[pino].comps); - } - } - if (pi->include) { - opj_free(pi->include); - } - opj_free(pi); - } -} - -opj_bool pi_next(opj_pi_iterator_t * pi) -{ - switch (pi->poc.prg) { - case LRCP: - return pi_next_lrcp(pi); - case RLCP: - return pi_next_rlcp(pi); - case RPCL: - return pi_next_rpcl(pi); - case PCRL: - return pi_next_pcrl(pi); - case CPRL: - return pi_next_cprl(pi); - case PROG_UNKNOWN: - return OPJ_FALSE; - } - - return OPJ_FALSE; -} - -opj_bool pi_create_encode(opj_pi_iterator_t *pi, opj_cp_t *cp, int tileno, - int pino, int tpnum, int tppos, J2K_T2_MODE t2_mode, int cur_totnum_tp) -{ - char prog[4]; - int i; - int incr_top = 1, resetX = 0; - opj_tcp_t *tcps = &cp->tcps[tileno]; - opj_poc_t *tcp = &tcps->pocs[pino]; - - pi[pino].first = 1; - pi[pino].poc.prg = tcp->prg; - - switch (tcp->prg) { - case CPRL: - strncpy(prog, "CPRL", 4); - break; - case LRCP: - strncpy(prog, "LRCP", 4); - break; - case PCRL: - strncpy(prog, "PCRL", 4); - break; - case RLCP: - strncpy(prog, "RLCP", 4); - break; - case RPCL: - strncpy(prog, "RPCL", 4); - break; - case PROG_UNKNOWN: - return OPJ_TRUE; - } - - if (!(cp->tp_on && ((!cp->cinema && (t2_mode == FINAL_PASS)) || cp->cinema))) { - pi[pino].poc.resno0 = tcp->resS; - pi[pino].poc.resno1 = tcp->resE; - pi[pino].poc.compno0 = tcp->compS; - pi[pino].poc.compno1 = tcp->compE; - pi[pino].poc.layno0 = tcp->layS; - pi[pino].poc.layno1 = tcp->layE; - pi[pino].poc.precno0 = tcp->prcS; - pi[pino].poc.precno1 = tcp->prcE; - pi[pino].poc.tx0 = tcp->txS; - pi[pino].poc.ty0 = tcp->tyS; - pi[pino].poc.tx1 = tcp->txE; - pi[pino].poc.ty1 = tcp->tyE; - } else { - if (tpnum < cur_totnum_tp) { - for (i = 3; i >= 0; i--) { - switch (prog[i]) { - case 'C': - if (i > tppos) { - pi[pino].poc.compno0 = tcp->compS; - pi[pino].poc.compno1 = tcp->compE; - } else { - if (tpnum == 0) { - tcp->comp_t = tcp->compS; - pi[pino].poc.compno0 = tcp->comp_t; - pi[pino].poc.compno1 = tcp->comp_t + 1; - tcp->comp_t += 1; - } else { - if (incr_top == 1) { - if (tcp->comp_t == tcp->compE) { - tcp->comp_t = tcp->compS; - pi[pino].poc.compno0 = tcp->comp_t; - pi[pino].poc.compno1 = tcp->comp_t + 1; - tcp->comp_t += 1; - incr_top = 1; - } else { - pi[pino].poc.compno0 = tcp->comp_t; - pi[pino].poc.compno1 = tcp->comp_t + 1; - tcp->comp_t += 1; - incr_top = 0; - } - } else { - pi[pino].poc.compno0 = tcp->comp_t - 1; - pi[pino].poc.compno1 = tcp->comp_t; - } - } - } - break; - - case 'R': - if (i > tppos) { - pi[pino].poc.resno0 = tcp->resS; - pi[pino].poc.resno1 = tcp->resE; - } else { - if (tpnum == 0) { - tcp->res_t = tcp->resS; - pi[pino].poc.resno0 = tcp->res_t; - pi[pino].poc.resno1 = tcp->res_t + 1; - tcp->res_t += 1; - } else { - if (incr_top == 1) { - if (tcp->res_t == tcp->resE) { - tcp->res_t = tcp->resS; - pi[pino].poc.resno0 = tcp->res_t; - pi[pino].poc.resno1 = tcp->res_t + 1; - tcp->res_t += 1; - incr_top = 1; - } else { - pi[pino].poc.resno0 = tcp->res_t; - pi[pino].poc.resno1 = tcp->res_t + 1; - tcp->res_t += 1; - incr_top = 0; - } - } else { - pi[pino].poc.resno0 = tcp->res_t - 1; - pi[pino].poc.resno1 = tcp->res_t; - } - } - } - break; - - case 'L': - if (i > tppos) { - pi[pino].poc.layno0 = tcp->layS; - pi[pino].poc.layno1 = tcp->layE; - } else { - if (tpnum == 0) { - tcp->lay_t = tcp->layS; - pi[pino].poc.layno0 = tcp->lay_t; - pi[pino].poc.layno1 = tcp->lay_t + 1; - tcp->lay_t += 1; - } else { - if (incr_top == 1) { - if (tcp->lay_t == tcp->layE) { - tcp->lay_t = tcp->layS; - pi[pino].poc.layno0 = tcp->lay_t; - pi[pino].poc.layno1 = tcp->lay_t + 1; - tcp->lay_t += 1; - incr_top = 1; - } else { - pi[pino].poc.layno0 = tcp->lay_t; - pi[pino].poc.layno1 = tcp->lay_t + 1; - tcp->lay_t += 1; - incr_top = 0; - } - } else { - pi[pino].poc.layno0 = tcp->lay_t - 1; - pi[pino].poc.layno1 = tcp->lay_t; - } - } - } - break; - - case 'P': - switch (tcp->prg) { - case LRCP: - case RLCP: - if (i > tppos) { - pi[pino].poc.precno0 = tcp->prcS; - pi[pino].poc.precno1 = tcp->prcE; - } else { - if (tpnum == 0) { - tcp->prc_t = tcp->prcS; - pi[pino].poc.precno0 = tcp->prc_t; - pi[pino].poc.precno1 = tcp->prc_t + 1; - tcp->prc_t += 1; - } else { - if (incr_top == 1) { - if (tcp->prc_t == tcp->prcE) { - tcp->prc_t = tcp->prcS; - pi[pino].poc.precno0 = tcp->prc_t; - pi[pino].poc.precno1 = tcp->prc_t + 1; - tcp->prc_t += 1; - incr_top = 1; - } else { - pi[pino].poc.precno0 = tcp->prc_t; - pi[pino].poc.precno1 = tcp->prc_t + 1; - tcp->prc_t += 1; - incr_top = 0; - } - } else { - pi[pino].poc.precno0 = tcp->prc_t - 1; - pi[pino].poc.precno1 = tcp->prc_t; - } - } - } - break; - default: - if (i > tppos) { - pi[pino].poc.tx0 = tcp->txS; - pi[pino].poc.ty0 = tcp->tyS; - pi[pino].poc.tx1 = tcp->txE; - pi[pino].poc.ty1 = tcp->tyE; - } else { - if (tpnum == 0) { - tcp->tx0_t = tcp->txS; - tcp->ty0_t = tcp->tyS; - pi[pino].poc.tx0 = tcp->tx0_t; - pi[pino].poc.tx1 = tcp->tx0_t + tcp->dx - (tcp->tx0_t % tcp->dx); - pi[pino].poc.ty0 = tcp->ty0_t; - pi[pino].poc.ty1 = tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy); - tcp->tx0_t = pi[pino].poc.tx1; - tcp->ty0_t = pi[pino].poc.ty1; - } else { - if (incr_top == 1) { - if (tcp->tx0_t >= tcp->txE) { - if (tcp->ty0_t >= tcp->tyE) { - tcp->ty0_t = tcp->tyS; - pi[pino].poc.ty0 = tcp->ty0_t; - pi[pino].poc.ty1 = tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy); - tcp->ty0_t = pi[pino].poc.ty1; - incr_top = 1; - resetX = 1; - } else { - pi[pino].poc.ty0 = tcp->ty0_t; - pi[pino].poc.ty1 = tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy); - tcp->ty0_t = pi[pino].poc.ty1; - incr_top = 0; - resetX = 1; - } - if (resetX == 1) { - tcp->tx0_t = tcp->txS; - pi[pino].poc.tx0 = tcp->tx0_t; - pi[pino].poc.tx1 = tcp->tx0_t + tcp->dx - (tcp->tx0_t % tcp->dx); - tcp->tx0_t = pi[pino].poc.tx1; - } - } else { - pi[pino].poc.tx0 = tcp->tx0_t; - pi[pino].poc.tx1 = tcp->tx0_t + tcp->dx - (tcp->tx0_t % tcp->dx); - tcp->tx0_t = pi[pino].poc.tx1; - pi[pino].poc.ty0 = tcp->ty0_t - tcp->dy - (tcp->ty0_t % tcp->dy); - pi[pino].poc.ty1 = tcp->ty0_t ; - incr_top = 0; - } - } else { - pi[pino].poc.tx0 = tcp->tx0_t - tcp->dx - (tcp->tx0_t % tcp->dx); - pi[pino].poc.tx1 = tcp->tx0_t ; - pi[pino].poc.ty0 = tcp->ty0_t - tcp->dy - (tcp->ty0_t % tcp->dy); - pi[pino].poc.ty1 = tcp->ty0_t ; - } - } - } - break; - } - break; - } - } - } - } - return OPJ_FALSE; -} - diff --git a/src/lib/openmj2/pi.h b/src/lib/openmj2/pi.h deleted file mode 100644 index c8976cc3..00000000 --- a/src/lib/openmj2/pi.h +++ /dev/null @@ -1,165 +0,0 @@ -/* - * 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 __PI_H -#define __PI_H -/** -@file pi.h -@brief Implementation of a packet iterator (PI) - -The functions in PI.C have for goal to realize a packet iterator that permits to get the next -packet following the progression order and change of it. The functions in PI.C are used -by some function in T2.C. -*/ - -/** @defgroup PI PI - Implementation of a packet iterator */ -/*@{*/ - -/** -FIXME: documentation -*/ -typedef struct opj_pi_resolution { - int pdx, pdy; - int pw, ph; -} opj_pi_resolution_t; - -/** -FIXME: documentation -*/ -typedef struct opj_pi_comp { - int dx, dy; - /** number of resolution levels */ - int numresolutions; - opj_pi_resolution_t *resolutions; -} opj_pi_comp_t; - -/** -Packet iterator -*/ -typedef struct opj_pi_iterator { - /** Enabling Tile part generation*/ - char tp_on; - /** precise if the packet has been already used (useful for progression order change) */ - short int *include; - /** layer step used to localize the packet in the include vector */ - int step_l; - /** resolution step used to localize the packet in the include vector */ - int step_r; - /** component step used to localize the packet in the include vector */ - int step_c; - /** precinct step used to localize the packet in the include vector */ - int step_p; - /** component that identify the packet */ - int compno; - /** resolution that identify the packet */ - int resno; - /** precinct that identify the packet */ - int precno; - /** layer that identify the packet */ - int layno; - /** 0 if the first packet */ - int first; - /** progression order change information */ - opj_poc_t poc; - /** number of components in the image */ - int numcomps; - /** Components*/ - opj_pi_comp_t *comps; - int tx0, ty0, tx1, ty1; - int x, y, dx, dy; -} opj_pi_iterator_t; - -/** @name Exported functions */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Create a packet iterator for Encoder -@param image Raw image for which the packets will be listed -@param cp Coding parameters -@param tileno Number that identifies the tile for which to list the packets -@param t2_mode If == 0 In Threshold calculation ,If == 1 Final pass -@return Returns a packet iterator that points to the first packet of the tile -@see pi_destroy -*/ -opj_pi_iterator_t *pi_initialise_encode(opj_image_t *image, opj_cp_t *cp, - int tileno, J2K_T2_MODE t2_mode); -/** -Modify the packet iterator for enabling tile part generation -@param pi Handle to the packet iterator generated in pi_initialise_encode -@param cp Coding parameters -@param tileno Number that identifies the tile for which to list the packets -@param pino Iterator index for pi -@param tpnum Tile part number of the current tile -@param tppos The position of the tile part flag in the progression order -@param t2_mode If == 0 In Threshold calculation ,If == 1 Final pass -@param cur_totnum_tp The total number of tile parts in the current tile -@return Returns true if an error is detected -*/ -opj_bool pi_create_encode(opj_pi_iterator_t *pi, opj_cp_t *cp, int tileno, - int pino, int tpnum, int tppos, J2K_T2_MODE t2_mode, int cur_totnum_tp); -/** -Create a packet iterator for Decoder -@param image Raw image for which the packets will be listed -@param cp Coding parameters -@param tileno Number that identifies the tile for which to list the packets -@return Returns a packet iterator that points to the first packet of the tile -@see pi_destroy -*/ -opj_pi_iterator_t *pi_create_decode(opj_image_t * image, opj_cp_t * cp, - int tileno); - -/** -Destroy a packet iterator -@param pi Previously created packet iterator -@param cp Coding parameters -@param tileno Number that identifies the tile for which the packets were listed -@see pi_create -*/ -void pi_destroy(opj_pi_iterator_t *pi, opj_cp_t *cp, int tileno); - -/** -Modify the packet iterator to point to the next packet -@param pi Packet iterator to modify -@return Returns false if pi pointed to the last packet or else returns true -*/ -opj_bool pi_next(opj_pi_iterator_t * pi); -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __PI_H */ diff --git a/src/lib/openmj2/raw.c b/src/lib/openmj2/raw.c deleted file mode 100644 index 3e94d2be..00000000 --- a/src/lib/openmj2/raw.c +++ /dev/null @@ -1,98 +0,0 @@ -/* - * 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 - * Copyright (c) 2003-2014, Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include "opj_includes.h" - -/* -========================================================== - local functions -========================================================== -*/ - - -/* -========================================================== - RAW encoding interface -========================================================== -*/ - -opj_raw_t* raw_create(void) -{ - opj_raw_t *raw = (opj_raw_t*)opj_malloc(sizeof(opj_raw_t)); - return raw; -} - -void raw_destroy(opj_raw_t *raw) -{ - if (raw) { - opj_free(raw); - } -} - -int raw_numbytes(opj_raw_t *raw) -{ - return raw->bp - raw->start; -} - -void raw_init_dec(opj_raw_t *raw, unsigned char *bp, int len) -{ - raw->start = bp; - raw->lenmax = len; - raw->len = 0; - raw->c = 0; - raw->ct = 0; -} - -int raw_decode(opj_raw_t *raw) -{ - int d; - if (raw->ct == 0) { - raw->ct = 8; - if (raw->len == raw->lenmax) { - raw->c = 0xff; - } else { - if (raw->c == 0xff) { - raw->ct = 7; - } - raw->c = *(raw->start + raw->len); - raw->len++; - } - } - raw->ct--; - d = (raw->c >> raw->ct) & 0x01; - - return d; -} - diff --git a/src/lib/openmj2/raw.h b/src/lib/openmj2/raw.h deleted file mode 100644 index 51655040..00000000 --- a/src/lib/openmj2/raw.h +++ /dev/null @@ -1,106 +0,0 @@ -/* - * 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 - * 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 __RAW_H -#define __RAW_H -/** -@file raw.h -@brief Implementation of operations for raw encoding (RAW) - -The functions in RAW.C have for goal to realize the operation of raw encoding linked -with the corresponding mode switch. -*/ - -/** @defgroup RAW RAW - Implementation of operations for raw encoding */ -/*@{*/ - -/** -RAW encoding operations -*/ -typedef struct opj_raw { - /** temporary buffer where bits are coded or decoded */ - unsigned char c; - /** number of bits already read or free to write */ - unsigned int ct; - /** maximum length to decode */ - unsigned int lenmax; - /** length decoded */ - unsigned int len; - /** pointer to the current position in the buffer */ - unsigned char *bp; - /** pointer to the start of the buffer */ - unsigned char *start; - /** pointer to the end of the buffer */ - unsigned char *end; -} opj_raw_t; - -/** @name Exported functions */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Create a new RAW handle -@return Returns a new RAW handle if successful, returns NULL otherwise -*/ -opj_raw_t* raw_create(void); -/** -Destroy a previously created RAW handle -@param raw RAW handle to destroy -*/ -void raw_destroy(opj_raw_t *raw); -/** -Return the number of bytes written/read since initialisation -@param raw RAW handle to destroy -@return Returns the number of bytes already encoded -*/ -int raw_numbytes(opj_raw_t *raw); -/** -Initialize the decoder -@param raw RAW handle -@param bp Pointer to the start of the buffer from which the bytes will be read -@param len Length of the input buffer -*/ -void raw_init_dec(opj_raw_t *raw, unsigned char *bp, int len); -/** -Decode a symbol using raw-decoder. Cfr p.506 TAUBMAN -@param raw RAW handle -@return Returns the decoded symbol (0 or 1) -*/ -int raw_decode(opj_raw_t *raw); -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __RAW_H */ diff --git a/src/lib/openmj2/t1.c b/src/lib/openmj2/t1.c deleted file mode 100644 index ad9e5416..00000000 --- a/src/lib/openmj2/t1.c +++ /dev/null @@ -1,1628 +0,0 @@ -/* - * 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) 2007, Callum Lerwick - * 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_includes.h" -#include "t1_luts.h" - -/** @defgroup T1 T1 - Implementation of the tier-1 coding */ -/*@{*/ - -/** @name Local static functions */ -/*@{*/ - -static INLINE char t1_getctxno_zc(int f, int orient); -static char t1_getctxno_sc(int f); -static INLINE int t1_getctxno_mag(int f); -static char t1_getspb(int f); -static short t1_getnmsedec_sig(int x, int bitpos); -static short t1_getnmsedec_ref(int x, int bitpos); -static void t1_updateflags(flag_t *flagsp, int s, int stride); -/** -Encode significant pass -*/ -static void t1_enc_sigpass_step( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int orient, - int bpno, - int one, - int *nmsedec, - char type, - int vsc); -/** -Decode significant pass -*/ -static INLINE void t1_dec_sigpass_step_raw( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int orient, - int oneplushalf, - int vsc); -static INLINE void t1_dec_sigpass_step_mqc( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int orient, - int oneplushalf); -static INLINE void t1_dec_sigpass_step_mqc_vsc( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int orient, - int oneplushalf, - int vsc); -/** -Encode significant pass -*/ -static void t1_enc_sigpass( - opj_t1_t *t1, - int bpno, - int orient, - int *nmsedec, - char type, - int cblksty); -/** -Decode significant pass -*/ -static void t1_dec_sigpass_raw( - opj_t1_t *t1, - int bpno, - int orient, - int cblksty); -static void t1_dec_sigpass_mqc( - opj_t1_t *t1, - int bpno, - int orient); -static void t1_dec_sigpass_mqc_vsc( - opj_t1_t *t1, - int bpno, - int orient); -/** -Encode refinement pass -*/ -static void t1_enc_refpass_step( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int bpno, - int one, - int *nmsedec, - char type, - int vsc); -/** -Decode refinement pass -*/ -static INLINE void t1_dec_refpass_step_raw( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int poshalf, - int neghalf, - int vsc); -static INLINE void t1_dec_refpass_step_mqc( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int poshalf, - int neghalf); -static INLINE void t1_dec_refpass_step_mqc_vsc( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int poshalf, - int neghalf, - int vsc); - -/** -Encode refinement pass -*/ -static void t1_enc_refpass( - opj_t1_t *t1, - int bpno, - int *nmsedec, - char type, - int cblksty); -/** -Decode refinement pass -*/ -static void t1_dec_refpass_raw( - opj_t1_t *t1, - int bpno, - int cblksty); -static void t1_dec_refpass_mqc( - opj_t1_t *t1, - int bpno); -static void t1_dec_refpass_mqc_vsc( - opj_t1_t *t1, - int bpno); -/** -Encode clean-up pass -*/ -static void t1_enc_clnpass_step( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int orient, - int bpno, - int one, - int *nmsedec, - int partial, - int vsc); -/** -Decode clean-up pass -*/ -static void t1_dec_clnpass_step_partial( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int orient, - int oneplushalf); -static void t1_dec_clnpass_step( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int orient, - int oneplushalf); -static void t1_dec_clnpass_step_vsc( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int orient, - int oneplushalf, - int partial, - int vsc); -/** -Encode clean-up pass -*/ -static void t1_enc_clnpass( - opj_t1_t *t1, - int bpno, - int orient, - int *nmsedec, - int cblksty); -/** -Decode clean-up pass -*/ -static void t1_dec_clnpass( - opj_t1_t *t1, - int bpno, - int orient, - int cblksty); -static double t1_getwmsedec( - int nmsedec, - int compno, - int level, - int orient, - int bpno, - int qmfbid, - double stepsize, - int numcomps, - int mct); -/** -Encode 1 code-block -@param t1 T1 handle -@param cblk Code-block coding parameters -@param orient -@param compno Component number -@param level -@param qmfbid -@param stepsize -@param cblksty Code-block style -@param numcomps -@param mct -@param tile -*/ -static void t1_encode_cblk( - opj_t1_t *t1, - opj_tcd_cblk_enc_t* cblk, - int orient, - int compno, - int level, - int qmfbid, - double stepsize, - int cblksty, - int numcomps, - int mct, - opj_tcd_tile_t * tile); -/** -Decode 1 code-block -@param t1 T1 handle -@param cblk Code-block coding parameters -@param orient -@param roishift Region of interest shifting value -@param cblksty Code-block style -*/ -static void t1_decode_cblk( - opj_t1_t *t1, - opj_tcd_cblk_dec_t* cblk, - int orient, - int roishift, - int cblksty); - -/*@}*/ - -/*@}*/ - -/* ----------------------------------------------------------------------- */ - -static char t1_getctxno_zc(int f, int orient) -{ - return lut_ctxno_zc[(orient << 8) | (f & T1_SIG_OTH)]; -} - -static char t1_getctxno_sc(int f) -{ - return lut_ctxno_sc[(f & (T1_SIG_PRIM | T1_SGN)) >> 4]; -} - -static int t1_getctxno_mag(int f) -{ - int tmp1 = (f & T1_SIG_OTH) ? T1_CTXNO_MAG + 1 : T1_CTXNO_MAG; - int tmp2 = (f & T1_REFINE) ? T1_CTXNO_MAG + 2 : tmp1; - return (tmp2); -} - -static char t1_getspb(int f) -{ - return lut_spb[(f & (T1_SIG_PRIM | T1_SGN)) >> 4]; -} - -static short t1_getnmsedec_sig(int x, int bitpos) -{ - if (bitpos > T1_NMSEDEC_FRACBITS) { - return lut_nmsedec_sig[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & (( - 1 << T1_NMSEDEC_BITS) - 1)]; - } - - return lut_nmsedec_sig0[x & ((1 << T1_NMSEDEC_BITS) - 1)]; -} - -static short t1_getnmsedec_ref(int x, int bitpos) -{ - if (bitpos > T1_NMSEDEC_FRACBITS) { - return lut_nmsedec_ref[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & (( - 1 << T1_NMSEDEC_BITS) - 1)]; - } - - return lut_nmsedec_ref0[x & ((1 << T1_NMSEDEC_BITS) - 1)]; -} - -static void t1_updateflags(flag_t *flagsp, int s, int stride) -{ - flag_t *np = flagsp - stride; - flag_t *sp = flagsp + stride; - - static const flag_t mod[] = { - T1_SIG_S, T1_SIG_S | T1_SGN_S, - T1_SIG_E, T1_SIG_E | T1_SGN_E, - T1_SIG_W, T1_SIG_W | T1_SGN_W, - T1_SIG_N, T1_SIG_N | T1_SGN_N - }; - - np[-1] |= T1_SIG_SE; - np[0] |= mod[s]; - np[1] |= T1_SIG_SW; - - flagsp[-1] |= mod[s + 2]; - flagsp[0] |= T1_SIG; - flagsp[1] |= mod[s + 4]; - - sp[-1] |= T1_SIG_NE; - sp[0] |= mod[s + 6]; - sp[1] |= T1_SIG_NW; -} - -static void t1_enc_sigpass_step( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int orient, - int bpno, - int one, - int *nmsedec, - char type, - int vsc) -{ - int v, flag; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : - (*flagsp); - if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) { - v = int_abs(*datap) & one ? 1 : 0; - mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient)); /* ESSAI */ - if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */ - mqc_bypass_enc(mqc, v); - } else { - mqc_encode(mqc, v); - } - if (v) { - v = *datap < 0 ? 1 : 0; - *nmsedec += t1_getnmsedec_sig(int_abs(*datap), bpno + T1_NMSEDEC_FRACBITS); - mqc_setcurctx(mqc, t1_getctxno_sc(flag)); /* ESSAI */ - if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */ - mqc_bypass_enc(mqc, v); - } else { - mqc_encode(mqc, v ^ t1_getspb(flag)); - } - t1_updateflags(flagsp, v, t1->flags_stride); - } - *flagsp |= T1_VISIT; - } -} - -static INLINE void t1_dec_sigpass_step_raw( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int orient, - int oneplushalf, - int vsc) -{ - int v, flag; - opj_raw_t *raw = t1->raw; /* RAW component */ - - OPJ_ARG_NOT_USED(orient); - - flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : - (*flagsp); - if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) { - if (raw_decode(raw)) { - v = raw_decode(raw); /* ESSAI */ - *datap = v ? -oneplushalf : oneplushalf; - t1_updateflags(flagsp, v, t1->flags_stride); - } - *flagsp |= T1_VISIT; - } -} /* VSC and BYPASS by Antonin */ - -static INLINE void t1_dec_sigpass_step_mqc( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int orient, - int oneplushalf) -{ - int v, flag; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - flag = *flagsp; - if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) { - mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient)); - if (mqc_decode(mqc)) { - mqc_setcurctx(mqc, t1_getctxno_sc(flag)); - v = mqc_decode(mqc) ^ t1_getspb(flag); - *datap = v ? -oneplushalf : oneplushalf; - t1_updateflags(flagsp, v, t1->flags_stride); - } - *flagsp |= T1_VISIT; - } -} /* VSC and BYPASS by Antonin */ - -static INLINE void t1_dec_sigpass_step_mqc_vsc( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int orient, - int oneplushalf, - int vsc) -{ - int v, flag; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : - (*flagsp); - if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) { - mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient)); - if (mqc_decode(mqc)) { - mqc_setcurctx(mqc, t1_getctxno_sc(flag)); - v = mqc_decode(mqc) ^ t1_getspb(flag); - *datap = v ? -oneplushalf : oneplushalf; - t1_updateflags(flagsp, v, t1->flags_stride); - } - *flagsp |= T1_VISIT; - } -} /* VSC and BYPASS by Antonin */ - -static void t1_enc_sigpass( - opj_t1_t *t1, - int bpno, - int orient, - int *nmsedec, - char type, - int cblksty) -{ - int i, j, k, one, vsc; - *nmsedec = 0; - one = 1 << (bpno + T1_NMSEDEC_FRACBITS); - for (k = 0; k < t1->h; k += 4) { - for (i = 0; i < t1->w; ++i) { - for (j = k; j < k + 4 && j < t1->h; ++j) { - vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || - j == t1->h - 1)) ? 1 : 0; - t1_enc_sigpass_step( - t1, - &t1->flags[((j + 1) * t1->flags_stride) + i + 1], - &t1->data[(j * t1->w) + i], - orient, - bpno, - one, - nmsedec, - type, - vsc); - } - } - } -} - -static void t1_dec_sigpass_raw( - opj_t1_t *t1, - int bpno, - int orient, - int cblksty) -{ - int i, j, k, one, half, oneplushalf, vsc; - one = 1 << bpno; - half = one >> 1; - oneplushalf = one | half; - for (k = 0; k < t1->h; k += 4) { - for (i = 0; i < t1->w; ++i) { - for (j = k; j < k + 4 && j < t1->h; ++j) { - vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || - j == t1->h - 1)) ? 1 : 0; - t1_dec_sigpass_step_raw( - t1, - &t1->flags[((j + 1) * t1->flags_stride) + i + 1], - &t1->data[(j * t1->w) + i], - orient, - oneplushalf, - vsc); - } - } - } -} /* VSC and BYPASS by Antonin */ - -static void t1_dec_sigpass_mqc( - opj_t1_t *t1, - int bpno, - int orient) -{ - int i, j, k, one, half, oneplushalf; - int *data1 = t1->data; - flag_t *flags1 = &t1->flags[1]; - one = 1 << bpno; - half = one >> 1; - oneplushalf = one | half; - for (k = 0; k < (t1->h & ~3); k += 4) { - for (i = 0; i < t1->w; ++i) { - int *data2 = data1 + i; - flag_t *flags2 = flags1 + i; - flags2 += t1->flags_stride; - t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf); - data2 += t1->w; - flags2 += t1->flags_stride; - t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf); - data2 += t1->w; - flags2 += t1->flags_stride; - t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf); - data2 += t1->w; - flags2 += t1->flags_stride; - t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf); - data2 += t1->w; - } - data1 += t1->w << 2; - flags1 += t1->flags_stride << 2; - } - for (i = 0; i < t1->w; ++i) { - int *data2 = data1 + i; - flag_t *flags2 = flags1 + i; - for (j = k; j < t1->h; ++j) { - flags2 += t1->flags_stride; - t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf); - data2 += t1->w; - } - } -} /* VSC and BYPASS by Antonin */ - -static void t1_dec_sigpass_mqc_vsc( - opj_t1_t *t1, - int bpno, - int orient) -{ - int i, j, k, one, half, oneplushalf, vsc; - one = 1 << bpno; - half = one >> 1; - oneplushalf = one | half; - for (k = 0; k < t1->h; k += 4) { - for (i = 0; i < t1->w; ++i) { - for (j = k; j < k + 4 && j < t1->h; ++j) { - vsc = (j == k + 3 || j == t1->h - 1) ? 1 : 0; - t1_dec_sigpass_step_mqc_vsc( - t1, - &t1->flags[((j + 1) * t1->flags_stride) + i + 1], - &t1->data[(j * t1->w) + i], - orient, - oneplushalf, - vsc); - } - } - } -} /* VSC and BYPASS by Antonin */ - -static void t1_enc_refpass_step( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int bpno, - int one, - int *nmsedec, - char type, - int vsc) -{ - int v, flag; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : - (*flagsp); - if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) { - *nmsedec += t1_getnmsedec_ref(int_abs(*datap), bpno + T1_NMSEDEC_FRACBITS); - v = int_abs(*datap) & one ? 1 : 0; - mqc_setcurctx(mqc, t1_getctxno_mag(flag)); /* ESSAI */ - if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */ - mqc_bypass_enc(mqc, v); - } else { - mqc_encode(mqc, v); - } - *flagsp |= T1_REFINE; - } -} - -static INLINE void t1_dec_refpass_step_raw( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int poshalf, - int neghalf, - int vsc) -{ - int v, t, flag; - - opj_raw_t *raw = t1->raw; /* RAW component */ - - flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : - (*flagsp); - if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) { - v = raw_decode(raw); - t = v ? poshalf : neghalf; - *datap += *datap < 0 ? -t : t; - *flagsp |= T1_REFINE; - } -} /* VSC and BYPASS by Antonin */ - -static INLINE void t1_dec_refpass_step_mqc( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int poshalf, - int neghalf) -{ - int v, t, flag; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - flag = *flagsp; - if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) { - mqc_setcurctx(mqc, t1_getctxno_mag(flag)); /* ESSAI */ - v = mqc_decode(mqc); - t = v ? poshalf : neghalf; - *datap += *datap < 0 ? -t : t; - *flagsp |= T1_REFINE; - } -} /* VSC and BYPASS by Antonin */ - -static INLINE void t1_dec_refpass_step_mqc_vsc( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int poshalf, - int neghalf, - int vsc) -{ - int v, t, flag; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : - (*flagsp); - if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) { - mqc_setcurctx(mqc, t1_getctxno_mag(flag)); /* ESSAI */ - v = mqc_decode(mqc); - t = v ? poshalf : neghalf; - *datap += *datap < 0 ? -t : t; - *flagsp |= T1_REFINE; - } -} /* VSC and BYPASS by Antonin */ - -static void t1_enc_refpass( - opj_t1_t *t1, - int bpno, - int *nmsedec, - char type, - int cblksty) -{ - int i, j, k, one, vsc; - *nmsedec = 0; - one = 1 << (bpno + T1_NMSEDEC_FRACBITS); - for (k = 0; k < t1->h; k += 4) { - for (i = 0; i < t1->w; ++i) { - for (j = k; j < k + 4 && j < t1->h; ++j) { - vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || - j == t1->h - 1)) ? 1 : 0; - t1_enc_refpass_step( - t1, - &t1->flags[((j + 1) * t1->flags_stride) + i + 1], - &t1->data[(j * t1->w) + i], - bpno, - one, - nmsedec, - type, - vsc); - } - } - } -} - -static void t1_dec_refpass_raw( - opj_t1_t *t1, - int bpno, - int cblksty) -{ - int i, j, k, one, poshalf, neghalf; - int vsc; - one = 1 << bpno; - poshalf = one >> 1; - neghalf = bpno > 0 ? -poshalf : -1; - for (k = 0; k < t1->h; k += 4) { - for (i = 0; i < t1->w; ++i) { - for (j = k; j < k + 4 && j < t1->h; ++j) { - vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || - j == t1->h - 1)) ? 1 : 0; - t1_dec_refpass_step_raw( - t1, - &t1->flags[((j + 1) * t1->flags_stride) + i + 1], - &t1->data[(j * t1->w) + i], - poshalf, - neghalf, - vsc); - } - } - } -} /* VSC and BYPASS by Antonin */ - -static void t1_dec_refpass_mqc( - opj_t1_t *t1, - int bpno) -{ - int i, j, k, one, poshalf, neghalf; - int *data1 = t1->data; - flag_t *flags1 = &t1->flags[1]; - one = 1 << bpno; - poshalf = one >> 1; - neghalf = bpno > 0 ? -poshalf : -1; - for (k = 0; k < (t1->h & ~3); k += 4) { - for (i = 0; i < t1->w; ++i) { - int *data2 = data1 + i; - flag_t *flags2 = flags1 + i; - flags2 += t1->flags_stride; - t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf); - data2 += t1->w; - flags2 += t1->flags_stride; - t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf); - data2 += t1->w; - flags2 += t1->flags_stride; - t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf); - data2 += t1->w; - flags2 += t1->flags_stride; - t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf); - data2 += t1->w; - } - data1 += t1->w << 2; - flags1 += t1->flags_stride << 2; - } - for (i = 0; i < t1->w; ++i) { - int *data2 = data1 + i; - flag_t *flags2 = flags1 + i; - for (j = k; j < t1->h; ++j) { - flags2 += t1->flags_stride; - t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf); - data2 += t1->w; - } - } -} /* VSC and BYPASS by Antonin */ - -static void t1_dec_refpass_mqc_vsc( - opj_t1_t *t1, - int bpno) -{ - int i, j, k, one, poshalf, neghalf; - int vsc; - one = 1 << bpno; - poshalf = one >> 1; - neghalf = bpno > 0 ? -poshalf : -1; - for (k = 0; k < t1->h; k += 4) { - for (i = 0; i < t1->w; ++i) { - for (j = k; j < k + 4 && j < t1->h; ++j) { - vsc = ((j == k + 3 || j == t1->h - 1)) ? 1 : 0; - t1_dec_refpass_step_mqc_vsc( - t1, - &t1->flags[((j + 1) * t1->flags_stride) + i + 1], - &t1->data[(j * t1->w) + i], - poshalf, - neghalf, - vsc); - } - } - } -} /* VSC and BYPASS by Antonin */ - -static void t1_enc_clnpass_step( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int orient, - int bpno, - int one, - int *nmsedec, - int partial, - int vsc) -{ - int v, flag; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : - (*flagsp); - if (partial) { - goto LABEL_PARTIAL; - } - if (!(*flagsp & (T1_SIG | T1_VISIT))) { - mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient)); - v = int_abs(*datap) & one ? 1 : 0; - mqc_encode(mqc, v); - if (v) { -LABEL_PARTIAL: - *nmsedec += t1_getnmsedec_sig(int_abs(*datap), bpno + T1_NMSEDEC_FRACBITS); - mqc_setcurctx(mqc, t1_getctxno_sc(flag)); - v = *datap < 0 ? 1 : 0; - mqc_encode(mqc, v ^ t1_getspb(flag)); - t1_updateflags(flagsp, v, t1->flags_stride); - } - } - *flagsp &= ~T1_VISIT; -} - -static void t1_dec_clnpass_step_partial( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int orient, - int oneplushalf) -{ - int v, flag; - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - OPJ_ARG_NOT_USED(orient); - - flag = *flagsp; - mqc_setcurctx(mqc, t1_getctxno_sc(flag)); - v = mqc_decode(mqc) ^ t1_getspb(flag); - *datap = v ? -oneplushalf : oneplushalf; - t1_updateflags(flagsp, v, t1->flags_stride); - *flagsp &= ~T1_VISIT; -} /* VSC and BYPASS by Antonin */ - -static void t1_dec_clnpass_step( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int orient, - int oneplushalf) -{ - int v, flag; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - flag = *flagsp; - if (!(flag & (T1_SIG | T1_VISIT))) { - mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient)); - if (mqc_decode(mqc)) { - mqc_setcurctx(mqc, t1_getctxno_sc(flag)); - v = mqc_decode(mqc) ^ t1_getspb(flag); - *datap = v ? -oneplushalf : oneplushalf; - t1_updateflags(flagsp, v, t1->flags_stride); - } - } - *flagsp &= ~T1_VISIT; -} /* VSC and BYPASS by Antonin */ - -static void t1_dec_clnpass_step_vsc( - opj_t1_t *t1, - flag_t *flagsp, - int *datap, - int orient, - int oneplushalf, - int partial, - int vsc) -{ - int v, flag; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : - (*flagsp); - if (partial) { - goto LABEL_PARTIAL; - } - if (!(flag & (T1_SIG | T1_VISIT))) { - mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient)); - if (mqc_decode(mqc)) { -LABEL_PARTIAL: - mqc_setcurctx(mqc, t1_getctxno_sc(flag)); - v = mqc_decode(mqc) ^ t1_getspb(flag); - *datap = v ? -oneplushalf : oneplushalf; - t1_updateflags(flagsp, v, t1->flags_stride); - } - } - *flagsp &= ~T1_VISIT; -} - -static void t1_enc_clnpass( - opj_t1_t *t1, - int bpno, - int orient, - int *nmsedec, - int cblksty) -{ - int i, j, k, one, agg, runlen, vsc; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - *nmsedec = 0; - one = 1 << (bpno + T1_NMSEDEC_FRACBITS); - for (k = 0; k < t1->h; k += 4) { - for (i = 0; i < t1->w; ++i) { - if (k + 3 < t1->h) { - if (cblksty & J2K_CCP_CBLKSTY_VSC) { - agg = !(MACRO_t1_flags(1 + k, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || MACRO_t1_flags(1 + k + 1, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || MACRO_t1_flags(1 + k + 2, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || (MACRO_t1_flags(1 + k + 3, 1 + i) - & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) & (T1_SIG | T1_VISIT | - T1_SIG_OTH)); - } else { - agg = !(MACRO_t1_flags(1 + k, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || MACRO_t1_flags(1 + k + 1, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || MACRO_t1_flags(1 + k + 2, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || MACRO_t1_flags(1 + k + 3, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)); - } - } else { - agg = 0; - } - if (agg) { - for (runlen = 0; runlen < 4; ++runlen) { - if (int_abs(t1->data[((k + runlen)*t1->w) + i]) & one) { - break; - } - } - mqc_setcurctx(mqc, T1_CTXNO_AGG); - mqc_encode(mqc, runlen != 4); - if (runlen == 4) { - continue; - } - mqc_setcurctx(mqc, T1_CTXNO_UNI); - mqc_encode(mqc, runlen >> 1); - mqc_encode(mqc, runlen & 1); - } else { - runlen = 0; - } - for (j = k + runlen; j < k + 4 && j < t1->h; ++j) { - vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || - j == t1->h - 1)) ? 1 : 0; - t1_enc_clnpass_step( - t1, - &t1->flags[((j + 1) * t1->flags_stride) + i + 1], - &t1->data[(j * t1->w) + i], - orient, - bpno, - one, - nmsedec, - agg && (j == k + runlen), - vsc); - } - } - } -} - -static void t1_dec_clnpass( - opj_t1_t *t1, - int bpno, - int orient, - int cblksty) -{ - int i, j, k, one, half, oneplushalf, agg, runlen, vsc; - int segsym = cblksty & J2K_CCP_CBLKSTY_SEGSYM; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - one = 1 << bpno; - half = one >> 1; - oneplushalf = one | half; - if (cblksty & J2K_CCP_CBLKSTY_VSC) { - for (k = 0; k < t1->h; k += 4) { - for (i = 0; i < t1->w; ++i) { - if (k + 3 < t1->h) { - agg = !(MACRO_t1_flags(1 + k, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || MACRO_t1_flags(1 + k + 1, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || MACRO_t1_flags(1 + k + 2, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || (MACRO_t1_flags(1 + k + 3, 1 + i) - & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) & (T1_SIG | T1_VISIT | - T1_SIG_OTH)); - } else { - agg = 0; - } - if (agg) { - mqc_setcurctx(mqc, T1_CTXNO_AGG); - if (!mqc_decode(mqc)) { - continue; - } - mqc_setcurctx(mqc, T1_CTXNO_UNI); - runlen = mqc_decode(mqc); - runlen = (runlen << 1) | mqc_decode(mqc); - } else { - runlen = 0; - } - for (j = k + runlen; j < k + 4 && j < t1->h; ++j) { - vsc = (j == k + 3 || j == t1->h - 1) ? 1 : 0; - t1_dec_clnpass_step_vsc( - t1, - &t1->flags[((j + 1) * t1->flags_stride) + i + 1], - &t1->data[(j * t1->w) + i], - orient, - oneplushalf, - agg && (j == k + runlen), - vsc); - } - } - } - } else { - int *data1 = t1->data; - flag_t *flags1 = &t1->flags[1]; - for (k = 0; k < (t1->h & ~3); k += 4) { - for (i = 0; i < t1->w; ++i) { - int *data2 = data1 + i; - flag_t *flags2 = flags1 + i; - agg = !(MACRO_t1_flags(1 + k, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || MACRO_t1_flags(1 + k + 1, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || MACRO_t1_flags(1 + k + 2, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH) - || MACRO_t1_flags(1 + k + 3, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)); - if (agg) { - mqc_setcurctx(mqc, T1_CTXNO_AGG); - if (!mqc_decode(mqc)) { - continue; - } - mqc_setcurctx(mqc, T1_CTXNO_UNI); - runlen = mqc_decode(mqc); - runlen = (runlen << 1) | mqc_decode(mqc); - flags2 += runlen * t1->flags_stride; - data2 += runlen * t1->w; - for (j = k + runlen; j < k + 4 && j < t1->h; ++j) { - flags2 += t1->flags_stride; - if (agg && (j == k + runlen)) { - t1_dec_clnpass_step_partial(t1, flags2, data2, orient, oneplushalf); - } else { - t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf); - } - data2 += t1->w; - } - } else { - flags2 += t1->flags_stride; - t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf); - data2 += t1->w; - flags2 += t1->flags_stride; - t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf); - data2 += t1->w; - flags2 += t1->flags_stride; - t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf); - data2 += t1->w; - flags2 += t1->flags_stride; - t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf); - data2 += t1->w; - } - } - data1 += t1->w << 2; - flags1 += t1->flags_stride << 2; - } - for (i = 0; i < t1->w; ++i) { - int *data2 = data1 + i; - flag_t *flags2 = flags1 + i; - for (j = k; j < t1->h; ++j) { - flags2 += t1->flags_stride; - t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf); - data2 += t1->w; - } - } - } - - if (segsym) { - int v = 0; - mqc_setcurctx(mqc, T1_CTXNO_UNI); - v = mqc_decode(mqc); - v = (v << 1) | mqc_decode(mqc); - v = (v << 1) | mqc_decode(mqc); - v = (v << 1) | mqc_decode(mqc); - /* - if (v!=0xa) { - opj_event_msg(t1->cinfo, EVT_WARNING, "Bad segmentation symbol %x\n", v); - } - */ - } -} /* VSC and BYPASS by Antonin */ - - -/** mod fixed_quality */ -static double t1_getwmsedec( - int nmsedec, - int compno, - int level, - int orient, - int bpno, - int qmfbid, - double stepsize, - int numcomps, - int mct) -{ - double w1, w2, wmsedec; - if (qmfbid == 1) { - w1 = (mct && numcomps == 3) ? mct_getnorm(compno) : 1.0; - w2 = dwt_getnorm(level, orient); - } else { /* if (qmfbid == 0) */ - w1 = (mct && numcomps == 3) ? mct_getnorm_real(compno) : 1.0; - w2 = dwt_getnorm_real(level, orient); - } - wmsedec = w1 * w2 * stepsize * (1 << bpno); - wmsedec *= wmsedec * nmsedec / 8192.0; - - return wmsedec; -} - -static opj_bool allocate_buffers( - opj_t1_t *t1, - int w, - int h) -{ - int datasize = w * h; - int flagssize; - - if (datasize > t1->datasize) { - opj_aligned_free(t1->data); - t1->data = (int*) opj_aligned_malloc(datasize * sizeof(int)); - if (!t1->data) { - return OPJ_FALSE; - } - t1->datasize = datasize; - } - memset(t1->data, 0, datasize * sizeof(int)); - - t1->flags_stride = w + 2; - flagssize = t1->flags_stride * (h + 2); - - if (flagssize > t1->flagssize) { - opj_aligned_free(t1->flags); - t1->flags = (flag_t*) opj_aligned_malloc(flagssize * sizeof(flag_t)); - if (!t1->flags) { - return OPJ_FALSE; - } - t1->flagssize = flagssize; - } - memset(t1->flags, 0, flagssize * sizeof(flag_t)); - - t1->w = w; - t1->h = h; - - return OPJ_TRUE; -} - -/** mod fixed_quality */ -static void t1_encode_cblk( - opj_t1_t *t1, - opj_tcd_cblk_enc_t* cblk, - int orient, - int compno, - int level, - int qmfbid, - double stepsize, - int cblksty, - int numcomps, - int mct, - opj_tcd_tile_t * tile) -{ - double cumwmsedec = 0.0; - - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - int passno, bpno, passtype; - int nmsedec = 0; - int i, max; - char type = T1_TYPE_MQ; - double tempwmsedec; - - max = 0; - for (i = 0; i < t1->w * t1->h; ++i) { - int tmp = abs(t1->data[i]); - max = int_max(max, tmp); - } - - cblk->numbps = max ? (int_floorlog2(max) + 1) - T1_NMSEDEC_FRACBITS : 0; - - bpno = cblk->numbps - 1; - passtype = 2; - - mqc_resetstates(mqc); - mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46); - mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3); - mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4); - mqc_init_enc(mqc, cblk->data); - - for (passno = 0; bpno >= 0; ++passno) { - opj_tcd_pass_t *pass = &cblk->passes[passno]; - int correction = 3; - type = ((bpno < (cblk->numbps - 4)) && (passtype < 2) && - (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ; - - switch (passtype) { - case 0: - t1_enc_sigpass(t1, bpno, orient, &nmsedec, type, cblksty); - break; - case 1: - t1_enc_refpass(t1, bpno, &nmsedec, type, cblksty); - break; - case 2: - t1_enc_clnpass(t1, bpno, orient, &nmsedec, cblksty); - /* code switch SEGMARK (i.e. SEGSYM) */ - if (cblksty & J2K_CCP_CBLKSTY_SEGSYM) { - mqc_segmark_enc(mqc); - } - break; - } - - /* fixed_quality */ - tempwmsedec = t1_getwmsedec(nmsedec, compno, level, orient, bpno, qmfbid, - stepsize, numcomps, mct); - cumwmsedec += tempwmsedec; - tile->distotile += tempwmsedec; - - /* Code switch "RESTART" (i.e. TERMALL) */ - if ((cblksty & J2K_CCP_CBLKSTY_TERMALL) && !((passtype == 2) && - (bpno - 1 < 0))) { - if (type == T1_TYPE_RAW) { - mqc_flush(mqc); - correction = 1; - /* correction = mqc_bypass_flush_enc(); */ - } else { /* correction = mqc_restart_enc(); */ - mqc_flush(mqc); - correction = 1; - } - pass->term = 1; - } else { - if (((bpno < (cblk->numbps - 4) && (passtype > 0)) - || ((bpno == (cblk->numbps - 4)) && (passtype == 2))) && - (cblksty & J2K_CCP_CBLKSTY_LAZY)) { - if (type == T1_TYPE_RAW) { - mqc_flush(mqc); - correction = 1; - /* correction = mqc_bypass_flush_enc(); */ - } else { /* correction = mqc_restart_enc(); */ - mqc_flush(mqc); - correction = 1; - } - pass->term = 1; - } else { - pass->term = 0; - } - } - - if (++passtype == 3) { - passtype = 0; - bpno--; - } - - if (pass->term && bpno > 0) { - type = ((bpno < (cblk->numbps - 4)) && (passtype < 2) && - (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ; - if (type == T1_TYPE_RAW) { - mqc_bypass_init_enc(mqc); - } else { - mqc_restart_init_enc(mqc); - } - } - - pass->distortiondec = cumwmsedec; - pass->rate = mqc_numbytes(mqc) + correction; /* FIXME */ - - /* Code-switch "RESET" */ - if (cblksty & J2K_CCP_CBLKSTY_RESET) { - mqc_reset_enc(mqc); - } - } - - /* Code switch "ERTERM" (i.e. PTERM) */ - if (cblksty & J2K_CCP_CBLKSTY_PTERM) { - mqc_erterm_enc(mqc); - } else /* Default coding */ if (!(cblksty & J2K_CCP_CBLKSTY_LAZY)) { - mqc_flush(mqc); - } - - cblk->totalpasses = passno; - - for (passno = 0; passno < cblk->totalpasses; passno++) { - opj_tcd_pass_t *pass = &cblk->passes[passno]; - if (pass->rate > mqc_numbytes(mqc)) { - pass->rate = mqc_numbytes(mqc); - } - /*Preventing generation of FF as last data byte of a pass*/ - if ((pass->rate > 1) && (cblk->data[pass->rate - 1] == 0xFF)) { - pass->rate--; - } - pass->len = pass->rate - (passno == 0 ? 0 : cblk->passes[passno - 1].rate); - } -} - -static void t1_decode_cblk( - opj_t1_t *t1, - opj_tcd_cblk_dec_t* cblk, - int orient, - int roishift, - int cblksty) -{ - opj_raw_t *raw = t1->raw; /* RAW component */ - opj_mqc_t *mqc = t1->mqc; /* MQC component */ - - int bpno, passtype; - int segno, passno; - char type = T1_TYPE_MQ; /* BYPASS mode */ - - if (!allocate_buffers( - t1, - cblk->x1 - cblk->x0, - cblk->y1 - cblk->y0)) { - return; - } - - bpno = roishift + cblk->numbps - 1; - passtype = 2; - - mqc_resetstates(mqc); - mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46); - mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3); - mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4); - - for (segno = 0; segno < cblk->numsegs; ++segno) { - opj_tcd_seg_t *seg = &cblk->segs[segno]; - - /* BYPASS mode */ - type = ((bpno <= (cblk->numbps - 1) - 4) && (passtype < 2) && - (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ; - /* FIXME: slviewer gets here with a null pointer. Why? Partially downloaded and/or corrupt textures? */ - if (seg->data == NULL) { - continue; - } - if (type == T1_TYPE_RAW) { - raw_init_dec(raw, (*seg->data) + seg->dataindex, seg->len); - } else { - mqc_init_dec(mqc, (*seg->data) + seg->dataindex, seg->len); - } - - for (passno = 0; passno < seg->numpasses; ++passno) { - switch (passtype) { - case 0: - if (type == T1_TYPE_RAW) { - t1_dec_sigpass_raw(t1, bpno + 1, orient, cblksty); - } else { - if (cblksty & J2K_CCP_CBLKSTY_VSC) { - t1_dec_sigpass_mqc_vsc(t1, bpno + 1, orient); - } else { - t1_dec_sigpass_mqc(t1, bpno + 1, orient); - } - } - break; - case 1: - if (type == T1_TYPE_RAW) { - t1_dec_refpass_raw(t1, bpno + 1, cblksty); - } else { - if (cblksty & J2K_CCP_CBLKSTY_VSC) { - t1_dec_refpass_mqc_vsc(t1, bpno + 1); - } else { - t1_dec_refpass_mqc(t1, bpno + 1); - } - } - break; - case 2: - t1_dec_clnpass(t1, bpno + 1, orient, cblksty); - break; - } - - if ((cblksty & J2K_CCP_CBLKSTY_RESET) && type == T1_TYPE_MQ) { - mqc_resetstates(mqc); - mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46); - mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3); - mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4); - } - if (++passtype == 3) { - passtype = 0; - bpno--; - } - } - } -} - -/* ----------------------------------------------------------------------- */ - -opj_t1_t* t1_create(opj_common_ptr cinfo) -{ - opj_t1_t *t1 = (opj_t1_t*) opj_malloc(sizeof(opj_t1_t)); - if (!t1) { - return NULL; - } - - t1->cinfo = cinfo; - /* create MQC and RAW handles */ - t1->mqc = mqc_create(); - t1->raw = raw_create(); - - t1->data = NULL; - t1->flags = NULL; - t1->datasize = 0; - t1->flagssize = 0; - - return t1; -} - -void t1_destroy(opj_t1_t *t1) -{ - if (t1) { - /* destroy MQC and RAW handles */ - mqc_destroy(t1->mqc); - raw_destroy(t1->raw); - opj_aligned_free(t1->data); - opj_aligned_free(t1->flags); - opj_free(t1); - } -} - -void t1_encode_cblks( - opj_t1_t *t1, - opj_tcd_tile_t *tile, - opj_tcp_t *tcp) -{ - int compno, resno, bandno, precno, cblkno; - - tile->distotile = 0; /* fixed_quality */ - - for (compno = 0; compno < tile->numcomps; ++compno) { - opj_tcd_tilecomp_t* tilec = &tile->comps[compno]; - opj_tccp_t* tccp = &tcp->tccps[compno]; - int tile_w = tilec->x1 - tilec->x0; - - for (resno = 0; resno < tilec->numresolutions; ++resno) { - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - - for (bandno = 0; bandno < res->numbands; ++bandno) { - opj_tcd_band_t* restrict band = &res->bands[bandno]; - int bandconst = 8192 * 8192 / ((int) floor(band->stepsize * 8192)); - - for (precno = 0; precno < res->pw * res->ph; ++precno) { - opj_tcd_precinct_t *prc = &band->precincts[precno]; - - for (cblkno = 0; cblkno < prc->cw * prc->ch; ++cblkno) { - opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno]; - int* restrict datap; - int* restrict tiledp; - int cblk_w; - int cblk_h; - int i, j; - - int x = cblk->x0 - band->x0; - int y = cblk->y0 - band->y0; - if (band->bandno & 1) { - opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - x += pres->x1 - pres->x0; - } - if (band->bandno & 2) { - opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1]; - y += pres->y1 - pres->y0; - } - - if (!allocate_buffers( - t1, - cblk->x1 - cblk->x0, - cblk->y1 - cblk->y0)) { - return; - } - - datap = t1->data; - cblk_w = t1->w; - cblk_h = t1->h; - - tiledp = &tilec->data[(y * tile_w) + x]; - if (tccp->qmfbid == 1) { - for (j = 0; j < cblk_h; ++j) { - for (i = 0; i < cblk_w; ++i) { - int tmp = tiledp[(j * tile_w) + i]; - datap[(j * cblk_w) + i] = tmp << T1_NMSEDEC_FRACBITS; - } - } - } else { /* if (tccp->qmfbid == 0) */ - for (j = 0; j < cblk_h; ++j) { - for (i = 0; i < cblk_w; ++i) { - int tmp = tiledp[(j * tile_w) + i]; - datap[(j * cblk_w) + i] = - fix_mul( - tmp, - bandconst) >> (11 - T1_NMSEDEC_FRACBITS); - } - } - } - - t1_encode_cblk( - t1, - cblk, - band->bandno, - compno, - tilec->numresolutions - 1 - resno, - tccp->qmfbid, - band->stepsize, - tccp->cblksty, - tile->numcomps, - tcp->mct, - tile); - - } /* cblkno */ - } /* precno */ - } /* bandno */ - } /* resno */ - } /* compno */ -} - -void t1_decode_cblks( - opj_t1_t* t1, - opj_tcd_tilecomp_t* tilec, - opj_tccp_t* tccp) -{ - int resno, bandno, precno, cblkno; - - int tile_w = tilec->x1 - tilec->x0; - - for (resno = 0; resno < tilec->numresolutions; ++resno) { - opj_tcd_resolution_t* res = &tilec->resolutions[resno]; - - for (bandno = 0; bandno < res->numbands; ++bandno) { - opj_tcd_band_t* restrict band = &res->bands[bandno]; - - for (precno = 0; precno < res->pw * res->ph; ++precno) { - opj_tcd_precinct_t* precinct = &band->precincts[precno]; - - for (cblkno = 0; cblkno < precinct->cw * precinct->ch; ++cblkno) { - opj_tcd_cblk_dec_t* cblk = &precinct->cblks.dec[cblkno]; - int* restrict datap; - int cblk_w, cblk_h; - int x, y; - int i, j; - - t1_decode_cblk( - t1, - cblk, - band->bandno, - tccp->roishift, - tccp->cblksty); - - x = cblk->x0 - band->x0; - y = cblk->y0 - band->y0; - if (band->bandno & 1) { - opj_tcd_resolution_t* pres = &tilec->resolutions[resno - 1]; - x += pres->x1 - pres->x0; - } - if (band->bandno & 2) { - opj_tcd_resolution_t* pres = &tilec->resolutions[resno - 1]; - y += pres->y1 - pres->y0; - } - - datap = t1->data; - cblk_w = t1->w; - cblk_h = t1->h; - - if (tccp->roishift) { - int thresh = 1 << tccp->roishift; - for (j = 0; j < cblk_h; ++j) { - for (i = 0; i < cblk_w; ++i) { - int val = datap[(j * cblk_w) + i]; - int mag = abs(val); - if (mag >= thresh) { - mag >>= tccp->roishift; - datap[(j * cblk_w) + i] = val < 0 ? -mag : mag; - } - } - } - } - - if (tccp->qmfbid == 1) { - int* restrict tiledp = &tilec->data[(y * tile_w) + x]; - for (j = 0; j < cblk_h; ++j) { - for (i = 0; i < cblk_w; ++i) { - int tmp = datap[(j * cblk_w) + i]; - ((int*)tiledp)[(j * tile_w) + i] = tmp / 2; - } - } - } else { /* if (tccp->qmfbid == 0) */ - float* restrict tiledp = (float*) &tilec->data[(y * tile_w) + x]; - for (j = 0; j < cblk_h; ++j) { - float* restrict tiledp2 = tiledp; - for (i = 0; i < cblk_w; ++i) { - float tmp = *datap * band->stepsize; - *tiledp2 = tmp; - datap++; - tiledp2++; - } - tiledp += tile_w; - } - } - opj_free(cblk->data); - opj_free(cblk->segs); - } /* cblkno */ - opj_free(precinct->cblks.dec); - precinct->cblks.dec = NULL; - } /* precno */ - } /* bandno */ - } /* resno */ -} - diff --git a/src/lib/openmj2/t1.h b/src/lib/openmj2/t1.h deleted file mode 100644 index 79185855..00000000 --- a/src/lib/openmj2/t1.h +++ /dev/null @@ -1,153 +0,0 @@ -/* - * 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 __T1_H -#define __T1_H -/** -@file t1.h -@brief Implementation of the tier-1 coding (coding of code-block coefficients) (T1) - -The functions in T1.C have for goal to realize the tier-1 coding operation. The functions -in T1.C are used by some function in TCD.C. -*/ - -/** @defgroup T1 T1 - Implementation of the tier-1 coding */ -/*@{*/ - -/* ----------------------------------------------------------------------- */ -#define T1_NMSEDEC_BITS 7 - -#define T1_SIG_NE 0x0001 /**< Context orientation : North-East direction */ -#define T1_SIG_SE 0x0002 /**< Context orientation : South-East direction */ -#define T1_SIG_SW 0x0004 /**< Context orientation : South-West direction */ -#define T1_SIG_NW 0x0008 /**< Context orientation : North-West direction */ -#define T1_SIG_N 0x0010 /**< Context orientation : North direction */ -#define T1_SIG_E 0x0020 /**< Context orientation : East direction */ -#define T1_SIG_S 0x0040 /**< Context orientation : South direction */ -#define T1_SIG_W 0x0080 /**< Context orientation : West direction */ -#define T1_SIG_OTH (T1_SIG_N|T1_SIG_NE|T1_SIG_E|T1_SIG_SE|T1_SIG_S|T1_SIG_SW|T1_SIG_W|T1_SIG_NW) -#define T1_SIG_PRIM (T1_SIG_N|T1_SIG_E|T1_SIG_S|T1_SIG_W) - -#define T1_SGN_N 0x0100 -#define T1_SGN_E 0x0200 -#define T1_SGN_S 0x0400 -#define T1_SGN_W 0x0800 -#define T1_SGN (T1_SGN_N|T1_SGN_E|T1_SGN_S|T1_SGN_W) - -#define T1_SIG 0x1000 -#define T1_REFINE 0x2000 -#define T1_VISIT 0x4000 - -#define T1_NUMCTXS_ZC 9 -#define T1_NUMCTXS_SC 5 -#define T1_NUMCTXS_MAG 3 -#define T1_NUMCTXS_AGG 1 -#define T1_NUMCTXS_UNI 1 - -#define T1_CTXNO_ZC 0 -#define T1_CTXNO_SC (T1_CTXNO_ZC+T1_NUMCTXS_ZC) -#define T1_CTXNO_MAG (T1_CTXNO_SC+T1_NUMCTXS_SC) -#define T1_CTXNO_AGG (T1_CTXNO_MAG+T1_NUMCTXS_MAG) -#define T1_CTXNO_UNI (T1_CTXNO_AGG+T1_NUMCTXS_AGG) -#define T1_NUMCTXS (T1_CTXNO_UNI+T1_NUMCTXS_UNI) - -#define T1_NMSEDEC_FRACBITS (T1_NMSEDEC_BITS-1) - -#define T1_TYPE_MQ 0 /**< Normal coding using entropy coder */ -#define T1_TYPE_RAW 1 /**< No encoding the information is store under raw format in codestream (mode switch RAW)*/ - -/* ----------------------------------------------------------------------- */ - -typedef short flag_t; - -/** -Tier-1 coding (coding of code-block coefficients) -*/ -typedef struct opj_t1 { - /** codec context */ - opj_common_ptr cinfo; - - /** MQC component */ - opj_mqc_t *mqc; - /** RAW component */ - opj_raw_t *raw; - - int *data; - flag_t *flags; - int w; - int h; - int datasize; - int flagssize; - int flags_stride; -} opj_t1_t; - -#define MACRO_t1_flags(x,y) t1->flags[((x)*(t1->flags_stride))+(y)] - -/** @name Exported functions */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Create a new T1 handle -and initialize the look-up tables of the Tier-1 coder/decoder -@return Returns a new T1 handle if successful, returns NULL otherwise -@see t1_init_luts -*/ -opj_t1_t* t1_create(opj_common_ptr cinfo); -/** -Destroy a previously created T1 handle -@param t1 T1 handle to destroy -*/ -void t1_destroy(opj_t1_t *t1); -/** -Encode the code-blocks of a tile -@param t1 T1 handle -@param tile The tile to encode -@param tcp Tile coding parameters -*/ -void t1_encode_cblks(opj_t1_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp); -/** -Decode the code-blocks of a tile -@param t1 T1 handle -@param tilec The tile to decode -@param tccp Tile coding parameters -*/ -void t1_decode_cblks(opj_t1_t* t1, opj_tcd_tilecomp_t* tilec, opj_tccp_t* tccp); -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __T1_H */ diff --git a/src/lib/openmj2/t1_luts.h b/src/lib/openmj2/t1_luts.h deleted file mode 100644 index 278a594c..00000000 --- a/src/lib/openmj2/t1_luts.h +++ /dev/null @@ -1,143 +0,0 @@ -/* This file was automatically generated by t1_generate_luts.c */ - -static char lut_ctxno_zc[1024] = { - 0, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 0, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 0, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 0, 3, 3, 6, 3, 6, 6, 8, 3, 6, 6, 8, 6, 8, 8, 8, 1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, - 1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, - 1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, - 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, - 1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, - 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, - 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, - 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8 -}; - -static char lut_ctxno_sc[256] = { - 0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xd, 0xc, 0xd, 0xd, 0xd, 0xd, 0xd, - 0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xb, 0xc, 0xb, 0xd, 0xc, 0xd, 0xc, - 0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xd, 0x9, 0xa, 0xd, 0xd, 0xa, 0xa, - 0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xb, 0x9, 0xa, 0xd, 0xc, 0xa, 0x9, - 0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xd, 0xc, 0xd, 0xb, 0xc, 0xb, 0xc, - 0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xb, 0xc, 0xb, 0xb, 0xb, 0xb, 0xb, - 0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xd, 0x9, 0xa, 0xb, 0xc, 0xa, 0x9, - 0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xb, 0x9, 0xa, 0xb, 0xb, 0xa, 0xa, - 0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xb, 0x9, 0xa, 0xb, 0xb, 0xa, 0xa, - 0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xd, 0x9, 0xa, 0xb, 0xc, 0xa, 0x9, - 0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xb, 0xc, 0xb, 0xb, 0xb, 0xb, 0xb, - 0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xd, 0xc, 0xd, 0xb, 0xc, 0xb, 0xc, - 0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xb, 0x9, 0xa, 0xd, 0xc, 0xa, 0x9, - 0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xd, 0x9, 0xa, 0xd, 0xd, 0xa, 0xa, - 0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xb, 0xc, 0xb, 0xd, 0xc, 0xd, 0xc, - 0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xd, 0xc, 0xd, 0xd, 0xd, 0xd, 0xd -}; - -static char lut_spb[256] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, - 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, - 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 -}; - -static short lut_nmsedec_sig[1 << T1_NMSEDEC_BITS] = { - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0180, 0x0300, 0x0480, 0x0600, 0x0780, 0x0900, 0x0a80, - 0x0c00, 0x0d80, 0x0f00, 0x1080, 0x1200, 0x1380, 0x1500, 0x1680, - 0x1800, 0x1980, 0x1b00, 0x1c80, 0x1e00, 0x1f80, 0x2100, 0x2280, - 0x2400, 0x2580, 0x2700, 0x2880, 0x2a00, 0x2b80, 0x2d00, 0x2e80, - 0x3000, 0x3180, 0x3300, 0x3480, 0x3600, 0x3780, 0x3900, 0x3a80, - 0x3c00, 0x3d80, 0x3f00, 0x4080, 0x4200, 0x4380, 0x4500, 0x4680, - 0x4800, 0x4980, 0x4b00, 0x4c80, 0x4e00, 0x4f80, 0x5100, 0x5280, - 0x5400, 0x5580, 0x5700, 0x5880, 0x5a00, 0x5b80, 0x5d00, 0x5e80, - 0x6000, 0x6180, 0x6300, 0x6480, 0x6600, 0x6780, 0x6900, 0x6a80, - 0x6c00, 0x6d80, 0x6f00, 0x7080, 0x7200, 0x7380, 0x7500, 0x7680 -}; - -static short lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS] = { - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0080, - 0x0080, 0x0080, 0x0100, 0x0100, 0x0100, 0x0180, 0x0180, 0x0200, - 0x0200, 0x0280, 0x0280, 0x0300, 0x0300, 0x0380, 0x0400, 0x0400, - 0x0480, 0x0500, 0x0580, 0x0580, 0x0600, 0x0680, 0x0700, 0x0780, - 0x0800, 0x0880, 0x0900, 0x0980, 0x0a00, 0x0a80, 0x0b80, 0x0c00, - 0x0c80, 0x0d00, 0x0e00, 0x0e80, 0x0f00, 0x1000, 0x1080, 0x1180, - 0x1200, 0x1300, 0x1380, 0x1480, 0x1500, 0x1600, 0x1700, 0x1780, - 0x1880, 0x1980, 0x1a80, 0x1b00, 0x1c00, 0x1d00, 0x1e00, 0x1f00, - 0x2000, 0x2100, 0x2200, 0x2300, 0x2400, 0x2500, 0x2680, 0x2780, - 0x2880, 0x2980, 0x2b00, 0x2c00, 0x2d00, 0x2e80, 0x2f80, 0x3100, - 0x3200, 0x3380, 0x3480, 0x3600, 0x3700, 0x3880, 0x3a00, 0x3b00, - 0x3c80, 0x3e00, 0x3f80, 0x4080, 0x4200, 0x4380, 0x4500, 0x4680, - 0x4800, 0x4980, 0x4b00, 0x4c80, 0x4e00, 0x4f80, 0x5180, 0x5300, - 0x5480, 0x5600, 0x5800, 0x5980, 0x5b00, 0x5d00, 0x5e80, 0x6080, - 0x6200, 0x6400, 0x6580, 0x6780, 0x6900, 0x6b00, 0x6d00, 0x6e80, - 0x7080, 0x7280, 0x7480, 0x7600, 0x7800, 0x7a00, 0x7c00, 0x7e00 -}; - -static short lut_nmsedec_ref[1 << T1_NMSEDEC_BITS] = { - 0x1800, 0x1780, 0x1700, 0x1680, 0x1600, 0x1580, 0x1500, 0x1480, - 0x1400, 0x1380, 0x1300, 0x1280, 0x1200, 0x1180, 0x1100, 0x1080, - 0x1000, 0x0f80, 0x0f00, 0x0e80, 0x0e00, 0x0d80, 0x0d00, 0x0c80, - 0x0c00, 0x0b80, 0x0b00, 0x0a80, 0x0a00, 0x0980, 0x0900, 0x0880, - 0x0800, 0x0780, 0x0700, 0x0680, 0x0600, 0x0580, 0x0500, 0x0480, - 0x0400, 0x0380, 0x0300, 0x0280, 0x0200, 0x0180, 0x0100, 0x0080, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0080, 0x0100, 0x0180, 0x0200, 0x0280, 0x0300, 0x0380, - 0x0400, 0x0480, 0x0500, 0x0580, 0x0600, 0x0680, 0x0700, 0x0780, - 0x0800, 0x0880, 0x0900, 0x0980, 0x0a00, 0x0a80, 0x0b00, 0x0b80, - 0x0c00, 0x0c80, 0x0d00, 0x0d80, 0x0e00, 0x0e80, 0x0f00, 0x0f80, - 0x1000, 0x1080, 0x1100, 0x1180, 0x1200, 0x1280, 0x1300, 0x1380, - 0x1400, 0x1480, 0x1500, 0x1580, 0x1600, 0x1680, 0x1700, 0x1780 -}; - -static short lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS] = { - 0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00, 0x1b00, 0x1a80, 0x1980, - 0x1880, 0x1780, 0x1700, 0x1600, 0x1500, 0x1480, 0x1380, 0x1300, - 0x1200, 0x1180, 0x1080, 0x1000, 0x0f00, 0x0e80, 0x0e00, 0x0d00, - 0x0c80, 0x0c00, 0x0b80, 0x0a80, 0x0a00, 0x0980, 0x0900, 0x0880, - 0x0800, 0x0780, 0x0700, 0x0680, 0x0600, 0x0580, 0x0580, 0x0500, - 0x0480, 0x0400, 0x0400, 0x0380, 0x0300, 0x0300, 0x0280, 0x0280, - 0x0200, 0x0200, 0x0180, 0x0180, 0x0100, 0x0100, 0x0100, 0x0080, - 0x0080, 0x0080, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0080, - 0x0080, 0x0080, 0x0100, 0x0100, 0x0100, 0x0180, 0x0180, 0x0200, - 0x0200, 0x0280, 0x0280, 0x0300, 0x0300, 0x0380, 0x0400, 0x0400, - 0x0480, 0x0500, 0x0580, 0x0580, 0x0600, 0x0680, 0x0700, 0x0780, - 0x0800, 0x0880, 0x0900, 0x0980, 0x0a00, 0x0a80, 0x0b80, 0x0c00, - 0x0c80, 0x0d00, 0x0e00, 0x0e80, 0x0f00, 0x1000, 0x1080, 0x1180, - 0x1200, 0x1300, 0x1380, 0x1480, 0x1500, 0x1600, 0x1700, 0x1780, - 0x1880, 0x1980, 0x1a80, 0x1b00, 0x1c00, 0x1d00, 0x1e00, 0x1f00 -}; - diff --git a/src/lib/openmj2/t2.c b/src/lib/openmj2/t2.c deleted file mode 100644 index c0c019dc..00000000 --- a/src/lib/openmj2/t2.c +++ /dev/null @@ -1,884 +0,0 @@ -/* - * The copyright in this software is being made available under the 2-clauses - * BSD License, included below. This software may be subject to other third - * party and contributor rights, including patent rights, and no such rights - * are granted under this license. - * - * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2014, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux - * Copyright (c) 2003-2014, Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include "opj_includes.h" - -/** @defgroup T2 T2 - Implementation of a tier-2 coding */ -/*@{*/ - -/** @name Local static functions */ -/*@{*/ - -static void t2_putcommacode(opj_bio_t *bio, int n); -static int t2_getcommacode(opj_bio_t *bio); -/** -Variable length code for signalling delta Zil (truncation point) -@param bio Bit Input/Output component -@param n delta Zil -*/ -static void t2_putnumpasses(opj_bio_t *bio, int n); -static int t2_getnumpasses(opj_bio_t *bio); -/** -Encode a packet of a tile to a destination buffer -@param tile Tile for which to write the packets -@param tcp Tile coding parameters -@param pi Packet identity -@param dest Destination buffer -@param len Length of the destination buffer -@param cstr_info Codestream information structure -@param tileno Number of the tile encoded -@return -*/ -static int t2_encode_packet(opj_tcd_tile_t *tile, opj_tcp_t *tcp, - opj_pi_iterator_t *pi, unsigned char *dest, int len, - opj_codestream_info_t *cstr_info, int tileno); -/** -@param cblk -@param index -@param cblksty -@param first -*/ -static opj_bool t2_init_seg(opj_tcd_cblk_dec_t* cblk, int index, int cblksty, - int first); -/** -Decode a packet of a tile from a source buffer -@param t2 T2 handle -@param src Source buffer -@param len Length of the source buffer -@param tile Tile for which to write the packets -@param tcp Tile coding parameters -@param pi Packet identity -@param pack_info Packet information -@return -*/ -static int t2_decode_packet(opj_t2_t* t2, unsigned char *src, int len, - opj_tcd_tile_t *tile, - opj_tcp_t *tcp, opj_pi_iterator_t *pi, opj_packet_info_t *pack_info); - -/*@}*/ - -/*@}*/ - -/* ----------------------------------------------------------------------- */ - -/* #define RESTART 0x04 */ - -static void t2_putcommacode(opj_bio_t *bio, int n) -{ - while (--n >= 0) { - bio_write(bio, 1, 1); - } - bio_write(bio, 0, 1); -} - -static int t2_getcommacode(opj_bio_t *bio) -{ - int n; - for (n = 0; bio_read(bio, 1); n++) { - ; - } - return n; -} - -static void t2_putnumpasses(opj_bio_t *bio, int n) -{ - if (n == 1) { - bio_write(bio, 0, 1); - } else if (n == 2) { - bio_write(bio, 2, 2); - } else if (n <= 5) { - bio_write(bio, 0xc | (n - 3), 4); - } else if (n <= 36) { - bio_write(bio, 0x1e0 | (n - 6), 9); - } else if (n <= 164) { - bio_write(bio, 0xff80 | (n - 37), 16); - } -} - -static int t2_getnumpasses(opj_bio_t *bio) -{ - int n; - if (!bio_read(bio, 1)) { - return 1; - } - if (!bio_read(bio, 1)) { - return 2; - } - if ((n = bio_read(bio, 2)) != 3) { - return (3 + n); - } - if ((n = bio_read(bio, 5)) != 31) { - return (6 + n); - } - return (37 + bio_read(bio, 7)); -} - -static int t2_encode_packet(opj_tcd_tile_t * tile, opj_tcp_t * tcp, - opj_pi_iterator_t *pi, unsigned char *dest, int length, - opj_codestream_info_t *cstr_info, int tileno) -{ - int bandno, cblkno; - unsigned char *c = dest; - - int compno = pi->compno; /* component value */ - int resno = pi->resno; /* resolution level value */ - int precno = pi->precno; /* precinct value */ - int layno = pi->layno; /* quality layer value */ - - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - - opj_bio_t *bio = NULL; /* BIO component */ - - /* */ - if (tcp->csty & J2K_CP_CSTY_SOP) { - c[0] = 255; - c[1] = 145; - c[2] = 0; - c[3] = 4; - c[4] = (unsigned char)((tile->packno % 65536) / 256); - c[5] = (unsigned char)((tile->packno % 65536) % 256); - c += 6; - } - /* */ - - if (!layno) { - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - opj_tcd_precinct_t *prc = &band->precincts[precno]; - tgt_reset(prc->incltree); - tgt_reset(prc->imsbtree); - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno]; - cblk->numpasses = 0; - tgt_setvalue(prc->imsbtree, cblkno, band->numbps - cblk->numbps); - } - } - } - - bio = bio_create(); - bio_init_enc(bio, c, length); - bio_write(bio, 1, 1); /* Empty header bit */ - - /* Writing Packet header */ - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - opj_tcd_precinct_t *prc = &band->precincts[precno]; - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno]; - opj_tcd_layer_t *layer = &cblk->layers[layno]; - if (!cblk->numpasses && layer->numpasses) { - tgt_setvalue(prc->incltree, cblkno, layno); - } - } - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno]; - opj_tcd_layer_t *layer = &cblk->layers[layno]; - int increment = 0; - int nump = 0; - int len = 0, passno; - /* cblk inclusion bits */ - if (!cblk->numpasses) { - tgt_encode(bio, prc->incltree, cblkno, layno + 1); - } else { - bio_write(bio, layer->numpasses != 0, 1); - } - /* if cblk not included, go to the next cblk */ - if (!layer->numpasses) { - continue; - } - /* if first instance of cblk --> zero bit-planes information */ - if (!cblk->numpasses) { - cblk->numlenbits = 3; - tgt_encode(bio, prc->imsbtree, cblkno, 999); - } - /* number of coding passes included */ - t2_putnumpasses(bio, layer->numpasses); - - /* computation of the increase of the length indicator and insertion in the header */ - for (passno = cblk->numpasses; passno < cblk->numpasses + layer->numpasses; - passno++) { - opj_tcd_pass_t *pass = &cblk->passes[passno]; - nump++; - len += pass->len; - if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) { - increment = int_max(increment, - int_floorlog2(len) + 1 - (cblk->numlenbits + int_floorlog2(nump))); - len = 0; - nump = 0; - } - } - t2_putcommacode(bio, increment); - - /* computation of the new Length indicator */ - cblk->numlenbits += increment; - - /* insertion of the codeword segment length */ - for (passno = cblk->numpasses; passno < cblk->numpasses + layer->numpasses; - passno++) { - opj_tcd_pass_t *pass = &cblk->passes[passno]; - nump++; - len += pass->len; - if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) { - bio_write(bio, len, cblk->numlenbits + int_floorlog2(nump)); - len = 0; - nump = 0; - } - } - } - } - - if (bio_flush(bio)) { - bio_destroy(bio); - return -999; /* modified to eliminate longjmp !! */ - } - - c += bio_numbytes(bio); - bio_destroy(bio); - - /* */ - if (tcp->csty & J2K_CP_CSTY_EPH) { - c[0] = 255; - c[1] = 146; - c += 2; - } - /* */ - - /* << INDEX */ - /* End of packet header position. Currently only represents the distance to start of packet - // Will be updated later by incrementing with packet start value */ - if (cstr_info && cstr_info->index_write) { - opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->packno]; - info_PK->end_ph_pos = (int)(c - dest); - } - /* INDEX >> */ - - /* Writing the packet body */ - - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - opj_tcd_precinct_t *prc = &band->precincts[precno]; - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno]; - opj_tcd_layer_t *layer = &cblk->layers[layno]; - if (!layer->numpasses) { - continue; - } - if (c + layer->len > dest + length) { - return -999; - } - - memcpy(c, layer->data, layer->len); - cblk->numpasses += layer->numpasses; - c += layer->len; - /* << INDEX */ - if (cstr_info && cstr_info->index_write) { - opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->packno]; - info_PK->disto += layer->disto; - if (cstr_info->D_max < info_PK->disto) { - cstr_info->D_max = info_PK->disto; - } - } - /* INDEX >> */ - } - } - - return (c - dest); -} - -static opj_bool t2_init_seg(opj_tcd_cblk_dec_t* cblk, int index, int cblksty, - int first) -{ - opj_tcd_seg_t* seg; - opj_tcd_seg_t* segs; - segs = (opj_tcd_seg_t*) opj_realloc(cblk->segs, - (index + 1) * sizeof(opj_tcd_seg_t)); - - if (segs == NULL) { - return OPJ_FALSE; - } - cblk->segs = segs; - - seg = &cblk->segs[index]; - seg->data = NULL; - seg->dataindex = 0; - seg->numpasses = 0; - seg->len = 0; - if (cblksty & J2K_CCP_CBLKSTY_TERMALL) { - seg->maxpasses = 1; - } else if (cblksty & J2K_CCP_CBLKSTY_LAZY) { - if (first) { - seg->maxpasses = 10; - } else { - seg->maxpasses = (((seg - 1)->maxpasses == 1) || - ((seg - 1)->maxpasses == 10)) ? 2 : 1; - } - } else { - seg->maxpasses = 109; - } - - return OPJ_TRUE; -} - -static int t2_decode_packet(opj_t2_t* t2, unsigned char *src, int len, - opj_tcd_tile_t *tile, - opj_tcp_t *tcp, opj_pi_iterator_t *pi, opj_packet_info_t *pack_info) -{ - int bandno, cblkno; - unsigned char *c = src; - - opj_cp_t *cp = t2->cp; - - int compno = pi->compno; /* component value */ - int resno = pi->resno; /* resolution level value */ - int precno = pi->precno; /* precinct value */ - int layno = pi->layno; /* quality layer value */ - - opj_tcd_resolution_t* res = &tile->comps[compno].resolutions[resno]; - - unsigned char *hd = NULL; - int present; - - opj_bio_t *bio = NULL; /* BIO component */ - - if (layno == 0) { - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - opj_tcd_precinct_t *prc = &band->precincts[precno]; - - if ((band->x1 - band->x0 == 0) || (band->y1 - band->y0 == 0)) { - continue; - } - - tgt_reset(prc->incltree); - tgt_reset(prc->imsbtree); - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - opj_tcd_cblk_dec_t* cblk = &prc->cblks.dec[cblkno]; - cblk->numsegs = 0; - } - } - } - - /* SOP markers */ - - if (tcp->csty & J2K_CP_CSTY_SOP) { - if ((*c) != 0xff || (*(c + 1) != 0x91)) { - opj_event_msg(t2->cinfo, EVT_WARNING, "Expected SOP marker\n"); - } else { - c += 6; - } - - /** TODO : check the Nsop value */ - } - - /* - When the marker PPT/PPM is used the packet header are store in PPT/PPM marker - This part deal with this caracteristic - step 1: Read packet header in the saved structure - step 2: Return to codestream for decoding - */ - - bio = bio_create(); - - if (cp->ppm == 1) { /* PPM */ - hd = cp->ppm_data; - bio_init_dec(bio, hd, cp->ppm_len); - } else if (tcp->ppt == 1) { /* PPT */ - hd = tcp->ppt_data; - bio_init_dec(bio, hd, tcp->ppt_len); - } else { /* Normal Case */ - hd = c; - bio_init_dec(bio, hd, src + len - hd); - } - - present = bio_read(bio, 1); - - if (!present) { - bio_inalign(bio); - hd += bio_numbytes(bio); - bio_destroy(bio); - - /* EPH markers */ - - if (tcp->csty & J2K_CP_CSTY_EPH) { - if ((*hd) != 0xff || (*(hd + 1) != 0x92)) { - printf("Error : expected EPH marker\n"); - } else { - hd += 2; - } - } - - /* << INDEX */ - /* End of packet header position. Currently only represents the distance to start of packet - // Will be updated later by incrementing with packet start value*/ - if (pack_info) { - pack_info->end_ph_pos = (int)(c - src); - } - /* INDEX >> */ - - if (cp->ppm == 1) { /* PPM case */ - cp->ppm_len += cp->ppm_data - hd; - cp->ppm_data = hd; - return (c - src); - } - if (tcp->ppt == 1) { /* PPT case */ - tcp->ppt_len += tcp->ppt_data - hd; - tcp->ppt_data = hd; - return (c - src); - } - - return (hd - src); - } - - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - opj_tcd_precinct_t *prc = &band->precincts[precno]; - - if ((band->x1 - band->x0 == 0) || (band->y1 - band->y0 == 0)) { - continue; - } - - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - int included, increment, n, segno; - opj_tcd_cblk_dec_t* cblk = &prc->cblks.dec[cblkno]; - /* if cblk not yet included before --> inclusion tagtree */ - if (!cblk->numsegs) { - included = tgt_decode(bio, prc->incltree, cblkno, layno + 1); - /* else one bit */ - } else { - included = bio_read(bio, 1); - } - /* if cblk not included */ - if (!included) { - cblk->numnewpasses = 0; - continue; - } - /* if cblk not yet included --> zero-bitplane tagtree */ - if (!cblk->numsegs) { - int i, numimsbs; - for (i = 0; !tgt_decode(bio, prc->imsbtree, cblkno, i); i++) { - ; - } - numimsbs = i - 1; - cblk->numbps = band->numbps - numimsbs; - cblk->numlenbits = 3; - } - /* number of coding passes */ - cblk->numnewpasses = t2_getnumpasses(bio); - increment = t2_getcommacode(bio); - /* length indicator increment */ - cblk->numlenbits += increment; - segno = 0; - if (!cblk->numsegs) { - if (!t2_init_seg(cblk, segno, tcp->tccps[compno].cblksty, 1)) { - opj_event_msg(t2->cinfo, EVT_ERROR, "Out of memory\n"); - bio_destroy(bio); - return -999; - } - } else { - segno = cblk->numsegs - 1; - if (cblk->segs[segno].numpasses == cblk->segs[segno].maxpasses) { - ++segno; - if (!t2_init_seg(cblk, segno, tcp->tccps[compno].cblksty, 0)) { - opj_event_msg(t2->cinfo, EVT_ERROR, "Out of memory\n"); - bio_destroy(bio); - return -999; - } - } - } - n = cblk->numnewpasses; - - do { - cblk->segs[segno].numnewpasses = int_min(cblk->segs[segno].maxpasses - - cblk->segs[segno].numpasses, n); - cblk->segs[segno].newlen = bio_read(bio, - cblk->numlenbits + int_floorlog2(cblk->segs[segno].numnewpasses)); - n -= cblk->segs[segno].numnewpasses; - if (n > 0) { - ++segno; - if (!t2_init_seg(cblk, segno, tcp->tccps[compno].cblksty, 0)) { - opj_event_msg(t2->cinfo, EVT_ERROR, "Out of memory\n"); - bio_destroy(bio); - return -999; - } - } - } while (n > 0); - } - } - - if (bio_inalign(bio)) { - bio_destroy(bio); - return -999; - } - - hd += bio_numbytes(bio); - bio_destroy(bio); - - /* EPH markers */ - if (tcp->csty & J2K_CP_CSTY_EPH) { - if ((*hd) != 0xff || (*(hd + 1) != 0x92)) { - opj_event_msg(t2->cinfo, EVT_ERROR, "Expected EPH marker\n"); - return -999; - } else { - hd += 2; - } - } - - /* << INDEX */ - /* End of packet header position. Currently only represents the distance to start of packet - // Will be updated later by incrementing with packet start value*/ - if (pack_info) { - pack_info->end_ph_pos = (int)(hd - src); - } - /* INDEX >> */ - - if (cp->ppm == 1) { - cp->ppm_len += cp->ppm_data - hd; - cp->ppm_data = hd; - } else if (tcp->ppt == 1) { - tcp->ppt_len += tcp->ppt_data - hd; - tcp->ppt_data = hd; - } else { - c = hd; - } - - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - opj_tcd_precinct_t *prc = &band->precincts[precno]; - - if ((band->x1 - band->x0 == 0) || (band->y1 - band->y0 == 0)) { - continue; - } - - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - opj_tcd_cblk_dec_t* cblk = &prc->cblks.dec[cblkno]; - opj_tcd_seg_t *seg = NULL; - if (!cblk->numnewpasses) { - continue; - } - if (!cblk->numsegs) { - seg = &cblk->segs[0]; - cblk->numsegs++; - cblk->len = 0; - } else { - seg = &cblk->segs[cblk->numsegs - 1]; - if (seg->numpasses == seg->maxpasses) { - seg++; - cblk->numsegs++; - } - } - - do { - if (c + seg->newlen > src + len) { - return -999; - } - -#ifdef USE_JPWL - /* we need here a j2k handle to verify if making a check to - the validity of cblocks parameters is selected from user (-W) */ - - /* let's check that we are not exceeding */ - if ((cblk->len + seg->newlen) > 8192) { - opj_event_msg(t2->cinfo, EVT_WARNING, - "JPWL: segment too long (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n", - seg->newlen, cblkno, precno, bandno, resno, compno); - if (!JPWL_ASSUME) { - opj_event_msg(t2->cinfo, EVT_ERROR, "JPWL: giving up\n"); - return -999; - } - seg->newlen = 8192 - cblk->len; - opj_event_msg(t2->cinfo, EVT_WARNING, " - truncating segment to %d\n", - seg->newlen); - break; - }; - -#endif /* USE_JPWL */ - - cblk->data = (unsigned char*) opj_realloc(cblk->data, - (cblk->len + seg->newlen) * sizeof(unsigned char)); - memcpy(cblk->data + cblk->len, c, seg->newlen); - if (seg->numpasses == 0) { - seg->data = &cblk->data; - seg->dataindex = cblk->len; - } - c += seg->newlen; - cblk->len += seg->newlen; - seg->len += seg->newlen; - seg->numpasses += seg->numnewpasses; - cblk->numnewpasses -= seg->numnewpasses; - if (cblk->numnewpasses > 0) { - seg++; - cblk->numsegs++; - } - } while (cblk->numnewpasses > 0); - } - } - - return (c - src); -} - -/* ----------------------------------------------------------------------- */ - -int t2_encode_packets(opj_t2_t* t2, int tileno, opj_tcd_tile_t *tile, - int maxlayers, unsigned char *dest, int len, opj_codestream_info_t *cstr_info, - int tpnum, int tppos, int pino, J2K_T2_MODE t2_mode, int cur_totnum_tp) -{ - unsigned char *c = dest; - int e = 0; - int compno; - opj_pi_iterator_t *pi = NULL; - int poc; - opj_image_t *image = t2->image; - opj_cp_t *cp = t2->cp; - opj_tcp_t *tcp = &cp->tcps[tileno]; - int pocno = cp->cinema == CINEMA4K_24 ? 2 : 1; - int maxcomp = cp->max_comp_size > 0 ? image->numcomps : 1; - - pi = pi_initialise_encode(image, cp, tileno, t2_mode); - if (!pi) { - /* TODO: throw an error */ - return -999; - } - - if (t2_mode == THRESH_CALC) { /* Calculating threshold */ - for (compno = 0; compno < maxcomp; compno++) { - for (poc = 0; poc < pocno ; poc++) { - int comp_len = 0; - int tpnum = compno; - if (pi_create_encode(pi, cp, tileno, poc, tpnum, tppos, t2_mode, - cur_totnum_tp)) { - opj_event_msg(t2->cinfo, EVT_ERROR, "Error initializing Packet Iterator\n"); - pi_destroy(pi, cp, tileno); - return -999; - } - while (pi_next(&pi[poc])) { - if (pi[poc].layno < maxlayers) { - e = t2_encode_packet(tile, &cp->tcps[tileno], &pi[poc], c, dest + len - c, - cstr_info, tileno); - comp_len = comp_len + e; - if (e == -999) { - break; - } else { - c += e; - } - } - } - if (e == -999) { - break; - } - if (cp->max_comp_size) { - if (comp_len > cp->max_comp_size) { - e = -999; - break; - } - } - } - if (e == -999) { - break; - } - } - } else { /* t2_mode == FINAL_PASS */ - pi_create_encode(pi, cp, tileno, pino, tpnum, tppos, t2_mode, cur_totnum_tp); - while (pi_next(&pi[pino])) { - if (pi[pino].layno < maxlayers) { - e = t2_encode_packet(tile, &cp->tcps[tileno], &pi[pino], c, dest + len - c, - cstr_info, tileno); - if (e == -999) { - break; - } else { - c += e; - } - /* INDEX >> */ - if (cstr_info) { - if (cstr_info->index_write) { - opj_tile_info_t *info_TL = &cstr_info->tile[tileno]; - opj_packet_info_t *info_PK = &info_TL->packet[cstr_info->packno]; - if (!cstr_info->packno) { - info_PK->start_pos = info_TL->end_header + 1; - } else { - info_PK->start_pos = ((cp->tp_on | tcp->POC) && - info_PK->start_pos) ? info_PK->start_pos : info_TL->packet[cstr_info->packno - - 1].end_pos + 1; - } - info_PK->end_pos = info_PK->start_pos + e - 1; - info_PK->end_ph_pos += info_PK->start_pos - - 1; /* End of packet header which now only represents the distance - // to start of packet is incremented by value of start of packet*/ - } - - cstr_info->packno++; - } - /* << INDEX */ - tile->packno++; - } - } - } - - pi_destroy(pi, cp, tileno); - - if (e == -999) { - return e; - } - - return (c - dest); -} - -int t2_decode_packets(opj_t2_t *t2, unsigned char *src, int len, int tileno, - opj_tcd_tile_t *tile, opj_codestream_info_t *cstr_info) -{ - unsigned char *c = src; - opj_pi_iterator_t *pi; - int pino, e = 0; - int n = 0, curtp = 0; - int tp_start_packno; - - opj_image_t *image = t2->image; - opj_cp_t *cp = t2->cp; - - /* create a packet iterator */ - pi = pi_create_decode(image, cp, tileno); - if (!pi) { - /* TODO: throw an error */ - return -999; - } - - tp_start_packno = 0; - - for (pino = 0; pino <= cp->tcps[tileno].numpocs; pino++) { - while (pi_next(&pi[pino])) { - if ((cp->layer == 0) || (cp->layer >= ((pi[pino].layno) + 1))) { - opj_packet_info_t *pack_info; - if (cstr_info) { - pack_info = &cstr_info->tile[tileno].packet[cstr_info->packno]; - } else { - pack_info = NULL; - } - e = t2_decode_packet(t2, c, src + len - c, tile, &cp->tcps[tileno], &pi[pino], - pack_info); - } else { - e = 0; - } - if (e == -999) { - pi_destroy(pi, cp, tileno); - return -999; - } - /* progression in resolution */ - image->comps[pi[pino].compno].resno_decoded = - (e > 0) ? - int_max(pi[pino].resno, image->comps[pi[pino].compno].resno_decoded) - : image->comps[pi[pino].compno].resno_decoded; - n++; - - /* INDEX >> */ - if (cstr_info) { - opj_tile_info_t *info_TL = &cstr_info->tile[tileno]; - opj_packet_info_t *info_PK = &info_TL->packet[cstr_info->packno]; - if (!cstr_info->packno) { - info_PK->start_pos = info_TL->end_header + 1; - } else if (info_TL->packet[cstr_info->packno - 1].end_pos >= - (int)cstr_info->tile[tileno].tp[curtp].tp_end_pos) { /* New tile part*/ - info_TL->tp[curtp].tp_numpacks = cstr_info->packno - - tp_start_packno; /* Number of packets in previous tile-part*/ - info_TL->tp[curtp].tp_start_pack = tp_start_packno; - tp_start_packno = cstr_info->packno; - curtp++; - info_PK->start_pos = cstr_info->tile[tileno].tp[curtp].tp_end_header + 1; - } else { - info_PK->start_pos = (cp->tp_on && - info_PK->start_pos) ? info_PK->start_pos : info_TL->packet[cstr_info->packno - - 1].end_pos + 1; - } - info_PK->end_pos = info_PK->start_pos + e - 1; - info_PK->end_ph_pos += info_PK->start_pos - - 1; /* End of packet header which now only represents the distance - // to start of packet is incremented by value of start of packet*/ - cstr_info->packno++; - } - /* << INDEX */ - - if (e == -999) { /* ADD */ - break; - } else { - c += e; - } - } - } - /* INDEX >> */ - if (cstr_info) { - cstr_info->tile[tileno].tp[curtp].tp_numpacks = cstr_info->packno - - tp_start_packno; /* Number of packets in last tile-part*/ - cstr_info->tile[tileno].tp[curtp].tp_start_pack = tp_start_packno; - } - /* << INDEX */ - - /* don't forget to release pi */ - pi_destroy(pi, cp, tileno); - - if (e == -999) { - return e; - } - - return (c - src); -} - -/* ----------------------------------------------------------------------- */ - -opj_t2_t* t2_create(opj_common_ptr cinfo, opj_image_t *image, opj_cp_t *cp) -{ - /* create the tcd structure */ - opj_t2_t *t2 = (opj_t2_t*)opj_malloc(sizeof(opj_t2_t)); - if (!t2) { - return NULL; - } - t2->cinfo = cinfo; - t2->image = image; - t2->cp = cp; - - return t2; -} - -void t2_destroy(opj_t2_t *t2) -{ - if (t2) { - opj_free(t2); - } -} - - - - - diff --git a/src/lib/openmj2/t2.h b/src/lib/openmj2/t2.h deleted file mode 100644 index 2f1a4e2b..00000000 --- a/src/lib/openmj2/t2.h +++ /dev/null @@ -1,114 +0,0 @@ -/* - * 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 __T2_H -#define __T2_H -/** -@file t2.h -@brief Implementation of a tier-2 coding (packetization of code-block data) (T2) - -*/ - -/** @defgroup T2 T2 - Implementation of a tier-2 coding */ -/*@{*/ - -/** -Tier-2 coding -*/ -typedef struct opj_t2 { - /** codec context */ - opj_common_ptr cinfo; - - /** Encoding: pointer to the src image. Decoding: pointer to the dst image. */ - opj_image_t *image; - /** pointer to the image coding parameters */ - opj_cp_t *cp; -} opj_t2_t; - -/** @name Exported functions */ -/*@{*/ -/* ----------------------------------------------------------------------- */ - -/** -Encode the packets of a tile to a destination buffer -@param t2 T2 handle -@param tileno number of the tile encoded -@param tile the tile for which to write the packets -@param maxlayers maximum number of layers -@param dest the destination buffer -@param len the length of the destination buffer -@param cstr_info Codestream information structure -@param tpnum Tile part number of the current tile -@param tppos The position of the tile part flag in the progression order -@param pino -@param t2_mode If == 0 In Threshold calculation ,If == 1 Final pass -@param cur_totnum_tp The total number of tile parts in the current tile -*/ -int t2_encode_packets(opj_t2_t* t2, int tileno, opj_tcd_tile_t *tile, - int maxlayers, unsigned char *dest, int len, opj_codestream_info_t *cstr_info, - int tpnum, int tppos, int pino, J2K_T2_MODE t2_mode, int cur_totnum_tp); -/** -Decode the packets of a tile from a source buffer -@param t2 T2 handle -@param src the source buffer -@param len length of the source buffer -@param tileno number that identifies the tile for which to decode the packets -@param tile tile for which to decode the packets -@param cstr_info Codestream information structure - */ -int t2_decode_packets(opj_t2_t *t2, unsigned char *src, int len, int tileno, - opj_tcd_tile_t *tile, opj_codestream_info_t *cstr_info); - -/** -Create a T2 handle -@param cinfo Codec context info -@param image Source or destination image -@param cp Image coding parameters -@return Returns a new T2 handle if successful, returns NULL otherwise -*/ -opj_t2_t* t2_create(opj_common_ptr cinfo, opj_image_t *image, opj_cp_t *cp); -/** -Destroy a T2 handle -@param t2 T2 handle to destroy -*/ -void t2_destroy(opj_t2_t *t2); - -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __T2_H */ diff --git a/src/lib/openmj2/tcd.c b/src/lib/openmj2/tcd.c deleted file mode 100644 index 2a97043e..00000000 --- a/src/lib/openmj2/tcd.c +++ /dev/null @@ -1,1663 +0,0 @@ -/* - * 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. - */ - -#define _ISOC99_SOURCE /* lrintf is C99 */ -#include "opj_includes.h" - -void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t * img) -{ - int tileno, compno, resno, bandno, precno;/*, cblkno;*/ - - fprintf(fd, "image {\n"); - fprintf(fd, " tw=%d, th=%d x0=%d x1=%d y0=%d y1=%d\n", - img->tw, img->th, tcd->image->x0, tcd->image->x1, tcd->image->y0, - tcd->image->y1); - - for (tileno = 0; tileno < img->th * img->tw; tileno++) { - opj_tcd_tile_t *tile = &tcd->tcd_image->tiles[tileno]; - fprintf(fd, " tile {\n"); - fprintf(fd, " x0=%d, y0=%d, x1=%d, y1=%d, numcomps=%d\n", - tile->x0, tile->y0, tile->x1, tile->y1, tile->numcomps); - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - fprintf(fd, " tilec {\n"); - fprintf(fd, - " x0=%d, y0=%d, x1=%d, y1=%d, numresolutions=%d\n", - tilec->x0, tilec->y0, tilec->x1, tilec->y1, tilec->numresolutions); - for (resno = 0; resno < tilec->numresolutions; resno++) { - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - fprintf(fd, "\n res {\n"); - fprintf(fd, - " x0=%d, y0=%d, x1=%d, y1=%d, pw=%d, ph=%d, numbands=%d\n", - res->x0, res->y0, res->x1, res->y1, res->pw, res->ph, res->numbands); - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - fprintf(fd, " band {\n"); - fprintf(fd, - " x0=%d, y0=%d, x1=%d, y1=%d, stepsize=%f, numbps=%d\n", - band->x0, band->y0, band->x1, band->y1, band->stepsize, band->numbps); - for (precno = 0; precno < res->pw * res->ph; precno++) { - opj_tcd_precinct_t *prec = &band->precincts[precno]; - fprintf(fd, " prec {\n"); - fprintf(fd, - " x0=%d, y0=%d, x1=%d, y1=%d, cw=%d, ch=%d\n", - prec->x0, prec->y0, prec->x1, prec->y1, prec->cw, prec->ch); - /* - for (cblkno = 0; cblkno < prec->cw * prec->ch; cblkno++) { - opj_tcd_cblk_t *cblk = &prec->cblks[cblkno]; - fprintf(fd, " cblk {\n"); - fprintf(fd, - " x0=%d, y0=%d, x1=%d, y1=%d\n", - cblk->x0, cblk->y0, cblk->x1, cblk->y1); - fprintf(fd, " }\n"); - } - */ - fprintf(fd, " }\n"); - } - fprintf(fd, " }\n"); - } - fprintf(fd, " }\n"); - } - fprintf(fd, " }\n"); - } - fprintf(fd, " }\n"); - } - fprintf(fd, "}\n"); -} - -/* ----------------------------------------------------------------------- */ - -/** -Create a new TCD handle -*/ -opj_tcd_t* tcd_create(opj_common_ptr cinfo) -{ - /* create the tcd structure */ - opj_tcd_t *tcd = (opj_tcd_t*)opj_malloc(sizeof(opj_tcd_t)); - if (!tcd) { - return NULL; - } - tcd->cinfo = cinfo; - tcd->tcd_image = (opj_tcd_image_t*)opj_malloc(sizeof(opj_tcd_image_t)); - if (!tcd->tcd_image) { - opj_free(tcd); - return NULL; - } - - return tcd; -} - -/** -Destroy a previously created TCD handle -*/ -void tcd_destroy(opj_tcd_t *tcd) -{ - if (tcd) { - opj_free(tcd->tcd_image); - opj_free(tcd); - } -} - -/* ----------------------------------------------------------------------- */ - -void tcd_malloc_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, - int curtileno) -{ - int tileno, compno, resno, bandno, precno, cblkno; - - tcd->image = image; - tcd->cp = cp; - tcd->tcd_image->tw = cp->tw; - tcd->tcd_image->th = cp->th; - tcd->tcd_image->tiles = (opj_tcd_tile_t *) opj_malloc(sizeof(opj_tcd_tile_t)); - - for (tileno = 0; tileno < 1; tileno++) { - opj_tcp_t *tcp = &cp->tcps[curtileno]; - int j; - - /* cfr p59 ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ - int p = curtileno % cp->tw; /* si numerotation matricielle .. */ - int q = curtileno / - cp->tw; /* .. coordonnees de la tile (q,p) q pour ligne et p pour colonne */ - - /* opj_tcd_tile_t *tile=&tcd->tcd_image->tiles[tileno]; */ - opj_tcd_tile_t *tile = tcd->tcd_image->tiles; - - /* 4 borders of the tile rescale on the image if necessary */ - tile->x0 = int_max(cp->tx0 + p * cp->tdx, image->x0); - tile->y0 = int_max(cp->ty0 + q * cp->tdy, image->y0); - tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1); - tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1); - tile->numcomps = image->numcomps; - /* tile->PPT=image->PPT; */ - - /* Modification of the RATE >> */ - for (j = 0; j < tcp->numlayers; j++) { - tcp->rates[j] = tcp->rates[j] ? - cp->tp_on ? - (((float)(tile->numcomps - * (tile->x1 - tile->x0) - * (tile->y1 - tile->y0) - * image->comps[0].prec)) - / (tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy)) - ((( - tcd->cur_totnum_tp - 1) * 14) / tcp->numlayers) - : - ((float)(tile->numcomps - * (tile->x1 - tile->x0) - * (tile->y1 - tile->y0) - * image->comps[0].prec)) / - (tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy) - : 0; - - if (tcp->rates[j]) { - if (j && tcp->rates[j] < tcp->rates[j - 1] + 10) { - tcp->rates[j] = tcp->rates[j - 1] + 20; - } else { - if (!j && tcp->rates[j] < 30) { - tcp->rates[j] = 30; - } - } - - if (j == (tcp->numlayers - 1)) { - tcp->rates[j] = tcp->rates[j] - 2; - } - } - } - /* << Modification of the RATE */ - - tile->comps = (opj_tcd_tilecomp_t *) opj_malloc(image->numcomps * sizeof( - opj_tcd_tilecomp_t)); - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tccp_t *tccp = &tcp->tccps[compno]; - - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - - /* border of each tile component (global) */ - tilec->x0 = int_ceildiv(tile->x0, image->comps[compno].dx); - tilec->y0 = int_ceildiv(tile->y0, image->comps[compno].dy); - tilec->x1 = int_ceildiv(tile->x1, image->comps[compno].dx); - tilec->y1 = int_ceildiv(tile->y1, image->comps[compno].dy); - - tilec->data = (int *) opj_aligned_malloc((tilec->x1 - tilec->x0) * - (tilec->y1 - tilec->y0) * sizeof(int)); - tilec->numresolutions = tccp->numresolutions; - - tilec->resolutions = (opj_tcd_resolution_t *) opj_malloc( - tilec->numresolutions * sizeof(opj_tcd_resolution_t)); - - for (resno = 0; resno < tilec->numresolutions; resno++) { - int pdx, pdy; - int levelno = tilec->numresolutions - 1 - resno; - int tlprcxstart, tlprcystart, brprcxend, brprcyend; - int tlcbgxstart, tlcbgystart, brcbgxend, brcbgyend; - int cbgwidthexpn, cbgheightexpn; - int cblkwidthexpn, cblkheightexpn; - - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - - /* border for each resolution level (global) */ - res->x0 = int_ceildivpow2(tilec->x0, levelno); - res->y0 = int_ceildivpow2(tilec->y0, levelno); - res->x1 = int_ceildivpow2(tilec->x1, levelno); - res->y1 = int_ceildivpow2(tilec->y1, levelno); - - res->numbands = resno == 0 ? 1 : 3; - /* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */ - if (tccp->csty & J2K_CCP_CSTY_PRT) { - pdx = tccp->prcw[resno]; - pdy = tccp->prch[resno]; - } else { - pdx = 15; - pdy = 15; - } - /* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ - tlprcxstart = int_floordivpow2(res->x0, pdx) << pdx; - tlprcystart = int_floordivpow2(res->y0, pdy) << pdy; - - brprcxend = int_ceildivpow2(res->x1, pdx) << pdx; - brprcyend = int_ceildivpow2(res->y1, pdy) << pdy; - - res->pw = (brprcxend - tlprcxstart) >> pdx; - res->ph = (brprcyend - tlprcystart) >> pdy; - - if (resno == 0) { - tlcbgxstart = tlprcxstart; - tlcbgystart = tlprcystart; - brcbgxend = brprcxend; - brcbgyend = brprcyend; - cbgwidthexpn = pdx; - cbgheightexpn = pdy; - } else { - tlcbgxstart = int_ceildivpow2(tlprcxstart, 1); - tlcbgystart = int_ceildivpow2(tlprcystart, 1); - brcbgxend = int_ceildivpow2(brprcxend, 1); - brcbgyend = int_ceildivpow2(brprcyend, 1); - cbgwidthexpn = pdx - 1; - cbgheightexpn = pdy - 1; - } - - cblkwidthexpn = int_min(tccp->cblkw, cbgwidthexpn); - cblkheightexpn = int_min(tccp->cblkh, cbgheightexpn); - - for (bandno = 0; bandno < res->numbands; bandno++) { - int x0b, y0b, i; - int gain, numbps; - opj_stepsize_t *ss = NULL; - - opj_tcd_band_t *band = &res->bands[bandno]; - - band->bandno = resno == 0 ? 0 : bandno + 1; - x0b = (band->bandno == 1) || (band->bandno == 3) ? 1 : 0; - y0b = (band->bandno == 2) || (band->bandno == 3) ? 1 : 0; - - if (band->bandno == 0) { - /* band border (global) */ - band->x0 = int_ceildivpow2(tilec->x0, levelno); - band->y0 = int_ceildivpow2(tilec->y0, levelno); - band->x1 = int_ceildivpow2(tilec->x1, levelno); - band->y1 = int_ceildivpow2(tilec->y1, levelno); - } else { - /* band border (global) */ - band->x0 = int_ceildivpow2(tilec->x0 - (1 << levelno) * x0b, levelno + 1); - band->y0 = int_ceildivpow2(tilec->y0 - (1 << levelno) * y0b, levelno + 1); - band->x1 = int_ceildivpow2(tilec->x1 - (1 << levelno) * x0b, levelno + 1); - band->y1 = int_ceildivpow2(tilec->y1 - (1 << levelno) * y0b, levelno + 1); - } - - ss = &tccp->stepsizes[resno == 0 ? 0 : 3 * (resno - 1) + bandno + 1]; - gain = tccp->qmfbid == 0 ? dwt_getgain_real(band->bandno) : dwt_getgain( - band->bandno); - numbps = image->comps[compno].prec + gain; - - band->stepsize = (float)((1.0 + ss->mant / 2048.0) * pow(2.0, - numbps - ss->expn)); - band->numbps = ss->expn + tccp->numgbits - 1; /* WHY -1 ? */ - - band->precincts = (opj_tcd_precinct_t *) opj_malloc(3 * res->pw * res->ph * - sizeof(opj_tcd_precinct_t)); - - for (i = 0; i < res->pw * res->ph * 3; i++) { - band->precincts[i].imsbtree = NULL; - band->precincts[i].incltree = NULL; - band->precincts[i].cblks.enc = NULL; - } - - for (precno = 0; precno < res->pw * res->ph; precno++) { - int tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend; - - int cbgxstart = tlcbgxstart + (precno % res->pw) * (1 << cbgwidthexpn); - int cbgystart = tlcbgystart + (precno / res->pw) * (1 << cbgheightexpn); - int cbgxend = cbgxstart + (1 << cbgwidthexpn); - int cbgyend = cbgystart + (1 << cbgheightexpn); - - opj_tcd_precinct_t *prc = &band->precincts[precno]; - - /* precinct size (global) */ - prc->x0 = int_max(cbgxstart, band->x0); - prc->y0 = int_max(cbgystart, band->y0); - prc->x1 = int_min(cbgxend, band->x1); - prc->y1 = int_min(cbgyend, band->y1); - - tlcblkxstart = int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn; - tlcblkystart = int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn; - brcblkxend = int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn; - brcblkyend = int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn; - prc->cw = (brcblkxend - tlcblkxstart) >> cblkwidthexpn; - prc->ch = (brcblkyend - tlcblkystart) >> cblkheightexpn; - - prc->cblks.enc = (opj_tcd_cblk_enc_t*) opj_calloc((prc->cw * prc->ch), - sizeof(opj_tcd_cblk_enc_t)); - prc->incltree = tgt_create(prc->cw, prc->ch); - prc->imsbtree = tgt_create(prc->cw, prc->ch); - - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - int cblkxstart = tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn); - int cblkystart = tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn); - int cblkxend = cblkxstart + (1 << cblkwidthexpn); - int cblkyend = cblkystart + (1 << cblkheightexpn); - - opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno]; - - /* code-block size (global) */ - cblk->x0 = int_max(cblkxstart, prc->x0); - cblk->y0 = int_max(cblkystart, prc->y0); - cblk->x1 = int_min(cblkxend, prc->x1); - cblk->y1 = int_min(cblkyend, prc->y1); - cblk->data = (unsigned char*) opj_calloc(9728 + 2, sizeof(unsigned char)); - /* FIXME: mqc_init_enc and mqc_byteout underrun the buffer if we don't do this. Why? */ - cblk->data[0] = 0; - cblk->data[1] = 0; - cblk->data += 2; - cblk->layers = (opj_tcd_layer_t*) opj_calloc(100, sizeof(opj_tcd_layer_t)); - cblk->passes = (opj_tcd_pass_t*) opj_calloc(100, sizeof(opj_tcd_pass_t)); - } - } - } - } - } - } - - /* tcd_dump(stdout, tcd, &tcd->tcd_image); */ -} - -void tcd_free_encode(opj_tcd_t *tcd) -{ - int tileno, compno, resno, bandno, precno, cblkno; - - for (tileno = 0; tileno < 1; tileno++) { - opj_tcd_tile_t *tile = tcd->tcd_image->tiles; - - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - - for (resno = 0; resno < tilec->numresolutions; resno++) { - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - - for (precno = 0; precno < res->pw * res->ph; precno++) { - opj_tcd_precinct_t *prc = &band->precincts[precno]; - - if (prc->incltree != NULL) { - tgt_destroy(prc->incltree); - prc->incltree = NULL; - } - if (prc->imsbtree != NULL) { - tgt_destroy(prc->imsbtree); - prc->imsbtree = NULL; - } - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - opj_free(prc->cblks.enc[cblkno].data - 2); - opj_free(prc->cblks.enc[cblkno].layers); - opj_free(prc->cblks.enc[cblkno].passes); - } - opj_free(prc->cblks.enc); - } /* for (precno */ - opj_free(band->precincts); - band->precincts = NULL; - } /* for (bandno */ - } /* for (resno */ - opj_free(tilec->resolutions); - tilec->resolutions = NULL; - } /* for (compno */ - opj_free(tile->comps); - tile->comps = NULL; - } /* for (tileno */ - opj_free(tcd->tcd_image->tiles); - tcd->tcd_image->tiles = NULL; -} - -void tcd_init_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, - int curtileno) -{ - int tileno, compno, resno, bandno, precno, cblkno; - - for (tileno = 0; tileno < 1; tileno++) { - opj_tcp_t *tcp = &cp->tcps[curtileno]; - int j; - /* cfr p59 ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ - int p = curtileno % cp->tw; - int q = curtileno / cp->tw; - - opj_tcd_tile_t *tile = tcd->tcd_image->tiles; - - /* 4 borders of the tile rescale on the image if necessary */ - tile->x0 = int_max(cp->tx0 + p * cp->tdx, image->x0); - tile->y0 = int_max(cp->ty0 + q * cp->tdy, image->y0); - tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1); - tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1); - - tile->numcomps = image->numcomps; - /* tile->PPT=image->PPT; */ - - /* Modification of the RATE >> */ - for (j = 0; j < tcp->numlayers; j++) { - tcp->rates[j] = tcp->rates[j] ? - cp->tp_on ? - (((float)(tile->numcomps - * (tile->x1 - tile->x0) - * (tile->y1 - tile->y0) - * image->comps[0].prec)) - / (tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy)) - ((( - tcd->cur_totnum_tp - 1) * 14) / tcp->numlayers) - : - ((float)(tile->numcomps - * (tile->x1 - tile->x0) - * (tile->y1 - tile->y0) - * image->comps[0].prec)) / - (tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy) - : 0; - - if (tcp->rates[j]) { - if (j && tcp->rates[j] < tcp->rates[j - 1] + 10) { - tcp->rates[j] = tcp->rates[j - 1] + 20; - } else { - if (!j && tcp->rates[j] < 30) { - tcp->rates[j] = 30; - } - } - } - } - /* << Modification of the RATE */ - - /* tile->comps=(opj_tcd_tilecomp_t*)opj_realloc(tile->comps,image->numcomps*sizeof(opj_tcd_tilecomp_t)); */ - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tccp_t *tccp = &tcp->tccps[compno]; - - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - - /* border of each tile component (global) */ - tilec->x0 = int_ceildiv(tile->x0, image->comps[compno].dx); - tilec->y0 = int_ceildiv(tile->y0, image->comps[compno].dy); - tilec->x1 = int_ceildiv(tile->x1, image->comps[compno].dx); - tilec->y1 = int_ceildiv(tile->y1, image->comps[compno].dy); - - tilec->data = (int *) opj_aligned_malloc((tilec->x1 - tilec->x0) * - (tilec->y1 - tilec->y0) * sizeof(int)); - tilec->numresolutions = tccp->numresolutions; - /* tilec->resolutions=(opj_tcd_resolution_t*)opj_realloc(tilec->resolutions,tilec->numresolutions*sizeof(opj_tcd_resolution_t)); */ - for (resno = 0; resno < tilec->numresolutions; resno++) { - int pdx, pdy; - - int levelno = tilec->numresolutions - 1 - resno; - int tlprcxstart, tlprcystart, brprcxend, brprcyend; - int tlcbgxstart, tlcbgystart, brcbgxend, brcbgyend; - int cbgwidthexpn, cbgheightexpn; - int cblkwidthexpn, cblkheightexpn; - - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - - /* border for each resolution level (global) */ - res->x0 = int_ceildivpow2(tilec->x0, levelno); - res->y0 = int_ceildivpow2(tilec->y0, levelno); - res->x1 = int_ceildivpow2(tilec->x1, levelno); - res->y1 = int_ceildivpow2(tilec->y1, levelno); - res->numbands = resno == 0 ? 1 : 3; - - /* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */ - if (tccp->csty & J2K_CCP_CSTY_PRT) { - pdx = tccp->prcw[resno]; - pdy = tccp->prch[resno]; - } else { - pdx = 15; - pdy = 15; - } - /* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ - tlprcxstart = int_floordivpow2(res->x0, pdx) << pdx; - tlprcystart = int_floordivpow2(res->y0, pdy) << pdy; - brprcxend = int_ceildivpow2(res->x1, pdx) << pdx; - brprcyend = int_ceildivpow2(res->y1, pdy) << pdy; - - res->pw = (brprcxend - tlprcxstart) >> pdx; - res->ph = (brprcyend - tlprcystart) >> pdy; - - if (resno == 0) { - tlcbgxstart = tlprcxstart; - tlcbgystart = tlprcystart; - brcbgxend = brprcxend; - brcbgyend = brprcyend; - cbgwidthexpn = pdx; - cbgheightexpn = pdy; - } else { - tlcbgxstart = int_ceildivpow2(tlprcxstart, 1); - tlcbgystart = int_ceildivpow2(tlprcystart, 1); - brcbgxend = int_ceildivpow2(brprcxend, 1); - brcbgyend = int_ceildivpow2(brprcyend, 1); - cbgwidthexpn = pdx - 1; - cbgheightexpn = pdy - 1; - } - - cblkwidthexpn = int_min(tccp->cblkw, cbgwidthexpn); - cblkheightexpn = int_min(tccp->cblkh, cbgheightexpn); - - for (bandno = 0; bandno < res->numbands; bandno++) { - int x0b, y0b; - int gain, numbps; - opj_stepsize_t *ss = NULL; - - opj_tcd_band_t *band = &res->bands[bandno]; - - band->bandno = resno == 0 ? 0 : bandno + 1; - x0b = (band->bandno == 1) || (band->bandno == 3) ? 1 : 0; - y0b = (band->bandno == 2) || (band->bandno == 3) ? 1 : 0; - - if (band->bandno == 0) { - /* band border */ - band->x0 = int_ceildivpow2(tilec->x0, levelno); - band->y0 = int_ceildivpow2(tilec->y0, levelno); - band->x1 = int_ceildivpow2(tilec->x1, levelno); - band->y1 = int_ceildivpow2(tilec->y1, levelno); - } else { - band->x0 = int_ceildivpow2(tilec->x0 - (1 << levelno) * x0b, levelno + 1); - band->y0 = int_ceildivpow2(tilec->y0 - (1 << levelno) * y0b, levelno + 1); - band->x1 = int_ceildivpow2(tilec->x1 - (1 << levelno) * x0b, levelno + 1); - band->y1 = int_ceildivpow2(tilec->y1 - (1 << levelno) * y0b, levelno + 1); - } - - ss = &tccp->stepsizes[resno == 0 ? 0 : 3 * (resno - 1) + bandno + 1]; - gain = tccp->qmfbid == 0 ? dwt_getgain_real(band->bandno) : dwt_getgain( - band->bandno); - numbps = image->comps[compno].prec + gain; - band->stepsize = (float)((1.0 + ss->mant / 2048.0) * pow(2.0, - numbps - ss->expn)); - band->numbps = ss->expn + tccp->numgbits - 1; /* WHY -1 ? */ - - for (precno = 0; precno < res->pw * res->ph; precno++) { - int tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend; - - int cbgxstart = tlcbgxstart + (precno % res->pw) * (1 << cbgwidthexpn); - int cbgystart = tlcbgystart + (precno / res->pw) * (1 << cbgheightexpn); - int cbgxend = cbgxstart + (1 << cbgwidthexpn); - int cbgyend = cbgystart + (1 << cbgheightexpn); - - opj_tcd_precinct_t *prc = &band->precincts[precno]; - - /* precinct size (global) */ - prc->x0 = int_max(cbgxstart, band->x0); - prc->y0 = int_max(cbgystart, band->y0); - prc->x1 = int_min(cbgxend, band->x1); - prc->y1 = int_min(cbgyend, band->y1); - - tlcblkxstart = int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn; - tlcblkystart = int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn; - brcblkxend = int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn; - brcblkyend = int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn; - prc->cw = (brcblkxend - tlcblkxstart) >> cblkwidthexpn; - prc->ch = (brcblkyend - tlcblkystart) >> cblkheightexpn; - - opj_free(prc->cblks.enc); - prc->cblks.enc = (opj_tcd_cblk_enc_t*) opj_calloc(prc->cw * prc->ch, - sizeof(opj_tcd_cblk_enc_t)); - - if (prc->incltree != NULL) { - tgt_destroy(prc->incltree); - } - if (prc->imsbtree != NULL) { - tgt_destroy(prc->imsbtree); - } - - prc->incltree = tgt_create(prc->cw, prc->ch); - prc->imsbtree = tgt_create(prc->cw, prc->ch); - - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - int cblkxstart = tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn); - int cblkystart = tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn); - int cblkxend = cblkxstart + (1 << cblkwidthexpn); - int cblkyend = cblkystart + (1 << cblkheightexpn); - - opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno]; - - /* code-block size (global) */ - cblk->x0 = int_max(cblkxstart, prc->x0); - cblk->y0 = int_max(cblkystart, prc->y0); - cblk->x1 = int_min(cblkxend, prc->x1); - cblk->y1 = int_min(cblkyend, prc->y1); - cblk->data = (unsigned char*) opj_calloc(8192 + 2, sizeof(unsigned char)); - /* FIXME: mqc_init_enc and mqc_byteout underrun the buffer if we don't do this. Why? */ - cblk->data[0] = 0; - cblk->data[1] = 0; - cblk->data += 2; - cblk->layers = (opj_tcd_layer_t*) opj_calloc(100, sizeof(opj_tcd_layer_t)); - cblk->passes = (opj_tcd_pass_t*) opj_calloc(100, sizeof(opj_tcd_pass_t)); - } - } /* precno */ - } /* bandno */ - } /* resno */ - } /* compno */ - } /* tileno */ - - /* tcd_dump(stdout, tcd, &tcd->tcd_image); */ -} - -void tcd_malloc_decode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp) -{ - int i, j, tileno, p, q; - unsigned int x0 = 0, y0 = 0, x1 = 0, y1 = 0, w, h; - - tcd->image = image; - tcd->tcd_image->tw = cp->tw; - tcd->tcd_image->th = cp->th; - tcd->tcd_image->tiles = (opj_tcd_tile_t *) opj_calloc(cp->tw * cp->th, - sizeof(opj_tcd_tile_t)); - - /* - Allocate place to store the decoded data = final image - Place limited by the tile really present in the codestream - */ - - for (j = 0; j < cp->tileno_size; j++) { - opj_tcd_tile_t *tile; - - tileno = cp->tileno[j]; - tile = &(tcd->tcd_image->tiles[cp->tileno[tileno]]); - tile->numcomps = image->numcomps; - tile->comps = (opj_tcd_tilecomp_t*) opj_calloc(image->numcomps, - sizeof(opj_tcd_tilecomp_t)); - } - - for (i = 0; i < image->numcomps; i++) { - for (j = 0; j < cp->tileno_size; j++) { - opj_tcd_tile_t *tile; - opj_tcd_tilecomp_t *tilec; - - /* cfr p59 ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ - - tileno = cp->tileno[j]; - - tile = &(tcd->tcd_image->tiles[cp->tileno[tileno]]); - tilec = &tile->comps[i]; - - p = tileno % cp->tw; /* si numerotation matricielle .. */ - q = tileno / - cp->tw; /* .. coordonnees de la tile (q,p) q pour ligne et p pour colonne */ - - /* 4 borders of the tile rescale on the image if necessary */ - tile->x0 = int_max(cp->tx0 + p * cp->tdx, image->x0); - tile->y0 = int_max(cp->ty0 + q * cp->tdy, image->y0); - tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1); - tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1); - - tilec->x0 = int_ceildiv(tile->x0, image->comps[i].dx); - tilec->y0 = int_ceildiv(tile->y0, image->comps[i].dy); - tilec->x1 = int_ceildiv(tile->x1, image->comps[i].dx); - tilec->y1 = int_ceildiv(tile->y1, image->comps[i].dy); - - x0 = j == 0 ? tilec->x0 : int_min(x0, (unsigned int) tilec->x0); - y0 = j == 0 ? tilec->y0 : int_min(y0, (unsigned int) tilec->y0); - x1 = j == 0 ? tilec->x1 : int_max(x1, (unsigned int) tilec->x1); - y1 = j == 0 ? tilec->y1 : int_max(y1, (unsigned int) tilec->y1); - } - - w = int_ceildivpow2(x1 - x0, image->comps[i].factor); - h = int_ceildivpow2(y1 - y0, image->comps[i].factor); - - image->comps[i].w = w; - image->comps[i].h = h; - image->comps[i].x0 = x0; - image->comps[i].y0 = y0; - } -} - -void tcd_malloc_decode_tile(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, - int tileno, opj_codestream_info_t *cstr_info) -{ - int compno, resno, bandno, precno, cblkno; - opj_tcp_t *tcp; - opj_tcd_tile_t *tile; - - OPJ_ARG_NOT_USED(cstr_info); - - tcd->cp = cp; - - tcp = &(cp->tcps[cp->tileno[tileno]]); - tile = &(tcd->tcd_image->tiles[cp->tileno[tileno]]); - - tileno = cp->tileno[tileno]; - - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tccp_t *tccp = &tcp->tccps[compno]; - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - - if (tccp->numresolutions <= 0) { - cp->tileno[tileno] = -1; - return; - } - - /* border of each tile component (global) */ - tilec->x0 = int_ceildiv(tile->x0, image->comps[compno].dx); - tilec->y0 = int_ceildiv(tile->y0, image->comps[compno].dy); - tilec->x1 = int_ceildiv(tile->x1, image->comps[compno].dx); - tilec->y1 = int_ceildiv(tile->y1, image->comps[compno].dy); - - tilec->numresolutions = tccp->numresolutions; - tilec->resolutions = (opj_tcd_resolution_t *) opj_malloc( - tilec->numresolutions * sizeof(opj_tcd_resolution_t)); - - for (resno = 0; resno < tilec->numresolutions; resno++) { - int pdx, pdy; - int levelno = tilec->numresolutions - 1 - resno; - int tlprcxstart, tlprcystart, brprcxend, brprcyend; - int tlcbgxstart, tlcbgystart, brcbgxend, brcbgyend; - int cbgwidthexpn, cbgheightexpn; - int cblkwidthexpn, cblkheightexpn; - - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - - /* border for each resolution level (global) */ - res->x0 = int_ceildivpow2(tilec->x0, levelno); - res->y0 = int_ceildivpow2(tilec->y0, levelno); - res->x1 = int_ceildivpow2(tilec->x1, levelno); - res->y1 = int_ceildivpow2(tilec->y1, levelno); - res->numbands = resno == 0 ? 1 : 3; - - /* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */ - if (tccp->csty & J2K_CCP_CSTY_PRT) { - pdx = tccp->prcw[resno]; - pdy = tccp->prch[resno]; - } else { - pdx = 15; - pdy = 15; - } - - /* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ - tlprcxstart = int_floordivpow2(res->x0, pdx) << pdx; - tlprcystart = int_floordivpow2(res->y0, pdy) << pdy; - brprcxend = int_ceildivpow2(res->x1, pdx) << pdx; - brprcyend = int_ceildivpow2(res->y1, pdy) << pdy; - - res->pw = (res->x0 == res->x1) ? 0 : ((brprcxend - tlprcxstart) >> pdx); - res->ph = (res->y0 == res->y1) ? 0 : ((brprcyend - tlprcystart) >> pdy); - - if (resno == 0) { - tlcbgxstart = tlprcxstart; - tlcbgystart = tlprcystart; - brcbgxend = brprcxend; - brcbgyend = brprcyend; - cbgwidthexpn = pdx; - cbgheightexpn = pdy; - } else { - tlcbgxstart = int_ceildivpow2(tlprcxstart, 1); - tlcbgystart = int_ceildivpow2(tlprcystart, 1); - brcbgxend = int_ceildivpow2(brprcxend, 1); - brcbgyend = int_ceildivpow2(brprcyend, 1); - cbgwidthexpn = pdx - 1; - cbgheightexpn = pdy - 1; - } - - cblkwidthexpn = int_min(tccp->cblkw, cbgwidthexpn); - cblkheightexpn = int_min(tccp->cblkh, cbgheightexpn); - - for (bandno = 0; bandno < res->numbands; bandno++) { - int x0b, y0b; - int gain, numbps; - opj_stepsize_t *ss = NULL; - - opj_tcd_band_t *band = &res->bands[bandno]; - band->bandno = resno == 0 ? 0 : bandno + 1; - x0b = (band->bandno == 1) || (band->bandno == 3) ? 1 : 0; - y0b = (band->bandno == 2) || (band->bandno == 3) ? 1 : 0; - - if (band->bandno == 0) { - /* band border (global) */ - band->x0 = int_ceildivpow2(tilec->x0, levelno); - band->y0 = int_ceildivpow2(tilec->y0, levelno); - band->x1 = int_ceildivpow2(tilec->x1, levelno); - band->y1 = int_ceildivpow2(tilec->y1, levelno); - } else { - /* band border (global) */ - band->x0 = int_ceildivpow2(tilec->x0 - (1 << levelno) * x0b, levelno + 1); - band->y0 = int_ceildivpow2(tilec->y0 - (1 << levelno) * y0b, levelno + 1); - band->x1 = int_ceildivpow2(tilec->x1 - (1 << levelno) * x0b, levelno + 1); - band->y1 = int_ceildivpow2(tilec->y1 - (1 << levelno) * y0b, levelno + 1); - } - - ss = &tccp->stepsizes[resno == 0 ? 0 : 3 * (resno - 1) + bandno + 1]; - gain = tccp->qmfbid == 0 ? dwt_getgain_real(band->bandno) : dwt_getgain( - band->bandno); - numbps = image->comps[compno].prec + gain; - band->stepsize = (float)(((1.0 + ss->mant / 2048.0) * pow(2.0, - numbps - ss->expn)) * 0.5); - band->numbps = ss->expn + tccp->numgbits - 1; /* WHY -1 ? */ - - band->precincts = (opj_tcd_precinct_t *) opj_malloc(res->pw * res->ph * sizeof( - opj_tcd_precinct_t)); - - for (precno = 0; precno < res->pw * res->ph; precno++) { - int tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend; - int cbgxstart = tlcbgxstart + (precno % res->pw) * (1 << cbgwidthexpn); - int cbgystart = tlcbgystart + (precno / res->pw) * (1 << cbgheightexpn); - int cbgxend = cbgxstart + (1 << cbgwidthexpn); - int cbgyend = cbgystart + (1 << cbgheightexpn); - - opj_tcd_precinct_t *prc = &band->precincts[precno]; - /* precinct size (global) */ - prc->x0 = int_max(cbgxstart, band->x0); - prc->y0 = int_max(cbgystart, band->y0); - prc->x1 = int_min(cbgxend, band->x1); - prc->y1 = int_min(cbgyend, band->y1); - - tlcblkxstart = int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn; - tlcblkystart = int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn; - brcblkxend = int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn; - brcblkyend = int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn; - prc->cw = (brcblkxend - tlcblkxstart) >> cblkwidthexpn; - prc->ch = (brcblkyend - tlcblkystart) >> cblkheightexpn; - - prc->cblks.dec = (opj_tcd_cblk_dec_t*) opj_malloc(prc->cw * prc->ch * sizeof( - opj_tcd_cblk_dec_t)); - - prc->incltree = tgt_create(prc->cw, prc->ch); - prc->imsbtree = tgt_create(prc->cw, prc->ch); - - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - int cblkxstart = tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn); - int cblkystart = tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn); - int cblkxend = cblkxstart + (1 << cblkwidthexpn); - int cblkyend = cblkystart + (1 << cblkheightexpn); - - opj_tcd_cblk_dec_t* cblk = &prc->cblks.dec[cblkno]; - cblk->data = NULL; - cblk->segs = NULL; - /* code-block size (global) */ - cblk->x0 = int_max(cblkxstart, prc->x0); - cblk->y0 = int_max(cblkystart, prc->y0); - cblk->x1 = int_min(cblkxend, prc->x1); - cblk->y1 = int_min(cblkyend, prc->y1); - cblk->numsegs = 0; - } - } /* precno */ - } /* bandno */ - } /* resno */ - } /* compno */ - /* tcd_dump(stdout, tcd, &tcd->tcd_image); */ -} - -void tcd_makelayer_fixed(opj_tcd_t *tcd, int layno, int final) -{ - int compno, resno, bandno, precno, cblkno; - int value; /*, matrice[tcd_tcp->numlayers][tcd_tile->comps[0].numresolutions][3]; */ - int matrice[10][10][3]; - int i, j, k; - - opj_cp_t *cp = tcd->cp; - opj_tcd_tile_t *tcd_tile = tcd->tcd_tile; - opj_tcp_t *tcd_tcp = tcd->tcp; - - /*matrice=(int*)opj_malloc(tcd_tcp->numlayers*tcd_tile->comps[0].numresolutions*3*sizeof(int)); */ - - for (compno = 0; compno < tcd_tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno]; - for (i = 0; i < tcd_tcp->numlayers; i++) { - for (j = 0; j < tilec->numresolutions; j++) { - for (k = 0; k < 3; k++) { - matrice[i][j][k] = - (int)(cp->matrice[i * tilec->numresolutions * 3 + j * 3 + k] - * (float)(tcd->image->comps[compno].prec / 16.0)); - } - } - } - - for (resno = 0; resno < tilec->numresolutions; resno++) { - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - for (precno = 0; precno < res->pw * res->ph; precno++) { - opj_tcd_precinct_t *prc = &band->precincts[precno]; - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno]; - opj_tcd_layer_t *layer = &cblk->layers[layno]; - int n; - int imsb = tcd->image->comps[compno].prec - - cblk->numbps; /* number of bit-plan equal to zero */ - /* Correction of the matrix of coefficient to include the IMSB information */ - if (layno == 0) { - value = matrice[layno][resno][bandno]; - if (imsb >= value) { - value = 0; - } else { - value -= imsb; - } - } else { - value = matrice[layno][resno][bandno] - matrice[layno - 1][resno][bandno]; - if (imsb >= matrice[layno - 1][resno][bandno]) { - value -= (imsb - matrice[layno - 1][resno][bandno]); - if (value < 0) { - value = 0; - } - } - } - - if (layno == 0) { - cblk->numpassesinlayers = 0; - } - - n = cblk->numpassesinlayers; - if (cblk->numpassesinlayers == 0) { - if (value != 0) { - n = 3 * value - 2 + cblk->numpassesinlayers; - } else { - n = cblk->numpassesinlayers; - } - } else { - n = 3 * value + cblk->numpassesinlayers; - } - - layer->numpasses = n - cblk->numpassesinlayers; - - if (!layer->numpasses) { - continue; - } - - if (cblk->numpassesinlayers == 0) { - layer->len = cblk->passes[n - 1].rate; - layer->data = cblk->data; - } else { - layer->len = cblk->passes[n - 1].rate - cblk->passes[cblk->numpassesinlayers - - 1].rate; - layer->data = cblk->data + cblk->passes[cblk->numpassesinlayers - 1].rate; - } - if (final) { - cblk->numpassesinlayers = n; - } - } - } - } - } - } -} - -void tcd_rateallocate_fixed(opj_tcd_t *tcd) -{ - int layno; - for (layno = 0; layno < tcd->tcp->numlayers; layno++) { - tcd_makelayer_fixed(tcd, layno, 1); - } -} - -void tcd_makelayer(opj_tcd_t *tcd, int layno, double thresh, int final) -{ - int compno, resno, bandno, precno, cblkno, passno; - - opj_tcd_tile_t *tcd_tile = tcd->tcd_tile; - - tcd_tile->distolayer[layno] = 0; /* fixed_quality */ - - for (compno = 0; compno < tcd_tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno]; - for (resno = 0; resno < tilec->numresolutions; resno++) { - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - for (precno = 0; precno < res->pw * res->ph; precno++) { - opj_tcd_precinct_t *prc = &band->precincts[precno]; - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno]; - opj_tcd_layer_t *layer = &cblk->layers[layno]; - - int n; - if (layno == 0) { - cblk->numpassesinlayers = 0; - } - n = cblk->numpassesinlayers; - for (passno = cblk->numpassesinlayers; passno < cblk->totalpasses; passno++) { - int dr; - double dd; - opj_tcd_pass_t *pass = &cblk->passes[passno]; - if (n == 0) { - dr = pass->rate; - dd = pass->distortiondec; - } else { - dr = pass->rate - cblk->passes[n - 1].rate; - dd = pass->distortiondec - cblk->passes[n - 1].distortiondec; - } - if (!dr) { - if (dd != 0) { - n = passno + 1; - } - continue; - } - if (dd / dr >= thresh) { - n = passno + 1; - } - } - layer->numpasses = n - cblk->numpassesinlayers; - - if (!layer->numpasses) { - layer->disto = 0; - continue; - } - if (cblk->numpassesinlayers == 0) { - layer->len = cblk->passes[n - 1].rate; - layer->data = cblk->data; - layer->disto = cblk->passes[n - 1].distortiondec; - } else { - layer->len = cblk->passes[n - 1].rate - cblk->passes[cblk->numpassesinlayers - - 1].rate; - layer->data = cblk->data + cblk->passes[cblk->numpassesinlayers - 1].rate; - layer->disto = cblk->passes[n - 1].distortiondec - - cblk->passes[cblk->numpassesinlayers - 1].distortiondec; - } - - tcd_tile->distolayer[layno] += layer->disto; /* fixed_quality */ - - if (final) { - cblk->numpassesinlayers = n; - } - } - } - } - } - } -} - -opj_bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len, - opj_codestream_info_t *cstr_info) -{ - int compno, resno, bandno, precno, cblkno, passno, layno; - double min, max; - double cumdisto[100]; /* fixed_quality */ - const double K = 1; /* 1.1; fixed_quality */ - double maxSE = 0; - - opj_cp_t *cp = tcd->cp; - opj_tcd_tile_t *tcd_tile = tcd->tcd_tile; - opj_tcp_t *tcd_tcp = tcd->tcp; - - min = DBL_MAX; - max = 0; - - tcd_tile->numpix = 0; /* fixed_quality */ - - for (compno = 0; compno < tcd_tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno]; - tilec->numpix = 0; - - for (resno = 0; resno < tilec->numresolutions; resno++) { - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - - for (precno = 0; precno < res->pw * res->ph; precno++) { - opj_tcd_precinct_t *prc = &band->precincts[precno]; - - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno]; - - for (passno = 0; passno < cblk->totalpasses; passno++) { - opj_tcd_pass_t *pass = &cblk->passes[passno]; - int dr; - double dd, rdslope; - if (passno == 0) { - dr = pass->rate; - dd = pass->distortiondec; - } else { - dr = pass->rate - cblk->passes[passno - 1].rate; - dd = pass->distortiondec - cblk->passes[passno - 1].distortiondec; - } - if (dr == 0) { - continue; - } - rdslope = dd / dr; - if (rdslope < min) { - min = rdslope; - } - if (rdslope > max) { - max = rdslope; - } - } /* passno */ - - /* fixed_quality */ - tcd_tile->numpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0)); - tilec->numpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0)); - } /* cbklno */ - } /* precno */ - } /* bandno */ - } /* resno */ - - maxSE += (((double)(1 << tcd->image->comps[compno].prec) - 1.0) - * ((double)(1 << tcd->image->comps[compno].prec) - 1.0)) - * ((double)(tilec->numpix)); - } /* compno */ - - /* index file */ - if (cstr_info) { - opj_tile_info_t *tile_info = &cstr_info->tile[tcd->tcd_tileno]; - tile_info->numpix = tcd_tile->numpix; - tile_info->distotile = tcd_tile->distotile; - tile_info->thresh = (double *) opj_malloc(tcd_tcp->numlayers * sizeof(double)); - } - - for (layno = 0; layno < tcd_tcp->numlayers; layno++) { - double lo = min; - double hi = max; - int success = 0; - int maxlen = tcd_tcp->rates[layno] ? int_min(((int) ceil( - tcd_tcp->rates[layno])), len) : len; - double goodthresh = 0; - double stable_thresh = 0; - int i; - double distotarget; /* fixed_quality */ - - /* fixed_quality */ - distotarget = tcd_tile->distotile - ((K * maxSE) / pow((float)10, - tcd_tcp->distoratio[layno] / 10)); - - /* Don't try to find an optimal threshold but rather take everything not included yet, if - -r xx,yy,zz,0 (disto_alloc == 1 and rates == 0) - -q xx,yy,zz,0 (fixed_quality == 1 and distoratio == 0) - ==> possible to have some lossy layers and the last layer for sure lossless */ - if (((cp->disto_alloc == 1) && (tcd_tcp->rates[layno] > 0)) || - ((cp->fixed_quality == 1) && (tcd_tcp->distoratio[layno] > 0))) { - opj_t2_t *t2 = t2_create(tcd->cinfo, tcd->image, cp); - double thresh = 0; - - for (i = 0; i < 128; i++) { - int l = 0; - double distoachieved = 0; /* fixed_quality */ - thresh = (lo + hi) / 2; - - tcd_makelayer(tcd, layno, thresh, 0); - - if (cp->fixed_quality) { /* fixed_quality */ - if (cp->cinema) { - l = t2_encode_packets(t2, tcd->tcd_tileno, tcd_tile, layno + 1, dest, maxlen, - cstr_info, tcd->cur_tp_num, tcd->tp_pos, tcd->cur_pino, THRESH_CALC, - tcd->cur_totnum_tp); - if (l == -999) { - lo = thresh; - continue; - } else { - distoachieved = layno == 0 ? - tcd_tile->distolayer[0] : cumdisto[layno - 1] + tcd_tile->distolayer[layno]; - if (distoachieved < distotarget) { - hi = thresh; - stable_thresh = thresh; - continue; - } else { - lo = thresh; - } - } - } else { - distoachieved = (layno == 0) ? - tcd_tile->distolayer[0] : (cumdisto[layno - 1] + tcd_tile->distolayer[layno]); - if (distoachieved < distotarget) { - hi = thresh; - stable_thresh = thresh; - continue; - } - lo = thresh; - } - } else { - l = t2_encode_packets(t2, tcd->tcd_tileno, tcd_tile, layno + 1, dest, maxlen, - cstr_info, tcd->cur_tp_num, tcd->tp_pos, tcd->cur_pino, THRESH_CALC, - tcd->cur_totnum_tp); - /* TODO: what to do with l ??? seek / tell ??? */ - /* opj_event_msg(tcd->cinfo, EVT_INFO, "rate alloc: len=%d, max=%d\n", l, maxlen); */ - if (l == -999) { - lo = thresh; - continue; - } - hi = thresh; - stable_thresh = thresh; - } - } - success = 1; - goodthresh = stable_thresh == 0 ? thresh : stable_thresh; - t2_destroy(t2); - } else { - success = 1; - goodthresh = min; - } - - if (!success) { - return OPJ_FALSE; - } - - if (cstr_info) { /* Threshold for Marcela Index */ - cstr_info->tile[tcd->tcd_tileno].thresh[layno] = goodthresh; - } - tcd_makelayer(tcd, layno, goodthresh, 1); - - /* fixed_quality */ - cumdisto[layno] = (layno == 0) ? tcd_tile->distolayer[0] : - (cumdisto[layno - 1] + tcd_tile->distolayer[layno]); - } - - return OPJ_TRUE; -} - -int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len, - opj_codestream_info_t *cstr_info) -{ - int compno; - int l, i, numpacks = 0; - opj_tcd_tile_t *tile = NULL; - opj_tcp_t *tcd_tcp = NULL; - opj_cp_t *cp = NULL; - - opj_tcp_t *tcp = &tcd->cp->tcps[0]; - opj_tccp_t *tccp = &tcp->tccps[0]; - opj_image_t *image = tcd->image; - - opj_t1_t *t1 = NULL; /* T1 component */ - opj_t2_t *t2 = NULL; /* T2 component */ - - tcd->tcd_tileno = tileno; - tcd->tcd_tile = tcd->tcd_image->tiles; - tcd->tcp = &tcd->cp->tcps[tileno]; - - tile = tcd->tcd_tile; - tcd_tcp = tcd->tcp; - cp = tcd->cp; - - if (tcd->cur_tp_num == 0) { - tcd->encoding_time = opj_clock(); /* time needed to encode a tile */ - /* INDEX >> "Precinct_nb_X et Precinct_nb_Y" */ - if (cstr_info) { - opj_tcd_tilecomp_t *tilec_idx = &tile->comps[0]; /* based on component 0 */ - for (i = 0; i < tilec_idx->numresolutions; i++) { - opj_tcd_resolution_t *res_idx = &tilec_idx->resolutions[i]; - - cstr_info->tile[tileno].pw[i] = res_idx->pw; - cstr_info->tile[tileno].ph[i] = res_idx->ph; - - numpacks += res_idx->pw * res_idx->ph; - - cstr_info->tile[tileno].pdx[i] = tccp->prcw[i]; - cstr_info->tile[tileno].pdy[i] = tccp->prch[i]; - } - cstr_info->tile[tileno].packet = (opj_packet_info_t*) opj_calloc( - cstr_info->numcomps * cstr_info->numlayers * numpacks, - sizeof(opj_packet_info_t)); - } - /* << INDEX */ - - /*---------------TILE-------------------*/ - - for (compno = 0; compno < tile->numcomps; compno++) { - int x, y; - - int adjust = image->comps[compno].sgnd ? 0 : 1 << (image->comps[compno].prec - - 1); - int offset_x = int_ceildiv(image->x0, image->comps[compno].dx); - int offset_y = int_ceildiv(image->y0, image->comps[compno].dy); - - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - int tw = tilec->x1 - tilec->x0; - int w = int_ceildiv(image->x1 - image->x0, image->comps[compno].dx); - - /* extract tile data */ - - if (tcd_tcp->tccps[compno].qmfbid == 1) { - for (y = tilec->y0; y < tilec->y1; y++) { - /* start of the src tile scanline */ - int *data = &image->comps[compno].data[(tilec->x0 - offset_x) + - (y - offset_y) * w]; - /* start of the dst tile scanline */ - int *tile_data = &tilec->data[(y - tilec->y0) * tw]; - for (x = tilec->x0; x < tilec->x1; x++) { - *tile_data++ = *data++ - adjust; - } - } - } else if (tcd_tcp->tccps[compno].qmfbid == 0) { - for (y = tilec->y0; y < tilec->y1; y++) { - /* start of the src tile scanline */ - int *data = &image->comps[compno].data[(tilec->x0 - offset_x) + - (y - offset_y) * w]; - /* start of the dst tile scanline */ - int *tile_data = &tilec->data[(y - tilec->y0) * tw]; - for (x = tilec->x0; x < tilec->x1; x++) { - *tile_data++ = (*data++ - adjust) << 11; - } - - } - } - } - - /*----------------MCT-------------------*/ - if (tcd_tcp->mct) { - int samples = (tile->comps[0].x1 - tile->comps[0].x0) * - (tile->comps[0].y1 - tile->comps[0].y0); - if (tcd_tcp->tccps[0].qmfbid == 0) { - mct_encode_real(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data, - samples); - } else { - mct_encode(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data, - samples); - } - } - - /*----------------DWT---------------------*/ - - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - if (tcd_tcp->tccps[compno].qmfbid == 1) { - dwt_encode(tilec); - } else if (tcd_tcp->tccps[compno].qmfbid == 0) { - dwt_encode_real(tilec); - } - } - - /*------------------TIER1-----------------*/ - t1 = t1_create(tcd->cinfo); - t1_encode_cblks(t1, tile, tcd_tcp); - t1_destroy(t1); - - /*-----------RATE-ALLOCATE------------------*/ - - /* INDEX */ - if (cstr_info) { - cstr_info->index_write = 0; - } - if (cp->disto_alloc || cp->fixed_quality) { /* fixed_quality */ - /* Normal Rate/distortion allocation */ - tcd_rateallocate(tcd, dest, len, cstr_info); - } else { - /* Fixed layer allocation */ - tcd_rateallocate_fixed(tcd); - } - } - /*--------------TIER2------------------*/ - - /* INDEX */ - if (cstr_info) { - cstr_info->index_write = 1; - } - - t2 = t2_create(tcd->cinfo, image, cp); - l = t2_encode_packets(t2, tileno, tile, tcd_tcp->numlayers, dest, len, - cstr_info, tcd->tp_num, tcd->tp_pos, tcd->cur_pino, FINAL_PASS, - tcd->cur_totnum_tp); - t2_destroy(t2); - - /*---------------CLEAN-------------------*/ - - - if (tcd->cur_tp_num == tcd->cur_totnum_tp - 1) { - tcd->encoding_time = opj_clock() - tcd->encoding_time; - opj_event_msg(tcd->cinfo, EVT_INFO, "- tile encoded in %f s\n", - tcd->encoding_time); - - /* cleaning memory */ - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - opj_aligned_free(tilec->data); - } - } - - return l; -} - -opj_bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, - int tileno, opj_codestream_info_t *cstr_info) -{ - int l; - int compno; - int eof = 0; - double tile_time, t1_time, dwt_time; - opj_tcd_tile_t *tile = NULL; - - opj_t1_t *t1 = NULL; /* T1 component */ - opj_t2_t *t2 = NULL; /* T2 component */ - - tcd->tcd_tileno = tileno; - tcd->tcd_tile = &(tcd->tcd_image->tiles[tileno]); - tcd->tcp = &(tcd->cp->tcps[tileno]); - tile = tcd->tcd_tile; - - tile_time = opj_clock(); /* time needed to decode a tile */ - opj_event_msg(tcd->cinfo, EVT_INFO, "tile %d of %d\n", tileno + 1, - tcd->cp->tw * tcd->cp->th); - - /* INDEX >> */ - if (cstr_info) { - int resno, compno, numprec = 0; - for (compno = 0; compno < cstr_info->numcomps; compno++) { - opj_tcp_t *tcp = &tcd->cp->tcps[0]; - opj_tccp_t *tccp = &tcp->tccps[compno]; - opj_tcd_tilecomp_t *tilec_idx = &tile->comps[compno]; - for (resno = 0; resno < tilec_idx->numresolutions; resno++) { - opj_tcd_resolution_t *res_idx = &tilec_idx->resolutions[resno]; - cstr_info->tile[tileno].pw[resno] = res_idx->pw; - cstr_info->tile[tileno].ph[resno] = res_idx->ph; - numprec += res_idx->pw * res_idx->ph; - if (tccp->csty & J2K_CP_CSTY_PRT) { - cstr_info->tile[tileno].pdx[resno] = tccp->prcw[resno]; - cstr_info->tile[tileno].pdy[resno] = tccp->prch[resno]; - } else { - cstr_info->tile[tileno].pdx[resno] = 15; - cstr_info->tile[tileno].pdy[resno] = 15; - } - } - } - cstr_info->tile[tileno].packet = (opj_packet_info_t *) opj_malloc( - cstr_info->numlayers * numprec * sizeof(opj_packet_info_t)); - cstr_info->packno = 0; - } - /* << INDEX */ - - /*--------------TIER2------------------*/ - - t2 = t2_create(tcd->cinfo, tcd->image, tcd->cp); - l = t2_decode_packets(t2, src, len, tileno, tile, cstr_info); - t2_destroy(t2); - - if (l == -999) { - eof = 1; - opj_event_msg(tcd->cinfo, EVT_ERROR, "tcd_decode: incomplete bitstream\n"); - } - - /*------------------TIER1-----------------*/ - - t1_time = opj_clock(); /* time needed to decode a tile */ - t1 = t1_create(tcd->cinfo); - if (t1 == NULL) { - opj_event_msg(tcd->cinfo, EVT_ERROR, "Out of memory\n"); - t1_destroy(t1); - return OPJ_FALSE; - } - - for (compno = 0; compno < tile->numcomps; ++compno) { - opj_tcd_tilecomp_t* tilec = &tile->comps[compno]; - /* The +3 is headroom required by the vectorized DWT */ - tilec->data = (int*) opj_aligned_malloc((((tilec->x1 - tilec->x0) * - (tilec->y1 - tilec->y0)) + 3) * sizeof(int)); - if (tilec->data == NULL) { - opj_event_msg(tcd->cinfo, EVT_ERROR, "Out of memory\n"); - return OPJ_FALSE; - } - - t1_decode_cblks(t1, tilec, &tcd->tcp->tccps[compno]); - } - t1_destroy(t1); - t1_time = opj_clock() - t1_time; - opj_event_msg(tcd->cinfo, EVT_INFO, "- tiers-1 took %f s\n", t1_time); - - /*----------------DWT---------------------*/ - - dwt_time = opj_clock(); /* time needed to decode a tile */ - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - int numres2decode; - - if (tcd->cp->reduce != 0) { - if (tile->comps[compno].numresolutions < (tcd->cp->reduce - 1)) { - opj_event_msg(tcd->cinfo, EVT_ERROR, - "Error decoding tile. The number of resolutions to remove [%d+1] is higher than the number " - " of resolutions in the original codestream [%d]\nModify the cp_reduce parameter.\n", - tcd->cp->reduce, tile->comps[compno].numresolutions); - return OPJ_FALSE; - } else { - tcd->image->comps[compno].resno_decoded = - tile->comps[compno].numresolutions - tcd->cp->reduce - 1; - } - } - - numres2decode = tcd->image->comps[compno].resno_decoded + 1; - if (numres2decode > 0) { - if (tcd->tcp->tccps[compno].qmfbid == 1) { - dwt_decode(tilec, numres2decode); - } else { - dwt_decode_real(tilec, numres2decode); - } - } - } - dwt_time = opj_clock() - dwt_time; - opj_event_msg(tcd->cinfo, EVT_INFO, "- dwt took %f s\n", dwt_time); - - /*----------------MCT-------------------*/ - - if (tcd->tcp->mct) { - int n = (tile->comps[0].x1 - tile->comps[0].x0) * (tile->comps[0].y1 - - tile->comps[0].y0); - - if (tile->numcomps >= 3) { - if (tcd->tcp->tccps[0].qmfbid == 1) { - mct_decode( - tile->comps[0].data, - tile->comps[1].data, - tile->comps[2].data, - n); - } else { - mct_decode_real( - (float*)tile->comps[0].data, - (float*)tile->comps[1].data, - (float*)tile->comps[2].data, - n); - } - } else { - opj_event_msg(tcd->cinfo, EVT_WARNING, - "Number of components (%d) is inconsistent with a MCT. Skip the MCT step.\n", - tile->numcomps); - } - } - - /*---------------TILE-------------------*/ - - for (compno = 0; compno < tile->numcomps; ++compno) { - opj_tcd_tilecomp_t* tilec = &tile->comps[compno]; - opj_image_comp_t* imagec = &tcd->image->comps[compno]; - opj_tcd_resolution_t* res = &tilec->resolutions[imagec->resno_decoded]; - int adjust = imagec->sgnd ? 0 : 1 << (imagec->prec - 1); - int min = imagec->sgnd ? -(1 << (imagec->prec - 1)) : 0; - int max = imagec->sgnd ? (1 << (imagec->prec - 1)) - 1 : - (1 << imagec->prec) - 1; - - int tw = tilec->x1 - tilec->x0; - int w = imagec->w; - - int offset_x = int_ceildivpow2(imagec->x0, imagec->factor); - int offset_y = int_ceildivpow2(imagec->y0, imagec->factor); - - int i, j; - if (!imagec->data) { - imagec->data = (int*) opj_malloc(imagec->w * imagec->h * sizeof(int)); - } - if (!imagec->data) { - opj_event_msg(tcd->cinfo, EVT_ERROR, "Out of memory\n"); - return OPJ_FALSE; - } - if (tcd->tcp->tccps[compno].qmfbid == 1) { - for (j = res->y0; j < res->y1; ++j) { - for (i = res->x0; i < res->x1; ++i) { - int v = tilec->data[i - res->x0 + (j - res->y0) * tw]; - v += adjust; - imagec->data[(i - offset_x) + (j - offset_y) * w] = int_clamp(v, min, max); - } - } - } else { - for (j = res->y0; j < res->y1; ++j) { - for (i = res->x0; i < res->x1; ++i) { - float tmp = ((float*)tilec->data)[i - res->x0 + (j - res->y0) * tw]; - int v = lrintf(tmp); - v += adjust; - imagec->data[(i - offset_x) + (j - offset_y) * w] = int_clamp(v, min, max); - } - } - } - opj_aligned_free(tilec->data); - } - - tile_time = opj_clock() - tile_time; /* time needed to decode a tile */ - opj_event_msg(tcd->cinfo, EVT_INFO, "- tile decoded in %f s\n", tile_time); - - if (eof) { - return OPJ_FALSE; - } - - return OPJ_TRUE; -} - -void tcd_free_decode(opj_tcd_t *tcd) -{ - opj_tcd_image_t *tcd_image = tcd->tcd_image; - int i = 0; - for (i = 0; i < tcd_image->tw * tcd_image->th; i++) { - tcd_free_decode_tile(tcd, i); - } - - opj_free(tcd_image->tiles); -} - -void tcd_free_decode_tile(opj_tcd_t *tcd, int tileno) -{ - int compno, resno, bandno, precno, cblkno; - - opj_tcd_image_t *tcd_image = tcd->tcd_image; - - opj_tcd_tile_t *tile = &tcd_image->tiles[tileno]; - if (tile->comps != NULL) { - for (compno = 0; compno < tile->numcomps; compno++) { - opj_tcd_tilecomp_t *tilec = &tile->comps[compno]; - for (resno = 0; resno < tilec->numresolutions; resno++) { - opj_tcd_resolution_t *res = &tilec->resolutions[resno]; - for (bandno = 0; bandno < res->numbands; bandno++) { - opj_tcd_band_t *band = &res->bands[bandno]; - for (precno = 0; precno < res->ph * res->pw; precno++) { - opj_tcd_precinct_t *prec = &band->precincts[precno]; - if (prec->cblks.dec != NULL) { - for (cblkno = 0; cblkno < prec->cw * prec->ch; ++cblkno) { - opj_tcd_cblk_dec_t* cblk = &prec->cblks.dec[cblkno]; - opj_free(cblk->data); - opj_free(cblk->segs); - } - opj_free(prec->cblks.dec); - } - if (prec->imsbtree != NULL) { - tgt_destroy(prec->imsbtree); - } - if (prec->incltree != NULL) { - tgt_destroy(prec->incltree); - } - - - } - opj_free(band->precincts); - } - } - opj_free(tilec->resolutions); - } - opj_free(tile->comps); - tile->comps = NULL; - } -} - - - diff --git a/src/lib/openmj2/tcd.h b/src/lib/openmj2/tcd.h deleted file mode 100644 index 4a530014..00000000 --- a/src/lib/openmj2/tcd.h +++ /dev/null @@ -1,305 +0,0 @@ -/* - * 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 __TCD_H -#define __TCD_H -/** -@file tcd.h -@brief Implementation of a tile coder/decoder (TCD) - -The functions in TCD.C have for goal to encode or decode each tile independently from -each other. The functions in TCD.C are used by some function in J2K.C. -*/ - -/** @defgroup TCD TCD - Implementation of a tile coder/decoder */ -/*@{*/ - -/** -FIXME: documentation -*/ -typedef struct opj_tcd_seg { - unsigned char** data; - int dataindex; - int numpasses; - int len; - int maxpasses; - int numnewpasses; - int newlen; -} opj_tcd_seg_t; - -/** -FIXME: documentation -*/ -typedef struct opj_tcd_pass { - int rate; - double distortiondec; - int term, len; -} opj_tcd_pass_t; - -/** -FIXME: documentation -*/ -typedef struct opj_tcd_layer { - int numpasses; /* Number of passes in the layer */ - int len; /* len of information */ - double disto; /* add for index (Cfr. Marcela) */ - unsigned char *data; /* data */ -} opj_tcd_layer_t; - -/** -FIXME: documentation -*/ -typedef struct opj_tcd_cblk_enc { - unsigned char* data; /* Data */ - opj_tcd_layer_t* layers; /* layer information */ - opj_tcd_pass_t* passes; /* information about the passes */ - int x0, y0, x1, - y1; /* dimension of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */ - int numbps; - int numlenbits; - int numpasses; /* number of pass already done for the code-blocks */ - int numpassesinlayers; /* number of passes in the layer */ - int totalpasses; /* total number of passes */ -} opj_tcd_cblk_enc_t; - -typedef struct opj_tcd_cblk_dec { - unsigned char* data; /* Data */ - opj_tcd_seg_t* segs; /* segments information */ - int x0, y0, x1, - y1; /* dimension of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */ - int numbps; - int numlenbits; - int len; /* length */ - int numnewpasses; /* number of pass added to the code-blocks */ - int numsegs; /* number of segments */ -} opj_tcd_cblk_dec_t; - -/** -FIXME: documentation -*/ -typedef struct opj_tcd_precinct { - int x0, y0, x1, - y1; /* dimension of the precinct : left upper corner (x0, y0) right low corner (x1,y1) */ - int cw, ch; /* number of precinct in width and height */ - union { /* code-blocks information */ - opj_tcd_cblk_enc_t* enc; - opj_tcd_cblk_dec_t* dec; - } cblks; - opj_tgt_tree_t *incltree; /* inclusion tree */ - opj_tgt_tree_t *imsbtree; /* IMSB tree */ -} opj_tcd_precinct_t; - -/** -FIXME: documentation -*/ -typedef struct opj_tcd_band { - int x0, y0, x1, - y1; /* dimension of the subband : left upper corner (x0, y0) right low corner (x1,y1) */ - int bandno; - opj_tcd_precinct_t *precincts; /* precinct information */ - int numbps; - float stepsize; -} opj_tcd_band_t; - -/** -FIXME: documentation -*/ -typedef struct opj_tcd_resolution { - int x0, y0, x1, - y1; /* dimension of the resolution level : left upper corner (x0, y0) right low corner (x1,y1) */ - int pw, ph; - int numbands; /* number sub-band for the resolution level */ - opj_tcd_band_t bands[3]; /* subband information */ -} opj_tcd_resolution_t; - -/** -FIXME: documentation -*/ -typedef struct opj_tcd_tilecomp { - int x0, y0, x1, - y1; /* dimension of component : left upper corner (x0, y0) right low corner (x1,y1) */ - int numresolutions; /* number of resolutions level */ - opj_tcd_resolution_t *resolutions; /* resolutions information */ - int *data; /* data of the component */ - int numpix; /* add fixed_quality */ -} opj_tcd_tilecomp_t; - -/** -FIXME: documentation -*/ -typedef struct opj_tcd_tile { - int x0, y0, x1, - y1; /* dimension of the tile : left upper corner (x0, y0) right low corner (x1,y1) */ - int numcomps; /* number of components in tile */ - opj_tcd_tilecomp_t *comps; /* Components information */ - int numpix; /* add fixed_quality */ - double distotile; /* add fixed_quality */ - double distolayer[100]; /* add fixed_quality */ - /** packet number */ - int packno; -} opj_tcd_tile_t; - -/** -FIXME: documentation -*/ -typedef struct opj_tcd_image { - int tw, th; /* number of tiles in width and height */ - opj_tcd_tile_t *tiles; /* Tiles information */ -} opj_tcd_image_t; - -/** -Tile coder/decoder -*/ -typedef struct opj_tcd { - /** Position of the tilepart flag in Progression order*/ - int tp_pos; - /** Tile part number*/ - int tp_num; - /** Current tile part number*/ - int cur_tp_num; - /** Total number of tileparts of the current tile*/ - int cur_totnum_tp; - /** Current Packet iterator number */ - int cur_pino; - /** codec context */ - opj_common_ptr cinfo; - - /** info on each image tile */ - opj_tcd_image_t *tcd_image; - /** image */ - opj_image_t *image; - /** coding parameters */ - opj_cp_t *cp; - /** pointer to the current encoded/decoded tile */ - opj_tcd_tile_t *tcd_tile; - /** coding/decoding parameters common to all tiles */ - opj_tcp_t *tcp; - /** current encoded/decoded tile */ - int tcd_tileno; - /** Time taken to encode a tile*/ - double encoding_time; -} opj_tcd_t; - -/** @name Exported functions */ -/*@{*/ -/* ----------------------------------------------------------------------- */ - -/** -Dump the content of a tcd structure -*/ -void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t *img); -/** -Create a new TCD handle -@param cinfo Codec context info -@return Returns a new TCD handle if successful returns NULL otherwise -*/ -opj_tcd_t* tcd_create(opj_common_ptr cinfo); -/** -Destroy a previously created TCD handle -@param tcd TCD handle to destroy -*/ -void tcd_destroy(opj_tcd_t *tcd); -/** -Initialize the tile coder (allocate the memory) -@param tcd TCD handle -@param image Raw image -@param cp Coding parameters -@param curtileno Number that identifies the tile that will be encoded -*/ -void tcd_malloc_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, - int curtileno); -/** -Free the memory allocated for encoding -@param tcd TCD handle -*/ -void tcd_free_encode(opj_tcd_t *tcd); -/** -Initialize the tile coder (reuses the memory allocated by tcd_malloc_encode) -@param tcd TCD handle -@param image Raw image -@param cp Coding parameters -@param curtileno Number that identifies the tile that will be encoded -*/ -void tcd_init_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, - int curtileno); -/** -Initialize the tile decoder -@param tcd TCD handle -@param image Raw image -@param cp Coding parameters -*/ -void tcd_malloc_decode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp); -void tcd_malloc_decode_tile(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, - int tileno, opj_codestream_info_t *cstr_info); -void tcd_makelayer_fixed(opj_tcd_t *tcd, int layno, int final); -void tcd_rateallocate_fixed(opj_tcd_t *tcd); -void tcd_makelayer(opj_tcd_t *tcd, int layno, double thresh, int final); -opj_bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len, - opj_codestream_info_t *cstr_info); -/** -Encode a tile from the raw image into a buffer -@param tcd TCD handle -@param tileno Number that identifies one of the tiles to be encoded -@param dest Destination buffer -@param len Length of destination buffer -@param cstr_info Codestream information structure -@return -*/ -int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len, - opj_codestream_info_t *cstr_info); -/** -Decode a tile from a buffer into a raw image -@param tcd TCD handle -@param src Source buffer -@param len Length of source buffer -@param tileno Number that identifies one of the tiles to be decoded -@param cstr_info Codestream information structure -*/ -opj_bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, - int tileno, opj_codestream_info_t *cstr_info); -/** -Free the memory allocated for decoding -@param tcd TCD handle -*/ -void tcd_free_decode(opj_tcd_t *tcd); -void tcd_free_decode_tile(opj_tcd_t *tcd, int tileno); - -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __TCD_H */ diff --git a/src/lib/openmj2/tgt.c b/src/lib/openmj2/tgt.c deleted file mode 100644 index ae5b8933..00000000 --- a/src/lib/openmj2/tgt.c +++ /dev/null @@ -1,231 +0,0 @@ -/* - * The copyright in this software is being made available under the 2-clauses - * BSD License, included below. This software may be subject to other third - * party and contributor rights, including patent rights, and no such rights - * are granted under this license. - * - * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2014, Professor Benoit Macq - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux - * Copyright (c) 2003-2014, Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include "opj_includes.h" - -/* -========================================================== - Tag-tree coder interface -========================================================== -*/ - -opj_tgt_tree_t *tgt_create(int numleafsh, int numleafsv) -{ - int nplh[32]; - int nplv[32]; - opj_tgt_node_t *node = NULL; - opj_tgt_node_t *parentnode = NULL; - opj_tgt_node_t *parentnode0 = NULL; - opj_tgt_tree_t *tree = NULL; - int i, j, k; - int numlvls; - int n; - - tree = (opj_tgt_tree_t *) opj_malloc(sizeof(opj_tgt_tree_t)); - if (!tree) { - return NULL; - } - tree->numleafsh = numleafsh; - tree->numleafsv = numleafsv; - - numlvls = 0; - nplh[0] = numleafsh; - nplv[0] = numleafsv; - tree->numnodes = 0; - do { - n = nplh[numlvls] * nplv[numlvls]; - nplh[numlvls + 1] = (nplh[numlvls] + 1) / 2; - nplv[numlvls + 1] = (nplv[numlvls] + 1) / 2; - tree->numnodes += n; - ++numlvls; - } while (n > 1); - - /* ADD */ - if (tree->numnodes == 0) { - opj_free(tree); - return NULL; - } - - tree->nodes = (opj_tgt_node_t*) opj_calloc(tree->numnodes, - sizeof(opj_tgt_node_t)); - if (!tree->nodes) { - opj_free(tree); - return NULL; - } - - node = tree->nodes; - parentnode = &tree->nodes[tree->numleafsh * tree->numleafsv]; - parentnode0 = parentnode; - - for (i = 0; i < numlvls - 1; ++i) { - for (j = 0; j < nplv[i]; ++j) { - k = nplh[i]; - while (--k >= 0) { - node->parent = parentnode; - ++node; - if (--k >= 0) { - node->parent = parentnode; - ++node; - } - ++parentnode; - } - if ((j & 1) || j == nplv[i] - 1) { - parentnode0 = parentnode; - } else { - parentnode = parentnode0; - parentnode0 += nplh[i]; - } - } - } - node->parent = 0; - - tgt_reset(tree); - - return tree; -} - -void tgt_destroy(opj_tgt_tree_t *tree) -{ - opj_free(tree->nodes); - opj_free(tree); -} - -void tgt_reset(opj_tgt_tree_t *tree) -{ - int i; - - if (NULL == tree) { - return; - } - - for (i = 0; i < tree->numnodes; i++) { - tree->nodes[i].value = 999; - tree->nodes[i].low = 0; - tree->nodes[i].known = 0; - } -} - -void tgt_setvalue(opj_tgt_tree_t *tree, int leafno, int value) -{ - opj_tgt_node_t *node; - node = &tree->nodes[leafno]; - while (node && node->value > value) { - node->value = value; - node = node->parent; - } -} - -void tgt_encode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, - int threshold) -{ - opj_tgt_node_t *stk[31]; - opj_tgt_node_t **stkptr; - opj_tgt_node_t *node; - int low; - - stkptr = stk; - node = &tree->nodes[leafno]; - while (node->parent) { - *stkptr++ = node; - node = node->parent; - } - - low = 0; - for (;;) { - if (low > node->low) { - node->low = low; - } else { - low = node->low; - } - - while (low < threshold) { - if (low >= node->value) { - if (!node->known) { - bio_write(bio, 1, 1); - node->known = 1; - } - break; - } - bio_write(bio, 0, 1); - ++low; - } - - node->low = low; - if (stkptr == stk) { - break; - } - node = *--stkptr; - } -} - -int tgt_decode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold) -{ - opj_tgt_node_t *stk[31]; - opj_tgt_node_t **stkptr; - opj_tgt_node_t *node; - int low; - - stkptr = stk; - node = &tree->nodes[leafno]; - while (node->parent) { - *stkptr++ = node; - node = node->parent; - } - - low = 0; - for (;;) { - if (low > node->low) { - node->low = low; - } else { - low = node->low; - } - while (low < threshold && low < node->value) { - if (bio_read(bio, 1)) { - node->value = low; - } else { - ++low; - } - } - node->low = low; - if (stkptr == stk) { - break; - } - node = *--stkptr; - } - - return (node->value < threshold) ? 1 : 0; -} diff --git a/src/lib/openmj2/tgt.h b/src/lib/openmj2/tgt.h deleted file mode 100644 index 0a299449..00000000 --- a/src/lib/openmj2/tgt.h +++ /dev/null @@ -1,121 +0,0 @@ -/* - * 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 __TGT_H -#define __TGT_H -/** -@file tgt.h -@brief Implementation of a tag-tree coder (TGT) - -The functions in TGT.C have for goal to realize a tag-tree coder. The functions in TGT.C -are used by some function in T2.C. -*/ - -/** @defgroup TGT TGT - Implementation of a tag-tree coder */ -/*@{*/ - -/** -Tag node -*/ -typedef struct opj_tgt_node { - struct opj_tgt_node *parent; - int value; - int low; - int known; -} opj_tgt_node_t; - -/** -Tag tree -*/ -typedef struct opj_tgt_tree { - int numleafsh; - int numleafsv; - int numnodes; - opj_tgt_node_t *nodes; -} opj_tgt_tree_t; - -/** @name Exported functions */ -/*@{*/ -/* ----------------------------------------------------------------------- */ -/** -Create a tag-tree -@param numleafsh Width of the array of leafs of the tree -@param numleafsv Height of the array of leafs of the tree -@return Returns a new tag-tree if successful, returns NULL otherwise -*/ -opj_tgt_tree_t *tgt_create(int numleafsh, int numleafsv); -/** -Destroy a tag-tree, liberating memory -@param tree Tag-tree to destroy -*/ -void tgt_destroy(opj_tgt_tree_t *tree); -/** -Reset a tag-tree (set all leaves to 0) -@param tree Tag-tree to reset -*/ -void tgt_reset(opj_tgt_tree_t *tree); -/** -Set the value of a leaf of a tag-tree -@param tree Tag-tree to modify -@param leafno Number that identifies the leaf to modify -@param value New value of the leaf -*/ -void tgt_setvalue(opj_tgt_tree_t *tree, int leafno, int value); -/** -Encode the value of a leaf of the tag-tree up to a given threshold -@param bio Pointer to a BIO handle -@param tree Tag-tree to modify -@param leafno Number that identifies the leaf to encode -@param threshold Threshold to use when encoding value of the leaf -*/ -void tgt_encode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, - int threshold); -/** -Decode the value of a leaf of the tag-tree up to a given threshold -@param bio Pointer to a BIO handle -@param tree Tag-tree to decode -@param leafno Number that identifies the leaf to decode -@param threshold Threshold to use when decoding value of the leaf -@return Returns 1 if the node's value < threshold, returns 0 otherwise -*/ -int tgt_decode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold); -/* ----------------------------------------------------------------------- */ -/*@}*/ - -/*@}*/ - -#endif /* __TGT_H */ diff --git a/wrapping/java/openjp2/CMakeLists.txt b/wrapping/java/openjp2/CMakeLists.txt index e4639385..6a9ebc20 100644 --- a/wrapping/java/openjp2/CMakeLists.txt +++ b/wrapping/java/openjp2/CMakeLists.txt @@ -28,9 +28,6 @@ add_library(openjpegjni MODULE 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} )