openjpeg version 1.0 (previous version still available with tag opj0-97)

This commit is contained in:
Antonin Descampe 2005-12-02 13:34:15 +00:00
parent 76016d509b
commit f61cda9b7d
50 changed files with 11078 additions and 9286 deletions

View File

@ -1,6 +1,6 @@
/* /*
* Copyright (c) 1987, 1993, 1994 * Copyright (c) 1987, 1993, 1994
* The Regents of the University of California. All rights reserved. * The Regents of the University of California. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
@ -12,8 +12,8 @@
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software * 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement: * must display the following acknowledgement:
* This product includes software developed by the University of * This product includes software developed by the University of
* California, Berkeley and its contributors. * California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors * 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software * may be used to endorse or promote products derived from this software
* without specific prior written permission. * without specific prior written permission.
@ -34,48 +34,44 @@
/* last review : october 29th, 2002 */ /* last review : october 29th, 2002 */
#if defined(LIBC_SCCS) && !defined(lint) #if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)getopt.c 8.3 (Berkeley) 4/27/95"; static char sccsid[] = "@(#)getopt.c 8.3 (Berkeley) 4/27/95";
#endif /* LIBC_SCCS and not lint */ #endif /* LIBC_SCCS and not lint */
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
int opterr = 1, /* if error message should be printed */ int opterr = 1, /* if error message should be printed */
optind = 1, /* index into parent argv vector */ optind = 1, /* index into parent argv vector */
optopt, /* character checked for validity */ optopt, /* character checked for validity */
optreset; /* reset getopt */ optreset; /* reset getopt */
char *optarg; /* argument associated with option */ char *optarg; /* argument associated with option */
#define BADCH (int)'?' #define BADCH (int)'?'
#define BADARG (int)':' #define BADARG (int)':'
#define EMSG "" #define EMSG ""
/* /*
* getopt -- * getopt --
* Parse argc/argv argument vector. * Parse argc/argv argument vector.
*/ */
int getopt(nargc, nargv, ostr) int getopt(int nargc, char *const *nargv, const char *ostr) {
int nargc;
char *const *nargv;
const char *ostr;
{
# define __progname nargv[0] # define __progname nargv[0]
static char *place = EMSG; /* option letter processing */ static char *place = EMSG; /* option letter processing */
char *oli; /* option letter list index */ char *oli; /* option letter list index */
if (optreset || !*place) { /* update scanning pointer */ if (optreset || !*place) { /* update scanning pointer */
optreset = 0; optreset = 0;
if (optind >= nargc || *(place = nargv[optind]) != '-') { if (optind >= nargc || *(place = nargv[optind]) != '-') {
place = EMSG; place = EMSG;
return (-1); return (-1);
} }
if (place[1] && *++place == '-') { /* found "--" */ if (place[1] && *++place == '-') { /* found "--" */
++optind; ++optind;
place = EMSG; place = EMSG;
return (-1); return (-1);
} }
} /* option letter okay? */ } /* option letter okay? */
if ((optopt = (int) *place++) == (int) ':' || if ((optopt = (int) *place++) == (int) ':' ||
!(oli = strchr(ostr, optopt))) { !(oli = strchr(ostr, optopt))) {
/* /*
@ -88,29 +84,29 @@ const char *ostr;
++optind; ++optind;
if (opterr && *ostr != ':') if (opterr && *ostr != ':')
(void) fprintf(stderr, (void) fprintf(stderr,
"%s: illegal option -- %c\n", __progname, optopt); "%s: illegal option -- %c\n", __progname, optopt);
return (BADCH); return (BADCH);
} }
if (*++oli != ':') { /* don't need argument */ if (*++oli != ':') { /* don't need argument */
optarg = NULL; optarg = NULL;
if (!*place) if (!*place)
++optind; ++optind;
} else { /* need an argument */ } else { /* need an argument */
if (*place) /* no white space */ if (*place) /* no white space */
optarg = place; optarg = place;
else if (nargc <= ++optind) { /* no arg */ else if (nargc <= ++optind) { /* no arg */
place = EMSG; place = EMSG;
if (*ostr == ':') if (*ostr == ':')
return (BADARG); return (BADARG);
if (opterr) if (opterr)
(void) fprintf(stderr, (void) fprintf(stderr,
"%s: option requires an argument -- %c\n", "%s: option requires an argument -- %c\n",
__progname, optopt); __progname, optopt);
return (BADCH); return (BADCH);
} else /* white space */ } else /* white space */
optarg = nargv[optind]; optarg = nargv[optind];
place = EMSG; place = EMSG;
++optind; ++optind;
} }
return (optopt); /* dump back option letter */ return (optopt); /* dump back option letter */
} }

View File

@ -11,4 +11,4 @@ extern char *optarg;
extern int getopt(int nargc, char *const *nargv, const char *ostr); extern int getopt(int nargc, char *const *nargv, const char *ostr);
#endif /* _GETOPT_H_ */ #endif /* _GETOPT_H_ */

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,9 @@
/* /*
* 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) 2002-2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -26,14 +28,27 @@
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "j2k.h"
int bmptoimage(char *filename, j2k_image_t * img, int subsampling_dx, #ifndef __J2K_CONVERT_H
int subsampling_dy, int Dim[2]); #define __J2K_CONVERT_H
int pgxtoimage(char *filename, j2k_image_t * img, int tdy, opj_image_t* bmptoimage(char *filename, opj_cparameters_t *parameters);
int subsampling_dx, int subsampling_dy, int Dim[2],
j2k_cp_t cp); int imagetobmp(opj_image_t *image, char *outfile);
/**
Load a single image component encoded in PGX file format
@param filename Name of the PGX file to load
@param parameters *List ?*
@return Returns a greyscale image if successful, returns NULL otherwise
*/
opj_image_t* pgxtoimage(char *filename, opj_cparameters_t *parameters);
int imagetopgx(opj_image_t *image, char *outfile);
opj_image_t* pnmtoimage(char *filename, opj_cparameters_t *parameters);
int imagetopnm(opj_image_t *image, char *outfile);
#endif /* __J2K_CONVERT_H */
int pnmtoimage(char *filename, j2k_image_t * img, int subsampling_dx,
int subsampling_dy, int Dim[2]);

File diff suppressed because it is too large Load Diff

View File

@ -41,15 +41,15 @@ RSC=rc.exe
# PROP Intermediate_Dir "Release" # PROP Intermediate_Dir "Release"
# PROP Target_Dir "" # PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
# ADD CPP /nologo /W3 /GX /O2 /I "../libopenjpeg" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "DONT_HAVE_GETOPT" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /I "../libopenjpeg" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
# ADD BASE RSC /l 0x80c /d "NDEBUG" # ADD BASE RSC /l 0x40c /d "NDEBUG"
# ADD RSC /l 0x80c /i "../libopenjpeg" /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG"
BSC32=bscmake.exe BSC32=bscmake.exe
# ADD BASE BSC32 /nologo # ADD BASE BSC32 /nologo
# ADD BSC32 /nologo # ADD BSC32 /nologo
LINK32=link.exe LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
!ELSEIF "$(CFG)" == "image_to_j2k - Win32 Debug" !ELSEIF "$(CFG)" == "image_to_j2k - Win32 Debug"
@ -62,18 +62,17 @@ LINK32=link.exe
# PROP Use_Debug_Libraries 1 # PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug" # PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug" # PROP Intermediate_Dir "Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir "" # PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../libopenjpeg" /D "_DEBUG" /D "DONT_HAVE_GETOPT" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /FR /YX /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../libopenjpeg" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
# ADD BASE RSC /l 0x80c /d "_DEBUG" # ADD BASE RSC /l 0x40c /d "_DEBUG"
# ADD RSC /l 0x80c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG"
BSC32=bscmake.exe BSC32=bscmake.exe
# ADD BASE BSC32 /nologo # ADD BASE BSC32 /nologo
# ADD BSC32 /nologo # ADD BSC32 /nologo
LINK32=link.exe LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
!ENDIF !ENDIF
@ -81,108 +80,17 @@ LINK32=link.exe
# Name "image_to_j2k - Win32 Release" # Name "image_to_j2k - Win32 Release"
# Name "image_to_j2k - Win32 Debug" # Name "image_to_j2k - 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 # Begin Source File
SOURCE=.\convert.c SOURCE=.\convert.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\libopenjpeg\dwt.c
# End Source File
# Begin Source File
SOURCE=..\libopenjpeg\fix.c
# End Source File
# Begin Source File
SOURCE=.\compat\getopt.c
# End Source File
# Begin Source File
SOURCE=.\image_to_j2k.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\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\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=.\convert.h SOURCE=.\convert.h
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\libopenjpeg\dwt.h SOURCE=.\compat\getopt.c
# End Source File
# Begin Source File
SOURCE=..\libopenjpeg\fix.h
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -190,60 +98,7 @@ SOURCE=.\compat\getopt.h
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\libopenjpeg\int.h SOURCE=.\image_to_j2k.c
# End Source File # End Source File
# Begin Source File
SOURCE=..\libopenjpeg\j2k.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\pi.h
# End Source File
# Begin Source File
SOURCE=..\libopenjpeg\raw.h
# End Source File
# Begin Source File
SOURCE=..\libopenjpeg\t1.h
# End Source File
# Begin Source File
SOURCE=..\libopenjpeg\t2.h
# End Source File
# Begin Source File
SOURCE=..\libopenjpeg\tcd.h
# End Source File
# Begin Source File
SOURCE=..\libopenjpeg\tgt.h
# End Source File
# End Group
# Begin Group "Resource Files"
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
# End Group
# End Target # End Target
# End Project # End Project

File diff suppressed because it is too large Load Diff

View File

@ -39,40 +39,41 @@ RSC=rc.exe
# PROP Use_Debug_Libraries 0 # PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release" # PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release" # PROP Intermediate_Dir "Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir "" # PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
# ADD CPP /nologo /W3 /GX /O2 /I "../libopenjpeg" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "DONT_HAVE_GETOPT" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /I "../libopenjpeg" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
# ADD BASE RSC /l 0x80c /d "NDEBUG" # ADD BASE RSC /l 0x40c /d "NDEBUG"
# ADD RSC /l 0x80c /d "NDEBUG" # ADD RSC /l 0x40c /d "NDEBUG"
BSC32=bscmake.exe BSC32=bscmake.exe
# ADD BASE BSC32 /nologo # ADD BASE BSC32 /nologo
# ADD BSC32 /nologo # ADD BSC32 /nologo
LINK32=link.exe LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
!ELSEIF "$(CFG)" == "j2k_to_image - Win32 Debug" !ELSEIF "$(CFG)" == "j2k_to_image - Win32 Debug"
# PROP BASE Use_MFC 0 # PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1 # PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "j2k_to_image___Win32_Debug" # PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "j2k_to_image___Win32_Debug" # PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir "" # PROP BASE Target_Dir ""
# PROP Use_MFC 0 # PROP Use_MFC 0
# PROP Use_Debug_Libraries 1 # PROP Use_Debug_Libraries 1
# PROP Output_Dir "j2k_to_image___Win32_Debug" # PROP Output_Dir "Debug"
# PROP Intermediate_Dir "j2k_to_image___Win32_Debug" # PROP Intermediate_Dir "Debug"
# PROP Target_Dir "" # PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../libopenjpeg" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "DONT_HAVE_GETOPT" /YX /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../libopenjpeg" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
# ADD BASE RSC /l 0x80c /d "_DEBUG" # ADD BASE RSC /l 0x40c /d "_DEBUG"
# ADD RSC /l 0x80c /d "_DEBUG" # ADD RSC /l 0x40c /d "_DEBUG"
BSC32=bscmake.exe BSC32=bscmake.exe
# ADD BASE BSC32 /nologo # ADD BASE BSC32 /nologo
# ADD BSC32 /nologo # ADD BSC32 /nologo
LINK32=link.exe LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
!ENDIF !ENDIF
@ -80,24 +81,13 @@ LINK32=link.exe
# Name "j2k_to_image - Win32 Release" # Name "j2k_to_image - Win32 Release"
# Name "j2k_to_image - Win32 Debug" # Name "j2k_to_image - Win32 Debug"
# Begin Group "Source Files"
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File # Begin Source File
SOURCE=..\libopenjpeg\bio.c SOURCE=.\convert.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\libopenjpeg\cio.c SOURCE=.\convert.h
# End Source File
# Begin Source File
SOURCE=..\libopenjpeg\dwt.c
# End Source File
# Begin Source File
SOURCE=..\libopenjpeg\fix.c
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -105,136 +95,11 @@ SOURCE=.\compat\getopt.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\libopenjpeg\int.c SOURCE=.\compat\getopt.h
# End Source File
# Begin Source File
SOURCE=..\libopenjpeg\j2k.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\j2k_to_image.c SOURCE=.\j2k_to_image.c
# End Source File # 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\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\fix.h
# End Source File
# Begin Source File
SOURCE=.\compat\getopt.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\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\pi.h
# End Source File
# Begin Source File
SOURCE=..\libopenjpeg\raw.h
# End Source File
# Begin Source File
SOURCE=..\libopenjpeg\t1.h
# End Source File
# Begin Source File
SOURCE=..\libopenjpeg\t2.h
# End Source File
# Begin Source File
SOURCE=..\libopenjpeg\tcd.h
# End Source File
# Begin Source File
SOURCE=..\libopenjpeg\tgt.h
# End Source File
# End Group
# Begin Group "Resource Files"
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
# End Group
# End Target # End Target
# End Project # End Project

256
libopenjpeg/LibOpenJPEG.dsp Normal file
View File

@ -0,0 +1,256 @@
# 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" /YX /FD /c
# 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
!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" /YX /FD /GZ /c
# 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
!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=.\bio.c
# End Source File
# Begin Source File
SOURCE=.\cio.c
# End Source File
# Begin Source File
SOURCE=.\dwt.c
# End Source File
# Begin Source File
SOURCE=.\event.c
# End Source File
# Begin Source File
SOURCE=.\fix.c
# End Source File
# Begin Source File
SOURCE=.\image.c
# End Source File
# Begin Source File
SOURCE=.\int.c
# End Source File
# Begin Source File
SOURCE=.\j2k.c
# End Source File
# Begin Source File
SOURCE=.\j2k_lib.c
# End Source File
# Begin Source File
SOURCE=.\jp2.c
# End Source File
# Begin Source File
SOURCE=.\jpt.c
# End Source File
# Begin Source File
SOURCE=.\mct.c
# End Source File
# Begin Source File
SOURCE=.\mqc.c
# End Source File
# Begin Source File
SOURCE=.\openjpeg.c
# End Source File
# Begin Source File
SOURCE=.\pi.c
# End Source File
# Begin Source File
SOURCE=.\raw.c
# End Source File
# Begin Source File
SOURCE=.\t1.c
# End Source File
# Begin Source File
SOURCE=.\t2.c
# End Source File
# Begin Source File
SOURCE=.\tcd.c
# End Source File
# Begin Source File
SOURCE=.\tgt.c
# End Source File
# End Group
# Begin Group "Header Files"
# PROP Default_Filter "h;hpp;hxx;hm;inl"
# Begin Source File
SOURCE=.\bio.h
# End Source File
# Begin Source File
SOURCE=.\cio.h
# End Source File
# Begin Source File
SOURCE=.\dwt.h
# End Source File
# Begin Source File
SOURCE=.\event.h
# End Source File
# Begin Source File
SOURCE=.\fix.h
# End Source File
# Begin Source File
SOURCE=.\image.h
# End Source File
# Begin Source File
SOURCE=.\int.h
# End Source File
# Begin Source File
SOURCE=.\j2k.h
# End Source File
# Begin Source File
SOURCE=.\j2k_lib.h
# End Source File
# Begin Source File
SOURCE=.\jp2.h
# End Source File
# Begin Source File
SOURCE=.\jpt.h
# End Source File
# Begin Source File
SOURCE=.\mct.h
# End Source File
# Begin Source File
SOURCE=.\mqc.h
# End Source File
# Begin Source File
SOURCE=.\openjpeg.h
# End Source File
# Begin Source File
SOURCE=.\opj_includes.h
# End Source File
# Begin Source File
SOURCE=.\pi.h
# End Source File
# Begin Source File
SOURCE=.\raw.h
# End Source File
# Begin Source File
SOURCE=.\t1.h
# End Source File
# Begin Source File
SOURCE=.\t2.h
# End Source File
# Begin Source File
SOURCE=.\tcd.h
# End Source File
# Begin Source File
SOURCE=.\tgt.h
# End Source File
# End Group
# End Target
# End Project

View File

@ -1,8 +1,9 @@
/* /*
* Copyright (c) 2001-2002, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2003, Yannick Verschueren * Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* * Copyright (c) 2005, Herv<EFBFBD> Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -25,170 +26,127 @@
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
***/
#include "bio.h"
#include <stdio.h>
#include <setjmp.h>
static unsigned char *bio_start; /* pointer to the start of the buffer */
static unsigned char *bio_end; /* pointer to the end of the buffer */
static unsigned char *bio_bp; /* pointer to the present position in the buffer */
static unsigned int bio_buf; /* temporary place where each byte is read or written */
static int bio_ct; /* coder : number of bits free to write // decoder : number of bits read */
extern jmp_buf j2k_error;
/*
* Number of bytes written.
*/ */
int bio_numbytes()
{
return bio_bp - bio_start;
}
/*
* Init encoder.
*
* bp : Output buffer
* len : Output buffer length
*/
void bio_init_enc(unsigned char *bp, int len)
{
bio_start = bp;
bio_end = bp + len;
bio_bp = bp;
bio_buf = 0;
bio_ct = 8;
}
/* #include "opj_includes.h"
* Init decoder.
*
* bp : Input buffer
* len : Input buffer length
*/
void bio_init_dec(unsigned char *bp, int len)
{
bio_start = bp;
bio_end = bp + len;
bio_bp = bp;
bio_buf = 0;
bio_ct = 0;
}
/* /*
* Write byte. --> function modified to eliminate longjmp !!! ==========================================================
* local functions
*/ ==========================================================
int bio_byteout() */
{
bio_buf = (bio_buf << 8) & 0xffff; static int bio_byteout(opj_bio_t *bio) {
bio_ct = bio_buf == 0xff00 ? 7 : 8; bio->buf = (bio->buf << 8) & 0xffff;
if (bio_bp >= bio_end) bio->ct = bio->buf == 0xff00 ? 7 : 8;
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) {
* Read byte. --> function modified to eliminate longjmp !! bio->buf = (bio->buf << 8) & 0xffff;
* bio->ct = bio->buf == 0xff00 ? 7 : 8;
*/ if (bio->bp >= bio->end) {
int bio_bytein()
{
bio_buf = (bio_buf << 8) & 0xffff;
bio_ct = bio_buf == 0xff00 ? 7 : 8;
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) {
* Write bit. if (bio->ct == 0) {
* bio_byteout(bio);
* b : Bit to write (0 or 1)
*/
void bio_putbit(int b)
{
if (bio_ct == 0) {
bio_byteout();
} }
bio_ct--; bio->ct--;
bio_buf |= b << bio_ct; bio->buf |= b << bio->ct;
} }
/* static int bio_getbit(opj_bio_t *bio) {
* Read bit. if (bio->ct == 0) {
* bio_bytein(bio);
*/
int bio_getbit()
{
if (bio_ct == 0) {
bio_bytein();
} }
bio_ct--; bio->ct--;
return (bio_buf >> bio_ct) & 1; return (bio->buf >> bio->ct) & 1;
} }
/* /*
* Write bits. ==========================================================
* Bit Input/Output interface
* v : Value of bits ==========================================================
* n : Number of bits to write */
*/
void bio_write(int v, int n) opj_bio_t* bio_create() {
{ opj_bio_t *bio = (opj_bio_t*)opj_malloc(sizeof(opj_bio_t));
return bio;
}
void bio_destroy(opj_bio_t *bio) {
if(bio) {
opj_free(bio);
}
}
int bio_numbytes(opj_bio_t *bio) {
return (bio->bp - bio->start);
}
void bio_init_enc(opj_bio_t *bio, unsigned char *bp, int len) {
bio->start = bp;
bio->end = bp + len;
bio->bp = bp;
bio->buf = 0;
bio->ct = 8;
}
void bio_init_dec(opj_bio_t *bio, unsigned char *bp, int len) {
bio->start = bp;
bio->end = bp + len;
bio->bp = bp;
bio->buf = 0;
bio->ct = 0;
}
void bio_write(opj_bio_t *bio, int v, int n) {
int i; int i;
for (i = n - 1; i >= 0; i--) { for (i = n - 1; i >= 0; i--) {
bio_putbit((v >> i) & 1); bio_putbit(bio, (v >> i) & 1);
} }
} }
/* int bio_read(opj_bio_t *bio, int n) {
* Read bits.
*
* n : Number of bits to read
*/
int bio_read(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() << i; v += bio_getbit(bio) << i;
} }
return v; return v;
} }
/* int bio_flush(opj_bio_t *bio) {
* Flush bits. Modified to eliminate longjmp !! bio->ct = 0;
* if (bio_byteout(bio)) {
*/
int bio_flush()
{
bio_ct = 0;
if (bio_byteout())
return 1; return 1;
if (bio_ct == 7) { }
bio_ct = 0; if (bio->ct == 7) {
bio->ct = 0;
if (bio_byteout()) if (bio_byteout(bio)) {
return 1; return 1;
}
} }
return 0; return 0;
} }
/* int bio_inalign(opj_bio_t *bio) {
* Passes the ending bits (coming from flushing) bio->ct = 0;
*/ if ((bio->buf & 0xff) == 0xff) {
int bio_inalign() if (bio_bytein(bio)) {
{
bio_ct = 0;
if ((bio_buf & 0xff) == 0xff) {
if (bio_bytein())
return 1; return 1;
bio_ct = 0; }
bio->ct = 0;
} }
return 0; return 0;
} }

View File

@ -1,7 +1,9 @@
/* /*
* Copyright (c) 2001-2002, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2003, Yannick Verschueren * Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -26,50 +28,128 @@
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#ifndef __BIO_H #ifndef __BIO_H
#define __BIO_H #define __BIO_H
/**
@file bio.h
@brief Implementation of an individual bit input-output (BIO)
/* The functions in BIO.C have for goal to realize an individual bit input - output.
* Number of bytes written. */
*/
int bio_numbytes();
/* /** @defgroup BIO BIO - Individual bit input-output stream */
* Init encoder. /*@{*/
*
* bp : Output buffer
* len : Output buffer length
*/
void bio_init_enc(unsigned char *bp, int len);
/* /**
* Init decoder. Individual bit input-output stream (BIO)
* */
* bp : Input buffer typedef struct opj_bio {
* len : Input buffer length /** pointer to the start of the buffer */
*/ unsigned char *start;
void bio_init_dec(unsigned char *bp, int len); /** pointer to the end of the buffer */
unsigned char *end;
/** pointer to the present position in the buffer */
unsigned char *bp;
/** temporary place where each byte is read or written */
unsigned int buf;
/** coder : number of bits free to write. decoder : number of bits read */
int ct;
} opj_bio_t;
/* /** @name Local static functions */
* Write bits. /*@{*/
* /* ----------------------------------------------------------------------- */
* v : Value of bits /**
* n : Number of bits to write Write a bit
*/ @param bio BIO handle
void bio_write(int v, int n); @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 */
* Read bits. /*@{*/
* /* ----------------------------------------------------------------------- */
* n : Number of bits to read /**
*/ Create a new BIO handle
int bio_read(int n); @return Returns a new BIO handle if successful, returns NULL otherwise
*/
opj_bio_t* bio_create();
/**
Destroy a previously created BIO handle
@param bio BIO handle to destroy
*/
void bio_destroy(opj_bio_t *bio);
/**
Number of bytes written.
@param bio BIO handle
@return Returns the number of bytes written
*/
int bio_numbytes(opj_bio_t *bio);
/**
Init encoder
@param bio BIO handle
@param bp Output buffer
@param len Output buffer length
*/
void bio_init_enc(opj_bio_t *bio, unsigned char *bp, int len);
/**
Init decoder
@param bio BIO handle
@param bp Input buffer
@param len Input buffer length
*/
void bio_init_dec(opj_bio_t *bio, unsigned char *bp, int len);
/**
Write bits
@param bio BIO handle
@param v Value of bits
@param n Number of bits to write
*/
void bio_write(opj_bio_t *bio, int v, int n);
/**
Read bits
@param bio BIO handle
@param n Number of bits to read
@return Returns the corresponding read number
*/
int bio_read(opj_bio_t *bio, int n);
/**
Flush bits
@param bio BIO handle
@return Returns 1 if successful, returns 0 otherwise
*/
int bio_flush(opj_bio_t *bio);
/**
Passes the ending bits (coming from flushing)
@param bio BIO handle
@return Returns 1 if successful, returns 0 otherwise
*/
int bio_inalign(opj_bio_t *bio);
/* ----------------------------------------------------------------------- */
/*@}*/
/* /*@}*/
* Flush bits. Modified to eliminate longjmp !!
*/
int bio_flush();
int bio_inalign(); /* modified to eliminated longjmp !! */ #endif /* __BIO_H */
#endif

View File

