From c822e3537db7e964678191fe149e1c8df9566966 Mon Sep 17 00:00:00 2001 From: Antonin Descampe Date: Mon, 30 Oct 2006 15:32:50 +0000 Subject: [PATCH] initial release of jp3d library and codec --- DllJp3dVM.dsp | 273 +++++ DllJp3dVM.ncb | Bin 0 -> 175104 bytes DllJp3dVM.sln | 21 + DllJp3dVM.suo | Bin 0 -> 9216 bytes DllJp3dVM.vcproj | 278 +++++ LICENSE.txt | 30 + LibJp3dVM.ncb | Bin 0 -> 404480 bytes LibJp3dVM.sln | 21 + LibJp3dVM.suo | Bin 0 -> 9216 bytes LibJp3dVM.vcproj | 249 ++++ Makefile | 72 ++ README.txt | 285 +++++ bin/LibJp3dVM.lib | Bin 0 -> 9785822 bytes bin/OpenJP3D.dll | Bin 0 -> 9920512 bytes bin/jp3d_vm_dec.exe | Bin 0 -> 9687040 bytes bin/jp3d_vm_enc.exe | Bin 0 -> 9756672 bytes bin/openjpeg.h | 715 ++++++++++++ codec/convert.c | 997 ++++++++++++++++ codec/convert.h | 51 + codec/getopt.c | 109 ++ codec/getopt.h | 14 + codec/jp3d_to_volume.c | 535 +++++++++ codec/jp3d_vm_dec.ncb | Bin 0 -> 470016 bytes codec/jp3d_vm_dec.sln | 30 + codec/jp3d_vm_dec.suo | Bin 0 -> 13312 bytes codec/jp3d_vm_dec.vcproj | 157 +++ codec/jp3d_vm_enc.ncb | Bin 0 -> 568320 bytes codec/jp3d_vm_enc.sln | 35 + codec/jp3d_vm_enc.suo | Bin 0 -> 21504 bytes codec/jp3d_vm_enc.vcproj | 157 +++ codec/volume_to_jp3d.c | 903 +++++++++++++++ libjp3dvm/bio.c | 189 ++++ libjp3dvm/bio.h | 132 +++ libjp3dvm/cio.c | 217 ++++ libjp3dvm/cio.h | 100 ++ libjp3dvm/dirent.h | 676 +++++++++++ libjp3dvm/dwt.c | 1016 +++++++++++++++++ libjp3dvm/dwt.h | 100 ++ libjp3dvm/event.c | 181 +++ libjp3dvm/event.h | 58 + libjp3dvm/fix.h | 62 + libjp3dvm/int.h | 122 ++ libjp3dvm/jp3d.c | 2328 ++++++++++++++++++++++++++++++++++++++ libjp3dvm/jp3d.h | 518 +++++++++ libjp3dvm/jp3d_lib.c | 76 ++ libjp3dvm/jp3d_lib.h | 75 ++ libjp3dvm/mct.c | 131 +++ libjp3dvm/mct.h | 97 ++ libjp3dvm/mqc.c | 548 +++++++++ libjp3dvm/mqc.h | 201 ++++ libjp3dvm/openjpeg.c | 207 ++++ libjp3dvm/openjpeg.h | 715 ++++++++++++ libjp3dvm/opj_includes.h | 82 ++ libjp3dvm/pi.c | 630 +++++++++++ libjp3dvm/pi.h | 145 +++ libjp3dvm/raw.c | 86 ++ libjp3dvm/raw.h | 99 ++ libjp3dvm/t1.c | 1181 +++++++++++++++++++ libjp3dvm/t1.h | 173 +++ libjp3dvm/t1_3d.c | 1230 ++++++++++++++++++++ libjp3dvm/t1_3d.h | 173 +++ libjp3dvm/t2.c | 675 +++++++++++ libjp3dvm/t2.h | 101 ++ libjp3dvm/tcd.c | 1738 ++++++++++++++++++++++++++++ libjp3dvm/tcd.h | 334 ++++++ libjp3dvm/tgt.c | 256 +++++ libjp3dvm/tgt.h | 124 ++ libjp3dvm/volume.c | 89 ++ libjp3dvm/volume.h | 43 + tcltk/LPI_JP3D_VM.tcl | 114 ++ tcltk/Thumbs.db | Bin 0 -> 18944 bytes tcltk/decoder.tcl | 272 +++++ tcltk/encoder.tcl | 470 ++++++++ tcltk/logoLPI.gif | Bin 0 -> 5212 bytes 74 files changed, 20696 insertions(+) create mode 100755 DllJp3dVM.dsp create mode 100755 DllJp3dVM.ncb create mode 100755 DllJp3dVM.sln create mode 100755 DllJp3dVM.suo create mode 100755 DllJp3dVM.vcproj create mode 100755 LICENSE.txt create mode 100755 LibJp3dVM.ncb create mode 100755 LibJp3dVM.sln create mode 100755 LibJp3dVM.suo create mode 100755 LibJp3dVM.vcproj create mode 100755 Makefile create mode 100755 README.txt create mode 100755 bin/LibJp3dVM.lib create mode 100755 bin/OpenJP3D.dll create mode 100755 bin/jp3d_vm_dec.exe create mode 100755 bin/jp3d_vm_enc.exe create mode 100755 bin/openjpeg.h create mode 100755 codec/convert.c create mode 100755 codec/convert.h create mode 100755 codec/getopt.c create mode 100755 codec/getopt.h create mode 100755 codec/jp3d_to_volume.c create mode 100755 codec/jp3d_vm_dec.ncb create mode 100755 codec/jp3d_vm_dec.sln create mode 100755 codec/jp3d_vm_dec.suo create mode 100755 codec/jp3d_vm_dec.vcproj create mode 100755 codec/jp3d_vm_enc.ncb create mode 100755 codec/jp3d_vm_enc.sln create mode 100755 codec/jp3d_vm_enc.suo create mode 100755 codec/jp3d_vm_enc.vcproj create mode 100755 codec/volume_to_jp3d.c create mode 100755 libjp3dvm/bio.c create mode 100755 libjp3dvm/bio.h create mode 100755 libjp3dvm/cio.c create mode 100755 libjp3dvm/cio.h create mode 100755 libjp3dvm/dirent.h create mode 100755 libjp3dvm/dwt.c create mode 100755 libjp3dvm/dwt.h create mode 100755 libjp3dvm/event.c create mode 100755 libjp3dvm/event.h create mode 100755 libjp3dvm/fix.h create mode 100755 libjp3dvm/int.h create mode 100755 libjp3dvm/jp3d.c create mode 100755 libjp3dvm/jp3d.h create mode 100755 libjp3dvm/jp3d_lib.c create mode 100755 libjp3dvm/jp3d_lib.h create mode 100755 libjp3dvm/mct.c create mode 100755 libjp3dvm/mct.h create mode 100755 libjp3dvm/mqc.c create mode 100755 libjp3dvm/mqc.h create mode 100755 libjp3dvm/openjpeg.c create mode 100755 libjp3dvm/openjpeg.h create mode 100755 libjp3dvm/opj_includes.h create mode 100755 libjp3dvm/pi.c create mode 100755 libjp3dvm/pi.h create mode 100755 libjp3dvm/raw.c create mode 100755 libjp3dvm/raw.h create mode 100755 libjp3dvm/t1.c create mode 100755 libjp3dvm/t1.h create mode 100755 libjp3dvm/t1_3d.c create mode 100755 libjp3dvm/t1_3d.h create mode 100755 libjp3dvm/t2.c create mode 100755 libjp3dvm/t2.h create mode 100755 libjp3dvm/tcd.c create mode 100755 libjp3dvm/tcd.h create mode 100755 libjp3dvm/tgt.c create mode 100755 libjp3dvm/tgt.h create mode 100755 libjp3dvm/volume.c create mode 100755 libjp3dvm/volume.h create mode 100755 tcltk/LPI_JP3D_VM.tcl create mode 100755 tcltk/Thumbs.db create mode 100755 tcltk/decoder.tcl create mode 100755 tcltk/encoder.tcl create mode 100755 tcltk/logoLPI.gif diff --git a/DllJp3dVM.dsp b/DllJp3dVM.dsp new file mode 100755 index 00000000..6408c639 --- /dev/null +++ b/DllJp3dVM.dsp @@ -0,0 +1,273 @@ +# Microsoft Developer Studio Project File - Name="DllOpenJPEG" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=DllOpenJPEG - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "DllOpenJPEG.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "DllOpenJPEG.mak" CFG="DllOpenJPEG - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "DllOpenJPEG - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "DllOpenJPEG - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "DllOpenJPEG - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "DLLOPENJPEG_EXPORTS" /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "OPJ_EXPORTS" /FD /c +# SUBTRACT CPP /YX /Yc /Yu +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x40c /d "NDEBUG" +# ADD RSC /l 0x40c /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"Release/OpenJPEG.dll" +# Begin Special Build Tool +SOURCE="$(InputPath)" +PostBuild_Cmds=if not exist dist mkdir dist copy libopenjpeg\openjpeg.h dist copy Release\OpenJPEG.dll dist copy Release\OpenJPEG.lib dist +# End Special Build Tool + +!ELSEIF "$(CFG)" == "DllOpenJPEG - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "DLLOPENJPEG_EXPORTS" /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "OPJ_EXPORTS" /FD /GZ /c +# SUBTRACT CPP /YX /Yc /Yu +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x40c /d "_DEBUG" +# ADD RSC /l 0x40c /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /out:"Debug/OpenJPEGd.dll" /pdbtype:sept +# Begin Special Build Tool +SOURCE="$(InputPath)" +PostBuild_Cmds=if not exist dist mkdir dist copy libopenjpeg\openjpeg.h dist copy Debug\OpenJPEGd.dll dist copy Debug\OpenJPEGd.lib dist +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "DllOpenJPEG - Win32 Release" +# Name "DllOpenJPEG - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\libopenjpeg\bio.c +# End Source File +# Begin Source File + +SOURCE=.\libopenjpeg\cio.c +# End Source File +# Begin Source File + +SOURCE=.\libopenjpeg\dwt.c +# End Source File +# Begin Source File + +SOURCE=.\libopenjpeg\event.c +# End Source File +# Begin Source File + +SOURCE=.\libopenjpeg\image.c +# End Source File +# Begin Source File + +SOURCE=.\libopenjpeg\j2k.c +# End Source File +# Begin Source File + +SOURCE=.\libopenjpeg\j2k_lib.c +# End Source File +# Begin Source File + +SOURCE=.\libopenjpeg\jp2.c +# End Source File +# Begin Source File + +SOURCE=.\libopenjpeg\jpt.c +# End Source File +# Begin Source File + +SOURCE=.\libopenjpeg\mct.c +# End Source File +# Begin Source File + +SOURCE=.\libopenjpeg\mqc.c +# End Source File +# Begin Source File + +SOURCE=.\libopenjpeg\openjpeg.c +# End Source File +# Begin Source File + +SOURCE=.\libopenjpeg\pi.c +# End Source File +# Begin Source File + +SOURCE=.\libopenjpeg\raw.c +# End Source File +# Begin Source File + +SOURCE=.\libopenjpeg\t1.c +# End Source File +# Begin Source File + +SOURCE=.\libopenjpeg\t2.c +# End Source File +# Begin Source File + +SOURCE=.\libopenjpeg\tcd.c +# End Source File +# Begin Source File + +SOURCE=.\libopenjpeg\tgt.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\libopenjpeg\bio.h +# End Source File +# Begin Source File + +SOURCE=.\libopenjpeg\cio.h +# End Source File +# Begin Source File + +SOURCE=.\libopenjpeg\dwt.h +# End Source File +# Begin Source File + +SOURCE=.\libopenjpeg\event.h +# End Source File +# Begin Source File + +SOURCE=.\libopenjpeg\fix.h +# End Source File +# Begin Source File + +SOURCE=.\libopenjpeg\image.h +# End Source File +# Begin Source File + +SOURCE=.\libopenjpeg\int.h +# End Source File +# Begin Source File + +SOURCE=.\libopenjpeg\j2k.h +# End Source File +# Begin Source File + +SOURCE=.\libopenjpeg\j2k_lib.h +# End Source File +# Begin Source File + +SOURCE=.\libopenjpeg\jp2.h +# End Source File +# Begin Source File + +SOURCE=.\libopenjpeg\jpt.h +# End Source File +# Begin Source File + +SOURCE=.\libopenjpeg\mct.h +# End Source File +# Begin Source File + +SOURCE=.\libopenjpeg\mqc.h +# End Source File +# Begin Source File + +SOURCE=.\libopenjpeg\openjpeg.h +# End Source File +# Begin Source File + +SOURCE=.\libopenjpeg\opj_includes.h +# End Source File +# Begin Source File + +SOURCE=.\libopenjpeg\pi.h +# End Source File +# Begin Source File + +SOURCE=.\libopenjpeg\raw.h +# End Source File +# Begin Source File + +SOURCE=.\libopenjpeg\t1.h +# End Source File +# Begin Source File + +SOURCE=.\libopenjpeg\t2.h +# End Source File +# Begin Source File + +SOURCE=.\libopenjpeg\tcd.h +# End Source File +# Begin Source File + +SOURCE=.\libopenjpeg\tgt.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# Begin Source File + +SOURCE=.\OpenJPEG.rc +# End Source File +# End Group +# End Target +# End Project diff --git a/DllJp3dVM.ncb b/DllJp3dVM.ncb new file mode 100755 index 0000000000000000000000000000000000000000..25d38b63c85bdc12b2dc25731c3e27b3ebbcaeba GIT binary patch literal 175104 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 Jzxppr;BVp5bjSbz literal 0 HcmV?d00001 diff --git a/DllJp3dVM.vcproj b/DllJp3dVM.vcproj new file mode 100755 index 00000000..27c2108c --- /dev/null +++ b/DllJp3dVM.vcproj @@ -0,0 +1,278 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100755 index 00000000..4716ce35 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, HervŽ Drolon, FreeImage Team + * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium + * Copyright (c) 2006, Mónica Díez, Image Processing Laboratory (LPI) - 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. + */ diff --git a/LibJp3dVM.ncb b/LibJp3dVM.ncb new file mode 100755 index 0000000000000000000000000000000000000000..6416b5ecb36127a3978488a5b52e61aaa5a55498 GIT binary patch literal 404480 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 VEae)B#*&^uJ2~|vV!TR3{{^z^xHtd+ literal 0 HcmV?d00001 diff --git a/LibJp3dVM.vcproj b/LibJp3dVM.vcproj new file mode 100755 index 00000000..37953075 --- /dev/null +++ b/LibJp3dVM.vcproj @@ -0,0 +1,249 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Makefile b/Makefile new file mode 100755 index 00000000..f2b66cf0 --- /dev/null +++ b/Makefile @@ -0,0 +1,72 @@ +# Linux makefile for OpenJPEG + +VER_MAJOR = 1 +VER_MINOR = 0.0 + +SRCS = ./libopenjpeg/bio.c ./libopenjpeg/cio.c ./libopenjpeg/dwt.c ./libopenjpeg/event.c ./libopenjpeg/image.c ./libopenjpeg/j2k.c ./libopenjpeg/j2k_lib.c ./libopenjpeg/jp2.c ./libopenjpeg/jpt.c ./libopenjpeg/mct.c ./libopenjpeg/mqc.c ./libopenjpeg/openjpeg.c ./libopenjpeg/pi.c ./libopenjpeg/raw.c ./libopenjpeg/t1.c ./libopenjpeg/t2.c ./libopenjpeg/tcd.c ./libopenjpeg/tgt.c +INCLS = ./libopenjpeg/bio.h ./libopenjpeg/cio.h ./libopenjpeg/dwt.h ./libopenjpeg/event.h ./libopenjpeg/fix.h ./libopenjpeg/image.h ./libopenjpeg/int.h ./libopenjpeg/j2k.h ./libopenjpeg/j2k_lib.h ./libopenjpeg/jp2.h ./libopenjpeg/jpt.h ./libopenjpeg/mct.h ./libopenjpeg/mqc.h ./libopenjpeg/openjpeg.h ./libopenjpeg/pi.h ./libopenjpeg/raw.h ./libopenjpeg/t1.h ./libopenjpeg/t2.h ./libopenjpeg/tcd.h ./libopenjpeg/tgt.h ./libopenjpeg/opj_includes.h +INCLUDE = -Ilibopenjpeg + +# General configuration variables: +CC = gcc +AR = ar + +INSTALLDIR = /usr/lib + +# Converts cr/lf to just lf +DOS2UNIX = dos2unix + +COMPILERFLAGS = -O3 +LIBRARIES = -lstdc++ + +MODULES = $(SRCS:.c=.o) +CFLAGS = $(COMPILERFLAGS) $(INCLUDE) + +TARGET = openjpeg +STATICLIB = lib$(TARGET).a +SHAREDLIB = lib$(TARGET)-$(VER_MAJOR).$(VER_MINOR).so +LIBNAME = lib$(TARGET).so.$(VER_MAJOR) + + + +default: all + +all: dist + +dist: OpenJPEG + mkdir dist + cp *.a dist/ + cp *.so dist/ + cp libopenjpeg/openjpeg.h dist/ + +dos2unix: + @$(DOS2UNIX) $(SRCS) $(INCLS) + +OpenJPEG: $(STATICLIB) $(SHAREDLIB) + +.c.o: + $(CC) $(CFLAGS) -c $< -o $@ + +$(STATICLIB): $(MODULES) + $(AR) r $@ $(MODULES) + +$(SHAREDLIB): $(MODULES) + $(CC) -s -shared -Wl,-soname,$(LIBNAME) -o $@ $(MODULES) $(LIBRARIES) + +install: + install -m 644 -o root -g root $(STATICLIB) $(INSTALLDIR) + install -m 755 -o root -g root $(SHAREDLIB) $(INSTALLDIR) + ln -sf $(SHAREDLIB) $(INSTALLDIR)/$(LIBNAME) + ldconfig + +clean: + rm -rf core dist/ u2dtmp* $(MODULES) $(STATICLIB) $(SHAREDLIB) $(LIBNAME) + +osx: + make -f Makefile.osx + +osxinstall: + make -f Makefile.osx install + +osxclean: + make -f Makefile.osx clean diff --git a/README.txt b/README.txt new file mode 100755 index 00000000..ce04072e --- /dev/null +++ b/README.txt @@ -0,0 +1,285 @@ +=============================================================================== + JPEG2000 Part 10 (ISO/IEC 15444-10 JP3D) Verification Model + + Version 1.1 +=============================================================================== + + +1. Scope +================ + +This document describes the installation and the use of the JP3D VM decoder and encoder under several operating systems (Linux, Unix, Windows, ...). Version 1.1 contains a complete JPEG 2000 Part 10 encoder, as well as a decoder. +The supported functionalities are compliant with the JPEG2000 part 10 algorithm as described in the WD 6.0. +The provided encoder and the decoder are compatible also with the International standard IS 15444-1 (core coding system). +This implementation has been developped 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 jp3d@lpi.tel.uva.es + +2. Installing the code +====================================================== + +- After decompressing the zip file provided, you should find +at least the following files in the created 'jp3d_vm' directory: + + * libjp3dvm - This directory contains all library related code + * codec - This directory contains all codec related code + * tcltk - This directory contains the API scripts + * README - The file you are reading + * LICENCE - Copyright statement of the JP3D VM software + +2.1. Compiling the source code in Windows +------------------------------------------- + +This version has been compiled with Visual Studio 2003 using +the projects included in the distribution: + + * LibJp3dVM.vcproj - Creates the library with all the JP3D functionalities + * jp3d_vm_enc.vcproj - Test encoder + * jp3d_vm_dec.vcproj - Test decoder + +2.2. Compiling the source code in Unix-like systems +------------------------------------------- + +Library compilation +------------------------ +This version of the library has been tested under the following OS: +- Fedora Core + +The installation process is as simple as this : +1) Enter the 'jp3d_vm' directory +2) Build the distribution : +make +make install +3) Clean all files produced during the build process +make clean + +Codec compilation +------------------------ +Once you've built the library, you should compile the JP3D codec. + +1) Go to the 'codec' directory +2) Build the encoder and decoder programs: + +gcc convert.c volume_to_jp3d.c -o jp3d_vm_enc -I ../libjp3dvm/ -lm -ljp3dvm +gcc convert.c jp3d_to_volume.c -o jp3d_vm_dec -I ../libjp3dvm/ -lm -ljp3dvm + +Note: You should add '-L ../libjp3dvm/' to those lines if you +did not use the 'install' target (and the 'clean' target neither...). + +3. Running the JP3D VM +==================================================== + +3.1. JP3D ENCODER +==================================================== + +Required arguments +------------------------ + + * Input file(s): -i Involume [*.bin, *.pgx] + +Specifies the volume to compress. Accepted formats are *.BIN (raw binary data) or *.PGX files. +Both formats need some particular settings: + + a) BIN format. As it has no header, volume characteristics will be obtained from a .IMG file. Its location will be specified through the following argument: + -m Involumeinfo.IMG + This file shall have the following structure, with the appropiate value in each case (bit per voxel, color map, dimensions in X,Y,Z): + o Bpp %d + o Color Map %d + o Dimensions %d %d %d + + b) PGX format. Program will consider it as a volume slice. In order to denote a volume through a sequence of slices, you can define the input filename with the common pattern of the set of PGX files followed by a dash (as a wildcard character for the sequence numbers). + + * Output file: -o Outfile [*.jp3d, *j2k] + +Specifies the name of the file where the codestream will be saved. +Part 1 compliant codestream will be created when an outfile has .j2k format. + +Options +-------- + + * Rate values : -r 20,10,5 + This option offers the possibility to define the compression rate to apply. + Each value is a factor of compression (i.e. 20 : 1) and will generate a different quality layer. A lossless compression will be signified by the value 1. + NOTE : The order used to define the different levels of compression is important and must be from left to right in descending order. + + * Quality values : -q 30,35,40 + This option offers the possibility to define the quality level to achieve. Each value is a psnr, to be given in dB, and represents a quality layer. + NOTE : The order used to define the different psnr-values is important and must be from left to right in ascending order. + + + * Number of resolutions : -n 3,3,2 + This option offers the possibility to define the number of resolution levels computed for each dimension of the volume through the discret wavelet transform (DWT). Resolution in axial dimension can have a different value than in horizontal and vertical cases, but must be lower. + DEFAULT VALUE : 3,3,1 + + + * Switch modes : -M 3 + This option offers the possibility to use a mode switch during the encoding process: + o BYPASS(LAZY) [1] + o RESET [2] + o RESTART(TERMALL) [4] + o VSC [8] + o ERTERM(SEGTERM) [16] + o SEGMARK(SEGSYM) [32] + o 3D_CONTEXT [64] + For several mode switch just sum corresponding values: i.e. -M 38 => RESTART(4) + RESET(2) + SEGMARK(32) + DEFAULT VALUE: 0 + + + * Progression order : -p LRCP + This option offers the possibility to specify the progression order. Possible progression orders are : LRCP, RLCP, RPCL, PCRL and CPRL. + DEFAULT VALUE: LRCP. + + + * Code-block size : -b 32,32,32 + This option offers the possibility to define the size of the code-block. The dimension must respect the constraint defined in the JPEG-2000 standard. The maximum value autorized is 64x64x64. + DEFAULT VALUE: 64,64,64 + + + * Precinct size : -c [128,128,128],[128,128,128],... + This option offers the possibility to define the size of the precincts at each resolution. Multiple records may be supplied, in which case the first record refers to the highest resolution level and subsequent records to lower resolution levels. The last specified record is right-shifted for each remaining lower resolution levels. + NOTE : specified values must be power of 2. + DEFAULT VALUE: 2^15 x 2^15 x 2^15 + + + * Tile size : -t 512,512,512 + This option offers the possibility to divide the volume in several tiles. The three values define the width, the heigth and the depth of the tile respectivily. + DEFAULT VALUE: Volume dimensions (one tile) + + + * Subsampling factor : -s 2,2,2 + This option offers the possibility to apply a subsampling factor for X, Y and Z axis. Value higher than 2 can be a source of error ! + DEFAULT VALUE: 1,1,1 + + + * SOP marker before each packet : -SOP + This option offers the possibility to add a specific marker before each packet. It is the marker SOP (Start of packet). If the option is not used no SOP marker will be added. + + + * EPH marker after each packet header : -EPH + This option offers the possibility to add a specific marker at the head of each packet header. It is the marker EPH (End of packet Header). If the option is not used no EPH marker will be added. + + + * Offset of the volume origin : -d 150,300,10 + This option offers the possibility to move the origine of the volume in X, Y and/or Z axis. The division in tile could be modified as the anchor point for tiling will be different than the volume origin. + NOTE : the offset of the volume can not be higher than the tile dimension if the tile option is used. + DEFAULT VALUE: 0,0,0 + + + * Offset of the tile origin : -T 100,75,5 + This option offers the possibility to move the anchor point of the volume in X, Y and/or Z axis. + NOTE : the tile anchor point can not be on the volume area. + DEFAULT VALUE: 0,0,0 + + + * Display the help menu : -help + This option displays on screen the content of this page + +Additional options +---------------------------------- + + * Encoding information file: -x index_name.idx + This option offers the possibility to create a text file with some structured information generated through the encoding. The name of the file must be specified, with .idx extension. The information structure is the following: + o Volume size: + + VolW + VolH + VolD + o Progression Order: + + Prog + o Tile size: + + TileW + TileH + TileD + o Number of components: + + NumComp + o Number of layers: + + NumLayer + o Number of decompositions (=(number of resolutions - 1)): + + NumDWTx + NumDWTy + NumDWTz + o Precinct size: + + [Precinct_width(NumDWT),Precinct_height(NumDWT),Precinct_depth(NumDWT)] + + [Precinct_width(NumDWT-1),Precinct_height(NumDWT-1),Precinct_depth(NumDWT-1)] + + ... + + [Precinct_width(0),Precinct_height(0),Precinct_depth(0)] + o Main Header end position: + + MH_EndPos + o Codestream size: + + CSSize + o Tile 0 information: + + TileNum (0) + + StartPos + + TileHeader_EndPos + + EndPos + + TotalDisto (this is the sum of the distortion reductions brought by each packet belonging to this tile) + + NumPix (this is the number of pixels in the tile) + + MaxMSE (=TotalDisto/NumPix) + o Tile1 information: + + TileNum (1) + + ... + o ... + o Tile N information: + + TileNum (N) + + ... + o Packet 0 from Tile 0 information: + + PackNum (0) + + TileNum (0) + + LayerNum + + ResNum + + CompNum + + PrecNum + + StartPos + + EndPos + + Disto (distortion reduction brought by this packet) + o Packet 1 from Tile 0 information: + + PackNum (1) + + ... + o ... + o Packet M from Tile 0 information + o Packet 0 from Tile 1 information + o ... + o Packet M from Tile N information + o Maximum distortion reduction on the whole volume: + + MaxDisto + o Total distortion on the whole volume (sum of the distortion reductions from all packets in the volume): + + TotalDisto + +3.2. JP3D DECODER +==================================================== + +Required arguments +------------------------ + + * Infile : -i compressed file + Currently accepts JP3D and J2K-files. The file type is identified based on its suffix (*.jp3d, *.j2k). + + + * Outfile(s) : -o decompressed file(s) + Currently accepts BIN-files and PGX-files. Binary data is written to the file (not ascii). + If a BIN-file is defined, decoder will create automatically the volume characteristic file appending a .IMG extension to the provided output filename. + If a PGX-file is defined, decoder will understand this as a file pattern, appending corresponding indice from 0 to the number of decoded slices. + NOTE : There will be as many output files as there are components: an indice starting from 0 will then be appended to the output filename, just before the extension. + + +Options available +------------------------ + + * Reduce factor : -r 1,1,0 + Set the number of highest resolution levels to be discarded in each dimension. The decoded volume size is effectively divided by 2 to the power of the number of discarded levels. + NOTE : The reduce factor is limited by the smallest total number of decomposition levels among tiles. + + + * Layer number : -l 2 + Set the maximum number of quality layers to decode. If there are less quality layers than the specified number, all the quality layers are decoded. + + + * Performance comparisons : -O original-file + This option offers the possibility to compute some quality results for the decompressed volume, like the PSNR value achieved or the global SSIM value. Needs the original file in order to compare with the new one. + NOTE: Only valid when -r option is 0,0,0 (both original and decompressed volumes have same resolutions) + NOTE: If original file is .BIN file, the volume characteristics file shall be defined with the -m option. + (i.e. -O original-BIN-file -m original-IMG-file) + + + * Byte order (Big-endian / Little-endian) : -BE + This option offers the possibility to save the decompressed volume with a predefined byte order. + DEFAULT VALUE: Little-endian + + + * Display the help menu : -help + This option displays on screen the content of this page + + diff --git a/bin/LibJp3dVM.lib b/bin/LibJp3dVM.lib new file mode 100755 index 0000000000000000000000000000000000000000..6bbedf828894bee9eb0f6d2029f46b5ec1a4377b GIT binary patch literal 9785822 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%0Ao=|Z#nvCErIU_DBqdalNJ*9Y-}r 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 z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7e?Qwp@VtkD*6`fdGL-16b^C!Tns<)e@QfdwLv`h_J6q^ycbfWSoWpbAKU009C72$TXZn7rkUZ+_Re?`!-u4k%>=1PBly zK;Y>vaLj%G>0ZUkM}PnU0t8wFK5+A2fA0A|`rjKGe|-<2#YRYg009C7o~{DL`~M%i z?>}8DSh)xgAV7e?JOW?2_bcD{@R0}0=l_k*#sl+MNf97GfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009DjHv&syw{5d_J^gud!!u?r^N|1n0t5&U zAV7csfv2}Xnh&JkMNjeftfx1F(h*qT0+aVGZ~(<8K!5-N0t-~&)9c>zs#oAV7e? z0vFiuwffHwoc*)=8h?!g7I=G5d;$ar5Lg%jE&it8^wa#C z;zj8nKLiLYSb_E^dHVH3fWX2NNMnTNIAP(HUWo}TY=JZfFb`PRZ9wS>R4Ok#TqsO# zph18D0RjXFEEIw6jYUZ(?^`G(R!#y02oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk 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 z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5J2GnvTrXycAfQM!1rbOI=+oo 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 z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0|NdZI6j~t(5a<)QbfP$LZcE=AUJ@WcfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5ysErY@MoBpMr_TQ8qO27ONAh2!)Mxx~DpC1AQ z)}KIHBed5E>#y`mOkjNrq&5;5;0@D-!on6B1PBlyK!Ct{5g5CpDCxq9 z^-^NxBtU=w0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjZRe}P6eKRN%v z2YzyD=k6zOjN2SL8$W;Yxzn}jbkEbZsd7(NJ9kg}MYDDx-6Kwa-{$eH zH#KXg@>|~4Y)qf7Eu_4iuFV&J@=NCaQdV1-oR0f0WcB&Ulks8mSz~7MsmQ@hR-2!w zo!vOKX~V!kR=+S_U-;K~@S49d`Sc6#Yt|pjVe$f}>boVoZ_~)GZx*NA zHTmTiwl*94vf735+RR6%-<(%X*bPLW;>2&)n9E^_s)GiYwWu>tL?rgtM7@{d93~MqgicV9NQho_QdP$zcs(YLDQVtu7 zd5eu~El$)@4kK@kD0iO2kza0(d@^!a-xs;q9l6+3&c$eN&X33Y$J*Vg$YCkVBU$4> zv#~p?9UiY8Xx8>*^}{EhA8HpUw~mth;z(fs#@a9gz1${JHfw?Z;_V@2vk}=$ z^%5=QSZWhvpK6ZnntLXzrR=opzN0#t)gOy&T`m=&N4>~qS$%eK`O1|TmL?i!Hcov! z`bt*YpEvnKBh{^|bjz?J{0mrHp&m zDC6EJs&Xda~MB%A0gFlgMiA@H=ZMtM%xu(^Dg#Y}QIy ztuN*sIa>T;j1iI5T2x0GAM!pB)lqbSXR>7x;20IXJcwEuKndm z6~{gusp8r%MXI>=u9(=0Yd;dHH|5v+uVOW^J;v~~hKN~wqE`KQS`0Mn%X1rIq-!>oV+c=X>AVlLPVA2PwdH)+TaLkh zqCU3s^)dEmwaru2d-6mz&A7#&`(L})G?w$$l5RXv8{K(hTsw8&b%W!LXboe-@oDw^ zx}syA|KRuh;Wy@=c|-Bx(PiRxr3{>3GXrnvWZ;G(1JNR5I4fo1_g+z%n4I4hYro@9 zrqkCn7=f4?a_i%0DeB7~;-S_Cocq}N3k89qyYh?C) z(WkrR=xsh5ryh@Tq|coleDL~w!5358%-q|GLlgDtL$8i@+%8SrE|$1+n~J==kj~%s z$+#ev5|^9xncSmumrHYhJ?^sVEiTS&Y-cgc?|CssrDiRJmd`(*rB(CH)P18vC%-!s zooaY2Ry^r=t!QX6cWg=}-;^LK&C%K3itAZdMa6x-U2)gP z+1Z^V&HA&E(X{9qjk4B81G!tU3z5+xPpy*1n)^ar5$DIcF~nN8I2U61p;hm4HpKE? z`a(MY?!EDuvCco6ul)0hdUm*e?)-Q1s{NPaC)=MGYnj>i^i*C?BOKj0_1o>Tv>VZx zRwJyYM%byg)Cf=YHNsO_?Nq+S=xK!0-A1_b7ROgK!sA)}c(Xp;YJ}6VUzyrAICOGp zDC%Q)+oQ3DO06@-!${A*H;VG1)^N0I{*lOfY{I_yP#k^o=6KQ57w2M1DEGy$#p`Yx z?qP^3{rCM0e@=aI$MX3<`0&ZMMu%!F4L26rE8{dHWcNMZ-!I?RQ?>p5@^_<5(GXrC z{W34v6Vd6i`pj_sQhOPkZ$GO~jGt+>fJ$r-X5Z3NuKwgh

