OpenJPEG version 1.1

This commit is contained in:
Antonin Descampe 2005-12-08 09:38:47 +00:00
parent e45e87cfb7
commit 95bc884365
50 changed files with 8419 additions and 7640 deletions

8
ChangeLog Normal file
View File

@ -0,0 +1,8 @@
What's New for OpenJPEG
* : fixed
- : removed
! : changed
+ : added
December 5, 2005 - 1.0.0

266
LibOpenJPEG.dsp Normal file
View File

@ -0,0 +1,266 @@
# Microsoft Developer Studio Project File - Name="LibOpenJPEG" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Static Library" 0x0104
CFG=LibOpenJPEG - 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 "LibOpenJPEG.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 "LibOpenJPEG.mak" CFG="LibOpenJPEG - Win32 Debug"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "LibOpenJPEG - Win32 Release" (based on "Win32 (x86) Static Library")
!MESSAGE "LibOpenJPEG - Win32 Debug" (based on "Win32 (x86) Static Library")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
RSC=rc.exe
!IF "$(CFG)" == "LibOpenJPEG - 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 Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /FD /c
# SUBTRACT CPP /YX
# ADD BASE RSC /l 0x40c /d "NDEBUG"
# ADD RSC /l 0x40c /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LIB32=link.exe -lib
# ADD BASE LIB32 /nologo
# ADD LIB32 /nologo
# Begin Special Build Tool
SOURCE="$(InputPath)"
PostBuild_Cmds=copy Release\LibOpenJPEG.lib dist copy libopenjpeg\openjpeg.h dist
# End Special Build Tool
!ELSEIF "$(CFG)" == "LibOpenJPEG - 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 Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /FD /GZ /c
# SUBTRACT CPP /YX
# ADD BASE RSC /l 0x40c /d "_DEBUG"
# ADD RSC /l 0x40c /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LIB32=link.exe -lib
# ADD BASE LIB32 /nologo
# ADD LIB32 /nologo
# Begin Special Build Tool
SOURCE="$(InputPath)"
PostBuild_Cmds=copy Debug\LibOpenJPEG.lib dist copy libopenjpeg\openjpeg.h dist
# End Special Build Tool
!ENDIF
# Begin Target
# Name "LibOpenJPEG - Win32 Release"
# Name "LibOpenJPEG - 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\fix.c
# End Source File
# Begin Source File
SOURCE=libopenjpeg\image.c
# End Source File
# Begin Source File
SOURCE=libopenjpeg\int.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
# End Target
# End Project

29
LibOpenJPEG.dsw Normal file
View File

@ -0,0 +1,29 @@
Microsoft Developer Studio Workspace File, Format Version 6.00
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
###############################################################################
Project: "LibOpenJPEG"=.\LibOpenJPEG.dsp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
}}}
###############################################################################
Global:
Package=<5>
{{{
}}}
Package=<3>
{{{
}}}
###############################################################################

68
Makefile Normal file
View File

@ -0,0 +1,68 @@
# 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/fix.c ./libopenjpeg/image.c ./libopenjpeg/int.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
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 -f core dist/*.* u2dtmp* $(MODULES) $(STATICLIB) $(SHAREDLIB) $(LIBNAME)
osx:
make -f Makefile.osx
osxinstall:
make -f Makefile.osx install

57
Makefile.osx Normal file
View File

@ -0,0 +1,57 @@
# Mac OSX makefile for OpenJPEG
VER_MAJOR = 1
VER_MINOR = 0.0
SRCS = ./libopenjpeg/bio.c ./libopenjpeg/cio.c ./libopenjpeg/dwt.c ./libopenjpeg/event.c ./libopenjpeg/fix.c ./libopenjpeg/image.c ./libopenjpeg/int.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
LIBTOOL = libtool
INSTALLDIR = /usr/lib
COMPILERFLAGS = -O3
LIBRARIES = -lc -lgcc -lstdc++
MODULES = $(SRCS:.c=.o)
CFLAGS = $(COMPILERFLAGS) $(INCLUDE)
TARGET = openjpeg
STATICLIB = lib$(TARGET).a
SHAREDLIB = lib$(TARGET)-$(VER_MAJOR).$(VER_MINOR).dylib
LIBNAME = lib$(TARGET).dylib.$(VER_MAJOR)
default: all
all: dist
dist: OpenJPEG
cp *.a dist
cp *.dylib dist
cp libopenjpeg/openjpeg.h dist
OpenJPEG: $(STATICLIB) $(SHAREDLIB)
.c.o:
$(CC) $(CFLAGS) -c $< -o $@
$(STATICLIB): $(MODULES)
$(LIBTOOL) -o $@ $(MODULES)
$(SHAREDLIB): $(MODULES)
$(LIBTOOL) -dynamic $(LIBRARIES) -o $@ $(MODULES)
install:
install -m 644 -o root -g wheel $(STATICLIB) $(INSTALLDIR)
install -m 755 -o root -g wheel $(SHAREDLIB) $(INSTALLDIR)
ln -sf $(SHAREDLIB) $(INSTALLDIR)/$(LIBNAME)
ldconfig
clean:
rm -f core dist/*.* u2dtmp* $(MODULES) $(STATICLIB) $(SHAREDLIB) $(LIBNAME)

24
README.linux Normal file
View File

@ -0,0 +1,24 @@
Release Notes
--------------
This version of the library has been tested under the following OS:
- RedHat Linux 9.0
You should be able to link progams with the -lopenjpeg option after the library is compiled and installed.
You can also statically link with libopenjpeg.a.
If you use a really old version of gcc and it chokes on the CRs in the file, you can type 'make dos2unix'
to run all of the files through dos2unix which converts CRLF to LF. This no longer appears to be required
for RedHat 7.3 or 9.
Please let us know how this works for you under other Linux distributions or any other *nix.
Installation
------------
Note: You will need to have root privileges in order to install the library in the /usr/lib directory.
The installation process is as simple as this :
1) Enter the OpenJPEG directory
2) Build the distribution :
make
make install
3) Clean all files produced during the build process
make clean

16
README.osx Normal file
View File

@ -0,0 +1,16 @@
Release Notes
--------------
This version of the library has been tested under OSX 10.2 using gcc 3.3.
While the makefiles will make a .dylib and a .a, it is recommended to simply staticly link with the .a file.
Installation
------------
Note: You will need to have root privileges in order to install the library in the /usr/lib directory.
The installation process is as simple as this :
1) Enter the OpenJPEG directory
2) Build the distribution :
make osx
make osxinstall
3) Clean all files produced during the build process
make clean

24
clean.bat Normal file
View File

@ -0,0 +1,24 @@
rd Release /s /q
rd Debug /s /q
rd codec\Debug /s /q
rd codec\Release /s /q
del *.pch /s /q
del *.ncb /s /q
del *.opt /s /q
del *.plg /s /q
del *.obj /s /q
del *.dll /s /q
del *.exe /s /q
del *.bsc /s /q
del *.bak /s /q
del *.pdb /s /q
del *.sql /s /q
del *.mdb /s /q
del *.lib /s /q
del *.exp /s /q
del *.ilk /s /q
del *.idb /s /q
del *.aps /s /q
del *.suo /s /q /a:h
del *.o /s /q

232
doc/Doxyfile.dox Normal file
View File

@ -0,0 +1,232 @@
# Doxyfile 1.4.2
#---------------------------------------------------------------------------
# Project related configuration options
#---------------------------------------------------------------------------
PROJECT_NAME = OpenJPEG
PROJECT_NUMBER =
OUTPUT_DIRECTORY = ../
CREATE_SUBDIRS = NO
OUTPUT_LANGUAGE = English
USE_WINDOWS_ENCODING = YES
BRIEF_MEMBER_DESC = YES
REPEAT_BRIEF = YES
ABBREVIATE_BRIEF = "The $name class" \
"The $name widget" \
"The $name file" \
is \
provides \
specifies \
contains \
represents \
a \
an \
the
ALWAYS_DETAILED_SEC = NO
INLINE_INHERITED_MEMB = NO
FULL_PATH_NAMES = NO
STRIP_FROM_PATH = C://
STRIP_FROM_INC_PATH =
SHORT_NAMES = NO
JAVADOC_AUTOBRIEF = YES
MULTILINE_CPP_IS_BRIEF = NO
DETAILS_AT_TOP = YES
INHERIT_DOCS = YES
DISTRIBUTE_GROUP_DOC = NO
SEPARATE_MEMBER_PAGES = NO
TAB_SIZE = 8
ALIASES =
OPTIMIZE_OUTPUT_FOR_C = YES
OPTIMIZE_OUTPUT_JAVA = NO
SUBGROUPING = YES
#---------------------------------------------------------------------------
# Build related configuration options
#---------------------------------------------------------------------------
EXTRACT_ALL = YES
EXTRACT_PRIVATE = YES
EXTRACT_STATIC = YES
EXTRACT_LOCAL_CLASSES = YES
EXTRACT_LOCAL_METHODS = NO
HIDE_UNDOC_MEMBERS = NO
HIDE_UNDOC_CLASSES = NO
HIDE_FRIEND_COMPOUNDS = NO
HIDE_IN_BODY_DOCS = NO
INTERNAL_DOCS = NO
CASE_SENSE_NAMES = NO
HIDE_SCOPE_NAMES = NO
SHOW_INCLUDE_FILES = YES
INLINE_INFO = YES
SORT_MEMBER_DOCS = YES
SORT_BRIEF_DOCS = NO
SORT_BY_SCOPE_NAME = NO
GENERATE_TODOLIST = YES
GENERATE_TESTLIST = YES
GENERATE_BUGLIST = YES
GENERATE_DEPRECATEDLIST= YES
ENABLED_SECTIONS =
MAX_INITIALIZER_LINES = 30
SHOW_USED_FILES = YES
SHOW_DIRECTORIES = NO
FILE_VERSION_FILTER =
#---------------------------------------------------------------------------
# configuration options related to warning and progress messages
#---------------------------------------------------------------------------
QUIET = NO
WARNINGS = YES
WARN_IF_UNDOCUMENTED = YES
WARN_IF_DOC_ERROR = YES
WARN_NO_PARAMDOC = NO
WARN_FORMAT = "$file:$line: $text"
WARN_LOGFILE =
#---------------------------------------------------------------------------
# configuration options related to the input files
#---------------------------------------------------------------------------
INPUT = ../libopenjpeg
FILE_PATTERNS = *.h \
*.c
RECURSIVE = NO
EXCLUDE =
EXCLUDE_SYMLINKS = NO
EXCLUDE_PATTERNS =
EXAMPLE_PATH =
EXAMPLE_PATTERNS = *
EXAMPLE_RECURSIVE = NO
IMAGE_PATH =
INPUT_FILTER =
FILTER_PATTERNS =
FILTER_SOURCE_FILES = NO
#---------------------------------------------------------------------------
# configuration options related to source browsing
#---------------------------------------------------------------------------
SOURCE_BROWSER = NO
INLINE_SOURCES = NO
STRIP_CODE_COMMENTS = YES
REFERENCED_BY_RELATION = YES
REFERENCES_RELATION = YES
VERBATIM_HEADERS = YES
#---------------------------------------------------------------------------
# configuration options related to the alphabetical class index
#---------------------------------------------------------------------------
ALPHABETICAL_INDEX = NO
COLS_IN_ALPHA_INDEX = 5
IGNORE_PREFIX =
#---------------------------------------------------------------------------
# configuration options related to the HTML output
#---------------------------------------------------------------------------
GENERATE_HTML = YES
HTML_OUTPUT = ./html
HTML_FILE_EXTENSION = .html
HTML_HEADER =
HTML_FOOTER =
HTML_STYLESHEET =
HTML_ALIGN_MEMBERS = YES
GENERATE_HTMLHELP = NO
CHM_FILE =
HHC_LOCATION =
GENERATE_CHI = NO
BINARY_TOC = NO
TOC_EXPAND = NO
DISABLE_INDEX = NO
ENUM_VALUES_PER_LINE = 4
GENERATE_TREEVIEW = NO
TREEVIEW_WIDTH = 250
#---------------------------------------------------------------------------
# configuration options related to the LaTeX output
#---------------------------------------------------------------------------
GENERATE_LATEX = NO
LATEX_OUTPUT = latex
LATEX_CMD_NAME = latex
MAKEINDEX_CMD_NAME = makeindex
COMPACT_LATEX = NO
PAPER_TYPE = a4wide
EXTRA_PACKAGES =
LATEX_HEADER =
PDF_HYPERLINKS = NO
USE_PDFLATEX = NO
LATEX_BATCHMODE = NO
LATEX_HIDE_INDICES = NO
#---------------------------------------------------------------------------
# configuration options related to the RTF output
#---------------------------------------------------------------------------
GENERATE_RTF = NO
RTF_OUTPUT = rtf
COMPACT_RTF = NO
RTF_HYPERLINKS = NO
RTF_STYLESHEET_FILE =
RTF_EXTENSIONS_FILE =
#---------------------------------------------------------------------------
# configuration options related to the man page output
#---------------------------------------------------------------------------
GENERATE_MAN = NO
MAN_OUTPUT = man
MAN_EXTENSION = .3
MAN_LINKS = NO
#---------------------------------------------------------------------------
# configuration options related to the XML output
#---------------------------------------------------------------------------
GENERATE_XML = NO
XML_OUTPUT = xml
XML_SCHEMA =
XML_DTD =
XML_PROGRAMLISTING = YES
#---------------------------------------------------------------------------
# configuration options for the AutoGen Definitions output
#---------------------------------------------------------------------------
GENERATE_AUTOGEN_DEF = NO
#---------------------------------------------------------------------------
# configuration options related to the Perl module output
#---------------------------------------------------------------------------
GENERATE_PERLMOD = NO
PERLMOD_LATEX = NO
PERLMOD_PRETTY = YES
PERLMOD_MAKEVAR_PREFIX =
#---------------------------------------------------------------------------
# Configuration options related to the preprocessor
#---------------------------------------------------------------------------
ENABLE_PREPROCESSING = YES
MACRO_EXPANSION = NO
EXPAND_ONLY_PREDEF = NO
SEARCH_INCLUDES = YES
INCLUDE_PATH =
INCLUDE_FILE_PATTERNS =
PREDEFINED =
EXPAND_AS_DEFINED =
SKIP_FUNCTION_MACROS = YES
#---------------------------------------------------------------------------
# Configuration::additions related to external references
#---------------------------------------------------------------------------
TAGFILES =
GENERATE_TAGFILE =
ALLEXTERNALS = NO
EXTERNAL_GROUPS = YES
PERL_PATH = /usr/bin/perl
#---------------------------------------------------------------------------
# Configuration options related to the dot tool
#---------------------------------------------------------------------------
CLASS_DIAGRAMS = YES
HIDE_UNDOC_RELATIONS = YES
HAVE_DOT = NO
CLASS_GRAPH = YES
COLLABORATION_GRAPH = YES
GROUP_GRAPHS = YES
UML_LOOK = NO
TEMPLATE_RELATIONS = NO
INCLUDE_GRAPH = YES
INCLUDED_BY_GRAPH = YES
CALL_GRAPH = NO
GRAPHICAL_HIERARCHY = YES
DIRECTORY_GRAPH = YES
DOT_IMAGE_FORMAT = png
DOT_PATH =
DOTFILE_DIRS =
MAX_DOT_GRAPH_WIDTH = 1024
MAX_DOT_GRAPH_HEIGHT = 1024
MAX_DOT_GRAPH_DEPTH = 1000
DOT_TRANSPARENT = NO
DOT_MULTI_TARGETS = NO
GENERATE_LEGEND = YES
DOT_CLEANUP = YES
#---------------------------------------------------------------------------
# Configuration::additions related to the search engine
#---------------------------------------------------------------------------
SEARCHENGINE = NO

View File

@ -2,7 +2,7 @@
* Copyright (c) 2001-2003, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, Herv<EFBFBD> Drolon, FreeImage Team * Copyright (c) 2005, Hervé Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
@ -28,9 +28,43 @@
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "opj_includes.h" #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 local functions
@ -38,39 +72,39 @@
*/ */
static int bio_byteout(opj_bio_t *bio) { static int bio_byteout(opj_bio_t *bio) {
bio->buf = (bio->buf << 8) & 0xffff; bio->buf = (bio->buf << 8) & 0xffff;
bio->ct = bio->buf == 0xff00 ? 7 : 8; bio->ct = bio->buf == 0xff00 ? 7 : 8;
if (bio->bp >= bio->end) { if (bio->bp >= bio->end) {
return 1; return 1;
} }
*bio->bp++ = bio->buf >> 8; *bio->bp++ = bio->buf >> 8;
return 0; return 0;
} }
static int bio_bytein(opj_bio_t *bio) { static int bio_bytein(opj_bio_t *bio) {
bio->buf = (bio->buf << 8) & 0xffff; bio->buf = (bio->buf << 8) & 0xffff;
bio->ct = bio->buf == 0xff00 ? 7 : 8; bio->ct = bio->buf == 0xff00 ? 7 : 8;
if (bio->bp >= bio->end) { if (bio->bp >= bio->end) {
return 1; return 1;
} }
bio->buf |= *bio->bp++; bio->buf |= *bio->bp++;
return 0; return 0;
} }
static void bio_putbit(opj_bio_t *bio, int b) { static void bio_putbit(opj_bio_t *bio, int b) {
if (bio->ct == 0) { if (bio->ct == 0) {
bio_byteout(bio); bio_byteout(bio);
} }
bio->ct--; bio->ct--;
bio->buf |= b << bio->ct; bio->buf |= b << bio->ct;
} }
static int bio_getbit(opj_bio_t *bio) { static int bio_getbit(opj_bio_t *bio) {
if (bio->ct == 0) { if (bio->ct == 0) {
bio_bytein(bio); bio_bytein(bio);
} }
bio->ct--; bio->ct--;
return (bio->buf >> bio->ct) & 1; return (bio->buf >> bio->ct) & 1;
} }
/* /*
@ -80,73 +114,73 @@ static int bio_getbit(opj_bio_t *bio) {
*/ */
opj_bio_t* bio_create() { opj_bio_t* bio_create() {
opj_bio_t *bio = (opj_bio_t*)opj_malloc(sizeof(opj_bio_t)); opj_bio_t *bio = (opj_bio_t*)opj_malloc(sizeof(opj_bio_t));
return bio; return bio;
} }
void bio_destroy(opj_bio_t *bio) { void bio_destroy(opj_bio_t *bio) {
if(bio) { if(bio) {
opj_free(bio); opj_free(bio);
} }
} }
int bio_numbytes(opj_bio_t *bio) { int bio_numbytes(opj_bio_t *bio) {
return (bio->bp - bio->start); return (bio->bp - bio->start);
} }
void bio_init_enc(opj_bio_t *bio, unsigned char *bp, int len) { void bio_init_enc(opj_bio_t *bio, unsigned char *bp, int len) {
bio->start = bp; bio->start = bp;
bio->end = bp + len; bio->end = bp + len;
bio->bp = bp; bio->bp = bp;
bio->buf = 0; bio->buf = 0;
bio->ct = 8; bio->ct = 8;
} }
void bio_init_dec(opj_bio_t *bio, unsigned char *bp, int len) { void bio_init_dec(opj_bio_t *bio, unsigned char *bp, int len) {
bio->start = bp; bio->start = bp;
bio->end = bp + len; bio->end = bp + len;
bio->bp = bp; bio->bp = bp;
bio->buf = 0; bio->buf = 0;
bio->ct = 0; bio->ct = 0;
} }
void bio_write(opj_bio_t *bio, int v, int n) { void bio_write(opj_bio_t *bio, int v, int n) {
int i; int i;
for (i = n - 1; i >= 0; i--) { for (i = n - 1; i >= 0; i--) {
bio_putbit(bio, (v >> i) & 1); bio_putbit(bio, (v >> i) & 1);
} }
} }
int bio_read(opj_bio_t *bio, int n) { int bio_read(opj_bio_t *bio, int n) {
int i, v; int i, v;
v = 0; v = 0;
for (i = n - 1; i >= 0; i--) { for (i = n - 1; i >= 0; i--) {
v += bio_getbit(bio) << i; v += bio_getbit(bio) << i;
} }
return v; return v;
} }
int bio_flush(opj_bio_t *bio) { int bio_flush(opj_bio_t *bio) {
bio->ct = 0; bio->ct = 0;
if (bio_byteout(bio)) { if (bio_byteout(bio)) {
return 1; return 1;
} }
if (bio->ct == 7) { if (bio->ct == 7) {
bio->ct = 0; bio->ct = 0;
if (bio_byteout(bio)) { if (bio_byteout(bio)) {
return 1; return 1;
} }
} }
return 0; return 0;
} }
int bio_inalign(opj_bio_t *bio) { int bio_inalign(opj_bio_t *bio) {
bio->ct = 0; bio->ct = 0;
if ((bio->buf & 0xff) == 0xff) { if ((bio->buf & 0xff) == 0xff) {
if (bio_bytein(bio)) { if (bio_bytein(bio)) {
return 1; return 1;
} }
bio->ct = 0; bio->ct = 0;
} }
return 0; return 0;
} }

View File

@ -2,7 +2,7 @@
* Copyright (c) 2001-2003, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team * Copyright (c) 2005, Hervé Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
@ -28,7 +28,6 @@
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#ifndef __BIO_H #ifndef __BIO_H
#define __BIO_H #define __BIO_H
/** /**
@ -45,48 +44,18 @@ The functions in BIO.C have for goal to realize an individual bit input - output
Individual bit input-output stream (BIO) Individual bit input-output stream (BIO)
*/ */
typedef struct opj_bio { typedef struct opj_bio {
/** pointer to the start of the buffer */ /** pointer to the start of the buffer */
unsigned char *start; unsigned char *start;
/** pointer to the end of the buffer */ /** pointer to the end of the buffer */
unsigned char *end; unsigned char *end;
/** pointer to the present position in the buffer */ /** pointer to the present position in the buffer */
unsigned char *bp; unsigned char *bp;
/** temporary place where each byte is read or written */ /** temporary place where each byte is read or written */
unsigned int buf; unsigned int buf;
/** coder : number of bits free to write. decoder : number of bits read */ /** coder : number of bits free to write. decoder : number of bits read */
int ct; int ct;
} opj_bio_t; } opj_bio_t;
/** @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);
/* ----------------------------------------------------------------------- */
/*@}*/
/** @name Exported functions */ /** @name Exported functions */
/*@{*/ /*@{*/
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */

View File