@ -1,5 +1,9 @@
/* /*
* Copyright (c) 2001-2002, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -24,30 +28,75 @@
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "cio.h"
#include <setjmp.h>
#include <memory.h>
static unsigned char *cio_start; /* pointer to the start of the stream */ #include "opj_includes.h"
static unsigned char *cio_end; /* pointer to the end of the stream */
static unsigned char *cio_bp; /* pointer to the present position */
extern jmp_buf j2k_error; /* ----------------------------------------------------------------------- */
/* opj_cio_t* opj_cio_open(opj_common_ptr cinfo, unsigned char *buffer, int length) {
* Number of bytes written. opj_cp_t *cp = NULL;
*/ opj_cio_t *cio = (opj_cio_t*)opj_malloc(sizeof(opj_cio_t));
int cio_numbytes() if(!cio) return NULL;
{ cio->cinfo = cinfo;
return cio_bp - cio_start; if(buffer && length) {
/* wrap a user buffer containing the encoded image */
cio->openmode = OPJ_STREAM_READ;
cio->buffer = buffer;
cio->length = length;
}
else if(!buffer && !length && cinfo) {
/* allocate a buffer for the encoded image */
cio->openmode = OPJ_STREAM_WRITE;
switch(cinfo->codec_format) {
case CODEC_J2K:
cp = ((opj_j2k_t*)cinfo->j2k_handle)->cp;
break;
case CODEC_JP2:
cp = ((opj_jp2_t*)cinfo->jp2_handle)->j2k->cp;
break;
default:
opj_free(cio);
return NULL;
}
cio->length = cp->tdx * cp->tdy * cp->tw * cp->th * 2;
cio->buffer = (unsigned char *)opj_malloc(cio->length);
if(!cio->buffer) {
opj_free(cio);
return NULL;
}
}
else {
opj_free(cio);
return NULL;
}
/* Initialize byte IO */
cio->start = cio->buffer;
cio->end = cio->buffer + cio->length;
cio->bp = cio->buffer;
return cio;
} }
void opj_cio_close(opj_cio_t *cio) {
if(cio) {
if(cio->openmode == OPJ_STREAM_WRITE) {
/* destroy the allocated buffer */
opj_free(cio->buffer);
}
/* destroy the cio */
opj_free(cio);
}
}
/* ----------------------------------------------------------------------- */
/* /*
* Get position in byte stream. * Get position in byte stream.
*/ */
int cio_tell() int cio_tell(opj_cio_t *cio) {
{ return cio->bp - cio->start;
return cio_bp - cio_start;
} }
/* /*
@ -55,59 +104,45 @@ int cio_tell()
* *
* 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(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() 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() unsigned char *cio_getbp(opj_cio_t *cio) {
{ return cio->bp;
return cio_bp;
}
/*
* Initialize byte IO
*
* bp : destination/source stream
* len : length of the stream
*/
void cio_init(unsigned char *bp, int len)
{
cio_start = bp;
cio_end = bp + len;
cio_bp = bp;
} }
/* /*
* Write a byte. * Write a byte.
*/ */
void cio_byteout(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");
longjmp(j2k_error, 1); return false;
*cio_bp++ = v; }
*cio->bp++ = v;
return true;
} }
/* /*
* Read a byte. * Read a byte.
*/ */
unsigned char cio_bytein() 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");
longjmp(j2k_error, 1); return 0;
return *cio_bp++; }
return *cio->bp++;
} }
/* /*
@ -116,12 +151,13 @@ unsigned char cio_bytein()
* v : value to write * v : value to write
* n : number of bytes to write * n : number of bytes to write
*/ */
void cio_write(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--) {
cio_byteout((unsigned char) ((v >> (i << 3)) & 0xff)); if( !cio_byteout(cio, (unsigned char) ((v >> (i << 3)) & 0xff)) )
return 0;
} }
return n;
} }
/* /*
@ -131,13 +167,12 @@ void cio_write(unsigned int v, int n)
* *
* return : value of the n bytes read * return : value of the n bytes read
*/ */
unsigned int cio_read(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() << (i << 3); v += cio_bytein(cio) << (i << 3);
} }
return v; return v;
} }
@ -147,33 +182,9 @@ unsigned int cio_read(int n)
* *
* n : number of bytes to skip * n : number of bytes to skip
*/ */
void cio_skip(int n) void cio_skip(opj_cio_t *cio, int n) {
{ cio->bp += n;
cio_bp += n;
} }
/*
* Read n bytes, copy to buffer
*
* n : number of bytes to transfer
*/
void cio_read_to_buf(unsigned char* src_buf, int n)/* Glenn adds */
{
if (cio_bp + n > cio_end)
longjmp(j2k_error, 1);
memcpy(cio_bp, src_buf, n);
cio_bp += n;
}
/*
* Write n bytes, copy from buffer
*
* n : number of bytes to transfer
*/
void cio_write_from_buf(unsigned char* dest_buf, int n)/* Glenn adds */
{
if (cio_bp + n > cio_end)
longjmp(j2k_error, 1);
memcpy(dest_buf, cio_bp, n);
cio_bp += n;
}

View File

@ -1,5 +1,9 @@
/* /*
* Copyright (c) 2001-2002, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -24,84 +28,59 @@
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#ifndef __CIO_H #ifndef __CIO_H
#define __CIO_H #define __CIO_H
/**
@file cio.h
@brief Implementation of a byte input-output process (CIO)
/* The functions in CIO.C have for goal to realize a byte input / output process.
* Number of bytes written. */
*
* returns number of bytes written
*/
int cio_numbytes();
/* /** @defgroup CIO CIO - byte input-output stream */
* Get position in byte stream. /*@{*/
*
* return position in bytes
*/
int cio_tell();
/* /** @name Exported functions (see also openjpeg.h) */
* Set position in byte stream. /*@{*/
* /* ----------------------------------------------------------------------- */
* pos : position, in number of bytes, from the beginning of the stream /**
*/ Number of bytes left before the end of the stream
void cio_seek(int pos); @param cio CIO handle
@return Returns the number of bytes before the end of the stream
*/
int cio_numbytesleft(opj_cio_t *cio);
/**
Get pointer to the current position in the stream
@param cio CIO handle
@return Returns a pointer to the current position
*/
unsigned char *cio_getbp(opj_cio_t *cio);
/**
Write some bytes
@param cio CIO handle
@param v Value to write
@param n Number of bytes to write
@return Returns the number of bytes written or 0 if an error occured
*/
unsigned int cio_write(opj_cio_t *cio, unsigned int v, int n);
/**
Read some bytes
@param cio CIO handle
@param n Number of bytes to read
@return Returns the value of the n bytes read
*/
unsigned int cio_read(opj_cio_t *cio, int n);
/**
Skip some bytes
@param cio CIO handle
@param n Number of bytes to skip
*/
void cio_skip(opj_cio_t *cio, int n);
/* ----------------------------------------------------------------------- */
/*@}*/
/* /*@}*/
* Number of bytes left before the end of the stream.
*
* Returns the number of bytes before the end of the stream
*/
int cio_numbytesleft();
/* #endif /* __CIO_H */
* Get pointer to the current position in the stream.
*
* return : pointer to the position
*/
unsigned char *cio_getbp();
/*
* Initialize byte IO
*
* bp : destination/source stream
* len : length of the stream
*/
void cio_init(unsigned char *bp, int len);
/*
* Write some bytes.
*
* v : value to write
* n : number of bytes to write
*/
void cio_write(unsigned int v, int n);
/*
* Read some bytes.
*
* n : number of bytes to read
*
* return : value of the n bytes read
*/
unsigned int cio_read(int n);
/*
* Skip some bytes.
*
* n : number of bytes to skip
*/
void cio_skip(int n);
/*
* Read n bytes, copy to buffer
*/
void cio_read_to_buf(unsigned char* src_buf, int n);/* Glenn Pearson adds */
/*
* Write n bytes, copy from buffer
*/
void cio_write_from_buf(unsigned char* dest_buf, int n);/* Glenn Pearson adds */
#endif

View File

@ -1,8 +1,9 @@
/* /*
* Copyright (c) 2001-2002, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2004, Yannick Verschueren * Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2002-2004, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, Reiner Wahler * Copyright (c) 2005, HervŽ Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -50,11 +51,7 @@
*/ */
#include "dwt.h" #include "opj_includes.h"
#include "int.h"
#include "fix.h"
#include "tcd.h"
#include <stdlib.h>
#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)]
@ -67,7 +64,7 @@
/* <summary> */ /* <summary> */
/* 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> */
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},
@ -77,19 +74,24 @@ double dwt_norms[4][10] = {
/* <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> */
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}
}; };
/*
==========================================================
local functions
==========================================================
*/
/* <summary> */ /* <summary> */
/* Forward lazy transform (horizontal). */ /* Forward lazy transform (horizontal). */
/* </summary> */ /* </summary> */
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)];
} }
@ -97,7 +99,7 @@ void dwt_deinterleave_h(int *a, int *b, int dn, int sn, int cas) {
/* <summary> */ /* <summary> */
/* Forward lazy transform (vertical). */ /* Forward lazy transform (vertical). */
/* </summary> */ /* </summary> */
void dwt_deinterleave_v(int *a, int *b, int dn, int sn, int x, int cas) { static void dwt_deinterleave_v(int *a, int *b, int dn, int sn, int x, int cas) {
int i; int i;
for (i=0; i<sn; i++) b[i*x]=a[2*i+cas]; for (i=0; i<sn; i++) b[i*x]=a[2*i+cas];
for (i=0; i<dn; i++) b[(sn+i)*x]=a[(2*i+1-cas)]; for (i=0; i<dn; i++) b[(sn+i)*x]=a[(2*i+1-cas)];
@ -106,42 +108,46 @@ void dwt_deinterleave_v(int *a, int *b, int dn, int sn, int x, int cas) {
/* <summary> */ /* <summary> */
/* Inverse lazy transform (horizontal). */ /* Inverse lazy transform (horizontal). */
/* </summary> */ /* </summary> */
void dwt_interleave_h(int *a, int *b, int dn, int sn, int cas) { static void dwt_interleave_h(int *a, int *b, int dn, int sn, int cas) {
int i; int i;
/* for (i=0; i<sn; i++) b[2*i+cas]=a[i];*/ int *ai = NULL;
/* for (i=0; i<dn; i++) b[2*i+1-cas]=a[(sn+i)];*/ int *bi = NULL;
int* ai; ai = a;
int* bi; bi = b + cas;
ai=a; for (i = 0; i < sn; i++) {
bi=b+cas; *bi = *ai;
for (i=0; i<sn; i++) { bi += 2;
*bi = *ai; 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+=2; ai++; *bi = *ai;
bi += 2;
ai++;
} }
} }
/* <summary> */ /* <summary> */
/* Inverse lazy transform (vertical). */ /* Inverse lazy transform (vertical). */
/* </summary> */ /* </summary> */
void dwt_interleave_v(int *a, int *b, int dn, int sn, int x, int cas) { static void dwt_interleave_v(int *a, int *b, int dn, int sn, int x, int cas) {
int i; int i;
/* for (i=0; i<sn; i++) b[2*i+cas]=a[i*x];*/ int *ai = NULL;
/* for (i=0; i<dn; i++) b[2*i+1-cas]=a[(sn+i)*x];*/ int *bi = NULL;
int* ai; ai = a;
int* bi; bi = b + cas;
ai=a; for (i = 0; i < sn; i++) {
bi=b+cas; *bi = *ai;
for (i=0; i<sn; i++) { bi += 2;
*bi = *ai; 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+=2; ai+=x; *bi = *ai;
bi += 2;
ai += x;
} }
} }
@ -149,35 +155,32 @@ void dwt_interleave_v(int *a, int *b, int dn, int sn, int x, int cas) {
/* <summary> */ /* <summary> */
/* Forward 5-3 wavelet tranform in 1-D. */ /* Forward 5-3 wavelet tranform in 1-D. */
/* </summary> */ /* </summary> */
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> */
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;
} }
@ -191,61 +194,148 @@ void dwt_decode_1(int *a, int dn, int sn, int cas)
} }
} }
/* <summary> */
/* Forward 9-7 wavelet transform in 1-D. */
/* </summary> */
static void dwt_encode_1_real(int *a, int dn, int sn, int cas) {
int i;
if (!cas) {
if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */
for (i = 0; i < dn; i++)
D(i) -= fix_mul(S_(i) + S_(i + 1), 12993);
for (i = 0; i < sn; i++)
S(i) -= fix_mul(D_(i - 1) + D_(i), 434);
for (i = 0; i < dn; i++)
D(i) += fix_mul(S_(i) + S_(i + 1), 7233);
for (i = 0; i < sn; i++)
S(i) += fix_mul(D_(i - 1) + D_(i), 3633);
for (i = 0; i < dn; i++)
D(i) = fix_mul(D(i), 5038); /*5038 */
for (i = 0; i < sn; i++)
S(i) = fix_mul(S(i), 6659); /*6660 */
}
} else {
if ((sn > 0) || (dn > 1)) { /* NEW : CASE ONE ELEMENT */
for (i = 0; i < dn; i++)
S(i) -= fix_mul(DD_(i) + DD_(i - 1), 12993);
for (i = 0; i < sn; i++)
D(i) -= fix_mul(SS_(i) + SS_(i + 1), 434);
for (i = 0; i < dn; i++)
S(i) += fix_mul(DD_(i) + DD_(i - 1), 7233);
for (i = 0; i < sn; i++)
D(i) += fix_mul(SS_(i) + SS_(i + 1), 3633);
for (i = 0; i < dn; i++)
S(i) = fix_mul(S(i), 5038); /*5038 */
for (i = 0; i < sn; i++)
D(i) = fix_mul(D(i), 6659); /*6660 */
}
}
}
/* <summary> */
/* Inverse 9-7 wavelet transform in 1-D. */
/* </summary> */
static void dwt_decode_1_real(int *a, int dn, int sn, int cas) {
int i;
if (!cas) {
if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */
for (i = 0; i < sn; i++)
S(i) = fix_mul(S(i), 10078); /* 10076 */
for (i = 0; i < dn; i++)
D(i) = fix_mul(D(i), 13318); /* 13320 */
for (i = 0; i < sn; i++)
S(i) -= fix_mul(D_(i - 1) + D_(i), 3633);
for (i = 0; i < dn; i++)
D(i) -= fix_mul(S_(i) + S_(i + 1), 7233);
for (i = 0; i < sn; i++)
S(i) += fix_mul(D_(i - 1) + D_(i), 434);
for (i = 0; i < dn; i++)
D(i) += fix_mul(S_(i) + S_(i + 1), 12994); /* 12993 */
}
} else {
if ((sn > 0) || (dn > 1)) { /* NEW : CASE ONE ELEMENT */
for (i = 0; i < sn; i++)
D(i) = fix_mul(D(i), 10078); /* 10076 */
for (i = 0; i < dn; i++)
S(i) = fix_mul(S(i), 13318); /* 13320 */
for (i = 0; i < sn; i++)
D(i) -= fix_mul(SS_(i) + SS_(i + 1), 3633);
for (i = 0; i < dn; i++)
S(i) -= fix_mul(DD_(i) + DD_(i - 1), 7233);
for (i = 0; i < sn; i++)
D(i) += fix_mul(SS_(i) + SS_(i + 1), 434);
for (i = 0; i < dn; i++)
S(i) += fix_mul(DD_(i) + DD_(i - 1), 12994); /* 12993 */
}
}
}
static void dwt_encode_stepsize(int stepsize, int numbps, opj_stepsize_t *bandno_stepsize) {
int p, n;
p = int_floorlog2(stepsize) - 13;
n = 11 - int_floorlog2(stepsize);
bandno_stepsize->mant = (n < 0 ? stepsize >> -n : stepsize << n) & 0x7ff;
bandno_stepsize->expn = numbps - p;
}
/*
==========================================================
DWT interface
==========================================================
*/
/* <summary> */ /* <summary> */
/* Forward 5-3 wavelet tranform in 2-D. */ /* Forward 5-3 wavelet tranform in 2-D. */
/* </summary> */ /* </summary> */
void dwt_encode(tcd_tilecomp_t * tilec) void dwt_encode(opj_tcd_tilecomp_t * tilec) {
{
int i, j, k; int i, j, k;
int* a; int *a = NULL;
int* aj; int *aj = NULL;
int* bj; 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*)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);
} }
free(bj); opj_free(bj);
sn = rw1; sn = rw1;
dn = rw - rw1; dn = rw - rw1;
bj=(int*)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);
} }
free(bj); opj_free(bj);
} }
} }
@ -253,57 +343,55 @@ void dwt_encode(tcd_tilecomp_t * tilec)
/* <summary> */ /* <summary> */
/* Inverse 5-3 wavelet tranform in 2-D. */ /* Inverse 5-3 wavelet tranform in 2-D. */
/* </summary> */ /* </summary> */
void dwt_decode(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; int *a = NULL;
int* aj; int *aj = NULL;
int* bj; 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*)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];
} }
free(bj); opj_free(bj);
sn = rh1; sn = rh1;
dn = rh - rh1; dn = rh - rh1;
bj=(int*)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];
} }
free(bj); opj_free(bj);
} }
} }
@ -311,8 +399,7 @@ void dwt_decode(tcd_tilecomp_t * tilec, int stop)
/* <summary> */ /* <summary> */
/* 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)
@ -323,143 +410,63 @@ int dwt_getgain(int orient)
/* <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> */
/* Forward 9-7 wavelet transform in 1-D. */
/* </summary> */
void dwt_encode_1_real(int *a, int dn, int sn, int cas)
{
int i;
if (!cas) {
if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */
for (i = 0; i < dn; i++)
D(i) -= fix_mul(S_(i) + S_(i + 1), 12993);
for (i = 0; i < sn; i++)
S(i) -= fix_mul(D_(i - 1) + D_(i), 434);
for (i = 0; i < dn; i++)
D(i) += fix_mul(S_(i) + S_(i + 1), 7233);
for (i = 0; i < sn; i++)
S(i) += fix_mul(D_(i - 1) + D_(i), 3633);
for (i = 0; i < dn; i++)
D(i) = fix_mul(D(i), 5038); /*5038 */
for (i = 0; i < sn; i++)
S(i) = fix_mul(S(i), 6659); /*6660 */
}
} else {
if ((sn > 0) || (dn > 1)) { /* NEW : CASE ONE ELEMENT */
for (i = 0; i < dn; i++)
S(i) -= fix_mul(DD_(i) + DD_(i - 1), 12993);
for (i = 0; i < sn; i++)
D(i) -= fix_mul(SS_(i) + SS_(i + 1), 434);
for (i = 0; i < dn; i++)
S(i) += fix_mul(DD_(i) + DD_(i - 1), 7233);
for (i = 0; i < sn; i++)
D(i) += fix_mul(SS_(i) + SS_(i + 1), 3633);
for (i = 0; i < dn; i++)
S(i) = fix_mul(S(i), 5038); /*5038 */
for (i = 0; i < sn; i++)
D(i) = fix_mul(D(i), 6659); /*6660 */
}
}
}
/* <summary> */
/* Inverse 9-7 wavelet transform in 1-D. */
/* </summary> */
void dwt_decode_1_real(int *a, int dn, int sn, int cas)
{
int i;
if (!cas) {
if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */
for (i = 0; i < sn; i++)
S(i) = fix_mul(S(i), 10078); /* 10076 */
for (i = 0; i < dn; i++)
D(i) = fix_mul(D(i), 13318); /* 13320 */
for (i = 0; i < sn; i++)
S(i) -= fix_mul(D_(i - 1) + D_(i), 3633);
for (i = 0; i < dn; i++)
D(i) -= fix_mul(S_(i) + S_(i + 1), 7233);
for (i = 0; i < sn; i++)
S(i) += fix_mul(D_(i - 1) + D_(i), 434);
for (i = 0; i < dn; i++)
D(i) += fix_mul(S_(i) + S_(i + 1), 12994); /* 12993 */
}
} else {
if ((sn > 0) || (dn > 1)) { /* NEW : CASE ONE ELEMENT */
for (i = 0; i < sn; i++)
D(i) = fix_mul(D(i), 10078); /* 10076 */
for (i = 0; i < dn; i++)
S(i) = fix_mul(S(i), 13318); /* 13320 */
for (i = 0; i < sn; i++)
D(i) -= fix_mul(SS_(i) + SS_(i + 1), 3633);
for (i = 0; i < dn; i++)
S(i) -= fix_mul(DD_(i) + DD_(i - 1), 7233);
for (i = 0; i < sn; i++)
D(i) += fix_mul(SS_(i) + SS_(i + 1), 434);
for (i = 0; i < dn; i++)
S(i) += fix_mul(DD_(i) + DD_(i - 1), 12994); /* 12993 */
}
}
}
/* <summary> */ /* <summary> */
/* Forward 9-7 wavelet transform in 2-D. */ /* Forward 9-7 wavelet transform in 2-D. */
/* </summary> */ /* </summary> */
void dwt_encode_real(tcd_tilecomp_t * tilec) void dwt_encode_real(opj_tcd_tilecomp_t * tilec) {
{
int i, j, k; int i, j, k;
int* a; int *a = NULL;
int* aj; int *aj = NULL;
int* bj; 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*)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);
} }
free(bj); opj_free(bj);
sn = rw1; sn = rw1;
dn = rw - rw1; dn = rw - rw1;
bj=(int*)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);
} }
free(bj); opj_free(bj);
} }
} }
@ -467,57 +474,55 @@ void dwt_encode_real(tcd_tilecomp_t * tilec)
/* <summary> */ /* <summary> */
/* Inverse 9-7 wavelet transform in 2-D. */ /* Inverse 9-7 wavelet transform in 2-D. */
/* </summary> */ /* </summary> */
void dwt_decode_real(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; int *a = NULL;
int* aj; int *aj = NULL;
int* bj; 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*)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];
} }
free(bj); opj_free(bj);
sn = rh1; sn = rh1;
dn = rh-rh1; dn = rh-rh1;
bj = (int*)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];
} }
free(bj); opj_free(bj);
} }
} }
@ -525,16 +530,34 @@ void dwt_decode_real(tcd_tilecomp_t * tilec, int stop)
/* <summary> */ /* <summary> */
/* 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) {
{
(void)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) {
int numbands, bandno;
numbands = 3 * tccp->numresolutions - 2;
for (bandno = 0; bandno < numbands; bandno++) {
double stepsize;
int resno, level, orient, gain;
resno = (bandno == 0) ? 0 : ((bandno - 1) / 3 + 1);
orient = (bandno == 0) ? 0 : ((bandno - 1) % 3 + 1);
level = tccp->numresolutions - 1 - resno;
gain = (tccp->qmfbid == 0) ? 0 : ((orient == 0) ? 0 : (((orient == 1) || (orient == 2)) ? 1 : 2));
if (tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) {
stepsize = 1.0;
} else {
double norm = dwt_norms_real[orient][level];
stepsize = (1 << (gain + 1)) / norm;
}
dwt_encode_stepsize((int) floor(stepsize * 8192.0), prec + gain, &tccp->stepsizes[bandno]);
}
}

View File

@ -1,7 +1,9 @@
/* /*
* Copyright (c) 2001-2002, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2002-2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -26,56 +28,126 @@
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "tcd.h"
#ifndef __DWT_H #ifndef __DWT_H
#define __DWT_H #define __DWT_H
/**
@file dwt.h
@brief Implementation of a discrete wavelet transform (DWT)
/* The functions in DWT.C have for goal to realize forward and inverse discret wavelet
* Apply a reversible DWT transform to a component of an image transform with filter 5-3 (reversible) and filter 9-7 (irreversible). The functions in
* tilec : tile component information (present tile) DWT.C are used by some function in TCD.C.
*/ */
/* void dwt_encode(int* a, int w, int h, int l); */
void dwt_encode(tcd_tilecomp_t * tilec);
/*
* Apply a reversible inverse DWT transform to a component of an image
* tilec : tile component information (present tile)
*/
void dwt_decode(tcd_tilecomp_t * tilec, int stop);
/* /** @defgroup DWT DWT - Implementation of a discrete wavelet transform */
* Get the gain of a subband for the reversible DWT /*@{*/
* orient: number that identifies the subband (0->LL, 1->HL, 2->LH, 3->HH)
*/ /** @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 */
/*@{*/
/* ----------------------------------------------------------------------- */
/**
Forward 5-3 wavelet tranform in 2-D.
Apply a reversible DWT transform to a component of an image.
@param tilec Tile component information (current tile)
*/
void dwt_encode(opj_tcd_tilecomp_t * tilec);
/**
Inverse 5-3 wavelet tranform in 2-D.
Apply a reversible inverse DWT transform to a component of an image.
@param tilec Tile component information (current tile)
@param stop FIXME Number of decoded resolution levels ?
*/
void dwt_decode(opj_tcd_tilecomp_t * tilec, int stop);
/**
Get the gain of a subband for the reversible 5-3 DWT.
@param orient Number that identifies the subband (0->LL, 1->HL, 2->LH, 3->HH)
@return Returns 0 if orient = 0, returns 1 if orient = 1 or 2, returns 2 otherwise
*/
int dwt_getgain(int orient); int dwt_getgain(int orient);
/**
/* Get the norm of a wavelet function of a subband at a specified level for the reversible 5-3 DWT.
* Get the norm of a wavelet function of a subband at a specified level for the reversible DWT @param level Level of the wavelet function
* level: level of the wavelet function @param orient Band of the wavelet function
* orient: band of the wavelet function @return Returns the norm of the wavelet function
*/ */
double dwt_getnorm(int level, int orient); double dwt_getnorm(int level, int orient);
/**
/* Forward 9-7 wavelet transform in 2-D.
* Apply an irreversible DWT transform to a component of an image Apply an irreversible DWT transform to a component of an image.
*/ @param tilec Tile component information (current tile)
void dwt_encode_real(tcd_tilecomp_t * tilec); */
void dwt_encode_real(opj_tcd_tilecomp_t * tilec);
/* /**
* Apply an irreversible inverse DWT transform to a component of an image Inverse 9-7 wavelet transform in 2-D.
*/ Apply an irreversible inverse DWT transform to a component of an image.
void dwt_decode_real(tcd_tilecomp_t * tilec, int stop); @param tilec Tile component information (current tile)
/* @param stop FIXME Number of decoded resolution levels ?
* Get the gain of a subband for the irreversible DWT */
* orient: number that identifies the subband (0->LL, 1->HL, 2->LH, 3->HH) void dwt_decode_real(opj_tcd_tilecomp_t * tilec, int stop);
*/ /**
Get the gain of a subband for the irreversible 9-7 DWT.
@param orient Number that identifies the subband (0->LL, 1->HL, 2->LH, 3->HH)
@return Returns the gain of the 9-7 wavelet transform
*/
int dwt_getgain_real(int orient); int dwt_getgain_real(int orient);
/**
/* Get the norm of a wavelet function of a subband at a specified level for the irreversible 9-7 DWT
* Get the norm of a wavelet function of a subband at a specified level for the irreversible DWT @param level Level of the wavelet function
* level: level of the wavelet function @param orient Band of the wavelet function
* orient: band of the wavelet function @return Returns the norm of the 9-7 wavelet
*/ */
double dwt_getnorm_real(int level, int orient); double dwt_getnorm_real(int level, int orient);
/**
FIXME : comment ???
@param tccp
@param prec
*/
void dwt_calc_explicit_stepsizes(opj_tccp_t * tccp, int prec);
/* ----------------------------------------------------------------------- */
/*@}*/
#endif /*@}*/
#endif /* __DWT_H */

148
libopenjpeg/event.c Normal file
View File

