openjpeg version 1.0 (previous version still available with tag opj0-97)
This commit is contained in:
parent
76016d509b
commit
f61cda9b7d
|
@ -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 */
|
||||||
}
|
}
|
||||||
|
|
|
@ -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_ */
|
||||||
|
|
1465
codec/convert.c
1465
codec/convert.c
File diff suppressed because it is too large
Load Diff
|
@ -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]);
|
|
||||||
|
|
1427
codec/image_to_j2k.c
1427
codec/image_to_j2k.c
File diff suppressed because it is too large
Load Diff
|
@ -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
|
||||||
|
|
1017
codec/j2k_to_image.c
1017
codec/j2k_to_image.c
File diff suppressed because it is too large
Load Diff
|
@ -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
|
||||||
|
|
|
@ -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
|
|
@ -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 */
|
#include "opj_includes.h"
|
||||||
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.
|
==========================================================
|
||||||
*/
|
local functions
|
||||||
int bio_numbytes()
|
==========================================================
|
||||||
{
|
*/
|
||||||
return bio_bp - bio_start;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
static int bio_byteout(opj_bio_t *bio) {
|
||||||
* Init encoder.
|
bio->buf = (bio->buf << 8) & 0xffff;
|
||||||
*
|
bio->ct = bio->buf == 0xff00 ? 7 : 8;
|
||||||
* bp : Output buffer
|
if (bio->bp >= bio->end) {
|
||||||
* 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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 !!!
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
int bio_byteout()
|
|
||||||
{
|
|
||||||
bio_buf = (bio_buf << 8) & 0xffff;
|
|
||||||
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) {
|
||||||
|
if (bio->ct == 0) {
|
||||||
|
bio_bytein(bio);
|
||||||
|
}
|
||||||
|
bio->ct--;
|
||||||
|
return (bio->buf >> bio->ct) & 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Read bit.
|
==========================================================
|
||||||
*
|
Bit Input/Output interface
|
||||||
*/
|
==========================================================
|
||||||
int bio_getbit()
|
*/
|
||||||
{
|
|
||||||
if (bio_ct == 0) {
|
opj_bio_t* bio_create() {
|
||||||
bio_bytein();
|
opj_bio_t *bio = (opj_bio_t*)opj_malloc(sizeof(opj_bio_t));
|
||||||
}
|
return bio;
|
||||||
bio_ct--;
|
|
||||||
return (bio_buf >> bio_ct) & 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
void bio_destroy(opj_bio_t *bio) {
|
||||||
* Write bits.
|
if(bio) {
|
||||||
*
|
opj_free(bio);
|
||||||
* v : Value of bits
|
}
|
||||||
* n : Number of bits to write
|
}
|
||||||
*/
|
|
||||||
void bio_write(int v, int n)
|
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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
|
|
|
@ -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
|
|
||||||
|
|
|
@ -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,16 +194,104 @@ 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;
|
||||||
|
@ -208,12 +299,12 @@ void dwt_encode(tcd_tilecomp_t * tilec)
|
||||||
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;
|
||||||
|
@ -224,28 +315,27 @@ void dwt_encode(tcd_tilecomp_t * tilec)
|
||||||
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,12 +343,11 @@ 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;
|
||||||
|
@ -266,12 +355,12 @@ void dwt_decode(tcd_tilecomp_t * tilec, int stop)
|
||||||
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;
|
||||||
|
@ -284,26 +373,25 @@ void dwt_decode(tcd_tilecomp_t * tilec, int stop)
|
||||||
|
|
||||||
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,99 +410,19 @@ 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;
|
||||||
|
@ -423,12 +430,12 @@ void dwt_encode_real(tcd_tilecomp_t * tilec)
|
||||||
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;
|
||||||
|
@ -441,25 +448,25 @@ void dwt_encode_real(tcd_tilecomp_t * tilec)
|
||||||
|
|
||||||
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,13 +474,11 @@ 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;
|
||||||
|
@ -481,12 +486,12 @@ void dwt_decode_real(tcd_tilecomp_t * tilec, int stop)
|
||||||
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;
|
||||||
|
@ -499,25 +504,25 @@ void dwt_decode_real(tcd_tilecomp_t * tilec, int stop)
|
||||||
|
|
||||||
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]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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 */
|
|
@ -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)) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
2491
libopenjpeg/j2k.c
2491
libopenjpeg/j2k.c
File diff suppressed because it is too large
Load Diff
|
@ -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
|
||||||
|
@ -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 */
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
@ -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 */
|
||||||
|
/*@{*/
|
||||||
|
|
||||||
|
#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 depth;
|
||||||
int sgnd;
|
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
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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];
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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> */
|
static int mqc_mpsexchange(opj_mqc_t *mqc) {
|
||||||
/* Set current context. */
|
int d;
|
||||||
/* </summary> */
|
if (mqc->a < (*mqc->curctx)->qeval) {
|
||||||
/* <param name="ctxno">Context number.</param> */
|
d = 1 - (*mqc->curctx)->mps;
|
||||||
void mqc_setcurctx(int ctxno)
|
*mqc->curctx = (*mqc->curctx)->nlps;
|
||||||
{
|
|
||||||
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 {
|
} else {
|
||||||
mqc_codelps();
|
d = (*mqc->curctx)->mps;
|
||||||
|
*mqc->curctx = (*mqc->curctx)->nmps;
|
||||||
|
}
|
||||||
|
|
||||||
|
return d;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int mqc_lpsexchange(opj_mqc_t *mqc) {
|
||||||
|
int d;
|
||||||
|
if (mqc->a < (*mqc->curctx)->qeval) {
|
||||||
|
mqc->a = (*mqc->curctx)->qeval;
|
||||||
|
d = (*mqc->curctx)->mps;
|
||||||
|
*mqc->curctx = (*mqc->curctx)->nmps;
|
||||||
|
} else {
|
||||||
|
mqc->a = (*mqc->curctx)->qeval;
|
||||||
|
d = 1 - (*mqc->curctx)->mps;
|
||||||
|
*mqc->curctx = (*mqc->curctx)->nlps;
|
||||||
|
}
|
||||||
|
|
||||||
|
return d;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void mqc_bytein(opj_mqc_t *mqc) {
|
||||||
|
if (mqc->bp != mqc->end) {
|
||||||
|
unsigned int c;
|
||||||
|
if (mqc->bp + 1 != mqc->end) {
|
||||||
|
c = *(mqc->bp + 1);
|
||||||
|
} else {
|
||||||
|
c = 0xff;
|
||||||
|
}
|
||||||
|
if (*mqc->bp == 0xff) {
|
||||||
|
if (c > 0x8f) {
|
||||||
|
mqc->c += 0xff00;
|
||||||
|
mqc->ct = 8;
|
||||||
|
} else {
|
||||||
|
mqc->bp++;
|
||||||
|
mqc->c += c << 9;
|
||||||
|
mqc->ct = 7;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
mqc->bp++;
|
||||||
|
mqc->c += c << 8;
|
||||||
|
mqc->ct = 8;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
mqc->c += 0xff00;
|
||||||
|
mqc->ct = 8;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* <summary> */
|
static void mqc_renormd(opj_mqc_t *mqc) {
|
||||||
/* Fill mqc_c with 1's for flushing */
|
do {
|
||||||
/* </summary> */
|
if (mqc->ct == 0) {
|
||||||
void mqc_setbits()
|
mqc_bytein(mqc);
|
||||||
{
|
}
|
||||||
unsigned int tempc = mqc_c + mqc_a;
|
mqc->a <<= 1;
|
||||||
mqc_c |= 0xffff;
|
mqc->c <<= 1;
|
||||||
if (mqc_c >= tempc) {
|
mqc->ct--;
|
||||||
mqc_c -= 0x8000;
|
} while (mqc->a < 0x8000);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
==========================================================
|
||||||
|
MQ-Coder interface
|
||||||
|
==========================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
opj_mqc_t* mqc_create() {
|
||||||
|
opj_mqc_t *mqc = (opj_mqc_t*)opj_malloc(sizeof(opj_mqc_t));
|
||||||
|
return mqc;
|
||||||
|
}
|
||||||
|
|
||||||
|
void mqc_destroy(opj_mqc_t *mqc) {
|
||||||
|
if(mqc) {
|
||||||
|
opj_free(mqc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* <summary> */
|
int mqc_numbytes(opj_mqc_t *mqc) {
|
||||||
/* Flush encoded data. */
|
return mqc->bp - mqc->start;
|
||||||
/* </summary> */
|
}
|
||||||
void mqc_flush()
|
|
||||||
{
|
|
||||||
mqc_setbits();
|
|
||||||
mqc_c <<= mqc_ct;
|
|
||||||
mqc_byteout();
|
|
||||||
mqc_c <<= mqc_ct;
|
|
||||||
mqc_byteout();
|
|
||||||
|
|
||||||
if (*mqc_bp != 0xff) {
|
void mqc_init_enc(opj_mqc_t *mqc, unsigned char *bp) {
|
||||||
mqc_bp++;
|
mqc_setcurctx(mqc, 0);
|
||||||
|
mqc->a = 0x8000;
|
||||||
|
mqc->c = 0;
|
||||||
|
mqc->bp = bp - 1;
|
||||||
|
mqc->ct = 12;
|
||||||
|
if (*mqc->bp == 0xff) {
|
||||||
|
mqc->ct = 13;
|
||||||
|
}
|
||||||
|
mqc->start = bp;
|
||||||
|
}
|
||||||
|
|
||||||
|
void mqc_setcurctx(opj_mqc_t *mqc, int ctxno) {
|
||||||
|
mqc->curctx = &mqc->ctxs[ctxno];
|
||||||
|
}
|
||||||
|
|
||||||
|
void mqc_encode(opj_mqc_t *mqc, int d) {
|
||||||
|
if ((*mqc->curctx)->mps == d) {
|
||||||
|
mqc_codemps(mqc);
|
||||||
|
} else {
|
||||||
|
mqc_codelps(mqc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* <summary> */
|
void mqc_flush(opj_mqc_t *mqc) {
|
||||||
/* not fully implemented and tested !! */
|
mqc_setbits(mqc);
|
||||||
/* BYPASS mode switch, initialization operation */
|
mqc->c <<= mqc->ct;
|
||||||
/* JPEG 2000 p 505 */
|
mqc_byteout(mqc);
|
||||||
/* </summary> */
|
mqc->c <<= mqc->ct;
|
||||||
void mqc_bypass_init_enc()
|
mqc_byteout(mqc);
|
||||||
{
|
|
||||||
mqc_c = 0;
|
if (*mqc->bp != 0xff) {
|
||||||
mqc_ct = 8;
|
mqc->bp++;
|
||||||
/*if (*mqc_bp == 0xff) {
|
}
|
||||||
mqc_ct = 7;
|
}
|
||||||
|
|
||||||
|
void mqc_bypass_init_enc(opj_mqc_t *mqc) {
|
||||||
|
mqc->c = 0;
|
||||||
|
mqc->ct = 8;
|
||||||
|
/*if (*mqc->bp == 0xff) {
|
||||||
|
mqc->ct = 7;
|
||||||
} */
|
} */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* <summary> */
|
void mqc_bypass_enc(opj_mqc_t *mqc, int d) {
|
||||||
/* not fully implemented and tested !! */
|
mqc->ct--;
|
||||||
/* BYPASS mode switch, coding operation */
|
mqc->c = mqc->c + (d << mqc->ct);
|
||||||
/* JPEG 2000 p 505 */
|
if (mqc->ct == 0) {
|
||||||
/* </summary> */
|
mqc->bp++;
|
||||||
void mqc_bypass_enc(int d)
|
*mqc->bp = mqc->c;
|
||||||
{
|
mqc->ct = 8;
|
||||||
mqc_ct--;
|
if (*mqc->bp == 0xff) {
|
||||||
mqc_c = mqc_c + (d << mqc_ct);
|
mqc->ct = 7;
|
||||||
if (mqc_ct == 0) {
|
|
||||||
mqc_bp++;
|
|
||||||
*mqc_bp = mqc_c;
|
|
||||||
mqc_ct = 8;
|
|
||||||
if (*mqc_bp == 0xff) {
|
|
||||||
mqc_ct = 7;
|
|
||||||
}
|
}
|
||||||
mqc_c = 0;
|
mqc->c = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* <summary> */
|
int mqc_bypass_flush_enc(opj_mqc_t *mqc) {
|
||||||
/* not fully implemented and tested !! */
|
|
||||||
/* BYPASS mode switch, flush operation */
|
|
||||||
/* </summary> */
|
|
||||||
int mqc_bypass_flush_enc()
|
|
||||||
{
|
|
||||||
unsigned char bit_padding;
|
unsigned char bit_padding;
|
||||||
|
|
||||||
bit_padding = 0;
|
bit_padding = 0;
|
||||||
|
|
||||||
if (mqc_ct != 0) {
|
if (mqc->ct != 0) {
|
||||||
while (mqc_ct > 0) {
|
while (mqc->ct > 0) {
|
||||||
mqc_ct--;
|
mqc->ct--;
|
||||||
mqc_c += bit_padding << mqc_ct;
|
mqc->c += bit_padding << mqc->ct;
|
||||||
bit_padding = (bit_padding + 1) & 0x01;
|
bit_padding = (bit_padding + 1) & 0x01;
|
||||||
}
|
}
|
||||||
mqc_bp++;
|
mqc->bp++;
|
||||||
*mqc_bp = mqc_c;
|
*mqc->bp = mqc->c;
|
||||||
mqc_ct = 8;
|
mqc->ct = 8;
|
||||||
mqc_c = 0;
|
mqc->c = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* <summary> */
|
void mqc_reset_enc(opj_mqc_t *mqc) {
|
||||||
/* RESET mode switch */
|
mqc_resetstates(mqc);
|
||||||
/* </summary> */
|
mqc_setstate(mqc, 18, 0, 46);
|
||||||
void mqc_reset_enc()
|
mqc_setstate(mqc, 0, 0, 3);
|
||||||
{
|
mqc_setstate(mqc, 1, 0, 4);
|
||||||
mqc_resetstates();
|
|
||||||
mqc_setstate(18, 0, 46);
|
|
||||||
mqc_setstate(0, 0, 3);
|
|
||||||
mqc_setstate(1, 0, 4);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* <summary> */
|
int mqc_restart_enc(opj_mqc_t *mqc) {
|
||||||
/* mode switch RESTART (TERMALL) */
|
|
||||||
/* </summary> */
|
|
||||||
int mqc_restart_enc()
|
|
||||||
{
|
|
||||||
int correction = 1;
|
int correction = 1;
|
||||||
|
|
||||||
/* <flush part> */
|
/* <flush part> */
|
||||||
int n = 27 - 15 - mqc_ct;
|
int n = 27 - 15 - mqc->ct;
|
||||||
mqc_c <<= mqc_ct;
|
mqc->c <<= mqc->ct;
|
||||||
while (n > 0) {
|
while (n > 0) {
|
||||||
mqc_byteout();
|
mqc_byteout(mqc);
|
||||||
n -= mqc_ct;
|
n -= mqc->ct;
|
||||||
mqc_c <<= mqc_ct;
|
mqc->c <<= mqc->ct;
|
||||||
}
|
}
|
||||||
mqc_byteout();
|
mqc_byteout(mqc);
|
||||||
|
|
||||||
return correction;
|
return correction;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* <summary> */
|
void mqc_restart_init_enc(opj_mqc_t *mqc) {
|
||||||
/* mode switch RESTART (TERMALL) reinitialisation */
|
|
||||||
/* </summary> */
|
|
||||||
void mqc_restart_init_enc()
|
|
||||||
{
|
|
||||||
/* <Re-init part> */
|
/* <Re-init part> */
|
||||||
mqc_setcurctx(0);
|
mqc_setcurctx(mqc, 0);
|
||||||
mqc_a = 0x8000;
|
mqc->a = 0x8000;
|
||||||
mqc_c = 0;
|
mqc->c = 0;
|
||||||
mqc_ct = 12;
|
mqc->ct = 12;
|
||||||
mqc_bp--;
|
mqc->bp--;
|
||||||
if (*mqc_bp == 0xff) {
|
if (*mqc->bp == 0xff) {
|
||||||
mqc_ct = 13;
|
mqc->ct = 13;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void mqc_erterm_enc(opj_mqc_t *mqc) {
|
||||||
/* <summary> */
|
int k = 11 - mqc->ct + 1;
|
||||||
/* ERTERM mode switch */
|
|
||||||
/* </summary> */
|
|
||||||
void mqc_erterm_enc()
|
|
||||||
{
|
|
||||||
int k = 11 - mqc_ct + 1;
|
|
||||||
|
|
||||||
while (k > 0) {
|
while (k > 0) {
|
||||||
mqc_c <<= mqc_ct;
|
mqc->c <<= mqc->ct;
|
||||||
mqc_ct = 0;
|
mqc->ct = 0;
|
||||||
mqc_byteout();
|
mqc_byteout(mqc);
|
||||||
k -= mqc_ct;
|
k -= mqc->ct;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*mqc_bp != 0xff) {
|
if (*mqc->bp != 0xff) {
|
||||||
mqc_byteout();
|
mqc_byteout(mqc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* <summary> */
|
void mqc_segmark_enc(opj_mqc_t *mqc) {
|
||||||
/* SEGMARK mode switch (SEGSYM) */
|
|
||||||
/* </summary> */
|
|
||||||
void mqc_segmark_enc()
|
|
||||||
{
|
|
||||||
int i;
|
int i;
|
||||||
mqc_setcurctx(18);
|
mqc_setcurctx(mqc, 18);
|
||||||
|
|
||||||
for (i = 1; i < 5; i++) {
|
for (i = 1; i < 5; i++) {
|
||||||
mqc_encode(i % 2);
|
mqc_encode(mqc, i % 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* <summary> */
|
void mqc_init_dec(opj_mqc_t *mqc, unsigned char *bp, int len) {
|
||||||
/* </summary> */
|
mqc_setcurctx(mqc, 0);
|
||||||
int mqc_mpsexchange()
|
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;
|
int d;
|
||||||
if (mqc_a < (*mqc_curctx)->qeval) {
|
mqc->a -= (*mqc->curctx)->qeval;
|
||||||
d = 1 - (*mqc_curctx)->mps;
|
if ((mqc->c >> 16) < (*mqc->curctx)->qeval) {
|
||||||
*mqc_curctx = (*mqc_curctx)->nlps;
|
d = mqc_lpsexchange(mqc);
|
||||||
|
mqc_renormd(mqc);
|
||||||
} else {
|
} else {
|
||||||
d = (*mqc_curctx)->mps;
|
mqc->c -= (*mqc->curctx)->qeval << 16;
|
||||||
*mqc_curctx = (*mqc_curctx)->nmps;
|
if ((mqc->a & 0x8000) == 0) {
|
||||||
|
d = mqc_mpsexchange(mqc);
|
||||||
|
mqc_renormd(mqc);
|
||||||
|
} else {
|
||||||
|
d = (*mqc->curctx)->mps;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* <summary> */
|
void mqc_resetstates(opj_mqc_t *mqc) {
|
||||||
/* </summary> */
|
|
||||||
int mqc_lpsexchange()
|
|
||||||
{
|
|
||||||
int d;
|
|
||||||
if (mqc_a < (*mqc_curctx)->qeval) {
|
|
||||||
mqc_a = (*mqc_curctx)->qeval;
|
|
||||||
d = (*mqc_curctx)->mps;
|
|
||||||
*mqc_curctx = (*mqc_curctx)->nmps;
|
|
||||||
} else {
|
|
||||||
mqc_a = (*mqc_curctx)->qeval;
|
|
||||||
d = 1 - (*mqc_curctx)->mps;
|
|
||||||
*mqc_curctx = (*mqc_curctx)->nlps;
|
|
||||||
}
|
|
||||||
return d;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* Input a byte. */
|
|
||||||
/* </summary> */
|
|
||||||
void mqc_bytein()
|
|
||||||
{
|
|
||||||
if (mqc_bp != mqc_end) {
|
|
||||||
unsigned int c;
|
|
||||||
if (mqc_bp + 1 != mqc_end) {
|
|
||||||
c = *(mqc_bp + 1);
|
|
||||||
} else {
|
|
||||||
c = 0xff;
|
|
||||||
}
|
|
||||||
if (*mqc_bp == 0xff) {
|
|
||||||
if (c > 0x8f) {
|
|
||||||
mqc_c += 0xff00;
|
|
||||||
mqc_ct = 8;
|
|
||||||
} else {
|
|
||||||
mqc_bp++;
|
|
||||||
mqc_c += c << 9;
|
|
||||||
mqc_ct = 7;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
mqc_bp++;
|
|
||||||
mqc_c += c << 8;
|
|
||||||
mqc_ct = 8;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
mqc_c += 0xff00;
|
|
||||||
mqc_ct = 8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* Renormalize mqc_a and mqc_c while decoding. */
|
|
||||||
/* </summary> */
|
|
||||||
void mqc_renormd()
|
|
||||||
{
|
|
||||||
do {
|
|
||||||
if (mqc_ct == 0) {
|
|
||||||
mqc_bytein();
|
|
||||||
}
|
|
||||||
mqc_a <<= 1;
|
|
||||||
mqc_c <<= 1;
|
|
||||||
mqc_ct--;
|
|
||||||
} while (mqc_a < 0x8000);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* Initialize decoder. */
|
|
||||||
/* </summary> */
|
|
||||||
void mqc_init_dec(unsigned char *bp, int len)
|
|
||||||
{
|
|
||||||
mqc_setcurctx(0);
|
|
||||||
mqc_start = bp;
|
|
||||||
mqc_end = bp + len;
|
|
||||||
mqc_bp = bp;
|
|
||||||
/*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> */
|
|
||||||
/* Decode a symbol. */
|
|
||||||
/* </summary> */
|
|
||||||
int mqc_decode()
|
|
||||||
{
|
|
||||||
int d;
|
|
||||||
mqc_a -= (*mqc_curctx)->qeval;
|
|
||||||
if ((mqc_c >> 16) < (*mqc_curctx)->qeval) {
|
|
||||||
d = mqc_lpsexchange();
|
|
||||||
mqc_renormd();
|
|
||||||
} else {
|
|
||||||
mqc_c -= (*mqc_curctx)->qeval << 16;
|
|
||||||
if ((mqc_a & 0x8000) == 0) {
|
|
||||||
d = mqc_mpsexchange();
|
|
||||||
mqc_renormd();
|
|
||||||
} else {
|
|
||||||
d = (*mqc_curctx)->mps;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return d;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* 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)];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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 */
|
822
libopenjpeg/pi.c
822
libopenjpeg/pi.c
|
@ -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];
|
static bool pi_next_lrcp(opj_pi_iterator_t * pi) {
|
||||||
pi = (pi_iterator_t *) malloc((tcp->numpocs + 1) *
|
opj_pi_comp_t *comp = NULL;
|
||||||
sizeof(pi_iterator_t));
|
opj_pi_resolution_t *res = NULL;
|
||||||
|
long index = 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, 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;
|
|
||||||
|
|
||||||
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 (!
|
|
||||||
(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;
|
||||||
if ((res->pw==0)||(res->pw==0)) continue;
|
|
||||||
/*ddA*/
|
|
||||||
|
|
||||||
/*Add Antonin : pcrl*/
|
if ((trx0==trx1)||(try0==try1)) continue;
|
||||||
if ((trx0==trx1)||(try0==try1)) continue;
|
|
||||||
/*ddA*/
|
|
||||||
|
|
||||||
prci =
|
prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx)
|
||||||
int_floordivpow2(int_ceildiv
|
- int_floordivpow2(trx0, res->pdx);
|
||||||
(pi->x, comp->dx << levelno),
|
prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy)
|
||||||
res->pdx) - int_floordivpow2(trx0, res->pdx);
|
- int_floordivpow2(try0, res->pdy);
|
||||||
prcj =
|
pi->precno = prci + prcj * res->pw;
|
||||||
int_floordivpow2(int_ceildiv
|
for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) {
|
||||||
(pi->y, comp->dy << levelno),
|
index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
|
||||||
res->pdy) - int_floordivpow2(try0, res->pdy);
|
if (!pi->include[index]) {
|
||||||
pi->precno = prci + prcj * res->pw;
|
pi->include[index] = 1;
|
||||||
for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) {
|
return true;
|
||||||
if (!pi->
|
}
|
||||||
include[pi->layno * pi->step_l +
|
LABEL_SKIP:;
|
||||||
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*/
|
for (pi->y = pi->ty0; pi->y < pi->ty1; pi->y += pi->dy - (pi->y % pi->dy)) {
|
||||||
if ((res->pw==0)||(res->pw==0)) 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];
|
||||||
|
for (pi->resno = pi->poc.resno0; pi->resno < int_min(pi->poc.resno1, comp->numresolutions); pi->resno++) {
|
||||||
|
int levelno;
|
||||||
|
int trx0, try0;
|
||||||
|
int trx1, try1;
|
||||||
|
int rpx, rpy;
|
||||||
|
int prci, prcj;
|
||||||
|
res = &comp->resolutions[pi->resno];
|
||||||
|
levelno = comp->numresolutions - 1 - pi->resno;
|
||||||
|
trx0 = int_ceildiv(pi->tx0, comp->dx << levelno);
|
||||||
|
try0 = int_ceildiv(pi->ty0, comp->dy << levelno);
|
||||||
|
trx1 = int_ceildiv(pi->tx1, comp->dx << levelno);
|
||||||
|
try1 = int_ceildiv(pi->ty1, comp->dy << levelno);
|
||||||
|
rpx = res->pdx + levelno;
|
||||||
|
rpy = res->pdy + levelno;
|
||||||
|
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 : pcrl*/
|
if ((res->pw==0)||(res->pw==0)) continue;
|
||||||
if ((trx0==trx1)||(try0==try1)) continue;
|
|
||||||
/*ddA*/
|
|
||||||
|
|
||||||
prci =
|
if ((trx0==trx1)||(try0==try1)) continue;
|
||||||
int_floordivpow2(int_ceildiv
|
|
||||||
(pi->x, comp->dx << levelno),
|
prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx)
|
||||||
res->pdx) - int_floordivpow2(trx0, res->pdx);
|
- int_floordivpow2(trx0, res->pdx);
|
||||||
prcj =
|
prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy)
|
||||||
int_floordivpow2(int_ceildiv
|
- int_floordivpow2(try0, res->pdy);
|
||||||
(pi->y, comp->dy << levelno),
|
pi->precno = prci + prcj * res->pw;
|
||||||
res->pdy) - int_floordivpow2(try0, res->pdy);
|
for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) {
|
||||||
pi->precno = prci + prcj * res->pw;
|
index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
|
||||||
for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) {
|
if (!pi->include[index]) {
|
||||||
if (!pi->
|
pi->include[index] = 1;
|
||||||
include[pi->layno * pi->step_l +
|
return true;
|
||||||
pi->resno * pi->step_r +
|
}
|
||||||
pi->compno * pi->step_c +
|
LABEL_SKIP:;
|
||||||
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_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 (!
|
|
||||||
(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;
|
||||||
if ((res->pw==0)||(res->pw==0)) continue;
|
|
||||||
/*ddA*/
|
|
||||||
|
|
||||||
/*Add Antonin : pcrl*/
|
if ((trx0==trx1)||(try0==try1)) continue;
|
||||||
if ((trx0==trx1)||(try0==try1)) continue;
|
|
||||||
/*ddA*/
|
|
||||||
|
|
||||||
prci =
|
prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx)
|
||||||
int_floordivpow2(int_ceildiv
|
- int_floordivpow2(trx0, res->pdx);
|
||||||
(pi->x, comp->dx << levelno),
|
prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy)
|
||||||
res->pdx) - int_floordivpow2(trx0, res->pdx);
|
- int_floordivpow2(try0, res->pdy);
|
||||||
prcj =
|
pi->precno = prci + prcj * res->pw;
|
||||||
int_floordivpow2(int_ceildiv
|
for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) {
|
||||||
(pi->y, comp->dy << levelno),
|
index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
|
||||||
res->pdy) - int_floordivpow2(try0, res->pdy);
|
if (!pi->include[index]) {
|
||||||
pi->precno = prci + prcj * res->pw;
|
pi->include[index] = 1;
|
||||||
for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) {
|
return true;
|
||||||
if (!pi->
|
}
|
||||||
include[pi->layno * pi->step_l +
|
LABEL_SKIP:;
|
||||||
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
156
libopenjpeg/pi.h
156
libopenjpeg/pi.h
|
@ -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 */
|
||||||
|
|
|
@ -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"
|
||||||
|
|
||||||
|
|
||||||
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 */
|
|
||||||
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 */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return the number of bytes already encoded.
|
==========================================================
|
||||||
*/
|
local functions
|
||||||
int raw_numbytes()
|
==========================================================
|
||||||
{
|
*/
|
||||||
return raw_bp - raw_start;
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
==========================================================
|
||||||
|
RAW encoding interface
|
||||||
|
==========================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
opj_raw_t* raw_create() {
|
||||||
|
opj_raw_t *raw = (opj_raw_t*)opj_malloc(sizeof(opj_raw_t));
|
||||||
|
return raw;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
void raw_destroy(opj_raw_t *raw) {
|
||||||
* 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
1307
libopenjpeg/t1.c
1307
libopenjpeg/t1.c
File diff suppressed because it is too large
Load Diff
234
libopenjpeg/t1.h
234
libopenjpeg/t1.h
|
@ -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 */
|
||||||
|
|
735
libopenjpeg/t2.c
735
libopenjpeg/t2.c
File diff suppressed because it is too large
Load Diff
145
libopenjpeg/t2.h
145
libopenjpeg/t2.h
|
@ -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 */
|
||||||
|
|
2401
libopenjpeg/tcd.c
2401
libopenjpeg/tcd.c
File diff suppressed because it is too large
Load Diff
|
@ -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
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
@ -79,11 +66,15 @@ tgt_tree_t *tgt_create(int numleafsh, int numleafsv)
|
||||||
|
|
||||||
/* 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];
|
||||||
|
@ -93,19 +84,19 @@ tgt_tree_t *tgt_create(int numleafsh, int numleafsv)
|
||||||
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];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -116,21 +107,26 @@ tgt_tree_t *tgt_create(int numleafsh, int numleafsv)
|
||||||
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;
|
||||||
|
@ -165,13 +157,13 @@ void tgt_encode(tgt_tree_t * tree, int leafno, int threshold)
|
||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -180,17 +172,12 @@ void tgt_encode(tgt_tree_t * tree, int leafno, int threshold)
|
||||||
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;
|
||||||
|
@ -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;
|
||||||
|
|
|
@ -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
|
|
||||||
|
|
Loading…
Reference in New Issue