Deleted because this directory corresponds to an old version of the JPWL library
This commit is contained in:
		@@ -1,21 +0,0 @@
 | 
			
		||||
Version ****JPWLcorrect****
 | 
			
		||||
 | 
			
		||||
This version realizes a JPWL decoder based on OpenJPEG library.
 | 
			
		||||
Realized decoder accepts an input JPWL codestream, corrects errors sgnalling eventual
 | 
			
		||||
residual errors and finally outputs the corrected JPWL codestream. This codestream shall 
 | 
			
		||||
be used by a JPEG2000 Part-1 decoder to decode the image.
 | 
			
		||||
 | 
			
		||||
How to use decoder from prompt line:
 | 
			
		||||
 | 
			
		||||
"jpwl_correct input.j2k o.bmp"
 | 
			
		||||
 | 
			
		||||
where,
 | 
			
		||||
 | 
			
		||||
	- "input.j2k" is the input corrupted JPWL codestream
 | 
			
		||||
	- "o.bmp" this file is necessary as parameter but the decoder doesn't create
 | 
			
		||||
           that as output.
 | 
			
		||||
 | 
			
		||||
Decoder create output file "output.j2c", that is the corrected JPWL codestream.
 | 
			
		||||
 | 
			
		||||
Note that .j2c is the extension accepted by "kakadu" decoder.
 | 
			
		||||
 | 
			
		||||
@@ -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,887 +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"
 | 
			
		||||
 | 
			
		||||
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;
 | 
			
		||||
  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;
 | 
			
		||||
 | 
			
		||||
  cp.intermed_file=1;
 | 
			
		||||
 | 
			
		||||
  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");
 | 
			
		||||
    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;
 | 
			
		||||
      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;
 | 
			
		||||
      /* ------------------------------------------------------ */
 | 
			
		||||
    default:
 | 
			
		||||
      return 1;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  cp.tx0 = TX0;
 | 
			
		||||
  cp.ty0 = TY0;
 | 
			
		||||
 | 
			
		||||
  /* 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 * 2, 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 * 2); /* Allocate memory for all tiles */
 | 
			
		||||
      cio_init(outbuf, cp.tdx * cp.tdy * cp.tw * cp.th * 2);							 
 | 
			
		||||
      len = j2k_encode(&img, &cp, outbuf, cp.tdx * cp.tdy * cp.tw * cp.th * 2, 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);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  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 * 2);
 | 
			
		||||
    cio_init(outbuf, cp.tdx * cp.tdy * cp.tw * cp.th * 2);    
 | 
			
		||||
    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;
 | 
			
		||||
      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;
 | 
			
		||||
      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,249 +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 Target_Dir ""
 | 
			
		||||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
 | 
			
		||||
# ADD CPP /nologo /W3 /GX /O2 /I "../libopenjpeg" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "DONT_HAVE_GETOPT" /YX /FD /c
 | 
			
		||||
# ADD 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\mct.c
 | 
			
		||||
# End Source File
 | 
			
		||||
# Begin Source File
 | 
			
		||||
 | 
			
		||||
SOURCE=..\libopenjpeg\mqc.c
 | 
			
		||||
# End Source File
 | 
			
		||||
# Begin Source File
 | 
			
		||||
 | 
			
		||||
SOURCE=..\libopenjpeg\pi.c
 | 
			
		||||
# End Source File
 | 
			
		||||
# Begin Source File
 | 
			
		||||
 | 
			
		||||
SOURCE=..\libopenjpeg\raw.c
 | 
			
		||||
# End Source File
 | 
			
		||||
# Begin Source File
 | 
			
		||||
 | 
			
		||||
SOURCE=..\libopenjpeg\t1.c
 | 
			
		||||
# End Source File
 | 
			
		||||
# Begin Source File
 | 
			
		||||
 | 
			
		||||
SOURCE=..\libopenjpeg\t2.c
 | 
			
		||||
# End Source File
 | 
			
		||||