@ -0,0 +1,148 @@
/*
* Copyright (c) 2005, Hervé Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include "opj_includes.h"
opj_event_mgr_t* opj_set_event_mgr(opj_common_ptr cinfo, opj_event_mgr_t *event_mgr, void *context) {
if(cinfo) {
opj_event_mgr_t *previous = cinfo->event_mgr;
cinfo->event_mgr = event_mgr;
cinfo->client_data = context;
return previous;
}
return NULL;
}
bool opg_event_msg(opj_common_ptr cinfo, int event_type, const char *fmt, ...) {
#define MSG_SIZE 512 /* 512 bytes should be more than enough for a short message */
opj_msg_callback msg_handler = NULL;
opj_event_mgr_t *event_mgr = cinfo->event_mgr;
if(event_mgr != NULL) {
switch(event_type) {
case EVT_ERROR:
msg_handler = event_mgr->error_handler;
break;
case EVT_WARNING:
msg_handler = event_mgr->warning_handler;
break;
case EVT_INFO:
msg_handler = event_mgr->info_handler;
break;
default:
break;
}
if(msg_handler == NULL) {
return false;
}
} else {
return false;
}
if ((fmt != NULL) && (event_mgr != NULL)) {
va_list arg;
int str_length, i, j;
char message[MSG_SIZE];
memset(message, 0, MSG_SIZE);
/* initialize the optional parameter list */
va_start(arg, fmt);
/* check the length of the format string */
str_length = (strlen(fmt) > MSG_SIZE) ? MSG_SIZE : strlen(fmt);
/* parse the format string and put the result in 'message' */
for (i = 0, j = 0; i < str_length; ++i) {
if (fmt[i] == '%') {
if (i + 1 < str_length) {
switch(tolower(fmt[i + 1])) {
case '%' :
message[j++] = '%';
break;
case 'o' : /* octal numbers */
{
char tmp[16];
_itoa(va_arg(arg, int), tmp, 8);
strcat(message, tmp);
j += strlen(tmp);
++i;
break;
}
case 'i' : /* decimal numbers */
case 'd' :
{
char tmp[16];
_itoa(va_arg(arg, int), tmp, 10);
strcat(message, tmp);
j += strlen(tmp);
++i;
break;
}
case 'x' : /* hexadecimal numbers */
{
char tmp[16];
_itoa(va_arg(arg, int), tmp, 16);
strcat(message, tmp);
j += strlen(tmp);
++i;
break;
}
case 's' : /* strings */
{
char *tmp = va_arg(arg, char*);
strcat(message, tmp);
j += strlen(tmp);
++i;
break;
}
case 'f' : /* floats */
{
char tmp[16];
double value = va_arg(arg, double);
sprintf(tmp, "%f", value);
strcat(message, tmp);
j += strlen(tmp);
++i;
break;
}
};
} else {
message[j++] = fmt[i];
}
} else {
message[j++] = fmt[i];
};
}
/* deinitialize the optional parameter list */
va_end(arg);
/* output the message to the user program */
msg_handler(message, cinfo->client_data);
}
return true;
}

61
libopenjpeg/event.h Normal file
View File

@ -0,0 +1,61 @@
/*
* Copyright (c) 2005, Hervé Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __EVENT_H
#define __EVENT_H
/**
@file event.h
@brief Implementation of a event callback system
The functions in EVENT.C have for goal to send output messages (errors, warnings, debug) to the user.
*/
#define EVT_ERROR 1 /**< Error event type */
#define EVT_WARNING 2 /**< Warning event type */
#define EVT_INFO 4 /**< Debug event type */
/** @defgroup EVENT EVENT - Implementation of a event callback system */
/*@{*/
/** @name Exported functions (see also openjpeg.h) */
/*@{*/
/* ----------------------------------------------------------------------- */
/**
Write formatted data to a string and send the string to a user callback.
@param cinfo Codec context info
@param event_type Event type or callback to use to send the message
@param fmt Format-control string (plus optionnal arguments)
@return Returns true if successful, returns false otherwise
*/
bool opg_event_msg(opj_common_ptr cinfo, int event_type, const char *fmt, ...);
/* ----------------------------------------------------------------------- */
/*@}*/
/*@}*/
#endif /* __EVENT_H */

View File

@ -1,5 +1,9 @@
/* /*
* Copyright (c) 2001-2002, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -25,7 +29,6 @@
*/ */
#include "fix.h" #include "fix.h"
#include <math.h> /*Add Antonin : multbug1*/
#ifdef WIN32 #ifdef WIN32
#define int64 __int64 #define int64 __int64
@ -33,31 +36,10 @@
#define int64 long long #define int64 long long
#endif #endif
/* int fix_mul(int a, int b) {
* Multiply two fixed-precision rational numbers.
*/
/*int fix_mul(int a, int b)
{
return (int) ((int64) a * (int64) b >> 13);
}*/
/*Mod Antonin : multbug1*/
/*
int fix_mul(int a, int b)
{
double tmp= (double) ((int64) a * (int64) b);
int64 v = (int64) ((fabs(tmp/8192.0)>=floor(fabs(tmp/8192.0))+0.5)?fabs(tmp/8192.0)+1.0:fabs(tmp/8192.0));
v = (tmp<0)?-v:v;
return (int) v;
}
*/
/*doM*/
int fix_mul(int a, int b) /* Luke Lee optimized : 11/16/2004*/
{
int64 temp = (int64) a * (int64) b >> 12; int64 temp = (int64) a * (int64) b >> 12;
return (int) ((temp >> 1) + (temp & 1)) ; return (int) ((temp >> 1) + (temp & 1)) ;
} }

View File

@ -1,5 +1,9 @@
/* /*
* Copyright (c) 2001-2002, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -27,7 +31,24 @@
#ifndef __FIX_H #ifndef __FIX_H
#define __FIX_H #define __FIX_H
/**
@file fix.h
@brief Implementation of operations of specific multiplication (FIX)
The functions in FIX.C have for goal to realize specific multiplication.
*/
/** @defgroup FIX FIX - Implementation of operations of specific multiplication */
/*@{*/
/**
Multiply two fixed-precision rational numbers.
@param a
@param b
@return Returns a * b
*/
int fix_mul(int a, int b); int fix_mul(int a, int b);
#endif /*@}*/
#endif /* __FIX_H */

88
libopenjpeg/image.c Normal file
View File

@ -0,0 +1,88 @@
/*
* Copyright (c) 2005, Hervé Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include "opj_includes.h"
opj_image_t* opj_image_create0() {
opj_image_t *image = (opj_image_t*)opj_malloc(sizeof(opj_image_t));
return image;
}
opj_image_t *opj_image_create(int numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc) {
int compno;
opj_image_t *image = NULL;
image = (opj_image_t*)opj_malloc(sizeof(opj_image_t));
if(image) {
image->color_space = clrspc;
image->numcomps = numcmpts;
/* allocate memory for the per-component information */
image->comps = (opj_image_comp_t*)opj_malloc(image->numcomps * sizeof(opj_image_comp_t));
if(!image->comps) {
opj_image_destroy(image);
return NULL;
}
/* create the individual image components */
for(compno = 0; compno < numcmpts; compno++) {
opj_image_comp_t *comp = &image->comps[compno];
comp->dx = cmptparms[compno].dx;
comp->dy = cmptparms[compno].dy;
comp->w = cmptparms[compno].w;
comp->h = cmptparms[compno].h;
comp->x0 = cmptparms[compno].x0;
comp->y0 = cmptparms[compno].y0;
comp->prec = cmptparms[compno].prec;
comp->bpp = cmptparms[compno].bpp;
comp->sgnd = cmptparms[compno].sgnd;
comp->data = (int*)opj_malloc(comp->w * comp->h * sizeof(int));
if(!comp->data) {
opj_image_destroy(image);
return NULL;
}
}
}
return image;
}
void opj_image_destroy(opj_image_t *image) {
int i;
if(image) {
if(image->comps) {
/* image components */
for(i = 0; i < image->numcomps; i++) {
opj_image_comp_t *image_comp = &image->comps[i];
if(image_comp->data) {
opj_free(image_comp->data);
}
}
opj_free(image->comps);
}
opj_free(image);
}
}

50
libopenjpeg/image.h Normal file
View File

@ -0,0 +1,50 @@
/*
* Copyright (c) 2005, Hervé Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __IMAGE_H
#define __IMAGE_H
/**
@file image.h
@brief Implementation of operations on images (IMAGE)
The functions in IMAGE.C have for goal to realize operations on images.
*/
/** @defgroup IMAGE IMAGE - Implementation of operations on images */
/*@{*/
/**
Create an empty image
@todo this function should be removed
@return returns an empty image if successful, returns NULL otherwise
*/
opj_image_t* opj_image_create0();
/*@}*/
#endif /* __IMAGE_H */

View File

@ -1,5 +1,9 @@
/* /*
* Copyright (c) 2001-2002, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -24,37 +28,17 @@
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "int.h" #include "opj_includes.h"
/* int int_min(int a, int b) {
* Get the minimum of two integers.
*
* returns a if a < b else 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) {
* Get the maximum of two integers. return (a > b) ? a : b;
*
* returns a if a > b else b
*/
int int_max(int a, int b)
{
return a > b ? a : b;
} }
/* int int_clamp(int a, int min, int max) {
* Clamp an integer inside an interval.
*
* return a if (min < a < max)
* return max if (a > max)
* return min if (a < min)
*/
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)
@ -62,54 +46,27 @@ int int_clamp(int a, int min, int max)
return a; return a;
} }
/* int int_abs(int a) {
* Get absolute value of integer.
*/
int int_abs(int a)
{
return a < 0 ? -a : a; return a < 0 ? -a : a;
} }
/* int int_ceildiv(int a, int b) {
* Divide an integer and round upwards.
*
* a divided by 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) {
* Divide an integer by a power of 2 and round upwards.
*
* a divided by 2^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) {
* Divide an integer by a power of 2 and round downwards.
*
* a divided by 2^b
*/
int int_floordivpow2(int a, int b)
{
return a >> b; return a >> b;
} }
/* int int_floorlog2(int a) {
* Get logarithm of an integer and round downwards.
*
* log2(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

@ -1,5 +1,9 @@
/* /*
* Copyright (c) 2001-2002, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -24,65 +28,69 @@
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "j2k.h"
#ifndef __INT_H #ifndef __INT_H
#define __INT_H #define __INT_H
/**
@file int.h
@brief Implementation of operations on integers (INT)
/* The functions in INT.C have for goal to realize operations on integers.
* Get the minimum of two integers. */
*
* returns a if a < b else b /** @defgroup INT INT - Implementation of operations on integers */
*/ /*@{*/
/** @name Exported functions (see also openjpeg.h) */
/*@{*/
/* ----------------------------------------------------------------------- */
/**
Get the minimum of two integers
@return Returns a if a < b else b
*/
int int_min(int a, int b); int int_min(int a, int b);
/**
/* Get the maximum of two integers
* Get the maximum of two integers. @return Returns a if a > b else b
* */
* returns a if a > b else b
*/
int int_max(int a, int b); int int_max(int a, int b);
/**
/* Clamp an integer inside an interval
* Clamp an integer inside an interval. @return
* <ul>
* return a if (min < a < max) <li>Returns a if (min < a < max)
* return max if (a > max) <li>Returns max if (a > max)
* return min if (a < min) <li>Returns min if (a < min)
*/ </ul>
*/
int int_clamp(int a, int min, int max); int int_clamp(int a, int min, int max);
/**
/* @return Get absolute value of integer
* Get absolute value of integer. */
*/
int int_abs(int a); int int_abs(int a);
/**
/* Divide an integer and round upwards
* Divide an integer and round upwards. @return Returns a divided by b
* */
* a divided by b
*/
int int_ceildiv(int a, int b); int int_ceildiv(int a, int b);
/**
/* Divide an integer by a power of 2 and round upwards
* Divide an integer by a power of 2 and round upwards. @return Returns a divided by 2^b
* */
* a divided by 2^b int int_ceildivpow2(int a, int b);
*/ /**
LIBJ2K_API int int_ceildivpow2(int a, int b); Divide an integer by a power of 2 and round downwards
@return Returns a divided by 2^b
/* */
* Divide an integer by a power of 2 and round downwards. int int_floordivpow2(int a, int b);
* /**
* a divided by 2^b Get logarithm of an integer and round downwards
*/ @return Returns log2(a)
LIBJ2K_API int int_floordivpow2(int a, int b); */
/*
* Get logarithm of an integer and round downwards.
*
* log2(a)
*/
int int_floorlog2(int a); int int_floorlog2(int a);
/* ----------------------------------------------------------------------- */
/*@}*/
/*@}*/
#endif #endif

File diff suppressed because it is too large Load Diff

View File

@ -1,8 +1,10 @@
/* /*
* Copyright (c) 2001-2002, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2002-2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* All rights reserved. * Copyright (c) 2005, HervŽ Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
@ -25,37 +27,17 @@
* 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.
*/ */
#define VERSION "0.0.8"
#if defined(_WIN32) && defined (OPENJPEGDLL)
#ifdef gdcmopenjpeg_EXPORTS /*LIBJ2K_EXPORTS*/
#define LIBJ2K_API __declspec(dllexport)
#else
#define LIBJ2K_API __declspec(dllimport)
#endif
#else
#ifdef OPENJPEGSTATIC
#define LIBJ2K_API extern
#else
#define LIBJ2K_API
#endif
#endif
#ifndef __J2K_H #ifndef __J2K_H
#define __J2K_H #define __J2K_H
/**
@file j2k.h
@brief The JPEG-2000 Codestream Reader/Writer (J2K)
#define J2K_MAXRLVLS 33 /* Number of maximum resolution level authorized */ The functions in J2K.C have for goal to read/write the several parts of the codestream: markers and data.
#define J2K_MAXBANDS (3*J2K_MAXRLVLS-2) /* Number of maximum sub-band linked to number of resolution level */ */
#define J2K_CFMT 0
#define JP2_CFMT 1 /** @defgroup J2K J2K - JPEG-2000 codestream reader/writer */
#define JPT_CFMT 2 /*@{*/
#define MJ2_CFMT 3
#define PXM_DFMT 0
#define PGX_DFMT 1
#define BMP_DFMT 2
#define YUV_DFMT 3
#define J2K_CP_CSTY_PRT 0x01 #define J2K_CP_CSTY_PRT 0x01
#define J2K_CP_CSTY_SOP 0x02 #define J2K_CP_CSTY_SOP 0x02
@ -71,171 +53,568 @@
#define J2K_CCP_QNTSTY_SIQNT 1 #define J2K_CCP_QNTSTY_SIQNT 1
#define J2K_CCP_QNTSTY_SEQNT 2 #define J2K_CCP_QNTSTY_SEQNT 2
typedef struct { /* ----------------------------------------------------------------------- */
int dx, dy; /* XRsiz, YRsiz */
int w, h; /* width and height of data */
int x0, y0; /* offset of the component compare to the whole image */
int prec; /* precision */
int bpp; /* deapth of image in bits */
int sgnd; /* signed */
int resno_decoded; /* number of decoded resolution */
int factor; /* number of division by 2 of the out image compare to the original size of image */
int *data; /* image-component data */
} j2k_comp_t;
typedef struct { #define J2K_MS_SOC 0xff4f /**< SOC marker value */
int x0, y0; /* XOsiz, YOsiz */ #define J2K_MS_SOT 0xff90 /**< SOT marker value */
int x1, y1; /* Xsiz, Ysiz */ #define J2K_MS_SOD 0xff93 /**< SOD marker value */
int numcomps; /* number of components */ #define J2K_MS_EOC 0xffd9 /**< EOC marker value */
int color_space; /* sRGB, Greyscale or YUV */ #define J2K_MS_SIZ 0xff51 /**< SIZ marker value */
j2k_comp_t *comps; /* image-components */ #define J2K_MS_COD 0xff52 /**< COD marker value */
} j2k_image_t; #define J2K_MS_COC 0xff53 /**< COC marker value */
#define J2K_MS_RGN 0xff5e /**< RGN marker value */
#define J2K_MS_QCD 0xff5c /**< QCD marker value */
#define J2K_MS_QCC 0xff5d /**< QCC marker value */
#define J2K_MS_POC 0xff5f /**< POC marker value */
#define J2K_MS_TLM 0xff55 /**< TLM marker value */
#define J2K_MS_PLM 0xff57 /**< PLM marker value */
#define J2K_MS_PLT 0xff58 /**< PLT marker value */
#define J2K_MS_PPM 0xff60 /**< PPM marker value */
#define J2K_MS_PPT 0xff61 /**< PPT marker value */
#define J2K_MS_SOP 0xff91 /**< SOP marker value */
#define J2K_MS_EPH 0xff92 /**< EPH marker value */
#define J2K_MS_CRG 0xff63 /**< CRG marker value */
#define J2K_MS_COM 0xff64 /**< COM marker value */
typedef struct { /* ----------------------------------------------------------------------- */
int expn; /* exponent */
int mant; /* mantissa */
} j2k_stepsize_t;
typedef struct { /**
int csty; /* coding style */ Values that specify the status of the decoding process when decoding the main header.
int numresolutions; /* number of resolutions */ These values may be combined with a | operator.
int cblkw; /* width of code-blocks */ */
int cblkh; /* height of code-blocks */ typedef enum J2K_STATUS {
int cblksty; /* code-block coding style */ J2K_STATE_MHSOC = 0x0001, /**< a SOC marker is expected */
int qmfbid; /* discrete wavelet transform identifier */ J2K_STATE_MHSIZ = 0x0002, /**< a SIZ marker is expected */
int qntsty; /* quantisation style */ J2K_STATE_MH = 0x0004, /**< the decoding process is in the main header */
j2k_stepsize_t stepsizes[J2K_MAXBANDS]; /* stepsizes used for quantization */ J2K_STATE_TPHSOT = 0x0008, /**< the decoding process is in a tile part header and expects a SOT marker */
int numgbits; /* number of guard bits */ J2K_STATE_TPH = 0x0010, /**< the decoding process is in a tile part header */
int roishift; /* Region Of Interest shift */ J2K_STATE_MT = 0x0020, /**< the EOC marker has just been read */
int prcw[J2K_MAXRLVLS]; /* Precinct width */ J2K_STATE_NEOC = 0x0040 /**< the decoding process must not expect a EOC marker because the codestream is truncated */
int prch[J2K_MAXRLVLS]; /* Precinct height */ } J2K_STATUS;
} j2k_tccp_t;
typedef struct { /* ----------------------------------------------------------------------- */
int resno0, compno0;
int layno1, resno1, compno1;
int prg;
int tile;
char progorder[4];
} j2k_poc_t;
typedef struct { /**
int first; /* 1 : first part-tile of a tile */ Quantization stepsize
int csty; /* coding style */ */
int prg; /* progression order */ typedef struct opj_stepsize {
int numlayers; /* number of layers */ /** exponent */
int mct; /* multi-component transform identifier */ int expn;
int rates[100]; /* rates of layers */ /** mantissa */
int numpocs; /* number of progression order changes */ int mant;
int POC; /* Precise if a POC marker has been used O:NO, 1:YES */ } opj_stepsize_t;
j2k_poc_t pocs[32]; /* progression order changes */
unsigned char *ppt_data; /* packet header store there for futur use in t2_decode_packet */
unsigned char *ppt_data_first; /* pointer remaining on the first byte of the first header if ppt is used */
int ppt; /* If ppt == 1 --> there was a PPT marker for the present tile */
int ppt_store; /* Use in case of multiple marker PPT (number of info already store) */
int ppt_len; /* ppmbug1 */
float distoratio[100]; /* add fixed_quality */
j2k_tccp_t *tccps; /* tile-component coding parameters */
} j2k_tcp_t;
typedef struct { /**
int intermed_file; /* 1: Store each encoded tile one by one in the output file (for mega-Images)*/ Tile-component coding parameters
int decod_format; /* 0: PGX, 1: PxM, 2: BMP */ */
int cod_format; /* 0: J2K, 1: JP2, 2: JPT */ typedef struct opj_tccp {
int disto_alloc; /* Allocation by rate/distortion */ /** coding style */
int fixed_alloc; /* Allocation by fixed layer */ int csty;
int fixed_quality; /* add fixed_quality */ /** number of resolutions */
int reduce; /* if != 0, then original dimension divided by 2^(reduce); if == 0 or not used, image is decoded to the full resolution */ int numresolutions;
int layer; /* if != 0, then only the first "layer" layers are decoded; if == 0 or not used, all the quality layers are decoded */ /** code-blocks width */
int index_on; /* 0 = no index || 1 = index */ int cblkw;
int tx0, ty0; /* XTOsiz, YTOsiz */ /** code-blocks height */
int tdx, tdy; /* XTsiz, YTsiz */ int cblkh;
char *comment; /* comment for coding */ /** code-block coding style */
int tw, th; /* number of tiles in width and heigth */ int cblksty;
int *tileno; /* ID number of the tiles present in the codestream */ /** discrete wavelet transform identifier */
int tileno_size; /* size of the vector tileno */ int qmfbid;
unsigned char *ppm_data; /* packet header store there for futur use in t2_decode_packet */ /** quantisation style */
unsigned char *ppm_data_first; /* pointer remaining on the first byte of the first header if ppm is used */ int qntsty;
int ppm; /* If ppm == 1 --> there was a PPM marker for the present tile */ /** stepsizes used for quantization */
int ppm_store; /* Use in case of multiple marker PPM (number of info already store) */ opj_stepsize_t stepsizes[J2K_MAXBANDS];
int ppm_previous; /* Use in case of multiple marker PPM (case on non-finished previous info) */ /** number of guard bits */
int ppm_len; /* ppmbug1 */ int numgbits;
j2k_tcp_t *tcps; /* tile coding parameters */ /** Region Of Interest shift */
int *matrice; /* Fixed layer */ int roishift;
} j2k_cp_t; /** precinct width */
int prcw[J2K_MAXRLVLS];
/** precinct height */
int prch[J2K_MAXRLVLS];
} opj_tccp_t;
typedef struct { /**
int start_pos, end_pos; /* start and end position */ Tile coding parameters :
double disto; /* ADD for Marcela */ this structure is used to store coding/decoding parameters common to all
} info_packet; /* Index struct */ tiles (information like COD, COC in main header)
*/
typedef struct opj_tcp {
/** 1 : first part-tile of a tile */
int first;
/** coding style */
int csty;
/** progression order */
OPJ_PROG_ORDER prg;
/** number of layers */
int numlayers;
/** multi-component transform identifier */
int mct;
/** rates of layers */
int rates[100];
/** number of progression order changes */
int numpocs;
/** indicates if a POC marker has been used O:NO, 1:YES */
int POC;
/** progression order changes */
opj_poc_t pocs[32];
/** packet header store there for futur use in t2_decode_packet */
unsigned char *ppt_data;
/** pointer remaining on the first byte of the first header if ppt is used */
unsigned char *ppt_data_first;
/** If ppt == 1 --> there was a PPT marker for the present tile */
int ppt;
/** used in case of multiple marker PPT (number of info already stored) */
int ppt_store;
/** ppmbug1 */
int ppt_len;
/** add fixed_quality */
float distoratio[100];
/** tile-component coding parameters */
opj_tccp_t *tccps;
} opj_tcp_t;
typedef struct { /**
double *thresh; /* value of thresh for each layer by tile cfr. Marcela */ Coding parameters
int num_tile; /* Number of Tile */ */
int start_pos; /* Start position */ typedef struct opj_cp {
int end_header; /* End position of the header */ /** allocation by rate/distortion */
int end_pos; /* End position */ int disto_alloc;
int pw[33], ph[33]; /* precinct number for each resolution level */ /** allocation by fixed layer */
int fixed_alloc;
int pdx[33], pdy[33]; /* precinct size (in power of 2), in X and Y for each resolution level */ /** add fixed_quality */
info_packet *packet; /* information concerning packets inside tile */ int fixed_quality;
int nbpix; /* add fixed_quality */ /** if != 0, then original dimension divided by 2^(reduce); if == 0 or not used, image is decoded to the full resolution */
double distotile; /* add fixed_quality */ int reduce;
} info_tile; /* index struct */ /** if != 0, then only the first "layer" layers are decoded; if == 0 or not used, all the quality layers are decoded */
int layer;
typedef struct { /** 0 = no index || 1 = index */
int index_on; int index_on;
double D_max; /* ADD for Marcela */ /** XTOsiz */
int num; /* numero of packet */ int tx0;
int index_write; /* writing the packet inthe index with t2_encode_packets */ /** YTOsiz */
int Im_w, Im_h; /* Image width and Height */ int ty0;
int Prog; /* progression order */ /** XTsiz */
int Tile_x, Tile_y; /* Tile size in x and y */ int tdx;
int Tile_Ox, Tile_Oy; /** YTsiz */
int tw, th; /* Number of Tile in X and Y */ int tdy;
int Comp; /* Component numbers */ /** comment for coding */
int Layer; /* number of layer */ char *comment;
int Decomposition; /* number of decomposition */ /** number of tiles in width */
int Main_head_end; /* Main header position */ int tw;
int codestream_size; /* codestream's size */ /** number of tiles in heigth */
info_tile *tile; /* information concerning tiles inside image */ int th;
} info_image; /* index struct */ /** ID number of the tiles present in the codestream */
int *tileno;
/** size of the vector tileno */
int tileno_size;
/** packet header store there for futur use in t2_decode_packet */
unsigned char *ppm_data;
/** pointer remaining on the first byte of the first header if ppm is used */
unsigned char *ppm_data_first;
/** if ppm == 1 --> there was a PPM marker for the present tile */
int ppm;
/** use in case of multiple marker PPM (number of info already store) */
int ppm_store;
/** use in case of multiple marker PPM (case on non-finished previous info) */
int ppm_previous;
/** ppmbug1 */
int ppm_len;
/** tile coding parameters */
opj_tcp_t *tcps;
/** fixed layer */
int *matrice;
} opj_cp_t;
/* /**
* Encode an image into a JPEG-2000 codestream Information concerning a packet inside tile
* i: image to encode */
* cp: coding parameters typedef struct opj_packet_info {
* output: destination buffer or name of the output file when cp->intermed_file==1 /** start position */
* len: length of destination buffer int start_pos;
* index : index file name /** end position */
*/ int end_pos;
LIBJ2K_API int j2k_encode(j2k_image_t * i, j2k_cp_t * cp, char *output, /** ADD for Marcela */
int len, char *index); double disto;
} opj_packet_info_t;
/* LIBJ2K_API int j2k_encode(j2k_image_t *i, j2k_cp_t *cp,unsigned char *dest, int len); */ /**
/* Index structure : information regarding tiles inside image
* Decode an image from a JPEG-2000 codestream */
* src: source buffer typedef struct opj_tile_info {
* len: length of source buffer /** value of thresh for each layer by tile cfr. Marcela */
* i: decode image double *thresh;
* cp: coding parameters that were used to encode the image /** number of tile */
*/ int num_tile;
/** start position */
int start_pos;
/** end position of the header */
int end_header;
/** end position */
int end_pos;
/** precinct number for each resolution level (width) */
int pw[33];
/** precinct number for each resolution level (height) */
int ph[33];
/** precinct size (in power of 2), in X for each resolution level */
int pdx[33];
/** precinct size (in power of 2), in Y for each resolution level */
int pdy[33];
/** information concerning packets inside tile */
opj_packet_info_t *packet;
/** add fixed_quality */
int nbpix;
/** add fixed_quality */
double distotile;
} opj_tile_info_t;
LIBJ2K_API int j2k_decode(unsigned char *src, int len, j2k_image_t * img, /**
j2k_cp_t * cp); Index structure
*/
typedef struct opj_image_info {
/** 0 = no index || 1 = index */
int index_on;
/** maximum distortion reduction on the whole image (add for Marcela) */
double D_max;
/** packet number */
int num;
/** writing the packet in the index with t2_encode_packets */
int index_write;
/** image width */
int image_w;
/** image height */
int image_h;
/** progression order */
OPJ_PROG_ORDER prog;
/** tile size in x */
int tile_x;
/** tile size in y */
int tile_y;
/** */
int tile_Ox;
/** */
int tile_Oy;
/** number of tiles in X */
int tw;
/** number of tiles in Y */
int th;
/** component numbers */
int comp;
/** number of layer */
int layer;
/** number of decomposition */
int decomposition;
/** main header position */
int main_head_end;
/** codestream's size */
int codestream_size;
/** information regarding tiles inside image */
opj_tile_info_t *tile;
} opj_image_info_t;
/**
JPEG-2000 codestream reader/writer
*/
typedef struct opj_j2k {
/** codec context */
opj_common_ptr cinfo;
/* /** locate in which part of the codestream the decoder is (main header, tile header, end) */
* Decode an image form a JPT-stream (JPEG 2000, JPIP) int state;
* src: source buffer /** number of the tile curently concern by coding/decoding */
* len: length of source buffer int curtileno;
* i: decode image /**
* cp: coding parameters that were used to encode the image locate the position of the end of the tile in the codestream,
* used to detect a truncated codestream (in j2k_read_sod)
*/ */
int j2k_decode_jpt_stream(unsigned char *src, int len, j2k_image_t * img, unsigned char *eot;
j2k_cp_t * cp); /**
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.
*/
int sot_start;
int sod_start;
/**
as the J2K-file is written in several parts during encoding,
it enables to make the right correction in position return by cio_tell
*/
int pos_correction;
/** array used to store the data of each tile */
unsigned char **tile_data;
/** array used to store the length of each tile */
int *tile_len;
/**
decompression only :
store decoding parameters common to all tiles (information like COD, COC in main header)
*/
opj_tcp_t *default_tcp;
/** pointer to the encoded / decoded image */
opj_image_t *image;
/** pointer to the coding parameters */
opj_cp_t *cp;
/** helper used to write the index file */
opj_image_info_t *image_info;
/** pointer to the byte i/o stream */
opj_cio_t *cio;
} opj_j2k_t;
LIBJ2K_API void j2k_dec_release();/*antonin*/ /** @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);
/* ----------------------------------------------------------------------- */
/*@}*/
#endif /** @name Exported functions */
/*@{*/
/* ----------------------------------------------------------------------- */
/**
Creates a J2K decompression structure
@param cinfo Codec context info
@return Returns a handle to a J2K decompressor if successful, returns NULL otherwise
*/
opj_j2k_t* j2k_create_decompress(opj_common_ptr cinfo);
/**
Destroy a J2K decompressor handle
@param j2k J2K decompressor handle to destroy
*/
void j2k_destroy_decompress(opj_j2k_t *j2k);
/**
Setup the decoder decoding parameters using user parameters.
Decoding parameters are returned in j2k->cp.
@param j2k J2K decompressor handle
@param parameters decompression parameters
*/
void j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters);
/**
Decode an image from a JPEG-2000 codestream
@param j2k J2K decompressor handle
@param cio Input buffer stream
@return Returns a decoded image if successful, returns NULL otherwise
*/
opj_image_t* j2k_decode(opj_j2k_t *j2k, opj_cio_t *cio);
/**
Decode an image form a JPT-stream (JPEG 2000, JPIP)
@param j2k J2K decompressor handle
@param cio Input buffer stream
@return Returns a decoded image if successful, returns NULL otherwise
*/
opj_image_t* j2k_decode_jpt_stream(opj_j2k_t *j2k, opj_cio_t *cio);
/**
Creates a J2K compression structure
@param cinfo Codec context info
@return Returns a handle to a J2K compressor if successful, returns NULL otherwise
*/
opj_j2k_t* j2k_create_compress(opj_common_ptr cinfo);
/**
Destroy a J2K compressor handle
@param j2k J2K compressor handle to destroy
*/
void j2k_destroy_compress(opj_j2k_t *j2k);
/**
Setup the encoder parameters using the current image and using user parameters.
Coding parameters are returned in j2k->cp.
@param j2k J2K compressor handle
@param parameters compression parameters
@param image input filled image
*/
void j2k_setup_encoder(opj_j2k_t *j2k, opj_cparameters_t *parameters, opj_image_t *image);
/**
Encode an image into a JPEG-2000 codestream
@param j2k J2K compressor handle
@param cio Output buffer stream
@param image Image to encode
@param index Name of the index file if required, NULL otherwise
@return Returns true if successful, returns false otherwise
*/
bool j2k_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image, char *index);
/* ----------------------------------------------------------------------- */
/*@}*/
/*@}*/
#endif /* __J2K_H */