@ -2,7 +2,7 @@
* Copyright (c) 2001-2003, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team * Copyright (c) 2005, Hervé Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
@ -28,65 +28,64 @@
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "opj_includes.h" #include "opj_includes.h"
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */
opj_cio_t* opj_cio_open(opj_common_ptr cinfo, unsigned char *buffer, int length) { opj_cio_t* opj_cio_open(opj_common_ptr cinfo, unsigned char *buffer, int length) {
opj_cp_t *cp = NULL; opj_cp_t *cp = NULL;
opj_cio_t *cio = (opj_cio_t*)opj_malloc(sizeof(opj_cio_t)); opj_cio_t *cio = (opj_cio_t*)opj_malloc(sizeof(opj_cio_t));
if(!cio) return NULL; if(!cio) return NULL;
cio->cinfo = cinfo; cio->cinfo = cinfo;
if(buffer && length) { if(buffer && length) {
/* wrap a user buffer containing the encoded image */ /* wrap a user buffer containing the encoded image */
cio->openmode = OPJ_STREAM_READ; cio->openmode = OPJ_STREAM_READ;
cio->buffer = buffer; cio->buffer = buffer;
cio->length = length; cio->length = length;
} }
else if(!buffer && !length && cinfo) { else if(!buffer && !length && cinfo) {
/* allocate a buffer for the encoded image */ /* allocate a buffer for the encoded image */
cio->openmode = OPJ_STREAM_WRITE; cio->openmode = OPJ_STREAM_WRITE;
switch(cinfo->codec_format) { switch(cinfo->codec_format) {
case CODEC_J2K: case CODEC_J2K:
cp = ((opj_j2k_t*)cinfo->j2k_handle)->cp; cp = ((opj_j2k_t*)cinfo->j2k_handle)->cp;
break; break;
case CODEC_JP2: case CODEC_JP2:
cp = ((opj_jp2_t*)cinfo->jp2_handle)->j2k->cp; cp = ((opj_jp2_t*)cinfo->jp2_handle)->j2k->cp;
break; break;
default: default:
opj_free(cio); opj_free(cio);
return NULL; return NULL;
} }
cio->length = cp->tdx * cp->tdy * cp->tw * cp->th * 2; cio->length = cp->tdx * cp->tdy * cp->tw * cp->th * 2;
cio->buffer = (unsigned char *)opj_malloc(cio->length); cio->buffer = (unsigned char *)opj_malloc(cio->length);
if(!cio->buffer) { if(!cio->buffer) {
opj_free(cio); opj_free(cio);
return NULL; return NULL;
} }
} }
else { else {
opj_free(cio); opj_free(cio);
return NULL; return NULL;
} }
/* Initialize byte IO */ /* Initialize byte IO */
cio->start = cio->buffer; cio->start = cio->buffer;
cio->end = cio->buffer + cio->length; cio->end = cio->buffer + cio->length;
cio->bp = cio->buffer; cio->bp = cio->buffer;
return cio; return cio;
} }
void opj_cio_close(opj_cio_t *cio) { void opj_cio_close(opj_cio_t *cio) {
if(cio) { if(cio) {
if(cio->openmode == OPJ_STREAM_WRITE) { if(cio->openmode == OPJ_STREAM_WRITE) {
/* destroy the allocated buffer */ /* destroy the allocated buffer */
opj_free(cio->buffer); opj_free(cio->buffer);
} }
/* destroy the cio */ /* destroy the cio */
opj_free(cio); opj_free(cio);
} }
} }
@ -96,7 +95,7 @@ void opj_cio_close(opj_cio_t *cio) {
* Get position in byte stream. * Get position in byte stream.
*/ */
int cio_tell(opj_cio_t *cio) { int cio_tell(opj_cio_t *cio) {
return cio->bp - cio->start; return cio->bp - cio->start;
} }
/* /*
@ -105,44 +104,44 @@ int cio_tell(opj_cio_t *cio) {
* pos : position, in number of bytes, from the beginning of the stream * pos : position, in number of bytes, from the beginning of the stream
*/ */
void cio_seek(opj_cio_t *cio, int pos) { void cio_seek(opj_cio_t *cio, int pos) {
cio->bp = cio->start + pos; cio->bp = cio->start + pos;
} }
/* /*
* Number of bytes left before the end of the stream. * Number of bytes left before the end of the stream.
*/ */
int cio_numbytesleft(opj_cio_t *cio) { int cio_numbytesleft(opj_cio_t *cio) {
return cio->end - cio->bp; return cio->end - cio->bp;
} }
/* /*
* Get pointer to the current position in the stream. * Get pointer to the current position in the stream.
*/ */
unsigned char *cio_getbp(opj_cio_t *cio) { unsigned char *cio_getbp(opj_cio_t *cio) {
return cio->bp; return cio->bp;
} }
/* /*
* Write a byte. * Write a byte.
*/ */
bool cio_byteout(opj_cio_t *cio, unsigned char v) { bool cio_byteout(opj_cio_t *cio, unsigned char v) {
if (cio->bp >= cio->end) { if (cio->bp >= cio->end) {
opg_event_msg(cio->cinfo, EVT_ERROR, "write error\n"); opj_event_msg(cio->cinfo, EVT_ERROR, "write error\n");
return false; return false;
} }
*cio->bp++ = v; *cio->bp++ = v;
return true; return true;
} }
/* /*
* Read a byte. * Read a byte.
*/ */
unsigned char cio_bytein(opj_cio_t *cio) { unsigned char cio_bytein(opj_cio_t *cio) {
if (cio->bp >= cio->end) { if (cio->bp >= cio->end) {
opg_event_msg(cio->cinfo, EVT_ERROR, "read error\n"); opj_event_msg(cio->cinfo, EVT_ERROR, "read error\n");
return 0; return 0;
} }
return *cio->bp++; return *cio->bp++;
} }
/* /*
@ -152,12 +151,12 @@ unsigned char cio_bytein(opj_cio_t *cio) {
* n : number of bytes to write * n : number of bytes to write
*/ */
unsigned int cio_write(opj_cio_t *cio, unsigned int v, int n) { unsigned int cio_write(opj_cio_t *cio, unsigned int v, int n) {
int i; int i;
for (i = n - 1; i >= 0; i--) { for (i = n - 1; i >= 0; i--) {
if( !cio_byteout(cio, (unsigned char) ((v >> (i << 3)) & 0xff)) ) if( !cio_byteout(cio, (unsigned char) ((v >> (i << 3)) & 0xff)) )
return 0; return 0;
} }
return n; return n;
} }
/* /*
@ -168,13 +167,13 @@ unsigned int cio_write(opj_cio_t *cio, unsigned int v, int n) {
* return : value of the n bytes read * return : value of the n bytes read
*/ */
unsigned int cio_read(opj_cio_t *cio, int n) { unsigned int cio_read(opj_cio_t *cio, int n) {
int i; int i;
unsigned int v; unsigned int v;
v = 0; v = 0;
for (i = n - 1; i >= 0; i--) { for (i = n - 1; i >= 0; i--) {
v += cio_bytein(cio) << (i << 3); v += cio_bytein(cio) << (i << 3);
} }
return v; return v;
} }
/* /*
@ -183,7 +182,7 @@ unsigned int cio_read(opj_cio_t *cio, int n) {
* n : number of bytes to skip * n : number of bytes to skip
*/ */
void cio_skip(opj_cio_t *cio, int n) { void cio_skip(opj_cio_t *cio, int n) {
cio->bp += n; cio->bp += n;
} }

View File

@ -2,7 +2,7 @@
* Copyright (c) 2001-2003, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team * Copyright (c) 2005, Hervé Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
@ -28,7 +28,6 @@
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#ifndef __CIO_H #ifndef __CIO_H
#define __CIO_H #define __CIO_H
/** /**

View File

@ -2,7 +2,7 @@
* Copyright (c) 2001-2003, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team * Copyright (c) 2005, Hervé Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
@ -50,9 +50,55 @@
* mail: ive@lilysoft.com * mail: ive@lilysoft.com
*/ */
#include "opj_includes.h" #include "opj_includes.h"
/** @defgroup DWT DWT - Implementation of a discrete wavelet transform */
/*@{*/
/** @name Local static functions */
/*@{*/
/**
Forward lazy transform (horizontal)
*/
static void dwt_deinterleave_h(int *a, int *b, int dn, int sn, int cas);
/**
Forward lazy transform (vertical)
*/
static void dwt_deinterleave_v(int *a, int *b, int dn, int sn, int x, int cas);
/**
Inverse lazy transform (horizontal)
*/
static void dwt_interleave_h(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);
/**
Forward 5-3 wavelet tranform in 1-D
*/
static void dwt_encode_1(int *a, int dn, int sn, int cas);
/**
Inverse 5-3 wavelet tranform in 1-D
*/
static void dwt_decode_1(int *a, int dn, int sn, int cas);
/**
Forward 9-7 wavelet transform in 1-D
*/
static void dwt_encode_1_real(int *a, int dn, int sn, int cas);
/**
Inverse 9-7 wavelet transform in 1-D
*/
static void dwt_decode_1_real(int *a, int dn, int sn, int cas);
/**
FIXME : comment ???
*/
static void dwt_encode_stepsize(int stepsize, int numbps, opj_stepsize_t *bandno_stepsize);
/*@}*/
/*@}*/
#define S(i) a[(i)*2] #define S(i) a[(i)*2]
#define D(i) a[(1+(i)*2)] #define D(i) a[(1+(i)*2)]
#define S_(i) ((i)<0?S(0):((i)>=sn?S(sn-1):S(i))) #define S_(i) ((i)<0?S(0):((i)>=sn?S(sn-1):S(i)))
@ -65,20 +111,20 @@
/* This table contains the norms of the 5-3 wavelets for different bands. */ /* This table contains the norms of the 5-3 wavelets for different bands. */
/* </summary> */ /* </summary> */
static const double dwt_norms[4][10] = { static const double dwt_norms[4][10] = {
{1.000, 1.500, 2.750, 5.375, 10.68, 21.34, 42.67, 85.33, 170.7, 341.3}, {1.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},
{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} {.7186, .9218, 1.586, 3.043, 6.019, 12.01, 24.00, 47.97, 95.93}
}; };
/* <summary> */ /* <summary> */
/* This table contains the norms of the 9-7 wavelets for different bands. */ /* This table contains the norms of the 9-7 wavelets for different bands. */
/* </summary> */ /* </summary> */
static const double dwt_norms_real[4][10] = { static const double dwt_norms_real[4][10] = {
{1.000, 1.965, 4.177, 8.403, 16.90, 33.84, 67.69, 135.3, 270.6, 540.9}, {1.000, 1.965, 4.177, 8.403, 16.90, 33.84, 67.69, 135.3, 270.6, 540.9},
{2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0}, {2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0},
{2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0}, {2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0},
{2.080, 3.865, 8.307, 17.18, 34.71, 69.59, 139.3, 278.6, 557.2} {2.080, 3.865, 8.307, 17.18, 34.71, 69.59, 139.3, 278.6, 557.2}
}; };
/* /*
@ -87,11 +133,11 @@ static const double dwt_norms_real[4][10] = {
========================================================== ==========================================================
*/ */
/* <summary> */ /* <summary> */
/* Forward lazy transform (horizontal). */ /* Forward lazy transform (horizontal). */
/* </summary> */ /* </summary> */
static void dwt_deinterleave_h(int *a, int *b, int dn, int sn, int cas) { static void dwt_deinterleave_h(int *a, int *b, int dn, int sn, int cas) {
int i; int i;
for (i=0; i<sn; i++) b[i]=a[2*i+cas]; for (i=0; i<sn; i++) b[i]=a[2*i+cas];
for (i=0; i<dn; i++) b[sn+i]=a[(2*i+1-cas)]; for (i=0; i<dn; i++) b[sn+i]=a[(2*i+1-cas)];
} }
@ -116,15 +162,15 @@ static void dwt_interleave_h(int *a, int *b, int dn, int sn, int cas) {
bi = b + cas; bi = b + cas;
for (i = 0; i < sn; i++) { for (i = 0; i < sn; i++) {
*bi = *ai; *bi = *ai;
bi += 2; bi += 2;
ai++; ai++;
} }
ai = a + sn; ai = a + sn;
bi = b + 1 - cas; bi = b + 1 - cas;
for (i = 0; i < dn; i++) { for (i = 0; i < dn; i++) {
*bi = *ai; *bi = *ai;
bi += 2; bi += 2;
ai++; ai++;
} }
} }
@ -139,15 +185,15 @@ static void dwt_interleave_v(int *a, int *b, int dn, int sn, int x, int cas) {
bi = b + cas; bi = b + cas;
for (i = 0; i < sn; i++) { for (i = 0; i < sn; i++) {
*bi = *ai; *bi = *ai;
bi += 2; bi += 2;
ai += x; ai += x;
} }
ai = a + (sn * x); ai = a + (sn * x);
bi = b + 1 - cas; bi = b + 1 - cas;
for (i = 0; i < dn; i++) { for (i = 0; i < dn; i++) {
*bi = *ai; *bi = *ai;
bi += 2; bi += 2;
ai += x; ai += x;
} }
} }
@ -156,126 +202,126 @@ static void dwt_interleave_v(int *a, int *b, int dn, int sn, int x, int cas) {
/* Forward 5-3 wavelet tranform in 1-D. */ /* Forward 5-3 wavelet tranform in 1-D. */
/* </summary> */ /* </summary> */
static void dwt_encode_1(int *a, int dn, int sn, int cas) { static void dwt_encode_1(int *a, int dn, int sn, int cas) {
int i; int i;
if (!cas) { if (!cas) {
if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */ 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 < 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 < sn; i++) S(i) += (D_(i - 1) + D_(i) + 2) >> 2;
} }
} else { } else {
if (!sn && dn == 1) /* NEW : CASE ONE ELEMENT */ if (!sn && dn == 1) /* NEW : CASE ONE ELEMENT */
S(0) *= 2; S(0) *= 2;
else { else {
for (i = 0; i < dn; i++) S(i) -= (DD_(i) + DD_(i - 1)) >> 1; 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; for (i = 0; i < sn; i++) D(i) += (SS_(i) + SS_(i + 1) + 2) >> 2;
} }
} }
} }
/* <summary> */ /* <summary> */
/* Inverse 5-3 wavelet tranform in 1-D. */ /* Inverse 5-3 wavelet tranform in 1-D. */
/* </summary> */ /* </summary> */
static void dwt_decode_1(int *a, int dn, int sn, int cas) { static void dwt_decode_1(int *a, int dn, int sn, int cas) {
int i; int i;
if (!cas) { if (!cas) {
if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */ 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 < 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; for (i = 0; i < dn; i++) D(i) += (S_(i) + S_(i + 1)) >> 1;
} }
} else { } else {
if (!sn && dn == 1) /* NEW : CASE ONE ELEMENT */ if (!sn && dn == 1) /* NEW : CASE ONE ELEMENT */
S(0) /= 2; S(0) /= 2;
else { else {
for (i = 0; i < sn; i++) D(i) -= (SS_(i) + SS_(i + 1) + 2) >> 2; 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; for (i = 0; i < dn; i++) S(i) += (DD_(i) + DD_(i - 1)) >> 1;
} }
} }
} }
/* <summary> */ /* <summary> */
/* Forward 9-7 wavelet transform in 1-D. */ /* Forward 9-7 wavelet transform in 1-D. */
/* </summary> */ /* </summary> */
static void dwt_encode_1_real(int *a, int dn, int sn, int cas) { static void dwt_encode_1_real(int *a, int dn, int sn, int cas) {
int i; int i;
if (!cas) { if (!cas) {
if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */ if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */
for (i = 0; i < dn; i++) for (i = 0; i < dn; i++)
D(i) -= fix_mul(S_(i) + S_(i + 1), 12993); D(i) -= fix_mul(S_(i) + S_(i + 1), 12993);
for (i = 0; i < sn; i++) for (i = 0; i < sn; i++)
S(i) -= fix_mul(D_(i - 1) + D_(i), 434); S(i) -= fix_mul(D_(i - 1) + D_(i), 434);
for (i = 0; i < dn; i++) for (i = 0; i < dn; i++)
D(i) += fix_mul(S_(i) + S_(i + 1), 7233); D(i) += fix_mul(S_(i) + S_(i + 1), 7233);
for (i = 0; i < sn; i++) for (i = 0; i < sn; i++)
S(i) += fix_mul(D_(i - 1) + D_(i), 3633); S(i) += fix_mul(D_(i - 1) + D_(i), 3633);
for (i = 0; i < dn; i++) for (i = 0; i < dn; i++)
D(i) = fix_mul(D(i), 5038); /*5038 */ D(i) = fix_mul(D(i), 5038); /*5038 */
for (i = 0; i < sn; i++) for (i = 0; i < sn; i++)
S(i) = fix_mul(S(i), 6659); /*6660 */ S(i) = fix_mul(S(i), 6659); /*6660 */
} }
} else { } else {
if ((sn > 0) || (dn > 1)) { /* NEW : CASE ONE ELEMENT */ if ((sn > 0) || (dn > 1)) { /* NEW : CASE ONE ELEMENT */
for (i = 0; i < dn; i++) for (i = 0; i < dn; i++)
S(i) -= fix_mul(DD_(i) + DD_(i - 1), 12993); S(i) -= fix_mul(DD_(i) + DD_(i - 1), 12993);
for (i = 0; i < sn; i++) for (i = 0; i < sn; i++)
D(i) -= fix_mul(SS_(i) + SS_(i + 1), 434); D(i) -= fix_mul(SS_(i) + SS_(i + 1), 434);
for (i = 0; i < dn; i++) for (i = 0; i < dn; i++)
S(i) += fix_mul(DD_(i) + DD_(i - 1), 7233); S(i) += fix_mul(DD_(i) + DD_(i - 1), 7233);
for (i = 0; i < sn; i++) for (i = 0; i < sn; i++)
D(i) += fix_mul(SS_(i) + SS_(i + 1), 3633); D(i) += fix_mul(SS_(i) + SS_(i + 1), 3633);
for (i = 0; i < dn; i++) for (i = 0; i < dn; i++)
S(i) = fix_mul(S(i), 5038); /*5038 */ S(i) = fix_mul(S(i), 5038); /*5038 */
for (i = 0; i < sn; i++) for (i = 0; i < sn; i++)
D(i) = fix_mul(D(i), 6659); /*6660 */ D(i) = fix_mul(D(i), 6659); /*6660 */
} }
} }
} }
/* <summary> */ /* <summary> */
/* Inverse 9-7 wavelet transform in 1-D. */ /* Inverse 9-7 wavelet transform in 1-D. */
/* </summary> */ /* </summary> */
static void dwt_decode_1_real(int *a, int dn, int sn, int cas) { static void dwt_decode_1_real(int *a, int dn, int sn, int cas) {
int i; int i;
if (!cas) { if (!cas) {
if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */ if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */
for (i = 0; i < sn; i++) for (i = 0; i < sn; i++)
S(i) = fix_mul(S(i), 10078); /* 10076 */ S(i) = fix_mul(S(i), 10078); /* 10076 */
for (i = 0; i < dn; i++) for (i = 0; i < dn; i++)
D(i) = fix_mul(D(i), 13318); /* 13320 */ D(i) = fix_mul(D(i), 13318); /* 13320 */
for (i = 0; i < sn; i++) for (i = 0; i < sn; i++)
S(i) -= fix_mul(D_(i - 1) + D_(i), 3633); S(i) -= fix_mul(D_(i - 1) + D_(i), 3633);
for (i = 0; i < dn; i++) for (i = 0; i < dn; i++)
D(i) -= fix_mul(S_(i) + S_(i + 1), 7233); D(i) -= fix_mul(S_(i) + S_(i + 1), 7233);
for (i = 0; i < sn; i++) for (i = 0; i < sn; i++)
S(i) += fix_mul(D_(i - 1) + D_(i), 434); S(i) += fix_mul(D_(i - 1) + D_(i), 434);
for (i = 0; i < dn; i++) for (i = 0; i < dn; i++)
D(i) += fix_mul(S_(i) + S_(i + 1), 12994); /* 12993 */ D(i) += fix_mul(S_(i) + S_(i + 1), 12994); /* 12993 */
} }
} else { } else {
if ((sn > 0) || (dn > 1)) { /* NEW : CASE ONE ELEMENT */ if ((sn > 0) || (dn > 1)) { /* NEW : CASE ONE ELEMENT */
for (i = 0; i < sn; i++) for (i = 0; i < sn; i++)
D(i) = fix_mul(D(i), 10078); /* 10076 */ D(i) = fix_mul(D(i), 10078); /* 10076 */
for (i = 0; i < dn; i++) for (i = 0; i < dn; i++)
S(i) = fix_mul(S(i), 13318); /* 13320 */ S(i) = fix_mul(S(i), 13318); /* 13320 */
for (i = 0; i < sn; i++) for (i = 0; i < sn; i++)
D(i) -= fix_mul(SS_(i) + SS_(i + 1), 3633); D(i) -= fix_mul(SS_(i) + SS_(i + 1), 3633);
for (i = 0; i < dn; i++) for (i = 0; i < dn; i++)
S(i) -= fix_mul(DD_(i) + DD_(i - 1), 7233); S(i) -= fix_mul(DD_(i) + DD_(i - 1), 7233);
for (i = 0; i < sn; i++) for (i = 0; i < sn; i++)
D(i) += fix_mul(SS_(i) + SS_(i + 1), 434); D(i) += fix_mul(SS_(i) + SS_(i + 1), 434);
for (i = 0; i < dn; i++) for (i = 0; i < dn; i++)
S(i) += fix_mul(DD_(i) + DD_(i - 1), 12994); /* 12993 */ S(i) += fix_mul(DD_(i) + DD_(i - 1), 12994); /* 12993 */
} }
} }
} }
static void dwt_encode_stepsize(int stepsize, int numbps, opj_stepsize_t *bandno_stepsize) { static void dwt_encode_stepsize(int stepsize, int numbps, opj_stepsize_t *bandno_stepsize) {
int p, n; int p, n;
p = int_floorlog2(stepsize) - 13; p = int_floorlog2(stepsize) - 13;
n = 11 - int_floorlog2(stepsize); n = 11 - int_floorlog2(stepsize);
bandno_stepsize->mant = (n < 0 ? stepsize >> -n : stepsize << n) & 0x7ff; bandno_stepsize->mant = (n < 0 ? stepsize >> -n : stepsize << n) & 0x7ff;
bandno_stepsize->expn = numbps - p; bandno_stepsize->expn = numbps - p;
} }
/* /*
@ -288,55 +334,55 @@ static void dwt_encode_stepsize(int stepsize, int numbps, opj_stepsize_t *bandno
/* Forward 5-3 wavelet tranform in 2-D. */ /* Forward 5-3 wavelet tranform in 2-D. */
/* </summary> */ /* </summary> */
void dwt_encode(opj_tcd_tilecomp_t * tilec) { void dwt_encode(opj_tcd_tilecomp_t * tilec) {
int i, j, k; int i, j, k;
int *a = NULL; int *a = NULL;
int *aj = NULL; int *aj = NULL;
int *bj = NULL; int *bj = NULL;
int w, l; int w, l;
w = tilec->x1-tilec->x0; w = tilec->x1-tilec->x0;
l = tilec->numresolutions-1; l = tilec->numresolutions-1;
a = tilec->data; a = tilec->data;
for (i = 0; i < l; i++) { for (i = 0; i < l; i++) {
int rw; /* width of the resolution level computed */ int rw; /* width of the resolution level computed */
int rh; /* heigth of the resolution level computed */ int rh; /* heigth of the resolution level computed */
int rw1; /* width of the resolution level once lower than computed one */ 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 rh1; /* height of the resolution level once lower than computed one */
int cas_col; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */ int cas_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_row; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering */
int dn, sn; int dn, sn;
rw = tilec->resolutions[l - i].x1 - tilec->resolutions[l - i].x0; rw = tilec->resolutions[l - i].x1 - tilec->resolutions[l - i].x0;
rh = tilec->resolutions[l - i].y1 - tilec->resolutions[l - i].y0; rh = tilec->resolutions[l - i].y1 - tilec->resolutions[l - i].y0;
rw1= tilec->resolutions[l - i - 1].x1 - tilec->resolutions[l - i - 1].x0; rw1= tilec->resolutions[l - i - 1].x1 - tilec->resolutions[l - i - 1].x0;
rh1= tilec->resolutions[l - i - 1].y1 - tilec->resolutions[l - i - 1].y0; rh1= tilec->resolutions[l - i - 1].y1 - tilec->resolutions[l - i - 1].y0;
cas_row = tilec->resolutions[l - i].x0 % 2; cas_row = tilec->resolutions[l - i].x0 % 2;
cas_col = tilec->resolutions[l - i].y0 % 2; cas_col = tilec->resolutions[l - i].y0 % 2;
sn = rh1; sn = rh1;
dn = rh - rh1; dn = rh - rh1;
bj = (int*)opj_malloc(rh * sizeof(int)); bj = (int*)opj_malloc(rh * sizeof(int));
for (j = 0; j < rw; j++) { for (j = 0; j < rw; j++) {
aj = a + j; aj = a + j;
for (k = 0; k < rh; k++) bj[k] = aj[k*w]; for (k = 0; k < rh; k++) bj[k] = aj[k*w];
dwt_encode_1(bj, dn, sn, cas_col); dwt_encode_1(bj, dn, sn, cas_col);
dwt_deinterleave_v(bj, aj, dn, sn, w, cas_col); dwt_deinterleave_v(bj, aj, dn, sn, w, cas_col);
} }
opj_free(bj); opj_free(bj);
sn = rw1; sn = rw1;
dn = rw - rw1; dn = rw - rw1;
bj = (int*)opj_malloc(rw * sizeof(int)); bj = (int*)opj_malloc(rw * sizeof(int));
for (j = 0; j < rh; j++) { for (j = 0; j < rh; j++) {
aj = a + j * w; aj = a + j * w;
for (k = 0; k < rw; k++) bj[k] = aj[k]; for (k = 0; k < rw; k++) bj[k] = aj[k];
dwt_encode_1(bj, dn, sn, cas_row); dwt_encode_1(bj, dn, sn, cas_row);
dwt_deinterleave_h(bj, aj, dn, sn, cas_row); dwt_deinterleave_h(bj, aj, dn, sn, cas_row);
} }
opj_free(bj); opj_free(bj);
} }
} }
@ -344,55 +390,55 @@ void dwt_encode(opj_tcd_tilecomp_t * tilec) {
/* Inverse 5-3 wavelet tranform in 2-D. */ /* Inverse 5-3 wavelet tranform in 2-D. */
/* </summary> */ /* </summary> */
void dwt_decode(opj_tcd_tilecomp_t * tilec, int stop) { void dwt_decode(opj_tcd_tilecomp_t * tilec, int stop) {
int i, j, k; int i, j, k;
int *a = NULL; int *a = NULL;
int *aj = NULL; int *aj = NULL;
int *bj = NULL; int *bj = NULL;
int w, l; int w, l;
w = tilec->x1-tilec->x0; w = tilec->x1-tilec->x0;
l = tilec->numresolutions-1; l = tilec->numresolutions-1;
a = tilec->data; a = tilec->data;
for (i = l - 1; i >= stop; i--) { for (i = l - 1; i >= stop; i--) {
int rw; /* width of the resolution level computed */ int rw; /* width of the resolution level computed */
int rh; /* heigth of the resolution level computed */ int rh; /* heigth of the resolution level computed */
int rw1; /* width of the resolution level once lower than computed one */ 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 rh1; /* height of the resolution level once lower than computed one */
int cas_col; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */ int cas_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_row; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering */
int dn, sn; int dn, sn;
rw = tilec->resolutions[l - i].x1 - tilec->resolutions[l - i].x0; rw = tilec->resolutions[l - i].x1 - tilec->resolutions[l - i].x0;
rh = tilec->resolutions[l - i].y1 - tilec->resolutions[l - i].y0; rh = tilec->resolutions[l - i].y1 - tilec->resolutions[l - i].y0;
rw1= tilec->resolutions[l - i - 1].x1 - tilec->resolutions[l - i - 1].x0; rw1= tilec->resolutions[l - i - 1].x1 - tilec->resolutions[l - i - 1].x0;
rh1= tilec->resolutions[l - i - 1].y1 - tilec->resolutions[l - i - 1].y0; rh1= tilec->resolutions[l - i - 1].y1 - tilec->resolutions[l - i - 1].y0;
cas_row = tilec->resolutions[l - i].x0 % 2; cas_row = tilec->resolutions[l - i].x0 % 2;
cas_col = tilec->resolutions[l - i].y0 % 2; cas_col = tilec->resolutions[l - i].y0 % 2;
sn = rw1; sn = rw1;
dn = rw - rw1; dn = rw - rw1;
bj = (int*)opj_malloc(rw * sizeof(int)); bj = (int*)opj_malloc(rw * sizeof(int));
for (j = 0; j < rh; j++) { for (j = 0; j < rh; j++) {
aj = a + j*w; aj = a + j*w;
dwt_interleave_h(aj, bj, dn, sn, cas_row); dwt_interleave_h(aj, bj, dn, sn, cas_row);
dwt_decode_1(bj, dn, sn, cas_row); dwt_decode_1(bj, dn, sn, cas_row);
for (k = 0; k < rw; k++) aj[k] = bj[k]; for (k = 0; k < rw; k++) aj[k] = bj[k];
} }
opj_free(bj); opj_free(bj);
sn = rh1; sn = rh1;
dn = rh - rh1; dn = rh - rh1;
bj = (int*)opj_malloc(rh * sizeof(int)); bj = (int*)opj_malloc(rh * sizeof(int));
for (j = 0; j < rw; j++) { for (j = 0; j < rw; j++) {
aj = a + j; aj = a + j;
dwt_interleave_v(aj, bj, dn, sn, w, cas_col); dwt_interleave_v(aj, bj, dn, sn, w, cas_col);
dwt_decode_1(bj, dn, sn, cas_col); dwt_decode_1(bj, dn, sn, cas_col);
for (k = 0; k < rh; k++) aj[k * w] = bj[k]; for (k = 0; k < rh; k++) aj[k * w] = bj[k];
} }
opj_free(bj); opj_free(bj);
} }
} }
@ -400,18 +446,18 @@ void dwt_decode(opj_tcd_tilecomp_t * tilec, int stop) {
/* Get gain of 5-3 wavelet transform. */ /* Get gain of 5-3 wavelet transform. */
/* </summary> */ /* </summary> */
int dwt_getgain(int orient) { int dwt_getgain(int orient) {
if (orient == 0) if (orient == 0)
return 0; return 0;
if (orient == 1 || orient == 2) if (orient == 1 || orient == 2)
return 1; return 1;
return 2; return 2;
} }
/* <summary> */ /* <summary> */
/* Get norm of 5-3 wavelet. */ /* Get norm of 5-3 wavelet. */
/* </summary> */ /* </summary> */
double dwt_getnorm(int level, int orient) { double dwt_getnorm(int level, int orient) {
return dwt_norms[orient][level]; return dwt_norms[orient][level];
} }
/* <summary> */ /* <summary> */
@ -419,55 +465,55 @@ double dwt_getnorm(int level, int orient) {
/* </summary> */ /* </summary> */
void dwt_encode_real(opj_tcd_tilecomp_t * tilec) { void dwt_encode_real(opj_tcd_tilecomp_t * tilec) {
int i, j, k; int i, j, k;
int *a = NULL; int *a = NULL;
int *aj = NULL; int *aj = NULL;
int *bj = NULL; int *bj = NULL;
int w, l; int w, l;
w = tilec->x1-tilec->x0; w = tilec->x1-tilec->x0;
l = tilec->numresolutions-1; l = tilec->numresolutions-1;
a = tilec->data; a = tilec->data;
for (i = 0; i < l; i++) { for (i = 0; i < l; i++) {
int rw; /* width of the resolution level computed */ int rw; /* width of the resolution level computed */
int rh; /* heigth of the resolution level computed */ int rh; /* heigth of the resolution level computed */
int rw1; /* width of the resolution level once lower than computed one */ 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 rh1; /* height of the resolution level once lower than computed one */
int cas_col; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */ int cas_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_row; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering */
int dn, sn; int dn, sn;
rw = tilec->resolutions[l - i].x1 - tilec->resolutions[l - i].x0; rw = tilec->resolutions[l - i].x1 - tilec->resolutions[l - i].x0;
rh = tilec->resolutions[l - i].y1 - tilec->resolutions[l - i].y0; rh = tilec->resolutions[l - i].y1 - tilec->resolutions[l - i].y0;
rw1= tilec->resolutions[l - i - 1].x1 - tilec->resolutions[l - i - 1].x0; rw1= tilec->resolutions[l - i - 1].x1 - tilec->resolutions[l - i - 1].x0;
rh1= tilec->resolutions[l - i - 1].y1 - tilec->resolutions[l - i - 1].y0; rh1= tilec->resolutions[l - i - 1].y1 - tilec->resolutions[l - i - 1].y0;
cas_row = tilec->resolutions[l - i].x0 % 2; cas_row = tilec->resolutions[l - i].x0 % 2;
cas_col = tilec->resolutions[l - i].y0 % 2; cas_col = tilec->resolutions[l - i].y0 % 2;
sn = rh1; sn = rh1;
dn = rh - rh1; dn = rh - rh1;
bj = (int*)opj_malloc(rh * sizeof(int)); bj = (int*)opj_malloc(rh * sizeof(int));
for (j = 0; j < rw; j++) { for (j = 0; j < rw; j++) {
aj = a + j; aj = a + j;
for (k = 0; k < rh; k++) bj[k] = aj[k*w]; for (k = 0; k < rh; k++) bj[k] = aj[k*w];
dwt_encode_1_real(bj, dn, sn, cas_col); dwt_encode_1_real(bj, dn, sn, cas_col);
dwt_deinterleave_v(bj, aj, dn, sn, w, cas_col); dwt_deinterleave_v(bj, aj, dn, sn, w, cas_col);
} }
opj_free(bj); opj_free(bj);
sn = rw1; sn = rw1;
dn = rw - rw1; dn = rw - rw1;
bj = (int*)opj_malloc(rw * sizeof(int)); bj = (int*)opj_malloc(rw * sizeof(int));
for (j = 0; j < rh; j++) { for (j = 0; j < rh; j++) {
aj = a + j * w; aj = a + j * w;
for (k = 0; k < rw; k++) bj[k] = aj[k]; for (k = 0; k < rw; k++) bj[k] = aj[k];
dwt_encode_1_real(bj, dn, sn, cas_row); dwt_encode_1_real(bj, dn, sn, cas_row);
dwt_deinterleave_h(bj, aj, dn, sn, cas_row); dwt_deinterleave_h(bj, aj, dn, sn, cas_row);
} }
opj_free(bj); opj_free(bj);
} }
} }
@ -475,55 +521,55 @@ void dwt_encode_real(opj_tcd_tilecomp_t * tilec) {
/* Inverse 9-7 wavelet transform in 2-D. */ /* Inverse 9-7 wavelet transform in 2-D. */
/* </summary> */ /* </summary> */
void dwt_decode_real(opj_tcd_tilecomp_t * tilec, int stop) { void dwt_decode_real(opj_tcd_tilecomp_t * tilec, int stop) {
int i, j, k; int i, j, k;
int *a = NULL; int *a = NULL;
int *aj = NULL; int *aj = NULL;
int *bj = NULL; int *bj = NULL;
int w, l; int w, l;
w = tilec->x1-tilec->x0; w = tilec->x1-tilec->x0;
l = tilec->numresolutions-1; l = tilec->numresolutions-1;
a = tilec->data; a = tilec->data;
for (i = l-1; i >= stop; i--) { for (i = l-1; i >= stop; i--) {
int rw; /* width of the resolution level computed */ int rw; /* width of the resolution level computed */
int rh; /* heigth of the resolution level computed */ int rh; /* heigth of the resolution level computed */
int rw1; /* width of the resolution level once lower than computed one */ 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 rh1; /* height of the resolution level once lower than computed one */
int cas_col; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */ int cas_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_row; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering */
int dn, sn; int dn, sn;
rw = tilec->resolutions[l - i].x1 - tilec->resolutions[l - i].x0; rw = tilec->resolutions[l - i].x1 - tilec->resolutions[l - i].x0;
rh = tilec->resolutions[l - i].y1 - tilec->resolutions[l - i].y0; rh = tilec->resolutions[l - i].y1 - tilec->resolutions[l - i].y0;
rw1= tilec->resolutions[l - i - 1].x1 - tilec->resolutions[l - i - 1].x0; rw1= tilec->resolutions[l - i - 1].x1 - tilec->resolutions[l - i - 1].x0;
rh1= tilec->resolutions[l - i - 1].y1 - tilec->resolutions[l - i - 1].y0; rh1= tilec->resolutions[l - i - 1].y1 - tilec->resolutions[l - i - 1].y0;
cas_col = tilec->resolutions[l - i].x0 % 2; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */ cas_col = tilec->resolutions[l - i].x0 % 2; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */
cas_row = tilec->resolutions[l - i].y0 % 2; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering */ cas_row = tilec->resolutions[l - i].y0 % 2; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering */
sn = rw1; sn = rw1;
dn = rw-rw1; dn = rw-rw1;
bj = (int*)opj_malloc(rw * sizeof(int)); bj = (int*)opj_malloc(rw * sizeof(int));
for (j = 0; j < rh; j++) { for (j = 0; j < rh; j++) {
aj = a + j * w; aj = a + j * w;
dwt_interleave_h(aj, bj, dn, sn, cas_col); dwt_interleave_h(aj, bj, dn, sn, cas_col);
dwt_decode_1_real(bj, dn, sn, cas_col); dwt_decode_1_real(bj, dn, sn, cas_col);
for (k = 0; k < rw; k++) aj[k] = bj[k]; for (k = 0; k < rw; k++) aj[k] = bj[k];
} }
opj_free(bj); opj_free(bj);
sn = rh1; sn = rh1;
dn = rh-rh1; dn = rh-rh1;
bj = (int*)opj_malloc(rh * sizeof(int)); bj = (int*)opj_malloc(rh * sizeof(int));
for (j = 0; j < rw; j++) { for (j = 0; j < rw; j++) {
aj = a + j; aj = a + j;
dwt_interleave_v(aj, bj, dn, sn, w, cas_row); dwt_interleave_v(aj, bj, dn, sn, w, cas_row);
dwt_decode_1_real(bj, dn, sn, cas_row); dwt_decode_1_real(bj, dn, sn, cas_row);
for (k = 0; k < rh; k++) aj[k * w] = bj[k]; for (k = 0; k < rh; k++) aj[k * w] = bj[k];
} }
opj_free(bj); opj_free(bj);
} }
} }
@ -531,33 +577,33 @@ void dwt_decode_real(opj_tcd_tilecomp_t * tilec, int stop) {
/* Get gain of 9-7 wavelet transform. */ /* Get gain of 9-7 wavelet transform. */
/* </summary> */ /* </summary> */
int dwt_getgain_real(int orient) { int dwt_getgain_real(int orient) {
return 0; return 0;
} }
/* <summary> */ /* <summary> */
/* Get norm of 9-7 wavelet. */ /* Get norm of 9-7 wavelet. */
/* </summary> */ /* </summary> */
double dwt_getnorm_real(int level, int orient) { double dwt_getnorm_real(int level, int orient) {
return dwt_norms_real[orient][level]; return dwt_norms_real[orient][level];
} }
void dwt_calc_explicit_stepsizes(opj_tccp_t * tccp, int prec) { void dwt_calc_explicit_stepsizes(opj_tccp_t * tccp, int prec) {
int numbands, bandno; int numbands, bandno;
numbands = 3 * tccp->numresolutions - 2; numbands = 3 * tccp->numresolutions - 2;
for (bandno = 0; bandno < numbands; bandno++) { for (bandno = 0; bandno < numbands; bandno++) {
double stepsize; double stepsize;
int resno, level, orient, gain; int resno, level, orient, gain;
resno = (bandno == 0) ? 0 : ((bandno - 1) / 3 + 1); resno = (bandno == 0) ? 0 : ((bandno - 1) / 3 + 1);
orient = (bandno == 0) ? 0 : ((bandno - 1) % 3 + 1); orient = (bandno == 0) ? 0 : ((bandno - 1) % 3 + 1);
level = tccp->numresolutions - 1 - resno; level = tccp->numresolutions - 1 - resno;
gain = (tccp->qmfbid == 0) ? 0 : ((orient == 0) ? 0 : (((orient == 1) || (orient == 2)) ? 1 : 2)); gain = (tccp->qmfbid == 0) ? 0 : ((orient == 0) ? 0 : (((orient == 1) || (orient == 2)) ? 1 : 2));
if (tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) { if (tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) {
stepsize = 1.0; stepsize = 1.0;
} else { } else {
double norm = dwt_norms_real[orient][level]; double norm = dwt_norms_real[orient][level];
stepsize = (1 << (gain + 1)) / norm; stepsize = (1 << (gain + 1)) / norm;
} }
dwt_encode_stepsize((int) floor(stepsize * 8192.0), prec + gain, &tccp->stepsizes[bandno]); dwt_encode_stepsize((int) floor(stepsize * 8192.0), prec + gain, &tccp->stepsizes[bandno]);
} }
} }

View File

@ -2,7 +2,7 @@
* Copyright (c) 2001-2003, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team * Copyright (c) 2005, Hervé Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
@ -42,47 +42,6 @@ DWT.C are used by some function in TCD.C.
/** @defgroup DWT DWT - Implementation of a discrete wavelet transform */ /** @defgroup DWT DWT - Implementation of a discrete wavelet transform */
/*@{*/ /*@{*/
/** @name Local static functions */
/*@{*/
/* ----------------------------------------------------------------------- */
/**
Forward lazy transform (horizontal)
*/
static void dwt_deinterleave_h(int *a, int *b, int dn, int sn, int cas);
/**
Forward lazy transform (vertical)
*/
static void dwt_deinterleave_v(int *a, int *b, int dn, int sn, int x, int cas);
/**
Inverse lazy transform (horizontal)
*/
static void dwt_interleave_h(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);
/**
Forward 5-3 wavelet tranform in 1-D
*/
static void dwt_encode_1(int *a, int dn, int sn, int cas);
/**
Inverse 5-3 wavelet tranform in 1-D
*/
static void dwt_decode_1(int *a, int dn, int sn, int cas);
/**
Forward 9-7 wavelet transform in 1-D
*/
static void dwt_encode_1_real(int *a, int dn, int sn, int cas);
/**
Inverse 9-7 wavelet transform in 1-D
*/
static void dwt_decode_1_real(int *a, int dn, int sn, int cas);
/**
FIXME : comment ???
*/
static void dwt_encode_stepsize(int stepsize, int numbps, opj_stepsize_t *bandno_stepsize);
/* ----------------------------------------------------------------------- */
/*@}*/
/** @name Exported functions */ /** @name Exported functions */
/*@{*/ /*@{*/

View File

@ -1,4 +1,3 @@
/* /*
* Copyright (c) 2005, Hervé Drolon, FreeImage Team * Copyright (c) 2005, Hervé Drolon, FreeImage Team
* All rights reserved. * All rights reserved.
@ -25,124 +24,158 @@
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "opj_includes.h" #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_set_event_mgr(opj_common_ptr cinfo, opj_event_mgr_t *event_mgr, void *context) { opj_event_mgr_t* opj_set_event_mgr(opj_common_ptr cinfo, opj_event_mgr_t *event_mgr, void *context) {
if(cinfo) { if(cinfo) {
opj_event_mgr_t *previous = cinfo->event_mgr; opj_event_mgr_t *previous = cinfo->event_mgr;
cinfo->event_mgr = event_mgr; cinfo->event_mgr = event_mgr;
cinfo->client_data = context; cinfo->client_data = context;
return previous; return previous;
} }
return NULL; return NULL;
} }
bool opg_event_msg(opj_common_ptr cinfo, int event_type, const char *fmt, ...) { 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 */ #define MSG_SIZE 512 /* 512 bytes should be more than enough for a short message */
opj_msg_callback msg_handler = NULL; opj_msg_callback msg_handler = NULL;
opj_event_mgr_t *event_mgr = cinfo->event_mgr; opj_event_mgr_t *event_mgr = cinfo->event_mgr;
if(event_mgr != NULL) { if(event_mgr != NULL) {
switch(event_type) { switch(event_type) {
case EVT_ERROR: case EVT_ERROR:
msg_handler = event_mgr->error_handler; msg_handler = event_mgr->error_handler;
break; break;
case EVT_WARNING: case EVT_WARNING:
msg_handler = event_mgr->warning_handler; msg_handler = event_mgr->warning_handler;
break; break;
case EVT_INFO: case EVT_INFO:
msg_handler = event_mgr->info_handler; msg_handler = event_mgr->info_handler;
break; break;
default: default:
break; break;
} }
if(msg_handler == NULL) { if(msg_handler == NULL) {
return false; return false;
} }
} else { } else {
return false; return false;
} }
if ((fmt != NULL) && (event_mgr != NULL)) { if ((fmt != NULL) && (event_mgr != NULL)) {
va_list arg; va_list arg;
int str_length, i, j; int str_length, i, j;
char message[MSG_SIZE]; char message[MSG_SIZE];
memset(message, 0, MSG_SIZE); memset(message, 0, MSG_SIZE);
/* initialize the optional parameter list */ /* initialize the optional parameter list */
va_start(arg, fmt); va_start(arg, fmt);
/* check the length of the format string */ /* check the length of the format string */
str_length = (strlen(fmt) > MSG_SIZE) ? MSG_SIZE : strlen(fmt); str_length = (strlen(fmt) > MSG_SIZE) ? MSG_SIZE : strlen(fmt);
/* parse the format string and put the result in 'message' */ /* parse the format string and put the result in 'message' */
for (i = 0, j = 0; i < str_length; ++i) { for (i = 0, j = 0; i < str_length; ++i) {
if (fmt[i] == '%') { if (fmt[i] == '%') {
if (i + 1 < str_length) { if (i + 1 < str_length) {
switch(tolower(fmt[i + 1])) { switch(tolower(fmt[i + 1])) {
case '%' : case '%' :
message[j++] = '%'; message[j++] = '%';
break; break;
case 'o' : /* octal numbers */ case 'o' : /* octal numbers */
{ {
char tmp[16]; char tmp[16];
_itoa(va_arg(arg, int), tmp, 8); _itoa(va_arg(arg, int), tmp, 8);
strcat(message, tmp); strcat(message, tmp);
j += strlen(tmp); j += strlen(tmp);
++i; ++i;
break; break;
} }
case 'i' : /* decimal numbers */ case 'i' : /* decimal numbers */
case 'd' : case 'd' :
{ {
char tmp[16]; char tmp[16];
_itoa(va_arg(arg, int), tmp, 10); _itoa(va_arg(arg, int), tmp, 10);
strcat(message, tmp); strcat(message, tmp);
j += strlen(tmp); j += strlen(tmp);
++i; ++i;
break; break;
} }
case 'x' : /* hexadecimal numbers */ case 'x' : /* hexadecimal numbers */
{ {
char tmp[16]; char tmp[16];
_itoa(va_arg(arg, int), tmp, 16); _itoa(va_arg(arg, int), tmp, 16);
strcat(message, tmp); strcat(message, tmp);
j += strlen(tmp); j += strlen(tmp);
++i; ++i;
break; break;
} }
case 's' : /* strings */ case 's' : /* strings */
{ {
char *tmp = va_arg(arg, char*); char *tmp = va_arg(arg, char*);
strcat(message, tmp); strcat(message, tmp);
j += strlen(tmp); j += strlen(tmp);
++i; ++i;
break; break;
} }
case 'f' : /* floats */ case 'f' : /* floats */
{ {
char tmp[16]; char tmp[16];
double value = va_arg(arg, double); double value = va_arg(arg, double);
sprintf(tmp, "%f", value); sprintf(tmp, "%f", value);
strcat(message, tmp); strcat(message, tmp);
j += strlen(tmp); j += strlen(tmp);
++i; ++i;
break; break;
} }
}; };
} else { } else {
message[j++] = fmt[i]; message[j++] = fmt[i];
} }
} else { } else {
message[j++] = fmt[i]; message[j++] = fmt[i];
}; };
} }
/* deinitialize the optional parameter list */ /* deinitialize the optional parameter list */
va_end(arg); va_end(arg);
/* output the message to the user program */ /* output the message to the user program */
msg_handler(message, cinfo->client_data); msg_handler(message, cinfo->client_data);
} }
return true; return true;
} }

View File

@ -1,4 +1,3 @@
/* /*
* Copyright (c) 2005, Hervé Drolon, FreeImage Team * Copyright (c) 2005, Hervé Drolon, FreeImage Team
* All rights reserved. * All rights reserved.
@ -24,8 +23,6 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#ifndef __EVENT_H #ifndef __EVENT_H
#define __EVENT_H #define __EVENT_H
/** /**
@ -35,9 +32,9 @@
The functions in EVENT.C have for goal to send output messages (errors, warnings, debug) to the user. 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_ERROR 1 /**< Error event type */
#define EVT_WARNING 2 /**< Warning event type */ #define EVT_WARNING 2 /**< Warning event type */
#define EVT_INFO 4 /**< Debug event type */ #define EVT_INFO 4 /**< Debug event type */
/** @defgroup EVENT EVENT - Implementation of a event callback system */ /** @defgroup EVENT EVENT - Implementation of a event callback system */
/*@{*/ /*@{*/
@ -52,10 +49,10 @@ Write formatted data to a string and send the string to a user callback.
@param fmt Format-control string (plus optionnal arguments) @param fmt Format-control string (plus optionnal arguments)
@return Returns true if successful, returns false otherwise @return Returns true if successful, returns false otherwise
*/ */
bool opg_event_msg(opj_common_ptr cinfo, int event_type, const char *fmt, ...); bool opj_event_msg(opj_common_ptr cinfo, int event_type, const char *fmt, ...);
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */
/*@}*/ /*@}*/
/*@}*/ /*@}*/
#endif /* __EVENT_H */ #endif /* __EVENT_H */

View File

@ -2,7 +2,7 @@
* Copyright (c) 2001-2003, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team * Copyright (c) 2005, Hervé Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *

View File

@ -2,7 +2,7 @@
* Copyright (c) 2001-2003, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team * Copyright (c) 2005, Hervé Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
@ -27,8 +27,6 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#ifndef __FIX_H #ifndef __FIX_H
#define __FIX_H #define __FIX_H
/** /**

View File

@ -24,65 +24,64 @@
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "opj_includes.h" #include "opj_includes.h"
opj_image_t* opj_image_create0() { opj_image_t* opj_image_create0() {
opj_image_t *image = (opj_image_t*)opj_malloc(sizeof(opj_image_t)); opj_image_t *image = (opj_image_t*)opj_malloc(sizeof(opj_image_t));
return image; return image;
} }
opj_image_t *opj_image_create(int numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc) { opj_image_t *opj_image_create(int numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc) {
int compno; int compno;
opj_image_t *image = NULL; opj_image_t *image = NULL;
image = (opj_image_t*)opj_malloc(sizeof(opj_image_t)); image = (opj_image_t*)opj_malloc(sizeof(opj_image_t));
if(image) { if(image) {
image->color_space = clrspc; image->color_space = clrspc;
image->numcomps = numcmpts; image->numcomps = numcmpts;
/* allocate memory for the per-component information */ /* allocate memory for the per-component information */
image->comps = (opj_image_comp_t*)opj_malloc(image->numcomps * sizeof(opj_image_comp_t)); image->comps = (opj_image_comp_t*)opj_malloc(image->numcomps * sizeof(opj_image_comp_t));
if(!image->comps) { if(!image->comps) {
opj_image_destroy(image); opj_image_destroy(image);
return NULL; return NULL;
} }
/* create the individual image components */ /* create the individual image components */
for(compno = 0; compno < numcmpts; compno++) { for(compno = 0; compno < numcmpts; compno++) {
opj_image_comp_t *comp = &image->comps[compno]; opj_image_comp_t *comp = &image->comps[compno];
comp->dx = cmptparms[compno].dx; comp->dx = cmptparms[compno].dx;
comp->dy = cmptparms[compno].dy; comp->dy = cmptparms[compno].dy;
comp->w = cmptparms[compno].w; comp->w = cmptparms[compno].w;
comp->h = cmptparms[compno].h; comp->h = cmptparms[compno].h;
comp->x0 = cmptparms[compno].x0; comp->x0 = cmptparms[compno].x0;
comp->y0 = cmptparms[compno].y0; comp->y0 = cmptparms[compno].y0;
comp->prec = cmptparms[compno].prec; comp->prec = cmptparms[compno].prec;
comp->bpp = cmptparms[compno].bpp; comp->bpp = cmptparms[compno].bpp;
comp->sgnd = cmptparms[compno].sgnd; comp->sgnd = cmptparms[compno].sgnd;
comp->data = (int*)opj_malloc(comp->w * comp->h * sizeof(int)); comp->data = (int*)opj_malloc(comp->w * comp->h * sizeof(int));
if(!comp->data) { if(!comp->data) {
opj_image_destroy(image); opj_image_destroy(image);
return NULL; return NULL;
} }
} }
} }
return image; return image;
} }
void opj_image_destroy(opj_image_t *image) { void opj_image_destroy(opj_image_t *image) {
int i; int i;
if(image) { if(image) {
if(image->comps) { if(image->comps) {
/* image components */ /* image components */
for(i = 0; i < image->numcomps; i++) { for(i = 0; i < image->numcomps; i++) {
opj_image_comp_t *image_comp = &image->comps[i]; opj_image_comp_t *image_comp = &image->comps[i];
if(image_comp->data) { if(image_comp->data) {
opj_free(image_comp->data); opj_free(image_comp->data);
} }
} }
opj_free(image->comps); opj_free(image->comps);
} }
opj_free(image); opj_free(image);
} }
} }