# Begin Source File
 | 
			
		||||
 | 
			
		||||
SOURCE=..\libopenjpeg\tcd.c
 | 
			
		||||
# End Source File
 | 
			
		||||
# Begin Source File
 | 
			
		||||
 | 
			
		||||
SOURCE=..\libopenjpeg\tgt.c
 | 
			
		||||
# End Source File
 | 
			
		||||
# End Group
 | 
			
		||||
# Begin Group "Header Files"
 | 
			
		||||
 | 
			
		||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
 | 
			
		||||
# Begin Source File
 | 
			
		||||
 | 
			
		||||
SOURCE=..\libopenjpeg\bio.h
 | 
			
		||||
# End Source File
 | 
			
		||||
# Begin Source File
 | 
			
		||||
 | 
			
		||||
SOURCE=..\libopenjpeg\cio.h
 | 
			
		||||
# End Source File
 | 
			
		||||
# Begin Source File
 | 
			
		||||
 | 
			
		||||
SOURCE=.\convert.h
 | 
			
		||||
# 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 +0,0 @@
 | 
			
		||||
Microsoft C/C++ MSF 7.00
 | 
			
		||||
@@ -1,254 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding = "Windows-1252"?>
 | 
			
		||||
<VisualStudioProject
 | 
			
		||||
	ProjectType="Visual C++"
 | 
			
		||||
	Version="7.00"
 | 
			
		||||
	Name="image_to_j2k"
 | 
			
		||||
	ProjectGUID="{7CB555D4-C2D9-40B9-B666-E8E1236E5699}"
 | 
			
		||||
	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\mct.c">
 | 
			
		||||
			</File>
 | 
			
		||||
			<File
 | 
			
		||||
				RelativePath="..\libopenjpeg\mqc.c">
 | 
			
		||||
			</File>
 | 
			
		||||
			<File
 | 
			
		||||
				RelativePath="..\libopenjpeg\pi.c">
 | 
			
		||||
			</File>
 | 
			
		||||
			<File
 | 
			
		||||
				RelativePath="..\libopenjpeg\raw.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\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\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,561 +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>
 | 
			
		||||
 | 
			
		||||
extern int cslen; // Aggiunta in JPWL (per gestire l'inserimento di RED nella CS!)
 | 
			
		||||
 | 
			
		||||
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;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  src = realloc(src, cslen);  // Aggiunta in JPWL per evitare errori di free a causa
 | 
			
		||||
							// della modifica di CS in caso di aggiunta RED!
 | 
			
		||||
  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,244 +0,0 @@
 | 
			
		||||
# Microsoft Developer Studio Project File - Name="j2k_to_image" - Package Owner=<4>
 | 
			
		||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
 | 
			
		||||
# ** DO NOT EDIT **
 | 
			
		||||
 | 
			
		||||
# TARGTYPE "Win32 (x86) Console Application" 0x0103
 | 
			
		||||
 | 
			
		||||
CFG=j2k_to_image - 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 "j2k_to_image.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 "j2k_to_image.mak" CFG="j2k_to_image - Win32 Debug"
 | 
			
		||||
!MESSAGE 
 | 
			
		||||
!MESSAGE Possible choices for configuration are:
 | 
			
		||||
!MESSAGE 
 | 
			
		||||
!MESSAGE "j2k_to_image - Win32 Release" (based on "Win32 (x86) Console Application")
 | 
			
		||||
!MESSAGE "j2k_to_image - 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)" == "j2k_to_image - Win32 Release"
 | 
			
		||||
 | 
			
		||||
# PROP BASE Use_MFC 0
 | 
			
		||||
# PROP BASE Use_Debug_Libraries 0
 | 
			
		||||
# PROP BASE Output_Dir "Release"
 | 
			
		||||
# PROP BASE Intermediate_Dir "Release"
 | 
			
		||||
# PROP BASE Target_Dir ""
 | 
			
		||||
# PROP Use_MFC 0
 | 
			
		||||