76
libopenjpeg/j2k_lib.c Normal file
View File

@ -0,0 +1,76 @@
/*
* Copyright (c) 2005, Hervé Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifdef WIN32
#include <windows.h>
#else
#include <sys/resource.h>
#include <sys/times.h>
#endif /* WIN32 */
#include "opj_includes.h"
double opj_clock() {
#ifdef WIN32
/* WIN32: use QueryPerformance (very accurate) */
LARGE_INTEGER freq , t ;
/* freq is the clock speed of the CPU */
QueryPerformanceFrequency(&freq) ;
/* cout << "freq = " << ((double) freq.QuadPart) << endl; */
/* t is the high resolution performance counter (see MSDN) */
QueryPerformanceCounter ( & t ) ;
return ( t.QuadPart /(double) freq.QuadPart ) ;
#else
/* Unix or Linux: use resource usage */
struct rusage t;
double procTime;
/* (1) Get the rusage data structure at this moment (man getrusage) */
getrusage(0,&t);
/* (2) What is the elapsed time ? - CPU time = User time + System time */
/* (2a) Get the seconds */
procTime = t.ru_utime.tv_sec + t.ru_stime.tv_sec;
/* (2b) More precisely! Get the microseconds part ! */
return ( procTime + (t.ru_utime.tv_usec + t.ru_stime.tv_usec) * 1e-6 ) ;
#endif
}
void* opj_malloc( size_t size ) {
void *memblock = malloc(size);
if(memblock) {
memset(memblock, 0, size);
}
return memblock;
}
void* j2k_realloc( void *memblock, size_t size ) {
return realloc(memblock, size);
}
void opj_free( void *memblock ) {
free(memblock);
}

77
libopenjpeg/j2k_lib.h Normal file
View File

@ -0,0 +1,77 @@
/*
* Copyright (c) 2005, Hervé Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __J2K_LIB_H
#define __J2K_LIB_H
/**
@file j2k_lib.h
@brief Internal functions
The functions in J2K_LIB.C are internal utilities mainly used for memory management.
*/
/** @defgroup MISC MISC - Miscellaneous internal functions */
/*@{*/
/** @name Exported functions */
/*@{*/
/* ----------------------------------------------------------------------- */
/**
Difference in successive opj_clock() calls tells you the elapsed time
@return Returns time in seconds
*/
double opj_clock();
/**
Allocate a memory block with elements initialized to 0
@param size Bytes to allocate
@return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available
*/
void* opj_malloc( size_t size );
/**
Reallocate memory blocks.
@param memblock Pointer to previously allocated memory block
@param size New size in bytes
@return Returns a void pointer to the reallocated (and possibly moved) memory block
*/
void* j2k_realloc( void *memblock, size_t size );
/**
Deallocates or frees a memory block.
@param memblock Previously allocated memory block to be freed
*/
void opj_free( void *memblock );
/* ----------------------------------------------------------------------- */
/*@}*/
/*@}*/
#endif /* __J2K_LIB_H */

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,7 @@
/* /*
* Copyright (c) 2003, Yannick Verschueren * Copyright (c) 2004, Yannick Verschueren
* Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2005, HervŽ Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -26,16 +27,47 @@
*/ */
#ifndef __JP2_H #ifndef __JP2_H
#define __JP2_H #define __JP2_H
/**
@file jp2.h
@brief The JPEG-2000 file format Reader/Writer (JP2)
#include "j2k.h" */
typedef struct { /** @defgroup JP2 JP2 - JPEG-2000 file format reader/writer */
int depth; /*@{*/
int sgnd;
#define JPIP_JPIP 0x6a706970
#define JP2_JP 0x6a502020 /**< JPEG 2000 signature box */
#define JP2_FTYP 0x66747970 /**< File type box */
#define JP2_JP2H 0x6a703268 /**< JP2 header box */
#define JP2_IHDR 0x69686472 /**< Image header box */
#define JP2_COLR 0x636f6c72 /**< Colour specification box */
#define JP2_JP2C 0x6a703263 /**< Contiguous codestream box */
#define JP2_URL 0x75726c20 /**< URL box */
#define JP2_DBTL 0x6474626c /**< ??? */
#define JP2_BPCC 0x62706363 /**< Bits per component box */
#define JP2_JP2 0x6a703220 /**< File type fields */
/* ----------------------------------------------------------------------- */
/**
JP2 component
*/
typedef struct opj_jp2_comps {
int depth;
int sgnd;
int bpcc; int bpcc;
} jp2_comps_t; } opj_jp2_comps_t;
typedef struct { /**
JPEG-2000 file format reader/writer
*/
typedef struct opj_jp2 {
/** codec context */
opj_common_ptr cinfo;
/** handle to the J2K codec */
opj_j2k_t *j2k;
unsigned int w; unsigned int w;
unsigned int h; unsigned int h;
unsigned int numcomps; unsigned int numcomps;
@ -51,68 +83,151 @@ typedef struct {
unsigned int minversion; unsigned int minversion;
unsigned int numcl; unsigned int numcl;
unsigned int *cl; unsigned int *cl;
jp2_comps_t *comps; opj_jp2_comps_t *comps;
j2k_image_t *image; opj_image_t *image;
unsigned int j2k_codestream_offset; unsigned int j2k_codestream_offset;
unsigned int j2k_codestream_len; unsigned int j2k_codestream_length;
} jp2_struct_t; } opj_jp2_t;
typedef struct { /**
JP2 Box
*/
typedef struct opj_jp2_box {
int length; int length;
int type; int type;
int init_pos; int init_pos;
} jp2_box_t; } opj_jp2_box_t;
/* int jp2_init_stdjp2(jp2_struct_t * jp2_struct, j2k_image_t * img); /** @name Local static functions */
* /*@{*/
* Create a standard jp2_structure /* ----------------------------------------------------------------------- */
* jp2_struct: the structure you are creating /**
* img: a j2k_image_t wich will help you to create the jp2_structure Read box headers
*/ @param cinfo Codec context info
int jp2_init_stdjp2(jp2_struct_t * jp2_struct); @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);
/* ----------------------------------------------------------------------- */
/*@}*/
/* int jp2_write_jp2c(int j2k_len, int *j2k_codestream_offset, char *j2k_codestream) /** @name Exported functions */
* /*@{*/
* Write the jp2c codestream box /* ----------------------------------------------------------------------- */
* j2k_len: the j2k codestream length /**
* j2k_codestream_offset: the function will return the j2k codestream offset Creates a JP2 decompression structure
* j2k_codestream: the j2k codestream to include in jp2 file @param cinfo Codec context info
*/ @return Returns a handle to a JP2 decompressor if successful, returns NULL otherwise
int jp2_write_jp2c(int j2k_len, int *j2k_codestream_offset, char *j2k_codestream); */
opj_jp2_t* jp2_create_decompress(opj_common_ptr cinfo);
/**
Destroy a JP2 decompressor handle
@param jp2 JP2 decompressor handle to destroy
*/
void jp2_destroy_decompress(opj_jp2_t *jp2);
/**
Setup the decoder decoding parameters using user parameters.
Decoding parameters are returned in jp2->j2k->cp.
@param jp2 JP2 decompressor handle
@param parameters decompression parameters
*/
void jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters);
/**
Decode an image from a JPEG-2000 file stream
@param jp2 JP2 decompressor handle
@param cio Input buffer stream
@return Returns a decoded image if successful, returns NULL otherwise
*/
opj_image_t* jp2_decode(opj_jp2_t *jp2, opj_cio_t *cio);
/**
Creates a JP2 compression structure
@param cinfo Codec context info
@return Returns a handle to a JP2 compressor if successful, returns NULL otherwise
*/
opj_jp2_t* jp2_create_compress(opj_common_ptr cinfo);
/**
Destroy a JP2 compressor handle
@param jp2 JP2 compressor handle to destroy
*/
void jp2_destroy_compress(opj_jp2_t *jp2);
/**
Setup the encoder parameters using the current image and using user parameters.
Coding parameters are returned in jp2->j2k->cp.
@param jp2 JP2 compressor handle
@param parameters compression parameters
@param image input filled image
*/
void jp2_setup_encoder(opj_jp2_t *jp2, opj_cparameters_t *parameters, opj_image_t *image);
/**
Encode an image into a JPEG-2000 file stream
@param jp2 JP2 compressor handle
@param cio Output buffer stream
@param image Image to encode
@param index Name of the index file if required, NULL otherwise
@return Returns true if successful, returns false otherwise
*/
bool jp2_encode(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, char *index);
/* ----------------------------------------------------------------------- */
/*@}*/
/* int jp2_write_jp2h(jp2_struct_t * jp2_struct); /*@}*/
*
* Write the jp2h header box
* jp2_struct: the jp2 structure you are working with
*/
void jp2_write_jp2h(jp2_struct_t * jp2_struct);
/* int jp2_read_jp2h(jp2_struct_t * jp2_struct); #endif /* __JP2_H */
*
* Read the jp2h header box
* jp2_struct: the jp2 structure you are working with
*/
int jp2_read_jp2h(jp2_struct_t * jp2_struct);
/* int jp2_wrap_j2k(jp2_struct_t * jp2_struct, char *j2k_codestream,
int j2k_len, char *output)
*
* Wrap a J2K codestream in a JP2 file
* jp2_struct: the jp2 structure used to create jp2 boxes
* j2k_codestream: the j2k codestream to include in jp2 file
* output: pointer to jp2 codestream that will be created
*/
int jp2_wrap_j2k(jp2_struct_t * jp2_struct, char *j2k_codestream,
char *output);
/* int jp2_read_struct(unsigned char *src, jp2_struct_t * jp2_struct);
*
* Decode the structure of a JP2 file
* src: pointer to memory where compressed data is stored
* jp2_struct: the jp2 structure that will be created
* len: length of jp2 codestream
*/
int jp2_read_struct(unsigned char *src, jp2_struct_t * jp2_struct, int len);
#endif

View File