View File

@ -23,8 +23,6 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#ifndef __IMAGE_H #ifndef __IMAGE_H
#define __IMAGE_H #define __IMAGE_H
/** /**

View File

@ -2,7 +2,7 @@
* Copyright (c) 2001-2003, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team * Copyright (c) 2005, Hervé Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
@ -31,42 +31,42 @@
#include "opj_includes.h" #include "opj_includes.h"
int int_min(int a, int b) { int int_min(int a, int b) {
return a < b ? a : b; return a < b ? a : b;
} }
int int_max(int a, int b) { int int_max(int a, int b) {
return (a > b) ? a : b; return (a > b) ? a : b;
} }
int int_clamp(int a, int min, int max) { int int_clamp(int a, int min, int max) {
if (a < min) if (a < min)
return min; return min;
if (a > max) if (a > max)
return max; return max;
return a; return a;
} }
int int_abs(int a) { int int_abs(int a) {
return a < 0 ? -a : a; return a < 0 ? -a : a;
} }
int int_ceildiv(int a, int b) { int int_ceildiv(int a, int b) {
return (a + b - 1) / b; return (a + b - 1) / b;
} }
int int_ceildivpow2(int a, int b) { int int_ceildivpow2(int a, int b) {
return (a + (1 << b) - 1) >> b; return (a + (1 << b) - 1) >> b;
} }
int int_floordivpow2(int a, int b) { int int_floordivpow2(int a, int b) {
return a >> b; return a >> b;
} }
int int_floorlog2(int a) { int int_floorlog2(int a) {
int l; int l;
for (l = 0; a > 1; l++) { for (l = 0; a > 1; l++) {
a >>= 1; a >>= 1;
} }
return l; return l;
} }

View File

@ -2,7 +2,7 @@
* Copyright (c) 2001-2003, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team * Copyright (c) 2005, Hervé Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
@ -27,7 +27,6 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#ifndef __INT_H #ifndef __INT_H
#define __INT_H #define __INT_H
/** /**

File diff suppressed because it is too large Load Diff

View File

@ -2,7 +2,7 @@
* Copyright (c) 2001-2003, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team * Copyright (c) 2005, Hervé Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
@ -55,26 +55,26 @@ The functions in J2K.C have for goal to read/write the several parts of the code
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */
#define J2K_MS_SOC 0xff4f /**< SOC marker value */ #define J2K_MS_SOC 0xff4f /**< SOC marker value */
#define J2K_MS_SOT 0xff90 /**< SOT marker value */ #define J2K_MS_SOT 0xff90 /**< SOT marker value */
#define J2K_MS_SOD 0xff93 /**< SOD marker value */ #define J2K_MS_SOD 0xff93 /**< SOD marker value */
#define J2K_MS_EOC 0xffd9 /**< EOC marker value */ #define J2K_MS_EOC 0xffd9 /**< EOC marker value */
#define J2K_MS_SIZ 0xff51 /**< SIZ marker value */ #define J2K_MS_SIZ 0xff51 /**< SIZ marker value */
#define J2K_MS_COD 0xff52 /**< COD marker value */ #define J2K_MS_COD 0xff52 /**< COD marker value */
#define J2K_MS_COC 0xff53 /**< COC marker value */ #define J2K_MS_COC 0xff53 /**< COC marker value */
#define J2K_MS_RGN 0xff5e /**< RGN marker value */ #define J2K_MS_RGN 0xff5e /**< RGN marker value */
#define J2K_MS_QCD 0xff5c /**< QCD marker value */ #define J2K_MS_QCD 0xff5c /**< QCD marker value */
#define J2K_MS_QCC 0xff5d /**< QCC marker value */ #define J2K_MS_QCC 0xff5d /**< QCC marker value */
#define J2K_MS_POC 0xff5f /**< POC marker value */ #define J2K_MS_POC 0xff5f /**< POC marker value */
#define J2K_MS_TLM 0xff55 /**< TLM marker value */ #define J2K_MS_TLM 0xff55 /**< TLM marker value */
#define J2K_MS_PLM 0xff57 /**< PLM marker value */ #define J2K_MS_PLM 0xff57 /**< PLM marker value */
#define J2K_MS_PLT 0xff58 /**< PLT marker value */ #define J2K_MS_PLT 0xff58 /**< PLT marker value */
#define J2K_MS_PPM 0xff60 /**< PPM marker value */ #define J2K_MS_PPM 0xff60 /**< PPM marker value */
#define J2K_MS_PPT 0xff61 /**< PPT marker value */ #define J2K_MS_PPT 0xff61 /**< PPT marker value */
#define J2K_MS_SOP 0xff91 /**< SOP marker value */ #define J2K_MS_SOP 0xff91 /**< SOP marker value */
#define J2K_MS_EPH 0xff92 /**< EPH marker value */ #define J2K_MS_EPH 0xff92 /**< EPH marker value */
#define J2K_MS_CRG 0xff63 /**< CRG marker value */ #define J2K_MS_CRG 0xff63 /**< CRG marker value */
#define J2K_MS_COM 0xff64 /**< COM marker value */ #define J2K_MS_COM 0xff64 /**< COM marker value */
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */
@ -83,13 +83,13 @@ Values that specify the status of the decoding process when decoding the main he
These values may be combined with a | operator. These values may be combined with a | operator.
*/ */
typedef enum J2K_STATUS { typedef enum J2K_STATUS {
J2K_STATE_MHSOC = 0x0001, /**< a SOC marker is expected */ J2K_STATE_MHSOC = 0x0001, /**< a SOC marker is expected */
J2K_STATE_MHSIZ = 0x0002, /**< a SIZ marker is expected */ J2K_STATE_MHSIZ = 0x0002, /**< a SIZ marker is expected */
J2K_STATE_MH = 0x0004, /**< the decoding process is in the main header */ J2K_STATE_MH = 0x0004, /**< the decoding process is in the main header */
J2K_STATE_TPHSOT = 0x0008, /**< the decoding process is in a tile part header and expects a SOT marker */ J2K_STATE_TPHSOT = 0x0008, /**< the decoding process is in a tile part header and expects a SOT marker */
J2K_STATE_TPH = 0x0010, /**< the decoding process is in a tile part header */ J2K_STATE_TPH = 0x0010, /**< the decoding process is in a tile part header */
J2K_STATE_MT = 0x0020, /**< the EOC marker has just been read */ J2K_STATE_MT = 0x0020, /**< the EOC marker has just been read */
J2K_STATE_NEOC = 0x0040 /**< the decoding process must not expect a EOC marker because the codestream is truncated */ J2K_STATE_NEOC = 0x0040 /**< the decoding process must not expect a EOC marker because the codestream is truncated */
} J2K_STATUS; } J2K_STATUS;
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */
@ -98,40 +98,40 @@ typedef enum J2K_STATUS {
Quantization stepsize Quantization stepsize
*/ */
typedef struct opj_stepsize { typedef struct opj_stepsize {
/** exponent */ /** exponent */
int expn; int expn;
/** mantissa */ /** mantissa */
int mant; int mant;
} opj_stepsize_t; } opj_stepsize_t;
/** /**
Tile-component coding parameters Tile-component coding parameters
*/ */
typedef struct opj_tccp { typedef struct opj_tccp {
/** coding style */ /** coding style */
int csty; int csty;
/** number of resolutions */ /** number of resolutions */
int numresolutions; int numresolutions;
/** code-blocks width */ /** code-blocks width */
int cblkw; int cblkw;
/** code-blocks height */ /** code-blocks height */
int cblkh; int cblkh;
/** code-block coding style */ /** code-block coding style */
int cblksty; int cblksty;
/** discrete wavelet transform identifier */ /** discrete wavelet transform identifier */
int qmfbid; int qmfbid;
/** quantisation style */ /** quantisation style */
int qntsty; int qntsty;
/** stepsizes used for quantization */ /** stepsizes used for quantization */
opj_stepsize_t stepsizes[J2K_MAXBANDS]; opj_stepsize_t stepsizes[J2K_MAXBANDS];
/** number of guard bits */ /** number of guard bits */
int numgbits; int numgbits;
/** Region Of Interest shift */ /** Region Of Interest shift */
int roishift; int roishift;
/** precinct width */ /** precinct width */
int prcw[J2K_MAXRLVLS]; int prcw[J2K_MAXRLVLS];
/** precinct height */ /** precinct height */
int prch[J2K_MAXRLVLS]; int prch[J2K_MAXRLVLS];
} opj_tccp_t; } opj_tccp_t;
/** /**
@ -140,415 +140,224 @@ this structure is used to store coding/decoding parameters common to all
tiles (information like COD, COC in main header) tiles (information like COD, COC in main header)
*/ */
typedef struct opj_tcp { typedef struct opj_tcp {
/** 1 : first part-tile of a tile */ /** 1 : first part-tile of a tile */
int first; int first;
/** coding style */ /** coding style */
int csty; int csty;
/** progression order */ /** progression order */
OPJ_PROG_ORDER prg; OPJ_PROG_ORDER prg;
/** number of layers */ /** number of layers */
int numlayers; int numlayers;
/** multi-component transform identifier */ /** multi-component transform identifier */
int mct; int mct;
/** rates of layers */ /** rates of layers */
int rates[100]; int rates[100];
/** number of progression order changes */ /** number of progression order changes */
int numpocs; int numpocs;
/** indicates if a POC marker has been used O:NO, 1:YES */ /** indicates if a POC marker has been used O:NO, 1:YES */
int POC; int POC;
/** progression order changes */ /** progression order changes */
opj_poc_t pocs[32]; opj_poc_t pocs[32];
/** packet header store there for futur use in t2_decode_packet */ /** packet header store there for futur use in t2_decode_packet */
unsigned char *ppt_data; unsigned char *ppt_data;
/** pointer remaining on the first byte of the first header if ppt is used */ /** pointer remaining on the first byte of the first header if ppt is used */
unsigned char *ppt_data_first; unsigned char *ppt_data_first;
/** If ppt == 1 --> there was a PPT marker for the present tile */ /** If ppt == 1 --> there was a PPT marker for the present tile */
int ppt; int ppt;
/** used in case of multiple marker PPT (number of info already stored) */ /** used in case of multiple marker PPT (number of info already stored) */
int ppt_store; int ppt_store;
/** ppmbug1 */ /** ppmbug1 */
int ppt_len; int ppt_len;
/** add fixed_quality */ /** add fixed_quality */
float distoratio[100]; float distoratio[100];
/** tile-component coding parameters */ /** tile-component coding parameters */
opj_tccp_t *tccps; opj_tccp_t *tccps;
} opj_tcp_t; } opj_tcp_t;
/** /**
Coding parameters Coding parameters
*/ */
typedef struct opj_cp { typedef struct opj_cp {
/** allocation by rate/distortion */ /** allocation by rate/distortion */
int disto_alloc; int disto_alloc;
/** allocation by fixed layer */ /** allocation by fixed layer */
int fixed_alloc; int fixed_alloc;
/** add fixed_quality */ /** add fixed_quality */
int fixed_quality; int fixed_quality;
/** if != 0, then original dimension divided by 2^(reduce); if == 0 or not used, image is decoded to the full resolution */ /** if != 0, then original dimension divided by 2^(reduce); if == 0 or not used, image is decoded to the full resolution */
int reduce; int reduce;
/** if != 0, then only the first "layer" layers are decoded; if == 0 or not used, all the quality layers are decoded */ /** if != 0, then only the first "layer" layers are decoded; if == 0 or not used, all the quality layers are decoded */
int layer; int layer;
/** 0 = no index || 1 = index */ /** 0 = no index || 1 = index */
int index_on; int index_on;
/** XTOsiz */ /** XTOsiz */
int tx0; int tx0;
/** YTOsiz */ /** YTOsiz */
int ty0; int ty0;
/** XTsiz */ /** XTsiz */
int tdx; int tdx;
/** YTsiz */ /** YTsiz */
int tdy; int tdy;
/** comment for coding */ /** comment for coding */
char *comment; char *comment;
/** number of tiles in width */ /** number of tiles in width */
int tw; int tw;
/** number of tiles in heigth */ /** number of tiles in heigth */
int th; int th;
/** ID number of the tiles present in the codestream */ /** ID number of the tiles present in the codestream */
int *tileno; int *tileno;
/** size of the vector tileno */ /** size of the vector tileno */
int tileno_size; int tileno_size;
/** packet header store there for futur use in t2_decode_packet */ /** packet header store there for futur use in t2_decode_packet */
unsigned char *ppm_data; unsigned char *ppm_data;
/** pointer remaining on the first byte of the first header if ppm is used */ /** pointer remaining on the first byte of the first header if ppm is used */
unsigned char *ppm_data_first; unsigned char *ppm_data_first;
/** if ppm == 1 --> there was a PPM marker for the present tile */ /** if ppm == 1 --> there was a PPM marker for the present tile */
int ppm; int ppm;
/** use in case of multiple marker PPM (number of info already store) */ /** use in case of multiple marker PPM (number of info already store) */
int ppm_store; int ppm_store;
/** use in case of multiple marker PPM (case on non-finished previous info) */ /** use in case of multiple marker PPM (case on non-finished previous info) */
int ppm_previous; int ppm_previous;
/** ppmbug1 */ /** ppmbug1 */
int ppm_len; int ppm_len;
/** tile coding parameters */ /** tile coding parameters */
opj_tcp_t *tcps; opj_tcp_t *tcps;
/** fixed layer */ /** fixed layer */
int *matrice; int *matrice;
} opj_cp_t; } opj_cp_t;
/** /**
Information concerning a packet inside tile Information concerning a packet inside tile
*/ */
typedef struct opj_packet_info { typedef struct opj_packet_info {
/** start position */ /** start position */
int start_pos; int start_pos;
/** end position */ /** end position */
int end_pos; int end_pos;
/** ADD for Marcela */ /** ADD for Marcela */
double disto; double disto;
} opj_packet_info_t; } opj_packet_info_t;
/** /**
Index structure : information regarding tiles inside image Index structure : information regarding tiles inside image
*/ */
typedef struct opj_tile_info { typedef struct opj_tile_info {
/** value of thresh for each layer by tile cfr. Marcela */ /** value of thresh for each layer by tile cfr. Marcela */
double *thresh; double *thresh;
/** number of tile */ /** number of tile */
int num_tile; int num_tile;
/** start position */ /** start position */
int start_pos; int start_pos;
/** end position of the header */ /** end position of the header */
int end_header; int end_header;
/** end position */ /** end position */
int end_pos; int end_pos;
/** precinct number for each resolution level (width) */ /** precinct number for each resolution level (width) */
int pw[33]; int pw[33];
/** precinct number for each resolution level (height) */ /** precinct number for each resolution level (height) */
int ph[33]; int ph[33];
/** precinct size (in power of 2), in X for each resolution level */ /** precinct size (in power of 2), in X for each resolution level */
int pdx[33]; int pdx[33];
/** precinct size (in power of 2), in Y for each resolution level */ /** precinct size (in power of 2), in Y for each resolution level */
int pdy[33]; int pdy[33];
/** information concerning packets inside tile */ /** information concerning packets inside tile */
opj_packet_info_t *packet; opj_packet_info_t *packet;
/** add fixed_quality */ /** add fixed_quality */
int nbpix; int nbpix;
/** add fixed_quality */ /** add fixed_quality */
double distotile; double distotile;
} opj_tile_info_t; } opj_tile_info_t;
/** /**
Index structure Index structure
*/ */
typedef struct opj_image_info { typedef struct opj_image_info {
/** 0 = no index || 1 = index */ /** 0 = no index || 1 = index */
int index_on; int index_on;
/** maximum distortion reduction on the whole image (add for Marcela) */ /** maximum distortion reduction on the whole image (add for Marcela) */
double D_max; double D_max;
/** packet number */ /** packet number */
int num; int num;
/** writing the packet in the index with t2_encode_packets */ /** writing the packet in the index with t2_encode_packets */
int index_write; int index_write;
/** image width */ /** image width */
int image_w; int image_w;
/** image height */ /** image height */
int image_h; int image_h;
/** progression order */ /** progression order */
OPJ_PROG_ORDER prog; OPJ_PROG_ORDER prog;
/** tile size in x */ /** tile size in x */
int tile_x; int tile_x;
/** tile size in y */ /** tile size in y */
int tile_y; int tile_y;
/** */ /** */
int tile_Ox; int tile_Ox;
/** */ /** */
int tile_Oy; int tile_Oy;
/** number of tiles in X */ /** number of tiles in X */
int tw; int tw;
/** number of tiles in Y */ /** number of tiles in Y */
int th; int th;
/** component numbers */ /** component numbers */
int comp; int comp;
/** number of layer */ /** number of layer */
int layer; int layer;
/** number of decomposition */ /** number of decomposition */
int decomposition; int decomposition;
/** main header position */ /** main header position */
int main_head_end; int main_head_end;
/** codestream's size */ /** codestream's size */
int codestream_size; int codestream_size;
/** information regarding tiles inside image */ /** information regarding tiles inside image */
opj_tile_info_t *tile; opj_tile_info_t *tile;
} opj_image_info_t; } opj_image_info_t;
/** /**
JPEG-2000 codestream reader/writer JPEG-2000 codestream reader/writer
*/ */
typedef struct opj_j2k { typedef struct opj_j2k {
/** codec context */ /** codec context */
opj_common_ptr cinfo; opj_common_ptr cinfo;
/** locate in which part of the codestream the decoder is (main header, tile header, end) */ /** locate in which part of the codestream the decoder is (main header, tile header, end) */
int state; int state;
/** number of the tile curently concern by coding/decoding */ /** number of the tile curently concern by coding/decoding */
int curtileno; int curtileno;
/** /**
locate the position of the end of the tile in the codestream, locate the position of the end of the tile in the codestream,
used to detect a truncated codestream (in j2k_read_sod) used to detect a truncated codestream (in j2k_read_sod)
*/ */
unsigned char *eot; unsigned char *eot;
/** /**
locate the start position of the SOT marker of the current coded tile: locate the start position of the SOT marker of the current coded tile:
after encoding the tile, a jump (in j2k_write_sod) is done to the SOT marker to store the value of its length. after encoding the tile, a jump (in j2k_write_sod) is done to the SOT marker to store the value of its length.
*/ */
int sot_start; int sot_start;
int sod_start; int sod_start;
/** /**
as the J2K-file is written in several parts during encoding, as the J2K-file is written in several parts during encoding,
it enables to make the right correction in position return by cio_tell it enables to make the right correction in position return by cio_tell
*/ */
int pos_correction; int pos_correction;
/** array used to store the data of each tile */ /** array used to store the data of each tile */
unsigned char **tile_data; unsigned char **tile_data;
/** array used to store the length of each tile */ /** array used to store the length of each tile */
int *tile_len; int *tile_len;
/** /**
decompression only : decompression only :
store decoding parameters common to all tiles (information like COD, COC in main header) store decoding parameters common to all tiles (information like COD, COC in main header)
*/ */
opj_tcp_t *default_tcp; opj_tcp_t *default_tcp;
/** pointer to the encoded / decoded image */ /** pointer to the encoded / decoded image */
opj_image_t *image; opj_image_t *image;
/** pointer to the coding parameters */ /** pointer to the coding parameters */
opj_cp_t *cp; opj_cp_t *cp;
/** helper used to write the index file */ /** helper used to write the index file */
opj_image_info_t *image_info; opj_image_info_t *image_info;
/** pointer to the byte i/o stream */ /** pointer to the byte i/o stream */
opj_cio_t *cio; opj_cio_t *cio;
} opj_j2k_t; } opj_j2k_t;
/** @name Local static functions */
/*@{*/
/* ----------------------------------------------------------------------- */
/**
Write the SOC marker (Start Of Codestream)
@param j2k J2K handle
*/
static void j2k_write_soc(opj_j2k_t *j2k);
/**
Read the SOC marker (Start of Codestream)
@param j2k J2K handle
*/
static void j2k_read_soc(opj_j2k_t *j2k);
/**
Write the SIZ marker (image and tile size)
@param j2k J2K handle
*/
static void j2k_write_siz(opj_j2k_t *j2k);
/**
Read the SIZ marker (image and tile size)
@param j2k J2K handle
*/
static void j2k_read_siz(opj_j2k_t *j2k);
/**
Write the COM marker (comment)
@param j2k J2K handle
*/
static void j2k_write_com(opj_j2k_t *j2k);
/**
Read the COM marker (comment)
@param j2k J2K handle
*/
static void j2k_read_com(opj_j2k_t *j2k);
/**
Write the value concerning the specified component in the marker COD and COC
@param j2k J2K handle
@param compno Number of the component concerned by the information written
*/
static void j2k_write_cox(opj_j2k_t *j2k, int compno);
/**
Read the value concerning the specified component in the marker COD and COC
@param j2k J2K handle
@param compno Number of the component concerned by the information read
*/
static void j2k_read_cox(opj_j2k_t *j2k, int compno);
/**
Write the COD marker (coding style default)
@param j2k J2K handle
*/
static void j2k_write_cod(opj_j2k_t *j2k);
/**
Read the COD marker (coding style default)
@param j2k J2K handle
*/
static void j2k_read_cod(opj_j2k_t *j2k);
/**
Write the COC marker (coding style component)
@param j2k J2K handle
@param compno Number of the component concerned by the information written
*/
static void j2k_write_coc(opj_j2k_t *j2k, int compno);
/**
Read the COC marker (coding style component)
@param j2k J2K handle
*/
static void j2k_read_coc(opj_j2k_t *j2k);
/**
Write the value concerning the specified component in the marker QCD and QCC
@param j2k J2K handle
@param compno Number of the component concerned by the information written
*/
static void j2k_write_qcx(opj_j2k_t *j2k, int compno);
/**
Read the value concerning the specified component in the marker QCD and QCC
@param j2k J2K handle
@param compno Number of the component concern by the information read
@param len Length of the information in the QCX part of the marker QCD/QCC
*/
static void j2k_read_qcx(opj_j2k_t *j2k, int compno, int len);
/**
Write the QCD marker (quantization default)
@param j2k J2K handle
*/
static void j2k_write_qcd(opj_j2k_t *j2k);
/**
Read the QCD marker (quantization default)
@param j2k J2K handle
*/
static void j2k_read_qcd(opj_j2k_t *j2k);
/**
Write the QCC marker (quantization component)
@param j2k J2K handle
@param compno Number of the component concerned by the information written
*/
static void j2k_write_qcc(opj_j2k_t *j2k, int compno);
/**
Read the QCC marker (quantization component)
@param j2k J2K handle
*/
static void j2k_read_qcc(opj_j2k_t *j2k);
/**
Write the POC marker (progression order change)
@param j2k J2K handle
*/
static void j2k_write_poc(opj_j2k_t *j2k);
/**
Read the POC marker (progression order change)
@param j2k J2K handle
*/
static void j2k_read_poc(opj_j2k_t *j2k);
/**
Read the CRG marker (component registration)
@param j2k J2K handle
*/
static void j2k_read_crg(opj_j2k_t *j2k);
/**
Read the TLM marker (tile-part lengths)
@param j2k J2K handle
*/
static void j2k_read_tlm(opj_j2k_t *j2k);
/**
Read the PLM marker (packet length, main header)
@param j2k J2K handle
*/
static void j2k_read_plm(opj_j2k_t *j2k);
/**
Read the PLT marker (packet length, tile-part header)
@param j2k J2K handle
*/
static void j2k_read_plt(opj_j2k_t *j2k);
/**
Read the PPM marker (packet packet headers, main header)
@param j2k J2K handle
*/
static void j2k_read_ppm(opj_j2k_t *j2k);
/**
Read the PPT marker (packet packet headers, tile-part header)
@param j2k J2K handle
*/
static void j2k_read_ppt(opj_j2k_t *j2k);
/**
Write the SOT marker (start of tile-part)
@param j2k J2K handle
*/
static void j2k_write_sot(opj_j2k_t *j2k);
/**
Read the SOT marker (start of tile-part)
@param j2k J2K handle
*/
static void j2k_read_sot(opj_j2k_t *j2k);
/**
Write the SOD marker (start of data)
@param j2k J2K handle
@param tile_coder Pointer to a TCD handle
*/
static void j2k_write_sod(opj_j2k_t *j2k, void *tile_coder);
/**
Read the SOD marker (start of data)
@param j2k J2K handle
*/
static void j2k_read_sod(opj_j2k_t *j2k);
/**
Write the RGN marker (region-of-interest)
@param j2k J2K handle
@param compno Number of the component concerned by the information written
@param tileno Number of the tile concerned by the information written
*/
static void j2k_write_rgn(opj_j2k_t *j2k, int compno, int tileno);
/**
Read the RGN marker (region-of-interest)
@param j2k J2K handle
*/
static void j2k_read_rgn(opj_j2k_t *j2k);
/**
Write the EOC marker (end of codestream)
@param j2k J2K handle
*/
static void j2k_write_eoc(opj_j2k_t *j2k);
/**
Read the EOC marker (end of codestream)
@param j2k J2K handle
*/
static void j2k_read_eoc(opj_j2k_t *j2k);
/**
Read an unknown marker
@param j2k J2K handle
*/
static void j2k_read_unk(opj_j2k_t *j2k);
/* ----------------------------------------------------------------------- */
/*@}*/
/** @name Exported functions */ /** @name Exported functions */
/*@{*/ /*@{*/
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */

View File

@ -24,7 +24,6 @@
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#ifdef WIN32 #ifdef WIN32
#include <windows.h> #include <windows.h>
#else #else
@ -36,22 +35,22 @@
double opj_clock() { double opj_clock() {
#ifdef WIN32 #ifdef WIN32
/* WIN32: use QueryPerformance (very accurate) */ /* WIN32: use QueryPerformance (very accurate) */
LARGE_INTEGER freq , t ; LARGE_INTEGER freq , t ;
/* freq is the clock speed of the CPU */ /* freq is the clock speed of the CPU */
QueryPerformanceFrequency(&freq) ; QueryPerformanceFrequency(&freq) ;
/* cout << "freq = " << ((double) freq.QuadPart) << endl; */ /* cout << "freq = " << ((double) freq.QuadPart) << endl; */
/* t is the high resolution performance counter (see MSDN) */ /* t is the high resolution performance counter (see MSDN) */
QueryPerformanceCounter ( & t ) ; QueryPerformanceCounter ( & t ) ;
return ( t.QuadPart /(double) freq.QuadPart ) ; return ( t.QuadPart /(double) freq.QuadPart ) ;
#else #else
/* Unix or Linux: use resource usage */ /* Unix or Linux: use resource usage */
struct rusage t; struct rusage t;
double procTime; double procTime;
/* (1) Get the rusage data structure at this moment (man getrusage) */ /* (1) Get the rusage data structure at this moment (man getrusage) */
getrusage(0,&t); getrusage(0,&t);
/* (2) What is the elapsed time ? - CPU time = User time + System time */ /* (2) What is the elapsed time ? - CPU time = User time + System time */
/* (2a) Get the seconds */ /* (2a) Get the seconds */
procTime = t.ru_utime.tv_sec + t.ru_stime.tv_sec; procTime = t.ru_utime.tv_sec + t.ru_stime.tv_sec;
/* (2b) More precisely! Get the microseconds part ! */ /* (2b) More precisely! Get the microseconds part ! */
return ( procTime + (t.ru_utime.tv_usec + t.ru_stime.tv_usec) * 1e-6 ) ; return ( procTime + (t.ru_utime.tv_usec + t.ru_stime.tv_usec) * 1e-6 ) ;
@ -59,19 +58,19 @@ double opj_clock() {
} }
void* opj_malloc( size_t size ) { void* opj_malloc( size_t size ) {
void *memblock = malloc(size); void *memblock = malloc(size);
if(memblock) { if(memblock) {
memset(memblock, 0, size); memset(memblock, 0, size);
} }
return memblock; return memblock;
} }
void* j2k_realloc( void *memblock, size_t size ) { void* j2k_realloc( void *memblock, size_t size ) {
return realloc(memblock, size); return realloc(memblock, size);
} }
void opj_free( void *memblock ) { void opj_free( void *memblock ) {
free(memblock); free(memblock);
} }

View File

@ -23,8 +23,6 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#ifndef __J2K_LIB_H #ifndef __J2K_LIB_H
#define __J2K_LIB_H #define __J2K_LIB_H
/** /**

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
/* /*
* Copyright (c) 2004, Yannick Verschueren * Copyright (c) 2004, Yannick Verschueren
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team * Copyright (c) 2005, Hervé Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
@ -38,16 +38,16 @@
#define JPIP_JPIP 0x6a706970 #define JPIP_JPIP 0x6a706970
#define JP2_JP 0x6a502020 /**< JPEG 2000 signature box */ #define JP2_JP 0x6a502020 /**< JPEG 2000 signature box */
#define JP2_FTYP 0x66747970 /**< File type box */ #define JP2_FTYP 0x66747970 /**< File type box */
#define JP2_JP2H 0x6a703268 /**< JP2 header box */ #define JP2_JP2H 0x6a703268 /**< JP2 header box */
#define JP2_IHDR 0x69686472 /**< Image header box */ #define JP2_IHDR 0x69686472 /**< Image header box */
#define JP2_COLR 0x636f6c72 /**< Colour specification box */ #define JP2_COLR 0x636f6c72 /**< Colour specification box */
#define JP2_JP2C 0x6a703263 /**< Contiguous codestream box */ #define JP2_JP2C 0x6a703263 /**< Contiguous codestream box */
#define JP2_URL 0x75726c20 /**< URL box */ #define JP2_URL 0x75726c20 /**< URL box */
#define JP2_DBTL 0x6474626c /**< ??? */ #define JP2_DBTL 0x6474626c /**< ??? */
#define JP2_BPCC 0x62706363 /**< Bits per component box */ #define JP2_BPCC 0x62706363 /**< Bits per component box */
#define JP2_JP2 0x6a703220 /**< File type fields */ #define JP2_JP2 0x6a703220 /**< File type fields */
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */
@ -55,8 +55,8 @@
JP2 component JP2 component
*/ */
typedef struct opj_jp2_comps { typedef struct opj_jp2_comps {
int depth; int depth;
int sgnd; int sgnd;
int bpcc; int bpcc;
} opj_jp2_comps_t; } opj_jp2_comps_t;
@ -64,29 +64,29 @@ typedef struct opj_jp2_comps {
JPEG-2000 file format reader/writer JPEG-2000 file format reader/writer
*/ */
typedef struct opj_jp2 { typedef struct opj_jp2 {
/** codec context */ /** codec context */
opj_common_ptr cinfo; opj_common_ptr cinfo;
/** handle to the J2K codec */ /** handle to the J2K codec */
opj_j2k_t *j2k; opj_j2k_t *j2k;
unsigned int w; unsigned int w;
unsigned int h; unsigned int h;
unsigned int numcomps; unsigned int numcomps;
unsigned int bpc; unsigned int bpc;
unsigned int C; unsigned int C;
unsigned int UnkC; unsigned int UnkC;
unsigned int IPR; unsigned int IPR;
unsigned int meth; unsigned int meth;
unsigned int approx; unsigned int approx;
unsigned int enumcs; unsigned int enumcs;
unsigned int precedence; unsigned int precedence;
unsigned int brand; unsigned int brand;
unsigned int minversion; unsigned int minversion;
unsigned int numcl; unsigned int numcl;
unsigned int *cl; unsigned int *cl;
opj_jp2_comps_t *comps; opj_jp2_comps_t *comps;
opj_image_t *image; opj_image_t *image;
unsigned int j2k_codestream_offset; unsigned int j2k_codestream_offset;
unsigned int j2k_codestream_length; unsigned int j2k_codestream_length;
} opj_jp2_t; } opj_jp2_t;
/** /**
@ -98,76 +98,6 @@ typedef struct opj_jp2_box {
int init_pos; int init_pos;
} opj_jp2_box_t; } opj_jp2_box_t;
/** @name Local static functions */
/*@{*/
/* ----------------------------------------------------------------------- */
/**
Read box headers
@param cinfo Codec context info
@param cio Input stream
@param box
@return Returns true if successful, returns false otherwise
*/
static bool jp2_read_boxhdr(opj_common_ptr cinfo, opj_cio_t *cio, opj_jp2_box_t *box);
static void jp2_write_url(opj_cio_t *cio, char *Idx_file);
/**
Read the IHDR box - Image Header box
@param jp2 JP2 handle
@param cio Input buffer stream
@return Returns true if successful, returns false otherwise
*/
static bool jp2_read_ihdr(opj_jp2_t *jp2, opj_cio_t *cio);
static void jp2_write_ihdr(opj_jp2_t *jp2, opj_cio_t *cio);
static void jp2_write_bpcc(opj_jp2_t *jp2, opj_cio_t *cio);
static bool jp2_read_bpcc(opj_jp2_t *jp2, opj_cio_t *cio);
static void jp2_write_colr(opj_jp2_t *jp2, opj_cio_t *cio);
static bool jp2_read_colr(opj_jp2_t *jp2, opj_cio_t *cio);
/**
Write the JP2H box - JP2 Header box
@param jp2 JP2 handle
@param cio Output buffer stream
*/
static void jp2_write_jp2h(opj_jp2_t *jp2, opj_cio_t *cio);
/**
Read the JP2H box - JP2 Header box
@param jp2 JP2 handle
@param cio Input buffer stream
@return Returns true if successful, returns false otherwise
*/
static bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio);
/**
Write the FTYP box - File type box
@param jp2 JP2 handle
@param cio Output buffer stream
*/
static void jp2_write_ftyp(opj_jp2_t *jp2, opj_cio_t *cio);
/**
Read the FTYP box - File type box
@param jp2 JP2 handle
@param cio Input buffer stream
@return Returns true if successful, returns false otherwise
*/
static bool jp2_read_ftyp(opj_jp2_t *jp2, opj_cio_t *cio);
static int jp2_write_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, char *index);
static bool jp2_read_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, unsigned int *j2k_codestream_length, unsigned int *j2k_codestream_offset);
static void jp2_write_jp(opj_cio_t *cio);
/**
Read the JP box - JPEG 2000 signature
@param jp2 JP2 handle
@param cio Input buffer stream
@return Returns true if successful, returns false otherwise
*/
static bool jp2_read_jp(opj_jp2_t *jp2, opj_cio_t *cio);
/**
Decode the structure of a JP2 file
@param jp2 JP2 handle
@param cio Input buffer stream
@return Returns true if successful, returns false otherwise
*/
static bool jp2_read_struct(opj_jp2_t *jp2, opj_cio_t *cio);
/* ----------------------------------------------------------------------- */
/*@}*/
/** @name Exported functions */ /** @name Exported functions */
/*@{*/ /*@{*/
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */

View File

@ -1,6 +1,6 @@
/* /*
* Copyright (c) 2004, Yannick Verschueren * Copyright (c) 2004, Yannick Verschueren
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team * Copyright (c) 2005, Hervé Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
@ -26,7 +26,6 @@
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "opj_includes.h" #include "opj_includes.h"
/* /*
@ -35,18 +34,18 @@
* *
*/ */
unsigned int jpt_read_VBAS_info(opj_cio_t *cio, unsigned int value) { unsigned int jpt_read_VBAS_info(opj_cio_t *cio, unsigned int value) {
unsigned char elmt; unsigned char elmt;
elmt = cio_read(cio, 1); elmt = cio_read(cio, 1);
while ((elmt >> 7) == 1) { while ((elmt >> 7) == 1) {
value = (value << 7); value = (value << 7);
value |= (elmt & 0x7f); value |= (elmt & 0x7f);
elmt = cio_read(cio, 1); elmt = cio_read(cio, 1);
} }
value = (value << 7); value = (value << 7);
value |= (elmt & 0x7f); value |= (elmt & 0x7f);
return value; return value;
} }
/* /*
@ -54,13 +53,13 @@ unsigned int jpt_read_VBAS_info(opj_cio_t *cio, unsigned int value) {
* *
*/ */
void jpt_init_msg_header(opj_jpt_msg_header_t * header) { void jpt_init_msg_header(opj_jpt_msg_header_t * header) {
header->Id = 0; /* In-class Identifier */ header->Id = 0; /* In-class Identifier */
header->last_byte = 0; /* Last byte information */ header->last_byte = 0; /* Last byte information */
header->Class_Id = 0; /* Class Identifier */ header->Class_Id = 0; /* Class Identifier */
header->CSn_Id = 0; /* CSn : index identifier */ header->CSn_Id = 0; /* CSn : index identifier */
header->Msg_offset = 0; /* Message offset */ header->Msg_offset = 0; /* Message offset */
header->Msg_length = 0; /* Message length */ header->Msg_length = 0; /* Message length */
header->Layer_nb = 0; /* Auxiliary for JPP case */ header->Layer_nb = 0; /* Auxiliary for JPP case */
} }
/* /*
@ -70,10 +69,10 @@ void jpt_init_msg_header(opj_jpt_msg_header_t * header) {
* *
*/ */
void jpt_reinit_msg_header(opj_jpt_msg_header_t * header) { void jpt_reinit_msg_header(opj_jpt_msg_header_t * header) {
header->Id = 0; /* In-class Identifier */ header->Id = 0; /* In-class Identifier */
header->last_byte = 0; /* Last byte information */ header->last_byte = 0; /* Last byte information */
header->Msg_offset = 0; /* Message offset */ header->Msg_offset = 0; /* Message offset */
header->Msg_length = 0; /* Message length */ header->Msg_length = 0; /* Message length */
} }
/* /*
@ -81,75 +80,75 @@ void jpt_reinit_msg_header(opj_jpt_msg_header_t * header) {
* *
*/ */
void jpt_read_msg_header(opj_common_ptr cinfo, opj_cio_t *cio, opj_jpt_msg_header_t *header) { void jpt_read_msg_header(opj_common_ptr cinfo, opj_cio_t *cio, opj_jpt_msg_header_t *header) {
unsigned char elmt, Class = 0, CSn = 0; unsigned char elmt, Class = 0, CSn = 0;
jpt_reinit_msg_header(header); jpt_reinit_msg_header(header);
/* ------------- */ /* ------------- */
/* VBAS : Bin-ID */ /* VBAS : Bin-ID */
/* ------------- */ /* ------------- */
elmt = cio_read(cio, 1); elmt = cio_read(cio, 1);
/* See for Class and CSn */ /* See for Class and CSn */
switch ((elmt >> 5) & 0x03) { switch ((elmt >> 5) & 0x03) {
case 0: case 0:
opg_event_msg(cinfo, EVT_ERROR, "Forbidden value encounter in message header !!\n"); opj_event_msg(cinfo, EVT_ERROR, "Forbidden value encounter in message header !!\n");
break; break;
case 1: case 1:
Class = 0; Class = 0;
CSn = 0; CSn = 0;
break; break;
case 2: case 2:
Class = 1; Class = 1;
CSn = 0; CSn = 0;
break; break;
case 3: case 3:
Class = 1; Class = 1;
CSn = 1; CSn = 1;
break; break;
default: default:
break; break;
} }
/* see information on bits 'c' [p 10 : A.2.1 general, ISO/IEC FCD 15444-9] */ /* see information on bits 'c' [p 10 : A.2.1 general, ISO/IEC FCD 15444-9] */
if (((elmt >> 4) & 0x01) == 1) if (((elmt >> 4) & 0x01) == 1)
header->last_byte = 1; header->last_byte = 1;
/* In-class identifier */ /* In-class identifier */
header->Id |= (elmt & 0x0f); header->Id |= (elmt & 0x0f);
if ((elmt >> 7) == 1) if ((elmt >> 7) == 1)
header->Id = jpt_read_VBAS_info(cio, header->Id); header->Id = jpt_read_VBAS_info(cio, header->Id);
/* ------------ */ /* ------------ */
/* VBAS : Class */ /* VBAS : Class */
/* ------------ */ /* ------------ */
if (Class == 1) { if (Class == 1) {
header->Class_Id = 0; header->Class_Id = 0;
header->Class_Id = jpt_read_VBAS_info(cio, header->Class_Id); header->Class_Id = jpt_read_VBAS_info(cio, header->Class_Id);
} }
/* ---------- */ /* ---------- */
/* VBAS : CSn */ /* VBAS : CSn */
/* ---------- */ /* ---------- */
if (CSn == 1) { if (CSn == 1) {
header->CSn_Id = 0; header->CSn_Id = 0;
header->CSn_Id = jpt_read_VBAS_info(cio, header->CSn_Id); header->CSn_Id = jpt_read_VBAS_info(cio, header->CSn_Id);
} }
/* ----------------- */ /* ----------------- */
/* VBAS : Msg_offset */ /* VBAS : Msg_offset */
/* ----------------- */ /* ----------------- */
header->Msg_offset = jpt_read_VBAS_info(cio, header->Msg_offset); header->Msg_offset = jpt_read_VBAS_info(cio, header->Msg_offset);
/* ----------------- */ /* ----------------- */
/* VBAS : Msg_length */ /* VBAS : Msg_length */
/* ----------------- */ /* ----------------- */
header->Msg_length = jpt_read_VBAS_info(cio, header->Msg_length); header->Msg_length = jpt_read_VBAS_info(cio, header->Msg_length);
/* ---------- */ /* ---------- */
/* VBAS : Aux */ /* VBAS : Aux */
/* ---------- */ /* ---------- */
if ((header->Class_Id & 0x01) == 1) { if ((header->Class_Id & 0x01) == 1) {
header->Layer_nb = 0; header->Layer_nb = 0;
header->Layer_nb = jpt_read_VBAS_info(cio, header->Layer_nb); header->Layer_nb = jpt_read_VBAS_info(cio, header->Layer_nb);
} }
} }

View File

@ -1,6 +1,6 @@
/* /*
* Copyright (c) 2004, Yannick Verschueren * Copyright (c) 2004, Yannick Verschueren
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team * Copyright (c) 2005, Hervé Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
@ -39,20 +39,20 @@ JPT-stream functions are implemented in J2K.C.
Message Header JPT stream structure Message Header JPT stream structure
*/ */
typedef struct opj_jpt_msg_header { typedef struct opj_jpt_msg_header {
/** In-class Identifier */ /** In-class Identifier */
unsigned int Id; unsigned int Id;
/** Last byte information */ /** Last byte information */
unsigned int last_byte; unsigned int last_byte;
/** Class Identifier */ /** Class Identifier */
unsigned int Class_Id; unsigned int Class_Id;
/** CSn : index identifier */ /** CSn : index identifier */
unsigned int CSn_Id; unsigned int CSn_Id;
/** Message offset */ /** Message offset */
unsigned int Msg_offset; unsigned int Msg_offset;
/** Message length */ /** Message length */
unsigned int Msg_length; unsigned int Msg_length;
/** Auxiliary for JPP case */ /** Auxiliary for JPP case */
unsigned int Layer_nb; unsigned int Layer_nb;
} opj_jpt_msg_header_t; } opj_jpt_msg_header_t;
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */

View File

@ -2,7 +2,7 @@
* Copyright (c) 2001-2003, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team * Copyright (c) 2005, Hervé Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
@ -44,88 +44,88 @@ static const double mct_norms_real[3] = { 1.732, 1.805, 1.573 };
/* Foward reversible MCT. */ /* Foward reversible MCT. */
/* </summary> */ /* </summary> */
void mct_encode(int *c0, int *c1, int *c2, int n) { void mct_encode(int *c0, int *c1, int *c2, int n) {
int i; int i;
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
int r, g, b, y, u, v; int r, g, b, y, u, v;
r = c0[i]; r = c0[i];
g = c1[i]; g = c1[i];
b = c2[i]; b = c2[i];
y = (r + (g << 1) + b) >> 2; y = (r + (g << 1) + b) >> 2;
u = b - g; u = b - g;
v = r - g; v = r - g;
c0[i] = y; c0[i] = y;
c1[i] = u; c1[i] = u;
c2[i] = v; c2[i] = v;
} }
} }
/* <summary> */ /* <summary> */
/* Inverse reversible MCT. */ /* Inverse reversible MCT. */
/* </summary> */ /* </summary> */
void mct_decode(int *c0, int *c1, int *c2, int n) { void mct_decode(int *c0, int *c1, int *c2, int n) {
int i; int i;
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
int y, u, v, r, g, b; int y, u, v, r, g, b;
y = c0[i]; y = c0[i];
u = c1[i]; u = c1[i];
v = c2[i]; v = c2[i];
g = y - ((u + v) >> 2); g = y - ((u + v) >> 2);
r = v + g; r = v + g;
b = u + g; b = u + g;
c0[i] = r; c0[i] = r;
c1[i] = g; c1[i] = g;
c2[i] = b; c2[i] = b;
} }
} }
/* <summary> */ /* <summary> */
/* Get norm of basis function of reversible MCT. */ /* Get norm of basis function of reversible MCT. */
/* </summary> */ /* </summary> */
double mct_getnorm(int compno) { double mct_getnorm(int compno) {
return mct_norms[compno]; return mct_norms[compno];
} }
/* <summary> */ /* <summary> */
/* Foward irreversible MCT. */ /* Foward irreversible MCT. */
/* </summary> */ /* </summary> */
void mct_encode_real(int *c0, int *c1, int *c2, int n) { void mct_encode_real(int *c0, int *c1, int *c2, int n) {
int i; int i;
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
int r, g, b, y, u, v; int r, g, b, y, u, v;
r = c0[i]; r = c0[i];
g = c1[i]; g = c1[i];
b = c2[i]; b = c2[i];
y = fix_mul(r, 2449) + fix_mul(g, 4809) + fix_mul(b, 934); 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); 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); v = fix_mul(r, 4096) - fix_mul(g, 3430) - fix_mul(b, 666);
c0[i] = y; c0[i] = y;
c1[i] = u; c1[i] = u;
c2[i] = v; c2[i] = v;
} }
} }
/* <summary> */ /* <summary> */
/* Inverse irreversible MCT. */ /* Inverse irreversible MCT. */
/* </summary> */ /* </summary> */
void mct_decode_real(int *c0, int *c1, int *c2, int n) { void mct_decode_real(int *c0, int *c1, int *c2, int n) {
int i; int i;
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
int y, u, v, r, g, b; int y, u, v, r, g, b;
y = c0[i]; y = c0[i];
u = c1[i]; u = c1[i];
v = c2[i]; v = c2[i];
r = y + fix_mul(v, 11485); r = y + fix_mul(v, 11485);
g = y - fix_mul(u, 2819) - fix_mul(v, 5850); g = y - fix_mul(u, 2819) - fix_mul(v, 5850);
b = y + fix_mul(u, 14516); b = y + fix_mul(u, 14516);
c0[i] = r; c0[i] = r;
c1[i] = g; c1[i] = g;
c2[i] = b; c2[i] = b;
} }
} }
/* <summary> */ /* <summary> */
/* Get norm of basis function of irreversible MCT. */ /* Get norm of basis function of irreversible MCT. */
/* </summary> */ /* </summary> */
double mct_getnorm_real(int compno) { double mct_getnorm_real(int compno) {
return mct_norms_real[compno]; return mct_norms_real[compno];
} }

View File

