Deleted because this directory corresponds to an old version of the JPWL library
This commit is contained in:
parent
9fc6e4f4bd
commit
3d2f2b4048
|
@ -1,94 +0,0 @@
|
||||||
# $Id$
|
|
||||||
#
|
|
||||||
# makefile for OpenJPEG codec
|
|
||||||
|
|
||||||
OPENJPEG_DIR = ../libopenjpeg
|
|
||||||
|
|
||||||
ifndef DEBUG
|
|
||||||
LDFLAGS = -s -lm
|
|
||||||
else
|
|
||||||
LDFLAGS = -lm
|
|
||||||
endif
|
|
||||||
|
|
||||||
CFLAGS = -Wall -O3 -fno-strength-reduce -fomit-frame-pointer -I$(OPENJPEG_DIR)
|
|
||||||
|
|
||||||
OBJ_DIR_W32 = obj.w32
|
|
||||||
BIN_DIR_W32 = bin.w32
|
|
||||||
LIB_DIR_W32 = $(OPENJPEG_DIR)/lib.w32
|
|
||||||
|
|
||||||
ifdef MINGW32
|
|
||||||
CC = i386-mingw32-gcc
|
|
||||||
CFLAGS += -DDONT_HAVE_GETOPT
|
|
||||||
OBJ_DIR = $(OBJ_DIR_W32)
|
|
||||||
BIN_DIR = $(BIN_DIR_W32)
|
|
||||||
LIB_DIR = lib.w32
|
|
||||||
all: $(BIN_DIR) $(OBJ_DIR) $(LIB_DIR) \
|
|
||||||
$(addprefix $(BIN_DIR)/,j2k_to_image.exe image_to_j2k.exe)
|
|
||||||
else
|
|
||||||
CC = gcc
|
|
||||||
OBJ_DIR = obj
|
|
||||||
BIN_DIR = bin
|
|
||||||
LIB_DIR = lib
|
|
||||||
all: $(BIN_DIR) $(OBJ_DIR) $(LIB_DIR) \
|
|
||||||
$(addprefix $(BIN_DIR)/,j2k_to_image image_to_j2k)
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifdef DYNAMIC
|
|
||||||
ifdef MINGW32
|
|
||||||
LIB_OPENJPEG = $(LIB_DIR)/libopenjpeg.dll
|
|
||||||
LDFLAGS += -L$(LIB_DIR) -lopenjpeg
|
|
||||||
else
|
|
||||||
LIB_OPENJPEG = $(OPENJPEG_DIR)/$(LIB_DIR)/libopenjpeg.so
|
|
||||||
LDFLAGS += -L$(OPENJPEG_DIR)/$(LIB_DIR) -lopenjpeg
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
LIB_OPENJPEG = $(OPENJPEG_DIR)/$(LIB_DIR)/libopenjpeg.a
|
|
||||||
LDFLAGS += $(LIB_OPENJPEG)
|
|
||||||
endif
|
|
||||||
|
|
||||||
$(BIN_DIR):
|
|
||||||
mkdir $(BIN_DIR)
|
|
||||||
|
|
||||||
$(OBJ_DIR):
|
|
||||||
mkdir $(OBJ_DIR)
|
|
||||||
|
|
||||||
$(LIB_DIR):
|
|
||||||
mkdir $(LIB_DIR)
|
|
||||||
|
|
||||||
$(LIB_DIR)/libopenjpeg.dll: $(OPENJPEG_DIR)/$(LIB_DIR)/libopenjpeg.dll
|
|
||||||
ln -sf ../$< $@
|
|
||||||
$(OPENJPEG_DIR)/$(LIB_DIR)/libopenjpeg.dll:
|
|
||||||
cd $(OPENJPEG_DIR) && \
|
|
||||||
$(MAKE) $(OBJ_DIR) $(LIB_DIR) $(LIB_DIR)/libopenjpeg.dll
|
|
||||||
$(OPENJPEG_DIR)/$(LIB_DIR)/libopenjpeg.a:
|
|
||||||
cd $(OPENJPEG_DIR) && \
|
|
||||||
$(MAKE) $(OBJ_DIR) $(LIB_DIR) $(LIB_DIR)/libopenjpeg.a
|
|
||||||
$(OPENJPEG_DIR)/$(LIB_DIR)/libopenjpeg.so:
|
|
||||||
cd $(OPENJPEG_DIR) && \
|
|
||||||
$(MAKE) $(LIB_DIR) $(LIB_DIR)/libopenjpeg.so
|
|
||||||
|
|
||||||
$(OBJ_DIR)/%.o:
|
|
||||||
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
|
|
||||||
|
|
||||||
$(OBJ_DIR)/getopt.o: compat/getopt.c
|
|
||||||
$(OBJ_DIR)/convert.o: convert.c
|
|
||||||
$(OBJ_DIR)/j2k_to_image.o: j2k_to_image.c
|
|
||||||
$(OBJ_DIR)/image_to_j2k.o: image_to_j2k.c convert.h
|
|
||||||
|
|
||||||
J2I_OBJS = $(addprefix $(OBJ_DIR)/,j2k_to_image.o)
|
|
||||||
I2J_OBJS = $(addprefix $(OBJ_DIR)/,image_to_j2k.o convert.o)
|
|
||||||
|
|
||||||
$(BIN_DIR)/j2k_to_image: $(J2I_OBJS) $(LIB_OPENJPEG)
|
|
||||||
${CC} -o $@ $(J2I_OBJS) ${LDFLAGS}
|
|
||||||
|
|
||||||
$(BIN_DIR)/image_to_j2k: $(I2J_OBJS) $(LIB_OPENJPEG)
|
|
||||||
${CC} -o $@ $(I2J_OBJS) ${LDFLAGS}
|
|
||||||
|
|
||||||
$(BIN_DIR)/j2k_to_image.exe: $(J2I_OBJS) $(LIB_OPENJPEG)
|
|
||||||
${CC} -o $@ $(J2I_OBJS) ${LDFLAGS}
|
|
||||||
|
|
||||||
$(BIN_DIR)/image_to_j2k.exe: $(I2J_OBJS) $(LIB_OPENJPEG) $(OBJ_DIR)/getopt.o
|
|
||||||
${CC} -o $@ $(I2J_OBJS) ${LDFLAGS} $(OBJ_DIR)/getopt.o
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f $(BIN_DIR_W32)/* $(BIN_DIR)/* $(OBJ_DIR_W32)/* $(OBJ_DIR)/*
|
|
|
@ -1,116 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 1987, 1993, 1994
|
|
||||||
* The Regents of the University of California. All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* 3. All advertising materials mentioning features or use of this software
|
|
||||||
* must display the following acknowledgement:
|
|
||||||
* This product includes software developed by the University of
|
|
||||||
* California, Berkeley and its contributors.
|
|
||||||
* 4. Neither the name of the University nor the names of its contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|
||||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|
||||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
* SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* last review : october 29th, 2002 */
|
|
||||||
|
|
||||||
#if defined(LIBC_SCCS) && !defined(lint)
|
|
||||||
static char sccsid[] = "@(#)getopt.c 8.3 (Berkeley) 4/27/95";
|
|
||||||
#endif /* LIBC_SCCS and not lint */
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
int opterr = 1, /* if error message should be printed */
|
|
||||||
optind = 1, /* index into parent argv vector */
|
|
||||||
optopt, /* character checked for validity */
|
|
||||||
optreset; /* reset getopt */
|
|
||||||
char *optarg; /* argument associated with option */
|
|
||||||
|
|
||||||
#define BADCH (int)'?'
|
|
||||||
#define BADARG (int)':'
|
|
||||||
#define EMSG ""
|
|
||||||
|
|
||||||
/*
|
|
||||||
* getopt --
|
|
||||||
* Parse argc/argv argument vector.
|
|
||||||
*/
|
|
||||||
int getopt(nargc, nargv, ostr)
|
|
||||||
int nargc;
|
|
||||||
char *const *nargv;
|
|
||||||
const char *ostr;
|
|
||||||
{
|
|
||||||
# define __progname nargv[0]
|
|
||||||
static char *place = EMSG; /* option letter processing */
|
|
||||||
char *oli; /* option letter list index */
|
|
||||||
|
|
||||||
if (optreset || !*place) { /* update scanning pointer */
|
|
||||||
optreset = 0;
|
|
||||||
if (optind >= nargc || *(place = nargv[optind]) != '-') {
|
|
||||||
place = EMSG;
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
if (place[1] && *++place == '-') { /* found "--" */
|
|
||||||
++optind;
|
|
||||||
place = EMSG;
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
} /* option letter okay? */
|
|
||||||
if ((optopt = (int) *place++) == (int) ':' ||
|
|
||||||
!(oli = strchr(ostr, optopt))) {
|
|
||||||
/*
|
|
||||||
* if the user didn't specify '-' as an option,
|
|
||||||
* assume it means -1.
|
|
||||||
*/
|
|
||||||
if (optopt == (int) '-')
|
|
||||||
return (-1);
|
|
||||||
if (!*place)
|
|
||||||
++optind;
|
|
||||||
if (opterr && *ostr != ':')
|
|
||||||
(void) fprintf(stderr,
|
|
||||||
"%s: illegal option -- %c\n", __progname, optopt);
|
|
||||||
return (BADCH);
|
|
||||||
}
|
|
||||||
if (*++oli != ':') { /* don't need argument */
|
|
||||||
optarg = NULL;
|
|
||||||
if (!*place)
|
|
||||||
++optind;
|
|
||||||
} else { /* need an argument */
|
|
||||||
if (*place) /* no white space */
|
|
||||||
optarg = place;
|
|
||||||
else if (nargc <= ++optind) { /* no arg */
|
|
||||||
place = EMSG;
|
|
||||||
if (*ostr == ':')
|
|
||||||
return (BADARG);
|
|
||||||
if (opterr)
|
|
||||||
(void) fprintf(stderr,
|
|
||||||
"%s: option requires an argument -- %c\n",
|
|
||||||
__progname, optopt);
|
|
||||||
return (BADCH);
|
|
||||||
} else /* white space */
|
|
||||||
optarg = nargv[optind];
|
|
||||||
place = EMSG;
|
|
||||||
++optind;
|
|
||||||
}
|
|
||||||
return (optopt); /* dump back option letter */
|
|
||||||
}
|
|
|
@ -1,14 +0,0 @@
|
||||||
/* last review : october 29th, 2002 */
|
|
||||||
|
|
||||||
#ifndef _GETOPT_H_
|
|
||||||
#define _GETOPT_H_
|
|
||||||
|
|
||||||
extern int opterr;
|
|
||||||
extern int optind;
|
|
||||||
extern int optopt;
|
|
||||||
extern int optreset;
|
|
||||||
extern char *optarg;
|
|
||||||
|
|
||||||
extern int getopt(int nargc, char *const *nargv, const char *ostr);
|
|
||||||
|
|
||||||
#endif /* _GETOPT_H_ */
|
|
|
@ -1,913 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2003, David Janssens
|
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
|
||||||
* Copyright (c) 2002-2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <openjpeg.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
/* -->> -->> -->> -->>
|
|
||||||
|
|
||||||
BMP IMAGE FORMAT
|
|
||||||
|
|
||||||
<<-- <<-- <<-- <<-- */
|
|
||||||
|
|
||||||
/* UINT2 defines a two byte word */
|
|
||||||
typedef unsigned short int UINT2;
|
|
||||||
|
|
||||||
/* UINT4 defines a four byte word */
|
|
||||||
typedef unsigned long int UINT4;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
UINT2 bfType; /* 'BM' for Bitmap (19776) */
|
|
||||||
UINT4 bfSize; /* Size of the file */
|
|
||||||
UINT2 bfReserved1; /* Reserved : 0 */
|
|
||||||
UINT2 bfReserved2; /* Reserved : 0 */
|
|
||||||
UINT4 bfOffBits; /* Offset */
|
|
||||||
} BITMAPFILEHEADER_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
UINT4 biSize; /* Size of the structure in bytes */
|
|
||||||
UINT4 biWidth; /* Width of the image in pixels */
|
|
||||||
UINT4 biHeight; /* Heigth of the image in pixels */
|
|
||||||
UINT2 biPlanes; /* 1 */
|
|
||||||
UINT2 biBitCount; /* Number of color bits by pixels */
|
|
||||||
UINT4 biCompression; /* Type of encoding 0: none 1: RLE8 2: RLE4 */
|
|
||||||
UINT4 biSizeImage; /* Size of the image in bytes */
|
|
||||||
UINT4 biXpelsPerMeter; /* Horizontal (X) resolution in pixels/meter */
|
|
||||||
UINT4 biYpelsPerMeter; /* Vertical (Y) resolution in pixels/meter */
|
|
||||||
UINT4 biClrUsed; /* Number of color used in the image (0: ALL) */
|
|
||||||
UINT4 biClrImportant; /* Number of important color (0: ALL) */
|
|
||||||
} BITMAPINFOHEADER_t;
|
|
||||||
|
|
||||||
int bmptoimage(char *filename, j2k_image_t * img, int subsampling_dx,
|
|
||||||
int subsampling_dy, int Dim[2])
|
|
||||||
{
|
|
||||||
FILE *IN;
|
|
||||||
FILE *Compo0 = NULL, *Compo1 = NULL, *Compo2 = NULL;
|
|
||||||
BITMAPFILEHEADER_t File_h;
|
|
||||||
BITMAPINFOHEADER_t Info_h;
|
|
||||||
unsigned char *RGB;
|
|
||||||
unsigned char *table_R, *table_G, *table_B;
|
|
||||||
unsigned int j, w, h, PAD, type = 0;
|
|
||||||
|
|
||||||
int i;
|
|
||||||
int gray_scale = 1, not_end_file = 1;
|
|
||||||
|
|
||||||
unsigned int line = 0, col = 0;
|
|
||||||
unsigned char v, v2;
|
|
||||||
UINT4 W, H;
|
|
||||||
|
|
||||||
IN = fopen(filename, "rb");
|
|
||||||
if (!IN) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"\033[0;33mFailed to open %s for reading !!\033[0;39m\n",
|
|
||||||
filename);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
File_h.bfType = getc(IN);
|
|
||||||
File_h.bfType = (getc(IN) << 8) + File_h.bfType;
|
|
||||||
|
|
||||||
if (File_h.bfType != 19778) {
|
|
||||||
printf("Error, not a BMP file!\n");
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
/* FILE HEADER */
|
|
||||||
/* ------------- */
|
|
||||||
File_h.bfSize = getc(IN);
|
|
||||||
File_h.bfSize = (getc(IN) << 8) + File_h.bfSize;
|
|
||||||
File_h.bfSize = (getc(IN) << 16) + File_h.bfSize;
|
|
||||||
File_h.bfSize = (getc(IN) << 24) + File_h.bfSize;
|
|
||||||
|
|
||||||
File_h.bfReserved1 = getc(IN);
|
|
||||||
File_h.bfReserved1 = (getc(IN) << 8) + File_h.bfReserved1;
|
|
||||||
|
|
||||||
File_h.bfReserved2 = getc(IN);
|
|
||||||
File_h.bfReserved2 = (getc(IN) << 8) + File_h.bfReserved2;
|
|
||||||
|
|
||||||
File_h.bfOffBits = getc(IN);
|
|
||||||
File_h.bfOffBits = (getc(IN) << 8) + File_h.bfOffBits;
|
|
||||||
File_h.bfOffBits = (getc(IN) << 16) + File_h.bfOffBits;
|
|
||||||
File_h.bfOffBits = (getc(IN) << 24) + File_h.bfOffBits;
|
|
||||||
|
|
||||||
/* INFO HEADER */
|
|
||||||
/* ------------- */
|
|
||||||
|
|
||||||
Info_h.biSize = getc(IN);
|
|
||||||
Info_h.biSize = (getc(IN) << 8) + Info_h.biSize;
|
|
||||||
Info_h.biSize = (getc(IN) << 16) + Info_h.biSize;
|
|
||||||
Info_h.biSize = (getc(IN) << 24) + Info_h.biSize;
|
|
||||||
|
|
||||||
Info_h.biWidth = getc(IN);
|
|
||||||
Info_h.biWidth = (getc(IN) << 8) + Info_h.biWidth;
|
|
||||||
Info_h.biWidth = (getc(IN) << 16) + Info_h.biWidth;
|
|
||||||
Info_h.biWidth = (getc(IN) << 24) + Info_h.biWidth;
|
|
||||||
w = Info_h.biWidth;
|
|
||||||
|
|
||||||
Info_h.biHeight = getc(IN);
|
|
||||||
Info_h.biHeight = (getc(IN) << 8) + Info_h.biHeight;
|
|
||||||
Info_h.biHeight = (getc(IN) << 16) + Info_h.biHeight;
|
|
||||||
Info_h.biHeight = (getc(IN) << 24) + Info_h.biHeight;
|
|
||||||
h = Info_h.biHeight;
|
|
||||||
|
|
||||||
Info_h.biPlanes = getc(IN);
|
|
||||||
Info_h.biPlanes = (getc(IN) << 8) + Info_h.biPlanes;
|
|
||||||
|
|
||||||
Info_h.biBitCount = getc(IN);
|
|
||||||
Info_h.biBitCount = (getc(IN) << 8) + Info_h.biBitCount;
|
|
||||||
|
|
||||||
Info_h.biCompression = getc(IN);
|
|
||||||
Info_h.biCompression = (getc(IN) << 8) + Info_h.biCompression;
|
|
||||||
Info_h.biCompression = (getc(IN) << 16) + Info_h.biCompression;
|
|
||||||
Info_h.biCompression = (getc(IN) << 24) + Info_h.biCompression;
|
|
||||||
|
|
||||||
Info_h.biSizeImage = getc(IN);
|
|
||||||
Info_h.biSizeImage = (getc(IN) << 8) + Info_h.biSizeImage;
|
|
||||||
Info_h.biSizeImage = (getc(IN) << 16) + Info_h.biSizeImage;
|
|
||||||
Info_h.biSizeImage = (getc(IN) << 24) + Info_h.biSizeImage;
|
|
||||||
|
|
||||||
Info_h.biXpelsPerMeter = getc(IN);
|
|
||||||
Info_h.biXpelsPerMeter = (getc(IN) << 8) + Info_h.biXpelsPerMeter;
|
|
||||||
Info_h.biXpelsPerMeter = (getc(IN) << 16) + Info_h.biXpelsPerMeter;
|
|
||||||
Info_h.biXpelsPerMeter = (getc(IN) << 24) + Info_h.biXpelsPerMeter;
|
|
||||||
|
|
||||||
Info_h.biYpelsPerMeter = getc(IN);
|
|
||||||
Info_h.biYpelsPerMeter = (getc(IN) << 8) + Info_h.biYpelsPerMeter;
|
|
||||||
Info_h.biYpelsPerMeter = (getc(IN) << 16) + Info_h.biYpelsPerMeter;
|
|
||||||
Info_h.biYpelsPerMeter = (getc(IN) << 24) + Info_h.biYpelsPerMeter;
|
|
||||||
|
|
||||||
Info_h.biClrUsed = getc(IN);
|
|
||||||
Info_h.biClrUsed = (getc(IN) << 8) + Info_h.biClrUsed;
|
|
||||||
Info_h.biClrUsed = (getc(IN) << 16) + Info_h.biClrUsed;
|
|
||||||
Info_h.biClrUsed = (getc(IN) << 24) + Info_h.biClrUsed;
|
|
||||||
|
|
||||||
Info_h.biClrImportant = getc(IN);
|
|
||||||
Info_h.biClrImportant = (getc(IN) << 8) + Info_h.biClrImportant;
|
|
||||||
Info_h.biClrImportant = (getc(IN) << 16) + Info_h.biClrImportant;
|
|
||||||
Info_h.biClrImportant = (getc(IN) << 24) + Info_h.biClrImportant;
|
|
||||||
|
|
||||||
/* Read the data and store them in the OUT file */
|
|
||||||
|
|
||||||
if (Info_h.biBitCount == 24) {
|
|
||||||
img->x0 = Dim[0];
|
|
||||||
img->y0 = Dim[1];
|
|
||||||
img->x1 =
|
|
||||||
!Dim[0] ? (w - 1) * subsampling_dx + 1 : Dim[0] + (w -
|
|
||||||
1) *
|
|
||||||
subsampling_dx + 1;
|
|
||||||
img->y1 =
|
|
||||||
!Dim[1] ? (h - 1) * subsampling_dy + 1 : Dim[1] + (h -
|
|
||||||
1) *
|
|
||||||
subsampling_dy + 1;
|
|
||||||
img->numcomps = 3;
|
|
||||||
img->color_space = 1;
|
|
||||||
img->comps =
|
|
||||||
(j2k_comp_t *) malloc(img->numcomps * sizeof(j2k_comp_t));
|
|
||||||
for (i = 0; i < img->numcomps; i++) {
|
|
||||||
img->comps[i].prec = 8;
|
|
||||||
img->comps[i].bpp = 8;
|
|
||||||
img->comps[i].sgnd = 0;
|
|
||||||
img->comps[i].dx = subsampling_dx;
|
|
||||||
img->comps[i].dy = subsampling_dy;
|
|
||||||
}
|
|
||||||
Compo0 = fopen("Compo0", "wb");
|
|
||||||
if (!Compo0) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"\033[0;33mFailed to open Compo0 for writing !\033[0;39m\n");
|
|
||||||
}
|
|
||||||
Compo1 = fopen("Compo1", "wb");
|
|
||||||
if (!Compo1) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"\033[0;33mFailed to open Compo1 for writing !\033[0;39m\n");
|
|
||||||
}
|
|
||||||
Compo2 = fopen("Compo2", "wb");
|
|
||||||
if (!Compo2) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"\033[0;33mFailed to open Compo2 for writing !\033[0;39m\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Place the cursor at the beginning of the image information */
|
|
||||||
fseek(IN, 0, SEEK_SET);
|
|
||||||
fseek(IN, File_h.bfOffBits, SEEK_SET);
|
|
||||||
|
|
||||||
W = Info_h.biWidth;
|
|
||||||
H = Info_h.biHeight;
|
|
||||||
|
|
||||||
// PAD = 4 - (3 * W) % 4;
|
|
||||||
// PAD = (PAD == 4) ? 0 : PAD;
|
|
||||||
PAD = (3 * W) % 4 ? 4 - (3 * W) % 4 : 0;
|
|
||||||
|
|
||||||
|
|
||||||
RGB =
|
|
||||||
(unsigned char *) malloc((3 * W + PAD) * H *
|
|
||||||
sizeof(unsigned char));
|
|
||||||
|
|
||||||
fread(RGB, sizeof(unsigned char), (3 * W + PAD) * H, IN);
|
|
||||||
|
|
||||||
for (j = 0; j < (3 * W + PAD) * H; j++) {
|
|
||||||
unsigned char elmt;
|
|
||||||
int Wp = 3 * W + PAD;
|
|
||||||
|
|
||||||
elmt = RGB[(H - (j / Wp + 1)) * Wp + j % Wp];
|
|
||||||
if ((j % Wp) < (3 * W)) {
|
|
||||||
switch (type) {
|
|
||||||
case 0:
|
|
||||||
fprintf(Compo2, "%c", elmt);
|
|
||||||
type = 1;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
fprintf(Compo1, "%c", elmt);
|
|
||||||
type = 2;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
fprintf(Compo0, "%c", elmt);
|
|
||||||
type = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fclose(Compo0);
|
|
||||||
fclose(Compo1);
|
|
||||||
fclose(Compo2);
|
|
||||||
free(RGB);
|
|
||||||
} else if (Info_h.biBitCount == 8 && Info_h.biCompression == 0) {
|
|
||||||
img->x0 = Dim[0];
|
|
||||||
img->y0 = Dim[1];
|
|
||||||
img->x1 =
|
|
||||||
!Dim[0] ? (w - 1) * subsampling_dx + 1 : Dim[0] + (w -
|
|
||||||
1) *
|
|
||||||
subsampling_dx + 1;
|
|
||||||
img->y1 =
|
|
||||||
!Dim[1] ? (h - 1) * subsampling_dy + 1 : Dim[1] + (h -
|
|
||||||
1) *
|
|
||||||
subsampling_dy + 1;
|
|
||||||
|
|
||||||
table_R = (unsigned char *) malloc(256 * sizeof(unsigned char));
|
|
||||||
table_G = (unsigned char *) malloc(256 * sizeof(unsigned char));
|
|
||||||
table_B = (unsigned char *) malloc(256 * sizeof(unsigned char));
|
|
||||||
|
|
||||||
for (j = 0; j < Info_h.biClrUsed; j++) {
|
|
||||||
table_B[j] = getc(IN);
|
|
||||||
table_G[j] = getc(IN);
|
|
||||||
table_R[j] = getc(IN);
|
|
||||||
getc(IN);
|
|
||||||
if (table_R[j] != table_G[j] && table_R[j] != table_B[j]
|
|
||||||
&& table_G[j] != table_B[j])
|
|
||||||
gray_scale = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Place the cursor at the beginning of the image information */
|
|
||||||
fseek(IN, 0, SEEK_SET);
|
|
||||||
fseek(IN, File_h.bfOffBits, SEEK_SET);
|
|
||||||
|
|
||||||
W = Info_h.biWidth;
|
|
||||||
H = Info_h.biHeight;
|
|
||||||
if (Info_h.biWidth % 2)
|
|
||||||
W++;
|
|
||||||
|
|
||||||
RGB = (unsigned char *) malloc(W * H * sizeof(unsigned char));
|
|
||||||
|
|
||||||
fread(RGB, sizeof(unsigned char), W * H, IN);
|
|
||||||
if (gray_scale) {
|
|
||||||
img->numcomps = 1;
|
|
||||||
img->comps =
|
|
||||||
(j2k_comp_t *) malloc(img->numcomps * sizeof(j2k_comp_t));
|
|
||||||
img->comps[0].prec = 8;
|
|
||||||
img->comps[0].bpp = 8;
|
|
||||||
img->comps[0].sgnd = 0;
|
|
||||||
img->comps[0].dx = subsampling_dx;
|
|
||||||
img->comps[0].dy = subsampling_dy;
|
|
||||||
Compo0 = fopen("Compo0", "wb");
|
|
||||||
if (!Compo0) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"\033[0;33mFailed to open Compo0 for writing !\033[0;39m\n");
|
|
||||||
}
|
|
||||||
for (j = 0; j < W * H; j++) {
|
|
||||||
if ((j % W < W - 1 && Info_h.biWidth % 2)
|
|
||||||
|| !(Info_h.biWidth % 2))
|
|
||||||
fprintf(Compo0, "%c",
|
|
||||||
table_R[RGB[W * H - ((j) / (W) + 1) * W + (j) % (W)]]);
|
|
||||||
}
|
|
||||||
fclose(Compo0);
|
|
||||||
} else {
|
|
||||||
img->numcomps = 3;
|
|
||||||
img->comps =
|
|
||||||
(j2k_comp_t *) malloc(img->numcomps * sizeof(j2k_comp_t));
|
|
||||||
for (i = 0; i < img->numcomps; i++) {
|
|
||||||
img->comps[i].prec = 8;
|
|
||||||
img->comps[i].bpp = 8;
|
|
||||||
img->comps[i].sgnd = 0;
|
|
||||||
img->comps[i].dx = subsampling_dx;
|
|
||||||
img->comps[i].dy = subsampling_dy;
|
|
||||||
}
|
|
||||||
|
|
||||||
Compo0 = fopen("Compo0", "wb");
|
|
||||||
if (!Compo0) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"\033[0;33mFailed to open Compo0 for writing !\033[0;39m\n");
|
|
||||||
}
|
|
||||||
Compo1 = fopen("Compo1", "wb");
|
|
||||||
if (!Compo1) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"\033[0;33mFailed to open Compo1 for writing !\033[0;39m\n");
|
|
||||||
}
|
|
||||||
Compo2 = fopen("Compo2", "wb");
|
|
||||||
if (!Compo2) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"\033[0;33mFailed to open Compo2 for writing !\033[0;39m\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
for (j = 0; j < W * H; j++) {
|
|
||||||
if ((j % W < W - 1 && Info_h.biWidth % 2)
|
|
||||||
|| !(Info_h.biWidth % 2)) {
|
|
||||||
fprintf(Compo0, "%c",
|
|
||||||
table_R[RGB[W * H - ((j) / (W) + 1) * W + (j) % (W)]]);
|
|
||||||
fprintf(Compo1, "%c",
|
|
||||||
table_G[RGB[W * H - ((j) / (W) + 1) * W + (j) % (W)]]);
|
|
||||||
fprintf(Compo2, "%c",
|
|
||||||
table_B[RGB[W * H - ((j) / (W) + 1) * W + (j) % (W)]]);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
fclose(Compo0);
|
|
||||||
fclose(Compo1);
|
|
||||||
fclose(Compo2);
|
|
||||||
}
|
|
||||||
free(RGB);
|
|
||||||
|
|
||||||
} else if (Info_h.biBitCount == 8 && Info_h.biCompression == 1) {
|
|
||||||
img->x0 = Dim[0];
|
|
||||||
img->y0 = Dim[1];
|
|
||||||
img->x1 =
|
|
||||||
!Dim[0] ? (w - 1) * subsampling_dx + 1 : Dim[0] + (w -
|
|
||||||
1) *
|
|
||||||
subsampling_dx + 1;
|
|
||||||
img->y1 =
|
|
||||||
!Dim[1] ? (h - 1) * subsampling_dy + 1 : Dim[1] + (h -
|
|
||||||
1) *
|
|
||||||
subsampling_dy + 1;
|
|
||||||
|
|
||||||
table_R = (unsigned char *) malloc(256 * sizeof(unsigned char));
|
|
||||||
table_G = (unsigned char *) malloc(256 * sizeof(unsigned char));
|
|
||||||
table_B = (unsigned char *) malloc(256 * sizeof(unsigned char));
|
|
||||||
|
|
||||||
for (j = 0; j < Info_h.biClrUsed; j++) {
|
|
||||||
table_B[j] = getc(IN);
|
|
||||||
table_G[j] = getc(IN);
|
|
||||||
table_R[j] = getc(IN);
|
|
||||||
getc(IN);
|
|
||||||
if (table_R[j] != table_G[j] && table_R[j] != table_B[j]
|
|
||||||
&& table_G[j] != table_B[j])
|
|
||||||
gray_scale = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Place the cursor at the beginning of the image information */
|
|
||||||
fseek(IN, 0, SEEK_SET);
|
|
||||||
fseek(IN, File_h.bfOffBits, SEEK_SET);
|
|
||||||
|
|
||||||
if (gray_scale) {
|
|
||||||
img->numcomps = 1;
|
|
||||||
img->comps = (j2k_comp_t *) malloc(sizeof(j2k_comp_t));
|
|
||||||
img->comps[0].prec = 8;
|
|
||||||
img->comps[0].bpp = 8;
|
|
||||||
img->comps[0].sgnd = 0;
|
|
||||||
img->comps[0].dx = subsampling_dx;
|
|
||||||
img->comps[0].dy = subsampling_dy;
|
|
||||||
Compo0 = fopen("Compo0", "wb");
|
|
||||||
if (!Compo0) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"\033[0;33mFailed to open Compo0 for writing !\033[0;39m\n");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
img->numcomps = 3;
|
|
||||||
img->comps =
|
|
||||||
(j2k_comp_t *) malloc(img->numcomps * sizeof(j2k_comp_t));
|
|
||||||
for (i = 0; i < img->numcomps; i++) {
|
|
||||||
img->comps[i].prec = 8;
|
|
||||||
img->comps[i].bpp = 8;
|
|
||||||
img->comps[i].sgnd = 0;
|
|
||||||
img->comps[i].dx = subsampling_dx;
|
|
||||||
img->comps[i].dy = subsampling_dy;
|
|
||||||
}
|
|
||||||
Compo0 = fopen("Compo0", "wb");
|
|
||||||
if (!Compo0) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"\033[0;33mFailed to open Compo0 for writing !\033[0;39m\n");
|
|
||||||
}
|
|
||||||
Compo1 = fopen("Compo1", "wb");
|
|
||||||
if (!Compo1) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"\033[0;33mFailed to open Compo1 for writing !\033[0;39m\n");
|
|
||||||
}
|
|
||||||
Compo2 = fopen("Compo2", "wb");
|
|
||||||
if (!Compo2) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"\033[0;33mFailed to open Compo2 for writing !\033[0;39m\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
RGB =
|
|
||||||
(unsigned char *) malloc(Info_h.biWidth * Info_h.biHeight *
|
|
||||||
sizeof(unsigned char));
|
|
||||||
|
|
||||||
while (not_end_file) {
|
|
||||||
v = getc(IN);
|
|
||||||
if (v) {
|
|
||||||
v2 = getc(IN);
|
|
||||||
for (i = 0; i < (int) v; i++) {
|
|
||||||
RGB[line * Info_h.biWidth + col] = v2;
|
|
||||||
col++;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
v = getc(IN);
|
|
||||||
switch (v) {
|
|
||||||
case 0:
|
|
||||||
col = 0;
|
|
||||||
line++;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
line++;
|
|
||||||
not_end_file = 0;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
printf("No Delta supported\n");
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
for (i = 0; i < v; i++) {
|
|
||||||
v2 = getc(IN);
|
|
||||||
RGB[line * Info_h.biWidth + col] = v2;
|
|
||||||
col++;
|
|
||||||
}
|
|
||||||
if (v % 2)
|
|
||||||
v2 = getc(IN);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (gray_scale) {
|
|
||||||
for (line = 0; line < Info_h.biHeight; line++)
|
|
||||||
for (col = 0; col < Info_h.biWidth; col++)
|
|
||||||
fprintf(Compo0, "%c", table_R[(int)
|
|
||||||
RGB[(Info_h.biHeight - line -
|
|
||||||
1) * Info_h.biWidth +
|
|
||||||
col]]);
|
|
||||||
fclose(Compo0);
|
|
||||||
} else {
|
|
||||||
for (line = 0; line < Info_h.biHeight; line++)
|
|
||||||
for (col = 0; col < Info_h.biWidth; col++) {
|
|
||||||
fprintf(Compo0, "%c", table_R[(int)
|
|
||||||
RGB[(Info_h.biHeight - line -
|
|
||||||
1) * Info_h.biWidth +
|
|
||||||
col]]);
|
|
||||||
fprintf(Compo1, "%c", table_G[(int)
|
|
||||||
RGB[(Info_h.biHeight - line -
|
|
||||||
1) * Info_h.biWidth +
|
|
||||||
col]]);
|
|
||||||
fprintf(Compo2, "%c", table_B[(int)
|
|
||||||
RGB[(Info_h.biHeight - line -
|
|
||||||
1) * Info_h.biWidth +
|
|
||||||
col]]);
|
|
||||||
}
|
|
||||||
fclose(Compo0);
|
|
||||||
fclose(Compo1);
|
|
||||||
fclose(Compo2);
|
|
||||||
}
|
|
||||||
free(RGB);
|
|
||||||
} else
|
|
||||||
fprintf(stderr,
|
|
||||||
"Other system than 24 bits/pixels or 8 bits (no RLE coding) is not yet implemented [%d]\n",
|
|
||||||
Info_h.biBitCount);
|
|
||||||
|
|
||||||
fclose(IN);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -->> -->> -->> -->>
|
|
||||||
|
|
||||||
PGX IMAGE FORMAT
|
|
||||||
|
|
||||||
<<-- <<-- <<-- <<-- */
|
|
||||||
|
|
||||||
|
|
||||||
unsigned char readuchar(FILE * f)
|
|
||||||
{
|
|
||||||
unsigned char c1;
|
|
||||||
fread(&c1, 1, 1, f);
|
|
||||||
return c1;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned short readushort(FILE * f, int bigendian)
|
|
||||||
{
|
|
||||||
unsigned char c1, c2;
|
|
||||||
fread(&c1, 1, 1, f);
|
|
||||||
fread(&c2, 1, 1, f);
|
|
||||||
if (bigendian)
|
|
||||||
return (c1 << 8) + c2;
|
|
||||||
else
|
|
||||||
return (c2 << 8) + c1;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int readuint(FILE * f, int bigendian)
|
|
||||||
{
|
|
||||||
unsigned char c1, c2, c3, c4;
|
|
||||||
fread(&c1, 1, 1, f);
|
|
||||||
fread(&c2, 1, 1, f);
|
|
||||||
fread(&c3, 1, 1, f);
|
|
||||||
fread(&c4, 1, 1, f);
|
|
||||||
if (bigendian)
|
|
||||||
return (c1 << 24) + (c2 << 16) + (c3 << 8) + c4;
|
|
||||||
else
|
|
||||||
return (c4 << 24) + (c3 << 16) + (c2 << 8) + c1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int pgxtoimage(char *filename, j2k_image_t * img, int tdy,
|
|
||||||
int subsampling_dx, int subsampling_dy, int Dim[2],
|
|
||||||
j2k_cp_t cp)
|
|
||||||
{
|
|
||||||
FILE *f;
|
|
||||||
int w, h, prec;
|
|
||||||
int i, compno, bandno;
|
|
||||||
char str[256], endian[16];
|
|
||||||
char sign;
|
|
||||||
int bigendian;
|
|
||||||
j2k_comp_t *comp;
|
|
||||||
|
|
||||||
img->numcomps = 1;
|
|
||||||
img->color_space = 2;
|
|
||||||
img->comps = (j2k_comp_t *) malloc(img->numcomps * sizeof(j2k_comp_t));
|
|
||||||
for (compno = 0; compno < img->numcomps; compno++) {
|
|
||||||
FILE *src;
|
|
||||||
char tmp[16];
|
|
||||||
int max = 0;
|
|
||||||
int Y1;
|
|
||||||
comp = &img->comps[compno];
|
|
||||||
sprintf(str, "%s", filename);
|
|
||||||
f = fopen(str, "rb");
|
|
||||||
if (!f) {
|
|
||||||
fprintf(stderr, "Failed to open %s for reading !\n", str);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (fscanf(f, "PG %s %c %d %d %d", endian, &sign, &prec, &w, &h) == 5) {
|
|
||||||
fgetc(f);
|
|
||||||
if (!strcmp(endian, "ML"))
|
|
||||||
bigendian = 1;
|
|
||||||
else
|
|
||||||
bigendian = 0;
|
|
||||||
if (compno == 0) {
|
|
||||||
img->x0 = Dim[0];
|
|
||||||
img->y0 = Dim[1];
|
|
||||||
img->x1 =
|
|
||||||
!Dim[0] ? (w - 1) * subsampling_dx + 1 : Dim[0] + (w -
|
|
||||||
1) *
|
|
||||||
subsampling_dx + 1;
|
|
||||||
img->y1 =
|
|
||||||
!Dim[1] ? (h - 1) * subsampling_dy + 1 : Dim[1] + (h -
|
|
||||||
1) *
|
|
||||||
subsampling_dy + 1;
|
|
||||||
} else {
|
|
||||||
if (w != img->x1 || h != img->y1)
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sign == '-') {
|
|
||||||
comp->sgnd = 1;
|
|
||||||
} else {
|
|
||||||
comp->sgnd = 0;
|
|
||||||
}
|
|
||||||
comp->prec = prec;
|
|
||||||
comp->dx = subsampling_dx;
|
|
||||||
comp->dy = subsampling_dy;
|
|
||||||
bandno = 1;
|
|
||||||
|
|
||||||
Y1 = cp.ty0 + bandno * cp.tdy <
|
|
||||||
img->y1 ? cp.ty0 + bandno * cp.tdy : img->y1;
|
|
||||||
Y1 -= img->y0;
|
|
||||||
|
|
||||||
sprintf(tmp, "bandtile%d", bandno); /* bandtile file */
|
|
||||||
src = fopen(tmp, "wb");
|
|
||||||
if (!src) {
|
|
||||||
fprintf(stderr, "failed to open %s for writing !\n", tmp);
|
|
||||||
}
|
|
||||||
for (i = 0; i < w * h; i++) {
|
|
||||||
int v;
|
|
||||||
if (i == Y1 * w / subsampling_dy && tdy != -1) { /* bandtile is full */
|
|
||||||
fclose(src);
|
|
||||||
bandno++;
|
|
||||||
sprintf(tmp, "bandtile%d", bandno);
|
|
||||||
src = fopen(tmp, "wb");
|
|
||||||
if (!src) {
|
|
||||||
fprintf(stderr, "failed to open %s for writing !\n", tmp);
|
|
||||||
}
|
|
||||||
Y1 = cp.ty0 + bandno * cp.tdy <
|
|
||||||
img->y1 ? cp.ty0 + bandno * cp.tdy : img->y1;
|
|
||||||
Y1 -= img->y0;
|
|
||||||
}
|
|
||||||
if (comp->prec <= 8) {
|
|
||||||
if (!comp->sgnd) {
|
|
||||||
v = readuchar(f);
|
|
||||||
} else {
|
|
||||||
v = (char) readuchar(f);
|
|
||||||
}
|
|
||||||
} else if (comp->prec <= 16) {
|
|
||||||
if (!comp->sgnd) {
|
|
||||||
v = readushort(f, bigendian);
|
|
||||||
} else {
|
|
||||||
v = (short) readushort(f, bigendian);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (!comp->sgnd) {
|
|
||||||
v = readuint(f, bigendian);
|
|
||||||
} else {
|
|
||||||
v = (int) readuint(f, bigendian);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (v > max)
|
|
||||||
max = v;
|
|
||||||
fprintf(src, "%d ", v);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
fclose(f);
|
|
||||||
fclose(src);
|
|
||||||
comp->bpp = int_floorlog2(max) + 1;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -->> -->> -->> -->>
|
|
||||||
|
|
||||||
PNM IMAGE FORMAT
|
|
||||||
|
|
||||||
<<-- <<-- <<-- <<-- */
|
|
||||||
|
|
||||||
int pnmtoimage(char *filename, j2k_image_t * img, int subsampling_dx,
|
|
||||||
int subsampling_dy, int Dim[2])
|
|
||||||
{
|
|
||||||
FILE *f;
|
|
||||||
FILE *Compo0, *Compo1, *Compo2;
|
|
||||||
int w, h;
|
|
||||||
int i;
|
|
||||||
char value;
|
|
||||||
char comment[256];
|
|
||||||
|
|
||||||
f = fopen(filename, "rb");
|
|
||||||
if (!f) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"\033[0;33mFailed to open %s for reading !!\033[0;39m\n",
|
|
||||||
filename);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fgetc(f) != 'P')
|
|
||||||
return 0;
|
|
||||||
value = fgetc(f);
|
|
||||||
|
|
||||||
if (value == '2') {
|
|
||||||
fgetc(f);
|
|
||||||
if (fgetc(f) == '#') {
|
|
||||||
fseek(f, 0, SEEK_SET);
|
|
||||||
fscanf(f, "P2\n");
|
|
||||||
fgets(comment, 256, f);
|
|
||||||
fscanf(f, "%d %d\n255", &w, &h);
|
|
||||||
} else {
|
|
||||||
fseek(f, 0, SEEK_SET);
|
|
||||||
fscanf(f, "P2\n%d %d\n255", &w, &h);
|
|
||||||
}
|
|
||||||
|
|
||||||
fgetc(f);
|
|
||||||
img->x0 = Dim[0];
|
|
||||||
img->y0 = Dim[1];
|
|
||||||
img->x1 =
|
|
||||||
!Dim[0] ? (w - 1) * subsampling_dx + 1 : Dim[0] + (w -
|
|
||||||
1) *
|
|
||||||
subsampling_dx + 1;
|
|
||||||
img->y1 =
|
|
||||||
!Dim[1] ? (h - 1) * subsampling_dy + 1 : Dim[1] + (h -
|
|
||||||
1) *
|
|
||||||
subsampling_dy + 1;
|
|
||||||
|
|
||||||
img->numcomps = 1;
|
|
||||||
img->color_space = 2;
|
|
||||||
img->comps = (j2k_comp_t *) malloc(sizeof(j2k_comp_t));
|
|
||||||
img->comps[0].prec = 8;
|
|
||||||
img->comps[0].bpp = 8;
|
|
||||||
img->comps[0].sgnd = 0;
|
|
||||||
img->comps[0].dx = subsampling_dx;
|
|
||||||
img->comps[0].dy = subsampling_dy;
|
|
||||||
|
|
||||||
Compo0 = fopen("Compo0", "wb");
|
|
||||||
if (!Compo0) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"\033[0;33mFailed to open Compo0 for writing !\033[0;39m\n");
|
|
||||||
}
|
|
||||||
for (i = 0; i < w * h; i++) {
|
|
||||||
unsigned int l;
|
|
||||||
fscanf(f, "%d", &l);
|
|
||||||
fprintf(Compo0, "%c", l);
|
|
||||||
}
|
|
||||||
fclose(Compo0);
|
|
||||||
} else if (value == '5') {
|
|
||||||
fgetc(f);
|
|
||||||
if (fgetc(f) == '#') {
|
|
||||||
fseek(f, 0, SEEK_SET);
|
|
||||||
fscanf(f, "P5\n");
|
|
||||||
fgets(comment, 256, f);
|
|
||||||
fscanf(f, "%d %d\n255", &w, &h);
|
|
||||||
} else {
|
|
||||||
fseek(f, 0, SEEK_SET);
|
|
||||||
fscanf(f, "P5\n%d %d\n255", &w, &h);
|
|
||||||
}
|
|
||||||
|
|
||||||
fgetc(f);
|
|
||||||
img->x0 = Dim[0];
|
|
||||||
img->y0 = Dim[1];
|
|
||||||
img->x1 =
|
|
||||||
!Dim[0] ? (w - 1) * subsampling_dx + 1 : Dim[0] + (w -
|
|
||||||
1) *
|
|
||||||
subsampling_dx + 1;
|
|
||||||
img->y1 =
|
|
||||||
!Dim[1] ? (h - 1) * subsampling_dy + 1 : Dim[1] + (h -
|
|
||||||
1) *
|
|
||||||
subsampling_dy + 1;
|
|
||||||
|
|
||||||
img->numcomps = 1;
|
|
||||||
img->color_space = 2;
|
|
||||||
img->comps = (j2k_comp_t *) malloc(sizeof(j2k_comp_t));
|
|
||||||
img->comps[0].prec = 8;
|
|
||||||
img->comps[0].bpp = 8;
|
|
||||||
img->comps[0].sgnd = 0;
|
|
||||||
img->comps[0].dx = subsampling_dx;
|
|
||||||
img->comps[0].dy = subsampling_dy;
|
|
||||||
Compo0 = fopen("Compo0", "wb");
|
|
||||||
if (!Compo0) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"\033[0;33mFailed to open Compo0 for writing !\033[0;39m\n");
|
|
||||||
}
|
|
||||||
for (i = 0; i < w * h; i++) {
|
|
||||||
unsigned char l;
|
|
||||||
fread(&l, 1, 1, f);
|
|
||||||
fwrite(&l, 1, 1, Compo0);
|
|
||||||
}
|
|
||||||
fclose(Compo0);
|
|
||||||
} else if (value == '3') {
|
|
||||||
fgetc(f);
|
|
||||||
if (fgetc(f) == '#') {
|
|
||||||
fseek(f, 0, SEEK_SET);
|
|
||||||
fscanf(f, "P3\n");
|
|
||||||
fgets(comment, 256, f);
|
|
||||||
fscanf(f, "%d %d\n255", &w, &h);
|
|
||||||
} else {
|
|
||||||
fseek(f, 0, SEEK_SET);
|
|
||||||
fscanf(f, "P3\n%d %d\n255", &w, &h);
|
|
||||||
}
|
|
||||||
|
|
||||||
fgetc(f);
|
|
||||||
img->x0 = Dim[0];
|
|
||||||
img->y0 = Dim[1];
|
|
||||||
img->x1 =
|
|
||||||
!Dim[0] ? (w - 1) * subsampling_dx + 1 : Dim[0] + (w -
|
|
||||||
1) *
|
|
||||||
subsampling_dx + 1;
|
|
||||||
img->y1 =
|
|
||||||
!Dim[1] ? (h - 1) * subsampling_dy + 1 : Dim[1] + (h -
|
|
||||||
1) *
|
|
||||||
subsampling_dy + 1;
|
|
||||||
img->numcomps = 3;
|
|
||||||
img->color_space = 1;
|
|
||||||
img->comps = (j2k_comp_t *) malloc(img->numcomps * sizeof(j2k_comp_t));
|
|
||||||
for (i = 0; i < img->numcomps; i++) {
|
|
||||||
img->comps[i].prec = 8;
|
|
||||||
img->comps[i].bpp = 8;
|
|
||||||
img->comps[i].sgnd = 0;
|
|
||||||
img->comps[i].dx = subsampling_dx;
|
|
||||||
img->comps[i].dy = subsampling_dy;
|
|
||||||
}
|
|
||||||
Compo0 = fopen("Compo0", "wb");
|
|
||||||
if (!Compo0) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"\033[0;33mFailed to open Compo0 for writing !\033[0;39m\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
Compo1 = fopen("Compo1", "wb");
|
|
||||||
if (!Compo1) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"\033[0;33mFailed to open Compo1 for writing !\033[0;39m\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
Compo2 = fopen("Compo2", "wb");
|
|
||||||
if (!Compo2) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"\033[0;33mFailed to open Compo2 for writing !\033[0;39m\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < w * h; i++) {
|
|
||||||
unsigned int r, g, b;
|
|
||||||
fscanf(f, "%d", &r);
|
|
||||||
fscanf(f, "%d", &g);
|
|
||||||
fscanf(f, "%d", &b);
|
|
||||||
fprintf(Compo0, "%c", r);
|
|
||||||
fprintf(Compo1, "%c", g);
|
|
||||||
fprintf(Compo2, "%c", b);
|
|
||||||
}
|
|
||||||
fclose(Compo0);
|
|
||||||
fclose(Compo1);
|
|
||||||
fclose(Compo2);
|
|
||||||
} else if (value == '6') {
|
|
||||||
fgetc(f);
|
|
||||||
if (fgetc(f) == '#') {
|
|
||||||
fseek(f, 0, SEEK_SET);
|
|
||||||
fscanf(f, "P6\n");
|
|
||||||
fgets(comment, 256, f);
|
|
||||||
fscanf(f, "%d %d\n255", &w, &h);
|
|
||||||
} else {
|
|
||||||
fseek(f, 0, SEEK_SET);
|
|
||||||
fscanf(f, "P6\n%d %d\n255", &w, &h);
|
|
||||||
}
|
|
||||||
|
|
||||||
fgetc(f);
|
|
||||||
img->x0 = Dim[0];
|
|
||||||
img->y0 = Dim[1];
|
|
||||||
img->x1 =
|
|
||||||
!Dim[0] ? (w - 1) * subsampling_dx + 1 : Dim[0] + (w -
|
|
||||||
1) *
|
|
||||||
subsampling_dx + 1;
|
|
||||||
img->y1 =
|
|
||||||
!Dim[1] ? (h - 1) * subsampling_dy + 1 : Dim[1] + (h -
|
|
||||||
1) *
|
|
||||||
subsampling_dy + 1;
|
|
||||||
img->numcomps = 3;
|
|
||||||
img->color_space = 1;
|
|
||||||
img->comps = (j2k_comp_t *) malloc(img->numcomps * sizeof(j2k_comp_t));
|
|
||||||
for (i = 0; i < img->numcomps; i++) {
|
|
||||||
img->comps[i].prec = 8;
|
|
||||||
img->comps[i].bpp = 8;
|
|
||||||
img->comps[i].sgnd = 0;
|
|
||||||
img->comps[i].dx = subsampling_dx;
|
|
||||||
img->comps[i].dy = subsampling_dy;
|
|
||||||
}
|
|
||||||
Compo0 = fopen("Compo0", "wb");
|
|
||||||
if (!Compo0) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"\033[0;33mFailed to open Compo0 for writing !\033[0;39m\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
Compo1 = fopen("Compo1", "wb");
|
|
||||||
if (!Compo1) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"\033[0;33mFailed to open Compo1 for writing !\033[0;39m\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
Compo2 = fopen("Compo2", "wb");
|
|
||||||
if (!Compo2) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"\033[0;33mFailed to open Compo2 for writing !\033[0;39m\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < w * h; i++) {
|
|
||||||
unsigned char r, g, b;
|
|
||||||
fread(&r, 1, 1, f);
|
|
||||||
fread(&g, 1, 1, f);
|
|
||||||
fread(&b, 1, 1, f);
|
|
||||||
fwrite(&r, 1, 1, Compo0);
|
|
||||||
fwrite(&g, 1, 1, Compo1);
|
|
||||||
fwrite(&b, 1, 1, Compo2);
|
|
||||||
}
|
|
||||||
fclose(Compo0);
|
|
||||||
fclose(Compo1);
|
|
||||||
fclose(Compo2);
|
|
||||||
} else {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
fclose(f);
|
|
||||||
return 1;
|
|
||||||
}
|
|
|
@ -1,39 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2003, David Janssens
|
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
|
||||||
* Copyright (c) 2002-2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "j2k.h"
|
|
||||||
|
|
||||||
int bmptoimage(char *filename, j2k_image_t * img, int subsampling_dx,
|
|
||||||
int subsampling_dy, int Dim[2]);
|
|
||||||
|
|
||||||
int pgxtoimage(char *filename, j2k_image_t * img, int tdy,
|
|
||||||
int subsampling_dx, int subsampling_dy, int Dim[2],
|
|
||||||
j2k_cp_t cp);
|
|
||||||
|
|
||||||
int pnmtoimage(char *filename, j2k_image_t * img, int subsampling_dx,
|
|
||||||
int subsampling_dy, int Dim[2]);
|
|
|
@ -1,948 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2003, David Janssens
|
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
|
||||||
* Copyright (c) 2002-2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <openjpeg.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <string.h>
|
|
||||||
#ifndef DONT_HAVE_GETOPT
|
|
||||||
#include <getopt.h>
|
|
||||||
#else
|
|
||||||
#include "compat/getopt.h"
|
|
||||||
#endif
|
|
||||||
#include "convert.h"
|
|
||||||
|
|
||||||
|
|
||||||
JPWL_cp_t jpwl_cp;
|
|
||||||
extern info_image info_IM;
|
|
||||||
int use_index;
|
|
||||||
|
|
||||||
void help_display()
|
|
||||||
{
|
|
||||||
printf("HELP\n----\n\n");
|
|
||||||
printf("- the option -help displays the readme.txt file on screen\n\n");
|
|
||||||
|
|
||||||
|
|
||||||
printf("List of parameters for the coder JPEG 2000 :\n");
|
|
||||||
printf("\n");
|
|
||||||
printf
|
|
||||||
("- The markers COD and QCD are writed both of two in the main_header and never appear in the tile_header. The markers in the main header are : SOC SIZ COD QCD COM.\n");
|
|
||||||
printf("\n");
|
|
||||||
printf
|
|
||||||
("- This coder can encode mega image, a test was made on a 24000x24000 pixels color image. You need enough disk space memory (twice the original) to encode the image. (i.e. for a 1.5 Gb image you need a minimum of 3Gb of disk memory)\n");
|
|
||||||
printf("\n");
|
|
||||||
printf("REMARKS :\n");
|
|
||||||
printf("---------\n");
|
|
||||||
printf("\n");
|
|
||||||
printf
|
|
||||||
("* the value of rate enter in the code line is the compression factor !\n");
|
|
||||||
printf("exemple :\n");
|
|
||||||
printf("\n");
|
|
||||||
printf
|
|
||||||
("-r 20,10,1 means quality 1 : compress 20x, quality 2 : compress 10x and quality 3 : compress 1x = lossless\n");
|
|
||||||
printf("\n");
|
|
||||||
printf("By default :\n");
|
|
||||||
printf("------------\n");
|
|
||||||
printf("\n");
|
|
||||||
printf(" * lossless\n");
|
|
||||||
printf(" * 1 tile\n");
|
|
||||||
printf(" * size of precinct 2^15 x 2^15 (means 1 precinct)\n");
|
|
||||||
printf(" * size of code-block 64 x 64\n");
|
|
||||||
printf(" * Number of resolution : 6\n");
|
|
||||||
printf(" * No SOP marker in the codestream\n");
|
|
||||||
printf(" * No EPH marker in the codestream\n");
|
|
||||||
printf(" * No sub-sampling in x and y direction\n");
|
|
||||||
printf(" * No mode switch activated\n");
|
|
||||||
printf(" * progression order : LRCP\n");
|
|
||||||
printf(" * No index file\n");
|
|
||||||
printf(" * No ROI upshifted\n");
|
|
||||||
printf(" * No offset of the origin of the image\n");
|
|
||||||
printf(" * No offset of the origin of the tiles\n");
|
|
||||||
printf(" * Reversible DWT 5-3\n");
|
|
||||||
printf("\n");
|
|
||||||
printf("Parameters :\n");
|
|
||||||
printf("------------\n");
|
|
||||||
printf("\n");
|
|
||||||
printf
|
|
||||||
("-i : source file (-i source.pnm also *.pgm, *.ppm) required\n");
|
|
||||||
printf("\n");
|
|
||||||
printf("-o : destination file (-o dest.j2k or .jp2) required\n");
|
|
||||||
printf("\n");
|
|
||||||
printf("-help : Display the help information optional\n ");
|
|
||||||
printf("\n");
|
|
||||||
printf("-r : different rates (-r 20,10,5) optional\n ");
|
|
||||||
printf("\n");
|
|
||||||
printf("-n : Number of resolution (-n 3) optional\n");
|
|
||||||
printf("\n");
|
|
||||||
printf("-b : size of code block (-b 32,32) optional\n");
|
|
||||||
printf("\n");
|
|
||||||
printf("-c : size of precinct (-c 128,128) optional\n");
|
|
||||||
printf("\n");
|
|
||||||
printf("-t : size of tile (-t 512,512) optional\n");
|
|
||||||
printf("\n");
|
|
||||||
printf
|
|
||||||
("-p : progression order (-p LRCP) [LRCP, RLCP, RPCL, PCRL, CPRL] optional\n");
|
|
||||||
printf("\n");
|
|
||||||
printf
|
|
||||||
("-s : subsampling factor (-s 2,2) [-s X,Y] optional\n");
|
|
||||||
printf("\n");
|
|
||||||
printf
|
|
||||||
("-SOP : write SOP marker before each packet optional\n");
|
|
||||||
printf("\n");
|
|
||||||
printf
|
|
||||||
("-EPH : write EPH marker after each header packet optional\n");
|
|
||||||
printf("\n");
|
|
||||||
printf
|
|
||||||
("-M : mode switch (-M 3) [1=BYPASS(LAZY) 2=RESET 4=RESTART(TERMALL) 8=VSC 16=ERTERM(SEGTERM) 32=SEGMARK(SEGSYM)] optional\n");
|
|
||||||
printf
|
|
||||||
(" for several mode switch you have to add the value of each mode you want\n");
|
|
||||||
printf
|
|
||||||
(" ex : RESTART(4) + RESET(2) + SEGMARK(32) = -M 38\n");
|
|
||||||
printf("\n");
|
|
||||||
printf
|
|
||||||
("-x : Create an index file *.Idx (-x index_name.Idx) optional\n");
|
|
||||||
printf("\n");
|
|
||||||
printf
|
|
||||||
("-ROI:c=%%d,U=%%d : quantization indices upshifted for component c=%%d [%%d = 0,1,2]\n");
|
|
||||||
printf
|
|
||||||
(" with a value of U=%%d [0 <= %%d <= 37] (i.e. -ROI:c=0,U=25) optional\n");
|
|
||||||
printf("\n");
|
|
||||||
printf
|
|
||||||
("-d : offset of the origin of the image (-d 150,300) optional\n");
|
|
||||||
printf("\n");
|
|
||||||
printf
|
|
||||||
("-T : offset of the origin of the tiles (-T 100,75) optional\n");
|
|
||||||
printf("\n");
|
|
||||||
printf("-I : Use the irreversible DWT 9-7 (-I) optional\n");
|
|
||||||
printf("\n");
|
|
||||||
printf("IMPORTANT :\n");
|
|
||||||
printf("-----------\n");
|
|
||||||
printf("\n");
|
|
||||||
printf("* subsampling bigger than 2 can produce error\n");
|
|
||||||
printf("\n");
|
|
||||||
printf("The index file respect the structure below :\n");
|
|
||||||
printf("---------------------------------------------\n");
|
|
||||||
printf("\n");
|
|
||||||
printf("Image_height Image_width\n");
|
|
||||||
printf("progression order\n");
|
|
||||||
printf("Tiles_size_X Tiles_size_Y\n");
|
|
||||||
printf("Components_nb\n");
|
|
||||||
printf("Layers_nb\n");
|
|
||||||
printf("decomposition_levels\n");
|
|
||||||
printf("Precincts_size_X Precincts_size_Y\n");
|
|
||||||
printf("Main_header_end_position\n");
|
|
||||||
printf("Codestream_size\n");
|
|
||||||
printf("Tile0 start_pos end_Theader end_pos\n");
|
|
||||||
printf("Tile1 '' '' ''\n");
|
|
||||||
printf("...\n");
|
|
||||||
printf("TileN '' '' ''\n");
|
|
||||||
printf("Tpacket_0 Tile layer res. comp. prec. start_pos end_pos\n");
|
|
||||||
printf("...\n");
|
|
||||||
printf("Tpacket_M '' '' '' '' '' '' ''\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
int give_progression(char progression[4])
|
|
||||||
{
|
|
||||||
if (progression[0] == 'L' && progression[1] == 'R'
|
|
||||||
&& progression[2] == 'C' && progression[3] == 'P') {
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
if (progression[0] == 'R' && progression[1] == 'L'
|
|
||||||
&& progression[2] == 'C' && progression[3] == 'P') {
|
|
||||||
return 1;
|
|
||||||
} else {
|
|
||||||
if (progression[0] == 'R' && progression[1] == 'P'
|
|
||||||
&& progression[2] == 'C' && progression[3] == 'L') {
|
|
||||||
return 2;
|
|
||||||
} else {
|
|
||||||
if (progression[0] == 'P' && progression[1] == 'C'
|
|
||||||
&& progression[2] == 'R' && progression[3] == 'L') {
|
|
||||||
return 3;
|
|
||||||
} else {
|
|
||||||
if (progression[0] == 'C' && progression[1] == 'P'
|
|
||||||
&& progression[2] == 'R' && progression[3] == 'L') {
|
|
||||||
return 4;
|
|
||||||
} else {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
double dwt_norms_97[4][10] = {
|
|
||||||
{1.000, 1.965, 4.177, 8.403, 16.90, 33.84, 67.69, 135.3, 270.6, 540.9},
|
|
||||||
{2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0},
|
|
||||||
{2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0},
|
|
||||||
{2.080, 3.865, 8.307, 17.18, 34.71, 69.59, 139.3, 278.6, 557.2}
|
|
||||||
};
|
|
||||||
|
|
||||||
int floorlog2(int a)
|
|
||||||
{
|
|
||||||
int l;
|
|
||||||
for (l = 0; a > 1; l++) {
|
|
||||||
a >>= 1;
|
|
||||||
}
|
|
||||||
return l;
|
|
||||||
}
|
|
||||||
|
|
||||||
void encode_stepsize(int stepsize, int numbps, int *expn, int *mant)
|
|
||||||
{
|
|
||||||
int p, n;
|
|
||||||
p = floorlog2(stepsize) - 13;
|
|
||||||
n = 11 - floorlog2(stepsize);
|
|
||||||
*mant = (n < 0 ? stepsize >> -n : stepsize << n) & 0x7ff;
|
|
||||||
*expn = numbps - p;
|
|
||||||
}
|
|
||||||
|
|
||||||
void calc_explicit_stepsizes(j2k_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_97[orient][level];
|
|
||||||
stepsize = (1 << (gain + 1)) / norm;
|
|
||||||
}
|
|
||||||
encode_stepsize((int) floor(stepsize * 8192.0), prec + gain,
|
|
||||||
&tccp->stepsizes[bandno].expn,
|
|
||||||
&tccp->stepsizes[bandno].mant);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
int len;
|
|
||||||
int NumResolution, numD_min; /* NumResolution : number of resolution */
|
|
||||||
int Tile_arg; /* Tile_arg = 0 (not in argument) ou = 1 (in argument) */
|
|
||||||
int CSty; /* CSty : coding style */
|
|
||||||
int Prog_order; /* progression order (default LRCP) */
|
|
||||||
char progression[4];
|
|
||||||
int numpocs, numpocs_tile; /* Number of progression order change (POC) default 0 */
|
|
||||||
int prcw_init[J2K_MAXRLVLS]; /* Initialisation Precinct width */
|
|
||||||
int prch_init[J2K_MAXRLVLS]; /* Initialisation Precinct height */
|
|
||||||
//int prcw_init, prch_init; /* Initialisation precincts' size */
|
|
||||||
int cblockw_init, cblockh_init; /* Initialisation codeblocks' size */
|
|
||||||
int mode, value; /* Mode switch (cblk_style) */
|
|
||||||
int subsampling_dx, subsampling_dy; /* subsampling value for dx and dy */
|
|
||||||
int ROI_compno, ROI_shift; /* region of interrest */
|
|
||||||
int Dim[2]; /* portion of the image coded */
|
|
||||||
int TX0, TY0; /* tile off-set */
|
|
||||||
j2k_image_t img;
|
|
||||||
j2k_cp_t cp, cp_init; /* cp_init is used to initialise in multiple tiles */
|
|
||||||
j2k_tcp_t *tcp, *tcp_init; /* tcp_init is used to initialise in multiple tile */
|
|
||||||
j2k_poc_t POC[32]; /* POC : used in case of Progression order change */
|
|
||||||
j2k_poc_t *tcp_poc;
|
|
||||||
j2k_tccp_t *tccp;
|
|
||||||
|
|
||||||
int i, tileno, j;
|
|
||||||
char *infile = 0;
|
|
||||||
char *outfile = 0;
|
|
||||||
char *index = 0;
|
|
||||||
char *s, S1, S2, S3;
|
|
||||||
int ir = 0;
|
|
||||||
int res_spec = 0; /* For various precinct sizes specification */
|
|
||||||
char sep;
|
|
||||||
char *outbuf, *out;
|
|
||||||
FILE *f;
|
|
||||||
|
|
||||||
|
|
||||||
/* default value */
|
|
||||||
/* ------------- */
|
|
||||||
NumResolution = 6;
|
|
||||||
CSty = 0;
|
|
||||||
cblockw_init = 64;
|
|
||||||
cblockh_init = 64;
|
|
||||||
cp.tw = 1;
|
|
||||||
cp.th = 1;
|
|
||||||
cp.index_on = 0;
|
|
||||||
Prog_order = 0;
|
|
||||||
numpocs = 0;
|
|
||||||
mode = 0;
|
|
||||||
subsampling_dx = 1;
|
|
||||||
subsampling_dy = 1;
|
|
||||||
ROI_compno = -1; /* no ROI */
|
|
||||||
ROI_shift = 0;
|
|
||||||
Dim[0] = 0;
|
|
||||||
Dim[1] = 0;
|
|
||||||
TX0 = 0;
|
|
||||||
TY0 = 0;
|
|
||||||
cp.comment = "Created by OpenJPEG version 0.9";
|
|
||||||
cp.disto_alloc = 0;
|
|
||||||
cp.fixed_alloc = 0;
|
|
||||||
cp.fixed_quality = 0; //add fixed_quality
|
|
||||||
/* img.PPT=0; */
|
|
||||||
|
|
||||||
Tile_arg = 0;
|
|
||||||
cp_init.tcps = (j2k_tcp_t *) malloc(sizeof(j2k_tcp_t)); /* initialisation if only one tile */
|
|
||||||
tcp_init = &cp_init.tcps[0];
|
|
||||||
tcp_init->numlayers = 0;
|
|
||||||
jpwl_cp_init(&jpwl_cp);
|
|
||||||
|
|
||||||
cp.intermed_file=0;
|
|
||||||
use_index=0;
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
int c = getopt(argc, argv,
|
|
||||||
"i:o:r:q:f:t:n:c:b:x:p:s:d:h:P:S:E:M:R:T:C:I:W,F");
|
|
||||||
if (c == -1)
|
|
||||||
break;
|
|
||||||
switch (c) {
|
|
||||||
case 'i': /* IN fill */
|
|
||||||
infile = optarg;
|
|
||||||
s = optarg;
|
|
||||||
while (*s) {
|
|
||||||
s++;
|
|
||||||
}
|
|
||||||
s--;
|
|
||||||
S3 = *s;
|
|
||||||
s--;
|
|
||||||
S2 = *s;
|
|
||||||
s--;
|
|
||||||
S1 = *s;
|
|
||||||
|
|
||||||
if ((S1 == 'p' && S2 == 'g' && S3 == 'x')
|
|
||||||
|| (S1 == 'P' && S2 == 'G' && S3 == 'X')) {
|
|
||||||
cp.image_type = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((S1 == 'p' && S2 == 'n' && S3 == 'm')
|
|
||||||
|| (S1 == 'P' && S2 == 'N' && S3 == 'M')
|
|
||||||
|| (S1 == 'p' && S2 == 'g' && S3 == 'm') || (S1 == 'P'
|
|
||||||
&& S2 == 'G'
|
|
||||||
&& S3 == 'M')
|
|
||||||
|| (S1 == 'P' && S2 == 'P' && S3 == 'M') || (S1 == 'p'
|
|
||||||
&& S2 == 'p'
|
|
||||||
&& S3 == 'm')) {
|
|
||||||
cp.image_type = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((S1 == 'b' && S2 == 'm' && S3 == 'p')
|
|
||||||
|| (S1 == 'B' && S2 == 'M' && S3 == 'P')) {
|
|
||||||
cp.image_type = 2;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
fprintf(stderr,
|
|
||||||
"!! Unrecognized format for infile : %c%c%c [accept only *.pnm, *.pgm, *.ppm, *.pgx or *.bmp] !!\n\n",
|
|
||||||
S1, S2, S3);
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
/* ----------------------------------------------------- */
|
|
||||||
case 'o': /* OUT fill */
|
|
||||||
outfile = optarg;
|
|
||||||
while (*outfile) {
|
|
||||||
outfile++;
|
|
||||||
}
|
|
||||||
outfile--;
|
|
||||||
S3 = *outfile;
|
|
||||||
outfile--;
|
|
||||||
S2 = *outfile;
|
|
||||||
outfile--;
|
|
||||||
S1 = *outfile;
|
|
||||||
|
|
||||||
outfile = optarg;
|
|
||||||
|
|
||||||
if ((S1 == 'j' && S2 == '2' && S3 == 'k') || (S1 == 'J' && S2 == '2' && S3 == 'K'))
|
|
||||||
cp.JPEG2000_format=0;
|
|
||||||
else if ((S1 == 'j' && S2 == 'p' && S3 == '2') || (S1 == 'J' && S2 == 'P' && S3 == '2'))
|
|
||||||
cp.JPEG2000_format=1;
|
|
||||||
else {
|
|
||||||
fprintf(stderr,"Unknown output format image *.%c%c%c [only *.j2k, *.jp2]!! \n",S1,S2,S3);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
break;
|
|
||||||
/* ----------------------------------------------------- */
|
|
||||||
case 'r': /* rates rates/distorsion */
|
|
||||||
s = optarg;
|
|
||||||
while (sscanf(s, "%d", &tcp_init->rates[tcp_init->numlayers])
|
|
||||||
== 1) {
|
|
||||||
tcp_init->numlayers++;
|
|
||||||
while (*s && *s != ',') {
|
|
||||||
s++;
|
|
||||||
}
|
|
||||||
if (!*s)
|
|
||||||
break;
|
|
||||||
s++;
|
|
||||||
}
|
|
||||||
cp.disto_alloc = 1;
|
|
||||||
cp.matrice = NULL;
|
|
||||||
break;
|
|
||||||
/* ----------------------------------------------------- */
|
|
||||||
case 'q': /* add fixed_quality */
|
|
||||||
s = optarg;
|
|
||||||
while (sscanf(s, "%f", &tcp_init->distoratio[tcp_init->numlayers]) ==
|
|
||||||
1) {
|
|
||||||
tcp_init->numlayers++;
|
|
||||||
while (*s && *s != ',') {
|
|
||||||
s++;
|
|
||||||
}
|
|
||||||
if (!*s)
|
|
||||||
break;
|
|
||||||
s++;
|
|
||||||
}
|
|
||||||
cp.fixed_quality = 1;
|
|
||||||
cp.matrice = NULL;
|
|
||||||
break;
|
|
||||||
/* dda */
|
|
||||||
/* ----------------------------------------------------- */
|
|
||||||
case 'f': /* mod fixed_quality (before : -q) */
|
|
||||||
s = optarg;
|
|
||||||
sscanf(s, "%d", &tcp_init->numlayers);
|
|
||||||
s++;
|
|
||||||
if (tcp_init->numlayers > 9)
|
|
||||||
s++;
|
|
||||||
cp.matrice =
|
|
||||||
(int *) malloc(tcp_init->numlayers * NumResolution * 3 *
|
|
||||||
sizeof(int));
|
|
||||||
s = s + 2;
|
|
||||||
for (i = 0; i < tcp_init->numlayers; i++) {
|
|
||||||
tcp_init->rates[i] = 1;
|
|
||||||
sscanf(s, "%d,", &cp.matrice[i * NumResolution * 3]);
|
|
||||||
s += 2;
|
|
||||||
if (cp.matrice[i * NumResolution * 3] > 9)
|
|
||||||
s++;
|
|
||||||
cp.matrice[i * NumResolution * 3 + 1] = 0;
|
|
||||||
cp.matrice[i * NumResolution * 3 + 2] = 0;
|
|
||||||
for (j = 1; j < NumResolution; j++) {
|
|
||||||
sscanf(s, "%d,%d,%d",
|
|
||||||
&cp.matrice[i * NumResolution * 3 + j * 3 + 0],
|
|
||||||
&cp.matrice[i * NumResolution * 3 + j * 3 + 1],
|
|
||||||
&cp.matrice[i * NumResolution * 3 + j * 3 + 2]);
|
|
||||||
s += 6;
|
|
||||||
if (cp.matrice[i * NumResolution * 3 + j * 3] > 9)
|
|
||||||
s++;
|
|
||||||
if (cp.matrice[i * NumResolution * 3 + j * 3 + 1] > 9)
|
|
||||||
s++;
|
|
||||||
if (cp.matrice[i * NumResolution * 3 + j * 3 + 2] > 9)
|
|
||||||
s++;
|
|
||||||
}
|
|
||||||
if (i < tcp_init->numlayers - 1)
|
|
||||||
s++;
|
|
||||||
}
|
|
||||||
cp.fixed_alloc = 1;
|
|
||||||
break;
|
|
||||||
/* ----------------------------------------------------- */
|
|
||||||
case 't': /* tiles */
|
|
||||||
sscanf(optarg, "%d,%d", &cp.tdx, &cp.tdy);
|
|
||||||
Tile_arg = 1;
|
|
||||||
break;
|
|
||||||
/* ----------------------------------------------------- */
|
|
||||||
case 'n': /* resolution */
|
|
||||||
sscanf(optarg, "%d", &NumResolution);
|
|
||||||
break;
|
|
||||||
/* ----------------------------------------------------- */
|
|
||||||
case 'c': /* precinct dimension */
|
|
||||||
s = optarg;
|
|
||||||
do {
|
|
||||||
sep = 0;
|
|
||||||
sscanf(s, "[%d,%d]%c", &prcw_init[res_spec],
|
|
||||||
&prch_init[res_spec], &sep);
|
|
||||||
CSty |= 0x01;
|
|
||||||
res_spec++;
|
|
||||||
s = strpbrk(s, "]") + 2;
|
|
||||||
} while (sep == ',');
|
|
||||||
break;
|
|
||||||
/* ----------------------------------------------------- */
|
|
||||||
case 'b': /* code-block dimension */
|
|
||||||
sscanf(optarg, "%d,%d", &cblockw_init, &cblockh_init);
|
|
||||||
if (cblockw_init * cblockh_init > 4096 || cblockw_init > 1024
|
|
||||||
|| cblockw_init < 4 || cblockh_init > 1024 || cblockh_init < 4) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"!! Size of code_block error (option -b) !!\n\nRestriction :\n * width*height<=4096\n * 4<=width,height<= 1024\n\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
/* ----------------------------------------------------- */
|
|
||||||
case 'x': /* creation of index file */
|
|
||||||
index = optarg;
|
|
||||||
cp.index_on = 1;
|
|
||||||
use_index = 1;
|
|
||||||
break;
|
|
||||||
/* ----------------------------------------------------- */
|
|
||||||
case 'p': /* progression order */
|
|
||||||
s = optarg;
|
|
||||||
for (i = 0; i < 4; i++) {
|
|
||||||
progression[i] = *s;
|
|
||||||
s++;
|
|
||||||
}
|
|
||||||
Prog_order = give_progression(progression);
|
|
||||||
|
|
||||||
if (Prog_order == -1) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"Unrecognized progression order [LRCP, RLCP, RPCL, PCRL, CPRL] !!\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
/* ----------------------------------------------------- */
|
|
||||||
case 's': /* subsampling factor */
|
|
||||||
if (sscanf(optarg, "%d,%d", &subsampling_dx, &subsampling_dy)
|
|
||||||
!= 2) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"'-s' sub-sampling argument error ! [-s dx,dy]\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
/* ----------------------------------------------------- */
|
|
||||||
case 'd': /* coordonnate of the reference grid */
|
|
||||||
if (sscanf(optarg, "%d,%d", &Dim[0], &Dim[1]) != 2) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"-d 'coordonnate of the reference grid' argument error !! [-d x0,y0]\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
/* ----------------------------------------------------- */
|
|
||||||
case 'h': /* Display an help description */
|
|
||||||
help_display();
|
|
||||||
return 0;
|
|
||||||
break;
|
|
||||||
/* ----------------------------------------------------- */
|
|
||||||
case 'P': /* POC */
|
|
||||||
fprintf(stderr, "/----------------------------------\\\n");
|
|
||||||
fprintf(stderr, "| POC option not fully tested !! |\n");
|
|
||||||
fprintf(stderr, "\\----------------------------------/\n");
|
|
||||||
|
|
||||||
s = optarg;
|
|
||||||
while (sscanf(s, "T%d=%d,%d,%d,%d,%d,%s", &POC[numpocs].tile,
|
|
||||||
&POC[numpocs].resno0, &POC[numpocs].compno0,
|
|
||||||
&POC[numpocs].layno1, &POC[numpocs].resno1,
|
|
||||||
&POC[numpocs].compno1, POC[numpocs].progorder) == 7) {
|
|
||||||
POC[numpocs].prg = give_progression(POC[numpocs].progorder);
|
|
||||||
/* POC[numpocs].tile; */
|
|
||||||
numpocs++;
|
|
||||||
while (*s && *s != '/') {
|
|
||||||
s++;
|
|
||||||
}
|
|
||||||
if (!*s)
|
|
||||||
break;
|
|
||||||
s++;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
/* ------------------------------------------------------ */
|
|
||||||
case 'S': /* SOP marker */
|
|
||||||
CSty |= 0x02;
|
|
||||||
break;
|
|
||||||
/* ------------------------------------------------------ */
|
|
||||||
case 'E': /* EPH marker */
|
|
||||||
CSty |= 0x04;
|
|
||||||
break;
|
|
||||||
/* ------------------------------------------------------ */
|
|
||||||
case 'M': /* Mode switch pas tous au point !! */
|
|
||||||
if (sscanf(optarg, "%d", &value) == 1) {
|
|
||||||
for (i = 0; i <= 5; i++) {
|
|
||||||
int cache = value & (1 << i);
|
|
||||||
if (cache)
|
|
||||||
mode |= (1 << i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
/* ------------------------------------------------------ */
|
|
||||||
case 'R': /* ROI */
|
|
||||||
if (sscanf(optarg, "OI:c=%d,U=%d", &ROI_compno, &ROI_shift) != 2) {
|
|
||||||
fprintf(stderr, "ROI error !! [-ROI:c='compno',U='shift']\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
/* ------------------------------------------------------ */
|
|
||||||
case 'T': /* Tile offset */
|
|
||||||
if (sscanf(optarg, "%d,%d", &TX0, &TY0) != 2) {
|
|
||||||
fprintf(stderr, "-T 'tile offset' argument error !! [-T X0,Y0]");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
/* ------------------------------------------------------ */
|
|
||||||
case 'C': /* Add a comment */
|
|
||||||
cp.comment = optarg;
|
|
||||||
break;
|
|
||||||
/* ------------------------------------------------------ */
|
|
||||||
case 'I': /* reversible or not */
|
|
||||||
ir = 1;
|
|
||||||
break;
|
|
||||||
/* ------------------------------------------------------ */
|
|
||||||
case 'W': /* version 0.2 enables only EPC on main header and epb in fixed way*/
|
|
||||||
jpwl_cp.JPWL_on = 1;
|
|
||||||
break;
|
|
||||||
/* ------------------------------------------------------ */
|
|
||||||
case 'F': /* use intermed files*/
|
|
||||||
cp.intermed_file=1;
|
|
||||||
break;
|
|
||||||
/* ------------------------------------------------------ */
|
|
||||||
default:
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cp.tx0 = TX0;
|
|
||||||
cp.ty0 = TY0;
|
|
||||||
|
|
||||||
// inserici i parametri jpwl
|
|
||||||
|
|
||||||
if(jpwl_cp.JPWL_on)
|
|
||||||
get_jpwl_cp(& cp);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Error messages */
|
|
||||||
/* -------------- */
|
|
||||||
if (!infile || !outfile) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"usage: image_to_j2k -i image-file -o j2k/jp2-file (+ options)\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((cp.disto_alloc || cp.fixed_alloc || cp.fixed_quality)&&(!(cp.disto_alloc ^ cp.fixed_alloc ^ cp.fixed_quality))) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"Error: options -r -q and -f can not be used together !!\n");
|
|
||||||
return 1;
|
|
||||||
} // mod fixed_quality
|
|
||||||
|
|
||||||
/* if no rate entered, lossless by default */
|
|
||||||
if (tcp_init->numlayers == 0) {
|
|
||||||
tcp_init->rates[tcp_init->numlayers] = 1;
|
|
||||||
tcp_init->numlayers++;
|
|
||||||
cp.disto_alloc = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (TX0 > Dim[0] || TY0 > Dim[1]) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"Error: Tile offset dimension is unnappropriate --> TX0(%d)<=IMG_X0(%d) TYO(%d)<=IMG_Y0(%d) \n",
|
|
||||||
TX0, Dim[0], TY0, Dim[1]);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < numpocs; i++) {
|
|
||||||
if (POC[i].prg == -1) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"Unrecognized progression order in option -P (POC n %d) [LRCP, RLCP, RPCL, PCRL, CPRL] !!\n",
|
|
||||||
i + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (cp.image_type) {
|
|
||||||
case 0:
|
|
||||||
if (Tile_arg) {
|
|
||||||
if (!pgxtoimage
|
|
||||||
(infile, &img, cp.tdy, subsampling_dx, subsampling_dy, Dim,
|
|
||||||
cp)) {
|
|
||||||
fprintf(stderr, "not a pgx file\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (!pgxtoimage
|
|
||||||
(infile, &img, -1, subsampling_dx, subsampling_dy, Dim, cp)) {
|
|
||||||
fprintf(stderr, " not a pgx file\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 1:
|
|
||||||
if (!pnmtoimage(infile, &img, subsampling_dx, subsampling_dy, Dim)) {
|
|
||||||
fprintf(stderr, " not a pnm file\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 2:
|
|
||||||
if (!bmptoimage(infile, &img, subsampling_dx, subsampling_dy, Dim)) {
|
|
||||||
fprintf(stderr, " not a bmp file\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* to respect profile - 0 */
|
|
||||||
/* ---------------------- */
|
|
||||||
numD_min = 0;
|
|
||||||
/* while (int_ceildiv(img.x1,(1<<numD_min))-int_ceildiv(img.x0,(1<<numD_min))>120 || int_ceildiv(img.y1,(1<<numD_min))-int_ceildiv(img.y0,(1<<numD_min))>160) numD_min++;
|
|
||||||
if ((numD_min+1)>NumResolution)
|
|
||||||
{
|
|
||||||
fprintf(stderr,"\n********************************************************************************\n\n");
|
|
||||||
fprintf(stderr, "In view to respect Profile-0, the number of resolution used is %d in place of %d\n\n",numD_min+1,NumResolution);
|
|
||||||
fprintf(stderr, "********************************************************************************\n\n");
|
|
||||||
NumResolution=numD_min+1;
|
|
||||||
} */
|
|
||||||
|
|
||||||
if (Tile_arg == 1) {
|
|
||||||
cp.tw = int_ceildiv(img.x1 - cp.tx0, cp.tdx);
|
|
||||||
cp.th = int_ceildiv(img.y1 - cp.ty0, cp.tdy);
|
|
||||||
} else {
|
|
||||||
cp.tdx = img.x1 - cp.tx0;
|
|
||||||
cp.tdy = img.y1 - cp.ty0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Initialization for PPM marker */
|
|
||||||
cp.ppm = 0;
|
|
||||||
cp.ppm_data = NULL;
|
|
||||||
cp.ppm_previous = 0;
|
|
||||||
cp.ppm_store = 0;
|
|
||||||
|
|
||||||
/* Init the mutiple tiles */
|
|
||||||
/* ---------------------- */
|
|
||||||
cp.tcps = (j2k_tcp_t *) malloc(cp.tw * cp.th * sizeof(j2k_tcp_t));
|
|
||||||
|
|
||||||
for (tileno = 0; tileno < cp.tw * cp.th; tileno++) {
|
|
||||||
tcp = &cp.tcps[tileno];
|
|
||||||
tcp->numlayers = tcp_init->numlayers;
|
|
||||||
for (j = 0; j < tcp->numlayers; j++) {
|
|
||||||
if (cp.fixed_quality) // add fixed_quality
|
|
||||||
tcp->distoratio[j] = tcp_init->distoratio[j];
|
|
||||||
else
|
|
||||||
tcp->rates[j] = tcp_init->rates[j];
|
|
||||||
}
|
|
||||||
tcp->csty = CSty;
|
|
||||||
tcp->prg = Prog_order;
|
|
||||||
tcp->mct = img.numcomps == 3 ? 1 : 0;
|
|
||||||
tcp->ppt = 0;
|
|
||||||
tcp->ppt_data = NULL;
|
|
||||||
tcp->ppt_store = 0;
|
|
||||||
|
|
||||||
numpocs_tile = 0;
|
|
||||||
tcp->POC = 0;
|
|
||||||
if (numpocs) {
|
|
||||||
/* intialisation of POC */
|
|
||||||
tcp->POC = 1;
|
|
||||||
for (i = 0; i < numpocs; i++) {
|
|
||||||
if (tileno == POC[i].tile - 1 || POC[i].tile == -1) {
|
|
||||||
tcp_poc = &tcp->pocs[numpocs_tile];
|
|
||||||
tcp_poc->resno0 = POC[numpocs_tile].resno0;
|
|
||||||
tcp_poc->compno0 = POC[numpocs_tile].compno0;
|
|
||||||
tcp_poc->layno1 = POC[numpocs_tile].layno1;
|
|
||||||
tcp_poc->resno1 = POC[numpocs_tile].resno1;
|
|
||||||
tcp_poc->compno1 = POC[numpocs_tile].compno1;
|
|
||||||
tcp_poc->prg = POC[numpocs_tile].prg;
|
|
||||||
tcp_poc->tile = POC[numpocs_tile].tile;
|
|
||||||
numpocs_tile++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
tcp->numpocs = numpocs_tile;
|
|
||||||
tcp->tccps = (j2k_tccp_t *) malloc(img.numcomps * sizeof(j2k_tccp_t));
|
|
||||||
|
|
||||||
for (i = 0; i < img.numcomps; i++) {
|
|
||||||
tccp = &tcp->tccps[i];
|
|
||||||
tccp->csty = CSty & 0x01; /* 0 => one precinct || 1 => custom precinct */
|
|
||||||
tccp->numresolutions = NumResolution;
|
|
||||||
tccp->cblkw = int_floorlog2(cblockw_init);
|
|
||||||
tccp->cblkh = int_floorlog2(cblockh_init);
|
|
||||||
tccp->cblksty = mode;
|
|
||||||
tccp->qmfbid = ir ? 0 : 1;
|
|
||||||
tccp->qntsty = ir ? J2K_CCP_QNTSTY_SEQNT : J2K_CCP_QNTSTY_NOQNT;
|
|
||||||
tccp->numgbits = 2;
|
|
||||||
if (i == ROI_compno)
|
|
||||||
tccp->roishift = ROI_shift;
|
|
||||||
else
|
|
||||||
tccp->roishift = 0;
|
|
||||||
if (CSty & J2K_CCP_CSTY_PRT) {
|
|
||||||
int p = 0;
|
|
||||||
for (j = tccp->numresolutions - 1; j >= 0; j--) {
|
|
||||||
if (p < res_spec) {
|
|
||||||
if (prcw_init[p] < 1)
|
|
||||||
tccp->prcw[j] = 1;
|
|
||||||
else
|
|
||||||
tccp->prcw[j] = int_floorlog2(prcw_init[p]);
|
|
||||||
|
|
||||||
if (prch_init[p] < 1)
|
|
||||||
tccp->prch[j] = 1;
|
|
||||||
else
|
|
||||||
tccp->prch[j] = int_floorlog2(prch_init[p]);
|
|
||||||
} else {
|
|
||||||
int size_prcw, size_prch;
|
|
||||||
size_prcw = prcw_init[res_spec - 1] >> (p - (res_spec - 1));
|
|
||||||
size_prch = prch_init[res_spec - 1] >> (p - (res_spec - 1));
|
|
||||||
if (size_prcw < 1)
|
|
||||||
tccp->prcw[j] = 1;
|
|
||||||
else
|
|
||||||
tccp->prcw[j] = int_floorlog2(size_prcw);
|
|
||||||
if (size_prch < 1)
|
|
||||||
tccp->prch[j] = 1;
|
|
||||||
else
|
|
||||||
tccp->prch[j] = int_floorlog2(size_prch);
|
|
||||||
}
|
|
||||||
p++;
|
|
||||||
/*printf("\nsize precinct pour level %d : %d,%d\n", j,
|
|
||||||
tccp->prcw[j], tccp->prch[j]);*/
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (j = 0; j < tccp->numresolutions; j++) {
|
|
||||||
tccp->prcw[j] = 15;
|
|
||||||
tccp->prch[j] = 15;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
calc_explicit_stepsizes(tccp, img.comps[i].prec);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cp.JPEG2000_format==0) { /* J2K format output */
|
|
||||||
if (cp.intermed_file==1) { /* After the encoding of each tile, j2k_encode
|
|
||||||
stores the data in the file*/
|
|
||||||
len = j2k_encode(&img, &cp, outfile, cp.tdx * cp.tdy * 10, index);
|
|
||||||
if (len == 0) {
|
|
||||||
fprintf(stderr, "failed to encode image\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
outbuf = (char *) malloc( cp.tdx * cp.tdy * cp.tw * cp.th * 4*sizeof(char)); /* Allocate memory for all tiles */
|
|
||||||
cio_init(outbuf, cp.tdx * cp.tdy * cp.tw * cp.th * 4);
|
|
||||||
len = j2k_encode(&img, &cp, outbuf, cp.tdx * cp.tdy * cp.tw * cp.th * 4, index);
|
|
||||||
if (len == 0) {
|
|
||||||
fprintf(stderr, "failed to encode image\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
// non uso l'intermed file
|
|
||||||
if (jpwl_cp.JPWL_on){
|
|
||||||
out= (char *) malloc(len*4*sizeof(char));
|
|
||||||
len=jpwl_encode(outbuf,out,len);
|
|
||||||
if (len == 0) {
|
|
||||||
fprintf(stderr, "failed to encode image\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cp.index_on && use_index){
|
|
||||||
//printf("num: %d\n",info_IM.num);
|
|
||||||
write_index(index, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
f = fopen(outfile, "wb");
|
|
||||||
if (!f) {
|
|
||||||
fprintf(stderr, "failed to open %s for writing\n", outfile);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
fwrite(out, 1, len, f);
|
|
||||||
free(outbuf);
|
|
||||||
free(out);
|
|
||||||
fclose(f);
|
|
||||||
if(cp.index_on)
|
|
||||||
j2k_free_info();
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
f = fopen(outfile, "wb");
|
|
||||||
if (!f) {
|
|
||||||
fprintf(stderr, "failed to open %s for writing\n", outfile);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
fwrite(outbuf, 1, len, f);
|
|
||||||
free(outbuf);
|
|
||||||
fclose(f);
|
|
||||||
if(cp.index_on)
|
|
||||||
j2k_free_info();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else /* JP2 format output */
|
|
||||||
{
|
|
||||||
jp2_struct_t * jp2_struct;
|
|
||||||
jp2_struct = (jp2_struct_t *) malloc(sizeof(jp2_struct_t));
|
|
||||||
jp2_struct->image = &img;
|
|
||||||
|
|
||||||
/* Initialising the standard JP2 box content*/
|
|
||||||
/* If you wish to modify those boxes, you have to modify the jp2_struct content*/
|
|
||||||
if (jp2_init_stdjp2(jp2_struct, &img))
|
|
||||||
{
|
|
||||||
fprintf(stderr,"Error with jp2 initialization");
|
|
||||||
return 1;
|
|
||||||
};
|
|
||||||
|
|
||||||
if (cp.intermed_file==1) {
|
|
||||||
/*For the moment, JP2 format does not use intermediary files for each tile*/
|
|
||||||
cp.intermed_file=0;
|
|
||||||
}
|
|
||||||
outbuf = (char *) malloc( cp.tdx * cp.tdy * cp.tw * cp.th * 10 *sizeof(char));
|
|
||||||
cio_init(outbuf, cp.tdx * cp.tdy * cp.tw * cp.th * 10);
|
|
||||||
len = jp2_encode(jp2_struct, &cp, outbuf, index);
|
|
||||||
if (len == 0) {
|
|
||||||
fprintf(stderr, "failed to encode image\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
f = fopen(outfile, "wb");
|
|
||||||
if (!f) {
|
|
||||||
fprintf(stderr, "failed to open %s for writing\n", outfile);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
fwrite(outbuf, 1, len, f);
|
|
||||||
free(outbuf);
|
|
||||||
fclose(f);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Remove the temporary files */
|
|
||||||
/* -------------------------- */
|
|
||||||
if (cp.image_type) { /* PNM PGM PPM */
|
|
||||||
for (i = 0; i < img.numcomps; i++) {
|
|
||||||
char tmp[7]; // risolto il bug finale (stack corrupted)!!!
|
|
||||||
sprintf(tmp, "Compo%d", i);
|
|
||||||
if (remove(tmp) == -1) {
|
|
||||||
fprintf(stderr, "failed to kill %s file !\n", tmp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else { /* PGX */
|
|
||||||
for (i = 0; i < cp.th; i++) {
|
|
||||||
char tmp[10];
|
|
||||||
sprintf(tmp, "bandtile%d", i + 1);
|
|
||||||
|
|
||||||
if (remove(tmp) == -1) {
|
|
||||||
fprintf(stderr, "failed to kill %s file !\n", tmp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Free memory */
|
|
||||||
free(img.comps);
|
|
||||||
free(cp_init.tcps);
|
|
||||||
if (tcp_init->numlayers > 9) free(cp.matrice);
|
|
||||||
for (tileno = 0; tileno < cp.tw * cp.th; tileno++)
|
|
||||||
free(cp.tcps[tileno].tccps);
|
|
||||||
free(cp.tcps);
|
|
||||||
|
|
||||||
system("pause");
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,259 +0,0 @@
|
||||||
# Microsoft Developer Studio Project File - Name="image_to_j2k" - Package Owner=<4>
|
|
||||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
|
||||||
# ** DO NOT EDIT **
|
|
||||||
|
|
||||||
# TARGTYPE "Win32 (x86) Console Application" 0x0103
|
|
||||||
|
|
||||||
CFG=image_to_j2k - 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 "image_to_j2k.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 "image_to_j2k.mak" CFG="image_to_j2k - Win32 Debug"
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE Possible choices for configuration are:
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE "image_to_j2k - Win32 Release" (based on "Win32 (x86) Console Application")
|
|
||||||
!MESSAGE "image_to_j2k - Win32 Debug" (based on "Win32 (x86) Console Application")
|
|
||||||
!MESSAGE
|
|
||||||
|
|
||||||
# Begin Project
|
|
||||||
# PROP AllowPerConfigDependencies 0
|
|
||||||
# PROP Scc_ProjName ""
|
|
||||||
# PROP Scc_LocalPath ""
|
|
||||||
CPP=cl.exe
|
|
||||||
RSC=rc.exe
|
|
||||||
|
|
||||||
!IF "$(CFG)" == "image_to_j2k - Win32 Release"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 0
|
|
||||||
# PROP BASE Output_Dir "Release"
|
|
||||||
# PROP BASE Intermediate_Dir "Release"
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 0
|
|
||||||
# PROP Output_Dir "Release"
|
|
||||||
# PROP Intermediate_Dir "Release"
|
|
||||||
# PROP Ignore_Export_Lib 0
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
|
||||||
# ADD CPP /nologo /W1 /GX /O2 /I "../libopenjpeg" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "DONT_HAVE_GETOPT" /FD /c
|
|
||||||
# SUBTRACT CPP /YX
|
|
||||||
# ADD BASE RSC /l 0x80c /d "NDEBUG"
|
|
||||||
# ADD RSC /l 0x80c /i "../libopenjpeg" /d "NDEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LINK32=link.exe
|
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib 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
|
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "image_to_j2k - Win32 Debug"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 1
|
|
||||||
# PROP BASE Output_Dir "Debug"
|
|
||||||
# PROP BASE Intermediate_Dir "Debug"
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 1
|
|
||||||
# PROP Output_Dir "Debug"
|
|
||||||
# PROP Intermediate_Dir "Debug"
|
|
||||||
# PROP Ignore_Export_Lib 0
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /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 BASE RSC /l 0x80c /d "_DEBUG"
|
|
||||||
# ADD RSC /l 0x80c /d "_DEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LINK32=link.exe
|
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib 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
|
|
||||||
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
# Begin Target
|
|
||||||
|
|
||||||
# Name "image_to_j2k - Win32 Release"
|
|
||||||
# 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
|
|
||||||
|
|
||||||
SOURCE=.\convert.c
|
|
||||||
# End 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\jpw.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\rs.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
|
|
||||||
# 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 Project
|
|
|
@ -1,29 +0,0 @@
|
||||||
Microsoft Developer Studio Workspace File, Format Version 6.00
|
|
||||||
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
Project: "image_to_j2k"=.\image_to_j2k.dsp - Package Owner=<4>
|
|
||||||
|
|
||||||
Package=<5>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
Package=<4>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
Global:
|
|
||||||
|
|
||||||
Package=<5>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
Package=<3>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
Microsoft C/C++ program database 2.00
|
|
|
@ -1 +0,0 @@
|
||||||
ÐÏࡱ
|
|
|
@ -1,96 +0,0 @@
|
||||||
<html>
|
|
||||||
<body>
|
|
||||||
<pre>
|
|
||||||
<h1>Build Log</h1>
|
|
||||||
<h3>
|
|
||||||
--------------------Configuration: image_to_j2k - Win32 Release--------------------
|
|
||||||
</h3>
|
|
||||||
<h3>Command Lines</h3>
|
|
||||||
Creating temporary file "C:\DOCUME~1\baruffa\IMPOST~1\Temp\RSP5D.tmp" with contents
|
|
||||||
[
|
|
||||||
/nologo /ML /GX /O2 /I "../libopenjpeg" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "DONT_HAVE_GETOPT" /Fo"Release/" /Fd"Release/" /FD /c
|
|
||||||
"C:\Documents and Settings\baruffa\Desktop\EncoderJPWL\libopenjpeg\bio.c"
|
|
||||||
"C:\Documents and Settings\baruffa\Desktop\EncoderJPWL\libopenjpeg\cio.c"
|
|
||||||
"C:\Documents and Settings\baruffa\Desktop\EncoderJPWL\codec\convert.c"
|
|
||||||
"C:\Documents and Settings\baruffa\Desktop\EncoderJPWL\libopenjpeg\dwt.c"
|
|
||||||
"C:\Documents and Settings\baruffa\Desktop\EncoderJPWL\libopenjpeg\fix.c"
|
|
||||||
"C:\Documents and Settings\baruffa\Desktop\EncoderJPWL\codec\compat\getopt.c"
|
|
||||||
"C:\Documents and Settings\baruffa\Desktop\EncoderJPWL\codec\image_to_j2k.c"
|
|
||||||
"C:\Documents and Settings\baruffa\Desktop\EncoderJPWL\libopenjpeg\int.c"
|
|
||||||
"C:\Documents and Settings\baruffa\Desktop\EncoderJPWL\libopenjpeg\j2k.c"
|
|
||||||
"C:\Documents and Settings\baruffa\Desktop\EncoderJPWL\libopenjpeg\jp2.c"
|
|
||||||
"C:\Documents and Settings\baruffa\Desktop\EncoderJPWL\libopenjpeg\jpt.c"
|
|
||||||
"C:\Documents and Settings\baruffa\Desktop\EncoderJPWL\libopenjpeg\jpw.c"
|
|
||||||
"C:\Documents and Settings\baruffa\Desktop\EncoderJPWL\libopenjpeg\mct.c"
|
|
||||||
"C:\Documents and Settings\baruffa\Desktop\EncoderJPWL\libopenjpeg\mqc.c"
|
|
||||||
"C:\Documents and Settings\baruffa\Desktop\EncoderJPWL\libopenjpeg\pi.c"
|
|
||||||
"C:\Documents and Settings\baruffa\Desktop\EncoderJPWL\libopenjpeg\raw.c"
|
|
||||||
"C:\Documents and Settings\baruffa\Desktop\EncoderJPWL\libopenjpeg\rs.c"
|
|
||||||
"C:\Documents and Settings\baruffa\Desktop\EncoderJPWL\libopenjpeg\t1.c"
|
|
||||||
"C:\Documents and Settings\baruffa\Desktop\EncoderJPWL\libopenjpeg\t2.c"
|
|
||||||
"C:\Documents and Settings\baruffa\Desktop\EncoderJPWL\libopenjpeg\tcd.c"
|
|
||||||
"C:\Documents and Settings\baruffa\Desktop\EncoderJPWL\libopenjpeg\tgt.c"
|
|
||||||
]
|
|
||||||
Creating command line "cl.exe @C:\DOCUME~1\baruffa\IMPOST~1\Temp\RSP5D.tmp"
|
|
||||||
Creating temporary file "C:\DOCUME~1\baruffa\IMPOST~1\Temp\RSP5E.tmp" with contents
|
|
||||||
[
|
|
||||||
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 /incremental:no /pdb:"Release/image_to_j2k.pdb" /machine:I386 /out:"Release/image_to_j2k.exe"
|
|
||||||
".\Release\bio.obj"
|
|
||||||
".\Release\cio.obj"
|
|
||||||
".\Release\convert.obj"
|
|
||||||
".\Release\dwt.obj"
|
|
||||||
".\Release\fix.obj"
|
|
||||||
".\Release\getopt.obj"
|
|
||||||
".\Release\image_to_j2k.obj"
|
|
||||||
".\Release\int.obj"
|
|
||||||
".\Release\j2k.obj"
|
|
||||||
".\Release\jp2.obj"
|
|
||||||
".\Release\jpt.obj"
|
|
||||||
".\Release\jpw.obj"
|
|
||||||
".\Release\mct.obj"
|
|
||||||
".\Release\mqc.obj"
|
|
||||||
".\Release\pi.obj"
|
|
||||||
".\Release\raw.obj"
|
|
||||||
".\Release\rs.obj"
|
|
||||||
".\Release\t1.obj"
|
|
||||||
".\Release\t2.obj"
|
|
||||||
".\Release\tcd.obj"
|
|
||||||
".\Release\tgt.obj"
|
|
||||||
]
|
|
||||||
Creating command line "link.exe @C:\DOCUME~1\baruffa\IMPOST~1\Temp\RSP5E.tmp"
|
|
||||||
<h3>Output Window</h3>
|
|
||||||
Compiling...
|
|
||||||
bio.c
|
|
||||||
cio.c
|
|
||||||
convert.c
|
|
||||||
dwt.c
|
|
||||||
fix.c
|
|
||||||
getopt.c
|
|
||||||
image_to_j2k.c
|
|
||||||
int.c
|
|
||||||
j2k.c
|
|
||||||
jp2.c
|
|
||||||
jpt.c
|
|
||||||
jpw.c
|
|
||||||
C:\Documents and Settings\baruffa\Desktop\EncoderJPWL\libopenjpeg\jpw.c(1940) : warning C4133: '=' : incompatible types - from 'double *' to 'long *'
|
|
||||||
mct.c
|
|
||||||
mqc.c
|
|
||||||
pi.c
|
|
||||||
raw.c
|
|
||||||
rs.c
|
|
||||||
t1.c
|
|
||||||
t2.c
|
|
||||||
tcd.c
|
|
||||||
Generating Code...
|
|
||||||
Compiling...
|
|
||||||
tgt.c
|
|
||||||
Generating Code...
|
|
||||||
Linking...
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<h3>Results</h3>
|
|
||||||
image_to_j2k.exe - 0 error(s), 1 warning(s)
|
|
||||||
</pre>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,21 +0,0 @@
|
||||||
Microsoft Visual Studio Solution File, Format Version 7.00
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "image_to_j2k", "image_to_j2k.vcproj", "{F67C0B66-E4AD-42E6-8D70-CF7F00BB31BE}"
|
|
||||||
EndProject
|
|
||||||
Global
|
|
||||||
GlobalSection(SolutionConfiguration) = preSolution
|
|
||||||
ConfigName.0 = Debug
|
|
||||||
ConfigName.1 = Release
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ProjectDependencies) = postSolution
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ProjectConfiguration) = postSolution
|
|
||||||
{F67C0B66-E4AD-42E6-8D70-CF7F00BB31BE}.Debug.ActiveCfg = Debug|Win32
|
|
||||||
{F67C0B66-E4AD-42E6-8D70-CF7F00BB31BE}.Debug.Build.0 = Debug|Win32
|
|
||||||
{F67C0B66-E4AD-42E6-8D70-CF7F00BB31BE}.Release.ActiveCfg = Release|Win32
|
|
||||||
{F67C0B66-E4AD-42E6-8D70-CF7F00BB31BE}.Release.Build.0 = Release|Win32
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ExtensibilityAddIns) = postSolution
|
|
||||||
EndGlobalSection
|
|
||||||
EndGlobal
|
|
|
@ -1 +0,0 @@
|
||||||
ÐÏࡱ
|
|
|
@ -1,266 +0,0 @@
|
||||||
<?xml version="1.0" encoding = "Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="7.00"
|
|
||||||
Name="image_to_j2k"
|
|
||||||
ProjectGUID="{F67C0B66-E4AD-42E6-8D70-CF7F00BB31BE}"
|
|
||||||
SccProjectName=""
|
|
||||||
SccLocalPath="">
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"/>
|
|
||||||
</Platforms>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory=".\Debug"
|
|
||||||
IntermediateDirectory=".\Debug"
|
|
||||||
ConfigurationType="1"
|
|
||||||
UseOfMFC="0"
|
|
||||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../libopenjpeg"
|
|
||||||
PreprocessorDefinitions="_DEBUG,DONT_HAVE_GETOPT,WIN32,_CONSOLE"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="5"
|
|
||||||
UsePrecompiledHeader="2"
|
|
||||||
PrecompiledHeaderFile=".\Debug/image_to_j2k.pch"
|
|
||||||
AssemblerListingLocation=".\Debug/"
|
|
||||||
ObjectFile=".\Debug/"
|
|
||||||
ProgramDataBaseFileName=".\Debug/"
|
|
||||||
BrowseInformation="1"
|
|
||||||
WarningLevel="3"
|
|
||||||
SuppressStartupBanner="TRUE"
|
|
||||||
DebugInformationFormat="4"
|
|
||||||
CompileAs="0"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalOptions="/MACHINE:I386"
|
|
||||||
AdditionalDependencies="odbc32.lib odbccp32.lib"
|
|
||||||
OutputFile=".\Debug/image_to_j2k.exe"
|
|
||||||
LinkIncremental="2"
|
|
||||||
SuppressStartupBanner="TRUE"
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
ProgramDatabaseFile=".\Debug/image_to_j2k.pdb"
|
|
||||||
SubSystem="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TypeLibraryName=".\Debug/image_to_j2k.tlb"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
PreprocessorDefinitions="_DEBUG"
|
|
||||||
Culture="2060"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory=".\Release"
|
|
||||||
IntermediateDirectory=".\Release"
|
|
||||||
ConfigurationType="1"
|
|
||||||
UseOfMFC="0"
|
|
||||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
InlineFunctionExpansion="1"
|
|
||||||
AdditionalIncludeDirectories="../libopenjpeg"
|
|
||||||
PreprocessorDefinitions="NDEBUG,WIN32,_CONSOLE,DONT_HAVE_GETOPT"
|
|
||||||
StringPooling="TRUE"
|
|
||||||
RuntimeLibrary="4"
|
|
||||||
EnableFunctionLevelLinking="TRUE"
|
|
||||||
UsePrecompiledHeader="2"
|
|
||||||
PrecompiledHeaderFile=".\Release/image_to_j2k.pch"
|
|
||||||
AssemblerListingLocation=".\Release/"
|
|
||||||
ObjectFile=".\Release/"
|
|
||||||
ProgramDataBaseFileName=".\Release/"
|
|
||||||
WarningLevel="3"
|
|
||||||
SuppressStartupBanner="TRUE"
|
|
||||||
CompileAs="0"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalOptions="/MACHINE:I386"
|
|
||||||
AdditionalDependencies="odbc32.lib odbccp32.lib"
|
|
||||||
OutputFile=".\Release/image_to_j2k.exe"
|
|
||||||
LinkIncremental="1"
|
|
||||||
SuppressStartupBanner="TRUE"
|
|
||||||
ProgramDatabaseFile=".\Release/image_to_j2k.pdb"
|
|
||||||
SubSystem="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
TypeLibraryName=".\Release/image_to_j2k.tlb"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
PreprocessorDefinitions="NDEBUG"
|
|
||||||
Culture="2060"
|
|
||||||
AdditionalIncludeDirectories="../libopenjpeg"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
|
|
||||||
<File
|
|
||||||
RelativePath="..\libopenjpeg\bio.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\libopenjpeg\cio.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\convert.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\libopenjpeg\dwt.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\libopenjpeg\fix.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\compat\getopt.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\image_to_j2k.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\libopenjpeg\int.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\libopenjpeg\j2k.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\libopenjpeg\jp2.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\libopenjpeg\jpt.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\libopenjpeg\jpw.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\libopenjpeg\mct.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\libopenjpeg\mqc.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\libopenjpeg\pi.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\libopenjpeg\raw.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\libopenjpeg\rs.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\libopenjpeg\t1.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\libopenjpeg\t2.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\libopenjpeg\tcd.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\libopenjpeg\tgt.c">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Header Files"
|
|
||||||
Filter="h;hpp;hxx;hm;inl">
|
|
||||||
<File
|
|
||||||
RelativePath="..\libopenjpeg\bio.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\libopenjpeg\cio.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\convert.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\libopenjpeg\dwt.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\libopenjpeg\fix.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\compat\getopt.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\libopenjpeg\int.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\libopenjpeg\j2k.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\libopenjpeg\jp2.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\libopenjpeg\jpt.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\libopenjpeg\jpw.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\libopenjpeg\mct.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\libopenjpeg\mqc.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\libopenjpeg\openjpeg.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\libopenjpeg\pi.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\libopenjpeg\raw.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\libopenjpeg\rs.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\libopenjpeg\t1.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\libopenjpeg\t2.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\libopenjpeg\tcd.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\libopenjpeg\tgt.h">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Resource Files"
|
|
||||||
Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe">
|
|
||||||
</Filter>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
|
@ -1,557 +0,0 @@
|
||||||
/* Copyright (c) 2001 David Janssens
|
|
||||||
* Copyright (c) 2002-2003 Yannick Verschueren
|
|
||||||
* Copyright (c) 2002-2003 Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
*
|
|
||||||
* All rights reserved.
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#include <openjpeg.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
int ceildiv(int a, int b)
|
|
||||||
{
|
|
||||||
return (a + b - 1) / b;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
FILE *f;
|
|
||||||
char *src, *src_name;
|
|
||||||
char *dest, S1, S2, S3;
|
|
||||||
int len;
|
|
||||||
|
|
||||||
j2k_image_t img;
|
|
||||||
|
|
||||||
j2k_cp_t cp;
|
|
||||||
int w, wr, wrr, h, hr, hrr, max;
|
|
||||||
int i, image_type = -1, compno, pad, j;
|
|
||||||
int adjust;
|
|
||||||
jp2_struct_t *jp2_struct;
|
|
||||||
|
|
||||||
if (argc < 3) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"usage: %s j2k-file image-file [-reduce n]\n", argv[0]);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
f = fopen(argv[1], "rb");
|
|
||||||
if (!f) {
|
|
||||||
fprintf(stderr, "failed to open %s for reading\n", argv[1]);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
dest = argv[2];
|
|
||||||
|
|
||||||
cp.reduce_on = 0;
|
|
||||||
cp.reduce_value = 0;
|
|
||||||
|
|
||||||
/* OPTION REDUCE IS ACTIVE */
|
|
||||||
if (argc == 5) {
|
|
||||||
if (strcmp(argv[3], "-reduce")) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"usage: options " "-reduce n"
|
|
||||||
" where n is the factor of reduction [%s]\n", argv[3]);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
cp.reduce_on = 1;
|
|
||||||
sscanf(argv[4], "%d", &cp.reduce_value);
|
|
||||||
}
|
|
||||||
|
|
||||||
while (*dest) {
|
|
||||||
dest++;
|
|
||||||
}
|
|
||||||
dest--;
|
|
||||||
S3 = *dest;
|
|
||||||
dest--;
|
|
||||||
S2 = *dest;
|
|
||||||
dest--;
|
|
||||||
S1 = *dest;
|
|
||||||
|
|
||||||
if ((S1 == 'p' && S2 == 'g' && S3 == 'x')
|
|
||||||
|| (S1 == 'P' && S2 == 'G' && S3 == 'X')) {
|
|
||||||
image_type = 0;
|
|
||||||
|
|
||||||
dest--;
|
|
||||||
|
|
||||||
*dest = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((S1 == 'p' && S2 == 'n' && S3 == 'm')
|
|
||||||
|| (S1 == 'P' && S2 == 'N' && S3 == 'M') || (S1 == 'p' && S2 == 'g'
|
|
||||||
&& S3 == 'm')
|
|
||||||
|| (S1 == 'P' && S2 == 'G' && S3 == 'M') || (S1 == 'P' && S2 == 'P'
|
|
||||||
&& S3 == 'M')
|
|
||||||
|| (S1 == 'p' && S2 == 'p' && S3 == 'm')) {
|
|
||||||
image_type = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((S1 == 'b' && S2 == 'm' && S3 == 'p')
|
|
||||||
|| (S1 == 'B' && S2 == 'M' && S3 == 'P')) {
|
|
||||||
image_type = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (image_type == -1) {
|
|
||||||
fprintf(stderr,
|
|
||||||
"!! Unrecognized format for infile : %c%c%c [accept only *.pnm, *.pgm, *.ppm, *.pgx or *.bmp] !!\n\n",
|
|
||||||
S1, S2, S3);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
fseek(f, 0, SEEK_END);
|
|
||||||
len = ftell(f);
|
|
||||||
fseek(f, 0, SEEK_SET);
|
|
||||||
src = (char *) malloc(len);
|
|
||||||
fread(src, 1, len, f);
|
|
||||||
fclose(f);
|
|
||||||
|
|
||||||
src_name = argv[1];
|
|
||||||
while (*src_name) {
|
|
||||||
src_name++;
|
|
||||||
}
|
|
||||||
src_name--;
|
|
||||||
S3 = *src_name;
|
|
||||||
src_name--;
|
|
||||||
S2 = *src_name;
|
|
||||||
src_name--;
|
|
||||||
S1 = *src_name;
|
|
||||||
|
|
||||||
/* J2K format */
|
|
||||||
if ((S1 == 'j' && S2 == '2' && S3 == 'k')
|
|
||||||
|| (S1 == 'J' && S2 == '2' && S3 == 'K') || (S1 == 'j' && S2 == '2'
|
|
||||||
&& S3 == 'c')
|
|
||||||
|| (S1 == 'J' && S2 == '2' && S3 == 'C')) {
|
|
||||||
if (!j2k_decode(src, len, &img, &cp)) {
|
|
||||||
fprintf(stderr, "j2k_to_image: failed to decode image!\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* JP2 format */
|
|
||||||
else if ((S1 == 'j' && S2 == 'p' && S3 == '2')
|
|
||||||
|| (S1 == 'J' && S2 == 'P' && S3 == '2')) {
|
|
||||||
jp2_struct = (jp2_struct_t *) malloc(sizeof(jp2_struct_t));
|
|
||||||
|
|
||||||
jp2_struct->image = &img;
|
|
||||||
|
|
||||||
if (jp2_decode(src, len, jp2_struct, &cp)) {
|
|
||||||
fprintf(stderr, "j2k_to_image: failed to decode image!\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
/* Insert code here if you want to create actions on jp2_struct before deleting it */
|
|
||||||
free(jp2_struct);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* JPT format */
|
|
||||||
else if ((S1 == 'j' && S2 == 'p' && S3 == 't')
|
|
||||||
|| (S1 == 'J' && S2 == 'P' && S3 == 'T')) {
|
|
||||||
if (!j2k_decode_jpt_stream(src, len, &img, &cp)) {
|
|
||||||
fprintf(stderr, "j2k_to_image: failed to decode image!\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* otherwise : error */
|
|
||||||
else {
|
|
||||||
fprintf(stderr,
|
|
||||||
"j2k_to_image : Unknown format image *.%c%c%c [only *.j2k, *.jp2, *.jpc or *.jpt]!! \n",
|
|
||||||
S1, S2, S3);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
free(src);
|
|
||||||
/* ------------------ CREATE OUT IMAGE WITH THE RIGHT FORMAT ----------------------- */
|
|
||||||
|
|
||||||
/* ---------------------------- / */
|
|
||||||
/* / / */
|
|
||||||
/* / FORMAT : PNM, PGM or PPM / */
|
|
||||||
/* / / */
|
|
||||||
/* ---------------------------- / */
|
|
||||||
|
|
||||||
switch (image_type) {
|
|
||||||
case 1: /* PNM PGM PPM */
|
|
||||||
if (img.numcomps == 3 && img.comps[0].dx == img.comps[1].dx
|
|
||||||
&& img.comps[1].dx == img.comps[2].dx
|
|
||||||
&& img.comps[0].dy == img.comps[1].dy
|
|
||||||
&& img.comps[1].dy == img.comps[2].dy
|
|
||||||
&& img.comps[0].prec == img.comps[1].prec
|
|
||||||
&& img.comps[1].prec == img.comps[2].prec) {
|
|
||||||
f = fopen(argv[2], "wb");
|
|
||||||
w = ceildiv(img.x1 - img.x0, img.comps[0].dx);
|
|
||||||
// wr = ceildiv(int_ceildivpow2(img.x1 - img.x0,img.factor),img.comps[0].dx);
|
|
||||||
wr = img.comps[0].w;
|
|
||||||
wrr = int_ceildivpow2(img.comps[0].w, img.comps[0].factor);
|
|
||||||
|
|
||||||
h = ceildiv(img.y1 - img.y0, img.comps[0].dy);
|
|
||||||
// hr = ceildiv(int_ceildivpow2(img.y1 - img.y0,img.factor), img.comps[0].dy);
|
|
||||||
hr = img.comps[0].h;
|
|
||||||
hrr = int_ceildivpow2(img.comps[0].h, img.comps[0].factor);
|
|
||||||
|
|
||||||
max = img.comps[0].prec > 8 ? 255 : (1 << img.comps[0].prec) - 1;
|
|
||||||
|
|
||||||
img.comps[0].x0 =
|
|
||||||
int_ceildivpow2(img.comps[0].x0 -
|
|
||||||
int_ceildiv(img.x0, img.comps[0].dx),
|
|
||||||
img.comps[0].factor);
|
|
||||||
img.comps[0].y0 =
|
|
||||||
int_ceildivpow2(img.comps[0].y0 -
|
|
||||||
int_ceildiv(img.y0, img.comps[0].dy),
|
|
||||||
img.comps[0].factor);
|
|
||||||
|
|
||||||
|
|
||||||
fprintf(f, "P6\n# %d %d %d %d %d\n%d %d\n%d\n",
|
|
||||||
cp.tcps[cp.tileno[0]].tccps[0].numresolutions, w, h,
|
|
||||||
img.comps[0].x0, img.comps[0].y0, wrr, hrr, max);
|
|
||||||
adjust = img.comps[0].prec > 8 ? img.comps[0].prec - 8 : 0;
|
|
||||||
for (i = 0; i < wrr * hrr; i++) {
|
|
||||||
char r, g, b;
|
|
||||||
r = img.comps[0].data[i / wrr * wr + i % wrr];
|
|
||||||
r += (img.comps[0].sgnd ? 1 << (img.comps[0].prec - 1) : 0);
|
|
||||||
r = r >> adjust;
|
|
||||||
|
|
||||||
g = img.comps[1].data[i / wrr * wr + i % wrr];
|
|
||||||
g += (img.comps[1].sgnd ? 1 << (img.comps[1].prec - 1) : 0);
|
|
||||||
g = g >> adjust;
|
|
||||||
|
|
||||||
b = img.comps[2].data[i / wrr * wr + i % wrr];
|
|
||||||
b += (img.comps[2].sgnd ? 1 << (img.comps[2].prec - 1) : 0);
|
|
||||||
b = b >> adjust;
|
|
||||||
|
|
||||||
fprintf(f, "%c%c%c", r, g, b);
|
|
||||||
}
|
|
||||||
free(img.comps[0].data);
|
|
||||||
free(img.comps[1].data);
|
|
||||||
free(img.comps[2].data);
|
|
||||||
fclose(f);
|
|
||||||
} else {
|
|
||||||
for (compno = 0; compno < img.numcomps; compno++) {
|
|
||||||
char name[256];
|
|
||||||
if (img.numcomps > 1) {
|
|
||||||
sprintf(name, "%d.%s", compno, argv[2]);
|
|
||||||
} else {
|
|
||||||
sprintf(name, "%s", argv[2]);
|
|
||||||
}
|
|
||||||
f = fopen(name, "wb");
|
|
||||||
w = ceildiv(img.x1 - img.x0, img.comps[compno].dx);
|
|
||||||
// wr = ceildiv(int_ceildivpow2(img.x1 - img.x0,img.factor),img.comps[compno].dx);
|
|
||||||
wr = img.comps[compno].w;
|
|
||||||
wrr =
|
|
||||||
int_ceildivpow2(img.comps[compno].w, img.comps[compno].factor);
|
|
||||||
|
|
||||||
h = ceildiv(img.y1 - img.y0, img.comps[compno].dy);
|
|
||||||
// hr = ceildiv(int_ceildivpow2(img.y1 - img.y0,img.factor), img.comps[compno].dy);
|
|
||||||
hr = img.comps[compno].h;
|
|
||||||
hrr =
|
|
||||||
int_ceildivpow2(img.comps[compno].h, img.comps[compno].factor);
|
|
||||||
|
|
||||||
max =
|
|
||||||
img.comps[compno].prec >
|
|
||||||
8 ? 255 : (1 << img.comps[compno].prec) - 1;
|
|
||||||
|
|
||||||
img.comps[compno].x0 =
|
|
||||||
int_ceildivpow2(img.comps[compno].x0 -
|
|
||||||
int_ceildiv(img.x0,
|
|
||||||
img.comps[compno].dx),
|
|
||||||
img.comps[compno].factor);
|
|
||||||
img.comps[compno].y0 =
|
|
||||||
int_ceildivpow2(img.comps[compno].y0 -
|
|
||||||
int_ceildiv(img.y0,
|
|
||||||
img.comps[compno].dy),
|
|
||||||
img.comps[compno].factor);
|
|
||||||
|
|
||||||
fprintf(f, "P5\n# %d %d %d %d %d\n%d %d\n%d\n",
|
|
||||||
cp.tcps[cp.tileno[0]].tccps[compno].
|
|
||||||
numresolutions, w, h, img.comps[compno].x0,
|
|
||||||
img.comps[compno].y0, wrr, hrr, max);
|
|
||||||
adjust =
|
|
||||||
img.comps[compno].prec > 8 ? img.comps[compno].prec - 8 : 0;
|
|
||||||
for (i = 0; i < wrr * hrr; i++) {
|
|
||||||
char l;
|
|
||||||
l = img.comps[compno].data[i / wrr * wr + i % wrr];
|
|
||||||
l += (img.comps[compno].
|
|
||||||
sgnd ? 1 << (img.comps[compno].prec - 1) : 0);
|
|
||||||
l = l >> adjust;
|
|
||||||
fprintf(f, "%c", l);
|
|
||||||
}
|
|
||||||
fclose(f);
|
|
||||||
free(img.comps[compno].data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* ------------------------ / */
|
|
||||||
/* / / */
|
|
||||||
/* / FORMAT : PGX / */
|
|
||||||
/* / / */
|
|
||||||
/* /----------------------- / */
|
|
||||||
case 0: /* PGX */
|
|
||||||
for (compno = 0; compno < img.numcomps; compno++) {
|
|
||||||
j2k_comp_t *comp = &img.comps[compno];
|
|
||||||
char name[256];
|
|
||||||
|
|
||||||
int nbytes = 0;
|
|
||||||
//if (img.numcomps > 1)
|
|
||||||
sprintf(name, "%s-%d.pgx", argv[2], compno);
|
|
||||||
|
|
||||||
//else
|
|
||||||
|
|
||||||
//sprintf(name, "%s.pgx", argv[2]);
|
|
||||||
|
|
||||||
f = fopen(name, "wb");
|
|
||||||
// w = ceildiv(img.x1 - img.x0, comp->dx);
|
|
||||||
// wr = ceildiv(int_ceildivpow2(img.x1 - img.x0,img.factor), comp->dx);
|
|
||||||
w = img.comps[compno].w;
|
|
||||||
wr = int_ceildivpow2(img.comps[compno].w, img.comps[compno].factor);
|
|
||||||
|
|
||||||
// h = ceildiv(img.y1 - img.y0, comp->dy);
|
|
||||||
// hr = ceildiv(int_ceildivpow2(img.y1 - img.y0,img.factor), comp->dy);
|
|
||||||
h = img.comps[compno].h;
|
|
||||||
hr = int_ceildivpow2(img.comps[compno].h, img.comps[compno].factor);
|
|
||||||
|
|
||||||
fprintf(f, "PG ML %c %d %d %d\n", comp->sgnd ? '-' : '+',
|
|
||||||
comp->prec, wr, hr);
|
|
||||||
|
|
||||||
if (comp->prec <= 8)
|
|
||||||
nbytes = 1;
|
|
||||||
|
|
||||||
else if (comp->prec <= 16)
|
|
||||||
nbytes = 2;
|
|
||||||
|
|
||||||
else
|
|
||||||
nbytes = 4;
|
|
||||||
for (i = 0; i < wr * hr; i++) {
|
|
||||||
int v = img.comps[compno].data[i / wr * w + i % wr];
|
|
||||||
|
|
||||||
for (j = nbytes - 1; j >= 0; j--) {
|
|
||||||
|
|
||||||
char byte = (char) (v >> (j * 8));
|
|
||||||
|
|
||||||
fwrite(&byte, 1, 1, f);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
free(img.comps[compno].data);
|
|
||||||
fclose(f);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* ------------------------ / */
|
|
||||||
/* / / */
|
|
||||||
/* / FORMAT : BMP / */
|
|
||||||
/* / / */
|
|
||||||
/* /----------------------- / */
|
|
||||||
|
|
||||||
case 2: /* BMP */
|
|
||||||
if (img.numcomps == 3 && img.comps[0].dx == img.comps[1].dx
|
|
||||||
&& img.comps[1].dx == img.comps[2].dx
|
|
||||||
&& img.comps[0].dy == img.comps[1].dy
|
|
||||||
&& img.comps[1].dy == img.comps[2].dy
|
|
||||||
&& img.comps[0].prec == img.comps[1].prec
|
|
||||||
&& img.comps[1].prec == img.comps[2].prec) {
|
|
||||||
/* -->> -->> -->> -->>
|
|
||||||
|
|
||||||
24 bits color
|
|
||||||
|
|
||||||
<<-- <<-- <<-- <<-- */
|
|
||||||
|
|
||||||
f = fopen(argv[2], "wb");
|
|
||||||
// w = ceildiv(img.x1 - img.x0, img.comps[0].dx);
|
|
||||||
// wr = ceildiv(int_ceildivpow2(img.x1 - img.x0,img.factor), img.comps[0].dx);
|
|
||||||
w = img.comps[0].w;
|
|
||||||
wr = int_ceildivpow2(img.comps[0].w, img.comps[0].factor);
|
|
||||||
|
|
||||||
// h = ceildiv(img.y1 - img.y0, img.comps[0].dy);
|
|
||||||
// hr = ceildiv(int_ceildivpow2(img.y1 - img.y0,img.factor), img.comps[0].dy);
|
|
||||||
h = img.comps[0].h;
|
|
||||||
hr = int_ceildivpow2(img.comps[0].h, img.comps[0].factor);
|
|
||||||
|
|
||||||
fprintf(f, "BM");
|
|
||||||
|
|
||||||
/* FILE HEADER */
|
|
||||||
/* ------------- */
|
|
||||||
fprintf(f, "%c%c%c%c",
|
|
||||||
(unsigned char) (hr * wr * 3 + 3 * hr * (wr % 2) +
|
|
||||||
54) & 0xff,
|
|
||||||
(unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2) + 54)
|
|
||||||
>> 8) & 0xff,
|
|
||||||
(unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2) + 54)
|
|
||||||
>> 16) & 0xff,
|
|
||||||
(unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2) + 54)
|
|
||||||
>> 24) & 0xff);
|
|
||||||
fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff,
|
|
||||||
((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
|
|
||||||
fprintf(f, "%c%c%c%c", (54) & 0xff, ((54) >> 8) & 0xff,
|
|
||||||
((54) >> 16) & 0xff, ((54) >> 24) & 0xff);
|
|
||||||
|
|
||||||
/* INFO HEADER */
|
|
||||||
/* ------------- */
|
|
||||||
fprintf(f, "%c%c%c%c", (40) & 0xff, ((40) >> 8) & 0xff,
|
|
||||||
((40) >> 16) & 0xff, ((40) >> 24) & 0xff);
|
|
||||||
fprintf(f, "%c%c%c%c", (unsigned char) ((wr) & 0xff),
|
|
||||||
(unsigned char) ((wr) >> 8) & 0xff,
|
|
||||||
(unsigned char) ((wr) >> 16) & 0xff,
|
|
||||||
(unsigned char) ((wr) >> 24) & 0xff);
|
|
||||||
fprintf(f, "%c%c%c%c", (unsigned char) ((hr) & 0xff),
|
|
||||||
(unsigned char) ((hr) >> 8) & 0xff,
|
|
||||||
(unsigned char) ((hr) >> 16) & 0xff,
|
|
||||||
(unsigned char) ((hr) >> 24) & 0xff);
|
|
||||||
fprintf(f, "%c%c", (1) & 0xff, ((1) >> 8) & 0xff);
|
|
||||||
fprintf(f, "%c%c", (24) & 0xff, ((24) >> 8) & 0xff);
|
|
||||||
fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff,
|
|
||||||
((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
|
|
||||||
fprintf(f, "%c%c%c%c",
|
|
||||||
(unsigned char) (3 * hr * wr +
|
|
||||||
3 * hr * (wr % 2)) & 0xff,
|
|
||||||
(unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2)) >>
|
|
||||||
8) & 0xff,
|
|
||||||
(unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2)) >>
|
|
||||||
16) & 0xff,
|
|
||||||
(unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2)) >>
|
|
||||||
24) & 0xff);
|
|
||||||
fprintf(f, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff,
|
|
||||||
((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff);
|
|
||||||
fprintf(f, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff,
|
|
||||||
((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff);
|
|
||||||
fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff,
|
|
||||||
((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
|
|
||||||
fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff,
|
|
||||||
((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
|
|
||||||
|
|
||||||
for (i = 0; i < wr * hr; i++) {
|
|
||||||
unsigned char R, G, B;
|
|
||||||
/* a modifier */
|
|
||||||
// R = img.comps[0].data[w * h - ((i) / (w) + 1) * w + (i) % (w)];
|
|
||||||
R = img.comps[0].data[w * hr - ((i) / (wr) + 1) * w + (i) % (wr)];
|
|
||||||
// G = img.comps[1].data[w * h - ((i) / (w) + 1) * w + (i) % (w)];
|
|
||||||
G = img.comps[1].data[w * hr - ((i) / (wr) + 1) * w + (i) % (wr)];
|
|
||||||
// B = img.comps[2].data[w * h - ((i) / (w) + 1) * w + (i) % (w)];
|
|
||||||
B = img.comps[2].data[w * hr - ((i) / (wr) + 1) * w + (i) % (wr)];
|
|
||||||
fprintf(f, "%c%c%c", B, G, R);
|
|
||||||
|
|
||||||
if ((i + 1) % wr == 0) {
|
|
||||||
for (pad = (3 * wr) % 4 ? 4 - (3 * wr) % 4 : 0; pad > 0; pad--) /* ADD */
|
|
||||||
fprintf(f, "%c", 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fclose(f);
|
|
||||||
free(img.comps[1].data);
|
|
||||||
free(img.comps[2].data);
|
|
||||||
} else { /* Gray-scale */
|
|
||||||
|
|
||||||
/* -->> -->> -->> -->>
|
|
||||||
|
|
||||||
8 bits non code (Gray scale)
|
|
||||||
|
|
||||||
<<-- <<-- <<-- <<-- */
|
|
||||||
f = fopen(argv[2], "wb");
|
|
||||||
// w = ceildiv(img.x1 - img.x0, img.comps[0].dx);
|
|
||||||
// wr = ceildiv(int_ceildivpow2(img.x1 - img.x0,img.factor), img.comps[0].dx);
|
|
||||||
w = img.comps[0].w;
|
|
||||||
wr = int_ceildivpow2(img.comps[0].w, img.comps[0].factor);
|
|
||||||
|
|
||||||
// h = ceildiv(img.y1 - img.y0, img.comps[0].dy);
|
|
||||||
// hr = ceildiv(int_ceildivpow2(img.y1 - img.y0,img.factor), img.comps[0].dy);
|
|
||||||
h = img.comps[0].h;
|
|
||||||
hr = int_ceildivpow2(img.comps[0].h, img.comps[0].factor);
|
|
||||||
|
|
||||||
fprintf(f, "BM");
|
|
||||||
|
|
||||||
/* FILE HEADER */
|
|
||||||
/* ------------- */
|
|
||||||
fprintf(f, "%c%c%c%c",
|
|
||||||
(unsigned char) (hr * wr + 54 + 1024 +
|
|
||||||
hr * (wr % 2)) & 0xff,
|
|
||||||
(unsigned char) ((hr * wr + 54 + 1024 + hr * (wr % 2))
|
|
||||||
>> 8) & 0xff,
|
|
||||||
(unsigned char) ((hr * wr + 54 + 1024 + hr * (wr % 2))
|
|
||||||
>> 16) & 0xff,
|
|
||||||
(unsigned char) ((hr * wr + 54 + 1024 + wr * (wr % 2))
|
|
||||||
>> 24) & 0xff);
|
|
||||||
fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff,
|
|
||||||
((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
|
|
||||||
fprintf(f, "%c%c%c%c", (54 + 1024) & 0xff,
|
|
||||||
((54 + 1024) >> 8) & 0xff, ((54 + 1024) >> 16) & 0xff,
|
|
||||||
((54 + 1024) >> 24) & 0xff);
|
|
||||||
|
|
||||||
/* INFO HEADER */
|
|
||||||
/* ------------- */
|
|
||||||
fprintf(f, "%c%c%c%c", (40) & 0xff, ((40) >> 8) & 0xff,
|
|
||||||
((40) >> 16) & 0xff, ((40) >> 24) & 0xff);
|
|
||||||
fprintf(f, "%c%c%c%c", (unsigned char) ((wr) & 0xff),
|
|
||||||
(unsigned char) ((wr) >> 8) & 0xff,
|
|
||||||
(unsigned char) ((wr) >> 16) & 0xff,
|
|
||||||
(unsigned char) ((wr) >> 24) & 0xff);
|
|
||||||
fprintf(f, "%c%c%c%c", (unsigned char) ((hr) & 0xff),
|
|
||||||
(unsigned char) ((hr) >> 8) & 0xff,
|
|
||||||
(unsigned char) ((hr) >> 16) & 0xff,
|
|
||||||
(unsigned char) ((hr) >> 24) & 0xff);
|
|
||||||
fprintf(f, "%c%c", (1) & 0xff, ((1) >> 8) & 0xff);
|
|
||||||
fprintf(f, "%c%c", (8) & 0xff, ((8) >> 8) & 0xff);
|
|
||||||
fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff,
|
|
||||||
((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
|
|
||||||
fprintf(f, "%c%c%c%c",
|
|
||||||
(unsigned char) (hr * wr + hr * (wr % 2)) & 0xff,
|
|
||||||
(unsigned char) ((hr * wr + hr * (wr % 2)) >> 8) &
|
|
||||||
0xff,
|
|
||||||
(unsigned char) ((hr * wr + hr * (wr % 2)) >> 16) &
|
|
||||||
0xff,
|
|
||||||
(unsigned char) ((hr * wr + hr * (wr % 2)) >> 24) & 0xff);
|
|
||||||
fprintf(f, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff,
|
|
||||||
((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff);
|
|
||||||
fprintf(f, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff,
|
|
||||||
((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff);
|
|
||||||
fprintf(f, "%c%c%c%c", (256) & 0xff, ((256) >> 8) & 0xff,
|
|
||||||
((256) >> 16) & 0xff, ((256) >> 24) & 0xff);
|
|
||||||
fprintf(f, "%c%c%c%c", (256) & 0xff, ((256) >> 8) & 0xff,
|
|
||||||
((256) >> 16) & 0xff, ((256) >> 24) & 0xff);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < 256; i++) {
|
|
||||||
fprintf(f, "%c%c%c%c", i, i, i, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < wr * hr; i++) {
|
|
||||||
/* a modifier !! */
|
|
||||||
// fprintf(f, "%c", img.comps[0].data[w * h - ((i) / (w) + 1) * w + (i) % (w)]);
|
|
||||||
fprintf(f, "%c",
|
|
||||||
img.comps[0].data[w * hr - ((i) / (wr) + 1) * w +
|
|
||||||
(i) % (wr)]);
|
|
||||||
/*if (((i + 1) % w == 0 && w % 2))
|
|
||||||
fprintf(f, "%c", 0); */
|
|
||||||
if ((i + 1) % wr == 0) {
|
|
||||||
for (pad = wr % 4 ? 4 - wr % 4 : 0; pad > 0; pad--) /* ADD */
|
|
||||||
fprintf(f, "%c", 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fclose(f);
|
|
||||||
free(img.comps[0].data);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,78 +0,0 @@
|
||||||
# $Id$
|
|
||||||
#
|
|
||||||
# makefile for OpenJPEG library
|
|
||||||
|
|
||||||
CFLAGS = -Wall -O3 -fno-strength-reduce -fomit-frame-pointer
|
|
||||||
|
|
||||||
ifndef DEBUG
|
|
||||||
LDFLAGS = -s -lm
|
|
||||||
else
|
|
||||||
LDFLAGS = -lm
|
|
||||||
endif
|
|
||||||
|
|
||||||
OBJ_DIR_W32 = obj.w32
|
|
||||||
LIB_DIR_W32 = lib.w32
|
|
||||||
|
|
||||||
ifdef MINGW32
|
|
||||||
CC = i386-mingw32-gcc
|
|
||||||
AR = i386-mingw32-ar
|
|
||||||
OBJ_DIR = $(OBJ_DIR_W32)
|
|
||||||
LIB_DIR = $(LIB_DIR_W32)
|
|
||||||
all: $(OBJ_DIR) $(LIB_DIR) \
|
|
||||||
$(LIB_DIR)/libopenjpeg.a $(LIB_DIR)/libopenjpeg.dll
|
|
||||||
else
|
|
||||||
CC = gcc
|
|
||||||
AR = ar
|
|
||||||
OBJ_DIR = obj
|
|
||||||
LIB_DIR = lib
|
|
||||||
all: $(OBJ_DIR) $(LIB_DIR) \
|
|
||||||
$(LIB_DIR)/libopenjpeg.a $(LIB_DIR)/libopenjpeg.so
|
|
||||||
endif
|
|
||||||
|
|
||||||
$(OBJ_DIR):
|
|
||||||
mkdir $(OBJ_DIR)
|
|
||||||
|
|
||||||
$(LIB_DIR):
|
|
||||||
mkdir $(LIB_DIR)
|
|
||||||
|
|
||||||
$(OBJ_DIR)/%.o:
|
|
||||||
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
|
|
||||||
|
|
||||||
$(OBJ_DIR)/bio.o: bio.c bio.h
|
|
||||||
$(OBJ_DIR)/cio.o: cio.c cio.h
|
|
||||||
$(OBJ_DIR)/dwt.o: dwt.c dwt.h int.h fix.h tcd.h
|
|
||||||
$(OBJ_DIR)/fix.o: fix.c fix.h
|
|
||||||
$(OBJ_DIR)/int.o: int.c
|
|
||||||
$(OBJ_DIR)/j2k.o: j2k.c j2k.h cio.h tcd.h dwt.h int.h
|
|
||||||
$(OBJ_DIR)/mct.o: mct.c mct.h fix.h
|
|
||||||
$(OBJ_DIR)/mqc.o: mqc.c mqc.h
|
|
||||||
|
|
||||||
$(OBJ_DIR)/pi.o: pi.c pi.h int.h
|
|
||||||
$(OBJ_DIR)/raw.o: raw.c raw.h
|
|
||||||
$(OBJ_DIR)/t1.o: t1.c t1.h j2k.h mqc.h raw.h int.h mct.h dwt.h fix.h
|
|
||||||
$(OBJ_DIR)/t2.o: t2.c t2.h tcd.h bio.h j2k.h pi.h tgt.h int.h cio.h
|
|
||||||
$(OBJ_DIR)/tcd.o: tcd.c tcd.h int.h t1.h t2.h dwt.h mct.h
|
|
||||||
$(OBJ_DIR)/tgt.o: tgt.c tgt.h bio.h
|
|
||||||
$(OBJ_DIR)/jpt.o: jpt.c jpt.h cio.h
|
|
||||||
$(OBJ_DIR)/jp2.o: jp2.c jp2.h
|
|
||||||
|
|
||||||
COM_OBJS = $(addprefix $(OBJ_DIR)/, j2k.o bio.o cio.o dwt.o fix.o int.o mct.o \
|
|
||||||
mqc.o pi.o t1.o t2.o tgt.o tcd.o raw.o jpt.o jp2.o)
|
|
||||||
|
|
||||||
$(LIB_DIR)/libopenjpeg.a: ${COM_OBJS}
|
|
||||||
$(AR) -sr $@ $^
|
|
||||||
|
|
||||||
$(LIB_DIR)/libopenjpeg.dll: ${COM_OBJS}
|
|
||||||
${CC} -s -shared -Wl,-soname,libopenjpeg.dll -o $@ $^
|
|
||||||
|
|
||||||
$(LIB_DIR)/libopenjpeg.so.1.0: ${COM_OBJS}
|
|
||||||
${CC} -s -shared -Wl,-soname,libopenjpeg.so.1 -o $@ $^
|
|
||||||
|
|
||||||
$(LIB_DIR)/libopenjpeg.so.1: $(LIB_DIR)/libopenjpeg.so.1.0
|
|
||||||
ln -s libopenjpeg.so.1.0 $(LIB_DIR)/libopenjpeg.so.1
|
|
||||||
|
|
||||||
$(LIB_DIR)/libopenjpeg.so: $(LIB_DIR)/libopenjpeg.so.1
|
|
||||||
ln -s libopenjpeg.so.1 $(LIB_DIR)/libopenjpeg.so
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f $(OBJ_DIR_W32)/* $(OBJ_DIR)/* $(LIB_DIR_W32)/* $(LIB_DIR)/*
|
|
|
@ -1,194 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2002, David Janssens
|
|
||||||
* Copyright (c) 2003, Yannick Verschueren
|
|
||||||
* Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
*
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "bio.h"
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <setjmp.h>
|
|
||||||
|
|
||||||
static unsigned char *bio_start; /* pointer to the start of the buffer */
|
|
||||||
static unsigned char *bio_end; /* pointer to the end of the buffer */
|
|
||||||
static unsigned char *bio_bp; /* pointer to the present position in the buffer */
|
|
||||||
static unsigned int bio_buf; /* temporary place where each byte is read or written */
|
|
||||||
static int bio_ct; /* coder : number of bits free to write // decoder : number of bits read */
|
|
||||||
|
|
||||||
extern jmp_buf j2k_error;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Number of bytes written.
|
|
||||||
*/
|
|
||||||
int bio_numbytes()
|
|
||||||
{
|
|
||||||
return bio_bp - bio_start;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Init encoder.
|
|
||||||
*
|
|
||||||
* bp : Output buffer
|
|
||||||
* len : Output buffer length
|
|
||||||
*/
|
|
||||||
void bio_init_enc(unsigned char *bp, int len)
|
|
||||||
{
|
|
||||||
bio_start = bp;
|
|
||||||
bio_end = bp + len;
|
|
||||||
bio_bp = bp;
|
|
||||||
bio_buf = 0;
|
|
||||||
bio_ct = 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
*bio_bp++ = bio_buf >> 8;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Read byte. --> function modified to eliminate longjmp !!
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
int bio_bytein()
|
|
||||||
{
|
|
||||||
bio_buf = (bio_buf << 8) & 0xffff;
|
|
||||||
bio_ct = bio_buf == 0xff00 ? 7 : 8;
|
|
||||||
if (bio_bp >= bio_end)
|
|
||||||
return 1;
|
|
||||||
bio_buf |= *bio_bp++;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Write bit.
|
|
||||||
*
|
|
||||||
* b : Bit to write (0 or 1)
|
|
||||||
*/
|
|
||||||
void bio_putbit(int b)
|
|
||||||
{
|
|
||||||
if (bio_ct == 0) {
|
|
||||||
bio_byteout();
|
|
||||||
}
|
|
||||||
bio_ct--;
|
|
||||||
bio_buf |= b << bio_ct;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Read bit.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
int bio_getbit()
|
|
||||||
{
|
|
||||||
if (bio_ct == 0) {
|
|
||||||
bio_bytein();
|
|
||||||
}
|
|
||||||
bio_ct--;
|
|
||||||
return (bio_buf >> bio_ct) & 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Write bits.
|
|
||||||
*
|
|
||||||
* v : Value of bits
|
|
||||||
* n : Number of bits to write
|
|
||||||
*/
|
|
||||||
void bio_write(int v, int n)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i = n - 1; i >= 0; i--) {
|
|
||||||
bio_putbit((v >> i) & 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Read bits.
|
|
||||||
*
|
|
||||||
* n : Number of bits to read
|
|
||||||
*/
|
|
||||||
int bio_read(int n)
|
|
||||||
{
|
|
||||||
int i, v;
|
|
||||||
v = 0;
|
|
||||||
for (i = n - 1; i >= 0; i--) {
|
|
||||||
v += bio_getbit() << i;
|
|
||||||
}
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Flush bits. Modified to eliminate longjmp !!
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
int bio_flush()
|
|
||||||
{
|
|
||||||
bio_ct = 0;
|
|
||||||
if (bio_byteout())
|
|
||||||
return 1;
|
|
||||||
if (bio_ct == 7) {
|
|
||||||
bio_ct = 0;
|
|
||||||
|
|
||||||
if (bio_byteout())
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Passes the ending bits (coming from flushing)
|
|
||||||
*/
|
|
||||||
int bio_inalign()
|
|
||||||
{
|
|
||||||
bio_ct = 0;
|
|
||||||
if ((bio_buf & 0xff) == 0xff) {
|
|
||||||
if (bio_bytein())
|
|
||||||
return 1;
|
|
||||||
bio_ct = 0;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,75 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2002, David Janssens
|
|
||||||
* Copyright (c) 2003, Yannick Verschueren
|
|
||||||
* Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __BIO_H
|
|
||||||
#define __BIO_H
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Number of bytes written.
|
|
||||||
*/
|
|
||||||
int bio_numbytes();
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Init encoder.
|
|
||||||
*
|
|
||||||
* bp : Output buffer
|
|
||||||
* len : Output buffer length
|
|
||||||
*/
|
|
||||||
void bio_init_enc(unsigned char *bp, int len);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Init decoder.
|
|
||||||
*
|
|
||||||
* bp : Input buffer
|
|
||||||
* len : Input buffer length
|
|
||||||
*/
|
|
||||||
void bio_init_dec(unsigned char *bp, int len);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Write bits.
|
|
||||||
*
|
|
||||||
* v : Value of bits
|
|
||||||
* n : Number of bits to write
|
|
||||||
*/
|
|
||||||
void bio_write(int v, int n);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Read bits.
|
|
||||||
*
|
|
||||||
* n : Number of bits to read
|
|
||||||
*/
|
|
||||||
int bio_read(int n);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Flush bits. Modified to eliminate longjmp !!
|
|
||||||
*/
|
|
||||||
int bio_flush();
|
|
||||||
|
|
||||||
int bio_inalign(); /* modified to eliminated longjmp !! */
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,152 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2002, David Janssens
|
|
||||||
* 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 "cio.h"
|
|
||||||
#include <setjmp.h>
|
|
||||||
|
|
||||||
static unsigned char *cio_start; /* pointer to the start of the stream */
|
|
||||||
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;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Number of bytes written.
|
|
||||||
*/
|
|
||||||
int cio_numbytes()
|
|
||||||
{
|
|
||||||
return cio_bp - cio_start;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get position in byte stream.
|
|
||||||
*/
|
|
||||||
int cio_tell()
|
|
||||||
{
|
|
||||||
return cio_bp - cio_start;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set position in byte stream.
|
|
||||||
*
|
|
||||||
* pos : position, in number of bytes, from the beginning of the stream
|
|
||||||
*/
|
|
||||||
void cio_seek(int pos)
|
|
||||||
{
|
|
||||||
cio_bp = cio_start + pos;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Number of bytes left before the end of the stream.
|
|
||||||
*/
|
|
||||||
int cio_numbytesleft()
|
|
||||||
{
|
|
||||||
return cio_end - cio_bp;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get pointer to the current position in the stream.
|
|
||||||
*/
|
|
||||||
unsigned char *cio_getbp()
|
|
||||||
{
|
|
||||||
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.
|
|
||||||
*/
|
|
||||||
void cio_byteout(unsigned char v)
|
|
||||||
{
|
|
||||||
if (cio_bp >= cio_end)
|
|
||||||
longjmp(j2k_error, 1);
|
|
||||||
*cio_bp++ = v;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Read a byte.
|
|
||||||
*/
|
|
||||||
unsigned char cio_bytein()
|
|
||||||
{
|
|
||||||
if (cio_bp >= cio_end)
|
|
||||||
longjmp(j2k_error, 1);
|
|
||||||
return *cio_bp++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Write some bytes.
|
|
||||||
*
|
|
||||||
* v : value to write
|
|
||||||
* n : number of bytes to write
|
|
||||||
*/
|
|
||||||
void cio_write(unsigned int v, int n)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i = n - 1; i >= 0; i--) {
|
|
||||||
cio_byteout((unsigned char) ((v >> (i << 3)) & 0xff));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Read some bytes.
|
|
||||||
*
|
|
||||||
* n : number of bytes to read
|
|
||||||
*
|
|
||||||
* return : value of the n bytes read
|
|
||||||
*/
|
|
||||||
unsigned int cio_read(int n)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
unsigned int v;
|
|
||||||
v = 0;
|
|
||||||
for (i = n - 1; i >= 0; i--) {
|
|
||||||
v += cio_bytein() << (i << 3);
|
|
||||||
}
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Skip some bytes.
|
|
||||||
*
|
|
||||||
* n : number of bytes to skip
|
|
||||||
*/
|
|
||||||
void cio_skip(int n)
|
|
||||||
{
|
|
||||||
cio_bp += n;
|
|
||||||
}
|
|
|
@ -1,97 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2002, David Janssens
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __CIO_H
|
|
||||||
#define __CIO_H
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Number of bytes written.
|
|
||||||
*
|
|
||||||
* returns number of bytes written
|
|
||||||
*/
|
|
||||||
int cio_numbytes();
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get position in byte stream.
|
|
||||||
*
|
|
||||||
* return position in bytes
|
|
||||||
*/
|
|
||||||
int cio_tell();
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set position in byte stream.
|
|
||||||
*
|
|
||||||
* pos : position, in number of bytes, from the beginning of the stream
|
|
||||||
*/
|
|
||||||
void cio_seek(int pos);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Number of bytes left before the end of the stream.
|
|
||||||
*
|
|
||||||
* Returns the number of bytes before the end of the stream
|
|
||||||
*/
|
|
||||||
int cio_numbytesleft();
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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);
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,454 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2002, David Janssens
|
|
||||||
* Copyright (c) 2002-2004, Yannick Verschueren
|
|
||||||
* Copyright (c) 2002-2004, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "dwt.h"
|
|
||||||
#include "int.h"
|
|
||||||
#include "fix.h"
|
|
||||||
#include "tcd.h"
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
//#include <math.h>
|
|
||||||
|
|
||||||
#define S(i) a[x*(i)*2]
|
|
||||||
#define D(i) a[x*(1+(i)*2)]
|
|
||||||
#define S_(i) ((i)<0?S(0):((i)>=sn?S(sn-1):S(i)))
|
|
||||||
#define D_(i) ((i)<0?D(0):((i)>=dn?D(dn-1):D(i)))
|
|
||||||
/* new */
|
|
||||||
#define SS_(i) ((i)<0?S(0):((i)>=dn?S(dn-1):S(i)))
|
|
||||||
#define DD_(i) ((i)<0?D(0):((i)>=sn?D(sn-1):D(i)))
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* This table contains the norms of the 5-3 wavelets for different bands. */
|
|
||||||
/* </summary> */
|
|
||||||
double dwt_norms[4][10] = {
|
|
||||||
{1.000, 1.500, 2.750, 5.375, 10.68, 21.34, 42.67, 85.33, 170.7, 341.3},
|
|
||||||
{1.038, 1.592, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9},
|
|
||||||
{1.038, 1.592, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9},
|
|
||||||
{.7186, .9218, 1.586, 3.043, 6.019, 12.01, 24.00, 47.97, 95.93}
|
|
||||||
};
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* This table contains the norms of the 9-7 wavelets for different bands. */
|
|
||||||
/* </summary> */
|
|
||||||
double dwt_norms_real[4][10] = {
|
|
||||||
{1.000, 1.965, 4.177, 8.403, 16.90, 33.84, 67.69, 135.3, 270.6, 540.9},
|
|
||||||
{2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0},
|
|
||||||
{2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0},
|
|
||||||
{2.080, 3.865, 8.307, 17.18, 34.71, 69.59, 139.3, 278.6, 557.2}
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Add Patrick */
|
|
||||||
static int *b = NULL;
|
|
||||||
static int lastSizeOfB = 0;
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* Cleaning memory. */
|
|
||||||
/* </summary> */
|
|
||||||
|
|
||||||
void dwt_clean()
|
|
||||||
{
|
|
||||||
if (b != NULL) {
|
|
||||||
free(b);
|
|
||||||
}
|
|
||||||
b = NULL;
|
|
||||||
lastSizeOfB = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* \ Add Patrick */
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* Forward lazy transform. */
|
|
||||||
/* </summary> */
|
|
||||||
void dwt_deinterleave(int *a, int n, int x, int res, int cas)
|
|
||||||
{
|
|
||||||
int dn, sn, i;
|
|
||||||
sn = res;
|
|
||||||
dn = n - res;
|
|
||||||
if (lastSizeOfB != n) {
|
|
||||||
if (b != NULL)
|
|
||||||
free(b);
|
|
||||||
b = (int *) malloc(n * sizeof(int));
|
|
||||||
lastSizeOfB = n;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cas) {
|
|
||||||
for (i = 0; i < sn; i++)
|
|
||||||
b[i] = a[(2 * i + 1) * x];
|
|
||||||
for (i = 0; i < dn; i++)
|
|
||||||
b[sn + i] = a[2 * i * x];
|
|
||||||
} else {
|
|
||||||
for (i = 0; i < sn; i++)
|
|
||||||
b[i] = a[2 * i * x];
|
|
||||||
for (i = 0; i < dn; i++)
|
|
||||||
b[sn + i] = a[(2 * i + 1) * x];
|
|
||||||
}
|
|
||||||
for (i = 0; i < n; i++)
|
|
||||||
a[i * x] = b[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* Inverse lazy transform. */
|
|
||||||
/* </summary> */
|
|
||||||
void dwt_interleave(int *a, int n, int x, int res, int cas)
|
|
||||||
{
|
|
||||||
int dn, sn, i;
|
|
||||||
sn = res;
|
|
||||||
dn = n - res;
|
|
||||||
|
|
||||||
if (lastSizeOfB != n) {
|
|
||||||
if (b != NULL)
|
|
||||||
free(b);
|
|
||||||
b = (int *) malloc(n * sizeof(int));
|
|
||||||
lastSizeOfB = n;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cas) {
|
|
||||||
for (i = 0; i < sn; i++)
|
|
||||||
b[2 * i + 1] = a[i * x];
|
|
||||||
for (i = 0; i < dn; i++)
|
|
||||||
b[2 * i] = a[(sn + i) * x];
|
|
||||||
} else {
|
|
||||||
for (i = 0; i < sn; i++)
|
|
||||||
b[2 * i] = a[i * x];
|
|
||||||
for (i = 0; i < dn; i++)
|
|
||||||
b[2 * i + 1] = a[(sn + i) * x];
|
|
||||||
}
|
|
||||||
for (i = 0; i < n; i++)
|
|
||||||
a[i * x] = b[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* Forward 5-3 wavelet tranform in 1-D. */
|
|
||||||
/* </summary> */
|
|
||||||
void dwt_encode_1(int *a, int n, int x, int res, int cas)
|
|
||||||
{
|
|
||||||
int dn, sn, i = 0;
|
|
||||||
sn = res;
|
|
||||||
dn = n - res;
|
|
||||||
|
|
||||||
if (cas) {
|
|
||||||
if (!sn && dn == 1) /* NEW : CASE ONE ELEMENT */
|
|
||||||
S(i) *= 2;
|
|
||||||
else {
|
|
||||||
for (i = 0; i < dn; i++)
|
|
||||||
S(i) -= (DD_(i) + DD_(i - 1)) >> 1;
|
|
||||||
for (i = 0; i < sn; i++)
|
|
||||||
D(i) += (SS_(i) + SS_(i + 1) + 2) >> 2;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */
|
|
||||||
for (i = 0; i < dn; i++)
|
|
||||||
D(i) -= (S_(i) + S_(i + 1)) >> 1;
|
|
||||||
for (i = 0; i < sn; i++)
|
|
||||||
S(i) += (D_(i - 1) + D_(i) + 2) >> 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
dwt_deinterleave(a, n, x, res, cas);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* Inverse 5-3 wavelet tranform in 1-D. */
|
|
||||||
/* </summary> */
|
|
||||||
void dwt_decode_1(int *a, int n, int x, int res, int cas)
|
|
||||||
{
|
|
||||||
int dn, sn, i = 0;
|
|
||||||
sn = res;
|
|
||||||
dn = n - res;
|
|
||||||
|
|
||||||
dwt_interleave(a, n, x, res, cas);
|
|
||||||
if (cas) {
|
|
||||||
if (!sn && dn == 1) /* NEW : CASE ONE ELEMENT */
|
|
||||||
S(i) /= 2;
|
|
||||||
else {
|
|
||||||
for (i = 0; i < sn; i++)
|
|
||||||
D(i) -= (SS_(i) + SS_(i + 1) + 2) >> 2;
|
|
||||||
for (i = 0; i < dn; i++)
|
|
||||||
S(i) += (DD_(i) + DD_(i - 1)) >> 1;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */
|
|
||||||
for (i = 0; i < sn; i++)
|
|
||||||
S(i) -= (D_(i - 1) + D_(i) + 2) >> 2;
|
|
||||||
for (i = 0; i < dn; i++)
|
|
||||||
D(i) += (S_(i) + S_(i + 1)) >> 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* Forward 5-3 wavelet tranform in 2-D. */
|
|
||||||
/* </summary> */
|
|
||||||
void dwt_encode(int *a, int w, int h, tcd_tilecomp_t * tilec, int l)
|
|
||||||
{
|
|
||||||
int i, j;
|
|
||||||
int rw; /* width 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 rh1; /* height of the resolution level once lower than computed one */
|
|
||||||
|
|
||||||
for (i = 0; i < l; i++) {
|
|
||||||
int cas_col = 0; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */
|
|
||||||
int cas_row = 0; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering */
|
|
||||||
rw = tilec->resolutions[l - i].x1 - tilec->resolutions[l - i].x0;
|
|
||||||
rh = tilec->resolutions[l - i].y1 - tilec->resolutions[l - i].y0;
|
|
||||||
rw1 =
|
|
||||||
tilec->resolutions[l - i - 1].x1 - tilec->resolutions[l - i - 1].x0;
|
|
||||||
rh1 =
|
|
||||||
tilec->resolutions[l - i - 1].y1 - tilec->resolutions[l - i - 1].y0;
|
|
||||||
|
|
||||||
cas_row = tilec->resolutions[l - i].x0 % 2;
|
|
||||||
cas_col = tilec->resolutions[l - i].y0 % 2;
|
|
||||||
|
|
||||||
for (j = 0; j < rw; j++)
|
|
||||||
dwt_encode_1(a + j, rh, w, rh1, cas_col);
|
|
||||||
for (j = 0; j < rh; j++)
|
|
||||||
dwt_encode_1(a + j * w, rw, 1, rw1, cas_row);
|
|
||||||
}
|
|
||||||
|
|
||||||
dwt_clean();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* Inverse 5-3 wavelet tranform in 2-D. */
|
|
||||||
/* </summary> */
|
|
||||||
void dwt_decode(int *a, int w, int h, tcd_tilecomp_t * tilec, int l,
|
|
||||||
int stop)
|
|
||||||
{
|
|
||||||
int i, j;
|
|
||||||
int rw; /* width 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 rh1; /* height of the resolution level once lower than computed one */
|
|
||||||
|
|
||||||
for (i = l - 1; i >= stop; i--) {
|
|
||||||
int cas_col = 0; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */
|
|
||||||
int cas_row = 0; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering */
|
|
||||||
|
|
||||||
rw = tilec->resolutions[l - i].x1 - tilec->resolutions[l - i].x0;
|
|
||||||
rh = tilec->resolutions[l - i].y1 - tilec->resolutions[l - i].y0;
|
|
||||||
rw1 =
|
|
||||||
tilec->resolutions[l - i - 1].x1 - tilec->resolutions[l - i - 1].x0;
|
|
||||||
rh1 =
|
|
||||||
tilec->resolutions[l - i - 1].y1 - tilec->resolutions[l - i - 1].y0;
|
|
||||||
|
|
||||||
cas_row = tilec->resolutions[l - i].x0 % 2;
|
|
||||||
cas_col = tilec->resolutions[l - i].y0 % 2;
|
|
||||||
|
|
||||||
for (j = 0; j < rh; j++)
|
|
||||||
dwt_decode_1(a + j * w, rw, 1, rw1, cas_row);
|
|
||||||
for (j = 0; j < rw; j++)
|
|
||||||
dwt_decode_1(a + j, rh, w, rh1, cas_col);
|
|
||||||
}
|
|
||||||
dwt_clean();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* Get gain of 5-3 wavelet transform. */
|
|
||||||
/* </summary> */
|
|
||||||
int dwt_getgain(int orient)
|
|
||||||
{
|
|
||||||
if (orient == 0)
|
|
||||||
return 0;
|
|
||||||
if (orient == 1 || orient == 2)
|
|
||||||
return 1;
|
|
||||||
return 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* Get norm of 5-3 wavelet. */
|
|
||||||
/* </summary> */
|
|
||||||
double dwt_getnorm(int level, int orient)
|
|
||||||
{
|
|
||||||
return dwt_norms[orient][level];
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* Forward 9-7 wavelet transform in 1-D. */
|
|
||||||
/* </summary> */
|
|
||||||
void dwt_encode_1_real(int *a, int n, int x, int res, int cas)
|
|
||||||
{
|
|
||||||
int dn, sn, i = 0;
|
|
||||||
dn = n - res;
|
|
||||||
sn = res;
|
|
||||||
|
|
||||||
if (cas) {
|
|
||||||
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 */
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
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 */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
dwt_deinterleave(a, n, x, res, cas);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* Inverse 9-7 wavelet transform in 1-D. */
|
|
||||||
/* </summary> */
|
|
||||||
void dwt_decode_1_real(int *a, int n, int x, int res, int cas)
|
|
||||||
{
|
|
||||||
int dn, sn, i = 0;
|
|
||||||
dn = n - res;
|
|
||||||
sn = res;
|
|
||||||
dwt_interleave(a, n, x, res, cas);
|
|
||||||
if (cas) {
|
|
||||||
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), 12993);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
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), 12993);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* Forward 9-7 wavelet transform in 2-D. */
|
|
||||||
/* </summary> */
|
|
||||||
|
|
||||||
void dwt_encode_real(int *a, int w, int h, tcd_tilecomp_t * tilec, int l)
|
|
||||||
{
|
|
||||||
int i, j;
|
|
||||||
int rw; /* width 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 rh1; /* height of the resolution level once lower than computed one */
|
|
||||||
|
|
||||||
for (i = 0; i < l; i++) {
|
|
||||||
int cas_col = 0; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */
|
|
||||||
int cas_row = 0; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering */
|
|
||||||
rw = tilec->resolutions[l - i].x1 - tilec->resolutions[l - i].x0;
|
|
||||||
rh = tilec->resolutions[l - i].y1 - tilec->resolutions[l - i].y0;
|
|
||||||
rw1 =
|
|
||||||
tilec->resolutions[l - i - 1].x1 - tilec->resolutions[l - i - 1].x0;
|
|
||||||
rh1 =
|
|
||||||
tilec->resolutions[l - i - 1].y1 - tilec->resolutions[l - i - 1].y0;
|
|
||||||
|
|
||||||
cas_row = tilec->resolutions[l - i].x0 % 2;
|
|
||||||
cas_col = tilec->resolutions[l - i].y0 % 2;
|
|
||||||
|
|
||||||
for (j = 0; j < rw; j++)
|
|
||||||
dwt_encode_1_real(a + j, rh, w, rh1, cas_col);
|
|
||||||
for (j = 0; j < rh; j++)
|
|
||||||
dwt_encode_1_real(a + j * w, rw, 1, rw1, cas_row);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* Inverse 9-7 wavelet transform in 2-D. */
|
|
||||||
/* </summary> */
|
|
||||||
void dwt_decode_real(int *a, int w, int h, tcd_tilecomp_t * tilec, int l,
|
|
||||||
int stop)
|
|
||||||
{
|
|
||||||
int i, j;
|
|
||||||
int rw; /* width 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 rh1; /* height of the resolution level once lower than computed one */
|
|
||||||
|
|
||||||
for (i = l - 1; i >= stop; i--) {
|
|
||||||
int cas_col = 0; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */
|
|
||||||
int cas_row = 0; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering */
|
|
||||||
|
|
||||||
rw = tilec->resolutions[l - i].x1 - tilec->resolutions[l - i].x0;
|
|
||||||
rh = tilec->resolutions[l - i].y1 - tilec->resolutions[l - i].y0;
|
|
||||||
rw1 =
|
|
||||||
tilec->resolutions[l - i - 1].x1 - tilec->resolutions[l - i - 1].x0;
|
|
||||||
rh1 =
|
|
||||||
tilec->resolutions[l - i - 1].y1 - tilec->resolutions[l - i - 1].y0;
|
|
||||||
|
|
||||||
cas_row = tilec->resolutions[l - i].x0 % 2;
|
|
||||||
cas_col = tilec->resolutions[l - i].y0 % 2;
|
|
||||||
|
|
||||||
for (j = 0; j < rh; j++)
|
|
||||||
dwt_decode_1_real(a + j * w, rw, 1, rw1, cas_row);
|
|
||||||
for (j = 0; j < rw; j++)
|
|
||||||
dwt_decode_1_real(a + j, rh, w, rh1, cas_col);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* Get gain of 9-7 wavelet transform. */
|
|
||||||
/* </summary> */
|
|
||||||
int dwt_getgain_real(int orient)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* Get norm of 9-7 wavelet. */
|
|
||||||
/* </summary> */
|
|
||||||
double dwt_getnorm_real(int level, int orient)
|
|
||||||
{
|
|
||||||
return dwt_norms_real[orient][level];
|
|
||||||
}
|
|
|
@ -1,101 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2002, David Janssens
|
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
|
||||||
* Copyright (c) 2002-2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "tcd.h"
|
|
||||||
|
|
||||||
#ifndef __DWT_H
|
|
||||||
#define __DWT_H
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Apply a reversible DWT transform to a component of an image
|
|
||||||
* a: samples of the component
|
|
||||||
* w: width of the component
|
|
||||||
* h: height of the component
|
|
||||||
* tilec : tile component information (present tile)
|
|
||||||
* l: number of decomposition levels in the DWT
|
|
||||||
*/
|
|
||||||
/* void dwt_encode(int* a, int w, int h, int l); */
|
|
||||||
void dwt_encode(int *a, int w, int h, tcd_tilecomp_t * tilec, int l);
|
|
||||||
/*
|
|
||||||
* Apply a reversible inverse DWT transform to a component of an image
|
|
||||||
* a: samples of the component
|
|
||||||
* w: width of the component
|
|
||||||
* h: height of the component
|
|
||||||
* tilec : tile component information (present tile)
|
|
||||||
* l: number of decomposition levels in the DWT
|
|
||||||
* row_tilec : tile component information (previous tile on the same row)
|
|
||||||
* col_tilec : tile component information (previous tile on the same column)
|
|
||||||
*/
|
|
||||||
void dwt_decode(int *a, int w, int h, tcd_tilecomp_t * tilec, int l,
|
|
||||||
int stop);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get the gain of a subband for the reversible DWT
|
|
||||||
* orient: number that identifies the subband (0->LL, 1->HL, 2->LH, 3->HH)
|
|
||||||
*/
|
|
||||||
int dwt_getgain(int orient);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get the norm of a wavelet function of a subband at a specified level for the reversible DWT
|
|
||||||
* level: level of the wavelet function
|
|
||||||
* orient: band of the wavelet function
|
|
||||||
*/
|
|
||||||
double dwt_getnorm(int level, int orient);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Apply an irreversible DWT transform to a component of an image
|
|
||||||
* a: samples of the component
|
|
||||||
* w: width of the component
|
|
||||||
* h: height of the component
|
|
||||||
* l: number of decomposition levels in the DWT
|
|
||||||
*/
|
|
||||||
void dwt_encode_real(int *a, int w, int h, tcd_tilecomp_t * tilec, int l);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Apply an irreversible inverse DWT transform to a component of an image
|
|
||||||
* a: samples of the component
|
|
||||||
* w: width of the component
|
|
||||||
* h: height of the component
|
|
||||||
* l: number of decomposition levels in the DWT
|
|
||||||
*/
|
|
||||||
void dwt_decode_real(int *a, int w, int h, tcd_tilecomp_t * tilec, int l,
|
|
||||||
int stop);
|
|
||||||
/*
|
|
||||||
* Get the gain of a subband for the irreversible DWT
|
|
||||||
* orient: number that identifies the subband (0->LL, 1->HL, 2->LH, 3->HH)
|
|
||||||
*/
|
|
||||||
int dwt_getgain_real(int orient);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get the norm of a wavelet function of a subband at a specified level for the irreversible DWT
|
|
||||||
* level: level of the wavelet function
|
|
||||||
* orient: band of the wavelet function
|
|
||||||
*/
|
|
||||||
double dwt_getnorm_real(int level, int orient);
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,54 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2002, David Janssens
|
|
||||||
* 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 "fix.h"
|
|
||||||
#include <math.h> //Add Antonin : multbug1
|
|
||||||
|
|
||||||
#ifdef WIN32
|
|
||||||
#define int64 __int64
|
|
||||||
#else
|
|
||||||
#define int64 long long
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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
|
|
||||||
|
|
|
@ -1,33 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2002, David Janssens
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef __FIX_H
|
|
||||||
#define __FIX_H
|
|
||||||
|
|
||||||
int fix_mul(int a, int b);
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,113 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2002, David Janssens
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get the maximum of two integers.
|
|
||||||
*
|
|
||||||
* returns a if a > b else b
|
|
||||||
*/
|
|
||||||
int int_max(int a, int b)
|
|
||||||
{
|
|
||||||
return a > b ? a : b;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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)
|
|
||||||
return min;
|
|
||||||
if (a > max)
|
|
||||||
return max;
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get absolute value of integer.
|
|
||||||
*/
|
|
||||||
int int_abs(int a)
|
|
||||||
{
|
|
||||||
return a < 0 ? -a : a;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Divide an integer and round upwards.
|
|
||||||
*
|
|
||||||
* a divided by b
|
|
||||||
*/
|
|
||||||
int int_ceildiv(int a, int b)
|
|
||||||
{
|
|
||||||
return (a + b - 1) / 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get logarithm of an integer and round downwards.
|
|
||||||
*
|
|
||||||
* log2(a)
|
|
||||||
*/
|
|
||||||
int int_floorlog2(int a)
|
|
||||||
{
|
|
||||||
int l;
|
|
||||||
for (l = 0; a > 1; l++) {
|
|
||||||
a >>= 1;
|
|
||||||
}
|
|
||||||
return l;
|
|
||||||
}
|
|
|
@ -1,86 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2002, David Janssens
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __INT_H
|
|
||||||
#define __INT_H
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get the minimum of two integers.
|
|
||||||
*
|
|
||||||
* returns a if a < b else b
|
|
||||||
*/
|
|
||||||
int int_min(int a, int b);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get the maximum of two integers.
|
|
||||||
*
|
|
||||||
* returns a if a > b else b
|
|
||||||
*/
|
|
||||||
int int_max(int a, int b);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get absolute value of integer.
|
|
||||||
*/
|
|
||||||
int int_abs(int a);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Divide an integer and round upwards.
|
|
||||||
*
|
|
||||||
* a divided by b
|
|
||||||
*/
|
|
||||||
int int_ceildiv(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);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Divide an integer by a power of 2 and round downwards.
|
|
||||||
*
|
|
||||||
* a divided by 2^b
|
|
||||||
*/
|
|
||||||
int int_floordivpow2(int a, int b);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get logarithm of an integer and round downwards.
|
|
||||||
*
|
|
||||||
* log2(a)
|
|
||||||
*/
|
|
||||||
int int_floorlog2(int a);
|
|
||||||
|
|
||||||
#endif
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,238 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2002, David Janssens
|
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
|
||||||
* Copyright (c) 2002-2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define VERSION "0.0.8"
|
|
||||||
//#include "jpw.h"
|
|
||||||
#ifdef DAVID_WIN32
|
|
||||||
#ifdef LIBJ2K_EXPORTS
|
|
||||||
#define LIBJ2K_API __declspec(dllexport)
|
|
||||||
#else
|
|
||||||
#define LIBJ2K_API __declspec(dllimport)
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
#define LIBJ2K_API
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __J2K_H
|
|
||||||
#define __J2K_H
|
|
||||||
|
|
||||||
#define J2K_MAXRLVLS 33 /* Number of maximum resolution level authorized */
|
|
||||||
#define J2K_MAXBANDS (3*J2K_MAXRLVLS-2) /* Number of maximum sub-band linked to number of resolution level */
|
|
||||||
|
|
||||||
#define J2K_CP_CSTY_PRT 0x01
|
|
||||||
#define J2K_CP_CSTY_SOP 0x02
|
|
||||||
#define J2K_CP_CSTY_EPH 0x04
|
|
||||||
#define J2K_CCP_CSTY_PRT 0x01
|
|
||||||
#define J2K_CCP_CBLKSTY_LAZY 0x01
|
|
||||||
#define J2K_CCP_CBLKSTY_RESET 0x02
|
|
||||||
#define J2K_CCP_CBLKSTY_TERMALL 0x04
|
|
||||||
#define J2K_CCP_CBLKSTY_VSC 0x08
|
|
||||||
#define J2K_CCP_CBLKSTY_PTERM 0x10
|
|
||||||
#define J2K_CCP_CBLKSTY_SEGSYM 0x20
|
|
||||||
#define J2K_CCP_QNTSTY_NOQNT 0
|
|
||||||
#define J2K_CCP_QNTSTY_SIQNT 1
|
|
||||||
#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 {
|
|
||||||
int x0, y0; /* XOsiz, YOsiz */
|
|
||||||
int x1, y1; /* Xsiz, Ysiz */
|
|
||||||
int numcomps; /* number of components */
|
|
||||||
int color_space; /* sRGB, Greyscale or YUV */
|
|
||||||
j2k_comp_t *comps; /* image-components */
|
|
||||||
} j2k_image_t;
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int expn; /* exponent */
|
|
||||||
int mant; /* mantissa */
|
|
||||||
} j2k_stepsize_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int csty; /* coding style */
|
|
||||||
int numresolutions; /* number of resolutions */
|
|
||||||
int cblkw; /* width of code-blocks */
|
|
||||||
int cblkh; /* height of code-blocks */
|
|
||||||
int cblksty; /* code-block coding style */
|
|
||||||
int qmfbid; /* discrete wavelet transform identifier */
|
|
||||||
int qntsty; /* quantisation style */
|
|
||||||
j2k_stepsize_t stepsizes[J2K_MAXBANDS]; /* stepsizes used for quantization */
|
|
||||||
int numgbits; /* number of guard bits */
|
|
||||||
int roishift; /* Region Of Interest shift */
|
|
||||||
int prcw[J2K_MAXRLVLS]; /* Precinct width */
|
|
||||||
int prch[J2K_MAXRLVLS]; /* Precinct height */
|
|
||||||
} 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 */
|
|
||||||
int csty; /* coding style */
|
|
||||||
int prg; /* progression order */
|
|
||||||
int numlayers; /* number of layers */
|
|
||||||
int mct; /* multi-component transform identifier */
|
|
||||||
int rates[100]; /* rates of layers */
|
|
||||||
int numpocs; /* number of progression order changes */
|
|
||||||
int POC; /* Precise if a POC marker has been used O:NO, 1:YES */
|
|
||||||
j2k_poc_t pocs[32]; /* progression order changes */
|
|
||||||
unsigned char *ppt_data; /* packet header store there for futur use in t2_decode_packet */
|
|
||||||
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 JPEG2000_format; /* 0: J2K 1:JP2 */
|
|
||||||
int intermed_file; /* 1: Store each encoded tile one by one in the output file (for mega-Images)*/
|
|
||||||
int image_type; /* 0: PNM, PGM, PPM 1: PGX */
|
|
||||||
int disto_alloc; /* Allocation by rate/distortion */
|
|
||||||
int fixed_alloc; /* Allocation by fixed layer */
|
|
||||||
int fixed_quality; /* add fixed_quality */
|
|
||||||
int reduce_on; /* option reduce is used if reduce = 1 */
|
|
||||||
int reduce_value; /* if option reduce is used -> original dimension divided by 2^value */
|
|
||||||
int index_on; /* 0 = no index || 1 = index */
|
|
||||||
int tx0, ty0; /* XTOsiz, YTOsiz */
|
|
||||||
int tdx, tdy; /* XTsiz, YTsiz */
|
|
||||||
char *comment; /* comment for coding */
|
|
||||||
int tw, th; /* number of tiles in width and heigth */
|
|
||||||
int *tileno; /* ID number of the tiles present in the codestream */
|
|
||||||
int tileno_size; /* size of the vector tileno */
|
|
||||||
unsigned char *ppm_data; /* packet header store there for futur use in t2_decode_packet */
|
|
||||||
int ppm; /* If ppm == 1 --> there was a PPM marker for the present tile */
|
|
||||||
int ppm_store; /* Use in case of multiple marker PPM (number of info already store) */
|
|
||||||
int ppm_previous; /* Use in case of multiple marker PPM (case on non-finished previous info) */
|
|
||||||
int ppm_len; /* ppmbug1 */
|
|
||||||
j2k_tcp_t *tcps; /* tile coding parameters */
|
|
||||||
int *matrice; /* Fixed layer */
|
|
||||||
} j2k_cp_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int start_pos, end_pos; /* start and end position */
|
|
||||||
double disto; /* ADD for Marcela */
|
|
||||||
} info_packet; /* Index struct */
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
double *thresh; /* value of thresh for each layer by tile cfr. Marcela */
|
|
||||||
int num_tile; /* Number of Tile */
|
|
||||||
int start_pos; /* Start position */
|
|
||||||
int end_header; /* End position of the header */
|
|
||||||
int end_pos; /* End position */
|
|
||||||
int pw[33], ph[33]; /* precinct number for each resolution level */
|
|
||||||
|
|
||||||
int pdx[33], pdy[33]; /* precinct size (in power of 2), in X and Y for each resolution level */
|
|
||||||
info_packet *packet; /* information concerning packets inside tile */
|
|
||||||
int nbpix; /* add fixed_quality */
|
|
||||||
double distotile; /* add fixed_quality */
|
|
||||||
} info_tile; /* index struct */
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int index_on;
|
|
||||||
double D_max; /* ADD for Marcela */
|
|
||||||
int num; /* numero of packet */
|
|
||||||
int index_write; /* writing the packet inthe index with t2_encode_packets */
|
|
||||||
int Im_w, Im_h; /* Image width and Height */
|
|
||||||
int Prog; /* progression order */
|
|
||||||
int Tile_x, Tile_y; /* Tile size in x and y */
|
|
||||||
int tw, th; /* Number of Tile in X and Y */
|
|
||||||
int Comp; /* Component numbers */
|
|
||||||
int Layer; /* number of layer */
|
|
||||||
int Decomposition; /* number of decomposition */
|
|
||||||
int Main_head_end; /* Main header position */
|
|
||||||
int codestream_size; /* codestream's size */
|
|
||||||
info_tile *tile; /* information concerning tiles inside image */
|
|
||||||
} info_image; /* index struct */
|
|
||||||
|
|
||||||
// index struct correction
|
|
||||||
void pack_corr(unsigned long corr, int tileno);
|
|
||||||
|
|
||||||
//write index file
|
|
||||||
void write_index(char *index, unsigned long CL);
|
|
||||||
|
|
||||||
void j2k_clean();
|
|
||||||
|
|
||||||
void j2k_free_info();
|
|
||||||
|
|
||||||
void j2k_free_tcd();
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Encode an image into a JPEG-2000 codestream
|
|
||||||
* i: image to encode
|
|
||||||
* cp: coding parameters
|
|
||||||
* output: destination buffer or name of the output file when cp->intermed_file==1
|
|
||||||
* len: length of destination buffer
|
|
||||||
* index : index file name
|
|
||||||
*/
|
|
||||||
LIBJ2K_API int j2k_encode(j2k_image_t * i, j2k_cp_t * cp, char *output,
|
|
||||||
int len, char *index);
|
|
||||||
|
|
||||||
/* LIBJ2K_API int j2k_encode(j2k_image_t *i, j2k_cp_t *cp,unsigned char *dest, int len); */
|
|
||||||
/*
|
|
||||||
* Decode an image from a JPEG-2000 codestream
|
|
||||||
* src: source buffer
|
|
||||||
* len: length of source buffer
|
|
||||||
* i: decode image
|
|
||||||
* cp: coding parameters that were used to encode the image
|
|
||||||
*/
|
|
||||||
|
|
||||||
LIBJ2K_API int j2k_decode(unsigned char *src, int len, j2k_image_t * img,
|
|
||||||
j2k_cp_t * cp);
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Decode an image form a JPT-stream (JPEG 2000, JPIP)
|
|
||||||
* src: source buffer
|
|
||||||
* len: length of source buffer
|
|
||||||
* i: decode image
|
|
||||||
* cp: coding parameters that were used to encode the image
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
int j2k_decode_jpt_stream(unsigned char *src, int len, j2k_image_t * img,
|
|
||||||
j2k_cp_t * cp);
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,590 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2003-2004, Yannick Verschueren
|
|
||||||
* Copyright (c) 2003-2004, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "j2k.h"
|
|
||||||
#include "jp2.h"
|
|
||||||
#include "cio.h"
|
|
||||||
#include "tcd.h"
|
|
||||||
#include "int.h"
|
|
||||||
#include "jpw.h"
|
|
||||||
|
|
||||||
#define JPIP_JPIP 0x6a706970
|
|
||||||
|
|
||||||
#define JP2_JP 0x6a502020
|
|
||||||
#define JP2_FTYP 0x66747970
|
|
||||||
#define JP2_JP2H 0x6a703268
|
|
||||||
#define JP2_IHDR 0x69686472
|
|
||||||
#define JP2_COLR 0x636f6c72
|
|
||||||
#define JP2_JP2C 0x6a703263
|
|
||||||
#define JP2_URL 0x75726c20
|
|
||||||
#define JP2_DBTL 0x6474626c
|
|
||||||
#define JP2_BPCC 0x62706363
|
|
||||||
#define JP2_JP2 0x6a703220
|
|
||||||
|
|
||||||
|
|
||||||
extern JPWL_cp_t jpwl_cp;
|
|
||||||
extern info_image info_IM;
|
|
||||||
extern int use_index;
|
|
||||||
|
|
||||||
/*
|
|
||||||
*
|
|
||||||
* Read box headers
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
int jp2_read_boxhdr(jp2_box_t * box)
|
|
||||||
{
|
|
||||||
box->init_pos = cio_tell();
|
|
||||||
box->length = cio_read(4);
|
|
||||||
box->type = cio_read(4);
|
|
||||||
if (box->length == 1) {
|
|
||||||
if (cio_read(4) != 0) {
|
|
||||||
fprintf(stderr, "Error: Cannot handle box sizes higher than 2^32\n");
|
|
||||||
return 1;
|
|
||||||
};
|
|
||||||
box->length = cio_read(4);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
*
|
|
||||||
* Initialisation of a Standard JP2 structure
|
|
||||||
*/
|
|
||||||
|
|
||||||
int jp2_init_stdjp2(jp2_struct_t * jp2_struct, j2k_image_t * img)
|
|
||||||
{
|
|
||||||
int depth_0, sign, depth, i;
|
|
||||||
|
|
||||||
|
|
||||||
jp2_struct->h = img->y1 - img->y0; // HEIGHT
|
|
||||||
jp2_struct->w = img->x1 - img->x0; // WIDTH
|
|
||||||
jp2_struct->numcomps = img->numcomps; // NC
|
|
||||||
jp2_struct->comps = (jp2_comps_t *) malloc(jp2_struct->numcomps * sizeof(jp2_comps_t));
|
|
||||||
|
|
||||||
depth_0 = img->comps[0].prec - 1;
|
|
||||||
sign = img->comps[0].sgnd;
|
|
||||||
jp2_struct->bpc = depth_0 + (sign << 7);
|
|
||||||
|
|
||||||
for (i = 1; i < img->numcomps; i++) {
|
|
||||||
depth = img->comps[i].prec - 1;
|
|
||||||
sign = img->comps[i].sgnd;
|
|
||||||
if (depth_0 != depth)
|
|
||||||
jp2_struct->bpc = 255;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
jp2_struct->C = 7; // C : Always 7
|
|
||||||
jp2_struct->UnkC = 0; // UnkC, colorspace specified in colr box
|
|
||||||
jp2_struct->IPR = 0; // IPR, no intellectual property
|
|
||||||
|
|
||||||
for (i = 0; i < img->numcomps; i++)
|
|
||||||
jp2_struct->comps[i].bpcc =
|
|
||||||
img->comps[i].prec - 1 + (img->comps[i].sgnd << 7);
|
|
||||||
|
|
||||||
jp2_struct->precedence = 0; // PRECEDENCE
|
|
||||||
jp2_struct->approx = 0; // APPROX
|
|
||||||
|
|
||||||
if ((img->numcomps == 1 || img->numcomps == 3)
|
|
||||||
&& (jp2_struct->bpc != 255))
|
|
||||||
jp2_struct->meth = 1;
|
|
||||||
else
|
|
||||||
jp2_struct->meth = 2;
|
|
||||||
|
|
||||||
if (jp2_struct->meth == 1) {
|
|
||||||
if (img->color_space == 1)
|
|
||||||
jp2_struct->enumcs = 16;
|
|
||||||
else if (img->color_space == 2)
|
|
||||||
jp2_struct->enumcs = 17;
|
|
||||||
else if (img->color_space == 3)
|
|
||||||
jp2_struct->enumcs = 18; // YUV
|
|
||||||
} else
|
|
||||||
jp2_struct->enumcs = 0; // PROFILE (??)
|
|
||||||
|
|
||||||
jp2_struct->brand = JP2_JP2; /* BR */
|
|
||||||
jp2_struct->minversion = 0; /* MinV */
|
|
||||||
jp2_struct->numcl = 1;
|
|
||||||
jp2_struct->cl = (int *) malloc(jp2_struct->numcl * sizeof(int));
|
|
||||||
jp2_struct->cl[0] = JP2_JP2; /* CL0 : JP2 */
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void jp2_write_url(char *Idx_file)
|
|
||||||
{
|
|
||||||
unsigned int i;
|
|
||||||
char str[256];
|
|
||||||
jp2_box_t box;
|
|
||||||
|
|
||||||
sprintf(str, "%s", Idx_file);
|
|
||||||
|
|
||||||
|
|
||||||
box.init_pos = cio_tell();
|
|
||||||
cio_skip(4);
|
|
||||||
cio_write(JP2_URL, 4); // DBTL
|
|
||||||
cio_write(0, 1); // VERS
|
|
||||||
cio_write(0, 3); // FLAG
|
|
||||||
|
|
||||||
for (i = 0; i < strlen(str); i++) {
|
|
||||||
cio_write(str[i], 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
box.length = cio_tell() - box.init_pos;
|
|
||||||
cio_seek(box.init_pos);
|
|
||||||
cio_write(box.length, 4); /* L */
|
|
||||||
cio_seek(box.init_pos + box.length);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Read the IHDR box
|
|
||||||
*
|
|
||||||
* Image Header box
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
int jp2_read_ihdr(jp2_struct_t * jp2_struct)
|
|
||||||
{
|
|
||||||
jp2_box_t box;
|
|
||||||
|
|
||||||
jp2_read_boxhdr(&box);
|
|
||||||
if (JP2_IHDR != box.type) {
|
|
||||||
fprintf(stderr, "Error: Expected IHDR Marker\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
jp2_struct->h = cio_read(4); // HEIGHT
|
|
||||||
jp2_struct->w = cio_read(4); // WIDTH
|
|
||||||
jp2_struct->numcomps = cio_read(2); // NC
|
|
||||||
|
|
||||||
jp2_struct->bpc = cio_read(1); // BPC
|
|
||||||
|
|
||||||
jp2_struct->C = cio_read(1); // C
|
|
||||||
jp2_struct->UnkC = cio_read(1); // UnkC
|
|
||||||
jp2_struct->IPR = cio_read(1); // IPR
|
|
||||||
|
|
||||||
if (cio_tell() - box.init_pos != box.length) {
|
|
||||||
fprintf(stderr, "Error with IHDR Box\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void jp2_write_ihdr(jp2_struct_t * jp2_struct)
|
|
||||||
{
|
|
||||||
jp2_box_t box;
|
|
||||||
|
|
||||||
box.init_pos = cio_tell();
|
|
||||||
cio_skip(4);
|
|
||||||
cio_write(JP2_IHDR, 4); // IHDR
|
|
||||||
|
|
||||||
cio_write(jp2_struct->h, 4); // HEIGHT
|
|
||||||
cio_write(jp2_struct->w, 4); // WIDTH
|
|
||||||
cio_write(jp2_struct->numcomps, 2); // NC
|
|
||||||
|
|
||||||
cio_write(jp2_struct->bpc, 1); // BPC
|
|
||||||
|
|
||||||
cio_write(jp2_struct->C, 1); // C : Always 7
|
|
||||||
cio_write(jp2_struct->UnkC, 1); // UnkC, colorspace unknow
|
|
||||||
cio_write(jp2_struct->IPR, 1); // IPR, no intellectual property
|
|
||||||
|
|
||||||
box.length = cio_tell() - box.init_pos;
|
|
||||||
cio_seek(box.init_pos);
|
|
||||||
cio_write(box.length, 4); /* L */
|
|
||||||
cio_seek(box.init_pos + box.length);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void jp2_write_bpcc(jp2_struct_t * jp2_struct)
|
|
||||||
{
|
|
||||||
unsigned int i;
|
|
||||||
jp2_box_t box;
|
|
||||||
|
|
||||||
box.init_pos = cio_tell();
|
|
||||||
cio_skip(4);
|
|
||||||
cio_write(JP2_BPCC, 4); // BPCC
|
|
||||||
|
|
||||||
for (i = 0; i < jp2_struct->numcomps; i++)
|
|
||||||
cio_write(jp2_struct->comps[i].bpcc, 1);
|
|
||||||
|
|
||||||
box.length = cio_tell() - box.init_pos;
|
|
||||||
cio_seek(box.init_pos);
|
|
||||||
cio_write(box.length, 4); /* L */
|
|
||||||
cio_seek(box.init_pos + box.length);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int jp2_read_bpcc(jp2_struct_t * jp2_struct)
|
|
||||||
{
|
|
||||||
unsigned int i;
|
|
||||||
jp2_box_t box;
|
|
||||||
|
|
||||||
jp2_read_boxhdr(&box);
|
|
||||||
if (JP2_BPCC != box.type) {
|
|
||||||
fprintf(stderr, "Error: Expected BPCC Marker\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < jp2_struct->numcomps; i++)
|
|
||||||
jp2_struct->comps[i].bpcc = cio_read(1);
|
|
||||||
|
|
||||||
if (cio_tell() - box.init_pos != box.length) {
|
|
||||||
fprintf(stderr, "Error with BPCC Box\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void jp2_write_colr(jp2_struct_t * jp2_struct)
|
|
||||||
{
|
|
||||||
jp2_box_t box;
|
|
||||||
|
|
||||||
box.init_pos = cio_tell();
|
|
||||||
cio_skip(4);
|
|
||||||
cio_write(JP2_COLR, 4); // COLR
|
|
||||||
|
|
||||||
cio_write(jp2_struct->meth, 1); // METH
|
|
||||||
cio_write(jp2_struct->precedence, 1); // PRECEDENCE
|
|
||||||
cio_write(jp2_struct->approx, 1); // APPROX
|
|
||||||
|
|
||||||
if (jp2_struct->meth == 1)
|
|
||||||
cio_write(jp2_struct->enumcs, 4); // EnumCS
|
|
||||||
else
|
|
||||||
cio_write(0, 1); // PROFILE (??)
|
|
||||||
|
|
||||||
box.length = cio_tell() - box.init_pos;
|
|
||||||
cio_seek(box.init_pos);
|
|
||||||
cio_write(box.length, 4); /* L */
|
|
||||||
cio_seek(box.init_pos + box.length);
|
|
||||||
}
|
|
||||||
|
|
||||||
int jp2_read_colr(jp2_struct_t * jp2_struct)
|
|
||||||
{
|
|
||||||
jp2_box_t box;
|
|
||||||
|
|
||||||
jp2_read_boxhdr(&box);
|
|
||||||
if (JP2_COLR != box.type) {
|
|
||||||
fprintf(stderr, "Error: Expected COLR Marker\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
jp2_struct->meth = cio_read(1); // METH
|
|
||||||
jp2_struct->precedence = cio_read(1); // PRECEDENCE
|
|
||||||
jp2_struct->approx = cio_read(1); // APPROX
|
|
||||||
|
|
||||||
if (jp2_struct->meth == 1)
|
|
||||||
jp2_struct->enumcs = cio_read(4); // EnumCS
|
|
||||||
else
|
|
||||||
cio_read(1); // PROFILE
|
|
||||||
|
|
||||||
if (cio_tell() - box.init_pos != box.length) {
|
|
||||||
fprintf(stderr, "Error with BPCC Box\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Write the JP2H box
|
|
||||||
*
|
|
||||||
* JP2 Header box
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void jp2_write_jp2h(jp2_struct_t * jp2_struct)
|
|
||||||
{
|
|
||||||
jp2_box_t box;
|
|
||||||
|
|
||||||
box.init_pos = cio_tell();
|
|
||||||
cio_skip(4);;
|
|
||||||
cio_write(JP2_JP2H, 4); /* JP2H */
|
|
||||||
|
|
||||||
jp2_write_ihdr(jp2_struct);
|
|
||||||
|
|
||||||
if (jp2_struct->bpc == 255)
|
|
||||||
jp2_write_bpcc(jp2_struct);
|
|
||||||
jp2_write_colr(jp2_struct);
|
|
||||||
|
|
||||||
box.length = cio_tell() - box.init_pos;
|
|
||||||
cio_seek(box.init_pos);
|
|
||||||
cio_write(box.length, 4); /* L */
|
|
||||||
cio_seek(box.init_pos + box.length);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Read the JP2H box
|
|
||||||
*
|
|
||||||
* JP2 Header box
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
int jp2_read_jp2h(jp2_struct_t * jp2_struct)
|
|
||||||
{
|
|
||||||
jp2_box_t box;
|
|
||||||
|
|
||||||
jp2_read_boxhdr(&box);
|
|
||||||
if (JP2_JP2H != box.type) {
|
|
||||||
fprintf(stderr, "Error: Expected JP2H Marker\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (jp2_read_ihdr(jp2_struct))
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
if (jp2_struct->bpc == 255)
|
|
||||||
if (jp2_read_bpcc(jp2_struct))
|
|
||||||
return 1;
|
|
||||||
if (jp2_read_colr(jp2_struct))
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
if (cio_tell() - box.init_pos != box.length) {
|
|
||||||
fprintf(stderr, "Error with JP2H Box\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Write the FTYP box
|
|
||||||
*
|
|
||||||
* File type box
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void jp2_write_ftyp(jp2_struct_t * jp2_struct)
|
|
||||||
{
|
|
||||||
unsigned int i;
|
|
||||||
jp2_box_t box;
|
|
||||||
|
|
||||||
box.init_pos = cio_tell();
|
|
||||||
cio_skip(4);
|
|
||||||
cio_write(JP2_FTYP, 4); /* FTYP */
|
|
||||||
|
|
||||||
cio_write(jp2_struct->brand, 4); /* BR */
|
|
||||||
cio_write(jp2_struct->minversion, 4); /* MinV */
|
|
||||||
|
|
||||||
for (i = 0; i < jp2_struct->numcl; i++)
|
|
||||||
cio_write(jp2_struct->cl[i], 4); /* CL */
|
|
||||||
|
|
||||||
box.length = cio_tell() - box.init_pos;
|
|
||||||
cio_seek(box.init_pos);
|
|
||||||
cio_write(box.length, 4); /* L */
|
|
||||||
cio_seek(box.init_pos + box.length);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Read the FTYP box
|
|
||||||
*
|
|
||||||
* File type box
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
int jp2_read_ftyp(jp2_struct_t * jp2_struct)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
jp2_box_t box;
|
|
||||||
|
|
||||||
jp2_read_boxhdr(&box);
|
|
||||||
|
|
||||||
if (JP2_FTYP != box.type) {
|
|
||||||
fprintf(stderr, "Error: Excpected FTYP Marker\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
jp2_struct->brand = cio_read(4); /* BR */
|
|
||||||
jp2_struct->minversion = cio_read(4); /* MinV */
|
|
||||||
jp2_struct->numcl = (box.length - 16) / 4;
|
|
||||||
jp2_struct->cl =
|
|
||||||
(unsigned int *) malloc(jp2_struct->numcl * sizeof(unsigned int));
|
|
||||||
|
|
||||||
for (i = jp2_struct->numcl; i > 0; i--)
|
|
||||||
jp2_struct->cl[i] = cio_read(4); /* CLi */
|
|
||||||
|
|
||||||
if (cio_tell() - box.init_pos != box.length) {
|
|
||||||
fprintf(stderr, "Error with FTYP Box\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int jp2_write_jp2c(j2k_image_t * img, j2k_cp_t * cp, char *jp2_buffer,
|
|
||||||
char *index)
|
|
||||||
{
|
|
||||||
int len, i, set;
|
|
||||||
char *cstr, *out;
|
|
||||||
jp2_box_t box;
|
|
||||||
|
|
||||||
box.init_pos = cio_tell();
|
|
||||||
cio_skip(4);
|
|
||||||
cio_write(JP2_JP2C, 4); // JP2C
|
|
||||||
if (jpwl_cp.JPWL_on){
|
|
||||||
set=cio_tell();
|
|
||||||
cstr = (char *) malloc( cp->tdx * cp->tdy * cp->tw * cp->th * 10*sizeof(char)); /* Allocate memory for all tiles */
|
|
||||||
cio_init(cstr, cp->tdx * cp->tdy * cp->tw * cp->th * 10);
|
|
||||||
len = j2k_encode(img, cp, cstr, cp->tdx * cp->tdy * cp->tw * cp->th * 10, index);
|
|
||||||
if (len == 0) {
|
|
||||||
fprintf(stderr, "failed to encode image\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
out= (char *) malloc(len*6*sizeof(char));
|
|
||||||
len=jpwl_encode(cstr,out,len);
|
|
||||||
if (len == 0) {
|
|
||||||
fprintf(stderr, "failed to encode image\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
//ricopio la codestream, sono nel buffer out
|
|
||||||
cio_seek(0);
|
|
||||||
for(i=0;i<len;i++)
|
|
||||||
jp2_buffer[set+i]=cio_read(1);
|
|
||||||
//mi rimetto nel buffer jp2_buffer
|
|
||||||
cio_init(jp2_buffer, cp->tdx * cp->tdy * cp->tw * cp->th * 10);
|
|
||||||
//aggiorno la lunghezza della codestream
|
|
||||||
len += set;
|
|
||||||
cio_seek(len);
|
|
||||||
//correggo l'index file e lo scrivo
|
|
||||||
if (info_IM.index_on){
|
|
||||||
info_IM.Main_head_end += set;
|
|
||||||
//printf("fine_mh: %d\n",info_IM.Main_head_end);
|
|
||||||
//printf("%d\n", info_IM.tile[0].start_pos);
|
|
||||||
info_IM.tile[0].start_pos += set;
|
|
||||||
for (i=0; i < cp->th * cp->tw; i++){
|
|
||||||
info_IM.tile[i].end_header += set;
|
|
||||||
info_IM.tile[i].end_pos += set;
|
|
||||||
if (i < cp->tw * cp->th)
|
|
||||||
info_IM.tile[i+1].start_pos += set;
|
|
||||||
pack_corr(set, i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (cp->index_on && use_index){
|
|
||||||
write_index(index, len);
|
|
||||||
}
|
|
||||||
free(cstr);
|
|
||||||
free(out);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
len = j2k_encode(img, cp, jp2_buffer, cp->tdx * cp->tdy * cp->th * cp->tw * 2, index);
|
|
||||||
}
|
|
||||||
box.length = cio_tell() - box.init_pos;
|
|
||||||
cio_seek(box.init_pos);
|
|
||||||
cio_write(box.length, 4); /* L */
|
|
||||||
cio_seek(box.init_pos + box.length);
|
|
||||||
return box.length;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int jp2_read_jp2c(unsigned char *src, int len, jp2_struct_t * jp2_struct,
|
|
||||||
j2k_cp_t * cp)
|
|
||||||
{
|
|
||||||
jp2_box_t box;
|
|
||||||
|
|
||||||
jp2_read_boxhdr(&box);
|
|
||||||
if (JP2_JP2C != box.type) {
|
|
||||||
fprintf(stderr, "Error: Expected JP2C Marker\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
src += cio_tell();
|
|
||||||
|
|
||||||
if (j2k_decode(src, len, jp2_struct->image, cp) == 0) {
|
|
||||||
fprintf(stderr, "JP2F box: failed to decode J2K bitstream image!\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void jp2_write_jp()
|
|
||||||
{
|
|
||||||
jp2_box_t box;
|
|
||||||
|
|
||||||
box.init_pos = cio_tell();
|
|
||||||
cio_skip(4);
|
|
||||||
cio_write(JP2_JP, 4); // JP
|
|
||||||
cio_write(0x0d0a870a, 4);
|
|
||||||
|
|
||||||
box.length = cio_tell() - box.init_pos;
|
|
||||||
cio_seek(box.init_pos);
|
|
||||||
cio_write(box.length, 4); /* L */
|
|
||||||
cio_seek(box.init_pos + box.length);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Read the JP box
|
|
||||||
*
|
|
||||||
* JPEG 2000 signature
|
|
||||||
*
|
|
||||||
* return 1 if error else 0
|
|
||||||
*/
|
|
||||||
int jp2_read_jp()
|
|
||||||
{
|
|
||||||
jp2_box_t box;
|
|
||||||
|
|
||||||
jp2_read_boxhdr(&box);
|
|
||||||
if (JP2_JP != box.type) {
|
|
||||||
fprintf(stderr, "Error: Expected JP Marker\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if (0x0d0a870a != cio_read(4)) {
|
|
||||||
fprintf(stderr, "Error with JP Marker\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if (cio_tell() - box.init_pos != box.length) {
|
|
||||||
fprintf(stderr, "Error with JP Box size\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
int jp2_decode(unsigned char *src, int len, jp2_struct_t * jp2_struct,
|
|
||||||
j2k_cp_t * cp)
|
|
||||||
{
|
|
||||||
cio_init(src, len);
|
|
||||||
|
|
||||||
if (jp2_read_jp())
|
|
||||||
return 1;
|
|
||||||
if (jp2_read_ftyp(jp2_struct))
|
|
||||||
return 1;
|
|
||||||
if (jp2_read_jp2h(jp2_struct))
|
|
||||||
return 1;
|
|
||||||
if (jp2_read_jp2c(src, len, jp2_struct, cp))
|
|
||||||
return 1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int jp2_encode(jp2_struct_t * jp2_struct, j2k_cp_t * cp, char *output,
|
|
||||||
char *index)
|
|
||||||
{
|
|
||||||
int len;
|
|
||||||
|
|
||||||
jp2_write_jp();
|
|
||||||
jp2_write_ftyp(jp2_struct);
|
|
||||||
jp2_write_jp2h(jp2_struct);
|
|
||||||
len = jp2_write_jp2c(jp2_struct->image, cp, output, index);
|
|
||||||
|
|
||||||
return cio_tell();
|
|
||||||
}
|
|
|
@ -1,122 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2003, Yannick Verschueren
|
|
||||||
* Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
#ifndef __JP2_H
|
|
||||||
#define __JP2_H
|
|
||||||
|
|
||||||
#include "j2k.h"
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int depth;
|
|
||||||
int sgnd;
|
|
||||||
int bpcc;
|
|
||||||
} jp2_comps_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
unsigned int w;
|
|
||||||
unsigned int h;
|
|
||||||
unsigned int numcomps;
|
|
||||||
unsigned int bpc;
|
|
||||||
unsigned int C;
|
|
||||||
unsigned int UnkC;
|
|
||||||
unsigned int IPR;
|
|
||||||
unsigned int meth;
|
|
||||||
unsigned int approx;
|
|
||||||
unsigned int enumcs;
|
|
||||||
unsigned int precedence;
|
|
||||||
unsigned int brand;
|
|
||||||
unsigned int minversion;
|
|
||||||
unsigned int numcl;
|
|
||||||
unsigned int *cl;
|
|
||||||
jp2_comps_t *comps;
|
|
||||||
j2k_image_t *image;
|
|
||||||
} jp2_struct_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int length;
|
|
||||||
int type;
|
|
||||||
int init_pos;
|
|
||||||
} jp2_box_t;
|
|
||||||
|
|
||||||
/* int jp2_init_stdjp2(jp2_struct_t * jp2_struct, j2k_image_t * img);
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
*/
|
|
||||||
int jp2_init_stdjp2(jp2_struct_t * jp2_struct, j2k_image_t * img);
|
|
||||||
|
|
||||||
/* int jp2_write_jp2c(j2k_image_t * img, j2k_cp_t * cp, char *jp2_buffer,
|
|
||||||
* char *index);
|
|
||||||
*
|
|
||||||
* Write the jp2c codestream box
|
|
||||||
* img: the j2k_image that will be compressed
|
|
||||||
* jp2_buffer: the buffer that will recieve the compressed data
|
|
||||||
* index: the name of the index file
|
|
||||||
*/
|
|
||||||
int jp2_write_jp2c(j2k_image_t * img, j2k_cp_t * cp, char *jp2_buffer,
|
|
||||||
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);
|
|
||||||
*
|
|
||||||
* 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_encode(jp2_struct_t * jp2_struct, j2k_cp_t * cp, char *output,
|
|
||||||
* char *index);
|
|
||||||
*
|
|
||||||
* Encode a JP2 file
|
|
||||||
* jp2_buffer: the buffer containing the pointer to the image to encode
|
|
||||||
* cp: coding parameters of the image
|
|
||||||
* outbuf: pointer to memory where compressed data will be written
|
|
||||||
* index: the name of the index file
|
|
||||||
*/
|
|
||||||
int jp2_encode(jp2_struct_t * jp2_struct, j2k_cp_t * cp, char *output,
|
|
||||||
char *index);
|
|
||||||
|
|
||||||
/* int jp2_decode(unsigned char *src, int len, jp2_struct_t * jp2_struct,
|
|
||||||
* j2k_cp_t * cp);
|
|
||||||
*
|
|
||||||
* Decode a JP2 file
|
|
||||||
* src: pointer to memory where compressed data is stored
|
|
||||||
* len: length of src buffer
|
|
||||||
* jp2_struct: the jp2 structure that will be created
|
|
||||||
* cp: coding parameters of the image
|
|
||||||
*/
|
|
||||||
int jp2_decode(unsigned char *src, int len, jp2_struct_t * jp2_struct,
|
|
||||||
j2k_cp_t * cp);
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,163 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2004, Yannick Verschueren
|
|
||||||
* Copyright (c) 2004, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include "jpt.h"
|
|
||||||
#include "j2k.h"
|
|
||||||
#include "cio.h"
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Read the information contains in VBAS [JPP/JPT stream message header]
|
|
||||||
* Store information (7 bits) in value
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
unsigned int jpt_read_VBAS_info(unsigned int value)
|
|
||||||
{
|
|
||||||
unsigned char elmt;
|
|
||||||
|
|
||||||
elmt = cio_read(1);
|
|
||||||
while ((elmt >> 7) == 1) {
|
|
||||||
value = (value << 7);
|
|
||||||
value |= (elmt & 0x7f);
|
|
||||||
elmt = cio_read(1);
|
|
||||||
}
|
|
||||||
value = (value << 7);
|
|
||||||
value |= (elmt & 0x7f);
|
|
||||||
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initialize the value of the message header structure
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void jpt_init_Msg_Header(jpt_msg_header_struct_t * header)
|
|
||||||
{
|
|
||||||
header->Id = 0; /* In-class Identifier */
|
|
||||||
header->last_byte = 0; /* Last byte information */
|
|
||||||
header->Class_Id = 0; /* Class Identifier */
|
|
||||||
header->CSn_Id = 0; /* CSn : index identifier */
|
|
||||||
header->Msg_offset = 0; /* Message offset */
|
|
||||||
header->Msg_length = 0; /* Message length */
|
|
||||||
header->Layer_nb = 0; /* Auxiliary for JPP case */
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Re-initialize the value of the message header structure
|
|
||||||
*
|
|
||||||
* Only parameters always present in message header
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void jpt_reinit_Msg_Header(jpt_msg_header_struct_t * header)
|
|
||||||
{
|
|
||||||
header->Id = 0; /* In-class Identifier */
|
|
||||||
header->last_byte = 0; /* Last byte information */
|
|
||||||
header->Msg_offset = 0; /* Message offset */
|
|
||||||
header->Msg_length = 0; /* Message length */
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Read the message header for a JPP/JPT - stream
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void jpt_read_Msg_Header(jpt_msg_header_struct_t * header)
|
|
||||||
{
|
|
||||||
unsigned char elmt, Class = 0, CSn = 0;
|
|
||||||
jpt_reinit_Msg_Header(header);
|
|
||||||
|
|
||||||
/* ------------- */
|
|
||||||
/* VBAS : Bin-ID */
|
|
||||||
/* ------------- */
|
|
||||||
elmt = cio_read(1);
|
|
||||||
|
|
||||||
/* See for Class and CSn */
|
|
||||||
switch ((elmt >> 5) & 0x03) {
|
|
||||||
case 0:
|
|
||||||
fprintf(stderr, "Forbidden value encounter in message header !!\n");
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
Class = 0;
|
|
||||||
CSn = 0;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
Class = 1;
|
|
||||||
CSn = 0;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
Class = 1;
|
|
||||||
CSn = 1;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* see information on bits 'c' [p 10 : A.2.1 general, ISO/IEC FCD 15444-9] */
|
|
||||||
if (((elmt >> 3) & 0x01) == 1)
|
|
||||||
header->last_byte = 1;
|
|
||||||
|
|
||||||
/* In-class identifier */
|
|
||||||
header->Id |= (elmt & 0x0f);
|
|
||||||
if ((elmt >> 7) == 1)
|
|
||||||
header->Id = jpt_read_VBAS_info(header->Id);
|
|
||||||
|
|
||||||
/* ------------ */
|
|
||||||
/* VBAS : Class */
|
|
||||||
/* ------------ */
|
|
||||||
if (Class == 1) {
|
|
||||||
header->Class_Id = 0;
|
|
||||||
header->Class_Id = jpt_read_VBAS_info(header->Class_Id);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ---------- */
|
|
||||||
/* VBAS : CSn */
|
|
||||||
/* ---------- */
|
|
||||||
if (CSn == 1) {
|
|
||||||
header->CSn_Id = 0;
|
|
||||||
header->CSn_Id = jpt_read_VBAS_info(header->CSn_Id);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ----------------- */
|
|
||||||
/* VBAS : Msg_offset */
|
|
||||||
/* ----------------- */
|
|
||||||
header->Msg_offset = jpt_read_VBAS_info(header->Msg_offset);
|
|
||||||
|
|
||||||
/* ----------------- */
|
|
||||||
/* VBAS : Msg_length */
|
|
||||||
/* ----------------- */
|
|
||||||
header->Msg_length = jpt_read_VBAS_info(header->Msg_length);
|
|
||||||
|
|
||||||
/* ---------- */
|
|
||||||
/* VBAS : Aux */
|
|
||||||
/* ---------- */
|
|
||||||
if (header->CSn_Id == 1) {
|
|
||||||
header->Layer_nb = 0;
|
|
||||||
header->Layer_nb = jpt_read_VBAS_info(header->Layer_nb);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,56 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2004, Yannick Verschueren
|
|
||||||
* Copyright (c) 2004, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Message Header JPT_stream Structure
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
typedef struct {
|
|
||||||
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;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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
|
|
||||||
*
|
|
||||||
* header : Message header structure
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void jpt_read_Msg_Header(jpt_msg_header_struct_t * header);
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,103 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2004-2005 Andrea Betti and Michele Massarelli
|
|
||||||
* Copyright 2004-2005 DIEI, University of Perugia
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/* questa è un' estensione della libreria dell'openjpeg in grado di implementare
|
|
||||||
* la parte 11 dello standard JPEG2000 ossia il JPWL
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __JPW_H
|
|
||||||
#define __JPW_H
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
unsigned int JPWL_on; //indica se usare le funzionalità JPWL e quindi l'EPC nel main header
|
|
||||||
unsigned int EPB_on;
|
|
||||||
unsigned int ESD_on;
|
|
||||||
unsigned int RED_on;
|
|
||||||
unsigned int UEP_on;
|
|
||||||
unsigned int info_tech_on;
|
|
||||||
unsigned long pepb[6];
|
|
||||||
unsigned char pesd;
|
|
||||||
unsigned char pred;
|
|
||||||
} JPWL_cp_t;
|
|
||||||
|
|
||||||
|
|
||||||
// inizializza la struttura contenente le info riguardanti l'uso dei marker jpwl
|
|
||||||
|
|
||||||
void jpwl_cp_init(JPWL_cp_t *jpwl_cp);
|
|
||||||
|
|
||||||
// qui iniziano le funzioni necessarie per la scrittura dei marker
|
|
||||||
|
|
||||||
void jpwl_write_EPC();
|
|
||||||
|
|
||||||
void jpwl_write_ESD(char Pesd, int notil);
|
|
||||||
|
|
||||||
void jpwl_write_RED();
|
|
||||||
|
|
||||||
void JPWL_write_EPB(char *buf, unsigned long LDPepb, unsigned long Pepb, unsigned char Depb);
|
|
||||||
|
|
||||||
int JPWL_len_EPB(unsigned int LDPepb, unsigned int Pepb, unsigned char Depb);
|
|
||||||
|
|
||||||
int pianifica_epb(unsigned int LDPepb, unsigned int Pepb, int *n_epb );
|
|
||||||
|
|
||||||
void JPWL_write_Pepbs(long *pepbs, int num_epb);
|
|
||||||
|
|
||||||
void get_jpwl_cp(j2k_cp_t *cp);
|
|
||||||
|
|
||||||
int uep(int notil, char *bs, char *header, int len_header);
|
|
||||||
|
|
||||||
void jpwl_write_EPC_fin(unsigned long CL, long *pepbs, int num_epb);
|
|
||||||
|
|
||||||
void correggi_esd(int offset, int len_esd, int Pesd);
|
|
||||||
|
|
||||||
int jpwl_encode(char *input, char * output, unsigned long CL);
|
|
||||||
|
|
||||||
/* qui andrò ad inserire le funzioni necessarie per il crc oppure la codifica RS
|
|
||||||
* e le funzioni per le tecniche informative aggiuntive
|
|
||||||
*/
|
|
||||||
|
|
||||||
void ResetCRC();
|
|
||||||
|
|
||||||
void UpdateCRC16(char x);
|
|
||||||
|
|
||||||
void UpdateCRC32(char x);
|
|
||||||
|
|
||||||
char reflectByte(char inbyte);
|
|
||||||
|
|
||||||
void reflectCRC32();
|
|
||||||
|
|
||||||
|
|
||||||
//int crc_ccitt(char *buffer, int len);
|
|
||||||
|
|
||||||
short int d2pfp(double in);
|
|
||||||
|
|
||||||
double pfp2d(short int in);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,134 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2002, David Janssens
|
|
||||||
* 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 "mct.h"
|
|
||||||
#include "fix.h"
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* This table contains the norms of the basis function of the reversible MCT. */
|
|
||||||
/* </summary> */
|
|
||||||
double mct_norms[3] = { 1.732, .8292, .8292 };
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* This table contains the norms of the basis function of the irreversible MCT. */
|
|
||||||
/* </summary> */
|
|
||||||
double mct_norms_real[3] = { 1.732, 1.805, 1.573 };
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* Foward reversible MCT. */
|
|
||||||
/* </summary> */
|
|
||||||
void mct_encode(int *c0, int *c1, int *c2, int n)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < n; i++) {
|
|
||||||
int r, g, b, y, u, v;
|
|
||||||
r = c0[i];
|
|
||||||
g = c1[i];
|
|
||||||
b = c2[i];
|
|
||||||
y = (r + (g << 1) + b) >> 2;
|
|
||||||
u = b - g;
|
|
||||||
v = r - g;
|
|
||||||
c0[i] = y;
|
|
||||||
c1[i] = u;
|
|
||||||
c2[i] = v;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* Inverse reversible MCT. */
|
|
||||||
/* </summary> */
|
|
||||||
void mct_decode(int *c0, int *c1, int *c2, int n)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < n; i++) {
|
|
||||||
int y, u, v, r, g, b;
|
|
||||||
y = c0[i];
|
|
||||||
u = c1[i];
|
|
||||||
v = c2[i];
|
|
||||||
g = y - ((u + v) >> 2);
|
|
||||||
r = v + g;
|
|
||||||
b = u + g;
|
|
||||||
c0[i] = r;
|
|
||||||
c1[i] = g;
|
|
||||||
c2[i] = b;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* Get norm of basis function of reversible MCT. */
|
|
||||||
/* </summary> */
|
|
||||||
double mct_getnorm(int compno)
|
|
||||||
{
|
|
||||||
return mct_norms[compno];
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* Foward irreversible MCT. */
|
|
||||||
/* </summary> */
|
|
||||||
void mct_encode_real(int *c0, int *c1, int *c2, int n)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < n; i++) {
|
|
||||||
int r, g, b, y, u, v;
|
|
||||||
r = c0[i];
|
|
||||||
g = c1[i];
|
|
||||||
b = c2[i];
|
|
||||||
y = fix_mul(r, 2449) + fix_mul(g, 4809) + fix_mul(b, 934);
|
|
||||||
u = -fix_mul(r, 1382) - fix_mul(g, 2714) + fix_mul(b, 4096);
|
|
||||||
v = fix_mul(r, 4096) - fix_mul(g, 3430) - fix_mul(b, 666);
|
|
||||||
c0[i] = y;
|
|
||||||
c1[i] = u;
|
|
||||||
c2[i] = v;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* Inverse irreversible MCT. */
|
|
||||||
/* </summary> */
|
|
||||||
void mct_decode_real(int *c0, int *c1, int *c2, int n)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < n; i++) {
|
|
||||||
int y, u, v, r, g, b;
|
|
||||||
y = c0[i];
|
|
||||||
u = c1[i];
|
|
||||||
v = c2[i];
|
|
||||||
r = y + fix_mul(v, 11485);
|
|
||||||
g = y - fix_mul(u, 2819) - fix_mul(v, 5850);
|
|
||||||
b = y + fix_mul(u, 14516);
|
|
||||||
c0[i] = r;
|
|
||||||
c1[i] = g;
|
|
||||||
c2[i] = b;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* Get norm of basis function of irreversible MCT. */
|
|
||||||
/* </summary> */
|
|
||||||
double mct_getnorm_real(int compno)
|
|
||||||
{
|
|
||||||
return mct_norms_real[compno];
|
|
||||||
}
|
|
|
@ -1,74 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2002, David Janssens
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __MCT_H
|
|
||||||
#define __MCT_H
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Apply a reversible multi-component transform to an image
|
|
||||||
* R: samples for red component
|
|
||||||
* G: samples for green component
|
|
||||||
* B: samples blue component
|
|
||||||
* n: number of samples for each component
|
|
||||||
*/
|
|
||||||
void mct_encode(int *R, int *G, int *B, int n);
|
|
||||||
/*
|
|
||||||
* Apply a reversible multi-component inverse transform to an image
|
|
||||||
* Y: samples for luminance component
|
|
||||||
* U: samples for red chrominance component
|
|
||||||
* V: samples for blue chrominance component
|
|
||||||
* n: number of samples for each component
|
|
||||||
*/
|
|
||||||
void mct_decode(int *V, int *U, int *Y, int n);
|
|
||||||
/*
|
|
||||||
* Get norm of the basis function used for the reversible multi-component transform
|
|
||||||
* compno: number of the component (0->Y, 1->U, 2->V)
|
|
||||||
*/
|
|
||||||
double mct_getnorm(int compno);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Apply an irreversible multi-component transform to an image
|
|
||||||
* R: samples for red component
|
|
||||||
* G: samples for green component
|
|
||||||
* B: samples blue component
|
|
||||||
* n: number of samples for each component
|
|
||||||
*/
|
|
||||||
void mct_encode_real(int *c0, int *c1, int *c2, int n);
|
|
||||||
/*
|
|
||||||
* Apply an irreversible multi-component inverse transform to an image
|
|
||||||
* Y: samples for luminance component
|
|
||||||
* U: samples for red chrominance component
|
|
||||||
* V: samples for blue chrominance component
|
|
||||||
* n: number of samples for each component
|
|
||||||
*/
|
|
||||||
void mct_decode_real(int *c0, int *c1, int *c2, int n);
|
|
||||||
/*
|
|
||||||
* Get norm of the basis function used for the irreversible multi-component transform
|
|
||||||
* compno: number of the component (0->Y, 1->U, 2->V)
|
|
||||||
*/
|
|
||||||
double mct_getnorm_real(int compno);
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,591 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2002, David Janssens
|
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
|
||||||
* Copyright (c) 2002-2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "mqc.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> */
|
|
||||||
/* This array defines all the possible states for a context. */
|
|
||||||
/* </summary> */
|
|
||||||
mqc_state_t mqc_states[47 * 2] = {
|
|
||||||
{0x5601, 0, &mqc_states[2], &mqc_states[3]},
|
|
||||||
{0x5601, 1, &mqc_states[3], &mqc_states[2]},
|
|
||||||
{0x3401, 0, &mqc_states[4], &mqc_states[12]},
|
|
||||||
{0x3401, 1, &mqc_states[5], &mqc_states[13]},
|
|
||||||
{0x1801, 0, &mqc_states[6], &mqc_states[18]},
|
|
||||||
{0x1801, 1, &mqc_states[7], &mqc_states[19]},
|
|
||||||
{0x0ac1, 0, &mqc_states[8], &mqc_states[24]},
|
|
||||||
{0x0ac1, 1, &mqc_states[9], &mqc_states[25]},
|
|
||||||
{0x0521, 0, &mqc_states[10], &mqc_states[58]},
|
|
||||||
{0x0521, 1, &mqc_states[11], &mqc_states[59]},
|
|
||||||
{0x0221, 0, &mqc_states[76], &mqc_states[66]},
|
|
||||||
{0x0221, 1, &mqc_states[77], &mqc_states[67]},
|
|
||||||
{0x5601, 0, &mqc_states[14], &mqc_states[13]},
|
|
||||||
{0x5601, 1, &mqc_states[15], &mqc_states[12]},
|
|
||||||
{0x5401, 0, &mqc_states[16], &mqc_states[28]},
|
|
||||||
{0x5401, 1, &mqc_states[17], &mqc_states[29]},
|
|
||||||
{0x4801, 0, &mqc_states[18], &mqc_states[28]},
|
|
||||||
{0x4801, 1, &mqc_states[19], &mqc_states[29]},
|
|
||||||
{0x3801, 0, &mqc_states[20], &mqc_states[28]},
|
|
||||||
{0x3801, 1, &mqc_states[21], &mqc_states[29]},
|
|
||||||
{0x3001, 0, &mqc_states[22], &mqc_states[34]},
|
|
||||||
{0x3001, 1, &mqc_states[23], &mqc_states[35]},
|
|
||||||
{0x2401, 0, &mqc_states[24], &mqc_states[36]},
|
|
||||||
{0x2401, 1, &mqc_states[25], &mqc_states[37]},
|
|
||||||
{0x1c01, 0, &mqc_states[26], &mqc_states[40]},
|
|
||||||
{0x1c01, 1, &mqc_states[27], &mqc_states[41]},
|
|
||||||
{0x1601, 0, &mqc_states[58], &mqc_states[42]},
|
|
||||||
{0x1601, 1, &mqc_states[59], &mqc_states[43]},
|
|
||||||
{0x5601, 0, &mqc_states[30], &mqc_states[29]},
|
|
||||||
{0x5601, 1, &mqc_states[31], &mqc_states[28]},
|
|
||||||
{0x5401, 0, &mqc_states[32], &mqc_states[28]},
|
|
||||||
{0x5401, 1, &mqc_states[33], &mqc_states[29]},
|
|
||||||
{0x5101, 0, &mqc_states[34], &mqc_states[30]},
|
|
||||||
{0x5101, 1, &mqc_states[35], &mqc_states[31]},
|
|
||||||
{0x4801, 0, &mqc_states[36], &mqc_states[32]},
|
|
||||||
{0x4801, 1, &mqc_states[37], &mqc_states[33]},
|
|
||||||
{0x3801, 0, &mqc_states[38], &mqc_states[34]},
|
|
||||||
{0x3801, 1, &mqc_states[39], &mqc_states[35]},
|
|
||||||
{0x3401, 0, &mqc_states[40], &mqc_states[36]},
|
|
||||||
{0x3401, 1, &mqc_states[41], &mqc_states[37]},
|
|
||||||
{0x3001, 0, &mqc_states[42], &mqc_states[38]},
|
|
||||||
{0x3001, 1, &mqc_states[43], &mqc_states[39]},
|
|
||||||
{0x2801, 0, &mqc_states[44], &mqc_states[38]},
|
|
||||||
{0x2801, 1, &mqc_states[45], &mqc_states[39]},
|
|
||||||
{0x2401, 0, &mqc_states[46], &mqc_states[40]},
|
|
||||||
{0x2401, 1, &mqc_states[47], &mqc_states[41]},
|
|
||||||
{0x2201, 0, &mqc_states[48], &mqc_states[42]},
|
|
||||||
{0x2201, 1, &mqc_states[49], &mqc_states[43]},
|
|
||||||
{0x1c01, 0, &mqc_states[50], &mqc_states[44]},
|
|
||||||
{0x1c01, 1, &mqc_states[51], &mqc_states[45]},
|
|
||||||
{0x1801, 0, &mqc_states[52], &mqc_states[46]},
|
|
||||||
{0x1801, 1, &mqc_states[53], &mqc_states[47]},
|
|
||||||
{0x1601, 0, &mqc_states[54], &mqc_states[48]},
|
|
||||||
{0x1601, 1, &mqc_states[55], &mqc_states[49]},
|
|
||||||
{0x1401, 0, &mqc_states[56], &mqc_states[50]},
|
|
||||||
{0x1401, 1, &mqc_states[57], &mqc_states[51]},
|
|
||||||
{0x1201, 0, &mqc_states[58], &mqc_states[52]},
|
|
||||||
{0x1201, 1, &mqc_states[59], &mqc_states[53]},
|
|
||||||
{0x1101, 0, &mqc_states[60], &mqc_states[54]},
|
|
||||||
{0x1101, 1, &mqc_states[61], &mqc_states[55]},
|
|
||||||
{0x0ac1, 0, &mqc_states[62], &mqc_states[56]},
|
|
||||||
{0x0ac1, 1, &mqc_states[63], &mqc_states[57]},
|
|
||||||
{0x09c1, 0, &mqc_states[64], &mqc_states[58]},
|
|
||||||
{0x09c1, 1, &mqc_states[65], &mqc_states[59]},
|
|
||||||
{0x08a1, 0, &mqc_states[66], &mqc_states[60]},
|
|
||||||
{0x08a1, 1, &mqc_states[67], &mqc_states[61]},
|
|
||||||
{0x0521, 0, &mqc_states[68], &mqc_states[62]},
|
|
||||||
{0x0521, 1, &mqc_states[69], &mqc_states[63]},
|
|
||||||
{0x0441, 0, &mqc_states[70], &mqc_states[64]},
|
|
||||||
{0x0441, 1, &mqc_states[71], &mqc_states[65]},
|
|
||||||
{0x02a1, 0, &mqc_states[72], &mqc_states[66]},
|
|
||||||
{0x02a1, 1, &mqc_states[73], &mqc_states[67]},
|
|
||||||
{0x0221, 0, &mqc_states[74], &mqc_states[68]},
|
|
||||||
{0x0221, 1, &mqc_states[75], &mqc_states[69]},
|
|
||||||
{0x0141, 0, &mqc_states[76], &mqc_states[70]},
|
|
||||||
{0x0141, 1, &mqc_states[77], &mqc_states[71]},
|
|
||||||
{0x0111, 0, &mqc_states[78], &mqc_states[72]},
|
|
||||||
{0x0111, 1, &mqc_states[79], &mqc_states[73]},
|
|
||||||
{0x0085, 0, &mqc_states[80], &mqc_states[74]},
|
|
||||||
{0x0085, 1, &mqc_states[81], &mqc_states[75]},
|
|
||||||
{0x0049, 0, &mqc_states[82], &mqc_states[76]},
|
|
||||||
{0x0049, 1, &mqc_states[83], &mqc_states[77]},
|
|
||||||
{0x0025, 0, &mqc_states[84], &mqc_states[78]},
|
|
||||||
{0x0025, 1, &mqc_states[85], &mqc_states[79]},
|
|
||||||
{0x0015, 0, &mqc_states[86], &mqc_states[80]},
|
|
||||||
{0x0015, 1, &mqc_states[87], &mqc_states[81]},
|
|
||||||
{0x0009, 0, &mqc_states[88], &mqc_states[82]},
|
|
||||||
{0x0009, 1, &mqc_states[89], &mqc_states[83]},
|
|
||||||
{0x0005, 0, &mqc_states[90], &mqc_states[84]},
|
|
||||||
{0x0005, 1, &mqc_states[91], &mqc_states[85]},
|
|
||||||
{0x0001, 0, &mqc_states[90], &mqc_states[86]},
|
|
||||||
{0x0001, 1, &mqc_states[91], &mqc_states[87]},
|
|
||||||
{0x5601, 0, &mqc_states[92], &mqc_states[92]},
|
|
||||||
{0x5601, 1, &mqc_states[93], &mqc_states[93]},
|
|
||||||
};
|
|
||||||
|
|
||||||
#define MQC_NUMCTXS 32
|
|
||||||
|
|
||||||
unsigned int mqc_c;
|
|
||||||
unsigned int mqc_a;
|
|
||||||
unsigned int mqc_ct;
|
|
||||||
unsigned char *mqc_bp;
|
|
||||||
unsigned char *mqc_start;
|
|
||||||
unsigned char *mqc_end;
|
|
||||||
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 {
|
|
||||||
if ((mqc_c & 0x8000000) == 0) { /* ((mqc_c&0x8000000)==0) CHANGE */
|
|
||||||
mqc_bp++;
|
|
||||||
*mqc_bp = mqc_c >> 19;
|
|
||||||
mqc_c &= 0x7ffff;
|
|
||||||
mqc_ct = 8;
|
|
||||||
} else {
|
|
||||||
(*mqc_bp)++;
|
|
||||||
if (*mqc_bp == 0xff) {
|
|
||||||
mqc_c &= 0x7ffffff;
|
|
||||||
mqc_bp++;
|
|
||||||
*mqc_bp = mqc_c >> 20;
|
|
||||||
mqc_c &= 0xfffff;
|
|
||||||
mqc_ct = 7;
|
|
||||||
} else {
|
|
||||||
mqc_bp++;
|
|
||||||
*mqc_bp = mqc_c >> 19;
|
|
||||||
mqc_c &= 0x7ffff;
|
|
||||||
mqc_ct = 8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* Renormalize mqc_a and mqc_c while encoding, so that mqc_a stays between 0x8000 and 0x10000 */
|
|
||||||
/* </summary> */
|
|
||||||
void mqc_renorme()
|
|
||||||
{
|
|
||||||
do {
|
|
||||||
mqc_a <<= 1;
|
|
||||||
mqc_c <<= 1;
|
|
||||||
mqc_ct--;
|
|
||||||
if (mqc_ct == 0) {
|
|
||||||
mqc_byteout();
|
|
||||||
}
|
|
||||||
} while ((mqc_a & 0x8000) == 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* Encode the most probable symbol. */
|
|
||||||
/* </summary> */
|
|
||||||
void mqc_codemps()
|
|
||||||
{
|
|
||||||
mqc_a -= (*mqc_curctx)->qeval;
|
|
||||||
if ((mqc_a & 0x8000) == 0) {
|
|
||||||
if (mqc_a < (*mqc_curctx)->qeval) {
|
|
||||||
mqc_a = (*mqc_curctx)->qeval;
|
|
||||||
} else {
|
|
||||||
mqc_c += (*mqc_curctx)->qeval;
|
|
||||||
}
|
|
||||||
*mqc_curctx = (*mqc_curctx)->nmps;
|
|
||||||
mqc_renorme();
|
|
||||||
} else {
|
|
||||||
mqc_c += (*mqc_curctx)->qeval;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* Encode the most least symbol. */
|
|
||||||
/* </summary> */
|
|
||||||
void mqc_codelps()
|
|
||||||
{
|
|
||||||
mqc_a -= (*mqc_curctx)->qeval;
|
|
||||||
if (mqc_a < (*mqc_curctx)->qeval) {
|
|
||||||
mqc_c += (*mqc_curctx)->qeval;
|
|
||||||
} else {
|
|
||||||
mqc_a = (*mqc_curctx)->qeval;
|
|
||||||
}
|
|
||||||
*mqc_curctx = (*mqc_curctx)->nlps;
|
|
||||||
mqc_renorme();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* Initialize encoder. */
|
|
||||||
/* </summary> */
|
|
||||||
/* <param name="bp">Output buffer.</param> */
|
|
||||||
void mqc_init_enc(unsigned char *bp)
|
|
||||||
{
|
|
||||||
mqc_setcurctx(0);
|
|
||||||
mqc_a = 0x8000;
|
|
||||||
mqc_c = 0;
|
|
||||||
mqc_bp = bp - 1;
|
|
||||||
mqc_ct = 12;
|
|
||||||
if (*mqc_bp == 0xff) {
|
|
||||||
mqc_ct = 13;
|
|
||||||
}
|
|
||||||
mqc_start = bp;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* Set current context. */
|
|
||||||
/* </summary> */
|
|
||||||
/* <param name="ctxno">Context number.</param> */
|
|
||||||
void mqc_setcurctx(int ctxno)
|
|
||||||
{
|
|
||||||
mqc_curctx = &mqc_ctxs[ctxno];
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* Encode a symbol using the MQ-coder. */
|
|
||||||
/* </summary> */
|
|
||||||
/* <param name="d"> The symbol to be encoded (0 or 1).</param> */
|
|
||||||
void mqc_encode(int d)
|
|
||||||
{
|
|
||||||
if ((*mqc_curctx)->mps == d) {
|
|
||||||
mqc_codemps();
|
|
||||||
} else {
|
|
||||||
mqc_codelps();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* Fill mqc_c with 1's for flushing */
|
|
||||||
/* </summary> */
|
|
||||||
void mqc_setbits()
|
|
||||||
{
|
|
||||||
unsigned int tempc = mqc_c + mqc_a;
|
|
||||||
mqc_c |= 0xffff;
|
|
||||||
if (mqc_c >= tempc) {
|
|
||||||
mqc_c -= 0x8000;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* Flush encoded data. */
|
|
||||||
/* </summary> */
|
|
||||||
void mqc_flush()
|
|
||||||
{
|
|
||||||
mqc_setbits();
|
|
||||||
mqc_c <<= mqc_ct;
|
|
||||||
mqc_byteout();
|
|
||||||
mqc_c <<= mqc_ct;
|
|
||||||
mqc_byteout();
|
|
||||||
|
|
||||||
if (*mqc_bp != 0xff) {
|
|
||||||
mqc_bp++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* not fully implemented and tested !! */
|
|
||||||
/* BYPASS mode switch, initialization operation */
|
|
||||||
/* JPEG 2000 p 505 */
|
|
||||||
/* </summary> */
|
|
||||||
void mqc_bypass_init_enc()
|
|
||||||
{
|
|
||||||
mqc_c = 0;
|
|
||||||
mqc_ct = 8;
|
|
||||||
/*if (*mqc_bp == 0xff) {
|
|
||||||
mqc_ct = 7;
|
|
||||||
} */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* not fully implemented and tested !! */
|
|
||||||
/* BYPASS mode switch, coding operation */
|
|
||||||
/* JPEG 2000 p 505 */
|
|
||||||
/* </summary> */
|
|
||||||
void mqc_bypass_enc(int d)
|
|
||||||
{
|
|
||||||
mqc_ct--;
|
|
||||||
mqc_c = mqc_c + (d << mqc_ct);
|
|
||||||
if (mqc_ct == 0) {
|
|
||||||
mqc_bp++;
|
|
||||||
*mqc_bp = mqc_c;
|
|
||||||
mqc_ct = 8;
|
|
||||||
if (*mqc_bp == 0xff) {
|
|
||||||
mqc_ct = 7;
|
|
||||||
}
|
|
||||||
mqc_c = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* not fully implemented and tested !! */
|
|
||||||
/* BYPASS mode switch, flush operation */
|
|
||||||
/* </summary> */
|
|
||||||
int mqc_bypass_flush_enc()
|
|
||||||
{
|
|
||||||
unsigned char bit_padding;
|
|
||||||
|
|
||||||
bit_padding = 0;
|
|
||||||
|
|
||||||
if (mqc_ct != 0) {
|
|
||||||
while (mqc_ct > 0) {
|
|
||||||
mqc_ct--;
|
|
||||||
mqc_c += bit_padding << mqc_ct;
|
|
||||||
bit_padding = (bit_padding + 1) & 0x01;
|
|
||||||
}
|
|
||||||
mqc_bp++;
|
|
||||||
*mqc_bp = mqc_c;
|
|
||||||
mqc_ct = 8;
|
|
||||||
mqc_c = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* RESET mode switch */
|
|
||||||
/* </summary> */
|
|
||||||
void mqc_reset_enc()
|
|
||||||
{
|
|
||||||
mqc_resetstates();
|
|
||||||
mqc_setstate(18, 0, 46);
|
|
||||||
mqc_setstate(0, 0, 3);
|
|
||||||
mqc_setstate(1, 0, 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* mode switch RESTART (TERMALL) */
|
|
||||||
/* </summary> */
|
|
||||||
int mqc_restart_enc()
|
|
||||||
{
|
|
||||||
int correction = 1;
|
|
||||||
|
|
||||||
/* <flush part> */
|
|
||||||
int n = 27 - 15 - mqc_ct;
|
|
||||||
mqc_c <<= mqc_ct;
|
|
||||||
while (n > 0) {
|
|
||||||
mqc_byteout();
|
|
||||||
n -= mqc_ct;
|
|
||||||
mqc_c <<= mqc_ct;
|
|
||||||
}
|
|
||||||
mqc_byteout();
|
|
||||||
|
|
||||||
return correction;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* mode switch RESTART (TERMALL) reinitialisation */
|
|
||||||
/* </summary> */
|
|
||||||
void mqc_restart_init_enc()
|
|
||||||
{
|
|
||||||
/* <Re-init part> */
|
|
||||||
mqc_setcurctx(0);
|
|
||||||
mqc_a = 0x8000;
|
|
||||||
mqc_c = 0;
|
|
||||||
mqc_ct = 12;
|
|
||||||
mqc_bp--;
|
|
||||||
if (*mqc_bp == 0xff) {
|
|
||||||
mqc_ct = 13;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* ERTERM mode switch */
|
|
||||||
/* </summary> */
|
|
||||||
void mqc_erterm_enc()
|
|
||||||
{
|
|
||||||
int k = 11 - mqc_ct + 1;
|
|
||||||
|
|
||||||
while (k > 0) {
|
|
||||||
mqc_c <<= mqc_ct;
|
|
||||||
mqc_ct = 0;
|
|
||||||
mqc_byteout();
|
|
||||||
k -= mqc_ct;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*mqc_bp != 0xff) {
|
|
||||||
mqc_byteout();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* SEGMARK mode switch (SEGSYM) */
|
|
||||||
/* </summary> */
|
|
||||||
void mqc_segmark_enc()
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
mqc_setcurctx(18);
|
|
||||||
|
|
||||||
for (i = 1; i < 5; i++) {
|
|
||||||
mqc_encode(i % 2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* </summary> */
|
|
||||||
int mqc_mpsexchange()
|
|
||||||
{
|
|
||||||
int d;
|
|
||||||
if (mqc_a < (*mqc_curctx)->qeval) {
|
|
||||||
d = 1 - (*mqc_curctx)->mps;
|
|
||||||
*mqc_curctx = (*mqc_curctx)->nlps;
|
|
||||||
} else {
|
|
||||||
d = (*mqc_curctx)->mps;
|
|
||||||
*mqc_curctx = (*mqc_curctx)->nmps;
|
|
||||||
}
|
|
||||||
return d;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* </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;
|
|
||||||
for (i = 0; i < MQC_NUMCTXS; i++) {
|
|
||||||
mqc_ctxs[i] = mqc_states;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* Set the state for a context. */
|
|
||||||
/* </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,127 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2002, David Janssens
|
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
|
||||||
* Copyright (c) 2002-2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __MQC_H
|
|
||||||
#define __MQC_H
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return the number of bytes written/read since initialisation
|
|
||||||
*/
|
|
||||||
int mqc_numbytes();
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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
|
|
||||||
* ctxno: number that identifies the context
|
|
||||||
* msb: the MSB of the new state of the context
|
|
||||||
* prob: number that identifies the probability of the symbols for the new state of the context
|
|
||||||
*/
|
|
||||||
void mqc_setstate(int ctxno, int msb, int prob);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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
|
|
||||||
* ctxno: number that identifies the context
|
|
||||||
*/
|
|
||||||
void mqc_setcurctx(int ctxno);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Encode a bit
|
|
||||||
* d: bit to encode (0 or 1)
|
|
||||||
*/
|
|
||||||
void mqc_encode(int d);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Flush the encoder, so that all remaining data is written
|
|
||||||
*/
|
|
||||||
void mqc_flush();
|
|
||||||
|
|
||||||
/*
|
|
||||||
* BYPASS mode switch
|
|
||||||
*/
|
|
||||||
void mqc_bypass_init_enc();
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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
|
|
|
@ -1,50 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2002, David Janssens
|
|
||||||
* Copyright (c) 2003, Yannick Verschueren
|
|
||||||
* Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __OPENJPEG_H
|
|
||||||
#define __OPENJPEG_H
|
|
||||||
|
|
||||||
#include <j2k.h>
|
|
||||||
#include <tcd.h>
|
|
||||||
#include <jp2.h>
|
|
||||||
#include <jpw.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>
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,557 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2002, David Janssens
|
|
||||||
* Copyright (c) 2003-2004, Yannick Verschueren
|
|
||||||
* Copyright (c) 2003-2004, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "pi.h"
|
|
||||||
#include "int.h"
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
/* <summary>
|
|
||||||
* Create a packet iterator.
|
|
||||||
* </summary> */
|
|
||||||
pi_iterator_t *pi_create(j2k_image_t * img, j2k_cp_t * cp, int tileno)
|
|
||||||
{
|
|
||||||
int p, q, i;
|
|
||||||
int compno, resno, pino;
|
|
||||||
int maxres = 0;
|
|
||||||
pi_iterator_t *pi;
|
|
||||||
j2k_tcp_t *tcp;
|
|
||||||
j2k_tccp_t *tccp;
|
|
||||||
|
|
||||||
tcp = &cp->tcps[tileno];
|
|
||||||
pi = (pi_iterator_t *) malloc((tcp->numpocs + 1) *
|
|
||||||
sizeof(pi_iterator_t));
|
|
||||||
|
|
||||||
for (pino = 0; pino < tcp->numpocs + 1; pino++) { /* change */
|
|
||||||
p = tileno % cp->tw;
|
|
||||||
q = tileno / cp->tw;
|
|
||||||
|
|
||||||
pi[pino].tx0 = int_max(cp->tx0 + p * cp->tdx, img->x0);
|
|
||||||
pi[pino].ty0 = int_max(cp->ty0 + q * cp->tdy, img->y0);
|
|
||||||
pi[pino].tx1 = int_min(cp->tx0 + (p + 1) * cp->tdx, img->x1);
|
|
||||||
pi[pino].ty1 = int_min(cp->ty0 + (q + 1) * cp->tdy, img->y1);
|
|
||||||
pi[pino].numcomps = img->numcomps;
|
|
||||||
pi[pino].comps =
|
|
||||||
(pi_comp_t *) malloc(img->numcomps * sizeof(pi_comp_t));
|
|
||||||
|
|
||||||
for (compno = 0; compno < pi->numcomps; compno++) {
|
|
||||||
int tcx0, tcy0, tcx1, tcy1;
|
|
||||||
pi_comp_t *comp = &pi[pino].comps[compno];
|
|
||||||
tccp = &tcp->tccps[compno];
|
|
||||||
comp->dx = img->comps[compno].dx;
|
|
||||||
comp->dy = img->comps[compno].dy;
|
|
||||||
comp->numresolutions = tccp->numresolutions;
|
|
||||||
comp->resolutions =
|
|
||||||
(pi_resolution_t *) malloc(comp->numresolutions *
|
|
||||||
sizeof(pi_resolution_t));
|
|
||||||
tcx0 = int_ceildiv(pi->tx0, comp->dx);
|
|
||||||
tcy0 = int_ceildiv(pi->ty0, comp->dy);
|
|
||||||
tcx1 = int_ceildiv(pi->tx1, comp->dx);
|
|
||||||
tcy1 = int_ceildiv(pi->ty1, comp->dy);
|
|
||||||
if (comp->numresolutions > maxres) {
|
|
||||||
maxres = comp->numresolutions;
|
|
||||||
}
|
|
||||||
for (resno = 0; resno < comp->numresolutions; resno++) {
|
|
||||||
int levelno;
|
|
||||||
int rx0, ry0, rx1, ry1;
|
|
||||||
int px0, py0, px1, py1;
|
|
||||||
pi_resolution_t *res = &comp->resolutions[resno];
|
|
||||||
if (tccp->csty & J2K_CCP_CSTY_PRT) {
|
|
||||||
res->pdx = tccp->prcw[resno];
|
|
||||||
res->pdy = tccp->prch[resno];
|
|
||||||
} else {
|
|
||||||
res->pdx = 15;
|
|
||||||
res->pdy = 15;
|
|
||||||
}
|
|
||||||
levelno = comp->numresolutions - 1 - resno;
|
|
||||||
rx0 = int_ceildivpow2(tcx0, levelno);
|
|
||||||
ry0 = int_ceildivpow2(tcy0, levelno);
|
|
||||||
rx1 = int_ceildivpow2(tcx1, levelno);
|
|
||||||
ry1 = int_ceildivpow2(tcy1, levelno);
|
|
||||||
px0 = int_floordivpow2(rx0, res->pdx) << res->pdx;
|
|
||||||
py0 = int_floordivpow2(ry0, res->pdy) << res->pdy;
|
|
||||||
px1 = int_ceildivpow2(rx1, res->pdx) << res->pdx;
|
|
||||||
py1 = int_ceildivpow2(ry1, res->pdy) << res->pdy;
|
|
||||||
res->pw = (rx0==rx1)?0:((px1 - px0) >> res->pdx); //Mod Antonin : sizebug1
|
|
||||||
res->ph = (ry0==ry1)?0:((py1 - py0) >> res->pdy); //Mod Antonin : sizebug1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tccp = &tcp->tccps[0];
|
|
||||||
pi[pino].step_p = 1;
|
|
||||||
pi[pino].step_c = 100 * pi[pino].step_p;
|
|
||||||
pi[pino].step_r = img->numcomps * pi[pino].step_c;
|
|
||||||
pi[pino].step_l = maxres * pi[pino].step_r;
|
|
||||||
|
|
||||||
if (pino == 0) {
|
|
||||||
pi[pino].include =
|
|
||||||
(short int *) malloc(img->numcomps * maxres *
|
|
||||||
tcp->numlayers * 100 * sizeof(short int));
|
|
||||||
for (i = 0; i < img->numcomps * maxres * tcp->numlayers * 100; i++)
|
|
||||||
pi[pino].include[i] = 0;
|
|
||||||
}
|
|
||||||
/* pi[pino].include=(short int*)calloc(img->numcomps*maxres*tcp->numlayers*1000,sizeof(short int)); */
|
|
||||||
else
|
|
||||||
pi[pino].include = pi[pino - 1].include;
|
|
||||||
|
|
||||||
if (tcp->POC == 0) {
|
|
||||||
pi[pino].first = 1;
|
|
||||||
pi[pino].poc.resno0 = 0;
|
|
||||||
pi[pino].poc.compno0 = 0;
|
|
||||||
pi[pino].poc.layno1 = tcp->numlayers;
|
|
||||||
pi[pino].poc.resno1 = maxres;
|
|
||||||
pi[pino].poc.compno1 = img->numcomps;
|
|
||||||
pi[pino].poc.prg = tcp->prg;
|
|
||||||
} else {
|
|
||||||
pi[pino].first = 1;
|
|
||||||
pi[pino].poc.resno0 = tcp->pocs[pino].resno0;
|
|
||||||
pi[pino].poc.compno0 = tcp->pocs[pino].compno0;
|
|
||||||
pi[pino].poc.layno1 = tcp->pocs[pino].layno1;
|
|
||||||
pi[pino].poc.resno1 = tcp->pocs[pino].resno1;
|
|
||||||
pi[pino].poc.compno1 = tcp->pocs[pino].compno1;
|
|
||||||
pi[pino].poc.prg = tcp->pocs[pino].prg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return pi;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary>
|
|
||||||
* Get next packet in layer-resolution-component-precinct order.
|
|
||||||
*
|
|
||||||
* pi: packet iterator to modify
|
|
||||||
* </summary> */
|
|
||||||
int pi_next_lrcp(pi_iterator_t * pi)
|
|
||||||
{
|
|
||||||
pi_comp_t *comp;
|
|
||||||
pi_resolution_t *res;
|
|
||||||
|
|
||||||
if (!pi->first) {
|
|
||||||
comp = &pi->comps[pi->compno];
|
|
||||||
res = &comp->resolutions[pi->resno];
|
|
||||||
goto skip;
|
|
||||||
} else {
|
|
||||||
pi->first = 0;
|
|
||||||
}
|
|
||||||
for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) {
|
|
||||||
for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1;
|
|
||||||
pi->resno++) {
|
|
||||||
for (pi->compno = pi->poc.compno0;
|
|
||||||
pi->compno < pi->poc.compno1; pi->compno++) {
|
|
||||||
comp = &pi->comps[pi->compno];
|
|
||||||
if (pi->resno >= comp->numresolutions) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
res = &comp->resolutions[pi->resno];
|
|
||||||
for (pi->precno = 0; pi->precno < res->pw * res->ph; pi->precno++) {
|
|
||||||
if (!pi->
|
|
||||||
include[pi->layno * pi->step_l +
|
|
||||||
pi->resno * pi->step_r +
|
|
||||||
pi->compno * pi->step_c + pi->precno * pi->step_p]) {
|
|
||||||
pi->include[pi->layno * pi->step_l +
|
|
||||||
pi->resno * pi->step_r +
|
|
||||||
pi->compno * pi->step_c +
|
|
||||||
pi->precno * pi->step_p] = 1;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
skip:;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary>
|
|
||||||
* Get next packet in resolution-layer-component-precinct order.
|
|
||||||
*
|
|
||||||
* pi: packet iterator to modify
|
|
||||||
* </summary> */
|
|
||||||
int pi_next_rlcp(pi_iterator_t * pi)
|
|
||||||
{
|
|
||||||
pi_comp_t *comp;
|
|
||||||
pi_resolution_t *res;
|
|
||||||
if (!pi->first) {
|
|
||||||
comp = &pi->comps[pi->compno];
|
|
||||||
res = &comp->resolutions[pi->resno];
|
|
||||||
goto skip;
|
|
||||||
} else {
|
|
||||||
pi->first = 0;
|
|
||||||
}
|
|
||||||
for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) {
|
|
||||||
for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) {
|
|
||||||
for (pi->compno = pi->poc.compno0;
|
|
||||||
pi->compno < pi->poc.compno1; pi->compno++) {
|
|
||||||
comp = &pi->comps[pi->compno];
|
|
||||||
if (pi->resno >= comp->numresolutions) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
res = &comp->resolutions[pi->resno];
|
|
||||||
for (pi->precno = 0; pi->precno < res->pw * res->ph; pi->precno++) {
|
|
||||||
if (!pi->
|
|
||||||
include[pi->layno * pi->step_l +
|
|
||||||
pi->resno * pi->step_r +
|
|
||||||
pi->compno * pi->step_c + pi->precno * pi->step_p]) {
|
|
||||||
pi->include[pi->layno * pi->step_l +
|
|
||||||
pi->resno * pi->step_r +
|
|
||||||
pi->compno * pi->step_c +
|
|
||||||
pi->precno * pi->step_p] = 1;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
skip:;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary>
|
|
||||||
* Get next packet in resolution-precinct-component-layer order.
|
|
||||||
*
|
|
||||||
* pi: packet iterator to modify
|
|
||||||
* </summary> */
|
|
||||||
int pi_next_rpcl(pi_iterator_t * pi)
|
|
||||||
{
|
|
||||||
pi_comp_t *comp;
|
|
||||||
pi_resolution_t *res;
|
|
||||||
if (!pi->first) {
|
|
||||||
goto skip;
|
|
||||||
} else {
|
|
||||||
int compno, resno;
|
|
||||||
pi->first = 0;
|
|
||||||
pi->dx = 0;
|
|
||||||
pi->dy = 0;
|
|
||||||
for (compno = 0; compno < pi->numcomps; compno++) {
|
|
||||||
comp = &pi->comps[compno];
|
|
||||||
for (resno = 0; resno < comp->numresolutions; resno++) {
|
|
||||||
int dx, dy;
|
|
||||||
res = &comp->resolutions[resno];
|
|
||||||
dx = comp->dx *
|
|
||||||
(1 << (res->pdx + comp->numresolutions - 1 - resno));
|
|
||||||
dy = comp->dy *
|
|
||||||
(1 << (res->pdy + comp->numresolutions - 1 - resno));
|
|
||||||
pi->dx = !pi->dx ? dx : int_min(pi->dx, dx);
|
|
||||||
pi->dy = !pi->dy ? dy : int_min(pi->dy, dy);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) {
|
|
||||||
for (pi->y = pi->ty0; pi->y < pi->ty1;
|
|
||||||
pi->y += pi->dy - (pi->y % pi->dy)) {
|
|
||||||
for (pi->x = pi->tx0; pi->x < pi->tx1;
|
|
||||||
pi->x += pi->dx - (pi->x % pi->dx)) {
|
|
||||||
for (pi->compno = pi->poc.compno0;
|
|
||||||
pi->compno < pi->poc.compno1; pi->compno++) {
|
|
||||||
int levelno;
|
|
||||||
int trx0, try0;
|
|
||||||
int trx1, try1;// Add antonin pcrl
|
|
||||||
int rpx, rpy;
|
|
||||||
int prci, prcj;
|
|
||||||
comp = &pi->comps[pi->compno];
|
|
||||||
if (pi->resno >= comp->numresolutions) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
res = &comp->resolutions[pi->resno];
|
|
||||||
levelno = comp->numresolutions - 1 - pi->resno;
|
|
||||||
trx0 = int_ceildiv(pi->tx0, comp->dx << levelno);
|
|
||||||
try0 = int_ceildiv(pi->ty0, comp->dy << levelno);
|
|
||||||
trx1 = int_ceildiv(pi->tx1, comp->dx << levelno);// Add antonin pcrl
|
|
||||||
try1 = int_ceildiv(pi->ty1, comp->dy << levelno);// Add antonin pcrl
|
|
||||||
rpx = res->pdx + levelno;
|
|
||||||
rpy = res->pdy + levelno;
|
|
||||||
if (!
|
|
||||||
(pi->x % (comp->dx << rpx) == 0
|
|
||||||
|| (pi->x == pi->tx0 && (trx0 << levelno) % (1 << rpx)))) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (!
|
|
||||||
(pi->y % (comp->dy << rpy) == 0
|
|
||||||
|| (pi->y == pi->ty0 && (try0 << levelno) % (1 << rpx)))) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Add Antonin : sizebug1
|
|
||||||
if ((res->pw==0)||(res->pw==0)) continue;
|
|
||||||
//ddA
|
|
||||||
|
|
||||||
//Add Antonin : pcrl
|
|
||||||
if ((trx0==trx1)||(try0==try1)) continue;
|
|
||||||
//ddA
|
|
||||||
|
|
||||||
prci =
|
|
||||||
int_floordivpow2(int_ceildiv
|
|
||||||
(pi->x, comp->dx << levelno),
|
|
||||||
res->pdx) - int_floordivpow2(trx0, res->pdx);
|
|
||||||
prcj =
|
|
||||||
int_floordivpow2(int_ceildiv
|
|
||||||
(pi->y, comp->dy << levelno),
|
|
||||||
res->pdy) - int_floordivpow2(try0, res->pdy);
|
|
||||||
pi->precno = prci + prcj * res->pw;
|
|
||||||
for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) {
|
|
||||||
if (!pi->
|
|
||||||
include[pi->layno * pi->step_l +
|
|
||||||
pi->resno * pi->step_r +
|
|
||||||
pi->compno * pi->step_c +
|
|
||||||
pi->precno * pi->step_p]) {
|
|
||||||
pi->include[pi->layno * pi->step_l +
|
|
||||||
pi->resno * pi->step_r +
|
|
||||||
pi->compno * pi->step_c +
|
|
||||||
pi->precno * pi->step_p] = 1;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
skip:;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary>
|
|
||||||
* Get next packet in precinct-component-resolution-layer order.
|
|
||||||
*
|
|
||||||
* pi: packet iterator to modify
|
|
||||||
* </summary> */
|
|
||||||
int pi_next_pcrl(pi_iterator_t * pi)
|
|
||||||
{
|
|
||||||
pi_comp_t *comp;
|
|
||||||
pi_resolution_t *res;
|
|
||||||
if (!pi->first) {
|
|
||||||
comp = &pi->comps[pi->compno];
|
|
||||||
goto skip;
|
|
||||||
} else {
|
|
||||||
int compno, resno;
|
|
||||||
pi->first = 0;
|
|
||||||
pi->dx = 0;
|
|
||||||
pi->dy = 0;
|
|
||||||
for (compno = 0; compno < pi->numcomps; compno++) {
|
|
||||||
comp = &pi->comps[compno];
|
|
||||||
for (resno = 0; resno < comp->numresolutions; resno++) {
|
|
||||||
int dx, dy;
|
|
||||||
res = &comp->resolutions[resno];
|
|
||||||
dx = comp->dx *
|
|
||||||
(1 << (res->pdx + comp->numresolutions - 1 - resno));
|
|
||||||
dy = comp->dy *
|
|
||||||
(1 << (res->pdy + comp->numresolutions - 1 - resno));
|
|
||||||
pi->dx = !pi->dx ? dx : int_min(pi->dx, dx);
|
|
||||||
pi->dy = !pi->dy ? dy : int_min(pi->dy, dy);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (pi->y = pi->ty0; pi->y < pi->ty1;
|
|
||||||
pi->y += pi->dy - (pi->y % pi->dy)) {
|
|
||||||
for (pi->x = pi->tx0; pi->x < pi->tx1;
|
|
||||||
pi->x += pi->dx - (pi->x % pi->dx)) {
|
|
||||||
for (pi->compno = pi->poc.compno0;
|
|
||||||
pi->compno < pi->poc.compno1; pi->compno++) {
|
|
||||||
comp = &pi->comps[pi->compno];
|
|
||||||
for (pi->resno = pi->poc.resno0;
|
|
||||||
pi->resno < int_min(pi->poc.resno1,
|
|
||||||
comp->numresolutions); pi->resno++) {
|
|
||||||
int levelno;
|
|
||||||
int trx0, try0;
|
|
||||||
int trx1, try1;// Add antonin pcrl
|
|
||||||
int rpx, rpy;
|
|
||||||
int prci, prcj;
|
|
||||||
res = &comp->resolutions[pi->resno];
|
|
||||||
levelno = comp->numresolutions - 1 - pi->resno;
|
|
||||||
trx0 = int_ceildiv(pi->tx0, comp->dx << levelno);
|
|
||||||
try0 = int_ceildiv(pi->ty0, comp->dy << levelno);
|
|
||||||
trx1 = int_ceildiv(pi->tx1, comp->dx << levelno);// Add antonin pcrl
|
|
||||||
try1 = int_ceildiv(pi->ty1, comp->dy << levelno);// Add antonin pcrl
|
|
||||||
rpx = res->pdx + levelno;
|
|
||||||
rpy = res->pdy + levelno;
|
|
||||||
if (!
|
|
||||||
(pi->x % (comp->dx << rpx) == 0
|
|
||||||
|| (pi->x == pi->tx0 && (trx0 << levelno) % (1 << rpx)))) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (!
|
|
||||||
(pi->y % (comp->dy << rpy) == 0
|
|
||||||
|| (pi->y == pi->ty0 && (try0 << levelno) % (1 << rpx)))) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Add Antonin : sizebug1
|
|
||||||
if ((res->pw==0)||(res->pw==0)) continue;
|
|
||||||
//ddA
|
|
||||||
|
|
||||||
//Add Antonin : pcrl
|
|
||||||
if ((trx0==trx1)||(try0==try1)) continue;
|
|
||||||
//ddA
|
|
||||||
|
|
||||||
prci =
|
|
||||||
int_floordivpow2(int_ceildiv
|
|
||||||
(pi->x, comp->dx << levelno),
|
|
||||||
res->pdx) - int_floordivpow2(trx0, res->pdx);
|
|
||||||
prcj =
|
|
||||||
int_floordivpow2(int_ceildiv
|
|
||||||
(pi->y, comp->dy << levelno),
|
|
||||||
res->pdy) - int_floordivpow2(try0, res->pdy);
|
|
||||||
pi->precno = prci + prcj * res->pw;
|
|
||||||
for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) {
|
|
||||||
if (!pi->
|
|
||||||
include[pi->layno * pi->step_l +
|
|
||||||
pi->resno * pi->step_r +
|
|
||||||
pi->compno * pi->step_c +
|
|
||||||
pi->precno * pi->step_p]) {
|
|
||||||
pi->include[pi->layno * pi->step_l +
|
|
||||||
pi->resno * pi->step_r +
|
|
||||||
pi->compno * pi->step_c +
|
|
||||||
pi->precno * pi->step_p] = 1;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
skip:;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary>
|
|
||||||
* Get next packet in component-precinct-resolution-layer order.
|
|
||||||
*
|
|
||||||
* pi: packet iterator to modify
|
|
||||||
* </summary> */
|
|
||||||
int pi_next_cprl(pi_iterator_t * pi)
|
|
||||||
{
|
|
||||||
pi_comp_t *comp;
|
|
||||||
pi_resolution_t *res;
|
|
||||||
if (!pi->first) {
|
|
||||||
comp = &pi->comps[pi->compno];
|
|
||||||
goto skip;
|
|
||||||
} else {
|
|
||||||
pi->first = 0;
|
|
||||||
}
|
|
||||||
for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1;
|
|
||||||
pi->compno++) {
|
|
||||||
int resno;
|
|
||||||
comp = &pi->comps[pi->compno];
|
|
||||||
pi->dx = 0;
|
|
||||||
pi->dy = 0;
|
|
||||||
for (resno = 0; resno < comp->numresolutions; resno++) {
|
|
||||||
int dx, dy;
|
|
||||||
res = &comp->resolutions[resno];
|
|
||||||
dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno));
|
|
||||||
dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno));
|
|
||||||
pi->dx = !pi->dx ? dx : int_min(pi->dx, dx);
|
|
||||||
pi->dy = !pi->dy ? dy : int_min(pi->dy, dy);
|
|
||||||
}
|
|
||||||
for (pi->y = pi->ty0; pi->y < pi->ty1;
|
|
||||||
pi->y += pi->dy - (pi->y % pi->dy)) {
|
|
||||||
for (pi->x = pi->tx0; pi->x < pi->tx1;
|
|
||||||
pi->x += pi->dx - (pi->x % pi->dx)) {
|
|
||||||
for (pi->resno = pi->poc.resno0;
|
|
||||||
pi->resno < int_min(pi->poc.resno1,
|
|
||||||
comp->numresolutions); pi->resno++) {
|
|
||||||
int levelno;
|
|
||||||
int trx0, try0;
|
|
||||||
int trx1, try1;// Add antonin pcrl
|
|
||||||
int rpx, rpy;
|
|
||||||
int prci, prcj;
|
|
||||||
res = &comp->resolutions[pi->resno];
|
|
||||||
levelno = comp->numresolutions - 1 - pi->resno;
|
|
||||||
trx0 = int_ceildiv(pi->tx0, comp->dx << levelno);
|
|
||||||
try0 = int_ceildiv(pi->ty0, comp->dy << levelno);
|
|
||||||
trx1 = int_ceildiv(pi->tx1, comp->dx << levelno);// Add antonin pcrl
|
|
||||||
try1 = int_ceildiv(pi->ty1, comp->dy << levelno);// Add antonin pcrl
|
|
||||||
rpx = res->pdx + levelno;
|
|
||||||
rpy = res->pdy + levelno;
|
|
||||||
if (!
|
|
||||||
(pi->x % (comp->dx << rpx) == 0
|
|
||||||
|| (pi->x == pi->tx0 && (trx0 << levelno) % (1 << rpx)))) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (!
|
|
||||||
(pi->y % (comp->dy << rpy) == 0
|
|
||||||
|| (pi->y == pi->ty0 && (try0 << levelno) % (1 << rpx)))) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Add Antonin : sizebug1
|
|
||||||
if ((res->pw==0)||(res->pw==0)) continue;
|
|
||||||
//ddA
|
|
||||||
|
|
||||||
//Add Antonin : pcrl
|
|
||||||
if ((trx0==trx1)||(try0==try1)) continue;
|
|
||||||
//ddA
|
|
||||||
|
|
||||||
prci =
|
|
||||||
int_floordivpow2(int_ceildiv
|
|
||||||
(pi->x, comp->dx << levelno),
|
|
||||||
res->pdx) - int_floordivpow2(trx0, res->pdx);
|
|
||||||
prcj =
|
|
||||||
int_floordivpow2(int_ceildiv
|
|
||||||
(pi->y, comp->dy << levelno),
|
|
||||||
res->pdy) - int_floordivpow2(try0, res->pdy);
|
|
||||||
pi->precno = prci + prcj * res->pw;
|
|
||||||
for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) {
|
|
||||||
if (!pi->
|
|
||||||
include[pi->layno * pi->step_l +
|
|
||||||
pi->resno * pi->step_r +
|
|
||||||
pi->compno * pi->step_c +
|
|
||||||
pi->precno * pi->step_p]) {
|
|
||||||
pi->include[pi->layno * pi->step_l +
|
|
||||||
pi->resno * pi->step_r +
|
|
||||||
pi->compno * pi->step_c +
|
|
||||||
pi->precno * pi->step_p] = 1;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
skip:;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary>
|
|
||||||
* Get next packet.
|
|
||||||
*
|
|
||||||
* pi: packet iterator to modify
|
|
||||||
* </summary> */
|
|
||||||
int pi_next(pi_iterator_t * pi)
|
|
||||||
{
|
|
||||||
switch (pi->poc.prg) {
|
|
||||||
case 0:
|
|
||||||
return pi_next_lrcp(pi);
|
|
||||||
case 1:
|
|
||||||
return pi_next_rlcp(pi);
|
|
||||||
case 2:
|
|
||||||
return pi_next_rpcl(pi);
|
|
||||||
case 3:
|
|
||||||
return pi_next_pcrl(pi);
|
|
||||||
case 4:
|
|
||||||
return pi_next_cprl(pi);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,72 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2002, David Janssens
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __PI_H
|
|
||||||
#define __PI_H
|
|
||||||
|
|
||||||
#include "j2k.h"
|
|
||||||
#include "tcd.h"
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int pdx, pdy;
|
|
||||||
int pw, ph;
|
|
||||||
} pi_resolution_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int dx, dy;
|
|
||||||
int numresolutions;
|
|
||||||
pi_resolution_t *resolutions;
|
|
||||||
} pi_comp_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
short int *include; /* precise if the packet has been already used (usefull for progression order change) */
|
|
||||||
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 */
|
|
||||||
int first; /* 0 if the first packet */
|
|
||||||
j2k_poc_t poc;
|
|
||||||
int numcomps;
|
|
||||||
pi_comp_t *comps;
|
|
||||||
int tx0, ty0, tx1, ty1;
|
|
||||||
int x, y, dx, dy;
|
|
||||||
} pi_iterator_t; /* packet iterator */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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
|
|
||||||
* return value: returns a packet iterator that points to the first packet of the tile
|
|
||||||
*/
|
|
||||||
pi_iterator_t *pi_create(j2k_image_t * img, j2k_cp_t * cp, int tileno);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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
|
|
||||||
*/
|
|
||||||
int pi_next(pi_iterator_t * pi);
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,81 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2002-2003, Antonin Descampe
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "raw.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.
|
|
||||||
*/
|
|
||||||
int raw_numbytes()
|
|
||||||
{
|
|
||||||
return raw_bp - raw_start;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initialize raw-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)
|
|
||||||
{
|
|
||||||
raw_start = bp;
|
|
||||||
raw_lenmax = len;
|
|
||||||
raw_len = 0;
|
|
||||||
raw_c = 0;
|
|
||||||
raw_ct = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Decode a symbol using raw-decoder. Cfr p.506 TAUBMAN
|
|
||||||
*/
|
|
||||||
int raw_decode()
|
|
||||||
{
|
|
||||||
int d;
|
|
||||||
if (raw_ct == 0) {
|
|
||||||
raw_ct = 8;
|
|
||||||
if (raw_len == raw_lenmax)
|
|
||||||
raw_c = 0xff;
|
|
||||||
else {
|
|
||||||
if (raw_c == 0xff)
|
|
||||||
raw_ct = 7;
|
|
||||||
raw_c = *(raw_start + raw_len);
|
|
||||||
raw_len++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
raw_ct--;
|
|
||||||
d = (raw_c >> raw_ct) & 0x01;
|
|
||||||
return d;
|
|
||||||
}
|
|
|
@ -1,48 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2002-2003, Antonin Descampe
|
|
||||||
* Copyright (c) 2002-2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __RAW_H
|
|
||||||
#define __RAW_H
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return the number of bytes written/read since initialisation
|
|
||||||
*/
|
|
||||||
int raw_numbytes();
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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)
|
|
||||||
*/
|
|
||||||
int raw_decode();
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,138 +0,0 @@
|
||||||
/* rs.c */
|
|
||||||
/* This program is an encoder/decoder for Reed-Solomon codes. Encoding is in
|
|
||||||
systematic form, decoding via the Berlekamp iterative algorithm.
|
|
||||||
In the present form , the constants mm, nn, tt, and kk=nn-2tt must be
|
|
||||||
specified (the double letters are used simply to avoid clashes with
|
|
||||||
other n,k,t used in other programs into which this was incorporated!)
|
|
||||||
Also, the irreducible polynomial used to generate GF(2**mm) must also be
|
|
||||||
entered -- these can be found in Lin and Costello, and also Clark and Cain.
|
|
||||||
|
|
||||||
The representation of the elements of GF(2**m) is either in index form,
|
|
||||||
where the number is the power of the primitive element alpha, which is
|
|
||||||
convenient for multiplication (add the powers modulo 2**m-1) or in
|
|
||||||
polynomial form, where the bits represent the coefficients of the
|
|
||||||
polynomial representation of the number, which is the most convenient form
|
|
||||||
for addition. The two forms are swapped between via lookup tables.
|
|
||||||
This leads to fairly messy looking expressions, but unfortunately, there
|
|
||||||
is no easy alternative when working with Galois arithmetic.
|
|
||||||
|
|
||||||
The code is not written in the most elegant way, but to the best
|
|
||||||
of my knowledge, (no absolute guarantees!), it works.
|
|
||||||
However, when including it into a simulation program, you may want to do
|
|
||||||
some conversion of global variables (used here because I am lazy!) to
|
|
||||||
local variables where appropriate, and passing parameters (eg array
|
|
||||||
addresses) to the functions may be a sensible move to reduce the number
|
|
||||||
of global variables and thus decrease the chance of a bug being introduced.
|
|
||||||
|
|
||||||
This program does not handle erasures at present, but should not be hard
|
|
||||||
to adapt to do this, as it is just an adjustment to the Berlekamp-Massey
|
|
||||||
algorithm. It also does not attempt to decode past the BCH bound -- see
|
|
||||||
Blahut "Theory and practice of error control codes" for how to do this.
|
|
||||||
|
|
||||||
Simon Rockliff, University of Adelaide 21/9/89
|
|
||||||
|
|
||||||
26/6/91 Slight modifications to remove a compiler dependent bug which hadn't
|
|
||||||
previously surfaced. A few extra comments added for clarity.
|
|
||||||
Appears to all work fine, ready for posting to net!
|
|
||||||
|
|
||||||
Notice
|
|
||||||
--------
|
|
||||||
This program may be freely modified and/or given to whoever wants it.
|
|
||||||
A condition of such distribution is that the author's contribution be
|
|
||||||
acknowledged by his name being left in the comments heading the program,
|
|
||||||
however no responsibility is accepted for any financial or other loss which
|
|
||||||
may result from some unforseen errors or malfunctioning of the program
|
|
||||||
during use.
|
|
||||||
Simon Rockliff, 26th June 1991
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <math.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#define mm 8 /* RS code over GF(2**4) - change to suit */
|
|
||||||
#define nn 255 /* nn=2**mm -1 length of codeword */
|
|
||||||
|
|
||||||
int pp [mm+1] = { 1, 0, 1, 1, 1, 0, 0, 0, 1 } ; /* specify irreducible polynomial coeffts */
|
|
||||||
|
|
||||||
void generate_gf(int *alpha_to, int *index_of)
|
|
||||||
/* generate GF(2**mm) from the irreducible polynomial p(X) in pp[0]..pp[mm]
|
|
||||||
lookup tables: index->polynomial form alpha_to[] contains j=alpha**i;
|
|
||||||
polynomial form -> index form index_of[j=alpha**i] = i
|
|
||||||
alpha=2 is the primitive element of GF(2**mm)
|
|
||||||
*/
|
|
||||||
{
|
|
||||||
register int i, mask ;
|
|
||||||
|
|
||||||
mask = 1 ;
|
|
||||||
alpha_to[mm] = 0 ;
|
|
||||||
for (i=0; i<mm; i++)
|
|
||||||
{ alpha_to[i] = mask ;
|
|
||||||
index_of[alpha_to[i]] = i ;
|
|
||||||
if (pp[i]!=0)
|
|
||||||
alpha_to[mm] ^= mask ;
|
|
||||||
mask <<= 1 ;
|
|
||||||
}
|
|
||||||
index_of[alpha_to[mm]] = mm ;
|
|
||||||
mask >>= 1 ;
|
|
||||||
for (i=mm+1; i<nn; i++)
|
|
||||||
{ if (alpha_to[i-1] >= mask)
|
|
||||||
alpha_to[i] = alpha_to[mm] ^ ((alpha_to[i-1]^mask)<<1) ;
|
|
||||||
else alpha_to[i] = alpha_to[i-1]<<1 ;
|
|
||||||
index_of[alpha_to[i]] = i ;
|
|
||||||
}
|
|
||||||
index_of[0] = -1 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void gen_poly(int kk, int *alpha_to, int *index_of, int *gg)
|
|
||||||
/* Obtain the generator polynomial of the tt-error correcting, length
|
|
||||||
nn=(2**mm -1) Reed Solomon code from the product of (X+alpha**i), i=1..2*tt
|
|
||||||
*/
|
|
||||||
{
|
|
||||||
register int i,j ;
|
|
||||||
|
|
||||||
gg[0] = 2 ; /* primitive element alpha = 2 for GF(2**mm) */
|
|
||||||
gg[1] = 1 ; /* g(x) = (X+alpha) initially */
|
|
||||||
for (i=2; i<=nn-kk; i++)
|
|
||||||
{ gg[i] = 1 ;
|
|
||||||
for (j=i-1; j>0; j--)
|
|
||||||
if (gg[j] != 0) gg[j] = gg[j-1]^ alpha_to[(index_of[gg[j]]+i)%nn] ;
|
|
||||||
else gg[j] = gg[j-1] ;
|
|
||||||
gg[0] = alpha_to[(index_of[gg[0]]+i)%nn] ; /* gg[0] can never be zero */
|
|
||||||
}
|
|
||||||
/* convert gg[] to index form for quicker encoding */
|
|
||||||
for (i=0; i<=nn-kk; i++) gg[i] = index_of[gg[i]] ;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void encode_rs(int kk, int *alpha_to, int *index_of, int *gg, int *bb, int *data)
|
|
||||||
/* take the string of symbols in data[i], i=0..(k-1) and encode systematically
|
|
||||||
to produce 2*tt parity symbols in bb[0]..bb[2*tt-1]
|
|
||||||
data[] is input and bb[] is output in polynomial form.
|
|
||||||
Encoding is done by using a feedback shift register with appropriate
|
|
||||||
connections specified by the elements of gg[], which was generated above.
|
|
||||||
Codeword is c(X) = data(X)*X**(nn-kk)+ b(X) */
|
|
||||||
{
|
|
||||||
register int i,j ;
|
|
||||||
int feedback ;
|
|
||||||
|
|
||||||
for (i=0; i<nn-kk; i++) bb[i] = 0 ;
|
|
||||||
for (i=kk-1; i>=0; i--)
|
|
||||||
{ feedback = index_of[data[i]^bb[nn-kk-1]] ;
|
|
||||||
if (feedback != -1)
|
|
||||||
{ for (j=nn-kk-1; j>0; j--)
|
|
||||||
if (gg[j] != -1)
|
|
||||||
bb[j] = bb[j-1]^alpha_to[(gg[j]+feedback)%nn] ;
|
|
||||||
else
|
|
||||||
bb[j] = bb[j-1] ;
|
|
||||||
bb[0] = alpha_to[(gg[0]+feedback)%nn] ;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{ for (j=nn-kk-1; j>0; j--)
|
|
||||||
bb[j] = bb[j-1] ;
|
|
||||||
bb[0] = 0 ;
|
|
||||||
} ;
|
|
||||||
} ;
|
|
||||||
} ;
|
|
||||||
|
|
||||||
|
|
|
@ -1,12 +0,0 @@
|
||||||
|
|
||||||
/*
|
|
||||||
Header file for rs.c
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
void generate_gf(int *alpha_to, int *index_of);
|
|
||||||
|
|
||||||
void gen_poly(int kk, int *alpha_to, int *index_of, int *gg);
|
|
||||||
|
|
||||||
void encode_rs(int kk, int *alpha_to, int *index_of, int *gg, int *bb, int *data);
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,52 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2002, David Janssens
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __T1_H
|
|
||||||
#define __T1_H
|
|
||||||
|
|
||||||
#include "tcd.h"
|
|
||||||
#include "j2k.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initialize the look-up tables of the Tier-1 coder/decoder
|
|
||||||
*/
|
|
||||||
void t1_init_luts();
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Encode the code-blocks of a tile
|
|
||||||
* tile: the tile to encode
|
|
||||||
* tcp: tile coding parameters
|
|
||||||
*/
|
|
||||||
void t1_encode_cblks(tcd_tile_t * tile, j2k_tcp_t * tcp);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Decode the code-blocks of a tile
|
|
||||||
* tile: the tile to encode
|
|
||||||
* tcp: tile coding parameters
|
|
||||||
*/
|
|
||||||
void t1_decode_cblks(tcd_tile_t * tile, j2k_tcp_t * tcp);
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,644 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2002, David Janssens
|
|
||||||
* Copyright (c) 2002-2004, Yannick Verschueren
|
|
||||||
* Copyright (c) 2002-2004, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "t2.h"
|
|
||||||
#include "tcd.h"
|
|
||||||
#include "bio.h"
|
|
||||||
#include "j2k.h"
|
|
||||||
#include "pi.h"
|
|
||||||
#include "tgt.h"
|
|
||||||
#include "int.h"
|
|
||||||
#include "cio.h"
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <setjmp.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#define RESTART 0x04
|
|
||||||
|
|
||||||
extern jmp_buf j2k_error;
|
|
||||||
|
|
||||||
void t2_putcommacode(int n)
|
|
||||||
{
|
|
||||||
while (--n >= 0) {
|
|
||||||
bio_write(1, 1);
|
|
||||||
}
|
|
||||||
bio_write(0, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
int t2_getcommacode()
|
|
||||||
{
|
|
||||||
int n;
|
|
||||||
for (n = 0; bio_read(1); n++) {
|
|
||||||
}
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* Variable length code for signalling delta Zil (truncation point) */
|
|
||||||
/* <val> n : delta Zil */
|
|
||||||
/* <\summary> */
|
|
||||||
void t2_putnumpasses(int n)
|
|
||||||
{
|
|
||||||
if (n == 1) {
|
|
||||||
bio_write(0, 1);
|
|
||||||
} else if (n == 2) {
|
|
||||||
bio_write(2, 2);
|
|
||||||
} else if (n <= 5) {
|
|
||||||
bio_write(0xc | (n - 3), 4);
|
|
||||||
} else if (n <= 36) {
|
|
||||||
bio_write(0x1e0 | (n - 6), 9);
|
|
||||||
} else if (n <= 164) {
|
|
||||||
bio_write(0xff80 | (n - 37), 16);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int t2_getnumpasses()
|
|
||||||
{
|
|
||||||
int n;
|
|
||||||
if (!bio_read(1))
|
|
||||||
return 1;
|
|
||||||
if (!bio_read(1))
|
|
||||||
return 2;
|
|
||||||
if ((n = bio_read(2)) != 3)
|
|
||||||
return 3 + n;
|
|
||||||
if ((n = bio_read(5)) != 31)
|
|
||||||
return 6 + n;
|
|
||||||
return 37 + bio_read(7);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Encode a packet of a tile to a destination buffer
|
|
||||||
*
|
|
||||||
* Tile : the tile for which to write the packets
|
|
||||||
* tcp : the tile coding parameters
|
|
||||||
* compno : Identity of the packet --> component value
|
|
||||||
* resno : Identity of the packet --> resolution level value
|
|
||||||
* precno : Identity of the packet --> precinct value
|
|
||||||
* layno : Identity of the packet --> quality layer value
|
|
||||||
* dest : the destination buffer
|
|
||||||
* len : the length of the destination buffer
|
|
||||||
* info_IM : structure to create an index file
|
|
||||||
* tileno : number of the tile encoded
|
|
||||||
*/
|
|
||||||
int t2_encode_packet(tcd_tile_t * tile, j2k_tcp_t * tcp, int compno,
|
|
||||||
int resno, int precno, int layno, unsigned char *dest,
|
|
||||||
int len, info_image * info_IM, int tileno)
|
|
||||||
{
|
|
||||||
int bandno, cblkno;
|
|
||||||
unsigned char *sop = 0, *eph = 0;
|
|
||||||
tcd_tilecomp_t *tilec = &tile->comps[compno];
|
|
||||||
tcd_resolution_t *res = &tilec->resolutions[resno];
|
|
||||||
unsigned char *c = dest;
|
|
||||||
|
|
||||||
/* <SOP 0xff91> */
|
|
||||||
if (tcp->csty & J2K_CP_CSTY_SOP) {
|
|
||||||
sop = (unsigned char *) malloc(6 * sizeof(unsigned char));
|
|
||||||
sop[0] = 255;
|
|
||||||
sop[1] = 145;
|
|
||||||
sop[2] = 0;
|
|
||||||
sop[3] = 4;
|
|
||||||
sop[4] = (info_IM->num % 65536) / 256;
|
|
||||||
sop[5] = (info_IM->num % 65536) % 256;
|
|
||||||
memcpy(c, sop, 6);
|
|
||||||
free(sop);
|
|
||||||
c += 6;
|
|
||||||
}
|
|
||||||
/* </SOP> */
|
|
||||||
|
|
||||||
if (!layno) {
|
|
||||||
for (bandno = 0; bandno < res->numbands; bandno++) {
|
|
||||||
tcd_band_t *band = &res->bands[bandno];
|
|
||||||
tcd_precinct_t *prc = &band->precincts[precno];
|
|
||||||
tgt_reset(prc->incltree);
|
|
||||||
tgt_reset(prc->imsbtree);
|
|
||||||
for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
|
|
||||||
tcd_cblk_t *cblk = &prc->cblks[cblkno];
|
|
||||||
cblk->numpasses = 0;
|
|
||||||
tgt_setvalue(prc->imsbtree, cblkno, band->numbps - cblk->numbps);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bio_init_enc(c, len);
|
|
||||||
bio_write(1, 1); /* Empty header bit */
|
|
||||||
|
|
||||||
/* Writing Packet header */
|
|
||||||
for (bandno = 0; bandno < res->numbands; bandno++) {
|
|
||||||
tcd_band_t *band = &res->bands[bandno];
|
|
||||||
tcd_precinct_t *prc = &band->precincts[precno];
|
|
||||||
for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
|
|
||||||
tcd_cblk_t *cblk = &prc->cblks[cblkno];
|
|
||||||
tcd_layer_t *layer = &cblk->layers[layno];
|
|
||||||
if (!cblk->numpasses && layer->numpasses) {
|
|
||||||
tgt_setvalue(prc->incltree, cblkno, layno);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
|
|
||||||
tcd_cblk_t *cblk = &prc->cblks[cblkno];
|
|
||||||
tcd_layer_t *layer = &cblk->layers[layno];
|
|
||||||
int increment = 0;
|
|
||||||
int nump = 0;
|
|
||||||
int len = 0, passno;
|
|
||||||
/* cblk inclusion bits */
|
|
||||||
if (!cblk->numpasses) {
|
|
||||||
tgt_encode(prc->incltree, cblkno, layno + 1);
|
|
||||||
} else {
|
|
||||||
bio_write(layer->numpasses != 0, 1);
|
|
||||||
}
|
|
||||||
/* if cblk not included, go to the next cblk */
|
|
||||||
if (!layer->numpasses) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
/* if first instance of cblk --> zero bit-planes information */
|
|
||||||
if (!cblk->numpasses) {
|
|
||||||
cblk->numlenbits = 3;
|
|
||||||
tgt_encode(prc->imsbtree, cblkno, 999);
|
|
||||||
}
|
|
||||||
/* number of coding passes included */
|
|
||||||
t2_putnumpasses(layer->numpasses);
|
|
||||||
|
|
||||||
/* computation of the increase of the length indicator and insertion in the header */
|
|
||||||
for (passno = cblk->numpasses;
|
|
||||||
passno < cblk->numpasses + layer->numpasses; passno++) {
|
|
||||||
tcd_pass_t *pass = &cblk->passes[passno];
|
|
||||||
nump++;
|
|
||||||
len += pass->len;
|
|
||||||
if (pass->term
|
|
||||||
|| passno == (cblk->numpasses + layer->numpasses) - 1) {
|
|
||||||
increment =
|
|
||||||
int_max(increment,
|
|
||||||
int_floorlog2(len) + 1 -
|
|
||||||
(cblk->numlenbits + int_floorlog2(nump)));
|
|
||||||
len = 0;
|
|
||||||
nump = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
t2_putcommacode(increment);
|
|
||||||
/* computation of the new Length indicator */
|
|
||||||
cblk->numlenbits += increment;
|
|
||||||
/* insertion of the codeword segment length */
|
|
||||||
|
|
||||||
for (passno = cblk->numpasses;
|
|
||||||
passno < cblk->numpasses + layer->numpasses; passno++) {
|
|
||||||
tcd_pass_t *pass = &cblk->passes[passno];
|
|
||||||
nump++;
|
|
||||||
len += pass->len;
|
|
||||||
if (pass->term
|
|
||||||
|| passno == (cblk->numpasses + layer->numpasses) - 1) {
|
|
||||||
bio_write(len, cblk->numlenbits + int_floorlog2(nump));
|
|
||||||
len = 0;
|
|
||||||
nump = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bio_flush())
|
|
||||||
return -999; /* modified to eliminate longjmp !! */
|
|
||||||
|
|
||||||
c += bio_numbytes();
|
|
||||||
|
|
||||||
/* <EPH 0xff92> */
|
|
||||||
if (tcp->csty & J2K_CP_CSTY_EPH) {
|
|
||||||
eph = (unsigned char *) malloc(2 * sizeof(unsigned char));
|
|
||||||
eph[0] = 255;
|
|
||||||
eph[1] = 146;
|
|
||||||
memcpy(c, eph, 2);
|
|
||||||
free(eph);
|
|
||||||
c += 2;
|
|
||||||
}
|
|
||||||
/* </EPH> */
|
|
||||||
|
|
||||||
/* Writing the packet body */
|
|
||||||
|
|
||||||
for (bandno = 0; bandno < res->numbands; bandno++) {
|
|
||||||
tcd_band_t *band = &res->bands[bandno];
|
|
||||||
tcd_precinct_t *prc = &band->precincts[precno];
|
|
||||||
for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
|
|
||||||
tcd_cblk_t *cblk = &prc->cblks[cblkno];
|
|
||||||
tcd_layer_t *layer = &cblk->layers[layno];
|
|
||||||
if (!layer->numpasses) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (c + layer->len > dest + len) {
|
|
||||||
return -999;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(c, layer->data, layer->len);
|
|
||||||
cblk->numpasses += layer->numpasses;
|
|
||||||
c += layer->len;
|
|
||||||
/* ADD for index Cfr. Marcela --> delta disto by packet */
|
|
||||||
if (info_IM->index_write && info_IM->index_on) {
|
|
||||||
info_tile *info_TL = &info_IM->tile[tileno];
|
|
||||||
info_packet *info_PK = &info_TL->packet[info_IM->num];
|
|
||||||
info_PK->disto += layer->disto;
|
|
||||||
if (info_IM->D_max < info_PK->disto)
|
|
||||||
info_IM->D_max = info_PK->disto;
|
|
||||||
} /* </ADD> */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return c - dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
void t2_init_seg(tcd_seg_t * seg, int cblksty, int first)
|
|
||||||
{
|
|
||||||
seg->numpasses = 0;
|
|
||||||
seg->len = 0;
|
|
||||||
if (cblksty & J2K_CCP_CBLKSTY_TERMALL)
|
|
||||||
seg->maxpasses = 1;
|
|
||||||
else if (cblksty & J2K_CCP_CBLKSTY_LAZY) {
|
|
||||||
if (first)
|
|
||||||
seg->maxpasses = 10;
|
|
||||||
else
|
|
||||||
seg->maxpasses = (((seg - 1)->maxpasses == 1)
|
|
||||||
|| ((seg - 1)->maxpasses == 10)) ? 2 : 1;
|
|
||||||
} else
|
|
||||||
seg->maxpasses = 109;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Decode a packet of a tile from a source buffer
|
|
||||||
*
|
|
||||||
* src : the source buffer
|
|
||||||
* len : the length of the source buffer
|
|
||||||
* tile : the tile for which to write the packets
|
|
||||||
* cp : the image coding parameters
|
|
||||||
* tcp : the tile coding parameters
|
|
||||||
* compno : Identity of the packet --> component value
|
|
||||||
* resno : Identity of the packet --> resolution level value
|
|
||||||
* precno : Identity of the packet --> precinct value
|
|
||||||
* layno : Identity of the packet --> quality layer value
|
|
||||||
*/
|
|
||||||
int t2_decode_packet(unsigned char *src, int len, tcd_tile_t * tile,
|
|
||||||
j2k_cp_t * cp, j2k_tcp_t * tcp, int compno, int resno,
|
|
||||||
int precno, int layno)
|
|
||||||
{
|
|
||||||
int bandno, cblkno;
|
|
||||||
tcd_tilecomp_t *tilec = &tile->comps[compno];
|
|
||||||
tcd_resolution_t *res = &tilec->resolutions[resno];
|
|
||||||
unsigned char *c = src;
|
|
||||||
unsigned char *hd = NULL;
|
|
||||||
int present;
|
|
||||||
|
|
||||||
if (layno == 0) {
|
|
||||||
for (bandno = 0; bandno < res->numbands; bandno++) {
|
|
||||||
tcd_band_t *band = &res->bands[bandno];
|
|
||||||
tcd_precinct_t *prc = &band->precincts[precno];
|
|
||||||
|
|
||||||
//Add Antonin : sizebug1
|
|
||||||
if ((band->x1-band->x0 == 0)||(band->y1-band->y0 == 0)) continue;
|
|
||||||
//ddA
|
|
||||||
|
|
||||||
tgt_reset(prc->incltree);
|
|
||||||
tgt_reset(prc->imsbtree);
|
|
||||||
for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
|
|
||||||
tcd_cblk_t *cblk = &prc->cblks[cblkno];
|
|
||||||
cblk->numsegs = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// SOP markers
|
|
||||||
if (tcp->csty & J2K_CP_CSTY_SOP) {
|
|
||||||
if ((*c) != 0xff || (*(c + 1) != 0x91)) {
|
|
||||||
printf("Warning : expected SOP marker\n");
|
|
||||||
} else {
|
|
||||||
c += 6;
|
|
||||||
}
|
|
||||||
//TODO : check the Nsop value
|
|
||||||
}
|
|
||||||
|
|
||||||
/* When the marker PPT/PPM is used the packet header are store in PPT/PPM marker
|
|
||||||
This part deal with this caracteristic
|
|
||||||
step 1: Read packet header in the saved structure
|
|
||||||
step 2: Return to codestream for decoding */
|
|
||||||
|
|
||||||
if (cp->ppm == 1) { /* PPM */
|
|
||||||
hd = cp->ppm_data;
|
|
||||||
bio_init_dec(hd, cp->ppm_len); //Mod Antonin : ppmbug1
|
|
||||||
} else if (tcp->ppt == 1) { /* PPT */
|
|
||||||
hd = tcp->ppt_data;
|
|
||||||
bio_init_dec(hd, tcp->ppt_len); //Mod Antonin : ppmbug1
|
|
||||||
} else { /* Normal Case */
|
|
||||||
hd = c;
|
|
||||||
bio_init_dec(hd, src+len-hd);
|
|
||||||
}
|
|
||||||
|
|
||||||
present = bio_read(1);
|
|
||||||
|
|
||||||
if (!present) {
|
|
||||||
bio_inalign();
|
|
||||||
hd += bio_numbytes();
|
|
||||||
|
|
||||||
// EPH markers
|
|
||||||
if (tcp->csty & J2K_CP_CSTY_EPH) {
|
|
||||||
if ((*hd) != 0xff || (*(hd + 1) != 0x92)) {
|
|
||||||
printf("Error : expected EPH marker\n");
|
|
||||||
} else {
|
|
||||||
hd += 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cp->ppm == 1) { /* PPM case */
|
|
||||||
cp->ppm_len+=cp->ppm_data-hd;
|
|
||||||
cp->ppm_data = hd;
|
|
||||||
return c - src;
|
|
||||||
}
|
|
||||||
if (tcp->ppt == 1) { /* PPT case */
|
|
||||||
tcp->ppt_len+=tcp->ppt_data-hd;
|
|
||||||
tcp->ppt_data = hd;
|
|
||||||
return c - src;
|
|
||||||
}
|
|
||||||
|
|
||||||
return hd - src;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (bandno = 0; bandno < res->numbands; bandno++) {
|
|
||||||
tcd_band_t *band = &res->bands[bandno];
|
|
||||||
tcd_precinct_t *prc = &band->precincts[precno];
|
|
||||||
|
|
||||||
//Add Antonin : sizebug1
|
|
||||||
if ((band->x1-band->x0 == 0)||(band->y1-band->y0 == 0)) continue;
|
|
||||||
//ddA
|
|
||||||
|
|
||||||
for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
|
|
||||||
int included, increment, n;
|
|
||||||
tcd_cblk_t *cblk = &prc->cblks[cblkno];
|
|
||||||
tcd_seg_t *seg;
|
|
||||||
/* if cblk not yet included before --> inclusion tagtree */
|
|
||||||
if (!cblk->numsegs) {
|
|
||||||
included = tgt_decode(prc->incltree, cblkno, layno + 1);
|
|
||||||
/* else one bit */
|
|
||||||
} else {
|
|
||||||
included = bio_read(1);
|
|
||||||
}
|
|
||||||
/* if cblk not included */
|
|
||||||
if (!included) {
|
|
||||||
cblk->numnewpasses = 0;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
/* if cblk not yet included --> zero-bitplane tagtree */
|
|
||||||
if (!cblk->numsegs) {
|
|
||||||
int i, numimsbs;
|
|
||||||
for (i = 0; !tgt_decode(prc->imsbtree, cblkno, i); i++) {
|
|
||||||
}
|
|
||||||
numimsbs = i - 1;
|
|
||||||
cblk->numbps = band->numbps - numimsbs;
|
|
||||||
cblk->numlenbits = 3;
|
|
||||||
}
|
|
||||||
/* number of coding passes */
|
|
||||||
cblk->numnewpasses = t2_getnumpasses();
|
|
||||||
increment = t2_getcommacode();
|
|
||||||
/* length indicator increment */
|
|
||||||
cblk->numlenbits += increment;
|
|
||||||
if (!cblk->numsegs) {
|
|
||||||
seg = &cblk->segs[0];
|
|
||||||
t2_init_seg(seg, tcp->tccps[compno].cblksty, 1);
|
|
||||||
} else {
|
|
||||||
seg = &cblk->segs[cblk->numsegs - 1];
|
|
||||||
if (seg->numpasses == seg->maxpasses) {
|
|
||||||
t2_init_seg(++seg, tcp->tccps[compno].cblksty, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
n = cblk->numnewpasses;
|
|
||||||
|
|
||||||
do {
|
|
||||||
seg->numnewpasses = int_min(seg->maxpasses - seg->numpasses, n);
|
|
||||||
seg->newlen =
|
|
||||||
bio_read(cblk->numlenbits + int_floorlog2(seg->numnewpasses));
|
|
||||||
n -= seg->numnewpasses;
|
|
||||||
if (n > 0) {
|
|
||||||
t2_init_seg(++seg, tcp->tccps[compno].cblksty, 0);
|
|
||||||
}
|
|
||||||
} while (n > 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (bio_inalign())
|
|
||||||
return -999;
|
|
||||||
|
|
||||||
hd += bio_numbytes();
|
|
||||||
|
|
||||||
// EPH markers
|
|
||||||
if (tcp->csty & J2K_CP_CSTY_EPH) {
|
|
||||||
if ((*hd) != 0xff || (*(hd + 1) != 0x92)) {
|
|
||||||
printf("Error : expected EPH marker\n");
|
|
||||||
} else {
|
|
||||||
hd += 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cp->ppm==1) {
|
|
||||||
cp->ppm_len+=cp->ppm_data-hd;
|
|
||||||
cp->ppm_data = hd;
|
|
||||||
} else if (tcp->ppt == 1) {
|
|
||||||
tcp->ppt_len+=tcp->ppt_data-hd;
|
|
||||||
tcp->ppt_data = hd;
|
|
||||||
} else {
|
|
||||||
c=hd;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (bandno = 0; bandno < res->numbands; bandno++) {
|
|
||||||
tcd_band_t *band = &res->bands[bandno];
|
|
||||||
tcd_precinct_t *prc = &band->precincts[precno];
|
|
||||||
|
|
||||||
//Add Antonin : sizebug1
|
|
||||||
if ((band->x1-band->x0 == 0)||(band->y1-band->y0 == 0)) continue;
|
|
||||||
//ddA
|
|
||||||
|
|
||||||
for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
|
|
||||||
tcd_cblk_t *cblk = &prc->cblks[cblkno];
|
|
||||||
tcd_seg_t *seg;
|
|
||||||
if (!cblk->numnewpasses)
|
|
||||||
continue;
|
|
||||||
if (!cblk->numsegs) {
|
|
||||||
seg = &cblk->segs[0];
|
|
||||||
cblk->numsegs++;
|
|
||||||
cblk->len = 0;
|
|
||||||
} else {
|
|
||||||
seg = &cblk->segs[cblk->numsegs - 1];
|
|
||||||
if (seg->numpasses == seg->maxpasses) {
|
|
||||||
seg++;
|
|
||||||
cblk->numsegs++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
do {
|
|
||||||
if (c + seg->newlen > src + len) {
|
|
||||||
return -999;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(cblk->data + cblk->len, c, seg->newlen);
|
|
||||||
if (seg->numpasses == 0) {
|
|
||||||
seg->data = cblk->data + cblk->len;
|
|
||||||
}
|
|
||||||
c += seg->newlen;
|
|
||||||
cblk->len += seg->newlen;
|
|
||||||
seg->len += seg->newlen;
|
|
||||||
seg->numpasses += seg->numnewpasses;
|
|
||||||
cblk->numnewpasses -= seg->numnewpasses;
|
|
||||||
if (cblk->numnewpasses > 0) {
|
|
||||||
seg++;
|
|
||||||
cblk->numsegs++;
|
|
||||||
}
|
|
||||||
} while (cblk->numnewpasses > 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return c - src;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Encode the packets of a tile to a destination buffer
|
|
||||||
*
|
|
||||||
* img : the source image
|
|
||||||
* cp : the image coding parameters
|
|
||||||
* tileno : number of the tile encoded
|
|
||||||
* tile : the tile for which to write the packets
|
|
||||||
* maxlayers : maximum number of layers
|
|
||||||
* dest : the destination buffer
|
|
||||||
* len : the length of the destination buffer
|
|
||||||
* info_IM : structure to create an index file
|
|
||||||
*/
|
|
||||||
int t2_encode_packets(j2k_image_t * img, j2k_cp_t * cp, int tileno,
|
|
||||||
tcd_tile_t * tile, int maxlayers,
|
|
||||||
unsigned char *dest, int len, info_image * info_IM)
|
|
||||||
{
|
|
||||||
unsigned char *c = dest;
|
|
||||||
int e = 0;
|
|
||||||
pi_iterator_t *pi;
|
|
||||||
int pino, compno;
|
|
||||||
|
|
||||||
pi = pi_create(img, cp, tileno);
|
|
||||||
|
|
||||||
for (pino = 0; pino <= cp->tcps[tileno].numpocs; pino++) {
|
|
||||||
while (pi_next(&pi[pino])) {
|
|
||||||
if (pi[pino].layno < maxlayers) {
|
|
||||||
e = t2_encode_packet(tile, &cp->tcps[tileno],
|
|
||||||
pi[pino].compno, pi[pino].resno,
|
|
||||||
pi[pino].precno, pi[pino].layno, c,
|
|
||||||
dest + len - c, info_IM, tileno);
|
|
||||||
if (e == -999) {
|
|
||||||
break;
|
|
||||||
} else
|
|
||||||
c += e;
|
|
||||||
/* INDEX >> */
|
|
||||||
if (info_IM->index_write && info_IM->index_on) {
|
|
||||||
info_tile *info_TL = &info_IM->tile[tileno];
|
|
||||||
info_packet *info_PK = &info_TL->packet[info_IM->num];
|
|
||||||
if (!info_IM->num) {
|
|
||||||
info_PK->start_pos = info_TL->end_header + 1;
|
|
||||||
} else {
|
|
||||||
info_PK->start_pos =
|
|
||||||
info_TL->packet[info_IM->num - 1].end_pos + 1;
|
|
||||||
}
|
|
||||||
info_PK->end_pos = info_PK->start_pos + e - 1;
|
|
||||||
|
|
||||||
}
|
|
||||||
/* << INDEX */
|
|
||||||
if ((info_IM->index_write
|
|
||||||
&& cp->tcps[tileno].csty & J2K_CP_CSTY_SOP)
|
|
||||||
|| (info_IM->index_write && info_IM->index_on)) {
|
|
||||||
info_IM->num++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* FREE space memory taken by pi */
|
|
||||||
for (compno = 0; compno < pi[pino].numcomps; compno++) {
|
|
||||||
free(pi[pino].comps[compno].resolutions);
|
|
||||||
}
|
|
||||||
free(pi[pino].comps);
|
|
||||||
}
|
|
||||||
free(pi[0].include);
|
|
||||||
free(pi);
|
|
||||||
if (e == -999)
|
|
||||||
return e;
|
|
||||||
else
|
|
||||||
return c - dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Decode the packets of a tile from a source buffer
|
|
||||||
*
|
|
||||||
* src: the source buffer
|
|
||||||
* len: length of the source buffer
|
|
||||||
* img: destination image
|
|
||||||
* cp: image coding parameters
|
|
||||||
* tileno: number that identifies the tile for which to decode the packets
|
|
||||||
* tile: tile for which to decode the packets
|
|
||||||
*/
|
|
||||||
int t2_decode_packets(unsigned char *src, int len, j2k_image_t * img,
|
|
||||||
j2k_cp_t * cp, int tileno, tcd_tile_t * tile)
|
|
||||||
{
|
|
||||||
unsigned char *c = src;
|
|
||||||
pi_iterator_t *pi;
|
|
||||||
int pino, compno, e = 0;
|
|
||||||
int n = 0;
|
|
||||||
|
|
||||||
pi = pi_create(img, cp, tileno);
|
|
||||||
|
|
||||||
for (pino = 0; pino <= cp->tcps[tileno].numpocs; pino++) {
|
|
||||||
while (pi_next(&pi[pino])) {
|
|
||||||
e = t2_decode_packet(c, src + len - c, tile, cp,
|
|
||||||
&cp->tcps[tileno], pi[pino].compno,
|
|
||||||
pi[pino].resno, pi[pino].precno,
|
|
||||||
pi[pino].layno);
|
|
||||||
|
|
||||||
/* progression in resolution */
|
|
||||||
img->comps[pi[pino].compno].resno_decoded =
|
|
||||||
e > 0 ? int_max(pi[pino].resno,
|
|
||||||
img->comps[pi[pino].compno].
|
|
||||||
resno_decoded) : img->comps[pi[pino].
|
|
||||||
compno].resno_decoded;
|
|
||||||
n++;
|
|
||||||
|
|
||||||
if (e == -999) { /* ADD */
|
|
||||||
break;
|
|
||||||
} else
|
|
||||||
c += e;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* FREE space memory taken by pi */
|
|
||||||
for (compno = 0; compno < pi[pino].numcomps; compno++) {
|
|
||||||
free(pi[pino].comps[compno].resolutions);
|
|
||||||
}
|
|
||||||
free(pi[pino].comps);
|
|
||||||
}
|
|
||||||
free(pi[0].include);
|
|
||||||
free(pi);
|
|
||||||
|
|
||||||
if (e == -999)
|
|
||||||
return e;
|
|
||||||
else
|
|
||||||
return c - src;
|
|
||||||
}
|
|
|
@ -1,64 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2002, David Janssens
|
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
|
||||||
* Copyright (c) 2002-2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __T2_H
|
|
||||||
#define __T2_H
|
|
||||||
|
|
||||||
#include "tcd.h"
|
|
||||||
#include "j2k.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Encode the packets of a tile to a destination buffer
|
|
||||||
*
|
|
||||||
* img : the source image
|
|
||||||
* cp : the image coding parameters
|
|
||||||
* tileno : number of the tile encoded
|
|
||||||
* tile : the tile for which to write the packets
|
|
||||||
* maxlayers : maximum number of layers
|
|
||||||
* dest : the destination buffer
|
|
||||||
* len : the length of the destination buffer
|
|
||||||
* info_IM : structure to create an index file
|
|
||||||
*/
|
|
||||||
int t2_encode_packets(j2k_image_t * img, j2k_cp_t * cp, int tileno,
|
|
||||||
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
|
|
||||||
*
|
|
||||||
* src: the source buffer
|
|
||||||
* len: length of the source buffer
|
|
||||||
* img: destination image
|
|
||||||
* cp: image coding parameters
|
|
||||||
* tileno: number that identifies the tile for which to decode the packets
|
|
||||||
* tile: tile for which to decode the packets
|
|
||||||
*/
|
|
||||||
int t2_decode_packets(unsigned char *src, int len, j2k_image_t * img,
|
|
||||||
j2k_cp_t * cp, int tileno, tcd_tile_t * tile);
|
|
||||||
|
|
||||||
#endif
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,182 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2002, David Janssens
|
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
|
||||||
* Copyright (c) 2002-2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __TCD_H
|
|
||||||
#define __TCD_H
|
|
||||||
|
|
||||||
#include "j2k.h"
|
|
||||||
#include "tgt.h"
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int numpasses;
|
|
||||||
int len;
|
|
||||||
unsigned char *data;
|
|
||||||
int maxpasses;
|
|
||||||
int numnewpasses;
|
|
||||||
int newlen;
|
|
||||||
} tcd_seg_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int rate;
|
|
||||||
double distortiondec;
|
|
||||||
int term, len;
|
|
||||||
} tcd_pass_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int numpasses; /* Number of passes in the layer */
|
|
||||||
int len; /* len of information */
|
|
||||||
double disto; /* add for index (Cfr. Marcela) */
|
|
||||||
unsigned char *data; /* data */
|
|
||||||
} 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) */
|
|
||||||
int numbps;
|
|
||||||
int lastbp; /* Add antonin : quantizbug1 */
|
|
||||||
int numlenbits;
|
|
||||||
int len; /* length */
|
|
||||||
int numpasses; /* number of pass already done for the code-blocks */
|
|
||||||
int numnewpasses; /* number of pass added to the code-blocks */
|
|
||||||
int numsegs; /* number of segments */
|
|
||||||
tcd_seg_t segs[100]; /* segments informations */
|
|
||||||
unsigned char data[8192]; /* Data */
|
|
||||||
int numpassesinlayers; /* number of passes in the layer */
|
|
||||||
tcd_layer_t layers[100]; /* layer information */
|
|
||||||
int totalpasses; /* total number of passes */
|
|
||||||
tcd_pass_t passes[100]; /* information about the passes */
|
|
||||||
} tcd_cblk_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int x0, y0, x1, y1; /* dimension of the precinct : left upper corner (x0, y0) right low corner (x1,y1) */
|
|
||||||
int cw, ch; /* number of precinct in width and heigth */
|
|
||||||
tcd_cblk_t *cblks; /* code-blocks informations */
|
|
||||||
tgt_tree_t *incltree; /* inclusion tree */
|
|
||||||
tgt_tree_t *imsbtree; /* IMSB tree */
|
|
||||||
} tcd_precinct_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int x0, y0, x1, y1; /* dimension of the subband : left upper corner (x0, y0) right low corner (x1,y1) */
|
|
||||||
int bandno;
|
|
||||||
tcd_precinct_t *precincts; /* precinct information */
|
|
||||||
int numbps;
|
|
||||||
int stepsize;
|
|
||||||
} 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) */
|
|
||||||
int pw, ph;
|
|
||||||
int numbands; /* number sub-band for the resolution level */
|
|
||||||
tcd_band_t bands[3]; /* subband information */
|
|
||||||
} tcd_resolution_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int x0, y0, x1, y1; /* dimension of component : left upper corner (x0, y0) right low corner (x1,y1) */
|
|
||||||
int numresolutions; /* number of resolutions level */
|
|
||||||
tcd_resolution_t *resolutions; /* resolutions information */
|
|
||||||
int *data; /* data of the component */
|
|
||||||
int nbpix; /* add fixed_quality */
|
|
||||||
} tcd_tilecomp_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int x0, y0, x1, y1; /* dimension of the tile : left upper corner (x0, y0) right low corner (x1,y1) */
|
|
||||||
int numcomps; /* number of components in tile */
|
|
||||||
tcd_tilecomp_t *comps; /* Components information */
|
|
||||||
int nbpix; /* add fixed_quality */
|
|
||||||
double distotile; /* add fixed_quality */
|
|
||||||
double distolayer[100]; /* add fixed_quality */
|
|
||||||
} tcd_tile_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int tw, th; /* number of tiles in width and heigth */
|
|
||||||
tcd_tile_t *tiles; /* Tiles information */
|
|
||||||
} tcd_image_t;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initialize the tile coder (reuses the memory allocated by tcd_malloc_encode)
|
|
||||||
* img: raw image
|
|
||||||
* cp: coding parameters
|
|
||||||
* curtileno : number that identifies the tile that will be encoded
|
|
||||||
*/
|
|
||||||
void tcd_init_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno);
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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);
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initialize the tile decoder
|
|
||||||
* img: raw image
|
|
||||||
* cp: coding parameters
|
|
||||||
*/
|
|
||||||
void tcd_init(j2k_image_t * img, j2k_cp_t * cp);
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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);
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,225 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2002, David Janssens
|
|
||||||
* 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 "tgt.h"
|
|
||||||
#include "bio.h"
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* Reset tag-tree. */
|
|
||||||
/* </summary> */
|
|
||||||
void tgt_reset(tgt_tree_t * tree)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
/* new */
|
|
||||||
if (!tree || tree == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (i = 0; i < tree->numnodes; i++) {
|
|
||||||
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 nplv[32];
|
|
||||||
tgt_node_t *node;
|
|
||||||
tgt_node_t *parentnode;
|
|
||||||
tgt_node_t *parentnode0;
|
|
||||||
tgt_tree_t *tree;
|
|
||||||
int i, j, k;
|
|
||||||
int numlvls;
|
|
||||||
int n;
|
|
||||||
|
|
||||||
tree = (tgt_tree_t *) malloc(sizeof(tgt_tree_t));
|
|
||||||
tree->numleafsh = numleafsh;
|
|
||||||
tree->numleafsv = numleafsv;
|
|
||||||
|
|
||||||
numlvls = 0;
|
|
||||||
nplh[0] = numleafsh;
|
|
||||||
nplv[0] = numleafsv;
|
|
||||||
tree->numnodes = 0;
|
|
||||||
do {
|
|
||||||
n = nplh[numlvls] * nplv[numlvls];
|
|
||||||
nplh[numlvls + 1] = (nplh[numlvls] + 1) / 2;
|
|
||||||
nplv[numlvls + 1] = (nplv[numlvls] + 1) / 2;
|
|
||||||
tree->numnodes += n;
|
|
||||||
++numlvls;
|
|
||||||
} while (n > 1);
|
|
||||||
|
|
||||||
/* ADD */
|
|
||||||
if (tree->numnodes == 0) {
|
|
||||||
free(tree);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
tree->nodes = (tgt_node_t *) malloc(tree->numnodes * sizeof(tgt_node_t));
|
|
||||||
|
|
||||||
node = tree->nodes;
|
|
||||||
parentnode = &tree->nodes[tree->numleafsh * tree->numleafsv];
|
|
||||||
parentnode0 = parentnode;
|
|
||||||
|
|
||||||
for (i = 0; i < numlvls - 1; ++i) {
|
|
||||||
for (j = 0; j < nplv[i]; ++j) {
|
|
||||||
k = nplh[i];
|
|
||||||
while (--k >= 0) {
|
|
||||||
node->parent = parentnode;
|
|
||||||
++node;
|
|
||||||
if (--k >= 0) {
|
|
||||||
node->parent = parentnode;
|
|
||||||
++node;
|
|
||||||
}
|
|
||||||
++parentnode;
|
|
||||||
}
|
|
||||||
if ((j & 1) || j == nplv[i] - 1) {
|
|
||||||
parentnode0 = parentnode;
|
|
||||||
} else {
|
|
||||||
parentnode = parentnode0;
|
|
||||||
parentnode0 += nplh[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
node->parent = 0;
|
|
||||||
|
|
||||||
tgt_reset(tree);
|
|
||||||
|
|
||||||
return tree;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* Destroy tag-tree. */
|
|
||||||
/* </summary> */
|
|
||||||
void tgt_destroy(tgt_tree_t * t)
|
|
||||||
{
|
|
||||||
free(t->nodes);
|
|
||||||
free(t);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* Set the value of a leaf of the tag-tree. */
|
|
||||||
/* </summary> */
|
|
||||||
void tgt_setvalue(tgt_tree_t * tree, int leafno, int value)
|
|
||||||
{
|
|
||||||
tgt_node_t *node;
|
|
||||||
node = &tree->nodes[leafno];
|
|
||||||
while (node && node->value > value) {
|
|
||||||
node->value = value;
|
|
||||||
node = node->parent;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* Encode the value of a leaf of the tag-tree. */
|
|
||||||
/* </summary> */
|
|
||||||
void tgt_encode(tgt_tree_t * tree, int leafno, int threshold)
|
|
||||||
{
|
|
||||||
tgt_node_t *stk[31];
|
|
||||||
tgt_node_t **stkptr;
|
|
||||||
tgt_node_t *node;
|
|
||||||
int low;
|
|
||||||
|
|
||||||
stkptr = stk;
|
|
||||||
node = &tree->nodes[leafno];
|
|
||||||
while (node->parent) {
|
|
||||||
*stkptr++ = node;
|
|
||||||
node = node->parent;
|
|
||||||
}
|
|
||||||
|
|
||||||
low = 0;
|
|
||||||
for (;;) {
|
|
||||||
if (low > node->low) {
|
|
||||||
node->low = low;
|
|
||||||
} else {
|
|
||||||
low = node->low;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (low < threshold) {
|
|
||||||
if (low >= node->value) {
|
|
||||||
if (!node->known) {
|
|
||||||
bio_write(1, 1);
|
|
||||||
node->known = 1;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
bio_write(0, 1);
|
|
||||||
++low;
|
|
||||||
}
|
|
||||||
|
|
||||||
node->low = low;
|
|
||||||
if (stkptr == stk)
|
|
||||||
break;
|
|
||||||
node = *--stkptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* <summary> */
|
|
||||||
/* Decode the value of a leaf of the tag-tree. */
|
|
||||||
/* </summary> */
|
|
||||||
int tgt_decode(tgt_tree_t * tree, int leafno, int threshold)
|
|
||||||
{
|
|
||||||
tgt_node_t *stk[31];
|
|
||||||
tgt_node_t **stkptr;
|
|
||||||
tgt_node_t *node;
|
|
||||||
int low;
|
|
||||||
|
|
||||||
stkptr = stk;
|
|
||||||
node = &tree->nodes[leafno];
|
|
||||||
while (node->parent) {
|
|
||||||
*stkptr++ = node;
|
|
||||||
node = node->parent;
|
|
||||||
}
|
|
||||||
|
|
||||||
low = 0;
|
|
||||||
for (;;) {
|
|
||||||
if (low > node->low) {
|
|
||||||
node->low = low;
|
|
||||||
} else {
|
|
||||||
low = node->low;
|
|
||||||
}
|
|
||||||
while (low < threshold && low < node->value) {
|
|
||||||
if (bio_read(1)) {
|
|
||||||
node->value = low;
|
|
||||||
} else {
|
|
||||||
++low;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
node->low = low;
|
|
||||||
if (stkptr == stk) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
node = *--stkptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (node->value < threshold) ? 1 : 0;
|
|
||||||
}
|
|
|
@ -1,87 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2002, David Janssens
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __TGT_H
|
|
||||||
#define __TGT_H
|
|
||||||
|
|
||||||
typedef struct tgt_node {
|
|
||||||
struct tgt_node *parent;
|
|
||||||
int value;
|
|
||||||
int low;
|
|
||||||
int known;
|
|
||||||
} tgt_node_t;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int numleafsh;
|
|
||||||
int numleafsv;
|
|
||||||
int numnodes;
|
|
||||||
tgt_node_t *nodes;
|
|
||||||
} tgt_tree_t;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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