# PROP Use_Debug_Libraries 0
 | 
			
		||||
# PROP Output_Dir "Release"
 | 
			
		||||
# PROP Intermediate_Dir "Release"
 | 
			
		||||
# PROP Target_Dir ""
 | 
			
		||||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
 | 
			
		||||
# ADD CPP /nologo /W3 /GX /O2 /I "../libopenjpeg" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "DONT_HAVE_GETOPT" /YX /FD /c
 | 
			
		||||
# ADD BASE RSC /l 0x80c /d "NDEBUG"
 | 
			
		||||
# ADD RSC /l 0x80c /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)" == "j2k_to_image - Win32 Debug"
 | 
			
		||||
 | 
			
		||||
# PROP BASE Use_MFC 0
 | 
			
		||||
# PROP BASE Use_Debug_Libraries 1
 | 
			
		||||
# PROP BASE Output_Dir "j2k_to_image___Win32_Debug"
 | 
			
		||||
# PROP BASE Intermediate_Dir "j2k_to_image___Win32_Debug"
 | 
			
		||||
# PROP BASE Target_Dir ""
 | 
			
		||||
# PROP Use_MFC 0
 | 
			
		||||
# PROP Use_Debug_Libraries 1
 | 
			
		||||
# PROP Output_Dir "j2k_to_image___Win32_Debug"
 | 
			
		||||
# PROP Intermediate_Dir "j2k_to_image___Win32_Debug"
 | 
			
		||||
# 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 "WIN32" /D "_CONSOLE" /D "_MBCS" /D "DONT_HAVE_GETOPT" /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 "j2k_to_image - Win32 Release"
 | 
			
		||||
# Name "j2k_to_image - Win32 Debug"
 | 
			
		||||
# Begin Group "Source Files"
 | 
			
		||||
 | 
			
		||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
 | 
			
		||||
# Begin Source File
 | 
			
		||||
 | 
			
		||||
SOURCE=..\libopenjpeg\bio.c
 | 
			
		||||
# End Source File
 | 
			
		||||
# Begin Source File
 | 
			
		||||
 | 
			
		||||
SOURCE=..\libopenjpeg\cio.c
 | 
			
		||||
# End Source File
 | 
			
		||||
# Begin Source File
 | 
			
		||||
 | 
			
		||||
SOURCE=..\libopenjpeg\dwt.c
 | 
			
		||||
# End Source File
 | 
			
		||||
# Begin Source File
 | 
			
		||||
 | 
			
		||||
SOURCE=..\libopenjpeg\fix.c
 | 
			
		||||
# End Source File
 | 
			
		||||
# Begin Source File
 | 
			
		||||
 | 
			
		||||
SOURCE=.\compat\getopt.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=.\j2k_to_image.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\t1.c
 | 
			
		||||
# End Source File
 | 
			
		||||
# Begin Source File
 | 
			
		||||
 | 
			
		||||
SOURCE=..\libopenjpeg\t2.c
 | 
			
		||||
# End Source File
 | 
			
		||||
# Begin Source File
 | 
			
		||||
 | 
			
		||||
SOURCE=..\libopenjpeg\tcd.c
 | 
			
		||||
# End Source File
 | 
			
		||||
# Begin Source File
 | 
			
		||||
 | 
			
		||||
SOURCE=..\libopenjpeg\tgt.c
 | 
			
		||||
# End Source File
 | 
			
		||||
# End Group
 | 
			
		||||
# Begin Group "Header Files"
 | 
			
		||||
 | 
			
		||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
 | 
			
		||||
# Begin Source File
 | 
			
		||||
 | 
			
		||||
SOURCE=..\libopenjpeg\bio.h
 | 
			
		||||
# End Source File
 | 
			
		||||
# Begin Source File
 | 
			
		||||
 | 
			
		||||
SOURCE=..\libopenjpeg\cio.h
 | 
			
		||||
# End Source File
 | 
			
		||||
# Begin Source File
 | 
			
		||||
 | 
			
		||||