@ -2,7 +2,7 @@
* Copyright (c) 2001-2003, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team * Copyright (c) 2005, Hervé Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
@ -28,7 +28,6 @@
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#ifndef __MCT_H #ifndef __MCT_H
#define __MCT_H #define __MCT_H
/** /**

View File

@ -2,7 +2,7 @@
* Copyright (c) 2001-2003, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team * Copyright (c) 2005, Hervé Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
@ -30,104 +30,163 @@
#include "opj_includes.h" #include "opj_includes.h"
/** @defgroup MQC MQC - Implementation of an MQ-Coder */
/*@{*/
/** @name Local static functions */
/*@{*/
/**
Output a byte, doing bit-stuffing if necessary.
After a 0xff byte, the next byte must be smaller than 0x90.
@param mqc MQC handle
*/
static void mqc_byteout(opj_mqc_t *mqc);
/**
Renormalize mqc->a and mqc->c while encoding, so that mqc->a stays between 0x8000 and 0x10000
@param mqc MQC handle
*/
static void mqc_renorme(opj_mqc_t *mqc);
/**
Encode the most probable symbol
@param mqc MQC handle
*/
static void mqc_codemps(opj_mqc_t *mqc);
/**
Encode the most least symbol
@param mqc MQC handle
*/
static void mqc_codelps(opj_mqc_t *mqc);
/**
Fill mqc->c with 1's for flushing
@param mqc MQC handle
*/
static void mqc_setbits(opj_mqc_t *mqc);
/**
FIXME: documentation ???
@param mqc MQC handle
@return
*/
static int mqc_mpsexchange(opj_mqc_t *mqc);
/**
FIXME: documentation ???
@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);
/*@}*/
/*@}*/
/* <summary> */ /* <summary> */
/* This array defines all the possible states for a context. */ /* This array defines all the possible states for a context. */
/* </summary> */ /* </summary> */
static opj_mqc_state_t mqc_states[47 * 2] = { static opj_mqc_state_t mqc_states[47 * 2] = {
{0x5601, 0, &mqc_states[2], &mqc_states[3]}, {0x5601, 0, &mqc_states[2], &mqc_states[3]},
{0x5601, 1, &mqc_states[3], &mqc_states[2]}, {0x5601, 1, &mqc_states[3], &mqc_states[2]},
{0x3401, 0, &mqc_states[4], &mqc_states[12]}, {0x3401, 0, &mqc_states[4], &mqc_states[12]},
{0x3401, 1, &mqc_states[5], &mqc_states[13]}, {0x3401, 1, &mqc_states[5], &mqc_states[13]},
{0x1801, 0, &mqc_states[6], &mqc_states[18]}, {0x1801, 0, &mqc_states[6], &mqc_states[18]},
{0x1801, 1, &mqc_states[7], &mqc_states[19]}, {0x1801, 1, &mqc_states[7], &mqc_states[19]},
{0x0ac1, 0, &mqc_states[8], &mqc_states[24]}, {0x0ac1, 0, &mqc_states[8], &mqc_states[24]},
{0x0ac1, 1, &mqc_states[9], &mqc_states[25]}, {0x0ac1, 1, &mqc_states[9], &mqc_states[25]},
{0x0521, 0, &mqc_states[10], &mqc_states[58]}, {0x0521, 0, &mqc_states[10], &mqc_states[58]},
{0x0521, 1, &mqc_states[11], &mqc_states[59]}, {0x0521, 1, &mqc_states[11], &mqc_states[59]},
{0x0221, 0, &mqc_states[76], &mqc_states[66]}, {0x0221, 0, &mqc_states[76], &mqc_states[66]},
{0x0221, 1, &mqc_states[77], &mqc_states[67]}, {0x0221, 1, &mqc_states[77], &mqc_states[67]},
{0x5601, 0, &mqc_states[14], &mqc_states[13]}, {0x5601, 0, &mqc_states[14], &mqc_states[13]},
{0x5601, 1, &mqc_states[15], &mqc_states[12]}, {0x5601, 1, &mqc_states[15], &mqc_states[12]},
{0x5401, 0, &mqc_states[16], &mqc_states[28]}, {0x5401, 0, &mqc_states[16], &mqc_states[28]},
{0x5401, 1, &mqc_states[17], &mqc_states[29]}, {0x5401, 1, &mqc_states[17], &mqc_states[29]},
{0x4801, 0, &mqc_states[18], &mqc_states[28]}, {0x4801, 0, &mqc_states[18], &mqc_states[28]},
{0x4801, 1, &mqc_states[19], &mqc_states[29]}, {0x4801, 1, &mqc_states[19], &mqc_states[29]},
{0x3801, 0, &mqc_states[20], &mqc_states[28]}, {0x3801, 0, &mqc_states[20], &mqc_states[28]},
{0x3801, 1, &mqc_states[21], &mqc_states[29]}, {0x3801, 1, &mqc_states[21], &mqc_states[29]},
{0x3001, 0, &mqc_states[22], &mqc_states[34]}, {0x3001, 0, &mqc_states[22], &mqc_states[34]},
{0x3001, 1, &mqc_states[23], &mqc_states[35]}, {0x3001, 1, &mqc_states[23], &mqc_states[35]},
{0x2401, 0, &mqc_states[24], &mqc_states[36]}, {0x2401, 0, &mqc_states[24], &mqc_states[36]},
{0x2401, 1, &mqc_states[25], &mqc_states[37]}, {0x2401, 1, &mqc_states[25], &mqc_states[37]},
{0x1c01, 0, &mqc_states[26], &mqc_states[40]}, {0x1c01, 0, &mqc_states[26], &mqc_states[40]},
{0x1c01, 1, &mqc_states[27], &mqc_states[41]}, {0x1c01, 1, &mqc_states[27], &mqc_states[41]},
{0x1601, 0, &mqc_states[58], &mqc_states[42]}, {0x1601, 0, &mqc_states[58], &mqc_states[42]},
{0x1601, 1, &mqc_states[59], &mqc_states[43]}, {0x1601, 1, &mqc_states[59], &mqc_states[43]},
{0x5601, 0, &mqc_states[30], &mqc_states[29]}, {0x5601, 0, &mqc_states[30], &mqc_states[29]},
{0x5601, 1, &mqc_states[31], &mqc_states[28]}, {0x5601, 1, &mqc_states[31], &mqc_states[28]},
{0x5401, 0, &mqc_states[32], &mqc_states[28]}, {0x5401, 0, &mqc_states[32], &mqc_states[28]},
{0x5401, 1, &mqc_states[33], &mqc_states[29]}, {0x5401, 1, &mqc_states[33], &mqc_states[29]},
{0x5101, 0, &mqc_states[34], &mqc_states[30]}, {0x5101, 0, &mqc_states[34], &mqc_states[30]},
{0x5101, 1, &mqc_states[35], &mqc_states[31]}, {0x5101, 1, &mqc_states[35], &mqc_states[31]},
{0x4801, 0, &mqc_states[36], &mqc_states[32]}, {0x4801, 0, &mqc_states[36], &mqc_states[32]},
{0x4801, 1, &mqc_states[37], &mqc_states[33]}, {0x4801, 1, &mqc_states[37], &mqc_states[33]},
{0x3801, 0, &mqc_states[38], &mqc_states[34]}, {0x3801, 0, &mqc_states[38], &mqc_states[34]},
{0x3801, 1, &mqc_states[39], &mqc_states[35]}, {0x3801, 1, &mqc_states[39], &mqc_states[35]},
{0x3401, 0, &mqc_states[40], &mqc_states[36]}, {0x3401, 0, &mqc_states[40], &mqc_states[36]},
{0x3401, 1, &mqc_states[41], &mqc_states[37]}, {0x3401, 1, &mqc_states[41], &mqc_states[37]},
{0x3001, 0, &mqc_states[42], &mqc_states[38]}, {0x3001, 0, &mqc_states[42], &mqc_states[38]},
{0x3001, 1, &mqc_states[43], &mqc_states[39]}, {0x3001, 1, &mqc_states[43], &mqc_states[39]},
{0x2801, 0, &mqc_states[44], &mqc_states[38]}, {0x2801, 0, &mqc_states[44], &mqc_states[38]},
{0x2801, 1, &mqc_states[45], &mqc_states[39]}, {0x2801, 1, &mqc_states[45], &mqc_states[39]},
{0x2401, 0, &mqc_states[46], &mqc_states[40]}, {0x2401, 0, &mqc_states[46], &mqc_states[40]},
{0x2401, 1, &mqc_states[47], &mqc_states[41]}, {0x2401, 1, &mqc_states[47], &mqc_states[41]},
{0x2201, 0, &mqc_states[48], &mqc_states[42]}, {0x2201, 0, &mqc_states[48], &mqc_states[42]},
{0x2201, 1, &mqc_states[49], &mqc_states[43]}, {0x2201, 1, &mqc_states[49], &mqc_states[43]},
{0x1c01, 0, &mqc_states[50], &mqc_states[44]}, {0x1c01, 0, &mqc_states[50], &mqc_states[44]},
{0x1c01, 1, &mqc_states[51], &mqc_states[45]}, {0x1c01, 1, &mqc_states[51], &mqc_states[45]},
{0x1801, 0, &mqc_states[52], &mqc_states[46]}, {0x1801, 0, &mqc_states[52], &mqc_states[46]},
{0x1801, 1, &mqc_states[53], &mqc_states[47]}, {0x1801, 1, &mqc_states[53], &mqc_states[47]},
{0x1601, 0, &mqc_states[54], &mqc_states[48]}, {0x1601, 0, &mqc_states[54], &mqc_states[48]},
{0x1601, 1, &mqc_states[55], &mqc_states[49]}, {0x1601, 1, &mqc_states[55], &mqc_states[49]},
{0x1401, 0, &mqc_states[56], &mqc_states[50]}, {0x1401, 0, &mqc_states[56], &mqc_states[50]},
{0x1401, 1, &mqc_states[57], &mqc_states[51]}, {0x1401, 1, &mqc_states[57], &mqc_states[51]},
{0x1201, 0, &mqc_states[58], &mqc_states[52]}, {0x1201, 0, &mqc_states[58], &mqc_states[52]},
{0x1201, 1, &mqc_states[59], &mqc_states[53]}, {0x1201, 1, &mqc_states[59], &mqc_states[53]},
{0x1101, 0, &mqc_states[60], &mqc_states[54]}, {0x1101, 0, &mqc_states[60], &mqc_states[54]},
{0x1101, 1, &mqc_states[61], &mqc_states[55]}, {0x1101, 1, &mqc_states[61], &mqc_states[55]},
{0x0ac1, 0, &mqc_states[62], &mqc_states[56]}, {0x0ac1, 0, &mqc_states[62], &mqc_states[56]},
{0x0ac1, 1, &mqc_states[63], &mqc_states[57]}, {0x0ac1, 1, &mqc_states[63], &mqc_states[57]},
{0x09c1, 0, &mqc_states[64], &mqc_states[58]}, {0x09c1, 0, &mqc_states[64], &mqc_states[58]},
{0x09c1, 1, &mqc_states[65], &mqc_states[59]}, {0x09c1, 1, &mqc_states[65], &mqc_states[59]},
{0x08a1, 0, &mqc_states[66], &mqc_states[60]}, {0x08a1, 0, &mqc_states[66], &mqc_states[60]},
{0x08a1, 1, &mqc_states[67], &mqc_states[61]}, {0x08a1, 1, &mqc_states[67], &mqc_states[61]},
{0x0521, 0, &mqc_states[68], &mqc_states[62]}, {0x0521, 0, &mqc_states[68], &mqc_states[62]},
{0x0521, 1, &mqc_states[69], &mqc_states[63]}, {0x0521, 1, &mqc_states[69], &mqc_states[63]},
{0x0441, 0, &mqc_states[70], &mqc_states[64]}, {0x0441, 0, &mqc_states[70], &mqc_states[64]},
{0x0441, 1, &mqc_states[71], &mqc_states[65]}, {0x0441, 1, &mqc_states[71], &mqc_states[65]},
{0x02a1, 0, &mqc_states[72], &mqc_states[66]}, {0x02a1, 0, &mqc_states[72], &mqc_states[66]},
{0x02a1, 1, &mqc_states[73], &mqc_states[67]}, {0x02a1, 1, &mqc_states[73], &mqc_states[67]},
{0x0221, 0, &mqc_states[74], &mqc_states[68]}, {0x0221, 0, &mqc_states[74], &mqc_states[68]},
{0x0221, 1, &mqc_states[75], &mqc_states[69]}, {0x0221, 1, &mqc_states[75], &mqc_states[69]},
{0x0141, 0, &mqc_states[76], &mqc_states[70]}, {0x0141, 0, &mqc_states[76], &mqc_states[70]},
{0x0141, 1, &mqc_states[77], &mqc_states[71]}, {0x0141, 1, &mqc_states[77], &mqc_states[71]},
{0x0111, 0, &mqc_states[78], &mqc_states[72]}, {0x0111, 0, &mqc_states[78], &mqc_states[72]},
{0x0111, 1, &mqc_states[79], &mqc_states[73]}, {0x0111, 1, &mqc_states[79], &mqc_states[73]},
{0x0085, 0, &mqc_states[80], &mqc_states[74]}, {0x0085, 0, &mqc_states[80], &mqc_states[74]},
{0x0085, 1, &mqc_states[81], &mqc_states[75]}, {0x0085, 1, &mqc_states[81], &mqc_states[75]},
{0x0049, 0, &mqc_states[82], &mqc_states[76]}, {0x0049, 0, &mqc_states[82], &mqc_states[76]},
{0x0049, 1, &mqc_states[83], &mqc_states[77]}, {0x0049, 1, &mqc_states[83], &mqc_states[77]},
{0x0025, 0, &mqc_states[84], &mqc_states[78]}, {0x0025, 0, &mqc_states[84], &mqc_states[78]},
{0x0025, 1, &mqc_states[85], &mqc_states[79]}, {0x0025, 1, &mqc_states[85], &mqc_states[79]},
{0x0015, 0, &mqc_states[86], &mqc_states[80]}, {0x0015, 0, &mqc_states[86], &mqc_states[80]},
{0x0015, 1, &mqc_states[87], &mqc_states[81]}, {0x0015, 1, &mqc_states[87], &mqc_states[81]},
{0x0009, 0, &mqc_states[88], &mqc_states[82]}, {0x0009, 0, &mqc_states[88], &mqc_states[82]},
{0x0009, 1, &mqc_states[89], &mqc_states[83]}, {0x0009, 1, &mqc_states[89], &mqc_states[83]},
{0x0005, 0, &mqc_states[90], &mqc_states[84]}, {0x0005, 0, &mqc_states[90], &mqc_states[84]},
{0x0005, 1, &mqc_states[91], &mqc_states[85]}, {0x0005, 1, &mqc_states[91], &mqc_states[85]},
{0x0001, 0, &mqc_states[90], &mqc_states[86]}, {0x0001, 0, &mqc_states[90], &mqc_states[86]},
{0x0001, 1, &mqc_states[91], &mqc_states[87]}, {0x0001, 1, &mqc_states[91], &mqc_states[87]},
{0x5601, 0, &mqc_states[92], &mqc_states[92]}, {0x5601, 0, &mqc_states[92], &mqc_states[92]},
{0x5601, 1, &mqc_states[93], &mqc_states[93]}, {0x5601, 1, &mqc_states[93], &mqc_states[93]},
}; };
/* /*
@ -137,145 +196,145 @@ static opj_mqc_state_t mqc_states[47 * 2] = {
*/ */
static void mqc_byteout(opj_mqc_t *mqc) { static void mqc_byteout(opj_mqc_t *mqc) {
if (*mqc->bp == 0xff) { if (*mqc->bp == 0xff) {
mqc->bp++; mqc->bp++;
*mqc->bp = mqc->c >> 20; *mqc->bp = mqc->c >> 20;
mqc->c &= 0xfffff; mqc->c &= 0xfffff;
mqc->ct = 7; mqc->ct = 7;
} else { } else {
if ((mqc->c & 0x8000000) == 0) { /* ((mqc->c&0x8000000)==0) CHANGE */ if ((mqc->c & 0x8000000) == 0) { /* ((mqc->c&0x8000000)==0) CHANGE */
mqc->bp++; mqc->bp++;
*mqc->bp = mqc->c >> 19; *mqc->bp = mqc->c >> 19;
mqc->c &= 0x7ffff; mqc->c &= 0x7ffff;
mqc->ct = 8; mqc->ct = 8;
} else { } else {
(*mqc->bp)++; (*mqc->bp)++;
if (*mqc->bp == 0xff) { if (*mqc->bp == 0xff) {
mqc->c &= 0x7ffffff; mqc->c &= 0x7ffffff;
mqc->bp++; mqc->bp++;
*mqc->bp = mqc->c >> 20; *mqc->bp = mqc->c >> 20;
mqc->c &= 0xfffff; mqc->c &= 0xfffff;
mqc->ct = 7; mqc->ct = 7;
} else { } else {
mqc->bp++; mqc->bp++;
*mqc->bp = mqc->c >> 19; *mqc->bp = mqc->c >> 19;
mqc->c &= 0x7ffff; mqc->c &= 0x7ffff;
mqc->ct = 8; mqc->ct = 8;
} }
} }
} }
} }
static void mqc_renorme(opj_mqc_t *mqc) { static void mqc_renorme(opj_mqc_t *mqc) {
do { do {
mqc->a <<= 1; mqc->a <<= 1;
mqc->c <<= 1; mqc->c <<= 1;
mqc->ct--; mqc->ct--;
if (mqc->ct == 0) { if (mqc->ct == 0) {
mqc_byteout(mqc); mqc_byteout(mqc);
} }
} while ((mqc->a & 0x8000) == 0); } while ((mqc->a & 0x8000) == 0);
} }
static void mqc_codemps(opj_mqc_t *mqc) { static void mqc_codemps(opj_mqc_t *mqc) {
mqc->a -= (*mqc->curctx)->qeval; mqc->a -= (*mqc->curctx)->qeval;
if ((mqc->a & 0x8000) == 0) { if ((mqc->a & 0x8000) == 0) {
if (mqc->a < (*mqc->curctx)->qeval) { if (mqc->a < (*mqc->curctx)->qeval) {
mqc->a = (*mqc->curctx)->qeval; mqc->a = (*mqc->curctx)->qeval;
} else { } else {
mqc->c += (*mqc->curctx)->qeval; mqc->c += (*mqc->curctx)->qeval;
} }
*mqc->curctx = (*mqc->curctx)->nmps; *mqc->curctx = (*mqc->curctx)->nmps;
mqc_renorme(mqc); mqc_renorme(mqc);
} else { } else {
mqc->c += (*mqc->curctx)->qeval; mqc->c += (*mqc->curctx)->qeval;
} }
} }
static void mqc_codelps(opj_mqc_t *mqc) { static void mqc_codelps(opj_mqc_t *mqc) {
mqc->a -= (*mqc->curctx)->qeval; mqc->a -= (*mqc->curctx)->qeval;
if (mqc->a < (*mqc->curctx)->qeval) { if (mqc->a < (*mqc->curctx)->qeval) {
mqc->c += (*mqc->curctx)->qeval; mqc->c += (*mqc->curctx)->qeval;
} else { } else {
mqc->a = (*mqc->curctx)->qeval; mqc->a = (*mqc->curctx)->qeval;
} }
*mqc->curctx = (*mqc->curctx)->nlps; *mqc->curctx = (*mqc->curctx)->nlps;
mqc_renorme(mqc); mqc_renorme(mqc);
} }
static void mqc_setbits(opj_mqc_t *mqc) { static void mqc_setbits(opj_mqc_t *mqc) {
unsigned int tempc = mqc->c + mqc->a; unsigned int tempc = mqc->c + mqc->a;
mqc->c |= 0xffff; mqc->c |= 0xffff;
if (mqc->c >= tempc) { if (mqc->c >= tempc) {
mqc->c -= 0x8000; mqc->c -= 0x8000;
} }
} }
static int mqc_mpsexchange(opj_mqc_t *mqc) { static int mqc_mpsexchange(opj_mqc_t *mqc) {
int d; int d;
if (mqc->a < (*mqc->curctx)->qeval) { if (mqc->a < (*mqc->curctx)->qeval) {
d = 1 - (*mqc->curctx)->mps; d = 1 - (*mqc->curctx)->mps;
*mqc->curctx = (*mqc->curctx)->nlps; *mqc->curctx = (*mqc->curctx)->nlps;
} else { } else {
d = (*mqc->curctx)->mps; d = (*mqc->curctx)->mps;
*mqc->curctx = (*mqc->curctx)->nmps; *mqc->curctx = (*mqc->curctx)->nmps;
} }
return d; return d;
} }
static int mqc_lpsexchange(opj_mqc_t *mqc) { static int mqc_lpsexchange(opj_mqc_t *mqc) {
int d; int d;
if (mqc->a < (*mqc->curctx)->qeval) { if (mqc->a < (*mqc->curctx)->qeval) {
mqc->a = (*mqc->curctx)->qeval; mqc->a = (*mqc->curctx)->qeval;
d = (*mqc->curctx)->mps; d = (*mqc->curctx)->mps;
*mqc->curctx = (*mqc->curctx)->nmps; *mqc->curctx = (*mqc->curctx)->nmps;
} else { } else {
mqc->a = (*mqc->curctx)->qeval; mqc->a = (*mqc->curctx)->qeval;
d = 1 - (*mqc->curctx)->mps; d = 1 - (*mqc->curctx)->mps;
*mqc->curctx = (*mqc->curctx)->nlps; *mqc->curctx = (*mqc->curctx)->nlps;
} }
return d; return d;
} }
static void mqc_bytein(opj_mqc_t *mqc) { static void mqc_bytein(opj_mqc_t *mqc) {
if (mqc->bp != mqc->end) { if (mqc->bp != mqc->end) {
unsigned int c; unsigned int c;
if (mqc->bp + 1 != mqc->end) { if (mqc->bp + 1 != mqc->end) {
c = *(mqc->bp + 1); c = *(mqc->bp + 1);
} else { } else {
c = 0xff; c = 0xff;
} }
if (*mqc->bp == 0xff) { if (*mqc->bp == 0xff) {
if (c > 0x8f) { if (c > 0x8f) {
mqc->c += 0xff00; mqc->c += 0xff00;
mqc->ct = 8; mqc->ct = 8;
} else { } else {
mqc->bp++; mqc->bp++;
mqc->c += c << 9; mqc->c += c << 9;
mqc->ct = 7; mqc->ct = 7;
} }
} else { } else {
mqc->bp++; mqc->bp++;
mqc->c += c << 8; mqc->c += c << 8;
mqc->ct = 8; mqc->ct = 8;
} }
} else { } else {
mqc->c += 0xff00; mqc->c += 0xff00;
mqc->ct = 8; mqc->ct = 8;
} }
} }
static void mqc_renormd(opj_mqc_t *mqc) { static void mqc_renormd(opj_mqc_t *mqc) {
do { do {
if (mqc->ct == 0) { if (mqc->ct == 0) {
mqc_bytein(mqc); mqc_bytein(mqc);
} }
mqc->a <<= 1; mqc->a <<= 1;
mqc->c <<= 1; mqc->c <<= 1;
mqc->ct--; mqc->ct--;
} while (mqc->a < 0x8000); } while (mqc->a < 0x8000);
} }
/* /*
@ -285,198 +344,198 @@ static void mqc_renormd(opj_mqc_t *mqc) {
*/ */
opj_mqc_t* mqc_create() { opj_mqc_t* mqc_create() {
opj_mqc_t *mqc = (opj_mqc_t*)opj_malloc(sizeof(opj_mqc_t)); opj_mqc_t *mqc = (opj_mqc_t*)opj_malloc(sizeof(opj_mqc_t));
return mqc; return mqc;
} }
void mqc_destroy(opj_mqc_t *mqc) { void mqc_destroy(opj_mqc_t *mqc) {
if(mqc) { if(mqc) {
opj_free(mqc); opj_free(mqc);
} }
} }
int mqc_numbytes(opj_mqc_t *mqc) { int mqc_numbytes(opj_mqc_t *mqc) {
return mqc->bp - mqc->start; return mqc->bp - mqc->start;
} }
void mqc_init_enc(opj_mqc_t *mqc, unsigned char *bp) { void mqc_init_enc(opj_mqc_t *mqc, unsigned char *bp) {
mqc_setcurctx(mqc, 0); mqc_setcurctx(mqc, 0);
mqc->a = 0x8000; mqc->a = 0x8000;
mqc->c = 0; mqc->c = 0;
mqc->bp = bp - 1; mqc->bp = bp - 1;
mqc->ct = 12; mqc->ct = 12;
if (*mqc->bp == 0xff) { if (*mqc->bp == 0xff) {
mqc->ct = 13; mqc->ct = 13;
} }
mqc->start = bp; mqc->start = bp;
} }
void mqc_setcurctx(opj_mqc_t *mqc, int ctxno) { void mqc_setcurctx(opj_mqc_t *mqc, int ctxno) {
mqc->curctx = &mqc->ctxs[ctxno]; mqc->curctx = &mqc->ctxs[ctxno];
} }
void mqc_encode(opj_mqc_t *mqc, int d) { void mqc_encode(opj_mqc_t *mqc, int d) {
if ((*mqc->curctx)->mps == d) { if ((*mqc->curctx)->mps == d) {
mqc_codemps(mqc); mqc_codemps(mqc);
} else { } else {
mqc_codelps(mqc); mqc_codelps(mqc);
} }
} }
void mqc_flush(opj_mqc_t *mqc) { void mqc_flush(opj_mqc_t *mqc) {
mqc_setbits(mqc); mqc_setbits(mqc);
mqc->c <<= mqc->ct; mqc->c <<= mqc->ct;
mqc_byteout(mqc); mqc_byteout(mqc);
mqc->c <<= mqc->ct; mqc->c <<= mqc->ct;
mqc_byteout(mqc); mqc_byteout(mqc);
if (*mqc->bp != 0xff) { if (*mqc->bp != 0xff) {
mqc->bp++; mqc->bp++;
} }
} }
void mqc_bypass_init_enc(opj_mqc_t *mqc) { void mqc_bypass_init_enc(opj_mqc_t *mqc) {
mqc->c = 0; mqc->c = 0;
mqc->ct = 8; mqc->ct = 8;
/*if (*mqc->bp == 0xff) { /*if (*mqc->bp == 0xff) {
mqc->ct = 7; mqc->ct = 7;
} */ } */
} }
void mqc_bypass_enc(opj_mqc_t *mqc, int d) { void mqc_bypass_enc(opj_mqc_t *mqc, int d) {
mqc->ct--; mqc->ct--;
mqc->c = mqc->c + (d << mqc->ct); mqc->c = mqc->c + (d << mqc->ct);
if (mqc->ct == 0) { if (mqc->ct == 0) {
mqc->bp++; mqc->bp++;
*mqc->bp = mqc->c; *mqc->bp = mqc->c;
mqc->ct = 8; mqc->ct = 8;
if (*mqc->bp == 0xff) { if (*mqc->bp == 0xff) {
mqc->ct = 7; mqc->ct = 7;
} }
mqc->c = 0; mqc->c = 0;
} }
} }
int mqc_bypass_flush_enc(opj_mqc_t *mqc) { int mqc_bypass_flush_enc(opj_mqc_t *mqc) {
unsigned char bit_padding; unsigned char bit_padding;
bit_padding = 0; bit_padding = 0;
if (mqc->ct != 0) { if (mqc->ct != 0) {
while (mqc->ct > 0) { while (mqc->ct > 0) {
mqc->ct--; mqc->ct--;
mqc->c += bit_padding << mqc->ct; mqc->c += bit_padding << mqc->ct;
bit_padding = (bit_padding + 1) & 0x01; bit_padding = (bit_padding + 1) & 0x01;
} }
mqc->bp++; mqc->bp++;
*mqc->bp = mqc->c; *mqc->bp = mqc->c;
mqc->ct = 8; mqc->ct = 8;
mqc->c = 0; mqc->c = 0;
} }
return 1; return 1;
} }
void mqc_reset_enc(opj_mqc_t *mqc) { void mqc_reset_enc(opj_mqc_t *mqc) {
mqc_resetstates(mqc); mqc_resetstates(mqc);
mqc_setstate(mqc, 18, 0, 46); mqc_setstate(mqc, 18, 0, 46);
mqc_setstate(mqc, 0, 0, 3); mqc_setstate(mqc, 0, 0, 3);
mqc_setstate(mqc, 1, 0, 4); mqc_setstate(mqc, 1, 0, 4);
} }
int mqc_restart_enc(opj_mqc_t *mqc) { int mqc_restart_enc(opj_mqc_t *mqc) {
int correction = 1; int correction = 1;
/* <flush part> */ /* <flush part> */
int n = 27 - 15 - mqc->ct; int n = 27 - 15 - mqc->ct;
mqc->c <<= mqc->ct; mqc->c <<= mqc->ct;
while (n > 0) { while (n > 0) {
mqc_byteout(mqc); mqc_byteout(mqc);
n -= mqc->ct; n -= mqc->ct;
mqc->c <<= mqc->ct; mqc->c <<= mqc->ct;
} }
mqc_byteout(mqc); mqc_byteout(mqc);
return correction; return correction;
} }
void mqc_restart_init_enc(opj_mqc_t *mqc) { void mqc_restart_init_enc(opj_mqc_t *mqc) {
/* <Re-init part> */ /* <Re-init part> */
mqc_setcurctx(mqc, 0); mqc_setcurctx(mqc, 0);
mqc->a = 0x8000; mqc->a = 0x8000;
mqc->c = 0; mqc->c = 0;
mqc->ct = 12; mqc->ct = 12;
mqc->bp--; mqc->bp--;
if (*mqc->bp == 0xff) { if (*mqc->bp == 0xff) {
mqc->ct = 13; mqc->ct = 13;
} }
} }
void mqc_erterm_enc(opj_mqc_t *mqc) { void mqc_erterm_enc(opj_mqc_t *mqc) {
int k = 11 - mqc->ct + 1; int k = 11 - mqc->ct + 1;
while (k > 0) { while (k > 0) {
mqc->c <<= mqc->ct; mqc->c <<= mqc->ct;
mqc->ct = 0; mqc->ct = 0;
mqc_byteout(mqc); mqc_byteout(mqc);
k -= mqc->ct; k -= mqc->ct;
} }
if (*mqc->bp != 0xff) { if (*mqc->bp != 0xff) {
mqc_byteout(mqc); mqc_byteout(mqc);
} }
} }
void mqc_segmark_enc(opj_mqc_t *mqc) { void mqc_segmark_enc(opj_mqc_t *mqc) {
int i; int i;
mqc_setcurctx(mqc, 18); mqc_setcurctx(mqc, 18);
for (i = 1; i < 5; i++) { for (i = 1; i < 5; i++) {
mqc_encode(mqc, i % 2); mqc_encode(mqc, i % 2);
} }
} }
void mqc_init_dec(opj_mqc_t *mqc, unsigned char *bp, int len) { void mqc_init_dec(opj_mqc_t *mqc, unsigned char *bp, int len) {
mqc_setcurctx(mqc, 0); mqc_setcurctx(mqc, 0);
mqc->start = bp; mqc->start = bp;
mqc->end = bp + len; mqc->end = bp + len;
mqc->bp = bp; mqc->bp = bp;
if (len==0) mqc->c = 0xff << 16; if (len==0) mqc->c = 0xff << 16;
else mqc->c = *mqc->bp << 16; else mqc->c = *mqc->bp << 16;
mqc_bytein(mqc); mqc_bytein(mqc);
mqc->c <<= 7; mqc->c <<= 7;
mqc->ct -= 7; mqc->ct -= 7;
mqc->a = 0x8000; mqc->a = 0x8000;
} }
int mqc_decode(opj_mqc_t *mqc) { int mqc_decode(opj_mqc_t *mqc) {
int d; int d;
mqc->a -= (*mqc->curctx)->qeval; mqc->a -= (*mqc->curctx)->qeval;
if ((mqc->c >> 16) < (*mqc->curctx)->qeval) { if ((mqc->c >> 16) < (*mqc->curctx)->qeval) {
d = mqc_lpsexchange(mqc); d = mqc_lpsexchange(mqc);
mqc_renormd(mqc); mqc_renormd(mqc);
} else { } else {
mqc->c -= (*mqc->curctx)->qeval << 16; mqc->c -= (*mqc->curctx)->qeval << 16;
if ((mqc->a & 0x8000) == 0) { if ((mqc->a & 0x8000) == 0) {
d = mqc_mpsexchange(mqc); d = mqc_mpsexchange(mqc);
mqc_renormd(mqc); mqc_renormd(mqc);
} else { } else {
d = (*mqc->curctx)->mps; d = (*mqc->curctx)->mps;
} }
} }
return d; return d;
} }
void mqc_resetstates(opj_mqc_t *mqc) { void mqc_resetstates(opj_mqc_t *mqc) {
int i; int i;
for (i = 0; i < MQC_NUMCTXS; i++) { for (i = 0; i < MQC_NUMCTXS; i++) {
mqc->ctxs[i] = mqc_states; mqc->ctxs[i] = mqc_states;
} }
} }
void mqc_setstate(opj_mqc_t *mqc, int ctxno, int msb, int prob) { void mqc_setstate(opj_mqc_t *mqc, int ctxno, int msb, int prob) {
mqc->ctxs[ctxno] = &mqc_states[msb + (prob << 1)]; mqc->ctxs[ctxno] = &mqc_states[msb + (prob << 1)];
} }