@ -1,6 +1,7 @@
/* /*
* Copyright (c) 2004, Yannick Verschueren * Copyright (c) 2004, Yannick Verschueren
* Copyright (c) 2004, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2005, HervŽ Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -25,28 +26,22 @@
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#include <stdio.h>
#include <stdlib.h>
#include "jpt.h"
#include "j2k.h"
#include "cio.h"
#include "opj_includes.h"
/* /*
* Read the information contains in VBAS [JPP/JPT stream message header] * Read the information contains in VBAS [JPP/JPT stream message header]
* Store information (7 bits) in value * Store information (7 bits) in value
* *
*/ */
unsigned int jpt_read_VBAS_info(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(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(1); elmt = cio_read(cio, 1);
} }
value = (value << 7); value = (value << 7);
value |= (elmt & 0x7f); value |= (elmt & 0x7f);
@ -58,15 +53,14 @@ unsigned int jpt_read_VBAS_info(unsigned int value)
* Initialize the value of the message header structure * Initialize the value of the message header structure
* *
*/ */
void jpt_init_Msg_Header(jpt_msg_header_struct_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 */
} }
/* /*
@ -75,47 +69,45 @@ void jpt_init_Msg_Header(jpt_msg_header_struct_t * header)
* Only parameters always present in message header * Only parameters always present in message header
* *
*/ */
void jpt_reinit_Msg_Header(jpt_msg_header_struct_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 */
} }
/* /*
* Read the message header for a JPP/JPT - stream * Read the message header for a JPP/JPT - stream
* *
*/ */
void jpt_read_Msg_Header(jpt_msg_header_struct_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(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:
fprintf(stderr, "Forbidden value encounter in message header !!\n"); opg_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] */
@ -125,14 +117,14 @@ void jpt_read_Msg_Header(jpt_msg_header_struct_t * header)
/* 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(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(header->Class_Id); header->Class_Id = jpt_read_VBAS_info(cio, header->Class_Id);
} }
/* ---------- */ /* ---------- */
@ -140,24 +132,24 @@ void jpt_read_Msg_Header(jpt_msg_header_struct_t * header)
/* ---------- */ /* ---------- */
if (CSn == 1) { if (CSn == 1) {
header->CSn_Id = 0; header->CSn_Id = 0;
header->CSn_Id = jpt_read_VBAS_info(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(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(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(header->Layer_nb); header->Layer_nb = jpt_read_VBAS_info(cio, header->Layer_nb);
} }
} }

View File

@ -1,6 +1,7 @@
/* /*
* Copyright (c) 2004, Yannick Verschueren * Copyright (c) 2004, Yannick Verschueren
* Copyright (c) 2004, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2005, HervŽ Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -25,32 +26,49 @@
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
/* #ifndef __JPT_H
* Message Header JPT_stream Structure #define __JPT_H
* /**
*/ @file jpt.h
typedef struct { @brief JPT-stream reader (JPEG 2000, JPIP)
unsigned int Id; /* In-class Identifier */
unsigned int last_byte; /* Last byte information */
unsigned int Class_Id; /* Class Identifier */
unsigned int CSn_Id; /* CSn : index identifier */
unsigned int Msg_offset; /* Message offset */
unsigned int Msg_length; /* Message length */
unsigned int Layer_nb; /* Auxiliary for JPP case */
} jpt_msg_header_struct_t;
/* JPT-stream functions are implemented in J2K.C.
* Initialize the value of the message header structure */
*
* header : Message header structure
*
*/
void jpt_init_Msg_Header(jpt_msg_header_struct_t * header);
/* /**
* Read the message header for a JPP/JPT - stream Message Header JPT stream structure
* */
* header : Message header structure typedef struct opj_jpt_msg_header {
* /** In-class Identifier */
*/ unsigned int Id;
void jpt_read_Msg_Header(jpt_msg_header_struct_t * header); /** Last byte information */
unsigned int last_byte;
/** Class Identifier */
unsigned int Class_Id;
/** CSn : index identifier */
unsigned int CSn_Id;
/** Message offset */
unsigned int Msg_offset;
/** Message length */
unsigned int Msg_length;
/** Auxiliary for JPP case */
unsigned int Layer_nb;
} opj_jpt_msg_header_t;
/* ----------------------------------------------------------------------- */
/**
Initialize the value of the message header structure
@param header Message header structure
*/
void jpt_init_msg_header(opj_jpt_msg_header_t * header);
/**
Read the message header for a JPP/JPT - stream
@param cinfo Codec context info
@param cio CIO handle
@param header Message header structure
*/
void jpt_read_msg_header(opj_common_ptr cinfo, opj_cio_t *cio, opj_jpt_msg_header_t *header);
#endif

View File

@ -1,5 +1,9 @@
/* /*
* Copyright (c) 2001-2002, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -24,24 +28,22 @@
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "mct.h" #include "opj_includes.h"
#include "fix.h"
/* <summary> */ /* <summary> */
/* This table contains the norms of the basis function of the reversible MCT. */ /* This table contains the norms of the basis function of the reversible MCT. */
/* </summary> */ /* </summary> */
double mct_norms[3] = { 1.732, .8292, .8292 }; static const double mct_norms[3] = { 1.732, .8292, .8292 };
/* <summary> */ /* <summary> */
/* This table contains the norms of the basis function of the irreversible MCT. */ /* This table contains the norms of the basis function of the irreversible MCT. */
/* </summary> */ /* </summary> */
double mct_norms_real[3] = { 1.732, 1.805, 1.573 }; static const double mct_norms_real[3] = { 1.732, 1.805, 1.573 };
/* <summary> */ /* <summary> */
/* 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;
@ -60,8 +62,7 @@ void mct_encode(int *c0, int *c1, int *c2, int n)
/* <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;
@ -80,16 +81,14 @@ void mct_decode(int *c0, int *c1, int *c2, int n)
/* <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;
@ -108,8 +107,7 @@ void mct_encode_real(int *c0, int *c1, int *c2, int n)
/* <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;
@ -128,7 +126,6 @@ void mct_decode_real(int *c0, int *c1, int *c2, int n)
/* <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

@ -1,5 +1,9 @@
/* /*
* Copyright (c) 2001-2002, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -24,51 +28,71 @@
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#ifndef __MCT_H #ifndef __MCT_H
#define __MCT_H #define __MCT_H
/**
@file mct.h
@brief Implementation of a multi-component transforms (MCT)
/* The functions in MCT.C have for goal to realize reversible and irreversible multicomponent
* Apply a reversible multi-component transform to an image transform. The functions in MCT.C are used by some function in TCD.C.
* R: samples for red component */
* G: samples for green component
* B: samples blue component /** @defgroup MCT MCT - Implementation of a multi-component transform */
* n: number of samples for each component /*@{*/
*/
void mct_encode(int *R, int *G, int *B, int n); /** @name Exported functions */
/* /*@{*/
* Apply a reversible multi-component inverse transform to an image /* ----------------------------------------------------------------------- */
* Y: samples for luminance component /**
* U: samples for red chrominance component Apply a reversible multi-component transform to an image
* V: samples for blue chrominance component @param c0 Samples for red component
* n: number of samples for each component @param c1 Samples for green component
*/ @param c2 Samples blue component
void mct_decode(int *V, int *U, int *Y, int n); @param n Number of samples for each component
/* */
* Get norm of the basis function used for the reversible multi-component transform void mct_encode(int *c0, int *c1, int *c2, int n);
* compno: number of the component (0->Y, 1->U, 2->V) /**
*/ Apply a reversible multi-component inverse transform to an image
@param c0 Samples for luminance component
@param c1 Samples for red chrominance component
@param c2 Samples for blue chrominance component
@param n Number of samples for each component
*/
void mct_decode(int *c0, int *c1, int *c2, int n);
/**
Get norm of the basis function used for the reversible multi-component transform
@param compno Number of the component (0->Y, 1->U, 2->V)
@return
*/
double mct_getnorm(int compno); double mct_getnorm(int compno);
/* /**
* Apply an irreversible multi-component transform to an image Apply an irreversible multi-component transform to an image
* R: samples for red component @param c0 Samples for red component
* G: samples for green component @param c1 Samples for green component
* B: samples blue component @param c2 Samples blue component
* n: number of samples for each component @param n Number of samples for each component
*/ */
void mct_encode_real(int *c0, int *c1, int *c2, int n); void mct_encode_real(int *c0, int *c1, int *c2, int n);
/* /**
* Apply an irreversible multi-component inverse transform to an image Apply an irreversible multi-component inverse transform to an image
* Y: samples for luminance component @param c0 Samples for luminance component
* U: samples for red chrominance component @param c1 Samples for red chrominance component
* V: samples for blue chrominance component @param c2 Samples for blue chrominance component
* n: number of samples for each component @param n Number of samples for each component
*/ */
void mct_decode_real(int *c0, int *c1, int *c2, int n); void mct_decode_real(int *c0, int *c1, int *c2, int n);
/* /**
* Get norm of the basis function used for the irreversible multi-component transform Get norm of the basis function used for the irreversible multi-component transform
* compno: number of the component (0->Y, 1->U, 2->V) @param compno Number of the component (0->Y, 1->U, 2->V)
*/ @return
*/
double mct_getnorm_real(int compno); double mct_getnorm_real(int compno);
/* ----------------------------------------------------------------------- */
/*@}*/
#endif /*@}*/
#endif /* __MCT_H */

View File

@ -1,7 +1,9 @@
/* /*
* Copyright (c) 2001-2002, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2002-2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -26,23 +28,12 @@
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "mqc.h" #include "opj_includes.h"
#include <stdio.h>
/* <summary> */
/* This struct defines the state of a context. */
/* </summary> */
typedef struct mqc_state_s {
unsigned int qeval; /* the probability of the Least Probable Symbol (0.75->0x8000, 1.5->0xffff) */
int mps; /* the Most Probable Symbol (0 or 1) */
struct mqc_state_s *nmps; /* next state if the next encoded symbol is the MPS */
struct mqc_state_s *nlps; /* next state if the next encoded symbol is the LPS */
} mqc_state_t;
/* <summary> */ /* <summary> */
/* This array defines all the possible states for a context. */ /* This array defines all the possible states for a context. */
/* </summary> */ /* </summary> */
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]},
@ -139,453 +130,353 @@ mqc_state_t mqc_states[47 * 2] = {
{0x5601, 1, &mqc_states[93], &mqc_states[93]}, {0x5601, 1, &mqc_states[93], &mqc_states[93]},
}; };
#define MQC_NUMCTXS 32 /*
==========================================================
local functions
==========================================================
*/
unsigned int mqc_c; static void mqc_byteout(opj_mqc_t *mqc) {
unsigned int mqc_a; if (*mqc->bp == 0xff) {
unsigned int mqc_ct; mqc->bp++;
unsigned char *mqc_bp; *mqc->bp = mqc->c >> 20;
unsigned char *mqc_start; mqc->c &= 0xfffff;
unsigned char *mqc_end; mqc->ct = 7;
mqc_state_t *mqc_ctxs[MQC_NUMCTXS];
mqc_state_t **mqc_curctx;
/* <summary> */
/* Return the number of bytes already encoded. */
/* </summary> */
int mqc_numbytes()
{
return mqc_bp - mqc_start;
}
/* <summary> */
/* Output a byte, doing bit-stuffing if necessary. */
/* After a 0xff byte, the next byte must be smaller than 0x90 */
/* </summary> */
void mqc_byteout()
{
if (*mqc_bp == 0xff) {
mqc_bp++;
*mqc_bp = mqc_c >> 20;
mqc_c &= 0xfffff;
mqc_ct = 7;
} else { } 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;
} }
} }
} }
} }
/* <summary> */ static void mqc_renorme(opj_mqc_t *mqc) {
/* Renormalize mqc_a and mqc_c while encoding, so that mqc_a stays between 0x8000 and 0x10000 */
/* </summary> */
void mqc_renorme()
{
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_byteout(mqc);
} }
} while ((mqc_a & 0x8000) == 0); } while ((mqc->a & 0x8000) == 0);
} }
/* <summary> */ static void mqc_codemps(opj_mqc_t *mqc) {
/* Encode the most probable symbol. */ mqc->a -= (*mqc->curctx)->qeval;
/* </summary> */ if ((mqc->a & 0x8000) == 0) {
void mqc_codemps() if (mqc->a < (*mqc->curctx)->qeval) {
{ mqc->a = (*mqc->curctx)->qeval;
mqc_a -= (*mqc_curctx)->qeval;
if ((mqc_a & 0x8000) == 0) {
if (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_renorme(mqc);
} else { } else {
mqc_c += (*mqc_curctx)->qeval; mqc->c += (*mqc->curctx)->qeval;
} }
} }
/* <summary> */ static void mqc_codelps(opj_mqc_t *mqc) {
/* Encode the most least symbol. */ mqc->a -= (*mqc->curctx)->qeval;
/* </summary> */ if (mqc->a < (*mqc->curctx)->qeval) {
void mqc_codelps() mqc->c += (*mqc->curctx)->qeval;
{
mqc_a -= (*mqc_curctx)->qeval;
if (mqc_a < (*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_renorme(mqc);
} }
/* <summary> */ static void mqc_setbits(opj_mqc_t *mqc) {
/* Initialize encoder. */ unsigned int tempc = mqc->c + mqc->a;
/* </summary> */ mqc->c |= 0xffff;
/* <param name="bp">Output buffer.</param> */ if (mqc->c >= tempc) {
void mqc_init_enc(unsigned char *bp) mqc->c -= 0x8000;
{
mqc_setcurctx(0);
mqc_a = 0x8000;
mqc_c = 0;
mqc_bp = bp - 1;
mqc_ct = 12;
if (*mqc_bp == 0xff) {
mqc_ct = 13;
}
mqc_start = bp;
}
/* <summary> */
/* Set current context. */
/* </summary> */
/* <param name="ctxno">Context number.</param> */
void mqc_setcurctx(int ctxno)
{
mqc_curctx = &mqc_ctxs[ctxno];
}
/* <summary> */
/* Encode a symbol using the MQ-coder. */
/* </summary> */
/* <param name="d"> The symbol to be encoded (0 or 1).</param> */
void mqc_encode(int d)
{
if ((*mqc_curctx)->mps == d) {
mqc_codemps();
} else {
mqc_codelps();
} }
} }
/* <summary> */ static int mqc_mpsexchange(opj_mqc_t *mqc) {
/* Fill mqc_c with 1's for flushing */
/* </summary> */
void mqc_setbits()
{
unsigned int tempc = mqc_c + mqc_a;
mqc_c |= 0xffff;
if (mqc_c >= tempc) {
mqc_c -= 0x8000;
}
}
/* <summary> */
/* Flush encoded data. */
/* </summary> */
void mqc_flush()
{
mqc_setbits();
mqc_c <<= mqc_ct;
mqc_byteout();
mqc_c <<= mqc_ct;
mqc_byteout();
if (*mqc_bp != 0xff) {
mqc_bp++;
}
}
/* <summary> */
/* not fully implemented and tested !! */
/* BYPASS mode switch, initialization operation */
/* JPEG 2000 p 505 */
/* </summary> */
void mqc_bypass_init_enc()
{
mqc_c = 0;
mqc_ct = 8;
/*if (*mqc_bp == 0xff) {
mqc_ct = 7;
} */
}
/* <summary> */
/* not fully implemented and tested !! */
/* BYPASS mode switch, coding operation */
/* JPEG 2000 p 505 */
/* </summary> */
void mqc_bypass_enc(int d)
{
mqc_ct--;
mqc_c = mqc_c + (d << mqc_ct);
if (mqc_ct == 0) {
mqc_bp++;
*mqc_bp = mqc_c;
mqc_ct = 8;
if (*mqc_bp == 0xff) {
mqc_ct = 7;
}
mqc_c = 0;
}
}
/* <summary> */
/* not fully implemented and tested !! */
/* BYPASS mode switch, flush operation */
/* </summary> */
int mqc_bypass_flush_enc()
{
unsigned char bit_padding;
bit_padding = 0;
if (mqc_ct != 0) {
while (mqc_ct > 0) {
mqc_ct--;
mqc_c += bit_padding << mqc_ct;
bit_padding = (bit_padding + 1) & 0x01;
}
mqc_bp++;
*mqc_bp = mqc_c;
mqc_ct = 8;
mqc_c = 0;
}
return 1;
}
/* <summary> */
/* RESET mode switch */
/* </summary> */
void mqc_reset_enc()
{
mqc_resetstates();
mqc_setstate(18, 0, 46);
mqc_setstate(0, 0, 3);
mqc_setstate(1, 0, 4);
}
/* <summary> */
/* mode switch RESTART (TERMALL) */
/* </summary> */
int mqc_restart_enc()
{
int correction = 1;
/* <flush part> */
int n = 27 - 15 - mqc_ct;
mqc_c <<= mqc_ct;
while (n > 0) {
mqc_byteout();
n -= mqc_ct;
mqc_c <<= mqc_ct;
}
mqc_byteout();
return correction;
}
/* <summary> */
/* mode switch RESTART (TERMALL) reinitialisation */
/* </summary> */
void mqc_restart_init_enc()
{
/* <Re-init part> */
mqc_setcurctx(0);
mqc_a = 0x8000;
mqc_c = 0;
mqc_ct = 12;
mqc_bp--;
if (*mqc_bp == 0xff) {
mqc_ct = 13;
}
}
/* <summary> */
/* ERTERM mode switch */
/* </summary> */
void mqc_erterm_enc()
{
int k = 11 - mqc_ct + 1;
while (k > 0) {
mqc_c <<= mqc_ct;
mqc_ct = 0;
mqc_byteout();
k -= mqc_ct;
}
if (*mqc_bp != 0xff) {
mqc_byteout();
}
}
/* <summary> */
/* SEGMARK mode switch (SEGSYM) */
/* </summary> */
void mqc_segmark_enc()
{
int i;
mqc_setcurctx(18);
for (i = 1; i < 5; i++) {
mqc_encode(i % 2);
}
}
/* <summary> */
/* </summary> */
int mqc_mpsexchange()
{
int d; 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;
} }
/* <summary> */ static int mqc_lpsexchange(opj_mqc_t *mqc) {
/* </summary> */
int mqc_lpsexchange()
{
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;
} }
/* <summary> */ static void mqc_bytein(opj_mqc_t *mqc) {
/* Input a byte. */ if (mqc->bp != mqc->end) {
/* </summary> */
void mqc_bytein()
{
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;
} }
} }
/* <summary> */ static void mqc_renormd(opj_mqc_t *mqc) {
/* Renormalize mqc_a and mqc_c while decoding. */
/* </summary> */
void mqc_renormd()
{
do { do {
if (mqc_ct == 0) { if (mqc->ct == 0) {
mqc_bytein(); 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);
} }
/* <summary> */ /*
/* Initialize decoder. */ ==========================================================
/* </summary> */ MQ-Coder interface
void mqc_init_dec(unsigned char *bp, int len) ==========================================================
{ */
mqc_setcurctx(0);
mqc_start = bp; opj_mqc_t* mqc_create() {
mqc_end = bp + len; opj_mqc_t *mqc = (opj_mqc_t*)opj_malloc(sizeof(opj_mqc_t));
mqc_bp = bp; return mqc;
/*add antonin initbug1*/
if (len==0) mqc_c = 0xff << 16;
else mqc_c = *mqc_bp << 16;
/*dda*/
mqc_bytein();
mqc_c <<= 7;
mqc_ct -= 7;
mqc_a = 0x8000;
} }
/* <summary> */ void mqc_destroy(opj_mqc_t *mqc) {
/* Decode a symbol. */ if(mqc) {
/* </summary> */ opj_free(mqc);
int mqc_decode() }
{ }
int d;
mqc_a -= (*mqc_curctx)->qeval; int mqc_numbytes(opj_mqc_t *mqc) {
if ((mqc_c >> 16) < (*mqc_curctx)->qeval) { return mqc->bp - mqc->start;
d = mqc_lpsexchange(); }
mqc_renormd();
void mqc_init_enc(opj_mqc_t *mqc, unsigned char *bp) {
mqc_setcurctx(mqc, 0);
mqc->a = 0x8000;
mqc->c = 0;
mqc->bp = bp - 1;
mqc->ct = 12;
if (*mqc->bp == 0xff) {
mqc->ct = 13;
}
mqc->start = bp;
}
void mqc_setcurctx(opj_mqc_t *mqc, int ctxno) {
mqc->curctx = &mqc->ctxs[ctxno];
}
void mqc_encode(opj_mqc_t *mqc, int d) {
if ((*mqc->curctx)->mps == d) {
mqc_codemps(mqc);
} else { } else {
mqc_c -= (*mqc_curctx)->qeval << 16; mqc_codelps(mqc);
if ((mqc_a & 0x8000) == 0) { }
d = mqc_mpsexchange(); }
mqc_renormd();
void mqc_flush(opj_mqc_t *mqc) {
mqc_setbits(mqc);
mqc->c <<= mqc->ct;
mqc_byteout(mqc);
mqc->c <<= mqc->ct;
mqc_byteout(mqc);
if (*mqc->bp != 0xff) {
mqc->bp++;
}
}
void mqc_bypass_init_enc(opj_mqc_t *mqc) {
mqc->c = 0;
mqc->ct = 8;
/*if (*mqc->bp == 0xff) {
mqc->ct = 7;
} */
}
void mqc_bypass_enc(opj_mqc_t *mqc, int d) {
mqc->ct--;
mqc->c = mqc->c + (d << mqc->ct);
if (mqc->ct == 0) {
mqc->bp++;
*mqc->bp = mqc->c;
mqc->ct = 8;
if (*mqc->bp == 0xff) {
mqc->ct = 7;
}
mqc->c = 0;
}
}
int mqc_bypass_flush_enc(opj_mqc_t *mqc) {
unsigned char bit_padding;
bit_padding = 0;
if (mqc->ct != 0) {
while (mqc->ct > 0) {
mqc->ct--;
mqc->c += bit_padding << mqc->ct;
bit_padding = (bit_padding + 1) & 0x01;
}
mqc->bp++;
*mqc->bp = mqc->c;
mqc->ct = 8;
mqc->c = 0;
}
return 1;
}
void mqc_reset_enc(opj_mqc_t *mqc) {
mqc_resetstates(mqc);
mqc_setstate(mqc, 18, 0, 46);
mqc_setstate(mqc, 0, 0, 3);
mqc_setstate(mqc, 1, 0, 4);
}
int mqc_restart_enc(opj_mqc_t *mqc) {
int correction = 1;
/* <flush part> */
int n = 27 - 15 - mqc->ct;
mqc->c <<= mqc->ct;
while (n > 0) {
mqc_byteout(mqc);
n -= mqc->ct;
mqc->c <<= mqc->ct;
}
mqc_byteout(mqc);
return correction;
}
void mqc_restart_init_enc(opj_mqc_t *mqc) {
/* <Re-init part> */
mqc_setcurctx(mqc, 0);
mqc->a = 0x8000;
mqc->c = 0;
mqc->ct = 12;
mqc->bp--;
if (*mqc->bp == 0xff) {
mqc->ct = 13;
}
}
void mqc_erterm_enc(opj_mqc_t *mqc) {
int k = 11 - mqc->ct + 1;
while (k > 0) {
mqc->c <<= mqc->ct;
mqc->ct = 0;
mqc_byteout(mqc);
k -= mqc->ct;
}
if (*mqc->bp != 0xff) {
mqc_byteout(mqc);
}
}
void mqc_segmark_enc(opj_mqc_t *mqc) {
int i;
mqc_setcurctx(mqc, 18);
for (i = 1; i < 5; i++) {
mqc_encode(mqc, i % 2);
}
}
void mqc_init_dec(opj_mqc_t *mqc, unsigned char *bp, int len) {
mqc_setcurctx(mqc, 0);
mqc->start = bp;
mqc->end = bp + len;
mqc->bp = bp;
if (len==0) mqc->c = 0xff << 16;
else mqc->c = *mqc->bp << 16;
mqc_bytein(mqc);
mqc->c <<= 7;
mqc->ct -= 7;
mqc->a = 0x8000;
}
int mqc_decode(opj_mqc_t *mqc) {
int d;
mqc->a -= (*mqc->curctx)->qeval;
if ((mqc->c >> 16) < (*mqc->curctx)->qeval) {
d = mqc_lpsexchange(mqc);
mqc_renormd(mqc);
} else {
mqc->c -= (*mqc->curctx)->qeval << 16;
if ((mqc->a & 0x8000) == 0) {
d = mqc_mpsexchange(mqc);
mqc_renormd(mqc);
} else { } else {
d = (*mqc_curctx)->mps; d = (*mqc->curctx)->mps;
} }
} }
return d; return d;
} }
/* <summary> */ void mqc_resetstates(opj_mqc_t *mqc) {
/* Reset states of all contexts. */
/* </summary> */
void mqc_resetstates()
{
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;
} }
} }
/* <summary> */ void mqc_setstate(opj_mqc_t *mqc, int ctxno, int msb, int prob) {
/* Set the state for a context. */ mqc->ctxs[ctxno] = &mqc_states[msb + (prob << 1)];
/* </summary> */
/* <param name="ctxno">Context number</param> */
/* <param name="msb">Most significant bit</param> */
/* <param name="prob">Index to the probability of symbols</param> */
void mqc_setstate(int ctxno, int msb, int prob)
{
mqc_ctxs[ctxno] = &mqc_states[msb + (prob << 1)];
} }

View File

@ -1,7 +1,9 @@
/* /*
* Copyright (c) 2001-2002, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2002-2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -28,100 +30,221 @@
#ifndef __MQC_H #ifndef __MQC_H
#define __MQC_H #define __MQC_H
/**
@file mqc.h
@brief Implementation of an MQ-Coder (MQC)
/* The functions in MQC.C have for goal to realize the MQ-coder operations. The functions
* Return the number of bytes written/read since initialisation in MQC.C are used by some function in T1.C.
*/ */
int mqc_numbytes();
/* /** @defgroup MQC MQC - Implementation of an MQ-Coder */
* Reset the states of all the context of the coder/decoder /*@{*/
* (each context is set to a state where 0 and 1 are more or less equiprobable)
*/
void mqc_resetstates();
/* /**
* Set the state of a particular context This struct defines the state of a context.
* ctxno: number that identifies the context */
* msb: the MSB of the new state of the context typedef struct opj_mqc_state {
* prob: number that identifies the probability of the symbols for the new state of the context /** the probability of the Least Probable Symbol (0.75->0x8000, 1.5->0xffff) */
*/ unsigned int qeval;
void mqc_setstate(int ctxno, int msb, int prob); /** the Most Probable Symbol (0 or 1) */
int mps;
/** next state if the next encoded symbol is the MPS */
struct opj_mqc_state *nmps;
/** next state if the next encoded symbol is the LPS */
struct opj_mqc_state *nlps;
} opj_mqc_state_t;
/* #define MQC_NUMCTXS 32
* Initialize the encoder
* bp: pointer to the start of the buffer where the bytes will be written
*/
void mqc_init_enc(unsigned char *bp);
/* /**
* Set the current context used for coding/decoding MQ coder
* ctxno: number that identifies the context */
*/ typedef struct opj_mqc {
void mqc_setcurctx(int ctxno); unsigned int c;
unsigned int a;
unsigned int ct;
unsigned char *bp;
unsigned char *start;
unsigned char *end;
opj_mqc_state_t *ctxs[MQC_NUMCTXS];
opj_mqc_state_t **curctx;
} opj_mqc_t;
/* /** @name Local static functions */
* Encode a bit /*@{*/
* d: bit to encode (0 or 1) /* ----------------------------------------------------------------------- */
*/ /**
void mqc_encode(int d); 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 */
* Flush the encoder, so that all remaining data is written /*@{*/
*/ /* ----------------------------------------------------------------------- */
void mqc_flush(); /**
Create a new MQC handle
@return Returns a new MQC handle if successful, returns NULL otherwise
*/
opj_mqc_t* mqc_create();
/**
Destroy a previously created MQC handle
@param mqc MQC handle to destroy
*/
void mqc_destroy(opj_mqc_t *mqc);
/**
Return the number of bytes written/read since initialisation
@param mqc MQC handle
@return Returns the number of bytes already encoded
*/
int mqc_numbytes(opj_mqc_t *mqc);
/**
Reset the states of all the context of the coder/decoder
(each context is set to a state where 0 and 1 are more or less equiprobable)
@param mqc MQC handle
*/
void mqc_resetstates(opj_mqc_t *mqc);
/**
Set the state of a particular context
@param mqc MQC handle
@param ctxno Number that identifies the context
@param msb The MSB of the new state of the context
@param prob Number that identifies the probability of the symbols for the new state of the context
*/
void mqc_setstate(opj_mqc_t *mqc, int ctxno, int msb, int prob);
/**
Initialize the encoder
@param mqc MQC handle
@param bp Pointer to the start of the buffer where the bytes will be written
*/
void mqc_init_enc(opj_mqc_t *mqc, unsigned char *bp);
/**
Set the current context used for coding/decoding
@param mqc MQC handle
@param ctxno Number that identifies the context
*/
void mqc_setcurctx(opj_mqc_t *mqc, int ctxno);
/**
Encode a symbol using the MQ-coder
@param mqc MQC handle
@param d The symbol to be encoded (0 or 1)
*/
void mqc_encode(opj_mqc_t *mqc, int d);
/**
Flush the encoder, so that all remaining data is written
@param mqc MQC handle
*/
void mqc_flush(opj_mqc_t *mqc);
/**
BYPASS mode switch, initialization operation.
JPEG 2000 p 505.
<h2>Not fully implemented and tested !!</h2>
@param mqc MQC handle
*/
void mqc_bypass_init_enc(opj_mqc_t *mqc);
/**
BYPASS mode switch, coding operation.
JPEG 2000 p 505.
<h2>Not fully implemented and tested !!</h2>
@param mqc MQC handle
@param d The symbol to be encoded (0 or 1)
*/
void mqc_bypass_enc(opj_mqc_t *mqc, int d);
/**
BYPASS mode switch, flush operation
<h2>Not fully implemented and tested !!</h2>
@param mqc MQC handle
@return Returns 1 (always)
*/
int mqc_bypass_flush_enc(opj_mqc_t *mqc);
/**
RESET mode switch
@param mqc MQC handle
*/
void mqc_reset_enc(opj_mqc_t *mqc);
/**
RESTART mode switch (TERMALL)
@param mqc MQC handle
@return Returns 1 (always)
*/
int mqc_restart_enc(opj_mqc_t *mqc);
/**
RESTART mode switch (TERMALL) reinitialisation
@param mqc MQC handle
*/
void mqc_restart_init_enc(opj_mqc_t *mqc);
/**
ERTERM mode switch (PTERM)
@param mqc MQC handle
*/
void mqc_erterm_enc(opj_mqc_t *mqc);
/**
SEGMARK mode switch (SEGSYM)
@param mqc MQC handle
*/
void mqc_segmark_enc(opj_mqc_t *mqc);
/**
Initialize the decoder
@param mqc MQC handle
@param bp Pointer to the start of the buffer from which the bytes will be read
@param len Length of the input buffer
*/
void mqc_init_dec(opj_mqc_t *mqc, unsigned char *bp, int len);
/**
Decode a symbol
@param mqc MQC handle
@return Returns the decoded symbol (0 or 1)
*/
int mqc_decode(opj_mqc_t *mqc);
/* ----------------------------------------------------------------------- */
/*@}*/
/* /*@}*/
* BYPASS mode switch
*/
void mqc_bypass_init_enc();
/* #endif /* __MQC_H */
* BYPASS mode switch
*/
void mqc_bypass_enc(int d);
/*
* BYPASS mode switch
*/
int mqc_bypass_flush_enc();
/*
* RESET mode switch
*/
void mqc_reset_enc();
/*
* RESTART mode switch (TERMALL)
*/
int mqc_restart_enc();
/*
* RESTART mode switch (TERMALL)
*/
void mqc_restart_init_enc();
/*
* ERTERM mode switch (PTERM)
*/
void mqc_erterm_enc();
/*
* SEGMARK mode switch (SEGSYM)
*/
void mqc_segmark_enc();
/*
* Initialize the decoder
* bp: pointer to the start of the buffer from which the bytes will be read
* len: length of the input buffer
*/
void mqc_init_dec(unsigned char *bp, int len);
/*
* Decode a bit (returns 0 or 1)
*/
int mqc_decode();
#endif

210
libopenjpeg/openjpeg.c Normal file
View File

@ -0,0 +1,210 @@
/*
* Copyright (c) 2005, Hervé Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include "opj_includes.h"
opj_dinfo_t* opj_create_decompress(OPJ_CODEC_FORMAT format) {
opj_dinfo_t *dinfo = (opj_dinfo_t*)opj_malloc(sizeof(opj_dinfo_t));
if(!dinfo) return NULL;
dinfo->is_decompressor = true;
switch(format) {
case CODEC_J2K:
case CODEC_JPT:
/* get a J2K decoder handle */
dinfo->j2k_handle = (void*)j2k_create_decompress((opj_common_ptr)dinfo);
if(!dinfo->j2k_handle) {
opj_free(dinfo);
return NULL;
}
break;
case CODEC_JP2:
/* get a JP2 decoder handle */
dinfo->jp2_handle = (void*)jp2_create_decompress((opj_common_ptr)dinfo);
if(!dinfo->jp2_handle) {
opj_free(dinfo);
return NULL;
}
break;
default:
opj_free(dinfo);
return NULL;
}
dinfo->codec_format = format;
return dinfo;
}
void opj_destroy_decompress(opj_dinfo_t *dinfo) {
if(dinfo) {
/* destroy the codec */
switch(dinfo->codec_format) {
case CODEC_J2K:
case CODEC_JPT:
j2k_destroy_decompress((opj_j2k_t*)dinfo->j2k_handle);
break;
case CODEC_JP2:
jp2_destroy_decompress((opj_jp2_t*)dinfo->jp2_handle);
break;
}
/* destroy the decompressor */
opj_free(dinfo);
}
}
void opj_set_default_decoder_parameters(opj_dparameters_t *parameters) {
if(parameters) {
memset(parameters, 0, sizeof(opj_dparameters_t));
/* default decoding parameters */
parameters->cp_layer = 0;
parameters->cp_reduce = 0;
parameters->decod_format = -1;
parameters->cod_format = -1;
}
}
void opj_setup_decoder(opj_dinfo_t *dinfo, opj_dparameters_t *parameters) {
if(dinfo && parameters) {
switch(dinfo->codec_format) {
case CODEC_J2K:
case CODEC_JPT:
j2k_setup_decoder((opj_j2k_t*)dinfo->j2k_handle, parameters);
break;
case CODEC_JP2:
jp2_setup_decoder((opj_jp2_t*)dinfo->jp2_handle, parameters);
break;
}
}
}
opj_image_t* opj_decode(opj_dinfo_t *dinfo, opj_cio_t *cio) {
if(dinfo && cio) {
switch(dinfo->codec_format) {
case CODEC_J2K:
return j2k_decode((opj_j2k_t*)dinfo->j2k_handle, cio);
case CODEC_JPT:
return j2k_decode_jpt_stream((opj_j2k_t*)dinfo->j2k_handle, cio);
case CODEC_JP2:
return jp2_decode((opj_jp2_t*)dinfo->jp2_handle, cio);
}
}
return NULL;
}
opj_cinfo_t* opj_create_compress(OPJ_CODEC_FORMAT format) {
opj_cinfo_t *cinfo = (opj_cinfo_t*)opj_malloc(sizeof(opj_cinfo_t));
if(!cinfo) return NULL;
cinfo->is_decompressor = false;
switch(format) {
case CODEC_J2K:
/* get a J2K coder handle */
cinfo->j2k_handle = (void*)j2k_create_compress((opj_common_ptr)cinfo);
if(!cinfo->j2k_handle) {
opj_free(cinfo);
return NULL;
}
break;
case CODEC_JP2:
/* get a JP2 coder handle */
cinfo->jp2_handle = (void*)jp2_create_compress((opj_common_ptr)cinfo);
if(!cinfo->jp2_handle) {
opj_free(cinfo);
return NULL;
}
break;
default:
opj_free(cinfo);
return NULL;
}
cinfo->codec_format = format;
return cinfo;
}
void opj_destroy_compress(opj_cinfo_t *cinfo) {
if(cinfo) {
/* destroy the codec */
switch(cinfo->codec_format) {
case CODEC_J2K:
j2k_destroy_decompress((opj_j2k_t*)cinfo->j2k_handle);
break;
case CODEC_JP2:
jp2_destroy_decompress((opj_jp2_t*)cinfo->jp2_handle);
break;
}
/* destroy the decompressor */
opj_free(cinfo);
}
}
void opj_set_default_encoder_parameters(opj_cparameters_t *parameters) {
if(parameters) {
memset(parameters, 0, sizeof(opj_cparameters_t));
/* default coding parameters */
parameters->numresolution = 6;
parameters->cblockw_init = 64;
parameters->cblockh_init = 64;
parameters->prog_order = LRCP;
parameters->roi_compno = -1; /* no ROI */
parameters->subsampling_dx = 1;
parameters->subsampling_dy = 1;
parameters->decod_format = -1;
parameters->cod_format = -1;
}
}
void opj_setup_encoder(opj_cinfo_t *cinfo, opj_cparameters_t *parameters, opj_image_t *image) {
if(cinfo && parameters && image) {
switch(cinfo->codec_format) {
case CODEC_J2K:
j2k_setup_encoder((opj_j2k_t*)cinfo->j2k_handle, parameters, image);
break;
case CODEC_JP2:
jp2_setup_encoder((opj_jp2_t*)cinfo->jp2_handle, parameters, image);
break;
}
}
}
bool opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, char *index) {
if(cinfo && cio && image) {
switch(cinfo->codec_format) {
case CODEC_J2K:
return j2k_encode((opj_j2k_t*)cinfo->j2k_handle, cio, image, index);
case CODEC_JP2:
return jp2_encode((opj_jp2_t*)cinfo->jp2_handle, cio, image, index);
}
}
return false;
}

View File

@ -1,7 +1,9 @@
/* /*
* Copyright (c) 2001-2002, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2003, Yannick Verschueren * Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -26,24 +28,571 @@
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#ifndef __OPENJPEG_H
#define __OPENJPEG_H
#include <j2k.h> #ifndef OPENJPEG_H
#include <tcd.h> #define OPENJPEG_H
#include <jp2.h>
#include <bio.h>
#include <cio.h>
#include <dwt.h>
#include <fix.h>
#include <int.h>
#include <mct.h>
#include <mqc.h>
#include <pi.h>
#include <raw.h>
#include <t1.h>
#include <t2.h>
#include <tgt.h>
/*
==========================================================
Compiler directives
==========================================================
*/
#ifndef __cplusplus
#if defined(HAVE_STDBOOL_H)
/*
The C language implementation does correctly provide the standard header
file "stdbool.h".
*/
#include <stdbool.h>
#else
/*
The C language implementation does not provide the standard header file
"stdbool.h" as required by ISO/IEC 9899:1999. Try to compensate for this
braindamage below.
*/
#if !defined(bool)
#define bool int
#endif #endif
#if !defined(true)
#define true 1
#endif
#if !defined(false)
#define false 0
#endif
#endif
#endif /* __cplusplus */
/*
==========================================================
Useful constant definitions
==========================================================
*/
#ifndef MAX_PATH
#define MAX_PATH 260 /**< Maximum allowed size for filenames */
#endif /* MAX_PATH */
#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 */
/*
==========================================================
enum definitions
==========================================================
*/
/** Progression order */
typedef enum PROG_ORDER {
PROG_UNKNOWN = -1, /**< place-holder */
LRCP = 0, /**< layer-resolution-component-precinct order */
RLCP = 1, /**< resolution-layer-component-precinct order */
RPCL = 2, /**< resolution-precinct-component-layer order */
PCRL = 3, /**< precinct-component-resolution-layer order */
CPRL = 4 /**< component-precinct-resolution-layer order */
} OPJ_PROG_ORDER;
/**
Supported image color spaces
*/
typedef enum COLOR_SPACE {
CLRSPC_UNKNOWN = -1, /**< place-holder */
CLRSPC_SRGB = 1, /**< sRGB */
CLRSPC_GRAY = 2, /**< grayscale */
CLRSPC_SYCC = 3 /**< YUV */
} OPJ_COLOR_SPACE;
/**
Supported codec
*/
typedef enum CODEC_FORMAT {
CODEC_UNKNOWN = -1, /**< place-holder */
CODEC_J2K = 0, /**< JPEG-2000 codestream : read/write */
CODEC_JPT = 1, /**< JPT-stream (JPEG 2000, JPIP) : read only */
CODEC_JP2 = 2 /**< JPEG-2000 file format : read/write */
} OPJ_CODEC_FORMAT;
/*
==========================================================
event manager typedef definitions
==========================================================
*/
/**
Callback function prototype for events
@param msg Event message
@param client_data
*/
typedef void (*opj_msg_callback) (const char *msg, void *client_data);
/**
Message handler object
used for
<ul>
<li>Error messages
<li>Warning messages
<li>Debugging messages
</ul>
*/
typedef struct opj_event_mgr {
/** Error message callback if available, NULL otherwise */
opj_msg_callback error_handler;
/** Warning message callback if available, NULL otherwise */
opj_msg_callback warning_handler;
/** Debug message callback if available, NULL otherwise */
opj_msg_callback info_handler;
} opj_event_mgr_t;
/*
==========================================================
codec typedef definitions
==========================================================
*/
/**
Progression order changes
*/
typedef struct opj_poc {
int resno0, compno0;
int layno1, resno1, compno1;
OPJ_PROG_ORDER prg;
int tile;
char progorder[4];
} opj_poc_t;
/**
Compression parameters
*/
typedef struct opj_cparameters {
/** size of tile: tile_size_on = false (not in argument) or = true (in argument) */
bool tile_size_on;
/** XTOsiz */
int cp_tx0;
/** YTOsiz */
int cp_ty0;
/** XTsiz */
int cp_tdx;
/** YTsiz */
int cp_tdy;
/** allocation by rate/distortion */
int cp_disto_alloc;
/** allocation by fixed layer */
int cp_fixed_alloc;
/** add fixed_quality */
int cp_fixed_quality;
/** fixed layer */
int *cp_matrice;
/** comment for coding */
char *cp_comment;
/** csty : coding style */
int csty;
/** progression order (default LRCP) */
OPJ_PROG_ORDER prog_order;
/** progression order changes */
opj_poc_t POC[32];
/** number of progression order changes (POC), default to 0 */
int numpocs;
/** number of layers */
int tcp_numlayers;
/** rates of layers */
int tcp_rates[100];
/** different psnr for successive layers */
float tcp_distoratio[100];
/** number of resolutions */
int numresolution;
/** initial code block width, default to 64 */
int cblockw_init;
/** initial code block height, default to 64 */
int cblockh_init;
/** mode switch (cblk_style) */
int mode;
/** 1 : use the irreversible DWT 9-7, 0 : use lossless compression (default) */
int irreversible;
/** region of interest: affected component in [0..3], -1 means no ROI */
int roi_compno;
/** region of interest: upshift value */
int roi_shift;
/* number of precinct size specifications */
int res_spec;
/** initial precinct width */
int prcw_init[J2K_MAXRLVLS];
/** initial precinct height */
int prch_init[J2K_MAXRLVLS];
/**@name command line encoder parameters (not used inside the library) */
/*@{*/
/** input file name */
char infile[MAX_PATH];
/** output file name */
char outfile[MAX_PATH];
/** creation of an index file, default to 0 (false) */
int index_on;
/** index file name */
char index[MAX_PATH];
/** subimage encoding: origin image offset in x direction */
int image_offset_x0;
/** subimage encoding: origin image offset in y direction */
int image_offset_y0;
/** subsampling value for dx */
int subsampling_dx;
/** subsampling value for dy */
int subsampling_dy;
/** input file format 0: PGX, 1: PxM, 2: BMP */
int decod_format;
/** output file format 0: J2K, 1: JP2, 2: JPT */
int cod_format;
/*@}*/
} opj_cparameters_t;
/**
Decompression parameters
*/
typedef struct opj_dparameters {
/**
Set the number of highest resolution levels to be discarded.
The image resolution is effectively divided by 2 to the power of the number of discarded levels.
The reduce factor is limited by the smallest total number of decomposition levels among tiles.
if != 0, then original dimension divided by 2^(reduce);
if == 0 or not used, image is decoded to the full resolution
*/
int cp_reduce;
/**
Set the maximum number of quality layers to decode.
If there are less quality layers than the specified number, all the quality layers are decoded.
if != 0, then only the first "layer" layers are decoded;
if == 0 or not used, all the quality layers are decoded
*/
int cp_layer;
/**@name command line encoder parameters (not used inside the library) */
/*@{*/
/** input file name */
char infile[MAX_PATH];
/** output file name */
char outfile[MAX_PATH];
/** input file format 0: J2K, 1: JP2, 2: JPT */
int decod_format;
/** output file format 0: PGX, 1: PxM, 2: BMP */
int cod_format;
/*@}*/
} opj_dparameters_t;
/** Common fields between JPEG-2000 compression and decompression master structs. */
#define opj_common_fields \
opj_event_mgr_t *event_mgr; /**< pointer to the event manager */\
void * client_data; /**< Available for use by application */\
bool is_decompressor; /**< So common code can tell which is which */\
OPJ_CODEC_FORMAT codec_format; /**< selected codec */\
void *j2k_handle; /**< pointer to the J2K codec */\
void *jp2_handle /**< pointer to the JP2 codec */
/* Routines that are to be used by both halves of the library are declared
* to receive a pointer to this structure. There are no actual instances of
* opj_common_struct_t, only of opj_cinfo_t and opj_dinfo_t.
*/
typedef struct opj_common_struct {
opj_common_fields; /* Fields common to both master struct types */
/* Additional fields follow in an actual opj_cinfo_t or
* opj_dinfo_t. All three structs must agree on these
* initial fields! (This would be a lot cleaner in C++.)
*/
} opj_common_struct_t;
typedef opj_common_struct_t * opj_common_ptr;
/**
Compression context info
*/
typedef struct opj_cinfo {
/** Fields shared with opj_dinfo_t */
opj_common_fields;
/* other specific fields go here */
} opj_cinfo_t;
/**
Decompression context info
*/
typedef struct opj_dinfo {
/** Fields shared with opj_cinfo_t */
opj_common_fields;
/* other specific fields go here */
} opj_dinfo_t;
/*
==========================================================
I/O stream typedef definitions
==========================================================
*/
/*
* Stream open flags.
*/
/** The stream was opened for reading. */
#define OPJ_STREAM_READ 0x0001
/** The stream was opened for writing. */
#define OPJ_STREAM_WRITE 0x0002
/**
Byte input-output stream (CIO)
*/
typedef struct opj_cio {
/** codec context */
opj_common_ptr cinfo;
/** open mode (read/write) either OPJ_STREAM_READ or OPJ_STREAM_WRITE */
int openmode;
/** pointer to the start of the buffer */
unsigned char *buffer;
/** buffer size in bytes */
int length;
/** pointer to the start of the stream */
unsigned char *start;
/** pointer to the end of the stream */
unsigned char *end;
/** pointer to the current position */
unsigned char *bp;
} opj_cio_t;
/*
==========================================================
image typedef definitions
==========================================================
*/
/**
Defines a single image component
*/
typedef struct opj_image_comp {
/** XRsiz: horizontal separation of a sample of ith component with respect to the reference grid */
int dx;
/** YRsiz: vertical separation of a sample of ith component with respect to the reference grid */
int dy;
/** data width */
int w;
/** data height */
int h;
/** x component offset compared to the whole image */
int x0;
/** y component offset compared to the whole image */
int y0;
/** precision */
int prec;
/** image depth in bits */
int bpp;
/** signed (1) / unsigned (0) */
int sgnd;
/** number of decoded resolution */
int resno_decoded;
/** number of division by 2 of the out image compared to the original size of image */
int factor;
/** image component data */
int *data;
} opj_image_comp_t;
/**
Defines image data and characteristics
*/
typedef struct opj_image {
/** XOsiz: horizontal offset from the origin of the reference grid to the left side of the image area */
int x0;
/** YOsiz: vertical offset from the origin of the reference grid to the top side of the image area */
int y0;
/** Xsiz: width of the reference grid */
int x1;
/** Ysiz: height of the reference grid */
int y1;
/** number of components in the image */
int numcomps;
/** color space: sRGB, Greyscale or YUV */
OPJ_COLOR_SPACE color_space;
/** image components */
opj_image_comp_t *comps;
} opj_image_t;
/**
Component parameters structure used by the opj_image_create function
*/
typedef struct opj_image_comptparm {
/** XRsiz: horizontal separation of a sample of ith component with respect to the reference grid */
int dx;
/** YRsiz: vertical separation of a sample of ith component with respect to the reference grid */
int dy;
/** data width */
int w;
/** data height */
int h;
/** x component offset compared to the whole image */
int x0;
/** y component offset compared to the whole image */
int y0;
/** precision */
int prec;
/** image depth in bits */
int bpp;
/** signed (1) / unsigned (0) */
int sgnd;
} opj_image_cmptparm_t;
#ifdef __cplusplus
extern "C" {
#endif
/*
==========================================================
image functions definitions
==========================================================
*/
/**
Create an image
@param numcmpts number of components
@param cmptparms components parameters
@param clrspc image color space
@return returns a new image structure if successful, returns NULL otherwise
*/
opj_image_t *opj_image_create(int numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc);
/**
Deallocate any resources associated with an image
@param image image to be destroyed
*/
void opj_image_destroy(opj_image_t *image);
/*
==========================================================
stream functions definitions
==========================================================
*/
/**
Open and allocate a memory stream for read / write.
On reading, the user must provide a buffer containing encoded data. The buffer will be
wrapped by the returned CIO handle.
On writing, buffer parameters must be set to 0: a buffer will be allocated by the library
to contain encoded data.
@param cinfo Codec context info
@param buffer Reading: buffer address. Writing: NULL
@param length Reading: buffer length. Writing: 0
@return Returns a CIO handle if successful, returns NULL otherwise
*/
opj_cio_t* opj_cio_open(opj_common_ptr cinfo, unsigned char *buffer, int length);
/**
Close and free a CIO handle
@param cio CIO handle to free
*/
void opj_cio_close(opj_cio_t *cio);
/**
Get position in byte stream
@param cio CIO handle
@return Returns the position in bytes
*/
int cio_tell(opj_cio_t *cio);
/**
Set position in byte stream
@param cio CIO handle
@param pos Position, in number of bytes, from the beginning of the stream
*/
void cio_seek(opj_cio_t *cio, int pos);
/*
==========================================================
event manager functions definitions
==========================================================
*/
opj_event_mgr_t* opj_set_event_mgr(opj_common_ptr cinfo, opj_event_mgr_t *event_mgr, void *context);
/*
==========================================================
codec functions definitions
==========================================================
*/
/**
Creates a J2K/JPT/JP2 decompression structure
@param format Decoder to select
@return Returns a handle to a decompressor if successful, returns NULL otherwise
*/
opj_dinfo_t* opj_create_decompress(OPJ_CODEC_FORMAT format);
/**
Destroy a decompressor handle
@param dinfo decompressor handle to destroy
*/
void opj_destroy_decompress(opj_dinfo_t *dinfo);
/**
Set decoding parameters to default values
@param parameters Decompression parameters
*/
void opj_set_default_decoder_parameters(opj_dparameters_t *parameters);
/**
Setup the decoder decoding parameters using user parameters.
Decoding parameters are returned in j2k->cp.
@param dinfo decompressor handle
@param parameters decompression parameters
*/
void opj_setup_decoder(opj_dinfo_t *dinfo, opj_dparameters_t *parameters);
/**
Decode an image from a JPEG-2000 codestream
@param dinfo decompressor handle
@param cio Input buffer stream
@return Returns a decoded image if successful, returns NULL otherwise
*/
opj_image_t* opj_decode(opj_dinfo_t *dinfo, opj_cio_t *cio);
/**
Creates a J2K/JP2 compression structure
@param format Coder to select
@return Returns a handle to a compressor if successful, returns NULL otherwise
*/
opj_cinfo_t* opj_create_compress(OPJ_CODEC_FORMAT format);
/**
Destroy a compressor handle
@param cinfo compressor handle to destroy
*/
void opj_destroy_compress(opj_cinfo_t *cinfo);
/**
Set encoding parameters to default values, that means :
<ul>
<li>Lossless
<li>1 tile
<li>Size of precinct : 2^15 x 2^15 (means 1 precinct)
<li>Size of code-block : 64 x 64
<li>Number of resolutions: 6
<li>No SOP marker in the codestream
<li>No EPH marker in the codestream
<li>No sub-sampling in x or y direction
<li>No mode switch activated
<li>Progression order: LRCP
<li>No index file
<li>No ROI upshifted
<li>No offset of the origin of the image
<li>No offset of the origin of the tiles
<li>Reversible DWT 5-3
</ul>
@param parameters Compression parameters
*/
void opj_set_default_encoder_parameters(opj_cparameters_t *parameters);
/**
Setup the encoder parameters using the current image and using user parameters.
@param cinfo compressor handle
@param parameters compression parameters
@param image input filled image
*/
void opj_setup_encoder(opj_cinfo_t *cinfo, opj_cparameters_t *parameters, opj_image_t *image);
/**
Encode an image into a JPEG-2000 codestream
@param cinfo compressor handle
@param cio Output buffer stream
@param image Image to encode
@param index Name of the index file if required, NULL otherwise
@return Returns true if successful, returns false otherwise
*/
bool opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, char *index);
#ifdef __cplusplus
}
#endif
#endif /* OPENJPEG_H */

View File

@ -0,0 +1,82 @@
/*
* Copyright (c) 2005, Hervé Drolon, FreeImage Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef OPJ_INCLUDES_H
#define OPJ_INCLUDES_H
/*
==========================================================
Standard includes used by the library
==========================================================
*/
#include <setjmp.h>
#include <memory.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <float.h>
#include <time.h>
#include <stdio.h>
#include <stdarg.h>
/*
==========================================================
OpenJPEG interface
==========================================================
*/
#include "openjpeg.h"
/*
==========================================================
OpenJPEG modules
==========================================================
*/
#include "j2k_lib.h"
#include "event.h"
#include "cio.h"
#include "image.h"
#include "j2k.h"
#include "jp2.h"
#include "jpt.h"
#include "mqc.h"
#include "raw.h"
#include "bio.h"
#include "tgt.h"
#include "tcd.h"
#include "t1.h"
#include "dwt.h"
#include "pi.h"
#include "t2.h"
#include "mct.h"
#include "int.h"
#include "fix.h"
#endif /* OPJ_INCLUDES_H */

View File

@ -1,7 +1,9 @@
/* /*
* Copyright (c) 2001-2002, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2003-2004, Yannick Verschueren * Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2004, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -26,221 +28,94 @@
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "pi.h" #include "opj_includes.h"
#include "int.h"
#include <stdlib.h>
#include <stdio.h>
/* <summary> /*
* Create a packet iterator. ==========================================================
* </summary> */ local functions
pi_iterator_t *pi_create(j2k_image_t * img, j2k_cp_t * cp, int tileno) ==========================================================
{ */
int p, q, i;
int compno, resno, pino;
int maxres = 0;
pi_iterator_t *pi;
j2k_tcp_t *tcp;
j2k_tccp_t *tccp;
tcp = &cp->tcps[tileno];
pi = (pi_iterator_t *) malloc((tcp->numpocs + 1) *
sizeof(pi_iterator_t));
for (pino = 0; pino < tcp->numpocs + 1; pino++) { /* change */
p = tileno % cp->tw;
q = tileno / cp->tw;
pi[pino].tx0 = int_max(cp->tx0 + p * cp->tdx, img->x0);
pi[pino].ty0 = int_max(cp->ty0 + q * cp->tdy, img->y0);
pi[pino].tx1 = int_min(cp->tx0 + (p + 1) * cp->tdx, img->x1);
pi[pino].ty1 = int_min(cp->ty0 + (q + 1) * cp->tdy, img->y1);
pi[pino].numcomps = img->numcomps;
pi[pino].comps =
(pi_comp_t *) malloc(img->numcomps * sizeof(pi_comp_t));
for (compno = 0; compno < pi->numcomps; compno++) {
int tcx0, tcy0, tcx1, tcy1;
pi_comp_t *comp = &pi[pino].comps[compno];
tccp = &tcp->tccps[compno];
comp->dx = img->comps[compno].dx;
comp->dy = img->comps[compno].dy;
comp->numresolutions = tccp->numresolutions;
comp->resolutions =
(pi_resolution_t *) malloc(comp->numresolutions *
sizeof(pi_resolution_t));
tcx0 = int_ceildiv(pi->tx0, comp->dx);
tcy0 = int_ceildiv(pi->ty0, comp->dy);
tcx1 = int_ceildiv(pi->tx1, comp->dx);
tcy1 = int_ceildiv(pi->ty1, comp->dy);
if (comp->numresolutions > maxres) {
maxres = comp->numresolutions;
}
for (resno = 0; resno < comp->numresolutions; resno++) {
int levelno;
int rx0, ry0, rx1, ry1;
int px0, py0, px1, py1;
pi_resolution_t *res = &comp->resolutions[resno];
if (tccp->csty & J2K_CCP_CSTY_PRT) {
res->pdx = tccp->prcw[resno];
res->pdy = tccp->prch[resno];
} else {
res->pdx = 15;
res->pdy = 15;
}
levelno = comp->numresolutions - 1 - resno;
rx0 = int_ceildivpow2(tcx0, levelno);
ry0 = int_ceildivpow2(tcy0, levelno);
rx1 = int_ceildivpow2(tcx1, levelno);
ry1 = int_ceildivpow2(tcy1, levelno);
px0 = int_floordivpow2(rx0, res->pdx) << res->pdx;
py0 = int_floordivpow2(ry0, res->pdy) << res->pdy;
px1 = int_ceildivpow2(rx1, res->pdx) << res->pdx;
py1 = int_ceildivpow2(ry1, res->pdy) << res->pdy;
res->pw = (rx0==rx1)?0:((px1 - px0) >> res->pdx); /*Mod Antonin : sizebug1*/
res->ph = (ry0==ry1)?0:((py1 - py0) >> res->pdy); /*Mod Antonin : sizebug1*/
}
}
tccp = &tcp->tccps[0];
pi[pino].step_p = 1;
pi[pino].step_c = 100 * pi[pino].step_p;
pi[pino].step_r = img->numcomps * pi[pino].step_c;
pi[pino].step_l = maxres * pi[pino].step_r;
if (pino == 0) {
pi[pino].include =
(short int *) malloc(img->numcomps * maxres *
tcp->numlayers * 100 * sizeof(short int));
for (i = 0; i < img->numcomps * maxres * tcp->numlayers * 100; i++)
pi[pino].include[i] = 0;
}
/* pi[pino].include=(short int*)calloc(img->numcomps*maxres*tcp->numlayers*1000,sizeof(short int)); */
else
pi[pino].include = pi[pino - 1].include;
if (tcp->POC == 0) {
pi[pino].first = 1;
pi[pino].poc.resno0 = 0;
pi[pino].poc.compno0 = 0;
pi[pino].poc.layno1 = tcp->numlayers;
pi[pino].poc.resno1 = maxres;
pi[pino].poc.compno1 = img->numcomps;
pi[pino].poc.prg = tcp->prg;
} else {
pi[pino].first = 1;
pi[pino].poc.resno0 = tcp->pocs[pino].resno0;
pi[pino].poc.compno0 = tcp->pocs[pino].compno0;
pi[pino].poc.layno1 = tcp->pocs[pino].layno1;
pi[pino].poc.resno1 = tcp->pocs[pino].resno1;
pi[pino].poc.compno1 = tcp->pocs[pino].compno1;
pi[pino].poc.prg = tcp->pocs[pino].prg;
}
}
return pi;
}
/* <summary>
* Get next packet in layer-resolution-component-precinct order.
*
* pi: packet iterator to modify
* </summary> */
int pi_next_lrcp(pi_iterator_t * pi)
{
pi_comp_t *comp;
pi_resolution_t *res;
static bool pi_next_lrcp(opj_pi_iterator_t * pi) {
opj_pi_comp_t *comp = NULL;
opj_pi_resolution_t *res = NULL;
long index = 0;
if (!pi->first) { if (!pi->first) {
comp = &pi->comps[pi->compno]; comp = &pi->comps[pi->compno];
res = &comp->resolutions[pi->resno]; res = &comp->resolutions[pi->resno];
goto 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; for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
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;
if (!pi-> if (!pi->include[index]) {
include[pi->layno * pi->step_l + pi->include[index] = 1;
pi->resno * pi->step_r + return true;
pi->compno * pi->step_c + pi->precno * pi->step_p]) { }
pi->include[pi->layno * pi->step_l + LABEL_SKIP:;
pi->resno * pi->step_r + }
pi->compno * pi->step_c +
pi->precno * pi->step_p] = 1;
return 1;
}
skip:;
}
} }
} }
} }
return 0;
return false;
} }
/* <summary> static bool pi_next_rlcp(opj_pi_iterator_t * pi) {
* Get next packet in resolution-layer-component-precinct order. opj_pi_comp_t *comp = NULL;
* opj_pi_resolution_t *res = NULL;
* pi: packet iterator to modify long index = 0;
* </summary> */
int pi_next_rlcp(pi_iterator_t * pi)
{
pi_comp_t *comp;
pi_resolution_t *res;
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 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; for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
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;
if (!pi-> if (!pi->include[index]) {
include[pi->layno * pi->step_l + pi->include[index] = 1;
pi->resno * pi->step_r + return true;
pi->compno * pi->step_c + pi->precno * pi->step_p]) { }
pi->include[pi->layno * pi->step_l + LABEL_SKIP:;
pi->resno * pi->step_r + }
pi->compno * pi->step_c +
pi->precno * pi->step_p] = 1;
return 1;
}
skip:;
}
} }
} }
} }
return 0;
return false;
} }
/* <summary> static bool pi_next_rpcl(opj_pi_iterator_t * pi) {
* Get next packet in resolution-precinct-component-layer order. opj_pi_comp_t *comp = NULL;
* opj_pi_resolution_t *res = NULL;
* pi: packet iterator to modify long index = 0;
* </summary> */
int pi_next_rpcl(pi_iterator_t * pi)
{
pi_comp_t *comp;
pi_resolution_t *res;
if (!pi->first) { if (!pi->first) {
goto skip; goto LABEL_SKIP;
} else { } else {
int compno, resno; int compno, resno;
pi->first = 0; pi->first = 0;
@ -249,102 +124,77 @@ int pi_next_rpcl(pi_iterator_t * pi)
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 * dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno));
(1 << (res->pdx + comp->numresolutions - 1 - resno)); dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno));
dy = comp->dy * pi->dx = !pi->dx ? dx : int_min(pi->dx, dx);
(1 << (res->pdy + comp->numresolutions - 1 - resno)); pi->dy = !pi->dy ? dy : int_min(pi->dy, dy);
pi->dx = !pi->dx ? dx : int_min(pi->dx, dx);
pi->dy = !pi->dy ? dy : int_min(pi->dy, dy);
} }
} }
} }
for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) { for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) {
for (pi->y = pi->ty0; pi->y < pi->ty1; for (pi->y = pi->ty0; pi->y < pi->ty1; pi->y += pi->dy - (pi->y % pi->dy)) {
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; for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
pi->x += pi->dx - (pi->x % pi->dx)) { int levelno;
for (pi->compno = pi->poc.compno0; int trx0, try0;
pi->compno < pi->poc.compno1; pi->compno++) { int trx1, try1;
int levelno; int rpx, rpy;
int trx0, try0; int prci, prcj;
int trx1, try1;/* Add antonin pcrl*/ comp = &pi->comps[pi->compno];
int rpx, rpy; if (pi->resno >= comp->numresolutions) {
int prci, prcj; continue;
comp = &pi->comps[pi->compno]; }
if (pi->resno >= comp->numresolutions) { res = &comp->resolutions[pi->resno];
continue; levelno = comp->numresolutions - 1 - pi->resno;
} trx0 = int_ceildiv(pi->tx0, comp->dx << levelno);
res = &comp->resolutions[pi->resno]; try0 = int_ceildiv(pi->ty0, comp->dy << levelno);
levelno = comp->numresolutions - 1 - pi->resno; trx1 = int_ceildiv(pi->tx1, comp->dx << levelno);
trx0 = int_ceildiv(pi->tx0, comp->dx << levelno); try1 = int_ceildiv(pi->ty1, comp->dy << levelno);
try0 = int_ceildiv(pi->ty0, comp->dy << levelno); rpx = res->pdx + levelno;
trx1 = int_ceildiv(pi->tx1, comp->dx << levelno);/* Add antonin pcrl*/ rpy = res->pdy + levelno;
try1 = int_ceildiv(pi->ty1, comp->dy << levelno);/* Add antonin pcrl*/ if ((!(pi->x % (comp->dx << rpx) == 0) || (pi->x == pi->tx0 && (trx0 << levelno) % (1 << rpx)))) {
rpx = res->pdx + levelno; continue;
rpy = res->pdy + levelno; }
if (! if ((!(pi->y % (comp->dy << rpy) == 0) || (pi->y == pi->ty0 && (try0 << levelno) % (1 << rpx)))) {
(pi->x % (comp->dx << rpx) == 0 continue;
|| (pi->x == pi->tx0 && (trx0 << levelno) % (1 << rpx)))) { }
continue;
} if ((res->pw==0)||(res->pw==0)) continue;
if (!
(pi->y % (comp->dy << rpy) == 0 if ((trx0==trx1)||(try0==try1)) continue;
|| (pi->y == pi->ty0 && (try0 << levelno) % (1 << rpx)))) {
continue; prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx)
} - int_floordivpow2(trx0, res->pdx);
prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy)
/*Add Antonin : sizebug1*/ - int_floordivpow2(try0, res->pdy);
if ((res->pw==0)||(res->pw==0)) continue; pi->precno = prci + prcj * res->pw;
/*ddA*/ 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;
/*Add Antonin : pcrl*/ if (!pi->include[index]) {
if ((trx0==trx1)||(try0==try1)) continue; pi->include[index] = 1;
/*ddA*/ return true;
}
prci = LABEL_SKIP:;
int_floordivpow2(int_ceildiv }
(pi->x, comp->dx << levelno), }
res->pdx) - int_floordivpow2(trx0, res->pdx);
prcj =
int_floordivpow2(int_ceildiv
(pi->y, comp->dy << levelno),
res->pdy) - int_floordivpow2(try0, res->pdy);
pi->precno = prci + prcj * res->pw;
for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) {
if (!pi->
include[pi->layno * pi->step_l +
pi->resno * pi->step_r +
pi->compno * pi->step_c +
pi->precno * pi->step_p]) {
pi->include[pi->layno * pi->step_l +
pi->resno * pi->step_r +
pi->compno * pi->step_c +
pi->precno * pi->step_p] = 1;
return 1;
}
skip:;
}
}
} }
} }
} }
return 0;
return false;
} }
/* <summary> static bool pi_next_pcrl(opj_pi_iterator_t * pi) {
* Get next packet in precinct-component-resolution-layer order. opj_pi_comp_t *comp = NULL;
* opj_pi_resolution_t *res = NULL;
* pi: packet iterator to modify long index = 0;
* </summary> */
int pi_next_pcrl(pi_iterator_t * pi)
{
pi_comp_t *comp;
pi_resolution_t *res;
if (!pi->first) { if (!pi->first) {
comp = &pi->comps[pi->compno]; comp = &pi->comps[pi->compno];
goto skip; goto LABEL_SKIP;
} else { } else {
int compno, resno; int compno, resno;
pi->first = 0; pi->first = 0;
@ -353,106 +203,79 @@ int pi_next_pcrl(pi_iterator_t * pi)
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 * dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno));
(1 << (res->pdx + comp->numresolutions - 1 - resno)); dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno));
dy = comp->dy * pi->dx = !pi->dx ? dx : int_min(pi->dx, dx);
(1 << (res->pdy + comp->numresolutions - 1 - resno)); pi->dy = !pi->dy ? dy : int_min(pi->dy, dy);
pi->dx = !pi->dx ? dx : int_min(pi->dx, dx);
pi->dy = !pi->dy ? dy : int_min(pi->dy, dy);
} }
} }
} }
for (pi->y = pi->ty0; pi->y < pi->ty1;
pi->y += pi->dy - (pi->y % pi->dy)) {
for (pi->x = pi->tx0; pi->x < pi->tx1;
pi->x += pi->dx - (pi->x % pi->dx)) {
for (pi->compno = pi->poc.compno0;
pi->compno < pi->poc.compno1; pi->compno++) {
comp = &pi->comps[pi->compno];
for (pi->resno = pi->poc.resno0;
pi->resno < int_min(pi->poc.resno1,
comp->numresolutions); pi->resno++) {
int levelno;
int trx0, try0;
int trx1, try1;/* Add antonin pcrl*/
int rpx, rpy;
int prci, prcj;
res = &comp->resolutions[pi->resno];
levelno = comp->numresolutions - 1 - pi->resno;
trx0 = int_ceildiv(pi->tx0, comp->dx << levelno);
try0 = int_ceildiv(pi->ty0, comp->dy << levelno);
trx1 = int_ceildiv(pi->tx1, comp->dx << levelno);/* Add antonin pcrl*/
try1 = int_ceildiv(pi->ty1, comp->dy << levelno);/* Add antonin pcrl*/
rpx = res->pdx + levelno;
rpy = res->pdy + levelno;
if (!
(pi->x % (comp->dx << rpx) == 0
|| (pi->x == pi->tx0 && (trx0 << levelno) % (1 << rpx)))) {
continue;
}
if (!
(pi->y % (comp->dy << rpy) == 0
|| (pi->y == pi->ty0 && (try0 << levelno) % (1 << rpx)))) {
continue;
}
/*Add Antonin : sizebug1*/
if ((res->pw==0)||(res->pw==0)) continue;
/*ddA*/
/*Add Antonin : pcrl*/ for (pi->y = pi->ty0; pi->y < pi->ty1; pi->y += pi->dy - (pi->y % pi->dy)) {
if ((trx0==trx1)||(try0==try1)) continue; for (pi->x = pi->tx0; pi->x < pi->tx1; pi->x += pi->dx - (pi->x % pi->dx)) {
/*ddA*/ for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
comp = &pi->comps[pi->compno];
prci = for (pi->resno = pi->poc.resno0; pi->resno < int_min(pi->poc.resno1, comp->numresolutions); pi->resno++) {
int_floordivpow2(int_ceildiv int levelno;
(pi->x, comp->dx << levelno), int trx0, try0;
res->pdx) - int_floordivpow2(trx0, res->pdx); int trx1, try1;
prcj = int rpx, rpy;
int_floordivpow2(int_ceildiv int prci, prcj;
(pi->y, comp->dy << levelno), res = &comp->resolutions[pi->resno];
res->pdy) - int_floordivpow2(try0, res->pdy); levelno = comp->numresolutions - 1 - pi->resno;
pi->precno = prci + prcj * res->pw; trx0 = int_ceildiv(pi->tx0, comp->dx << levelno);
for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) { try0 = int_ceildiv(pi->ty0, comp->dy << levelno);
if (!pi-> trx1 = int_ceildiv(pi->tx1, comp->dx << levelno);
include[pi->layno * pi->step_l + try1 = int_ceildiv(pi->ty1, comp->dy << levelno);
pi->resno * pi->step_r + rpx = res->pdx + levelno;
pi->compno * pi->step_c + rpy = res->pdy + levelno;
pi->precno * pi->step_p]) { if ((!(pi->x % (comp->dx << rpx) == 0) || (pi->x == pi->tx0 && (trx0 << levelno) % (1 << rpx)))) {
pi->include[pi->layno * pi->step_l + continue;
pi->resno * pi->step_r + }
pi->compno * pi->step_c + if ((!(pi->y % (comp->dy << rpy) == 0) || (pi->y == pi->ty0 && (try0 << levelno) % (1 << rpx)))) {
pi->precno * pi->step_p] = 1; continue;
return 1; }
}
skip:; if ((res->pw==0)||(res->pw==0)) continue;
}
} if ((trx0==trx1)||(try0==try1)) continue;
prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx)
- int_floordivpow2(trx0, res->pdx);
prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy)
- int_floordivpow2(try0, res->pdy);
pi->precno = prci + prcj * res->pw;
for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) {
index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
if (!pi->include[index]) {
pi->include[index] = 1;
return true;
}
LABEL_SKIP:;
}
}
} }
} }
} }
return 0;
return false;
} }
/* <summary> static bool pi_next_cprl(opj_pi_iterator_t * pi) {
* Get next packet in component-precinct-resolution-layer order. opj_pi_comp_t *comp = NULL;
* opj_pi_resolution_t *res = NULL;
* pi: packet iterator to modify long index = 0;
* </summary> */
int pi_next_cprl(pi_iterator_t * pi)
{
pi_comp_t *comp;
pi_resolution_t *res;
if (!pi->first) { if (!pi->first) {
comp = &pi->comps[pi->compno]; comp = &pi->comps[pi->compno];
goto 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;
@ -465,93 +288,224 @@ int pi_next_cprl(pi_iterator_t * pi)
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; for (pi->y = pi->ty0; pi->y < pi->ty1; pi->y += pi->dy - (pi->y % pi->dy)) {
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; for (pi->resno = pi->poc.resno0; pi->resno < int_min(pi->poc.resno1, comp->numresolutions); pi->resno++) {
pi->x += pi->dx - (pi->x % pi->dx)) { int levelno;
for (pi->resno = pi->poc.resno0; int trx0, try0;
pi->resno < int_min(pi->poc.resno1, int trx1, try1;
comp->numresolutions); pi->resno++) { int rpx, rpy;
int levelno; int prci, prcj;
int trx0, try0; res = &comp->resolutions[pi->resno];
int trx1, try1;/* Add antonin pcrl*/ levelno = comp->numresolutions - 1 - pi->resno;
int rpx, rpy; trx0 = int_ceildiv(pi->tx0, comp->dx << levelno);
int prci, prcj; try0 = int_ceildiv(pi->ty0, comp->dy << levelno);
res = &comp->resolutions[pi->resno]; trx1 = int_ceildiv(pi->tx1, comp->dx << levelno);
levelno = comp->numresolutions - 1 - pi->resno; try1 = int_ceildiv(pi->ty1, comp->dy << levelno);
trx0 = int_ceildiv(pi->tx0, comp->dx << levelno); rpx = res->pdx + levelno;
try0 = int_ceildiv(pi->ty0, comp->dy << levelno); rpy = res->pdy + levelno;
trx1 = int_ceildiv(pi->tx1, comp->dx << levelno);/* Add antonin pcrl*/ if ((!(pi->x % (comp->dx << rpx) == 0) || (pi->x == pi->tx0 && (trx0 << levelno) % (1 << rpx)))) {
try1 = int_ceildiv(pi->ty1, comp->dy << levelno);/* Add antonin pcrl*/ continue;
rpx = res->pdx + levelno; }
rpy = res->pdy + levelno; if ((!(pi->y % (comp->dy << rpy) == 0) || (pi->y == pi->ty0 && (try0 << levelno) % (1 << rpx)))) {
if (! continue;
(pi->x % (comp->dx << rpx) == 0 }
|| (pi->x == pi->tx0 && (trx0 << levelno) % (1 << rpx)))) {
continue; if ((res->pw==0)||(res->pw==0)) continue;
}
if (! if ((trx0==trx1)||(try0==try1)) continue;
(pi->y % (comp->dy << rpy) == 0
|| (pi->y == pi->ty0 && (try0 << levelno) % (1 << rpx)))) { prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx)
continue; - int_floordivpow2(trx0, res->pdx);
} prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy)
- int_floordivpow2(try0, res->pdy);
/*Add Antonin : sizebug1*/ pi->precno = prci + prcj * res->pw;
if ((res->pw==0)||(res->pw==0)) continue; for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) {
/*ddA*/ 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]) {
/*Add Antonin : pcrl*/ pi->include[index] = 1;
if ((trx0==trx1)||(try0==try1)) continue; return true;
/*ddA*/ }
LABEL_SKIP:;
prci = }
int_floordivpow2(int_ceildiv }
(pi->x, comp->dx << levelno),
res->pdx) - int_floordivpow2(trx0, res->pdx);
prcj =
int_floordivpow2(int_ceildiv
(pi->y, comp->dy << levelno),
res->pdy) - int_floordivpow2(try0, res->pdy);
pi->precno = prci + prcj * res->pw;
for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) {
if (!pi->
include[pi->layno * pi->step_l +
pi->resno * pi->step_r +
pi->compno * pi->step_c +
pi->precno * pi->step_p]) {
pi->include[pi->layno * pi->step_l +
pi->resno * pi->step_r +
pi->compno * pi->step_c +
pi->precno * pi->step_p] = 1;
return 1;
}
skip:;
}
}
} }
} }
} }
return 0;
return false;
} }
/* <summary> /*
* Get next packet. ==========================================================
* Packet iterator interface
* pi: packet iterator to modify ==========================================================
* </summary> */ */
int pi_next(pi_iterator_t * pi)
{ opj_pi_iterator_t *pi_create(opj_image_t *image, opj_cp_t *cp, int tileno) {
switch (pi->poc.prg) { int p, q;
case 0: int compno, resno, pino;
return pi_next_lrcp(pi); int maxres = 0;
case 1: opj_pi_iterator_t *pi = NULL;
return pi_next_rlcp(pi); opj_tcp_t *tcp = NULL;
case 2: opj_tccp_t *tccp = NULL;
return pi_next_rpcl(pi); size_t array_size;
case 3:
return pi_next_pcrl(pi); tcp = &cp->tcps[tileno];
case 4:
return pi_next_cprl(pi); array_size = (tcp->numpocs + 1) * sizeof(opj_pi_iterator_t);
pi = (opj_pi_iterator_t *) opj_malloc(array_size);
if(!pi) {
/* TODO: throw an error */
return NULL;
} }
return 0;
for (pino = 0; pino < tcp->numpocs + 1; pino++) { /* change */
p = tileno % cp->tw;
q = tileno / cp->tw;
pi[pino].tx0 = int_max(cp->tx0 + p * cp->tdx, image->x0);
pi[pino].ty0 = int_max(cp->ty0 + q * cp->tdy, image->y0);
pi[pino].tx1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1);
pi[pino].ty1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1);
pi[pino].numcomps = image->numcomps;
array_size = image->numcomps * sizeof(opj_pi_comp_t);
pi[pino].comps = (opj_pi_comp_t *) opj_malloc(array_size);
if(!pi[pino].comps) {
/* TODO: throw an error */
pi_destroy(pi, cp, tileno);
return NULL;
}
memset(pi[pino].comps, 0, array_size);
for (compno = 0; compno < pi->numcomps; compno++) {
int tcx0, tcy0, tcx1, tcy1;
opj_pi_comp_t *comp = &pi[pino].comps[compno];
tccp = &tcp->tccps[compno];
comp->dx = image->comps[compno].dx;
comp->dy = image->comps[compno].dy;
comp->numresolutions = tccp->numresolutions;
array_size = comp->numresolutions * sizeof(opj_pi_resolution_t);
comp->resolutions = (opj_pi_resolution_t *) opj_malloc(array_size);
if(!comp->resolutions) {
/* TODO: throw an error */
pi_destroy(pi, cp, tileno);
return NULL;
}
tcx0 = int_ceildiv(pi->tx0, comp->dx);
tcy0 = int_ceildiv(pi->ty0, comp->dy);
tcx1 = int_ceildiv(pi->tx1, comp->dx);
tcy1 = int_ceildiv(pi->ty1, comp->dy);
if (comp->numresolutions > maxres) {
maxres = comp->numresolutions;
}
for (resno = 0; resno < comp->numresolutions; resno++) {
int levelno;
int rx0, ry0, rx1, ry1;
int px0, py0, px1, py1;
opj_pi_resolution_t *res = &comp->resolutions[resno];
if (tccp->csty & J2K_CCP_CSTY_PRT) {
res->pdx = tccp->prcw[resno];
res->pdy = tccp->prch[resno];
} else {
res->pdx = 15;
res->pdy = 15;
}
levelno = comp->numresolutions - 1 - resno;
rx0 = int_ceildivpow2(tcx0, levelno);
ry0 = int_ceildivpow2(tcy0, levelno);
rx1 = int_ceildivpow2(tcx1, levelno);
ry1 = int_ceildivpow2(tcy1, levelno);
px0 = int_floordivpow2(rx0, res->pdx) << res->pdx;
py0 = int_floordivpow2(ry0, res->pdy) << res->pdy;
px1 = int_ceildivpow2(rx1, res->pdx) << res->pdx;
py1 = int_ceildivpow2(ry1, res->pdy) << res->pdy;
res->pw = (rx0==rx1)?0:((px1 - px0) >> res->pdx);
res->ph = (ry0==ry1)?0:((py1 - py0) >> res->pdy);
}
}
tccp = &tcp->tccps[0];
pi[pino].step_p = 1;
pi[pino].step_c = 100 * pi[pino].step_p;
pi[pino].step_r = image->numcomps * pi[pino].step_c;
pi[pino].step_l = maxres * pi[pino].step_r;
if (pino == 0) {
array_size = image->numcomps * maxres * tcp->numlayers * 100 * sizeof(short int);
pi[pino].include = (short int *) opj_malloc(array_size);
if(!pi[pino].include) {
/* TODO: throw an error */
pi_destroy(pi, cp, tileno);
return NULL;
}
}
else {
pi[pino].include = pi[pino - 1].include;
}
if (tcp->POC == 0) {
pi[pino].first = 1;
pi[pino].poc.resno0 = 0;
pi[pino].poc.compno0 = 0;
pi[pino].poc.layno1 = tcp->numlayers;
pi[pino].poc.resno1 = maxres;
pi[pino].poc.compno1 = image->numcomps;
pi[pino].poc.prg = tcp->prg;
} else {
pi[pino].first = 1;
pi[pino].poc.resno0 = tcp->pocs[pino].resno0;
pi[pino].poc.compno0 = tcp->pocs[pino].compno0;
pi[pino].poc.layno1 = tcp->pocs[pino].layno1;
pi[pino].poc.resno1 = tcp->pocs[pino].resno1;
pi[pino].poc.compno1 = tcp->pocs[pino].compno1;
pi[pino].poc.prg = tcp->pocs[pino].prg;
}
}
return pi;
} }
void pi_destroy(opj_pi_iterator_t *pi, opj_cp_t *cp, int tileno) {
int compno, pino;
opj_tcp_t *tcp = &cp->tcps[tileno];
if(pi) {
for (pino = 0; pino < tcp->numpocs + 1; pino++) {
if(pi[pino].comps) {
for (compno = 0; compno < pi->numcomps; compno++) {
opj_pi_comp_t *comp = &pi[pino].comps[compno];
if(comp->resolutions) {
opj_free(comp->resolutions);
}
}
opj_free(pi[pino].comps);
}
}
if(pi->include) {
opj_free(pi->include);
}
opj_free(pi);
}
}
bool pi_next(opj_pi_iterator_t * pi) {
switch (pi->poc.prg) {
case LRCP:
return pi_next_lrcp(pi);
case RLCP:
return pi_next_rlcp(pi);
case RPCL:
return pi_next_rpcl(pi);
case PCRL:
return pi_next_pcrl(pi);
case CPRL:
return pi_next_cprl(pi);
}
return false;
}