&^_fyUKncfj}dhHSPc>f4`JhoiT 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 YJX0q=mKaFmMgYNhUnmjp>C>kFH&C`i0RR91 literal 0 HcmV?d00001 diff --git a/bin/OpenJP3D.dll b/bin/OpenJP3D.dll new file mode 100755 index 0000000000000000000000000000000000000000..ad129d32e742ce7a9187ececca2fd87dfd83e016 GIT binary patch literal 9920512 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 zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZ;Isl~HI^8Qa*oYmyixhrv17*?RYd{>S|X6w zg|k}{t1t-=I9?#n|7FKFsSzO10)agDb6nJdScOP{z^McV{Zq}+PJjRb0t5&wRDnTv zp++Vy0t5&UAVA<$0!tnl&bfTm@k?A@wJ(|1e*98u1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfIzzi7Df1D4T3Ds)d$_hjd_X$2oNAZfB*pk1PCmAf%=)C6QO3go{lg4 z&_zgqz(`=w9~Bh{5FkK+0D%QB@Z6`ScOAa^Xm`N}DnJ4R2oNAZU?gzi;B(tPe#;;F z)ztTZk&FTX0t5&USm**zxbH9YLo7Z51PBly&=C0Q9e?}bJ6}1{t)~7RK*L6n009C7 z2rN{A;otwi=DxpB53slh5FkK+z)1ui{n4X`zwz^@M!)}8b>9b0Vx@@y0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly 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 z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5Fl{p0$b)o=){L_ z%EPfL-&4hzeR()h<&{+)+n_BHEw=3#r4N2=#p`C=Y+);a9S!>%gF z->t0jWWD~qi9EbquYY839*$SJnWpM}CU@uIK$YX~c4>1Sj?{T_V;-jKeD2wN;bC!~ z(+7Jw`YaeNZ0Y5%?>&C^*;CiD`1_d%5FkK+009C72oOj|pt(P2#&nu%N`OEVcze&( zq1nmn#org#ee?L(N5zxhZU1~W|0UbF=9y!M_y3SlB0zuu0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72y|+KIJR>m(`|y00D&Y0;`@U4fg}&T z(gYT+3!ML62n5m;Xx|&8DWEk00wI(|Pod0c5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1O^4VtreYCZen|Tv(89>Kw1Jfdv8cfKwARo z3ON7MJ@%TXEfCLr=YQI-0qqHdP!<#j5FkK+0D;s5$}F|U`Vt^OfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pkcP_A`_0Ue0#%M$6TCIJGA1>*TXws@5#0t6Bei06KsmnP6vMFIqFB~TW( z+G0Hc0t5&UATX=~Wj3tM^ddlj009C7ZY3}})7!E(U%bcKdj06Y`o()$B0zuu0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0tC_)SX$NZvL2YZtS6^nU;? z8<7A30t5&Qt3dDX|9|@2AJzk`7XbnU2oSi5z?sj^%)a~8h5q;d^|I@Mn^;*zfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72>d?+%c`gC3_SIX z1;)70Jk27g1Xib0s0RjZl68P!()hmy_|B3JY(>m;N&Y0eR#>|ej0~cO9BK45FoH1aB6z)rdB_|Pq}cI1aSb(3l%|BHwY4d`j7!XZK68F2oeiF~-9OrW^7=i`dp_UK@AEt7 z{LbtA&Lts0fB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNCf$0D#noXDUuwR6h8x~-}V zt}Rsp1PBlyK!5-N0tD6xfwljAuueQ_Pm%zEwFH(gtnPTcverOLfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UDC$asK~Xcg)oQK>=N}sZ z0_&{6ka*@98vz3Ao$bSR)cfh)R4S4nhiekG(RfSa*8UzRs zAV7e?x+1VyL-m=iTDYz}W6zTS0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs 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 P+mk=XYy=4WKNk2e8S?I5 literal 0 HcmV?d00001 diff --git a/bin/jp3d_vm_enc.exe b/bin/jp3d_vm_enc.exe new file mode 100755 index 0000000000000000000000000000000000000000..9bb4f491667b5c59eba582e2e9ed8a3eb96b54ab GIT binary patch literal 9756672 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

G^Kgo1R%tl98kFB9sT4OI9Db?ER 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 zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB=E*1sZEI8fwzjWbO89o+SYS^(F9X_lEis&{_iZE8zOC-*d0!^(~ODeb;|| z_W`XZkYz)I6bKL?K!5;&dJ`DR>#fDwOMn0Y0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5*B@d8aXyEa5R&9zhQ_K}!sw@DKqP#*&6zR*}7P1Q;Q1hx}!{ci_i zl|Y>cR6iHgeio>crfVhv0;2*$gQH0a0t5&UAV8o_1cvfDX{crrAV7cs0Rp1}+du#P zK46qaf&c*m1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oQK(fn91!G(0tD(nAYJ=ueoGy+RTBvicrAgU!PnX% zp8x>@1PBn=Sp|mjowa4!MSuVS0t5)WmcVXzm$!U);UyZmiSStCGz009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjZ-Ti`9x{DvBWl-{~Nl)c> z2oNAZfWWB0K0}{9@uV|}clJ}PeFO*)AV8o-;EJJ&%w6 z{=c&B{lKeO$s$02009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0Rja6Zv@6fwGG=)#kf7^E3tP&tVfB*pk1PBlyuyYHf&jV?0e4XW6c5Vi(BT(l8 zLxXh=p!oy{5FkLHP6fXCp|d7TXsgr4Yc>G_1PBnQD}e*Pd)(Lh_Zk|kEc3c*yv7nB zK!5;&Iu&@b{iug0PkGGm|LgSpYc>G_1PIipz^CW^;)J)|*f6oOyt_UXw3+|`0t5)u zm%vXi`}HplyWuv!_ph(huC)XR5Fk+J0{KH15BKl7aj>%VKA_I~gXR+;K!8Af2>g2A zYfpdQSAOQXUmvGiD+v%FK!89Y@U{LQU3+rpb9rUy{{iY31PBlyK%fo;N*}%8h2Nh2 zAD;VlaIQ6x009C72vh|w+3Ua~zw_cZ1}9$lqqpXdJwEz(fXez{W&3D;bw5i21PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7csf&XULj$P!a0yqG_-Mg4WL@ZM4VQXV!Y=n7@0TJMB7H@gEQ_q_s#dgp_JCr$s=7^RNkmf?#Vg5-ft?`d)TsoLlY?Qpvn; zU~Yc%W;V?4+nw2&%MlgW zWuEiYEpwjcA0`3>iWOK*>#`K%hKuGCzRJ-V*+Ih-%H6cx?$d0=@J`D4*ml#g?Y6mj zDTa^QJbO7lcv;>jzQ4%XC(qrK^S6&*fAsrX_o{q+CISQq5FkK+009C7$`R8K!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXjEkRxmb0;(Hf+Yb0 zMGEBWg6lw$Z@tn49^4l=|9ub$lqoQLHYig-YXSs9XzGPRQ_&zmfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&w3rq(ClR@s{aC@n&$`a6)K)C|W|8n1Z&C3?Z=f3m5?9YJq1VU(P3IqrcAV7dXX#!1ET4Q|)5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+0D*@WSQ)%@l5(Dh({TGdO~Y+6 z0Rm+RwH3<;t1)92#0s#U92oNAph(J>n zQdCU>1PBlyK%f^`{{Hv-fSyJmK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1pZTC zb+E@I;L!K}*xzFP2oNAZfWScD#>anr`Q*L3 zRlD?e00SG5009C72#i%=@&EsS`raSw8>|-r0t5&UI7Z;kS9cCR|K`X3_y6s>`+;Mu z3=tqefB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N 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 literal 0 HcmV?d00001 diff --git a/bin/openjpeg.h b/bin/openjpeg.h new file mode 100755 index 00000000..36c09aff --- /dev/null +++ b/bin/openjpeg.h @@ -0,0 +1,715 @@ +/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Hervé 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 + +#define OPENJPEG_VERSION "1.0.0" + +/* +========================================================== + Compiler directives +========================================================== +*/ + +#if defined(OPJ_STATIC) || !(defined(WIN32) || defined(__WIN32__)) +#define OPJ_API +#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, wheras this DLL sees symbols +defined with this macro as being exported. +*/ +#ifdef OPJ_EXPORTS +#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 +

+*/ +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(); + +/* +========================================================== + 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/codec/convert.c b/codec/convert.c new file mode 100755 index 00000000..07ecd929 --- /dev/null +++ b/codec/convert.c @@ -0,0 +1,997 @@ +/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Hervé 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 "openjpeg.h" +#ifdef WIN32 +#include "dirent.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"); + return NULL; + } + /*if ( maxslice != sliceno) { + fprintf(stdout,"[ERROR] Slices are not sequentially numbered !! Please rename them accordingly\n"); + return NULL; + }*/ + + for (s=0;svolume_offset_x0; + cmptparm.y0 = parameters->volume_offset_y0; + cmptparm.z0 = parameters->volume_offset_z0; + cmptparm.w = !cmptparm.x0 ? (w - 1) * parameters->subsampling_dx + 1 : cmptparm.x0 + (w - 1) * parameters->subsampling_dx + 1; + cmptparm.h = !cmptparm.y0 ? (h - 1) * parameters->subsampling_dy + 1 : cmptparm.y0 + (h - 1) * parameters->subsampling_dy + 1; + cmptparm.l = !cmptparm.z0 ? (sliceno - 1) * parameters->subsampling_dz + 1 : cmptparm.z0 + (sliceno - 1) * parameters->subsampling_dz + 1; + + if (sign == '-') { + cmptparm.sgnd = 1; + } else { + cmptparm.sgnd = 0; + } + cmptparm.prec = prec; + cmptparm.bpp = prec; + cmptparm.dcoffset = parameters->dcoffset; + cmptparm.dx = parameters->subsampling_dx; + cmptparm.dy = parameters->subsampling_dy; + cmptparm.dz = parameters->subsampling_dz; + + /* create the volume */ + volume = opj_volume_create(numcomps, &cmptparm, color_space); + if(!volume) { + fclose(f); + return NULL; + } + /* set volume offset and reference grid */ + volume->x0 = cmptparm.x0; + volume->y0 = cmptparm.y0; + volume->z0 = cmptparm.z0; + volume->x1 = cmptparm.w; + volume->y1 = cmptparm.h; + volume->z1 = cmptparm.l; + + /* set volume data :only one component, that is a volume*/ + comp = &volume->comps[0]; + + }//if sliceno==1 + + offset = w * h * s; + + for (i = 0; i < w * h; i++) { + int v; + if (comp->prec <= 8) { + if (!comp->sgnd) { + v = readuchar(f); + } else { + v = (char) readuchar(f); + } + } else if (comp->prec <= 16) { + if (!comp->sgnd) { + v = readushort(f, cmptparm.bigendian); + } else { + v = (short) readushort(f, cmptparm.bigendian); + } + } else { + if (!comp->sgnd) { + v = readuint(f, cmptparm.bigendian); + } else { + v = (int) readuint(f, cmptparm.bigendian); + } + } + if (v > maxvalue) + maxvalue = v; + comp->data[i + offset] = v; + + } + fclose(f); + } // for s --> sliceno + comp->bpp = int_floorlog2(maxvalue) + 1; + if (sliceno != 1) + closedir( dirp ); + //dump_volume(stdout, volume); + return volume; +} + + +int volumetopgx(opj_volume_t * volume, char *outfile) { + int w, wr, wrr, h, hr, hrr, l, lr, lrr; + int i, j, compno, offset, sliceno; + FILE *fdest = NULL; + + for (compno = 0; compno < volume->numcomps; compno++) { + opj_volume_comp_t *comp = &volume->comps[compno]; + char name[256]; + int nbytes = 0; + char *tmp = outfile; + while (*tmp) { + tmp++; + } + while (*tmp!='.') { + tmp--; + } + *tmp='\0'; + for(sliceno = 0; sliceno < volume->z1 - volume->z0; sliceno++) { + + if (volume->numcomps > 1) { + sprintf(name, "%s%d-%d.pgx", outfile, sliceno+1, compno); + } else if ((volume->z1 - volume->z0) > 1) { + sprintf(name, "%s%d.pgx", outfile, sliceno+1); + } else { + sprintf(name, "%s.pgx", outfile); + } + + fdest = fopen(name, "wb"); + if (!fdest) { + fprintf(stdout, "[ERROR] Failed to open %s for writing \n", name); + return 1; + } + + fprintf(stdout,"[INFO] Writing in %s (%s)\n",name,volume->comps[0].bigendian ? "Bigendian" : "Little-endian"); + + w = int_ceildiv(volume->x1 - volume->x0, volume->comps[compno].dx); + wr = volume->comps[compno].w; + wrr = int_ceildivpow2(volume->comps[compno].w, volume->comps[compno].factor[0]); + + h = int_ceildiv(volume->y1 - volume->y0, volume->comps[compno].dy); + hr = volume->comps[compno].h; + hrr = int_ceildivpow2(volume->comps[compno].h, volume->comps[compno].factor[1]); + + l = int_ceildiv(volume->z1 - volume->z0, volume->comps[compno].dz); + lr = volume->comps[compno].l; + lrr = int_ceildivpow2(volume->comps[compno].l, volume->comps[compno].factor[2]); + + fprintf(fdest, "PG %c%c %c%d %d %d\n", comp->bigendian ? 'M':'L', comp->bigendian ? 'L':'M',comp->sgnd ? '-' : '+', comp->prec, wr, hr); + if (comp->prec <= 8) { + nbytes = 1; + } else if (comp->prec <= 16) { + nbytes = 2; + } else { + nbytes = 4; + } + + offset = (sliceno / lrr * l) + (sliceno % lrr); + offset = wrr * hrr * offset; + //fprintf(stdout,"%d %d %d %d\n",offset,wrr*hrr,wrr,w); + for (i = 0; i < wrr * hrr; i++) { + int v = volume->comps[0].data[(i / wrr * w) + (i % wrr) + offset]; + if (volume->comps[0].bigendian) { + for (j = nbytes - 1; j >= 0; j--) { + char byte = (char) ((v >> (j * 8)) & 0xff); + fwrite(&byte, 1, 1, fdest); + } + } else { + for (j = 0; j <= nbytes - 1; j++) { + char byte = (char) ((v >> (j * 8)) & 0xff); + fwrite(&byte, 1, 1, fdest); + } + } + } + + fclose(fdest); + }//for sliceno + }//for compno + + return 0; +} + +/* -->> -->> -->> -->> + +BIN IMAGE FORMAT + +<<-- <<-- <<-- <<-- */ + +opj_volume_t* bintovolume(char *filename, char *fileimg, opj_cparameters_t *parameters) { + int subsampling_dx = parameters->subsampling_dx; + int subsampling_dy = parameters->subsampling_dy; + int subsampling_dz = parameters->subsampling_dz; + + int i, compno, w, h, l, numcomps = 1; + int prec, max = 0; + +// char temp[32]; + char line[100]; + int bigendian; + + FILE *f = NULL; + FILE *fimg = NULL; + OPJ_COLOR_SPACE color_space; + opj_volume_cmptparm_t cmptparm; /* maximum of 1 component */ + opj_volume_t * volume = NULL; + opj_volume_comp_t *comp = NULL; + + bigendian = 0; + color_space = CLRSPC_GRAY; + + fimg = fopen(fileimg,"r"); + if (!fimg) { + fprintf(stdout, "[ERROR] Failed to open %s for reading !!\n", fileimg); + return 0; + } + + fseek(fimg, 0, SEEK_SET); + while (!feof(fimg)) { + fgets(line,100,fimg); + //fprintf(stdout,"%s %d \n",line,feof(fimg)); + if (strncmp(line,"Bpp",3) == 0){ + sscanf(line,"%*s%*[ \t]%d",&prec); + } else if (strncmp(line,"Color",5) == 0){ + sscanf(line, "%*s%*[ \t]%d",&color_space); + } else if (strncmp(line,"Dim",3) == 0){ + sscanf(line, "%*s%*[ \t]%d%*[ \t]%d%*[ \t]%d",&w,&h,&l); + } + } + //fscanf(fimg, "Bpp%[ \t]%d%[ \t\n]",temp,&prec,temp); + //fscanf(fimg, "Color Map%[ \t]%d%[ \n\t]Dimensions%[ \t]%d%[ \t]%d%[ \t]%d%[ \n\t]",temp,&color_space,temp,temp,&w,temp,&h,temp,&l,temp); + //fscanf(fimg, "Resolution(mm)%[ \t]%d%[ \t]%d%[ \t]%d%[ \n\t]",temp,&subsampling_dx,temp,&subsampling_dy,temp,&subsampling_dz,temp); + + #ifdef VERBOSE + fprintf(stdout, "[INFO] %d \t %d %d %d \t %3.2f %2.2f %2.2f \t %d \n",color_space,w,h,l,subsampling_dx,subsampling_dy,subsampling_dz,prec); + #endif + fclose(fimg); + + /* initialize volume components */ + memset(&cmptparm, 0, sizeof(opj_volume_cmptparm_t)); + + cmptparm.prec = prec; + cmptparm.bpp = prec; + cmptparm.sgnd = 0; + cmptparm.bigendian = bigendian; + cmptparm.dcoffset = parameters->dcoffset; + cmptparm.dx = subsampling_dx; + cmptparm.dy = subsampling_dy; + cmptparm.dz = subsampling_dz; + cmptparm.w = w; + cmptparm.h = h; + cmptparm.l = l; + + /* create the volume */ + volume = opj_volume_create(numcomps, &cmptparm, color_space); + if(!volume) { + fprintf(stdout,"[ERROR] Unable to create volume"); + fclose(f); + return NULL; + } + + /* set volume offset and reference grid */ + volume->x0 = parameters->volume_offset_x0; + volume->y0 = parameters->volume_offset_y0; + volume->z0 = parameters->volume_offset_z0; + volume->x1 = parameters->volume_offset_x0 + (w - 1) * subsampling_dx + 1; + volume->y1 = parameters->volume_offset_y0 + (h - 1) * subsampling_dy + 1; + volume->z1 = parameters->volume_offset_z0 + (l - 1) * subsampling_dz + 1; + + /* set volume data */ + f = fopen(filename, "rb"); + if (!f) { + fprintf(stdout, "[ERROR] Failed to open %s for reading !!\n", filename); + return 0; + } + + /* BINARY */ + for (compno = 0; compno < volume->numcomps; compno++) { + int whl = w * h * l; + /* set volume data */ + comp = &volume->comps[compno]; + + /*if (comp->prec <= 8) { + if (!comp->sgnd) { + unsigned char *data = (unsigned char *) malloc(whl * sizeof(unsigned char)); + fread(data, 1, whl, f); + for (i = 0; i < whl; i++) { + comp->data[i] = data[i]; + if (comp->data[i] > max) + max = comp->data[i]; + } + free(data); + } else { + char *data = (char *) malloc(whl); + fread(data, 1, whl, f); + for (i = 0; i < whl; i++) { + comp->data[i] = data[i]; + if (comp->data[i] > max) + max = comp->data[i]; + } + free(data); + } + } else if (comp->prec <= 16) { + if (!comp->sgnd) { + unsigned short *data = (unsigned short *) malloc(whl * sizeof(unsigned short)); + int leido = fread(data, 2, whl, f); + if (!leido) { + free(data); fclose(f); + return NULL; + } + + for (i = 0; i < whl; i++) { + if (bigendian) //(c1 << 8) + c2; + comp->data[i] = data[i]; + else{ //(c2 << 8) + c1; + comp->data[i] = ShortSwap(data[i]); + } + if (comp->data[i] > max) + max = comp->data[i]; + } + free(data); + } else { + short *data = (short *) malloc(whl); + int leido = fread(data, 2, whl, f); + if (!leido) { + free(data); fclose(f); + return NULL; + } + for (i = 0; i < whl; i++) { + if (bigendian){ //(c1 << 8) + c2; + comp->data[i] = data[i]; + }else{ //(c2 << 8) + c1; + comp->data[i] = (short) ShortSwap((unsigned short) data[i]); + } + if (comp->data[i] > max) + max = comp->data[i]; + } + free(data); + } + } else { + if (!comp->sgnd) { + unsigned int *data = (unsigned int *) malloc(whl * sizeof(unsigned int)); + int leido = fread(data, 4, whl, f); + if (!leido) { + free(data); fclose(f); + return NULL; + } for (i = 0; i < whl; i++) { + if (!bigendian) + comp->data[i] = LongSwap(data[i]); + else + comp->data[i] = data[i]; + if (comp->data[i] > max) + max = comp->data[i]; + } + free(data); + } else { + int leido = fread(comp->data, 4, whl, f); + if (!leido) { + fclose(f); + return NULL; + } + for (i = 0; i < whl; i++) { + if (!bigendian) + comp->data[i] = (int) LongSwap((unsigned int) comp->data[i]); + if (comp->data[i] > max) + max = comp->data[i]; + } + } + }*/ + + for (i = 0; i < whl; i++) { + int v; + if (comp->prec <= 8) { + if (!comp->sgnd) { + v = readuchar(f); + } else { + v = (char) readuchar(f); + } + } else if (comp->prec <= 16) { + if (!comp->sgnd) { + v = readushort(f, bigendian); + } else { + v = (short) readushort(f, bigendian); + } + } else { + if (!comp->sgnd) { + v = readuint(f, bigendian); + } else { + v = (int) readuint(f, bigendian); + } + } + if (v > max) + max = v; + comp->data[i] = v; + } + comp->bpp = int_floorlog2(max) + 1; + } + fclose(f); + return volume; +} + +int volumetobin(opj_volume_t * volume, char *outfile) { + int w, wr, wrr, h, hr, hrr, l, lr, lrr, max; + int i,j, compno, nbytes; + int offset, sliceno; + FILE *fdest = NULL; + FILE *fimgdest = NULL; +// char *imgtemp; + char name[256]; + + for (compno = 0; compno < 1; compno++) { //Only one component + + fdest = fopen(outfile, "wb"); + if (!fdest) { + fprintf(stdout, "[ERROR] Failed to open %s for writing\n", outfile); + return 1; + } + fprintf(stdout,"[INFO] Writing outfile %s (%s) \n",outfile, volume->comps[0].bigendian ? "Bigendian" : "Little-endian"); + + w = int_ceildiv(volume->x1 - volume->x0, volume->comps[compno].dx); + wr = volume->comps[compno].w; + wrr = int_ceildivpow2(volume->comps[compno].w, volume->comps[compno].factor[0]); + + h = int_ceildiv(volume->y1 - volume->y0, volume->comps[compno].dy); + hr = volume->comps[compno].h; + hrr = int_ceildivpow2(volume->comps[compno].h, volume->comps[compno].factor[1]); + + l = int_ceildiv(volume->z1 - volume->z0, volume->comps[compno].dz); + lr = volume->comps[compno].l; + lrr = int_ceildivpow2(volume->comps[compno].l, volume->comps[compno].factor[2]); + + max = (volume->comps[compno].prec <= 8) ? 255 : (1 << volume->comps[compno].prec) - 1; + + volume->comps[compno].x0 = int_ceildivpow2(volume->comps[compno].x0 - int_ceildiv(volume->x0, volume->comps[compno].dx), volume->comps[compno].factor[0]); + volume->comps[compno].y0 = int_ceildivpow2(volume->comps[compno].y0 - int_ceildiv(volume->y0, volume->comps[compno].dy), volume->comps[compno].factor[1]); + volume->comps[compno].z0 = int_ceildivpow2(volume->comps[compno].z0 - int_ceildiv(volume->z0, volume->comps[compno].dz), volume->comps[compno].factor[2]); + + if (volume->comps[0].prec <= 8) { + nbytes = 1; + } else if (volume->comps[0].prec <= 16) { + nbytes = 2; + } else { + nbytes = 4; + } + + //fprintf(stdout,"w %d wr %d wrr %d h %d hr %d hrr %d l %d lr %d lrr %d max %d nbytes %d\n Factor %d %d %d",w,wr,wrr,h,hr,hrr,l,lr,lrr,max,nbytes,volume->comps[compno].factor[0],volume->comps[compno].factor[1],volume->comps[compno].factor[2]); + + for(sliceno = 0; sliceno < lrr; sliceno++) { + offset = (sliceno / lrr * l) + (sliceno % lrr); + offset = wrr * hrr * offset; + for (i = 0; i < wrr * hrr; i++) { + int v = volume->comps[0].data[(i / wrr * w) + (i % wrr) + offset]; + if (volume->comps[0].bigendian) { + for (j = nbytes - 1; j >= 0; j--) { + char byte = (char) ((v >> (j * 8)) & 0xff); + fwrite(&byte, 1, 1, fdest); + } + } else { + for (j = 0; j <= nbytes - 1; j++) { + char byte = (char) ((v >> (j * 8)) & 0xff); + fwrite(&byte, 1, 1, fdest); + } + } + } + } + + } + + fclose(fdest); + + sprintf(name,"%s.img",outfile); + fimgdest = fopen(name, "w"); + if (!fimgdest) { + fprintf(stdout, "[ERROR] Failed to open %s for writing\n", name); + return 1; + } + fprintf(fimgdest, "Bpp\t%d\nColor Map\t2\nDimensions\t%d\t%d\t%d\nResolution(mm)\t%d\t%d\t%d\t\n", + volume->comps[0].prec,wrr,hrr,lrr,volume->comps[0].dx,volume->comps[0].dy,volume->comps[0].dz); + + fclose(fimgdest); + return 0; +} +/* -->> -->> -->> -->> + +IMG IMAGE FORMAT + +<<-- <<-- <<-- <<-- */ +opj_volume_t* imgtovolume(char *fileimg, opj_cparameters_t *parameters) { + int subsampling_dx = parameters->subsampling_dx; + int subsampling_dy = parameters->subsampling_dy; + int subsampling_dz = parameters->subsampling_dz; + + int i, compno, w, h, l, numcomps = 1; + int prec, max = 0, min = 0; + float dx, dy, dz; + char filename[100], tmpdirpath[100], dirpath[100], *tmp; + char line[100], datatype[100]; + int bigendian; + + FILE *f = NULL; + FILE *fimg = NULL; + OPJ_COLOR_SPACE color_space; + opj_volume_cmptparm_t cmptparm; /* maximum of 1 component */ + opj_volume_t * volume = NULL; + opj_volume_comp_t *comp = NULL; + + bigendian = 0; + color_space = CLRSPC_GRAY; + + fimg = fopen(fileimg,"r"); + if (!fimg) { + fprintf(stderr, "[ERROR] Failed to open %s for reading !!\n", fileimg); + return 0; + } + + //Fetch only the path + strcpy(tmpdirpath,fileimg); + if ((tmp = strrchr(tmpdirpath,'/')) != NULL){ + tmp++; *tmp='\0'; + strcpy(dirpath,tmpdirpath); + } else { + strcpy(dirpath,"./"); + } + + fseek(fimg, 0, SEEK_SET); + while (!feof(fimg)) { + fgets(line,100,fimg); + //fprintf(stdout,"%s %d \n",line,feof(fimg)); + if (strncmp(line,"Image",5) == 0){ + sscanf(line,"%*s%*[ \t]%s",datatype); + } else if (strncmp(line,"File",4) == 0){ + sscanf(line,"%*s %*s%*[ \t]%s",filename); + strcat(dirpath, filename); + strcpy(filename,dirpath); + } else if (strncmp(line,"Min",3) == 0){ + sscanf(line,"%*s %*s%*[ \t]%d%*[ \t]%d",&min,&max); + prec = int_floorlog2(max - min + 1); + } else if (strncmp(line,"Bpp",3) == 0){ + sscanf(line,"%*s%*[ \t]%d",&prec); + } else if (strncmp(line,"Color",5) == 0){ + sscanf(line, "%*s %*s%*[ \t]%d",&color_space); + } else if (strncmp(line,"Dim",3) == 0){ + sscanf(line, "%*s%*[ \t]%d%*[ \t]%d%*[ \t]%d",&w,&h,&l); + } else if (strncmp(line,"Res",3) == 0){ + sscanf(line,"%*s%*[ \t]%f%*[ \t]%f%*[ \t]%f",&dx,&dy,&dz); + } + + } + #ifdef VERBOSE + fprintf(stdout, "[INFO] %s %d \t %d %d %d \t %f %f %f \t %d %d %d \n",filename,color_space,w,h,l,dx,dy,dz,max,min,prec); + #endif + fclose(fimg); + + /* error control */ + if ( !prec || !w || !h || !l ){ + fprintf(stderr,"[ERROR] Unable to read IMG file correctly. Found some null values."); + return NULL; + } + + /* initialize volume components */ + memset(&cmptparm, 0, sizeof(opj_volume_cmptparm_t)); + + cmptparm.prec = prec; + cmptparm.bpp = prec; + cmptparm.sgnd = 0; + cmptparm.bigendian = bigendian; + cmptparm.dcoffset = parameters->dcoffset; + cmptparm.dx = subsampling_dx; + cmptparm.dy = subsampling_dy; + cmptparm.dz = subsampling_dz; + cmptparm.w = w; + cmptparm.h = h; + cmptparm.l = l; + + /* create the volume */ + volume = opj_volume_create(numcomps, &cmptparm, color_space); + if(!volume) { + fprintf(stdout,"[ERROR] Unable to create volume"); + return NULL; + } + + /* set volume offset and reference grid */ + volume->x0 = parameters->volume_offset_x0; + volume->y0 = parameters->volume_offset_y0; + volume->z0 = parameters->volume_offset_z0; + volume->x1 = parameters->volume_offset_x0 + (w - 1) * subsampling_dx + 1; + volume->y1 = parameters->volume_offset_y0 + (h - 1) * subsampling_dy + 1; + volume->z1 = parameters->volume_offset_z0 + (l - 1) * subsampling_dz + 1; + + max = 0; + /* set volume data */ + f = fopen(filename, "rb"); + if (!f) { + fprintf(stderr, "[ERROR] Failed to open %s for reading !!\n", filename); + fclose(f); + return 0; + } + + /* BINARY */ + for (compno = 0; compno < volume->numcomps; compno++) { + int whl = w * h * l; + /* set volume data */ + comp = &volume->comps[compno]; + + /*if (comp->prec <= 8) { + if (!comp->sgnd) { + unsigned char *data = (unsigned char *) malloc(whl * sizeof(unsigned char)); + fread(data, 1, whl, f); + for (i = 0; i < whl; i++) { + comp->data[i] = data[i]; + if (comp->data[i] > max) + max = comp->data[i]; + } + free(data); + } else { + char *data = (char *) malloc(whl); + fread(data, 1, whl, f); + for (i = 0; i < whl; i++) { + comp->data[i] = data[i]; + if (comp->data[i] > max) + max = comp->data[i]; + } + free(data); + } + } else if (comp->prec <= 16) { + if (!comp->sgnd) { + unsigned short *data = (unsigned short *) malloc(whl * sizeof(unsigned short)); + int leido = fread(data, 2, whl, f); + if (!leido) { + free(data); fclose(f); + return NULL; + } + + for (i = 0; i < whl; i++) { + if (bigendian) //(c1 << 8) + c2; + comp->data[i] = data[i]; + else{ //(c2 << 8) + c1; + comp->data[i] = ShortSwap(data[i]); + } + if (comp->data[i] > max) + max = comp->data[i]; + } + free(data); + } else { + short *data = (short *) malloc(whl); + int leido = fread(data, 2, whl, f); + if (!leido) { + free(data); fclose(f); + return NULL; + } + for (i = 0; i < whl; i++) { + if (bigendian){ //(c1 << 8) + c2; + comp->data[i] = data[i]; + }else{ //(c2 << 8) + c1; + comp->data[i] = (short) ShortSwap((unsigned short) data[i]); + } + if (comp->data[i] > max) + max = comp->data[i]; + } + free(data); + } + } else { + if (!comp->sgnd) { + unsigned int *data = (unsigned int *) malloc(whl * sizeof(unsigned int)); + int leido = fread(data, 4, whl, f); + if (!leido) { + free(data); fclose(f); + return NULL; + } for (i = 0; i < whl; i++) { + if (!bigendian) + comp->data[i] = LongSwap(data[i]); + else + comp->data[i] = data[i]; + if (comp->data[i] > max) + max = comp->data[i]; + } + free(data); + } else { + int leido = fread(comp->data, 4, whl, f); + if (!leido) { + fclose(f); + return NULL; + } + for (i = 0; i < whl; i++) { + if (!bigendian) + comp->data[i] = (int) LongSwap((unsigned int) comp->data[i]); + if (comp->data[i] > max) + max = comp->data[i]; + } + } + }*/ + + for (i = 0; i < whl; i++) { + int v; + if (comp->prec <= 8) { + if (!comp->sgnd) { + v = readuchar(f); + } else { + v = (char) readuchar(f); + } + } else if (comp->prec <= 16) { + if (!comp->sgnd) { + v = readushort(f, bigendian); + } else { + v = (short) readushort(f, bigendian); + } + } else { + if (!comp->sgnd) { + v = readuint(f, bigendian); + } else { + v = (int) readuint(f, bigendian); + } + } + if (v > max) + max = v; + comp->data[i] = v; + } + comp->bpp = int_floorlog2(max) + 1; + } + fclose(f); + return volume; +} + diff --git a/codec/convert.h b/codec/convert.h new file mode 100755 index 00000000..18ae2127 --- /dev/null +++ b/codec/convert.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, HervŽ 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/codec/getopt.c b/codec/getopt.c new file mode 100755 index 00000000..69addc97 --- /dev/null +++ b/codec/getopt.c @@ -0,0 +1,109 @@ +/* + * 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/codec/getopt.h b/codec/getopt.h new file mode 100755 index 00000000..23299d1b --- /dev/null +++ b/codec/getopt.h @@ -0,0 +1,14 @@ +/* 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/codec/jp3d_to_volume.c b/codec/jp3d_to_volume.c new file mode 100755 index 00000000..81dc1c78 --- /dev/null +++ b/codec/jp3d_to_volume.c @@ -0,0 +1,535 @@ +/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Hervé 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 "openjpeg.h" +#include "getopt.h" +#include "convert.h" + +#ifndef WIN32 +#define stricmp strcasecmp +#define strnicmp strncasecmp +#endif + +/* ----------------------------------------------------------------------- */ +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, '.') + 1; + for(i = 0; i < sizeof(format); i++) { + if(strnicmp(ext, extension[i], 3) == 0) { + return format[i]; + } + } + + return -1; +} + +/* -------------------------------------------------------------------------- */ + +int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters) { + /* parse the command line */ + + while (1) { + int c = getopt(argc, argv, "i:o:O:r:l:B:m:h"); + if (c == -1) + break; + switch (c) { + case 'i': /* input file */ + { + char *infile = 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 = 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 = 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 = 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(optarg, "%d, %d, %d", ¶meters->cp_reduce[0], ¶meters->cp_reduce[1], ¶meters->cp_reduce[2]); + int aux; + aux = sscanf(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(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, 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/codec/jp3d_vm_dec.ncb b/codec/jp3d_vm_dec.ncb new file mode 100755 index 0000000000000000000000000000000000000000..fc66b661edfbd0af2e2a473a556b48111c086a3f GIT binary patch literal 470016 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 _P5&z}u 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 F{2x0#sNDbn literal 0 HcmV?d00001 diff --git a/codec/jp3d_vm_dec.sln b/codec/jp3d_vm_dec.sln new file mode 100755 index 00000000..e696c5f7 --- /dev/null +++ b/codec/jp3d_vm_dec.sln @@ -0,0 +1,30 @@ +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jp3d_vm_dec", "jp3d_vm_dec.vcproj", "{E0C1B905-5B10-4C9A-AF55-2D8144D518AB}" + ProjectSection(ProjectDependencies) = postProject + {6F3FB035-8F4E-4794-B091-0F0A20223BE7} = {6F3FB035-8F4E-4794-B091-0F0A20223BE7} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LibJp3dVM", "..\LibJp3dVM.vcproj", "{6F3FB035-8F4E-4794-B091-0F0A20223BE7}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + Debug = Debug + Release = Release + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {E0C1B905-5B10-4C9A-AF55-2D8144D518AB}.Debug.ActiveCfg = Debug|Win32 + {E0C1B905-5B10-4C9A-AF55-2D8144D518AB}.Debug.Build.0 = Debug|Win32 + {E0C1B905-5B10-4C9A-AF55-2D8144D518AB}.Release.ActiveCfg = Release|Win32 + {E0C1B905-5B10-4C9A-AF55-2D8144D518AB}.Release.Build.0 = Release|Win32 + {6F3FB035-8F4E-4794-B091-0F0A20223BE7}.Debug.ActiveCfg = Debug|Win32 + {6F3FB035-8F4E-4794-B091-0F0A20223BE7}.Debug.Build.0 = Debug|Win32 + {6F3FB035-8F4E-4794-B091-0F0A20223BE7}.Release.ActiveCfg = Release|Win32 + {6F3FB035-8F4E-4794-B091-0F0A20223BE7}.Release.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/codec/jp3d_vm_dec.suo b/codec/jp3d_vm_dec.suo new file mode 100755 index 0000000000000000000000000000000000000000..28c2e25584f555673a87eee32fe678e195049c10 GIT binary patch literal 13312 zcmeI2Pi)*r701VRN|U-xXqzU%q-BZYCY0FtZ)!JCx?Zo7v~l9bAt}OAwDzvub=Uh_ zcGpfqoC_Bus1PUMfYcUx0zu0K2@Wj+3DE-zLL3XU2g(JhNc;=X)_lG*``bVE?q^SmdQFUPiI zqmkafGjP^;e6l8B!Y0WxZLYAIwWmEujnAEAq+0sv%ip>5{O^9z)Iy`jcDt72Q1r~4 zISKU{a$$41S{JM8_L%0TJ(S)HG>%mbDilb5mCl)n$(U!%DHG?JHJ{--#+dx_jB8f$ z`yd)ndq8`pR{GMR+Fwd1p`;Z^m?^$5n+Z#Ok(mKwLb-| ziS&SUfM4e80RLUOKsrGCUwS}uSiJw$?mo)=_WrYtvJZp(;C}D`_y`DqkAefB9UKH5 z;6ZQ*90uy+A)Y6}5zq;`z$ZXAP<=1YKF|*az)|op7z9J$5ukRT*_S&0(0zLF$FQ`f^p}vV zMEyxJwJ+o)vuQ68%LJmaKs267d6{@NzUZmjU7_@qOg54ToQy?TVg-h+X1ouct8ahe(3*wcH1aS8zmk~f3Muj^ zokVMnqh&|P%`v(@T3w`_ zRsQ5BzSYDRsWSa5j9Wg@YMtqR>As58^eab2bSy;M}%|6|DRJXGZeU&zgcXQTzo zrz7k?`As`Pt@K6vT&_Fq_bfEi%(~=F^Pk{7lhem@b}wa-Yv}^DEY(PlKwmzYWxhuK zsnORg3De+rHkGzfOwU@4e=5%ThDyeR=sn zb3Rn_@)K>%zdY5}tQ~iU{4LVurmLv2ZWCJRF%--EI5L+(9_2GsvP9i=?7zJXKsHdR z8h!sPHp0%xf^w+~`IkKxU$yQ(#X5ZXm!33kmDKAVB#S*!m<*>PWvy3QnP*FPVk zt3S(Nk-~YYp zPVxRZARVVvT&MHj7&Dcy^CVj-UqTi$mDgZ8bvbsA*)v*B^h^&v<`6FYJAU(0d;9Sp{qfCfho+7j>VXg~9{DRZS zn{oOnKk6=KdOCLwnS%#AE#|vh#z6=@AzhNOr=A$PbZu6M_-B)Bi2S8m?Qik<-`B(P zgHwz}p0~VVr>*7hR!^cYx{5p2O8?`u{eqi#;=M^rHDaYInzvcbE>!aR3u8J^hy5+) zzr2(b`oCFjUmf&&=roaYa95t+-9~(zwa^LwJhr{O#QL6_y3rmjuMJ(yw@|k-2Ib;5 z;;{*x^S3VL6r1>aKKGAYuGQSIxfb(Jp7JJI%)j!j{+-YLC!c#KpL;i#YcrG=2nltlHp}qYf9)J9TDt(P_6p+QQG_Z$G>Ou@82fyU1b9l1JpBIjBbD1g?yz4|r(0)(8}g$CT8sS1FIP0o`7mz&I25iwh_h7Th*#=*E@2Wj z|Cr|-UtM>(oI7&%;0AXCUH435pxhC(_$n+*=|y|pq;R4xV7q9!#OErZjbVN{NZ7)m zlK_COk9s*y_wX433V;j}&`=0WM{IpYZOMQQhm6qr8VlCb+t)w9KOBl;z3tUwy^F+p zH!k3?1Ycdu!s>nh{#>nujV$=bEUo4wD^+^z*_@RsS)+p$)@Utv_4Pz6{99X{os9Yt`#+G)jta7w zTbo2F + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/codec/jp3d_vm_enc.ncb b/codec/jp3d_vm_enc.ncb new file mode 100755 index 0000000000000000000000000000000000000000..7f0733b784a9544d0aa7a90ad9b21c4c654df270 GIT binary patch literal 568320 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 z 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

m(EpXjxbe}~iI9m=+M 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 literal 0 HcmV?d00001 diff --git a/codec/jp3d_vm_enc.sln b/codec/jp3d_vm_enc.sln new file mode 100755 index 00000000..a0e6a748 --- /dev/null +++ b/codec/jp3d_vm_enc.sln @@ -0,0 +1,35 @@ +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jp3d_vm_enc", "jp3d_vm_enc.vcproj", "{A9704A2E-3B93-4BAA-9229-02FC93D27201}" + ProjectSection(ProjectDependencies) = postProject + {6F3FB035-8F4E-4794-B091-0F0A20223BE7} = {6F3FB035-8F4E-4794-B091-0F0A20223BE7} + {6F3FB035-8F4E-4794-B091-0F0A20223BE7} = {6F3FB035-8F4E-4794-B091-0F0A20223BE7} + {6F3FB035-8F4E-4794-B091-0F0A20223BE7} = {6F3FB035-8F4E-4794-B091-0F0A20223BE7} + {6F3FB035-8F4E-4794-B091-0F0A20223BE7} = {6F3FB035-8F4E-4794-B091-0F0A20223BE7} + {6F3FB035-8F4E-4794-B091-0F0A20223BE7} = {6F3FB035-8F4E-4794-B091-0F0A20223BE7} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LibJp3dVM", "..\LibJp3dVM.vcproj", "{6F3FB035-8F4E-4794-B091-0F0A20223BE7}" + ProjectSection(ProjectDependencies) = postProject + {6F3FB035-8F4E-4794-B091-0F0A20223BE7} = {6F3FB035-8F4E-4794-B091-0F0A20223BE7} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + Debug = Debug + Release = Release + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {A9704A2E-3B93-4BAA-9229-02FC93D27201}.Debug.ActiveCfg = Debug|Win32 + {A9704A2E-3B93-4BAA-9229-02FC93D27201}.Debug.Build.0 = Debug|Win32 + {A9704A2E-3B93-4BAA-9229-02FC93D27201}.Release.ActiveCfg = Release|Win32 + {A9704A2E-3B93-4BAA-9229-02FC93D27201}.Release.Build.0 = Release|Win32 + {6F3FB035-8F4E-4794-B091-0F0A20223BE7}.Debug.ActiveCfg = Debug|Win32 + {6F3FB035-8F4E-4794-B091-0F0A20223BE7}.Debug.Build.0 = Debug|Win32 + {6F3FB035-8F4E-4794-B091-0F0A20223BE7}.Release.ActiveCfg = Release|Win32 + {6F3FB035-8F4E-4794-B091-0F0A20223BE7}.Release.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/codec/jp3d_vm_enc.suo b/codec/jp3d_vm_enc.suo new file mode 100755 index 0000000000000000000000000000000000000000..702d0dd81ee6aa926631769e00fd21bde422b579 GIT binary patch literal 21504 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/codec/volume_to_jp3d.c b/codec/volume_to_jp3d.c new file mode 100755 index 00000000..84f01e83 --- /dev/null +++ b/codec/volume_to_jp3d.c @@ -0,0 +1,903 @@ +/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Hervé 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 "openjpeg.h" +#include "getopt.h" +#include "convert.h" + +#ifndef WIN32 +#define stricmp strcasecmp +#define strnicmp strncasecmp +#endif + +/* ----------------------------------------------------------------------- */ + +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, '.') + 1; + if (ext) { + for(i = 0; i < sizeof(format)/sizeof(*format); i++) { + if(strnicmp(ext, extension[i], 3) == 0) { + return format[i]; + } + } + } + + return -1; +} + +/* ------------------------------------------------------------------------------------ */ + +int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters) { + int i, value; + + /* parse the command line */ + + while (1) { + int c = 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 = 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 = 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 = 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 = 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 = 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 = 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(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(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 = 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(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 = optarg; + strncpy(parameters->index, index, MAX_PATH); + parameters->index_on = 1; + } + break; + + /* ----------------------------------------------------- */ + + case 'p': /* progression order */ + { + char progression[4]; + + strncpy(progression, 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(optarg, "%d,%d,%d", ¶meters->subsampling_dx, ¶meters->subsampling_dy, ¶meters->subsampling_dz) != 2) { + 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(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 = 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(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(optarg, "%d", ¶meters->dcoffset) != 1) { + fprintf(stdout, "[ERROR] DC offset error !! [-D %d]\n",parameters->dcoffset); + return 1; + } + } + break; + + /* ------------------------------------------------------ */ + + case 'R': /* ROI */ + { + if (sscanf(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(optarg, "%d,%d,%d", ¶meters->cp_tx0, ¶meters->cp_ty0, ¶meters->cp_tz0) != 3) { + fprintf(stdout, "[ERROR] -l 'tile offset' argument error !! [-l X0,Y0,Z0]"); + return 1; + } + } + break; + + /* ------------------------------------------------------ + + case 'T': // Tranformation of original data (2D-DWT/3D-DWT/3D-RLS/2D-DWT+1D-RLS) + { + char transform[4]; + + strncpy(transform, 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, 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, optarg); + return 1; + } + } + + /* check for possible errors */ + + if((parameters->infile[0] == 0) || (parameters->outfile[0] == 0)) { + fprintf(stdout, "usage: jp3d_vm_enc -i volume-file -o jp3d-file (+ options)\n"); + return 1; + } + + if((parameters->decod_format == BIN_DFMT) && (parameters->imgfile[0] == 0)) { + fprintf(stdout, "usage: jp3d_vm_enc -i bin-volume-file -m img-file -o jp3d-file (+ options)\n"); + return 1; + } + + if((parameters->decod_format != BIN_DFMT) && (parameters->decod_format != PGX_DFMT) && (parameters->decod_format != IMG_DFMT)) { + fprintf(stdout, "usage: jp3d_vm_enc -i input-volume-file [*.bin,*.pgx,*.img] -o jp3d-file [*.jp3d,*.j2k] (+ options)\n"); + return 1; + } + if((parameters->cod_format != J3D_CFMT) && (parameters->cod_format != J2K_CFMT)) { + fprintf(stdout, "usage: jp3d_vm_enc -i input-volume-file [*.bin,*.pgx,*.img] -o jp3d-file [*.jp3d,*.j2k] (+ options)\n"); + return 1; + } + + if((parameters->encoding_format == ENCOD_2GR || parameters->encoding_format == ENCOD_3GR) && parameters->transform_format != TRF_3D_LSE && parameters->transform_format != TRF_3D_RLS) { + fprintf(stdout, "[ERROR] Entropy coding options -C [2GR,3GR] are only compatible with predictive-based transform algorithms: -T [3RLS,3LSE].\n"); + return 1; + } + if (parameters->encoding_format == ENCOD_3EB) + parameters->mode |= (1 << 6); + + if ((parameters->mode >> 6) & 1) { + parameters->encoding_format = ENCOD_3EB; + } + + if((parameters->numresolution[2] == 0 || (parameters->numresolution[1] == 0) || (parameters->numresolution[0] == 0))) { + fprintf(stdout, "[ERROR] -n 'resolution levels' argument error ! Resolutions must be greater than 1 in order to perform DWT.\n"); + return 1; + } + if (parameters->numresolution[1] != parameters->numresolution[0]) { + fprintf(stdout, "[ERROR] -n 'resolution levels' argument error ! Resolutions in X and Y axis must be the same in this implementation.\n"); + return 1; + } + + if (parameters->numresolution[2] > parameters->numresolution[0]) { + fprintf(stdout, "[ERROR] -n 'resolution levels' argument error ! Resolutions in Z axis must be lower than in X-Y axis.\n"); + return 1; + } + + if (parameters->dcoffset >= 128 && parameters->dcoffset <= -128) { + fprintf(stdout, "[ERROR] -D 'DC offset' argument error ! Value must be -128<=DCO<=128.\n"); + return 1; + } + + if(parameters->numresolution[2] != 1) { + parameters->transform_format = TRF_3D_DWT; + //fprintf(stdout, "[Warning] Resolution level in axial dim > 1 : 3D-DWT will be performed... \n"); + } else if (parameters->numresolution[2] == 1) { + parameters->transform_format = TRF_2D_DWT; + //fprintf(stdout, "[Warning] Resolution level in axial dim == 1 : 2D-DWT will be performed... \n"); + } + + if ((parameters->cod_format == J2K_CFMT) && (parameters->transform_format != TRF_2D_DWT || parameters->encoding_format != ENCOD_2EB)) { + fprintf(stdout, "[WARNING] Incompatible options -o *.j2k and defined transform or encoding algorithm. Latter will be ignored\n"); + parameters->transform_format = TRF_2D_DWT; + parameters->encoding_format = ENCOD_2EB; + } + + if ((parameters->cp_disto_alloc || parameters->cp_fixed_alloc || parameters->cp_fixed_quality) && (!(parameters->cp_disto_alloc ^ parameters->cp_fixed_quality))) { + fprintf(stdout, "[ERROR] Options -r and -q cannot be used together !!\n"); + return 1; + } /* mod fixed_quality */ + + /* if no rate entered, lossless by default */ + if (parameters->tcp_numlayers == 0) { + parameters->tcp_rates[0] = 0.0; /* MOD antonin : losslessbug */ + parameters->tcp_numlayers++; + parameters->cp_disto_alloc = 1; + } + + if((parameters->cp_tx0 > parameters->volume_offset_x0) || (parameters->cp_ty0 > parameters->volume_offset_y0) || (parameters->cp_tz0 > parameters->volume_offset_z0)) { + fprintf(stdout, "[ERROR] Tile offset dimension is unnappropriate --> TX0(%d)<=IMG_X0(%d) TYO(%d)<=IMG_Y0(%d) TZO(%d)<=IMG_Z0(%d)\n", + parameters->cp_tx0, parameters->volume_offset_x0, parameters->cp_ty0, parameters->volume_offset_y0, + parameters->cp_tz0, parameters->volume_offset_z0); + return 1; + } + + for (i = 0; i < parameters->numpocs; i++) { + if (parameters->POC[i].prg == -1) { + fprintf(stdout,"[ERROR] Unrecognized progression order in option -P (POC n %d) [LRCP, RLCP, RPCL, PCRL, CPRL] !!\n",i + 1); + } + } + return 0; +} + +/* -------------------------------------------------------------------------- */ + +/** +sample error callback expecting a FILE* client object +*/ +void error_callback(const char *msg, void *client_data) { + FILE *stream = (FILE*)client_data; + fprintf(stream, "[ERROR] %s", msg); +} +/** +sample warning callback expecting a FILE* client object +*/ +void warning_callback(const char *msg, void *client_data) { + FILE *stream = (FILE*)client_data; + fprintf(stream, "[WARNING] %s", msg); +} +/** +sample debug callback expecting a FILE* client object +*/ +void info_callback(const char *msg, void *client_data) { + FILE *stream = (FILE*)client_data; + fprintf(stream, "[INFO] %s", msg); +} + +/* -------------------------------------------------------------------------- */ + +int main(int argc, char **argv) { + bool bSuccess; + bool delete_comment = true; + opj_cparameters_t parameters; /* compression parameters */ + opj_event_mgr_t event_mgr; /* event manager */ + opj_volume_t *volume = NULL; + + /* + configure the event callbacks (not required) + setting of each callback is optionnal + */ + memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); + event_mgr.error_handler = error_callback; + event_mgr.warning_handler = warning_callback; + event_mgr.info_handler = info_callback; + + /* set encoding parameters to default values */ + opj_set_default_encoder_parameters(¶meters); + + /* parse input and get user encoding parameters */ + if(parse_cmdline_encoder(argc, argv, ¶meters) == 1) { + return 0; + } + + if(parameters.cp_comment == NULL) { + parameters.cp_comment = "Created by OpenJPEG version JP3D"; + /* no need to delete parameters.cp_comment on exit */ + delete_comment = false; + } + + /* encode the destination volume */ + /* ---------------------------- */ + if (parameters.cod_format == J3D_CFMT || parameters.cod_format == J2K_CFMT) { + int codestream_length, pixels, bitsin; + opj_cio_t *cio = NULL; + FILE *f = NULL; + opj_cinfo_t* cinfo = NULL; + + /* decode the source volume */ + /* ----------------------- */ + switch (parameters.decod_format) { + case PGX_DFMT: + fprintf(stdout, "[INFO] Loading pgx file(s)\n"); + volume = pgxtovolume(parameters.infile, ¶meters); + if (!volume) { + fprintf(stdout, "[ERROR] Unable to load pgx files\n"); + return 1; + } + break; + + case BIN_DFMT: + fprintf(stdout, "[INFO] Loading bin file\n"); + volume = bintovolume(parameters.infile, parameters.imgfile, ¶meters); + if (!volume) { + fprintf(stdout, "[ERROR] Unable to load bin file\n"); + return 1; + } + break; + + case IMG_DFMT: + fprintf(stdout, "[INFO] Loading img file\n"); + volume = imgtovolume(parameters.infile, ¶meters); + if (!volume) { + fprintf(stderr, "[ERROR] Unable to load img file\n"); + return 1; + } + break; + } + + /* get a JP3D or J2K compressor handle */ + if (parameters.cod_format == J3D_CFMT) + cinfo = opj_create_compress(CODEC_J3D); + else if (parameters.cod_format == J2K_CFMT) + cinfo = opj_create_compress(CODEC_J2K); + + /* catch events using our callbacks and give a local context */ + opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stdout); + + /* setup the encoder parameters using the current volume and using user parameters */ + opj_setup_encoder(cinfo, ¶meters, volume); + + /* open a byte stream for writing */ + /* allocate memory for all tiles */ + cio = opj_cio_open((opj_common_ptr)cinfo, NULL, 0); + + /* encode the volume */ + //fprintf(stdout, "[INFO] Encode the volume\n"); + bSuccess = opj_encode(cinfo, cio, volume, parameters.index); + if (!bSuccess) { + opj_cio_close(cio); + fprintf(stdout, "[ERROR] Failed to encode volume\n"); + return 1; + } + codestream_length = cio_tell(cio); + pixels =(volume->x1 - volume->x0) * (volume->y1 - volume->y0) * (volume->z1 - volume->z0); + bitsin = pixels * volume->comps[0].prec; + fprintf(stdout, "[RESULT] Volume: %d x %d x %d (x %d bpv)\n Codestream: %d B, Ratio: %5.3f bpv, (%5.3f : 1) \n", + (volume->x1 - volume->x0),(volume->y1 - volume->y0),(volume->z1 - volume->z0),volume->comps[0].prec, + codestream_length, ((double)codestream_length * 8.0/(double)pixels), ((double)bitsin/(8.0*(double)codestream_length))); + + /* write the buffer to disk */ + f = fopen(parameters.outfile, "wb"); + if (!f) { + fprintf(stdout, "[ERROR] Failed to open %s for writing\n", parameters.outfile); + return 1; + } + fwrite(cio->buffer, 1, codestream_length, f); + fclose(f); + + /* close and free the byte stream */ + opj_cio_close(cio); + + /* free remaining compression structures */ + opj_destroy_compress(cinfo); + } else { + fprintf(stdout, "[ERROR] Cod_format != JP3d !!! \n"); + return 1; + } + + /* free user parameters structure */ + if(delete_comment) { + if(parameters.cp_comment) free(parameters.cp_comment); + } + if(parameters.cp_matrice) free(parameters.cp_matrice); + + /* free volume data */ + opj_volume_destroy(volume); + + return 0; +} diff --git a/libjp3dvm/bio.c b/libjp3dvm/bio.c new file mode 100755 index 00000000..3ac93158 --- /dev/null +++ b/libjp3dvm/bio.c @@ -0,0 +1,189 @@ +/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Hervé 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/libjp3dvm/bio.h b/libjp3dvm/bio.h new file mode 100755 index 00000000..c65103bd --- /dev/null +++ b/libjp3dvm/bio.h @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Hervé 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(); +/** +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/libjp3dvm/cio.c b/libjp3dvm/cio.c new file mode 100755 index 00000000..8814a33b --- /dev/null +++ b/libjp3dvm/cio.c @@ -0,0 +1,217 @@ +/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Hervé 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_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. + */ +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. + */ +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/libjp3dvm/cio.h b/libjp3dvm/cio.h new file mode 100755 index 00000000..c6ad109f --- /dev/null +++ b/libjp3dvm/cio.h @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Hervé 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 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 occured +*/ +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 occured +*/ +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/libjp3dvm/dirent.h b/libjp3dvm/dirent.h new file mode 100755 index 00000000..a67e5874 --- /dev/null +++ b/libjp3dvm/dirent.h @@ -0,0 +1,676 @@ +/* + * 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(__BORLANDC__) /* Borland C/C++ */ +# define HAVE_DIRENT_H +# define VOID_CLOSEDIR +# elif defined(__TURBOC__) /* Borland Turbo C */ + /* no dirent.h */ +# elif defined(__WATCOMC__) /* Watcom C/C++ */ +# define HAVE_DIRECT_H +# elif defined(__apollo) /* Apollo */ +# define HAVE_SYS_DIR_H +# elif defined(__hpux) /* HP-UX */ +# define HAVE_DIRENT_H +# elif defined(__alpha) || defined(__alpha__) /* Alpha OSF1 */ +# error "not implemented" +# elif defined(__sgi) /* Silicon Graphics */ +# define HAVE_DIRENT_H +# elif defined(sun) || defined(_sun) /* Sun Solaris */ +# define HAVE_DIRENT_H +# elif defined(__FreeBSD__) /* FreeBSD */ +# define HAVE_DIRENT_H +# elif defined(__linux__) /* Linux */ +# define HAVE_DIRENT_H +# elif defined(__GNUC__) /* GNU C/C++ */ +# define HAVE_DIRENT_H +# else +# error "not implemented" +# endif +#endif + +/* include proper interface headers */ +#if defined(HAVE_DIRENT_H) +# include +# ifdef FREEBSD +# define NAMLEN(dp) ((int)((dp)->d_namlen)) +# else +# define NAMLEN(dp) ((int)(strlen((dp)->d_name))) +# endif + +#elif defined(HAVE_NDIR_H) +# include +# define NAMLEN(dp) ((int)((dp)->d_namlen)) + +#elif defined(HAVE_SYS_NDIR_H) +# include +# define NAMLEN(dp) ((int)((dp)->d_namlen)) + +#elif defined(HAVE_DIRECT_H) +# include +# define NAMLEN(dp) ((int)((dp)->d_namlen)) + +#elif defined(HAVE_DIR_H) +# include +# define NAMLEN(dp) ((int)((dp)->d_namlen)) + +#elif defined(HAVE_SYS_DIR_H) +# include +# include +# ifndef dirent +# define dirent direct +# endif +# define NAMLEN(dp) ((int)((dp)->d_namlen)) + +#elif defined(MSDOS) || defined(WIN32) + + /* figure out type of underlaying directory interface to be used */ +# if defined(WIN32) +# define DIRENT_WIN32_INTERFACE +# elif defined(MSDOS) +# define DIRENT_MSDOS_INTERFACE +# else +# error "missing native dirent interface" +# endif + + /*** WIN32 specifics ***/ +# if defined(DIRENT_WIN32_INTERFACE) +# include +# if !defined(DIRENT_MAXNAMLEN) +# define DIRENT_MAXNAMLEN (MAX_PATH) +# endif + + + /*** MS-DOS specifics ***/ +# elif defined(DIRENT_MSDOS_INTERFACE) +# include + + /* Borland defines file length macros in dir.h */ +# if defined(__BORLANDC__) +# include +# if !defined(DIRENT_MAXNAMLEN) +# define DIRENT_MAXNAMLEN ((MAXFILE)+(MAXEXT)) +# endif +# if !defined(_find_t) +# define _find_t find_t +# endif + + /* Turbo C defines ffblk structure in dir.h */ +# elif defined(__TURBOC__) +# include +# if !defined(DIRENT_MAXNAMLEN) +# define DIRENT_MAXNAMLEN ((MAXFILE)+(MAXEXT)) +# endif +# define DIRENT_USE_FFBLK + + /* MSVC */ +# elif defined(_MSC_VER) +# if !defined(DIRENT_MAXNAMLEN) +# define DIRENT_MAXNAMLEN (12) +# endif + + /* Watcom */ +# elif defined(__WATCOMC__) +# if !defined(DIRENT_MAXNAMLEN) +# if defined(__OS2__) || defined(__NT__) +# define DIRENT_MAXNAMLEN (255) +# else +# define DIRENT_MAXNAMLEN (12) +# endif +# endif + +# endif +# endif + + /*** generic MS-DOS and MS-Windows stuff ***/ +# if !defined(NAME_MAX) && defined(DIRENT_MAXNAMLEN) +# define NAME_MAX DIRENT_MAXNAMLEN +# endif +# if NAME_MAX < DIRENT_MAXNAMLEN +# error "assertion failed: NAME_MAX >= DIRENT_MAXNAMLEN" +# endif + + + /* + * Substitute for real dirent structure. Note that `d_name' field is a + * true character array although we have it copied in the implementation + * dependent data. We could save some memory if we had declared `d_name' + * as a pointer refering the name within implementation dependent data. + * We have not done that since some code may rely on sizeof(d_name) to be + * something other than four. Besides, directory entries are typically so + * small that it takes virtually no time to copy them from place to place. + */ + typedef struct dirent { + char d_name[NAME_MAX + 1]; + + /*** Operating system specific part ***/ +# if defined(DIRENT_WIN32_INTERFACE) /*WIN32*/ + WIN32_FIND_DATA data; +# elif defined(DIRENT_MSDOS_INTERFACE) /*MSDOS*/ +# if defined(DIRENT_USE_FFBLK) + struct ffblk data; +# else + struct _find_t data; +# endif +# endif + } dirent; + + /* DIR substitute structure containing directory name. The name is + * essential for the operation of ``rewinndir'' function. */ + typedef struct DIR { + char *dirname; /* directory being scanned */ + dirent current; /* current entry */ + int dirent_filled; /* is current un-processed? */ + + /*** Operating system specific part ***/ +# if defined(DIRENT_WIN32_INTERFACE) + HANDLE search_handle; +# elif defined(DIRENT_MSDOS_INTERFACE) +# endif + } DIR; + +# ifdef __cplusplus +extern "C" { +# endif + +/* supply prototypes for dirent functions */ +static DIR *opendir (const char *dirname); +static struct dirent *readdir (DIR *dirp); +static int closedir (DIR *dirp); +static void rewinddir (DIR *dirp); + +/* + * Implement dirent interface as static functions so that the user does not + * need to change his project in any way to use dirent function. With this + * it is sufficient to include this very header from source modules using + * dirent functions and the functions will be pulled in automatically. + */ +#include +#include +#include +#include +#include + +/* use ffblk instead of _find_t if requested */ +#if defined(DIRENT_USE_FFBLK) +# define _A_ARCH (FA_ARCH) +# define _A_HIDDEN (FA_HIDDEN) +# define _A_NORMAL (0) +# define _A_RDONLY (FA_RDONLY) +# define _A_SUBDIR (FA_DIREC) +# define _A_SYSTEM (FA_SYSTEM) +# define _A_VOLID (FA_LABEL) +# define _dos_findnext(dest) findnext(dest) +# define _dos_findfirst(name,flags,dest) findfirst(name,dest,flags) +#endif + +static int _initdir (DIR *p); +static const char *_getdirname (const struct dirent *dp); +static void _setdirname (struct DIR *dirp); + +/* + * + * open directory stream for reading + * DIR *opendir (const char *dirname); + * + * Open named directory stream for read and return pointer to the + * internal working area that is used for retrieving individual directory + * entries. The internal working area has no fields of your interest. + * + * Returns a pointer to the internal working area or NULL in case the + * directory stream could not be opened. Global `errno' variable will set + * in case of error as follows: + * + * + * [EACESS |Permission denied. + * [EMFILE |Too many open files used by the process. + * [ENFILE |Too many open files in system. + * [ENOENT |Directory does not exist. + * [ENOMEM |Insufficient memory. + * [ENOTDIR |dirname does not refer to directory. This value is not + * reliable on MS-DOS and MS-Windows platforms. Many + * implementations return ENOENT even when the name refers to a + * file.] + *
+ *
+ */ +static DIR *opendir(const char *dirname) +{ + DIR *dirp; + assert (dirname != NULL); + + dirp = (DIR*)malloc (sizeof (struct DIR)); + if (dirp != NULL) { + char *p; + + /* allocate room for directory name */ + dirp->dirname = (char*) malloc (strlen (dirname) + 1 + strlen ("\\*.*")); + if (dirp->dirname == NULL) { + /* failed to duplicate directory name. errno set by malloc() */ + free (dirp); + return NULL; + } + /* Copy directory name while appending directory separator and "*.*". + * Directory separator is not appended if the name already ends with + * drive or directory separator. Directory separator is assumed to be + * '/' or '\' and drive separator is assumed to be ':'. */ + strcpy (dirp->dirname, dirname); + p = strchr (dirp->dirname, '\0'); + if (dirp->dirname < p && + *(p - 1) != '\\' && *(p - 1) != '/' && *(p - 1) != ':') + { + strcpy (p++, "\\"); + } +# ifdef DIRENT_WIN32_INTERFACE + strcpy (p, "*"); /*scan files with and without extension in win32*/ +# else + strcpy (p, "*.*"); /*scan files with and without extension in DOS*/ +# endif + + /* open stream */ + if (_initdir (dirp) == 0) { + /* initialization failed */ + free (dirp->dirname); + free (dirp); + return NULL; + } + } + return dirp; +} + + +/* + * + * read a directory entry + * struct dirent *readdir (DIR *dirp); + * + * Read individual directory entry and return pointer to a structure + * containing the name of the entry. Individual directory entries returned + * include normal files, sub-directories, pseudo-directories "." and ".." + * and also volume labels, hidden files and system files in MS-DOS and + * MS-Windows. You might want to use stat(2) function to determinate which + * one are you dealing with. Many dirent implementations already contain + * equivalent information in dirent structure but you cannot depend on + * this. + * + * The dirent structure contains several system dependent fields that + * generally have no interest to you. The only interesting one is char + * d_name[] that is also portable across different systems. The d_name + * field contains the name of the directory entry without leading path. + * While d_name is portable across different systems the actual storage + * capacity of d_name varies from system to system and there is no portable + * way to find out it at compile time as different systems define the + * capacity of d_name with different macros and some systems do not define + * capacity at all (besides actual declaration of the field). If you really + * need to find out storage capacity of d_name then you might want to try + * NAME_MAX macro. The NAME_MAX is defined in POSIX standard althought + * there are many MS-DOS and MS-Windows implementations those do not define + * it. There are also systems that declare d_name as "char d_name[1]" and + * then allocate suitable amount of memory at run-time. Thanks to Alain + * Decamps (Alain.Decamps@advalvas.be) for pointing it out to me. + * + * This all leads to the fact that it is difficult to allocate space + * for the directory names when the very same program is being compiled on + * number of operating systems. Therefore I suggest that you always + * allocate space for directory names dynamically. + * + * + * Returns a pointer to a structure containing name of the directory entry + * in `d_name' field or NULL if there was an error. In case of an error the + * global `errno' variable will set as follows: + * + * + * [EBADF |dir parameter refers to an invalid directory stream. This value + * is not set reliably on all implementations.] + *
+ *
+ */ +static struct dirent * +readdir (DIR *dirp) +{ + assert(dirp != NULL); + if (dirp == NULL) { + errno = EBADF; + return NULL; + } + +#if defined(DIRENT_WIN32_INTERFACE) + if (dirp->search_handle == INVALID_HANDLE_VALUE) { + /* directory stream was opened/rewound incorrectly or it ended normally */ + errno = EBADF; + return NULL; + } +#endif + + if (dirp->dirent_filled != 0) { + /* + * Directory entry has already been retrieved and there is no need to + * retrieve a new one. Directory entry will be retrieved in advance + * when the user calls readdir function for the first time. This is so + * because real dirent has separate functions for opening and reading + * the stream whereas Win32 and DOS dirents open the stream + * automatically when we retrieve the first file. Therefore, we have to + * save the first file when opening the stream and later we have to + * return the saved entry when the user tries to read the first entry. + */ + dirp->dirent_filled = 0; + } else { + /* fill in entry and return that */ +#if defined(DIRENT_WIN32_INTERFACE) + if (FindNextFile (dirp->search_handle, &dirp->current.data) == FALSE) { + /* Last file has been processed or an error occured */ + FindClose (dirp->search_handle); + dirp->search_handle = INVALID_HANDLE_VALUE; + errno = ENOENT; + return NULL; + } + +# elif defined(DIRENT_MSDOS_INTERFACE) + if (_dos_findnext (&dirp->current.data) != 0) { + /* _dos_findnext and findnext will set errno to ENOENT when no + * more entries could be retrieved. */ + return NULL; + } +# endif + + _setdirname (dirp); + assert (dirp->dirent_filled == 0); + } + return &dirp->current; +} + + +/* + * + * close directory stream. + * int closedir (DIR *dirp); + * + * Close directory stream opened by the `opendir' function. Close of + * directory stream invalidates the DIR structure as well as previously read + * dirent entry. + * + * The function typically returns 0 on success and -1 on failure but + * the function may be declared to return void on same systems. At least + * Borland C/C++ and some UNIX implementations use void as a return type. + * The dirent wrapper tries to define VOID_CLOSEDIR whenever closedir is + * known to return nothing. The very same definition is made by the GNU + * autoconf if you happen to use it. + * + * The global `errno' variable will set to EBADF in case of error. + * + */ +static int +closedir (DIR *dirp) +{ + int retcode = 0; + + /* make sure that dirp points to legal structure */ + assert (dirp != NULL); + if (dirp == NULL) { + errno = EBADF; + return -1; + } + + /* free directory name and search handles */ + if (dirp->dirname != NULL) free (dirp->dirname); + +#if defined(DIRENT_WIN32_INTERFACE) + if (dirp->search_handle != INVALID_HANDLE_VALUE) { + if (FindClose (dirp->search_handle) == FALSE) { + /* Unknown error */ + retcode = -1; + errno = EBADF; + } + } +#endif + + /* clear dirp structure to make sure that it cannot be used anymore*/ + memset (dirp, 0, sizeof (*dirp)); +# if defined(DIRENT_WIN32_INTERFACE) + dirp->search_handle = INVALID_HANDLE_VALUE; +# endif + + free (dirp); + return retcode; +} + + +/* + * + * rewind directory stream to the beginning + * void rewinddir (DIR *dirp); + * + * Rewind directory stream to the beginning so that the next call of + * readdir() returns the very first directory entry again. However, note + * that next call of readdir() may not return the same directory entry as it + * did in first time. The directory stream may have been affected by newly + * created files. + * + * Almost every dirent implementation ensure that rewinddir will update + * the directory stream to reflect any changes made to the directory entries + * since the previous ``opendir'' or ``rewinddir'' call. Keep an eye on + * this if your program depends on the feature. I know at least one dirent + * implementation where you are required to close and re-open the stream to + * see the changes. + * + * Returns nothing. If something went wrong while rewinding, you will + * notice it later when you try to retrieve the first directory entry. + */ +static void +rewinddir (DIR *dirp) +{ + /* make sure that dirp is legal */ + assert (dirp != NULL); + if (dirp == NULL) { + errno = EBADF; + return; + } + assert (dirp->dirname != NULL); + + /* close previous stream */ +#if defined(DIRENT_WIN32_INTERFACE) + if (dirp->search_handle != INVALID_HANDLE_VALUE) { + if (FindClose (dirp->search_handle) == FALSE) { + /* Unknown error */ + errno = EBADF; + } + } +#endif + + /* re-open previous stream */ + if (_initdir (dirp) == 0) { + /* initialization failed but we cannot deal with error. User will notice + * error later when she tries to retrieve first directory enty. */ + /*EMPTY*/; + } +} + + +/* + * Open native directory stream object and retrieve first file. + * Be sure to close previous stream before opening new one. + */ +static int +_initdir (DIR *dirp) +{ + assert (dirp != NULL); + assert (dirp->dirname != NULL); + dirp->dirent_filled = 0; + +# if defined(DIRENT_WIN32_INTERFACE) + /* Open stream and retrieve first file */ + dirp->search_handle = FindFirstFile (dirp->dirname, &dirp->current.data); + if (dirp->search_handle == INVALID_HANDLE_VALUE) { + /* something went wrong but we don't know what. GetLastError() could + * give us more information about the error, but then we should map + * the error code into errno. */ + errno = ENOENT; + return 0; + } + +# elif defined(DIRENT_MSDOS_INTERFACE) + if (_dos_findfirst (dirp->dirname, + _A_SUBDIR | _A_RDONLY | _A_ARCH | _A_SYSTEM | _A_HIDDEN, + &dirp->current.data) != 0) + { + /* _dos_findfirst and findfirst will set errno to ENOENT when no + * more entries could be retrieved. */ + return 0; + } +# endif + + /* initialize DIR and it's first entry */ + _setdirname (dirp); + dirp->dirent_filled = 1; + return 1; +} + + +/* + * Return implementation dependent name of the current directory entry. + */ +static const char * +_getdirname (const struct dirent *dp) +{ +#if defined(DIRENT_WIN32_INTERFACE) + return dp->data.cFileName; + +#elif defined(DIRENT_USE_FFBLK) + return dp->data.ff_name; + +#else + return dp->data.name; +#endif +} + + +/* + * Copy name of implementation dependent directory entry to the d_name field. + */ +static void +_setdirname (struct DIR *dirp) { + /* make sure that d_name is long enough */ + assert (strlen (_getdirname (&dirp->current)) <= NAME_MAX); + + strncpy (dirp->current.d_name, + _getdirname (&dirp->current), + NAME_MAX); + dirp->current.d_name[NAME_MAX] = '\0'; /*char d_name[NAME_MAX+1]*/ +} + +# ifdef __cplusplus +} +# endif +# define NAMLEN(dp) ((int)(strlen((dp)->d_name))) + +#else +# error "missing dirent interface" +#endif + + +#endif /*DIRENT_H*/ diff --git a/libjp3dvm/dwt.c b/libjp3dvm/dwt.c new file mode 100755 index 00000000..39ee15c2 --- /dev/null +++ b/libjp3dvm/dwt.c @@ -0,0 +1,1016 @@ +/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Hervé 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 tranform 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 tranform 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 */ +/* 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 */ +/* 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 */ +/* 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 tranform 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 tranform 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 tranform 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 tranform 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/libjp3dvm/dwt.h b/libjp3dvm/dwt.h new file mode 100755 index 00000000..afb1ba4f --- /dev/null +++ b/libjp3dvm/dwt.h @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Hervé 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 tranform 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 tranform 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/libjp3dvm/event.c b/libjp3dvm/event.c new file mode 100755 index 00000000..6fe8ae2e --- /dev/null +++ b/libjp3dvm/event.c @@ -0,0 +1,181 @@ +/* + * Copyright (c) 2005, Hervé 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/libjp3dvm/event.h b/libjp3dvm/event.h new file mode 100755 index 00000000..acc4fc3e --- /dev/null +++ b/libjp3dvm/event.h @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2005, Hervé 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 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 optionnal 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/libjp3dvm/fix.h b/libjp3dvm/fix.h new file mode 100755 index 00000000..f2113b5a --- /dev/null +++ b/libjp3dvm/fix.h @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Hervé 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/libjp3dvm/int.h b/libjp3dvm/int.h new file mode 100755 index 00000000..99ab72bb --- /dev/null +++ b/libjp3dvm/int.h @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Hervé 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 openjpeg.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/libjp3dvm/jp3d.c b/libjp3dvm/jp3d.c new file mode 100755 index 00000000..4a5527b7 --- /dev/null +++ b/libjp3dvm/jp3d.c @@ -0,0 +1,2328 @@ +/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Hervé 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 ZSI marker (3rd volume and tile size) +@param j3d J3D handle +*/ +static void j3d_write_zsi(opj_j3d_t *j3d); +/** +Read the ZSI marker (3rd volume and tile size) +@param j3d J3D handle +*/ +static void j3d_read_zsi(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); +/*@}*/ + +/* ----------------------------------------------------------------------- */ + +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"); +} + +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); + 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); +} +static void j3d_write_zsi(opj_j3d_t *j3d) { + int i; + int lenp, len; + + opj_cio_t *cio = j3d->cio; + opj_volume_t *volume = j3d->volume; + opj_cp_t *cp = j3d->cp; + + cio_write(cio, J3D_MS_ZSI, 2); /* ZSI */ + lenp = cio_tell(cio); + cio_skip(cio, 2); + 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_zsi(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 */ + 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, 0, 2); + cio_write(cio, j3d->cp->transform_format,1); + cio_write(cio, j3d->cp->encoding_format,1); + //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); + + j3d->cp->transform_format = (OPJ_TRANSFORM) cio_read(cio, 1); + j3d->cp->encoding_format = (OPJ_ENTROPY_CODING) cio_read(cio, 1); + //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); //posible comments +} + +static void j3d_write_cox(opj_j3d_t *j3d, int compno) { + int i; + + 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*/ + } + /* (cblkw - 2) + (cblkh - 2) + (cblkl - 2) <= 18*/ + cio_write(cio, tccp->cblk[0] - 2, 1); /* SPcox (G) Cblk width entre 10 y 2 (8 y 0)*/ + cio_write(cio, tccp->cblk[1] - 2, 1); /* SPcox (H) Cblk height*/ + if (j3d->cinfo->codec_format == CODEC_J3D) { + cio_write(cio, tccp->cblk[2] - 2, 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; + + 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]); + + tccp->cblk[0] = cio_read(cio, 1) + 2; /* SPcox (G) */ + tccp->cblk[1] = cio_read(cio, 1) + 2; /* SPcox (H) */ + if (j3d->cinfo->codec_format == CODEC_J3D) + tccp->cblk[2] = cio_read(cio, 1) + 2; /* 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*/ + + 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_ZSI, J3D_STATE_MHSIZ, j3d_read_zsi}, + {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; + + + cp->encoding_format = ENCOD_2EB; + 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_zsi(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); + + if (j3d->cp->transform_format != TRF_2D_DWT || j3d->cp->encoding_format != ENCOD_2EB) + j3d_write_com(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/libjp3dvm/jp3d.h b/libjp3dvm/jp3d.h new file mode 100755 index 00000000..d9dcc8e3 --- /dev/null +++ b/libjp3dvm/jp3d.h @@ -0,0 +1,518 @@ +/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Hervé 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 j3d.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 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_ZSI 0xff54 /**< ZSI 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 heigth & 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, heigth 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, heigth 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 curently 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/libjp3dvm/jp3d_lib.c b/libjp3dvm/jp3d_lib.c new file mode 100755 index 00000000..fe19ab8b --- /dev/null +++ b/libjp3dvm/jp3d_lib.c @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2005, Hervé 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 +} + +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/libjp3dvm/jp3d_lib.h b/libjp3dvm/jp3d_lib.h new file mode 100755 index 00000000..45b28309 --- /dev/null +++ b/libjp3dvm/jp3d_lib.h @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2005, Hervé 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(); + +/** +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/libjp3dvm/mct.c b/libjp3dvm/mct.c new file mode 100755 index 00000000..be4b875e --- /dev/null +++ b/libjp3dvm/mct.c @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Hervé 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 }; + +/* */ +/* Foward 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]; +} + +/* */ +/* Foward 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/libjp3dvm/mct.h b/libjp3dvm/mct.h new file mode 100755 index 00000000..81513f7c --- /dev/null +++ b/libjp3dvm/mct.h @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Hervé 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/libjp3dvm/mqc.c b/libjp3dvm/mqc.c new file mode 100755 index 00000000..4117bf1f --- /dev/null +++ b/libjp3dvm/mqc.c @@ -0,0 +1,548 @@ +/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Hervé 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/libjp3dvm/mqc.h b/libjp3dvm/mqc.h new file mode 100755 index 00000000..67cfc008 --- /dev/null +++ b/libjp3dvm/mqc.h @@ -0,0 +1,201 @@ +/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Hervé 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(); +/** +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/libjp3dvm/openjpeg.c b/libjp3dvm/openjpeg.c new file mode 100755 index 00000000..2a6fe7c6 --- /dev/null +++ b/libjp3dvm/openjpeg.c @@ -0,0 +1,207 @@ +/* + * Copyright (c) 2005, Hervé 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" + +/* ---------------------------------------------------------------------- */ +#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 OPENJPEG_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/libjp3dvm/openjpeg.h b/libjp3dvm/openjpeg.h new file mode 100755 index 00000000..36c09aff --- /dev/null +++ b/libjp3dvm/openjpeg.h @@ -0,0 +1,715 @@ +/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Hervé 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 + +#define OPENJPEG_VERSION "1.0.0" + +/* +========================================================== + Compiler directives +========================================================== +*/ + +#if defined(OPJ_STATIC) || !(defined(WIN32) || defined(__WIN32__)) +#define OPJ_API +#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, wheras this DLL sees symbols +defined with this macro as being exported. +*/ +#ifdef OPJ_EXPORTS +#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(); + +/* +========================================================== + 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/libjp3dvm/opj_includes.h b/libjp3dvm/opj_includes.h new file mode 100755 index 00000000..ed975733 --- /dev/null +++ b/libjp3dvm/opj_includes.h @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2005, Hervé 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 "openjpeg.h" + +/* + ========================================================== + OpenJPEG modules + ========================================================== +*/ + +#include "dirent.h" +#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" + +//#include "pred.h" +//#include "golomb.h" + +#endif /* OPJ_INCLUDES_H */ diff --git a/libjp3dvm/pi.c b/libjp3dvm/pi.c new file mode 100755 index 00000000..5fd673fd --- /dev/null +++ b/libjp3dvm/pi.c @@ -0,0 +1,630 @@ +/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Hervé 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; + 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; + 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; + for (resno = 0; resno < comp->numresolution[0]; resno++) { + int dx, dy; + res = &comp->resolutions[resno]; + dx = comp->dx * (1 << (res->pdx + comp->numresolution[0] - 1 - resno)); + dy = comp->dy * (1 << (res->pdy + comp->numresolution[0] - 1 - resno)); + pi->dx = !pi->dx ? dx : int_min(pi->dx, dx); + pi->dy = !pi->dy ? dy : int_min(pi->dy, dy); + } + 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; + 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/libjp3dvm/pi.h b/libjp3dvm/pi.h new file mode 100755 index 00000000..1d3340be --- /dev/null +++ b/libjp3dvm/pi.h @@ -0,0 +1,145 @@ +/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Hervé 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 (usefull 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/libjp3dvm/raw.c b/libjp3dvm/raw.c new file mode 100755 index 00000000..59d7d35b --- /dev/null +++ b/libjp3dvm/raw.c @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Hervé 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/libjp3dvm/raw.h b/libjp3dvm/raw.h new file mode 100755 index 00000000..e17070ab --- /dev/null +++ b/libjp3dvm/raw.h @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Hervé 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(); +/** +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/libjp3dvm/t1.c b/libjp3dvm/t1.c new file mode 100755 index 00000000..43a78b6a --- /dev/null +++ b/libjp3dvm/t1.c @@ -0,0 +1,1181 @@ +/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Hervé 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/libjp3dvm/t1.h b/libjp3dvm/t1.h new file mode 100755 index 00000000..ec7160c1 --- /dev/null +++ b/libjp3dvm/t1.h @@ -0,0 +1,173 @@ +/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Hervé 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 (heigth) */ +#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 (heigth) */ +#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/libjp3dvm/t1_3d.c b/libjp3dvm/t1_3d.c new file mode 100755 index 00000000..efdf2efc --- /dev/null +++ b/libjp3dvm/t1_3d.c @@ -0,0 +1,1230 @@ +/* + * 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/libjp3dvm/t1_3d.h b/libjp3dvm/t1_3d.h new file mode 100755 index 00000000..dd73763d --- /dev/null +++ b/libjp3dvm/t1_3d.h @@ -0,0 +1,173 @@ +/* + * 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/libjp3dvm/t2.c b/libjp3dvm/t2.c new file mode 100755 index 00000000..20d8e7d2 --- /dev/null +++ b/libjp3dvm/t2.c @@ -0,0 +1,675 @@ +/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Hervé 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)) { + 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"); + } 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/libjp3dvm/t2.h b/libjp3dvm/t2.h new file mode 100755 index 00000000..191d0bc4 --- /dev/null +++ b/libjp3dvm/t2.h @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Hervé 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/libjp3dvm/tcd.c b/libjp3dvm/tcd.c new file mode 100755 index 00000000..b0184d58 --- /dev/null +++ b/libjp3dvm/tcd.c @@ -0,0 +1,1738 @@ +/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Hervé 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"); +} + +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 = (float) (8 * 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 = (float) (8 * 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, 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 bistream\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 bistream\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/libjp3dvm/tcd.h b/libjp3dvm/tcd.h new file mode 100755 index 00000000..0de60b8c --- /dev/null +++ b/libjp3dvm/tcd.h @@ -0,0 +1,334 @@ +/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Hervé 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 posible 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 informations */ + 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 heigth 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 heigth 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/libjp3dvm/tgt.c b/libjp3dvm/tgt.c new file mode 100755 index 00000000..9398ea94 --- /dev/null +++ b/libjp3dvm/tgt.c @@ -0,0 +1,256 @@ +/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Hervé 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_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; + + p = tree->numleafsh * tree->numleafsv * tree->numleafsz; + p0 = p; + n = 0; + //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 (j = 0; j < nplv[i]; ++j) { + k = nplh[i]*nplz[i]; + while (--k >= 0) { + node->parent = parentnode; //fprintf(stdout,"node[%d].parent = node[%d]\n",n,p); + ++node; ++n; + if (--k >= 0 && n < p) { + node->parent = parentnode; //fprintf(stdout,"node[%d].parent = node[%d]\n",n,p); + ++node; ++n; + } + if (nplz[i] != 1){ //2D operation vs 3D operation + if (--k >= 0 && n < p) { + node->parent = parentnode; //fprintf(stdout,"node[%d].parent = node[%d]\n",n,p); + ++node; ++n; + } + if (--k >= 0 && n < p) { + node->parent = parentnode; //fprintf(stdout,"node[%d].parent = node[%d]\n",n,p); + ++node; ++n; + } + } + ++parentnode; ++p; + } + if ((j & 1) || j == nplv[i] - 1) { + parentnode0 = parentnode; p0 = p; //fprintf(stdout,"parent = node[%d] \n",p); + } else { + parentnode = parentnode0; p = p0; //fprintf(stdout,"parent = node[%d] \n",p); + parentnode0 += nplh[i]*nplz[i]; p0 += nplh[i]*nplz[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/libjp3dvm/tgt.h b/libjp3dvm/tgt.h new file mode 100755 index 00000000..ad27f113 --- /dev/null +++ b/libjp3dvm/tgt.h @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Hervé 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/libjp3dvm/volume.c b/libjp3dvm/volume.c new file mode 100755 index 00000000..9066e390 --- /dev/null +++ b/libjp3dvm/volume.c @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2005, Hervé 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_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/libjp3dvm/volume.h b/libjp3dvm/volume.h new file mode 100755 index 00000000..737bde79 --- /dev/null +++ b/libjp3dvm/volume.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2005, Hervé 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/tcltk/LPI_JP3D_VM.tcl b/tcltk/LPI_JP3D_VM.tcl new file mode 100755 index 00000000..eb184de7 --- /dev/null +++ b/tcltk/LPI_JP3D_VM.tcl @@ -0,0 +1,114 @@ +#!/bin/sh +# The next line is executed by /bin/sh, but not tcl \ +exec wish "$0" ${1+"$@"} + +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/tcltk/Thumbs.db b/tcltk/Thumbs.db new file mode 100755 index 0000000000000000000000000000000000000000..5d6ffdf99eb8ebe582a94fa45d711c3e0bb856ca GIT binary patch literal 18944 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 Be`5du literal 0 HcmV?d00001 diff --git a/tcltk/decoder.tcl b/tcltk/decoder.tcl new file mode 100755 index 00000000..6fadbb18 --- /dev/null +++ b/tcltk/decoder.tcl @@ -0,0 +1,272 @@ + +namespace eval VMDecoder { + variable var + variable JP3Ddecoder "../bin/jp3d_vm_dec.exe" + #variable JP3Ddecoder "jp3d_vm_dec.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/tcltk/encoder.tcl b/tcltk/encoder.tcl new file mode 100755 index 00000000..dc174b71 --- /dev/null +++ b/tcltk/encoder.tcl @@ -0,0 +1,470 @@ + +namespace eval VMEncoder { + variable var + variable JP3Dencoder "../bin/jp3d_vm_enc.exe" +} + +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 + } +} \ No newline at end of file diff --git a/tcltk/logoLPI.gif b/tcltk/logoLPI.gif new file mode 100755 index 0000000000000000000000000000000000000000..df79515057f4163e12943482993fc337eafe2002 GIT binary patch literal 5212 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 HVCw$>l!K-J literal 0 HcmV?d00001

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%0D2_Lo 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 zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5;&CJ6MDg-pZl@v7{t zYQ&HLfkq0XdO=E+jBNccCfr2@oJafB=D|Dlk8=R7<8@1PBly zK!Cu71TJ}~m~ze9g>zg}=3lZXf8ktG1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfIzbamPPS10t5&UAdm~(ck-$C zzhU^x1Le@~038wW|FwIUKAK!5;&O5mNBzw-J&d*=SR zwQqgudj>xJc>NrpOwX0m>-_3-h6D%@AV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5;&|1Sa;$ABRO^_r&fB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+!2hso$Er~TVI07BFNp>V zD{Bq5*2YHJH2MaLphYl6zz47r-#}1oeFMQ-Z8lm2L^#DJjaF$bR)R$kJa@d?&D@b7 zq}=bfu$gaW_lo~-Z}xWXLVy4P0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009EU>dc^Q+q9>xYg0W+e{2K@gcVqBlc(KAfIvKf^o-CwC&WuHF@e|u zX$@c<5c@qKJ%OUQyfam3DjEa`5FkK+Koo%s8`Gps9VM}x1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!CvM1#YYyy|!%2w0B#oKb(Jl?$hgoYPlQK5+Fc; z009C72oN9;LZDk8bZv;xLJ}a*3p~BIwLRWEtbgxa`*?NjRek;Q?RVpiAJwfZH=jLx z@U7}kR1hFQfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0$~NpS@P88bq6x)3M~NwAqCQX!F?d)r5BpOzvlw;-y4BIOo4oD5K};E0tAYpsiz7} zMS}nV0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FoH9 zFvXDarcH;0@4zQD`5V|z4nsF7D#j7{Ez(}ke)zMG&KbR1PBly zKp>hxQ$EJ>T-A&~A1qZm=8BtT$6!2DkT(IpT>pj#K@Yk?rq#UwzW7ij9f zR1hFQfB*pkK?IsANKi2e5FkK+0D)d$@$=vJ0X>a^009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5csdaa&|`9)@jeTrL6O3GMQvuB>@6K1k!!sOpvT%5+E=ykmmo|{E!|2 z0s#cl+)w*TfUF`CAaIgEQ=fFiH~|6#2oNAJRDq@%YBIS95FkK+0D+SPR(GaH);H$Q zSf7orE{xBgrAL4O0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5)e7FcQHml;8-kNQn@ zHan&yK!5-N0t5&UAV6UF0^OQm)J9Ep*Deh|x`YG>^a4%YmkI&|2oNAZVDJL__qVpk zn}^llg9=E1009C72=oG%nkRSeKKfqITF(K!jDi3G0t5&QUEqt){h?oC`3MjoK!89d z@Z#~$Hy01~s#)v*05TgT0RjXF5E!b!^!NW?KKF-uf#o7VfB*pk#|Z4c-5tMt|F!@A zf7bUraEz590t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009Dj+qDm9tE#h6*c&(~_G3rI1QlB(x_d9EsMxWiqN1^&QG>k^J@$r*#zGPcDk4#% zXzUF%YOrJPN)#14#uBXDcb#*{=goJ&aqqbQ_{Y8D^6W7tYtFs)*?X;L%{Avc-vt2z z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U`2R;> zf%w`U|Mu1Y(VpE}Y?9({)lTSx~ zXx^U>uC-GnK!5-N0`mmUTYjC|eVi@<_$AU(Rvykkn*U9Z`#p7W}<1PBlyK!5-N0t5)m7XtsjKA0~~+DQ^1 z@NWV$rgXhAz4dQ9GzkzOK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RpK$-3C2ko0Q}=Z=2M6CjWR5ATZwww8fbx#ft!e`A;B;5$44S^WWJ! zV*>NHK(Yp~4w%3DfU_r%O07DzOJR141_1&D2oNAJzX&WdsOwB;PnloN*m)8lK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF 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 L1PJ_JEAZa{nDX>> literal 0 HcmV?d00001 diff --git a/bin/jp3d_vm_dec.exe b/bin/jp3d_vm_dec.exe new file mode 100755 index 0000000000000000000000000000000000000000..2119608ad72fc91dac80a2b052fb5a88945e8629 GIT binary patch literal 9687040 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