View File

@ -2,7 +2,7 @@
* Copyright (c) 2001-2003, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team * Copyright (c) 2005, Hervé Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
@ -45,14 +45,14 @@ in MQC.C are used by some function in T1.C.
This struct defines the state of a context. This struct defines the state of a context.
*/ */
typedef struct opj_mqc_state { typedef struct opj_mqc_state {
/** the probability of the Least Probable Symbol (0.75->0x8000, 1.5->0xffff) */ /** the probability of the Least Probable Symbol (0.75->0x8000, 1.5->0xffff) */
unsigned int qeval; unsigned int qeval;
/** the Most Probable Symbol (0 or 1) */ /** the Most Probable Symbol (0 or 1) */
int mps; int mps;
/** next state if the next encoded symbol is the MPS */ /** next state if the next encoded symbol is the MPS */
struct opj_mqc_state *nmps; struct opj_mqc_state *nmps;
/** next state if the next encoded symbol is the LPS */ /** next state if the next encoded symbol is the LPS */
struct opj_mqc_state *nlps; struct opj_mqc_state *nlps;
} opj_mqc_state_t; } opj_mqc_state_t;
#define MQC_NUMCTXS 32 #define MQC_NUMCTXS 32
@ -61,70 +61,16 @@ typedef struct opj_mqc_state {
MQ coder MQ coder
*/ */
typedef struct opj_mqc { typedef struct opj_mqc {
unsigned int c; unsigned int c;
unsigned int a; unsigned int a;
unsigned int ct; unsigned int ct;
unsigned char *bp; unsigned char *bp;
unsigned char *start; unsigned char *start;
unsigned char *end; unsigned char *end;
opj_mqc_state_t *ctxs[MQC_NUMCTXS]; opj_mqc_state_t *ctxs[MQC_NUMCTXS];
opj_mqc_state_t **curctx; opj_mqc_state_t **curctx;
} opj_mqc_t; } opj_mqc_t;
/** @name Local static functions */
/*@{*/
/* ----------------------------------------------------------------------- */
/**
Output a byte, doing bit-stuffing if necessary.
After a 0xff byte, the next byte must be smaller than 0x90.
@param mqc MQC handle
*/
static void mqc_byteout(opj_mqc_t *mqc);
/**
Renormalize mqc->a and mqc->c while encoding, so that mqc->a stays between 0x8000 and 0x10000
@param mqc MQC handle
*/
static void mqc_renorme(opj_mqc_t *mqc);
/**
Encode the most probable symbol
@param mqc MQC handle
*/
static void mqc_codemps(opj_mqc_t *mqc);
/**
Encode the most least symbol
@param mqc MQC handle
*/
static void mqc_codelps(opj_mqc_t *mqc);
/**
Fill mqc->c with 1's for flushing
@param mqc MQC handle
*/
static void mqc_setbits(opj_mqc_t *mqc);
/**
FIXME: documentation ???
@param mqc MQC handle
@return
*/
static int mqc_mpsexchange(opj_mqc_t *mqc);
/**
FIXME: documentation ???
@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);
/* ----------------------------------------------------------------------- */
/*@}*/
/** @name Exported functions */ /** @name Exported functions */
/*@{*/ /*@{*/
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */

View File

@ -24,187 +24,190 @@
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "opj_includes.h" #include "opj_includes.h"
const char * opj_version() {
return OPENJPEG_VERSION;
}
opj_dinfo_t* opj_create_decompress(OPJ_CODEC_FORMAT format) { opj_dinfo_t* opj_create_decompress(OPJ_CODEC_FORMAT format) {
opj_dinfo_t *dinfo = (opj_dinfo_t*)opj_malloc(sizeof(opj_dinfo_t)); opj_dinfo_t *dinfo = (opj_dinfo_t*)opj_malloc(sizeof(opj_dinfo_t));
if(!dinfo) return NULL; if(!dinfo) return NULL;
dinfo->is_decompressor = true; dinfo->is_decompressor = true;
switch(format) { switch(format) {
case CODEC_J2K: case CODEC_J2K:
case CODEC_JPT: case CODEC_JPT:
/* get a J2K decoder handle */ /* get a J2K decoder handle */
dinfo->j2k_handle = (void*)j2k_create_decompress((opj_common_ptr)dinfo); dinfo->j2k_handle = (void*)j2k_create_decompress((opj_common_ptr)dinfo);
if(!dinfo->j2k_handle) { if(!dinfo->j2k_handle) {
opj_free(dinfo); opj_free(dinfo);
return NULL; return NULL;
} }
break; break;
case CODEC_JP2: case CODEC_JP2:
/* get a JP2 decoder handle */ /* get a JP2 decoder handle */
dinfo->jp2_handle = (void*)jp2_create_decompress((opj_common_ptr)dinfo); dinfo->jp2_handle = (void*)jp2_create_decompress((opj_common_ptr)dinfo);
if(!dinfo->jp2_handle) { if(!dinfo->jp2_handle) {
opj_free(dinfo); opj_free(dinfo);
return NULL; return NULL;
} }
break; break;
default: default:
opj_free(dinfo); opj_free(dinfo);
return NULL; return NULL;
} }
dinfo->codec_format = format; dinfo->codec_format = format;
return dinfo; return dinfo;
} }
void opj_destroy_decompress(opj_dinfo_t *dinfo) { void opj_destroy_decompress(opj_dinfo_t *dinfo) {
if(dinfo) { if(dinfo) {
/* destroy the codec */ /* destroy the codec */
switch(dinfo->codec_format) { switch(dinfo->codec_format) {
case CODEC_J2K: case CODEC_J2K:
case CODEC_JPT: case CODEC_JPT:
j2k_destroy_decompress((opj_j2k_t*)dinfo->j2k_handle); j2k_destroy_decompress((opj_j2k_t*)dinfo->j2k_handle);
break; break;
case CODEC_JP2: case CODEC_JP2:
jp2_destroy_decompress((opj_jp2_t*)dinfo->jp2_handle); jp2_destroy_decompress((opj_jp2_t*)dinfo->jp2_handle);
break; break;
} }
/* destroy the decompressor */ /* destroy the decompressor */
opj_free(dinfo); opj_free(dinfo);
} }
} }
void opj_set_default_decoder_parameters(opj_dparameters_t *parameters) { void opj_set_default_decoder_parameters(opj_dparameters_t *parameters) {
if(parameters) { if(parameters) {
memset(parameters, 0, sizeof(opj_dparameters_t)); memset(parameters, 0, sizeof(opj_dparameters_t));
/* default decoding parameters */ /* default decoding parameters */
parameters->cp_layer = 0; parameters->cp_layer = 0;
parameters->cp_reduce = 0; parameters->cp_reduce = 0;
parameters->decod_format = -1; parameters->decod_format = -1;
parameters->cod_format = -1; parameters->cod_format = -1;
} }
} }
void opj_setup_decoder(opj_dinfo_t *dinfo, opj_dparameters_t *parameters) { void opj_setup_decoder(opj_dinfo_t *dinfo, opj_dparameters_t *parameters) {
if(dinfo && parameters) { if(dinfo && parameters) {
switch(dinfo->codec_format) { switch(dinfo->codec_format) {
case CODEC_J2K: case CODEC_J2K:
case CODEC_JPT: case CODEC_JPT:
j2k_setup_decoder((opj_j2k_t*)dinfo->j2k_handle, parameters); j2k_setup_decoder((opj_j2k_t*)dinfo->j2k_handle, parameters);
break; break;
case CODEC_JP2: case CODEC_JP2:
jp2_setup_decoder((opj_jp2_t*)dinfo->jp2_handle, parameters); jp2_setup_decoder((opj_jp2_t*)dinfo->jp2_handle, parameters);
break; break;
} }
} }
} }
opj_image_t* opj_decode(opj_dinfo_t *dinfo, opj_cio_t *cio) { opj_image_t* opj_decode(opj_dinfo_t *dinfo, opj_cio_t *cio) {
if(dinfo && cio) { if(dinfo && cio) {
switch(dinfo->codec_format) { switch(dinfo->codec_format) {
case CODEC_J2K: case CODEC_J2K:
return j2k_decode((opj_j2k_t*)dinfo->j2k_handle, cio); return j2k_decode((opj_j2k_t*)dinfo->j2k_handle, cio);
case CODEC_JPT: case CODEC_JPT:
return j2k_decode_jpt_stream((opj_j2k_t*)dinfo->j2k_handle, cio); return j2k_decode_jpt_stream((opj_j2k_t*)dinfo->j2k_handle, cio);
case CODEC_JP2: case CODEC_JP2:
return jp2_decode((opj_jp2_t*)dinfo->jp2_handle, cio); return jp2_decode((opj_jp2_t*)dinfo->jp2_handle, cio);
} }
} }
return NULL; return NULL;
} }
opj_cinfo_t* opj_create_compress(OPJ_CODEC_FORMAT format) { opj_cinfo_t* opj_create_compress(OPJ_CODEC_FORMAT format) {
opj_cinfo_t *cinfo = (opj_cinfo_t*)opj_malloc(sizeof(opj_cinfo_t)); opj_cinfo_t *cinfo = (opj_cinfo_t*)opj_malloc(sizeof(opj_cinfo_t));
if(!cinfo) return NULL; if(!cinfo) return NULL;
cinfo->is_decompressor = false; cinfo->is_decompressor = false;
switch(format) { switch(format) {
case CODEC_J2K: case CODEC_J2K:
/* get a J2K coder handle */ /* get a J2K coder handle */
cinfo->j2k_handle = (void*)j2k_create_compress((opj_common_ptr)cinfo); cinfo->j2k_handle = (void*)j2k_create_compress((opj_common_ptr)cinfo);
if(!cinfo->j2k_handle) { if(!cinfo->j2k_handle) {
opj_free(cinfo); opj_free(cinfo);
return NULL; return NULL;
} }
break; break;
case CODEC_JP2: case CODEC_JP2:
/* get a JP2 coder handle */ /* get a JP2 coder handle */
cinfo->jp2_handle = (void*)jp2_create_compress((opj_common_ptr)cinfo); cinfo->jp2_handle = (void*)jp2_create_compress((opj_common_ptr)cinfo);
if(!cinfo->jp2_handle) { if(!cinfo->jp2_handle) {
opj_free(cinfo); opj_free(cinfo);
return NULL; return NULL;
} }
break; break;
default: default:
opj_free(cinfo); opj_free(cinfo);
return NULL; return NULL;
} }
cinfo->codec_format = format; cinfo->codec_format = format;
return cinfo; return cinfo;
} }
void opj_destroy_compress(opj_cinfo_t *cinfo) { void opj_destroy_compress(opj_cinfo_t *cinfo) {
if(cinfo) { if(cinfo) {
/* destroy the codec */ /* destroy the codec */
switch(cinfo->codec_format) { switch(cinfo->codec_format) {
case CODEC_J2K: case CODEC_J2K:
j2k_destroy_decompress((opj_j2k_t*)cinfo->j2k_handle); j2k_destroy_decompress((opj_j2k_t*)cinfo->j2k_handle);
break; break;
case CODEC_JP2: case CODEC_JP2:
jp2_destroy_decompress((opj_jp2_t*)cinfo->jp2_handle); jp2_destroy_decompress((opj_jp2_t*)cinfo->jp2_handle);
break; break;
} }
/* destroy the decompressor */ /* destroy the decompressor */
opj_free(cinfo); opj_free(cinfo);
} }
} }
void opj_set_default_encoder_parameters(opj_cparameters_t *parameters) { void opj_set_default_encoder_parameters(opj_cparameters_t *parameters) {
if(parameters) { if(parameters) {
memset(parameters, 0, sizeof(opj_cparameters_t)); memset(parameters, 0, sizeof(opj_cparameters_t));
/* default coding parameters */ /* default coding parameters */
parameters->numresolution = 6; parameters->numresolution = 6;
parameters->cblockw_init = 64; parameters->cblockw_init = 64;
parameters->cblockh_init = 64; parameters->cblockh_init = 64;
parameters->prog_order = LRCP; parameters->prog_order = LRCP;
parameters->roi_compno = -1; /* no ROI */ parameters->roi_compno = -1; /* no ROI */
parameters->subsampling_dx = 1; parameters->subsampling_dx = 1;
parameters->subsampling_dy = 1; parameters->subsampling_dy = 1;
parameters->decod_format = -1; parameters->decod_format = -1;
parameters->cod_format = -1; parameters->cod_format = -1;
} }
} }
void opj_setup_encoder(opj_cinfo_t *cinfo, opj_cparameters_t *parameters, opj_image_t *image) { void opj_setup_encoder(opj_cinfo_t *cinfo, opj_cparameters_t *parameters, opj_image_t *image) {
if(cinfo && parameters && image) { if(cinfo && parameters && image) {
switch(cinfo->codec_format) { switch(cinfo->codec_format) {
case CODEC_J2K: case CODEC_J2K:
j2k_setup_encoder((opj_j2k_t*)cinfo->j2k_handle, parameters, image); j2k_setup_encoder((opj_j2k_t*)cinfo->j2k_handle, parameters, image);
break; break;
case CODEC_JP2: case CODEC_JP2:
jp2_setup_encoder((opj_jp2_t*)cinfo->jp2_handle, parameters, image); jp2_setup_encoder((opj_jp2_t*)cinfo->jp2_handle, parameters, image);
break; break;
} }
} }
} }
bool opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, char *index) { bool opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, char *index) {
if(cinfo && cio && image) { if(cinfo && cio && image) {
switch(cinfo->codec_format) { switch(cinfo->codec_format) {
case CODEC_J2K: case CODEC_J2K:
return j2k_encode((opj_j2k_t*)cinfo->j2k_handle, cio, image, index); return j2k_encode((opj_j2k_t*)cinfo->j2k_handle, cio, image, index);
case CODEC_JP2: case CODEC_JP2:
return jp2_encode((opj_jp2_t*)cinfo->jp2_handle, cio, image, index); return jp2_encode((opj_jp2_t*)cinfo->jp2_handle, cio, image, index);
} }
} }
return false; return false;
} }

View File