View File

@ -1,5 +1,9 @@
/* /*
* Copyright (c) 2001-2002, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -26,47 +30,137 @@
#ifndef __PI_H #ifndef __PI_H
#define __PI_H #define __PI_H
/**
@file pi.h
@brief Implementation of a packet iterator (PI)
#include "j2k.h" The functions in PI.C have for goal to realize a packet iterator that permits to get the next
#include "tcd.h" packet following the progression order and change of it. The functions in PI.C are used
by some function in T2.C.
*/
typedef struct { /** @defgroup PI PI - Implementation of a packet iterator */
/*@{*/
/**
FIXME: documentation
*/
typedef struct opj_pi_resolution {
int pdx, pdy; int pdx, pdy;
int pw, ph; int pw, ph;
} pi_resolution_t; } opj_pi_resolution_t;
typedef struct { /**
FIXME: documentation
*/
typedef struct opj_pi_comp {
int dx, dy; int dx, dy;
/** number of resolution levels */
int numresolutions; int numresolutions;
pi_resolution_t *resolutions; opj_pi_resolution_t *resolutions;
} pi_comp_t; } opj_pi_comp_t;
typedef struct { /**
short int *include; /* precise if the packet has been already used (usefull for progression order change) */ Packet iterator
int step_l, step_r, step_c, step_p; /* different steps (layer, resolution, component, precinct) to localize the packet in the include vector */ */
int compno, resno, precno, layno; /* component, resolution, precinct and layer that indentify the packet */ typedef struct opj_pi_iterator {
int first; /* 0 if the first packet */ /** precise if the packet has been already used (usefull for progression order change) */
j2k_poc_t poc; short int *include;
/** layer step used to localize the packet in the include vector */
int step_l;
/** resolution step used to localize the packet in the include vector */
int step_r;
/** component step used to localize the packet in the include vector */
int step_c;
/** precinct step used to localize the packet in the include vector */
int step_p;
/** component that identify the packet */
int compno;
/** resolution that identify the packet */
int resno;
/** precinct that identify the packet */
int precno;
/** layer that identify the packet */
int layno;
/** 0 if the first packet */
int first;
/** progression order change information */
opj_poc_t poc;
/** */
int numcomps; int numcomps;
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;
} pi_iterator_t; /* packet iterator */ } opj_pi_iterator_t;
/* /** @name Local static functions */
* Create a packet iterator /*@{*/
* img: raw image for which the packets will be listed /* ----------------------------------------------------------------------- */
* cp: coding paremeters /**
* tileno: number that identifies the tile for which to list the packets Get next packet in layer-resolution-component-precinct order.
* return value: returns a packet iterator that points to the first packet of the tile @param pi packet iterator to modify
*/ @return returns false if pi pointed to the last packet or else returns true
pi_iterator_t *pi_create(j2k_image_t * img, j2k_cp_t * cp, int tileno); */
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 */
* Modify the packet iterator to point to the next packet /*@{*/
* pi: packet iterator to modify /* ----------------------------------------------------------------------- */
* return value: returns 0 if pi pointed to the last packet or else returns 1 /**
*/ Create a packet iterator
int pi_next(pi_iterator_t * pi); @param image Raw image for which the packets will be listed
@param cp Coding parameters
@param tileno Number that identifies the tile for which to list the packets
@return Returns a packet iterator that points to the first packet of the tile
@see pi_destroy
*/
opj_pi_iterator_t *pi_create(opj_image_t * image, opj_cp_t * cp, int tileno);
#endif /**
Destroy a packet iterator
@param pi Previously created packet iterator
@param cp Coding parameters
@param tileno Number that identifies the tile for which the packets were listed
@see pi_create
*/
void pi_destroy(opj_pi_iterator_t *pi, opj_cp_t *cp, int tileno);
/**
Modify the packet iterator to point to the next packet
@param pi Packet iterator to modify
@return Returns false if pi pointed to the last packet or else returns true
*/
bool pi_next(opj_pi_iterator_t * pi);
/* ----------------------------------------------------------------------- */
/*@}*/
/*@}*/
#endif /* __PI_H */