SOURCE=..\libopenjpeg\dwt.h
 | 
			
		||||
# End Source File
 | 
			
		||||
# Begin Source File
 | 
			
		||||
 | 
			
		||||
SOURCE=..\libopenjpeg\fix.h
 | 
			
		||||
# End Source File
 | 
			
		||||
# Begin Source File
 | 
			
		||||
 | 
			
		||||
SOURCE=.\compat\getopt.h
 | 
			
		||||
# End Source File
 | 
			
		||||
# Begin Source File
 | 
			
		||||
 | 
			
		||||
SOURCE=..\libopenjpeg\int.h
 | 
			
		||||
# End Source File
 | 
			
		||||
# Begin Source File
 | 
			
		||||
 | 
			
		||||
SOURCE=..\libopenjpeg\j2k.h
 | 
			
		||||
# End Source File
 | 
			
		||||
# Begin Source File
 | 
			
		||||
 | 
			
		||||
SOURCE=..\libopenjpeg\jp2.h
 | 
			
		||||
# End Source File
 | 
			
		||||
# Begin Source File
 | 
			
		||||
 | 
			
		||||
SOURCE=..\libopenjpeg\jpt.h
 | 
			
		||||
# End Source File
 | 
			
		||||
# Begin Source File
 | 
			
		||||
 | 
			
		||||
SOURCE=..\libopenjpeg\mct.h
 | 
			
		||||
# End Source File
 | 
			
		||||
# Begin Source File
 | 
			
		||||
 | 
			
		||||
SOURCE=..\libopenjpeg\mqc.h
 | 
			
		||||
# End Source File
 | 
			
		||||
# Begin Source File
 | 
			
		||||
 | 
			
		||||
SOURCE=..\libopenjpeg\openjpeg.h
 | 
			
		||||
# End Source File
 | 
			
		||||
# Begin Source File
 | 
			
		||||
 | 
			
		||||
SOURCE=..\libopenjpeg\pi.h
 | 
			
		||||
# End Source File
 | 
			
		||||
# Begin Source File
 | 
			
		||||
 | 
			
		||||
SOURCE=..\libopenjpeg\raw.h
 | 
			
		||||
# End Source File
 | 
			
		||||
# Begin Source File
 | 
			
		||||
 | 
			
		||||
SOURCE=..\libopenjpeg\t1.h
 | 
			
		||||
# End Source File
 | 
			
		||||
# Begin Source File
 | 
			
		||||
 | 
			
		||||
SOURCE=..\libopenjpeg\t2.h
 | 
			
		||||
# End Source File
 | 
			
		||||
# Begin Source File
 | 
			
		||||
 | 
			
		||||
SOURCE=..\libopenjpeg\tcd.h
 | 
			
		||||
# End Source File
 | 
			
		||||
# Begin Source File
 | 
			
		||||
 | 
			
		||||
SOURCE=..\libopenjpeg\tgt.h
 | 
			
		||||
# End Source File
 | 
			
		||||
# End Group
 | 
			
		||||
# Begin Group "Resource Files"
 | 
			
		||||
 | 
			
		||||
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
 | 
			
		||||
# End Group
 | 
			
		||||
# End Target
 | 
			
		||||
# End Project
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
Microsoft C/C++ MSF 7.00
 | 
			
		||||
@@ -1,21 +0,0 @@
 | 
			
		||||
Microsoft Visual Studio Solution File, Format Version 8.00
 | 
			
		||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "j2k_to_image", "j2k_to_image.vcproj", "{3C09E691-8555-47D1-B1E6-D411A6314AC8}"
 | 
			
		||||
	ProjectSection(ProjectDependencies) = postProject
 | 
			
		||||
	EndProjectSection
 | 
			
		||||
EndProject
 | 
			
		||||