@ -2,7 +2,7 @@
* Copyright (c) 2001-2003, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team * Copyright (c) 2005, Hervé Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
@ -27,11 +27,11 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#ifndef OPENJPEG_H #ifndef OPENJPEG_H
#define OPENJPEG_H #define OPENJPEG_H
#define OPENJPEG_VERSION "1.0.0"
/* /*
========================================================== ==========================================================
Compiler directives Compiler directives
@ -51,13 +51,13 @@ The C language implementation does not provide the standard header file
braindamage below. braindamage below.
*/ */
#if !defined(bool) #if !defined(bool)
#define bool int #define bool int
#endif #endif
#if !defined(true) #if !defined(true)
#define true 1 #define true 1
#endif #endif
#if !defined(false) #if !defined(false)
#define false 0 #define false 0
#endif #endif
#endif #endif
#endif /* __cplusplus */ #endif /* __cplusplus */
@ -69,11 +69,11 @@ braindamage below.
*/ */
#ifndef MAX_PATH #ifndef MAX_PATH
#define MAX_PATH 260 /**< Maximum allowed size for filenames */ #define MAX_PATH 260 /**< Maximum allowed size for filenames */
#endif /* MAX_PATH */ #endif /* MAX_PATH */
#define J2K_MAXRLVLS 33 /**< Number of maximum resolution level authorized */ #define J2K_MAXRLVLS 33 /**< Number of maximum resolution level authorized */
#define J2K_MAXBANDS (3*J2K_MAXRLVLS-2) /**< Number of maximum sub-band linked to number of resolution level */ #define J2K_MAXBANDS (3*J2K_MAXRLVLS-2) /**< Number of maximum sub-band linked to number of resolution level */
/* /*
========================================================== ==========================================================
@ -83,32 +83,32 @@ braindamage below.
/** Progression order */ /** Progression order */
typedef enum PROG_ORDER { typedef enum PROG_ORDER {
PROG_UNKNOWN = -1, /**< place-holder */ PROG_UNKNOWN = -1, /**< place-holder */
LRCP = 0, /**< layer-resolution-component-precinct order */ LRCP = 0, /**< layer-resolution-component-precinct order */
RLCP = 1, /**< resolution-layer-component-precinct order */ RLCP = 1, /**< resolution-layer-component-precinct order */
RPCL = 2, /**< resolution-precinct-component-layer order */ RPCL = 2, /**< resolution-precinct-component-layer order */
PCRL = 3, /**< precinct-component-resolution-layer order */ PCRL = 3, /**< precinct-component-resolution-layer order */
CPRL = 4 /**< component-precinct-resolution-layer order */ CPRL = 4 /**< component-precinct-resolution-layer order */
} OPJ_PROG_ORDER; } OPJ_PROG_ORDER;
/** /**
Supported image color spaces Supported image color spaces
*/ */
typedef enum COLOR_SPACE { typedef enum COLOR_SPACE {
CLRSPC_UNKNOWN = -1, /**< place-holder */ CLRSPC_UNKNOWN = -1, /**< place-holder */
CLRSPC_SRGB = 1, /**< sRGB */ CLRSPC_SRGB = 1, /**< sRGB */
CLRSPC_GRAY = 2, /**< grayscale */ CLRSPC_GRAY = 2, /**< grayscale */
CLRSPC_SYCC = 3 /**< YUV */ CLRSPC_SYCC = 3 /**< YUV */
} OPJ_COLOR_SPACE; } OPJ_COLOR_SPACE;
/** /**
Supported codec Supported codec
*/ */
typedef enum CODEC_FORMAT { typedef enum CODEC_FORMAT {
CODEC_UNKNOWN = -1, /**< place-holder */ CODEC_UNKNOWN = -1, /**< place-holder */
CODEC_J2K = 0, /**< JPEG-2000 codestream : read/write */ CODEC_J2K = 0, /**< JPEG-2000 codestream : read/write */
CODEC_JPT = 1, /**< JPT-stream (JPEG 2000, JPIP) : read only */ CODEC_JPT = 1, /**< JPT-stream (JPEG 2000, JPIP) : read only */
CODEC_JP2 = 2 /**< JPEG-2000 file format : read/write */ CODEC_JP2 = 2 /**< JPEG-2000 file format : read/write */
} OPJ_CODEC_FORMAT; } OPJ_CODEC_FORMAT;
/* /*
@ -134,12 +134,12 @@ used for
</ul> </ul>
*/ */
typedef struct opj_event_mgr { typedef struct opj_event_mgr {
/** Error message callback if available, NULL otherwise */ /** Error message callback if available, NULL otherwise */
opj_msg_callback error_handler; opj_msg_callback error_handler;
/** Warning message callback if available, NULL otherwise */ /** Warning message callback if available, NULL otherwise */
opj_msg_callback warning_handler; opj_msg_callback warning_handler;
/** Debug message callback if available, NULL otherwise */ /** Debug message callback if available, NULL otherwise */
opj_msg_callback info_handler; opj_msg_callback info_handler;
} opj_event_mgr_t; } opj_event_mgr_t;
@ -164,135 +164,135 @@ typedef struct opj_poc {
Compression parameters Compression parameters
*/ */
typedef struct opj_cparameters { typedef struct opj_cparameters {
/** size of tile: tile_size_on = false (not in argument) or = true (in argument) */ /** size of tile: tile_size_on = false (not in argument) or = true (in argument) */
bool tile_size_on; bool tile_size_on;
/** XTOsiz */ /** XTOsiz */
int cp_tx0; int cp_tx0;
/** YTOsiz */ /** YTOsiz */
int cp_ty0; int cp_ty0;
/** XTsiz */ /** XTsiz */
int cp_tdx; int cp_tdx;
/** YTsiz */ /** YTsiz */
int cp_tdy; int cp_tdy;
/** allocation by rate/distortion */ /** allocation by rate/distortion */
int cp_disto_alloc; int cp_disto_alloc;
/** allocation by fixed layer */ /** allocation by fixed layer */
int cp_fixed_alloc; int cp_fixed_alloc;
/** add fixed_quality */ /** add fixed_quality */
int cp_fixed_quality; int cp_fixed_quality;
/** fixed layer */ /** fixed layer */
int *cp_matrice; int *cp_matrice;
/** comment for coding */ /** comment for coding */
char *cp_comment; char *cp_comment;
/** csty : coding style */ /** csty : coding style */
int csty; int csty;
/** progression order (default LRCP) */ /** progression order (default LRCP) */
OPJ_PROG_ORDER prog_order; OPJ_PROG_ORDER prog_order;
/** progression order changes */ /** progression order changes */
opj_poc_t POC[32]; opj_poc_t POC[32];
/** number of progression order changes (POC), default to 0 */ /** number of progression order changes (POC), default to 0 */
int numpocs; int numpocs;
/** number of layers */ /** number of layers */
int tcp_numlayers; int tcp_numlayers;
/** rates of layers */ /** rates of layers */
int tcp_rates[100]; int tcp_rates[100];
/** different psnr for successive layers */ /** different psnr for successive layers */
float tcp_distoratio[100]; float tcp_distoratio[100];
/** number of resolutions */ /** number of resolutions */
int numresolution; int numresolution;
/** initial code block width, default to 64 */ /** initial code block width, default to 64 */
int cblockw_init; int cblockw_init;
/** initial code block height, default to 64 */ /** initial code block height, default to 64 */
int cblockh_init; int cblockh_init;
/** mode switch (cblk_style) */ /** mode switch (cblk_style) */
int mode; int mode;
/** 1 : use the irreversible DWT 9-7, 0 : use lossless compression (default) */ /** 1 : use the irreversible DWT 9-7, 0 : use lossless compression (default) */
int irreversible; int irreversible;
/** region of interest: affected component in [0..3], -1 means no ROI */ /** region of interest: affected component in [0..3], -1 means no ROI */
int roi_compno; int roi_compno;
/** region of interest: upshift value */ /** region of interest: upshift value */
int roi_shift; int roi_shift;
/* number of precinct size specifications */ /* number of precinct size specifications */
int res_spec; int res_spec;
/** initial precinct width */ /** initial precinct width */
int prcw_init[J2K_MAXRLVLS]; int prcw_init[J2K_MAXRLVLS];
/** initial precinct height */ /** initial precinct height */
int prch_init[J2K_MAXRLVLS]; int prch_init[J2K_MAXRLVLS];
/**@name command line encoder parameters (not used inside the library) */ /**@name command line encoder parameters (not used inside the library) */
/*@{*/ /*@{*/
/** input file name */ /** input file name */
char infile[MAX_PATH]; char infile[MAX_PATH];
/** output file name */ /** output file name */
char outfile[MAX_PATH]; char outfile[MAX_PATH];
/** creation of an index file, default to 0 (false) */ /** creation of an index file, default to 0 (false) */
int index_on; int index_on;
/** index file name */ /** index file name */
char index[MAX_PATH]; char index[MAX_PATH];
/** subimage encoding: origin image offset in x direction */ /** subimage encoding: origin image offset in x direction */
int image_offset_x0; int image_offset_x0;
/** subimage encoding: origin image offset in y direction */ /** subimage encoding: origin image offset in y direction */
int image_offset_y0; int image_offset_y0;
/** subsampling value for dx */ /** subsampling value for dx */
int subsampling_dx; int subsampling_dx;
/** subsampling value for dy */ /** subsampling value for dy */
int subsampling_dy; int subsampling_dy;
/** input file format 0: PGX, 1: PxM, 2: BMP */ /** input file format 0: PGX, 1: PxM, 2: BMP */
int decod_format; int decod_format;
/** output file format 0: J2K, 1: JP2, 2: JPT */ /** output file format 0: J2K, 1: JP2, 2: JPT */
int cod_format; int cod_format;
/*@}*/ /*@}*/
} opj_cparameters_t; } opj_cparameters_t;
/** /**
Decompression parameters Decompression parameters
*/ */
typedef struct opj_dparameters { typedef struct opj_dparameters {
/** /**
Set the number of highest resolution levels to be discarded. Set the number of highest resolution levels to be discarded.
The image resolution is effectively divided by 2 to the power of the number of discarded levels. The image resolution is effectively divided by 2 to the power of the number of discarded levels.
The reduce factor is limited by the smallest total number of decomposition levels among tiles. The reduce factor is limited by the smallest total number of decomposition levels among tiles.
if != 0, then original dimension divided by 2^(reduce); if != 0, then original dimension divided by 2^(reduce);
if == 0 or not used, image is decoded to the full resolution if == 0 or not used, image is decoded to the full resolution
*/ */
int cp_reduce; int cp_reduce;
/** /**
Set the maximum number of quality layers to decode. Set the maximum number of quality layers to decode.
If there are less quality layers than the specified number, all the quality layers are decoded. If there are less quality layers than the specified number, all the quality layers are decoded.
if != 0, then only the first "layer" layers are decoded; if != 0, then only the first "layer" layers are decoded;
if == 0 or not used, all the quality layers are decoded if == 0 or not used, all the quality layers are decoded
*/ */
int cp_layer; int cp_layer;
/**@name command line encoder parameters (not used inside the library) */ /**@name command line encoder parameters (not used inside the library) */
/*@{*/ /*@{*/
/** input file name */ /** input file name */
char infile[MAX_PATH]; char infile[MAX_PATH];
/** output file name */ /** output file name */
char outfile[MAX_PATH]; char outfile[MAX_PATH];
/** input file format 0: J2K, 1: JP2, 2: JPT */ /** input file format 0: J2K, 1: JP2, 2: JPT */
int decod_format; int decod_format;
/** output file format 0: PGX, 1: PxM, 2: BMP */ /** output file format 0: PGX, 1: PxM, 2: BMP */
int cod_format; int cod_format;
/*@}*/ /*@}*/
} opj_dparameters_t; } opj_dparameters_t;
/** Common fields between JPEG-2000 compression and decompression master structs. */ /** Common fields between JPEG-2000 compression and decompression master structs. */
#define opj_common_fields \ #define opj_common_fields \
opj_event_mgr_t *event_mgr; /**< pointer to the event manager */\ opj_event_mgr_t *event_mgr; /**< pointer to the event manager */\
void * client_data; /**< Available for use by application */\ void * client_data; /**< Available for use by application */\
bool is_decompressor; /**< So common code can tell which is which */\ bool is_decompressor; /**< So common code can tell which is which */\
OPJ_CODEC_FORMAT codec_format; /**< selected codec */\ OPJ_CODEC_FORMAT codec_format; /**< selected codec */\
void *j2k_handle; /**< pointer to the J2K codec */\ void *j2k_handle; /**< pointer to the J2K codec */\
void *jp2_handle /**< pointer to the JP2 codec */ void *jp2_handle /**< pointer to the JP2 codec */
/* Routines that are to be used by both halves of the library are declared /* 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 * 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. * opj_common_struct_t, only of opj_cinfo_t and opj_dinfo_t.
*/ */
typedef struct opj_common_struct { typedef struct opj_common_struct {
opj_common_fields; /* Fields common to both master struct types */ opj_common_fields; /* Fields common to both master struct types */
/* Additional fields follow in an actual opj_cinfo_t or /* Additional fields follow in an actual opj_cinfo_t or
* opj_dinfo_t. All three structs must agree on these * opj_dinfo_t. All three structs must agree on these
* initial fields! (This would be a lot cleaner in C++.) * initial fields! (This would be a lot cleaner in C++.)
@ -305,18 +305,18 @@ typedef opj_common_struct_t * opj_common_ptr;
Compression context info Compression context info
*/ */
typedef struct opj_cinfo { typedef struct opj_cinfo {
/** Fields shared with opj_dinfo_t */ /** Fields shared with opj_dinfo_t */
opj_common_fields; opj_common_fields;
/* other specific fields go here */ /* other specific fields go here */
} opj_cinfo_t; } opj_cinfo_t;
/** /**
Decompression context info Decompression context info
*/ */
typedef struct opj_dinfo { typedef struct opj_dinfo {
/** Fields shared with opj_cinfo_t */ /** Fields shared with opj_cinfo_t */
opj_common_fields; opj_common_fields;
/* other specific fields go here */ /* other specific fields go here */
} opj_dinfo_t; } opj_dinfo_t;
/* /*
@ -329,7 +329,7 @@ typedef struct opj_dinfo {
* Stream open flags. * Stream open flags.
*/ */
/** The stream was opened for reading. */ /** The stream was opened for reading. */
#define OPJ_STREAM_READ 0x0001 #define OPJ_STREAM_READ 0x0001
/** The stream was opened for writing. */ /** The stream was opened for writing. */
#define OPJ_STREAM_WRITE 0x0002 #define OPJ_STREAM_WRITE 0x0002
@ -337,22 +337,22 @@ typedef struct opj_dinfo {
Byte input-output stream (CIO) Byte input-output stream (CIO)
*/ */
typedef struct opj_cio { typedef struct opj_cio {
/** codec context */ /** codec context */
opj_common_ptr cinfo; opj_common_ptr cinfo;
/** open mode (read/write) either OPJ_STREAM_READ or OPJ_STREAM_WRITE */ /** open mode (read/write) either OPJ_STREAM_READ or OPJ_STREAM_WRITE */
int openmode; int openmode;
/** pointer to the start of the buffer */ /** pointer to the start of the buffer */
unsigned char *buffer; unsigned char *buffer;
/** buffer size in bytes */ /** buffer size in bytes */
int length; int length;
/** pointer to the start of the stream */ /** pointer to the start of the stream */
unsigned char *start; unsigned char *start;
/** pointer to the end of the stream */ /** pointer to the end of the stream */
unsigned char *end; unsigned char *end;
/** pointer to the current position */ /** pointer to the current position */
unsigned char *bp; unsigned char *bp;
} opj_cio_t; } opj_cio_t;
/* /*
@ -365,80 +365,89 @@ typedef struct opj_cio {
Defines a single image component Defines a single image component
*/ */
typedef struct opj_image_comp { typedef struct opj_image_comp {
/** XRsiz: horizontal separation of a sample of ith component with respect to the reference grid */ /** XRsiz: horizontal separation of a sample of ith component with respect to the reference grid */
int dx; int dx;
/** YRsiz: vertical separation of a sample of ith component with respect to the reference grid */ /** YRsiz: vertical separation of a sample of ith component with respect to the reference grid */
int dy; int dy;
/** data width */ /** data width */
int w; int w;
/** data height */ /** data height */
int h; int h;
/** x component offset compared to the whole image */ /** x component offset compared to the whole image */
int x0; int x0;
/** y component offset compared to the whole image */ /** y component offset compared to the whole image */
int y0; int y0;
/** precision */ /** precision */
int prec; int prec;
/** image depth in bits */ /** image depth in bits */
int bpp; int bpp;
/** signed (1) / unsigned (0) */ /** signed (1) / unsigned (0) */
int sgnd; int sgnd;
/** number of decoded resolution */ /** number of decoded resolution */
int resno_decoded; int resno_decoded;
/** number of division by 2 of the out image compared to the original size of image */ /** number of division by 2 of the out image compared to the original size of image */
int factor; int factor;
/** image component data */ /** image component data */
int *data; int *data;
} opj_image_comp_t; } opj_image_comp_t;
/** /**
Defines image data and characteristics Defines image data and characteristics
*/ */
typedef struct opj_image { typedef struct opj_image {
/** XOsiz: horizontal offset from the origin of the reference grid to the left side of the image area */ /** XOsiz: horizontal offset from the origin of the reference grid to the left side of the image area */
int x0; int x0;
/** YOsiz: vertical offset from the origin of the reference grid to the top side of the image area */ /** YOsiz: vertical offset from the origin of the reference grid to the top side of the image area */
int y0; int y0;
/** Xsiz: width of the reference grid */ /** Xsiz: width of the reference grid */
int x1; int x1;
/** Ysiz: height of the reference grid */ /** Ysiz: height of the reference grid */
int y1; int y1;
/** number of components in the image */ /** number of components in the image */
int numcomps; int numcomps;
/** color space: sRGB, Greyscale or YUV */ /** color space: sRGB, Greyscale or YUV */
OPJ_COLOR_SPACE color_space; OPJ_COLOR_SPACE color_space;
/** image components */ /** image components */
opj_image_comp_t *comps; opj_image_comp_t *comps;
} opj_image_t; } opj_image_t;
/** /**
Component parameters structure used by the opj_image_create function Component parameters structure used by the opj_image_create function
*/ */
typedef struct opj_image_comptparm { typedef struct opj_image_comptparm {
/** XRsiz: horizontal separation of a sample of ith component with respect to the reference grid */ /** XRsiz: horizontal separation of a sample of ith component with respect to the reference grid */
int dx; int dx;
/** YRsiz: vertical separation of a sample of ith component with respect to the reference grid */ /** YRsiz: vertical separation of a sample of ith component with respect to the reference grid */
int dy; int dy;
/** data width */ /** data width */
int w; int w;
/** data height */ /** data height */
int h; int h;
/** x component offset compared to the whole image */ /** x component offset compared to the whole image */
int x0; int x0;
/** y component offset compared to the whole image */ /** y component offset compared to the whole image */
int y0; int y0;
/** precision */ /** precision */
int prec; int prec;
/** image depth in bits */ /** image depth in bits */
int bpp; int bpp;
/** signed (1) / unsigned (0) */ /** signed (1) / unsigned (0) */
int sgnd; int sgnd;
} opj_image_cmptparm_t; } opj_image_cmptparm_t;
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
/*
==========================================================
openjpeg version
==========================================================
*/
const char * opj_version();
/* /*
========================================================== ==========================================================
image functions definitions image functions definitions

View File

@ -23,8 +23,6 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#ifndef OPJ_INCLUDES_H #ifndef OPJ_INCLUDES_H
#define OPJ_INCLUDES_H #define OPJ_INCLUDES_H
@ -33,7 +31,6 @@
Standard includes used by the library Standard includes used by the library
========================================================== ==========================================================
*/ */
#include <setjmp.h>
#include <memory.h> #include <memory.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
@ -42,6 +39,7 @@
#include <time.h> #include <time.h>
#include <stdio.h> #include <stdio.h>
#include <stdarg.h> #include <stdarg.h>
#include <ctype.h>
/* /*
========================================================== ==========================================================

View File

@ -2,7 +2,7 @@
* Copyright (c) 2001-2003, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team * Copyright (c) 2005, Hervé Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
@ -30,6 +30,47 @@
#include "opj_includes.h" #include "opj_includes.h"
/** @defgroup PI PI - Implementation of a packet iterator */
/*@{*/
/** @name Local static functions */
/*@{*/
/**
Get next packet in layer-resolution-component-precinct order.
@param pi packet iterator to modify
@return returns false if pi pointed to the last packet or else returns true
*/
static 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 local functions
@ -37,303 +78,303 @@
*/ */
static bool pi_next_lrcp(opj_pi_iterator_t * pi) { static bool pi_next_lrcp(opj_pi_iterator_t * pi) {
opj_pi_comp_t *comp = NULL; opj_pi_comp_t *comp = NULL;
opj_pi_resolution_t *res = NULL; opj_pi_resolution_t *res = NULL;
long index = 0; long index = 0;
if (!pi->first) { if (!pi->first) {
comp = &pi->comps[pi->compno]; comp = &pi->comps[pi->compno];
res = &comp->resolutions[pi->resno]; res = &comp->resolutions[pi->resno];
goto LABEL_SKIP; goto LABEL_SKIP;
} else { } else {
pi->first = 0; pi->first = 0;
} }
for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) { for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) {
for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1;
pi->resno++) { pi->resno++) {
for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) { for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
comp = &pi->comps[pi->compno]; comp = &pi->comps[pi->compno];
if (pi->resno >= comp->numresolutions) { if (pi->resno >= comp->numresolutions) {
continue; continue;
} }
res = &comp->resolutions[pi->resno]; res = &comp->resolutions[pi->resno];
for (pi->precno = 0; pi->precno < res->pw * res->ph; pi->precno++) { for (pi->precno = 0; pi->precno < res->pw * res->ph; pi->precno++) {
index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p; 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]) { if (!pi->include[index]) {
pi->include[index] = 1; pi->include[index] = 1;
return true; return true;
} }
LABEL_SKIP:; LABEL_SKIP:;
} }
} }
} }
} }
return false; return false;
} }
static bool pi_next_rlcp(opj_pi_iterator_t * pi) { static bool pi_next_rlcp(opj_pi_iterator_t * pi) {
opj_pi_comp_t *comp = NULL; opj_pi_comp_t *comp = NULL;
opj_pi_resolution_t *res = NULL; opj_pi_resolution_t *res = NULL;
long index = 0; long index = 0;
if (!pi->first) { if (!pi->first) {
comp = &pi->comps[pi->compno]; comp = &pi->comps[pi->compno];
res = &comp->resolutions[pi->resno]; res = &comp->resolutions[pi->resno];
goto LABEL_SKIP; goto LABEL_SKIP;
} else { } else {
pi->first = 0; pi->first = 0;
} }
for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) { 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->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) {
for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) { for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
comp = &pi->comps[pi->compno]; comp = &pi->comps[pi->compno];
if (pi->resno >= comp->numresolutions) { if (pi->resno >= comp->numresolutions) {
continue; continue;
} }
res = &comp->resolutions[pi->resno]; res = &comp->resolutions[pi->resno];
for (pi->precno = 0; pi->precno < res->pw * res->ph; pi->precno++) { for (pi->precno = 0; pi->precno < res->pw * res->ph; pi->precno++) {
index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p; 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]) { if (!pi->include[index]) {
pi->include[index] = 1; pi->include[index] = 1;
return true; return true;
} }
LABEL_SKIP:; LABEL_SKIP:;
} }
} }
} }
} }
return false; return false;
} }
static bool pi_next_rpcl(opj_pi_iterator_t * pi) { static bool pi_next_rpcl(opj_pi_iterator_t * pi) {
opj_pi_comp_t *comp = NULL; opj_pi_comp_t *comp = NULL;
opj_pi_resolution_t *res = NULL; opj_pi_resolution_t *res = NULL;
long index = 0; long index = 0;
if (!pi->first) { if (!pi->first) {
goto LABEL_SKIP; goto LABEL_SKIP;
} else { } else {
int compno, resno; int compno, resno;
pi->first = 0; pi->first = 0;
pi->dx = 0; pi->dx = 0;
pi->dy = 0; pi->dy = 0;
for (compno = 0; compno < pi->numcomps; compno++) { for (compno = 0; compno < pi->numcomps; compno++) {
comp = &pi->comps[compno]; comp = &pi->comps[compno];
for (resno = 0; resno < comp->numresolutions; resno++) { for (resno = 0; resno < comp->numresolutions; resno++) {
int dx, dy; int dx, dy;
res = &comp->resolutions[resno]; res = &comp->resolutions[resno];
dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno)); dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno));
dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno)); dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno));
pi->dx = !pi->dx ? dx : int_min(pi->dx, dx); pi->dx = !pi->dx ? dx : int_min(pi->dx, dx);
pi->dy = !pi->dy ? dy : int_min(pi->dy, dy); pi->dy = !pi->dy ? dy : int_min(pi->dy, dy);
} }
} }
} }
for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) { for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) {
for (pi->y = pi->ty0; pi->y < pi->ty1; pi->y += pi->dy - (pi->y % pi->dy)) { for (pi->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->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++) { for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
int levelno; int levelno;
int trx0, try0; int trx0, try0;
int trx1, try1; int trx1, try1;
int rpx, rpy; int rpx, rpy;
int prci, prcj; int prci, prcj;
comp = &pi->comps[pi->compno]; comp = &pi->comps[pi->compno];
if (pi->resno >= comp->numresolutions) { if (pi->resno >= comp->numresolutions) {
continue; continue;
} }
res = &comp->resolutions[pi->resno]; res = &comp->resolutions[pi->resno];
levelno = comp->numresolutions - 1 - pi->resno; levelno = comp->numresolutions - 1 - pi->resno;
trx0 = int_ceildiv(pi->tx0, comp->dx << levelno); trx0 = int_ceildiv(pi->tx0, comp->dx << levelno);
try0 = int_ceildiv(pi->ty0, comp->dy << levelno); try0 = int_ceildiv(pi->ty0, comp->dy << levelno);
trx1 = int_ceildiv(pi->tx1, comp->dx << levelno); trx1 = int_ceildiv(pi->tx1, comp->dx << levelno);
try1 = int_ceildiv(pi->ty1, comp->dy << levelno); try1 = int_ceildiv(pi->ty1, comp->dy << levelno);
rpx = res->pdx + levelno; rpx = res->pdx + levelno;
rpy = res->pdy + levelno; rpy = res->pdy + levelno;
if ((!(pi->x % (comp->dx << rpx) == 0) || (pi->x == pi->tx0 && (trx0 << levelno) % (1 << rpx)))) { if ((!(pi->x % (comp->dx << rpx) == 0) || (pi->x == pi->tx0 && (trx0 << levelno) % (1 << rpx)))) {
continue; continue;
} }
if ((!(pi->y % (comp->dy << rpy) == 0) || (pi->y == pi->ty0 && (try0 << levelno) % (1 << rpx)))) { if ((!(pi->y % (comp->dy << rpy) == 0) || (pi->y == pi->ty0 && (try0 << levelno) % (1 << rpx)))) {
continue; continue;
} }
if ((res->pw==0)||(res->pw==0)) continue; if ((res->pw==0)||(res->pw==0)) continue;
if ((trx0==trx1)||(try0==try1)) continue; if ((trx0==trx1)||(try0==try1)) continue;
prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx) prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx)
- int_floordivpow2(trx0, res->pdx); - int_floordivpow2(trx0, res->pdx);
prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy) prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy)
- int_floordivpow2(try0, res->pdy); - int_floordivpow2(try0, res->pdy);
pi->precno = prci + prcj * res->pw; pi->precno = prci + prcj * res->pw;
for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) { 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; 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]) { if (!pi->include[index]) {
pi->include[index] = 1; pi->include[index] = 1;
return true; return true;
} }
LABEL_SKIP:; LABEL_SKIP:;
} }
} }
} }
} }
} }
return false; return false;
} }
static bool pi_next_pcrl(opj_pi_iterator_t * pi) { static bool pi_next_pcrl(opj_pi_iterator_t * pi) {
opj_pi_comp_t *comp = NULL; opj_pi_comp_t *comp = NULL;
opj_pi_resolution_t *res = NULL; opj_pi_resolution_t *res = NULL;
long index = 0; long index = 0;
if (!pi->first) { if (!pi->first) {
comp = &pi->comps[pi->compno]; comp = &pi->comps[pi->compno];
goto LABEL_SKIP; goto LABEL_SKIP;
} else { } else {
int compno, resno; int compno, resno;
pi->first = 0; pi->first = 0;
pi->dx = 0; pi->dx = 0;
pi->dy = 0; pi->dy = 0;
for (compno = 0; compno < pi->numcomps; compno++) { for (compno = 0; compno < pi->numcomps; compno++) {
comp = &pi->comps[compno]; comp = &pi->comps[compno];
for (resno = 0; resno < comp->numresolutions; resno++) { for (resno = 0; resno < comp->numresolutions; resno++) {
int dx, dy; int dx, dy;
res = &comp->resolutions[resno]; res = &comp->resolutions[resno];
dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno)); dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno));
dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno)); dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno));
pi->dx = !pi->dx ? dx : int_min(pi->dx, dx); pi->dx = !pi->dx ? dx : int_min(pi->dx, dx);
pi->dy = !pi->dy ? dy : int_min(pi->dy, dy); pi->dy = !pi->dy ? dy : int_min(pi->dy, dy);
} }
} }
} }
for (pi->y = pi->ty0; pi->y < pi->ty1; pi->y += pi->dy - (pi->y % pi->dy)) { for (pi->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->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++) { for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
comp = &pi->comps[pi->compno]; comp = &pi->comps[pi->compno];
for (pi->resno = pi->poc.resno0; pi->resno < int_min(pi->poc.resno1, comp->numresolutions); pi->resno++) { for (pi->resno = pi->poc.resno0; pi->resno < int_min(pi->poc.resno1, comp->numresolutions); pi->resno++) {
int levelno; int levelno;
int trx0, try0; int trx0, try0;
int trx1, try1; int trx1, try1;
int rpx, rpy; int rpx, rpy;
int prci, prcj; int prci, prcj;
res = &comp->resolutions[pi->resno]; res = &comp->resolutions[pi->resno];
levelno = comp->numresolutions - 1 - pi->resno; levelno = comp->numresolutions - 1 - pi->resno;
trx0 = int_ceildiv(pi->tx0, comp->dx << levelno); trx0 = int_ceildiv(pi->tx0, comp->dx << levelno);
try0 = int_ceildiv(pi->ty0, comp->dy << levelno); try0 = int_ceildiv(pi->ty0, comp->dy << levelno);
trx1 = int_ceildiv(pi->tx1, comp->dx << levelno); trx1 = int_ceildiv(pi->tx1, comp->dx << levelno);
try1 = int_ceildiv(pi->ty1, comp->dy << levelno); try1 = int_ceildiv(pi->ty1, comp->dy << levelno);
rpx = res->pdx + levelno; rpx = res->pdx + levelno;
rpy = res->pdy + levelno; rpy = res->pdy + levelno;
if ((!(pi->x % (comp->dx << rpx) == 0) || (pi->x == pi->tx0 && (trx0 << levelno) % (1 << rpx)))) { if ((!(pi->x % (comp->dx << rpx) == 0) || (pi->x == pi->tx0 && (trx0 << levelno) % (1 << rpx)))) {
continue; continue;
} }
if ((!(pi->y % (comp->dy << rpy) == 0) || (pi->y == pi->ty0 && (try0 << levelno) % (1 << rpx)))) { if ((!(pi->y % (comp->dy << rpy) == 0) || (pi->y == pi->ty0 && (try0 << levelno) % (1 << rpx)))) {
continue; continue;
} }
if ((res->pw==0)||(res->pw==0)) continue; if ((res->pw==0)||(res->pw==0)) continue;
if ((trx0==trx1)||(try0==try1)) continue; if ((trx0==trx1)||(try0==try1)) continue;
prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx) prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx)
- int_floordivpow2(trx0, res->pdx); - int_floordivpow2(trx0, res->pdx);
prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy) prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy)
- int_floordivpow2(try0, res->pdy); - int_floordivpow2(try0, res->pdy);
pi->precno = prci + prcj * res->pw; pi->precno = prci + prcj * res->pw;
for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) { 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; 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]) { if (!pi->include[index]) {
pi->include[index] = 1; pi->include[index] = 1;
return true; return true;
} }
LABEL_SKIP:; LABEL_SKIP:;
} }
} }
} }
} }
} }
return false; return false;
} }
static bool pi_next_cprl(opj_pi_iterator_t * pi) { static bool pi_next_cprl(opj_pi_iterator_t * pi) {
opj_pi_comp_t *comp = NULL; opj_pi_comp_t *comp = NULL;
opj_pi_resolution_t *res = NULL; opj_pi_resolution_t *res = NULL;
long index = 0; long index = 0;
if (!pi->first) { if (!pi->first) {
comp = &pi->comps[pi->compno]; comp = &pi->comps[pi->compno];
goto LABEL_SKIP; goto LABEL_SKIP;
} else { } else {
pi->first = 0; pi->first = 0;
} }
for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) { for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
int resno; int resno;
comp = &pi->comps[pi->compno]; comp = &pi->comps[pi->compno];
pi->dx = 0; pi->dx = 0;
pi->dy = 0; pi->dy = 0;
for (resno = 0; resno < comp->numresolutions; resno++) { for (resno = 0; resno < comp->numresolutions; resno++) {
int dx, dy; int dx, dy;
res = &comp->resolutions[resno]; res = &comp->resolutions[resno];
dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno)); dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno));
dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno)); dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno));
pi->dx = !pi->dx ? dx : int_min(pi->dx, dx); pi->dx = !pi->dx ? dx : int_min(pi->dx, dx);
pi->dy = !pi->dy ? dy : int_min(pi->dy, dy); pi->dy = !pi->dy ? dy : int_min(pi->dy, dy);
} }
for (pi->y = pi->ty0; pi->y < pi->ty1; pi->y += pi->dy - (pi->y % pi->dy)) { for (pi->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->x = pi->tx0; pi->x < pi->tx1; pi->x += pi->dx - (pi->x % pi->dx)) {
for (pi->resno = pi->poc.resno0; pi->resno < int_min(pi->poc.resno1, comp->numresolutions); pi->resno++) { for (pi->resno = pi->poc.resno0; pi->resno < int_min(pi->poc.resno1, comp->numresolutions); pi->resno++) {
int levelno; int levelno;
int trx0, try0; int trx0, try0;
int trx1, try1; int trx1, try1;
int rpx, rpy; int rpx, rpy;
int prci, prcj; int prci, prcj;
res = &comp->resolutions[pi->resno]; res = &comp->resolutions[pi->resno];
levelno = comp->numresolutions - 1 - pi->resno; levelno = comp->numresolutions - 1 - pi->resno;
trx0 = int_ceildiv(pi->tx0, comp->dx << levelno); trx0 = int_ceildiv(pi->tx0, comp->dx << levelno);
try0 = int_ceildiv(pi->ty0, comp->dy << levelno); try0 = int_ceildiv(pi->ty0, comp->dy << levelno);
trx1 = int_ceildiv(pi->tx1, comp->dx << levelno); trx1 = int_ceildiv(pi->tx1, comp->dx << levelno);
try1 = int_ceildiv(pi->ty1, comp->dy << levelno); try1 = int_ceildiv(pi->ty1, comp->dy << levelno);
rpx = res->pdx + levelno; rpx = res->pdx + levelno;
rpy = res->pdy + levelno; rpy = res->pdy + levelno;
if ((!(pi->x % (comp->dx << rpx) == 0) || (pi->x == pi->tx0 && (trx0 << levelno) % (1 << rpx)))) { if ((!(pi->x % (comp->dx << rpx) == 0) || (pi->x == pi->tx0 && (trx0 << levelno) % (1 << rpx)))) {
continue; continue;
} }
if ((!(pi->y % (comp->dy << rpy) == 0) || (pi->y == pi->ty0 && (try0 << levelno) % (1 << rpx)))) { if ((!(pi->y % (comp->dy << rpy) == 0) || (pi->y == pi->ty0 && (try0 << levelno) % (1 << rpx)))) {
continue; continue;
} }
if ((res->pw==0)||(res->pw==0)) continue; if ((res->pw==0)||(res->pw==0)) continue;
if ((trx0==trx1)||(try0==try1)) continue; if ((trx0==trx1)||(try0==try1)) continue;
prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx) prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx)
- int_floordivpow2(trx0, res->pdx); - int_floordivpow2(trx0, res->pdx);
prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy) prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy)
- int_floordivpow2(try0, res->pdy); - int_floordivpow2(try0, res->pdy);
pi->precno = prci + prcj * res->pw; pi->precno = prci + prcj * res->pw;
for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) { 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; 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]) { if (!pi->include[index]) {
pi->include[index] = 1; pi->include[index] = 1;
return true; return true;
} }
LABEL_SKIP:; LABEL_SKIP:;
} }
} }
} }
} }
} }
return false; return false;
} }
/* /*
@ -343,169 +384,169 @@ LABEL_SKIP:;
*/ */
opj_pi_iterator_t *pi_create(opj_image_t *image, opj_cp_t *cp, int tileno) { opj_pi_iterator_t *pi_create(opj_image_t *image, opj_cp_t *cp, int tileno) {
int p, q; int p, q;
int compno, resno, pino; int compno, resno, pino;
int maxres = 0; int maxres = 0;
opj_pi_iterator_t *pi = NULL; opj_pi_iterator_t *pi = NULL;
opj_tcp_t *tcp = NULL; opj_tcp_t *tcp = NULL;
opj_tccp_t *tccp = NULL; opj_tccp_t *tccp = NULL;
size_t array_size; size_t array_size;
tcp = &cp->tcps[tileno]; tcp = &cp->tcps[tileno];
array_size = (tcp->numpocs + 1) * sizeof(opj_pi_iterator_t); array_size = (tcp->numpocs + 1) * sizeof(opj_pi_iterator_t);
pi = (opj_pi_iterator_t *) opj_malloc(array_size); pi = (opj_pi_iterator_t *) opj_malloc(array_size);
if(!pi) { if(!pi) {
/* TODO: throw an error */ /* TODO: throw an error */
return NULL; return NULL;
} }
for (pino = 0; pino < tcp->numpocs + 1; pino++) { /* change */ for (pino = 0; pino < tcp->numpocs + 1; pino++) { /* change */
p = tileno % cp->tw; p = tileno % cp->tw;
q = tileno / cp->tw; q = tileno / cp->tw;
pi[pino].tx0 = int_max(cp->tx0 + p * cp->tdx, image->x0); pi[pino].tx0 = int_max(cp->tx0 + p * cp->tdx, image->x0);
pi[pino].ty0 = int_max(cp->ty0 + q * cp->tdy, image->y0); pi[pino].ty0 = int_max(cp->ty0 + q * cp->tdy, image->y0);
pi[pino].tx1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1); pi[pino].tx1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1);
pi[pino].ty1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1); pi[pino].ty1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1);
pi[pino].numcomps = image->numcomps; pi[pino].numcomps = image->numcomps;
array_size = image->numcomps * sizeof(opj_pi_comp_t); array_size = image->numcomps * sizeof(opj_pi_comp_t);
pi[pino].comps = (opj_pi_comp_t *) opj_malloc(array_size); pi[pino].comps = (opj_pi_comp_t *) opj_malloc(array_size);
if(!pi[pino].comps) { if(!pi[pino].comps) {
/* TODO: throw an error */ /* TODO: throw an error */
pi_destroy(pi, cp, tileno); pi_destroy(pi, cp, tileno);
return NULL; return NULL;
} }
memset(pi[pino].comps, 0, array_size); memset(pi[pino].comps, 0, array_size);
for (compno = 0; compno < pi->numcomps; compno++) { for (compno = 0; compno < pi->numcomps; compno++) {
int tcx0, tcy0, tcx1, tcy1; int tcx0, tcy0, tcx1, tcy1;
opj_pi_comp_t *comp = &pi[pino].comps[compno]; opj_pi_comp_t *comp = &pi[pino].comps[compno];
tccp = &tcp->tccps[compno]; tccp = &tcp->tccps[compno];
comp->dx = image->comps[compno].dx; comp->dx = image->comps[compno].dx;
comp->dy = image->comps[compno].dy; comp->dy = image->comps[compno].dy;
comp->numresolutions = tccp->numresolutions; comp->numresolutions = tccp->numresolutions;
array_size = comp->numresolutions * sizeof(opj_pi_resolution_t); array_size = comp->numresolutions * sizeof(opj_pi_resolution_t);
comp->resolutions = (opj_pi_resolution_t *) opj_malloc(array_size); comp->resolutions = (opj_pi_resolution_t *) opj_malloc(array_size);
if(!comp->resolutions) { if(!comp->resolutions) {
/* TODO: throw an error */ /* TODO: throw an error */
pi_destroy(pi, cp, tileno); pi_destroy(pi, cp, tileno);
return NULL; return NULL;
} }
tcx0 = int_ceildiv(pi->tx0, comp->dx); tcx0 = int_ceildiv(pi->tx0, comp->dx);
tcy0 = int_ceildiv(pi->ty0, comp->dy); tcy0 = int_ceildiv(pi->ty0, comp->dy);
tcx1 = int_ceildiv(pi->tx1, comp->dx); tcx1 = int_ceildiv(pi->tx1, comp->dx);
tcy1 = int_ceildiv(pi->ty1, comp->dy); tcy1 = int_ceildiv(pi->ty1, comp->dy);
if (comp->numresolutions > maxres) { if (comp->numresolutions > maxres) {
maxres = comp->numresolutions; maxres = comp->numresolutions;
} }
for (resno = 0; resno < comp->numresolutions; resno++) { for (resno = 0; resno < comp->numresolutions; resno++) {
int levelno; int levelno;
int rx0, ry0, rx1, ry1; int rx0, ry0, rx1, ry1;
int px0, py0, px1, py1; int px0, py0, px1, py1;
opj_pi_resolution_t *res = &comp->resolutions[resno]; opj_pi_resolution_t *res = &comp->resolutions[resno];
if (tccp->csty & J2K_CCP_CSTY_PRT) { if (tccp->csty & J2K_CCP_CSTY_PRT) {
res->pdx = tccp->prcw[resno]; res->pdx = tccp->prcw[resno];
res->pdy = tccp->prch[resno]; res->pdy = tccp->prch[resno];
} else { } else {
res->pdx = 15; res->pdx = 15;
res->pdy = 15; res->pdy = 15;
} }
levelno = comp->numresolutions - 1 - resno; levelno = comp->numresolutions - 1 - resno;
rx0 = int_ceildivpow2(tcx0, levelno); rx0 = int_ceildivpow2(tcx0, levelno);
ry0 = int_ceildivpow2(tcy0, levelno); ry0 = int_ceildivpow2(tcy0, levelno);
rx1 = int_ceildivpow2(tcx1, levelno); rx1 = int_ceildivpow2(tcx1, levelno);
ry1 = int_ceildivpow2(tcy1, levelno); ry1 = int_ceildivpow2(tcy1, levelno);
px0 = int_floordivpow2(rx0, res->pdx) << res->pdx; px0 = int_floordivpow2(rx0, res->pdx) << res->pdx;
py0 = int_floordivpow2(ry0, res->pdy) << res->pdy; py0 = int_floordivpow2(ry0, res->pdy) << res->pdy;
px1 = int_ceildivpow2(rx1, res->pdx) << res->pdx; px1 = int_ceildivpow2(rx1, res->pdx) << res->pdx;
py1 = int_ceildivpow2(ry1, res->pdy) << res->pdy; py1 = int_ceildivpow2(ry1, res->pdy) << res->pdy;
res->pw = (rx0==rx1)?0:((px1 - px0) >> res->pdx); res->pw = (rx0==rx1)?0:((px1 - px0) >> res->pdx);
res->ph = (ry0==ry1)?0:((py1 - py0) >> res->pdy); res->ph = (ry0==ry1)?0:((py1 - py0) >> res->pdy);
} }
} }
tccp = &tcp->tccps[0]; tccp = &tcp->tccps[0];
pi[pino].step_p = 1; pi[pino].step_p = 1;
pi[pino].step_c = 100 * pi[pino].step_p; pi[pino].step_c = 100 * pi[pino].step_p;
pi[pino].step_r = image->numcomps * pi[pino].step_c; pi[pino].step_r = image->numcomps * pi[pino].step_c;
pi[pino].step_l = maxres * pi[pino].step_r; pi[pino].step_l = maxres * pi[pino].step_r;
if (pino == 0) { if (pino == 0) {
array_size = image->numcomps * maxres * tcp->numlayers * 100 * sizeof(short int); array_size = image->numcomps * maxres * tcp->numlayers * 100 * sizeof(short int);
pi[pino].include = (short int *) opj_malloc(array_size); pi[pino].include = (short int *) opj_malloc(array_size);
if(!pi[pino].include) { if(!pi[pino].include) {
/* TODO: throw an error */ /* TODO: throw an error */
pi_destroy(pi, cp, tileno); pi_destroy(pi, cp, tileno);
return NULL; return NULL;
} }
} }
else { else {
pi[pino].include = pi[pino - 1].include; pi[pino].include = pi[pino - 1].include;
} }
if (tcp->POC == 0) { if (tcp->POC == 0) {
pi[pino].first = 1; pi[pino].first = 1;
pi[pino].poc.resno0 = 0; pi[pino].poc.resno0 = 0;
pi[pino].poc.compno0 = 0; pi[pino].poc.compno0 = 0;
pi[pino].poc.layno1 = tcp->numlayers; pi[pino].poc.layno1 = tcp->numlayers;
pi[pino].poc.resno1 = maxres; pi[pino].poc.resno1 = maxres;
pi[pino].poc.compno1 = image->numcomps; pi[pino].poc.compno1 = image->numcomps;
pi[pino].poc.prg = tcp->prg; pi[pino].poc.prg = tcp->prg;
} else { } else {
pi[pino].first = 1; pi[pino].first = 1;
pi[pino].poc.resno0 = tcp->pocs[pino].resno0; pi[pino].poc.resno0 = tcp->pocs[pino].resno0;
pi[pino].poc.compno0 = tcp->pocs[pino].compno0; pi[pino].poc.compno0 = tcp->pocs[pino].compno0;
pi[pino].poc.layno1 = tcp->pocs[pino].layno1; pi[pino].poc.layno1 = tcp->pocs[pino].layno1;
pi[pino].poc.resno1 = tcp->pocs[pino].resno1; pi[pino].poc.resno1 = tcp->pocs[pino].resno1;
pi[pino].poc.compno1 = tcp->pocs[pino].compno1; pi[pino].poc.compno1 = tcp->pocs[pino].compno1;
pi[pino].poc.prg = tcp->pocs[pino].prg; pi[pino].poc.prg = tcp->pocs[pino].prg;
} }
} }
return pi; return pi;
} }
void pi_destroy(opj_pi_iterator_t *pi, opj_cp_t *cp, int tileno) { void pi_destroy(opj_pi_iterator_t *pi, opj_cp_t *cp, int tileno) {
int compno, pino; int compno, pino;
opj_tcp_t *tcp = &cp->tcps[tileno]; opj_tcp_t *tcp = &cp->tcps[tileno];
if(pi) { if(pi) {
for (pino = 0; pino < tcp->numpocs + 1; pino++) { for (pino = 0; pino < tcp->numpocs + 1; pino++) {
if(pi[pino].comps) { if(pi[pino].comps) {
for (compno = 0; compno < pi->numcomps; compno++) { for (compno = 0; compno < pi->numcomps; compno++) {
opj_pi_comp_t *comp = &pi[pino].comps[compno]; opj_pi_comp_t *comp = &pi[pino].comps[compno];
if(comp->resolutions) { if(comp->resolutions) {
opj_free(comp->resolutions); opj_free(comp->resolutions);
} }
} }
opj_free(pi[pino].comps); opj_free(pi[pino].comps);
} }
} }
if(pi->include) { if(pi->include) {
opj_free(pi->include); opj_free(pi->include);
} }
opj_free(pi); opj_free(pi);
} }
} }
bool pi_next(opj_pi_iterator_t * pi) { bool pi_next(opj_pi_iterator_t * pi) {
switch (pi->poc.prg) { switch (pi->poc.prg) {
case LRCP: case LRCP:
return pi_next_lrcp(pi); return pi_next_lrcp(pi);
case RLCP: case RLCP:
return pi_next_rlcp(pi); return pi_next_rlcp(pi);
case RPCL: case RPCL:
return pi_next_rpcl(pi); return pi_next_rpcl(pi);
case PCRL: case PCRL:
return pi_next_pcrl(pi); return pi_next_pcrl(pi);
case CPRL: case CPRL:
return pi_next_cprl(pi); return pi_next_cprl(pi);
} }
return false; return false;
} }