View File

@ -1,5 +1,7 @@
/* /*
* Copyright (c) 2002-2003, Antonin Descampe * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -24,58 +26,61 @@
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "raw.h" #include "opj_includes.h"
/*
==========================================================
local functions
==========================================================
*/
unsigned char raw_c; /* temporary buffer where bits are coded or decoded */ /*
unsigned int raw_ct; /* number of bits already read or free to write */ ==========================================================
unsigned int raw_lenmax; /* maximum length to decode */ RAW encoding interface
unsigned int raw_len; /* length decoded */ ==========================================================
unsigned char *raw_bp; /* pointer to the current position in the buffer */ */
unsigned char *raw_start; /* pointer to the start of the buffer */
unsigned char *raw_end; /* pointer to the end of the buffer */
/* opj_raw_t* raw_create() {
* Return the number of bytes already encoded. opj_raw_t *raw = (opj_raw_t*)opj_malloc(sizeof(opj_raw_t));
*/ return raw;
int raw_numbytes()
{
return raw_bp - raw_start;
} }
/* void raw_destroy(opj_raw_t *raw) {
* Initialize raw-decoder. if(raw) {
* opj_free(raw);
* bp : pointer to the start of the buffer from which the bytes will be read }
* len : length of the input buffer
*/
void raw_init_dec(unsigned char *bp, int len)
{
raw_start = bp;
raw_lenmax = len;
raw_len = 0;
raw_c = 0;
raw_ct = 0;
} }
/* int raw_numbytes(opj_raw_t *raw) {
* Decode a symbol using raw-decoder. Cfr p.506 TAUBMAN return raw->bp - raw->start;
*/ }
int raw_decode()
{ void raw_init_dec(opj_raw_t *raw, unsigned char *bp, int len) {
raw->start = bp;
raw->lenmax = len;
raw->len = 0;
raw->c = 0;
raw->ct = 0;
}
int raw_decode(opj_raw_t *raw) {
int d; 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_len++; raw->c = *(raw->start + 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,7 @@
/* /*
* Copyright (c) 2002-2003, Antonin Descampe * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2002-2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2005, HervŽ Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -27,22 +28,72 @@
#ifndef __RAW_H #ifndef __RAW_H
#define __RAW_H #define __RAW_H
/**
@file raw.h
@brief Implementation of operations for raw encoding (RAW)
/* The functions in RAW.C have for goal to realize the operation of raw encoding linked
* Return the number of bytes written/read since initialisation with the corresponding mode switch.
*/ */
int raw_numbytes();
/* /** @defgroup RAW RAW - Implementation of operations for raw encoding */
* Initialize the decoder /*@{*/
* bp: pointer to the start of the buffer from which the bytes will be read
* len: length of the input buffer
*/
void raw_init_dec(unsigned char *bp, int len);
/* /**
* Decode a bit (returns 0 or 1) RAW encoding operations
*/ */
int raw_decode(); typedef struct opj_raw {
/** temporary buffer where bits are coded or decoded */
unsigned char c;
/** number of bits already read or free to write */
unsigned int ct;
/** maximum length to decode */
unsigned int lenmax;
/** length decoded */
unsigned int len;
/** pointer to the current position in the buffer */
unsigned char *bp;
/** pointer to the start of the buffer */
unsigned char *start;
/** pointer to the end of the buffer */
unsigned char *end;
} opj_raw_t;
#endif /** @name Exported functions */
/*@{*/
/* ----------------------------------------------------------------------- */
/**
Create a new RAW handle
@return Returns a new RAW handle if successful, returns NULL otherwise
*/
opj_raw_t* raw_create();
/**
Destroy a previously created RAW handle
@param raw RAW handle to destroy
*/
void raw_destroy(opj_raw_t *raw);
/**
Return the number of bytes written/read since initialisation
@param raw RAW handle to destroy
@return Returns the number of bytes already encoded
*/
int raw_numbytes(opj_raw_t *raw);
/**
Initialize the decoder
@param raw RAW handle
@param bp Pointer to the start of the buffer from which the bytes will be read
@param len Length of the input buffer
*/
void raw_init_dec(opj_raw_t *raw, unsigned char *bp, int len);
/**
Decode a symbol using raw-decoder. Cfr p.506 TAUBMAN
@param raw RAW handle
@return Returns the decoded symbol (0 or 1)
*/
int raw_decode(opj_raw_t *raw);
/* ----------------------------------------------------------------------- */
/*@}*/
/*@}*/
#endif /* __RAW_H */

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,9 @@
/* /*
* Copyright (c) 2001-2002, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -26,27 +30,217 @@
#ifndef __T1_H #ifndef __T1_H
#define __T1_H #define __T1_H
/**
@file t1.h
@brief Implementation of the tier-1 coding (coding of code-block coefficients) (T1)
#include "tcd.h" The functions in T1.C have for goal to realize the tier-1 coding operation. The functions
#include "j2k.h" in T1.C are used by some function in TCD.C.
*/
/* /** @defgroup T1 T1 - Implementation of the tier-1 coding */
* Initialize the look-up tables of the Tier-1 coder/decoder /*@{*/
*/
void t1_init_luts();
/* /* ----------------------------------------------------------------------- */
* Encode the code-blocks of a tile #define T1_NMSEDEC_BITS 7
* tile: the tile to encode
* tcp: tile coding parameters
*/
void t1_encode_cblks(tcd_tile_t * tile, j2k_tcp_t * tcp);
/* #define T1_MAXCBLKW 1024 /**< Maximum size of code-block (width) */
* Decode the code-blocks of a tile #define T1_MAXCBLKH 1024 /**< Maximum size of code-block (heigth) */
* tile: the tile to encode
* tcp: tile coding parameters
*/
void t1_decode_cblks(tcd_tile_t * tile, j2k_tcp_t * tcp);
#endif #define T1_SIG_NE 0x0001 /**< Context orientation : North-East direction */
#define T1_SIG_SE 0x0002 /**< Context orientation : South-East direction */
#define T1_SIG_SW 0x0004 /**< Context orientation : South-West direction */
#define T1_SIG_NW 0x0008 /**< Context orientation : North-West direction */
#define T1_SIG_N 0x0010 /**< Context orientation : North direction */
#define T1_SIG_E 0x0020 /**< Context orientation : East direction */
#define T1_SIG_S 0x0040 /**< Context orientation : South direction */
#define T1_SIG_W 0x0080 /**< Context orientation : West direction */
#define T1_SIG_OTH (T1_SIG_N|T1_SIG_NE|T1_SIG_E|T1_SIG_SE|T1_SIG_S|T1_SIG_SW|T1_SIG_W|T1_SIG_NW)
#define T1_SIG_PRIM (T1_SIG_N|T1_SIG_E|T1_SIG_S|T1_SIG_W)
#define T1_SGN_N 0x0100
#define T1_SGN_E 0x0200
#define T1_SGN_S 0x0400
#define T1_SGN_W 0x0800
#define T1_SGN (T1_SGN_N|T1_SGN_E|T1_SGN_S|T1_SGN_W)
#define T1_SIG 0x1000
#define T1_REFINE 0x2000
#define T1_VISIT 0x4000
#define T1_NUMCTXS_AGG 1
#define T1_NUMCTXS_ZC 9
#define T1_NUMCTXS_MAG 3
#define T1_NUMCTXS_SC 5
#define T1_NUMCTXS_UNI 1
#define T1_CTXNO_AGG 0
#define T1_CTXNO_ZC (T1_CTXNO_AGG+T1_NUMCTXS_AGG)
#define T1_CTXNO_MAG (T1_CTXNO_ZC+T1_NUMCTXS_ZC)
#define T1_CTXNO_SC (T1_CTXNO_MAG+T1_NUMCTXS_MAG)
#define T1_CTXNO_UNI (T1_CTXNO_SC+T1_NUMCTXS_SC)
#define T1_NUMCTXS (T1_CTXNO_UNI+T1_NUMCTXS_UNI)
#define T1_NMSEDEC_FRACBITS (T1_NMSEDEC_BITS-1)
#define T1_TYPE_MQ 0 /**< Normal coding using entropy coder */
#define T1_TYPE_RAW 1 /**< No encoding the information is store under raw format in codestream (mode switch RAW)*/
/* ----------------------------------------------------------------------- */
/**
Tier-1 coding (coding of code-block coefficients)
*/
typedef struct opj_t1 {
/** codec context */
opj_common_ptr cinfo;
/** MQC component */
opj_mqc_t *mqc;
/** RAW component */
opj_raw_t *raw;
int lut_ctxno_zc[1024];
int lut_ctxno_sc[256];
int lut_ctxno_mag[4096];
int lut_spb[256];
int lut_nmsedec_sig[1 << T1_NMSEDEC_BITS];
int lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS];
int lut_nmsedec_ref[1 << T1_NMSEDEC_BITS];
int lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS];
int data[T1_MAXCBLKH][T1_MAXCBLKW];
int flags[T1_MAXCBLKH + 2][T1_MAXCBLKH + 2];
} 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 */
/*@{*/
/* ----------------------------------------------------------------------- */
/**
Create a new T1 handle
and initialize the look-up tables of the Tier-1 coder/decoder
@return Returns a new T1 handle if successful, returns NULL otherwise
@see t1_init_luts
*/
opj_t1_t* t1_create(opj_common_ptr cinfo);
/**
Destroy a previously created T1 handle
@param t1 T1 handle to destroy
*/
void t1_destroy(opj_t1_t *t1);
/**
Encode the code-blocks of a tile
@param t1 T1 handle
@param tile The tile to encode
@param tcp Tile coding parameters
*/
void t1_encode_cblks(opj_t1_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp);
/**
Decode the code-blocks of a tile
@param t1 T1 handle
@param tile The tile to decode
@param tcp Tile coding parameters
*/
void t1_decode_cblks(opj_t1_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp);
/* ----------------------------------------------------------------------- */
/*@}*/
/*@}*/
#endif /* __T1_H */

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,9 @@
/* /*
* Copyright (c) 2001-2002, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2002-2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -28,37 +30,118 @@
#ifndef __T2_H #ifndef __T2_H
#define __T2_H #define __T2_H
/**
@file t2.h
@brief Implementation of a tier-2 coding (packetization of code-block data) (T2)
#include "tcd.h" */
#include "j2k.h"
/* /** @defgroup T2 T2 - Implementation of a tier-2 coding */
* Encode the packets of a tile to a destination buffer /*@{*/
*
* img : the source image /**
* cp : the image coding parameters Tier-2 coding
* tileno : number of the tile encoded */
* tile : the tile for which to write the packets typedef struct opj_t2 {
* maxlayers : maximum number of layers /** codec context */
* dest : the destination buffer opj_common_ptr cinfo;
* len : the length of the destination buffer
* info_IM : structure to create an index file /** Encoding: pointer to the src image. Decoding: pointer to the dst image. */
opj_image_t *image;
/** pointer to the image coding parameters */
opj_cp_t *cp;
} opj_t2_t;
/** @name 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 */
/*@{*/
/* ----------------------------------------------------------------------- */
/**
Encode the packets of a tile to a destination buffer
@param t2 T2 handle
@param tileno number of the tile encoded
@param tile the tile for which to write the packets
@param maxlayers maximum number of layers
@param dest the destination buffer
@param len the length of the destination buffer
@param image_info structure to create an index file
*/
int t2_encode_packets(opj_t2_t* t2, int tileno, opj_tcd_tile_t *tile, int maxlayers, unsigned char *dest, int len, opj_image_info_t *image_info);
/**
Decode the packets of a tile from a source buffer
@param t2 T2 handle
@param src the source buffer
@param len length of the source buffer
@param tileno number that identifies the tile for which to decode the packets
@param tile tile for which to decode the packets
*/ */
int t2_encode_packets(j2k_image_t * img, j2k_cp_t * cp, int tileno, int t2_decode_packets(opj_t2_t *t2, unsigned char *src, int len, int tileno, opj_tcd_tile_t *tile);
tcd_tile_t * tile, int maxlayers,
unsigned char *dest, int len, info_image * info_IM);
/* /**
* Decode the packets of a tile from a source buffer Create a T2 handle
* @param cinfo Codec context info
* src: the source buffer @param image Source or destination image
* len: length of the source buffer @param cp Image coding parameters
* img: destination image @return Returns a new T2 handle if successful, returns NULL otherwise
* cp: image coding parameters */
* tileno: number that identifies the tile for which to decode the packets opj_t2_t* t2_create(opj_common_ptr cinfo, opj_image_t *image, opj_cp_t *cp);
* tile: tile for which to decode the packets /**
*/ Destroy a T2 handle
int t2_decode_packets(unsigned char *src, int len, j2k_image_t * img, @param t2 T2 handle to destroy
j2k_cp_t * cp, int tileno, tcd_tile_t * tile); */
void t2_destroy(opj_t2_t *t2);
#endif /* ----------------------------------------------------------------------- */
/*@}*/
/*@}*/
#endif /* __T2_H */

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,9 @@
/* /*
* Copyright (c) 2001-2002, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren * Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2002-2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -28,156 +30,238 @@
#ifndef __TCD_H #ifndef __TCD_H
#define __TCD_H #define __TCD_H
/**
@file tcd.h
@brief Implementation of a tile coder/decoder (TCD)
#include "j2k.h" The functions in TCD.C have for goal to encode or decode each tile independently from
#include "tgt.h" each other. The functions in TCD.C are used by some function in J2K.C.
*/
typedef struct { /** @defgroup TCD TCD - Implementation of a tile coder/decoder */
/*@{*/
/**
FIXME: documentation
*/
typedef struct opj_tcd_seg {
int numpasses; int numpasses;
int len; int len;
unsigned char *data; unsigned char *data;
int maxpasses; int maxpasses;
int numnewpasses; int numnewpasses;
int newlen; int newlen;
} tcd_seg_t; } opj_tcd_seg_t;
typedef struct { /**
FIXME: documentation
*/
typedef struct opj_tcd_pass {
int rate; int rate;
double distortiondec; double distortiondec;
int term, len; int term, len;
} tcd_pass_t; } opj_tcd_pass_t;
typedef struct { /**
int numpasses; /* Number of passes in the layer */ FIXME: documentation
int len; /* len of information */ */
double disto; /* add for index (Cfr. Marcela) */ typedef struct opj_tcd_layer {
unsigned char *data; /* data */ int numpasses; /* Number of passes in the layer */
} tcd_layer_t; int len; /* len of information */
double disto; /* add for index (Cfr. Marcela) */
unsigned char *data; /* data */
} opj_tcd_layer_t;
typedef struct { /**
int x0, y0, x1, y1; /* dimension of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */ FIXME: documentation
*/
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 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 */
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 */
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 */
tcd_pass_t passes[100]; /* information about the passes */ opj_tcd_pass_t passes[100]; /* information about the passes */
} tcd_cblk_t; } opj_tcd_cblk_t;
typedef struct { /**
int x0, y0, x1, y1; /* dimension of the precinct : left upper corner (x0, y0) right low corner (x1,y1) */ FIXME: documentation
int cw, ch; /* number of precinct in width and heigth */ */
tcd_cblk_t *cblks; /* code-blocks informations */ typedef struct opj_tcd_precinct {
tgt_tree_t *incltree; /* inclusion tree */ int x0, y0, x1, y1; /* dimension of the precinct : left upper corner (x0, y0) right low corner (x1,y1) */
tgt_tree_t *imsbtree; /* IMSB tree */ int cw, ch; /* number of precinct in width and heigth */
} tcd_precinct_t; opj_tcd_cblk_t *cblks; /* code-blocks informations */
opj_tgt_tree_t *incltree; /* inclusion tree */
opj_tgt_tree_t *imsbtree; /* IMSB tree */
} opj_tcd_precinct_t;
typedef struct { /**
int x0, y0, x1, y1; /* dimension of the subband : left upper corner (x0, y0) right low corner (x1,y1) */ FIXME: documentation
*/
typedef struct opj_tcd_band {
int x0, y0, x1, y1; /* dimension of the subband : left upper corner (x0, y0) right low corner (x1,y1) */
int bandno; int bandno;
tcd_precinct_t *precincts; /* precinct information */ opj_tcd_precinct_t *precincts; /* precinct information */
int numbps; int numbps;
float stepsize; float stepsize;
} tcd_band_t; } opj_tcd_band_t;
typedef struct { /**
int x0, y0, x1, y1; /* dimension of the resolution level : left upper corner (x0, y0) right low corner (x1,y1) */ FIXME: documentation
*/
typedef struct opj_tcd_resolution {
int x0, y0, x1, y1; /* dimension of the resolution level : left upper corner (x0, y0) right low corner (x1,y1) */
int pw, ph; int pw, ph;
int numbands; /* number sub-band for the resolution level */ int numbands; /* number sub-band for the resolution level */
tcd_band_t bands[3]; /* subband information */ opj_tcd_band_t bands[3]; /* subband information */
} tcd_resolution_t; } opj_tcd_resolution_t;
typedef struct { /**
int x0, y0, x1, y1; /* dimension of component : left upper corner (x0, y0) right low corner (x1,y1) */ FIXME: documentation
int numresolutions; /* number of resolutions level */ */
tcd_resolution_t *resolutions; /* resolutions information */ typedef struct opj_tcd_tilecomp {
int *data; /* data of the component */ int x0, y0, x1, y1; /* dimension of component : left upper corner (x0, y0) right low corner (x1,y1) */
int nbpix; /* add fixed_quality */ int numresolutions; /* number of resolutions level */
} tcd_tilecomp_t; opj_tcd_resolution_t *resolutions; /* resolutions information */
int *data; /* data of the component */
int nbpix; /* add fixed_quality */
} opj_tcd_tilecomp_t;
typedef struct { /**
int x0, y0, x1, y1; /* dimension of the tile : left upper corner (x0, y0) right low corner (x1,y1) */ FIXME: documentation
int numcomps; /* number of components in tile */ */
tcd_tilecomp_t *comps; /* Components information */ typedef struct opj_tcd_tile {
int nbpix; /* add fixed_quality */ int x0, y0, x1, y1; /* dimension of the tile : left upper corner (x0, y0) right low corner (x1,y1) */
double distotile; /* add fixed_quality */ int numcomps; /* number of components in tile */
double distolayer[100]; /* add fixed_quality */ opj_tcd_tilecomp_t *comps; /* Components information */
} tcd_tile_t; int nbpix; /* add fixed_quality */
double distotile; /* add fixed_quality */
double distolayer[100]; /* add fixed_quality */
} opj_tcd_tile_t;
typedef struct { /**
int tw, th; /* number of tiles in width and heigth */ FIXME: documentation
tcd_tile_t *tiles; /* Tiles information */ */
} tcd_image_t; typedef struct opj_tcd_image {
int tw, th; /* number of tiles in width and heigth */
opj_tcd_tile_t *tiles; /* Tiles information */
} opj_tcd_image_t;
/* /**
* Initialize the tile coder (reuses the memory allocated by tcd_malloc_encode) Tile coder/decoder
* img: raw image */
* cp: coding parameters typedef struct opj_tcd {
* curtileno : number that identifies the tile that will be encoded /** codec context */
*/ opj_common_ptr cinfo;
void tcd_init_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno);
/** info on each image tile */
opj_tcd_image_t *tcd_image;
/** image */
opj_image_t *image;
/** coding parameters */
opj_cp_t *cp;
/** pointer to the current encoded/decoded tile */
opj_tcd_tile_t *tcd_tile;
/** coding/decoding parameters common to all tiles */
opj_tcp_t *tcp;
/** current encoded/decoded tile */
int tcd_tileno;
/**@name working variables */
/*@{*/
opj_tcd_tile_t *tile;
opj_tcd_tilecomp_t *tilec;
opj_tcd_resolution_t *res;
opj_tcd_band_t *band;
opj_tcd_precinct_t *prc;
opj_tcd_cblk_t *cblk;
/*@}*/
} opj_tcd_t;
/* /** @name Exported functions */
* Initialize the tile coder (allocate the memory) /*@{*/
* img: raw image /* ----------------------------------------------------------------------- */
* cp: coding parameters
* curtileno : number that identifies the tile that will be encoded
*/
void tcd_malloc_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno);
/**
Dump the content of a tcd structure
*/
void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t * img, int curtileno);
/**
Create a new TCD handle
@param cinfo Codec context info
@return Returns a new TCD handle if successful returns NULL otherwise
*/
opj_tcd_t* tcd_create(opj_common_ptr cinfo);
/**
Destroy a previously created TCD handle
@param tcd TCD handle to destroy
*/
void tcd_destroy(opj_tcd_t *tcd);
/**
Initialize the tile coder (allocate the memory)
@param tcd TCD handle
@param image Raw image
@param cp Coding parameters
@param curtileno Number that identifies the tile that will be encoded
*/
void tcd_malloc_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno);
/**
Free the memory allocated for encoding
@param tcd TCD handle
*/
void tcd_free_encode(opj_tcd_t *tcd);
/**
Initialize the tile coder (reuses the memory allocated by tcd_malloc_encode)
@param tcd TCD handle
@param image Raw image
@param cp Coding parameters
@param curtileno Number that identifies the tile that will be encoded
*/
void tcd_init_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno);
/**
Initialize the tile decoder
@param tcd TCD handle
@param image Raw image
@param cp Coding parameters
*/
void tcd_malloc_decode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp);
void tcd_makelayer_fixed(opj_tcd_t *tcd, int layno, int final);
void tcd_rateallocate_fixed(opj_tcd_t *tcd);
void tcd_makelayer(opj_tcd_t *tcd, int layno, double thresh, int final);
bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len, opj_image_info_t * image_info);
/**
Encode a tile from the raw image into a buffer
@param tcd TCD handle
@param tileno Number that identifies one of the tiles to be encoded
@param dest Destination buffer
@param len Length of destination buffer
@param image_info Creation of index file
@return
*/
int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len, opj_image_info_t * image_info);
/**
Decode a tile from a buffer into a raw image
@param tcd TCD handle
@param src Source buffer
@param len Length of source buffer
@param tileno Number that identifies one of the tiles to be decoded
*/
bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, int tileno);
/**
Free the memory allocated for decoding
@param tcd TCD handle
*/
void tcd_free_decode(opj_tcd_t *tcd);
/* /* ----------------------------------------------------------------------- */
* Initialize the tile decoder /*@}*/
* img: raw image
* cp: coding parameters
*/
void tcd_init(j2k_image_t * img, j2k_cp_t * cp);
/*@}*/
/* #endif /* __TCD_H */
* Free the memory allocated for encoding
* img: raw image
* cp: coding parameters
* curtileno : number that identifies the tile that will be encoded
*/
void tcd_free_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno);
/*
* Encode a tile from the raw image into a buffer, format pnm, pgm or ppm
* tileno: number that identifies one of the tiles to be encoded
* dest: destination buffer
* len: length of destination buffer
* info_IM: creation of index file
*/
int tcd_encode_tile_pxm(int tileno, unsigned char *dest, int len,
info_image * info_IM);
/*
* Encode a tile from the raw image into a buffer, format pgx
* tileno: number that identifies one of the tiles to be encoded
* dest: destination buffer
* len: length of destination buffer
* info_IM: creation of index file
*/
int tcd_encode_tile_pgx(int tileno, unsigned char *dest, int len,
info_image * info_IM);
/*
* Decode a tile from a buffer into a raw image
* src: source buffer
* len: length of the source buffer
* tileno: number that identifies the tile that will be decoded
*/
int tcd_decode_tile(unsigned char *src, int len, int tileno);
void tcd_dec_release();
#endif

View File

@ -1,5 +1,9 @@
/* /*
* Copyright (c) 2001-2002, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -24,44 +28,27 @@
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "tgt.h" #include "opj_includes.h"
#include "bio.h"
#include <stdlib.h>
#include <stdio.h>
/* <summary> */ /*
/* Reset tag-tree. */ ==========================================================
/* </summary> */ Tag-tree coder interface
void tgt_reset(tgt_tree_t * tree) ==========================================================
{ */
int i;
/* new */
if (!tree || tree == NULL)
return;
for (i = 0; i < tree->numnodes; i++) { opj_tgt_tree_t *tgt_create(int numleafsh, int numleafsv) {
tree->nodes[i].value = 999;
tree->nodes[i].low = 0;
tree->nodes[i].known = 0;
}
}
/* <summary> */
/* Create tag-tree. */
/* </summary> */
tgt_tree_t *tgt_create(int numleafsh, int numleafsv)
{
int nplh[32]; int nplh[32];
int nplv[32]; int nplv[32];
tgt_node_t *node; opj_tgt_node_t *node = NULL;
tgt_node_t *parentnode; opj_tgt_node_t *parentnode = NULL;
tgt_node_t *parentnode0; opj_tgt_node_t *parentnode0 = NULL;
tgt_tree_t *tree; opj_tgt_tree_t *tree = NULL;
int i, j, k; int i, j, k;
int numlvls; int numlvls;
int n; int n;
tree = (tgt_tree_t *) malloc(sizeof(tgt_tree_t)); tree = (opj_tgt_tree_t *) opj_malloc(sizeof(opj_tgt_tree_t));
if(!tree) return NULL;
tree->numleafsh = numleafsh; tree->numleafsh = numleafsh;
tree->numleafsv = numleafsv; tree->numleafsv = numleafsv;
@ -76,61 +63,70 @@ tgt_tree_t *tgt_create(int numleafsh, int numleafsv)
tree->numnodes += n; tree->numnodes += n;
++numlvls; ++numlvls;
} while (n > 1); } while (n > 1);
/* ADD */ /* ADD */
if (tree->numnodes == 0) { if (tree->numnodes == 0) {
free(tree); opj_free(tree);
return NULL; return NULL;
} }
tree->nodes = (tgt_node_t *) malloc(tree->numnodes * sizeof(tgt_node_t)); tree->nodes = (opj_tgt_node_t *) opj_malloc(tree->numnodes * sizeof(opj_tgt_node_t));
if(!tree->nodes) {
opj_free(tree);
return NULL;
}
node = tree->nodes; 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;
} }
/* <summary> */ void tgt_destroy(opj_tgt_tree_t *tree) {
/* Destroy tag-tree. */ opj_free(tree->nodes);
/* </summary> */ opj_free(tree);
void tgt_destroy(tgt_tree_t * t)
{
free(t->nodes);
free(t);
} }
/* <summary> */ void tgt_reset(opj_tgt_tree_t *tree) {
/* Set the value of a leaf of the tag-tree. */ int i;
/* </summary> */
void tgt_setvalue(tgt_tree_t * tree, int leafno, int value) if (NULL == tree)
{ return;
tgt_node_t *node;
for (i = 0; i < tree->numnodes; i++) {
tree->nodes[i].value = 999;
tree->nodes[i].low = 0;
tree->nodes[i].known = 0;
}
}
void tgt_setvalue(opj_tgt_tree_t *tree, int leafno, int value) {
opj_tgt_node_t *node;
node = &tree->nodes[leafno]; node = &tree->nodes[leafno];
while (node && node->value > value) { while (node && node->value > value) {
node->value = value; node->value = value;
@ -138,14 +134,10 @@ void tgt_setvalue(tgt_tree_t * tree, int leafno, int value)
} }
} }
/* <summary> */ void tgt_encode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold) {
/* Encode the value of a leaf of the tag-tree. */ opj_tgt_node_t *stk[31];
/* </summary> */ opj_tgt_node_t **stkptr;
void tgt_encode(tgt_tree_t * tree, int leafno, int threshold) opj_tgt_node_t *node;
{
tgt_node_t *stk[31];
tgt_node_t **stkptr;
tgt_node_t *node;
int low; int low;
stkptr = stk; stkptr = stk;
@ -154,7 +146,7 @@ void tgt_encode(tgt_tree_t * tree, int leafno, int threshold)
*stkptr++ = node; *stkptr++ = node;
node = node->parent; node = node->parent;
} }
low = 0; low = 0;
for (;;) { for (;;) {
if (low > node->low) { if (low > node->low) {
@ -162,35 +154,30 @@ void tgt_encode(tgt_tree_t * tree, int leafno, int threshold)
} 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(1, 1); bio_write(bio, 1, 1);
node->known = 1; node->known = 1;
} }
break; break;
} }
bio_write(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;
} }
} }
/* <summary> */ int tgt_decode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold) {
/* Decode the value of a leaf of the tag-tree. */ opj_tgt_node_t *stk[31];
/* </summary> */ opj_tgt_node_t **stkptr;
int tgt_decode(tgt_tree_t * tree, int leafno, int threshold) opj_tgt_node_t *node;
{
tgt_node_t *stk[31];
tgt_node_t **stkptr;
tgt_node_t *node;
int low; int low;
stkptr = stk; stkptr = stk;
@ -199,7 +186,7 @@ int tgt_decode(tgt_tree_t * tree, int leafno, int threshold)
*stkptr++ = node; *stkptr++ = node;
node = node->parent; node = node->parent;
} }
low = 0; low = 0;
for (;;) { for (;;) {
if (low > node->low) { if (low > node->low) {
@ -208,10 +195,10 @@ int tgt_decode(tgt_tree_t * tree, int leafno, int threshold)
low = node->low; low = node->low;
} }
while (low < threshold && low < node->value) { while (low < threshold && low < node->value) {
if (bio_read(1)) { if (bio_read(bio, 1)) {
node->value = low; node->value = low;
} else { } else {
++low; ++low;
} }
} }
node->low = low; node->low = low;
@ -220,6 +207,6 @@ int tgt_decode(tgt_tree_t * tree, int leafno, int threshold)
} }
node = *--stkptr; node = *--stkptr;
} }
return (node->value < threshold) ? 1 : 0; return (node->value < threshold) ? 1 : 0;
} }

View File

@ -1,5 +1,9 @@
/* /*
* Copyright (c) 2001-2002, David Janssens * Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
* Copyright (c) 2005, HervŽ Drolon, FreeImage Team
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -26,62 +30,84 @@
#ifndef __TGT_H #ifndef __TGT_H
#define __TGT_H #define __TGT_H
/**
@file tgt.h
@brief Implementation of a tag-tree coder (TGT)
typedef struct tgt_node { The functions in TGT.C have for goal to realize a tag-tree coder. The functions in TGT.C
struct tgt_node *parent; are used by some function in T2.C.
*/
/** @defgroup TGT TGT - Implementation of a tag-tree coder */
/*@{*/
/**
Tag node
*/
typedef struct opj_tgt_node {
struct opj_tgt_node *parent;
int value; int value;
int low; int low;
int known; int known;
} tgt_node_t; } opj_tgt_node_t;
typedef struct { /**
Tag tree
*/
typedef struct opj_tgt_tree {
int numleafsh; int numleafsh;
int numleafsv; int numleafsv;
int numnodes; int numnodes;
tgt_node_t *nodes; opj_tgt_node_t *nodes;
} tgt_tree_t; } opj_tgt_tree_t;
/** @name Exported functions */
/*@{*/
/* ----------------------------------------------------------------------- */
/**
Create a tag-tree
@param numleafsh Width of the array of leafs of the tree
@param numleafsv Height of the array of leafs of the tree
@return Returns a new tag-tree if successful, returns NULL otherwise
*/
opj_tgt_tree_t *tgt_create(int numleafsh, int numleafsv);
/**
Destroy a tag-tree, liberating memory
@param tree Tag-tree to destroy
*/
void tgt_destroy(opj_tgt_tree_t *tree);
/**
Reset a tag-tree (set all leaves to 0)
@param tree Tag-tree to reset
*/
void tgt_reset(opj_tgt_tree_t *tree);
/**
Set the value of a leaf of a tag-tree
@param tree Tag-tree to modify
@param leafno Number that identifies the leaf to modify
@param value New value of the leaf
*/
void tgt_setvalue(opj_tgt_tree_t *tree, int leafno, int value);
/**
Encode the value of a leaf of the tag-tree up to a given threshold
@param bio Pointer to a BIO handle
@param tree Tag-tree to modify
@param leafno Number that identifies the leaf to encode
@param threshold Threshold to use when encoding value of the leaf
*/
void tgt_encode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold);
/**
Decode the value of a leaf of the tag-tree up to a given threshold
@param bio Pointer to a BIO handle
@param tree Tag-tree to decode
@param leafno Number that identifies the leaf to decode
@param threshold Threshold to use when decoding value of the leaf
@return Returns 1 if the node's value < threshold, returns 0 otherwise
*/
int tgt_decode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold);
/* ----------------------------------------------------------------------- */
/*@}*/
/*@}*/
/* #endif /* __TGT_H */
* Reset a tag-tree (set all leaves to 0)
* tree: tag-tree to reset
*/
void tgt_reset(tgt_tree_t * tree);
/*
* Create a tag-tree
* numleafsh: width of the array of leafs of the tree
* numleafsv: height of the array of leafs of the tree
*/
tgt_tree_t *tgt_create(int numleafsh, int numleafsv);
/*
* Destroy a tag-tree, liberating memory
* tree: tag-tree to destroy
*/
void tgt_destroy(tgt_tree_t * tree);
/*
* Set the value of a leaf of a tag-tree
* tree: tag-tree to modify
* leafno: number that identifies the leaf to modify
* value: new value of the leaf
*/
void tgt_setvalue(tgt_tree_t * tree, int leafno, int value);
/*
* Encode the value of a leaf of the tag-tree up to a given threshold
* leafno: number that identifies the leaf to encode
* threshold: threshold to use when encoding value of the leaf
*/
void tgt_encode(tgt_tree_t * tree, int leafno, int threshold);
/*
* Decode the value of a leaf of the tag-tree up to a given threshold
* leafno: number that identifies the leaf to decode
* threshold: threshold to use when decoding value of the leaf
*/
int tgt_decode(tgt_tree_t * tree, int leafno, int threshold);
#endif