Global
 | 
			
		||||
	GlobalSection(SolutionConfiguration) = preSolution
 | 
			
		||||
		Debug = Debug
 | 
			
		||||
		Release = Release
 | 
			
		||||
	EndGlobalSection
 | 
			
		||||
	GlobalSection(ProjectConfiguration) = postSolution
 | 
			
		||||
		{3C09E691-8555-47D1-B1E6-D411A6314AC8}.Debug.ActiveCfg = Debug|Win32
 | 
			
		||||
		{3C09E691-8555-47D1-B1E6-D411A6314AC8}.Debug.Build.0 = Debug|Win32
 | 
			
		||||
		{3C09E691-8555-47D1-B1E6-D411A6314AC8}.Release.ActiveCfg = Release|Win32
 | 
			
		||||
		{3C09E691-8555-47D1-B1E6-D411A6314AC8}.Release.Build.0 = Release|Win32
 | 
			
		||||
	EndGlobalSection
 | 
			
		||||
	GlobalSection(ExtensibilityGlobals) = postSolution
 | 
			
		||||
	EndGlobalSection
 | 
			
		||||
	GlobalSection(ExtensibilityAddIns) = postSolution
 | 
			
		||||
	EndGlobalSection
 | 
			
		||||
EndGlobal
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
<EFBFBD><EFBFBD>ࡱ
 | 
			
		||||
@@ -1,266 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="Windows-1252"?>
 | 
			
		||||
<VisualStudioProject
 | 
			
		||||
	ProjectType="Visual C++"
 | 
			
		||||
	Version="7.10"
 | 
			
		||||
	Name="j2k_to_image"
 | 
			
		||||
	ProjectGUID="{3C09E691-8555-47D1-B1E6-D411A6314AC8}"
 | 
			
		||||
	SccProjectName=""
 | 
			
		||||
	SccLocalPath="">
 | 
			
		||||
	<Platforms>
 | 
			
		||||
		<Platform
 | 
			
		||||
			Name="Win32"/>
 | 
			
		||||
	</Platforms>
 | 
			
		||||
	<Configurations>
 | 
			
		||||
		<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/j2k_to_image.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/j2k_to_image.exe"
 | 
			
		||||
				LinkIncremental="1"
 | 
			
		||||
				SuppressStartupBanner="TRUE"
 | 
			
		||||
				ProgramDatabaseFile=".\Release/j2k_to_image.pdb"
 | 
			
		||||
				SubSystem="1"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCMIDLTool"
 | 
			
		||||
				TypeLibraryName=".\Release/j2k_to_image.tlb"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPostBuildEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPreBuildEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPreLinkEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCResourceCompilerTool"
 | 
			
		||||
				PreprocessorDefinitions="NDEBUG"
 | 
			
		||||
				Culture="2060"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCWebServiceProxyGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCXMLDataGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCWebDeploymentTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCManagedWrapperGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
 | 
			
		||||
		</Configuration>
 | 
			
		||||
		<Configuration
 | 
			
		||||
			Name="Debug|Win32"
 | 
			
		||||
			OutputDirectory=".\j2k_to_image___Win32_Debug"
 | 
			
		||||
			IntermediateDirectory=".\j2k_to_image___Win32_Debug"
 | 
			
		||||
			ConfigurationType="1"
 | 
			
		||||
			UseOfMFC="0"
 | 
			
		||||
			ATLMinimizesCRunTimeLibraryUsage="FALSE"
 | 
			
		||||
			CharacterSet="2">
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCLCompilerTool"
 | 
			
		||||
				Optimization="0"
 | 
			
		||||
				AdditionalIncludeDirectories="../libopenjpeg"
 | 
			
		||||
				PreprocessorDefinitions="_DEBUG,WIN32,_CONSOLE,DONT_HAVE_GETOPT"
 | 
			
		||||
				BasicRuntimeChecks="3"
 | 
			
		||||
				RuntimeLibrary="5"
 | 
			
		||||
				UsePrecompiledHeader="2"
 | 
			
		||||
				PrecompiledHeaderFile=".\j2k_to_image___Win32_Debug/j2k_to_image.pch"
 | 
			
		||||
				AssemblerListingLocation=".\j2k_to_image___Win32_Debug/"
 | 
			
		||||
				ObjectFile=".\j2k_to_image___Win32_Debug/"
 | 
			
		||||
				ProgramDataBaseFileName=".\j2k_to_image___Win32_Debug/"
 | 
			
		||||
				WarningLevel="3"
 | 
			
		||||
				SuppressStartupBanner="TRUE"
 | 
			
		||||
				DebugInformationFormat="4"
 | 
			
		||||
				CompileAs="0"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCCustomBuildTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCLinkerTool"
 | 
			
		||||
				AdditionalOptions="/MACHINE:I386"
 | 
			
		||||
				AdditionalDependencies="odbc32.lib odbccp32.lib"
 | 
			
		||||
				OutputFile=".\j2k_to_image___Win32_Debug/j2k_to_image.exe"
 | 
			
		||||
				LinkIncremental="2"
 | 
			
		||||
				SuppressStartupBanner="TRUE"
 | 
			
		||||
				GenerateDebugInformation="TRUE"
 | 
			
		||||
				ProgramDatabaseFile=".\j2k_to_image___Win32_Debug/j2k_to_image.pdb"
 | 
			
		||||
				SubSystem="1"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCMIDLTool"
 | 
			
		||||
				TypeLibraryName=".\j2k_to_image___Win32_Debug/j2k_to_image.tlb"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPostBuildEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPreBuildEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCPreLinkEventTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCResourceCompilerTool"
 | 
			
		||||
				PreprocessorDefinitions="_DEBUG"
 | 
			
		||||
				Culture="2060"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCWebServiceProxyGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCXMLDataGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCWebDeploymentTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCManagedWrapperGeneratorTool"/>
 | 
			
		||||
			<Tool
 | 
			
		||||
				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
 | 
			
		||||
		</Configuration>
 | 
			
		||||
	</Configurations>
 | 
			
		||||
	<References>
 | 
			
		||||
	</References>
 | 
			
		||||
	<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="..\libopenjpeg\dwt.c">
 | 
			
		||||
			</File>
 | 
			
		||||
			<File
 | 
			
		||||
				RelativePath="..\libopenjpeg\fix.c">
 | 
			
		||||
			</File>
 | 
			
		||||
			<File
 | 
			
		||||
				RelativePath=".\compat\getopt.c">
 | 
			
		||||
			</File>
 | 
			
		||||
			<File
 | 
			
		||||
				RelativePath="..\libopenjpeg\int.c">
 | 
			
		||||
			</File>
 | 
			
		||||
			<File
 | 
			
		||||
				RelativePath="..\libopenjpeg\j2k.c">
 | 
			
		||||
			</File>
 | 
			
		||||
			<File
 | 
			
		||||
				RelativePath=".\j2k_to_image.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\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="..\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\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,105 +0,0 @@
 | 
			
		||||
List of parameters for the coder JPEG 2000 :
 | 
			
		||||
 | 
			
		||||
Date : June the 25th, 2003
 | 
			
		||||
Author : Yannick Verschueren
 | 
			
		||||
Contact : verschueren@tele.ucl.ac.be 
 | 
			
		||||
 | 
			
		||||
- the option -help displays the readme.txt file on screen
 | 
			
		||||
 | 
			
		||||
- 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.
 | 
			
		||||
 | 
			
		||||
- 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) 
 | 
			
		||||
 | 
			
		||||
REMARKS :
 | 
			
		||||
---------
 | 
			
		||||
 | 
			
		||||
* the value of rate enter in the code line is the compression factor !
 | 
			
		||||
exemple :
 | 
			
		||||
 | 
			
		||||
-r 20,10,1 means quality 1 : compress 20x, quality 2 : compress 10x and quality 3 : compress 1x = lossless  
 | 
			
		||||
 | 
			
		||||
* The number of resolution can be modified by the program in view to respect profile-0 conditions (Taubman, Marcelin (2002), "JPEG2000, image compression fundamentals, standards and practice", p700)
 | 
			
		||||
 | 
			
		||||
By default :
 | 
			
		||||
------------
 | 
			
		||||
 | 
			
		||||
 * lossless
 | 
			
		||||
 * 1 tile
 | 
			
		||||
 * size of precinct 2^15 x 2^15 (means 1 precinct)
 | 
			
		||||
 * size of code-block 64 x 64
 | 
			
		||||
 * Number of resolution : 6
 | 
			
		||||
 * No SOP marker in the codestream
 | 
			
		||||
 * No EPH marker in the codestream
 | 
			
		||||
 * No sub-sampling in x and y direction
 | 
			
		||||
 * No mode switch activated
 | 
			
		||||
 * progression order : LRCP
 | 
			
		||||
 * No index file
 | 
			
		||||
 * No ROI upshifted
 | 
			
		||||
 * No offset of the origin of the image
 | 
			
		||||
 * No offset of the origin of the tiles
 | 
			
		||||
 * Reversible DWT 5-3
 | 
			
		||||
 | 
			
		||||
Parameters :
 | 
			
		||||
------------
 | 
			
		||||
 | 
			
		||||
-i             : source file  (-i source.pnm also *.pgm, *.ppm) "required"
 | 
			
		||||
 | 
			
		||||
-o             : destination file (-o dest.j2k) "required"
 | 
			
		||||
 | 
			
		||||
-r             : different rates (-r 20,10,5) "optional" 
 | 
			
		||||
 | 
			
		||||
-n             : Number of resolution (-n 3) "optional"
 | 
			
		||||
 | 
			
		||||
-b             : size of code block (-b 32,32) "optional"
 | 
			
		||||
 | 
			
		||||
-c             : size of precinct (-c 128,128) "optional"
 | 
			
		||||
 | 
			
		||||
-t             : size of tile (-t 512,512) "optional"
 | 
			
		||||
 | 
			
		||||
-p             : progression order (-p LRCP) [LRCP, RLCP, RPCL, PCRL, CPRL] "optional"
 | 
			
		||||
 | 
			
		||||
-s             : subsampling factor (-s 2,2) [-s X,Y] "optional"
 | 
			
		||||
 | 
			
		||||
-SOP           : write SOP marker before each packet "optional"
 | 
			
		||||
 | 
			
		||||
-EPH           : write EPH marker after each header packet "optional"
 | 
			
		||||
 | 
			
		||||
-M             : mode switch (-M 3) [1= BYPASS(LAZY) 2=RESET 4=RESTART(TERMALL) 8=VSC 16=ERTERM(SEGTERM) 32=SEGMARK(SEGSYM)]  "optional"
 | 
			
		||||
                    for several mode switch you have to add the value of each mode you want
 | 
			
		||||
                    ex : RESTART(4) + RESET(2) + SEGMARK(32) = -M 38 
 | 
			
		||||
 | 
			
		||||
-x             : Create an index file *.Idx (-x index_name.Idx) "optional"
 | 
			
		||||
 | 
			
		||||
-ROI:c=%d,U=%d : quantization indices upshifted for component c=%d [%d = 0,1,2] 
 | 
			
		||||
                 with a value of U=%d [0 <= %d <= 37] (i.e. -ROI:c=0,U=25) "optional"
 | 
			
		||||
 | 
			
		||||
-d             : offset of the origin of the image (-d 150,300) "optional"
 | 
			
		||||
 | 
			
		||||
-T             : offset of the origin of the tiles (-T 100,75) "optional"
 | 
			
		||||
 | 
			
		||||
-I             : Use the irreversible DWT 9-7 (-I) "optional"
 | 
			
		||||
 | 
			
		||||
IMPORTANT : 
 | 
			
		||||
-----------
 | 
			
		||||
 | 
			
		||||
* subsampling bigger than 2 can produce error
 | 
			
		||||
 | 
			
		||||
The index file respect the structure below :
 | 
			
		||||
---------------------------------------------
 | 
			
		||||
 | 
			
		||||
Image_height Image_width
 | 
			
		||||
progression order
 | 
			
		||||
Tiles_size_X Tiles_size_Y
 | 
			
		||||
Components_nb
 | 
			
		||||
Layers_nb
 | 
			
		||||
decomposition_levels
 | 
			
		||||
Precincts_size_X Precincts_size_Y
 | 
			
		||||
Main_header_end_position
 | 
			
		||||
Codestream_size
 | 
			
		||||
Tile0 start_pos end_Theader end_pos
 | 
			
		||||
Tile1  "         "           "
 | 
			
		||||
...
 | 
			
		||||
TileN  "         "           "
 | 
			
		||||
Tpacket_0 Tile layer res. comp. prec. start_pos end_pos
 | 
			
		||||
...
 | 
			
		||||
Tpacket_M "    "     "    "     "     "         "
 | 
			
		||||
@@ -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,227 +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"
 | 
			
		||||
 | 
			
		||||
#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                                          */
 | 
			
		||||
 | 
			
		||||
/* 
 | 
			
		||||
 * 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
 | 
			
		||||
 */
 | 
			
		||||
void j2k_read_jpwlms();
 | 
			
		||||
 | 
			
		||||
LIBJ2K_API int j2k_encode(j2k_image_t * i, j2k_cp_t * cp, char *output,
 | 
			
		||||
			  int len, char *index);
 | 
			
		||||
 | 
			
		||||
void jpwl_read_esd();
 | 
			
		||||
 | 
			
		||||
/* 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,539 +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"
 | 
			
		||||
 | 
			
		||||
#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
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
* 
 | 
			
		||||
* 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;
 | 
			
		||||
  jp2_box_t box;
 | 
			
		||||
 | 
			
		||||
  box.init_pos = cio_tell();
 | 
			
		||||
  cio_skip(4);
 | 
			
		||||
  cio_write(JP2_JP2C, 4);	// JP2C
 | 
			
		||||
 | 
			
		||||
  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,46 +0,0 @@
 | 
			
		||||
#ifndef __JPW_H
 | 
			
		||||
#define __JPW_H
 | 
			
		||||
 | 
			
		||||
int decode_JPWL(unsigned char *src, int len);
 | 
			
		||||
 | 
			
		||||
int read_EPC();
 | 
			
		||||
 | 
			
		||||
int read_EPB_2(int *j2k_state);
 | 
			
		||||
 | 
			
		||||
int read_EPB(int next,int *j2k_state);
 | 
			
		||||
//void read_EPB(int *j2k_state);
 | 
			
		||||
 | 
			
		||||
int read_EPB_PM(int *j2k_state);
 | 
			
		||||
 | 
			
		||||
void insert_RED(int pos, int lred, int redlenok);
 | 
			
		||||
 | 
			
		||||
void write_buff(unsigned char *buff,int pos,long cl);
 | 
			
		||||
 | 
			
		||||
void read_buff(unsigned char *buff,int pos,long cl);
 | 
			
		||||
 | 
			
		||||
void ResetCRC();
 | 
			
		||||
 | 
			
		||||
void UpdateCRC16(char x);
 | 
			
		||||
 | 
			
		||||
void UpdateCRC32(char x);
 | 
			
		||||
 | 
			
		||||
char reflectByte(char inbyte);
 | 
			
		||||
 | 
			
		||||
void reflectCRC32();
 | 
			
		||||
 | 
			
		||||
void generate_gf(int nn, int kk);
 | 
			
		||||
 | 
			
		||||
void gen_poly(int nn, int kk);
 | 
			
		||||
 | 
			
		||||
void encode_rs(int nn, int kk, int tt);
 | 
			
		||||
 | 
			
		||||
void decode_rs(int nn, int kk, int tt);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#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,49 +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 <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
 | 
			
		||||
										
											
												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
 | 
			
		||||
		Reference in New Issue
	
	Block a user