View File

@ -2,7 +2,7 @@
* Copyright (c) 2001-2003, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team * Copyright (c) 2005, Hervé Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
@ -64,72 +64,36 @@ typedef struct opj_pi_comp {
Packet iterator Packet iterator
*/ */
typedef struct opj_pi_iterator { typedef struct opj_pi_iterator {
/** precise if the packet has been already used (usefull for progression order change) */ /** precise if the packet has been already used (usefull for progression order change) */
short int *include; short int *include;
/** layer step used to localize the packet in the include vector */ /** layer step used to localize the packet in the include vector */
int step_l; int step_l;
/** resolution step used to localize the packet in the include vector */ /** resolution step used to localize the packet in the include vector */
int step_r; int step_r;
/** component step used to localize the packet in the include vector */ /** component step used to localize the packet in the include vector */
int step_c; int step_c;
/** precinct step used to localize the packet in the include vector */ /** precinct step used to localize the packet in the include vector */
int step_p; int step_p;
/** component that identify the packet */ /** component that identify the packet */
int compno; int compno;
/** resolution that identify the packet */ /** resolution that identify the packet */
int resno; int resno;
/** precinct that identify the packet */ /** precinct that identify the packet */
int precno; int precno;
/** layer that identify the packet */ /** layer that identify the packet */
int layno; int layno;
/** 0 if the first packet */ /** 0 if the first packet */
int first; int first;
/** progression order change information */ /** progression order change information */
opj_poc_t poc; opj_poc_t poc;
/** */ /** */
int numcomps; int numcomps;
/** */ /** */
opj_pi_comp_t *comps; opj_pi_comp_t *comps;
int tx0, ty0, tx1, ty1; int tx0, ty0, tx1, ty1;
int x, y, dx, dy; int x, y, dx, dy;
} opj_pi_iterator_t; } opj_pi_iterator_t;
/** @name Local static functions */
/*@{*/
/* ----------------------------------------------------------------------- */
/**
Get next packet in layer-resolution-component-precinct order.
@param pi packet iterator to modify
@return returns false if pi pointed to the last packet or else returns true
*/
static 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);
/* ----------------------------------------------------------------------- */
/*@}*/
/** @name Exported functions */ /** @name Exported functions */
/*@{*/ /*@{*/
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */

View File

@ -1,6 +1,6 @@
/* /*
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team * Copyright (c) 2005, Hervé Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
@ -42,45 +42,45 @@
*/ */
opj_raw_t* raw_create() { opj_raw_t* raw_create() {
opj_raw_t *raw = (opj_raw_t*)opj_malloc(sizeof(opj_raw_t)); opj_raw_t *raw = (opj_raw_t*)opj_malloc(sizeof(opj_raw_t));
return raw; return raw;
} }
void raw_destroy(opj_raw_t *raw) { void raw_destroy(opj_raw_t *raw) {
if(raw) { if(raw) {
opj_free(raw); opj_free(raw);
} }
} }
int raw_numbytes(opj_raw_t *raw) { int raw_numbytes(opj_raw_t *raw) {
return raw->bp - raw->start; return raw->bp - raw->start;
} }
void raw_init_dec(opj_raw_t *raw, unsigned char *bp, int len) { void raw_init_dec(opj_raw_t *raw, unsigned char *bp, int len) {
raw->start = bp; raw->start = bp;
raw->lenmax = len; raw->lenmax = len;
raw->len = 0; raw->len = 0;
raw->c = 0; raw->c = 0;
raw->ct = 0; raw->ct = 0;
} }
int raw_decode(opj_raw_t *raw) { int raw_decode(opj_raw_t *raw) {
int d; int d;
if (raw->ct == 0) { if (raw->ct == 0) {
raw->ct = 8; raw->ct = 8;
if (raw->len == raw->lenmax) { if (raw->len == raw->lenmax) {
raw->c = 0xff; raw->c = 0xff;
} else { } else {
if (raw->c == 0xff) { if (raw->c == 0xff) {
raw->ct = 7; raw->ct = 7;
} }
raw->c = *(raw->start + raw->len); raw->c = *(raw->start + raw->len);
raw->len++; raw->len++;
} }
} }
raw->ct--; raw->ct--;
d = (raw->c >> raw->ct) & 0x01; d = (raw->c >> raw->ct) & 0x01;
return d; return d;
} }

View File

@ -1,6 +1,6 @@
/* /*
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team * Copyright (c) 2005, Hervé Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
@ -43,20 +43,20 @@ with the corresponding mode switch.
RAW encoding operations RAW encoding operations
*/ */
typedef struct opj_raw { typedef struct opj_raw {
/** temporary buffer where bits are coded or decoded */ /** temporary buffer where bits are coded or decoded */
unsigned char c; unsigned char c;
/** number of bits already read or free to write */ /** number of bits already read or free to write */
unsigned int ct; unsigned int ct;
/** maximum length to decode */ /** maximum length to decode */
unsigned int lenmax; unsigned int lenmax;
/** length decoded */ /** length decoded */
unsigned int len; unsigned int len;
/** pointer to the current position in the buffer */ /** pointer to the current position in the buffer */
unsigned char *bp; unsigned char *bp;
/** pointer to the start of the buffer */ /** pointer to the start of the buffer */
unsigned char *start; unsigned char *start;
/** pointer to the end of the buffer */ /** pointer to the end of the buffer */
unsigned char *end; unsigned char *end;
} opj_raw_t; } opj_raw_t;
/** @name Exported functions */ /** @name Exported functions */

File diff suppressed because it is too large Load Diff

View File

@ -2,7 +2,7 @@
* Copyright (c) 2001-2003, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team * Copyright (c) 2005, Hervé Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
@ -27,7 +27,6 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#ifndef __T1_H #ifndef __T1_H
#define __T1_H #define __T1_H
/** /**
@ -44,17 +43,17 @@ in T1.C are used by some function in TCD.C.
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */
#define T1_NMSEDEC_BITS 7 #define T1_NMSEDEC_BITS 7
#define T1_MAXCBLKW 1024 /**< Maximum size of code-block (width) */ #define T1_MAXCBLKW 1024 /**< Maximum size of code-block (width) */
#define T1_MAXCBLKH 1024 /**< Maximum size of code-block (heigth) */ #define T1_MAXCBLKH 1024 /**< Maximum size of code-block (heigth) */
#define T1_SIG_NE 0x0001 /**< Context orientation : North-East direction */ #define T1_SIG_NE 0x0001 /**< Context orientation : North-East direction */
#define T1_SIG_SE 0x0002 /**< Context orientation : South-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_SW 0x0004 /**< Context orientation : South-West direction */
#define T1_SIG_NW 0x0008 /**< Context orientation : North-West direction */ #define T1_SIG_NW 0x0008 /**< Context orientation : North-West direction */
#define T1_SIG_N 0x0010 /**< Context orientation : North direction */ #define T1_SIG_N 0x0010 /**< Context orientation : North direction */
#define T1_SIG_E 0x0020 /**< Context orientation : East direction */ #define T1_SIG_E 0x0020 /**< Context orientation : East direction */
#define T1_SIG_S 0x0040 /**< Context orientation : South direction */ #define T1_SIG_S 0x0040 /**< Context orientation : South direction */
#define T1_SIG_W 0x0080 /**< Context orientation : West 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_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_SIG_PRIM (T1_SIG_N|T1_SIG_E|T1_SIG_S|T1_SIG_W)
@ -83,8 +82,8 @@ in T1.C are used by some function in TCD.C.
#define T1_NMSEDEC_FRACBITS (T1_NMSEDEC_BITS-1) #define T1_NMSEDEC_FRACBITS (T1_NMSEDEC_BITS-1)
#define T1_TYPE_MQ 0 /**< Normal coding using entropy coder */ #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)*/ #define T1_TYPE_RAW 1 /**< No encoding the information is store under raw format in codestream (mode switch RAW)*/
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */
@ -92,123 +91,28 @@ in T1.C are used by some function in TCD.C.
Tier-1 coding (coding of code-block coefficients) Tier-1 coding (coding of code-block coefficients)
*/ */
typedef struct opj_t1 { typedef struct opj_t1 {
/** codec context */ /** codec context */
opj_common_ptr cinfo; opj_common_ptr cinfo;
/** MQC component */ /** MQC component */
opj_mqc_t *mqc; opj_mqc_t *mqc;
/** RAW component */ /** RAW component */
opj_raw_t *raw; opj_raw_t *raw;
int lut_ctxno_zc[1024]; int lut_ctxno_zc[1024];
int lut_ctxno_sc[256]; int lut_ctxno_sc[256];
int lut_ctxno_mag[4096]; int lut_ctxno_mag[4096];
int lut_spb[256]; int lut_spb[256];
int lut_nmsedec_sig[1 << T1_NMSEDEC_BITS]; int lut_nmsedec_sig[1 << T1_NMSEDEC_BITS];
int lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS]; int lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS];
int lut_nmsedec_ref[1 << T1_NMSEDEC_BITS]; int lut_nmsedec_ref[1 << T1_NMSEDEC_BITS];
int lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS]; int lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS];
int data[T1_MAXCBLKH][T1_MAXCBLKW]; int data[T1_MAXCBLKH][T1_MAXCBLKW];
int flags[T1_MAXCBLKH + 2][T1_MAXCBLKH + 2]; int flags[T1_MAXCBLKH + 2][T1_MAXCBLKH + 2];
} opj_t1_t; } opj_t1_t;
/** @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 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 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 bpno, int *nmsedec, char type, int cblksty);
/**
Decode refinement pass
*/
static void t1_dec_refpass(opj_t1_t *t1, int w, int h, 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 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 bpno, int orient, int cblksty);
static double t1_getwmsedec(opj_t1_t *t1, int nmsedec, int compno, int level, int orient, int bpno, int qmfbid, double stepsize, int numcomps);
/**
Encode 1 code-block
@param t1 T1 handle
@param cblk Code-block coding parameters
@param orient
@param compno Component number
@param level
@param qmfbid
@param stepsize
@param cblksty Code-block style
@param numcomps
@param tile
*/
static void t1_encode_cblk(opj_t1_t *t1, opj_tcd_cblk_t * cblk, int orient, int compno, int level, int qmfbid, 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);
/* ----------------------------------------------------------------------- */
/*@}*/
/** @name Exported functions */ /** @name Exported functions */
/*@{*/ /*@{*/
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */

File diff suppressed because it is too large Load Diff

View File

@ -2,7 +2,7 @@
* Copyright (c) 2001-2003, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team * Copyright (c) 2005, Hervé Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
@ -27,7 +27,6 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#ifndef __T2_H #ifndef __T2_H
#define __T2_H #define __T2_H
/** /**
@ -43,62 +42,15 @@
Tier-2 coding Tier-2 coding
*/ */
typedef struct opj_t2 { typedef struct opj_t2 {
/** codec context */ /** codec context */
opj_common_ptr cinfo; opj_common_ptr cinfo;
/** Encoding: pointer to the src image. Decoding: pointer to the dst image. */ /** Encoding: pointer to the src image. Decoding: pointer to the dst image. */
opj_image_t *image; opj_image_t *image;
/** pointer to the image coding parameters */ /** pointer to the image coding parameters */
opj_cp_t *cp; opj_cp_t *cp;
} opj_t2_t; } opj_t2_t;
/** @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 t2 T2 handle
@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 image_info Structure to create an index file
@param tileno Number of the tile encoded
@return
*/
static int t2_encode_packet(opj_t2_t* t2, opj_tcd_tile_t *tile, opj_tcp_t *tcp, opj_pi_iterator_t *pi, unsigned char *dest, int len, opj_image_info_t *image_info, int tileno);
/**
@param seg
@param cblksty
@param first
*/
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
*/
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);
/* ----------------------------------------------------------------------- */
/*@}*/
/** @name Exported functions */ /** @name Exported functions */
/*@{*/ /*@{*/
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */

File diff suppressed because it is too large Load Diff

View File

@ -2,7 +2,7 @@
* Copyright (c) 2001-2003, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team * Copyright (c) 2005, Hervé Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
@ -27,7 +27,6 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#ifndef __TCD_H #ifndef __TCD_H
#define __TCD_H #define __TCD_H
/** /**
@ -66,49 +65,49 @@ typedef struct opj_tcd_pass {
FIXME: documentation FIXME: documentation
*/ */
typedef struct opj_tcd_layer { typedef struct opj_tcd_layer {
int numpasses; /* Number of passes in the layer */ int numpasses; /* Number of passes in the layer */
int len; /* len of information */ int len; /* len of information */
double disto; /* add for index (Cfr. Marcela) */ double disto; /* add for index (Cfr. Marcela) */
unsigned char *data; /* data */ unsigned char *data; /* data */
} opj_tcd_layer_t; } opj_tcd_layer_t;
/** /**
FIXME: documentation FIXME: documentation
*/ */
typedef struct opj_tcd_cblk { typedef struct opj_tcd_cblk {
int x0, y0, x1, y1; /* dimension of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */ int x0, y0, x1, y1; /* dimension of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */
int numbps; int numbps;
int numlenbits; int numlenbits;
int len; /* length */ int len; /* length */
int numpasses; /* number of pass already done for the code-blocks */ int numpasses; /* number of pass already done for the code-blocks */
int numnewpasses; /* number of pass added to the code-blocks */ int numnewpasses; /* number of pass added to the code-blocks */
int numsegs; /* number of segments */ int numsegs; /* number of segments */
opj_tcd_seg_t segs[100]; /* segments informations */ opj_tcd_seg_t segs[100]; /* segments informations */
unsigned char data[8192]; /* Data */ unsigned char data[8192]; /* Data */
int numpassesinlayers; /* number of passes in the layer */ int numpassesinlayers; /* number of passes in the layer */
opj_tcd_layer_t layers[100]; /* layer information */ opj_tcd_layer_t layers[100]; /* layer information */
int totalpasses; /* total number of passes */ int totalpasses; /* total number of passes */
opj_tcd_pass_t passes[100]; /* information about the passes */ opj_tcd_pass_t passes[100]; /* information about the passes */
} opj_tcd_cblk_t; } opj_tcd_cblk_t;
/** /**
FIXME: documentation FIXME: documentation
*/ */
typedef struct opj_tcd_precinct { typedef struct opj_tcd_precinct {
int x0, y0, x1, y1; /* dimension of the precinct : left upper corner (x0, y0) right low corner (x1,y1) */ int x0, y0, x1, y1; /* dimension of the precinct : left upper corner (x0, y0) right low corner (x1,y1) */
int cw, ch; /* number of precinct in width and heigth */ int cw, ch; /* number of precinct in width and heigth */
opj_tcd_cblk_t *cblks; /* code-blocks informations */ opj_tcd_cblk_t *cblks; /* code-blocks informations */
opj_tgt_tree_t *incltree; /* inclusion tree */ opj_tgt_tree_t *incltree; /* inclusion tree */
opj_tgt_tree_t *imsbtree; /* IMSB tree */ opj_tgt_tree_t *imsbtree; /* IMSB tree */
} opj_tcd_precinct_t; } opj_tcd_precinct_t;
/** /**
FIXME: documentation FIXME: documentation
*/ */
typedef struct opj_tcd_band { typedef struct opj_tcd_band {
int x0, y0, x1, y1; /* dimension of the subband : left upper corner (x0, y0) right low corner (x1,y1) */ int x0, y0, x1, y1; /* dimension of the subband : left upper corner (x0, y0) right low corner (x1,y1) */
int bandno; int bandno;
opj_tcd_precinct_t *precincts; /* precinct information */ opj_tcd_precinct_t *precincts; /* precinct information */
int numbps; int numbps;
float stepsize; float stepsize;
} opj_tcd_band_t; } opj_tcd_band_t;
@ -117,71 +116,71 @@ typedef struct opj_tcd_band {
FIXME: documentation FIXME: documentation
*/ */
typedef struct opj_tcd_resolution { typedef struct opj_tcd_resolution {
int x0, y0, x1, y1; /* dimension of the resolution level : left upper corner (x0, y0) right low corner (x1,y1) */ int x0, y0, x1, y1; /* dimension of the resolution level : left upper corner (x0, y0) right low corner (x1,y1) */
int pw, ph; int pw, ph;
int numbands; /* number sub-band for the resolution level */ int numbands; /* number sub-band for the resolution level */
opj_tcd_band_t bands[3]; /* subband information */ opj_tcd_band_t bands[3]; /* subband information */
} opj_tcd_resolution_t; } opj_tcd_resolution_t;
/** /**
FIXME: documentation FIXME: documentation
*/ */
typedef struct opj_tcd_tilecomp { typedef struct opj_tcd_tilecomp {
int x0, y0, x1, y1; /* dimension of component : left upper corner (x0, y0) right low corner (x1,y1) */ int x0, y0, x1, y1; /* dimension of component : left upper corner (x0, y0) right low corner (x1,y1) */
int numresolutions; /* number of resolutions level */ int numresolutions; /* number of resolutions level */
opj_tcd_resolution_t *resolutions; /* resolutions information */ opj_tcd_resolution_t *resolutions; /* resolutions information */
int *data; /* data of the component */ int *data; /* data of the component */
int nbpix; /* add fixed_quality */ int nbpix; /* add fixed_quality */
} opj_tcd_tilecomp_t; } opj_tcd_tilecomp_t;
/** /**
FIXME: documentation FIXME: documentation
*/ */
typedef struct opj_tcd_tile { typedef struct opj_tcd_tile {
int x0, y0, x1, y1; /* dimension of the tile : left upper corner (x0, y0) right low corner (x1,y1) */ int x0, y0, x1, y1; /* dimension of the tile : left upper corner (x0, y0) right low corner (x1,y1) */
int numcomps; /* number of components in tile */ int numcomps; /* number of components in tile */
opj_tcd_tilecomp_t *comps; /* Components information */ opj_tcd_tilecomp_t *comps; /* Components information */
int nbpix; /* add fixed_quality */ int nbpix; /* add fixed_quality */
double distotile; /* add fixed_quality */ double distotile; /* add fixed_quality */
double distolayer[100]; /* add fixed_quality */ double distolayer[100]; /* add fixed_quality */
} opj_tcd_tile_t; } opj_tcd_tile_t;
/** /**
FIXME: documentation FIXME: documentation
*/ */
typedef struct opj_tcd_image { typedef struct opj_tcd_image {
int tw, th; /* number of tiles in width and heigth */ int tw, th; /* number of tiles in width and heigth */
opj_tcd_tile_t *tiles; /* Tiles information */ opj_tcd_tile_t *tiles; /* Tiles information */
} opj_tcd_image_t; } opj_tcd_image_t;
/** /**
Tile coder/decoder Tile coder/decoder
*/ */
typedef struct opj_tcd { typedef struct opj_tcd {
/** codec context */ /** codec context */
opj_common_ptr cinfo; opj_common_ptr cinfo;
/** info on each image tile */ /** info on each image tile */
opj_tcd_image_t *tcd_image; opj_tcd_image_t *tcd_image;
/** image */ /** image */
opj_image_t *image; opj_image_t *image;
/** coding parameters */ /** coding parameters */
opj_cp_t *cp; opj_cp_t *cp;
/** pointer to the current encoded/decoded tile */ /** pointer to the current encoded/decoded tile */
opj_tcd_tile_t *tcd_tile; opj_tcd_tile_t *tcd_tile;
/** coding/decoding parameters common to all tiles */ /** coding/decoding parameters common to all tiles */
opj_tcp_t *tcp; opj_tcp_t *tcp;
/** current encoded/decoded tile */ /** current encoded/decoded tile */
int tcd_tileno; int tcd_tileno;
/**@name working variables */ /**@name working variables */
/*@{*/ /*@{*/
opj_tcd_tile_t *tile; opj_tcd_tile_t *tile;
opj_tcd_tilecomp_t *tilec; opj_tcd_tilecomp_t *tilec;
opj_tcd_resolution_t *res; opj_tcd_resolution_t *res;
opj_tcd_band_t *band; opj_tcd_band_t *band;
opj_tcd_precinct_t *prc; opj_tcd_precinct_t *prc;
opj_tcd_cblk_t *cblk; opj_tcd_cblk_t *cblk;
/*@}*/ /*@}*/
} opj_tcd_t; } opj_tcd_t;
/** @name Exported functions */ /** @name Exported functions */
@ -191,7 +190,7 @@ typedef struct opj_tcd {
/** /**
Dump the content of a tcd structure Dump the content of a tcd structure
*/ */
void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t * img, int curtileno); void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t *img);
/** /**
Create a new TCD handle Create a new TCD handle
@param cinfo Codec context info @param cinfo Codec context info

View File

@ -2,7 +2,7 @@
* Copyright (c) 2001-2003, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team * Copyright (c) 2005, Hervé Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
@ -37,176 +37,176 @@
*/ */
opj_tgt_tree_t *tgt_create(int numleafsh, int numleafsv) { opj_tgt_tree_t *tgt_create(int numleafsh, int numleafsv) {
int nplh[32]; int nplh[32];
int nplv[32]; int nplv[32];
opj_tgt_node_t *node = NULL; opj_tgt_node_t *node = NULL;
opj_tgt_node_t *parentnode = NULL; opj_tgt_node_t *parentnode = NULL;
opj_tgt_node_t *parentnode0 = NULL; opj_tgt_node_t *parentnode0 = NULL;
opj_tgt_tree_t *tree = NULL; opj_tgt_tree_t *tree = NULL;
int i, j, k; int i, j, k;
int numlvls; int numlvls;
int n; int n;
tree = (opj_tgt_tree_t *) opj_malloc(sizeof(opj_tgt_tree_t)); tree = (opj_tgt_tree_t *) opj_malloc(sizeof(opj_tgt_tree_t));
if(!tree) return NULL; if(!tree) return NULL;
tree->numleafsh = numleafsh; tree->numleafsh = numleafsh;
tree->numleafsv = numleafsv; tree->numleafsv = numleafsv;
numlvls = 0; numlvls = 0;
nplh[0] = numleafsh; nplh[0] = numleafsh;
nplv[0] = numleafsv; nplv[0] = numleafsv;
tree->numnodes = 0; tree->numnodes = 0;
do { do {
n = nplh[numlvls] * nplv[numlvls]; n = nplh[numlvls] * nplv[numlvls];
nplh[numlvls + 1] = (nplh[numlvls] + 1) / 2; nplh[numlvls + 1] = (nplh[numlvls] + 1) / 2;
nplv[numlvls + 1] = (nplv[numlvls] + 1) / 2; nplv[numlvls + 1] = (nplv[numlvls] + 1) / 2;
tree->numnodes += n; tree->numnodes += n;
++numlvls; ++numlvls;
} while (n > 1); } while (n > 1);
/* ADD */ /* ADD */
if (tree->numnodes == 0) { if (tree->numnodes == 0) {
opj_free(tree); opj_free(tree);
return NULL; return NULL;
} }
tree->nodes = (opj_tgt_node_t *) opj_malloc(tree->numnodes * sizeof(opj_tgt_node_t)); tree->nodes = (opj_tgt_node_t *) opj_malloc(tree->numnodes * sizeof(opj_tgt_node_t));
if(!tree->nodes) { if(!tree->nodes) {
opj_free(tree); opj_free(tree);
return NULL; return NULL;
} }
node = tree->nodes; node = tree->nodes;
parentnode = &tree->nodes[tree->numleafsh * tree->numleafsv]; parentnode = &tree->nodes[tree->numleafsh * tree->numleafsv];
parentnode0 = parentnode; parentnode0 = parentnode;
for (i = 0; i < numlvls - 1; ++i) { for (i = 0; i < numlvls - 1; ++i) {
for (j = 0; j < nplv[i]; ++j) { for (j = 0; j < nplv[i]; ++j) {
k = nplh[i]; k = nplh[i];
while (--k >= 0) { while (--k >= 0) {
node->parent = parentnode; node->parent = parentnode;
++node; ++node;
if (--k >= 0) { if (--k >= 0) {
node->parent = parentnode; node->parent = parentnode;
++node; ++node;
} }
++parentnode; ++parentnode;
} }
if ((j & 1) || j == nplv[i] - 1) { if ((j & 1) || j == nplv[i] - 1) {
parentnode0 = parentnode; parentnode0 = parentnode;
} else { } else {
parentnode = parentnode0; parentnode = parentnode0;
parentnode0 += nplh[i]; parentnode0 += nplh[i];
} }
} }
} }
node->parent = 0; node->parent = 0;
tgt_reset(tree); tgt_reset(tree);
return tree; return tree;
} }
void tgt_destroy(opj_tgt_tree_t *tree) { void tgt_destroy(opj_tgt_tree_t *tree) {
opj_free(tree->nodes); opj_free(tree->nodes);
opj_free(tree); opj_free(tree);
} }
void tgt_reset(opj_tgt_tree_t *tree) { void tgt_reset(opj_tgt_tree_t *tree) {
int i; int i;
if (NULL == tree) if (NULL == tree)
return; return;
for (i = 0; i < tree->numnodes; i++) { for (i = 0; i < tree->numnodes; i++) {
tree->nodes[i].value = 999; tree->nodes[i].value = 999;
tree->nodes[i].low = 0; tree->nodes[i].low = 0;
tree->nodes[i].known = 0; tree->nodes[i].known = 0;
} }
} }
void tgt_setvalue(opj_tgt_tree_t *tree, int leafno, int value) { void tgt_setvalue(opj_tgt_tree_t *tree, int leafno, int value) {
opj_tgt_node_t *node; opj_tgt_node_t *node;
node = &tree->nodes[leafno]; node = &tree->nodes[leafno];
while (node && node->value > value) { while (node && node->value > value) {
node->value = value; node->value = value;
node = node->parent; node = node->parent;
} }
} }
void tgt_encode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold) { 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 *stk[31];
opj_tgt_node_t **stkptr; opj_tgt_node_t **stkptr;
opj_tgt_node_t *node; opj_tgt_node_t *node;
int low; int low;
stkptr = stk; stkptr = stk;
node = &tree->nodes[leafno]; node = &tree->nodes[leafno];
while (node->parent) { while (node->parent) {
*stkptr++ = node; *stkptr++ = node;
node = node->parent; node = node->parent;
} }
low = 0; low = 0;
for (;;) { for (;;) {
if (low > node->low) { if (low > node->low) {
node->low = low; node->low = low;
} else { } else {
low = node->low; low = node->low;
} }
while (low < threshold) { while (low < threshold) {
if (low >= node->value) { if (low >= node->value) {
if (!node->known) { if (!node->known) {
bio_write(bio, 1, 1); bio_write(bio, 1, 1);
node->known = 1; node->known = 1;
} }
break; break;
} }
bio_write(bio, 0, 1); bio_write(bio, 0, 1);
++low; ++low;
} }
node->low = low; node->low = low;
if (stkptr == stk) if (stkptr == stk)
break; break;
node = *--stkptr; node = *--stkptr;
} }
} }
int tgt_decode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold) { 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 *stk[31];
opj_tgt_node_t **stkptr; opj_tgt_node_t **stkptr;
opj_tgt_node_t *node; opj_tgt_node_t *node;
int low; int low;
stkptr = stk; stkptr = stk;
node = &tree->nodes[leafno]; node = &tree->nodes[leafno];
while (node->parent) { while (node->parent) {
*stkptr++ = node; *stkptr++ = node;
node = node->parent; node = node->parent;
} }
low = 0; low = 0;
for (;;) { for (;;) {
if (low > node->low) { if (low > node->low) {
node->low = low; node->low = low;
} else { } else {
low = node->low; low = node->low;
} }
while (low < threshold && low < node->value) { while (low < threshold && low < node->value) {
if (bio_read(bio, 1)) { if (bio_read(bio, 1)) {
node->value = low; node->value = low;
} else { } else {
++low; ++low;
} }
} }
node->low = low; node->low = low;
if (stkptr == stk) { if (stkptr == stk) {
break; break;
} }
node = *--stkptr; node = *--stkptr;
} }
return (node->value < threshold) ? 1 : 0; return (node->value < threshold) ? 1 : 0;
} }

View File

@ -2,7 +2,7 @@
* Copyright (c) 2001-2003, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team * Copyright (c) 2005, Hervé Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *